Commit 8d7aefe21f24d8aa77e19eced2ce93d806fffa92
Committed by
Henry Schreiner
1 parent
72c384cf
Added option description setter (#199)
* Added posibility to modify option description: Option::description(const std::string&). Related: https://github.com/CLIUtils/CLI11/issues/193 * Return Option* from Option::description(...). Format-fix to make clang-format happy. * Fixing format * Added posibility to modify app description: App::description(const std::string&). * Fixing Style * Update readme and changelog
Showing
5 changed files
with
55 additions
and
9 deletions
CHANGELOG.md
| ... | ... | @@ -7,7 +7,8 @@ Passing the same subcommand multiple times is better supported. Several new feat |
| 7 | 7 | * Added `parse(string)` to split up and parse a command-line style string directly. [#186] |
| 8 | 8 | * Added `ignore_underscore` and related functions, to ignore underscores when matching names. [#185] |
| 9 | 9 | * The default INI Config will now add quotes to strings with spaces [#195] |
| 10 | -* The default message now will mention the help--all flag also if present [#197] | |
| 10 | +* The default message now will mention the help-all flag also if present [#197] | |
| 11 | +* Added `->description` to set Option descriptions [#199] | |
| 11 | 12 | * Subcommands now track how many times they were parsed in a parsing process. `count()` with no arguments will return the number of times a subcommand was encountered. [#179] |
| 12 | 13 | * Parsing is now done in phases: `shortcurcuits`, `ini`, `env`, `callbacks`, and `requirements`; all subcommands complete a phase before moving on. [#179] |
| 13 | 14 | * Calling parse multiple times is now officially supported without `clear` (automatic). [#179] |
| ... | ... | @@ -26,6 +27,7 @@ Passing the same subcommand multiple times is better supported. Several new feat |
| 26 | 27 | [#192]: https://github.com/CLIUtils/CLI11/pull/192 |
| 27 | 28 | [#197]: https://github.com/CLIUtils/CLI11/pull/197 |
| 28 | 29 | [#195]: https://github.com/CLIUtils/CLI11/issues/195 |
| 30 | +[#199]: https://github.com/CLIUtils/CLI11/pull/199 | |
| 29 | 31 | |
| 30 | 32 | ## Version 1.6.2: Help-all |
| 31 | 33 | |
| ... | ... | @@ -125,7 +127,7 @@ Other changes: |
| 125 | 127 | |
| 126 | 128 | Backend and testing changes: |
| 127 | 129 | |
| 128 | -* Internally, `type_name` is now a lambda function; for sets, this reads the set live. [#116] | |
| 130 | +* Internally, `type_name` is now a lambda function; for sets, this reads the set live. [#116] | |
| 129 | 131 | * Cleaner tests without `app.reset()` (and `reset` is now `clear`). [#141] |
| 130 | 132 | * Better CMake policy handling. [#110] |
| 131 | 133 | * Includes are properly sorted. [#120] |
| ... | ... | @@ -221,7 +223,7 @@ This version adds lots of smaller fixes and additions after the refactor in vers |
| 221 | 223 | * Added `ExistingPath` validator [#73] |
| 222 | 224 | * `app.allow_ini_extras()` added to allow extras in INI files [#70] |
| 223 | 225 | * Multiline INI comments now supported |
| 224 | -* Descriptions can now be written with `config_to_str` [#66] | |
| 226 | +* Descriptions can now be written with `config_to_str` [#66] | |
| 225 | 227 | * Double printing of error message fixed [#77] |
| 226 | 228 | * Renamed `requires` to `needs` to avoid C++20 keyword [#75], [#82] |
| 227 | 229 | * MakeSingleHeader now works if outside of git [#78] |
| ... | ... | @@ -260,7 +262,7 @@ favorite CLI programs. Error messages and help messages are better and more flex |
| 260 | 262 | * Footers can be added to help [#42](https://github.com/CLIUtils/CLI11/pull/42) |
| 261 | 263 | * Help flags are easier to customize [#43](https://github.com/CLIUtils/CLI11/pull/43) |
| 262 | 264 | * Subcommand now support groups [#46](https://github.com/CLIUtils/CLI11/pull/46) |
| 263 | -* `CLI::RuntimeError` added, for easy exit with error codes [#45](https://github.com/CLIUtils/CLI11/pull/45) | |
| 265 | +* `CLI::RuntimeError` added, for easy exit with error codes [#45](https://github.com/CLIUtils/CLI11/pull/45) | |
| 264 | 266 | * The clang-format script is now no longer "hidden" [#48](https://github.com/CLIUtils/CLI11/pull/48) |
| 265 | 267 | * The order is now preserved for subcommands (list and callbacks) [#49](https://github.com/CLIUtils/CLI11/pull/49) |
| 266 | 268 | * Tests now run individually, utilizing CMake 3.10 additions if possible [#50](https://github.com/CLIUtils/CLI11/pull/50) |
| ... | ... | @@ -277,7 +279,7 @@ favorite CLI programs. Error messages and help messages are better and more flex |
| 277 | 279 | * Allow options to be disabled from INI file, rename `add_config` to `set_config` [#60](https://github.com/CLIUtils/CLI11/pull/60) |
| 278 | 280 | |
| 279 | 281 | > ### Converting from CLI11 1.2: |
| 280 | -> | |
| 282 | +> | |
| 281 | 283 | > * `app.parse` no longer returns a vector. Instead, use `app.remaining(true)`. |
| 282 | 284 | > * `"hidden"` is no longer a special group name, instead use `""` |
| 283 | 285 | > * Validators API has changed to return an error string; use `.empty()` to get the old bool back |
| ... | ... | @@ -302,8 +304,8 @@ This release focuses on making CLI11 behave properly in corner cases, and with c |
| 302 | 304 | This release incorporates feedback from the release announcement. The examples are slowly being expanded, some corner cases improved, and some new functionality for tricky parsing situations. |
| 303 | 305 | |
| 304 | 306 | * Added simple support for enumerations, allow non-printable objects [#12](https://github.com/CLIUtils/CLI11/issues/12) |
| 305 | -* Added `app.parse_order()` with original parse order ([#13](https://github.com/CLIUtils/CLI11/issues/13), [#16](https://github.com/CLIUtils/CLI11/pull/16)) | |
| 306 | -* Added `prefix_command()`, which is like `allow_extras` but instantly stops and returns. ([#8](https://github.com/CLIUtils/CLI11/issues/8), [#17](https://github.com/CLIUtils/CLI11/pull/17)) | |
| 307 | +* Added `app.parse_order()` with original parse order ([#13](https://github.com/CLIUtils/CLI11/issues/13), [#16](https://github.com/CLIUtils/CLI11/pull/16)) | |
| 308 | +* Added `prefix_command()`, which is like `allow_extras` but instantly stops and returns. ([#8](https://github.com/CLIUtils/CLI11/issues/8), [#17](https://github.com/CLIUtils/CLI11/pull/17)) | |
| 307 | 309 | * Removed Windows warning ([#10](https://github.com/CLIUtils/CLI11/issues/10), [#20](https://github.com/CLIUtils/CLI11/pull/20)) |
| 308 | 310 | * Some improvements to CMake, detect Python and no dependencies on Python 2 (like Python 3) ([#18](https://github.com/CLIUtils/CLI11/issues/18), [#21](https://github.com/CLIUtils/CLI11/pull/21)) |
| 309 | 311 | ... | ... |
README.md
| ... | ... | @@ -232,6 +232,7 @@ Before parsing, you can set the following options: |
| 232 | 232 | - `->group(name)`: The help group to put the option in. No effect for positional options. Defaults to `"Options"`. `""` will not show up in the help print (hidden). |
| 233 | 233 | - `->ignore_case()`: Ignore the case on the command line (also works on subcommands, does not affect arguments). |
| 234 | 234 | - `->ignore_underscore()`: Ignore any underscores in the options names (also works on subcommands, does not affect arguments). For example "option_one" will match with optionone. This does not apply to short form options since they only have one character |
| 235 | +- `.description(str)`: Set/change the description. | |
| 235 | 236 | - `->multi_option_policy(CLI::MultiOptionPolicy::Throw)`: Set the multi-option policy. Shortcuts available: `->take_last()`, `->take_first()`, and `->join()`. This will only affect options expecting 1 argument or bool flags (which always default to take last). |
| 236 | 237 | - `->check(CLI::ExistingFile)`: Requires that the file exists if given. |
| 237 | 238 | - `->check(CLI::ExistingDirectory)`: Requires that the directory exists. |
| ... | ... | @@ -306,6 +307,7 @@ There are several options that are supported on the main app and subcommands. Th |
| 306 | 307 | - `.get_options(filter)`: Get the list of all defined option pointers (useful for processing the app for custom output formats). |
| 307 | 308 | - `.parse_order()`: Get the list of option pointers in the order they were parsed (including duplicates). |
| 308 | 309 | - `.formatter(fmt)`: Set a formatter, with signature `std::string(const App*, std::string, AppFormatMode)`. See Formatting for more details. |
| 310 | +- `.description(str)`: Set/change the description. | |
| 309 | 311 | - `.get_description()`: Access the description. |
| 310 | 312 | - `.parsed()`: True if this subcommand was given on the command line. |
| 311 | 313 | - `.name(name)`: Add or change the name. |
| ... | ... | @@ -478,8 +480,9 @@ Significant features and/or improvements to the code were contributed by: |
| 478 | 480 | - [Paweł Bylica](https://github.com/chfast) |
| 479 | 481 | - [Philip Top](https://github.com/phlptp) |
| 480 | 482 | - [almikhayl](https://github.com/almikhayl) |
| 481 | -- [nurelin](https://github.com/nurelin) | |
| 482 | -- [ncihneg](https://github.com/ncihneg) | |
| 483 | +- [nurelin](https://github.com/nurelin) <!-- help_all in message --> | |
| 484 | +- [ncihneg](https://github.com/ncihneg) <!-- Quoting strings in INI generation --> | |
| 485 | +- [Fred Helmesjö](https://github.com/helmesjo) <!-- `->description()` --> | |
| 483 | 486 | |
| 484 | 487 | |
| 485 | 488 | ## License | ... | ... |
include/CLI/App.hpp
| ... | ... | @@ -1374,6 +1374,12 @@ class App { |
| 1374 | 1374 | /// Get the app or subcommand description |
| 1375 | 1375 | std::string get_description() const { return description_; } |
| 1376 | 1376 | |
| 1377 | + /// Set the description | |
| 1378 | + App *description(const std::string &description) { | |
| 1379 | + description_ = description; | |
| 1380 | + return this; | |
| 1381 | + } | |
| 1382 | + | |
| 1377 | 1383 | /// Get the list of options (user facing function, so returns raw pointers), has optional filter function |
| 1378 | 1384 | std::vector<const Option *> get_options(const std::function<bool(const Option *)> filter = {}) const { |
| 1379 | 1385 | std::vector<const Option *> options(options_.size()); | ... | ... |
include/CLI/Option.hpp
| ... | ... | @@ -517,6 +517,12 @@ class Option : public OptionBase<Option> { |
| 517 | 517 | /// Get the description |
| 518 | 518 | const std::string &get_description() const { return description_; } |
| 519 | 519 | |
| 520 | + /// Set the description | |
| 521 | + Option *description(const std::string &description) { | |
| 522 | + description_ = description; | |
| 523 | + return this; | |
| 524 | + } | |
| 525 | + | |
| 520 | 526 | ///@} |
| 521 | 527 | /// @name Help tools |
| 522 | 528 | ///@{ | ... | ... |
tests/HelpTest.cpp
| ... | ... | @@ -645,6 +645,35 @@ TEST(THelp, AccessDescription) { |
| 645 | 645 | EXPECT_EQ(app.get_description(), "My description goes here"); |
| 646 | 646 | } |
| 647 | 647 | |
| 648 | +TEST(THelp, SetDescriptionAfterCreation) { | |
| 649 | + CLI::App app{""}; | |
| 650 | + | |
| 651 | + app.description("My description goes here"); | |
| 652 | + | |
| 653 | + EXPECT_EQ(app.get_description(), "My description goes here"); | |
| 654 | + EXPECT_THAT(app.help(), HasSubstr("My description goes here")); | |
| 655 | +} | |
| 656 | + | |
| 657 | +TEST(THelp, AccessOptionDescription) { | |
| 658 | + CLI::App app{}; | |
| 659 | + | |
| 660 | + int x; | |
| 661 | + auto opt = app.add_option("-a,--alpha", x, "My description goes here"); | |
| 662 | + | |
| 663 | + EXPECT_EQ(opt->get_description(), "My description goes here"); | |
| 664 | +} | |
| 665 | + | |
| 666 | +TEST(THelp, SetOptionDescriptionAfterCreation) { | |
| 667 | + CLI::App app{}; | |
| 668 | + | |
| 669 | + int x; | |
| 670 | + auto opt = app.add_option("-a,--alpha", x); | |
| 671 | + opt->description("My description goes here"); | |
| 672 | + | |
| 673 | + EXPECT_EQ(opt->get_description(), "My description goes here"); | |
| 674 | + EXPECT_THAT(app.help(), HasSubstr("My description goes here")); | |
| 675 | +} | |
| 676 | + | |
| 648 | 677 | TEST(THelp, CleanNeeds) { |
| 649 | 678 | CLI::App app; |
| 650 | 679 | ... | ... |