Drop usage of SortedDict. Closes #2027.

This commit is contained in:
Tom Christie 2014-11-06 12:00:30 +00:00
parent 9923a6ce90
commit 4e001dbb7a
7 changed files with 36 additions and 29 deletions

View File

@ -26,6 +26,16 @@ except ImportError:
from django.utils.encoding import force_unicode as force_text
# OrderedDict only available in Python 2.7.
# This will always be the case in Django 1.7 and above, as these versions
# no longer support Python 2.6.
# For Django <= 1.6 and Python 2.6 fall back to OrderedDict.
try:
from collections import OrderedDict
except:
from django.utils.datastructures import SortedDict as OrderedDict
# HttpResponseBase only exists from 1.5 onwards
try:
from django.http.response import HttpResponseBase

View File

@ -4,14 +4,13 @@ from django.core.exceptions import ValidationError as DjangoValidationError
from django.core.validators import RegexValidator
from django.forms import ImageField as DjangoImageField
from django.utils import six, timezone
from django.utils.datastructures import SortedDict
from django.utils.dateparse import parse_date, parse_datetime, parse_time
from django.utils.encoding import is_protected_type
from django.utils.translation import ugettext_lazy as _
from rest_framework import ISO_8601
from rest_framework.compat import (
smart_text, EmailValidator, MinValueValidator, MaxValueValidator,
MinLengthValidator, MaxLengthValidator, URLValidator
MinLengthValidator, MaxLengthValidator, URLValidator, OrderedDict
)
from rest_framework.exceptions import ValidationError
from rest_framework.settings import api_settings
@ -917,9 +916,9 @@ class ChoiceField(Field):
for item in choices
]
if all(pairs):
self.choices = SortedDict([(key, display_value) for key, display_value in choices])
self.choices = OrderedDict([(key, display_value) for key, display_value in choices])
else:
self.choices = SortedDict([(item, item) for item in choices])
self.choices = OrderedDict([(item, item) for item in choices])
# Map the string representation of choices to the underlying value.
# Allows us to deal with eg. integer choices while supporting either

View File

@ -10,9 +10,8 @@ from __future__ import unicode_literals
from django.core.exceptions import PermissionDenied
from django.http import Http404
from django.utils.datastructures import SortedDict
from rest_framework import exceptions, serializers
from rest_framework.compat import force_text
from rest_framework.compat import force_text, OrderedDict
from rest_framework.request import clone_request
from rest_framework.utils.field_mapping import ClassLookupDict
@ -54,7 +53,7 @@ class SimpleMetadata(BaseMetadata):
})
def determine_metadata(self, request, view):
metadata = SortedDict()
metadata = OrderedDict()
metadata['name'] = view.get_view_name()
metadata['description'] = view.get_view_description()
metadata['renders'] = [renderer.media_type for renderer in view.renderer_classes]
@ -97,7 +96,7 @@ class SimpleMetadata(BaseMetadata):
Given an instance of a serializer, return a dictionary of metadata
about its fields.
"""
return SortedDict([
return OrderedDict([
(field_name, self.get_field_info(field))
for field_name, field in serializer.fields.items()
])
@ -107,7 +106,7 @@ class SimpleMetadata(BaseMetadata):
Given an instance of a serializer field, return a dictionary
of metadata about it.
"""
field_info = SortedDict()
field_info = OrderedDict()
field_info['type'] = self.label_lookup[field]
field_info['required'] = getattr(field, 'required', False)

View File

@ -20,8 +20,8 @@ from collections import namedtuple
from django.conf.urls import patterns, url
from django.core.exceptions import ImproperlyConfigured
from django.core.urlresolvers import NoReverseMatch
from django.utils.datastructures import SortedDict
from rest_framework import views
from rest_framework.compat import OrderedDict
from rest_framework.response import Response
from rest_framework.reverse import reverse
from rest_framework.urlpatterns import format_suffix_patterns
@ -278,7 +278,7 @@ class DefaultRouter(SimpleRouter):
"""
Return a view to use as the API root.
"""
api_root_dict = SortedDict()
api_root_dict = OrderedDict()
list_name = self.routes[0].name
for prefix, viewset, basename in self.registry:
api_root_dict[prefix] = list_name.format(basename=basename)
@ -287,7 +287,7 @@ class DefaultRouter(SimpleRouter):
_ignore_model_permissions = True
def get(self, request, *args, **kwargs):
ret = SortedDict()
ret = OrderedDict()
for key, url_name in api_root_dict.items():
try:
ret[key] = reverse(

View File

@ -14,8 +14,8 @@ from django.core.exceptions import ImproperlyConfigured
from django.db import models
from django.db.models.fields import FieldDoesNotExist
from django.utils import six
from django.utils.datastructures import SortedDict
from django.utils.translation import ugettext_lazy as _
from rest_framework.compat import OrderedDict
from rest_framework.exceptions import ValidationError
from rest_framework.fields import empty, set_value, Field, SkipField
from rest_framework.settings import api_settings
@ -159,7 +159,7 @@ class BaseSerializer(Field):
# Serializer & ListSerializer classes
# -----------------------------------
class ReturnDict(SortedDict):
class ReturnDict(OrderedDict):
"""
Return object from `serialier.data` for the `Serializer` class.
Includes a backlink to the serializer instance for renderers
@ -235,7 +235,7 @@ class BindingDict(object):
"""
def __init__(self, serializer):
self.serializer = serializer
self.fields = SortedDict()
self.fields = OrderedDict()
def __setitem__(self, key, field):
self.fields[key] = field
@ -280,7 +280,7 @@ class SerializerMetaclass(type):
if hasattr(base, '_declared_fields'):
fields = list(base._declared_fields.items()) + fields
return SortedDict(fields)
return OrderedDict(fields)
def __new__(cls, name, bases, attrs):
attrs['_declared_fields'] = cls._get_declared_fields(bases, attrs)
@ -679,7 +679,7 @@ class ModelSerializer(Serializer):
def get_fields(self):
declared_fields = copy.deepcopy(self._declared_fields)
ret = SortedDict()
ret = OrderedDict()
model = getattr(self.Meta, 'model')
fields = getattr(self.Meta, 'fields', None)
exclude = getattr(self.Meta, 'exclude', None)

View File

@ -4,9 +4,8 @@ Helper classes for parsers.
from __future__ import unicode_literals
from django.db.models.query import QuerySet
from django.utils import six, timezone
from django.utils.datastructures import SortedDict
from django.utils.functional import Promise
from rest_framework.compat import force_text
from rest_framework.compat import force_text, OrderedDict
import datetime
import decimal
import types
@ -68,7 +67,7 @@ else:
class SafeDumper(yaml.SafeDumper):
"""
Handles decimals as strings.
Handles SortedDicts as usual dicts, but preserves field order, rather
Handles OrderedDicts as usual dicts, but preserves field order, rather
than the usual behaviour of sorting the keys.
"""
def represent_decimal(self, data):
@ -82,7 +81,7 @@ else:
best_style = True
if hasattr(mapping, 'items'):
mapping = list(mapping.items())
if not isinstance(mapping, SortedDict):
if not isinstance(mapping, OrderedDict):
mapping.sort()
for item_key, item_value in mapping:
node_key = self.represent_data(item_key)
@ -104,7 +103,7 @@ else:
SafeDumper.represent_decimal
)
SafeDumper.add_representer(
SortedDict,
OrderedDict,
yaml.representer.SafeRepresenter.represent_dict
)
# SafeDumper.add_representer(
@ -112,7 +111,7 @@ else:
# yaml.representer.SafeRepresenter.represent_dict
# )
# SafeDumper.add_representer(
# SortedDictWithMetadata,
# OrderedDictWithMetadata,
# yaml.representer.SafeRepresenter.represent_dict
# )
SafeDumper.add_representer(

View File

@ -8,7 +8,7 @@ Usage: `get_field_info(model)` returns a `FieldInfo` instance.
from collections import namedtuple
from django.db import models
from django.utils import six
from django.utils.datastructures import SortedDict
from rest_framework.compat import OrderedDict
import inspect
@ -63,12 +63,12 @@ def get_field_info(model):
pk = pk.rel.to._meta.pk
# Deal with regular fields.
fields = SortedDict()
fields = OrderedDict()
for field in [field for field in opts.fields if field.serialize and not field.rel]:
fields[field.name] = field
# Deal with forward relationships.
forward_relations = SortedDict()
forward_relations = OrderedDict()
for field in [field for field in opts.fields if field.serialize and field.rel]:
forward_relations[field.name] = RelationInfo(
model_field=field,
@ -89,7 +89,7 @@ def get_field_info(model):
)
# Deal with reverse relationships.
reverse_relations = SortedDict()
reverse_relations = OrderedDict()
for relation in opts.get_all_related_objects():
accessor_name = relation.get_accessor_name()
reverse_relations[accessor_name] = RelationInfo(
@ -114,14 +114,14 @@ def get_field_info(model):
# Shortcut that merges both regular fields and the pk,
# for simplifying regular field lookup.
fields_and_pk = SortedDict()
fields_and_pk = OrderedDict()
fields_and_pk['pk'] = pk
fields_and_pk[pk.name] = pk
fields_and_pk.update(fields)
# Shortcut that merges both forward and reverse relationships
relations = SortedDict(
relations = OrderedDict(
list(forward_relations.items()) +
list(reverse_relations.items())
)