Commit b59a16ccf23ebbbdfe752e9ba75e3973049da855
1 parent
e63898df
Adding hidden options
Showing
4 changed files
with
32 additions
and
2 deletions
CHANGELOG.md
| 1 | 1 | ## Version 0.5 (in progress) |
| 2 | 2 | |
| 3 | +* Allow `Hidden` options. | |
| 3 | 4 | * Throw `OptionAlreadyAdded` errors for matching subcommands or options, with ignore-case included, tests |
| 4 | 5 | * `->ignore_case()` added to subcommands, options, and `add_set_ignore_case`. Subcommands inherit setting from parent App on creation. |
| 5 | 6 | * Subcommands now can be "chained", that is, left over arguments can now include subcommands that then get parsed. Subcommands are now a list (`get_subcommands`). Added `got_subcommand(App_or_name)` to check for subcommands. | ... | ... |
README.md
| ... | ... | @@ -128,7 +128,7 @@ The add commands return a pointer to an internally stored `Option`. If you set t |
| 128 | 128 | * `->requires(opt)`: This option requires another option to also be present, opt is an `Option` pointer. |
| 129 | 129 | * `->excludes(opt)`: This option cannot be given with `opt` present, opt is an `Option` pointer. |
| 130 | 130 | * `->envname(name)`: Gets the value from the environment if present and not passed on the command line. |
| 131 | -* `->group(name)`: The help group to put the option in. No effect for positional options. Defaults to `"Options"`. | |
| 131 | +* `->group(name)`: The help group to put the option in. No effect for positional options. Defaults to `"Options"`. `"Hidden"` will not show up in the help print. | |
| 132 | 132 | * `->ignore_case()`: Ignore the case on the command line (also works on subcommands, does not affect arguments). |
| 133 | 133 | * `->check(CLI::ExistingFile)`: Requires that the file exists if given. |
| 134 | 134 | * `->check(CLI::ExistingDirectory)`: Requires that the directory exists. | ... | ... |
include/CLI/App.hpp
| ... | ... | @@ -467,6 +467,9 @@ public: |
| 467 | 467 | bool pos=false; |
| 468 | 468 | for(const Option_p &opt : options) |
| 469 | 469 | if(opt->get_positional()) { |
| 470 | + // A hidden positional should still show up in the usage statement | |
| 471 | + //if(detail::to_lower(opt->get_group()) == "hidden") | |
| 472 | + // continue; | |
| 470 | 473 | out << " " << opt->help_positional(); |
| 471 | 474 | if(opt->has_description()) |
| 472 | 475 | pos=true; |
| ... | ... | @@ -484,9 +487,12 @@ public: |
| 484 | 487 | // Positional descriptions |
| 485 | 488 | if(pos) { |
| 486 | 489 | out << "Positionals:" << std::endl; |
| 487 | - for(const Option_p &opt : options) | |
| 490 | + for(const Option_p &opt : options) { | |
| 491 | + if(detail::to_lower(opt->get_group()) == "hidden") | |
| 492 | + continue; | |
| 488 | 493 | if(opt->get_positional() && opt->has_description()) |
| 489 | 494 | detail::format_help(out, opt->help_pname(), opt->get_description(), wid); |
| 495 | + } | |
| 490 | 496 | out << std::endl; |
| 491 | 497 | |
| 492 | 498 | } |
| ... | ... | @@ -495,6 +501,8 @@ public: |
| 495 | 501 | // Options |
| 496 | 502 | if(npos) { |
| 497 | 503 | for (const std::string& group : groups) { |
| 504 | + if(detail::to_lower(group) == "hidden") | |
| 505 | + continue; | |
| 498 | 506 | out << group << ":" << std::endl; |
| 499 | 507 | for(const Option_p &opt : options) { |
| 500 | 508 | if(opt->nonpositional() && opt->get_group() == group) | ... | ... |
tests/HelpTest.cpp
| ... | ... | @@ -9,6 +9,7 @@ |
| 9 | 9 | #include <fstream> |
| 10 | 10 | |
| 11 | 11 | using ::testing::HasSubstr; |
| 12 | +using ::testing::Not; | |
| 12 | 13 | |
| 13 | 14 | TEST(THelp, Basic) { |
| 14 | 15 | CLI::App app{"My prog"}; |
| ... | ... | @@ -37,8 +38,28 @@ TEST(THelp, OptionalPositional) { |
| 37 | 38 | EXPECT_THAT(help, HasSubstr("something TEXT")); |
| 38 | 39 | EXPECT_THAT(help, HasSubstr("My option here")); |
| 39 | 40 | EXPECT_THAT(help, HasSubstr("Usage: program [OPTIONS] [something]")); |
| 41 | +} | |
| 42 | + | |
| 43 | +TEST(THelp, Hidden) { | |
| 44 | + CLI::App app{"My prog"}; | |
| 45 | + | |
| 46 | + std::string x; | |
| 47 | + app.add_option("something", x, "My option here") | |
| 48 | + ->group("Hidden"); | |
| 49 | + std::string y; | |
| 50 | + app.add_option("--another", y) | |
| 51 | + ->group("Hidden"); | |
| 40 | 52 | |
| 53 | + std::string help = app.help(); | |
| 54 | + | |
| 55 | + EXPECT_THAT(help, HasSubstr("My prog")); | |
| 56 | + EXPECT_THAT(help, HasSubstr("-h,--help")); | |
| 57 | + EXPECT_THAT(help, HasSubstr("Options:")); | |
| 58 | + EXPECT_THAT(help, HasSubstr("[something]")); | |
| 59 | + EXPECT_THAT(help, Not(HasSubstr("something "))); | |
| 60 | + EXPECT_THAT(help, Not(HasSubstr("another"))); | |
| 41 | 61 | } |
| 62 | + | |
| 42 | 63 | TEST(THelp, OptionalPositionalAndOptions) { |
| 43 | 64 | CLI::App app{"My prog"}; |
| 44 | 65 | app.add_flag("-q,--quick"); | ... | ... |