Commit 7e18deef authored by Mayank Asthana's avatar Mayank Asthana Committed by Antoine Pitrou

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.
parent 3058b7d8
...@@ -30,8 +30,10 @@ the information :func:`init` sets up. ...@@ -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. ...@@ -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: ...@@ -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: ...@@ -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:
......
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): ...@@ -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):
......
:meth:`mimetypes.MimeTypes.guess_type` now accepts :term:`path-like object` in addition to url strings.
Patch by Mayank Asthana.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment