Skip to content

Commit be66e15

Browse files
author
kazmiruk
committed
renaming of OrderedDict back to SortedDict + some comments
1 parent 18f1f57 commit be66e15

File tree

7 files changed

+43
-29
lines changed

7 files changed

+43
-29
lines changed

rest_framework/compat.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -266,11 +266,20 @@ def python_2_unicode_compatible(klass):
266266
klass.__str__ = lambda self: self.__unicode__().encode('utf-8')
267267
return klass
268268

269+
"""
270+
SortedDict deprecated since django 1.8. There is collections.OrderedDict
271+
which available since python 2.7 and python 3.1. There are no need of other
272+
checks because of django 1.7+ requires python 2.7+
273+
"""
269274
try:
270-
from collections import OrderedDict
275+
from collections import OrderedDict as SortedDict
271276
except ImportError:
272-
from django.utils.datastructures import SortedDict as OrderedDict
277+
from django.utils.datastructures import SortedDict
273278

279+
"""
280+
GenericForeignKey moves from generic to fields in django 1.9 and in 1.8 shows
281+
deprecation warnings
282+
"""
274283
if django.VERSION >= (1, 8):
275284
from django.contrib.contenttypes.fields import GenericForeignKey
276285
else:

rest_framework/fields.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
from django.utils.dateparse import parse_date, parse_datetime, parse_time
2626
from rest_framework import ISO_8601
2727
from rest_framework.compat import (
28-
BytesIO, smart_text, OrderedDict,
28+
BytesIO, smart_text, SortedDict,
2929
force_text, is_non_str_iterable
3030
)
3131
from rest_framework.settings import api_settings
@@ -224,7 +224,7 @@ def to_native(self, value):
224224
return [self.to_native(item) for item in value]
225225
elif isinstance(value, dict):
226226
# Make sure we preserve field ordering, if it exists
227-
ret = OrderedDict()
227+
ret = SortedDict()
228228
for key, val in value.items():
229229
ret[key] = self.to_native(val)
230230
return ret
@@ -239,7 +239,7 @@ def attributes(self):
239239
return {}
240240

241241
def metadata(self):
242-
metadata = OrderedDict()
242+
metadata = SortedDict()
243243
metadata['type'] = self.type_label
244244
metadata['required'] = getattr(self, 'required', False)
245245
optional_attrs = ['read_only', 'label', 'help_text',

rest_framework/routers.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
from django.core.exceptions import ImproperlyConfigured
2222
from django.core.urlresolvers import NoReverseMatch
2323
from rest_framework import views
24-
from rest_framework.compat import OrderedDict
24+
from rest_framework.compat import SortedDict
2525
from rest_framework.response import Response
2626
from rest_framework.reverse import reverse
2727
from rest_framework.urlpatterns import format_suffix_patterns
@@ -278,7 +278,7 @@ def get_api_root_view(self):
278278
"""
279279
Return a view to use as the API root.
280280
"""
281-
api_root_dict = OrderedDict()
281+
api_root_dict = SortedDict()
282282
list_name = self.routes[0].name
283283
for prefix, viewset, basename in self.registry:
284284
api_root_dict[prefix] = list_name.format(basename=basename)
@@ -287,7 +287,7 @@ class APIRoot(views.APIView):
287287
_ignore_model_permissions = True
288288

289289
def get(self, request, *args, **kwargs):
290-
ret = OrderedDict()
290+
ret = SortedDict()
291291
for key, url_name in api_root_dict.items():
292292
try:
293293
ret[key] = reverse(

rest_framework/serializers.py

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
from django.utils import six
2323
from django.utils.functional import cached_property
2424
from django.core.exceptions import ObjectDoesNotExist
25-
from rest_framework.compat import OrderedDict, GenericForeignKey
25+
from rest_framework.compat import SortedDict, GenericForeignKey
2626
from rest_framework.settings import api_settings
2727

2828

@@ -105,20 +105,25 @@ def __getstate__(self):
105105
return dict(self)
106106

107107

108-
class OrderedDictWithMetadata(OrderedDict):
108+
class SortedDictWithMetadata(SortedDict):
109109
"""
110110
A sorted dict-like object, that can have additional properties attached.
111111
"""
112112
def __reduce__(self):
113-
return self.__class__, (OrderedDict(self), )
113+
"""
114+
Used by pickle (e.g., caching) if OrderedDict is used instead of SortedDict
115+
Overriden to remove the metadata from the dict, since it shouldn't be
116+
pickle and may in some instances be unpickleable.
117+
"""
118+
return self.__class__, (SortedDict(self), )
114119

115120
def __getstate__(self):
116121
"""
117-
Used by pickle (e.g., caching).
122+
Used by pickle (e.g., caching) in SortedDict
118123
Overriden to remove the metadata from the dict, since it shouldn't be
119124
pickle and may in some instances be unpickleable.
120125
"""
121-
return OrderedDict(self).__dict__
126+
return SortedDict(self).__dict__
122127

123128

124129
def _is_protected_type(obj):
@@ -154,7 +159,7 @@ def _get_declared_fields(bases, attrs):
154159
if hasattr(base, 'base_fields'):
155160
fields = list(base.base_fields.items()) + fields
156161

157-
return OrderedDict(fields)
162+
return SortedDict(fields)
158163

159164

160165
class SerializerMetaclass(type):
@@ -182,7 +187,7 @@ class Meta(object):
182187
pass
183188

184189
_options_class = SerializerOptions
185-
_dict_class = OrderedDictWithMetadata
190+
_dict_class = SortedDictWithMetadata
186191

187192
def __init__(self, instance=None, data=None, files=None,
188193
context=None, partial=False, many=False,
@@ -231,7 +236,7 @@ def get_fields(self):
231236
This will be the set of any explicitly declared fields,
232237
plus the set of fields returned by get_default_fields().
233238
"""
234-
ret = OrderedDict()
239+
ret = SortedDict()
235240

236241
# Get the explicitly declared fields
237242
base_fields = copy.deepcopy(self.base_fields)
@@ -247,7 +252,7 @@ def get_fields(self):
247252
# If 'fields' is specified, use those fields, in that order.
248253
if self.opts.fields:
249254
assert isinstance(self.opts.fields, (list, tuple)), '`fields` must be a list or tuple'
250-
new = OrderedDict()
255+
new = SortedDict()
251256
for key in self.opts.fields:
252257
new[key] = ret[key]
253258
ret = new
@@ -608,7 +613,7 @@ def metadata(self):
608613
Useful for things like responding to OPTIONS requests, or generating
609614
API schemas for auto-documentation.
610615
"""
611-
return OrderedDict(
616+
return SortedDict(
612617
[
613618
(field_name, field.metadata())
614619
for field_name, field in six.iteritems(self.fields)
@@ -685,7 +690,7 @@ def get_default_fields(self):
685690
self.__class__.__name__
686691
)
687692
opts = cls._meta.concrete_model._meta
688-
ret = OrderedDict()
693+
ret = SortedDict()
689694
nested = bool(self.opts.depth)
690695

691696
# Deal with adding the primary key field

rest_framework/utils/encoders.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
from django.utils import timezone
66
from django.db.models.query import QuerySet
77
from django.utils.functional import Promise
8-
from rest_framework.compat import force_text, OrderedDict
9-
from rest_framework.serializers import DictWithMetadata, OrderedDictWithMetadata
8+
from rest_framework.compat import force_text, SortedDict
9+
from rest_framework.serializers import DictWithMetadata, SortedDictWithMetadata
1010
import datetime
1111
import decimal
1212
import types
@@ -66,7 +66,7 @@ def default(self, o):
6666
class SafeDumper(yaml.SafeDumper):
6767
"""
6868
Handles decimals as strings.
69-
Handles OrderedDicts as usual dicts, but preserves field order, rather
69+
Handles SortedDicts as usual dicts, but preserves field order, rather
7070
than the usual behaviour of sorting the keys.
7171
"""
7272
def represent_decimal(self, data):
@@ -80,7 +80,7 @@ def represent_mapping(self, tag, mapping, flow_style=None):
8080
best_style = True
8181
if hasattr(mapping, 'items'):
8282
mapping = list(mapping.items())
83-
if not isinstance(mapping, OrderedDict):
83+
if not isinstance(mapping, SortedDict):
8484
mapping.sort()
8585
for item_key, item_value in mapping:
8686
node_key = self.represent_data(item_key)
@@ -102,15 +102,15 @@ def represent_mapping(self, tag, mapping, flow_style=None):
102102
SafeDumper.represent_decimal
103103
)
104104
SafeDumper.add_representer(
105-
OrderedDict,
105+
SortedDict,
106106
yaml.representer.SafeRepresenter.represent_dict
107107
)
108108
SafeDumper.add_representer(
109109
DictWithMetadata,
110110
yaml.representer.SafeRepresenter.represent_dict
111111
)
112112
SafeDumper.add_representer(
113-
OrderedDictWithMetadata,
113+
SortedDictWithMetadata,
114114
yaml.representer.SafeRepresenter.represent_dict
115115
)
116116
SafeDumper.add_representer(

rest_framework/views.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from django.http import Http404
88
from django.views.decorators.csrf import csrf_exempt
99
from rest_framework import status, exceptions
10-
from rest_framework.compat import smart_text, HttpResponseBase, OrderedDict, View
10+
from rest_framework.compat import smart_text, HttpResponseBase, SortedDict, View
1111
from rest_framework.request import Request
1212
from rest_framework.response import Response
1313
from rest_framework.settings import api_settings
@@ -420,7 +420,7 @@ def metadata(self, request):
420420
# By default we can't provide any form-like information, however the
421421
# generic views override this implementation and add additional
422422
# information for POST and PUT methods, based on the serializer.
423-
ret = OrderedDict()
423+
ret = SortedDict()
424424
ret['name'] = self.get_view_name()
425425
ret['description'] = self.get_view_description()
426426
ret['renders'] = [renderer.media_type for renderer in self.renderer_classes]

tests/test_serializer.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1297,7 +1297,7 @@ def test_pickle_simple_model_serializer_data(self):
12971297

12981298
def test_pickle_inner_serializer(self):
12991299
"""
1300-
Test pickling a serializer whose resulting .data (a OrderedDictWithMetadata) will
1300+
Test pickling a serializer whose resulting .data (a SortedDictWithMetadata) will
13011301
have unpickleable meta data--in order to make sure metadata doesn't get pulled into the pickle.
13021302
See DictWithMetadata.__getstate__
13031303
"""
@@ -1318,7 +1318,7 @@ def test_serializer_data_is_pickleable(self):
13181318
"""
13191319
Another regression test for #645.
13201320
"""
1321-
data = serializers.OrderedDictWithMetadata({1: 1})
1321+
data = serializers.SortedDictWithMetadata({1: 1})
13221322
repr(pickle.loads(pickle.dumps(data, 0)))
13231323

13241324

0 commit comments

Comments
 (0)