@@ -640,13 +640,29 @@ def test_relative_to_common(self):
640640 self .assertEqual (p .relative_to ('a/' ), P ('b' ))
641641 self .assertEqual (p .relative_to (P ('a/b' )), P ())
642642 self .assertEqual (p .relative_to ('a/b' ), P ())
643+ self .assertEqual (p .relative_to (P (), walk_up = True ), P ('a/b' ))
644+ self .assertEqual (p .relative_to ('' , walk_up = True ), P ('a/b' ))
645+ self .assertEqual (p .relative_to (P ('a' ), walk_up = True ), P ('b' ))
646+ self .assertEqual (p .relative_to ('a' , walk_up = True ), P ('b' ))
647+ self .assertEqual (p .relative_to ('a/' , walk_up = True ), P ('b' ))
648+ self .assertEqual (p .relative_to (P ('a/b' ), walk_up = True ), P ())
649+ self .assertEqual (p .relative_to ('a/b' , walk_up = True ), P ())
650+ self .assertEqual (p .relative_to (P ('a/c' ), walk_up = True ), P ('../b' ))
651+ self .assertEqual (p .relative_to ('a/c' , walk_up = True ), P ('../b' ))
652+ self .assertEqual (p .relative_to (P ('a/b/c' ), walk_up = True ), P ('..' ))
653+ self .assertEqual (p .relative_to ('a/b/c' , walk_up = True ), P ('..' ))
654+ self .assertEqual (p .relative_to (P ('c' ), walk_up = True ), P ('../a/b' ))
655+ self .assertEqual (p .relative_to ('c' , walk_up = True ), P ('../a/b' ))
643656 # With several args.
644657 self .assertEqual (p .relative_to ('a' , 'b' ), P ())
658+ self .assertEqual (p .relative_to ('a' , 'b' , walk_up = True ), P ())
645659 # Unrelated paths.
646660 self .assertRaises (ValueError , p .relative_to , P ('c' ))
647661 self .assertRaises (ValueError , p .relative_to , P ('a/b/c' ))
648662 self .assertRaises (ValueError , p .relative_to , P ('a/c' ))
649663 self .assertRaises (ValueError , p .relative_to , P ('/a' ))
664+ self .assertRaises (ValueError , p .relative_to , P ('/' ), walk_up = True )
665+ self .assertRaises (ValueError , p .relative_to , P ('/a' ), walk_up = True )
650666 p = P ('/a/b' )
651667 self .assertEqual (p .relative_to (P ('/' )), P ('a/b' ))
652668 self .assertEqual (p .relative_to ('/' ), P ('a/b' ))
@@ -655,13 +671,28 @@ def test_relative_to_common(self):
655671 self .assertEqual (p .relative_to ('/a/' ), P ('b' ))
656672 self .assertEqual (p .relative_to (P ('/a/b' )), P ())
657673 self .assertEqual (p .relative_to ('/a/b' ), P ())
674+ self .assertEqual (p .relative_to (P ('/' ), walk_up = True ), P ('a/b' ))
675+ self .assertEqual (p .relative_to ('/' , walk_up = True ), P ('a/b' ))
676+ self .assertEqual (p .relative_to (P ('/a' ), walk_up = True ), P ('b' ))
677+ self .assertEqual (p .relative_to ('/a' , walk_up = True ), P ('b' ))
678+ self .assertEqual (p .relative_to ('/a/' , walk_up = True ), P ('b' ))
679+ self .assertEqual (p .relative_to (P ('/a/b' ), walk_up = True ), P ())
680+ self .assertEqual (p .relative_to ('/a/b' , walk_up = True ), P ())
681+ self .assertEqual (p .relative_to (P ('/a/c' ), walk_up = True ), P ('../b' ))
682+ self .assertEqual (p .relative_to ('/a/c' , walk_up = True ), P ('../b' ))
683+ self .assertEqual (p .relative_to (P ('/a/b/c' ), walk_up = True ), P ('..' ))
684+ self .assertEqual (p .relative_to ('/a/b/c' , walk_up = True ), P ('..' ))
685+ self .assertEqual (p .relative_to (P ('/c' ), walk_up = True ), P ('../a/b' ))
686+ self .assertEqual (p .relative_to ('/c' , walk_up = True ), P ('../a/b' ))
658687 # Unrelated paths.
659688 self .assertRaises (ValueError , p .relative_to , P ('/c' ))
660689 self .assertRaises (ValueError , p .relative_to , P ('/a/b/c' ))
661690 self .assertRaises (ValueError , p .relative_to , P ('/a/c' ))
662691 self .assertRaises (ValueError , p .relative_to , P ())
663692 self .assertRaises (ValueError , p .relative_to , '' )
664693 self .assertRaises (ValueError , p .relative_to , P ('a' ))
694+ self .assertRaises (ValueError , p .relative_to , P ('' ), walk_up = True )
695+ self .assertRaises (ValueError , p .relative_to , P ('a' ), walk_up = True )
665696
666697 def test_is_relative_to_common (self ):
667698 P = self .cls
@@ -1124,6 +1155,16 @@ def test_relative_to(self):
11241155 self .assertEqual (p .relative_to ('c:foO/' ), P ('Bar' ))
11251156 self .assertEqual (p .relative_to (P ('c:foO/baR' )), P ())
11261157 self .assertEqual (p .relative_to ('c:foO/baR' ), P ())
1158+ self .assertEqual (p .relative_to (P ('c:' ), walk_up = True ), P ('Foo/Bar' ))
1159+ self .assertEqual (p .relative_to ('c:' , walk_up = True ), P ('Foo/Bar' ))
1160+ self .assertEqual (p .relative_to (P ('c:foO' ), walk_up = True ), P ('Bar' ))
1161+ self .assertEqual (p .relative_to ('c:foO' , walk_up = True ), P ('Bar' ))
1162+ self .assertEqual (p .relative_to ('c:foO/' , walk_up = True ), P ('Bar' ))
1163+ self .assertEqual (p .relative_to (P ('c:foO/baR' ), walk_up = True ), P ())
1164+ self .assertEqual (p .relative_to ('c:foO/baR' , walk_up = True ), P ())
1165+ self .assertEqual (p .relative_to (P ('C:Foo/Bar/Baz' ), walk_up = True ), P ('..' ))
1166+ self .assertEqual (p .relative_to (P ('C:Foo/Baz' ), walk_up = True ), P ('../Bar' ))
1167+ self .assertEqual (p .relative_to (P ('C:Baz/Bar' ), walk_up = True ), P ('../../Foo/Bar' ))
11271168 # Unrelated paths.
11281169 self .assertRaises (ValueError , p .relative_to , P ())
11291170 self .assertRaises (ValueError , p .relative_to , '' )
@@ -1134,6 +1175,13 @@ def test_relative_to(self):
11341175 self .assertRaises (ValueError , p .relative_to , P ('C:/Foo' ))
11351176 self .assertRaises (ValueError , p .relative_to , P ('C:Foo/Bar/Baz' ))
11361177 self .assertRaises (ValueError , p .relative_to , P ('C:Foo/Baz' ))
1178+ self .assertRaises (ValueError , p .relative_to , P (), walk_up = True )
1179+ self .assertRaises (ValueError , p .relative_to , '' , walk_up = True )
1180+ self .assertRaises (ValueError , p .relative_to , P ('d:' ), walk_up = True )
1181+ self .assertRaises (ValueError , p .relative_to , P ('/' ), walk_up = True )
1182+ self .assertRaises (ValueError , p .relative_to , P ('Foo' ), walk_up = True )
1183+ self .assertRaises (ValueError , p .relative_to , P ('/Foo' ), walk_up = True )
1184+ self .assertRaises (ValueError , p .relative_to , P ('C:/Foo' ), walk_up = True )
11371185 p = P ('C:/Foo/Bar' )
11381186 self .assertEqual (p .relative_to (P ('c:' )), P ('/Foo/Bar' ))
11391187 self .assertEqual (p .relative_to ('c:' ), P ('/Foo/Bar' ))
@@ -1146,6 +1194,20 @@ def test_relative_to(self):
11461194 self .assertEqual (p .relative_to ('c:/foO/' ), P ('Bar' ))
11471195 self .assertEqual (p .relative_to (P ('c:/foO/baR' )), P ())
11481196 self .assertEqual (p .relative_to ('c:/foO/baR' ), P ())
1197+ self .assertEqual (p .relative_to (P ('c:' ), walk_up = True ), P ('/Foo/Bar' ))
1198+ self .assertEqual (p .relative_to ('c:' , walk_up = True ), P ('/Foo/Bar' ))
1199+ self .assertEqual (str (p .relative_to (P ('c:' ), walk_up = True )), '\\ Foo\\ Bar' )
1200+ self .assertEqual (str (p .relative_to ('c:' , walk_up = True )), '\\ Foo\\ Bar' )
1201+ self .assertEqual (p .relative_to (P ('c:/' ), walk_up = True ), P ('Foo/Bar' ))
1202+ self .assertEqual (p .relative_to ('c:/' , walk_up = True ), P ('Foo/Bar' ))
1203+ self .assertEqual (p .relative_to (P ('c:/foO' ), walk_up = True ), P ('Bar' ))
1204+ self .assertEqual (p .relative_to ('c:/foO' , walk_up = True ), P ('Bar' ))
1205+ self .assertEqual (p .relative_to ('c:/foO/' , walk_up = True ), P ('Bar' ))
1206+ self .assertEqual (p .relative_to (P ('c:/foO/baR' ), walk_up = True ), P ())
1207+ self .assertEqual (p .relative_to ('c:/foO/baR' , walk_up = True ), P ())
1208+ self .assertEqual (p .relative_to ('C:/Baz' , walk_up = True ), P ('../Foo/Bar' ))
1209+ self .assertEqual (p .relative_to ('C:/Foo/Bar/Baz' , walk_up = True ), P ('..' ))
1210+ self .assertEqual (p .relative_to ('C:/Foo/Baz' , walk_up = True ), P ('../Bar' ))
11491211 # Unrelated paths.
11501212 self .assertRaises (ValueError , p .relative_to , P ('C:/Baz' ))
11511213 self .assertRaises (ValueError , p .relative_to , P ('C:/Foo/Bar/Baz' ))
@@ -1156,6 +1218,12 @@ def test_relative_to(self):
11561218 self .assertRaises (ValueError , p .relative_to , P ('/' ))
11571219 self .assertRaises (ValueError , p .relative_to , P ('/Foo' ))
11581220 self .assertRaises (ValueError , p .relative_to , P ('//C/Foo' ))
1221+ self .assertRaises (ValueError , p .relative_to , P ('C:Foo' ), walk_up = True )
1222+ self .assertRaises (ValueError , p .relative_to , P ('d:' ), walk_up = True )
1223+ self .assertRaises (ValueError , p .relative_to , P ('d:/' ), walk_up = True )
1224+ self .assertRaises (ValueError , p .relative_to , P ('/' ), walk_up = True )
1225+ self .assertRaises (ValueError , p .relative_to , P ('/Foo' ), walk_up = True )
1226+ self .assertRaises (ValueError , p .relative_to , P ('//C/Foo' ), walk_up = True )
11591227 # UNC paths.
11601228 p = P ('//Server/Share/Foo/Bar' )
11611229 self .assertEqual (p .relative_to (P ('//sErver/sHare' )), P ('Foo/Bar' ))
@@ -1166,11 +1234,25 @@ def test_relative_to(self):
11661234 self .assertEqual (p .relative_to ('//sErver/sHare/Foo/' ), P ('Bar' ))
11671235 self .assertEqual (p .relative_to (P ('//sErver/sHare/Foo/Bar' )), P ())
11681236 self .assertEqual (p .relative_to ('//sErver/sHare/Foo/Bar' ), P ())
1237+ self .assertEqual (p .relative_to (P ('//sErver/sHare' ), walk_up = True ), P ('Foo/Bar' ))
1238+ self .assertEqual (p .relative_to ('//sErver/sHare' , walk_up = True ), P ('Foo/Bar' ))
1239+ self .assertEqual (p .relative_to ('//sErver/sHare/' , walk_up = True ), P ('Foo/Bar' ))
1240+ self .assertEqual (p .relative_to (P ('//sErver/sHare/Foo' ), walk_up = True ), P ('Bar' ))
1241+ self .assertEqual (p .relative_to ('//sErver/sHare/Foo' , walk_up = True ), P ('Bar' ))
1242+ self .assertEqual (p .relative_to ('//sErver/sHare/Foo/' , walk_up = True ), P ('Bar' ))
1243+ self .assertEqual (p .relative_to (P ('//sErver/sHare/Foo/Bar' ), walk_up = True ), P ())
1244+ self .assertEqual (p .relative_to ('//sErver/sHare/Foo/Bar' , walk_up = True ), P ())
1245+ self .assertEqual (p .relative_to (P ('//sErver/sHare/bar' ), walk_up = True ), P ('../Foo/Bar' ))
1246+ self .assertEqual (p .relative_to ('//sErver/sHare/bar' , walk_up = True ), P ('../Foo/Bar' ))
11691247 # Unrelated paths.
11701248 self .assertRaises (ValueError , p .relative_to , P ('/Server/Share/Foo' ))
11711249 self .assertRaises (ValueError , p .relative_to , P ('c:/Server/Share/Foo' ))
11721250 self .assertRaises (ValueError , p .relative_to , P ('//z/Share/Foo' ))
11731251 self .assertRaises (ValueError , p .relative_to , P ('//Server/z/Foo' ))
1252+ self .assertRaises (ValueError , p .relative_to , P ('/Server/Share/Foo' ), walk_up = True )
1253+ self .assertRaises (ValueError , p .relative_to , P ('c:/Server/Share/Foo' ), walk_up = True )
1254+ self .assertRaises (ValueError , p .relative_to , P ('//z/Share/Foo' ), walk_up = True )
1255+ self .assertRaises (ValueError , p .relative_to , P ('//Server/z/Foo' ), walk_up = True )
11741256
11751257 def test_is_relative_to (self ):
11761258 P = self .cls
0 commit comments