[3.11] gh-101961 fileinput.hookcompressed should not set the encoding value for the binary mode (gh-102068) (#102098)

gh-101961 fileinput.hookcompressed should not set the encoding value for the binary mode (gh-102068)
(cherry picked from commit 6f25657b83)

Co-authored-by: Gihwan Kim <gihwan.kim@linecorp.com>
This commit is contained in:
Miss Islington (bot) 2023-02-20 19:39:16 -08:00 committed by GitHub
parent e9103e69cd
commit 5bc6927c68
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 32 additions and 12 deletions

View file

@ -399,7 +399,7 @@ def isstdin(self):
def hook_compressed(filename, mode, *, encoding=None, errors=None): 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" encoding = "locale"
ext = os.path.splitext(filename)[1] ext = os.path.splitext(filename)[1]
if ext == '.gz': if ext == '.gz':

View file

@ -855,29 +855,29 @@ def setUp(self):
self.fake_open = InvocationRecorder() self.fake_open = InvocationRecorder()
def test_empty_string(self): 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): 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") @unittest.skipUnless(gzip, "Requires gzip and zlib")
def test_gz_ext_fake(self): def test_gz_ext_fake(self):
original_open = gzip.open original_open = gzip.open
gzip.open = self.fake_open gzip.open = self.fake_open
try: try:
result = fileinput.hook_compressed("test.gz", "3") result = fileinput.hook_compressed("test.gz", "r")
finally: finally:
gzip.open = original_open gzip.open = original_open
self.assertEqual(self.fake_open.invocation_count, 1) 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") @unittest.skipUnless(gzip, "Requires gzip and zlib")
def test_gz_with_encoding_fake(self): def test_gz_with_encoding_fake(self):
original_open = gzip.open original_open = gzip.open
gzip.open = lambda filename, mode: io.BytesIO(b'Ex-binary string') gzip.open = lambda filename, mode: io.BytesIO(b'Ex-binary string')
try: try:
result = fileinput.hook_compressed("test.gz", "3", encoding="utf-8") result = fileinput.hook_compressed("test.gz", "r", encoding="utf-8")
finally: finally:
gzip.open = original_open gzip.open = original_open
self.assertEqual(list(result), ['Ex-binary string']) self.assertEqual(list(result), ['Ex-binary string'])
@ -887,23 +887,40 @@ def test_bz2_ext_fake(self):
original_open = bz2.BZ2File original_open = bz2.BZ2File
bz2.BZ2File = self.fake_open bz2.BZ2File = self.fake_open
try: try:
result = fileinput.hook_compressed("test.bz2", "4") result = fileinput.hook_compressed("test.bz2", "r")
finally: finally:
bz2.BZ2File = original_open bz2.BZ2File = original_open
self.assertEqual(self.fake_open.invocation_count, 1) 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): 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): 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): 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) original_open = self.replace_builtin_open(self.fake_open)
try: try:
result = fileinput.hook_compressed(filename, mode) result = fileinput.hook_compressed(filename, mode)

View file

@ -919,6 +919,7 @@ Tyler Kieft
Mads Kiilerich Mads Kiilerich
Jason Killen Jason Killen
Derek D. Kim Derek D. Kim
Gihwan Kim
Jan Kim Jan Kim
Taek Joo Kim Taek Joo Kim
Sam Kimbrel Sam Kimbrel

View file

@ -0,0 +1,2 @@
For the binary mode, :func:`fileinput.hookcompressed` doesn't set the ``encoding`` value
even if the value is ``None``. Patch by Gihwan Kim.