Skip to content

Commit 21d2ab2

Browse files
authored
Fixes bug in string case serialization not taking numbers into account (#420)
1 parent 8ffa594 commit 21d2ab2

File tree

3 files changed

+44
-2
lines changed

3 files changed

+44
-2
lines changed

dataclasses_json/core.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,11 @@ def _encode_overrides(kvs, overrides, encode_json=False):
114114
letter_case = overrides[k].letter_case
115115
original_key = k
116116
k = letter_case(k) if letter_case is not None else k
117+
if k in override_kvs:
118+
raise ValueError(
119+
f"Multiple fields map to the same JSON "
120+
f"key after letter case encoding: {k}"
121+
)
117122

118123
encoder = overrides[original_key].encoder
119124
v = encoder(v) if encoder is not None else v

dataclasses_json/stringcase.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ def camelcase(string):
7575
if not string:
7676
return string
7777
return (uplowcase(string[0], 'low')
78-
+ re.sub(r"[\-_\.\s]([a-z])",
78+
+ re.sub(r"[\-_\.\s]([a-z0-9])",
7979
lambda matched: uplowcase(matched.group(1), 'up'),
8080
string[1:]))
8181

@@ -96,7 +96,7 @@ def snakecase(string):
9696
if not string:
9797
return string
9898
return (uplowcase(string[0], 'low')
99-
+ re.sub(r"[A-Z]",
99+
+ re.sub(r"[A-Z0-9]",
100100
lambda matched: '_' + uplowcase(matched.group(0), 'low'),
101101
string[1:]))
102102

tests/test_letter_case.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
from dataclasses import dataclass, field
22

3+
import pytest
4+
35
from dataclasses_json import LetterCase, dataclass_json, config
46

57

@@ -56,6 +58,31 @@ class CamelCasePersonWithOverride:
5658
years_on_earth: int = field(metadata=config(field_name='age'))
5759

5860

61+
@dataclass_json
62+
@dataclass
63+
class CamelCaseProtectedNamePerson:
64+
_given_name_2: str = field(
65+
metadata={'dataclasses_json': {
66+
'letter_case': LetterCase.CAMEL
67+
}}
68+
)
69+
70+
71+
@dataclass_json
72+
@dataclass
73+
class CamelCaseDuplicatedNameEncodingPerson:
74+
given_name_1: str = field(
75+
metadata={'dataclasses_json': {
76+
'letter_case': LetterCase.CAMEL
77+
}}
78+
)
79+
given_name1: str = field(
80+
metadata={'dataclasses_json': {
81+
'letter_case': LetterCase.CAMEL
82+
}}
83+
)
84+
85+
5986
class TestLetterCase:
6087
def test_camel_encode(self):
6188
assert CamelCasePerson('Alice').to_json() == '{"givenName": "Alice"}'
@@ -107,3 +134,13 @@ def test_from_dict(self):
107134

108135
def test_to_dict(self):
109136
assert {'givenName': 'Alice'} == CamelCasePerson('Alice').to_dict()
137+
138+
def test_protected_encode(self):
139+
assert CamelCaseProtectedNamePerson('Alice').to_json() == '{"givenName2": "Alice"}'
140+
141+
def test_protected_decode(self):
142+
assert CamelCaseProtectedNamePerson.from_json('{"givenName2": "Alice"}') == CamelCaseProtectedNamePerson('Alice')
143+
144+
def test_duplicated_encoding(self):
145+
with pytest.raises(ValueError):
146+
CamelCaseDuplicatedNameEncodingPerson('Alice', 'Bob').to_json()

0 commit comments

Comments
 (0)