Skip to content

Commit 7b88f2b

Browse files
dmtuckerxavfernandez
authored andcommitted
Fall back to sys.getdefaultencoding in auto_decode (#4430)
* Test auto_decode when getpreferredencoding is None * Fall back to sys.getdefaultencoding in auto_decode * Add a news file fragment for 4184
1 parent 0bdbee5 commit 7b88f2b

File tree

3 files changed

+15
-1
lines changed

3 files changed

+15
-1
lines changed

news/4184.bugfix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fall back to sys.getdefaultencoding() if locale.getpreferredencoding() returns None in `pip.utils.encoding.auto_decode`.

pip/utils/encoding.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import codecs
22
import locale
33
import re
4+
import sys
45

56
BOMS = [
67
(codecs.BOM_UTF8, 'utf8'),
@@ -27,4 +28,6 @@ def auto_decode(data):
2728
if line[0:1] == b'#' and ENCODING_RE.search(line):
2829
encoding = ENCODING_RE.search(line).groups()[0].decode('ascii')
2930
return data.decode(encoding)
30-
return data.decode(locale.getpreferredencoding(False))
31+
return data.decode(
32+
locale.getpreferredencoding(False) or sys.getdefaultencoding(),
33+
)

tests/unit/test_utils.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -464,6 +464,16 @@ def test_auto_decode_pep263_headers(self):
464464
latin1_req = u'# coding=latin1\n# Pas trop de café'
465465
assert auto_decode(latin1_req.encode('latin1')) == latin1_req
466466

467+
def test_auto_decode_no_preferred_encoding(self):
468+
om, em = Mock(), Mock()
469+
om.return_value = 'ascii'
470+
em.return_value = None
471+
data = u'data'
472+
with patch('sys.getdefaultencoding', om):
473+
with patch('locale.getpreferredencoding', em):
474+
ret = auto_decode(data.encode(sys.getdefaultencoding()))
475+
assert ret == data
476+
467477

468478
class TestTempDirectory(object):
469479

0 commit comments

Comments
 (0)