Add tests

This commit is contained in:
Patrick Elmer 2022-08-30 11:42:27 +09:00
parent 343ba48445
commit fda4c0681f
3 changed files with 96 additions and 29 deletions

View File

@ -4,9 +4,9 @@ import sys
def parse_args(argv=None): def parse_args(argv=None):
""" """
Returns a tuple of (args, kwargs) from a given list of command line arguments. 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 argv = argv if argv else sys.argv
print(argv)
args = [] args = []
for arg in argv: for arg in argv:
@ -24,10 +24,10 @@ def parse_args(argv=None):
if len(values): if len(values):
kwargs[key] = values kwargs[key] = values
values = [] values = []
key = arg.lstrip('-').replace('-', '_') key = arg[:2].lstrip('-') + arg[2:].replace('-', '_')
if arg.startswith('--'): if arg.startswith('--'):
if '=' in arg: if '=' in arg:
key, value = arg.split('=') key, value = key.split('=')
values.append(value) values.append(value)
kwargs[key] = values kwargs[key] = values
else: else:
@ -35,22 +35,7 @@ def parse_args(argv=None):
elif arg.startswith('-'): elif arg.startswith('-'):
for k in key: for k in key:
kwargs[k] = True kwargs[k] = True
key = arg[-1]
if len(values): if len(values):
kwargs[key] = values kwargs[key] = values
return (args, kwargs) 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)

View File

@ -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'}

View File

@ -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