diff --git a/Lib/pathlib/types.py b/Lib/pathlib/types.py index cfdbc89644a24a..48fcdf271ec29e 100644 --- a/Lib/pathlib/types.py +++ b/Lib/pathlib/types.py @@ -133,9 +133,12 @@ def stem(self): def with_name(self, name): """Return a new path with the file name changed.""" split = self.parser.split - if split(name)[0]: + if not name or split(name)[0]: raise ValueError(f"Invalid name {name!r}") - return self.with_segments(split(str(self))[0], name) + parent, old_name = split(str(self)) + if not old_name: + raise ValueError(f"{self!r} has an empty name") + return self.with_segments(parent, name) def with_stem(self, stem): """Return a new path with the stem changed.""" diff --git a/Lib/test/test_pathlib/test_pathlib.py b/Lib/test/test_pathlib/test_pathlib.py index 830bfa4ca78138..3c3ef387fe077f 100644 --- a/Lib/test/test_pathlib/test_pathlib.py +++ b/Lib/test/test_pathlib/test_pathlib.py @@ -413,18 +413,12 @@ def test_stem_empty(self): def test_with_name_empty(self): P = self.cls - 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, '.') def test_with_stem_empty(self): P = self.cls - 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, '.') def test_is_reserved_deprecated(self): diff --git a/Lib/test/test_pathlib/test_pathlib_abc.py b/Lib/test/test_pathlib/test_pathlib_abc.py index dea16e6351265f..a1a30838b6e75f 100644 --- a/Lib/test/test_pathlib/test_pathlib_abc.py +++ b/Lib/test/test_pathlib/test_pathlib_abc.py @@ -680,6 +680,9 @@ def test_with_name_common(self): self.assertEqual(P('/a/b.py').with_name('d.xml'), P('/a/d.xml')) self.assertEqual(P('a/Dot ending.').with_name('d.xml'), P('a/d.xml')) self.assertEqual(P('/a/Dot ending.').with_name('d.xml'), P('/a/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, '') @needs_windows def test_with_name_windows(self): @@ -700,10 +703,7 @@ def test_with_name_windows(self): def test_with_name_empty(self): P = self.cls - self.assertEqual(P('').with_name('d.xml'), P('d.xml')) self.assertEqual(P('.').with_name('d.xml'), P('d.xml')) - self.assertEqual(P('/').with_name('d.xml'), P('/d.xml')) - self.assertEqual(P('a/b').with_name(''), P('a/')) self.assertEqual(P('a/b').with_name('.'), P('a/.')) def test_with_name_seps(self): @@ -721,6 +721,11 @@ def test_with_stem_common(self): self.assertEqual(P('/a/b.tar.gz').with_stem('d'), P('/a/d.gz')) self.assertEqual(P('a/Dot ending.').with_stem('d'), P('a/d.')) self.assertEqual(P('/a/Dot ending.').with_stem('d'), P('/a/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('foo.gz').with_stem, '') + self.assertRaises(ValueError, P('/a/b/foo.gz').with_stem, '') @needs_windows def test_with_stem_windows(self): @@ -741,13 +746,8 @@ def test_with_stem_windows(self): def test_with_stem_empty(self): P = self.cls - self.assertEqual(P('').with_stem('d'), P('d')) self.assertEqual(P('.').with_stem('d'), P('d')) - self.assertEqual(P('/').with_stem('d'), P('/d')) - self.assertEqual(P('a/b').with_stem(''), P('a/')) self.assertEqual(P('a/b').with_stem('.'), P('a/.')) - self.assertRaises(ValueError, P('foo.gz').with_stem, '') - self.assertRaises(ValueError, P('/a/b/foo.gz').with_stem, '') def test_with_stem_seps(self): P = self.cls