Commit graph

55 commits

Author SHA1 Message Date
Fabiano Franz b4087da7eb Allows command suggestions along with "unknown command" errors 2015-09-13 23:35:10 -03:00
Eric Paris 75d96d75c3 Merge pull request #145 from eparis/man-cleanups
Enhance Man Page Generation
2015-09-08 18:19:27 -05:00
Steve Domino 6d2f1d2fa7 Ability to hide commands from usage/help text
Added the ability to have hidden commands that cobra will still run as intended, however they won't show up in any usage/help text

adding internal field to command

private is a better name

hiding private commands in default help/usage

opting for 'hidden' over 'private'

updating all 'help command' checks to exclude hidden commands

updating how commands are displayed in usage/help text by updating/adding some methods. added tests for hidden/deprecated commands

making command hidden when testing hidden command execution

test now leverage the included suite and are much less custom. also removed deprecation tests, once I discovered them in cobra_test.go

updating hidden command test to be more reliable

removing unnecessary () when checking len(c.Deprecated)

updating command comments to be godoc friendly
2015-09-08 17:01:13 -06:00
Eric Paris cfecf1379c manpage generation: Make sure parent in SEE ALSO has dashes
The CommandPath() for a parent might have a space (if .Parent() != .Root())
so we need to replace those spaces with `-`
2015-09-08 12:32:15 -04:00
akutz 5b121bc9fb Template Function Injection
This patch enables developers to add one to many template functions that
can be used by custom Usage and Help templates. Here is an example that
is included in the file cobra_test.go as the test function named
TestAddTemplateFunctions:

    AddTemplateFunc("t", func() bool { return true })
    AddTemplateFuncs(template.FuncMap{
        "f": func() bool { return false },
        "h": func() string { return "Hello," },
        "w": func() string { return "world." }})

    const usage = "Hello, world."

    c := &Command{}
    c.SetUsageTemplate(`{{if t}}{{h}}{{end}}{{if f}}{{h}}{{end}} {{w}}`)

    if us := c.UsageString(); us != usage {
        t.Errorf("c.UsageString() != \"%s\", is \"%s\"", usage, us)
    }

In the above example four functions are added to the template function
map used when the Usage and Help text is generated from the templates
that enable custom logic as well as data injection during template
execution.
2015-08-31 22:36:55 -05:00
Eric Paris e8bd799c1c Display pflag.CommandLine flags as if they were declared on the parent
```go
package main

import (
	"github.com/spf13/cobra"
	"github.com/spf13/pflag"
)

func main() {
	cmd := &cobra.Command{
		Use:   "min",
		Short: "minimal command",
		Run:   func(_ *cobra.Command, _ []string) {},
	}

	pflag.String("oncmdline", "oncmdline", "oncmdline")
	cmd.Execute()
}
```

Is a minimal cobra program.  When --help is displayed without this patch
you only get:

But with the patch --oncmdline is shows under flags.
2015-08-16 22:31:08 -07:00
Eric Paris 9a9d01c9ec Better error message
Calling `cobra-test echo times one two turkey` where `one` and `two` are
valid arguments but `turkey` is not now results in.

Error: invalid argument "turkey" for "cobra-test echo times"
Run 'cobra-test echo times --help' for usage.
2015-06-29 17:09:41 -04:00
Eric Paris 0a7a850026 Make error handling more obvious
Again, the code looks a little more like a middle-schooler's code. But
that just makes it easier to understand and maintain.
2015-06-29 15:45:01 -04:00
Eric Paris 07ad27d239 Handle grand children with the same name as the root
This fixes a problem where if you had a root command and a grand child
with the same name, the parser would break and would not run the
grandchild. The code was special casing if the immediate child had the
same name, but didn't handle grand-children
2015-06-22 17:54:08 -04:00
Simone Gotti fb86c5c559 Correctly print the unknown command name
by now, if someone calls: `program --validflag unknowncommand` the
output will be:

```
Error: unknown command "--validflag"
Run 'program help' for usage.
```

This patch strips out flags so the unknown command is printed:

```
Error: unknown command "unknowncommand"
Run 'program help' for usage.
```
2015-06-22 11:02:06 +02:00
Anastasis Andronidis d910a04b50 Add Global Normalization Function
[close #110]
2015-05-19 10:23:16 -04:00
Sam Ghods e0f326dabc Fix root command without subcommands but with arguments
[close #108]
2015-05-19 10:22:07 -04:00
bep be18870136 Fix two failing tests
The error message has changed ever so slightly.
2015-05-13 11:54:47 +02:00
Anastasis Andronidis 799a8ef863 Test for Persistent-Run propagation 2015-05-04 17:57:46 +02:00
Eric Paris fad5931693 Add docs, tests, and bit of rearrainging... 2015-04-30 14:08:47 -04:00
Eric Paris c3e48f996d Deprecated subcommands
They should still work, but shouldn't show up in help or usage output
2015-04-29 13:08:20 -04:00
deads2k 36aee64abe prevent removal of valid arguments 2015-04-28 07:58:26 -04:00
Eric Paris 8a18f25809 Auto generation of markdown docs!
An example from the kubernetes project, for the `kubectl config`
command, which as subcommands, and flags, and all sorts of stuff, it
will generate markdown like so:

config modifies .kubeconfig files

config modifies .kubeconfig files using subcommands like "kubectl config set current-context my-context"

```
kubectl config SUBCOMMAND
```

```
      --envvar=false: use the .kubeconfig from $KUBECONFIG
      --global=false: use the .kubeconfig from /home/username
  -h, --help=false: help for config
      --kubeconfig="": use a particular .kubeconfig file
      --local=false: use the .kubeconfig in the current directory
```

```
      --alsologtostderr=false: log to standard error as well as files
      --api-version="": The API version to use when talking to the server
  -a, --auth-path="": Path to the auth info file. If missing, prompt the user. Only used if using https.
      --certificate-authority="": Path to a cert. file for the certificate authority.
      --client-certificate="": Path to a client key file for TLS.
      --client-key="": Path to a client key file for TLS.
      --cluster="": The name of the kubeconfig cluster to use
      --context="": The name of the kubeconfig context to use
      --insecure-skip-tls-verify=false: If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure.
      --log_backtrace_at=:0: when logging hits line file:N, emit a stack trace
      --log_dir=: If non-empty, write log files in this directory
      --log_flush_frequency=5s: Maximum number of seconds between log flushes
      --logtostderr=true: log to standard error instead of files
      --match-server-version=false: Require server version to match client version
      --namespace="": If present, the namespace scope for this CLI request.
      --password="": Password for basic authentication to the API server.
  -s, --server="": The address and port of the Kubernetes API server
      --stderrthreshold=2: logs at or above this threshold go to stderr
      --token="": Bearer token for authentication to the API server.
      --user="": The name of the kubeconfig user to use
      --username="": Username for basic authentication to the API server.
      --v=0: log level for V logs
      --validate=false: If true, use a schema to validate the input before sending it
      --vmodule=: comma-separated list of pattern=N settings for file-filtered logging
```

* [kubectl](kubectl.md)	 - kubectl controls the Kubernetes cluster manager
* [kubectl config set](kubectl_config_set.md)	 - Sets an individual value in a .kubeconfig file
* [kubectl config set-cluster](kubectl_config_set-cluster.md)	 - Sets a cluster entry in .kubeconfig
* [kubectl config set-context](kubectl_config_set-context.md)	 - Sets a context entry in .kubeconfig
* [kubectl config set-credentials](kubectl_config_set-credentials.md)	 - Sets a user entry in .kubeconfig
* [kubectl config unset](kubectl_config_unset.md)	 - Unsets an individual value in a .kubeconfig file
* [kubectl config use-context](kubectl_config_use-context.md)	 - Sets the current-context in a .kubeconfig file
* [kubectl config view](kubectl_config_view.md)	 - displays merged .kubeconfig settings or a specified .kubeconfig file.
2015-04-12 14:40:34 -04:00
Eric Paris b78326bb16 Merge pull request #88 from eparis/subhelptest
Add tests about additional help topics
2015-04-07 18:26:15 -05:00
Eric Paris 86a16864ea Add tests about additional help topics 2015-04-07 16:17:22 -04:00
Eric Paris 9692856020 print line number in go test failures 2015-04-07 15:56:01 -04:00
Eric Paris 0ea881ce45 Merge pull request #60 from dohzya/remove-command
Add Command's RemoveCommand method
2015-04-06 15:18:42 -05:00
Eric Paris fe581720ad New tests (they don't all pass) 2015-04-06 15:42:01 -04:00
Adam Mckaig 2c370cd936 Fix redundant error for unknown root command 2015-04-03 01:07:34 -04:00
Jeff Lowdermilk 79bd93d369 Add test for persistent bool flag on subcommand 2015-03-23 14:42:59 -07:00
Étienne Vallette d'Osia 5b56110fb0 Add tests for RemoveCommand 2015-03-13 16:30:33 +09:00
Brendan Burns 2cb625eda3 Remove some wonky error handling, as upstream seems correct now.
Also, it's buggy for nested commands.
2015-03-12 22:37:48 -04:00
Jeff Lowdermilk 5c9146990b Explicitly support local flags overwriting persistent/inherited flags
The current (desired) behavior when a Command specifies a flag that
has the same name as a persistent/inherited flag, is that the local
definition takes precedence. This change updates the various
Flag subset functions to respect that behavior:
* LocalFlags: now returns only the set of flags and persistent flags
  attached to the Command itself.
* InheritedFlags: now returns only the set of persistent flags inherited
  from the Command's parent(s), excluding any that are overwritten by a
  local flag.
* NonInheritedFlags: changed to an alias of LocalFlags.
* AllPersistentFlags: removed as not very useful; it returned the set
  of all persistent flags attached to the Command and its parent(s).

Default UsageTemplate updated to use LocalFlags and InheritedFlags
2015-03-12 16:41:00 -07:00
Masahiro Sano a16cb24999 help displays command names instead of usage in Available Commands 2015-02-17 13:50:09 -05:00
Kartik Singhal bd75ea1d19 Updated test corresponding to #49 2015-02-11 17:17:28 -05:00
Clayton Coleman 9b6c92647a When no subcommands are registered, omit command help output
For a single root command with a Run method, the help output still
contains 'help [command]' as a subcommand (because Help is always
added). Since the only subcommand would be 'help', the help is better
off omitted.

This change allows a command to be used both as a subcommand
or a root command without having to define a custom help that elides
the help command when no subcommands are added.  Instead, the default
help command is only added when subcommands are present.
2014-11-11 23:43:27 -05:00
spf13 b1e90a7943 Making prefix matching opt in. 2014-10-07 16:15:19 -04:00
spf13 c2c23ac0bd adding support for prefix matching against aliases & names 2014-10-07 15:41:19 -04:00
Sam Ghods 881657297e Replace prefix matching with aliases 2014-10-07 15:22:14 -04:00
spf13 10a8494a87 Support for flags before commands 2014-06-17 12:32:27 -04:00
spf13 07be8145cc Adding support for --help 2014-06-17 12:28:42 -04:00
spf13 3e874b31b7 Test confirming fixed #11 2014-06-13 20:45:55 -04:00
spf13 71bb1dfdcd Cobra behavior is now more consistent. Invalid flags cause Usage to be printed. 2014-06-13 20:00:56 -04:00
tummychow 667c348dbd Test behavior for subcommand with same name as root command
If, for some reason, you have an application with some name "foo", and your
app has a subcommand "foo", cobra should behave properly when you call
"foo foo", and it should also behave if you call "foo f".

These changes verify both of these cases and ensure cobra responds properly.
2014-03-26 16:19:34 -04:00
tummychow 4c29b190e0 Add basic test for prefix matching 2014-03-26 05:12:48 -04:00
tummychow 96d543cf2c Reset root command lists in testing
This fixes some issues that appear when testing prefix invocations. Since the
root command lists weren't being cleared, the list would persist between
tests, so there would be multiple instances of each command. Then, if you
tried to match a prefix of one of those commands, you'd get two matches (one
for each instance) and the command would fail.

Resetting the root command lists prevents them from persisting between tests,
resolving this issue.
2014-03-26 05:12:48 -04:00
spf13 2f19d3c266 Added test for (fixed) bug in upstream library pflag 2013-11-05 19:50:47 -05:00
spf13 79bdde5f6c Refactored code to eliminate need for a commander. Much simpler interface now. 2013-11-01 18:36:24 -04:00
spf13 a2845e7f7a fixed spf13/cobra#1 spf13/hugo#88 2013-09-30 21:54:46 -04:00
spf13 6b3d2f2e9a Shorter message when invalid flags provided 2013-09-29 02:01:56 -04:00
spf13 0556e5fbf9 Moving cobra_test into package cobra for easier testing 2013-09-24 17:04:00 -04:00
spf13 fb2146e9e5 Add support for help command 2013-09-24 16:03:22 -04:00
spf13 68f3c66d07 Proper handling of flag error messages. Fixing test that wasn't passing. 2013-09-24 13:15:30 -04:00
spf13 57fc2cb534 Support and test for custom output. 2013-09-24 12:12:32 -04:00
spf13 8858462331 Add decent usage message 2013-09-12 10:37:35 -04:00