From 300f444b003bcbe575071c9ce7825e79a26da464 Mon Sep 17 00:00:00 2001 From: kamandlou Date: Fri, 16 Feb 2024 14:59:02 +0330 Subject: [PATCH 01/10] add build command --- console/console/build_command_test.go | 38 +++++++++++ console/console/build_commnad.go | 96 +++++++++++++++++++++++++++ 2 files changed, 134 insertions(+) create mode 100644 console/console/build_command_test.go create mode 100644 console/console/build_commnad.go diff --git a/console/console/build_command_test.go b/console/console/build_command_test.go new file mode 100644 index 000000000..437804e16 --- /dev/null +++ b/console/console/build_command_test.go @@ -0,0 +1,38 @@ +package console + +import ( + "os" + "testing" + + "github.com/stretchr/testify/assert" + + configmock "github.com/goravel/framework/mocks/config" + consolemocks "github.com/goravel/framework/mocks/console" +) + +func TestBuildCommand(t *testing.T) { + mockConfig := &configmock.Config{} + mockConfig.On("GetString", "app.env").Return("local").Once() + + newBuildCommand := NewBuildCommand(mockConfig) + mockContext := &consolemocks.Context{} + mockContext.On("Option", "system").Return("linux").Once() + + assert.Nil(t, newBuildCommand.Handle(mockContext)) + + mockConfig.On("GetString", "app.env").Return("production").Once() + mockContext.On("Option", "system").Return("linux").Once() + + reader, writer, err := os.Pipe() + assert.Nil(t, err) + originalStdin := os.Stdin + defer func() { os.Stdin = originalStdin }() + os.Stdin = reader + go func() { + defer writer.Close() + _, err = writer.Write([]byte("yes\n")) + assert.Nil(t, err) + }() + + assert.Nil(t, newBuildCommand.Handle(mockContext)) +} diff --git a/console/console/build_commnad.go b/console/console/build_commnad.go new file mode 100644 index 000000000..dfdd568f1 --- /dev/null +++ b/console/console/build_commnad.go @@ -0,0 +1,96 @@ +package console + +import ( + "fmt" + "github.com/gookit/color" + "github.com/goravel/framework/contracts/config" + "github.com/goravel/framework/contracts/console" + "github.com/goravel/framework/contracts/console/command" + "os" + "os/exec" + "runtime" +) + +type BuildCommand struct { + config config.Config +} + +func NewBuildCommand(config config.Config) *BuildCommand { + return &BuildCommand{ + config: config, + } +} + +// Signature The name and signature of the console command. +func (receiver *BuildCommand) Signature() string { + return "build" +} + +// Description The console command description. +func (receiver *BuildCommand) Description() string { + return "Build the application" +} + +// Extend The console command extend. +func (receiver *BuildCommand) Extend() command.Extend { + return command.Extend{ + Category: "build", + Flags: []command.Flag{ + &command.StringFlag{ + Name: "system", + Value: runtime.GOOS, + Usage: "target system os", + }, + }, + } +} + +// Handle Execute the console command. +func (receiver *BuildCommand) Handle(ctx console.Context) error { + if receiver.config.GetString("app.env") == "production" { + color.Yellowln("**************************************") + color.Yellowln("* Application In Production! *") + color.Yellowln("**************************************") + color.Println(color.New(color.Green).Sprintf("Do you really wish to run this command? (yes/no) ") + "[" + color.New(color.Yellow).Sprintf("no") + "]" + ":") + + var result string + _, err := fmt.Scanln(&result) + if err != nil { + color.Redln(err.Error()) + + return nil + } + + if result != "yes" { + color.Yellowln("Command Canceled") + + return nil + } + } + + systemOption := ctx.Option("system") + + if err := receiver.buildTheApplication(systemOption); err != nil { + color.Redln(err.Error()) + + return nil + } + + color.Greenln("Built successfully.") + + return nil +} + +// buildTheApplication Build the application executable. +func (receiver *BuildCommand) buildTheApplication(system string) error { + os.Setenv("CGO_ENABLED", "0") + os.Setenv("GOOS", system) + os.Setenv("GOARCH", "amd64") + cmd := exec.Command( + "go", + "build", + ".", + ) + _, err := cmd.Output() + return err +} From 26cb47df7c004a9b51f19eaad1fb534e04ba72ee Mon Sep 17 00:00:00 2001 From: kamandlou Date: Fri, 16 Feb 2024 15:21:28 +0330 Subject: [PATCH 02/10] update build command --- .../console/{build_commnad.go => build_command.go} | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) rename console/console/{build_commnad.go => build_command.go} (91%) diff --git a/console/console/build_commnad.go b/console/console/build_command.go similarity index 91% rename from console/console/build_commnad.go rename to console/console/build_command.go index dfdd568f1..013365701 100644 --- a/console/console/build_commnad.go +++ b/console/console/build_command.go @@ -8,7 +8,6 @@ import ( "github.com/goravel/framework/contracts/console/command" "os" "os/exec" - "runtime" ) type BuildCommand struct { @@ -38,7 +37,7 @@ func (receiver *BuildCommand) Extend() command.Extend { Flags: []command.Flag{ &command.StringFlag{ Name: "system", - Value: runtime.GOOS, + Value: "", Usage: "target system os", }, }, @@ -68,9 +67,13 @@ func (receiver *BuildCommand) Handle(ctx console.Context) error { } } - systemOption := ctx.Option("system") + system := ctx.Option("system") + if system == "" { + color.Redln("You missed --system flag.") + return nil + } - if err := receiver.buildTheApplication(systemOption); err != nil { + if err := receiver.buildTheApplication(system); err != nil { color.Redln(err.Error()) return nil From de6c909ef41d5e0f215f2d96ec98b3412ce78d08 Mon Sep 17 00:00:00 2001 From: kamandlou Date: Fri, 16 Feb 2024 15:33:33 +0330 Subject: [PATCH 03/10] update test case and cover Signature and Description methods --- console/console/build_command_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/console/console/build_command_test.go b/console/console/build_command_test.go index 437804e16..6efbd368d 100644 --- a/console/console/build_command_test.go +++ b/console/console/build_command_test.go @@ -15,6 +15,10 @@ func TestBuildCommand(t *testing.T) { mockConfig.On("GetString", "app.env").Return("local").Once() newBuildCommand := NewBuildCommand(mockConfig) + + assert.Equal(t, newBuildCommand.Signature(), "build") + assert.Equal(t, newBuildCommand.Description(), "Build the application") + mockContext := &consolemocks.Context{} mockContext.On("Option", "system").Return("linux").Once() From aa1ef5bf6b44208dda9d277fd2d20ec32f66863c Mon Sep 17 00:00:00 2001 From: kamandlou Date: Fri, 16 Feb 2024 15:45:21 +0330 Subject: [PATCH 04/10] update test to cover the production if statement --- console/console/build_command_test.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/console/console/build_command_test.go b/console/console/build_command_test.go index 6efbd368d..0e2b570d2 100644 --- a/console/console/build_command_test.go +++ b/console/console/build_command_test.go @@ -39,4 +39,20 @@ func TestBuildCommand(t *testing.T) { }() assert.Nil(t, newBuildCommand.Handle(mockContext)) + + mockConfig.On("GetString", "app.env").Return("production").Once() + mockContext.On("Option", "system").Return("linux").Once() + + reader, writer, err = os.Pipe() + assert.Nil(t, err) + originalStdin = os.Stdin + defer func() { os.Stdin = originalStdin }() + os.Stdin = reader + go func() { + defer writer.Close() + _, err = writer.Write([]byte("no\n")) + assert.Nil(t, err) + }() + + assert.Nil(t, newBuildCommand.Handle(mockContext)) } From 863339be83242ad4fe97485c033f20da39bc4435 Mon Sep 17 00:00:00 2001 From: kamandlou Date: Fri, 16 Feb 2024 15:54:26 +0330 Subject: [PATCH 05/10] Revert "update test case and cover Signature and Description methods" This reverts commit de6c909ef41d5e0f215f2d96ec98b3412ce78d08. --- console/console/build_command_test.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/console/console/build_command_test.go b/console/console/build_command_test.go index 0e2b570d2..76ba54e1e 100644 --- a/console/console/build_command_test.go +++ b/console/console/build_command_test.go @@ -15,10 +15,6 @@ func TestBuildCommand(t *testing.T) { mockConfig.On("GetString", "app.env").Return("local").Once() newBuildCommand := NewBuildCommand(mockConfig) - - assert.Equal(t, newBuildCommand.Signature(), "build") - assert.Equal(t, newBuildCommand.Description(), "Build the application") - mockContext := &consolemocks.Context{} mockContext.On("Option", "system").Return("linux").Once() From defba3cc2f60e3f93bdd12f9905631b20c48a748 Mon Sep 17 00:00:00 2001 From: kamandlou Date: Fri, 16 Feb 2024 19:49:33 +0330 Subject: [PATCH 06/10] fix build command --- console/console/build_command.go | 18 +++++++++++------- console/console/build_command_test.go | 8 ++++---- console/service_provider.go | 1 + 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/console/console/build_command.go b/console/console/build_command.go index 013365701..bf7f6ac9b 100644 --- a/console/console/build_command.go +++ b/console/console/build_command.go @@ -2,12 +2,15 @@ package console import ( "fmt" + "golang.org/x/exp/slices" + "os" + "os/exec" + "github.com/gookit/color" + "github.com/goravel/framework/contracts/config" "github.com/goravel/framework/contracts/console" "github.com/goravel/framework/contracts/console/command" - "os" - "os/exec" ) type BuildCommand struct { @@ -36,9 +39,10 @@ func (receiver *BuildCommand) Extend() command.Extend { Category: "build", Flags: []command.Flag{ &command.StringFlag{ - Name: "system", - Value: "", - Usage: "target system os", + Name: "system", + Aliases: []string{"s"}, + Value: "", + Usage: "target system os", }, }, } @@ -68,8 +72,8 @@ func (receiver *BuildCommand) Handle(ctx console.Context) error { } system := ctx.Option("system") - if system == "" { - color.Redln("You missed --system flag.") + if !slices.Contains([]string{"linux", "windows", "darwin"}, system) { + color.Redln("The value of the --system flag is invalid.") return nil } diff --git a/console/console/build_command_test.go b/console/console/build_command_test.go index 76ba54e1e..8cdbdbeeb 100644 --- a/console/console/build_command_test.go +++ b/console/console/build_command_test.go @@ -6,16 +6,16 @@ import ( "github.com/stretchr/testify/assert" - configmock "github.com/goravel/framework/mocks/config" - consolemocks "github.com/goravel/framework/mocks/console" + mocksconfig "github.com/goravel/framework/mocks/config" + mocksconsole "github.com/goravel/framework/mocks/console" ) func TestBuildCommand(t *testing.T) { - mockConfig := &configmock.Config{} + mockConfig := &mocksconfig.Config{} mockConfig.On("GetString", "app.env").Return("local").Once() newBuildCommand := NewBuildCommand(mockConfig) - mockContext := &consolemocks.Context{} + mockContext := &mocksconsole.Context{} mockContext.On("Option", "system").Return("linux").Once() assert.Nil(t, newBuildCommand.Handle(mockContext)) diff --git a/console/service_provider.go b/console/service_provider.go index 712d41277..d4c3a4d3f 100644 --- a/console/service_provider.go +++ b/console/service_provider.go @@ -28,5 +28,6 @@ func (receiver *ServiceProvider) registerCommands(app foundation.Application) { console.NewListCommand(artisan), console.NewKeyGenerateCommand(config), console.NewMakeCommand(), + console.NewBuildCommand(config), }) } From a522e845845a8532a899d13a9eba2b14bab2310c Mon Sep 17 00:00:00 2001 From: kamandlou Date: Fri, 23 Feb 2024 18:24:08 +0330 Subject: [PATCH 07/10] fix build command --- console/console/build_command.go | 7 ++++--- console/console/build_command_test.go | 5 +++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/console/console/build_command.go b/console/console/build_command.go index bf7f6ac9b..032eeccf4 100644 --- a/console/console/build_command.go +++ b/console/console/build_command.go @@ -2,9 +2,9 @@ package console import ( "fmt" - "golang.org/x/exp/slices" "os" "os/exec" + "slices" "github.com/gookit/color" @@ -72,8 +72,9 @@ func (receiver *BuildCommand) Handle(ctx console.Context) error { } system := ctx.Option("system") - if !slices.Contains([]string{"linux", "windows", "darwin"}, system) { - color.Redln("The value of the --system flag is invalid.") + validSystems := []string{"linux", "windows", "darwin"} + if !slices.Contains(validSystems, system) { + color.Redln(fmt.Sprintf("Invalid system '%s' specified. Allowed values are: %v", system, validSystems)) return nil } diff --git a/console/console/build_command_test.go b/console/console/build_command_test.go index 8cdbdbeeb..e7074e96d 100644 --- a/console/console/build_command_test.go +++ b/console/console/build_command_test.go @@ -51,4 +51,9 @@ func TestBuildCommand(t *testing.T) { }() assert.Nil(t, newBuildCommand.Handle(mockContext)) + + mockConfig.On("GetString", "app.env").Return("local").Once() + mockContext.On("Option", "system").Return("invalid-system").Once() + + assert.Nil(t, newBuildCommand.Handle(mockContext)) } From 68a4efe3a69c49d77b94089ad23ea70852a36ada Mon Sep 17 00:00:00 2001 From: kamandlou Date: Sun, 25 Feb 2024 16:54:26 +0330 Subject: [PATCH 08/10] fix build command --- console/console/build_command.go | 6 ++++-- console/console/build_command_test.go | 9 ++------- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/console/console/build_command.go b/console/console/build_command.go index 032eeccf4..9e2240800 100644 --- a/console/console/build_command.go +++ b/console/console/build_command.go @@ -1,6 +1,7 @@ package console import ( + "errors" "fmt" "os" "os/exec" @@ -74,8 +75,9 @@ func (receiver *BuildCommand) Handle(ctx console.Context) error { system := ctx.Option("system") validSystems := []string{"linux", "windows", "darwin"} if !slices.Contains(validSystems, system) { - color.Redln(fmt.Sprintf("Invalid system '%s' specified. Allowed values are: %v", system, validSystems)) - return nil + err := fmt.Sprintf("Invalid system '%s' specified. Allowed values are: %v", system, validSystems) + color.Redln(err) + return errors.New(err) } if err := receiver.buildTheApplication(system); err != nil { diff --git a/console/console/build_command_test.go b/console/console/build_command_test.go index e7074e96d..124d6db44 100644 --- a/console/console/build_command_test.go +++ b/console/console/build_command_test.go @@ -16,9 +16,9 @@ func TestBuildCommand(t *testing.T) { newBuildCommand := NewBuildCommand(mockConfig) mockContext := &mocksconsole.Context{} - mockContext.On("Option", "system").Return("linux").Once() + mockContext.On("Option", "system").Return("invalidSystem").Once() - assert.Nil(t, newBuildCommand.Handle(mockContext)) + assert.NotNil(t, newBuildCommand.Handle(mockContext)) mockConfig.On("GetString", "app.env").Return("production").Once() mockContext.On("Option", "system").Return("linux").Once() @@ -51,9 +51,4 @@ func TestBuildCommand(t *testing.T) { }() assert.Nil(t, newBuildCommand.Handle(mockContext)) - - mockConfig.On("GetString", "app.env").Return("local").Once() - mockContext.On("Option", "system").Return("invalid-system").Once() - - assert.Nil(t, newBuildCommand.Handle(mockContext)) } From ebec26021493b58887ff5dc4e205ab5d3ae95182 Mon Sep 17 00:00:00 2001 From: kamandlou Date: Sun, 25 Feb 2024 17:00:08 +0330 Subject: [PATCH 09/10] update go.mod --- go.mod | 1 - 1 file changed, 1 deletion(-) diff --git a/go.mod b/go.mod index bc6c6f3b3..a8523a8b9 100644 --- a/go.mod +++ b/go.mod @@ -118,7 +118,6 @@ require ( go.opencensus.io v0.24.0 // indirect go.uber.org/multierr v1.9.0 // indirect golang.org/x/arch v0.3.0 // indirect - golang.org/x/mod v0.10.0 // indirect golang.org/x/net v0.20.0 // indirect golang.org/x/oauth2 v0.15.0 // indirect golang.org/x/sync v0.6.0 // indirect From 3c2ab57472613da97e631d5e4cacb48f1333d4da Mon Sep 17 00:00:00 2001 From: kamandlou Date: Sun, 25 Feb 2024 17:09:16 +0330 Subject: [PATCH 10/10] update build_command.go --- console/console/build_command.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/console/console/build_command.go b/console/console/build_command.go index 9e2240800..fc4677573 100644 --- a/console/console/build_command.go +++ b/console/console/build_command.go @@ -5,7 +5,6 @@ import ( "fmt" "os" "os/exec" - "slices" "github.com/gookit/color" @@ -74,7 +73,15 @@ func (receiver *BuildCommand) Handle(ctx console.Context) error { system := ctx.Option("system") validSystems := []string{"linux", "windows", "darwin"} - if !slices.Contains(validSystems, system) { + isValidOption := func(option string) bool { + for _, validOption := range validSystems { + if option == validOption { + return true + } + } + return false + } + if !isValidOption(system) { err := fmt.Sprintf("Invalid system '%s' specified. Allowed values are: %v", system, validSystems) color.Redln(err) return errors.New(err)