diff --git a/Doc/library/urllib.parse.rst b/Doc/library/urllib.parse.rst index f9936288fd4..49276daa7ff 100644 --- a/Doc/library/urllib.parse.rst +++ b/Doc/library/urllib.parse.rst @@ -370,6 +370,13 @@ or on combining URL components into a URL string. .. versionchanged:: 3.2 Result is a structured object rather than a simple 2-tuple. +.. function:: unwrap(url) + + Extract the url from a wrapped URL (that is, a string formatted as + ````, ````, ``URL:scheme://host/path`` + or ``scheme://host/path``). If *url* is not a wrapped URL, it is returned + without changes. + .. _parsing-ascii-encoded-bytes: Parsing ASCII Encoded Bytes diff --git a/Doc/tools/susp-ignored.csv b/Doc/tools/susp-ignored.csv index a34524bb673..a0e7868a037 100644 --- a/Doc/tools/susp-ignored.csv +++ b/Doc/tools/susp-ignored.csv @@ -236,6 +236,8 @@ library/urllib.request,,:close,Connection:close library/urllib.request,,:port,:port library/urllib.request,,:lang,"xmlns=""http://www.w3.org/1999/xhtml"" xml:lang=""en"" lang=""en"">\n\n\n" library/urllib.request,,:password,"""joe:password@python.org""" +library/urllib.parse,,:scheme, +library/urllib.parse,,:scheme,URL:scheme://host/path library/uuid,,:uuid,urn:uuid:12345678-1234-5678-1234-567812345678 library/venv,,:param,":param nodist: If True, setuptools and pip are not installed into the" library/venv,,:param,":param progress: If setuptools or pip are installed, the progress of the" diff --git a/Lib/test/test_urlparse.py b/Lib/test/test_urlparse.py index d0365ecab72..43447656376 100644 --- a/Lib/test/test_urlparse.py +++ b/Lib/test/test_urlparse.py @@ -1169,8 +1169,10 @@ class Utility_Tests(unittest.TestCase): 'http://www.python.org/medi\u00e6val') def test_unwrap(self): - url = urllib.parse._unwrap('') - self.assertEqual(url, 'type://host/path') + for wrapped_url in ('', '', + 'URL:scheme://host/path', 'scheme://host/path'): + url = urllib.parse.unwrap(wrapped_url) + self.assertEqual(url, 'scheme://host/path') class DeprecationTest(unittest.TestCase): @@ -1251,12 +1253,6 @@ class DeprecationTest(unittest.TestCase): self.assertEqual(str(cm.warning), 'urllib.parse.to_bytes() is deprecated as of 3.8') - def test_unwrap(self): - with self.assertWarns(DeprecationWarning) as cm: - urllib.parse.unwrap('') - self.assertEqual(str(cm.warning), - 'urllib.parse.unwrap() is deprecated as of 3.8') - if __name__ == "__main__": unittest.main() diff --git a/Lib/urllib/parse.py b/Lib/urllib/parse.py index dfba704144e..daefb2025b1 100644 --- a/Lib/urllib/parse.py +++ b/Lib/urllib/parse.py @@ -979,17 +979,15 @@ def _to_bytes(url): def unwrap(url): - warnings.warn("urllib.parse.unwrap() is deprecated as of 3.8", - DeprecationWarning, stacklevel=2) - return _unwrap(url) + """Transform a string like '' into 'scheme://host/path'. - -def _unwrap(url): - """unwrap('') --> 'type://host/path'.""" + The string is returned unchanged if it's not a wrapped URL. + """ url = str(url).strip() if url[:1] == '<' and url[-1:] == '>': url = url[1:-1].strip() - if url[:4] == 'URL:': url = url[4:].strip() + if url[:4] == 'URL:': + url = url[4:].strip() return url diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py index afce8eb1a1b..f6ce9cb6d58 100644 --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -101,7 +101,7 @@ import warnings from urllib.error import URLError, HTTPError, ContentTooShortError from urllib.parse import ( - urlparse, urlsplit, urljoin, _unwrap, quote, unquote, + urlparse, urlsplit, urljoin, unwrap, quote, unquote, _splittype, _splithost, _splitport, _splituser, _splitpasswd, _splitattr, _splitquery, _splitvalue, _splittag, _to_bytes, unquote_to_bytes, urlunparse) @@ -349,7 +349,7 @@ class Request: @full_url.setter def full_url(self, url): # unwrap('') --> 'type://host/path' - self._full_url = _unwrap(url) + self._full_url = unwrap(url) self._full_url, self.fragment = _splittag(self._full_url) self._parse() @@ -1727,7 +1727,7 @@ class URLopener: # External interface def open(self, fullurl, data=None): """Use URLopener().open(file) instead of open(file, 'r').""" - fullurl = _unwrap(_to_bytes(fullurl)) + fullurl = unwrap(_to_bytes(fullurl)) fullurl = quote(fullurl, safe="%/:=&?~#+!$,;'@()*[]|") if self.tempcache and fullurl in self.tempcache: filename, headers = self.tempcache[fullurl] @@ -1775,7 +1775,7 @@ class URLopener: def retrieve(self, url, filename=None, reporthook=None, data=None): """retrieve(url) returns (filename, headers) for a local object or (tempfilename, headers) for a remote object.""" - url = _unwrap(_to_bytes(url)) + url = unwrap(_to_bytes(url)) if self.tempcache and url in self.tempcache: return self.tempcache[url] type, url1 = _splittype(url) diff --git a/Misc/NEWS.d/next/Documentation/2019-01-09-17-56-35.bpo-35397.ZMreIz.rst b/Misc/NEWS.d/next/Documentation/2019-01-09-17-56-35.bpo-35397.ZMreIz.rst new file mode 100644 index 00000000000..6dc7d3aebb1 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2019-01-09-17-56-35.bpo-35397.ZMreIz.rst @@ -0,0 +1,2 @@ +Remove deprecation and document urllib.parse.unwrap(). Patch contributed by +RĂ©mi Lapeyre.