Skip to content

Commit 809eed4

Browse files
authored
GH-114610: Fix pathlib._abc.PurePathBase.with_suffix('.ext') handling of stems (#114613)
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.
1 parent e21754d commit 809eed4

File tree

3 files changed

+7
-12
lines changed

3 files changed

+7
-12
lines changed

Lib/pathlib/_abc.py

+5-2
Original file line numberDiff line numberDiff line change
@@ -299,10 +299,13 @@ def with_suffix(self, suffix):
299299
has no suffix, add given suffix. If the given suffix is an empty
300300
string, remove the suffix from the path.
301301
"""
302+
stem = self.stem
302303
if not suffix:
303-
return self.with_name(self.stem)
304+
return self.with_name(stem)
305+
elif not stem:
306+
raise ValueError(f"{self!r} has an empty name")
304307
elif suffix.startswith('.') and len(suffix) > 1:
305-
return self.with_name(self.stem + suffix)
308+
return self.with_name(stem + suffix)
306309
else:
307310
raise ValueError(f"Invalid suffix {suffix!r}")
308311

Lib/test/test_pathlib/test_pathlib.py

-7
Original file line numberDiff line numberDiff line change
@@ -327,13 +327,6 @@ def test_with_stem_empty(self):
327327
self.assertRaises(ValueError, P('a/b').with_stem, '')
328328
self.assertRaises(ValueError, P('a/b').with_stem, '.')
329329

330-
def test_with_suffix_empty(self):
331-
# Path doesn't have a "filename" component.
332-
P = self.cls
333-
self.assertRaises(ValueError, P('').with_suffix, '.gz')
334-
self.assertRaises(ValueError, P('.').with_suffix, '.gz')
335-
self.assertRaises(ValueError, P('/').with_suffix, '.gz')
336-
337330
def test_relative_to_several_args(self):
338331
P = self.cls
339332
p = P('a/b')

Lib/test/test_pathlib/test_pathlib_abc.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -977,9 +977,8 @@ def test_with_suffix_windows(self):
977977
def test_with_suffix_empty(self):
978978
P = self.cls
979979
# Path doesn't have a "filename" component.
980-
self.assertEqual(P('').with_suffix('.gz'), P('.gz'))
981-
self.assertEqual(P('.').with_suffix('.gz'), P('..gz'))
982-
self.assertEqual(P('/').with_suffix('.gz'), P('/.gz'))
980+
self.assertRaises(ValueError, P('').with_suffix, '.gz')
981+
self.assertRaises(ValueError, P('/').with_suffix, '.gz')
983982

984983
def test_with_suffix_seps(self):
985984
P = self.cls

0 commit comments

Comments
 (0)