Skip to content

Commit

Permalink
Fixed #14823 -- Corrected bootstrapping problems with register_serial…
Browse files Browse the repository at this point in the history
…izers. Thanks to miker985@uw.edu for the report and draft patch.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@15336 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information
freakboy3742 committed Jan 27, 2011
1 parent 456b8a9 commit 4a3ea26
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 1 deletion.
4 changes: 4 additions & 0 deletions django/core/serializers/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ def register_serializer(format, serializer_module, serializers=None):
directly into the global register of serializers. Adding serializers
directly is not a thread-safe operation.
"""
if serializers is None and not _serializers:
_load_serializers()
module = importlib.import_module(serializer_module)
if serializers is None:
_serializers[format] = module
Expand All @@ -56,6 +58,8 @@ def register_serializer(format, serializer_module, serializers=None):

def unregister_serializer(format):
"Unregister a given serializer. This is not a thread-safe operation."
if not _serializers:
_load_serializers()
del _serializers[format]

def get_serializer(format):
Expand Down
53 changes: 52 additions & 1 deletion tests/modeltests/serializers/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,65 @@
from StringIO import StringIO
from xml.dom import minidom

from django.conf import settings
from django.core import serializers
from django.db import transaction
from django.test import TestCase, TransactionTestCase, Approximate
from django.utils import simplejson
from django.utils import simplejson, unittest

from models import Category, Author, Article, AuthorProfile, Actor, \
Movie, Score, Player, Team

class SerializerRegistrationTests(unittest.TestCase):
def setUp(self):
self.old_SERIALIZATION_MODULES = getattr(settings, 'SERIALIZATION_MODULES', None)
self.old_serializers = serializers._serializers

serializers._serializers = {}
settings.SERIALIZATION_MODULES = {
"json2" : "django.core.serializers.json",
}

def tearDown(self):
serializers._serializers = self.old_serializers
if self.old_SERIALIZATION_MODULES:
settings.SERIALIZATION_MODULES = self.old_SERIALIZATION_MODULES
else:
delattr(settings, 'SERIALIZATION_MODULES')

def test_register(self):
"Registering a new serializer populates the full registry. Refs #14823"
serializers.register_serializer('json3', 'django.core.serializers.json')

public_formats = serializers.get_public_serializer_formats()
self.assertIn('json3', public_formats)
self.assertIn('json2', public_formats)
self.assertIn('xml', public_formats)

def test_unregister(self):
"Unregistering a serializer doesn't cause the registry to be repopulated. Refs #14823"
serializers.unregister_serializer('xml')
serializers.register_serializer('json3', 'django.core.serializers.json')

public_formats = serializers.get_public_serializer_formats()

self.assertNotIn('xml', public_formats)
self.assertIn('json3', public_formats)

def test_builtin_serializers(self):
"Requesting a list of serializer formats popuates the registry"
all_formats = set(serializers.get_serializer_formats())
public_formats = set(serializers.get_public_serializer_formats())

self.assertIn('xml', all_formats),
self.assertIn('xml', public_formats)

self.assertIn('json2', all_formats)
self.assertIn('json2', public_formats)

self.assertIn('python', all_formats)
self.assertNotIn('python', public_formats)

class SerializersTestBase(object):
@staticmethod
def _comparison_value(value):
Expand Down

0 comments on commit 4a3ea26

Please sign in to comment.