Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve site formatting #2183

Merged
merged 3 commits into from
Oct 12, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 24 additions & 13 deletions site/content/active_help.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,21 @@

Active Help is a framework provided by Cobra which allows a program to define messages (hints, warnings, etc) that will be printed during program usage. It aims to make it easier for your users to learn how to use your program. If configured by the program, Active Help is printed when the user triggers shell completion.

For example,
```
bash-5.1$ helm repo add [tab]
For example,

```console
$ helm repo add [tab]
You must choose a name for the repo you are adding.

bash-5.1$ bin/helm package [tab]
$ bin/helm package [tab]
Please specify the path to the chart to package

bash-5.1$ bin/helm package [tab][tab]
$ bin/helm package [tab][tab]
bin/ internal/ scripts/ pkg/ testdata/
```

**Hint**: A good place to use Active Help messages is when the normal completion system does not provide any suggestions. In such cases, Active Help nicely supplements the normal shell completions to guide the user in knowing what is expected by the program.

## Supported shells

Active Help is currently only supported for the following shells:
Expand Down Expand Up @@ -52,22 +54,26 @@ cmd := &cobra.Command{
},
}
```

The example above defines the completions (none, in this specific example) as well as the Active Help messages for the `helm repo add` command. It yields the following behavior:
```
bash-5.1$ helm repo add [tab]

```console
$ helm repo add [tab]
You must choose a name for the repo you are adding

bash-5.1$ helm repo add grafana [tab]
$ helm repo add grafana [tab]
You must specify the URL for the repo you are adding

bash-5.1$ helm repo add grafana https://grafana.github.io/helm-charts [tab]
$ helm repo add grafana https://grafana.github.io/helm-charts [tab]
This command does not take any more arguments
```

**Hint**: As can be seen in the above example, a good place to use Active Help messages is when the normal completion system does not provide any suggestions. In such cases, Active Help nicely supplements the normal shell completions.

### Active Help for flags

Providing Active Help for flags is done in the same fashion as for nouns, but using the completion function registered for the flag. For example:

```go
_ = cmd.RegisterFlagCompletionFunc("version", func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
if len(args) != 2 {
Expand All @@ -77,11 +83,12 @@ _ = cmd.RegisterFlagCompletionFunc("version", func(cmd *cobra.Command, args []st
})
```
The example above prints an Active Help message when not enough information was given by the user to complete the `--version` flag.
```
bash-5.1$ bin/helm install myrelease --version 2.0.[tab]

```console
$ bin/helm install myrelease --version 2.0.[tab]
You must first specify the chart to install before the --version flag can be completed

bash-5.1$ bin/helm install myrelease bitnami/solr --version 2.0.[tab][tab]
$ bin/helm install myrelease bitnami/solr --version 2.0.[tab][tab]
2.0.1 2.0.2 2.0.3
```

Expand All @@ -103,6 +110,7 @@ Active Help configuration using the `cobra.GetActiveHelpConfig(cmd)` function an
should or should not be added (instead of reading the environment variable directly).

For example:

```go
ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
activeHelpLevel := cobra.GetActiveHelpConfig(cmd)
Expand All @@ -124,11 +132,13 @@ ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([
return comps, cobra.ShellCompDirectiveNoFileComp
},
```

**Note 1**: If the `<PROGRAM>_ACTIVE_HELP` environment variable is set to the string "0", Cobra will automatically disable all Active Help output (even if some output was specified by the program using the `cobra.AppendActiveHelp(...)` function). Using "0" can simplify your code in situations where you want to blindly disable Active Help without having to call `cobra.GetActiveHelpConfig(cmd)` explicitly.

**Note 2**: If a user wants to disable Active Help for every single program based on Cobra, she can set the environment variable `COBRA_ACTIVE_HELP` to "0". In this case `cobra.GetActiveHelpConfig(cmd)` will return "0" no matter what the variable `<PROGRAM>_ACTIVE_HELP` is set to.

**Note 3**: If the user does not set `<PROGRAM>_ACTIVE_HELP` or `COBRA_ACTIVE_HELP` (which will be a common case), the default value for the Active Help configuration returned by `cobra.GetActiveHelpConfig(cmd)` will be the empty string.

## Active Help with Cobra's default completion command

Cobra provides a default `completion` command for programs that wish to use it.
Expand All @@ -141,7 +151,8 @@ details for your users.
Debugging your Active Help code is done in the same way as debugging your dynamic completion code, which is with Cobra's hidden `__complete` command. Please refer to [debugging shell completion](shell_completions.md#debugging) for details.

When debugging with the `__complete` command, if you want to specify different Active Help configurations, you should use the active help environment variable. That variable is named `<PROGRAM>_ACTIVE_HELP` where any non-ASCII-alphanumeric characters are replaced by an `_`. For example, we can test deactivating some Active Help as shown below:
```

```console
$ HELM_ACTIVE_HELP=1 bin/helm __complete install wordpress bitnami/h<ENTER>
bitnami/haproxy
bitnami/harbor
Expand Down
105 changes: 52 additions & 53 deletions site/content/user_guide.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,24 +3,22 @@
While you are welcome to provide your own organization, typically a Cobra-based
application will follow the following organizational structure:

```test
▾ appName/
▾ cmd/
add.go
your.go
commands.go
here.go
main.go
```console
▾ appName/
▾ cmd/
add.go
your.go
commands.go
here.go
main.go
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure if main.go is indented correctly. We can replace it with tree output which is much more clear to users and also used later below.

appName
├── cmd
│   ├── add.go
│   ├── your.go
│   ├── commands.go
│   └── here.go
└── main.go

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, feel free to change this if you prefer.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In a follow-up 😄

```

In a Cobra app, typically the main.go file is very bare. It serves one purpose: initializing Cobra.

```go
package main

import (
"{pathToYourApp}/cmd"
)
import "{pathToYourApp}/cmd"

func main() {
cmd.Execute()
Expand Down Expand Up @@ -148,9 +146,7 @@ In a Cobra app, typically the main.go file is very bare. It serves one purpose:
```go
package main

import (
"{pathToYourApp}/cmd"
)
import "{pathToYourApp}/cmd"

func main() {
cmd.Execute()
Expand Down Expand Up @@ -197,7 +193,7 @@ its own go package.
The suggested approach is for the parent command to use `AddCommand` to add its most immediate
subcommands. For example, consider the following directory structure:

```text
```console
├── cmd
│   ├── root.go
│   └── sub1
Expand Down Expand Up @@ -508,30 +504,31 @@ create' is called. Every command will automatically have the '--help' flag adde
The following output is automatically generated by Cobra. Nothing beyond the
command and flag definitions are needed.

$ cobra-cli help

Cobra is a CLI library for Go that empowers applications.
This application is a tool to generate the needed files
to quickly create a Cobra application.
```console
$ cobra-cli help

Usage:
cobra-cli [command]
Cobra is a CLI library for Go that empowers applications.
This application is a tool to generate the needed files
to quickly create a Cobra application.

Available Commands:
add Add a command to a Cobra Application
completion Generate the autocompletion script for the specified shell
help Help about any command
init Initialize a Cobra Application
Usage:
cobra-cli [command]

Flags:
-a, --author string author name for copyright attribution (default "YOUR NAME")
--config string config file (default is $HOME/.cobra.yaml)
-h, --help help for cobra-cli
-l, --license string name of license for the project
--viper use Viper for configuration
Available Commands:
add Add a command to a Cobra Application
completion Generate the autocompletion script for the specified shell
help Help about any command
init Initialize a Cobra Application

Use "cobra-cli [command] --help" for more information about a command.
Flags:
-a, --author string author name for copyright attribution (default "YOUR NAME")
--config string config file (default is $HOME/.cobra.yaml)
-h, --help help for cobra-cli
-l, --license string name of license for the project
--viper use Viper for configuration

Use "cobra-cli [command] --help" for more information about a command.
```

Help is just a command like any other. There is no special logic or behavior
around it. In fact, you can provide your own if you want.
Expand Down Expand Up @@ -566,25 +563,27 @@ showing the user the 'usage'.
You may recognize this from the help above. That's because the default help
embeds the usage as part of its output.

$ cobra-cli --invalid
Error: unknown flag: --invalid
Usage:
cobra-cli [command]
```console
$ cobra-cli --invalid
Error: unknown flag: --invalid
Usage:
cobra-cli [command]

Available Commands:
add Add a command to a Cobra Application
completion Generate the autocompletion script for the specified shell
help Help about any command
init Initialize a Cobra Application
Available Commands:
add Add a command to a Cobra Application
completion Generate the autocompletion script for the specified shell
help Help about any command
init Initialize a Cobra Application

Flags:
-a, --author string author name for copyright attribution (default "YOUR NAME")
--config string config file (default is $HOME/.cobra.yaml)
-h, --help help for cobra-cli
-l, --license string name of license for the project
--viper use Viper for configuration
Flags:
-a, --author string author name for copyright attribution (default "YOUR NAME")
--config string config file (default is $HOME/.cobra.yaml)
-h, --help help for cobra-cli
-l, --license string name of license for the project
--viper use Viper for configuration

Use "cobra [command] --help" for more information about a command.
Use "cobra [command] --help" for more information about a command.
```

### Defining your own usage
You can provide your own usage function or template for Cobra to use.
Expand Down Expand Up @@ -701,7 +700,7 @@ Set `EnableTraverseRunHooks` global variable to `true` if you want to execute al

Cobra will print automatic suggestions when "unknown command" errors happen. This allows Cobra to behave similarly to the `git` command when a typo happens. For example:

```
```console
$ hugo srever
Error: unknown command "srever" for "hugo"

Expand All @@ -728,7 +727,7 @@ command.SuggestionsMinimumDistance = 1
You can also explicitly set names for which a given command will be suggested using the `SuggestFor` attribute. This allows suggestions for strings that are not close in terms of string distance, but make sense in your set of commands but for which
you don't want aliases. Example:

```bash
```console
$ kubectl remove
Error: unknown command "remove" for "kubectl"

Expand Down Expand Up @@ -793,7 +792,7 @@ func main() {

Example run as a kubectl plugin:

```bash
```console
$ kubectl myplugin
Usage:
kubectl myplugin [command]
Expand Down
Loading