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 +7,8 @@ Passing the same subcommand multiple times is better supported. Several new feat
7 * Added `parse(string)` to split up and parse a command-line style string directly. [#186] 7 * Added `parse(string)` to split up and parse a command-line style string directly. [#186]
8 * Added `ignore_underscore` and related functions, to ignore underscores when matching names. [#185] 8 * Added `ignore_underscore` and related functions, to ignore underscores when matching names. [#185]
9 * The default INI Config will now add quotes to strings with spaces [#195] 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 * 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 * 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 * Parsing is now done in phases: `shortcurcuits`, `ini`, `env`, `callbacks`, and `requirements`; all subcommands complete a phase before moving on. [#179] 13 * Parsing is now done in phases: `shortcurcuits`, `ini`, `env`, `callbacks`, and `requirements`; all subcommands complete a phase before moving on. [#179]
13 * Calling parse multiple times is now officially supported without `clear` (automatic). [#179] 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,6 +27,7 @@ Passing the same subcommand multiple times is better supported. Several new feat
26 [#192]: https://github.com/CLIUtils/CLI11/pull/192 27 [#192]: https://github.com/CLIUtils/CLI11/pull/192
27 [#197]: https://github.com/CLIUtils/CLI11/pull/197 28 [#197]: https://github.com/CLIUtils/CLI11/pull/197
28 [#195]: https://github.com/CLIUtils/CLI11/issues/195 29 [#195]: https://github.com/CLIUtils/CLI11/issues/195
  30 +[#199]: https://github.com/CLIUtils/CLI11/pull/199
29 31
30 ## Version 1.6.2: Help-all 32 ## Version 1.6.2: Help-all
31 33
@@ -125,7 +127,7 @@ Other changes: @@ -125,7 +127,7 @@ Other changes:
125 127
126 Backend and testing changes: 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 * Cleaner tests without `app.reset()` (and `reset` is now `clear`). [#141] 131 * Cleaner tests without `app.reset()` (and `reset` is now `clear`). [#141]
130 * Better CMake policy handling. [#110] 132 * Better CMake policy handling. [#110]
131 * Includes are properly sorted. [#120] 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,7 +223,7 @@ This version adds lots of smaller fixes and additions after the refactor in vers
221 * Added `ExistingPath` validator [#73] 223 * Added `ExistingPath` validator [#73]
222 * `app.allow_ini_extras()` added to allow extras in INI files [#70] 224 * `app.allow_ini_extras()` added to allow extras in INI files [#70]
223 * Multiline INI comments now supported 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 * Double printing of error message fixed [#77] 227 * Double printing of error message fixed [#77]
226 * Renamed `requires` to `needs` to avoid C++20 keyword [#75], [#82] 228 * Renamed `requires` to `needs` to avoid C++20 keyword [#75], [#82]
227 * MakeSingleHeader now works if outside of git [#78] 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,7 +262,7 @@ favorite CLI programs. Error messages and help messages are better and more flex
260 * Footers can be added to help [#42](https://github.com/CLIUtils/CLI11/pull/42) 262 * Footers can be added to help [#42](https://github.com/CLIUtils/CLI11/pull/42)
261 * Help flags are easier to customize [#43](https://github.com/CLIUtils/CLI11/pull/43) 263 * Help flags are easier to customize [#43](https://github.com/CLIUtils/CLI11/pull/43)
262 * Subcommand now support groups [#46](https://github.com/CLIUtils/CLI11/pull/46) 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 * The clang-format script is now no longer "hidden" [#48](https://github.com/CLIUtils/CLI11/pull/48) 266 * The clang-format script is now no longer "hidden" [#48](https://github.com/CLIUtils/CLI11/pull/48)
265 * The order is now preserved for subcommands (list and callbacks) [#49](https://github.com/CLIUtils/CLI11/pull/49) 267 * The order is now preserved for subcommands (list and callbacks) [#49](https://github.com/CLIUtils/CLI11/pull/49)
266 * Tests now run individually, utilizing CMake 3.10 additions if possible [#50](https://github.com/CLIUtils/CLI11/pull/50) 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,7 +279,7 @@ favorite CLI programs. Error messages and help messages are better and more flex
277 * Allow options to be disabled from INI file, rename `add_config` to `set_config` [#60](https://github.com/CLIUtils/CLI11/pull/60) 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 > ### Converting from CLI11 1.2: 281 > ### Converting from CLI11 1.2:
280 -> 282 +>
281 > * `app.parse` no longer returns a vector. Instead, use `app.remaining(true)`. 283 > * `app.parse` no longer returns a vector. Instead, use `app.remaining(true)`.
282 > * `"hidden"` is no longer a special group name, instead use `""` 284 > * `"hidden"` is no longer a special group name, instead use `""`
283 > * Validators API has changed to return an error string; use `.empty()` to get the old bool back 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,8 +304,8 @@ This release focuses on making CLI11 behave properly in corner cases, and with c
302 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. 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 * Added simple support for enumerations, allow non-printable objects [#12](https://github.com/CLIUtils/CLI11/issues/12) 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 * Removed Windows warning ([#10](https://github.com/CLIUtils/CLI11/issues/10), [#20](https://github.com/CLIUtils/CLI11/pull/20)) 309 * Removed Windows warning ([#10](https://github.com/CLIUtils/CLI11/issues/10), [#20](https://github.com/CLIUtils/CLI11/pull/20))
308 * 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)) 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,6 +232,7 @@ Before parsing, you can set the following options:
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). 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 - `->ignore_case()`: Ignore the case on the command line (also works on subcommands, does not affect arguments). 233 - `->ignore_case()`: Ignore the case on the command line (also works on subcommands, does not affect arguments).
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 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 - `->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 - `->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 - `->check(CLI::ExistingFile)`: Requires that the file exists if given. 237 - `->check(CLI::ExistingFile)`: Requires that the file exists if given.
237 - `->check(CLI::ExistingDirectory)`: Requires that the directory exists. 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,6 +307,7 @@ There are several options that are supported on the main app and subcommands. Th
306 - `.get_options(filter)`: Get the list of all defined option pointers (useful for processing the app for custom output formats). 307 - `.get_options(filter)`: Get the list of all defined option pointers (useful for processing the app for custom output formats).
307 - `.parse_order()`: Get the list of option pointers in the order they were parsed (including duplicates). 308 - `.parse_order()`: Get the list of option pointers in the order they were parsed (including duplicates).
308 - `.formatter(fmt)`: Set a formatter, with signature `std::string(const App*, std::string, AppFormatMode)`. See Formatting for more details. 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 - `.get_description()`: Access the description. 311 - `.get_description()`: Access the description.
310 - `.parsed()`: True if this subcommand was given on the command line. 312 - `.parsed()`: True if this subcommand was given on the command line.
311 - `.name(name)`: Add or change the name. 313 - `.name(name)`: Add or change the name.
@@ -478,8 +480,9 @@ Significant features and/or improvements to the code were contributed by: @@ -478,8 +480,9 @@ Significant features and/or improvements to the code were contributed by:
478 - [Paweł Bylica](https://github.com/chfast) 480 - [Paweł Bylica](https://github.com/chfast)
479 - [Philip Top](https://github.com/phlptp) 481 - [Philip Top](https://github.com/phlptp)
480 - [almikhayl](https://github.com/almikhayl) 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 ## License 488 ## License
include/CLI/App.hpp
@@ -1374,6 +1374,12 @@ class App { @@ -1374,6 +1374,12 @@ class App {
1374 /// Get the app or subcommand description 1374 /// Get the app or subcommand description
1375 std::string get_description() const { return description_; } 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 /// Get the list of options (user facing function, so returns raw pointers), has optional filter function 1383 /// Get the list of options (user facing function, so returns raw pointers), has optional filter function
1378 std::vector<const Option *> get_options(const std::function<bool(const Option *)> filter = {}) const { 1384 std::vector<const Option *> get_options(const std::function<bool(const Option *)> filter = {}) const {
1379 std::vector<const Option *> options(options_.size()); 1385 std::vector<const Option *> options(options_.size());
include/CLI/Option.hpp
@@ -517,6 +517,12 @@ class Option : public OptionBase&lt;Option&gt; { @@ -517,6 +517,12 @@ class Option : public OptionBase&lt;Option&gt; {
517 /// Get the description 517 /// Get the description
518 const std::string &get_description() const { return description_; } 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 /// @name Help tools 527 /// @name Help tools
522 ///@{ 528 ///@{
tests/HelpTest.cpp
@@ -645,6 +645,35 @@ TEST(THelp, AccessDescription) { @@ -645,6 +645,35 @@ TEST(THelp, AccessDescription) {
645 EXPECT_EQ(app.get_description(), "My description goes here"); 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 TEST(THelp, CleanNeeds) { 677 TEST(THelp, CleanNeeds) {
649 CLI::App app; 678 CLI::App app;
650 679