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 @@ class PurePath(_abc.PurePathBase):
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 functools
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 @@ class PurePathBase:
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 @@ class PurePathBase:
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 @@ class PurePathBase:
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 @@ class PurePathTest(test_pathlib_abc.DummyPurePathTest):
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 @@ class DummyPurePathTest(unittest.TestCase):
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 @@ class DummyPurePathTest(unittest.TestCase):
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``.