Commit 49288f83 authored by Jannis Leidel's avatar Jannis Leidel
Browse files

Fixed #11970 -- Wrapped the exception happening during deserialization in...

Fixed #11970 -- Wrapped the exception happening during deserialization in DeserializationError exceptions. Thanks, Claude Paroz.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@17469 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent 75a9c8a5
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -6,6 +6,7 @@ import datetime
import decimal
from StringIO import StringIO

from django.core.serializers.base import DeserializationError
from django.core.serializers.python import Serializer as PythonSerializer
from django.core.serializers.python import Deserializer as PythonDeserializer
from django.utils import simplejson
@@ -27,6 +28,7 @@ class Serializer(PythonSerializer):
        if callable(getattr(self.stream, 'getvalue', None)):
            return self.stream.getvalue()


def Deserializer(stream_or_string, **options):
    """
    Deserialize a stream or string of JSON data.
@@ -35,8 +37,13 @@ def Deserializer(stream_or_string, **options):
        stream = StringIO(stream_or_string)
    else:
        stream = stream_or_string
    try:
        for obj in PythonDeserializer(simplejson.load(stream), **options):
            yield obj
    except Exception, e:
        # Map to deserializer error
        raise DeserializationError(e)


class DjangoJSONEncoder(simplejson.JSONEncoder):
    """
+7 −3
Original line number Diff line number Diff line
@@ -9,6 +9,7 @@ import decimal
import yaml

from django.db import models
from django.core.serializers.base import DeserializationError
from django.core.serializers.python import Serializer as PythonSerializer
from django.core.serializers.python import Deserializer as PythonDeserializer

@@ -51,6 +52,9 @@ def Deserializer(stream_or_string, **options):
        stream = StringIO(stream_or_string)
    else:
        stream = stream_or_string
    try:
        for obj in PythonDeserializer(yaml.safe_load(stream), **options):
            yield obj
    except Exception, e:
        # Map to deserializer error
        raise DeserializationError(e)
+12 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ except ImportError:

from django.core import serializers
from django.core.serializers import SerializerDoesNotExist
from django.core.serializers.base import DeserializationError
from django.db import connection, models
from django.test import TestCase
from django.utils.functional import curry
@@ -390,6 +391,17 @@ class SerializerTests(TestCase):
        with self.assertRaises(SerializerDoesNotExist):
            serializers.get_deserializer("nonsense")

    def test_json_deserializer_exception(self):
        with self.assertRaises(DeserializationError):
            for obj in serializers.deserialize("json", """[{"pk":1}"""):
                pass

    def test_yaml_deserializer_exception(self):
        with self.assertRaises(DeserializationError):
            for obj in serializers.deserialize("yaml", "{"):
                pass


def serializerTest(format, self):

    # Create all the objects defined in the test data