diff options
| author | Tom Christie | 2015-01-19 14:41:10 +0000 | 
|---|---|---|
| committer | Tom Christie | 2015-01-19 14:41:10 +0000 | 
| commit | 4f3c3a06cfc0ea2dfbf46da2d98546664343ce93 (patch) | |
| tree | 00a568097b5e34750f932aeec62fee4b19b048b5 | |
| parent | dc18040ba47325afb38ae62042a6103bfd794c4b (diff) | |
| download | django-rest-framework-4f3c3a06cfc0ea2dfbf46da2d98546664343ce93.tar.bz2 | |
Drop trailing whitespace on indented JSON output. Closes #2429.
| -rw-r--r-- | rest_framework/compat.py | 2 | ||||
| -rw-r--r-- | rest_framework/renderers.py | 8 | ||||
| -rw-r--r-- | tests/test_renderers.py | 24 | 
3 files changed, 31 insertions, 3 deletions
| diff --git a/rest_framework/compat.py b/rest_framework/compat.py index 7241da27..ea342994 100644 --- a/rest_framework/compat.py +++ b/rest_framework/compat.py @@ -227,6 +227,8 @@ except ImportError:  if six.PY3:      SHORT_SEPARATORS = (',', ':')      LONG_SEPARATORS = (', ', ': ') +    INDENT_SEPARATORS = (',', ': ')  else:      SHORT_SEPARATORS = (b',', b':')      LONG_SEPARATORS = (b', ', b': ') +    INDENT_SEPARATORS = (b',', b': ') diff --git a/rest_framework/renderers.py b/rest_framework/renderers.py index 4c46b049..7af03c67 100644 --- a/rest_framework/renderers.py +++ b/rest_framework/renderers.py @@ -18,7 +18,7 @@ from django.template import Context, RequestContext, loader, Template  from django.test.client import encode_multipart  from django.utils import six  from rest_framework import exceptions, serializers, status, VERSION -from rest_framework.compat import SHORT_SEPARATORS, LONG_SEPARATORS +from rest_framework.compat import SHORT_SEPARATORS, LONG_SEPARATORS, INDENT_SEPARATORS  from rest_framework.exceptions import ParseError  from rest_framework.settings import api_settings  from rest_framework.request import is_form_media_type, override_method @@ -87,7 +87,11 @@ class JSONRenderer(BaseRenderer):          renderer_context = renderer_context or {}          indent = self.get_indent(accepted_media_type, renderer_context) -        separators = SHORT_SEPARATORS if (indent is None and self.compact) else LONG_SEPARATORS + +        if indent is None: +            separators = SHORT_SEPARATORS if self.compact else LONG_SEPARATORS +        else: +            separators = INDENT_SEPARATORS          ret = json.dumps(              data, cls=self.encoder_class, diff --git a/tests/test_renderers.py b/tests/test_renderers.py index 7b78f7ba..3e64d8fe 100644 --- a/tests/test_renderers.py +++ b/tests/test_renderers.py @@ -1,6 +1,5 @@  # -*- coding: utf-8 -*-  from __future__ import unicode_literals -  from django.conf.urls import patterns, url, include  from django.core.cache import cache  from django.db import models @@ -8,6 +7,7 @@ from django.test import TestCase  from django.utils import six  from django.utils.translation import ugettext_lazy as _  from rest_framework import status, permissions +from rest_framework.compat import OrderedDict  from rest_framework.response import Response  from rest_framework.views import APIView  from rest_framework.renderers import BaseRenderer, JSONRenderer, BrowsableAPIRenderer @@ -489,3 +489,25 @@ class CacheRenderTest(TestCase):          cached_resp = cache.get(self.cache_key)          self.assertIsInstance(cached_resp, Response)          self.assertEqual(cached_resp.content, resp.content) + + +class TestJSONIndentationStyles: +    def test_indented(self): +        renderer = JSONRenderer() +        data = OrderedDict([('a', 1), ('b', 2)]) +        assert renderer.render(data) == b'{"a":1,"b":2}' + +    def test_compact(self): +        renderer = JSONRenderer() +        data = OrderedDict([('a', 1), ('b', 2)]) +        context = {'indent': 4} +        assert ( +            renderer.render(data, renderer_context=context) == +            b'{\n    "a": 1,\n    "b": 2\n}' +        ) + +    def test_long_form(self): +        renderer = JSONRenderer() +        renderer.compact = False +        data = OrderedDict([('a', 1), ('b', 2)]) +        assert renderer.render(data) == b'{"a": 1, "b": 2}' | 
