@@ -42,11 +42,14 @@ class _BasePurePathTest(object):
42
42
# supposed to produce equal paths.
43
43
equivalences = {
44
44
'a/b' : [
45
- ('a' , 'b' ), ('a/' , 'b' ), ('a' , 'b/' ), ('a/' , 'b/' ),
46
- ('a/b/' ,), ('a//b' ,), ('a//b//' ,),
45
+ ('a' , 'b' ), ('a/' , 'b' ), ('a//b' ,),
47
46
# Empty components get removed.
48
- ('' , 'a' , 'b' ), ('a' , '' , 'b' ), ( 'a' , 'b' , '' ),
47
+ ('' , 'a' , 'b' ), ('a' , '' , 'b' ),
49
48
],
49
+ 'a/b/' : [
50
+ ('a' , 'b/' ), ('a/' , 'b/' ), ('a/b/' ,),
51
+ ('a//b//' ,), ('a' , 'b' , '' ),
52
+ ],
50
53
'/b/c/d' : [
51
54
('a' , '/b/c' , 'd' ), ('/a' , '/b/c' , 'd' ),
52
55
# Empty components get removed.
@@ -154,11 +157,11 @@ def test_drive_root_parts_common(self):
154
157
# Unanchored parts.
155
158
check ((), '' , '' , ())
156
159
check (('a' ,), '' , '' , ('a' ,))
157
- check (('a/' ,), '' , '' , ('a' ,))
160
+ check (('a/' ,), '' , '' , ('a' , '' ))
158
161
check (('a' , 'b' ), '' , '' , ('a' , 'b' ))
159
162
# Expansion.
160
163
check (('a/b' ,), '' , '' , ('a' , 'b' ))
161
- check (('a/b/' ,), '' , '' , ('a' , 'b' ))
164
+ check (('a/b/' ,), '' , '' , ('a' , 'b' , '' ))
162
165
check (('a' , 'b/c' , 'd' ), '' , '' , ('a' , 'b' , 'c' , 'd' ))
163
166
# Collapsing and stripping excess slashes.
164
167
check (('a' , 'b//c' , 'd' ), '' , '' , ('a' , 'b' , 'c' , 'd' ))
@@ -167,7 +170,7 @@ def test_drive_root_parts_common(self):
167
170
check (('.' ,), '' , '' , ())
168
171
check (('.' , '.' , 'b' ), '' , '' , ('b' ,))
169
172
check (('a' , '.' , 'b' ), '' , '' , ('a' , 'b' ))
170
- check (('a' , '.' , '.' ), '' , '' , ('a' ,))
173
+ check (('a' , '.' , '.' ), '' , '' , ('a' , '' ))
171
174
# The first part is anchored.
172
175
check (('/a/b' ,), '' , sep , (sep , 'a' , 'b' ))
173
176
check (('/a' , 'b' ), '' , sep , (sep , 'a' , 'b' ))
@@ -188,6 +191,24 @@ def test_join_common(self):
188
191
self .assertEqual (pp , P ('a/b/c' ))
189
192
pp = p .joinpath ('/c' )
190
193
self .assertEqual (pp , P ('/c' ))
194
+ pp = p .joinpath ('.' )
195
+ self .assertEqual (pp , P ('a/b/' ))
196
+ pp = p .joinpath ('' )
197
+ self .assertEqual (pp , P ('a/b/' ))
198
+ p = P ('a/b/' )
199
+ pp = p .joinpath ('c' )
200
+ self .assertEqual (pp , P ('a/b/c' ))
201
+ self .assertIs (type (pp ), type (p ))
202
+ pp = p .joinpath ('c' , 'd' )
203
+ self .assertEqual (pp , P ('a/b/c/d' ))
204
+ pp = p .joinpath (P ('c' ))
205
+ self .assertEqual (pp , P ('a/b/c' ))
206
+ pp = p .joinpath ('/c' )
207
+ self .assertEqual (pp , P ('/c' ))
208
+ pp = p .joinpath ('.' )
209
+ self .assertEqual (pp , P ('a/b/' ))
210
+ pp = p .joinpath ('' )
211
+ self .assertEqual (pp , P ('a/b/' ))
191
212
192
213
def test_div_common (self ):
193
214
# Basically the same as joinpath().
@@ -389,6 +410,12 @@ def test_parent_common(self):
389
410
self .assertEqual (p .parent .parent , P ('/a' ))
390
411
self .assertEqual (p .parent .parent .parent , P ('/' ))
391
412
self .assertEqual (p .parent .parent .parent .parent , P ('/' ))
413
+ # Trailing slash
414
+ p = P ('/a/b/' )
415
+ self .assertEqual (p .parent , P ('/a/b' ))
416
+ self .assertEqual (p .parent .parent , P ('/a' ))
417
+ self .assertEqual (p .parent .parent .parent , P ('/' ))
418
+ self .assertEqual (p .parent .parent .parent .parent , P ('/' ))
392
419
393
420
def test_parents_common (self ):
394
421
# Relative
@@ -436,6 +463,9 @@ def test_parents_common(self):
436
463
par [- 4 ]
437
464
with self .assertRaises (IndexError ):
438
465
par [3 ]
466
+ # Trailing slash
467
+ self .assertEqual (P ('a/b/' ).parents [:], (P ('a/b' ), P ('a' ), P ()))
468
+ self .assertEqual (P ('/a/b/' ).parents [:], (P ('/a/b' ), P ('/a' ), P ('/' )))
439
469
440
470
def test_drive_common (self ):
441
471
P = self .cls
@@ -466,7 +496,7 @@ def test_name_common(self):
466
496
self .assertEqual (P ('/' ).name , '' )
467
497
self .assertEqual (P ('a/b' ).name , 'b' )
468
498
self .assertEqual (P ('/a/b' ).name , 'b' )
469
- self .assertEqual (P ('/a/b/.' ).name , 'b ' )
499
+ self .assertEqual (P ('/a/b/.' ).name , '' )
470
500
self .assertEqual (P ('a/b.py' ).name , 'b.py' )
471
501
self .assertEqual (P ('/a/b.py' ).name , 'b.py' )
472
502
@@ -534,6 +564,7 @@ def test_with_name_common(self):
534
564
self .assertRaises (ValueError , P ('' ).with_name , 'd.xml' )
535
565
self .assertRaises (ValueError , P ('.' ).with_name , 'd.xml' )
536
566
self .assertRaises (ValueError , P ('/' ).with_name , 'd.xml' )
567
+ self .assertRaises (ValueError , P ('a/' ).with_name , 'd.xml' )
537
568
self .assertRaises (ValueError , P ('a/b' ).with_name , '' )
538
569
self .assertRaises (ValueError , P ('a/b' ).with_name , '/c' )
539
570
self .assertRaises (ValueError , P ('a/b' ).with_name , 'c/' )
@@ -551,6 +582,7 @@ def test_with_stem_common(self):
551
582
self .assertRaises (ValueError , P ('' ).with_stem , 'd' )
552
583
self .assertRaises (ValueError , P ('.' ).with_stem , 'd' )
553
584
self .assertRaises (ValueError , P ('/' ).with_stem , 'd' )
585
+ self .assertRaises (ValueError , P ('a/' ).with_stem , 'd' )
554
586
self .assertRaises (ValueError , P ('a/b' ).with_stem , '' )
555
587
self .assertRaises (ValueError , P ('a/b' ).with_stem , '/c' )
556
588
self .assertRaises (ValueError , P ('a/b' ).with_stem , 'c/' )
@@ -569,6 +601,7 @@ def test_with_suffix_common(self):
569
601
self .assertRaises (ValueError , P ('' ).with_suffix , '.gz' )
570
602
self .assertRaises (ValueError , P ('.' ).with_suffix , '.gz' )
571
603
self .assertRaises (ValueError , P ('/' ).with_suffix , '.gz' )
604
+ self .assertRaises (ValueError , P ('a/' ).with_suffix , '.gz' )
572
605
# Invalid suffix.
573
606
self .assertRaises (ValueError , P ('a/b' ).with_suffix , 'gz' )
574
607
self .assertRaises (ValueError , P ('a/b' ).with_suffix , '/' )
@@ -789,7 +822,8 @@ class PureWindowsPathTest(_BasePurePathTest, unittest.TestCase):
789
822
equivalences = _BasePurePathTest .equivalences .copy ()
790
823
equivalences .update ({
791
824
'./a:b' : [ ('./a:b' ,) ],
792
- 'c:a' : [ ('c:' , 'a' ), ('c:' , 'a/' ), ('.' , 'c:' , 'a' ) ],
825
+ 'c:a' : [ ('c:' , 'a' ), ('.' , 'c:' , 'a' ) ],
826
+ 'c:a/' : [ ('c:' , 'a/' ) ],
793
827
'c:/a' : [
794
828
('c:/' , 'a' ), ('c:' , '/' , 'a' ), ('c:' , '/a' ),
795
829
('/z' , 'c:/' , 'a' ), ('//x/y' , 'c:/' , 'a' ),
@@ -819,7 +853,7 @@ def test_drive_root_parts(self):
819
853
# UNC paths.
820
854
check (('a' , '//b/c' , 'd' ), '\\ \\ b\\ c' , '\\ ' , ('\\ \\ b\\ c\\ ' , 'd' ))
821
855
# Collapsing and stripping excess slashes.
822
- check (('a' , 'Z://b//c/' , 'd/' ), 'Z:' , '\\ ' , ('Z:\\ ' , 'b' , 'c' , 'd' ))
856
+ check (('a' , 'Z://b//c/' , 'd/' ), 'Z:' , '\\ ' , ('Z:\\ ' , 'b' , 'c' , 'd' , '' ))
823
857
# UNC paths.
824
858
check (('a' , '//b/c//' , 'd' ), '\\ \\ b\\ c' , '\\ ' , ('\\ \\ b\\ c\\ ' , 'd' ))
825
859
# Extended paths.
@@ -970,11 +1004,15 @@ def test_parent(self):
970
1004
self .assertEqual (p .parent , P ('//a/b/c' ))
971
1005
self .assertEqual (p .parent .parent , P ('//a/b' ))
972
1006
self .assertEqual (p .parent .parent .parent , P ('//a/b' ))
1007
+ # Trailing slash
1008
+ self .assertEqual (P ('z:a/b/' ).parent , P ('z:a/b' ))
1009
+ self .assertEqual (P ('z:/a/b/' ).parent , P ('z:/a/b' ))
1010
+ self .assertEqual (P ('//a/b/c/d/' ).parent , P ('//a/b/c/d' ))
973
1011
974
1012
def test_parents (self ):
975
1013
# Anchored
976
1014
P = self .cls
977
- p = P ('z:a/b/ ' )
1015
+ p = P ('z:a/b' )
978
1016
par = p .parents
979
1017
self .assertEqual (len (par ), 2 )
980
1018
self .assertEqual (par [0 ], P ('z:a' ))
@@ -988,7 +1026,7 @@ def test_parents(self):
988
1026
self .assertEqual (list (par ), [P ('z:a' ), P ('z:' )])
989
1027
with self .assertRaises (IndexError ):
990
1028
par [2 ]
991
- p = P ('z:/a/b/ ' )
1029
+ p = P ('z:/a/b' )
992
1030
par = p .parents
993
1031
self .assertEqual (len (par ), 2 )
994
1032
self .assertEqual (par [0 ], P ('z:/a' ))
@@ -1016,6 +1054,10 @@ def test_parents(self):
1016
1054
self .assertEqual (list (par ), [P ('//a/b/c' ), P ('//a/b' )])
1017
1055
with self .assertRaises (IndexError ):
1018
1056
par [2 ]
1057
+ # Trailing slash
1058
+ self .assertEqual (P ('z:a/b/' ).parents [:], (P ('z:a/b' ), P ('z:a' ), P ('z:' )))
1059
+ self .assertEqual (P ('z:/a/b/' ).parents [:], (P ('z:/a/b' ), P ('z:/a' ), P ('z:/' )))
1060
+ self .assertEqual (P ('//a/b/c/d/' ).parents [:], (P ('//a/b/c/d' ), P ('//a/b/c' ), P ('//a/b/' )))
1019
1061
1020
1062
def test_drive (self ):
1021
1063
P = self .cls
@@ -1790,7 +1832,7 @@ def _check(glob, expected):
1790
1832
1791
1833
def test_rglob_common (self ):
1792
1834
def _check (glob , expected ):
1793
- self .assertEqual (set (glob ), { P (BASE , q ) for q in expected })
1835
+ self .assertEqual (set (glob ), { P (BASE , q ) if q else P ( BASE ) for q in expected })
1794
1836
P = self .cls
1795
1837
p = P (BASE )
1796
1838
it = p .rglob ("fileA" )
0 commit comments