]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
GH-114610: Fix `pathlib._abc.PurePathBase.with_suffix('.ext')` handling of stems...
authorBarney Gale <barney.gale@gmail.com>
Tue, 30 Jan 2024 14:25:16 +0000 (14:25 +0000)
committerGitHub <noreply@github.com>
Tue, 30 Jan 2024 14:25:16 +0000 (14:25 +0000)
Raise `ValueError` if `with_suffix('.ext')` is called on a path without a
stem. Paths may only have a non-empty suffix if they also have a non-empty
stem.

ABC-only bugfix; no effect on public classes.

Lib/pathlib/_abc.py
Lib/test/test_pathlib/test_pathlib.py
Lib/test/test_pathlib/test_pathlib_abc.py

index ad5684829ebc80069039986faf3140fe07bbf0b7..580d631cbf3b5308240bb98bdd1b137fb38476b3 100644 (file)
@@ -299,10 +299,13 @@ class PurePathBase:
         has no suffix, add given suffix.  If the given suffix is an empty
         string, remove the suffix from the path.
         """
+        stem = self.stem
         if not suffix:
-            return self.with_name(self.stem)
+            return self.with_name(stem)
+        elif not stem:
+            raise ValueError(f"{self!r} has an empty name")
         elif suffix.startswith('.') and len(suffix) > 1:
-            return self.with_name(self.stem + suffix)
+            return self.with_name(stem + suffix)
         else:
             raise ValueError(f"Invalid suffix {suffix!r}")
 
index 5ce3b605c58e6373022c222c0586c86d08512849..a8cc30ef0ab63f684e834c6c5e9850163baabc8d 100644 (file)
@@ -327,13 +327,6 @@ class PurePathTest(test_pathlib_abc.DummyPurePathTest):
         self.assertRaises(ValueError, P('a/b').with_stem, '')
         self.assertRaises(ValueError, P('a/b').with_stem, '.')
 
-    def test_with_suffix_empty(self):
-        # Path doesn't have a "filename" component.
-        P = self.cls
-        self.assertRaises(ValueError, P('').with_suffix, '.gz')
-        self.assertRaises(ValueError, P('.').with_suffix, '.gz')
-        self.assertRaises(ValueError, P('/').with_suffix, '.gz')
-
     def test_relative_to_several_args(self):
         P = self.cls
         p = P('a/b')
index ab989cb5503f99df1aed4be7a5a6ebe9fdb5f8d8..18a612f6b81bacea79e3e650cfd552124844139e 100644 (file)
@@ -977,9 +977,8 @@ class DummyPurePathTest(unittest.TestCase):
     def test_with_suffix_empty(self):
         P = self.cls
         # Path doesn't have a "filename" component.
-        self.assertEqual(P('').with_suffix('.gz'), P('.gz'))
-        self.assertEqual(P('.').with_suffix('.gz'), P('..gz'))
-        self.assertEqual(P('/').with_suffix('.gz'), P('/.gz'))
+        self.assertRaises(ValueError, P('').with_suffix, '.gz')
+        self.assertRaises(ValueError, P('/').with_suffix, '.gz')
 
     def test_with_suffix_seps(self):
         P = self.cls