Merge #10019: Fix regression relative to 2.6: add newlines if indent=0

Patch by Amaury Forgeot d'Arc, updated by Sando Tosi.
This commit is contained in:
R David Murray 2011-04-12 21:19:20 -04:00
commit d16ee63df2
4 changed files with 24 additions and 5 deletions

View File

@ -136,10 +136,10 @@ Basic Usage
If *indent* is a non-negative integer or string, then JSON array elements and If *indent* is a non-negative integer or string, then JSON array elements and
object members will be pretty-printed with that indent level. An indent level object members will be pretty-printed with that indent level. An indent level
of 0 or ``""`` will only insert newlines. ``None`` (the default) selects the of 0, negative, or ``""`` will only insert newlines. ``None`` (the default)
most compact representation. Using an integer indent indents that many spaces selects the most compact representation. Using a positive integer indent
per level. If *indent* is a string (such at '\t'), that string is used to indent indents that many spaces per level. If *indent* is a string (such at '\t'),
each level. that string is used to indent each level.
If *separators* is an ``(item_separator, dict_separator)`` tuple, then it If *separators* is an ``(item_separator, dict_separator)`` tuple, then it
will be used instead of the default ``(', ', ': ')`` separators. ``(',', will be used instead of the default ``(', ', ': ')`` separators. ``(',',

View File

@ -233,7 +233,7 @@ class JSONEncoder(object):
if (_one_shot and c_make_encoder is not None if (_one_shot and c_make_encoder is not None
and not self.indent): and self.indent is None):
_iterencode = c_make_encoder( _iterencode = c_make_encoder(
markers, self.default, _encoder, self.indent, markers, self.default, _encoder, self.indent,
self.key_separator, self.item_separator, self.sort_keys, self.key_separator, self.item_separator, self.sort_keys,

View File

@ -2,6 +2,7 @@ from unittest import TestCase
import json import json
import textwrap import textwrap
from io import StringIO
class TestIndent(TestCase): class TestIndent(TestCase):
def test_indent(self): def test_indent(self):
@ -43,3 +44,18 @@ class TestIndent(TestCase):
self.assertEqual(h3, h) self.assertEqual(h3, h)
self.assertEqual(d2, expect.expandtabs(2)) self.assertEqual(d2, expect.expandtabs(2))
self.assertEqual(d3, expect) self.assertEqual(d3, expect)
def test_indent0(self):
h = {3: 1}
def check(indent, expected):
d1 = json.dumps(h, indent=indent)
self.assertEqual(d1, expected)
sio = StringIO()
json.dump(h, sio, indent=indent)
self.assertEqual(sio.getvalue(), expected)
# indent=0 should emit newlines
check(0, '{\n"3": 1\n}')
# indent=None is more compact
check(None, '{"3": 1}')

View File

@ -103,6 +103,9 @@ Core and Builtins
Library Library
------- -------
- Issue #10019: Fixed regression in json module where an indent of 0 stopped
adding newlines and acted instead like 'None'.
- Issue #11186: pydoc ignores a module if its name contains a surrogate - Issue #11186: pydoc ignores a module if its name contains a surrogate
character in the index of modules. character in the index of modules.