mirror of
https://github.com/KeqingMoe/argparse.git
synced 2025-07-04 07:04:39 +00:00
Merge branch 'master' of github.com:p-ranav/argparse
This commit is contained in:
commit
8df0a878ac
31
.travis.yml
Normal file
31
.travis.yml
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- os: linux
|
||||||
|
dist: bionic
|
||||||
|
language: cpp
|
||||||
|
compiler: gcc
|
||||||
|
- os: osx
|
||||||
|
osx_image: xcode10.2
|
||||||
|
language: cpp
|
||||||
|
compiler: clang
|
||||||
|
- os: windows
|
||||||
|
language: bash
|
||||||
|
env: CXX=cl.exe
|
||||||
|
install:
|
||||||
|
- |
|
||||||
|
if [[ $TRAVIS_OS_NAME == 'windows' ]]; then
|
||||||
|
choco install ninja cmake
|
||||||
|
elif [[ $TRAVIS_OS_NAME == 'osx' ]]; then
|
||||||
|
export PATH=~/Library/Python/3.7/bin:$PATH
|
||||||
|
pip3 install --user ninja cmake
|
||||||
|
else
|
||||||
|
pip install --user ninja cmake
|
||||||
|
fi
|
||||||
|
script:
|
||||||
|
- |
|
||||||
|
if [[ $TRAVIS_OS_NAME == 'windows' ]]; then
|
||||||
|
cmd.exe /C '"C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\Auxiliary\Build\vcvarsall.bat" amd64 && cmake -Bbuild -G Ninja -DCMAKE_BUILD_TYPE=Release -DARGPARSE_BUILD_TESTS=ON && ninja -C build'
|
||||||
|
else
|
||||||
|
cmake -Bbuild -G Ninja -DCMAKE_BUILD_TYPE=Release -DARGPARSE_BUILD_TESTS=ON && ninja -C build
|
||||||
|
fi
|
||||||
|
- ./build/test/tests
|
@ -2,6 +2,14 @@
|
|||||||
<img height="100" src="https://i.imgur.com/oDXeMUQ.png" alt="pprint"/>
|
<img height="100" src="https://i.imgur.com/oDXeMUQ.png" alt="pprint"/>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img src="https://travis-ci.org/p-ranav/argparse.svg?branch=master" alt="travis"/>
|
||||||
|
<a href="https://github.com/p-ranav/argparse/blob/master/LICENSE">
|
||||||
|
<img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="license"/>
|
||||||
|
</a>
|
||||||
|
<img src="https://img.shields.io/badge/version-1.8-blue.svg?cacheSeconds=2592000" alt="version"/>
|
||||||
|
</p>
|
||||||
|
|
||||||
## Highlights
|
## Highlights
|
||||||
|
|
||||||
* Single header file
|
* Single header file
|
||||||
|
@ -102,6 +102,11 @@ public:
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Argument& required() {
|
||||||
|
mIsRequired = true;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
Argument& implicit_value(std::any aImplicitValue) {
|
Argument& implicit_value(std::any aImplicitValue) {
|
||||||
mImplicitValue = std::move(aImplicitValue);
|
mImplicitValue = std::move(aImplicitValue);
|
||||||
mNumArgs = 0;
|
mNumArgs = 0;
|
||||||
@ -152,19 +157,29 @@ public:
|
|||||||
if (mIsOptional) {
|
if (mIsOptional) {
|
||||||
if (mIsUsed && mValues.size() != mNumArgs && !mDefaultValue.has_value()) {
|
if (mIsUsed && mValues.size() != mNumArgs && !mDefaultValue.has_value()) {
|
||||||
std::stringstream stream;
|
std::stringstream stream;
|
||||||
stream << "error: " << mUsedName << ": expected " << mNumArgs << " argument(s). "
|
stream << "error: " << mUsedName << ": expected " << mNumArgs << " argument(s). "
|
||||||
<< mValues.size() << " provided.\n" << std::endl;
|
<< mValues.size() << " provided.";
|
||||||
throw std::runtime_error(stream.str());
|
throw std::runtime_error(stream.str());
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// TODO: check if an implicit value was programmed for this argument
|
// TODO: check if an implicit value was programmed for this argument
|
||||||
|
if (!mIsUsed && !mDefaultValue.has_value() && mIsRequired) {
|
||||||
|
std::stringstream stream;
|
||||||
|
stream << "error: " << mNames[0] << ": required.";
|
||||||
|
throw std::runtime_error(stream.str());
|
||||||
|
}
|
||||||
|
if (mIsUsed && mIsRequired && mValues.size() == 0) {
|
||||||
|
std::stringstream stream;
|
||||||
|
stream << "error: " << mUsedName << ": no value provided.";
|
||||||
|
throw std::runtime_error(stream.str());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (mValues.size() != mNumArgs && !mDefaultValue.has_value()) {
|
if (mValues.size() != mNumArgs && !mDefaultValue.has_value()) {
|
||||||
std::stringstream stream;
|
std::stringstream stream;
|
||||||
stream << "error: " << mUsedName << ": expected " << mNumArgs << " argument(s). "
|
stream << "error: " << mUsedName << ": expected " << mNumArgs << " argument(s). "
|
||||||
<< mValues.size() << " provided.\n" << std::endl;
|
<< mValues.size() << " provided.";
|
||||||
throw std::runtime_error(stream.str());
|
throw std::runtime_error(stream.str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -179,7 +194,11 @@ public:
|
|||||||
friend std::ostream& operator<<(std::ostream& stream, const Argument& argument) {
|
friend std::ostream& operator<<(std::ostream& stream, const Argument& argument) {
|
||||||
std::stringstream nameStream;
|
std::stringstream nameStream;
|
||||||
std::copy(std::begin(argument.mNames), std::end(argument.mNames), std::ostream_iterator<std::string>(nameStream, " "));
|
std::copy(std::begin(argument.mNames), std::end(argument.mNames), std::ostream_iterator<std::string>(nameStream, " "));
|
||||||
return stream << nameStream.str() << "\t" << argument.mHelp << "\n";
|
stream << nameStream.str() << "\t" << argument.mHelp;
|
||||||
|
if (argument.mIsRequired)
|
||||||
|
stream << "[Required]";
|
||||||
|
stream << "\n";
|
||||||
|
return stream;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -298,6 +317,7 @@ public:
|
|||||||
std::vector<std::string> mRawValues;
|
std::vector<std::string> mRawValues;
|
||||||
size_t mNumArgs = 1;
|
size_t mNumArgs = 1;
|
||||||
bool mIsOptional = false;
|
bool mIsOptional = false;
|
||||||
|
bool mIsRequired = false;
|
||||||
bool mIsUsed = false; // relevant for optional arguments. True if used by user
|
bool mIsUsed = false; // relevant for optional arguments. True if used by user
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -10,3 +10,4 @@
|
|||||||
#include <test_parent_parsers.hpp>
|
#include <test_parent_parsers.hpp>
|
||||||
#include <test_invalid_arguments.hpp>
|
#include <test_invalid_arguments.hpp>
|
||||||
#include <test_negative_numbers.hpp>
|
#include <test_negative_numbers.hpp>
|
||||||
|
#include <test_required_arguments.hpp>
|
45
test/test_required_arguments.hpp
Normal file
45
test/test_required_arguments.hpp
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <catch.hpp>
|
||||||
|
#include <argparse.hpp>
|
||||||
|
|
||||||
|
TEST_CASE("Parse required arguments which are not set and don't have default value.", "[required_arguments]") {
|
||||||
|
argparse::ArgumentParser program("test");
|
||||||
|
program.add_argument("--output", "-o").required();
|
||||||
|
REQUIRE_THROWS(program.parse_args({ "./main" }));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE("Parse required arguments which are set as empty value and don't have default value.", "[required_arguments]") {
|
||||||
|
argparse::ArgumentParser program("test");
|
||||||
|
program.add_argument("--output", "-o").required();
|
||||||
|
REQUIRE_THROWS(program.parse_args({ "./main", "-o" }));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE("Parse required arguments which are set as some value and don't have default value.", "[required_arguments]") {
|
||||||
|
argparse::ArgumentParser program("test");
|
||||||
|
program.add_argument("--output", "-o").required();
|
||||||
|
program.parse_args({ "./main", "-o", "filename" });
|
||||||
|
REQUIRE(program.get("--output") == "filename");
|
||||||
|
REQUIRE(program.get("-o") == "filename");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE("Parse required arguments which are not set and have default value.", "[required_arguments]") {
|
||||||
|
argparse::ArgumentParser program("test");
|
||||||
|
program.add_argument("--output", "-o").required().default_value(std::string("filename"));
|
||||||
|
program.parse_args({ "./main" });
|
||||||
|
REQUIRE(program.get("--output") == "filename");
|
||||||
|
REQUIRE(program.get("-o") == "filename");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE("Parse required arguments which are set as empty and have default value.", "[required_arguments]") {
|
||||||
|
argparse::ArgumentParser program("test");
|
||||||
|
program.add_argument("--output", "-o").required().default_value(std::string("filename"));
|
||||||
|
REQUIRE_THROWS(program.parse_args({ "./main", "-o" }));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE("Parse required arguments which are set as some value and have default value.", "[required_arguments]") {
|
||||||
|
argparse::ArgumentParser program("test");
|
||||||
|
program.add_argument("--output", "-o").required().default_value(std::string("filename"));
|
||||||
|
program.parse_args({ "./main", "-o", "anotherfile" });
|
||||||
|
REQUIRE(program.get("--output") == "anotherfile");
|
||||||
|
REQUIRE(program.get("-o") == "anotherfile");
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user