Commit 8d7aefe21f24d8aa77e19eced2ce93d806fffa92

Authored by Fred Helmesjö
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
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&lt;Option&gt; {
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  
... ...