From fda4c0681f0ba5fc952552d8da662f912b6f8f9e Mon Sep 17 00:00:00 2001 From: Patrick Elmer Date: Tue, 30 Aug 2022 11:42:27 +0900 Subject: [PATCH] Add tests --- pargs.py | 23 ++-------- tests/test_appname.py | 10 ---- tests/test_functionality.py | 92 +++++++++++++++++++++++++++++++++++++ 3 files changed, 96 insertions(+), 29 deletions(-) delete mode 100644 tests/test_appname.py create mode 100644 tests/test_functionality.py diff --git a/pargs.py b/pargs.py index fe1891c..e9c921d 100644 --- a/pargs.py +++ b/pargs.py @@ -4,9 +4,9 @@ import sys def parse_args(argv=None): """ Returns a tuple of (args, kwargs) from a given list of command line arguments. + Defaults to using `sys.argv`. """ argv = argv if argv else sys.argv - print(argv) args = [] for arg in argv: @@ -24,10 +24,10 @@ def parse_args(argv=None): if len(values): kwargs[key] = values values = [] - key = arg.lstrip('-').replace('-', '_') + key = arg[:2].lstrip('-') + arg[2:].replace('-', '_') if arg.startswith('--'): if '=' in arg: - key, value = arg.split('=') + key, value = key.split('=') values.append(value) kwargs[key] = values else: @@ -35,22 +35,7 @@ def parse_args(argv=None): elif arg.startswith('-'): for k in key: kwargs[k] = True + key = arg[-1] if len(values): kwargs[key] = values return (args, kwargs) - - -if __name__ == '__main__': - args, kwargs = parse_args([ - '/home/pat/Git/pargs/pargs.py', - 'command', - 'positional', - '--flag', - '--optional=value', - 'test', - '--output', - 'filename', - '-flg' - ]) - print(args) - print(kwargs) \ No newline at end of file diff --git a/tests/test_appname.py b/tests/test_appname.py deleted file mode 100644 index 7f7a691..0000000 --- a/tests/test_appname.py +++ /dev/null @@ -1,10 +0,0 @@ -import sys -import pytest -from pargs import parse_args - - -def test_get_appname(): - _input = 'appname command positional --flag --optional=value' - args, kwargs = parse_args(_input.split()) - assert args == ['appname', 'command', 'positional'] - # assert kwargs == {'flag': True, 'optional': 'value'} \ No newline at end of file diff --git a/tests/test_functionality.py b/tests/test_functionality.py new file mode 100644 index 0000000..6acc81d --- /dev/null +++ b/tests/test_functionality.py @@ -0,0 +1,92 @@ +import sys +import pytest +from unittest import mock +from pargs import parse_args + + +def test_no_argv(): + with mock.patch('sys.argv', []): + args, kwargs = parse_args() + assert args == [] + assert kwargs == {} + + +def test_use_sys_argv_by_default(): + with mock.patch('sys.argv', ['app', 'command', '--option=one', 'two', '--flag', '-io']): + args, kwargs = parse_args() + assert args == ['app', 'command'] + assert kwargs == { + 'option': ['one', 'two'], + 'flag': True, + 'i': True, + 'o': True + } + + +def test_single_positional_argument(): + args, kwargs = parse_args(['app']) + assert args == ['app'] + assert kwargs == {} + + +def test_positional_arguments(): + args, kwargs = parse_args(['app', 'command']) + assert args == ['app', 'command'] + assert kwargs == {} + + +def test_one_positional_and_optional_argument(): + args, kwargs = parse_args(['app', '--help']) + assert args == ['app'] + assert kwargs == {'help': True} + + +def test_positional_and_optional_arguments(): + args, kwargs = parse_args(['app', 'command', '--inputfile', '--outputfile']) + assert args == ['app', 'command'] + assert kwargs == { + 'inputfile': True, + 'outputfile': True + } + + +def test_short_arg_with_multiple_options(): + args, kwargs = parse_args(['-a', '-i', 'a', 'b']) + assert args == [] + assert kwargs == { + 'a': True, + 'i': ['a', 'b'] + } + + +def test_long_args_with_equals(): + args, kwargs = parse_args(['--input-file=a.py', '--output-file=b.py']) + assert args == [] + assert kwargs == { + 'input_file': ['a.py'], + 'output_file': ['b.py'] + } + + +def test_unintended_hyphen(): + args, kwargs = parse_args(['---triple-hyphen-']) + assert args == [] + assert kwargs == {'_triple_hyphen_': True} + + +@pytest.mark.parametrize('argv, args, kwargs', (( + ['/pargs/pargs.py', 'command', 'positional', '--flag', '--optional=value', 'test', '--output-file', 'filename', '-flg', 'name', 'name2'], + ['/pargs/pargs.py', 'command', 'positional'], + { + 'flag': True, + 'optional': ['value', 'test'], + 'output_file': ['filename'], + 'f': True, + 'l': True, + 'g': ['name', 'name2'], + } +),)) +def test_all_parameters_at_once(argv, args, kwargs): + _args, _kwargs = parse_args(argv) + assert _args == args + assert _kwargs == kwargs