mirror of
https://github.com/python/cpython.git
synced 2025-09-22 08:23:36 +00:00
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`.
This commit is contained in:
parent
790ecf6302
commit
b5f7777cb3
3 changed files with 15 additions and 6 deletions
|
@ -603,8 +603,7 @@ class PurePath:
|
||||||
if not self.name:
|
if not self.name:
|
||||||
raise ValueError("%r has an empty name" % (self,))
|
raise ValueError("%r has an empty name" % (self,))
|
||||||
m = self.pathmod
|
m = self.pathmod
|
||||||
drv, root, tail = m.splitroot(name)
|
if not name or m.sep in name or (m.altsep and m.altsep in name) or name == '.':
|
||||||
if drv or root or not tail or m.sep in tail or (m.altsep and m.altsep in tail):
|
|
||||||
raise ValueError("Invalid name %r" % (name))
|
raise ValueError("Invalid name %r" % (name))
|
||||||
return self._from_parsed_parts(self.drive, self.root,
|
return self._from_parsed_parts(self.drive, self.root,
|
||||||
self._tail[:-1] + [name])
|
self._tail[:-1] + [name])
|
||||||
|
|
|
@ -614,6 +614,7 @@ class PurePathTest(unittest.TestCase):
|
||||||
self.assertRaises(ValueError, P('.').with_name, 'd.xml')
|
self.assertRaises(ValueError, P('.').with_name, 'd.xml')
|
||||||
self.assertRaises(ValueError, P('/').with_name, 'd.xml')
|
self.assertRaises(ValueError, P('/').with_name, 'd.xml')
|
||||||
self.assertRaises(ValueError, P('a/b').with_name, '')
|
self.assertRaises(ValueError, P('a/b').with_name, '')
|
||||||
|
self.assertRaises(ValueError, P('a/b').with_name, '.')
|
||||||
self.assertRaises(ValueError, P('a/b').with_name, '/c')
|
self.assertRaises(ValueError, P('a/b').with_name, '/c')
|
||||||
self.assertRaises(ValueError, P('a/b').with_name, 'c/')
|
self.assertRaises(ValueError, P('a/b').with_name, 'c/')
|
||||||
self.assertRaises(ValueError, P('a/b').with_name, 'c/d')
|
self.assertRaises(ValueError, P('a/b').with_name, 'c/d')
|
||||||
|
@ -631,6 +632,7 @@ class PurePathTest(unittest.TestCase):
|
||||||
self.assertRaises(ValueError, P('.').with_stem, 'd')
|
self.assertRaises(ValueError, P('.').with_stem, 'd')
|
||||||
self.assertRaises(ValueError, P('/').with_stem, 'd')
|
self.assertRaises(ValueError, P('/').with_stem, 'd')
|
||||||
self.assertRaises(ValueError, P('a/b').with_stem, '')
|
self.assertRaises(ValueError, P('a/b').with_stem, '')
|
||||||
|
self.assertRaises(ValueError, P('a/b').with_stem, '.')
|
||||||
self.assertRaises(ValueError, P('a/b').with_stem, '/c')
|
self.assertRaises(ValueError, P('a/b').with_stem, '/c')
|
||||||
self.assertRaises(ValueError, P('a/b').with_stem, 'c/')
|
self.assertRaises(ValueError, P('a/b').with_stem, 'c/')
|
||||||
self.assertRaises(ValueError, P('a/b').with_stem, 'c/d')
|
self.assertRaises(ValueError, P('a/b').with_stem, 'c/d')
|
||||||
|
@ -1235,8 +1237,10 @@ class PureWindowsPathTest(PurePathTest):
|
||||||
self.assertRaises(ValueError, P('c:').with_name, 'd.xml')
|
self.assertRaises(ValueError, P('c:').with_name, 'd.xml')
|
||||||
self.assertRaises(ValueError, P('c:/').with_name, 'd.xml')
|
self.assertRaises(ValueError, P('c:/').with_name, 'd.xml')
|
||||||
self.assertRaises(ValueError, P('//My/Share').with_name, 'd.xml')
|
self.assertRaises(ValueError, P('//My/Share').with_name, 'd.xml')
|
||||||
self.assertRaises(ValueError, P('c:a/b').with_name, 'd:')
|
self.assertEqual(str(P('a').with_name('d:')), '.\\d:')
|
||||||
self.assertRaises(ValueError, P('c:a/b').with_name, 'd:e')
|
self.assertEqual(str(P('a').with_name('d:e')), '.\\d:e')
|
||||||
|
self.assertEqual(P('c:a/b').with_name('d:'), P('c:a/d:'))
|
||||||
|
self.assertEqual(P('c:a/b').with_name('d:e'), P('c:a/d:e'))
|
||||||
self.assertRaises(ValueError, P('c:a/b').with_name, 'd:/e')
|
self.assertRaises(ValueError, P('c:a/b').with_name, 'd:/e')
|
||||||
self.assertRaises(ValueError, P('c:a/b').with_name, '//My/Share')
|
self.assertRaises(ValueError, P('c:a/b').with_name, '//My/Share')
|
||||||
|
|
||||||
|
@ -1249,8 +1253,10 @@ class PureWindowsPathTest(PurePathTest):
|
||||||
self.assertRaises(ValueError, P('c:').with_stem, 'd')
|
self.assertRaises(ValueError, P('c:').with_stem, 'd')
|
||||||
self.assertRaises(ValueError, P('c:/').with_stem, 'd')
|
self.assertRaises(ValueError, P('c:/').with_stem, 'd')
|
||||||
self.assertRaises(ValueError, P('//My/Share').with_stem, 'd')
|
self.assertRaises(ValueError, P('//My/Share').with_stem, 'd')
|
||||||
self.assertRaises(ValueError, P('c:a/b').with_stem, 'd:')
|
self.assertEqual(str(P('a').with_stem('d:')), '.\\d:')
|
||||||
self.assertRaises(ValueError, P('c:a/b').with_stem, 'd:e')
|
self.assertEqual(str(P('a').with_stem('d:e')), '.\\d:e')
|
||||||
|
self.assertEqual(P('c:a/b').with_stem('d:'), P('c:a/d:'))
|
||||||
|
self.assertEqual(P('c:a/b').with_stem('d:e'), P('c:a/d:e'))
|
||||||
self.assertRaises(ValueError, P('c:a/b').with_stem, 'd:/e')
|
self.assertRaises(ValueError, P('c:a/b').with_stem, 'd:/e')
|
||||||
self.assertRaises(ValueError, P('c:a/b').with_stem, '//My/Share')
|
self.assertRaises(ValueError, P('c:a/b').with_stem, '//My/Share')
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
Fix a couple of issues in :meth:`pathlib.PurePath.with_name`: a single dot
|
||||||
|
was incorrectly considered a valid name, and in :class:`PureWindowsPath`, a
|
||||||
|
name with an NTFS alternate data stream, like ``a:b``, was incorrectly
|
||||||
|
considered invalid.
|
Loading…
Add table
Add a link
Reference in a new issue