mirror of
https://github.com/python/cpython.git
synced 2025-08-30 21:48:47 +00:00
GH-123599: Deprecate duplicate pathname2url()
implementation (#127380)
Call `urllib.request.pathname2url()` from `pathlib.Path.as_uri()`, and deprecate the duplicate implementation in `PurePath`. Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com>
This commit is contained in:
parent
6c776abb90
commit
f141e8ec2a
5 changed files with 45 additions and 19 deletions
|
@ -886,9 +886,11 @@ conforming to :rfc:`8089`.
|
|||
>>> p.as_uri()
|
||||
'file:///c:/Windows'
|
||||
|
||||
For historical reasons, this method is also available from
|
||||
:class:`PurePath` objects. However, its use of :func:`os.fsencode` makes
|
||||
it strictly impure.
|
||||
.. deprecated-removed:: 3.14 3.19
|
||||
|
||||
Calling this method from :class:`PurePath` rather than :class:`Path` is
|
||||
possible but deprecated. The method's use of :func:`os.fsencode` makes
|
||||
it strictly impure.
|
||||
|
||||
|
||||
Expanding and resolving paths
|
||||
|
|
|
@ -1159,6 +1159,11 @@ Deprecated
|
|||
write new code. The :mod:`subprocess` module is recommended instead.
|
||||
(Contributed by Victor Stinner in :gh:`120743`.)
|
||||
|
||||
* :mod:`pathlib`:
|
||||
:meth:`!pathlib.PurePath.as_uri` is deprecated and will be removed in Python
|
||||
3.19. Use :meth:`pathlib.Path.as_uri` instead.
|
||||
(Contributed by Barney Gale in :gh:`123599`.)
|
||||
|
||||
* :mod:`pdb`:
|
||||
The undocumented ``pdb.Pdb.curframe_locals`` attribute is now a deprecated
|
||||
read-only property. The low overhead dynamic frame locals access added in
|
||||
|
|
|
@ -525,13 +525,17 @@ class PurePath:
|
|||
msg = ("pathlib.PurePath.is_reserved() is deprecated and scheduled "
|
||||
"for removal in Python 3.15. Use os.path.isreserved() to "
|
||||
"detect reserved paths on Windows.")
|
||||
warnings.warn(msg, DeprecationWarning, stacklevel=2)
|
||||
warnings._deprecated("pathlib.PurePath.is_reserved", msg, remove=(3, 15))
|
||||
if self.parser is ntpath:
|
||||
return self.parser.isreserved(self)
|
||||
return False
|
||||
|
||||
def as_uri(self):
|
||||
"""Return the path as a URI."""
|
||||
import warnings
|
||||
msg = ("pathlib.PurePath.as_uri() is deprecated and scheduled "
|
||||
"for removal in Python 3.19. Use pathlib.Path.as_uri().")
|
||||
warnings._deprecated("pathlib.PurePath.as_uri", msg, remove=(3, 19))
|
||||
if not self.is_absolute():
|
||||
raise ValueError("relative path can't be expressed as a file URI")
|
||||
|
||||
|
@ -1266,6 +1270,13 @@ class Path(PurePath):
|
|||
raise RuntimeError("Could not determine home directory.")
|
||||
return cls(homedir)
|
||||
|
||||
def as_uri(self):
|
||||
"""Return the path as a URI."""
|
||||
if not self.is_absolute():
|
||||
raise ValueError("relative paths can't be expressed as file URIs")
|
||||
from urllib.request import pathname2url
|
||||
return f'file:{pathname2url(str(self))}'
|
||||
|
||||
@classmethod
|
||||
def from_uri(cls, uri):
|
||||
"""Return a new path from the given 'file' URI."""
|
||||
|
|
|
@ -412,12 +412,18 @@ class PurePathTest(unittest.TestCase):
|
|||
with self.assertRaises(TypeError):
|
||||
P() < {}
|
||||
|
||||
def make_uri(self, path):
|
||||
if isinstance(path, pathlib.Path):
|
||||
return path.as_uri()
|
||||
with self.assertWarns(DeprecationWarning):
|
||||
return path.as_uri()
|
||||
|
||||
def test_as_uri_common(self):
|
||||
P = self.cls
|
||||
with self.assertRaises(ValueError):
|
||||
P('a').as_uri()
|
||||
self.make_uri(P('a'))
|
||||
with self.assertRaises(ValueError):
|
||||
P().as_uri()
|
||||
self.make_uri(P())
|
||||
|
||||
def test_repr_roundtrips(self):
|
||||
for pathstr in ('a', 'a/b', 'a/b/c', '/', '/a/b', '/a/b/c'):
|
||||
|
@ -645,9 +651,9 @@ class PurePathTest(unittest.TestCase):
|
|||
@needs_posix
|
||||
def test_as_uri_posix(self):
|
||||
P = self.cls
|
||||
self.assertEqual(P('/').as_uri(), 'file:///')
|
||||
self.assertEqual(P('/a/b.c').as_uri(), 'file:///a/b.c')
|
||||
self.assertEqual(P('/a/b%#c').as_uri(), 'file:///a/b%25%23c')
|
||||
self.assertEqual(self.make_uri(P('/')), 'file:///')
|
||||
self.assertEqual(self.make_uri(P('/a/b.c')), 'file:///a/b.c')
|
||||
self.assertEqual(self.make_uri(P('/a/b%#c')), 'file:///a/b%25%23c')
|
||||
|
||||
@needs_posix
|
||||
def test_as_uri_non_ascii(self):
|
||||
|
@ -657,7 +663,7 @@ class PurePathTest(unittest.TestCase):
|
|||
os.fsencode('\xe9')
|
||||
except UnicodeEncodeError:
|
||||
self.skipTest("\\xe9 cannot be encoded to the filesystem encoding")
|
||||
self.assertEqual(P('/a/b\xe9').as_uri(),
|
||||
self.assertEqual(self.make_uri(P('/a/b\xe9')),
|
||||
'file:///a/b' + quote_from_bytes(os.fsencode('\xe9')))
|
||||
|
||||
@needs_posix
|
||||
|
@ -751,17 +757,17 @@ class PurePathTest(unittest.TestCase):
|
|||
def test_as_uri_windows(self):
|
||||
P = self.cls
|
||||
with self.assertRaises(ValueError):
|
||||
P('/a/b').as_uri()
|
||||
self.make_uri(P('/a/b'))
|
||||
with self.assertRaises(ValueError):
|
||||
P('c:a/b').as_uri()
|
||||
self.assertEqual(P('c:/').as_uri(), 'file:///c:/')
|
||||
self.assertEqual(P('c:/a/b.c').as_uri(), 'file:///c:/a/b.c')
|
||||
self.assertEqual(P('c:/a/b%#c').as_uri(), 'file:///c:/a/b%25%23c')
|
||||
self.assertEqual(P('c:/a/b\xe9').as_uri(), 'file:///c:/a/b%C3%A9')
|
||||
self.assertEqual(P('//some/share/').as_uri(), 'file://some/share/')
|
||||
self.assertEqual(P('//some/share/a/b.c').as_uri(),
|
||||
self.make_uri(P('c:a/b'))
|
||||
self.assertEqual(self.make_uri(P('c:/')), 'file:///c:/')
|
||||
self.assertEqual(self.make_uri(P('c:/a/b.c')), 'file:///c:/a/b.c')
|
||||
self.assertEqual(self.make_uri(P('c:/a/b%#c')), 'file:///c:/a/b%25%23c')
|
||||
self.assertEqual(self.make_uri(P('c:/a/b\xe9')), 'file:///c:/a/b%C3%A9')
|
||||
self.assertEqual(self.make_uri(P('//some/share/')), 'file://some/share/')
|
||||
self.assertEqual(self.make_uri(P('//some/share/a/b.c')),
|
||||
'file://some/share/a/b.c')
|
||||
self.assertEqual(P('//some/share/a/b%#c\xe9').as_uri(),
|
||||
self.assertEqual(self.make_uri(P('//some/share/a/b%#c\xe9')),
|
||||
'file://some/share/a/b%25%23c%C3%A9')
|
||||
|
||||
@needs_windows
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
Deprecate :meth:`!pathlib.PurePath.as_uri`; use :meth:`pathlib.Path.as_uri`
|
||||
instead.
|
Loading…
Add table
Add a link
Reference in a new issue