1
|
|
|
#!/usr/bin/env python |
2
|
|
|
# coding=utf-8 |
3
|
|
|
|
4
|
|
|
from __future__ import division, print_function, unicode_literals |
5
|
|
|
|
6
|
|
|
import pytest |
7
|
|
|
import shlex |
8
|
|
|
from docopt import docopt |
9
|
|
|
|
10
|
|
|
from sacred.arg_parser import (_convert_value, get_config_updates, format_usage) |
11
|
|
|
from sacred.commandline_options import gather_command_line_options |
12
|
|
|
|
13
|
|
|
|
14
|
|
|
@pytest.mark.parametrize("argv,expected", [ |
15
|
|
|
('', {}), |
16
|
|
|
('run', {'COMMAND': 'run'}), |
17
|
|
|
('with 1 2', {'with': True, 'UPDATE': ['1', '2']}), |
18
|
|
|
('evaluate', {'COMMAND': 'evaluate'}), |
19
|
|
|
('help', {'help': True}), |
20
|
|
|
('help evaluate', {'help': True, 'COMMAND': 'evaluate'}), |
21
|
|
|
('-h', {'--help': True}), |
22
|
|
|
('--help', {'--help': True}), |
23
|
|
|
('-m foo', {'--mongo_db': 'foo'}), |
24
|
|
|
('--mongo_db=bar', {'--mongo_db': 'bar'}), |
25
|
|
|
('-l 10', {'--loglevel': '10'}), |
26
|
|
|
('--loglevel=30', {'--loglevel': '30'}), |
27
|
|
|
('--force', {'--force': True}), |
28
|
|
|
('run with a=17 b=1 -m localhost:22222', {'COMMAND': 'run', |
29
|
|
|
'with': True, |
30
|
|
|
'UPDATE': ['a=17', 'b=1'], |
31
|
|
|
'--mongo_db': 'localhost:22222'}), |
32
|
|
|
('evaluate with a=18 b=2 -l30', {'COMMAND': 'evaluate', |
33
|
|
|
'with': True, |
34
|
|
|
'UPDATE': ['a=18', 'b=2'], |
35
|
|
|
'--loglevel': '30'}), |
36
|
|
|
]) |
37
|
|
|
def test_parse_individual_arguments(argv, expected): |
38
|
|
|
options = gather_command_line_options() |
39
|
|
|
usage = format_usage("test.py", "", {}, options) |
40
|
|
|
argv = shlex.split(argv) |
41
|
|
|
plain = docopt(usage, [], help=False) |
42
|
|
|
args = docopt(usage, argv, help=False) |
43
|
|
|
plain.update(expected) |
44
|
|
|
assert args == plain |
45
|
|
|
|
46
|
|
|
|
47
|
|
|
@pytest.mark.parametrize("update,expected", [ |
48
|
|
|
(None, {}), |
49
|
|
|
(['a=5'], {'a': 5}), |
50
|
|
|
(['foo.bar=6'], {'foo': {'bar': 6}}), |
51
|
|
|
(['a=9', 'b=0'], {'a': 9, 'b': 0}), |
52
|
|
|
(["hello='world'"], {'hello': 'world'}), |
53
|
|
|
(['hello="world"'], {'hello': 'world'}), |
54
|
|
|
(["f=23.5"], {'f': 23.5}), |
55
|
|
|
(["n=None"], {'n': None}), |
56
|
|
|
(["t=True"], {'t': True}), |
57
|
|
|
(["f=False"], {'f': False}), |
58
|
|
|
]) |
59
|
|
|
def test_get_config_updates(update, expected): |
60
|
|
|
assert get_config_updates(update) == (expected, []) |
61
|
|
|
|
62
|
|
|
|
63
|
|
|
@pytest.mark.parametrize("value,expected", [ |
64
|
|
|
('None', None), |
65
|
|
|
('True', True), |
66
|
|
|
('False', False), |
67
|
|
|
('246', 246), |
68
|
|
|
('1.0', 1.0), |
69
|
|
|
('1.', 1.0), |
70
|
|
|
('.1', 0.1), |
71
|
|
|
('1e3', 1e3), |
72
|
|
|
('-.4e-12', -0.4e-12), |
73
|
|
|
('-.4e-12', -0.4e-12), |
74
|
|
|
('[1,2,3]', [1, 2, 3]), |
75
|
|
|
('[1.,.1]', [1., .1]), |
76
|
|
|
('[True, False]', [True, False]), |
77
|
|
|
('[None, None]', [None, None]), |
78
|
|
|
('[1.0,2.0,3.0]', [1.0, 2.0, 3.0]), |
79
|
|
|
('{"a":1}', {'a': 1}), |
80
|
|
|
('{"foo":1, "bar":2.0}', {'foo': 1, 'bar': 2.0}), |
81
|
|
|
('{"a":1., "b":.2}', {'a': 1., 'b': .2}), |
82
|
|
|
('{"a":True, "b":False}', {'a': True, 'b': False}), |
83
|
|
|
('{"a":None}', {'a': None}), |
84
|
|
|
('{"a":[1, 2.0, True, None], "b":"foo"}', {"a": [1, 2.0, True, None], |
85
|
|
|
"b": "foo"}), |
86
|
|
|
('bob', 'bob'), |
87
|
|
|
('"hello world"', 'hello world'), |
88
|
|
|
("'hello world'", 'hello world'), |
89
|
|
|
]) |
90
|
|
|
def test_convert_value(value, expected): |
91
|
|
|
assert _convert_value(value) == expected |
92
|
|
|
|