GH-113568: Stop raising deprecation warnings from pathlib ABCs (#113757)

This commit is contained in:
Barney Gale 2024-01-05 22:56:04 +00:00 committed by GitHub
parent d99d871225
commit 3375dfed40
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 46 additions and 24 deletions

View file

@ -166,6 +166,33 @@ def __ge__(self, other):
return NotImplemented return NotImplemented
return self._parts_normcase >= other._parts_normcase return self._parts_normcase >= other._parts_normcase
def relative_to(self, other, /, *_deprecated, walk_up=False):
"""Return the relative path to another path identified by the passed
arguments. If the operation is not possible (because this is not
related to the other path), raise ValueError.
The *walk_up* parameter controls whether `..` may be used to resolve
the path.
"""
if _deprecated:
msg = ("support for supplying more than one positional argument "
"to pathlib.PurePath.relative_to() is deprecated and "
"scheduled for removal in Python 3.14")
warnings.warn(msg, DeprecationWarning, stacklevel=2)
other = self.with_segments(other, *_deprecated)
return _abc.PurePathBase.relative_to(self, other, walk_up=walk_up)
def is_relative_to(self, other, /, *_deprecated):
"""Return True if the path is relative to another path or False.
"""
if _deprecated:
msg = ("support for supplying more than one argument to "
"pathlib.PurePath.is_relative_to() is deprecated and "
"scheduled for removal in Python 3.14")
warnings.warn(msg, DeprecationWarning, stacklevel=2)
other = self.with_segments(other, *_deprecated)
return _abc.PurePathBase.is_relative_to(self, other)
def as_uri(self): def as_uri(self):
"""Return the path as a URI.""" """Return the path as a URI."""
if not self.is_absolute(): if not self.is_absolute():

View file

@ -2,7 +2,6 @@
import ntpath import ntpath
import posixpath import posixpath
import sys import sys
import warnings
from _collections_abc import Sequence from _collections_abc import Sequence
from errno import ENOENT, ENOTDIR, EBADF, ELOOP, EINVAL from errno import ENOENT, ENOTDIR, EBADF, ELOOP, EINVAL
from itertools import chain from itertools import chain
@ -383,7 +382,7 @@ def with_suffix(self, suffix):
else: else:
raise ValueError(f"Invalid suffix {suffix!r}") raise ValueError(f"Invalid suffix {suffix!r}")
def relative_to(self, other, /, *_deprecated, walk_up=False): def relative_to(self, other, *, walk_up=False):
"""Return the relative path to another path identified by the passed """Return the relative path to another path identified by the passed
arguments. If the operation is not possible (because this is not arguments. If the operation is not possible (because this is not
related to the other path), raise ValueError. related to the other path), raise ValueError.
@ -391,13 +390,7 @@ def relative_to(self, other, /, *_deprecated, walk_up=False):
The *walk_up* parameter controls whether `..` may be used to resolve The *walk_up* parameter controls whether `..` may be used to resolve
the path. the path.
""" """
if _deprecated: if not isinstance(other, PurePathBase):
msg = ("support for supplying more than one positional argument "
"to pathlib.PurePath.relative_to() is deprecated and "
"scheduled for removal in Python 3.14")
warnings.warn(msg, DeprecationWarning, stacklevel=2)
other = self.with_segments(other, *_deprecated)
elif not isinstance(other, PurePathBase):
other = self.with_segments(other) other = self.with_segments(other)
for step, path in enumerate(chain([other], other.parents)): for step, path in enumerate(chain([other], other.parents)):
if path == self or path in self.parents: if path == self or path in self.parents:
@ -411,16 +404,10 @@ def relative_to(self, other, /, *_deprecated, walk_up=False):
parts = ['..'] * step + self._tail[len(path._tail):] parts = ['..'] * step + self._tail[len(path._tail):]
return self._from_parsed_parts('', '', parts) return self._from_parsed_parts('', '', parts)
def is_relative_to(self, other, /, *_deprecated): def is_relative_to(self, other):
"""Return True if the path is relative to another path or False. """Return True if the path is relative to another path or False.
""" """
if _deprecated: if not isinstance(other, PurePathBase):
msg = ("support for supplying more than one argument to "
"pathlib.PurePath.is_relative_to() is deprecated and "
"scheduled for removal in Python 3.14")
warnings.warn(msg, DeprecationWarning, stacklevel=2)
other = self.with_segments(other, *_deprecated)
elif not isinstance(other, PurePathBase):
other = self.with_segments(other) other = self.with_segments(other)
return other == self or other in self.parents return other == self or other in self.parents

View file

@ -214,6 +214,19 @@ def test_repr_roundtrips(self):
self.assertEqual(q, p) self.assertEqual(q, p)
self.assertEqual(repr(q), r) self.assertEqual(repr(q), r)
def test_relative_to_several_args(self):
P = self.cls
p = P('a/b')
with self.assertWarns(DeprecationWarning):
p.relative_to('a', 'b')
p.relative_to('a', 'b', walk_up=True)
def test_is_relative_to_several_args(self):
P = self.cls
p = P('a/b')
with self.assertWarns(DeprecationWarning):
p.is_relative_to('a', 'b')
class PurePosixPathTest(PurePathTest): class PurePosixPathTest(PurePathTest):
cls = pathlib.PurePosixPath cls = pathlib.PurePosixPath

View file

@ -542,10 +542,6 @@ def test_relative_to_common(self):
self.assertEqual(p.relative_to('a/b/c', walk_up=True), P('..')) self.assertEqual(p.relative_to('a/b/c', walk_up=True), P('..'))
self.assertEqual(p.relative_to(P('c'), walk_up=True), P('../a/b')) self.assertEqual(p.relative_to(P('c'), walk_up=True), P('../a/b'))
self.assertEqual(p.relative_to('c', walk_up=True), P('../a/b')) self.assertEqual(p.relative_to('c', walk_up=True), P('../a/b'))
# With several args.
with self.assertWarns(DeprecationWarning):
p.relative_to('a', 'b')
p.relative_to('a', 'b', walk_up=True)
# Unrelated paths. # Unrelated paths.
self.assertRaises(ValueError, p.relative_to, P('c')) self.assertRaises(ValueError, p.relative_to, P('c'))
self.assertRaises(ValueError, p.relative_to, P('a/b/c')) self.assertRaises(ValueError, p.relative_to, P('a/b/c'))
@ -607,9 +603,6 @@ def test_is_relative_to_common(self):
self.assertTrue(p.is_relative_to('a/')) self.assertTrue(p.is_relative_to('a/'))
self.assertTrue(p.is_relative_to(P('a/b'))) self.assertTrue(p.is_relative_to(P('a/b')))
self.assertTrue(p.is_relative_to('a/b')) self.assertTrue(p.is_relative_to('a/b'))
# With several args.
with self.assertWarns(DeprecationWarning):
p.is_relative_to('a', 'b')
# Unrelated paths. # Unrelated paths.
self.assertFalse(p.is_relative_to(P('c'))) self.assertFalse(p.is_relative_to(P('c')))
self.assertFalse(p.is_relative_to(P('a/b/c'))) self.assertFalse(p.is_relative_to(P('a/b/c')))

View file

@ -0,0 +1,2 @@
Raise deprecation warnings from :class:`pathlib.PurePath` and not its
private base class ``PurePathBase``.