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

app: support flags/aliases given as (--long, -short) tuple #319

Merged
merged 6 commits into from
Sep 26, 2016

Conversation

ankostis
Copy link
Contributor

@ankostis ankostis commented Sep 21, 2016

An example of the new flags/aliases help message:

-f, --force
    Force various sub-commands perform their duties without complaints.
    Equivalent to: [Spec.force=True]
-v, --verbose
    Make various sub-commands increase their verbosity (not to be confused with --debug):
    Equivalent to: [Spec.verbose=True]
-d, --debug
    Log more logging, fail on configuration errors, and print configuration on each cmd startup.
    Equivalent to: [Cmd.raise_config_file_errors=True Cmd.print_config=True Spec.log_level=0 Application.log_level=0]
--log-level=<Enum>
    Default: 30
    Choices: (0, 10, 20, 30, 40, 50, 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL')
    Set the log level by value or name.
    Equivalent to: [Application.log_level]

@ankostis ankostis force-pushed the short_long_flags branch 2 times, most recently from ca39361 to b58e007 Compare September 21, 2016 22:18
ankostis added a commit to ankostis/traitlets that referenced this pull request Sep 21, 2016
+ Specify both short/long flags/aliases of a once.
+ Update print-flag logic to print both flags in one place.
+ Print flag-equivalence at the end, e.g.:
  "Equivalent to: [Spec.verbose=True, Foo.bar=2]
+ Use the same format for aliases (do not clutter 1st line).
+ Renamed build-in varname `help` --> `fhelp`.
- Had to catch exceptions in print_XXX_help(), otherwise difficult to
debug miss-configurations.
+ Added TCs for short/long flags & flag equivalance.
ankostis added a commit to ankostis/traitlets that referenced this pull request Sep 21, 2016
@ankostis
Copy link
Contributor Author

Now it is ready to merge.
An example of the new flags/aliases help message:

-f, --force
    Force various sub-commands perform their duties without complaints.
    Equivalent to: [Spec.force=True]
-v, --verbose
    Make various sub-commands increase their verbosity (not to be confused with --debug):
    Equivalent to: [Spec.verbose=True]
-d, --debug
    Log more logging, fail on configuration errors, and print configuration on each cmd startup.
    Equivalent to: [Cmd.raise_config_file_errors=True Cmd.print_config=True Spec.log_level=0 Application.log_level=0]
--log-level=<Enum>
    Default: 30
    Choices: (0, 10, 20, 30, 40, 50, 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL')
    Set the log level by value or name.
    Equivalent to: [Application.log_level]

@ankostis
Copy link
Contributor Author

This PR tries to maintain compatibility with existing behavior, and adds single letter flags/alias prefixed both with single('-') and double('--') dashed.
The end result is that (-v, --verbose) gets added as (-v, --v, --verbose).

I would prefer a simplification using the standard convention where a single-letter flag/alias are added only once, with single-dash.
What do you think?

@ankostis ankostis force-pushed the short_long_flags branch 2 times, most recently from 9be8541 to 73e1250 Compare September 21, 2016 23:11
@ankostis ankostis changed the title flags: support flags given as (--long, -short) tuple app: support flags/aliaes given as (--long, -short) tuple Sep 21, 2016
@ankostis ankostis changed the title app: support flags/aliaes given as (--long, -short) tuple app: support flags/aliases given as (--long, -short) tuple Sep 21, 2016
Copy link
Member

@minrk minrk left a comment

Choose a reason for hiding this comment

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

I would prefer a simplification using the standard convention where a single-letter flag/alias are added only once, with single-dash.
What do you think?

If I were starting from scratch, I would agree, but for backward-compatibility I think it's not worth breaking things for a minuscule aesthetic improvement.

lines.extend(fhelp)
lines.append(indent("Equivalent to: [%s]" % longname))
except Exception as ex:
self.log.error('Failed collecting help-message for aias %r, due to: %s',
Copy link
Member

Choose a reason for hiding this comment

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

Why catch/log these errors. Shouldn't they be bugs that raise?

Copy link
Contributor Author

@ankostis ankostis Sep 22, 2016

Choose a reason for hiding this comment

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

While developing it, the stack-traces for such errors happened very early in the boot-strap process and it was extremely confusing for me to debug such issues (practically speaking); eventually I had to manually wrap the offending code in a try-catch every time to locate the problem; eventually, I left it there for others, as explained in the commit message.

You can try it yourself if you have some class without description trait, or badly formed flag.
Maybe we can retrofit the error behavior to help developers.

Copy link
Member

Choose a reason for hiding this comment

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

Raising a clearer error sounds great. But I still think it should be an error, not a message that allows the application to continue. If you add raise below here, it should be fine.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Then I will remove the exception-wrapper completely; the point was to be able to read the help-message and discover what config-property were missing - the log-error actually does not help either; practically it just tells you that something went wrong.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Sorry, I will leave it because by catching exceptions, the log-message knows which property failed and it DOES help; it will just raise as you said.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Now that I think of it, (-n, --n, --name) is the same as (-n, --name), because argparse already accepts --n if you specify -n.

Nope...it doesn't work! All TCs with --i fail.

Copy link
Member

@minrk minrk left a comment

Choose a reason for hiding this comment

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

Now that I think of it, (-n, --n, --name) is the same as (-n, --name), because argparse already accepts --n if you specify -n.

@@ -381,7 +404,7 @@ def print_help(self, classes=False):
self.print_options()

if classes:
help_classes = self.classes
help_classes = self._classes_in_config_sample()
Copy link
Member

Choose a reason for hiding this comment

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

Why is this not self.classes?

Copy link
Contributor Author

@ankostis ankostis Sep 22, 2016

Choose a reason for hiding this comment

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

See #289 discussion, and my example just entered in #180, specifically the comment in classes trait.
[edit] And read the docstring description of Application._classes_in_config_sample():

    Yields only classes with own traits, and their subclasses.

    Thus, produced sample config-file will contain all classes
    on which a trait-value may be overridden:

    - either on the class owning the trait,
    - or on its subclasses, even if those subclasses do not define
      any traits themselves.

The same should apply for cmd-line options.

Copy link
Member

Choose a reason for hiding this comment

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

Makes sense, thanks.

ankostis added a commit to ankostis/traitlets that referenced this pull request Sep 22, 2016
+ After @minrk codereview: ipython#319 (review)
+ minor: Remove unused builtin varname `help`.
ankostis added a commit to ankostis/traitlets that referenced this pull request Sep 22, 2016
ankostis added a commit to ankostis/traitlets that referenced this pull request Sep 22, 2016
@minrk
Copy link
Member

minrk commented Sep 25, 2016

This is adding four -- to aliases, so the output looks like:

----alias=<Unicode>

@ankostis
Copy link
Contributor Author

This is adding four -- to aliases, so the output looks like: ----alias=<Unicode>

Thanks, the TC were not that accurate; fixed both.

@minrk minrk added this to the 5.0 milestone Sep 26, 2016
@minrk minrk merged commit 1d8bb23 into ipython:master Sep 26, 2016
@ankostis
Copy link
Contributor Author

ankostis commented Oct 5, 2016

Note, this has been merged (probably on 4.3.1) bust is not mentioned in the Changelog.

@minrk
Copy link
Member

minrk commented Oct 5, 2016

This is not in 4.3.1, only unreleased master (will be 5.0).

@Carreau Carreau added 5.0-re-review Need to re-review for potential API impact changes. 5.0-major Major change in 5.0 need proper documentation and removed 5.0-re-review Need to re-review for potential API impact changes. labels Jun 4, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
5.0-major Major change in 5.0 need proper documentation
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Enhance --help-all to print all relevant configurables, along with their relations
3 participants