@@ -227,66 +227,72 @@ def test_fnmatch_windows_paths(self):
227
227
self .assertMatches (fnm , r"dir\foo.py" , True )
228
228
229
229
230
+ @pytest .fixture (params = [False , True ], name = "rel_yn" )
231
+ def relative_setting (request ):
232
+ """Parameterized fixture to choose whether PathAliases is relative or not."""
233
+ return request .param
234
+
235
+
230
236
class PathAliasesTest (CoverageTest ):
231
237
"""Tests for coverage/files.py:PathAliases"""
232
238
233
239
run_in_temp_dir = False
234
240
235
- def assert_mapped (self , aliases , inp , out ):
241
+ def assert_mapped (self , aliases , inp , out , relative = False ):
236
242
"""Assert that `inp` mapped through `aliases` produces `out`.
237
243
238
- `out` is canonicalized first, since aliases always produce
239
- canonicalized paths.
244
+ `out` is canonicalized first, since aliases produce canonicalized
245
+ paths by default .
240
246
241
247
"""
242
- aliases .pprint ()
243
- print (inp )
244
- print (out )
245
- assert aliases .map (inp ) == files .canonical_filename (out )
248
+ mapped = aliases .map (inp )
249
+ expected = files .canonical_filename (out ) if not relative else out
250
+ assert mapped == expected
246
251
247
252
def assert_unchanged (self , aliases , inp ):
248
253
"""Assert that `inp` mapped through `aliases` is unchanged."""
249
254
assert aliases .map (inp ) == inp
250
255
251
- def test_noop (self ):
252
- aliases = PathAliases ()
256
+ def test_noop (self , rel_yn ):
257
+ aliases = PathAliases (relative = rel_yn )
253
258
self .assert_unchanged (aliases , '/ned/home/a.py' )
254
259
255
- def test_nomatch (self ):
256
- aliases = PathAliases ()
260
+ def test_nomatch (self , rel_yn ):
261
+ aliases = PathAliases (relative = rel_yn )
257
262
aliases .add ('/home/*/src' , './mysrc' )
258
263
self .assert_unchanged (aliases , '/home/foo/a.py' )
259
264
260
- def test_wildcard (self ):
261
- aliases = PathAliases ()
265
+ def test_wildcard (self , rel_yn ):
266
+ aliases = PathAliases (relative = rel_yn )
262
267
aliases .add ('/ned/home/*/src' , './mysrc' )
263
- self .assert_mapped (aliases , '/ned/home/foo/src/a.py' , './mysrc/a.py' )
268
+ self .assert_mapped (aliases , '/ned/home/foo/src/a.py' , './mysrc/a.py' , relative = rel_yn )
264
269
265
- aliases = PathAliases ()
270
+ aliases = PathAliases (relative = rel_yn )
266
271
aliases .add ('/ned/home/*/src/' , './mysrc' )
267
- self .assert_mapped (aliases , '/ned/home/foo/src/a.py' , './mysrc/a.py' )
272
+ self .assert_mapped (aliases , '/ned/home/foo/src/a.py' , './mysrc/a.py' , relative = rel_yn )
268
273
269
- def test_no_accidental_match (self ):
270
- aliases = PathAliases ()
274
+ def test_no_accidental_match (self , rel_yn ):
275
+ aliases = PathAliases (relative = rel_yn )
271
276
aliases .add ('/home/*/src' , './mysrc' )
272
277
self .assert_unchanged (aliases , '/home/foo/srcetc' )
273
278
274
- def test_multiple_patterns (self ):
275
- aliases = PathAliases ()
279
+ def test_multiple_patterns (self , rel_yn ):
280
+ aliases = PathAliases (relative = rel_yn )
276
281
aliases .add ('/home/*/src' , './mysrc' )
277
282
aliases .add ('/lib/*/libsrc' , './mylib' )
278
- self .assert_mapped (aliases , '/home/foo/src/a.py' , './mysrc/a.py' )
279
- self .assert_mapped (aliases , '/lib/foo/libsrc/a.py' , './mylib/a.py' )
280
-
281
- def test_cant_have_wildcard_at_end (self ):
283
+ self .assert_mapped (aliases , '/home/foo/src/a.py' , './mysrc/a.py' , relative = rel_yn )
284
+ self .assert_mapped (aliases , '/lib/foo/libsrc/a.py' , './mylib/a.py' , relative = rel_yn )
285
+
286
+ @pytest .mark .parametrize ("badpat" , [
287
+ "/ned/home/*" ,
288
+ "/ned/home/*/" ,
289
+ "/ned/home/*/*/" ,
290
+ ])
291
+ def test_cant_have_wildcard_at_end (self , badpat ):
282
292
aliases = PathAliases ()
283
293
msg = "Pattern must not end with wildcards."
284
294
with pytest .raises (CoverageException , match = msg ):
285
- aliases .add ("/ned/home/*" , "fooey" )
286
- with pytest .raises (CoverageException , match = msg ):
287
- aliases .add ("/ned/home/*/" , "fooey" )
288
- with pytest .raises (CoverageException , match = msg ):
289
- aliases .add ("/ned/home/*/*/" , "fooey" )
295
+ aliases .add (badpat , "fooey" )
290
296
291
297
def test_no_accidental_munging (self ):
292
298
aliases = PathAliases ()
@@ -295,94 +301,104 @@ def test_no_accidental_munging(self):
295
301
self .assert_mapped (aliases , r'c:\Zoo\boo\foo.py' , 'src/foo.py' )
296
302
self .assert_mapped (aliases , r'/home/ned$/foo.py' , 'src/foo.py' )
297
303
298
- def test_paths_are_os_corrected (self ):
299
- aliases = PathAliases ()
304
+ def test_paths_are_os_corrected (self , rel_yn ):
305
+ aliases = PathAliases (relative = rel_yn )
300
306
aliases .add ('/home/ned/*/src' , './mysrc' )
301
307
aliases .add (r'c:\ned\src' , './mysrc' )
302
- self .assert_mapped (aliases , r'C:\Ned\src\sub\a.py' , './mysrc/sub/a.py' )
308
+ self .assert_mapped (aliases , r'C:\Ned\src\sub\a.py' , './mysrc/sub/a.py' , relative = rel_yn )
303
309
304
- aliases = PathAliases ()
310
+ aliases = PathAliases (relative = rel_yn )
305
311
aliases .add ('/home/ned/*/src' , r'.\mysrc' )
306
312
aliases .add (r'c:\ned\src' , r'.\mysrc' )
307
- self .assert_mapped (aliases , r'/home/ned/foo/src/sub/a.py' , r'.\mysrc\sub\a.py' )
313
+ self .assert_mapped (
314
+ aliases ,
315
+ r'/home/ned/foo/src/sub/a.py' ,
316
+ r'.\mysrc\sub\a.py' ,
317
+ relative = rel_yn ,
318
+ )
308
319
309
- def test_windows_on_linux (self ):
320
+ def test_windows_on_linux (self , rel_yn ):
310
321
# https://github.com/nedbat/coveragepy/issues/618
311
322
lin = "*/project/module/"
312
323
win = "*\\ project\\ module\\ "
313
324
314
325
# Try the paths in both orders.
315
326
for paths in [[lin , win ], [win , lin ]]:
316
- aliases = PathAliases ()
327
+ aliases = PathAliases (relative = rel_yn )
317
328
for path in paths :
318
329
aliases .add (path , "project/module" )
319
330
self .assert_mapped (
320
331
aliases ,
321
332
"C:\\ a\\ path\\ somewhere\\ coveragepy_test\\ project\\ module\\ tests\\ file.py" ,
322
- "project/module/tests/file.py"
333
+ "project/module/tests/file.py" ,
334
+ relative = rel_yn ,
323
335
)
324
336
325
- def test_linux_on_windows (self ):
337
+ def test_linux_on_windows (self , rel_yn ):
326
338
# https://github.com/nedbat/coveragepy/issues/618
327
339
lin = "*/project/module/"
328
340
win = "*\\ project\\ module\\ "
329
341
330
342
# Try the paths in both orders.
331
343
for paths in [[lin , win ], [win , lin ]]:
332
- aliases = PathAliases ()
344
+ aliases = PathAliases (relative = rel_yn )
333
345
for path in paths :
334
346
aliases .add (path , "project\\ module" )
335
347
self .assert_mapped (
336
348
aliases ,
337
349
"C:/a/path/somewhere/coveragepy_test/project/module/tests/file.py" ,
338
- "project\\ module\\ tests\\ file.py"
350
+ "project\\ module\\ tests\\ file.py" ,
351
+ relative = rel_yn ,
339
352
)
340
353
341
- def test_multiple_wildcard (self ):
342
- aliases = PathAliases ()
354
+ def test_multiple_wildcard (self , rel_yn ):
355
+ aliases = PathAliases (relative = rel_yn )
343
356
aliases .add ('/home/jenkins/*/a/*/b/*/django' , './django' )
344
357
self .assert_mapped (
345
358
aliases ,
346
359
'/home/jenkins/xx/a/yy/b/zz/django/foo/bar.py' ,
347
- './django/foo/bar.py'
360
+ './django/foo/bar.py' ,
361
+ relative = rel_yn ,
348
362
)
349
363
350
- def test_windows_root_paths (self ):
351
- aliases = PathAliases ()
364
+ def test_windows_root_paths (self , rel_yn ):
365
+ aliases = PathAliases (relative = rel_yn )
352
366
aliases .add ('X:\\ ' , '/tmp/src' )
353
367
self .assert_mapped (
354
368
aliases ,
355
369
"X:\\ a\\ file.py" ,
356
- "/tmp/src/a/file.py"
370
+ "/tmp/src/a/file.py" ,
371
+ relative = rel_yn ,
357
372
)
358
373
self .assert_mapped (
359
374
aliases ,
360
375
"X:\\ file.py" ,
361
- "/tmp/src/file.py"
376
+ "/tmp/src/file.py" ,
377
+ relative = rel_yn ,
362
378
)
363
379
364
- def test_leading_wildcard (self ):
365
- aliases = PathAliases ()
380
+ def test_leading_wildcard (self , rel_yn ):
381
+ aliases = PathAliases (relative = rel_yn )
366
382
aliases .add ('*/d1' , './mysrc1' )
367
383
aliases .add ('*/d2' , './mysrc2' )
368
- self .assert_mapped (aliases , '/foo/bar/d1/x.py' , './mysrc1/x.py' )
369
- self .assert_mapped (aliases , '/foo/bar/d2/y.py' , './mysrc2/y.py' )
370
-
371
- def test_dot ( self ):
372
- cases = [ '.' , '..' , '../other' ]
373
- if not env . WINDOWS :
374
- # The root test case was added for the manylinux Docker images,
375
- # and I'm not sure how it should work on Windows, so skip it.
376
- cases += [ '/' ]
377
- for d in cases :
378
- aliases = PathAliases ()
379
- aliases .add (d , '/the/source' )
380
- the_file = os .path .join (d , 'a.py' )
381
- the_file = os .path .expanduser (the_file )
382
- the_file = os .path .abspath (os .path .realpath (the_file ))
383
-
384
- assert '~' not in the_file # to be sure the test is pure.
385
- self .assert_mapped (aliases , the_file , '/the/source/a.py' )
384
+ self .assert_mapped (aliases , '/foo/bar/d1/x.py' , './mysrc1/x.py' , relative = rel_yn )
385
+ self .assert_mapped (aliases , '/foo/bar/d2/y.py' , './mysrc2/y.py' , relative = rel_yn )
386
+
387
+ # The root test case was added for the manylinux Docker images,
388
+ # and I'm not sure how it should work on Windows, so skip it.
389
+ cases = [ "." , ".." , "../other" ]
390
+ if not env . WINDOWS :
391
+ cases += [ "/" ]
392
+ @ pytest . mark . parametrize ( "dirname" , cases )
393
+ def test_dot ( self , dirname ) :
394
+ aliases = PathAliases ()
395
+ aliases .add (dirname , '/the/source' )
396
+ the_file = os .path .join (dirname , 'a.py' )
397
+ the_file = os .path .expanduser (the_file )
398
+ the_file = os .path .abspath (os .path .realpath (the_file ))
399
+
400
+ assert '~' not in the_file # to be sure the test is pure.
401
+ self .assert_mapped (aliases , the_file , '/the/source/a.py' )
386
402
387
403
388
404
class FindPythonFilesTest (CoverageTest ):
0 commit comments