https://github.com/python/cpython/commit/53908bd7905b849e110d2c6f4bce739bff037146 commit: 53908bd7905b849e110d2c6f4bce739bff037146 branch: main author: Bénédikt Tran <10796600+picn...@users.noreply.github.com> committer: hugovk <1324225+hug...@users.noreply.github.com> date: 2025-04-08T09:08:59Z summary:
gh-93096: fix `test_mimetypes.test_guess_type_conflicting_with_mimetypes` (#131408) files: M Lib/mimetypes.py M Lib/test/test_mimetypes.py diff --git a/Lib/mimetypes.py b/Lib/mimetypes.py index 6b94fe3c4df756..67660e4f0368ce 100644 --- a/Lib/mimetypes.py +++ b/Lib/mimetypes.py @@ -669,9 +669,7 @@ def _default_mime_types(): _default_mime_types() -def _main(): - """Run the mimetypes command-line interface.""" - import sys +def _parse_args(args): from argparse import ArgumentParser parser = ArgumentParser(description='map filename extensions to MIME types') @@ -686,23 +684,30 @@ def _main(): help='additionally search for common but non-standard types' ) parser.add_argument('type', nargs='+', help='a type to search') - args = parser.parse_args() + args = parser.parse_args(args) + return args, parser.format_help() + + +def _main(args=None): + """Run the mimetypes command-line interface and return a text to print.""" + import sys + + args, help_text = _parse_args(args) if args.extension: for gtype in args.type: guess = guess_extension(gtype, not args.lenient) if guess: - print(guess) - else: - sys.exit(f"error: unknown type {gtype}") + return str(guess) + sys.exit(f"error: unknown type {gtype}") else: for gtype in args.type: guess, encoding = guess_type(gtype, not args.lenient) if guess: - print('type:', guess, 'encoding:', encoding) - else: - sys.exit(f"error: media type unknown for {gtype}") + return f"type: {guess} encoding: {encoding}" + sys.exit(f"error: media type unknown for {gtype}") + return parser.format_help() if __name__ == '__main__': - _main() + print(_main()) diff --git a/Lib/test/test_mimetypes.py b/Lib/test/test_mimetypes.py index b5d1f50099e16a..2da1c13800e875 100644 --- a/Lib/test/test_mimetypes.py +++ b/Lib/test/test_mimetypes.py @@ -1,14 +1,13 @@ import io import mimetypes import os +import shlex import sys import unittest.mock -from os import linesep - +from platform import win32_edition from test import support from test.support import os_helper from test.support.script_helper import run_python_until_end -from platform import win32_edition try: import _winapi @@ -390,55 +389,52 @@ def test__all__(self): support.check__all__(self, mimetypes) -class MimetypesCliTestCase(unittest.TestCase): - - def mimetypes_cmd(cls, *args, **kwargs): - result, _ = run_python_until_end('-m', 'mimetypes', *args) - return result.rc, result.out.decode(), result.err.decode() - - def test_help_option(self): - retcode, out, err = self.mimetypes_cmd('-h') - self.assertEqual(retcode, 0) - self.assertStartsWith(out, 'usage: ') - self.assertEqual(err, '') - - def test_invalid_option(self): - retcode, out, err = self.mimetypes_cmd('--invalid') - self.assertEqual(retcode, 2) - self.assertEqual(out, '') - self.assertStartsWith(err, 'usage: ') - - def test_guess_extension(self): - retcode, out, err = self.mimetypes_cmd('-l', '-e', 'image/jpg') - self.assertEqual(retcode, 0) - self.assertEqual(out, f'.jpg{linesep}') - self.assertEqual(err, '') - - retcode, out, err = self.mimetypes_cmd('-e', 'image/jpg') - self.assertEqual(retcode, 1) - self.assertEqual(out, '') - self.assertEqual(err, f'error: unknown type image/jpg{linesep}') - - retcode, out, err = self.mimetypes_cmd('-e', 'image/jpeg') - self.assertEqual(retcode, 0) - self.assertEqual(out, f'.jpg{linesep}') - self.assertEqual(err, '') - - def test_guess_type(self): - retcode, out, err = self.mimetypes_cmd('-l', 'foo.webp') - self.assertEqual(retcode, 0) - self.assertEqual(out, f'type: image/webp encoding: None{linesep}') - self.assertEqual(err, '') - - @unittest.skipIf( - sys.platform == 'darwin', - 'macOS lists common_types in mime.types thus making them always known' - ) - def test_guess_type_conflicting_with_mimetypes(self): - retcode, out, err = self.mimetypes_cmd('foo.pic') - self.assertEqual(retcode, 1) - self.assertEqual(out, '') - self.assertEqual(err, f'error: media type unknown for foo.pic{linesep}') +class CommandLineTest(unittest.TestCase): + def test_parse_args(self): + args, help_text = mimetypes._parse_args("-h") + self.assertTrue(help_text.startswith("usage: ")) + + args, help_text = mimetypes._parse_args("--invalid") + self.assertTrue(help_text.startswith("usage: ")) + + args, _ = mimetypes._parse_args(shlex.split("-l -e image/jpg")) + self.assertTrue(args.extension) + self.assertTrue(args.lenient) + self.assertEqual(args.type, ["image/jpg"]) + + args, _ = mimetypes._parse_args(shlex.split("-e image/jpg")) + self.assertTrue(args.extension) + self.assertFalse(args.lenient) + self.assertEqual(args.type, ["image/jpg"]) + + args, _ = mimetypes._parse_args(shlex.split("-l foo.webp")) + self.assertFalse(args.extension) + self.assertTrue(args.lenient) + self.assertEqual(args.type, ["foo.webp"]) + + args, _ = mimetypes._parse_args(shlex.split("foo.pic")) + self.assertFalse(args.extension) + self.assertFalse(args.lenient) + self.assertEqual(args.type, ["foo.pic"]) + + + def test_invocation(self): + for command, expected in [ + ("-l -e image/jpg", ".jpg"), + ("-e image/jpeg", ".jpg"), + ("-l foo.webp", "type: image/webp encoding: None"), + ]: + self.assertEqual(mimetypes._main(shlex.split(command)), expected) + + + def test_invocation_error(self): + for command, expected in [ + ("-e image/jpg", "error: unknown type image/jpg"), + ("foo.pic", "error: media type unknown for foo.pic"), + ]: + with self.assertRaisesRegex(SystemExit, expected): + mimetypes._main(shlex.split(command)) + if __name__ == "__main__": unittest.main() _______________________________________________ Python-checkins mailing list -- python-checkins@python.org To unsubscribe send an email to python-checkins-le...@python.org https://mail.python.org/mailman3/lists/python-checkins.python.org/ Member address: arch...@mail-archive.com