1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89import pytest
from allib.options.argparser import parse_from_spec
from allib.options import spec
def get_spec(*opts_or_args):
return spec.ArgumentSpec(*opts_or_args)
def parse_args(args, options=None, arguments=None):
argspec = get_spec(options, arguments)
return parse_from_spec(argspec, args)
def _parse_parameters():
args = []
file_variations = (
["--file", "/etc/motd"],
["-f", "/etc/motd"],
["--file=/etc/motd"],
["-f=/etc/motd"],
)
for verbose in ("prepend", "no", "append"):
for stuff in ("prepend", "append"):
for variation in file_variations:
args.append(
(["--verbose"] if verbose == "prepend" else [])
+ (["stuff"] if stuff == "prepend" else [])
+ variation
+ (["--verbose"] if verbose == "append" else [])
+ (["stuff"] if stuff == "append" else [])
)
return args
@pytest.mark.parametrize("args", _parse_parameters())
def test_parse(args):
ret = parse_args(
args,
[spec.Option("-v", "--verbose"), spec.ValueOption("-f", "--file")],
[spec.Argument("name")],
)
assert "/etc/motd" == ret["file"]
assert "stuff" == ret["name"]
def test_type():
ret = parse_args(
["-i", "1", "-f", "1.5"],
[
spec.ValueOption("-i", "--int", type=int),
spec.ValueOption("-f", "--float", type=float),
],
)
assert 1 == ret["int"]
assert 1.5 == ret["float"]
def test_mutliple():
ret = parse_args(
["-v", "1", "-v", "2"],
[spec.ValueOption("-v", "--value", multiple=True, type=int)],
)
assert 2 == len(ret["value"])
assert [1, 2] == ret["value"]
def test_choices():
argspec = get_spec(spec.Argument("name", choices=("foobar", "barbaz", "bazfoo")))
ret = parse_from_spec(argspec, ["foo"])
assert ret["name"] == "foobar"
ret = parse_from_spec(argspec, ["bar"])
assert ret["name"] == "barbaz"
with pytest.raises(ValueError):
ret = parse_from_spec(argspec, ["ba"])
def test_force_stop_parsing_options():
ret = parse_args(
["--", "--foo"],
[spec.Option("--foo")],
[spec.Argument("name")],
)
assert False is ret["foo"]
assert "--foo" == ret["name"]