3
3
from _pytest import config as parseopt
4
4
from textwrap import dedent
5
5
6
+ @pytest .fixture
7
+ def parser ():
8
+ return parseopt .Parser ()
9
+
6
10
class TestParser :
7
11
def test_no_help_by_default (self , capsys ):
8
12
parser = parseopt .Parser (usage = "xyz" )
9
13
pytest .raises (SystemExit , 'parser.parse(["-h"])' )
10
14
out , err = capsys .readouterr ()
11
15
assert err .find ("error: unrecognized arguments" ) != - 1
12
16
13
- def test_argument (self ):
17
+ def test_argument (self , parser ):
14
18
with pytest .raises (parseopt .ArgumentError ):
15
19
# need a short or long option
16
20
argument = parseopt .Argument ()
@@ -25,7 +29,7 @@ def test_argument(self):
25
29
argument = parseopt .Argument ('-t' , '--test' , dest = 'abc' )
26
30
assert argument .dest == 'abc'
27
31
28
- def test_argument_type (self ):
32
+ def test_argument_type (self , parser ):
29
33
argument = parseopt .Argument ('-t' , dest = 'abc' , type = 'int' )
30
34
assert argument .type is int
31
35
argument = parseopt .Argument ('-t' , dest = 'abc' , type = 'string' )
@@ -46,22 +50,19 @@ def test_argument_processopt(self):
46
50
assert res ['default' ] == 42
47
51
assert res ['dest' ] == 'abc'
48
52
49
- def test_group_add_and_get (self ):
50
- parser = parseopt .Parser ()
53
+ def test_group_add_and_get (self , parser ):
51
54
group = parser .getgroup ("hello" , description = "desc" )
52
55
assert group .name == "hello"
53
56
assert group .description == "desc"
54
57
55
- def test_getgroup_simple (self ):
56
- parser = parseopt .Parser ()
58
+ def test_getgroup_simple (self , parser ):
57
59
group = parser .getgroup ("hello" , description = "desc" )
58
60
assert group .name == "hello"
59
61
assert group .description == "desc"
60
62
group2 = parser .getgroup ("hello" )
61
63
assert group2 is group
62
64
63
- def test_group_ordering (self ):
64
- parser = parseopt .Parser ()
65
+ def test_group_ordering (self , parser ):
65
66
group0 = parser .getgroup ("1" )
66
67
group1 = parser .getgroup ("2" )
67
68
group1 = parser .getgroup ("3" , after = "1" )
@@ -75,8 +76,7 @@ def test_group_addoption(self):
75
76
assert len (group .options ) == 1
76
77
assert isinstance (group .options [0 ], parseopt .Argument )
77
78
78
- def test_group_shortopt_lowercase (self ):
79
- parser = parseopt .Parser ()
79
+ def test_group_shortopt_lowercase (self , parser ):
80
80
group = parser .getgroup ("hello" )
81
81
pytest .raises (ValueError , """
82
82
group.addoption("-x", action="store_true")
@@ -85,36 +85,31 @@ def test_group_shortopt_lowercase(self):
85
85
group ._addoption ("-x" , action = "store_true" )
86
86
assert len (group .options ) == 1
87
87
88
- def test_parser_addoption (self ):
89
- parser = parseopt .Parser ()
88
+ def test_parser_addoption (self , parser ):
90
89
group = parser .getgroup ("custom options" )
91
90
assert len (group .options ) == 0
92
91
group .addoption ("--option1" , action = "store_true" )
93
92
assert len (group .options ) == 1
94
93
95
- def test_parse (self ):
96
- parser = parseopt .Parser ()
94
+ def test_parse (self , parser ):
97
95
parser .addoption ("--hello" , dest = "hello" , action = "store" )
98
96
args = parser .parse (['--hello' , 'world' ])
99
97
assert args .hello == "world"
100
98
assert not getattr (args , parseopt .Config ._file_or_dir )
101
99
102
- def test_parse2 (self ):
103
- parser = parseopt .Parser ()
100
+ def test_parse2 (self , parser ):
104
101
args = parser .parse ([py .path .local ()])
105
102
assert getattr (args , parseopt .Config ._file_or_dir )[0 ] == py .path .local ()
106
103
107
- def test_parse_will_set_default (self ):
108
- parser = parseopt .Parser ()
104
+ def test_parse_will_set_default (self , parser ):
109
105
parser .addoption ("--hello" , dest = "hello" , default = "x" , action = "store" )
110
106
option = parser .parse ([])
111
107
assert option .hello == "x"
112
108
del option .hello
113
109
args = parser .parse_setoption ([], option )
114
110
assert option .hello == "x"
115
111
116
- def test_parse_setoption (self ):
117
- parser = parseopt .Parser ()
112
+ def test_parse_setoption (self , parser ):
118
113
parser .addoption ("--hello" , dest = "hello" , action = "store" )
119
114
parser .addoption ("--world" , dest = "world" , default = 42 )
120
115
class A : pass
@@ -124,14 +119,12 @@ class A: pass
124
119
assert option .world == 42
125
120
assert not args
126
121
127
- def test_parse_special_destination (self ):
128
- parser = parseopt .Parser ()
122
+ def test_parse_special_destination (self , parser ):
129
123
x = parser .addoption ("--ultimate-answer" , type = int )
130
124
args = parser .parse (['--ultimate-answer' , '42' ])
131
125
assert args .ultimate_answer == 42
132
126
133
- def test_parse_split_positional_arguments (self ):
134
- parser = parseopt .Parser ()
127
+ def test_parse_split_positional_arguments (self , parser ):
135
128
parser .addoption ("-R" , action = 'store_true' )
136
129
parser .addoption ("-S" , action = 'store_false' )
137
130
args = parser .parse (['-R' , '4' , '2' , '-S' ])
@@ -162,6 +155,80 @@ def defaultget(option):
162
155
assert option .this == 42
163
156
assert option .no is False
164
157
158
+ @pytest .mark .skipif ("sys.version_info < (2,5)" )
159
+ def test_drop_short_helper (self ):
160
+ parser = py .std .argparse .ArgumentParser (formatter_class = parseopt .DropShorterLongHelpFormatter )
161
+ parser .add_argument ('-t' , '--twoword' , '--duo' , '--two-word' , '--two' ,
162
+ help = 'foo' ).map_long_option = {'two' : 'two-word' }
163
+ # throws error on --deux only!
164
+ parser .add_argument ('-d' , '--deuxmots' , '--deux-mots' ,
165
+ action = 'store_true' , help = 'foo' ).map_long_option = {'deux' : 'deux-mots' }
166
+ parser .add_argument ('-s' , action = 'store_true' , help = 'single short' )
167
+ parser .add_argument ('--abc' , '-a' ,
168
+ action = 'store_true' , help = 'bar' )
169
+ parser .add_argument ('--klm' , '-k' , '--kl-m' ,
170
+ action = 'store_true' , help = 'bar' )
171
+ parser .add_argument ('-P' , '--pq-r' , '-p' , '--pqr' ,
172
+ action = 'store_true' , help = 'bar' )
173
+ parser .add_argument ('--zwei-wort' , '--zweiwort' , '--zweiwort' ,
174
+ action = 'store_true' , help = 'bar' )
175
+ parser .add_argument ('-x' , '--exit-on-first' , '--exitfirst' ,
176
+ action = 'store_true' , help = 'spam' ).map_long_option = {'exitfirst' : 'exit-on-first' }
177
+ parser .add_argument ('files_and_dirs' , nargs = '*' )
178
+ args = parser .parse_args (['-k' , '--duo' , 'hallo' , '--exitfirst' ])
179
+ assert args .twoword == 'hallo'
180
+ assert args .klm is True
181
+ assert args .zwei_wort is False
182
+ assert args .exit_on_first is True
183
+ assert args .s is False
184
+ args = parser .parse_args (['--deux-mots' ])
185
+ with pytest .raises (AttributeError ):
186
+ assert args .deux_mots is True
187
+ assert args .deuxmots is True
188
+ args = parser .parse_args (['file' , 'dir' ])
189
+ assert '|' .join (args .files_and_dirs ) == 'file|dir'
190
+
191
+ def test_drop_short_0 (self , parser ):
192
+ parser .addoption ('--funcarg' , '--func-arg' , action = 'store_true' )
193
+ parser .addoption ('--abc-def' , '--abc-def' , action = 'store_true' )
194
+ parser .addoption ('--klm-hij' , action = 'store_true' )
195
+ args = parser .parse (['--funcarg' , '--k' ])
196
+ assert args .funcarg is True
197
+ assert args .abc_def is False
198
+ assert args .klm_hij is True
199
+
200
+ @pytest .mark .skipif ("sys.version_info < (2,5)" )
201
+ def test_drop_short_2 (self , parser ):
202
+ parser .addoption ('--func-arg' , '--doit' , action = 'store_true' )
203
+ args = parser .parse (['--doit' ])
204
+ assert args .func_arg is True
205
+
206
+ @pytest .mark .skipif ("sys.version_info < (2,5)" )
207
+ def test_drop_short_3 (self , parser ):
208
+ parser .addoption ('--func-arg' , '--funcarg' , '--doit' , action = 'store_true' )
209
+ args = parser .parse (['abcd' ])
210
+ assert args .func_arg is False
211
+ assert args .file_or_dir == ['abcd' ]
212
+
213
+ @pytest .mark .skipif ("sys.version_info < (2,5)" )
214
+ def test_drop_short_help0 (self , parser , capsys ):
215
+ parser .addoption ('--func-args' , '--doit' , help = 'foo' ,
216
+ action = 'store_true' )
217
+ parser .parse ([])
218
+ help = parser .optparser .format_help ()
219
+ assert '--func-args, --doit foo' in help
220
+
221
+ # testing would be more helpful with all help generated
222
+ @pytest .mark .skipif ("sys.version_info < (2,5)" )
223
+ def test_drop_short_help1 (self , parser , capsys ):
224
+ group = parser .getgroup ("general" )
225
+ group .addoption ('--doit' , '--func-args' , action = 'store_true' , help = 'foo' )
226
+ group ._addoption ("-h" , "--help" , action = "store_true" , dest = "help" ,
227
+ help = "show help message and configuration info" )
228
+ parser .parse (['-h' ])
229
+ help = parser .optparser .format_help ()
230
+ assert '-doit, --func-args foo' in help
231
+
165
232
@pytest .mark .skipif ("sys.version_info < (2,5)" )
166
233
def test_addoption_parser_epilog (testdir ):
167
234
testdir .makeconftest ("""
@@ -173,7 +240,7 @@ def pytest_addoption(parser):
173
240
#assert result.ret != 0
174
241
result .stdout .fnmatch_lines (["hint: hello world" , "hint: from me too" ])
175
242
176
- @pytest .mark .skipif ("sys.version_info < (2,5 )" )
243
+ @pytest .mark .skipif ("sys.version_info < (2,6 )" )
177
244
def test_argcomplete (testdir , monkeypatch ):
178
245
if not py .path .local .sysfind ('bash' ):
179
246
pytest .skip ("bash not available" )
@@ -196,17 +263,22 @@ def test_argcomplete(testdir, monkeypatch):
196
263
monkeypatch .setenv ('COMP_LINE' , "py.test " + arg )
197
264
monkeypatch .setenv ('COMP_POINT' , str (len ("py.test " + arg )))
198
265
result = testdir .run ('bash' , str (script ), arg )
199
- #print dir(result), result.ret
200
266
if result .ret == 255 :
201
267
# argcomplete not found
202
268
pytest .skip ("argcomplete not available" )
203
269
else :
204
- result .stdout .fnmatch_lines (["--funcargs" , "--fulltrace" ])
205
-
270
+ #print 'type ---------------', result.stdout, result.stdout.lines
271
+ if py .std .sys .version_info < (2 ,7 ):
272
+ result .stdout .lines = result .stdout .lines [0 ].split ('\x0b ' )
273
+ result .stdout .fnmatch_lines (["--funcargs" , "--fulltrace" ])
274
+ else :
275
+ result .stdout .fnmatch_lines (["--funcargs" , "--fulltrace" ])
276
+ if py .std .sys .version_info < (2 ,7 ):
277
+ return
206
278
os .mkdir ('test_argcomplete.d' )
207
279
arg = 'test_argc'
208
280
monkeypatch .setenv ('COMP_LINE' , "py.test " + arg )
209
281
monkeypatch .setenv ('COMP_POINT' , str (len ('py.test ' + arg )))
210
282
result = testdir .run ('bash' , str (script ), arg )
211
283
result .stdout .fnmatch_lines (["test_argcomplete" , "test_argcomplete.d/" ])
212
- # restore environment
284
+
0 commit comments