github.com/jasonish/buffalo@v0.8.2-0.20170413145823-bacbdd415f1b/generators/newapp/new.go (about)

     1  package newapp
     2  
     3  import (
     4  	"os/exec"
     5  
     6  	"github.com/gobuffalo/buffalo/generators"
     7  	"github.com/gobuffalo/buffalo/generators/assets/standard"
     8  	"github.com/gobuffalo/buffalo/generators/assets/webpack"
     9  	"github.com/gobuffalo/buffalo/generators/refresh"
    10  	"github.com/gobuffalo/makr"
    11  )
    12  
    13  // App is the representation of a new Buffalo application
    14  type App struct {
    15  	RootPath    string
    16  	Name        string
    17  	Force       bool
    18  	Verbose     bool
    19  	SkipPop     bool
    20  	SkipWebpack bool
    21  	WithYarn    bool
    22  	DBType      string
    23  	CIProvider  string
    24  }
    25  
    26  // Generator returns a generator to create a new application
    27  func (a *App) Generator(data makr.Data) (*makr.Generator, error) {
    28  	g := makr.New()
    29  	g.Add(makr.NewCommand(makr.GoGet("golang.org/x/tools/cmd/goimports")))
    30  
    31  	files, err := generators.Find("newapp")
    32  	if err != nil {
    33  		return nil, err
    34  	}
    35  
    36  	for _, f := range files {
    37  		g.Add(makr.NewFile(f.WritePath, f.Body))
    38  	}
    39  	rr, err := refresh.New()
    40  	if err != nil {
    41  		return nil, err
    42  	}
    43  	g.Add(rr)
    44  
    45  	if data["ciProvider"] == "travis" {
    46  		g.Add(makr.NewFile(".travis.yml", nTravis))
    47  	} else if data["ciProvider"] == "gitlab-ci" {
    48  		if _, ok := data["withPop"]; ok {
    49  			if data["dbType"] == "postgres" {
    50  				data["testDbUrl"] = "postgres://postgres:postgres@postgres:5432/" + data["name"].(string) + "_test"
    51  			} else if data["dbType"] == "mysql" {
    52  				data["testDbUrl"] = "mysql://root:root@mysql:3306/" + data["name"].(string) + "_test"
    53  			} else {
    54  				data["testDbUrl"] = ""
    55  			}
    56  			g.Add(makr.NewFile(".gitlab-ci.yml", nGitlabCi))
    57  		} else {
    58  			g.Add(makr.NewFile(".gitlab-ci.yml", nGitlabCiNoPop))
    59  		}
    60  	}
    61  
    62  	g.Add(makr.NewCommand(makr.GoGet("github.com/motemen/gore")))
    63  	g.Add(makr.NewCommand(makr.GoInstall("github.com/motemen/gore")))
    64  	if a.SkipWebpack {
    65  		wg, err := standard.New(data)
    66  		if err != nil {
    67  			return g, err
    68  		}
    69  		g.Add(wg)
    70  	} else {
    71  		wg, err := webpack.New(data)
    72  		if err != nil {
    73  			return g, err
    74  		}
    75  		g.Add(wg)
    76  	}
    77  	if !a.SkipPop {
    78  		g.Add(newSodaGenerator())
    79  	}
    80  	g.Add(makr.NewCommand(a.goGet()))
    81  	g.Add(makr.NewCommand(makr.GoFmt()))
    82  
    83  	return g, nil
    84  }
    85  
    86  func (a App) goGet() *exec.Cmd {
    87  	appArgs := []string{"get", "-t"}
    88  	if a.Verbose {
    89  		appArgs = append(appArgs, "-v")
    90  	}
    91  	appArgs = append(appArgs, "./...")
    92  	return exec.Command("go", appArgs...)
    93  }
    94  
    95  const nTravis = `language: go
    96  env:
    97  - GO_ENV=test
    98  
    99  before_script:
   100    - psql -c 'create database {{.name}}_test;' -U postgres
   101  	- mysql -e 'CREATE DATABASE {{.name}}_test;'
   102    - mkdir -p $TRAVIS_BUILD_DIR/public/assets
   103  
   104  go:
   105    - 1.7.x
   106    - master
   107  
   108  go_import_path: {{ .packagePath }}
   109  `
   110  
   111  const nGitlabCi = `before_script:
   112    - ln -s /builds /go/src/$(echo "{{.packagePath}}" | cut -d "/" -f1)
   113    - cd /go/src/{{.packagePath}}
   114    - mkdir -p public/assets
   115    - go get -u github.com/gobuffalo/buffalo/buffalo
   116    - go get -t -v ./...
   117    - export PATH="$PATH:$GOPATH/bin"
   118  
   119  stages:
   120    - test
   121  
   122  .test-vars: &test-vars
   123    variables:
   124      GO_ENV: "test"
   125      POSTGRES_DB: "{{.name}}_test"
   126      MYSQL_DATABASE: "{{.name}}_test"
   127      MYSQL_ROOT_PASSWORD: "root"
   128      TEST_DATABASE_URL: "{{.testDbUrl}}"
   129  
   130  # Golang version choice helper
   131  .use-golang-latest: &use-golang-latest
   132    image: golang:latest
   133  
   134  .use-golang-latest: &use-golang-1-7
   135    image: golang:1.7
   136  
   137  test:latest:
   138    <<: *use-golang-latest
   139    <<: *test-vars
   140    stage: test
   141    services:
   142      - mysql:latest
   143      - postgres:latest
   144    script:
   145      - buffalo test
   146  
   147  test:1.7:
   148    <<: *use-golang-1-7
   149    <<: *test-vars
   150    stage: test
   151    services:
   152      - mysql:latest
   153      - postgres:latest
   154    script:
   155      - buffalo test
   156  `
   157  
   158  const nGitlabCiNoPop = `before_script:
   159    - ln -s /builds /go/src/$(echo "{{.packagePath}}" | cut -d "/" -f1)
   160    - cd /go/src/{{.packagePath}}
   161    - mkdir -p public/assets
   162    - go get -u github.com/gobuffalo/buffalo/buffalo
   163    - go get -t -v ./...
   164    - export PATH="$PATH:$GOPATH/bin"
   165  
   166  stages:
   167    - test
   168  
   169  .test-vars: &test-vars
   170    variables:
   171      GO_ENV: "test"
   172  
   173  # Golang version choice helper
   174  .use-golang-latest: &use-golang-latest
   175    image: golang:latest
   176  
   177  .use-golang-latest: &use-golang-1-7
   178    image: golang:1.7
   179  
   180  test:latest:
   181    <<: *use-golang-latest
   182    <<: *test-vars
   183    stage: test
   184    script:
   185      - buffalo test
   186  
   187  test:1.7:
   188    <<: *use-golang-1-7
   189    <<: *test-vars
   190    stage: test
   191    script:
   192      - buffalo test
   193  `