import sys import pytest from unittest import mock from pargv 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_single_positional_argument_with_underscore(): args, kwargs = parse_args(['the-app']) assert args == ['the_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_single_option(): args, kwargs = parse_args(['-a', 'b', '--abc', 'd']) assert args == [] assert kwargs == { 'a': 'b', 'abc': 'd', } def test_short_arg_with_multiple_options(): args, kwargs = parse_args(['-i', 'a', 'b', '--input', 'c', 'd']) assert args == [] assert kwargs == { 'i': ['a', 'b'], 'input': ['c', 'd'] } 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', (( ['/pargv/pargv.py', 'command', 'positional', '--flag', '--optional=value', 'test', '--output-file', 'filename', '-flg', 'name', 'name2'], ['/pargv/pargv.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