mirror of
https://github.com/python/cpython.git
synced 2025-09-19 15:10:58 +00:00
bpo-34926: Make mimetypes.guess_type accept os.PathLike objects (GH-9777)
:meth:`mimetypes.MimeTypes.guess_type` now accepts :term:`path-like object` in addition to url strings.
This commit is contained in:
parent
3058b7d856
commit
7e18deef65
4 changed files with 35 additions and 3 deletions
|
@ -30,8 +30,10 @@ the information :func:`init` sets up.
|
||||||
|
|
||||||
.. index:: pair: MIME; headers
|
.. index:: pair: MIME; headers
|
||||||
|
|
||||||
Guess the type of a file based on its filename or URL, given by *url*. The
|
Guess the type of a file based on its filename, path or URL, given by *url*.
|
||||||
return value is a tuple ``(type, encoding)`` where *type* is ``None`` if the
|
URL can be a string or a :term:`path-like object`.
|
||||||
|
|
||||||
|
The return value is a tuple ``(type, encoding)`` where *type* is ``None`` if the
|
||||||
type can't be guessed (missing or unknown suffix) or a string of the form
|
type can't be guessed (missing or unknown suffix) or a string of the form
|
||||||
``'type/subtype'``, usable for a MIME :mailheader:`content-type` header.
|
``'type/subtype'``, usable for a MIME :mailheader:`content-type` header.
|
||||||
|
|
||||||
|
@ -49,6 +51,9 @@ the information :func:`init` sets up.
|
||||||
*strict* is ``False``, some additional non-standard but commonly used MIME types
|
*strict* is ``False``, some additional non-standard but commonly used MIME types
|
||||||
are also recognized.
|
are also recognized.
|
||||||
|
|
||||||
|
.. versionchanged:: 3.8
|
||||||
|
Added support for url being a :term:`path-like object`.
|
||||||
|
|
||||||
|
|
||||||
.. function:: guess_all_extensions(type, strict=True)
|
.. function:: guess_all_extensions(type, strict=True)
|
||||||
|
|
||||||
|
|
|
@ -95,7 +95,7 @@ class MimeTypes:
|
||||||
exts.append(ext)
|
exts.append(ext)
|
||||||
|
|
||||||
def guess_type(self, url, strict=True):
|
def guess_type(self, url, strict=True):
|
||||||
"""Guess the type of a file based on its URL.
|
"""Guess the type of a file which is either a URL or a path-like object.
|
||||||
|
|
||||||
Return value is a tuple (type, encoding) where type is None if
|
Return value is a tuple (type, encoding) where type is None if
|
||||||
the type can't be guessed (no or unknown suffix) or a string
|
the type can't be guessed (no or unknown suffix) or a string
|
||||||
|
@ -113,6 +113,7 @@ class MimeTypes:
|
||||||
Optional `strict' argument when False adds a bunch of commonly found,
|
Optional `strict' argument when False adds a bunch of commonly found,
|
||||||
but non-standard types.
|
but non-standard types.
|
||||||
"""
|
"""
|
||||||
|
url = os.fspath(url)
|
||||||
scheme, url = urllib.parse._splittype(url)
|
scheme, url = urllib.parse._splittype(url)
|
||||||
if scheme == 'data':
|
if scheme == 'data':
|
||||||
# syntax of data URLs:
|
# syntax of data URLs:
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import io
|
import io
|
||||||
import locale
|
import locale
|
||||||
import mimetypes
|
import mimetypes
|
||||||
|
import pathlib
|
||||||
import sys
|
import sys
|
||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
|
@ -77,6 +78,29 @@ class MimeTypesTestCase(unittest.TestCase):
|
||||||
strict=True)
|
strict=True)
|
||||||
self.assertEqual(exts, ['.g3', '.g\xb3'])
|
self.assertEqual(exts, ['.g3', '.g\xb3'])
|
||||||
|
|
||||||
|
def test_path_like_ob(self):
|
||||||
|
filename = "LICENSE.txt"
|
||||||
|
filepath = pathlib.Path(filename)
|
||||||
|
filepath_with_abs_dir = pathlib.Path('/dir/'+filename)
|
||||||
|
filepath_relative = pathlib.Path('../dir/'+filename)
|
||||||
|
path_dir = pathlib.Path('./')
|
||||||
|
|
||||||
|
expected = self.db.guess_type(filename)
|
||||||
|
|
||||||
|
self.assertEqual(self.db.guess_type(filepath), expected)
|
||||||
|
self.assertEqual(self.db.guess_type(
|
||||||
|
filepath_with_abs_dir), expected)
|
||||||
|
self.assertEqual(self.db.guess_type(filepath_relative), expected)
|
||||||
|
self.assertEqual(self.db.guess_type(path_dir), (None, None))
|
||||||
|
|
||||||
|
def test_keywords_args_api(self):
|
||||||
|
self.assertEqual(self.db.guess_type(
|
||||||
|
url="foo.html", strict=True), ("text/html", None))
|
||||||
|
self.assertEqual(self.db.guess_all_extensions(
|
||||||
|
type='image/jpg', strict=True), [])
|
||||||
|
self.assertEqual(self.db.guess_extension(
|
||||||
|
type='image/jpg', strict=False), '.jpg')
|
||||||
|
|
||||||
|
|
||||||
@unittest.skipUnless(sys.platform.startswith("win"), "Windows only")
|
@unittest.skipUnless(sys.platform.startswith("win"), "Windows only")
|
||||||
class Win32MimeTypesTestCase(unittest.TestCase):
|
class Win32MimeTypesTestCase(unittest.TestCase):
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
:meth:`mimetypes.MimeTypes.guess_type` now accepts :term:`path-like object` in addition to url strings.
|
||||||
|
Patch by Mayank Asthana.
|
Loading…
Add table
Add a link
Reference in a new issue