github.com/woremacx/kocha@v0.7.1-0.20150731103243-a5889322afc9/cmd/kocha-generate/kocha-generate-migration/main.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "os" 6 "path" 7 "path/filepath" 8 "reflect" 9 "runtime" 10 "strings" 11 "time" 12 13 "github.com/woremacx/kocha" 14 "github.com/woremacx/kocha/util" 15 ) 16 17 const ( 18 defaultORM = "genmai" 19 ) 20 21 var ( 22 ORM = map[string]kocha.Transactioner{ 23 "genmai": &kocha.GenmaiTransaction{}, 24 } 25 ) 26 27 // for test. 28 var _time = struct { 29 Now func() time.Time 30 }{ 31 Now: time.Now, 32 } 33 34 type generateMigrationCommand struct { 35 option struct { 36 ORM string `short:"o" long:"orm"` 37 Help bool `short:"h" long:"help"` 38 } 39 } 40 41 func (c *generateMigrationCommand) Name() string { 42 return "kocha generate migration" 43 } 44 45 func (c *generateMigrationCommand) Usage() string { 46 return fmt.Sprintf(`Usage: %s [OPTIONS] NAME 47 48 Generate the skeleton files of migration. 49 50 Options: 51 -o, --orm=ORM ORM to be used for a transaction [default: "genmai"] 52 -h, --help display this help and exit 53 54 `, c.Name()) 55 } 56 57 func (c *generateMigrationCommand) Option() interface{} { 58 return &c.option 59 } 60 61 // Run generates migration templates. 62 func (c *generateMigrationCommand) Run(args []string) error { 63 if len(args) < 1 || args[0] == "" { 64 return fmt.Errorf("no NAME given") 65 } 66 name := args[0] 67 if c.option.ORM == "" { 68 c.option.ORM = defaultORM 69 } 70 orm, exists := ORM[c.option.ORM] 71 if !exists { 72 return fmt.Errorf("unsupported ORM: `%v'", c.option.ORM) 73 } 74 now := _time.Now().Format("20060102150405") 75 data := map[string]interface{}{ 76 "Name": util.ToCamelCase(name), 77 "TimeStamp": now, 78 "ImportPath": orm.ImportPath(), 79 "TxType": reflect.TypeOf(orm.TransactionType()).String(), 80 } 81 if err := util.CopyTemplate( 82 filepath.Join(skeletonDir("migration"), "migration.go"+util.TemplateSuffix), 83 filepath.Join("db", "migration", fmt.Sprintf("%v_%v.go", now, util.ToSnakeCase(name))), 84 data, 85 ); err != nil { 86 return err 87 } 88 initPath := filepath.Join("db", "migration", "init.go") 89 if _, err := os.Stat(initPath); os.IsNotExist(err) { 90 appDir, err := util.FindAppDir() 91 if err != nil { 92 return err 93 } 94 if err := util.CopyTemplate( 95 filepath.Join(skeletonDir("migration"), "init.go"+util.TemplateSuffix), 96 initPath, map[string]interface{}{ 97 "typeName": c.option.ORM, 98 "tx": strings.TrimSpace(util.GoString(orm)), 99 "dbImportPath": path.Join(appDir, "db"), 100 }, 101 ); err != nil { 102 return err 103 } 104 } 105 return nil 106 } 107 108 func skeletonDir(name string) string { 109 _, filename, _, _ := runtime.Caller(0) 110 baseDir := filepath.Dir(filename) 111 return filepath.Join(baseDir, "skeleton", name) 112 } 113 114 func main() { 115 util.RunCommand(&generateMigrationCommand{}) 116 }