Issue #17225: JSON decoder now counts columns in the first line starting

with 1, as in other lines.
This commit is contained in:
Serhiy Storchaka 2013-02-21 20:26:52 +02:00
commit 920007ad76
6 changed files with 25 additions and 10 deletions

View File

@ -101,7 +101,7 @@ Using json.tool from the shell to validate and pretty-print::
"json": "obj" "json": "obj"
} }
$ echo '{1.2:3.4}' | python -mjson.tool $ echo '{1.2:3.4}' | python -mjson.tool
Expecting property name enclosed in double quotes: line 1 column 1 (char 1) Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
.. highlight:: python3 .. highlight:: python3

View File

@ -96,7 +96,7 @@
"json": "obj" "json": "obj"
} }
$ echo '{ 1.2:3.4}' | python -m json.tool $ echo '{ 1.2:3.4}' | python -m json.tool
Expecting property name enclosed in double quotes: line 1 column 2 (char 2) Expecting property name enclosed in double quotes: line 1 column 3 (char 2)
""" """
__version__ = '2.0.9' __version__ = '2.0.9'
__all__ = [ __all__ = [

View File

@ -24,7 +24,7 @@ def linecol(doc, pos):
newline = '\n' newline = '\n'
lineno = doc.count(newline, 0, pos) + 1 lineno = doc.count(newline, 0, pos) + 1
if lineno == 1: if lineno == 1:
colno = pos colno = pos + 1
else: else:
colno = pos - doc.rindex(newline, 0, pos) colno = pos - doc.rindex(newline, 0, pos)
return lineno, colno return lineno, colno

View File

@ -7,7 +7,7 @@
"json": "obj" "json": "obj"
} }
$ echo '{ 1.2:3.4}' | python -m json.tool $ echo '{ 1.2:3.4}' | python -m json.tool
Expecting property name enclosed in double quotes: line 1 column 2 (char 2) Expecting property name enclosed in double quotes: line 1 column 3 (char 2)
""" """
import sys import sys

View File

@ -125,8 +125,8 @@ def test_truncated_input(self):
] ]
for data, msg, idx in test_cases: for data, msg, idx in test_cases:
self.assertRaisesRegex(ValueError, self.assertRaisesRegex(ValueError,
r'^{0}: line 1 column {1} \(char {1}\)'.format( r'^{0}: line 1 column {1} \(char {2}\)'.format(
re.escape(msg), idx), re.escape(msg), idx + 1, idx),
self.loads, data) self.loads, data)
def test_unexpected_data(self): def test_unexpected_data(self):
@ -155,8 +155,8 @@ def test_unexpected_data(self):
] ]
for data, msg, idx in test_cases: for data, msg, idx in test_cases:
self.assertRaisesRegex(ValueError, self.assertRaisesRegex(ValueError,
r'^{0}: line 1 column {1} \(char {1}\)'.format( r'^{0}: line 1 column {1} \(char {2}\)'.format(
re.escape(msg), idx), re.escape(msg), idx + 1, idx),
self.loads, data) self.loads, data)
def test_extra_data(self): def test_extra_data(self):
@ -173,10 +173,22 @@ def test_extra_data(self):
for data, msg, idx in test_cases: for data, msg, idx in test_cases:
self.assertRaisesRegex(ValueError, self.assertRaisesRegex(ValueError,
r'^{0}: line 1 column {1} - line 1 column {2}' r'^{0}: line 1 column {1} - line 1 column {2}'
r' \(char {1} - {2}\)'.format( r' \(char {3} - {4}\)'.format(
re.escape(msg), idx, len(data)), re.escape(msg), idx + 1, len(data) + 1, idx, len(data)),
self.loads, data) self.loads, data)
def test_linecol(self):
test_cases = [
('!', 1, 1, 0),
(' !', 1, 2, 1),
('\n!', 2, 1, 1),
('\n \n\n !', 4, 6, 10),
]
for data, line, col, idx in test_cases:
self.assertRaisesRegex(ValueError,
r'^Expecting value: line {0} column {1}'
r' \(char {2}\)$'.format(line, col, idx),
self.loads, data)
class TestPyFail(TestFail, PyTest): pass class TestPyFail(TestFail, PyTest): pass
class TestCFail(TestFail, CTest): pass class TestCFail(TestFail, CTest): pass

View File

@ -260,6 +260,9 @@ Core and Builtins
Library Library
------- -------
- Issue #17225: JSON decoder now counts columns in the first line starting
with 1, as in other lines.
- Issue #6623: Added explicit DeprecationWarning for ftplib.netrc, which has - Issue #6623: Added explicit DeprecationWarning for ftplib.netrc, which has
been deprecated and undocumented for a long time. been deprecated and undocumented for a long time.