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
This commit is contained in:
Jannis Leidel 2012-02-09 18:56:58 +00:00
parent 75a9c8a5ef
commit 49288f8388
3 changed files with 28 additions and 5 deletions

View File

@ -6,6 +6,7 @@ import datetime
import decimal import decimal
from StringIO import StringIO 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 Serializer as PythonSerializer
from django.core.serializers.python import Deserializer as PythonDeserializer from django.core.serializers.python import Deserializer as PythonDeserializer
from django.utils import simplejson from django.utils import simplejson
@ -27,6 +28,7 @@ class Serializer(PythonSerializer):
if callable(getattr(self.stream, 'getvalue', None)): if callable(getattr(self.stream, 'getvalue', None)):
return self.stream.getvalue() return self.stream.getvalue()
def Deserializer(stream_or_string, **options): def Deserializer(stream_or_string, **options):
""" """
Deserialize a stream or string of JSON data. Deserialize a stream or string of JSON data.
@ -35,8 +37,13 @@ def Deserializer(stream_or_string, **options):
stream = StringIO(stream_or_string) stream = StringIO(stream_or_string)
else: else:
stream = stream_or_string stream = stream_or_string
for obj in PythonDeserializer(simplejson.load(stream), **options): try:
yield obj for obj in PythonDeserializer(simplejson.load(stream), **options):
yield obj
except Exception, e:
# Map to deserializer error
raise DeserializationError(e)
class DjangoJSONEncoder(simplejson.JSONEncoder): class DjangoJSONEncoder(simplejson.JSONEncoder):
""" """

View File

@ -9,6 +9,7 @@ import decimal
import yaml import yaml
from django.db import models 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 Serializer as PythonSerializer
from django.core.serializers.python import Deserializer as PythonDeserializer from django.core.serializers.python import Deserializer as PythonDeserializer
@ -51,6 +52,9 @@ def Deserializer(stream_or_string, **options):
stream = StringIO(stream_or_string) stream = StringIO(stream_or_string)
else: else:
stream = stream_or_string stream = stream_or_string
for obj in PythonDeserializer(yaml.safe_load(stream), **options): try:
yield obj for obj in PythonDeserializer(yaml.safe_load(stream), **options):
yield obj
except Exception, e:
# Map to deserializer error
raise DeserializationError(e)

View File

@ -19,6 +19,7 @@ except ImportError:
from django.core import serializers from django.core import serializers
from django.core.serializers import SerializerDoesNotExist from django.core.serializers import SerializerDoesNotExist
from django.core.serializers.base import DeserializationError
from django.db import connection, models from django.db import connection, models
from django.test import TestCase from django.test import TestCase
from django.utils.functional import curry from django.utils.functional import curry
@ -390,6 +391,17 @@ class SerializerTests(TestCase):
with self.assertRaises(SerializerDoesNotExist): with self.assertRaises(SerializerDoesNotExist):
serializers.get_deserializer("nonsense") 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): def serializerTest(format, self):
# Create all the objects defined in the test data # Create all the objects defined in the test data