From b8e408829b42671fe17cd3c565178bbea28731c1 Mon Sep 17 00:00:00 2001 From: Leandro Brito Date: Wed, 11 Nov 2020 15:32:37 -0300 Subject: [PATCH 01/12] add create command --- cmd/create.go | 65 +++++++++++++++++++++++++++++++++++ cmd/presets/parser.go | 24 +++++++++++++ cmd/presets/presets.go | 8 +++++ presets/adonis/.preset | 1 + presets/laravel/.preset | 1 + presets/nestjs/.preset | 1 + presets/nextjs-static/.preset | 1 + presets/nextjs/.preset | 1 + presets/nuxtjs-static/.preset | 1 + presets/nuxtjs/.preset | 1 + presets/symfony/.preset | 1 + 11 files changed, 105 insertions(+) create mode 100644 cmd/create.go diff --git a/cmd/create.go b/cmd/create.go new file mode 100644 index 00000000..82270eac --- /dev/null +++ b/cmd/create.go @@ -0,0 +1,65 @@ +package cmd + +import ( + "kool-dev/kool/cmd/builder" + "kool-dev/kool/cmd/presets" + "strings" + + "github.com/spf13/cobra" +) + +// KoolCreate holds handlers and functions to implement the preset command logic +type KoolCreate struct { + DefaultKoolService + parser presets.Parser + koolDocker builder.Command +} + +func init() { + var ( + create = NewKoolCreate() + createCmd = NewCreateCommand(create) + ) + + rootCmd.AddCommand(createCmd) +} + +// NewKoolCreate creates a new handler for exec logic +func NewKoolCreate() *KoolCreate { + return &KoolCreate{ + *newDefaultKoolService(), + &presets.DefaultParser{Presets: presets.GetAll()}, + builder.NewCommand("kool", "docker"), + } +} + +// Execute runs the exec logic with incoming arguments. +func (c *KoolCreate) Execute(args []string) (err error) { + if !c.IsTerminal() { + c.koolDocker.AppendArgs("-T") + } + + createCmd, err := c.parser.GetCreateCommand(args[0]) + + if err != nil { + return + } + + c.koolDocker.AppendArgs(strings.Fields(createCmd)...) + + err = c.koolDocker.Interactive(args[1:]...) + + return +} + +// NewCreateCommand initializes new kool create command +func NewCreateCommand(create *KoolCreate) (createCmd *cobra.Command) { + createCmd = &cobra.Command{ + Use: "create [preset] [project]", + Short: "Create a new project using preset", + Args: cobra.MinimumNArgs(2), + Run: DefaultCommandRunFunction(create), + } + + return +} diff --git a/cmd/presets/parser.go b/cmd/presets/parser.go index 4eb7ad03..f88c56c7 100644 --- a/cmd/presets/parser.go +++ b/cmd/presets/parser.go @@ -17,6 +17,7 @@ type DefaultParser struct { // Parser holds presets parsing logic type Parser interface { Exists(string) bool + GetCreateCommand(string) (string, error) GetLanguages() []string GetPresets(string) []string LookUpFiles(string) []string @@ -29,6 +30,29 @@ func (p *DefaultParser) Exists(preset string) (exists bool) { return } +// ErrPresetNotFound error throwed when did not find the preset +var ErrPresetNotFound = errors.New("preset not found") + +// ErrCreateCommandtNotFoundOrEmpty error throwed when did not find the preset create command or it's empty +var ErrCreateCommandtNotFoundOrEmpty = errors.New("create command not found or empty") + +// GetCreateCommand gets the command to create a new project +func (p *DefaultParser) GetCreateCommand(preset string) (cmd string, err error) { + if !p.Exists(preset) { + err = ErrPresetNotFound + return + } + + cmd = p.Presets[preset]["preset_create"] + + if cmd == "" { + err = ErrCreateCommandtNotFoundOrEmpty + return + } + + return +} + // GetLanguages get all presets languages func (p *DefaultParser) GetLanguages() (languages []string) { if len(p.Presets) == 0 { diff --git a/cmd/presets/presets.go b/cmd/presets/presets.go index 09f3cc06..c68a478c 100644 --- a/cmd/presets/presets.go +++ b/cmd/presets/presets.go @@ -9,6 +9,7 @@ func GetAll() map[string]map[string]string { ".dockerignore": `/node_modules `, "preset_language": "javascript", + "preset_create": "kooldev/node:14-adonis adonis new", "Dockerfile.build": `FROM kooldev/node:14-adonis AS build COPY . /app @@ -104,6 +105,7 @@ networks: /vendor `, "preset_language": "php", + "preset_create": "kooldev/php:7.4 composer create-project --prefer-dist laravel/laravel", "Dockerfile.build": `FROM kooldev/php:7.4 AS composer COPY . /app @@ -193,6 +195,7 @@ networks: ".dockerignore": `/node_modules `, "preset_language": "javascript", + "preset_create": "kooldev/node:14-nest nest new", "Dockerfile.build": `FROM kooldev/node:14-nest AS build COPY . /app @@ -286,6 +289,7 @@ networks: /node_modules `, "preset_language": "javascript", + "preset_create": "kooldev/node:14 yarn create next-app", "Dockerfile.build": `FROM kooldev/node:14 AS build COPY . /app @@ -339,6 +343,7 @@ networks: /node_modules `, "preset_language": "javascript", + "preset_create": "kooldev/node:14 yarn create next-app", "Dockerfile.build": `FROM kooldev/node:14 AS node COPY . /app @@ -389,6 +394,7 @@ networks: /node_modules `, "preset_language": "javascript", + "preset_create": "kooldev/node:14 yarn create nuxt-app", "Dockerfile.build": `FROM kooldev/node:14 AS build COPY . /app @@ -447,6 +453,7 @@ networks: /node_modules `, "preset_language": "javascript", + "preset_create": "kooldev/node:14 yarn create nuxt-app", "Dockerfile.build": `FROM kooldev/node:14 AS node COPY . /app @@ -502,6 +509,7 @@ networks: /vendor `, "preset_language": "php", + "preset_create": "kooldev/php:7.4 composer create-project --prefer-dist symfony/website-skeleton", "Dockerfile.build": `FROM kooldev/php:7.4 AS composer COPY . /app diff --git a/presets/adonis/.preset b/presets/adonis/.preset index 708b460a..d920f9e7 100644 --- a/presets/adonis/.preset +++ b/presets/adonis/.preset @@ -1 +1,2 @@ language=javascript +create=kooldev/node:14-adonis adonis new diff --git a/presets/laravel/.preset b/presets/laravel/.preset index 361165aa..cc3ce9cc 100644 --- a/presets/laravel/.preset +++ b/presets/laravel/.preset @@ -1 +1,2 @@ language=php +create=kooldev/php:7.4 composer create-project --prefer-dist laravel/laravel diff --git a/presets/nestjs/.preset b/presets/nestjs/.preset index 708b460a..7d60a32c 100644 --- a/presets/nestjs/.preset +++ b/presets/nestjs/.preset @@ -1 +1,2 @@ language=javascript +create=kooldev/node:14-nest nest new diff --git a/presets/nextjs-static/.preset b/presets/nextjs-static/.preset index 708b460a..05fea711 100644 --- a/presets/nextjs-static/.preset +++ b/presets/nextjs-static/.preset @@ -1 +1,2 @@ language=javascript +create=kooldev/node:14 yarn create next-app diff --git a/presets/nextjs/.preset b/presets/nextjs/.preset index 708b460a..05fea711 100644 --- a/presets/nextjs/.preset +++ b/presets/nextjs/.preset @@ -1 +1,2 @@ language=javascript +create=kooldev/node:14 yarn create next-app diff --git a/presets/nuxtjs-static/.preset b/presets/nuxtjs-static/.preset index 708b460a..7fa7d146 100644 --- a/presets/nuxtjs-static/.preset +++ b/presets/nuxtjs-static/.preset @@ -1 +1,2 @@ language=javascript +create=kooldev/node:14 yarn create nuxt-app diff --git a/presets/nuxtjs/.preset b/presets/nuxtjs/.preset index 708b460a..7fa7d146 100644 --- a/presets/nuxtjs/.preset +++ b/presets/nuxtjs/.preset @@ -1 +1,2 @@ language=javascript +create=kooldev/node:14 yarn create nuxt-app diff --git a/presets/symfony/.preset b/presets/symfony/.preset index 361165aa..018acdb8 100644 --- a/presets/symfony/.preset +++ b/presets/symfony/.preset @@ -1 +1,2 @@ language=php +create=kooldev/php:7.4 composer create-project --prefer-dist symfony/website-skeleton From 43cbafcd1123eaaa8b6aab90f568529b09bb00ba Mon Sep 17 00:00:00 2001 From: Leandro Brito Date: Mon, 16 Nov 2020 12:37:02 -0300 Subject: [PATCH 02/12] tests --- cmd/create.go | 10 ++++- cmd/create_test.go | 82 ++++++++++++++++++++++++++++++++++++++ cmd/presets/fake_parser.go | 24 +++++++---- cmd/presets/parser.go | 8 ---- cmd/presets/parser_test.go | 42 +++++++++++++++++++ 5 files changed, 149 insertions(+), 17 deletions(-) create mode 100644 cmd/create_test.go diff --git a/cmd/create.go b/cmd/create.go index 82270eac..cddeefe9 100644 --- a/cmd/create.go +++ b/cmd/create.go @@ -1,6 +1,7 @@ package cmd import ( + "fmt" "kool-dev/kool/cmd/builder" "kool-dev/kool/cmd/presets" "strings" @@ -39,7 +40,14 @@ func (c *KoolCreate) Execute(args []string) (err error) { c.koolDocker.AppendArgs("-T") } - createCmd, err := c.parser.GetCreateCommand(args[0]) + preset := args[0] + + if !c.parser.Exists(preset) { + err = fmt.Errorf("Unknown preset %s", preset) + return + } + + createCmd, err := c.parser.GetCreateCommand(preset) if err != nil { return diff --git a/cmd/create_test.go b/cmd/create_test.go new file mode 100644 index 00000000..25192803 --- /dev/null +++ b/cmd/create_test.go @@ -0,0 +1,82 @@ +package cmd + +import ( + "bytes" + "kool-dev/kool/cmd/builder" + "kool-dev/kool/cmd/presets" + "kool-dev/kool/cmd/shell" + "testing" +) + +func newFakeKoolCreate() *KoolCreate { + return &KoolCreate{ + *newFakeKoolService(), + &presets.FakeParser{}, + &builder.FakeCommand{}, + } +} + +func TestNewKoolCreate(t *testing.T) { + k := NewKoolCreate() + + if _, ok := k.DefaultKoolService.out.(*shell.DefaultOutputWriter); !ok { + t.Errorf("unexpected shell.OutputWriter on default KoolCreate instance") + } + + if _, ok := k.DefaultKoolService.exiter.(*shell.DefaultExiter); !ok { + t.Errorf("unexpected shell.Exiter on default KoolCreate instance") + } + + if _, ok := k.DefaultKoolService.in.(*shell.DefaultInputReader); !ok { + t.Errorf("unexpected shell.InputReader on default KoolCreate instance") + } + + if _, ok := k.parser.(*presets.DefaultParser); !ok { + t.Errorf("unexpected presets.Parser on default KoolCreate instance") + } + + if _, ok := k.koolDocker.(*builder.DefaultCommand); !ok { + t.Errorf("unexpected builder.Command on default KoolDocker instance") + } +} + +func TestInvalidPresetCreateCommand(t *testing.T) { + f := newFakeKoolCreate() + cmd := NewCreateCommand(f) + + cmd.SetArgs([]string{"invalid", "my-app"}) + + if err := cmd.Execute(); err != nil { + t.Errorf("unexpected error executing preset command; error: %v", err) + } + + if !f.parser.(*presets.FakeParser).CalledExists { + t.Error("did not call parser.Exists") + } + + if !f.out.(*shell.FakeOutputWriter).CalledError { + t.Error("did not call Error") + } + + expected := "Unknown preset invalid" + output := f.out.(*shell.FakeOutputWriter).Err.Error() + + if expected != output { + t.Errorf("expecting error '%s', got '%s'", expected, output) + } + + if !f.exiter.(*shell.FakeExiter).Exited() { + t.Error("did not call Exit") + } +} + +func TestNoArgsNewCreateCommand(t *testing.T) { + f := newFakeKoolCreate() + cmd := NewCreateCommand(f) + + cmd.SetOut(bytes.NewBufferString("")) + + if err := cmd.Execute(); err == nil { + t.Error("expecting no arguments error executing create command") + } +} diff --git a/cmd/presets/fake_parser.go b/cmd/presets/fake_parser.go index 2064c219..77f33a08 100644 --- a/cmd/presets/fake_parser.go +++ b/cmd/presets/fake_parser.go @@ -2,14 +2,15 @@ package presets // FakeParser implements all fake behaviors for using parser in tests. type FakeParser struct { - CalledExists, CalledLookUpFiles, CalledWriteFiles, CalledGetPresets, CalledGetLanguages bool - - MockExists bool - MockFoundFiles []string - MockFileError string - MockError error - MockLanguages []string - MockPresets []string + CalledExists, CalledLookUpFiles, CalledWriteFiles, CalledGetCreateCommand, CalledGetPresets, CalledGetLanguages bool + + MockExists bool + MockFoundFiles []string + MockFileError string + MockError error + MockCreateCommand string + MockLanguages []string + MockPresets []string } // Exists check if preset exists @@ -19,6 +20,13 @@ func (f *FakeParser) Exists(preset string) (exists bool) { return } +// GetCreateCommand gets the command to create a new project +func (f *FakeParser) GetCreateCommand(preset string) (cmd string, err error) { + f.CalledGetCreateCommand = true + cmd = f.MockCreateCommand + return +} + // GetLanguages get all presets languages func (f *FakeParser) GetLanguages() (languages []string) { f.CalledGetLanguages = true diff --git a/cmd/presets/parser.go b/cmd/presets/parser.go index f88c56c7..1283eb7a 100644 --- a/cmd/presets/parser.go +++ b/cmd/presets/parser.go @@ -30,19 +30,11 @@ func (p *DefaultParser) Exists(preset string) (exists bool) { return } -// ErrPresetNotFound error throwed when did not find the preset -var ErrPresetNotFound = errors.New("preset not found") - // ErrCreateCommandtNotFoundOrEmpty error throwed when did not find the preset create command or it's empty var ErrCreateCommandtNotFoundOrEmpty = errors.New("create command not found or empty") // GetCreateCommand gets the command to create a new project func (p *DefaultParser) GetCreateCommand(preset string) (cmd string, err error) { - if !p.Exists(preset) { - err = ErrPresetNotFound - return - } - cmd = p.Presets[preset]["preset_create"] if cmd == "" { diff --git a/cmd/presets/parser_test.go b/cmd/presets/parser_test.go index 3ad7257d..26c9cb78 100644 --- a/cmd/presets/parser_test.go +++ b/cmd/presets/parser_test.go @@ -101,6 +101,48 @@ func TestGetPresetByLanguageParser(t *testing.T) { } } +func TestGetCreateCommandParser(t *testing.T) { + presets := make(map[string]map[string]string) + + laravelPreset := make(map[string]string) + + laravelPreset["preset_create"] = "command" + laravelPreset["kool.yml"] = "" + + presets["laravel"] = laravelPreset + + p := &DefaultParser{ + Presets: presets, + } + + laravelCmd, _ := p.GetCreateCommand("laravel") + + if laravelCmd != laravelPreset["preset_create"] { + t.Error("failed to get command") + } +} + +func TestFailGetCreateCommandParser(t *testing.T) { + presets := make(map[string]map[string]string) + + laravelPreset := make(map[string]string) + + laravelPreset["preset_create"] = "" + laravelPreset["kool.yml"] = "" + + presets["laravel"] = laravelPreset + + p := &DefaultParser{ + Presets: presets, + } + + _, err := p.GetCreateCommand("laravel") + + if err != ErrCreateCommandtNotFoundOrEmpty { + t.Errorf("failed, expected to get error %v got %v", ErrCreateCommandtNotFoundOrEmpty, err.Error()) + } +} + func TestIgnorePresetMetaKeysParser(t *testing.T) { originalStat := osStat From faa105880e68972aca0ff4f3fe2facd1728628f6 Mon Sep 17 00:00:00 2001 From: Leandro Brito Date: Mon, 16 Nov 2020 13:11:23 -0300 Subject: [PATCH 03/12] update parse presets --- cmd/presets/presets.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/cmd/presets/presets.go b/cmd/presets/presets.go index c68a478c..0f7376e8 100644 --- a/cmd/presets/presets.go +++ b/cmd/presets/presets.go @@ -9,7 +9,7 @@ func GetAll() map[string]map[string]string { ".dockerignore": `/node_modules `, "preset_language": "javascript", - "preset_create": "kooldev/node:14-adonis adonis new", + "preset_create": "kooldev/node:14-adonis adonis new", "Dockerfile.build": `FROM kooldev/node:14-adonis AS build COPY . /app @@ -105,7 +105,7 @@ networks: /vendor `, "preset_language": "php", - "preset_create": "kooldev/php:7.4 composer create-project --prefer-dist laravel/laravel", + "preset_create": "kooldev/php:7.4 composer create-project --prefer-dist laravel/laravel", "Dockerfile.build": `FROM kooldev/php:7.4 AS composer COPY . /app @@ -195,7 +195,7 @@ networks: ".dockerignore": `/node_modules `, "preset_language": "javascript", - "preset_create": "kooldev/node:14-nest nest new", + "preset_create": "kooldev/node:14-nest nest new", "Dockerfile.build": `FROM kooldev/node:14-nest AS build COPY . /app @@ -289,7 +289,7 @@ networks: /node_modules `, "preset_language": "javascript", - "preset_create": "kooldev/node:14 yarn create next-app", + "preset_create": "kooldev/node:14 yarn create next-app", "Dockerfile.build": `FROM kooldev/node:14 AS build COPY . /app @@ -343,7 +343,7 @@ networks: /node_modules `, "preset_language": "javascript", - "preset_create": "kooldev/node:14 yarn create next-app", + "preset_create": "kooldev/node:14 yarn create next-app", "Dockerfile.build": `FROM kooldev/node:14 AS node COPY . /app @@ -394,7 +394,7 @@ networks: /node_modules `, "preset_language": "javascript", - "preset_create": "kooldev/node:14 yarn create nuxt-app", + "preset_create": "kooldev/node:14 yarn create nuxt-app", "Dockerfile.build": `FROM kooldev/node:14 AS build COPY . /app @@ -453,7 +453,7 @@ networks: /node_modules `, "preset_language": "javascript", - "preset_create": "kooldev/node:14 yarn create nuxt-app", + "preset_create": "kooldev/node:14 yarn create nuxt-app", "Dockerfile.build": `FROM kooldev/node:14 AS node COPY . /app @@ -509,7 +509,7 @@ networks: /vendor `, "preset_language": "php", - "preset_create": "kooldev/php:7.4 composer create-project --prefer-dist symfony/website-skeleton", + "preset_create": "kooldev/php:7.4 composer create-project --prefer-dist symfony/website-skeleton", "Dockerfile.build": `FROM kooldev/php:7.4 AS composer COPY . /app From 8a57c2b09c6ae7dd98d729ff9afcc561d202d74c Mon Sep 17 00:00:00 2001 From: Leandro Brito Date: Wed, 18 Nov 2020 09:32:06 -0300 Subject: [PATCH 04/12] added test and KoolDocker service --- cmd/create.go | 19 +++++++------------ cmd/create_test.go | 7 +------ cmd/presets/fake_parser_test.go | 7 +++++++ 3 files changed, 15 insertions(+), 18 deletions(-) diff --git a/cmd/create.go b/cmd/create.go index cddeefe9..d18bb38f 100644 --- a/cmd/create.go +++ b/cmd/create.go @@ -2,7 +2,6 @@ package cmd import ( "fmt" - "kool-dev/kool/cmd/builder" "kool-dev/kool/cmd/presets" "strings" @@ -12,8 +11,8 @@ import ( // KoolCreate holds handlers and functions to implement the preset command logic type KoolCreate struct { DefaultKoolService - parser presets.Parser - koolDocker builder.Command + parser presets.Parser + KoolDocker } func init() { @@ -30,17 +29,13 @@ func NewKoolCreate() *KoolCreate { return &KoolCreate{ *newDefaultKoolService(), &presets.DefaultParser{Presets: presets.GetAll()}, - builder.NewCommand("kool", "docker"), + *NewKoolDocker(), } } // Execute runs the exec logic with incoming arguments. -func (c *KoolCreate) Execute(args []string) (err error) { - if !c.IsTerminal() { - c.koolDocker.AppendArgs("-T") - } - - preset := args[0] +func (c *KoolCreate) Execute(originalArgs []string) (err error) { + preset := originalArgs[0] if !c.parser.Exists(preset) { err = fmt.Errorf("Unknown preset %s", preset) @@ -53,9 +48,9 @@ func (c *KoolCreate) Execute(args []string) (err error) { return } - c.koolDocker.AppendArgs(strings.Fields(createCmd)...) + args := append(strings.Fields(createCmd), originalArgs[1:]...) - err = c.koolDocker.Interactive(args[1:]...) + c.KoolDocker.Execute(args) return } diff --git a/cmd/create_test.go b/cmd/create_test.go index 25192803..6f147fda 100644 --- a/cmd/create_test.go +++ b/cmd/create_test.go @@ -2,7 +2,6 @@ package cmd import ( "bytes" - "kool-dev/kool/cmd/builder" "kool-dev/kool/cmd/presets" "kool-dev/kool/cmd/shell" "testing" @@ -12,7 +11,7 @@ func newFakeKoolCreate() *KoolCreate { return &KoolCreate{ *newFakeKoolService(), &presets.FakeParser{}, - &builder.FakeCommand{}, + *newFakeKoolDocker(), } } @@ -34,10 +33,6 @@ func TestNewKoolCreate(t *testing.T) { if _, ok := k.parser.(*presets.DefaultParser); !ok { t.Errorf("unexpected presets.Parser on default KoolCreate instance") } - - if _, ok := k.koolDocker.(*builder.DefaultCommand); !ok { - t.Errorf("unexpected builder.Command on default KoolDocker instance") - } } func TestInvalidPresetCreateCommand(t *testing.T) { diff --git a/cmd/presets/fake_parser_test.go b/cmd/presets/fake_parser_test.go index 505065f6..d6f29104 100644 --- a/cmd/presets/fake_parser_test.go +++ b/cmd/presets/fake_parser_test.go @@ -43,4 +43,11 @@ func TestFakeParser(t *testing.T) { if !f.CalledGetLanguages || len(languages) != 1 || languages[0] != "php" { t.Error("failed to use mocked GetPresets function on FakeParser") } + + f.MockCreateCommand = "create" + createCommand, _ := f.GetCreateCommand("") + + if !f.CalledGetCreateCommand || createCommand == "" || createCommand != "create" { + t.Error("failed to use mocked GetCreateCommand function on FakeParser") + } } From a2ab8ad2b5402c99de4bcf161072a80d18527b9e Mon Sep 17 00:00:00 2001 From: Leandro Brito Date: Wed, 18 Nov 2020 11:41:05 -0300 Subject: [PATCH 05/12] calling preset after create --- cmd/create.go | 22 +++++++++++++++++++++- cmd/create_test.go | 1 + 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/cmd/create.go b/cmd/create.go index d18bb38f..ffa87df0 100644 --- a/cmd/create.go +++ b/cmd/create.go @@ -3,6 +3,7 @@ package cmd import ( "fmt" "kool-dev/kool/cmd/presets" + "os" "strings" "github.com/spf13/cobra" @@ -13,6 +14,7 @@ type KoolCreate struct { DefaultKoolService parser presets.Parser KoolDocker + KoolPreset } func init() { @@ -30,12 +32,14 @@ func NewKoolCreate() *KoolCreate { *newDefaultKoolService(), &presets.DefaultParser{Presets: presets.GetAll()}, *NewKoolDocker(), + *NewKoolPreset(), } } // Execute runs the exec logic with incoming arguments. func (c *KoolCreate) Execute(originalArgs []string) (err error) { preset := originalArgs[0] + dir := originalArgs[1] if !c.parser.Exists(preset) { err = fmt.Errorf("Unknown preset %s", preset) @@ -50,7 +54,23 @@ func (c *KoolCreate) Execute(originalArgs []string) (err error) { args := append(strings.Fields(createCmd), originalArgs[1:]...) - c.KoolDocker.Execute(args) + err = c.KoolDocker.Execute(args) + + if err != nil { + return + } + + err = os.Chdir(dir) + + if err != nil { + return + } + + err = c.KoolPreset.Execute([]string{preset}) + + if err != nil { + return + } return } diff --git a/cmd/create_test.go b/cmd/create_test.go index 6f147fda..56511bee 100644 --- a/cmd/create_test.go +++ b/cmd/create_test.go @@ -12,6 +12,7 @@ func newFakeKoolCreate() *KoolCreate { *newFakeKoolService(), &presets.FakeParser{}, *newFakeKoolDocker(), + *newFakeKoolPreset(), } } From b9b4c21db0e9290ff86dad4ab6ba2653d2f413a1 Mon Sep 17 00:00:00 2001 From: Leandro Brito Date: Wed, 18 Nov 2020 11:43:47 -0300 Subject: [PATCH 06/12] removing unnecessary error validation --- cmd/create.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/cmd/create.go b/cmd/create.go index ffa87df0..abfad7c7 100644 --- a/cmd/create.go +++ b/cmd/create.go @@ -68,10 +68,6 @@ func (c *KoolCreate) Execute(originalArgs []string) (err error) { err = c.KoolPreset.Execute([]string{preset}) - if err != nil { - return - } - return } From 068b9a541682ef8eaee0bd7ee4b29bfc10f6dff0 Mon Sep 17 00:00:00 2001 From: Leandro Brito Date: Thu, 19 Nov 2020 06:41:04 -0300 Subject: [PATCH 07/12] new test case --- cmd/create.go | 10 +++------- cmd/create_test.go | 24 +++++++++++++++++++++++- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/cmd/create.go b/cmd/create.go index abfad7c7..e45693a2 100644 --- a/cmd/create.go +++ b/cmd/create.go @@ -26,7 +26,7 @@ func init() { rootCmd.AddCommand(createCmd) } -// NewKoolCreate creates a new handler for exec logic +// NewKoolCreate creates a new handler for create logic func NewKoolCreate() *KoolCreate { return &KoolCreate{ *newDefaultKoolService(), @@ -36,7 +36,7 @@ func NewKoolCreate() *KoolCreate { } } -// Execute runs the exec logic with incoming arguments. +// Execute runs the create logic with incoming arguments. func (c *KoolCreate) Execute(originalArgs []string) (err error) { preset := originalArgs[0] dir := originalArgs[1] @@ -60,11 +60,7 @@ func (c *KoolCreate) Execute(originalArgs []string) (err error) { return } - err = os.Chdir(dir) - - if err != nil { - return - } + _ = os.Chdir(dir) err = c.KoolPreset.Execute([]string{preset}) diff --git a/cmd/create_test.go b/cmd/create_test.go index 56511bee..57f84f8e 100644 --- a/cmd/create_test.go +++ b/cmd/create_test.go @@ -36,6 +36,28 @@ func TestNewKoolCreate(t *testing.T) { } } +func TestNewKoolCreateCommand(t *testing.T) { + f := newFakeKoolCreate() + + f.parser.(*presets.FakeParser).MockExists = true + f.KoolPreset.parser.(*presets.FakeParser).MockExists = true + + cmd := NewCreateCommand(f) + cmd.SetArgs([]string{"laravel", "my-app"}) + + if err := cmd.Execute(); err != nil { + t.Errorf("unexpected error executing create command; error: %v", err) + } + + if !f.parser.(*presets.FakeParser).CalledExists { + t.Error("did not call parser.Exists") + } + + if !f.out.(*shell.FakeOutputWriter).CalledSetWriter { + t.Error("did not call SetWriter") + } +} + func TestInvalidPresetCreateCommand(t *testing.T) { f := newFakeKoolCreate() cmd := NewCreateCommand(f) @@ -68,8 +90,8 @@ func TestInvalidPresetCreateCommand(t *testing.T) { func TestNoArgsNewCreateCommand(t *testing.T) { f := newFakeKoolCreate() - cmd := NewCreateCommand(f) + cmd := NewCreateCommand(f) cmd.SetOut(bytes.NewBufferString("")) if err := cmd.Execute(); err == nil { From 308cea17ca71f112a809cc75a46530278092e62a Mon Sep 17 00:00:00 2001 From: Leandro Brito Date: Thu, 19 Nov 2020 18:30:40 -0300 Subject: [PATCH 08/12] making docs --- docs/4-Commands/0-kool.md | 3 ++- docs/4-Commands/kool-create.md | 24 ++++++++++++++++++++++++ docs/4-Commands/kool-init.md | 2 +- 3 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 docs/4-Commands/kool-create.md diff --git a/docs/4-Commands/0-kool.md b/docs/4-Commands/0-kool.md index f7ea17ae..ab10860e 100644 --- a/docs/4-Commands/0-kool.md +++ b/docs/4-Commands/0-kool.md @@ -16,10 +16,11 @@ Complete documentation is available at https://kool.dev/docs ``` ### SEE ALSO + +* [kool create](kool-create.md) - Create a new project using preset * [kool docker](kool-docker.md) - Creates a new container and runs the command in it. * [kool exec](kool-exec.md) - Execute a command within a running service container * [kool info](kool-info.md) - Prints out information about kool setup (like environment variables) -* [kool init](kool-init.md) - [DEPRECATED] Proxies preset command * [kool logs](kool-logs.md) - Displays log output from services. * [kool preset](kool-preset.md) - Initialize kool preset in the current working directory. If no preset argument is specified you will be prompted to pick among the existing options. * [kool restart](kool-restart.md) - Restart containers - the same as stop followed by start. diff --git a/docs/4-Commands/kool-create.md b/docs/4-Commands/kool-create.md new file mode 100644 index 00000000..6bcb335d --- /dev/null +++ b/docs/4-Commands/kool-create.md @@ -0,0 +1,24 @@ +## kool create + +Create a new project using preset + +``` +kool create [preset] [project] [flags] +``` + +### Options + +``` + -h, --help help for create +``` + +### Options inherited from parent commands + +``` + --verbose increases output verbosity +``` + +### SEE ALSO + +* [kool](kool.md) - kool - Kool stuff + diff --git a/docs/4-Commands/kool-init.md b/docs/4-Commands/kool-init.md index c436489c..4029b1ee 100644 --- a/docs/4-Commands/kool-init.md +++ b/docs/4-Commands/kool-init.md @@ -1,6 +1,6 @@ ## kool init -[DEPRECATED] Initialize kool preset in the current working directory. If no preset argument is specified you will be prompted to pick among the existing options. +[DEPRECATED] Proxies preset command ``` kool init [PRESET] [flags] From 70e38739f8308f9e001f2c06a566a44988a748ed Mon Sep 17 00:00:00 2001 From: Leandro Brito Date: Fri, 20 Nov 2020 09:05:01 -0300 Subject: [PATCH 09/12] remove init changes from docs --- docs/4-Commands/0-kool.md | 1 + docs/4-Commands/kool-init.md | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/4-Commands/0-kool.md b/docs/4-Commands/0-kool.md index ab10860e..2ba110d2 100644 --- a/docs/4-Commands/0-kool.md +++ b/docs/4-Commands/0-kool.md @@ -21,6 +21,7 @@ Complete documentation is available at https://kool.dev/docs * [kool docker](kool-docker.md) - Creates a new container and runs the command in it. * [kool exec](kool-exec.md) - Execute a command within a running service container * [kool info](kool-info.md) - Prints out information about kool setup (like environment variables) +* [kool init](kool-init.md) - [DEPRECATED] Proxies preset command * [kool logs](kool-logs.md) - Displays log output from services. * [kool preset](kool-preset.md) - Initialize kool preset in the current working directory. If no preset argument is specified you will be prompted to pick among the existing options. * [kool restart](kool-restart.md) - Restart containers - the same as stop followed by start. diff --git a/docs/4-Commands/kool-init.md b/docs/4-Commands/kool-init.md index 4029b1ee..c436489c 100644 --- a/docs/4-Commands/kool-init.md +++ b/docs/4-Commands/kool-init.md @@ -1,6 +1,6 @@ ## kool init -[DEPRECATED] Proxies preset command +[DEPRECATED] Initialize kool preset in the current working directory. If no preset argument is specified you will be prompted to pick among the existing options. ``` kool init [PRESET] [flags] From 9ef30cfd462212561974a80c140d2e1625ad3a7b Mon Sep 17 00:00:00 2001 From: Leandro Brito Date: Mon, 23 Nov 2020 18:59:00 -0300 Subject: [PATCH 10/12] load presets function, new tests --- cmd/create.go | 6 +++-- cmd/create_test.go | 8 +++++++ cmd/preset.go | 4 +++- cmd/presets/fake_parser.go | 10 +++++++- cmd/presets/parser.go | 8 ++++++- cmd/presets/parser_test.go | 49 ++++++++++++++++++++++---------------- cmd/presets/presets.go | 16 ++++++------- 7 files changed, 67 insertions(+), 34 deletions(-) diff --git a/cmd/create.go b/cmd/create.go index e45693a2..2f95e386 100644 --- a/cmd/create.go +++ b/cmd/create.go @@ -30,7 +30,7 @@ func init() { func NewKoolCreate() *KoolCreate { return &KoolCreate{ *newDefaultKoolService(), - &presets.DefaultParser{Presets: presets.GetAll()}, + &presets.DefaultParser{}, *NewKoolDocker(), *NewKoolPreset(), } @@ -41,6 +41,8 @@ func (c *KoolCreate) Execute(originalArgs []string) (err error) { preset := originalArgs[0] dir := originalArgs[1] + c.parser.LoadPresets(presets.GetAll()) + if !c.parser.Exists(preset) { err = fmt.Errorf("Unknown preset %s", preset) return @@ -72,7 +74,7 @@ func NewCreateCommand(create *KoolCreate) (createCmd *cobra.Command) { createCmd = &cobra.Command{ Use: "create [preset] [project]", Short: "Create a new project using preset", - Args: cobra.MinimumNArgs(2), + Args: cobra.ExactArgs(2), Run: DefaultCommandRunFunction(create), } diff --git a/cmd/create_test.go b/cmd/create_test.go index 57f84f8e..dcc9f008 100644 --- a/cmd/create_test.go +++ b/cmd/create_test.go @@ -49,6 +49,10 @@ func TestNewKoolCreateCommand(t *testing.T) { t.Errorf("unexpected error executing create command; error: %v", err) } + if !f.parser.(*presets.FakeParser).CalledLoadPresets { + t.Error("did not call parser.LoadPresets") + } + if !f.parser.(*presets.FakeParser).CalledExists { t.Error("did not call parser.Exists") } @@ -68,6 +72,10 @@ func TestInvalidPresetCreateCommand(t *testing.T) { t.Errorf("unexpected error executing preset command; error: %v", err) } + if !f.parser.(*presets.FakeParser).CalledLoadPresets { + t.Error("did not call parser.LoadPresets") + } + if !f.parser.(*presets.FakeParser).CalledExists { t.Error("did not call parser.Exists") } diff --git a/cmd/preset.go b/cmd/preset.go index 3111294c..47ce1e48 100644 --- a/cmd/preset.go +++ b/cmd/preset.go @@ -40,7 +40,7 @@ func NewKoolPreset() *KoolPreset { return &KoolPreset{ *newDefaultKoolService(), &KoolPresetFlags{false}, - &presets.DefaultParser{Presets: presets.GetAll()}, + &presets.DefaultParser{}, shell.NewTerminalChecker(), shell.NewPromptSelect(), } @@ -67,6 +67,8 @@ func (p *KoolPreset) Execute(args []string) (err error) { preset = args[0] } + p.parser.LoadPresets(presets.GetAll()) + if !p.parser.Exists(preset) { err = fmt.Errorf("Unknown preset %s", preset) return diff --git a/cmd/presets/fake_parser.go b/cmd/presets/fake_parser.go index 77f33a08..56c92cef 100644 --- a/cmd/presets/fake_parser.go +++ b/cmd/presets/fake_parser.go @@ -2,7 +2,7 @@ package presets // FakeParser implements all fake behaviors for using parser in tests. type FakeParser struct { - CalledExists, CalledLookUpFiles, CalledWriteFiles, CalledGetCreateCommand, CalledGetPresets, CalledGetLanguages bool + CalledExists, CalledLookUpFiles, CalledWriteFiles, CalledGetCreateCommand, CalledGetPresets, CalledGetLanguages, CalledLoadPresets bool MockExists bool MockFoundFiles []string @@ -11,6 +11,7 @@ type FakeParser struct { MockCreateCommand string MockLanguages []string MockPresets []string + MockAllPresets map[string]map[string]string } // Exists check if preset exists @@ -55,3 +56,10 @@ func (f *FakeParser) WriteFiles(preset string) (fileError string, err error) { err = f.MockError return } + +//LoadPresets loads all presets +func (f *FakeParser) LoadPresets(presets map[string]map[string]string) { + f.CalledLoadPresets = true + f.MockAllPresets = presets + return +} diff --git a/cmd/presets/parser.go b/cmd/presets/parser.go index 1283eb7a..db2e5159 100644 --- a/cmd/presets/parser.go +++ b/cmd/presets/parser.go @@ -22,6 +22,7 @@ type Parser interface { GetPresets(string) []string LookUpFiles(string) []string WriteFiles(string) (string, error) + LoadPresets(map[string]map[string]string) } // Exists check if preset exists @@ -39,7 +40,6 @@ func (p *DefaultParser) GetCreateCommand(preset string) (cmd string, err error) if cmd == "" { err = ErrCreateCommandtNotFoundOrEmpty - return } return @@ -139,3 +139,9 @@ func (p *DefaultParser) WriteFiles(preset string) (fileError string, err error) return } + +// LoadPresets loads the presets +func (p *DefaultParser) LoadPresets(allPresets map[string]map[string]string) { + p.Presets = allPresets + return +} diff --git a/cmd/presets/parser_test.go b/cmd/presets/parser_test.go index 26c9cb78..4efacb29 100644 --- a/cmd/presets/parser_test.go +++ b/cmd/presets/parser_test.go @@ -2,6 +2,7 @@ package presets import ( "os" + "reflect" "testing" ) @@ -12,9 +13,8 @@ func TestExistsParser(t *testing.T) { laravelPreset["kool.yml"] = "" presets["laravel"] = laravelPreset - p := &DefaultParser{ - Presets: presets, - } + p := &DefaultParser{} + p.LoadPresets(presets) exists := p.Exists("laravel") @@ -40,9 +40,8 @@ func TestGetAllParser(t *testing.T) { presets["laravel"] = laravelPreset presets["symfony"] = symfonyPreset - p := &DefaultParser{ - Presets: presets, - } + p := &DefaultParser{} + p.LoadPresets(presets) allPresets := p.GetPresets("") @@ -65,9 +64,8 @@ func TestGetLanguagesParser(t *testing.T) { presets["laravel"] = laravelPreset presets["symfony"] = symfonyPreset - p := &DefaultParser{ - Presets: presets, - } + p := &DefaultParser{} + p.LoadPresets(presets) allLanguages := p.GetLanguages() @@ -90,9 +88,8 @@ func TestGetPresetByLanguageParser(t *testing.T) { presets["php_language"] = phpPreset presets["javascript_language"] = jsPreset - p := &DefaultParser{ - Presets: presets, - } + p := &DefaultParser{} + p.LoadPresets(presets) phpPresets := p.GetPresets("php") @@ -111,9 +108,8 @@ func TestGetCreateCommandParser(t *testing.T) { presets["laravel"] = laravelPreset - p := &DefaultParser{ - Presets: presets, - } + p := &DefaultParser{} + p.LoadPresets(presets) laravelCmd, _ := p.GetCreateCommand("laravel") @@ -132,9 +128,8 @@ func TestFailGetCreateCommandParser(t *testing.T) { presets["laravel"] = laravelPreset - p := &DefaultParser{ - Presets: presets, - } + p := &DefaultParser{} + p.LoadPresets(presets) _, err := p.GetCreateCommand("laravel") @@ -161,9 +156,8 @@ func TestIgnorePresetMetaKeysParser(t *testing.T) { presets["preset"] = testingPreset - p := &DefaultParser{ - Presets: presets, - } + p := &DefaultParser{} + p.LoadPresets(presets) foundFiles := p.LookUpFiles("preset") @@ -171,3 +165,16 @@ func TestIgnorePresetMetaKeysParser(t *testing.T) { t.Errorf("expecting to find only 'kool.yml', found %v", foundFiles) } } + +func TestLoadPresetsParser(t *testing.T) { + presets := map[string]map[string]string{ + "laravel": {"preset_create": "command"}, + } + + p := &DefaultParser{} + p.LoadPresets(presets) + + if ok := reflect.DeepEqual(p.Presets, presets); !ok { + t.Error("did not load the presets correctly") + } +} diff --git a/cmd/presets/presets.go b/cmd/presets/presets.go index 0f7376e8..c68a478c 100644 --- a/cmd/presets/presets.go +++ b/cmd/presets/presets.go @@ -9,7 +9,7 @@ func GetAll() map[string]map[string]string { ".dockerignore": `/node_modules `, "preset_language": "javascript", - "preset_create": "kooldev/node:14-adonis adonis new", + "preset_create": "kooldev/node:14-adonis adonis new", "Dockerfile.build": `FROM kooldev/node:14-adonis AS build COPY . /app @@ -105,7 +105,7 @@ networks: /vendor `, "preset_language": "php", - "preset_create": "kooldev/php:7.4 composer create-project --prefer-dist laravel/laravel", + "preset_create": "kooldev/php:7.4 composer create-project --prefer-dist laravel/laravel", "Dockerfile.build": `FROM kooldev/php:7.4 AS composer COPY . /app @@ -195,7 +195,7 @@ networks: ".dockerignore": `/node_modules `, "preset_language": "javascript", - "preset_create": "kooldev/node:14-nest nest new", + "preset_create": "kooldev/node:14-nest nest new", "Dockerfile.build": `FROM kooldev/node:14-nest AS build COPY . /app @@ -289,7 +289,7 @@ networks: /node_modules `, "preset_language": "javascript", - "preset_create": "kooldev/node:14 yarn create next-app", + "preset_create": "kooldev/node:14 yarn create next-app", "Dockerfile.build": `FROM kooldev/node:14 AS build COPY . /app @@ -343,7 +343,7 @@ networks: /node_modules `, "preset_language": "javascript", - "preset_create": "kooldev/node:14 yarn create next-app", + "preset_create": "kooldev/node:14 yarn create next-app", "Dockerfile.build": `FROM kooldev/node:14 AS node COPY . /app @@ -394,7 +394,7 @@ networks: /node_modules `, "preset_language": "javascript", - "preset_create": "kooldev/node:14 yarn create nuxt-app", + "preset_create": "kooldev/node:14 yarn create nuxt-app", "Dockerfile.build": `FROM kooldev/node:14 AS build COPY . /app @@ -453,7 +453,7 @@ networks: /node_modules `, "preset_language": "javascript", - "preset_create": "kooldev/node:14 yarn create nuxt-app", + "preset_create": "kooldev/node:14 yarn create nuxt-app", "Dockerfile.build": `FROM kooldev/node:14 AS node COPY . /app @@ -509,7 +509,7 @@ networks: /vendor `, "preset_language": "php", - "preset_create": "kooldev/php:7.4 composer create-project --prefer-dist symfony/website-skeleton", + "preset_create": "kooldev/php:7.4 composer create-project --prefer-dist symfony/website-skeleton", "Dockerfile.build": `FROM kooldev/php:7.4 AS composer COPY . /app From d72bee03af1a5cbc69415af16da68b45a96a8784 Mon Sep 17 00:00:00 2001 From: Leandro Brito Date: Tue, 24 Nov 2020 16:36:34 -0300 Subject: [PATCH 11/12] replace kooldocker command by builder command, code review --- cmd/builder/command.go | 18 ++++++++++++++++-- cmd/builder/command_test.go | 16 ++++++++++++++++ cmd/builder/fake_command.go | 24 ++++++++++++++++-------- cmd/create.go | 16 ++++++++++------ cmd/create_test.go | 20 +++++++++++++++++++- cmd/presets/presets.go | 16 ++++++++-------- presets/adonis/.preset | 2 +- presets/laravel/.preset | 2 +- presets/nestjs/.preset | 2 +- presets/nextjs-static/.preset | 2 +- presets/nextjs/.preset | 2 +- presets/nuxtjs-static/.preset | 2 +- presets/nuxtjs/.preset | 2 +- presets/symfony/.preset | 2 +- 14 files changed, 93 insertions(+), 33 deletions(-) diff --git a/cmd/builder/command.go b/cmd/builder/command.go index bd0c2cb6..b7c82a42 100644 --- a/cmd/builder/command.go +++ b/cmd/builder/command.go @@ -29,10 +29,16 @@ type Runner interface { LookPath() error } -// Command interface comprehends bot Runner and Builder interfaces +// Parser holds available methods for parse commands +type Parser interface { + Parse(string) error +} + +// Command interface comprehends bot Runner, Builder, Parser interfaces type Command interface { Builder Runner + Parser } // NewCommand Create a new command. @@ -51,7 +57,6 @@ func ParseCommand(line string) (command *DefaultCommand, err error) { } command = &DefaultCommand{parsed[0], parsed[1:]} - return } @@ -94,3 +99,12 @@ func (c *DefaultCommand) Exec(args ...string) (outStr string, err error) { outStr, err = shell.Exec(c.command, finalArgs...) return } + +// Parse calls the ParseCommand function +func (c *DefaultCommand) Parse(line string) (err error) { + if parsed, err := ParseCommand(line); err == nil { + *c = *parsed + } + + return +} diff --git a/cmd/builder/command_test.go b/cmd/builder/command_test.go index f2147bf6..aa12a90b 100644 --- a/cmd/builder/command_test.go +++ b/cmd/builder/command_test.go @@ -204,3 +204,19 @@ func TestInteractiveArgs(t *testing.T) { t.Errorf("Interactive failed; expected output 'x', got '%s'", output) } } + +func TestParse(t *testing.T) { + line := "echo 'xxx'" + + cmd := NewCommand("") + err := cmd.Parse(line) + + if err != nil { + t.Errorf("failed to parse proper command line onto Command; error: %s", err) + return + } + + if len(cmd.args) != 1 || cmd.command != "echo" || cmd.args[0] != "xxx" { + t.Errorf("ParseCommand failed; given %s got %v", line, cmd.String()) + } +} diff --git a/cmd/builder/fake_command.go b/cmd/builder/fake_command.go index af4ed6e7..40c75774 100644 --- a/cmd/builder/fake_command.go +++ b/cmd/builder/fake_command.go @@ -2,14 +2,15 @@ package builder // FakeCommand implements the Command interface and is used for mocking on testing scenarios type FakeCommand struct { - ArgsAppend []string - ArgsInteractive []string - ArgsExec []string - CalledAppendArgs bool - CalledString bool - CalledLookPath bool - CalledInteractive bool - CalledExec bool + ArgsAppend []string + ArgsInteractive []string + ArgsExec []string + CalledAppendArgs bool + CalledString bool + CalledLookPath bool + CalledInteractive bool + CalledExec bool + CalledParseCommand bool MockExecOut string MockError error @@ -51,3 +52,10 @@ func (f *FakeCommand) Exec(args ...string) (outStr string, err error) { err = f.MockError return } + +// Parse call the ParseCommand function +func (f *FakeCommand) Parse(line string) (err error) { + f.CalledParseCommand = true + err = f.MockError + return +} diff --git a/cmd/create.go b/cmd/create.go index 2f95e386..c2d63215 100644 --- a/cmd/create.go +++ b/cmd/create.go @@ -2,9 +2,9 @@ package cmd import ( "fmt" + "kool-dev/kool/cmd/builder" "kool-dev/kool/cmd/presets" "os" - "strings" "github.com/spf13/cobra" ) @@ -12,8 +12,8 @@ import ( // KoolCreate holds handlers and functions to implement the preset command logic type KoolCreate struct { DefaultKoolService - parser presets.Parser - KoolDocker + parser presets.Parser + createCommand builder.Command KoolPreset } @@ -31,7 +31,7 @@ func NewKoolCreate() *KoolCreate { return &KoolCreate{ *newDefaultKoolService(), &presets.DefaultParser{}, - *NewKoolDocker(), + &builder.DefaultCommand{}, *NewKoolPreset(), } } @@ -54,9 +54,13 @@ func (c *KoolCreate) Execute(originalArgs []string) (err error) { return } - args := append(strings.Fields(createCmd), originalArgs[1:]...) + err = c.createCommand.Parse(createCmd) - err = c.KoolDocker.Execute(args) + if err != nil { + return + } + + err = c.createCommand.Interactive(dir) if err != nil { return diff --git a/cmd/create_test.go b/cmd/create_test.go index dcc9f008..068fccbe 100644 --- a/cmd/create_test.go +++ b/cmd/create_test.go @@ -2,6 +2,7 @@ package cmd import ( "bytes" + "kool-dev/kool/cmd/builder" "kool-dev/kool/cmd/presets" "kool-dev/kool/cmd/shell" "testing" @@ -11,7 +12,7 @@ func newFakeKoolCreate() *KoolCreate { return &KoolCreate{ *newFakeKoolService(), &presets.FakeParser{}, - *newFakeKoolDocker(), + &builder.FakeCommand{}, *newFakeKoolPreset(), } } @@ -31,6 +32,10 @@ func TestNewKoolCreate(t *testing.T) { t.Errorf("unexpected shell.InputReader on default KoolCreate instance") } + if _, ok := k.createCommand.(*builder.DefaultCommand); !ok { + t.Errorf("unexpected builder.Command on default KoolCreate instance") + } + if _, ok := k.parser.(*presets.DefaultParser); !ok { t.Errorf("unexpected presets.Parser on default KoolCreate instance") } @@ -41,6 +46,7 @@ func TestNewKoolCreateCommand(t *testing.T) { f.parser.(*presets.FakeParser).MockExists = true f.KoolPreset.parser.(*presets.FakeParser).MockExists = true + f.parser.(*presets.FakeParser).MockCreateCommand = "kool docker create command" cmd := NewCreateCommand(f) cmd.SetArgs([]string{"laravel", "my-app"}) @@ -57,6 +63,18 @@ func TestNewKoolCreateCommand(t *testing.T) { t.Error("did not call parser.Exists") } + if !f.parser.(*presets.FakeParser).CalledGetCreateCommand { + t.Error("did not call parser.GetCreateCommand") + } + + if !f.createCommand.(*builder.FakeCommand).CalledParseCommand { + t.Error("did not call Parse on KoolCreate.createCommand Command") + } + + if !f.createCommand.(*builder.FakeCommand).CalledInteractive { + t.Error("did not call Interactive on KoolCreate.createCommand Command") + } + if !f.out.(*shell.FakeOutputWriter).CalledSetWriter { t.Error("did not call SetWriter") } diff --git a/cmd/presets/presets.go b/cmd/presets/presets.go index c68a478c..858d36b9 100644 --- a/cmd/presets/presets.go +++ b/cmd/presets/presets.go @@ -9,7 +9,7 @@ func GetAll() map[string]map[string]string { ".dockerignore": `/node_modules `, "preset_language": "javascript", - "preset_create": "kooldev/node:14-adonis adonis new", + "preset_create": "kool docker kooldev/node:14-adonis adonis new", "Dockerfile.build": `FROM kooldev/node:14-adonis AS build COPY . /app @@ -105,7 +105,7 @@ networks: /vendor `, "preset_language": "php", - "preset_create": "kooldev/php:7.4 composer create-project --prefer-dist laravel/laravel", + "preset_create": "kool docker kooldev/php:7.4 composer create-project --prefer-dist laravel/laravel", "Dockerfile.build": `FROM kooldev/php:7.4 AS composer COPY . /app @@ -195,7 +195,7 @@ networks: ".dockerignore": `/node_modules `, "preset_language": "javascript", - "preset_create": "kooldev/node:14-nest nest new", + "preset_create": "kool docker kooldev/node:14-nest nest new", "Dockerfile.build": `FROM kooldev/node:14-nest AS build COPY . /app @@ -289,7 +289,7 @@ networks: /node_modules `, "preset_language": "javascript", - "preset_create": "kooldev/node:14 yarn create next-app", + "preset_create": "kool docker kooldev/node:14 yarn create next-app", "Dockerfile.build": `FROM kooldev/node:14 AS build COPY . /app @@ -343,7 +343,7 @@ networks: /node_modules `, "preset_language": "javascript", - "preset_create": "kooldev/node:14 yarn create next-app", + "preset_create": "kool docker kooldev/node:14 yarn create next-app", "Dockerfile.build": `FROM kooldev/node:14 AS node COPY . /app @@ -394,7 +394,7 @@ networks: /node_modules `, "preset_language": "javascript", - "preset_create": "kooldev/node:14 yarn create nuxt-app", + "preset_create": "kool docker kooldev/node:14 yarn create nuxt-app", "Dockerfile.build": `FROM kooldev/node:14 AS build COPY . /app @@ -453,7 +453,7 @@ networks: /node_modules `, "preset_language": "javascript", - "preset_create": "kooldev/node:14 yarn create nuxt-app", + "preset_create": "kool docker kooldev/node:14 yarn create nuxt-app", "Dockerfile.build": `FROM kooldev/node:14 AS node COPY . /app @@ -509,7 +509,7 @@ networks: /vendor `, "preset_language": "php", - "preset_create": "kooldev/php:7.4 composer create-project --prefer-dist symfony/website-skeleton", + "preset_create": "kool docker kooldev/php:7.4 composer create-project --prefer-dist symfony/website-skeleton", "Dockerfile.build": `FROM kooldev/php:7.4 AS composer COPY . /app diff --git a/presets/adonis/.preset b/presets/adonis/.preset index d920f9e7..b7546900 100644 --- a/presets/adonis/.preset +++ b/presets/adonis/.preset @@ -1,2 +1,2 @@ language=javascript -create=kooldev/node:14-adonis adonis new +create=kool docker kooldev/node:14-adonis adonis new diff --git a/presets/laravel/.preset b/presets/laravel/.preset index cc3ce9cc..4bedead0 100644 --- a/presets/laravel/.preset +++ b/presets/laravel/.preset @@ -1,2 +1,2 @@ language=php -create=kooldev/php:7.4 composer create-project --prefer-dist laravel/laravel +create=kool docker kooldev/php:7.4 composer create-project --prefer-dist laravel/laravel diff --git a/presets/nestjs/.preset b/presets/nestjs/.preset index 7d60a32c..5f7c252e 100644 --- a/presets/nestjs/.preset +++ b/presets/nestjs/.preset @@ -1,2 +1,2 @@ language=javascript -create=kooldev/node:14-nest nest new +create=kool docker kooldev/node:14-nest nest new diff --git a/presets/nextjs-static/.preset b/presets/nextjs-static/.preset index 05fea711..f527916d 100644 --- a/presets/nextjs-static/.preset +++ b/presets/nextjs-static/.preset @@ -1,2 +1,2 @@ language=javascript -create=kooldev/node:14 yarn create next-app +create=kool docker kooldev/node:14 yarn create next-app diff --git a/presets/nextjs/.preset b/presets/nextjs/.preset index 05fea711..f527916d 100644 --- a/presets/nextjs/.preset +++ b/presets/nextjs/.preset @@ -1,2 +1,2 @@ language=javascript -create=kooldev/node:14 yarn create next-app +create=kool docker kooldev/node:14 yarn create next-app diff --git a/presets/nuxtjs-static/.preset b/presets/nuxtjs-static/.preset index 7fa7d146..9addafdd 100644 --- a/presets/nuxtjs-static/.preset +++ b/presets/nuxtjs-static/.preset @@ -1,2 +1,2 @@ language=javascript -create=kooldev/node:14 yarn create nuxt-app +create=kool docker kooldev/node:14 yarn create nuxt-app diff --git a/presets/nuxtjs/.preset b/presets/nuxtjs/.preset index 7fa7d146..9addafdd 100644 --- a/presets/nuxtjs/.preset +++ b/presets/nuxtjs/.preset @@ -1,2 +1,2 @@ language=javascript -create=kooldev/node:14 yarn create nuxt-app +create=kool docker kooldev/node:14 yarn create nuxt-app diff --git a/presets/symfony/.preset b/presets/symfony/.preset index 018acdb8..e6e6fdba 100644 --- a/presets/symfony/.preset +++ b/presets/symfony/.preset @@ -1,2 +1,2 @@ language=php -create=kooldev/php:7.4 composer create-project --prefer-dist symfony/website-skeleton +create=kool docker kooldev/php:7.4 composer create-project --prefer-dist symfony/website-skeleton From 74ef33319e7547e9efca9f45681fe5859099e019 Mon Sep 17 00:00:00 2001 From: Leandro Brito Date: Tue, 24 Nov 2020 16:43:31 -0300 Subject: [PATCH 12/12] fix lint --- cmd/presets/fake_parser.go | 1 - cmd/presets/parser.go | 1 - 2 files changed, 2 deletions(-) diff --git a/cmd/presets/fake_parser.go b/cmd/presets/fake_parser.go index 56c92cef..0cca39d3 100644 --- a/cmd/presets/fake_parser.go +++ b/cmd/presets/fake_parser.go @@ -61,5 +61,4 @@ func (f *FakeParser) WriteFiles(preset string) (fileError string, err error) { func (f *FakeParser) LoadPresets(presets map[string]map[string]string) { f.CalledLoadPresets = true f.MockAllPresets = presets - return } diff --git a/cmd/presets/parser.go b/cmd/presets/parser.go index db2e5159..b4338ce4 100644 --- a/cmd/presets/parser.go +++ b/cmd/presets/parser.go @@ -143,5 +143,4 @@ func (p *DefaultParser) WriteFiles(preset string) (fileError string, err error) // LoadPresets loads the presets func (p *DefaultParser) LoadPresets(allPresets map[string]map[string]string) { p.Presets = allPresets - return }