From 94f08d9c20e54731d16fcd39a51759a18053f3fc Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 2 May 2025 14:47:49 +0000 Subject: [PATCH] style: pre-commit.ci fixes --- README.md | 7 +++++-- book/chapters/subcommands.md | 7 +++++-- examples/close_match.cpp | 33 +++++++++++++++++---------------- 3 files changed, 27 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index f2f0ff17..3e5008af 100644 --- a/README.md +++ b/README.md @@ -914,8 +914,11 @@ option_groups. These are: is not allowed to have a single character short option starting with the same character as a single dash long form name; for example, `-s` and `-single` are not allowed in the same application. -- `.allow_subcommand_prefix_matching()`:🚧 If this modifier is enabled, unambiguious prefix portions of a subcommand will match. - For example `upgrade_package` would match on `upgrade_`, `upg`, `u` as long as no other subcommand would also match. It also disallows subcommand names that are full prefixes of another subcommand. +- `.allow_subcommand_prefix_matching()`:🚧 If this modifier is enabled, + unambiguious prefix portions of a subcommand will match. For example + `upgrade_package` would match on `upgrade_`, `upg`, `u` as long as no other + subcommand would also match. It also disallows subcommand names that are full + prefixes of another subcommand. - `.fallthrough()`: Allow extra unmatched options and positionals to "fall through" and be matched on a parent option. Subcommands by default are allowed to "fall through" as in they will first attempt to match on the current diff --git a/book/chapters/subcommands.md b/book/chapters/subcommands.md index 7499e5a0..b625ec36 100644 --- a/book/chapters/subcommands.md +++ b/book/chapters/subcommands.md @@ -159,8 +159,11 @@ calls another command called "`git-thing`" with the remaining options intact. ### prefix matching -A modifier is available for subcommand matching, `->allow_subcommand_prefix_matching()`. if this is enabled unambiguious prefix portions of a subcommand will match. -For Example `upgrade_package` would match on `upgrade_`, `upg`, `u` as long as no other subcommand would also match. It also disallows subcommand names that are full prefixes of another subcommand. +A modifier is available for subcommand matching, +`->allow_subcommand_prefix_matching()`. if this is enabled unambiguious prefix +portions of a subcommand will match. For Example `upgrade_package` would match +on `upgrade_`, `upg`, `u` as long as no other subcommand would also match. It +also disallows subcommand names that are full prefixes of another subcommand. ### Silent subcommands diff --git a/examples/close_match.cpp b/examples/close_match.cpp index 0df99498..cc36ee58 100644 --- a/examples/close_match.cpp +++ b/examples/close_match.cpp @@ -9,23 +9,25 @@ #include #include #include +#include #include #include #include -#include // Levenshtein distance function code generated by chatgpt/copilot -std::size_t levenshteinDistance(const std::string& s1, const std::string& s2) { +std::size_t levenshteinDistance(const std::string &s1, const std::string &s2) { std::size_t len1 = s1.size(), len2 = s2.size(); - if (len1 == 0) return len2; - if (len2 == 0) return len1; + if(len1 == 0) + return len2; + if(len2 == 0) + return len1; std::vector prev(len2 + 1), curr(len2 + 1); std::iota(prev.begin(), prev.end(), 0); // Fill prev with {0, 1, ..., len2} - for (std::size_t ii = 1; ii <= len1; ++ii) { + for(std::size_t ii = 1; ii <= len1; ++ii) { curr[0] = ii; - for (std::size_t jj = 1; jj <= len2; ++jj) { + for(std::size_t jj = 1; jj <= len2; ++jj) { // If characters match, no substitution cost; otherwise, cost is 1. std::size_t cost = (s1[ii - 1] == s2[jj - 1]) ? 0 : 1; @@ -34,7 +36,7 @@ std::size_t levenshteinDistance(const std::string& s1, const std::string& s2) { // - Inserting a character into `s1` (curr[jj - 1] + 1) // - Substituting a character (prev[jj - 1] + cost) - curr[jj] = std::min({ prev[jj] + 1, curr[jj - 1] + 1, prev[jj - 1] + cost }); + curr[jj] = std::min({prev[jj] + 1, curr[jj - 1] + 1, prev[jj - 1] + cost}); } prev = std::exchange(curr, prev); // Swap vectors efficiently } @@ -58,7 +60,7 @@ std::pair findClosestMatch(const std::string &input, } void addSubcommandCloseMatchDetection(CLI::App *app, std::size_t minDistance = 3) { - //if extras are not allowed then there will be no remaining + // if extras are not allowed then there will be no remaining app->allow_extras(true); // generate a list of subcommand names auto subs = app->get_subcommands(nullptr); @@ -73,12 +75,12 @@ void addSubcommandCloseMatchDetection(CLI::App *app, std::size_t minDistance = 3 } } // add a callback that runs before a final callback and loops over the remaining arguments for subcommands - app->parse_complete_callback([&app, minDistance,list]() { + app->parse_complete_callback([&app, minDistance, list]() { auto extras = app->remaining(); if(extras.empty()) { return; } - + for(auto &extra : extras) { if(extra.front() != '-') { auto closest = findClosestMatch(extra, list); @@ -93,7 +95,7 @@ void addSubcommandCloseMatchDetection(CLI::App *app, std::size_t minDistance = 3 /** This example demonstrates the use of close match detection to detect invalid commands that are close matches to * existing ones */ -int main(int argc, const char* argv[]) { +int main(int argc, const char *argv[]) { int value{0}; CLI::App app{"cose string App"}; @@ -105,14 +107,13 @@ int main(int argc, const char* argv[]) { app.add_subcommand("upgrade", ""); app.add_subcommand("remove", ""); app.add_subcommand("test", ""); - //enable close matching for subcommands + // enable close matching for subcommands addSubcommandCloseMatchDetection(&app, 5); CLI11_PARSE(app, argc, argv); - auto subs=app.get_subcommands(); - for (const auto& sub : subs) - { - std::cout<get_name()<<"\n"; + auto subs = app.get_subcommands(); + for(const auto &sub : subs) { + std::cout << sub->get_name() << "\n"; } return 0; }