From 0038ad46583fa16f25d75e4987f545474cf6957d Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Fri, 6 May 2022 23:37:45 -0400 Subject: [PATCH] style: run prettier --- .ci/azure-build.yml | 15 +- .ci/azure-cmake.yml | 25 +- .ci/azure-test.yml | 15 +- .clang-format | 16 +- .clang-tidy | 29 +- .codecov.yml | 1 - .github/CONTRIBUTING.md | 32 +- .github/actions/quick_cmake/action.yml | 8 +- .github/labeler_merged.yml | 4 +- .github/workflows/build.yml | 67 ++- .github/workflows/pr_merged.yml | 8 +- .github/workflows/tests.yml | 266 +++++----- CHANGELOG.md | 680 ++++++++++++------------- README.md | 570 ++++++++++----------- azure-pipelines.yml | 237 +++++---- book/README.md | 6 +- book/SUMMARY.md | 26 +- book/book.json | 22 +- book/chapters/an-advanced-example.md | 2 +- book/chapters/basics.md | 2 +- book/chapters/config.md | 44 +- book/chapters/flags.md | 14 +- book/chapters/formatting.md | 12 +- book/chapters/installation.md | 14 +- book/chapters/options.md | 160 +++--- book/chapters/subcommands.md | 34 +- book/chapters/validators.md | 32 +- docs/mainpage.md | 20 +- 28 files changed, 1174 insertions(+), 1187 deletions(-) diff --git a/.ci/azure-build.yml b/.ci/azure-build.yml index f51620c5..43dfabb6 100644 --- a/.ci/azure-build.yml +++ b/.ci/azure-build.yml @@ -1,10 +1,9 @@ steps: + - task: CMake@1 + inputs: + cmakeArgs: .. -DCLI11_WARNINGS_AS_ERRORS=ON -DCLI11_SINGLE_FILE=$(cli11.single) -DCMAKE_CXX_STANDARD=$(cli11.std) -DCLI11_SINGLE_FILE_TESTS=$(cli11.single) -DCMAKE_BUILD_TYPE=$(cli11.build_type) $(cli11.options) + displayName: "Configure" -- task: CMake@1 - inputs: - cmakeArgs: .. -DCLI11_WARNINGS_AS_ERRORS=ON -DCLI11_SINGLE_FILE=$(cli11.single) -DCMAKE_CXX_STANDARD=$(cli11.std) -DCLI11_SINGLE_FILE_TESTS=$(cli11.single) -DCMAKE_BUILD_TYPE=$(cli11.build_type) $(cli11.options) - displayName: 'Configure' - -- script: cmake --build . - displayName: 'Build' - workingDirectory: build + - script: cmake --build . + displayName: "Build" + workingDirectory: build diff --git a/.ci/azure-cmake.yml b/.ci/azure-cmake.yml index 59b6ceb3..ee547a7b 100644 --- a/.ci/azure-cmake.yml +++ b/.ci/azure-cmake.yml @@ -1,16 +1,15 @@ steps: + # Note that silkeh/clang does not include ca-certificates, so check the shasum for verification + - bash: | + wget --no-check-certificate "https://cmake.org/files/v3.14/cmake-3.14.3-Linux-x86_64.tar.gz" + echo "29faa62fb3a0b6323caa3d9557e1a5f1205614c0d4c5c2a9917f16a74f7eff68 cmake-3.14.3-Linux-x86_64.tar.gz" | shasum -sca 256 + displayName: Download CMake -# Note that silkeh/clang does not include ca-certificates, so check the shasum for verification -- bash: | - wget --no-check-certificate "https://cmake.org/files/v3.14/cmake-3.14.3-Linux-x86_64.tar.gz" - echo "29faa62fb3a0b6323caa3d9557e1a5f1205614c0d4c5c2a9917f16a74f7eff68 cmake-3.14.3-Linux-x86_64.tar.gz" | shasum -sca 256 - displayName: Download CMake + - task: ExtractFiles@1 + inputs: + archiveFilePatterns: "cmake*.tar.gz" + destinationFolder: "cmake_program" + displayName: Extract CMake -- task: ExtractFiles@1 - inputs: - archiveFilePatterns: 'cmake*.tar.gz' - destinationFolder: 'cmake_program' - displayName: Extract CMake - -- bash: echo "##vso[task.prependpath]$(Build.SourcesDirectory)/cmake_program/cmake-3.14.3-Linux-x86_64/bin" - displayName: Add CMake to PATH + - bash: echo "##vso[task.prependpath]$(Build.SourcesDirectory)/cmake_program/cmake-3.14.3-Linux-x86_64/bin" + displayName: Add CMake to PATH diff --git a/.ci/azure-test.yml b/.ci/azure-test.yml index cf89a999..c9dc9a28 100644 --- a/.ci/azure-test.yml +++ b/.ci/azure-test.yml @@ -1,10 +1,9 @@ steps: + - script: ctest --output-on-failure -C $(cli11.build_type) -T test + displayName: "Test" + workingDirectory: build -- script: ctest --output-on-failure -C $(cli11.build_type) -T test - displayName: 'Test' - workingDirectory: build - -- task: PublishTestResults@2 - inputs: - testResultsFormat: 'cTest' - testResultsFiles: '**/Test.xml' + - task: PublishTestResults@2 + inputs: + testResultsFormat: "cTest" + testResultsFiles: "**/Test.xml" diff --git a/.clang-format b/.clang-format index 0879ffa4..6a5d1063 100644 --- a/.clang-format +++ b/.clang-format @@ -1,5 +1,5 @@ -Language: Cpp -BasedOnStyle: LLVM +Language: Cpp +BasedOnStyle: LLVM # AccessModifierOffset: -2 # AlignAfterOpenBracket: Align # AlignConsecutiveAssignments: false @@ -37,7 +37,7 @@ BinPackParameters: false # BreakConstructorInitializersBeforeComma: false # BreakAfterJavaFieldAnnotations: false # BreakStringLiterals: true -ColumnLimit: 120 +ColumnLimit: 120 # CommentPragmas: '^ IWYU pragma:' # ConstructorInitializerAllOnOneLineOrOnePerLine: false # ConstructorInitializerIndentWidth: 4 @@ -49,7 +49,7 @@ ColumnLimit: 120 # ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ] # IncludeIsMainRegex: '$' # IndentCaseLabels: false -IndentWidth: 4 +IndentWidth: 4 # IndentWrappedFunctionNames: false # JavaScriptQuotes: Leave # JavaScriptWrapImports: true @@ -69,7 +69,7 @@ IndentWidth: 4 # PenaltyReturnTypeOnItsOwnLine: 60 # PointerAlignment: Right # ReflowComments: true -SortIncludes: true +SortIncludes: true # SpaceAfterCStyleCast: false # SpaceAfterTemplateKeyword: true # SpaceBeforeAssignmentOperators: true @@ -81,6 +81,6 @@ SpacesBeforeTrailingComments: 2 # SpacesInCStyleCastParentheses: false # SpacesInParentheses: false # SpacesInSquareBrackets: false -Standard: Cpp11 -TabWidth: 4 -UseTab: Never +Standard: Cpp11 +TabWidth: 4 +UseTab: Never diff --git a/.clang-tidy b/.clang-tidy index 075f35dc..8157dce2 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -3,22 +3,21 @@ FormatStyle: file -Checks: ' --*, -google-*, --google-runtime-references, -llvm-include-order, -llvm-namespace-comment, -misc-throw-by-value-catch-by-reference, -modernize*, --modernize-use-trailing-return-type, -readability-container-size-empty, -' +Checks: > + -*, + google-*, + -google-runtime-references, + llvm-include-order, + llvm-namespace-comment, + misc-throw-by-value-catch-by-reference, + modernize*, + -modernize-use-trailing-return-type, + readability-container-size-empty, -WarningsAsErrors: '*' +WarningsAsErrors: "*" -HeaderFilterRegex: '.*hpp' +HeaderFilterRegex: ".*hpp" CheckOptions: -- key: google-readability-braces-around-statements.ShortStatementLines - value: '3' + - key: google-readability-braces-around-statements.ShortStatementLines + value: "3" diff --git a/.codecov.yml b/.codecov.yml index 4181c549..185bbad3 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -1,4 +1,3 @@ - ignore: - "tests" - "examples" diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 2f44c9da..d8b61a42 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -8,20 +8,20 @@ Make sure you are comfortable with the license; all contributions are licensed u Make sure any new functions you add are are: -* Documented by `///` documentation for Doxygen -* Mentioned in the instructions in the README, though brief mentions are okay -* Explained in your PR (or previously explained in an Issue mentioned in the PR) -* Completely covered by tests +- Documented by `///` documentation for Doxygen +- Mentioned in the instructions in the README, though brief mentions are okay +- Explained in your PR (or previously explained in an Issue mentioned in the PR) +- Completely covered by tests In general, make sure the addition is well thought out and does not increase the complexity of CLI11 needlessly. ## Things you should know -* Once you make the PR, tests will run to make sure your code works on all supported platforms -* The test coverage is also measured, and that should remain 100% -* Formatting should be done with pre-commit, otherwise the format check will not pass. However, it is trivial to apply this to your PR, so don't worry about this check. If you do want to run it, see below. -* Everything must pass clang-tidy as well, run with `-DCLI11_CLANG_TIDY=ON` (if you set `-DCLI11_CLANG_TIDY_OPTIONS="-fix"`, make sure you use a single threaded build process, or just build one example target). -* Your changes must also conform to most of the [Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html) rules checked by [cpplint](https://github.com/cpplint/cpplint). For unused cpplint filters and justifications, see [CPPLINT.cfg](/CPPLINT.cfg). +- Once you make the PR, tests will run to make sure your code works on all supported platforms +- The test coverage is also measured, and that should remain 100% +- Formatting should be done with pre-commit, otherwise the format check will not pass. However, it is trivial to apply this to your PR, so don't worry about this check. If you do want to run it, see below. +- Everything must pass clang-tidy as well, run with `-DCLI11_CLANG_TIDY=ON` (if you set `-DCLI11_CLANG_TIDY_OPTIONS="-fix"`, make sure you use a single threaded build process, or just build one example target). +- Your changes must also conform to most of the [Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html) rules checked by [cpplint](https://github.com/cpplint/cpplint). For unused cpplint filters and justifications, see [CPPLINT.cfg](/CPPLINT.cfg). ## Pre-commit @@ -74,10 +74,10 @@ Remember to replace the emoji in the readme, being careful not to replace the on Steps: -* Update changelog if needed -* Update the version in `.appveyor.yml` and `include/CLI/Version.hpp`. -* Find and replace in README (new minor/major release only): - * Replace " 🆕" and "🆕 " with "" (ignores the description line) - * Check for `\/\/$` (vi syntax) to catch leftover `// 🆕` - * Replace "🚧" with "🆕" (manually ignore the description line) -* Make a release in the GitHub UI, use a name such as "Version X.Y(.Z): Title" +- Update changelog if needed +- Update the version in `.appveyor.yml` and `include/CLI/Version.hpp`. +- Find and replace in README (new minor/major release only): + - Replace " 🆕" and "🆕 " with "" (ignores the description line) + - Check for `\/\/$` (vi syntax) to catch leftover `// 🆕` + - Replace "🚧" with "🆕" (manually ignore the description line) +- Make a release in the GitHub UI, use a name such as "Version X.Y(.Z): Title" diff --git a/.github/actions/quick_cmake/action.yml b/.github/actions/quick_cmake/action.yml index d3df325f..811f73fe 100644 --- a/.github/actions/quick_cmake/action.yml +++ b/.github/actions/quick_cmake/action.yml @@ -1,12 +1,12 @@ name: Quick CMake config -description: 'Runs CMake 3.4+ (if already setup)' +description: "Runs CMake 3.4+ (if already setup)" inputs: args: - description: 'Other arguments' + description: "Other arguments" required: false - default: '' + default: "" cmake-version: - description: 'The CMake version to run' + description: "The CMake version to run" required: true runs: diff --git a/.github/labeler_merged.yml b/.github/labeler_merged.yml index 434ab583..96e1ca70 100644 --- a/.github/labeler_merged.yml +++ b/.github/labeler_merged.yml @@ -1,4 +1,4 @@ needs changelog: - - all: ['!CHANGELOG.md'] + - all: ["!CHANGELOG.md"] needs README: - - all: ['!README.md'] + - all: ["!README.md"] diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a6f25040..89d522c5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -13,46 +13,45 @@ jobs: name: Single header runs-on: ubuntu-latest steps: + - uses: actions/checkout@v2 + with: + submodules: true - - uses: actions/checkout@v2 - with: - submodules: true + - uses: actions/setup-python@v2 - - uses: actions/setup-python@v2 + - name: Prepare CMake config + run: cmake -S . -B build -DCLI11_SINGLE_FILE=ON - - name: Prepare CMake config - run: cmake -S . -B build -DCLI11_SINGLE_FILE=ON + - name: Make package + run: cmake --build build --target package_source - - name: Make package - run: cmake --build build --target package_source + - name: Copy source packages + run: | + mkdir -p CLI11-Source + cp build/CLI11-*-Source.* CLI11-Source + cp build/CLI11-*-Source.* . - - name: Copy source packages - run: | - mkdir -p CLI11-Source - cp build/CLI11-*-Source.* CLI11-Source - cp build/CLI11-*-Source.* . + - name: Make header + run: cmake --build build --target CLI11-generate-single-file - - name: Make header - run: cmake --build build --target CLI11-generate-single-file + - name: Copy file to main folder + run: cp build/include/CLI11.hpp CLI11.hpp - - name: Copy file to main folder - run: cp build/include/CLI11.hpp CLI11.hpp + - uses: actions/upload-artifact@v2 + with: + name: CLI11.hpp + path: CLI11.hpp - - uses: actions/upload-artifact@v2 - with: - name: CLI11.hpp - path: CLI11.hpp + - uses: actions/upload-artifact@v2 + with: + name: CLI11-Source + path: CLI11-Source - - uses: actions/upload-artifact@v2 - with: - name: CLI11-Source - path: CLI11-Source - - - name: Release - uses: softprops/action-gh-release@v1 - if: startsWith(github.ref, 'refs/tags/') - with: - files: | - CLI11.hpp - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Release + uses: softprops/action-gh-release@v1 + if: startsWith(github.ref, 'refs/tags/') + with: + files: | + CLI11.hpp + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/pr_merged.yml b/.github/workflows/pr_merged.yml index 6fadc0fa..56f6f741 100644 --- a/.github/workflows/pr_merged.yml +++ b/.github/workflows/pr_merged.yml @@ -9,7 +9,7 @@ jobs: runs-on: ubuntu-latest if: github.event.pull_request.merged == true steps: - - uses: actions/labeler@main - with: - repo-token: ${{ secrets.GITHUB_TOKEN }} - configuration-path: .github/labeler_merged.yml + - uses: actions/labeler@main + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + configuration-path: .github/labeler_merged.yml diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index e06777b2..189e8dfd 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -12,175 +12,173 @@ jobs: runs-on: ubuntu-latest container: nvidia/cuda:10.2-devel-ubuntu18.04 steps: - - uses: actions/checkout@v1 - with: - submodules: true - - name: Add wget - run: apt-get update && apt-get install -y wget - - name: Get cmake - uses: jwlawson/actions-setup-cmake@v1.12 - - name: Configure - run: cmake -S . -B build -DCLI11_CUDA_TESTS=ON - - name: Build - run: cmake --build build -j2 - + - uses: actions/checkout@v1 + with: + submodules: true + - name: Add wget + run: apt-get update && apt-get install -y wget + - name: Get cmake + uses: jwlawson/actions-setup-cmake@v1.12 + - name: Configure + run: cmake -S . -B build -DCLI11_CUDA_TESTS=ON + - name: Build + run: cmake --build build -j2 boost-build: name: Boost build runs-on: ubuntu-latest container: zouzias/boost:1.76.0 steps: - - uses: actions/checkout@v1 - with: - submodules: true - - name: Add deps - run: apt-get update && apt-get install make - - name: Get CMake - uses: jwlawson/actions-setup-cmake@v1.12 - - name: Configure - run: cmake -S . -B build -DCLI11_BOOST=ON - - name: Build - run: cmake --build build -j2 - - name: Run tests - run: ctest --output-on-failure - working-directory: build + - uses: actions/checkout@v1 + with: + submodules: true + - name: Add deps + run: apt-get update && apt-get install make + - name: Get CMake + uses: jwlawson/actions-setup-cmake@v1.12 + - name: Configure + run: cmake -S . -B build -DCLI11_BOOST=ON + - name: Build + run: cmake --build build -j2 + - name: Run tests + run: ctest --output-on-failure + working-directory: build meson-build: name: Meson build runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v2 - - name: Prepare commands - run: | - pipx install meson - pipx install ninja + - name: Prepare commands + run: | + pipx install meson + pipx install ninja - - name: Configure - run: meson setup build-meson . -Dtests=true - - - name: Build - run: meson compile -C build-meson + - name: Configure + run: meson setup build-meson . -Dtests=true + - name: Build + run: meson compile -C build-meson cmake-config: name: CMake config check runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v2 - - name: Check CMake 3.4 - with: - cmake-version: "3.4" - uses: ./.github/actions/quick_cmake + - name: Check CMake 3.4 + with: + cmake-version: "3.4" + uses: ./.github/actions/quick_cmake - - name: Check CMake 3.5 - uses: ./.github/actions/quick_cmake - with: - cmake-version: "3.5" - if: success() || failure() + - name: Check CMake 3.5 + uses: ./.github/actions/quick_cmake + with: + cmake-version: "3.5" + if: success() || failure() - - name: Check CMake 3.6 - uses: ./.github/actions/quick_cmake - with: - cmake-version: "3.6" - if: success() || failure() + - name: Check CMake 3.6 + uses: ./.github/actions/quick_cmake + with: + cmake-version: "3.6" + if: success() || failure() - - name: Check CMake 3.7 - uses: ./.github/actions/quick_cmake - with: - cmake-version: "3.7" - if: success() || failure() + - name: Check CMake 3.7 + uses: ./.github/actions/quick_cmake + with: + cmake-version: "3.7" + if: success() || failure() - - name: Check CMake 3.8 - uses: ./.github/actions/quick_cmake - with: - cmake-version: "3.8" - if: success() || failure() + - name: Check CMake 3.8 + uses: ./.github/actions/quick_cmake + with: + cmake-version: "3.8" + if: success() || failure() - - name: Check CMake 3.9 - uses: ./.github/actions/quick_cmake - with: - cmake-version: "3.9" - if: success() || failure() + - name: Check CMake 3.9 + uses: ./.github/actions/quick_cmake + with: + cmake-version: "3.9" + if: success() || failure() - - name: Check CMake 3.10 - uses: ./.github/actions/quick_cmake - with: - cmake-version: "3.10" - if: success() || failure() + - name: Check CMake 3.10 + uses: ./.github/actions/quick_cmake + with: + cmake-version: "3.10" + if: success() || failure() - - name: Check CMake 3.11 (full) - uses: ./.github/actions/quick_cmake - with: - cmake-version: "3.11" - args: -DCLI11_SANITIZERS=ON -DCLI11_BUILD_EXAMPLES_JSON=ON - if: success() || failure() + - name: Check CMake 3.11 (full) + uses: ./.github/actions/quick_cmake + with: + cmake-version: "3.11" + args: -DCLI11_SANITIZERS=ON -DCLI11_BUILD_EXAMPLES_JSON=ON + if: success() || failure() - - name: Check CMake 3.12 - uses: ./.github/actions/quick_cmake - with: - cmake-version: "3.12" - if: success() || failure() + - name: Check CMake 3.12 + uses: ./.github/actions/quick_cmake + with: + cmake-version: "3.12" + if: success() || failure() - - name: Check CMake 3.13 - uses: ./.github/actions/quick_cmake - with: - cmake-version: "3.13" - if: success() || failure() + - name: Check CMake 3.13 + uses: ./.github/actions/quick_cmake + with: + cmake-version: "3.13" + if: success() || failure() - - name: Check CMake 3.14 - uses: ./.github/actions/quick_cmake - with: - cmake-version: "3.14" - if: success() || failure() + - name: Check CMake 3.14 + uses: ./.github/actions/quick_cmake + with: + cmake-version: "3.14" + if: success() || failure() - - name: Check CMake 3.15 - uses: ./.github/actions/quick_cmake - with: - cmake-version: "3.15" - if: success() || failure() + - name: Check CMake 3.15 + uses: ./.github/actions/quick_cmake + with: + cmake-version: "3.15" + if: success() || failure() - - name: Check CMake 3.16 - uses: ./.github/actions/quick_cmake - with: - cmake-version: "3.16" - if: success() || failure() + - name: Check CMake 3.16 + uses: ./.github/actions/quick_cmake + with: + cmake-version: "3.16" + if: success() || failure() - - name: Check CMake 3.17 - uses: ./.github/actions/quick_cmake - with: - cmake-version: "3.17" - if: success() || failure() + - name: Check CMake 3.17 + uses: ./.github/actions/quick_cmake + with: + cmake-version: "3.17" + if: success() || failure() - - name: Check CMake 3.18 - uses: ./.github/actions/quick_cmake - with: - cmake-version: "3.18" - if: success() || failure() + - name: Check CMake 3.18 + uses: ./.github/actions/quick_cmake + with: + cmake-version: "3.18" + if: success() || failure() - - name: Check CMake 3.19 - uses: ./.github/actions/quick_cmake - with: - cmake-version: "3.19" - if: success() || failure() + - name: Check CMake 3.19 + uses: ./.github/actions/quick_cmake + with: + cmake-version: "3.19" + if: success() || failure() - - name: Check CMake 3.20 - uses: ./.github/actions/quick_cmake - with: - cmake-version: "3.20" - if: success() || failure() + - name: Check CMake 3.20 + uses: ./.github/actions/quick_cmake + with: + cmake-version: "3.20" + if: success() || failure() - - name: Check CMake 3.21 (full) - uses: ./.github/actions/quick_cmake - with: - cmake-version: "3.21" - args: -DCLI11_SANITIZERS=ON -DCLI11_BUILD_EXAMPLES_JSON=ON - if: success() || failure() + - name: Check CMake 3.21 (full) + uses: ./.github/actions/quick_cmake + with: + cmake-version: "3.21" + args: -DCLI11_SANITIZERS=ON -DCLI11_BUILD_EXAMPLES_JSON=ON + if: success() || failure() - - name: Check CMake 3.22 (full) - uses: ./.github/actions/quick_cmake - with: - cmake-version: "3.22" - args: -DCLI11_SANITIZERS=ON -DCLI11_BUILD_EXAMPLES_JSON=ON - if: success() || failure() + - name: Check CMake 3.22 (full) + uses: ./.github/actions/quick_cmake + with: + cmake-version: "3.22" + args: -DCLI11_SANITIZERS=ON -DCLI11_BUILD_EXAMPLES_JSON=ON + if: success() || failure() diff --git a/CHANGELOG.md b/CHANGELOG.md index 288e0cbf..27111f2c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,29 +2,29 @@ ## Version 2.2: Option and Configuration Flexibility -New features include support for output of an empty vector, a summing option policy that can be applied more broadly, and an option to validate optional arguments to discriminate from positional arguments. A new validator to check for files on a default path is included to allow one or more default paths for configuration files or other file arguments. A number of bug fixes and code cleanup for various build configurations. Clean up of some error outputs and extension of existing capability to new types or situations. +New features include support for output of an empty vector, a summing option policy that can be applied more broadly, and an option to validate optional arguments to discriminate from positional arguments. A new validator to check for files on a default path is included to allow one or more default paths for configuration files or other file arguments. A number of bug fixes and code cleanup for various build configurations. Clean up of some error outputs and extension of existing capability to new types or situations. -There is a possible minor breaking change in behavior of certain types which wrapped an integer, such as `std::atomic` or `std::optional` when used in a flag. The default behavior is now as a single argument value vs. summing all the arguments. The default summing behavior is now restricted to pure integral types, int64_t, int, uint32_t, etc. Use the new `sum` multi option policy to revert to the older behavior. The summing behavior on wrapper types was not originally intended. +There is a possible minor breaking change in behavior of certain types which wrapped an integer, such as `std::atomic` or `std::optional` when used in a flag. The default behavior is now as a single argument value vs. summing all the arguments. The default summing behavior is now restricted to pure integral types, int64_t, int, uint32_t, etc. Use the new `sum` multi option policy to revert to the older behavior. The summing behavior on wrapper types was not originally intended. -* Add `MultiOptionPolicy::Sum` and refactor the `add_flag` to fix a bug when using `std::optional` as type. [#709][] -* Add support for an empty vector result in TOML and as a default string. [#660][] -* Add `.validate_optional_arguments()` to support discriminating positional arguments from vector option arguments. [#668][] -* Add `CLI::FileOnDefaultPath` to check for files on a specified default path. [#698][] -* Change default value display in help messages from `=XXXX` to `[XXXXX]` to make it clearer. [#666][] -* Modify the Range Validator to support additional types and clean up the error output. [#690][] -* Bugfix: The trigger on parse modifier did not work on positional argument.s [#713][] -* Bugfix: The single header file generation was missing custom namespace generation. [#707][] -* Bugfix: Clean up File Error handling in the argument processing. [#678][] -* Bugfix: Fix a stack overflow error if nameless commands had fallthrough. [#665][] -* Bugfix: A subcommand callback could be executed multiple times if it was a member of an option group. [#666][] -* Bugfix: Fix an issue with vectors of multi argument types where partial argument sets did not result in an error. [#661][] -* Bugfix: Fix an issue with type the template matching on C++20 and add some CI builds for C++20. [#663][] -* Bugfix: Fix typo in C++20 detection on MSVC. [#706][] -* Bugfix: An issue where the detection of RTTI being disabled on certain MSVC platforms did not disable the use of dynamic cast calls. [#666][] -* Bugfix: Resolve strict-overflow warning on some GCC compilers. [#666][] -* Backend: Add additional tests concerning the use of aliases for option groups in config files. [#666][] -* Build: Add support for testing in meson and cleanup symbolic link generation. [#701][], [#697][] -* Build: Support building in WebAssembly. [#679][] +- Add `MultiOptionPolicy::Sum` and refactor the `add_flag` to fix a bug when using `std::optional` as type. [#709][] +- Add support for an empty vector result in TOML and as a default string. [#660][] +- Add `.validate_optional_arguments()` to support discriminating positional arguments from vector option arguments. [#668][] +- Add `CLI::FileOnDefaultPath` to check for files on a specified default path. [#698][] +- Change default value display in help messages from `=XXXX` to `[XXXXX]` to make it clearer. [#666][] +- Modify the Range Validator to support additional types and clean up the error output. [#690][] +- Bugfix: The trigger on parse modifier did not work on positional argument.s [#713][] +- Bugfix: The single header file generation was missing custom namespace generation. [#707][] +- Bugfix: Clean up File Error handling in the argument processing. [#678][] +- Bugfix: Fix a stack overflow error if nameless commands had fallthrough. [#665][] +- Bugfix: A subcommand callback could be executed multiple times if it was a member of an option group. [#666][] +- Bugfix: Fix an issue with vectors of multi argument types where partial argument sets did not result in an error. [#661][] +- Bugfix: Fix an issue with type the template matching on C++20 and add some CI builds for C++20. [#663][] +- Bugfix: Fix typo in C++20 detection on MSVC. [#706][] +- Bugfix: An issue where the detection of RTTI being disabled on certain MSVC platforms did not disable the use of dynamic cast calls. [#666][] +- Bugfix: Resolve strict-overflow warning on some GCC compilers. [#666][] +- Backend: Add additional tests concerning the use of aliases for option groups in config files. [#666][] +- Build: Add support for testing in meson and cleanup symbolic link generation. [#701][], [#697][] +- Build: Support building in WebAssembly. [#679][] [#660]: https://github.com/CLIUtils/CLI11/pull/660 [#661]: https://github.com/CLIUtils/CLI11/pull/661 @@ -52,12 +52,12 @@ improved, allowing your configuration to sit in a larger file. And option callbacks have a few new settings, allowing them to be run even if the option is not passed, or every time the option is parsed. -* Option/subcommand name restrictions have been relaxed. Most characters are now allowed. [#627][] -* The config parser can accept streams, specify a specific section, and inline comment characters are supported [#630][] -* `force_callback` & `trigger_on_parse` added, allowing a callback to always run on parse even if not present or every time the option is parsed [#631][] -* Bugfix(cmake): Only add `CONFIGURE_DEPENDS` if CLI11 is the main project [#633][] -* Bugfix(cmake): Ensure the cmake/pkg-config files install to a arch independent path [#635][] -* Bugfix: The single header file generation was missing the include guard. [#620][] +- Option/subcommand name restrictions have been relaxed. Most characters are now allowed. [#627][] +- The config parser can accept streams, specify a specific section, and inline comment characters are supported [#630][] +- `force_callback` & `trigger_on_parse` added, allowing a callback to always run on parse even if not present or every time the option is parsed [#631][] +- Bugfix(cmake): Only add `CONFIGURE_DEPENDS` if CLI11 is the main project [#633][] +- Bugfix(cmake): Ensure the cmake/pkg-config files install to a arch independent path [#635][] +- Bugfix: The single header file generation was missing the include guard. [#620][] [#620]: https://github.com/CLIUtils/CLI11/pull/620 [#627]: https://github.com/CLIUtils/CLI11/pull/627 @@ -68,9 +68,9 @@ is not passed, or every time the option is parsed. ### Version 2.1.1: Quick Windows fix -* A collision with `min`/`max` macros on Windows has been fixed. [#642][] -* Tests pass with Boost again [#646][] -* Running the pre-commit hooks in development no longer requires docker for clang-format [#647][] +- A collision with `min`/`max` macros on Windows has been fixed. [#642][] +- Tests pass with Boost again [#646][] +- Running the pre-commit hooks in development no longer requires docker for clang-format [#647][] [#642]: https://github.com/CLIUtils/CLI11/pull/642 [#646]: https://github.com/CLIUtils/CLI11/pull/646 @@ -78,11 +78,11 @@ is not passed, or every time the option is parsed. ## Version 2.1.2: Better subproject builds -* Use `main` for the main branch of the repository [#657][] -* Bugfix(cmake): Enforce at least C++11 when using CMake target [#656][] -* Build: Don't run doxygen and CTest includes if a submodule [#656][] -* Build: Avoid a warning on CMake 3.22 [#656][] -* Build: Support compiling the tests with an external copy of Catch2 [#653][] +- Use `main` for the main branch of the repository [#657][] +- Bugfix(cmake): Enforce at least C++11 when using CMake target [#656][] +- Build: Don't run doxygen and CTest includes if a submodule [#656][] +- Build: Avoid a warning on CMake 3.22 [#656][] +- Build: Support compiling the tests with an external copy of Catch2 [#653][] [#653]: https://github.com/CLIUtils/CLI11/pull/653 [#656]: https://github.com/CLIUtils/CLI11/pull/656 @@ -94,38 +94,38 @@ This version focuses on cleaning up deprecated functionality, and some minor default changes. The config processing is TOML compliant now. Atomics and complex numbers are directly supported, along with other container improvements. A new version flag option has finally been added. Subcommands are -significantly improved with new features and bugfixes for corner cases. This +significantly improved with new features and bugfixes for corner cases. This release contains a lot of backend cleanup, including a complete overhaul of the testing system and single file generation system. -* Built-in config format is TOML compliant now [#435][] - * Support multiline TOML [#528][] - * Support for configurable quotes [#599][] - * Support short/positional options in config mode [#443][] -* More powerful containers, support for `%%` separator [#423][] -* Support atomic types [#520][] and complex types natively [#423][] -* Add a type validator `CLI::TypeValidator` [#526][] -* Add a version flag easily [#452][], with help message [#601][] -* Support `->silent()` on subcommands. [#529][] -* Add alias section to help for subcommands [#545][] -* Allow quotes to specify a program name [#605][] -* Backend: redesigned MakeSingleFiles to have a higher level of manual control, to support future features. [#546][] -* Backend: moved testing from GTest to Catch2 [#574][] -* Bugfix: avoid duplicated and missed calls to the final callback [#584][] -* Bugfix: support embedded newlines in more places [#592][] -* Bugfix: avoid listing helpall as a required flag [#530][] -* Bugfix: avoid a clash with WINDOWS define [#563][] -* Bugfix: the help flag didn't get processed when a config file was required [#606][] -* Bugfix: fix description of non-configurable subcommands in config [#604][] -* Build: support pkg-config [#523][] +- Built-in config format is TOML compliant now [#435][] + - Support multiline TOML [#528][] + - Support for configurable quotes [#599][] + - Support short/positional options in config mode [#443][] +- More powerful containers, support for `%%` separator [#423][] +- Support atomic types [#520][] and complex types natively [#423][] +- Add a type validator `CLI::TypeValidator` [#526][] +- Add a version flag easily [#452][], with help message [#601][] +- Support `->silent()` on subcommands. [#529][] +- Add alias section to help for subcommands [#545][] +- Allow quotes to specify a program name [#605][] +- Backend: redesigned MakeSingleFiles to have a higher level of manual control, to support future features. [#546][] +- Backend: moved testing from GTest to Catch2 [#574][] +- Bugfix: avoid duplicated and missed calls to the final callback [#584][] +- Bugfix: support embedded newlines in more places [#592][] +- Bugfix: avoid listing helpall as a required flag [#530][] +- Bugfix: avoid a clash with WINDOWS define [#563][] +- Bugfix: the help flag didn't get processed when a config file was required [#606][] +- Bugfix: fix description of non-configurable subcommands in config [#604][] +- Build: support pkg-config [#523][] > ### Converting from CLI11 1.9 > -> * Removed deprecated set commands, use validators instead. [#565][] -> * The final "defaulted" bool has been removed, use `->capture_default_str()` +> - Removed deprecated set commands, use validators instead. [#565][] +> - The final "defaulted" bool has been removed, use `->capture_default_str()` > instead. Use `app.option_defaults()->always_capture_default()` to set this for > all future options. [#597][] -> * Use `add_option` on a complex number instead of `add_complex`, which has been removed. +> - Use `add_option` on a complex number instead of `add_complex`, which has been removed. [#423]: https://github.com/CLIUtils/CLI11/pull/423 [#435]: https://github.com/CLIUtils/CLI11/pull/435 @@ -157,44 +157,44 @@ Config file handling was revamped to fix common issues, and now supports reading Adding options is significantly more powerful with support for things like `std::tuple` and `std::array`, including with transforms. Several new -configuration options were added to facilitate a wider variety of apps. GCC +configuration options were added to facilitate a wider variety of apps. GCC 4.7 is no longer supported. -* Config files refactored, supports TOML (may become default output in 2.0) [#362][] -* Added two template parameter form of `add_option`, allowing `std::optional` to be supported without a special import [#285][] -* `string_view` now supported in reasonable places [#300][], [#285][] -* `immediate_callback`, `final_callback`, and `parse_complete_callback` added to support controlling the App callback order [#292][], [#313][] -* Multiple positional arguments maintain order if `positionals_at_end` is set. [#306][] -* Pair/tuple/array now supported, and validators indexed to specific components in the objects [#307][], [#310][] -* Footer callbacks supported [#309][] -* Subcommands now support needs (including nameless subcommands) [#317][] -* More flexible type size, more useful `add_complex` [#325][], [#370][] -* Added new validators `CLI::NonNegativeNumber` and `CLI::PositiveNumber` [#342][] -* Transform now supports arrays [#349][] -* Option groups can be hidden [#356][] -* Add `CLI::deprecate_option` and `CLI::retire_option` functions [#358][] -* More flexible and safer Option `default_val` [#387][] -* Backend: Cleaner type traits [#286][] -* Backend: File checking updates [#341][] -* Backend: Using pre-commit to format, checked in GitHub Actions [#336][] -* Backend: Clang-tidy checked again, CMake option now `CL11_CLANG_TIDY` [#390][] -* Backend: Warning cleanup, more checks from klocwork [#350][], Effective C++ [#354][], clang-tidy [#360][], CUDA NVCC [#365][], cross compile [#373][], sign conversion [#382][], and cpplint [#400][] -* Docs: CLI11 Tutorial now hosted in the same repository [#304][], [#318][], [#374][] -* Bugfix: Fixed undefined behavior in `checked_multiply` [#290][] -* Bugfix: `->check()` was adding the name to the wrong validator [#320][] -* Bugfix: Resetting config option works properly [#301][] -* Bugfix: Hidden flags were showing up in error printout [#333][] -* Bugfix: Enum conversion no longer broken if stream operator added [#348][] -* Build: The meson build system supported [#299][] -* Build: GCC 4.7 is no longer supported, due mostly to GoogleTest. GCC 4.8+ is now required. [#160][] -* Build: Restructured significant portions of CMake build system [#394][] +- Config files refactored, supports TOML (may become default output in 2.0) [#362][] +- Added two template parameter form of `add_option`, allowing `std::optional` to be supported without a special import [#285][] +- `string_view` now supported in reasonable places [#300][], [#285][] +- `immediate_callback`, `final_callback`, and `parse_complete_callback` added to support controlling the App callback order [#292][], [#313][] +- Multiple positional arguments maintain order if `positionals_at_end` is set. [#306][] +- Pair/tuple/array now supported, and validators indexed to specific components in the objects [#307][], [#310][] +- Footer callbacks supported [#309][] +- Subcommands now support needs (including nameless subcommands) [#317][] +- More flexible type size, more useful `add_complex` [#325][], [#370][] +- Added new validators `CLI::NonNegativeNumber` and `CLI::PositiveNumber` [#342][] +- Transform now supports arrays [#349][] +- Option groups can be hidden [#356][] +- Add `CLI::deprecate_option` and `CLI::retire_option` functions [#358][] +- More flexible and safer Option `default_val` [#387][] +- Backend: Cleaner type traits [#286][] +- Backend: File checking updates [#341][] +- Backend: Using pre-commit to format, checked in GitHub Actions [#336][] +- Backend: Clang-tidy checked again, CMake option now `CL11_CLANG_TIDY` [#390][] +- Backend: Warning cleanup, more checks from klocwork [#350][], Effective C++ [#354][], clang-tidy [#360][], CUDA NVCC [#365][], cross compile [#373][], sign conversion [#382][], and cpplint [#400][] +- Docs: CLI11 Tutorial now hosted in the same repository [#304][], [#318][], [#374][] +- Bugfix: Fixed undefined behavior in `checked_multiply` [#290][] +- Bugfix: `->check()` was adding the name to the wrong validator [#320][] +- Bugfix: Resetting config option works properly [#301][] +- Bugfix: Hidden flags were showing up in error printout [#333][] +- Bugfix: Enum conversion no longer broken if stream operator added [#348][] +- Build: The meson build system supported [#299][] +- Build: GCC 4.7 is no longer supported, due mostly to GoogleTest. GCC 4.8+ is now required. [#160][] +- Build: Restructured significant portions of CMake build system [#394][] > ### Converting from CLI11 1.8 > -> * Some deprecated methods dropped -> * `add_set*` should be replaced with `->check`/`->transform` and `CLI::IsMember` since 1.8 -> * `get_defaultval` was replaced by `get_default_str` in 1.8 -> * The true/false 4th argument to `add_option` is expected to be removed in 2.0, use `->capture_default_str()` since 1.8 +> - Some deprecated methods dropped +> - `add_set*` should be replaced with `->check`/`->transform` and `CLI::IsMember` since 1.8 +> - `get_defaultval` was replaced by `get_default_str` in 1.8 +> - The true/false 4th argument to `add_option` is expected to be removed in 2.0, use `->capture_default_str()` since 1.8 [#160]: https://github.com/CLIUtils/CLI11/pull/160 [#285]: https://github.com/CLIUtils/CLI11/pull/285 @@ -240,13 +240,13 @@ configuration options were added to facilitate a wider variety of apps. GCC This is a patch version that backports fixes from the development of 2.0. -* Support relative inclusion [#475][] -* Fix cases where spaces in paths could break CMake support [#471][] -* Fix an issue with string conversion [#421][] -* Cross-compiling improvement for Conan.io [#430][] -* Fix option group default propagation [#450][] -* Fix for C++20 [#459][] -* Support compiling with RTTI off [#461][] +- Support relative inclusion [#475][] +- Fix cases where spaces in paths could break CMake support [#471][] +- Fix an issue with string conversion [#421][] +- Cross-compiling improvement for Conan.io [#430][] +- Fix option group default propagation [#450][] +- Fix for C++20 [#459][] +- Support compiling with RTTI off [#461][] [#421]: https://github.com/CLIUtils/CLI11/pull/421 [#430]: https://github.com/CLIUtils/CLI11/pull/430 @@ -260,39 +260,39 @@ This is a patch version that backports fixes from the development of 2.0. Set handling has been completely replaced by a new backend that works as a Validator or Transformer. This provides a single interface instead of the 16 different functions in App. It also allows ordered collections to be used, custom functions for filtering, and better help and error messages. You can also use a collection of pairs (like `std::map`) to transform the match into an output. Also new are inverted flags, which can cancel or reduce the count of flags, and can also support general flag types. A new `add_option_fn` lets you more easily program CLI11 options with the types you choose. Vector options now support a custom separator. Apps can now be composed with unnamed subcommand support. The final bool "defaults" flag when creating options has been replaced by `->capture_default_str()` (ending an old limitation in construction made this possible); the old method is still available but may be removed in future versions. -* Replaced default help capture: `.add_option("name", value, "", True)` becomes `.add_option("name", value)->capture_default_str()` [#242][] -* Added `.always_capture_default()` [#242][] -* New `CLI::IsMember` validator replaces set validation [#222][] -* `IsMember` also supports container of pairs, transform allows modification of result [#228][] -* Added new Transformers, `CLI::AsNumberWithUnit` and `CLI::AsSizeValue` [#253][] -* Much more powerful flags with different values [#211][], general types [#235][] -* `add_option` now supports bool due to unified bool handling [#211][] -* Support for composable unnamed subcommands [#216][] -* Reparsing is better supported with `.remaining_for_passthrough()` [#265][] -* Custom vector separator using `->delimiter(char)` [#209][], [#221][], [#240][] -* Validators added for IP4 addresses and positive numbers [#210][] and numbers [#262][] -* Minimum required Boost for optional Optionals has been corrected to 1.61 [#226][] -* Positionals can stop options from being parsed with `app.positionals_at_end()` [#223][] -* Added `validate_positionals` [#262][] -* Positional parsing is much more powerful [#251][], duplicates supported [#247][] -* Validators can be negated with `!` [#230][], and now handle tname functions [#228][] -* Better enum support and streaming helper [#233][] and [#228][] -* Cleanup for shadow warnings [#232][] -* Better alignment on multiline descriptions [#269][] -* Better support for aarch64 [#266][] -* Respect `BUILD_TESTING` only if CLI11 is the main project; otherwise, `CLI11_TESTING` must be used [#277][] -* Drop auto-detection of experimental optional and boost::optional; must be enabled explicitly (too fragile) [#277][] [#279][] +- Replaced default help capture: `.add_option("name", value, "", True)` becomes `.add_option("name", value)->capture_default_str()` [#242][] +- Added `.always_capture_default()` [#242][] +- New `CLI::IsMember` validator replaces set validation [#222][] +- `IsMember` also supports container of pairs, transform allows modification of result [#228][] +- Added new Transformers, `CLI::AsNumberWithUnit` and `CLI::AsSizeValue` [#253][] +- Much more powerful flags with different values [#211][], general types [#235][] +- `add_option` now supports bool due to unified bool handling [#211][] +- Support for composable unnamed subcommands [#216][] +- Reparsing is better supported with `.remaining_for_passthrough()` [#265][] +- Custom vector separator using `->delimiter(char)` [#209][], [#221][], [#240][] +- Validators added for IP4 addresses and positive numbers [#210][] and numbers [#262][] +- Minimum required Boost for optional Optionals has been corrected to 1.61 [#226][] +- Positionals can stop options from being parsed with `app.positionals_at_end()` [#223][] +- Added `validate_positionals` [#262][] +- Positional parsing is much more powerful [#251][], duplicates supported [#247][] +- Validators can be negated with `!` [#230][], and now handle tname functions [#228][] +- Better enum support and streaming helper [#233][] and [#228][] +- Cleanup for shadow warnings [#232][] +- Better alignment on multiline descriptions [#269][] +- Better support for aarch64 [#266][] +- Respect `BUILD_TESTING` only if CLI11 is the main project; otherwise, `CLI11_TESTING` must be used [#277][] +- Drop auto-detection of experimental optional and boost::optional; must be enabled explicitly (too fragile) [#277][] [#279][] > ### Converting from CLI11 1.7 > -> * `.add_option(..., true)` should be replaced by `.add_option(...)->capture_default_str()` or `app.option_defaults()->always_capture_default()` can be used -> * `app.add_set("--name", value, {"choice1", "choice2"})` should become `app.add_option("--name", value)->check(CLI::IsMember({"choice1", "choice2"}))` -> * The `_ignore_case` version of this can be replaced by adding `CLI::ignore_case` to the argument list in `IsMember` -> * The `_ignore_underscore` version of this can be replaced by adding `CLI::ignore_underscore` to the argument list in `IsMember` -> * The `_ignore_case_underscore` version of this can be replaced by adding both functions listed above to the argument list in `IsMember` -> * If you want an exact match to the original choice after one of the modifier functions matches, use `->transform` instead of `->check` -> * The `_mutable` versions of this can be replaced by passing a pointer or shared pointer into `IsMember` -> * An error with sets now produces a `ValidationError` instead of a `ConversionError` +> - `.add_option(..., true)` should be replaced by `.add_option(...)->capture_default_str()` or `app.option_defaults()->always_capture_default()` can be used +> - `app.add_set("--name", value, {"choice1", "choice2"})` should become `app.add_option("--name", value)->check(CLI::IsMember({"choice1", "choice2"}))` +> - The `_ignore_case` version of this can be replaced by adding `CLI::ignore_case` to the argument list in `IsMember` +> - The `_ignore_underscore` version of this can be replaced by adding `CLI::ignore_underscore` to the argument list in `IsMember` +> - The `_ignore_case_underscore` version of this can be replaced by adding both functions listed above to the argument list in `IsMember` +> - If you want an exact match to the original choice after one of the modifier functions matches, use `->transform` instead of `->check` +> - The `_mutable` versions of this can be replaced by passing a pointer or shared pointer into `IsMember` +> - An error with sets now produces a `ValidationError` instead of a `ConversionError` [#209]: https://github.com/CLIUtils/CLI11/pull/209 [#210]: https://github.com/CLIUtils/CLI11/pull/210 @@ -324,26 +324,26 @@ Set handling has been completely replaced by a new backend that works as a Valid The parsing procedure now maps much more sensibly to complex, nested subcommand structures. Each phase of the parsing happens on all subcommands before moving on with the next phase of the parse. This allows several features, like required environment variables, to work properly even through subcommand boundaries. Passing the same subcommand multiple times is better supported. Several new features were added as well, including Windows style option support, parsing strings directly, and ignoring underscores in names. Adding a set that you plan to change later must now be done with `add_mutable_set`. -* Support Windows style options with `->allow_windows_style_options`. [#187][] On by default on Windows. [#190][] -* Added `parse(string)` to split up and parse a command-line style string directly. [#186][] -* Added `ignore_underscore` and related functions, to ignore underscores when matching names. [#185][] -* The default INI Config will now add quotes to strings with spaces [#195][] -* The default message now will mention the help-all flag also if present [#197][] -* Added `->description` to set Option descriptions [#199][] -* Mutating sets (introduced in Version 1.6) now have a clear add method, `add_mutable_set*`, since the set reference should not expire [#200][] -* 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. [#178][] -* Parsing is now done in phases: `shortcurcuits`, `ini`, `env`, `callbacks`, and `requirements`; all subcommands complete a phase before moving on. [#178][] -* Calling parse multiple times is now officially supported without `clear` (automatic). [#178][] -* Dropped the mostly undocumented `short_circuit` property, as help flag parsing is a bit more complex, and the default callback behavior of options now works properly. [#179][] -* Use the standard `BUILD_TESTING` over `CLI11_TESTING` if defined [#183][] -* Cleanup warnings [#191][] -* Remove deprecated names: `set_footer`, `set_name`, `set_callback`, and `set_type_name`. Use without the `set_` instead. [#192][] +- Support Windows style options with `->allow_windows_style_options`. [#187][] On by default on Windows. [#190][] +- Added `parse(string)` to split up and parse a command-line style string directly. [#186][] +- Added `ignore_underscore` and related functions, to ignore underscores when matching names. [#185][] +- The default INI Config will now add quotes to strings with spaces [#195][] +- The default message now will mention the help-all flag also if present [#197][] +- Added `->description` to set Option descriptions [#199][] +- Mutating sets (introduced in Version 1.6) now have a clear add method, `add_mutable_set*`, since the set reference should not expire [#200][] +- 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. [#178][] +- Parsing is now done in phases: `shortcurcuits`, `ini`, `env`, `callbacks`, and `requirements`; all subcommands complete a phase before moving on. [#178][] +- Calling parse multiple times is now officially supported without `clear` (automatic). [#178][] +- Dropped the mostly undocumented `short_circuit` property, as help flag parsing is a bit more complex, and the default callback behavior of options now works properly. [#179][] +- Use the standard `BUILD_TESTING` over `CLI11_TESTING` if defined [#183][] +- Cleanup warnings [#191][] +- Remove deprecated names: `set_footer`, `set_name`, `set_callback`, and `set_type_name`. Use without the `set_` instead. [#192][] > ### Converting from CLI11 1.6 > -> * `->short_circuit()` is no longer needed, just remove it if you were using it - raising an exception will happen in the proper place now without it. -> * `->add_set*` becomes `->add_mutable_set*` if you were using the editable set feature -> * `footer`, `name`, `callback`, and `type_name` must be used instead of the `set_*` versions (deprecated previously). +> - `->short_circuit()` is no longer needed, just remove it if you were using it - raising an exception will happen in the proper place now without it. +> - `->add_set*` becomes `->add_mutable_set*` if you were using the editable set feature +> - `footer`, `name`, `callback`, and `type_name` must be used instead of the `set_*` versions (deprecated previously). [#178]: https://github.com/CLIUtils/CLI11/pull/178 [#183]: https://github.com/CLIUtils/CLI11/pull/183 @@ -362,9 +362,9 @@ Passing the same subcommand multiple times is better supported. Several new feat This version provides a quick patch for a (correct) warning from GCC 8 for the windows options code. -* Fix for Windows style option parsing [#201][] -* Improve `add_subcommand` when throwing an exception [#204][] -* Better metadata for Conan package [#202][] +- Fix for Windows style option parsing [#201][] +- Improve `add_subcommand` when throwing an exception [#204][] +- Better metadata for Conan package [#202][] [#201]: https://github.com/CLIUtils/CLI11/pull/201 [#202]: https://github.com/CLIUtils/CLI11/pull/202 @@ -374,64 +374,64 @@ This version provides a quick patch for a (correct) warning from GCC 8 for the w Added a new formatting system [#109][]. You can now set the formatter on Apps. This has also simplified the internals of Apps and Options a bit by separating most formatting code. -* Added `CLI::Formatter` and `formatter` slot for apps, inherited. -* `FormatterBase` is the minimum required. -* `FormatterLambda` provides for the easy addition of an arbitrary function. -* Added `help_all` support (not added by default). +- Added `CLI::Formatter` and `formatter` slot for apps, inherited. +- `FormatterBase` is the minimum required. +- `FormatterLambda` provides for the easy addition of an arbitrary function. +- Added `help_all` support (not added by default). Changes to the help system (most normal users will not notice this): -* Renamed `single_name` to `get_name(false, false)` (the default). -* The old `get_name()` is now `get_name(false, true)`. -* The old `get_pname()` is now `get_name(true, false)`. -* Removed `help_*` functions. -* Protected function `_has_help_positional` removed. -* `format_help` can now be chained. -* Added getters for the missing parts of options (help no longer uses any private parts). -* Help flags now use new `short_circuit` property to simplify parsing. [#121][] +- Renamed `single_name` to `get_name(false, false)` (the default). +- The old `get_name()` is now `get_name(false, true)`. +- The old `get_pname()` is now `get_name(true, false)`. +- Removed `help_*` functions. +- Protected function `_has_help_positional` removed. +- `format_help` can now be chained. +- Added getters for the missing parts of options (help no longer uses any private parts). +- Help flags now use new `short_circuit` property to simplify parsing. [#121][] New for Config file reading and writing [#121][]: -* Overridable, bidirectional Config. -* ConfigINI provided and used by default. -* Renamed ini to config in many places. -* Has `config_formatter()` and `get_config_formatter()`. -* Dropped prefix argument from `config_to_str`. -* Added `ConfigItem`. -* Added an example of a custom config format using [nlohmann/json][]. [#138][] +- Overridable, bidirectional Config. +- ConfigINI provided and used by default. +- Renamed ini to config in many places. +- Has `config_formatter()` and `get_config_formatter()`. +- Dropped prefix argument from `config_to_str`. +- Added `ConfigItem`. +- Added an example of a custom config format using [nlohmann/json][]. [#138][] Validators are now much more powerful [#118][], all built in validators upgraded to the new form: -* A subclass of `CLI::Validator` is now also accepted. -* They now can set the type name to things like `PATH` and `INT in [1-4]`. -* Validators can be combined with `&` and `|`. -* Old form simple validators are still accepted. +- A subclass of `CLI::Validator` is now also accepted. +- They now can set the type name to things like `PATH` and `INT in [1-4]`. +- Validators can be combined with `&` and `|`. +- Old form simple validators are still accepted. Other changes: -* Fixing `parse(args)`'s `args` setting and ordering after parse. [#141][] -* Replaced `set_custom_option` with `type_name` and `type_size` instead of `set_custom_option`. Methods return `this`. [#136][] -* Dropped `set_` on Option's `type_name`, `default_str`, and `default_val`. [#136][] -* Removed `set_` from App's `failure_message`, `footer`, `callback`, and `name`. [#136][] -* Fixed support `N<-1` for `type_size`. [#140][] -* Added `->each()` to make adding custom callbacks easier. [#126][] -* Allow empty options `add_option("-n",{})` to be edited later with `each` [#142][] -* Added filter argument to `get_subcommands`, `get_options`; use empty filter `{}` to avoid filtering. -* Added `get_groups()` to get groups. -* Better support for manual options with `get_option`, `set_results`, and `empty`. [#119][] -* `lname` and `sname` have getters, added `const get_parent`. [#120][] -* Using `add_set` will now capture L-values for sets, allowing further modification. [#113][] -* Dropped duplicate way to run `get_type_name` (`get_typeval`). -* Removed `requires` in favor of `needs` (deprecated in last version). [#112][] -* Const added to argv. [#126][] +- Fixing `parse(args)`'s `args` setting and ordering after parse. [#141][] +- Replaced `set_custom_option` with `type_name` and `type_size` instead of `set_custom_option`. Methods return `this`. [#136][] +- Dropped `set_` on Option's `type_name`, `default_str`, and `default_val`. [#136][] +- Removed `set_` from App's `failure_message`, `footer`, `callback`, and `name`. [#136][] +- Fixed support `N<-1` for `type_size`. [#140][] +- Added `->each()` to make adding custom callbacks easier. [#126][] +- Allow empty options `add_option("-n",{})` to be edited later with `each` [#142][] +- Added filter argument to `get_subcommands`, `get_options`; use empty filter `{}` to avoid filtering. +- Added `get_groups()` to get groups. +- Better support for manual options with `get_option`, `set_results`, and `empty`. [#119][] +- `lname` and `sname` have getters, added `const get_parent`. [#120][] +- Using `add_set` will now capture L-values for sets, allowing further modification. [#113][] +- Dropped duplicate way to run `get_type_name` (`get_typeval`). +- Removed `requires` in favor of `needs` (deprecated in last version). [#112][] +- Const added to argv. [#126][] Backend and testing changes: -* Internally, `type_name` is now a lambda function; for sets, this reads the set live. [#116][] -* Cleaner tests without `app.reset()` (and `reset` is now `clear`). [#141][] -* Better CMake policy handling. [#110][] -* Includes are properly sorted. [#120][] -* Testing (only) now uses submodules. [#111][] +- Internally, `type_name` is now a lambda function; for sets, this reads the set live. [#116][] +- Cleaner tests without `app.reset()` (and `reset` is now `clear`). [#141][] +- Better CMake policy handling. [#110][] +- Includes are properly sorted. [#120][] +- Testing (only) now uses submodules. [#111][] [#109]: https://github.com/CLIUtils/CLI11/pull/109 [#110]: https://github.com/CLIUtils/CLI11/pull/110 @@ -449,7 +449,6 @@ Backend and testing changes: [#140]: https://github.com/CLIUtils/CLI11/pull/140 [#141]: https://github.com/CLIUtils/CLI11/pull/141 [#142]: https://github.com/CLIUtils/CLI11/pull/142 - [nlohmann/json]: https://github.com/nlohmann/json ### Version 1.6.1: Platform fixes @@ -458,9 +457,9 @@ This version provides a few fixes for special cases, such as mixing with `Window for systems like Hunter. The one new feature is the ability to produce "branded" single file output for providing custom namespaces or custom macro names. -* Added fix and test for including Windows.h [#145][] -* No longer build single file by default if main project, supports systems stuck on Python 2.6 [#149][], [#151][] -* Branding support for single file output [#150][] +- Added fix and test for including Windows.h [#145][] +- No longer build single file by default if main project, supports systems stuck on Python 2.6 [#149][], [#151][] +- Branding support for single file output [#150][] [#145]: https://github.com/CLIUtils/CLI11/pull/145 [#149]: https://github.com/CLIUtils/CLI11/pull/149 @@ -471,17 +470,17 @@ providing custom namespaces or custom macro names. This version fixes some formatting bugs with help-all. It also adds fixes for several warnings, including an experimental optional error on Clang 7. Several smaller fixes. -* Fixed help-all formatting [#163][] - * Printing help-all on nested command now fixed (App) - * Missing space after help-all restored (Default formatter) - * More detail printed on help all (Default formatter) - * Help-all subcommands get indented with inner blank lines removed (Default formatter) - * `detail::find_and_replace` added to utilities -* Fixed CMake install as subproject with `CLI11_INSTALL` flag. [#156][] -* Fixed warning about local variable hiding class member with MSVC [#157][] -* Fixed compile error with default settings on Clang 7 and libc++ [#158][] -* Fixed special case of `--help` on subcommands (general fix planned for 1.7) [#168][] -* Removing an option with links [#179][] +- Fixed help-all formatting [#163][] + - Printing help-all on nested command now fixed (App) + - Missing space after help-all restored (Default formatter) + - More detail printed on help all (Default formatter) + - Help-all subcommands get indented with inner blank lines removed (Default formatter) + - `detail::find_and_replace` added to utilities +- Fixed CMake install as subproject with `CLI11_INSTALL` flag. [#156][] +- Fixed warning about local variable hiding class member with MSVC [#157][] +- Fixed compile error with default settings on Clang 7 and libc++ [#158][] +- Fixed special case of `--help` on subcommands (general fix planned for 1.7) [#168][] +- Removing an option with links [#179][] [#156]: https://github.com/CLIUtils/CLI11/issues/156 [#157]: https://github.com/CLIUtils/CLI11/issues/157 @@ -496,24 +495,24 @@ This version introduced support for optionals, along with clarification and exam Note: This is the final release with `requires`, please switch to `needs`. -* Fix unlimited short options eating two values before checking for positionals when no space present [#90][] -* Symmetric exclude text when excluding options, exclude can be called multiple times [#64][] -* Support for `std::optional`, `std::experimental::optional`, and `boost::optional` added if `__has_include` is supported [#95][] -* All macros/CMake variables now start with `CLI11_` instead of just `CLI_` [#95][] -* The internal stream was not being cleared before use in some cases. Fixed. [#95][] -* Using an enum now requires explicit conversion overload [#97][] -* The separator `--` now is removed when it ends unlimited arguments [#100][] +- Fix unlimited short options eating two values before checking for positionals when no space present [#90][] +- Symmetric exclude text when excluding options, exclude can be called multiple times [#64][] +- Support for `std::optional`, `std::experimental::optional`, and `boost::optional` added if `__has_include` is supported [#95][] +- All macros/CMake variables now start with `CLI11_` instead of just `CLI_` [#95][] +- The internal stream was not being cleared before use in some cases. Fixed. [#95][] +- Using an enum now requires explicit conversion overload [#97][] +- The separator `--` now is removed when it ends unlimited arguments [#100][] Other, non-user facing changes: -* Added `Macros.hpp` with better C++ mode discovery [#95][] -* Deprecated macros added for all platforms -* C++17 is now tested on supported platforms [#95][] -* Informational printout now added to CTest [#95][] -* Better single file generation [#95][] -* Added support for GTest on MSVC 2017 (but not in C++17 mode, will need next version of GTest) -* Types now have a specific size, separate from the expected number - cleaner and more powerful internally [#92][] -* Examples now run as part of testing [#99][] +- Added `Macros.hpp` with better C++ mode discovery [#95][] +- Deprecated macros added for all platforms +- C++17 is now tested on supported platforms [#95][] +- Informational printout now added to CTest [#95][] +- Better single file generation [#95][] +- Added support for GTest on MSVC 2017 (but not in C++17 mode, will need next version of GTest) +- Types now have a specific size, separate from the expected number - cleaner and more powerful internally [#92][] +- Examples now run as part of testing [#99][] [#64]: https://github.com/CLIUtils/CLI11/issues/64 [#90]: https://github.com/CLIUtils/CLI11/issues/90 @@ -527,13 +526,13 @@ Other, non-user facing changes: This patch release adds better access to the App programmatically, to assist with writing custom converters to other formats. It also improves the help output, and uses a new feature in CLI11 1.5 to fix an old "quirk" in the way unlimited options and positionals interact. -* Make mixing unlimited positionals and options more intuitive [#102][] -* Add missing getters `get_options` and `get_description` to App [#105][] -* The app name now can be set, and will override the auto name if present [#105][] -* Add `(REQUIRED)` for required options [#104][] -* Print simple name for Needs/Excludes [#104][] -* Use Needs instead of Requires in help print [#104][] -* Groups now are listed in the original definition order [#106][] +- Make mixing unlimited positionals and options more intuitive [#102][] +- Add missing getters `get_options` and `get_description` to App [#105][] +- The app name now can be set, and will override the auto name if present [#105][] +- Add `(REQUIRED)` for required options [#104][] +- Print simple name for Needs/Excludes [#104][] +- Use Needs instead of Requires in help print [#104][] +- Groups now are listed in the original definition order [#106][] [#102]: https://github.com/CLIUtils/CLI11/issues/102 [#104]: https://github.com/CLIUtils/CLI11/pull/104 @@ -556,21 +555,20 @@ This version fixes the optional search in the single file version; some macros w This version adds lots of smaller fixes and additions after the refactor in version 1.3. More ways to download and use CLI11 in CMake have been added. INI files have improved support. -* Lexical cast is now more strict than before [#68][] and fails on overflow [#84][] -* Added `get_parent()` to access the parent from a subcommand -* Added `ExistingPath` validator [#73][] -* `app.allow_ini_extras()` added to allow extras in INI files [#70][] -* Multiline INI comments now supported -* Descriptions can now be written with `config_to_str` [#66][] -* Double printing of error message fixed [#77][] -* Renamed `requires` to `needs` to avoid C++20 keyword [#75][], [#82][] -* MakeSingleHeader now works if outside of git [#78][] -* Adding install support for CMake [#79][], improved support for `find_package` [#83][], [#84][] -* Added support for Conan.io [#83][] +- Lexical cast is now more strict than before [#68][] and fails on overflow [#84][] +- Added `get_parent()` to access the parent from a subcommand +- Added `ExistingPath` validator [#73][] +- `app.allow_ini_extras()` added to allow extras in INI files [#70][] +- Multiline INI comments now supported +- Descriptions can now be written with `config_to_str` [#66][] +- Double printing of error message fixed [#77][] +- Renamed `requires` to `needs` to avoid C++20 keyword [#75][], [#82][] +- MakeSingleHeader now works if outside of git [#78][] +- Adding install support for CMake [#79][], improved support for `find_package` [#83][], [#84][] +- Added support for Conan.io [#83][] [#70]: https://github.com/CLIUtils/CLI11/issues/70 [#75]: https://github.com/CLIUtils/CLI11/issues/75 - [#84]: https://github.com/CLIUtils/CLI11/pull/84 [#83]: https://github.com/CLIUtils/CLI11/pull/83 [#82]: https://github.com/CLIUtils/CLI11/pull/82 @@ -588,156 +586,156 @@ features only working on the main App have been addressed, and extra arguments h of defaults makes configuring CLI11 much easier without having to subclass. Policies add new ways to handle multiple arguments to match your favorite CLI programs. Error messages and help messages are better and more flexible. Several bugs and odd behaviors in the parser have been fixed. -* Added a version macro, `CLI11_VERSION`, along with `*_MAJOR`, `*_MINOR`, and `*_PATCH`, for programmatic access to the version. -* Reworked the way defaults are set and inherited; explicit control given to user with `->option_defaults()` [#48](https://github.com/CLIUtils/CLI11/pull/48) -* Hidden options now are based on an empty group name, instead of special "hidden" keyword [#48](https://github.com/CLIUtils/CLI11/pull/48) -* `parse` no longer returns (so `CLI11_PARSE` is always usable) [#37](https://github.com/CLIUtils/CLI11/pull/37) -* Added `remaining()` and `remaining_size()` [#37](https://github.com/CLIUtils/CLI11/pull/37) -* `allow_extras` and `prefix_command` are now valid on subcommands [#37](https://github.com/CLIUtils/CLI11/pull/37) -* Added `take_last` to only take last value passed [#40](https://github.com/CLIUtils/CLI11/pull/40) -* Added `multi_option_policy` and shortcuts to provide more control than just a take last policy [#59](https://github.com/CLIUtils/CLI11/pull/59) -* More detailed error messages in a few cases [#41](https://github.com/CLIUtils/CLI11/pull/41) -* Footers can be added to help [#42](https://github.com/CLIUtils/CLI11/pull/42) -* Help flags are easier to customize [#43](https://github.com/CLIUtils/CLI11/pull/43) -* Subcommand now support groups [#46](https://github.com/CLIUtils/CLI11/pull/46) -* `CLI::RuntimeError` added, for easy exit with error codes [#45](https://github.com/CLIUtils/CLI11/pull/45) -* The clang-format script is now no longer "hidden" [#48](https://github.com/CLIUtils/CLI11/pull/48) -* The order is now preserved for subcommands (list and callbacks) [#49](https://github.com/CLIUtils/CLI11/pull/49) -* Tests now run individually, utilizing CMake 3.10 additions if possible [#50](https://github.com/CLIUtils/CLI11/pull/50) -* Failure messages are now customizable, with a shorter default [#52](https://github.com/CLIUtils/CLI11/pull/52) -* Some improvements to error codes [#53](https://github.com/CLIUtils/CLI11/pull/53) -* `require_subcommand` now offers a two-argument form and negative values on the one-argument form are more useful [#51](https://github.com/CLIUtils/CLI11/pull/51) -* Subcommands no longer match after the max required number is obtained [#51](https://github.com/CLIUtils/CLI11/pull/51) -* Unlimited options no longer prioritize over remaining/unlimited positionals [#51](https://github.com/CLIUtils/CLI11/pull/51) -* Added `->transform` which modifies the string parsed [#54](https://github.com/CLIUtils/CLI11/pull/54) -* Changed of API in validators to `void(std::string &)` (const for users), throwing providing nicer errors [#54](https://github.com/CLIUtils/CLI11/pull/54) -* Added `CLI::ArgumentMismatch` [#56](https://github.com/CLIUtils/CLI11/pull/56) and fixed missing failure if one arg expected [#55](https://github.com/CLIUtils/CLI11/issues/55) -* Support for minimum unlimited expected arguments [#56](https://github.com/CLIUtils/CLI11/pull/56) -* Single internal arg parse function [#56](https://github.com/CLIUtils/CLI11/pull/56) -* Allow options to be disabled from INI file, rename `add_config` to `set_config` [#60](https://github.com/CLIUtils/CLI11/pull/60) +- Added a version macro, `CLI11_VERSION`, along with `*_MAJOR`, `*_MINOR`, and `*_PATCH`, for programmatic access to the version. +- Reworked the way defaults are set and inherited; explicit control given to user with `->option_defaults()` [#48](https://github.com/CLIUtils/CLI11/pull/48) +- Hidden options now are based on an empty group name, instead of special "hidden" keyword [#48](https://github.com/CLIUtils/CLI11/pull/48) +- `parse` no longer returns (so `CLI11_PARSE` is always usable) [#37](https://github.com/CLIUtils/CLI11/pull/37) +- Added `remaining()` and `remaining_size()` [#37](https://github.com/CLIUtils/CLI11/pull/37) +- `allow_extras` and `prefix_command` are now valid on subcommands [#37](https://github.com/CLIUtils/CLI11/pull/37) +- Added `take_last` to only take last value passed [#40](https://github.com/CLIUtils/CLI11/pull/40) +- Added `multi_option_policy` and shortcuts to provide more control than just a take last policy [#59](https://github.com/CLIUtils/CLI11/pull/59) +- More detailed error messages in a few cases [#41](https://github.com/CLIUtils/CLI11/pull/41) +- Footers can be added to help [#42](https://github.com/CLIUtils/CLI11/pull/42) +- Help flags are easier to customize [#43](https://github.com/CLIUtils/CLI11/pull/43) +- Subcommand now support groups [#46](https://github.com/CLIUtils/CLI11/pull/46) +- `CLI::RuntimeError` added, for easy exit with error codes [#45](https://github.com/CLIUtils/CLI11/pull/45) +- The clang-format script is now no longer "hidden" [#48](https://github.com/CLIUtils/CLI11/pull/48) +- The order is now preserved for subcommands (list and callbacks) [#49](https://github.com/CLIUtils/CLI11/pull/49) +- Tests now run individually, utilizing CMake 3.10 additions if possible [#50](https://github.com/CLIUtils/CLI11/pull/50) +- Failure messages are now customizable, with a shorter default [#52](https://github.com/CLIUtils/CLI11/pull/52) +- Some improvements to error codes [#53](https://github.com/CLIUtils/CLI11/pull/53) +- `require_subcommand` now offers a two-argument form and negative values on the one-argument form are more useful [#51](https://github.com/CLIUtils/CLI11/pull/51) +- Subcommands no longer match after the max required number is obtained [#51](https://github.com/CLIUtils/CLI11/pull/51) +- Unlimited options no longer prioritize over remaining/unlimited positionals [#51](https://github.com/CLIUtils/CLI11/pull/51) +- Added `->transform` which modifies the string parsed [#54](https://github.com/CLIUtils/CLI11/pull/54) +- Changed of API in validators to `void(std::string &)` (const for users), throwing providing nicer errors [#54](https://github.com/CLIUtils/CLI11/pull/54) +- Added `CLI::ArgumentMismatch` [#56](https://github.com/CLIUtils/CLI11/pull/56) and fixed missing failure if one arg expected [#55](https://github.com/CLIUtils/CLI11/issues/55) +- Support for minimum unlimited expected arguments [#56](https://github.com/CLIUtils/CLI11/pull/56) +- Single internal arg parse function [#56](https://github.com/CLIUtils/CLI11/pull/56) +- Allow options to be disabled from INI file, rename `add_config` to `set_config` [#60](https://github.com/CLIUtils/CLI11/pull/60) > ### Converting from CLI11 1.2 > -> * `app.parse` no longer returns a vector. Instead, use `app.remaining(true)`. -> * `"hidden"` is no longer a special group name, instead use `""` -> * Validators API has changed to return an error string; use `.empty()` to get the old bool back -> * Use `.set_help_flag` instead of accessing the help pointer directly (discouraged, but not removed yet) -> * `add_config` has been renamed to `set_config` -> * Errors thrown in some cases are slightly more specific +> - `app.parse` no longer returns a vector. Instead, use `app.remaining(true)`. +> - `"hidden"` is no longer a special group name, instead use `""` +> - Validators API has changed to return an error string; use `.empty()` to get the old bool back +> - Use `.set_help_flag` instead of accessing the help pointer directly (discouraged, but not removed yet) +> - `add_config` has been renamed to `set_config` +> - Errors thrown in some cases are slightly more specific ## Version 1.2: Stability This release focuses on making CLI11 behave properly in corner cases, and with config files on the command line. This includes fixes for a variety of reported issues. A few features were added to make life easier, as well; such as a new flag callback and a macro for the parse command. -* Added functional form of flag [#33](https://github.com/CLIUtils/CLI11/pull/33), automatic on C++14 -* Fixed Config file search if passed on command line [#30](https://github.com/CLIUtils/CLI11/issues/30) -* Added `CLI11_PARSE(app, argc, argv)` macro for simple parse commands (does not support returning arg) -* The name string can now contain spaces around commas [#29](https://github.com/CLIUtils/CLI11/pull/29) -* `set_default_str` now only sets string, and `set_default_val` will evaluate the default string given [#26](https://github.com/CLIUtils/CLI11/issues/26) -* Required positionals now take priority over subcommands [#23](https://github.com/CLIUtils/CLI11/issues/23) -* Extra requirements enforced by Travis +- Added functional form of flag [#33](https://github.com/CLIUtils/CLI11/pull/33), automatic on C++14 +- Fixed Config file search if passed on command line [#30](https://github.com/CLIUtils/CLI11/issues/30) +- Added `CLI11_PARSE(app, argc, argv)` macro for simple parse commands (does not support returning arg) +- The name string can now contain spaces around commas [#29](https://github.com/CLIUtils/CLI11/pull/29) +- `set_default_str` now only sets string, and `set_default_val` will evaluate the default string given [#26](https://github.com/CLIUtils/CLI11/issues/26) +- Required positionals now take priority over subcommands [#23](https://github.com/CLIUtils/CLI11/issues/23) +- Extra requirements enforced by Travis ## Version 1.1: Feedback 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. -* Added simple support for enumerations, allow non-printable objects [#12](https://github.com/CLIUtils/CLI11/issues/12) -* Added `app.parse_order()` with original parse order ([#13](https://github.com/CLIUtils/CLI11/issues/13), [#16](https://github.com/CLIUtils/CLI11/pull/16)) -* 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)) -* Removed Windows warning ([#10](https://github.com/CLIUtils/CLI11/issues/10), [#20](https://github.com/CLIUtils/CLI11/pull/20)) -* 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)) +- Added simple support for enumerations, allow non-printable objects [#12](https://github.com/CLIUtils/CLI11/issues/12) +- Added `app.parse_order()` with original parse order ([#13](https://github.com/CLIUtils/CLI11/issues/13), [#16](https://github.com/CLIUtils/CLI11/pull/16)) +- 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)) +- Removed Windows warning ([#10](https://github.com/CLIUtils/CLI11/issues/10), [#20](https://github.com/CLIUtils/CLI11/pull/20)) +- 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)) ## Version 1.0: Official release This is the first stable release for CLI11. Future releases will try to remain backward compatible and will follow semantic versioning if possible. There were a few small changes since version 0.9: -* Cleanup using `clang-tidy` and `clang-format` -* Small improvements to Timers, easier to subclass Error -* Move to 3-Clause BSD license +- Cleanup using `clang-tidy` and `clang-format` +- Small improvements to Timers, easier to subclass Error +- Move to 3-Clause BSD license ## Version 0.9: Polish This release focused on cleaning up the most exotic compiler warnings, fixing a few oddities of the config parser, and added a more natural method to check subcommands. -* Better CMake named target (CLI11) -* More warnings added, fixed -* Ini output now includes `=false` when `default_also` is true -* Ini no longer lists the help pointer -* Added test for inclusion in multiple files and linking, fixed issues (rarely needed for CLI, but nice for tools) -* Support for complex numbers -* Subcommands now test true/false directly or with `->parsed()`, cleaner parse +- Better CMake named target (CLI11) +- More warnings added, fixed +- Ini output now includes `=false` when `default_also` is true +- Ini no longer lists the help pointer +- Added test for inclusion in multiple files and linking, fixed issues (rarely needed for CLI, but nice for tools) +- Support for complex numbers +- Subcommands now test true/false directly or with `->parsed()`, cleaner parse ## Version 0.8: CLIUtils This release moved the repository to the CLIUtils main organization. -* Moved to CLIUtils on GitHub -* Fixed docs build and a few links +- Moved to CLIUtils on GitHub +- Fixed docs build and a few links ## Version 0.7: Code coverage 100% Lots of small bugs fixed when adding code coverage, better in edge cases. Much more powerful ini support. -* Allow comments in ini files (lines starting with `;`) -* Ini files support flags, vectors, subcommands -* Added CodeCov code coverage reports -* Lots of small bugfixes related to adding tests to increase coverage to 100% -* Error handling now uses scoped enum in errors -* Reparsing rules changed a little to accommodate Ini files. Callbacks are now called when parsing INI, and reset any time results are added. -* Adding extra utilities in full version only, `Timer` (not needed for parsing, but useful for general CLI applications). -* Better support for custom `add_options` like functions. +- Allow comments in ini files (lines starting with `;`) +- Ini files support flags, vectors, subcommands +- Added CodeCov code coverage reports +- Lots of small bugfixes related to adding tests to increase coverage to 100% +- Error handling now uses scoped enum in errors +- Reparsing rules changed a little to accommodate Ini files. Callbacks are now called when parsing INI, and reset any time results are added. +- Adding extra utilities in full version only, `Timer` (not needed for parsing, but useful for general CLI applications). +- Better support for custom `add_options` like functions. ## Version 0.6: Cleanup Lots of cleanup and docs additions made it into this release. Parsing is simpler and more robust; fall through option added and works as expected; much more consistent variable names internally. -* Simplified parsing to use `vector` only -* Fixed fallthrough, made it optional as well (default: off): `.fallthrough()`. -* Added string versions of `->requires()` and `->excludes()` for consistency. -* Renamed protected members for internal consistency, grouped docs. -* Added the ability to add a number to `.require_subcommand()`. +- Simplified parsing to use `vector` only +- Fixed fallthrough, made it optional as well (default: off): `.fallthrough()`. +- Added string versions of `->requires()` and `->excludes()` for consistency. +- Renamed protected members for internal consistency, grouped docs. +- Added the ability to add a number to `.require_subcommand()`. ## Version 0.5: Windows support -* Allow `Hidden` options. -* Throw `OptionAlreadyAdded` errors for matching subcommands or options, with ignore-case included, tests -* `->ignore_case()` added to subcommands, options, and `add_set_ignore_case`. Subcommands inherit setting from parent App on creation. -* 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. -* Added `.allow_extras()` to disable error on failure. Parse returns a vector of leftover options. Renamed error to `ExtrasError`, and now triggers on extra options too. -* Added `require_subcommand` to `App`, to simplify forcing subcommands. Do **not** do `add_subcommand()->require_subcommand`, since that is the subcommand, not the main `App`. -* Added printout of ini file text given parsed options, skips flags. -* Support for quotes and spaces in ini files -* Fixes to allow support for Windows (added Appveyor) (Uses `-`, not `/` syntax) +- Allow `Hidden` options. +- Throw `OptionAlreadyAdded` errors for matching subcommands or options, with ignore-case included, tests +- `->ignore_case()` added to subcommands, options, and `add_set_ignore_case`. Subcommands inherit setting from parent App on creation. +- 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. +- Added `.allow_extras()` to disable error on failure. Parse returns a vector of leftover options. Renamed error to `ExtrasError`, and now triggers on extra options too. +- Added `require_subcommand` to `App`, to simplify forcing subcommands. Do **not** do `add_subcommand()->require_subcommand`, since that is the subcommand, not the main `App`. +- Added printout of ini file text given parsed options, skips flags. +- Support for quotes and spaces in ini files +- Fixes to allow support for Windows (added Appveyor) (Uses `-`, not `/` syntax) ## Version 0.4: Ini support -* Updates to help print -* Removed `run`, please use `parse` unless you subclass and add it -* Supports ini files mixed with command line, tested -* Added Range for further Plumbum compatibility -* Added function to print out ini file +- Updates to help print +- Removed `run`, please use `parse` unless you subclass and add it +- Supports ini files mixed with command line, tested +- Added Range for further Plumbum compatibility +- Added function to print out ini file ## Version 0.3: Plumbum compatibility -* Added `->requires`, `->excludes`, and `->envname` from [Plumbum](http://plumbum.readthedocs.io/en/latest/) -* Supports `->mandatory` from Plumbum -* More tests for help strings, improvements in formatting -* Support type and set syntax in positionals help strings -* Added help groups, with `->group("name")` syntax -* Added initial support for ini file reading with `add_config` option. -* Supports GCC 4.7 again -* Clang 3.5 now required for tests due to googlemock usage, 3.4 should still work otherwise -* Changes `setup` for an explicit help bool in constructor/`add_subcommand` +- Added `->requires`, `->excludes`, and `->envname` from [Plumbum](http://plumbum.readthedocs.io/en/latest/) +- Supports `->mandatory` from Plumbum +- More tests for help strings, improvements in formatting +- Support type and set syntax in positionals help strings +- Added help groups, with `->group("name")` syntax +- Added initial support for ini file reading with `add_config` option. +- Supports GCC 4.7 again +- Clang 3.5 now required for tests due to googlemock usage, 3.4 should still work otherwise +- Changes `setup` for an explicit help bool in constructor/`add_subcommand` ## Version 0.2: Leaner and meaner -* Moved to simpler syntax, where `Option` pointers are returned and operated on -* Removed `make_` style options -* Simplified Validators, now only requires `->check(function)` -* Removed Combiners -* Fixed pointers to Options, stored in `unique_ptr` now -* Added `Option_p` and `App_p`, mostly for internal use -* Startup sequence, including help flag, can be modified by subclasses +- Moved to simpler syntax, where `Option` pointers are returned and operated on +- Removed `make_` style options +- Simplified Validators, now only requires `->check(function)` +- Removed Combiners +- Fixed pointers to Options, stored in `unique_ptr` now +- Added `Option_p` and `App_p`, mostly for internal use +- Startup sequence, including help flag, can be modified by subclasses ## Version 0.1: First release diff --git a/README.md b/README.md index 494bc46c..c65048b6 100644 --- a/README.md +++ b/README.md @@ -25,38 +25,38 @@ CLI11 is a command line parser for C++11 and beyond that provides a rich feature ## Table of Contents -* [Background](#background) - * [Introduction](#introduction) - * [Why write another CLI parser?](#why-write-another-cli-parser) - * [Other parsers](#other-parsers) - * [Features not supported by this library](#features-not-supported-by-this-library) -* [Install](#install) -* [Usage](#usage) - * [Adding options](#adding-options) - * [Option types](#option-types) - * [Example](#example) - * [Option options](#option-options) - * [Validators](#validators) - * [Transforming Validators](#transforming-validators) - * [Validator operations](#validator-operations) - * [Custom Validators](#custom-validators) - * [Querying Validators](#querying-validators) - * [Getting Results](#getting-results) - * [Subcommands](#subcommands) - * [Subcommand options](#subcommand-options) - * [Option groups](#option-groups) - * [Callbacks](#callbacks) - * [Configuration file](#configuration-file) - * [Inheriting defaults](#inheriting-defaults) - * [Formatting](#formatting) - * [Subclassing](#subclassing) - * [How it works](#how-it-works) - * [Utilities](#utilities) - * [Other libraries](#other-libraries) -* [API](#api) -* [Examples](#Examples) -* [Contribute](#contribute) -* [License](#license) +- [Background](#background) + - [Introduction](#introduction) + - [Why write another CLI parser?](#why-write-another-cli-parser) + - [Other parsers](#other-parsers) + - [Features not supported by this library](#features-not-supported-by-this-library) +- [Install](#install) +- [Usage](#usage) + - [Adding options](#adding-options) + - [Option types](#option-types) + - [Example](#example) + - [Option options](#option-options) + - [Validators](#validators) + - [Transforming Validators](#transforming-validators) + - [Validator operations](#validator-operations) + - [Custom Validators](#custom-validators) + - [Querying Validators](#querying-validators) + - [Getting Results](#getting-results) + - [Subcommands](#subcommands) + - [Subcommand options](#subcommand-options) + - [Option groups](#option-groups) + - [Callbacks](#callbacks) + - [Configuration file](#configuration-file) + - [Inheriting defaults](#inheriting-defaults) + - [Formatting](#formatting) + - [Subclassing](#subclassing) + - [How it works](#how-it-works) + - [Utilities](#utilities) + - [Other libraries](#other-libraries) +- [API](#api) +- [Examples](#Examples) +- [Contribute](#contribute) +- [License](#license) Features that were added in the last released minor version are marked with "🆕". Features only available in main are marked with "🚧". @@ -74,21 +74,21 @@ You can be notified when new releases are made by subscribing to