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  }