leader/follower support
This commit is contained in:
319
test/test_leadership.py
Normal file
319
test/test_leadership.py
Normal file
@ -0,0 +1,319 @@
|
||||
from io import StringIO
|
||||
from contextlib import redirect_stdout, redirect_stderr
|
||||
import pytest
|
||||
|
||||
|
||||
from tiramisu_cmdline_parser import TiramisuCmdlineParser
|
||||
from tiramisu import IntOption, StrOption, BoolOption, ChoiceOption, \
|
||||
SymLinkOption, OptionDescription, Leadership, Config, submulti
|
||||
from tiramisu_json_api import Config as JsonConfig
|
||||
|
||||
|
||||
def get_config(json, with_mandatory=False):
|
||||
leader = StrOption('leader', "Leader var", ['192.168.0.1'], multi=True)
|
||||
follower = StrOption('follower', "Follower", multi=True)
|
||||
if with_mandatory:
|
||||
properties = ('mandatory',)
|
||||
else:
|
||||
properties = None
|
||||
follower_submulti = StrOption('follower_submulti', "Follower submulti", multi=submulti, properties=properties)
|
||||
follower_integer = IntOption('follower_integer', "Follower integer", multi=True)
|
||||
follower_boolean = BoolOption('follower_boolean', "Follower boolean", multi=True)
|
||||
follower_choice = ChoiceOption('follower_choice', "Follower choice", ('opt1', 'opt2'), multi=True)
|
||||
opt_list = [leader, follower, follower_submulti, follower_integer, follower_boolean, follower_choice]
|
||||
if with_mandatory:
|
||||
opt_list.append(StrOption('follower_mandatory', "Follower mandatory", multi=True, properties=('mandatory',)))
|
||||
leadership = Leadership('leader', '', opt_list)
|
||||
config = Config(OptionDescription('root', 'root', [leadership]))
|
||||
if json == 'tiramisu':
|
||||
return config
|
||||
jconfig = JsonConfig(config.option.dict())
|
||||
return jconfig
|
||||
|
||||
|
||||
@pytest.fixture(params=['tiramisu', 'tiramisu-api'])
|
||||
def json(request):
|
||||
return request.param
|
||||
|
||||
|
||||
def test_leadership_help(json):
|
||||
output = """usage: prog.py [-h] [--leader.leader [LEADER [LEADER ...]]]
|
||||
[--leader.follower INDEX [FOLLOWER]] --leader.follower_submulti
|
||||
INDEX [FOLLOWER_SUBMULTI ...]
|
||||
[--leader.follower_integer INDEX [FOLLOWER_INTEGER]]
|
||||
[--leader.follower_boolean INDEX]
|
||||
[--leader.no-follower_boolean INDEX]
|
||||
[--leader.follower_choice INDEX [{opt1,opt2}]]
|
||||
--leader.follower_mandatory INDEX FOLLOWER_MANDATORY
|
||||
|
||||
optional arguments:
|
||||
-h, --help show this help message and exit
|
||||
|
||||
leader:
|
||||
--leader.leader [LEADER [LEADER ...]]
|
||||
Leader var
|
||||
--leader.follower INDEX [FOLLOWER]
|
||||
Follower
|
||||
--leader.follower_submulti INDEX [FOLLOWER_SUBMULTI ...]
|
||||
Follower submulti
|
||||
--leader.follower_integer INDEX [FOLLOWER_INTEGER]
|
||||
Follower integer
|
||||
--leader.follower_boolean INDEX
|
||||
Follower boolean
|
||||
--leader.no-follower_boolean INDEX
|
||||
--leader.follower_choice INDEX [{opt1,opt2}]
|
||||
Follower choice
|
||||
--leader.follower_mandatory INDEX FOLLOWER_MANDATORY
|
||||
Follower mandatory
|
||||
"""
|
||||
parser = TiramisuCmdlineParser(get_config(json, with_mandatory=True), 'prog.py')
|
||||
f = StringIO()
|
||||
with redirect_stdout(f):
|
||||
parser.print_help()
|
||||
assert f.getvalue() == output
|
||||
|
||||
|
||||
def test_leadership_modif_leader(json):
|
||||
output = {'leader.leader': ['192.168.1.1'],
|
||||
'leader.follower': [None],
|
||||
'leader.follower_boolean': [None],
|
||||
'leader.follower_choice': [None],
|
||||
'leader.follower_integer': [None],
|
||||
'leader.follower_submulti': [[]]}
|
||||
|
||||
config = get_config(json)
|
||||
parser = TiramisuCmdlineParser(config, 'prog.py')
|
||||
parser.parse_args(['--leader.leader', '192.168.1.1'])
|
||||
assert config.value.dict() == output
|
||||
|
||||
|
||||
def test_leadership_modif_follower(json):
|
||||
output = {'leader.leader': ['192.168.0.1'],
|
||||
'leader.follower': ['255.255.255.0'],
|
||||
'leader.follower_boolean': [None],
|
||||
'leader.follower_choice': [None],
|
||||
'leader.follower_integer': [None],
|
||||
'leader.follower_submulti': [[]]}
|
||||
|
||||
config = get_config(json)
|
||||
parser = TiramisuCmdlineParser(config, 'prog.py')
|
||||
parser.parse_args(['--leader.follower', '0', '255.255.255.0'])
|
||||
assert config.value.dict() == output
|
||||
|
||||
|
||||
def test_leadership_modif_follower_not_submulti(json):
|
||||
output = """usage: prog.py [-h] [--leader.leader [LEADER [LEADER ...]]]
|
||||
[--leader.follower INDEX [FOLLOWER]]
|
||||
[--leader.follower_submulti INDEX [FOLLOWER_SUBMULTI ...]]
|
||||
[--leader.follower_integer INDEX [FOLLOWER_INTEGER]]
|
||||
[--leader.follower_boolean INDEX]
|
||||
[--leader.no-follower_boolean INDEX]
|
||||
[--leader.follower_choice INDEX [{opt1,opt2}]]
|
||||
prog.py: error: unrecognized arguments: 255.255.255.0
|
||||
"""
|
||||
|
||||
config = get_config(json)
|
||||
parser = TiramisuCmdlineParser(config, 'prog.py')
|
||||
f = StringIO()
|
||||
with redirect_stderr(f):
|
||||
try:
|
||||
parser.parse_args(['--leader.follower', '0', '255.255.255.0', '255.255.255.0'])
|
||||
except SystemExit as err:
|
||||
assert str(err) == "2"
|
||||
else:
|
||||
raise Exception('must raises')
|
||||
assert f.getvalue() == output
|
||||
|
||||
|
||||
def test_leadership_modif_follower_submulti(json):
|
||||
output = {'leader.leader': ['192.168.0.1'],
|
||||
'leader.follower': [None],
|
||||
'leader.follower_boolean': [None],
|
||||
'leader.follower_choice': [None],
|
||||
'leader.follower_integer': [None],
|
||||
'leader.follower_submulti': [['255.255.255.0']]}
|
||||
|
||||
config = get_config(json)
|
||||
parser = TiramisuCmdlineParser(config, 'prog.py')
|
||||
parser.parse_args(['--leader.follower_submulti', '0', '255.255.255.0'])
|
||||
assert config.value.dict() == output
|
||||
|
||||
|
||||
def test_leadership_modif_follower_submulti_multi(json):
|
||||
output = {'leader.leader': ['192.168.0.1'],
|
||||
'leader.follower': [None],
|
||||
'leader.follower_boolean': [None],
|
||||
'leader.follower_choice': [None],
|
||||
'leader.follower_integer': [None],
|
||||
'leader.follower_submulti': [['255.255.255.0', '255.255.255.128']]}
|
||||
|
||||
config = get_config(json)
|
||||
parser = TiramisuCmdlineParser(config, 'prog.py')
|
||||
parser.parse_args(['--leader.follower_submulti', '0', '255.255.255.0', '255.255.255.128'])
|
||||
assert config.value.dict() == output
|
||||
|
||||
|
||||
def test_leadership_modif_follower_bool_true(json):
|
||||
output = {'leader.leader': ['192.168.0.1'],
|
||||
'leader.follower': [None],
|
||||
'leader.follower_boolean': [True],
|
||||
'leader.follower_choice': [None],
|
||||
'leader.follower_integer': [None],
|
||||
'leader.follower_submulti': [[]]}
|
||||
|
||||
config = get_config(json)
|
||||
parser = TiramisuCmdlineParser(config, 'prog.py')
|
||||
parser.parse_args(['--leader.follower_boolean', '0'])
|
||||
assert config.value.dict() == output
|
||||
|
||||
|
||||
def test_leadership_modif_follower_bool_false(json):
|
||||
output = {'leader.leader': ['192.168.0.1'],
|
||||
'leader.follower': [None],
|
||||
'leader.follower_boolean': [False],
|
||||
'leader.follower_choice': [None],
|
||||
'leader.follower_integer': [None],
|
||||
'leader.follower_submulti': [[]]}
|
||||
|
||||
config = get_config(json)
|
||||
parser = TiramisuCmdlineParser(config, 'prog.py')
|
||||
parser.parse_args(['--leader.no-follower_boolean', '0'])
|
||||
assert config.value.dict() == output
|
||||
|
||||
|
||||
def test_leadership_modif_follower_choice(json):
|
||||
output = {'leader.leader': ['192.168.0.1'],
|
||||
'leader.follower': [None],
|
||||
'leader.follower_boolean': [None],
|
||||
'leader.follower_choice': ['opt1'],
|
||||
'leader.follower_integer': [None],
|
||||
'leader.follower_submulti': [[]]}
|
||||
|
||||
config = get_config(json)
|
||||
parser = TiramisuCmdlineParser(config, 'prog.py')
|
||||
parser.parse_args(['--leader.follower_choice', '0', 'opt1'])
|
||||
assert config.value.dict() == output
|
||||
|
||||
|
||||
def test_leadership_modif_follower_choice_unknown(json):
|
||||
output = """usage: prog.py [-h] [--leader.leader [LEADER [LEADER ...]]]
|
||||
[--leader.follower INDEX [FOLLOWER]]
|
||||
[--leader.follower_submulti INDEX [FOLLOWER_SUBMULTI ...]]
|
||||
[--leader.follower_integer INDEX [FOLLOWER_INTEGER]]
|
||||
[--leader.follower_boolean INDEX]
|
||||
[--leader.no-follower_boolean INDEX]
|
||||
[--leader.follower_choice INDEX [{opt1,opt2}]]
|
||||
prog.py: error: invalid choice: 'opt_unknown' (choose from 'opt1', 'opt2')
|
||||
"""
|
||||
config = get_config(json)
|
||||
parser = TiramisuCmdlineParser(config, 'prog.py')
|
||||
f = StringIO()
|
||||
with redirect_stderr(f):
|
||||
try:
|
||||
parser.parse_args(['--leader.follower_choice', '0', 'opt_unknown'])
|
||||
except SystemExit as err:
|
||||
assert str(err) == "2"
|
||||
else:
|
||||
raise Exception('must raises')
|
||||
assert f.getvalue() == output
|
||||
|
||||
|
||||
def test_leadership_modif_follower_not_number(json):
|
||||
output = """usage: prog.py [-h] [--leader.leader [LEADER [LEADER ...]]]
|
||||
[--leader.follower INDEX [FOLLOWER]]
|
||||
[--leader.follower_submulti INDEX [FOLLOWER_SUBMULTI ...]]
|
||||
[--leader.follower_integer INDEX [FOLLOWER_INTEGER]]
|
||||
[--leader.follower_boolean INDEX]
|
||||
[--leader.no-follower_boolean INDEX]
|
||||
[--leader.follower_choice INDEX [{opt1,opt2}]]
|
||||
prog.py: error: index must be a number, not a
|
||||
"""
|
||||
|
||||
config = get_config(json)
|
||||
parser = TiramisuCmdlineParser(config, 'prog.py')
|
||||
f = StringIO()
|
||||
with redirect_stderr(f):
|
||||
try:
|
||||
parser.parse_args(['--leader.follower', 'a', '255.255.255.0'])
|
||||
except SystemExit as err:
|
||||
assert str(err) == "2"
|
||||
else:
|
||||
raise Exception('must raises')
|
||||
assert f.getvalue() == output
|
||||
|
||||
|
||||
def test_leadership_modif_multi(json):
|
||||
output = {'leader.leader': ['192.168.1.1', '10.253.10.1', '192.168.253.1'],
|
||||
'leader.follower': ['255.255.255.128', None, '255.255.255.0'],
|
||||
'leader.follower_boolean': [None, None, None],
|
||||
'leader.follower_choice': [None, None, None],
|
||||
'leader.follower_integer': [None, None, None],
|
||||
'leader.follower_submulti': [[], [], []]}
|
||||
|
||||
config = get_config(json)
|
||||
parser = TiramisuCmdlineParser(config, 'prog.py')
|
||||
parser.parse_args(['--leader.leader', '192.168.1.1', '10.253.10.1', '192.168.253.1',
|
||||
'--leader.follower', '0', '255.255.255.128',
|
||||
'--leader.follower', '2', '255.255.255.0'])
|
||||
assert config.value.dict() == output
|
||||
|
||||
|
||||
def test_leadership_modif_mandatory(json):
|
||||
output = {'leader.leader': ['192.168.1.1'],
|
||||
'leader.follower': [None],
|
||||
'leader.follower_mandatory': ['255.255.255.128'],
|
||||
'leader.follower_boolean': [None],
|
||||
'leader.follower_choice': [None],
|
||||
'leader.follower_integer': [None],
|
||||
'leader.follower_submulti': [['255.255.255.128']]}
|
||||
output2 = """usage: prog.py --leader.leader ['192.168.1.1'] [-h]
|
||||
[--leader.follower INDEX [FOLLOWER]]
|
||||
--leader.follower_submulti
|
||||
INDEX [FOLLOWER_SUBMULTI ...]
|
||||
[--leader.follower_integer INDEX [FOLLOWER_INTEGER]]
|
||||
[--leader.follower_boolean INDEX]
|
||||
[--leader.no-follower_boolean INDEX]
|
||||
[--leader.follower_choice INDEX [{opt1,opt2}]]
|
||||
--leader.follower_mandatory
|
||||
INDEX FOLLOWER_MANDATORY
|
||||
prog.py: error: the following arguments are required: --leader.follower_submulti"""
|
||||
|
||||
config = get_config(json, with_mandatory=True)
|
||||
parser = TiramisuCmdlineParser(config, 'prog.py')
|
||||
f = StringIO()
|
||||
with redirect_stderr(f):
|
||||
try:
|
||||
parser.parse_args(['--leader.leader', '192.168.1.1'])
|
||||
except SystemExit as err:
|
||||
assert str(err) == "2"
|
||||
else:
|
||||
raise Exception('must raises')
|
||||
assert f.getvalue() == output2 + ', --leader.follower_mandatory\n'
|
||||
f = StringIO()
|
||||
with redirect_stderr(f):
|
||||
try:
|
||||
parser.parse_args(['--leader.leader', '192.168.1.1',
|
||||
'--leader.follower_mandatory', '0', '255.255.255.128'])
|
||||
except SystemExit as err:
|
||||
assert str(err) == "2"
|
||||
else:
|
||||
raise Exception('must raises')
|
||||
assert f.getvalue() == output2 + '\n'
|
||||
parser.parse_args(['--leader.leader', '192.168.1.1',
|
||||
'--leader.follower_submulti', '0', '255.255.255.128',
|
||||
'--leader.follower_mandatory', '0', '255.255.255.128'])
|
||||
assert config.value.dict() == output
|
||||
|
||||
|
||||
def test_leadership_modif_mandatory_unvalidate(json):
|
||||
output = {'leader.leader': ['192.168.1.1'],
|
||||
'leader.follower': [None],
|
||||
'leader.follower_mandatory': [None],
|
||||
'leader.follower_boolean': [None],
|
||||
'leader.follower_choice': [None],
|
||||
'leader.follower_integer': [None],
|
||||
'leader.follower_submulti': [[]]}
|
||||
config = get_config(json, with_mandatory=True)
|
||||
parser = TiramisuCmdlineParser(config, 'prog.py')
|
||||
parser.parse_args(['--leader.leader', '192.168.1.1'], valid_mandatory=False)
|
||||
assert config.value.dict() == output
|
@ -1,13 +1,15 @@
|
||||
from io import StringIO
|
||||
from contextlib import redirect_stdout, redirect_stderr
|
||||
import pytest
|
||||
|
||||
|
||||
from tiramisu_cmdline_parser import TiramisuCmdlineParser
|
||||
from tiramisu import IntOption, StrOption, BoolOption, ChoiceOption, \
|
||||
SymLinkOption, OptionDescription, Config
|
||||
from tiramisu_json_api import Config as JsonConfig
|
||||
|
||||
|
||||
def get_config(has_tree=False, default_verbosity=False):
|
||||
def get_config(json, has_tree=False, default_verbosity=False, add_long=False, add_store_false=False):
|
||||
choiceoption = ChoiceOption('cmd',
|
||||
'choice the sub argument',
|
||||
('str', 'list', 'int', 'none'),
|
||||
@ -55,10 +57,22 @@ def get_config(has_tree=False, default_verbosity=False):
|
||||
[root])
|
||||
config = Config(root)
|
||||
config.property.read_write()
|
||||
return config
|
||||
if add_store_false:
|
||||
config.option('verbosity').property.add('storefalse')
|
||||
if add_long:
|
||||
config.option('verbosity').property.add('longargument')
|
||||
if json == 'tiramisu':
|
||||
return config
|
||||
jconfig = JsonConfig(config.option.dict())
|
||||
return jconfig
|
||||
|
||||
|
||||
def test_readme_help():
|
||||
@pytest.fixture(params=['tiramisu', 'tiramisu-json'])
|
||||
def json(request):
|
||||
return request.param
|
||||
|
||||
|
||||
def test_readme_help(json):
|
||||
output = """usage: prog.py [-h] [-v] [-nv] {str,list,int,none}
|
||||
|
||||
positional arguments:
|
||||
@ -69,14 +83,14 @@ optional arguments:
|
||||
-v, --verbosity increase output verbosity
|
||||
-nv, --no-verbosity
|
||||
"""
|
||||
parser = TiramisuCmdlineParser(get_config(), 'prog.py')
|
||||
parser = TiramisuCmdlineParser(get_config(json), 'prog.py')
|
||||
f = StringIO()
|
||||
with redirect_stdout(f):
|
||||
parser.print_help()
|
||||
assert f.getvalue() == output
|
||||
|
||||
|
||||
def test_readme_help_tree():
|
||||
def test_readme_help_tree(json):
|
||||
output = """usage: prog.py [-h] [-v] [-nv] {str,list,int,none}
|
||||
|
||||
optional arguments:
|
||||
@ -87,14 +101,14 @@ root:
|
||||
-v, --root.verbosity increase output verbosity
|
||||
-nv, --root.no-verbosity
|
||||
"""
|
||||
parser = TiramisuCmdlineParser(get_config(True), 'prog.py')
|
||||
parser = TiramisuCmdlineParser(get_config(json, True), 'prog.py')
|
||||
f = StringIO()
|
||||
with redirect_stdout(f):
|
||||
parser.print_help()
|
||||
assert f.getvalue() == output
|
||||
|
||||
|
||||
def test_readme_help_tree_flatten():
|
||||
def test_readme_help_tree_flatten(json):
|
||||
output = """usage: prog.py [-h] [-v] [-nv] {str,list,int,none}
|
||||
|
||||
optional arguments:
|
||||
@ -105,14 +119,14 @@ root:
|
||||
-v, --verbosity increase output verbosity
|
||||
-nv, --no-verbosity
|
||||
"""
|
||||
parser = TiramisuCmdlineParser(get_config(True), 'prog.py', fullpath=False)
|
||||
parser = TiramisuCmdlineParser(get_config(json, True), 'prog.py', fullpath=False)
|
||||
f = StringIO()
|
||||
with redirect_stdout(f):
|
||||
parser.print_help()
|
||||
assert f.getvalue() == output
|
||||
|
||||
|
||||
def test_readme_help_modif_positional():
|
||||
def test_readme_help_modif_positional(json):
|
||||
output = """usage: prog.py str [-h] [-v] [-nv] --str STR
|
||||
|
||||
optional arguments:
|
||||
@ -121,7 +135,7 @@ optional arguments:
|
||||
-nv, --no-verbosity
|
||||
--str STR string option
|
||||
"""
|
||||
parser = TiramisuCmdlineParser(get_config(), 'prog.py')
|
||||
parser = TiramisuCmdlineParser(get_config(json), 'prog.py')
|
||||
f = StringIO()
|
||||
with redirect_stdout(f):
|
||||
try:
|
||||
@ -133,7 +147,7 @@ optional arguments:
|
||||
assert f.getvalue() == output
|
||||
|
||||
|
||||
def test_readme_help_modif():
|
||||
def test_readme_help_modif(json):
|
||||
output = """usage: prog.py str --str toto [-h] [-v] [-nv]
|
||||
|
||||
optional arguments:
|
||||
@ -141,7 +155,7 @@ optional arguments:
|
||||
-v, --verbosity increase output verbosity
|
||||
-nv, --no-verbosity
|
||||
"""
|
||||
parser = TiramisuCmdlineParser(get_config(), 'prog.py')
|
||||
parser = TiramisuCmdlineParser(get_config(json), 'prog.py')
|
||||
f = StringIO()
|
||||
with redirect_stdout(f):
|
||||
try:
|
||||
@ -153,14 +167,14 @@ optional arguments:
|
||||
assert f.getvalue() == output
|
||||
|
||||
|
||||
def test_readme_help_modif_short():
|
||||
def test_readme_help_modif_short1(json):
|
||||
output = """usage: prog.py str --verbosity [-h] --str STR
|
||||
|
||||
optional arguments:
|
||||
-h, --help show this help message and exit
|
||||
--str STR string option
|
||||
"""
|
||||
parser = TiramisuCmdlineParser(get_config(), 'prog.py')
|
||||
parser = TiramisuCmdlineParser(get_config(json), 'prog.py')
|
||||
f = StringIO()
|
||||
with redirect_stdout(f):
|
||||
try:
|
||||
@ -172,14 +186,14 @@ optional arguments:
|
||||
assert f.getvalue() == output
|
||||
|
||||
|
||||
def test_readme_help_modif_short_no():
|
||||
def test_readme_help_modif_short_no(json):
|
||||
output = """usage: prog.py str --verbosity [-h] --str STR
|
||||
|
||||
optional arguments:
|
||||
-h, --help show this help message and exit
|
||||
--str STR string option
|
||||
"""
|
||||
parser = TiramisuCmdlineParser(get_config(), 'prog.py')
|
||||
parser = TiramisuCmdlineParser(get_config(json), 'prog.py')
|
||||
f = StringIO()
|
||||
with redirect_stdout(f):
|
||||
try:
|
||||
@ -191,11 +205,11 @@ optional arguments:
|
||||
assert f.getvalue() == output
|
||||
|
||||
|
||||
def test_readme_positional_mandatory():
|
||||
def test_readme_positional_mandatory(json):
|
||||
output = """usage: prog.py [-h] [-v] [-nv] {str,list,int,none}
|
||||
prog.py: error: the following arguments are required: cmd
|
||||
"""
|
||||
parser = TiramisuCmdlineParser(get_config(), 'prog.py')
|
||||
parser = TiramisuCmdlineParser(get_config(json), 'prog.py')
|
||||
f = StringIO()
|
||||
with redirect_stderr(f):
|
||||
try:
|
||||
@ -207,11 +221,11 @@ prog.py: error: the following arguments are required: cmd
|
||||
assert f.getvalue() == output
|
||||
|
||||
|
||||
def test_readme_positional_mandatory_tree():
|
||||
def test_readme_positional_mandatory_tree(json):
|
||||
output = """usage: prog.py [-h] [-v] [-nv] {str,list,int,none}
|
||||
prog.py: error: the following arguments are required: root.cmd
|
||||
"""
|
||||
parser = TiramisuCmdlineParser(get_config(True), 'prog.py')
|
||||
parser = TiramisuCmdlineParser(get_config(json, True), 'prog.py')
|
||||
f = StringIO()
|
||||
with redirect_stderr(f):
|
||||
try:
|
||||
@ -223,11 +237,11 @@ prog.py: error: the following arguments are required: root.cmd
|
||||
assert f.getvalue() == output
|
||||
|
||||
|
||||
def test_readme_positional_mandatory_tree_flatten():
|
||||
def test_readme_positional_mandatory_tree_flatten(json):
|
||||
output = """usage: prog.py [-h] [-v] [-nv] {str,list,int,none}
|
||||
prog.py: error: the following arguments are required: cmd
|
||||
"""
|
||||
parser = TiramisuCmdlineParser(get_config(True), 'prog.py', fullpath=False)
|
||||
parser = TiramisuCmdlineParser(get_config(json, True), 'prog.py', fullpath=False)
|
||||
f = StringIO()
|
||||
with redirect_stderr(f):
|
||||
try:
|
||||
@ -239,11 +253,11 @@ prog.py: error: the following arguments are required: cmd
|
||||
assert f.getvalue() == output
|
||||
|
||||
|
||||
def test_readme_mandatory():
|
||||
def test_readme_mandatory(json):
|
||||
output = """usage: prog.py str [-h] [-v] [-nv] --str STR
|
||||
prog.py: error: the following arguments are required: --str
|
||||
"""
|
||||
parser = TiramisuCmdlineParser(get_config(), 'prog.py')
|
||||
parser = TiramisuCmdlineParser(get_config(json), 'prog.py')
|
||||
f = StringIO()
|
||||
with redirect_stderr(f):
|
||||
try:
|
||||
@ -255,11 +269,11 @@ prog.py: error: the following arguments are required: --str
|
||||
assert f.getvalue() == output
|
||||
|
||||
|
||||
def test_readme_mandatory_tree():
|
||||
def test_readme_mandatory_tree(json):
|
||||
output = """usage: prog.py str [-h] [-v] [-nv] --root.str STR
|
||||
prog.py: error: the following arguments are required: --root.str
|
||||
"""
|
||||
parser = TiramisuCmdlineParser(get_config(True), 'prog.py')
|
||||
parser = TiramisuCmdlineParser(get_config(json, True), 'prog.py')
|
||||
f = StringIO()
|
||||
with redirect_stderr(f):
|
||||
try:
|
||||
@ -271,11 +285,11 @@ prog.py: error: the following arguments are required: --root.str
|
||||
assert f.getvalue() == output
|
||||
|
||||
|
||||
def test_readme_mandatory_tree_flatten():
|
||||
def test_readme_mandatory_tree_flatten(json):
|
||||
output = """usage: prog.py str [-h] [-v] [-nv] --str STR
|
||||
prog.py: error: the following arguments are required: --str
|
||||
"""
|
||||
parser = TiramisuCmdlineParser(get_config(True), 'prog.py', fullpath=False)
|
||||
parser = TiramisuCmdlineParser(get_config(json, True), 'prog.py', fullpath=False)
|
||||
f = StringIO()
|
||||
with redirect_stderr(f):
|
||||
try:
|
||||
@ -287,11 +301,11 @@ prog.py: error: the following arguments are required: --str
|
||||
assert f.getvalue() == output
|
||||
|
||||
|
||||
def test_readme_cross():
|
||||
def test_readme_cross(json):
|
||||
output = """usage: prog.py none [-h] [-v] [-nv]
|
||||
prog.py: error: unrecognized arguments: --int
|
||||
"""
|
||||
parser = TiramisuCmdlineParser(get_config(), 'prog.py')
|
||||
parser = TiramisuCmdlineParser(get_config(json), 'prog.py')
|
||||
f = StringIO()
|
||||
with redirect_stderr(f):
|
||||
try:
|
||||
@ -303,11 +317,11 @@ prog.py: error: unrecognized arguments: --int
|
||||
assert f.getvalue() == output
|
||||
|
||||
|
||||
def test_readme_cross_tree():
|
||||
def test_readme_cross_tree(json):
|
||||
output = """usage: prog.py none [-h] [-v] [-nv]
|
||||
prog.py: error: unrecognized arguments: --int
|
||||
"""
|
||||
parser = TiramisuCmdlineParser(get_config(True), 'prog.py')
|
||||
parser = TiramisuCmdlineParser(get_config(json, True), 'prog.py')
|
||||
f = StringIO()
|
||||
with redirect_stderr(f):
|
||||
try:
|
||||
@ -319,11 +333,11 @@ prog.py: error: unrecognized arguments: --int
|
||||
assert f.getvalue() == output
|
||||
|
||||
|
||||
def test_readme_cross_tree_flatten():
|
||||
def test_readme_cross_tree_flatten(json):
|
||||
output = """usage: prog.py none [-h] [-v] [-nv]
|
||||
prog.py: error: unrecognized arguments: --int
|
||||
"""
|
||||
parser = TiramisuCmdlineParser(get_config(True), 'prog.py', fullpath=False)
|
||||
parser = TiramisuCmdlineParser(get_config(json, True), 'prog.py', fullpath=False)
|
||||
f = StringIO()
|
||||
with redirect_stderr(f):
|
||||
try:
|
||||
@ -335,90 +349,105 @@ prog.py: error: unrecognized arguments: --int
|
||||
assert f.getvalue() == output
|
||||
|
||||
|
||||
def test_readme_int():
|
||||
def test_readme_unknown(json):
|
||||
output = """usage: prog.py [-h] [-v] [-nv] {str,list,int,none}
|
||||
prog.py: error: argument root.cmd: invalid choice: 'unknown' (choose from 'str', 'list', 'int', 'none')
|
||||
"""
|
||||
parser = TiramisuCmdlineParser(get_config(json, True), 'prog.py', fullpath=False)
|
||||
f = StringIO()
|
||||
with redirect_stderr(f):
|
||||
try:
|
||||
parser.parse_args(['unknown'])
|
||||
except SystemExit as err:
|
||||
assert str(err) == "2"
|
||||
else:
|
||||
raise Exception('must raises')
|
||||
assert f.getvalue() == output
|
||||
|
||||
|
||||
def test_readme_int(json):
|
||||
output = {'cmd': 'int',
|
||||
'int': 3,
|
||||
'verbosity': False,
|
||||
'v': False}
|
||||
config = get_config()
|
||||
config = get_config(json)
|
||||
parser = TiramisuCmdlineParser(config, 'prog.py')
|
||||
parser.parse_args(['int', '--int', '3'])
|
||||
assert config.value.dict() == output
|
||||
|
||||
|
||||
def test_readme_int_tree():
|
||||
def test_readme_int_tree(json):
|
||||
output = {'root.cmd': 'int',
|
||||
'root.int': 3,
|
||||
'root.verbosity': False,
|
||||
'root.v': False}
|
||||
config = get_config(True)
|
||||
config = get_config(json, True)
|
||||
parser = TiramisuCmdlineParser(config, 'prog.py')
|
||||
parser.parse_args(['int', '--root.int', '3'])
|
||||
assert config.value.dict() == output
|
||||
|
||||
|
||||
def test_readme_int_tree_flatten():
|
||||
def test_readme_int_tree_flatten(json):
|
||||
output = {'root.cmd': 'int',
|
||||
'root.int': 3,
|
||||
'root.verbosity': False,
|
||||
'root.v': False}
|
||||
config = get_config(True)
|
||||
config = get_config(json, True)
|
||||
parser = TiramisuCmdlineParser(config, 'prog.py', fullpath=False)
|
||||
parser.parse_args(['int', '--int', '3'])
|
||||
assert config.value.dict() == output
|
||||
|
||||
|
||||
def test_readme_int_verbosity():
|
||||
def test_readme_int_verbosity(json):
|
||||
output = {'cmd': 'int',
|
||||
'int': 3,
|
||||
'verbosity': True,
|
||||
'v': True}
|
||||
config = get_config()
|
||||
config = get_config(json)
|
||||
parser = TiramisuCmdlineParser(config, 'prog.py')
|
||||
parser.parse_args(['int', '--int', '3', '--verbosity'])
|
||||
assert config.value.dict() == output
|
||||
|
||||
|
||||
def test_readme_int_verbosity_tree():
|
||||
def test_readme_int_verbosity_tree(json):
|
||||
output = {'root.cmd': 'int',
|
||||
'root.int': 3,
|
||||
'root.verbosity': True,
|
||||
'root.v': True}
|
||||
config = get_config(True)
|
||||
config = get_config(json, True)
|
||||
parser = TiramisuCmdlineParser(config, 'prog.py')
|
||||
parser.parse_args(['int', '--root.int', '3', '--root.verbosity'])
|
||||
assert config.value.dict() == output
|
||||
|
||||
|
||||
def test_readme_int_verbosity_tree_flatten():
|
||||
def test_readme_int_verbosity_tree_flatten(json):
|
||||
output = {'root.cmd': 'int',
|
||||
'root.int': 3,
|
||||
'root.verbosity': True,
|
||||
'root.v': True}
|
||||
config = get_config(True)
|
||||
config = get_config(json, True)
|
||||
parser = TiramisuCmdlineParser(config, 'prog.py', fullpath=False)
|
||||
parser.parse_args(['int', '--int', '3', '--verbosity'])
|
||||
assert config.value.dict() == output
|
||||
|
||||
|
||||
def test_readme_int_verbosity_short():
|
||||
def test_readme_int_verbosity_short(json):
|
||||
output = {'cmd': 'int',
|
||||
'int': 3,
|
||||
'verbosity': True,
|
||||
'v': True}
|
||||
config = get_config()
|
||||
config = get_config(json)
|
||||
parser = TiramisuCmdlineParser(config, 'prog.py')
|
||||
parser.parse_args(['int', '--int', '3', '-v'])
|
||||
assert config.value.dict() == output
|
||||
|
||||
|
||||
def test_readme_int_verbosity_short_store_false():
|
||||
def test_readme_int_verbosity_short_store_false(json):
|
||||
output = {'cmd': 'int',
|
||||
'int': 3,
|
||||
'verbosity': None,
|
||||
'v': True}
|
||||
config = get_config(default_verbosity=None)
|
||||
config.option('verbosity').property.add('storefalse')
|
||||
config = get_config(json, default_verbosity=None, add_store_false=True)
|
||||
parser = TiramisuCmdlineParser(config, 'prog.py')
|
||||
parser.parse_args(['int', '--int', '3', '-v'])
|
||||
output = {'cmd': 'int',
|
||||
@ -434,178 +463,188 @@ def test_readme_int_verbosity_short_store_false():
|
||||
assert config.value.dict() == output
|
||||
|
||||
|
||||
def test_readme_int_verbosity_short_no():
|
||||
def test_readme_int_verbosity_short_no(json):
|
||||
output = {'cmd': 'int',
|
||||
'int': 3,
|
||||
'verbosity': False,
|
||||
'v': False}
|
||||
config = get_config()
|
||||
config = get_config(json)
|
||||
parser = TiramisuCmdlineParser(config, 'prog.py')
|
||||
parser.parse_args(['int', '--int', '3', '-nv'])
|
||||
assert config.value.dict() == output
|
||||
|
||||
|
||||
def test_readme_int_verbosity_short_tree():
|
||||
def test_readme_int_verbosity_short_tree(json):
|
||||
output = {'root.cmd': 'int',
|
||||
'root.int': 3,
|
||||
'root.verbosity': True,
|
||||
'root.v': True}
|
||||
config = get_config(True)
|
||||
config = get_config(json, True)
|
||||
parser = TiramisuCmdlineParser(config, 'prog.py')
|
||||
parser.parse_args(['int', '--root.int', '3', '-v'])
|
||||
assert config.value.dict() == output
|
||||
|
||||
|
||||
def test_readme_int_verbosity_short_tree_flatten():
|
||||
def test_readme_int_verbosity_short_tree_flatten(json):
|
||||
output = {'root.cmd': 'int',
|
||||
'root.int': 3,
|
||||
'root.verbosity': True,
|
||||
'root.v': True}
|
||||
config = get_config(True)
|
||||
config = get_config(json, True)
|
||||
parser = TiramisuCmdlineParser(config, 'prog.py', fullpath=False)
|
||||
parser.parse_args(['int', '--int', '3', '-v'])
|
||||
assert config.value.dict() == output
|
||||
|
||||
|
||||
def test_readme_str():
|
||||
def test_readme_int_verbosity_short_and_not(json):
|
||||
output = {'cmd': 'int',
|
||||
'int': 3,
|
||||
'verbosity': False,
|
||||
'v': False}
|
||||
config = get_config(json)
|
||||
parser = TiramisuCmdlineParser(config, 'prog.py')
|
||||
parser.parse_args(['int', '--int', '3', '-v', '-nv'])
|
||||
assert config.value.dict() == output
|
||||
|
||||
|
||||
def test_readme_str(json):
|
||||
output = {'cmd': 'str',
|
||||
'str': 'value',
|
||||
'verbosity': False,
|
||||
'v': False}
|
||||
config = get_config()
|
||||
config = get_config(json)
|
||||
parser = TiramisuCmdlineParser(config, 'prog.py')
|
||||
parser.parse_args(['str', '--str', 'value'])
|
||||
assert config.value.dict() == output
|
||||
|
||||
|
||||
def test_readme_str_tree():
|
||||
def test_readme_str_tree(json):
|
||||
output = {'root.cmd': 'str',
|
||||
'root.str': 'value',
|
||||
'root.verbosity': False,
|
||||
'root.v': False}
|
||||
config = get_config(True)
|
||||
config = get_config(json, True)
|
||||
parser = TiramisuCmdlineParser(config, 'prog.py')
|
||||
parser.parse_args(['str', '--root.str', 'value'])
|
||||
assert config.value.dict() == output
|
||||
|
||||
|
||||
def test_readme_str_tree_flatten():
|
||||
def test_readme_str_tree_flatten(json):
|
||||
output = {'root.cmd': 'str',
|
||||
'root.str': 'value',
|
||||
'root.verbosity': False,
|
||||
'root.v': False}
|
||||
config = get_config(True)
|
||||
config = get_config(json, True)
|
||||
parser = TiramisuCmdlineParser(config, 'prog.py', fullpath=False)
|
||||
parser.parse_args(['str', '--str', 'value'])
|
||||
assert config.value.dict() == output
|
||||
|
||||
|
||||
def test_readme_str_int():
|
||||
def test_readme_str_int(json):
|
||||
output = {'cmd': 'str',
|
||||
'str': '3',
|
||||
'verbosity': False,
|
||||
'v': False}
|
||||
config = get_config()
|
||||
config = get_config(json)
|
||||
parser = TiramisuCmdlineParser(config, 'prog.py')
|
||||
parser.parse_args(['str', '--str', '3'])
|
||||
assert config.value.dict() == output
|
||||
|
||||
|
||||
def test_readme_str_int_tree():
|
||||
def test_readme_str_int_tree(json):
|
||||
output = {'root.cmd': 'str',
|
||||
'root.str': '3',
|
||||
'root.verbosity': False,
|
||||
'root.v': False}
|
||||
config = get_config(True)
|
||||
config = get_config(json, True)
|
||||
parser = TiramisuCmdlineParser(config, 'prog.py')
|
||||
parser.parse_args(['str', '--root.str', '3'])
|
||||
assert config.value.dict() == output
|
||||
|
||||
|
||||
def test_readme_str_int_tree_flatten():
|
||||
def test_readme_str_int_tree_flatten(json):
|
||||
output = {'root.cmd': 'str',
|
||||
'root.str': '3',
|
||||
'root.verbosity': False,
|
||||
'root.v': False}
|
||||
config = get_config(True)
|
||||
config = get_config(json, True)
|
||||
parser = TiramisuCmdlineParser(config, 'prog.py', fullpath=False)
|
||||
parser.parse_args(['str', '--str', '3'])
|
||||
assert config.value.dict() == output
|
||||
|
||||
|
||||
def test_readme_list():
|
||||
def test_readme_list(json):
|
||||
output = {'cmd': 'list',
|
||||
'list': ['a', 'b', 'c'],
|
||||
'verbosity': False,
|
||||
'v': False}
|
||||
config = get_config()
|
||||
config = get_config(json)
|
||||
parser = TiramisuCmdlineParser(config, 'prog.py')
|
||||
parser.parse_args(['list', '--list', 'a', 'b', 'c'])
|
||||
assert config.value.dict() == output
|
||||
|
||||
|
||||
def test_readme_list_tree():
|
||||
def test_readme_list_tree(json):
|
||||
output = {'root.cmd': 'list',
|
||||
'root.list': ['a', 'b', 'c'],
|
||||
'root.verbosity': False,
|
||||
'root.v': False}
|
||||
config = get_config(True)
|
||||
config = get_config(json, True)
|
||||
parser = TiramisuCmdlineParser(config, 'prog.py')
|
||||
parser.parse_args(['list', '--root.list', 'a', 'b', 'c'])
|
||||
assert config.value.dict() == output
|
||||
|
||||
|
||||
def test_readme_list_tree_flatten():
|
||||
def test_readme_list_tree_flatten(json):
|
||||
output = {'root.cmd': 'list',
|
||||
'root.list': ['a', 'b', 'c'],
|
||||
'root.verbosity': False,
|
||||
'root.v': False}
|
||||
config = get_config(True)
|
||||
config = get_config(json, True)
|
||||
parser = TiramisuCmdlineParser(config, 'prog.py', fullpath=False)
|
||||
parser.parse_args(['list', '--list', 'a', 'b', 'c'])
|
||||
assert config.value.dict() == output
|
||||
|
||||
|
||||
def test_readme_list_uniq():
|
||||
def test_readme_list_uniq(json):
|
||||
output = {'cmd': 'list',
|
||||
'list': ['a'],
|
||||
'verbosity': False,
|
||||
'v': False}
|
||||
config = get_config()
|
||||
config = get_config(json)
|
||||
parser = TiramisuCmdlineParser(config, 'prog.py')
|
||||
parser.parse_args(['list', '--list', 'a'])
|
||||
assert config.value.dict() == output
|
||||
|
||||
|
||||
def test_readme_list_uniq_tree():
|
||||
def test_readme_list_uniq_tree(json):
|
||||
output = {'root.cmd': 'list',
|
||||
'root.list': ['a'],
|
||||
'root.verbosity': False,
|
||||
'root.v': False}
|
||||
config = get_config(True)
|
||||
config = get_config(json, True)
|
||||
parser = TiramisuCmdlineParser(config, 'prog.py')
|
||||
parser.parse_args(['list', '--root.list', 'a'])
|
||||
assert config.value.dict() == output
|
||||
|
||||
|
||||
def test_readme_list_uniq_tree_flatten():
|
||||
def test_readme_list_uniq_tree_flatten(json):
|
||||
output = {'root.cmd': 'list',
|
||||
'root.list': ['a'],
|
||||
'root.verbosity': False,
|
||||
'root.v': False}
|
||||
config = get_config(True)
|
||||
config = get_config(json, True)
|
||||
parser = TiramisuCmdlineParser(config, 'prog.py', fullpath=False)
|
||||
parser.parse_args(['list', '--list', 'a'])
|
||||
assert config.value.dict() == output
|
||||
|
||||
|
||||
def test_readme_longargument():
|
||||
def test_readme_longargument(json):
|
||||
output = {'cmd': 'list',
|
||||
'list': ['a'],
|
||||
'verbosity': True,
|
||||
'v': True}
|
||||
config = get_config()
|
||||
config.option('verbosity').property.add('longargument')
|
||||
config = get_config(json, add_long=True)
|
||||
parser = TiramisuCmdlineParser(config, 'prog.py')
|
||||
parser.parse_args(['list', '--list', 'a', '--v'])
|
||||
assert config.value.dict() == output
|
||||
|
Reference in New Issue
Block a user