Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 9ffef4d

Browse files
authored
[3.12] GH-110488: Fix two small issues in pathlib.PurePath.with_name() (GH-110651) (#110678)
Ensure that `PurePath('foo/a').with_name('.')` raises `ValueError` Ensure that `PureWindowsPath('foo/a').with_name('a:b')` does not raise `ValueError`. (cherry picked from commit b5f7777)
1 parent be381b5 commit 9ffef4d

File tree

3 files changed

+15
-6
lines changed

3 files changed

+15
-6
lines changed

Lib/pathlib.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -630,8 +630,7 @@ def with_name(self, name):
630630
if not self.name:
631631
raise ValueError("%r has an empty name" % (self,))
632632
f = self._flavour
633-
drv, root, tail = f.splitroot(name)
634-
if drv or root or not tail or f.sep in tail or (f.altsep and f.altsep in tail):
633+
if not name or f.sep in name or (f.altsep and f.altsep in name) or name == '.':
635634
raise ValueError("Invalid name %r" % (name))
636635
return self._from_parsed_parts(self.drive, self.root,
637636
self._tail[:-1] + [name])

Lib/test/test_pathlib.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -546,6 +546,7 @@ def test_with_name_common(self):
546546
self.assertRaises(ValueError, P('.').with_name, 'd.xml')
547547
self.assertRaises(ValueError, P('/').with_name, 'd.xml')
548548
self.assertRaises(ValueError, P('a/b').with_name, '')
549+
self.assertRaises(ValueError, P('a/b').with_name, '.')
549550
self.assertRaises(ValueError, P('a/b').with_name, '/c')
550551
self.assertRaises(ValueError, P('a/b').with_name, 'c/')
551552
self.assertRaises(ValueError, P('a/b').with_name, 'c/d')
@@ -563,6 +564,7 @@ def test_with_stem_common(self):
563564
self.assertRaises(ValueError, P('.').with_stem, 'd')
564565
self.assertRaises(ValueError, P('/').with_stem, 'd')
565566
self.assertRaises(ValueError, P('a/b').with_stem, '')
567+
self.assertRaises(ValueError, P('a/b').with_stem, '.')
566568
self.assertRaises(ValueError, P('a/b').with_stem, '/c')
567569
self.assertRaises(ValueError, P('a/b').with_stem, 'c/')
568570
self.assertRaises(ValueError, P('a/b').with_stem, 'c/d')
@@ -1167,8 +1169,10 @@ def test_with_name(self):
11671169
self.assertRaises(ValueError, P('c:').with_name, 'd.xml')
11681170
self.assertRaises(ValueError, P('c:/').with_name, 'd.xml')
11691171
self.assertRaises(ValueError, P('//My/Share').with_name, 'd.xml')
1170-
self.assertRaises(ValueError, P('c:a/b').with_name, 'd:')
1171-
self.assertRaises(ValueError, P('c:a/b').with_name, 'd:e')
1172+
self.assertEqual(str(P('a').with_name('d:')), '.\\d:')
1173+
self.assertEqual(str(P('a').with_name('d:e')), '.\\d:e')
1174+
self.assertEqual(P('c:a/b').with_name('d:'), P('c:a/d:'))
1175+
self.assertEqual(P('c:a/b').with_name('d:e'), P('c:a/d:e'))
11721176
self.assertRaises(ValueError, P('c:a/b').with_name, 'd:/e')
11731177
self.assertRaises(ValueError, P('c:a/b').with_name, '//My/Share')
11741178

@@ -1181,8 +1185,10 @@ def test_with_stem(self):
11811185
self.assertRaises(ValueError, P('c:').with_stem, 'd')
11821186
self.assertRaises(ValueError, P('c:/').with_stem, 'd')
11831187
self.assertRaises(ValueError, P('//My/Share').with_stem, 'd')
1184-
self.assertRaises(ValueError, P('c:a/b').with_stem, 'd:')
1185-
self.assertRaises(ValueError, P('c:a/b').with_stem, 'd:e')
1188+
self.assertEqual(str(P('a').with_stem('d:')), '.\\d:')
1189+
self.assertEqual(str(P('a').with_stem('d:e')), '.\\d:e')
1190+
self.assertEqual(P('c:a/b').with_stem('d:'), P('c:a/d:'))
1191+
self.assertEqual(P('c:a/b').with_stem('d:e'), P('c:a/d:e'))
11861192
self.assertRaises(ValueError, P('c:a/b').with_stem, 'd:/e')
11871193
self.assertRaises(ValueError, P('c:a/b').with_stem, '//My/Share')
11881194

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
Fix a couple of issues in :meth:`pathlib.PurePath.with_name`: a single dot
2+
was incorrectly considered a valid name, and in :class:`PureWindowsPath`, a
3+
name with an NTFS alternate data stream, like ``a:b``, was incorrectly
4+
considered invalid.

0 commit comments

Comments
 (0)