github.com/JarrahG/buffalocli@v0.0.0-20230801092127-b85bfd5d395a/internal/genny/ci/ci.go (about)

     1  package ci
     2  
     3  import (
     4  	"embed"
     5  	"fmt"
     6  	"html/template"
     7  	"io/fs"
     8  	"strings"
     9  
    10  	"github.com/gobuffalo/genny/v2"
    11  	"github.com/gobuffalo/genny/v2/gogen"
    12  )
    13  
    14  //go:embed templates/*
    15  var templates embed.FS
    16  
    17  // New generator for adding circleci, github, gitlab or travis
    18  func New(opts *Options) (*genny.Generator, error) {
    19  	g := genny.New()
    20  
    21  	if err := opts.Validate(); err != nil {
    22  		return g, err
    23  	}
    24  
    25  	g.Transformer(genny.Replace("-no-pop", ""))
    26  	g.Transformer(genny.Dot())
    27  
    28  	// TODO: workaround for 1.16, remove when we upgrade to 1.17 and rename "dot-*" files back to "-dot-*"
    29  	g.Transformer(genny.NewTransformer("*", func(f genny.File) (genny.File, error) {
    30  		name := f.Name()
    31  		if strings.HasPrefix(name, "dot-") {
    32  			name = strings.TrimPrefix(name, "dot-")
    33  			name = "." + name
    34  		}
    35  		return genny.NewFile(name, f), nil
    36  	}))
    37  	g.Transformer(genny.Replace("/dot-", "/."))
    38  
    39  	var fname string
    40  	switch opts.Provider {
    41  	case "circleci":
    42  		fname = "dot-circleci/config.yml.tmpl"
    43  	case "github":
    44  		fname = "dot-github/workflows/test.yml.tmpl"
    45  	case "gitlab", "gitlab-ci":
    46  		if opts.App.WithPop {
    47  			fname = "dot-gitlab-ci.yml.tmpl"
    48  		} else {
    49  			fname = "dot-gitlab-ci-no-pop.yml.tmpl"
    50  		}
    51  	case "travis", "travis-ci":
    52  		fname = "dot-travis.yml.tmpl"
    53  	default:
    54  		return g, fmt.Errorf("could not find a template for %s", opts.Provider)
    55  	}
    56  
    57  	sub, err := fs.Sub(templates, "templates")
    58  	if err != nil {
    59  		return g, err
    60  	}
    61  
    62  	f, err := sub.Open(fname)
    63  	if err != nil {
    64  		return g, err
    65  	}
    66  
    67  	g.File(genny.NewFile(fname, f))
    68  
    69  	data := map[string]interface{}{
    70  		"opts": opts,
    71  	}
    72  
    73  	if opts.DBType == "postgres" {
    74  		data["testDbUrl"] = "postgres://postgres:postgres@postgres:5432/" + opts.App.Name.File().String() + "_test?sslmode=disable"
    75  	} else if opts.DBType == "mysql" {
    76  		data["testDbUrl"] = "mysql://root:root@(mysql:3306)/" + opts.App.Name.File().String() + "_test?parseTime=true&multiStatements=true&readTimeout=1s"
    77  	} else {
    78  		data["testDbUrl"] = ""
    79  	}
    80  
    81  	helpers := template.FuncMap{}
    82  
    83  	t := gogen.TemplateTransformer(data, helpers)
    84  	g.Transformer(t)
    85  
    86  	return g, nil
    87  }