Skip to content

Commit b5f7777

Browse files
authored
GH-110488: Fix two small issues in pathlib.PurePath.with_name() (#110651)
Ensure that `PurePath('foo/a').with_name('.')` raises `ValueError` Ensure that `PureWindowsPath('foo/a').with_name('a:b')` does not raise `ValueError`.
1 parent 790ecf6 commit b5f7777

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
@@ -603,8 +603,7 @@ def with_name(self, name):
603603
if not self.name:
604604
raise ValueError("%r has an empty name" % (self,))
605605
m = self.pathmod
606-
drv, root, tail = m.splitroot(name)
607-
if drv or root or not tail or m.sep in tail or (m.altsep and m.altsep in tail):
606+
if not name or m.sep in name or (m.altsep and m.altsep in name) or name == '.':
608607
raise ValueError("Invalid name %r" % (name))
609608
return self._from_parsed_parts(self.drive, self.root,
610609
self._tail[:-1] + [name])

Lib/test/test_pathlib.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -614,6 +614,7 @@ def test_with_name_common(self):
614614
self.assertRaises(ValueError, P('.').with_name, 'd.xml')
615615
self.assertRaises(ValueError, P('/').with_name, 'd.xml')
616616
self.assertRaises(ValueError, P('a/b').with_name, '')
617+
self.assertRaises(ValueError, P('a/b').with_name, '.')
617618
self.assertRaises(ValueError, P('a/b').with_name, '/c')
618619
self.assertRaises(ValueError, P('a/b').with_name, 'c/')
619620
self.assertRaises(ValueError, P('a/b').with_name, 'c/d')
@@ -631,6 +632,7 @@ def test_with_stem_common(self):
631632
self.assertRaises(ValueError, P('.').with_stem, 'd')
632633
self.assertRaises(ValueError, P('/').with_stem, 'd')
633634
self.assertRaises(ValueError, P('a/b').with_stem, '')
635+
self.assertRaises(ValueError, P('a/b').with_stem, '.')
634636
self.assertRaises(ValueError, P('a/b').with_stem, '/c')
635637
self.assertRaises(ValueError, P('a/b').with_stem, 'c/')
636638
self.assertRaises(ValueError, P('a/b').with_stem, 'c/d')
@@ -1235,8 +1237,10 @@ def test_with_name(self):
12351237
self.assertRaises(ValueError, P('c:').with_name, 'd.xml')
12361238
self.assertRaises(ValueError, P('c:/').with_name, 'd.xml')
12371239
self.assertRaises(ValueError, P('//My/Share').with_name, 'd.xml')
1238-
self.assertRaises(ValueError, P('c:a/b').with_name, 'd:')
1239-
self.assertRaises(ValueError, P('c:a/b').with_name, 'd:e')
1240+
self.assertEqual(str(P('a').with_name('d:')), '.\\d:')
1241+
self.assertEqual(str(P('a').with_name('d:e')), '.\\d:e')
1242+
self.assertEqual(P('c:a/b').with_name('d:'), P('c:a/d:'))
1243+
self.assertEqual(P('c:a/b').with_name('d:e'), P('c:a/d:e'))
12401244
self.assertRaises(ValueError, P('c:a/b').with_name, 'd:/e')
12411245
self.assertRaises(ValueError, P('c:a/b').with_name, '//My/Share')
12421246

@@ -1249,8 +1253,10 @@ def test_with_stem(self):
12491253
self.assertRaises(ValueError, P('c:').with_stem, 'd')
12501254
self.assertRaises(ValueError, P('c:/').with_stem, 'd')
12511255
self.assertRaises(ValueError, P('//My/Share').with_stem, 'd')
1252-
self.assertRaises(ValueError, P('c:a/b').with_stem, 'd:')
1253-
self.assertRaises(ValueError, P('c:a/b').with_stem, 'd:e')
1256+
self.assertEqual(str(P('a').with_stem('d:')), '.\\d:')
1257+
self.assertEqual(str(P('a').with_stem('d:e')), '.\\d:e')
1258+
self.assertEqual(P('c:a/b').with_stem('d:'), P('c:a/d:'))
1259+
self.assertEqual(P('c:a/b').with_stem('d:e'), P('c:a/d:e'))
12541260
self.assertRaises(ValueError, P('c:a/b').with_stem, 'd:/e')
12551261
self.assertRaises(ValueError, P('c:a/b').with_stem, '//My/Share')
12561262

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)