Skip to content

Commit 10a503b

Browse files
committed
Merge pull request #93 from django-json-api/feature/capitalize
Added capitalize to the inflection options. camelCase now lowercases first letter
2 parents 28833bf + 7c6e3cf commit 10a503b

File tree

4 files changed

+34
-18
lines changed

4 files changed

+34
-18
lines changed

docs/usage.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,9 @@ JSON_API_FORMAT_KEYS = 'dasherize'
6969
Possible values:
7070

7171
* dasherize
72-
* camelize
72+
* camelize (first letter is lowercase)
73+
* capitalize (camelize but with first letter uppercase)
7374
* underscore
74-
* pluralize
7575

7676
Note: due to the way the inflector works `address_1` can camelize to `address1`
7777
on output but it cannot convert `address1` back to `address_1` on POST or PUT. Keep

example/tests/test_format_keys.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ def test_camelization(self):
3737
expected = {
3838
'data': [
3939
{
40-
'type': 'Users',
40+
'type': 'users',
4141
'id': encoding.force_text(user.pk),
4242
'attributes': {
4343
'firstName': user.first_name,

example/tests/test_utils.py

+18-6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import pytest
22

3+
from django.conf import settings
34
from django.contrib.auth import get_user_model
45
from rest_framework import serializers
56
from rest_framework.response import Response
@@ -8,7 +9,7 @@
89

910
pytestmark = pytest.mark.django_db
1011

11-
class Resource(APIView):
12+
class ResourceView(APIView):
1213
pass
1314

1415
class ResourceSerializer(serializers.ModelSerializer):
@@ -17,9 +18,15 @@ class Meta():
1718
model = get_user_model()
1819

1920
def test_get_resource_name():
20-
view = Resource()
21+
view = ResourceView()
2122
context = {'view': view}
22-
assert 'resources' == utils.get_resource_name(context), 'derived from view'
23+
setattr(settings, 'JSON_API_FORMAT_KEYS', None)
24+
assert 'ResourceViews' == utils.get_resource_name(context), 'not formatted'
25+
26+
view = ResourceView()
27+
context = {'view': view}
28+
setattr(settings, 'JSON_API_FORMAT_KEYS', 'dasherize')
29+
assert 'resource-views' == utils.get_resource_name(context), 'derived from view'
2330

2431
view.model = get_user_model()
2532
assert 'users' == utils.get_resource_name(context), 'derived from view model'
@@ -33,7 +40,7 @@ def test_get_resource_name():
3340
view.response = Response(status=500)
3441
assert 'errors' == utils.get_resource_name(context), 'handles 500 error'
3542

36-
view = Resource()
43+
view = ResourceView()
3744
context = {'view': view}
3845
view.serializer_class = ResourceSerializer
3946
assert 'users' == utils.get_resource_name(context), 'derived from serializer'
@@ -50,6 +57,9 @@ def test_format_keys():
5057
output = {'firstName': 'a', 'lastName': 'b'}
5158
assert utils.format_keys(underscored, 'camelize') == output
5259

60+
output = {'FirstName': 'a', 'LastName': 'b'}
61+
assert utils.format_keys(underscored, 'capitalize') == output
62+
5363
output = {'first-name': 'a', 'last-name': 'b'}
5464
assert utils.format_keys(underscored, 'dasherize') == output
5565

@@ -60,12 +70,14 @@ def test_format_keys():
6070
assert utils.format_keys([underscored], 'dasherize') == output
6171

6272
def test_format_value():
63-
assert utils.format_value('first_name', 'camelize') == 'FirstName'
73+
assert utils.format_value('first_name', 'camelize') == 'firstName'
74+
assert utils.format_value('first_name', 'capitalize') == 'FirstName'
6475
assert utils.format_value('first_name', 'dasherize') == 'first-name'
6576
assert utils.format_value('first-name', 'underscore') == 'first_name'
6677

6778
def test_format_relation_name():
68-
assert utils.format_relation_name('first_name', 'camelize') == 'FirstNames'
79+
assert utils.format_relation_name('first_name', 'capitalize') == 'FirstNames'
80+
assert utils.format_relation_name('first_name', 'camelize') == 'firstNames'
6981

7082
def test_build_json_resource_obj():
7183
resource = {

rest_framework_json_api/utils.py

+13-9
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,10 @@ def get_resource_name(context):
7070
if not isinstance(resource_name, six.string_types):
7171
return resource_name
7272

73-
resource_name = inflection.pluralize(resource_name.lower())
74-
7573
resource_name = format_value(resource_name)
7674

75+
resource_name = inflection.pluralize(resource_name)
76+
7777
return resource_name
7878

7979

@@ -94,17 +94,22 @@ def format_keys(obj, format_type=None):
9494
if format_type is None:
9595
format_type = getattr(settings, 'JSON_API_FORMAT_KEYS', False)
9696

97-
if format_type in ('dasherize', 'camelize', 'underscore'):
97+
if format_type in ('dasherize', 'camelize', 'underscore', 'capitalize'):
9898

9999
if isinstance(obj, dict):
100100
formatted = OrderedDict()
101101
for key, value in obj.items():
102102
if format_type == 'dasherize':
103+
# inflection can't dasherize camelCase
104+
key = inflection.underscore(key)
103105
formatted[inflection.dasherize(key)] \
104106
= format_keys(value, format_type)
105107
elif format_type == 'camelize':
106108
formatted[inflection.camelize(key, False)] \
107109
= format_keys(value, format_type)
110+
elif format_type == 'capitalize':
111+
formatted[inflection.camelize(key)] \
112+
= format_keys(value, format_type)
108113
elif format_type == 'underscore':
109114
formatted[inflection.underscore(key)] \
110115
= format_keys(value, format_type)
@@ -121,8 +126,12 @@ def format_value(value, format_type=None):
121126
if format_type is None:
122127
format_type = getattr(settings, 'JSON_API_FORMAT_KEYS', False)
123128
if format_type == 'dasherize':
129+
# inflection can't dasherize camelCase
130+
value = inflection.underscore(value)
124131
value = inflection.dasherize(value)
125132
elif format_type == 'camelize':
133+
value = inflection.camelize(value, False)
134+
elif format_type == 'capitalize':
126135
value = inflection.camelize(value)
127136
elif format_type == 'underscore':
128137
value = inflection.underscore(value)
@@ -132,15 +141,10 @@ def format_value(value, format_type=None):
132141
def format_relation_name(value, format_type=None):
133142
if format_type is None:
134143
format_type = getattr(settings, 'JSON_API_FORMAT_RELATION_KEYS', False)
135-
144+
136145
if not format_type:
137-
# let's keep it the way it was
138146
return value
139147

140-
# in case the value is going to be changed, make it underscored first
141-
# because dasherize does not work with a camel cased string
142-
value = inflection.underscore(value)
143-
144148
# format_type will never be None here so we can use format_value
145149
value = format_value(value, format_type)
146150

0 commit comments

Comments
 (0)