@@ -365,6 +365,12 @@ def test_parent_common(self):
365
365
self .assertEqual (p .parent .parent , P ('/a' ))
366
366
self .assertEqual (p .parent .parent .parent , P ('/' ))
367
367
self .assertEqual (p .parent .parent .parent .parent , P ('/' ))
368
+ # Trailing sep
369
+ p = P ('/a/b/c/' )
370
+ self .assertEqual (p .parent , P ('/a/b' ))
371
+ self .assertEqual (p .parent .parent , P ('/a' ))
372
+ self .assertEqual (p .parent .parent .parent , P ('/' ))
373
+ self .assertEqual (p .parent .parent .parent .parent , P ('/' ))
368
374
369
375
def test_parents_common (self ):
370
376
# Relative
@@ -412,6 +418,27 @@ def test_parents_common(self):
412
418
par [- 4 ]
413
419
with self .assertRaises (IndexError ):
414
420
par [3 ]
421
+ # Trailing sep
422
+ p = P ('/a/b/c/' )
423
+ par = p .parents
424
+ self .assertEqual (len (par ), 3 )
425
+ self .assertEqual (par [0 ], P ('/a/b' ))
426
+ self .assertEqual (par [1 ], P ('/a' ))
427
+ self .assertEqual (par [2 ], P ('/' ))
428
+ self .assertEqual (par [- 1 ], P ('/' ))
429
+ self .assertEqual (par [- 2 ], P ('/a' ))
430
+ self .assertEqual (par [- 3 ], P ('/a/b' ))
431
+ self .assertEqual (par [0 :1 ], (P ('/a/b' ),))
432
+ self .assertEqual (par [:2 ], (P ('/a/b' ), P ('/a' )))
433
+ self .assertEqual (par [:- 1 ], (P ('/a/b' ), P ('/a' )))
434
+ self .assertEqual (par [1 :], (P ('/a' ), P ('/' )))
435
+ self .assertEqual (par [::2 ], (P ('/a/b' ), P ('/' )))
436
+ self .assertEqual (par [::- 1 ], (P ('/' ), P ('/a' ), P ('/a/b' )))
437
+ self .assertEqual (list (par ), [P ('/a/b' ), P ('/a' ), P ('/' )])
438
+ with self .assertRaises (IndexError ):
439
+ par [- 4 ]
440
+ with self .assertRaises (IndexError ):
441
+ par [3 ]
415
442
416
443
def test_drive_common (self ):
417
444
P = self .cls
@@ -441,10 +468,13 @@ def test_name_common(self):
441
468
self .assertEqual (P ('.' ).name , '' )
442
469
self .assertEqual (P ('/' ).name , '' )
443
470
self .assertEqual (P ('a/b' ).name , 'b' )
471
+ self .assertEqual (P ('a/b/' ).name , 'b' )
444
472
self .assertEqual (P ('/a/b' ).name , 'b' )
473
+ self .assertEqual (P ('/a/b/' ).name , 'b' )
445
474
self .assertEqual (P ('/a/b/.' ).name , 'b' )
446
475
self .assertEqual (P ('a/b.py' ).name , 'b.py' )
447
476
self .assertEqual (P ('/a/b.py' ).name , 'b.py' )
477
+ self .assertEqual (P ('/etc/cron.d/' ).name , 'cron.d' )
448
478
449
479
def test_suffix_common (self ):
450
480
P = self .cls
@@ -453,7 +483,9 @@ def test_suffix_common(self):
453
483
self .assertEqual (P ('..' ).suffix , '' )
454
484
self .assertEqual (P ('/' ).suffix , '' )
455
485
self .assertEqual (P ('a/b' ).suffix , '' )
486
+ self .assertEqual (P ('a/b/' ).suffix , '' )
456
487
self .assertEqual (P ('/a/b' ).suffix , '' )
488
+ self .assertEqual (P ('/a/b/' ).suffix , '' )
457
489
self .assertEqual (P ('/a/b/.' ).suffix , '' )
458
490
self .assertEqual (P ('a/b.py' ).suffix , '.py' )
459
491
self .assertEqual (P ('/a/b.py' ).suffix , '.py' )
@@ -465,14 +497,17 @@ def test_suffix_common(self):
465
497
self .assertEqual (P ('/a/b.tar.gz' ).suffix , '.gz' )
466
498
self .assertEqual (P ('a/Some name. Ending with a dot.' ).suffix , '' )
467
499
self .assertEqual (P ('/a/Some name. Ending with a dot.' ).suffix , '' )
500
+ self .assertEqual (P ('/etc/cron.d/' ).suffix , '.d' )
468
501
469
502
def test_suffixes_common (self ):
470
503
P = self .cls
471
504
self .assertEqual (P ('' ).suffixes , [])
472
505
self .assertEqual (P ('.' ).suffixes , [])
473
506
self .assertEqual (P ('/' ).suffixes , [])
474
507
self .assertEqual (P ('a/b' ).suffixes , [])
508
+ self .assertEqual (P ('a/b/' ).suffixes , [])
475
509
self .assertEqual (P ('/a/b' ).suffixes , [])
510
+ self .assertEqual (P ('/a/b/' ).suffixes , [])
476
511
self .assertEqual (P ('/a/b/.' ).suffixes , [])
477
512
self .assertEqual (P ('a/b.py' ).suffixes , ['.py' ])
478
513
self .assertEqual (P ('/a/b.py' ).suffixes , ['.py' ])
@@ -484,6 +519,7 @@ def test_suffixes_common(self):
484
519
self .assertEqual (P ('/a/b.tar.gz' ).suffixes , ['.tar' , '.gz' ])
485
520
self .assertEqual (P ('a/Some name. Ending with a dot.' ).suffixes , [])
486
521
self .assertEqual (P ('/a/Some name. Ending with a dot.' ).suffixes , [])
522
+ self .assertEqual (P ('/etc/cron.d/' ).suffixes , ['.d' ])
487
523
488
524
def test_stem_common (self ):
489
525
P = self .cls
@@ -492,12 +528,14 @@ def test_stem_common(self):
492
528
self .assertEqual (P ('..' ).stem , '..' )
493
529
self .assertEqual (P ('/' ).stem , '' )
494
530
self .assertEqual (P ('a/b' ).stem , 'b' )
531
+ self .assertEqual (P ('a/b/' ).stem , 'b' )
495
532
self .assertEqual (P ('a/b.py' ).stem , 'b' )
496
533
self .assertEqual (P ('a/.hgrc' ).stem , '.hgrc' )
497
534
self .assertEqual (P ('a/.hg.rc' ).stem , '.hg' )
498
535
self .assertEqual (P ('a/b.tar.gz' ).stem , 'b.tar' )
499
536
self .assertEqual (P ('a/Some name. Ending with a dot.' ).stem ,
500
537
'Some name. Ending with a dot.' )
538
+ self .assertEqual (P ('/etc/cron.d/' ).stem , 'cron' )
501
539
502
540
def test_with_name_common (self ):
503
541
P = self .cls
@@ -507,6 +545,7 @@ def test_with_name_common(self):
507
545
self .assertEqual (P ('/a/b.py' ).with_name ('d.xml' ), P ('/a/d.xml' ))
508
546
self .assertEqual (P ('a/Dot ending.' ).with_name ('d.xml' ), P ('a/d.xml' ))
509
547
self .assertEqual (P ('/a/Dot ending.' ).with_name ('d.xml' ), P ('/a/d.xml' ))
548
+ self .assertEqual (P ('/etc/cron.d/' ).with_name ('tron.g' ), P ('/etc/tron.g/' ))
510
549
self .assertRaises (ValueError , P ('' ).with_name , 'd.xml' )
511
550
self .assertRaises (ValueError , P ('.' ).with_name , 'd.xml' )
512
551
self .assertRaises (ValueError , P ('/' ).with_name , 'd.xml' )
@@ -525,6 +564,7 @@ def test_with_stem_common(self):
525
564
self .assertEqual (P ('/a/b.tar.gz' ).with_stem ('d' ), P ('/a/d.gz' ))
526
565
self .assertEqual (P ('a/Dot ending.' ).with_stem ('d' ), P ('a/d' ))
527
566
self .assertEqual (P ('/a/Dot ending.' ).with_stem ('d' ), P ('/a/d' ))
567
+ self .assertEqual (P ('/etc/cron.d/' ).with_stem ('tron' ), P ('/etc/tron.d/' ))
528
568
self .assertRaises (ValueError , P ('' ).with_stem , 'd' )
529
569
self .assertRaises (ValueError , P ('.' ).with_stem , 'd' )
530
570
self .assertRaises (ValueError , P ('/' ).with_stem , 'd' )
@@ -540,9 +580,11 @@ def test_with_suffix_common(self):
540
580
self .assertEqual (P ('/a/b' ).with_suffix ('.gz' ), P ('/a/b.gz' ))
541
581
self .assertEqual (P ('a/b.py' ).with_suffix ('.gz' ), P ('a/b.gz' ))
542
582
self .assertEqual (P ('/a/b.py' ).with_suffix ('.gz' ), P ('/a/b.gz' ))
583
+ self .assertEqual (P ('/etc/cron.d/' ).with_suffix ('.g' ), P ('/etc/cron.g/' ))
543
584
# Stripping suffix.
544
585
self .assertEqual (P ('a/b.py' ).with_suffix ('' ), P ('a/b' ))
545
586
self .assertEqual (P ('/a/b' ).with_suffix ('' ), P ('/a/b' ))
587
+ self .assertEqual (P ('/etc/cron.d/' ).with_suffix ('' ), P ('/etc/cron/' ))
546
588
# Path doesn't have a "filename" component.
547
589
self .assertRaises (ValueError , P ('' ).with_suffix , '.gz' )
548
590
self .assertRaises (ValueError , P ('.' ).with_suffix , '.gz' )
@@ -636,6 +678,25 @@ def test_relative_to_common(self):
636
678
self .assertRaises (ValueError , p .relative_to , P ("a/.." ), walk_up = True )
637
679
self .assertRaises (ValueError , p .relative_to , P ("/a/.." ), walk_up = True )
638
680
681
+ def test_relative_to_trailing_sep (self ):
682
+ P = self .cls
683
+ self .assertEqual (P ('foo' ).relative_to ('foo' ), P ())
684
+ self .assertEqual (P ('foo' ).relative_to ('foo/' ), P ())
685
+ self .assertEqual (P ('foo/' ).relative_to ('foo' ), P ())
686
+ self .assertEqual (P ('foo/' ).relative_to ('foo/' ), P ())
687
+ self .assertEqual (P ('foo/bar' ).relative_to ('foo' ), P ('bar' ))
688
+ self .assertEqual (P ('foo/bar' ).relative_to ('foo/' ), P ('bar' ))
689
+ self .assertEqual (P ('foo/bar/' ).relative_to ('foo' ), P ('bar/' ))
690
+ self .assertEqual (P ('foo/bar/' ).relative_to ('foo/' ), P ('bar/' ))
691
+ self .assertEqual (P ('foo' ).relative_to ('foo/bar' , walk_up = True ), P ('..' ))
692
+ self .assertEqual (P ('foo' ).relative_to ('foo/bar/' , walk_up = True ), P ('..' ))
693
+ self .assertEqual (P ('foo/' ).relative_to ('foo/bar' , walk_up = True ), P ('../' ))
694
+ self .assertEqual (P ('foo/' ).relative_to ('foo/bar/' , walk_up = True ), P ('../' ))
695
+ self .assertEqual (P ('foo/oof' ).relative_to ('foo/bar' , walk_up = True ), P ('../oof' ))
696
+ self .assertEqual (P ('foo/oof' ).relative_to ('foo/bar/' , walk_up = True ), P ('../oof' ))
697
+ self .assertEqual (P ('foo/oof/' ).relative_to ('foo/bar' , walk_up = True ), P ('../oof/' ))
698
+ self .assertEqual (P ('foo/oof/' ).relative_to ('foo/bar/' , walk_up = True ), P ('../oof/' ))
699
+
639
700
def test_is_relative_to_common (self ):
640
701
P = self .cls
641
702
p = P ('a/b' )
@@ -671,6 +732,25 @@ def test_is_relative_to_common(self):
671
732
self .assertFalse (p .is_relative_to ('' ))
672
733
self .assertFalse (p .is_relative_to (P ('a' )))
673
734
735
+ def test_is_relative_to_trailing_sep (self ):
736
+ P = self .cls
737
+ self .assertTrue (P ('foo' ).is_relative_to ('foo' ))
738
+ self .assertTrue (P ('foo' ).is_relative_to ('foo/' ))
739
+ self .assertTrue (P ('foo/' ).is_relative_to ('foo' ))
740
+ self .assertTrue (P ('foo/' ).is_relative_to ('foo/' ))
741
+ self .assertTrue (P ('foo/bar' ).is_relative_to ('foo' ))
742
+ self .assertTrue (P ('foo/bar' ).is_relative_to ('foo/' ))
743
+ self .assertTrue (P ('foo/bar/' ).is_relative_to ('foo' ))
744
+ self .assertTrue (P ('foo/bar/' ).is_relative_to ('foo/' ))
745
+ self .assertFalse (P ('foo' ).is_relative_to ('foo/bar' ))
746
+ self .assertFalse (P ('foo' ).is_relative_to ('foo/bar/' ))
747
+ self .assertFalse (P ('foo/' ).is_relative_to ('foo/bar' ))
748
+ self .assertFalse (P ('foo/' ).is_relative_to ('foo/bar/' ))
749
+ self .assertFalse (P ('foo/oof' ).is_relative_to ('foo/bar' ))
750
+ self .assertFalse (P ('foo/oof' ).is_relative_to ('foo/bar/' ))
751
+ self .assertFalse (P ('foo/oof/' ).is_relative_to ('foo/bar' ))
752
+ self .assertFalse (P ('foo/oof/' ).is_relative_to ('foo/bar/' ))
753
+
674
754
675
755
#
676
756
# Tests for the virtual classes.
0 commit comments