Skip to content

Commit 82ac00e

Browse files
committed
Updates to support most recent Ember Data conventions
More recent Ember Data requires all JSON keys to use camel casing instead of underscores. In addition, the outer key with name of relation needs to be pluralized when it contains a list of model instances. This makes use of the Python inflection library which can convert between both camel case and underscore formatting, as well as singular and plural tenses of english words.
1 parent 3895a0d commit 82ac00e

File tree

4 files changed

+37
-7
lines changed

4 files changed

+37
-7
lines changed

rest_framework_ember/parsers.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@
33
"""
44
from rest_framework.parsers import JSONParser
55

6-
from rest_framework_ember.utils import get_resource_name
6+
from rest_framework_ember.utils import (get_resource_name,
7+
underscore,
8+
camelize,
9+
recursive_key_map)
710

811

912
class EmberJSONParser(JSONParser):
@@ -30,5 +33,5 @@ def parse(self, stream, media_type=None, parser_context=None):
3033
stream, media_type=None, parser_context=None)
3134

3235
resource_name = get_resource_name(parser_context.get('view', None))
33-
return result.get(resource_name)
34-
36+
data = result.get(camelize(resource_name))
37+
return recursive_key_map(underscore, data)

rest_framework_ember/renderers.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import copy
22
from rest_framework import renderers
33

4-
from rest_framework_ember.utils import get_resource_name
4+
from rest_framework_ember.utils import (get_resource_name,
5+
camelize,
6+
recursive_key_map)
57

68

79
class JSONRenderer(renderers.JSONRenderer):
@@ -31,6 +33,8 @@ def render(self, data, accepted_media_type=None, renderer_context=None):
3133
data = {resource_name : content, "meta" : data_copy}
3234
except (TypeError, KeyError, AttributeError) as e:
3335
data = {resource_name : data}
36+
37+
if data:
38+
data = recursive_key_map(camelize, data)
3439
return super(JSONRenderer, self).render(
3540
data, accepted_media_type, renderer_context)
36-

rest_framework_ember/utils.py

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,16 @@
11
"""
22
Resource name utilities.
33
"""
4+
from collections import OrderedDict
5+
from functools import partial
6+
import re
7+
8+
import inflection
9+
10+
11+
camelize = partial(inflection.camelize, uppercase_first_letter=False)
12+
underscore = inflection.underscore
13+
414

515
def get_resource_name(view):
616
"""
@@ -28,5 +38,18 @@ def get_resource_name(view):
2838

2939
resource_name = name[:1].lower() + name[1:]
3040

31-
return resource_name
41+
if view.action == 'list':
42+
resource_name = inflection.pluralize(resource_name)
43+
return inflection.underscore(resource_name)
44+
3245

46+
def recursive_key_map(function, obj):
47+
if isinstance(obj, dict):
48+
new_dict = OrderedDict()
49+
for key, value in obj.items():
50+
key = function(key)
51+
new_dict[key] = recursive_key_map(function, value)
52+
return new_dict
53+
if isinstance(obj, (list, tuple)):
54+
return [recursive_key_map(function, value) for value in obj]
55+
return obj

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ def get_readme():
1616
license='BSD',
1717
keywords="EmberJS Django REST",
1818
packages=find_packages(),
19-
install_requires=['django', 'djangorestframework' ],
19+
install_requires=['django', 'djangorestframework', 'inflection'],
2020
platforms=['any'],
2121
classifiers=[
2222
'Development Status :: 4 - Beta',

0 commit comments

Comments
 (0)