summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2023-02-21 03:39:30 (GMT)
committerGitHub <noreply@github.com>2023-02-21 03:39:30 (GMT)
commitd9dce23643c319ff4f721ad65a7f9811e8adfc53 (patch)
treebf181452280eb643c3d4c0e87f6cafd7a113c277 /Lib
parent7bb41d9d5d2f0be30fd367fd085bb307db1a1ca3 (diff)
downloadcpython-d9dce23643c319ff4f721ad65a7f9811e8adfc53.zip
cpython-d9dce23643c319ff4f721ad65a7f9811e8adfc53.tar.gz
cpython-d9dce23643c319ff4f721ad65a7f9811e8adfc53.tar.bz2
[3.10] gh-101961 fileinput.hookcompressed should not set the encoding value for the binary mode (gh-102068) (#102099)
gh-101961 fileinput.hookcompressed should not set the encoding value for the binary mode (gh-102068) (cherry picked from commit 6f25657b83d7a680a97849490f6e973b3a695e1a) Co-authored-by: Gihwan Kim <gihwan.kim@linecorp.com>
Diffstat (limited to 'Lib')
-rw-r--r--Lib/fileinput.py2
-rw-r--r--Lib/test/test_fileinput.py39
2 files changed, 29 insertions, 12 deletions
diff --git a/Lib/fileinput.py b/Lib/fileinput.py
index 2ce2f91..3bd1990 100644
--- a/Lib/fileinput.py
+++ b/Lib/fileinput.py
@@ -419,7 +419,7 @@ class FileInput:
def hook_compressed(filename, mode, *, encoding=None, errors=None):
- if encoding is None: # EncodingWarning is emitted in FileInput() already.
+ if encoding is None and "b" not in mode: # EncodingWarning is emitted in FileInput() already.
encoding = "locale"
ext = os.path.splitext(filename)[1]
if ext == '.gz':
diff --git a/Lib/test/test_fileinput.py b/Lib/test/test_fileinput.py
index 21924ff..6c4b5fe 100644
--- a/Lib/test/test_fileinput.py
+++ b/Lib/test/test_fileinput.py
@@ -903,29 +903,29 @@ class Test_hook_compressed(unittest.TestCase):
self.fake_open = InvocationRecorder()
def test_empty_string(self):
- self.do_test_use_builtin_open("", 1)
+ self.do_test_use_builtin_open_text("", "r")
def test_no_ext(self):
- self.do_test_use_builtin_open("abcd", 2)
+ self.do_test_use_builtin_open_text("abcd", "r")
@unittest.skipUnless(gzip, "Requires gzip and zlib")
def test_gz_ext_fake(self):
original_open = gzip.open
gzip.open = self.fake_open
try:
- result = fileinput.hook_compressed("test.gz", "3")
+ result = fileinput.hook_compressed("test.gz", "r")
finally:
gzip.open = original_open
self.assertEqual(self.fake_open.invocation_count, 1)
- self.assertEqual(self.fake_open.last_invocation, (("test.gz", "3"), {}))
+ self.assertEqual(self.fake_open.last_invocation, (("test.gz", "r"), {}))
@unittest.skipUnless(gzip, "Requires gzip and zlib")
def test_gz_with_encoding_fake(self):
original_open = gzip.open
gzip.open = lambda filename, mode: io.BytesIO(b'Ex-binary string')
try:
- result = fileinput.hook_compressed("test.gz", "3", encoding="utf-8")
+ result = fileinput.hook_compressed("test.gz", "r", encoding="utf-8")
finally:
gzip.open = original_open
self.assertEqual(list(result), ['Ex-binary string'])
@@ -935,23 +935,40 @@ class Test_hook_compressed(unittest.TestCase):
original_open = bz2.BZ2File
bz2.BZ2File = self.fake_open
try:
- result = fileinput.hook_compressed("test.bz2", "4")
+ result = fileinput.hook_compressed("test.bz2", "r")
finally:
bz2.BZ2File = original_open
self.assertEqual(self.fake_open.invocation_count, 1)
- self.assertEqual(self.fake_open.last_invocation, (("test.bz2", "4"), {}))
+ self.assertEqual(self.fake_open.last_invocation, (("test.bz2", "r"), {}))
def test_blah_ext(self):
- self.do_test_use_builtin_open("abcd.blah", "5")
+ self.do_test_use_builtin_open_binary("abcd.blah", "rb")
def test_gz_ext_builtin(self):
- self.do_test_use_builtin_open("abcd.Gz", "6")
+ self.do_test_use_builtin_open_binary("abcd.Gz", "rb")
def test_bz2_ext_builtin(self):
- self.do_test_use_builtin_open("abcd.Bz2", "7")
+ self.do_test_use_builtin_open_binary("abcd.Bz2", "rb")
- def do_test_use_builtin_open(self, filename, mode):
+ def test_binary_mode_encoding(self):
+ self.do_test_use_builtin_open_binary("abcd", "rb")
+
+ def test_text_mode_encoding(self):
+ self.do_test_use_builtin_open_text("abcd", "r")
+
+ def do_test_use_builtin_open_binary(self, filename, mode):
+ original_open = self.replace_builtin_open(self.fake_open)
+ try:
+ result = fileinput.hook_compressed(filename, mode)
+ finally:
+ self.replace_builtin_open(original_open)
+
+ self.assertEqual(self.fake_open.invocation_count, 1)
+ self.assertEqual(self.fake_open.last_invocation,
+ ((filename, mode), {'encoding': None, 'errors': None}))
+
+ def do_test_use_builtin_open_text(self, filename, mode):
original_open = self.replace_builtin_open(self.fake_open)
try:
result = fileinput.hook_compressed(filename, mode)