add . as valid char in option names (#358)

This commit is contained in:
Ryan Leary 2022-09-28 17:11:32 -04:00 committed by GitHub
parent 2123115f71
commit 2e3c6991d3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 9 additions and 5 deletions

View File

@ -678,7 +678,8 @@ inline OptionNames split_option_names(const std::string &text)
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz" "abcdefghijklmnopqrstuvwxyz"
"0123456789" "0123456789"
"_-"; "_-.?";
if (!std::isalnum(text[token_start_pos], std::locale::classic()) || if (!std::isalnum(text[token_start_pos], std::locale::classic()) ||
text.find_first_not_of(option_name_valid_chars, token_start_pos) < next_delimiter_pos) { text.find_first_not_of(option_name_valid_chars, token_start_pos) < next_delimiter_pos) {
throw_or_mimic<exceptions::invalid_option_format>(text); throw_or_mimic<exceptions::invalid_option_format>(text);
@ -752,9 +753,9 @@ std::basic_regex<char> falsy_pattern
("(f|F)(alse)?|0"); ("(f|F)(alse)?|0");
std::basic_regex<char> option_matcher std::basic_regex<char> option_matcher
("--([[:alnum:]][-_[:alnum:]]+)(=(.*))?|-([[:alnum:]].*)"); ("--([[:alnum:]][-_[:alnum:]\\.]+)(=(.*))?|-([[:alnum:]].*)");
std::basic_regex<char> option_specifier std::basic_regex<char> option_specifier
("([[:alnum:]][-_[:alnum:]]*)(,[ ]*[[:alnum:]][-_[:alnum:]]*)*"); ("([[:alnum:]][-_[:alnum:]\\.]*)(,[ ]*[[:alnum:]][-_[:alnum:]]*)*");
std::basic_regex<char> option_specifier_separator(", *"); std::basic_regex<char> option_specifier_separator(", *");
} // namespace } // namespace

View File

@ -56,6 +56,7 @@ TEST_CASE("Basic options", "[options]")
("a,av", "a short option with a value", cxxopts::value<std::string>()) ("a,av", "a short option with a value", cxxopts::value<std::string>())
("6,six", "a short number option") ("6,six", "a short number option")
("p, space", "an option with space between short and long") ("p, space", "an option with space between short and long")
("period.delimited", "an option with a period in the long name")
("nothing", "won't exist", cxxopts::value<std::string>()) ("nothing", "won't exist", cxxopts::value<std::string>())
; ;
@ -77,7 +78,8 @@ TEST_CASE("Basic options", "[options]")
"-z", "-z",
"--over", "--over",
"--dog", "--dog",
"--lazy" "--lazy",
"--period.delimited",
}); });
auto** actual_argv = argv.argv(); auto** actual_argv = argv.argv();
@ -97,9 +99,10 @@ TEST_CASE("Basic options", "[options]")
CHECK(result.count("quick") == 2); CHECK(result.count("quick") == 2);
CHECK(result.count("f") == 2); CHECK(result.count("f") == 2);
CHECK(result.count("z") == 4); CHECK(result.count("z") == 4);
CHECK(result.count("period.delimited") == 1);
auto& arguments = result.arguments(); auto& arguments = result.arguments();
REQUIRE(arguments.size() == 15); REQUIRE(arguments.size() == 16);
CHECK(arguments[0].key() == "long"); CHECK(arguments[0].key() == "long");
CHECK(arguments[0].value() == "true"); CHECK(arguments[0].value() == "true");
CHECK(arguments[0].as<bool>() == true); CHECK(arguments[0].as<bool>() == true);