Skip to content

Commit 6f40485

Browse files
committed
change default separator to mixed-dot
1 parent 6db977d commit 6f40485

File tree

5 files changed

+52
-46
lines changed

5 files changed

+52
-46
lines changed

README.md

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -53,16 +53,16 @@ example:
5353
{
5454
'title': 'title',
5555
'date': "time",
56-
'simple_object[my_key]': 'title'
57-
'simple_object[my_list][0]': True,
58-
'langs[0][id]': 666,
59-
'langs[0][title]': 'title',
60-
'langs[0][description]': 'description',
61-
'langs[0][language]': "language",
62-
'langs[1][id]': 4566,
63-
'langs[1][title]': 'title1',
64-
'langs[1][description]': 'description1',
65-
'langs[1][language]': "language1"
56+
'simple_object.my_key': 'title'
57+
'simple_object.my_list[0]': True,
58+
'langs[0].id': 666,
59+
'langs[0].title': 'title',
60+
'langs[0].description': 'description',
61+
'langs[0].language': "language",
62+
'langs[1].id': 4566,
63+
'langs[1].title': 'title1',
64+
'langs[1].description': 'description1',
65+
'langs[1].language': "language1"
6666
}
6767

6868
# result:
@@ -122,8 +122,8 @@ Attributes where sub keys are other than full numbers are converted into Python
122122

123123
```python
124124
data = {
125-
'title[key0]': 'my-value',
126-
'title[key7]': 'my-second-value'
125+
'title.key0': 'my-value',
126+
'title.key7': 'my-second-value'
127127
}
128128
output = {
129129
'title': {
@@ -132,21 +132,23 @@ Attributes where sub keys are other than full numbers are converted into Python
132132
}
133133
}
134134

135+
135136
# You have no limit for chained key:
137+
# with "mixed-dot" separator option (same as 'mixed' but with dot after list to object):
136138
data = {
137-
'the[0][chained][key][0][are][awesome][0][0]': 'im here !!'
138-
}
139-
# With "dot" separator option:
140-
data = {
141-
'the.0.chained.key.0.are.awesome.0.0': 'im here !!'
139+
'the[0].chained.key[0].are.awesome[0][0]': 'im here !!'
142140
}
143141
# with "mixed" separator option:
144142
data = {
145143
'the[0]chained.key[0]are.awesome[0][0]': 'im here !!'
146144
}
147-
# with "mixed-dot" separator option (same as 'mixed' but with dot after list to object):
145+
# With "bracket" separator option:
148146
data = {
149-
'the[0].chained.key[0].are.awesome[0][0]': 'im here !!'
147+
'the[0][chained][key][0][are][awesome][0][0]': 'im here !!'
148+
}
149+
# With "dot" separator option:
150+
data = {
151+
'the.0.chained.key.0.are.awesome.0.0': 'im here !!'
150152
}
151153
```
152154

@@ -156,12 +158,14 @@ For this to work perfectly, you must follow the following rules:
156158

157159
- A first key always need to be set. ex: `title[0]` or `title`. In both cases the first key is `title`
158160

159-
- Each sub key need to be separate by brackets `[ ]` or dot `.` (depends of your options)
160-
161161
- For `mixed` or `mixed-dot` options, brackets `[]` is for list, and dot `.` is for object
162162

163163
- For `mixed-dot` options is look like `mixed` but with dot when object follow list
164164

165+
- For `bracket` each sub key need to be separate by brackets `[ ]` or with `dot` options `.`
166+
167+
- For `bracket` or `dot`options, if a key is number is convert to list else a object
168+
165169
- Don't put spaces between separators.
166170

167171
- By default, you can't set set duplicates keys (see options)
@@ -173,11 +177,11 @@ For this to work perfectly, you must follow the following rules:
173177
```python
174178
{
175179
# Separators:
180+
# with mixed-dot: article[0].title.authors[0]: "jhon doe"
181+
# with mixed: article[0]title.authors[0]: "jhon doe"
176182
# with bracket: article[0][title][authors][0]: "jhon doe"
177183
# with dot: article.0.title.authors.0: "jhon doe"
178-
# with mixed: article[0]title.authors[0]: "jhon doe"
179-
# with mixed-dot: article[0].title.authors[0]: "jhon doe"
180-
'separator': 'bracket' or 'dot' or 'mixed' or 'mixed-dot', # default is bracket
184+
'separator': 'bracket' or 'dot' or 'mixed' or 'mixed-dot', # default is `mixed-dot`
181185

182186

183187
# raise a expections when you have duplicate keys
@@ -212,7 +216,7 @@ For this to work perfectly, you must follow the following rules:
212216
...
213217

214218
DRF_NESTED_MULTIPART_PARSER = {
215-
"separator": "bracket",
219+
"separator": "mixed-dot",
216220
"raise_duplicate": True,
217221
"assign_duplicate": False
218222

nested_multipart_parser/parser.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,15 @@ def __init__(self, data, options={}):
1111

1212
def _merge_options(self, options):
1313
DEFAULT_OPTIONS = {
14-
"separator": "bracket",
14+
"separator": "mixed-dot",
1515
"raise_duplicate": True,
1616
"assign_duplicate": False
1717
}
1818

1919
options = {**DEFAULT_OPTIONS, **options}
2020
self._options = options
2121

22-
assert self._options.get("separator", "dot") in [
22+
assert self._options.get("separator", "mixed-dot") in [
2323
"dot", "bracket", "mixed", "mixed-dot"]
2424
assert isinstance(self._options.get("raise_duplicate", False), bool)
2525
assert isinstance(self._options.get("assign_duplicate", False), bool)

tests/test_drf.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,14 @@ class TestDrfParser(unittest.TestCase):
2424
def test_querydict_mutable(self):
2525
parser = NestedParser(
2626
{
27-
"dtc[key]": 'value',
28-
"dtc[vla]": "value2",
27+
"dtc.key": 'value',
28+
"dtc.vla": "value2",
2929
"list[0]": "value1",
3030
"list[1]": "value2",
3131
"string": "value",
32-
"dtc[hh][oo]": "sub",
33-
"dtc[hh][aa]": "sub2"
34-
}
32+
"dtc.hh.oo": "sub",
33+
"dtc.hh.aa": "sub2"
34+
},
3535
)
3636
self.assertTrue(parser.is_valid())
3737
expected = toQueryDict({
@@ -61,7 +61,9 @@ def test_settings(self):
6161
p = NestedParser(data)
6262
self.assertTrue(p.is_valid())
6363
expected = toQueryDict({
64-
"article.title": "youpi"
64+
"article": {
65+
"title": "youpi"
66+
}
6567
})
6668
self.assertEqual(p.validate_data, expected)
6769

tests/test_parser.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ def test_parser_object(self):
2424
data = {
2525
'title[id][length]': 'lalal'
2626
}
27-
parser = NestedParser(data)
27+
parser = NestedParser(data, {"separator": "bracket"})
2828
self.assertTrue(parser.is_valid())
2929
expected = {
3030
'title': {
@@ -40,7 +40,7 @@ def test_parser_object2(self):
4040
'title[id][length]': 'lalal',
4141
'title[id][value]': 'lalal'
4242
}
43-
parser = NestedParser(data)
43+
parser = NestedParser(data, {"separator": "bracket"})
4444
self.assertTrue(parser.is_valid())
4545
expected = {
4646
'title': {
@@ -59,7 +59,7 @@ def test_parser_object3(self):
5959
'title[id][value]': 'lalal',
6060
'title[value]': 'lalal'
6161
}
62-
parser = NestedParser(data)
62+
parser = NestedParser(data, {"separator": "bracket"})
6363
self.assertTrue(parser.is_valid())
6464
expected = {
6565
'title': {
@@ -81,7 +81,7 @@ def test_parser_object4(self):
8181
'sub': 'lalal',
8282
'title[id][recusrive][only][field]': 'icci'
8383
}
84-
parser = NestedParser(data)
84+
parser = NestedParser(data, {"separator": "bracket"})
8585
self.assertTrue(parser.is_valid())
8686
expected = {
8787
'title': {
@@ -107,7 +107,7 @@ def test_parser_object_reasing2(self):
107107
'sub': 'lalal',
108108
'title[id][recusrive][only][field]': 'icci',
109109
}
110-
parser = NestedParser(data)
110+
parser = NestedParser(data, {"separator": "bracket"})
111111
self.assertTrue(parser.is_valid())
112112
expected = {
113113
'title': {
@@ -189,7 +189,7 @@ def test_parser_list_object_index(self):
189189
'title': 'lalal',
190190
'list[length][0]': 'icicici'
191191
}
192-
parser = NestedParser(data)
192+
parser = NestedParser(data, {"separator": "bracket"})
193193
expected = {
194194
'title': 'lalal',
195195
'list': {
@@ -214,7 +214,7 @@ def test_real(self):
214214
'langs[1][description]': 'description1',
215215
'langs[1][language]': "language1"
216216
}
217-
parser = NestedParser(data)
217+
parser = NestedParser(data, {"separator": "bracket"})
218218
self.assertTrue(parser.is_valid())
219219
expected = {
220220
'title': 'title',

tests/test_parser_assign.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ def test_assign_duplicate_list(self):
1010
"title[0]": 101
1111
}
1212
p = NestedParser(
13-
data, {"raise_duplicate": False, "assign_duplicate": True})
13+
data, {"raise_duplicate": False, "assign_duplicate": True, "separator": "bracket"})
1414
self.assertTrue(p.is_valid())
1515
expected = {
1616
"title": [101]
@@ -23,7 +23,7 @@ def test_assign_duplicate_number_after_list(self):
2323
"title": 42,
2424
}
2525
p = NestedParser(
26-
data, {"raise_duplicate": False, "assign_duplicate": True})
26+
data, {"raise_duplicate": False, "assign_duplicate": True, "separator": "bracket"})
2727
self.assertTrue(p.is_valid())
2828
expected = {
2929
"title": 42
@@ -36,7 +36,7 @@ def test_assign_nested_duplicate_number_after_list(self):
3636
"title[0][sub]": 42,
3737
}
3838
p = NestedParser(
39-
data, {"raise_duplicate": False, "assign_duplicate": True})
39+
data, {"raise_duplicate": False, "assign_duplicate": True, "separator": "bracket"})
4040
self.assertTrue(p.is_valid())
4141
expected = {
4242
"title": [
@@ -53,7 +53,7 @@ def test_assign_nested_duplicate_number_after_list2(self):
5353
"title[0][sub][0]": 101,
5454
}
5555
p = NestedParser(
56-
data, {"raise_duplicate": False, "assign_duplicate": True})
56+
data, {"raise_duplicate": False, "assign_duplicate": True, "separator": "bracket"})
5757
self.assertTrue(p.is_valid())
5858
expected = {
5959
"title": [
@@ -70,7 +70,7 @@ def test_assign_nested_duplicate_number_after_dict(self):
7070
"title[0][sub][title]": 101,
7171
}
7272
p = NestedParser(
73-
data, {"raise_duplicate": False, "assign_duplicate": True})
73+
data, {"raise_duplicate": False, "assign_duplicate": True, "separator": "bracket"})
7474
self.assertTrue(p.is_valid())
7575
expected = {
7676
"title": [
@@ -89,7 +89,7 @@ def test_assign_nested_duplicate_number_after_dict2(self):
8989
"title[0][sub]": 42,
9090
}
9191
p = NestedParser(
92-
data, {"raise_duplicate": False, "assign_duplicate": True})
92+
data, {"raise_duplicate": False, "assign_duplicate": True, "separator": "bracket"})
9393
self.assertTrue(p.is_valid())
9494
expected = {
9595
"title": [

0 commit comments

Comments
 (0)