From 65dd7608fb515d3e9fce354a6067b3ef27d2d87f Mon Sep 17 00:00:00 2001 From: Martin Nirtl Date: Mon, 24 Feb 2020 13:54:06 +0100 Subject: [PATCH] use custom cobra args validators --- .../commands/argsvalidator/argsvalidator.go | 13 +++++- internal/commands/envcmd/pull.go | 12 +++-- internal/commands/envcmd/remove.go | 26 +++++------ internal/commands/envcmd/set.go | 21 +++++---- internal/commands/logscmd/root.go | 24 ++-------- internal/commands/profilecmd/delete.go | 46 ++++++++----------- internal/commands/profilecmd/rename.go | 17 ++----- internal/commands/profilecmd/update.go | 18 ++------ internal/commands/upcmd/root.go | 12 ++++- internal/utils/helpers/helpers.go | 21 --------- 10 files changed, 82 insertions(+), 128 deletions(-) diff --git a/internal/commands/argsvalidator/argsvalidator.go b/internal/commands/argsvalidator/argsvalidator.go index f302d8e..966583d 100644 --- a/internal/commands/argsvalidator/argsvalidator.go +++ b/internal/commands/argsvalidator/argsvalidator.go @@ -5,7 +5,7 @@ import ( "github.com/martinnirtl/dockma/internal/config" "github.com/martinnirtl/dockma/internal/utils" - "github.com/martinnirtl/dockma/internal/utils/helpers" + "github.com/martinnirtl/dockma/pkg/dockercompose" "github.com/spf13/cobra" "github.com/ttacon/chalk" ) @@ -71,10 +71,19 @@ func OnlyServices(cmd *cobra.Command, args []string) error { activeEnv := config.GetActiveEnv() for _, arg := range args { - if !utils.Includes(helpers.GetEnvServices(activeEnv), arg) { + if !utils.Includes(getEnvServices(activeEnv), arg) { return fmt.Errorf("No such environment %s", chalk.Underline.TextStyle(arg)) } } return nil } + +func getEnvServices(env config.Env) []string { + envHomeDir := env.GetHomeDir() + + services, err := dockercompose.GetServices(envHomeDir) + utils.ErrorAndExit(err) + + return services.All +} diff --git a/internal/commands/envcmd/pull.go b/internal/commands/envcmd/pull.go index 3f7ba11..cb017b4 100644 --- a/internal/commands/envcmd/pull.go +++ b/internal/commands/envcmd/pull.go @@ -5,9 +5,10 @@ import ( "fmt" "os" + "github.com/martinnirtl/dockma/internal/commands/argsvalidator" "github.com/martinnirtl/dockma/internal/config" + "github.com/martinnirtl/dockma/internal/survey" "github.com/martinnirtl/dockma/internal/utils" - "github.com/martinnirtl/dockma/internal/utils/helpers" "github.com/martinnirtl/dockma/pkg/externalcommand" "github.com/martinnirtl/dockma/pkg/externalcommand/spinnertimebridger" "github.com/spf13/cobra" @@ -16,11 +17,11 @@ import ( func getPullCommand() *cobra.Command { return &cobra.Command{ - Use: "pull", + Use: "pull [env]", Short: "Run 'git pull' in environment home dir", Long: "Run 'git pull' in environment home dir", Example: "dockma env pull", - Args: cobra.RangeArgs(0, 1), + Args: argsvalidator.OptionalEnv, Run: runPullCommand, } } @@ -28,9 +29,10 @@ func getPullCommand() *cobra.Command { func runPullCommand(cmd *cobra.Command, args []string) { envName := "" if len(args) == 0 { - envName = helpers.GetEnvironment("") + envNames := config.GetEnvNames() + envName = survey.Select("Choose an environment", envNames) } else { - envName = helpers.GetEnvironment(args[0]) + envName = args[0] } env, err := config.GetEnv(envName) diff --git a/internal/commands/envcmd/remove.go b/internal/commands/envcmd/remove.go index b076b1b..987b368 100644 --- a/internal/commands/envcmd/remove.go +++ b/internal/commands/envcmd/remove.go @@ -4,10 +4,10 @@ import ( "errors" "fmt" + "github.com/martinnirtl/dockma/internal/commands/argsvalidator" "github.com/martinnirtl/dockma/internal/config" "github.com/martinnirtl/dockma/internal/survey" "github.com/martinnirtl/dockma/internal/utils" - "github.com/martinnirtl/dockma/internal/utils/helpers" "github.com/spf13/cobra" "github.com/spf13/viper" "github.com/ttacon/chalk" @@ -19,36 +19,36 @@ func getRemoveCommand() *cobra.Command { Aliases: []string{"rm"}, Short: "Remove environment", Long: "Remove environment", - Example: "dockma envs remove my-env", - // FIXME rewrite/rethink loading of dockma config for dynamic generation of ValidArgs - Args: cobra.RangeArgs(0, 1), - Run: runRemoveCommand, + Example: "dockma envs remove", + Args: argsvalidator.OptionalEnv, + Run: runRemoveCommand, } } func runRemoveCommand(cmd *cobra.Command, args []string) { - env := "" + var envName string if len(args) == 0 { - env = helpers.GetEnvironment("") + envNames := config.GetEnvNames() + envName = survey.Select("Choose an environment", envNames) } else { - env = helpers.GetEnvironment(args[0]) + envName = args[0] } - sure := survey.Confirm(fmt.Sprintf("Are you sure to remove '%s'", env), false) + sure := survey.Confirm(fmt.Sprintf("Are you sure to remove %s", chalk.Cyan.Color(envName)), false) if !sure { utils.Abort() } activeEnv := config.GetActiveEnv() - if env == activeEnv.GetName() { + if envName == activeEnv.GetName() { viper.Set("active", "-") config.Save(chalk.Yellow.Color("Unset active environment."), errors.New("Failed to unset active environment")) } - config.Save(fmt.Sprintf("Removed environment: %s", chalk.Cyan.Color(env)), errors.New("Failed to remove environment")) - envs := viper.GetStringMap("envs") - delete(envs, env) + delete(envs, envName) viper.Set("envs", envs) + + config.Save(fmt.Sprintf("Removed environment: %s", chalk.Cyan.Color(envName)), errors.New("Failed to remove environment")) } diff --git a/internal/commands/envcmd/set.go b/internal/commands/envcmd/set.go index 48c733b..13f3f0e 100644 --- a/internal/commands/envcmd/set.go +++ b/internal/commands/envcmd/set.go @@ -3,9 +3,10 @@ package envcmd import ( "fmt" + "github.com/martinnirtl/dockma/internal/commands/argsvalidator" "github.com/martinnirtl/dockma/internal/config" + "github.com/martinnirtl/dockma/internal/survey" "github.com/martinnirtl/dockma/internal/utils" - "github.com/martinnirtl/dockma/internal/utils/helpers" "github.com/spf13/cobra" "github.com/spf13/viper" "github.com/ttacon/chalk" @@ -17,23 +18,23 @@ func getSetCommand() *cobra.Command { Short: "Set active environment", Long: "Set active environment", Example: "dockma envs set", - // FIXME loading of viper config for dynamic ValidArgs - Args: cobra.RangeArgs(0, 1), - Run: runSetCommand, + Args: argsvalidator.OptionalEnv, + Run: runSetCommand, } } func runSetCommand(cmd *cobra.Command, args []string) { - env := "" + envName := "" if len(args) == 0 { - env = helpers.GetEnvironment("") + envNames := config.GetEnvNames() + envName = survey.Select("Choose an environment", envNames) } else { - env = helpers.GetEnvironment(args[0]) + envName = args[0] } activeEnv := config.GetActiveEnv() - if env == activeEnv.GetName() { + if envName == activeEnv.GetName() { fmt.Printf("Environment already set active: %s\n", chalk.Cyan.Color(activeEnv.GetName())) return @@ -43,8 +44,8 @@ func runSetCommand(cmd *cobra.Command, args []string) { utils.Warn(fmt.Sprintf("Switching from running environment.")) } - viper.Set("active", env) + viper.Set("active", envName) - config.Save(fmt.Sprintf("New active environment: %s (old: %s)", chalk.Cyan.Color(env), activeEnv.GetName()), fmt.Errorf("Failed to set active environment")) + config.Save(fmt.Sprintf("New active environment: %s (old: %s)", chalk.Cyan.Color(envName), activeEnv.GetName()), fmt.Errorf("Failed to set active environment")) } diff --git a/internal/commands/logscmd/root.go b/internal/commands/logscmd/root.go index bdaf62e..606c227 100644 --- a/internal/commands/logscmd/root.go +++ b/internal/commands/logscmd/root.go @@ -5,6 +5,7 @@ import ( "os" "sort" + "github.com/martinnirtl/dockma/internal/commands/argsvalidator" "github.com/martinnirtl/dockma/internal/config" "github.com/martinnirtl/dockma/internal/utils" "github.com/martinnirtl/dockma/pkg/externalcommand" @@ -21,11 +22,9 @@ func GetLogsCommand() *cobra.Command { Use: "logs [service...]", Short: "Logs output of all or only selected services", Long: "Logs output of all or only selected services", - Example: "dockma logs -f my-service", - Args: cobra.ArbitraryArgs, - // Args: cobra.OnlyValidArgs, // TODO investigate - // ValidArgs: getValidArgs(), - Run: runLogsCommand, + Example: "dockma logs -f database", + Args: argsvalidator.OnlyServices, + Run: runLogsCommand, } logsCommand.Flags().BoolVarP(&followFlag, "follow", "f", false, "follow log output") @@ -73,18 +72,3 @@ func addFlagsToArgs(args []string) []string { return args } - -// func getValidArgs() []string { -// activeEnv := config.GetActiveEnv() - -// if activeEnv == "-" { -// return []string{} -// } - -// envHomeDir := config.GetEnvHomeDir(activeEnv) - -// services, err := dockercompose.GetServices(envHomeDir) -// utils.ErrorAndExit(err) - -// return services.All -// } diff --git a/internal/commands/profilecmd/delete.go b/internal/commands/profilecmd/delete.go index 2390999..41db4ef 100644 --- a/internal/commands/profilecmd/delete.go +++ b/internal/commands/profilecmd/delete.go @@ -1,10 +1,10 @@ package profilecmd import ( - "errors" "fmt" "os" + "github.com/martinnirtl/dockma/internal/commands/argsvalidator" "github.com/martinnirtl/dockma/internal/config" "github.com/martinnirtl/dockma/internal/survey" "github.com/martinnirtl/dockma/internal/utils" @@ -15,25 +15,13 @@ import ( func getDeleteCommand() *cobra.Command { return &cobra.Command{ - Use: "delete", + Use: "delete [profiles...]", Aliases: []string{"del"}, Short: "Delete a profile of active environment", Long: "Delete a profile of active environment", Example: "dockma profile delete", - Args: func(cmd *cobra.Command, args []string) error { - if len(args) == 1 && !config.GetActiveEnv().HasProfile(args[0]) { - return fmt.Errorf("No such profile: %s", args[0]) - } - - if len(args) > 1 { - return errors.New("Command only takes one argument") - } - - return nil - }, - // Args: cobra.OnlyValidArgs, - // ValidArgs: config.GetActiveEnv().GetProfileNames(), - Run: runDeleteCommand, + Args: argsvalidator.OnlyProfiles, + Run: runDeleteCommand, } } @@ -47,23 +35,25 @@ func runDeleteCommand(cmd *cobra.Command, args []string) { os.Exit(0) } - var profileName string + var selected []string if len(args) == 0 { - profileName = survey.Select("Select profile to be deleted", profileNames) + selected = survey.MultiSelect("Select profiles to be deleted", profileNames, nil) } else { - profileName = args[0] - - proceed := survey.Confirm("Are you sure", true) - if !proceed { - utils.Abort() - } + selected = args } - profileMap := viper.GetStringMap(fmt.Sprintf("envs.%s.profiles", activeEnv.GetName())) + proceed := survey.Confirm("Are you sure", true) + if !proceed { + utils.Abort() + } - profileMap[profileName] = nil + activeEnvName := activeEnv.GetName() + profileMap := viper.GetStringMap(fmt.Sprintf("envs.%s.profiles", activeEnvName)) + for _, profileName := range selected { + profileMap[profileName] = nil - viper.Set(fmt.Sprintf("envs.%s.profiles", activeEnv.GetName()), profileMap) + config.Save(fmt.Sprintf("Deleted profile from %s environment: %s", chalk.Bold.TextStyle(activeEnvName), chalk.Cyan.Color(profileName)), fmt.Errorf("Failed to delete profile: %s", profileName)) + } - config.Save(fmt.Sprintf("Deleted profile from %s environment: %s", chalk.Bold.TextStyle(activeEnv.GetName()), chalk.Cyan.Color(profileName)), fmt.Errorf("Failed to delete profile: %s", profileName)) + viper.Set(fmt.Sprintf("envs.%s.profiles", activeEnvName), profileMap) } diff --git a/internal/commands/profilecmd/rename.go b/internal/commands/profilecmd/rename.go index 6b357be..d01378d 100644 --- a/internal/commands/profilecmd/rename.go +++ b/internal/commands/profilecmd/rename.go @@ -5,6 +5,7 @@ import ( "fmt" "os" + "github.com/martinnirtl/dockma/internal/commands/argsvalidator" "github.com/martinnirtl/dockma/internal/config" "github.com/martinnirtl/dockma/internal/survey" "github.com/martinnirtl/dockma/internal/utils" @@ -15,22 +16,12 @@ import ( func getRenameCommand() *cobra.Command { return &cobra.Command{ - Use: "rename", + Use: "rename [profile]", Short: "Rename profile", Long: "Rename profile", Example: "dockma profile rename", - Args: func(cmd *cobra.Command, args []string) error { - if len(args) == 1 && !config.GetActiveEnv().HasProfile(args[0]) { - return fmt.Errorf("No such profile: %s", args[0]) - } - - if len(args) > 1 { - return errors.New("Command only takes one argument") - } - - return nil - }, - Run: runRenameCommand, + Args: argsvalidator.OptionalProfile, + Run: runRenameCommand, } } diff --git a/internal/commands/profilecmd/update.go b/internal/commands/profilecmd/update.go index 18168cd..01c6b66 100644 --- a/internal/commands/profilecmd/update.go +++ b/internal/commands/profilecmd/update.go @@ -1,10 +1,10 @@ package profilecmd import ( - "errors" "fmt" "os" + "github.com/martinnirtl/dockma/internal/commands/argsvalidator" "github.com/martinnirtl/dockma/internal/config" "github.com/martinnirtl/dockma/internal/survey" "github.com/martinnirtl/dockma/internal/utils" @@ -16,23 +16,13 @@ import ( func getUpdateCommand() *cobra.Command { return &cobra.Command{ - Use: "update", + Use: "update [profile]", Aliases: []string{"upd"}, Short: "Update profile's service selection", Long: "Update profile's service selection", Example: "dockma profile update", - Args: func(cmd *cobra.Command, args []string) error { - if len(args) == 1 && !config.GetActiveEnv().HasProfile(args[0]) { - return fmt.Errorf("No such profile: %s", args[0]) - } - - if len(args) > 1 { - return errors.New("Command only takes one argument") - } - - return nil - }, - Run: runUpdateCommand, + Args: argsvalidator.OptionalProfile, + Run: runUpdateCommand, } } diff --git a/internal/commands/upcmd/root.go b/internal/commands/upcmd/root.go index 04102a9..3e89df7 100644 --- a/internal/commands/upcmd/root.go +++ b/internal/commands/upcmd/root.go @@ -5,6 +5,7 @@ import ( "os" "strings" + "github.com/martinnirtl/dockma/internal/commands/argsvalidator" "github.com/martinnirtl/dockma/internal/commands/envcmd" "github.com/martinnirtl/dockma/internal/config" "github.com/martinnirtl/dockma/internal/envvars" @@ -26,7 +27,7 @@ func GetUpCommand() *cobra.Command { Short: "Runs active environment with profile or service selection", Long: "Runs active environment with profile or service selection", Example: "dockma up", - Args: cobra.NoArgs, + Args: argsvalidator.OptionalProfile, Run: runUpCommand, } } @@ -91,7 +92,14 @@ func runUpCommand(cmd *cobra.Command, args []string) { // default profileName := "latest" - if len(profileNames) > 0 { + if len(args) > 0 { + profileName = args[0] + + profile, err := activeEnv.GetProfile(profileName) + utils.ErrorAndExit(err) + + preselected = profile.Selected + } else if len(profileNames) > 0 { profileNames = append(profileNames, "latest") profileName = survey.Select(fmt.Sprintf("Select profile to run"), profileNames) diff --git a/internal/utils/helpers/helpers.go b/internal/utils/helpers/helpers.go index ecac886..ed7447c 100644 --- a/internal/utils/helpers/helpers.go +++ b/internal/utils/helpers/helpers.go @@ -3,30 +3,9 @@ package helpers import ( "fmt" - "github.com/martinnirtl/dockma/internal/config" - "github.com/martinnirtl/dockma/internal/survey" "github.com/ttacon/chalk" ) -// GetEnvironment returns one environment -func GetEnvironment(env string) string { - envs := config.GetEnvNames() - - for _, envName := range envs { - if env == envName { - return env - } - } - - if env != "" { - fmt.Printf("%sNo such environment: %s%s\n", chalk.Yellow, env, chalk.ResetColor) - } - - env = survey.Select("Choose an environment", envs) - - return env -} - // PrintErrorList prints error list as red 'suberrors' to stdout (To be used with config.SaveNow). func PrintErrorList(errorList []error) { for _, err := range errorList {