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

Improvements to CLI usability and maintainability #34502

Merged

Conversation

fabianofranz
Copy link
Contributor

@fabianofranz fabianofranz commented Oct 10, 2016

Improves kubectl from an usability perspective by

  1. Fixing how we handle terminal width in help. Some sections like the flags use the entire available width, while others like long descriptions breaks lines but don't follow a well established max width (screenshot below). This PR adds a new responsive writer that will adjust to terminal width and set 80, 100, or 120 columns as the max width, but not more than that given POSIX best practices and recommendations for better readability.
    terminal_width
  2. Adds our own normalizers for long descriptions and cmd examples which allows us better control about how things like lists, paragraphs, line breaks, etc are printed. Features markdown support. Looks like templates.LongDesc and templates.Examples instead of dedent.Dedend.
  3. Allows simple reordering and reuse of help and usage sections.
  4. Adds verify-cli-conventions.sh which intends to run tests to make sure cmd developers are using what we propose as kubectl conventions. Just a couple simple tests for now but the framework is there and it's easy to extend.
  5. Update kubectl conventions to use our own normalizers instead of dedent.Dedent.

Release note:

Improves how 'kubectl' uses the terminal size when printing help and usage.

@kubernetes/kubectl


This change is Reviewable

@adohe-zz
Copy link

@fabianofranz great job 👍

func AddAdditionalCommands(g CommandGroups, message string, cmds []*cobra.Command) CommandGroups {
group := CommandGroup{Message: message}
for _, c := range cmds {
// Don't show commands that has no short description
Copy link
Contributor

Choose a reason for hiding this comment

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

s/has/have/

@fabianofranz fabianofranz force-pushed the cli_usability_improvements branch from e90490d to ad9e8d1 Compare October 11, 2016 17:04
@janetkuo janetkuo added release-note Denotes a PR that will be considered when it comes time to generate release notes. and removed release-note-label-needed labels Oct 12, 2016
@k8s-github-robot k8s-github-robot added the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Oct 13, 2016
@fabianofranz fabianofranz force-pushed the cli_usability_improvements branch from ad9e8d1 to 8e0dfdb Compare October 13, 2016 19:03
@k8s-github-robot k8s-github-robot removed the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Oct 13, 2016
@fabianofranz fabianofranz force-pushed the cli_usability_improvements branch from 8e0dfdb to 832e644 Compare October 13, 2016 20:39
@k8s-ci-robot
Copy link
Contributor

Jenkins verification failed for commit 832e644. Full PR test history.

The magic incantation to run this job again is @k8s-bot verify test this. Please help us cut down flakes by linking to an open flake issue when you hit one in your PR.

It is intended to store non-identifying auxiliary data, especially data manipulated by tools and system extensions.
If --overwrite is true, then existing annotations can be overwritten, otherwise attempting to overwrite an annotation will result in an error.
If --resource-version is specified, then updates will use this resource version, otherwise the existing resource-version will be used.
* An annotation is a key/value pair that can hold larger (compared to a label), and possibly not human-readable, data.

Choose a reason for hiding this comment

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

why add * here?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

It's list items. Not strictly required, but if we don't use list items here we have to either give each one its own paragraph, or make it all part of a single paragraph (no line wrapping). Markdown unwraps single line breaks.

set -o pipefail

KUBE_ROOT=$(dirname "${BASH_SOURCE}")/..
source "${KUBE_ROOT}/hack/lib/init.sh"

Choose a reason for hiding this comment

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

whether we should add this check to normal verify process? like check this when commit.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Yep, it does it already. verify runs everything that satisfies hack/verify-*.sh, which includes this one.

https://github.com/fabianofranz/kubernetes/blob/001e58e83a82f881b4a753f33d08908d885aaa2e/hack/make-rules/verify.sh#L90

@fabianofranz fabianofranz force-pushed the cli_usability_improvements branch 2 times, most recently from ad9e32e to ff913f0 Compare October 14, 2016 01:02
@k8s-github-robot k8s-github-robot added the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Oct 14, 2016
@fabianofranz fabianofranz force-pushed the cli_usability_improvements branch from ff913f0 to 24784ef Compare October 14, 2016 14:13
@k8s-github-robot k8s-github-robot removed the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Oct 14, 2016
@fabianofranz
Copy link
Contributor Author

What else? I'd like to get this in when possible given rebases here are painful. :)


const linebreak = "\n"

// ASCIIRenderer is a blackfriday rendered intended for rendering markdown
Copy link
Contributor

Choose a reason for hiding this comment

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

Can you add a

var _ blackfriday.Renderer = ASCIIRenderer{}

to make it explicit that we are conforming to an external interface?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Done!

`{{$rootCmd := rootCmd .}}` +
`{{$visibleFlags := visibleFlags (flagsNotIntersected .LocalFlags .PersistentFlags)}}` +
`{{$explicitlyExposedFlags := exposed .}}` +
`{{$optionsCmdFor := optionsCmdFor .}}` +
`{{$usageLine := usageLine .}}`

mainHelpTemplate = `{{with or .Long .Short }}{{. | trim}}{{end}}{{if or .Runnable .HasSubCommands}}{{.UsageString}}{{end}}`
SectionAliases = `{{if gt .Aliases 0}}Aliases:
Copy link
Contributor

Choose a reason for hiding this comment

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

Can you add godoc to these constants?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Godoc added.

w := NewMaxWidthWriter(b, tc.maxWidth)
_, err := w.Write([]byte(tc.input))
if err != nil {
t.Errorf("%s: Unexpected error: '%s'", k, err)
Copy link
Contributor

Choose a reason for hiding this comment

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

%v for errors - otherwise you can use %q to quote by default and use err.Error() instead of err

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Good catch, fixed.

@0xmichalis
Copy link
Contributor

Added a few more comments but looks good overall.

@fabianofranz fabianofranz force-pushed the cli_usability_improvements branch from 24784ef to c5044ac Compare October 17, 2016 13:32
@fabianofranz
Copy link
Contributor Author

@Kargakis all comments addressed, thanks!

@fabianofranz fabianofranz force-pushed the cli_usability_improvements branch from c5044ac to 0fd5c8d Compare October 17, 2016 13:50
@fabianofranz
Copy link
Contributor Author

@janetkuo @adohe anything else?

@0xmichalis 0xmichalis added the lgtm "Looks good to me", indicates that a PR is ready to be merged. label Oct 17, 2016
@0xmichalis
Copy link
Contributor

Tagging, additional comments can be addressed in follow-ups

@k8s-github-robot
Copy link

@k8s-bot test this [submit-queue is verifying that this PR is safe to merge]

@k8s-github-robot
Copy link

Automatic merge from submit-queue

@k8s-github-robot k8s-github-robot merged commit c19569f into kubernetes:master Oct 18, 2016
xingzhou pushed a commit to xingzhou/kubernetes that referenced this pull request Dec 15, 2016
…mprovements

Automatic merge from submit-queue

Improvements to CLI usability and maintainability

Improves `kubectl` from an usability perspective by

1. Fixing how we handle terminal width in help. Some sections like the flags use the entire available width, while others like long descriptions breaks lines but don't follow a well established max width (screenshot below). This PR adds a new responsive writer that will adjust to terminal width and set 80, 100, or 120 columns as the max width, but not more than that given POSIX best practices and recommendations for better readability.
![terminal_width](https://cloud.githubusercontent.com/assets/158611/19253184/b23a983e-8f1f-11e6-9bae-667dd5981485.png)
2. Adds our own normalizers for long descriptions and cmd examples which allows us better control about how things like lists, paragraphs, line breaks, etc are printed. Features markdown support. Looks like `templates.LongDesc` and `templates.Examples` instead of `dedent.Dedend`.
3. Allows simple reordering and reuse of help and usage sections.
3. Adds `verify-cli-conventions.sh` which intends to run tests to make sure cmd developers are using what we propose as [kubectl conventions](https://github.com/kubernetes/kubernetes/blob/master/docs/devel/kubectl-conventions.md). Just a couple simple tests for now but the framework is there and it's easy to extend.
4. Update [kubectl conventions](https://github.com/kubernetes/kubernetes/blob/master/docs/devel/kubectl-conventions.md) to use our own normalizers instead of `dedent.Dedent`.

**Release note**:
<!--  Steps to write your release note:
1. Use the release-note-* labels to set the release note state (if you have access) 
2. Enter your extended release note in the below block; leaving it blank means using the PR title as the release note. If no release note is required, just write `NONE`. 
-->
```release-note
Improves how 'kubectl' uses the terminal size when printing help and usage.
```

@kubernetes/kubectl
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
lgtm "Looks good to me", indicates that a PR is ready to be merged. release-note Denotes a PR that will be considered when it comes time to generate release notes. size/XXL Denotes a PR that changes 1000+ lines, ignoring generated files.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants