func newCmdPresenter(app *cli.App, maxNameLen int, cmdName string) (presenter cmdPresenter) { cmd := app.Command(cmdName) presenter.Name = presentCmdName(*cmd) padding := strings.Repeat(" ", maxNameLen-len(presenter.Name)) presenter.Name = presenter.Name + padding presenter.Description = cmd.Description return }
func GetByCmdName(app *cli.App, cmdName string) (cmd *cli.Command, err error) { cmd = app.Command(cmdName) if cmd == nil { for _, c := range app.Commands { if c.ShortName == cmdName { return &c, nil } } err = errors.New("Command not found") } return }
func newAppPresenter(app *cli.App) (presenter appPresenter) { maxNameLen := 0 for _, cmd := range app.Commands { name := presentCmdName(cmd) if utf8.RuneCountInString(name) > maxNameLen { maxNameLen = len(name) } } presentCommand := func(commandName string) (presenter cmdPresenter) { cmd := app.Command(commandName) presenter.Name = presentCmdName(*cmd) padding := strings.Repeat(" ", maxNameLen-utf8.RuneCountInString(presenter.Name)) presenter.Name = presenter.Name + padding presenter.Description = cmd.Description return } presentNonCodegangstaCommand := func(commandName string) (presenter cmdPresenter) { cmd := command_registry.Commands.FindCommand(commandName) presenter.Name = cmd.MetaData().Name padding := strings.Repeat(" ", maxNameLen-utf8.RuneCountInString(presenter.Name)) presenter.Name = presenter.Name + padding presenter.Description = cmd.MetaData().Description return } presentPluginCommands := func() []cmdPresenter { pluginConfig := plugin_config.NewPluginConfig(func(err error) { //fail silently when running help? }) plugins := pluginConfig.Plugins() var presenters []cmdPresenter var pluginPresenter cmdPresenter for _, pluginMetadata := range plugins { for _, cmd := range pluginMetadata.Commands { if cmd.Alias == "" { pluginPresenter.Name = cmd.Name } else { pluginPresenter.Name = cmd.Name + ", " + cmd.Alias } padding := strings.Repeat(" ", maxNameLen-utf8.RuneCountInString(pluginPresenter.Name)) pluginPresenter.Name = pluginPresenter.Name + padding pluginPresenter.Description = cmd.HelpText presenters = append(presenters, pluginPresenter) } } return presenters } presenter.Name = app.Name presenter.Flags = app.Flags presenter.Usage = app.Usage presenter.Version = app.Version presenter.Compiled = app.Compiled presenter.Commands = []groupedCommands{ { Name: T("GETTING STARTED"), CommandSubGroups: [][]cmdPresenter{ { presentNonCodegangstaCommand("login"), presentNonCodegangstaCommand("logout"), presentNonCodegangstaCommand("passwd"), presentNonCodegangstaCommand("target"), }, { presentNonCodegangstaCommand("api"), presentNonCodegangstaCommand("auth"), }, }, }, { Name: T("APPS"), CommandSubGroups: [][]cmdPresenter{ { presentNonCodegangstaCommand("apps"), presentNonCodegangstaCommand("app"), }, { presentCommand("push"), //needs start/restart ... presentCommand("scale"), //needs stop/restart presentNonCodegangstaCommand("delete"), presentNonCodegangstaCommand("rename"), }, { presentCommand("start"), presentCommand("stop"), presentCommand("restart"), //needs start presentCommand("restage"), presentCommand("restart-app-instance"), }, { presentNonCodegangstaCommand("events"), presentNonCodegangstaCommand("files"), presentNonCodegangstaCommand("logs"), }, { presentNonCodegangstaCommand("env"), presentNonCodegangstaCommand("set-env"), presentNonCodegangstaCommand("unset-env"), }, { presentNonCodegangstaCommand("stacks"), presentNonCodegangstaCommand("stack"), }, { presentCommand("copy-source"), }, { presentNonCodegangstaCommand("create-app-manifest"), }, }, }, { Name: T("SERVICES"), CommandSubGroups: [][]cmdPresenter{ { presentNonCodegangstaCommand("marketplace"), presentNonCodegangstaCommand("services"), presentNonCodegangstaCommand("service"), }, { presentNonCodegangstaCommand("create-service"), presentCommand("update-service"), presentNonCodegangstaCommand("delete-service"), presentNonCodegangstaCommand("rename-service"), }, { presentCommand("create-service-key"), presentCommand("service-keys"), presentCommand("service-key"), presentCommand("delete-service-key"), }, { presentCommand("bind-service"), presentCommand("unbind-service"), }, { presentCommand("create-user-provided-service"), presentCommand("update-user-provided-service"), }, }, }, { Name: T("ORGS"), CommandSubGroups: [][]cmdPresenter{ { presentNonCodegangstaCommand("orgs"), presentNonCodegangstaCommand("org"), }, { presentNonCodegangstaCommand("create-org"), presentNonCodegangstaCommand("delete-org"), presentNonCodegangstaCommand("rename-org"), }, }, }, { Name: T("SPACES"), CommandSubGroups: [][]cmdPresenter{ { presentNonCodegangstaCommand("spaces"), presentNonCodegangstaCommand("space"), }, { presentCommand("create-space"), presentNonCodegangstaCommand("delete-space"), presentNonCodegangstaCommand("rename-space"), }, }, }, { Name: T("DOMAINS"), CommandSubGroups: [][]cmdPresenter{ { presentNonCodegangstaCommand("domains"), presentNonCodegangstaCommand("create-domain"), presentNonCodegangstaCommand("delete-domain"), presentNonCodegangstaCommand("create-shared-domain"), presentNonCodegangstaCommand("delete-shared-domain"), }, }, }, { Name: T("ROUTES"), CommandSubGroups: [][]cmdPresenter{ { presentNonCodegangstaCommand("routes"), presentCommand("create-route"), presentNonCodegangstaCommand("check-route"), presentCommand("map-route"), presentNonCodegangstaCommand("unmap-route"), presentNonCodegangstaCommand("delete-route"), presentNonCodegangstaCommand("delete-orphaned-routes"), }, }, }, { Name: T("BUILDPACKS"), CommandSubGroups: [][]cmdPresenter{ { presentNonCodegangstaCommand("buildpacks"), presentNonCodegangstaCommand("create-buildpack"), presentNonCodegangstaCommand("update-buildpack"), presentNonCodegangstaCommand("rename-buildpack"), presentNonCodegangstaCommand("delete-buildpack"), }, }, }, { Name: T("USER ADMIN"), CommandSubGroups: [][]cmdPresenter{ { presentCommand("create-user"), presentNonCodegangstaCommand("delete-user"), }, { presentNonCodegangstaCommand("org-users"), presentNonCodegangstaCommand("set-org-role"), presentNonCodegangstaCommand("unset-org-role"), }, { presentNonCodegangstaCommand("space-users"), presentCommand("set-space-role"), presentNonCodegangstaCommand("unset-space-role"), }, }, }, { Name: T("ORG ADMIN"), CommandSubGroups: [][]cmdPresenter{ { presentNonCodegangstaCommand("quotas"), presentNonCodegangstaCommand("quota"), presentNonCodegangstaCommand("set-quota"), }, { presentNonCodegangstaCommand("create-quota"), presentNonCodegangstaCommand("delete-quota"), presentNonCodegangstaCommand("update-quota"), }, { presentNonCodegangstaCommand("share-private-domain"), presentNonCodegangstaCommand("unshare-private-domain"), }, }, }, { Name: T("SPACE ADMIN"), CommandSubGroups: [][]cmdPresenter{ { presentNonCodegangstaCommand("space-quotas"), presentNonCodegangstaCommand("space-quota"), presentNonCodegangstaCommand("create-space-quota"), presentNonCodegangstaCommand("update-space-quota"), presentNonCodegangstaCommand("delete-space-quota"), presentNonCodegangstaCommand("set-space-quota"), presentNonCodegangstaCommand("unset-space-quota"), }, }, }, { Name: T("SERVICE ADMIN"), CommandSubGroups: [][]cmdPresenter{ { presentNonCodegangstaCommand("service-auth-tokens"), presentNonCodegangstaCommand("create-service-auth-token"), presentNonCodegangstaCommand("update-service-auth-token"), presentNonCodegangstaCommand("delete-service-auth-token"), }, { presentNonCodegangstaCommand("service-brokers"), presentNonCodegangstaCommand("create-service-broker"), presentNonCodegangstaCommand("update-service-broker"), presentNonCodegangstaCommand("delete-service-broker"), presentNonCodegangstaCommand("rename-service-broker"), }, { presentNonCodegangstaCommand("migrate-service-instances"), presentNonCodegangstaCommand("purge-service-offering"), }, { presentCommand("service-access"), presentCommand("enable-service-access"), presentCommand("disable-service-access"), }, }, }, { Name: T("SECURITY GROUP"), CommandSubGroups: [][]cmdPresenter{ { presentNonCodegangstaCommand("security-group"), presentNonCodegangstaCommand("security-groups"), presentNonCodegangstaCommand("create-security-group"), presentNonCodegangstaCommand("update-security-group"), presentNonCodegangstaCommand("delete-security-group"), presentCommand("bind-security-group"), presentCommand("unbind-security-group"), }, { presentCommand("bind-staging-security-group"), presentCommand("staging-security-groups"), presentCommand("unbind-staging-security-group"), }, { presentCommand("bind-running-security-group"), presentCommand("running-security-groups"), presentCommand("unbind-running-security-group"), }, }, }, { Name: T("ENVIRONMENT VARIABLE GROUPS"), CommandSubGroups: [][]cmdPresenter{ { presentCommand("running-environment-variable-group"), presentCommand("staging-environment-variable-group"), presentCommand("set-staging-environment-variable-group"), presentCommand("set-running-environment-variable-group"), }, }, }, { Name: T("FEATURE FLAGS"), CommandSubGroups: [][]cmdPresenter{ { presentCommand("feature-flags"), presentCommand("feature-flag"), presentCommand("enable-feature-flag"), presentCommand("disable-feature-flag"), }, }, }, { Name: T("ADVANCED"), CommandSubGroups: [][]cmdPresenter{ { presentCommand("curl"), presentCommand("config"), presentCommand("oauth-token"), }, }, }, { Name: T("ADD/REMOVE PLUGIN REPOSITORY"), CommandSubGroups: [][]cmdPresenter{ { presentCommand("add-plugin-repo"), presentCommand("remove-plugin-repo"), presentCommand("list-plugin-repos"), presentCommand("repo-plugins"), }, }, }, { Name: T("ADD/REMOVE PLUGIN"), CommandSubGroups: [][]cmdPresenter{ { presentCommand("plugins"), presentCommand("install-plugin"), presentCommand("uninstall-plugin"), }, }, }, { Name: T("INSTALLED PLUGIN COMMANDS"), CommandSubGroups: [][]cmdPresenter{ presentPluginCommands(), }, }, } return }
func newAppPresenter(app *cli.App) (presenter appPresenter) { maxNameLen := 0 for _, cmd := range app.Commands { name := presentCmdName(cmd) if utf8.RuneCountInString(name) > maxNameLen { maxNameLen = len(name) } } presentCommand := func(commandName string) (presenter cmdPresenter) { cmd := app.Command(commandName) presenter.Name = presentCmdName(*cmd) padding := strings.Repeat(" ", maxNameLen-utf8.RuneCountInString(presenter.Name)) presenter.Name = presenter.Name + padding presenter.Description = cmd.Usage return } presenter.Name = app.Name presenter.Flags = app.Flags presenter.Usage = app.Usage presenter.Version = app.Version presenter.Authors = app.Authors presenter.Commands = []groupedCommands{ { Name: "TARGET LATTICE", CommandSubGroups: [][]cmdPresenter{ { presentCommand("target"), }, }, }, { Name: "MANAGE DOCKER APPS", CommandSubGroups: [][]cmdPresenter{ { presentCommand("create"), }, }, }, { Name: "MANAGE DROPLETS", CommandSubGroups: [][]cmdPresenter{ { presentCommand("build-droplet"), presentCommand("export-droplet"), presentCommand("import-droplet"), presentCommand("launch-droplet"), presentCommand("list-droplets"), presentCommand("remove-droplet"), }, }, }, { Name: "MANAGE ALL APPS", CommandSubGroups: [][]cmdPresenter{ { presentCommand("remove"), presentCommand("scale"), presentCommand("update-routes"), presentCommand("update"), }, }, }, { Name: "TASKS", CommandSubGroups: [][]cmdPresenter{ { presentCommand("cancel-task"), presentCommand("delete-task"), presentCommand("task"), }, }, }, { Name: "STREAM LOGS", CommandSubGroups: [][]cmdPresenter{ { presentCommand("logs"), }, }, }, { Name: "SEE WHATS RUNNING", CommandSubGroups: [][]cmdPresenter{ { presentCommand("cells"), presentCommand("list"), presentCommand("status"), presentCommand("visualize"), }, }, }, { Name: "SSH INTO AN APP CONTAINER", CommandSubGroups: [][]cmdPresenter{ { presentCommand("ssh"), }, }, }, { Name: "ADVANCED", CommandSubGroups: [][]cmdPresenter{ { presentCommand("submit-lrp"), presentCommand("submit-task"), }, }, }, { Name: "HELP AND DEBUG", CommandSubGroups: [][]cmdPresenter{ { presentCommand("debug-logs"), presentCommand("help"), presentCommand("test"), }, }, }, } return }
func newAppPresenter(app *cli.App) (presenter appPresenter) { maxNameLen := 0 for _, cmd := range app.Commands { name := presentCmdName(cmd) if utf8.RuneCountInString(name) > maxNameLen { maxNameLen = len(name) } } presentCommand := func(commandName string) (presenter cmdPresenter) { cmd := app.Command(commandName) presenter.Name = presentCmdName(*cmd) padding := strings.Repeat(" ", maxNameLen-utf8.RuneCountInString(presenter.Name)) presenter.Name = presenter.Name + padding presenter.Description = cmd.Description return } presenter.Name = app.Name presenter.Flags = app.Flags presenter.Usage = app.Usage presenter.Version = app.Version presenter.Compiled = app.Compiled presenter.Commands = []groupedCommands{ { Name: T("GETTING STARTED"), CommandSubGroups: [][]cmdPresenter{ { presentCommand("login"), presentCommand("logout"), presentCommand("passwd"), presentCommand("target"), }, { presentCommand("api"), presentCommand("auth"), }, }, }, { Name: T("APPS"), CommandSubGroups: [][]cmdPresenter{ { presentCommand("apps"), presentCommand("app"), }, { presentCommand("push"), presentCommand("scale"), presentCommand("delete"), presentCommand("rename"), }, { presentCommand("start"), presentCommand("stop"), presentCommand("restart"), presentCommand("restage"), }, { presentCommand("events"), presentCommand("files"), presentCommand("logs"), }, { presentCommand("env"), presentCommand("set-env"), presentCommand("unset-env"), }, { presentCommand("stacks"), }, }, }, { Name: T("SERVICES"), CommandSubGroups: [][]cmdPresenter{ { presentCommand("marketplace"), presentCommand("services"), presentCommand("service"), }, { presentCommand("create-service"), presentCommand("delete-service"), presentCommand("rename-service"), }, { presentCommand("bind-service"), presentCommand("unbind-service"), }, { presentCommand("create-user-provided-service"), presentCommand("update-user-provided-service"), }, }, }, { Name: T("ORGS"), CommandSubGroups: [][]cmdPresenter{ { presentCommand("orgs"), presentCommand("org"), }, { presentCommand("create-org"), presentCommand("delete-org"), presentCommand("rename-org"), }, }, }, { Name: T("SPACES"), CommandSubGroups: [][]cmdPresenter{ { presentCommand("spaces"), presentCommand("space"), }, { presentCommand("create-space"), presentCommand("delete-space"), presentCommand("rename-space"), }, }, }, { Name: T("DOMAINS"), CommandSubGroups: [][]cmdPresenter{ { presentCommand("domains"), presentCommand("create-domain"), presentCommand("delete-domain"), presentCommand("create-shared-domain"), presentCommand("delete-shared-domain"), }, }, }, { Name: T("ROUTES"), CommandSubGroups: [][]cmdPresenter{ { presentCommand("routes"), presentCommand("create-route"), presentCommand("map-route"), presentCommand("unmap-route"), presentCommand("delete-route"), presentCommand("delete-orphaned-routes"), }, }, }, { Name: T("BUILDPACKS"), CommandSubGroups: [][]cmdPresenter{ { presentCommand("buildpacks"), presentCommand("create-buildpack"), presentCommand("update-buildpack"), presentCommand("rename-buildpack"), presentCommand("delete-buildpack"), }, }, }, { Name: T("USER ADMIN"), CommandSubGroups: [][]cmdPresenter{ { presentCommand("create-user"), presentCommand("delete-user"), }, { presentCommand("org-users"), presentCommand("set-org-role"), presentCommand("unset-org-role"), }, { presentCommand("space-users"), presentCommand("set-space-role"), presentCommand("unset-space-role"), }, }, }, { Name: T("ORG ADMIN"), CommandSubGroups: [][]cmdPresenter{ { presentCommand("quotas"), presentCommand("quota"), presentCommand("set-quota"), }, { presentCommand("create-quota"), presentCommand("delete-quota"), presentCommand("update-quota"), }, }, }, { Name: T("SPACE ADMIN"), CommandSubGroups: [][]cmdPresenter{ { presentCommand("create-space-quota"), presentCommand("space-quotas"), }, }, }, { Name: T("SERVICE ADMIN"), CommandSubGroups: [][]cmdPresenter{ { presentCommand("service-auth-tokens"), presentCommand("create-service-auth-token"), presentCommand("update-service-auth-token"), presentCommand("delete-service-auth-token"), }, { presentCommand("service-brokers"), presentCommand("create-service-broker"), presentCommand("update-service-broker"), presentCommand("delete-service-broker"), presentCommand("rename-service-broker"), }, { presentCommand("migrate-service-instances"), presentCommand("purge-service-offering"), }, { presentCommand("service-access"), presentCommand("enable-service-access"), presentCommand("disable-service-access"), }, }, }, { Name: T("SECURITY GROUP"), CommandSubGroups: [][]cmdPresenter{ { presentCommand("security-group"), presentCommand("security-groups"), presentCommand("create-security-group"), presentCommand("update-security-group"), presentCommand("delete-security-group"), presentCommand("bind-security-group"), presentCommand("unbind-security-group"), }, { presentCommand("bind-staging-security-group"), presentCommand("staging-security-groups"), presentCommand("unbind-staging-security-group"), }, { presentCommand("bind-running-security-group"), presentCommand("running-security-groups"), presentCommand("unbind-running-security-group"), }, }, }, { Name: T("ADVANCED"), CommandSubGroups: [][]cmdPresenter{ { presentCommand("curl"), presentCommand("config"), }, }, }, } return }
}) It("returns if multiple bad flags are passed", func() { cliAppArgs := []string{"ltc", "create", "--badflag1", "--badflag2"} flags := main.GetCommandFlags(cliApp, cliAppArgs[1]) badFlags := main.MatchArgAndFlags(flags, cliAppArgs[2:]) main.InjectHelpTemplate(badFlags) Expect(badFlags).To(Equal("Unknown flags: \"--badflag1\", \"--badflag2\"")) }) }) Describe("GetCommandFlags", func() { It("returns flags string slice for a given command list of type Flag", func() { flagList := main.GetCommandFlags(cliApp, "create") cmd := cliApp.Command("create") for _, flag := range cmd.Flags { switch t := flag.(type) { default: Fail("unhandled flag type") case cli.StringSliceFlag: Expect(flagList).Should(ContainElement(t.Name)) case cli.IntFlag: Expect(flagList).Should(ContainElement(t.Name)) case cli.StringFlag: Expect(flagList).Should(ContainElement(t.Name)) case cli.BoolFlag: Expect(flagList).Should(ContainElement(t.Name)) case cli.DurationFlag: Expect(flagList).Should(ContainElement(t.Name)) }