Ticket #15889: 15889-get_serializer-specific-exception_2.diff

File 15889-get_serializer-specific-exception_2.diff, 3.7 KB (added by magopian, 4 years ago)

Integrated Alex's and Jacob's feedbacks and improvements requests

  • django/core/serializers/__init__.py

    diff --git a/django/core/serializers/__init__.py b/django/core/serializers/__init__.py
    index 7afc94c..815db4a 100644
    a b To add your own serializers, use the SERIALIZATION_MODULES setting:: 
    1818
    1919from django.conf import settings
    2020from django.utils import importlib
     21from django.core.serializers.base import SerializerNotFound
    2122
    2223# Built-in serializers
    2324BUILTIN_SERIALIZERS = {
    def unregister_serializer(format): 
    6566def get_serializer(format):
    6667    if not _serializers:
    6768        _load_serializers()
     69    if format not in _serializers:
     70        raise SerializerNotFound(format)
    6871    return _serializers[format].Serializer
    6972
    7073def get_serializer_formats():
  • django/core/serializers/base.py

    diff --git a/django/core/serializers/base.py b/django/core/serializers/base.py
    index cdcc7fa..e520f06 100644
    a b from django.db import models 
    88from django.utils.encoding import smart_str, smart_unicode
    99from django.utils import datetime_safe
    1010
     11class SerializerNotFound(KeyError):
     12    """A requested serializer was not found."""
     13    pass
     14
    1115class SerializationError(Exception):
    1216    """Something bad happened during serialization."""
    1317    pass
  • docs/topics/serialization.txt

    diff --git a/docs/topics/serialization.txt b/docs/topics/serialization.txt
    index c8acc85..e46fb2c 100644
    a b This is useful if you want to serialize data directly to a file-like object 
    3838    out = open("file.xml", "w")
    3939    xml_serializer.serialize(SomeModel.objects.all(), stream=out)
    4040
     41.. note::
     42
     43    Calling :func:`~django.core.serializers.get_serializer` with an unknown
     44    :ref:`format <serialization-formats>` will raise a
     45    :class:`~django.core.serializers.SerializerNotFound` exception.
     46
    4147Subset of fields
    4248~~~~~~~~~~~~~~~~
    4349
  • tests/regressiontests/serializers_regress/tests.py

    diff --git a/tests/regressiontests/serializers_regress/tests.py b/tests/regressiontests/serializers_regress/tests.py
    index de57a6f..02c71d5 100644
    a b except ImportError: 
    1717
    1818from django.conf import settings
    1919from django.core import serializers, management
     20from django.core.serializers import SerializerNotFound
    2021from django.db import transaction, DEFAULT_DB_ALIAS, connection
    2122from django.test import TestCase
    2223from django.utils.functional import curry
    if connection.features.allows_primary_key_0: 
    350351# Dynamically create serializer tests to ensure that all
    351352# registered serializers are automatically tested.
    352353class SerializerTests(TestCase):
    353     pass
    354 
     354    def test_get_unknown_serializer(self):
     355        """
     356        #15889: get_serializer('unknown_format') raises a SerializerNotFound
     357        """
     358        unknown = 'unknown format'
     359        self.assertRaises(SerializerNotFound,
     360                          serializers.get_serializer, unknown)
     361        # SerializerNotFound subclasses KeyError for backwards compatibility
     362        self.assertRaises(KeyError, serializers.get_serializer, 'unknown')
     363
     364        # SerializerNotFound is instantiated with the non-existent format
     365        try:
     366            serializers.get_serializer(unknown)
     367        except SerializerNotFound as (msg,):
     368            self.assertEqual(msg, unknown)
     369
     370    def test_get_known_serializer(self):
     371        """
     372        #15889: make sure getting an existing serializer still works fine
     373        """
     374        format, module = serializers.BUILTIN_SERIALIZERS.items()[0]
     375        self.assertEqual(serializers.get_serializer(format).__module__, module)
     376       
    355377def serializerTest(format, self):
    356378
    357379    # Create all the objects defined in the test data
Back to Top