Skip to content

Commit fe692e3

Browse files
committed
Don't crash when checking the BOM on Unicode lines, with Python 2
1 parent c812090 commit fe692e3

2 files changed

Lines changed: 24 additions & 8 deletions

File tree

pep8.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1018,8 +1018,6 @@ def readlines(filename):
10181018
return f.readlines()
10191019
finally:
10201020
f.close()
1021-
1022-
BOM_UTF8 = '\xef\xbb\xbf'
10231021
isidentifier = re.compile(r'[a-zA-Z_]\w*').match
10241022
stdin_get_value = sys.stdin.read
10251023
else:
@@ -1037,8 +1035,6 @@ def readlines(filename):
10371035
return f.readlines()
10381036
finally:
10391037
f.close()
1040-
1041-
BOM_UTF8 = '\ufeff'
10421038
isidentifier = str.isidentifier
10431039

10441040
def stdin_get_value():
@@ -1204,8 +1200,13 @@ def __init__(self, filename=None, lines=None,
12041200
self.lines = []
12051201
else:
12061202
self.lines = lines
1207-
if self.lines and self.lines[0].startswith(BOM_UTF8):
1208-
self.lines[0] = self.lines[0][len(BOM_UTF8):]
1203+
if self.lines:
1204+
ord0 = ord(self.lines[0][0])
1205+
if ord0 in (0xef, 0xfeff): # Strip the UTF-8 BOM
1206+
if ord0 == 0xfeff:
1207+
self.lines[0] = self.lines[0][1:]
1208+
elif self.lines[0][:3] == '\xef\xbb\xbf':
1209+
self.lines[0] = self.lines[0][3:]
12091210
self.report = report or options.report
12101211
self.report_error = self.report.error
12111212

testsuite/test_api.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -302,8 +302,20 @@ def test_styleguide_check_files(self):
302302
self.assertRaises(TypeError, pep8style.check_files, 42)
303303
# < 3.3 raises TypeError; >= 3.3 raises AttributeError
304304
self.assertRaises(Exception, pep8style.check_files, [42])
305-
# TODO: runner
306-
# TODO: input_file
305+
306+
def test_check_unicode(self):
307+
# Do not crash if lines are Unicode (Python 2.x)
308+
pep8.register_check(DummyChecker, ['Z701'])
309+
source = '#\n'
310+
if hasattr(source, 'decode'):
311+
source = source.decode('ascii')
312+
313+
pep8style = pep8.StyleGuide()
314+
count_errors = pep8style.input_file('stdin', lines=[source])
315+
316+
self.assertFalse(sys.stdout)
317+
self.assertFalse(sys.stderr)
318+
self.assertEqual(count_errors, 0)
307319

308320
def test_check_nullbytes(self):
309321
pep8.register_check(DummyChecker, ['Z701'])
@@ -314,3 +326,6 @@ def test_check_nullbytes(self):
314326
self.assertTrue(sys.stdout[0].startswith("stdin:1:1: E901 TypeError"))
315327
self.assertFalse(sys.stderr)
316328
self.assertEqual(count_errors, 1)
329+
330+
# TODO: runner
331+
# TODO: input_file

0 commit comments

Comments
 (0)