Skip to content

Commit 38c7272

Browse files
committed
changed separator mixed with mixed-dot
1 parent 51b6a3f commit 38c7272

File tree

4 files changed

+50
-51
lines changed

4 files changed

+50
-51
lines changed

README.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -142,11 +142,11 @@ Attributes where sub keys are other than full numbers are converted into Python
142142
}
143143
# with "mixed" separator option:
144144
data = {
145-
'the[0].chained.key[0].are.awesome[0][0]': 'im here !!'
145+
'the[0]chained.key[0]are.awesome[0][0]': 'im here !!'
146146
}
147-
# with "mixed-dot" separator option (same as 'mixed' but without dot after list to object):
147+
# with "mixed-dot" separator option (same as 'mixed' but with dot after list to object):
148148
data = {
149-
'the[0]chained.key[0]are.awesome[0][0]': 'im here !!'
149+
'the[0].chained.key[0].are.awesome[0][0]': 'im here !!'
150150
}
151151
```
152152

@@ -158,7 +158,7 @@ For this to work perfectly, you must follow the following rules:
158158

159159
- Each sub key need to be separate by brackets `[ ]` or dot `.` (depends of your options)
160160

161-
- For `mixed` options, brackets `[]` is for list, and dot `.` is for object
161+
- For `mixed` or `mixed-dot` options, brackets `[]` is for list, and dot `.` is for object
162162

163163
- Don't put spaces between separators.
164164

@@ -173,8 +173,8 @@ For this to work perfectly, you must follow the following rules:
173173
# Separators:
174174
# with bracket: article[0][title][authors][0]: "jhon doe"
175175
# with dot: article.0.title.authors.0: "jhon doe"
176-
# with mixed: article[0].title.authors[0]: "jhon doe"
177-
# with mixed-dot: article[0]title.authors[0]: "jhon doe"
176+
# with mixed: article[0]title.authors[0]: "jhon doe"
177+
# with mixed-dot: article[0].title.authors[0]: "jhon doe"
178178
'separator': 'bracket' or 'dot' or 'mixed' or 'mixed-dot', # default is bracket
179179

180180

nested_multipart_parser/parser.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ def _merge_options(self, options):
3434
self.__is_mixed = True
3535
elif self._options["separator"] == "mixed-dot":
3636
self.__is_mixed_dot = True
37-
self.__is_mixed = True
3837
else:
3938
self.__is_bracket = True
4039
self._reg = re.compile(r"\[|\]")
@@ -76,13 +75,13 @@ def span(key, i):
7675
elif key[i] == ']':
7776
raise ValueError(
7877
f"invalid format key '{full_keys}', not start with bracket at position {i + pos}")
79-
elif (key[i] == '.' and not self.__is_mixed_dot) or (
80-
self.__is_mixed_dot and (
78+
elif (key[i] == '.' and self.__is_mixed_dot) or (
79+
not self.__is_mixed_dot and (
8180
(key[i] != '.' and last_is_list) or
8281
(key[i] == '.' and not last_is_list)
8382
)
8483
):
85-
if not self.__is_mixed_dot or not last_is_list:
84+
if self.__is_mixed_dot or not last_is_list:
8685
i += 1
8786
idx = span(key, i)
8887
keys.append(key[i: idx])
@@ -103,7 +102,7 @@ def split_key(self, key):
103102
# reduce + filter are a hight cost so do manualy with for loop
104103

105104
# optimize by split with string func
106-
if self.__is_mixed:
105+
if self.__is_mixed or self.__is_mixed_dot:
107106
return self.mixed_split(key)
108107
if self.__is_dot:
109108
length = 1
@@ -146,7 +145,7 @@ def set_type(self, dtc, key, value, full_keys, prev=None, last=False):
146145
return key
147146

148147
def get_next_type(self, key):
149-
if self.__is_mixed:
148+
if self.__is_mixed or self.__is_mixed_dot:
150149
return [] if isinstance(key, int) else {}
151150
return [] if key.isdigit() else {}
152151

tests/test_mixed_dot_separator.py

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from unittest import TestCase
33

44

5-
class TestSettingsSeparatorMixed(TestCase):
5+
class TestSettingsSeparatorMixedDot(TestCase):
66

77
def test_assign_duplicate_list(self):
88
data = {
@@ -32,8 +32,8 @@ def test_assign_duplicate_number_after_list(self):
3232

3333
def test_assign_nested_duplicate_number_after_list(self):
3434
data = {
35-
"title[0]sub[0]": 101,
36-
"title[0]sub": 42,
35+
"title[0].sub[0]": 101,
36+
"title[0].sub": 42,
3737
}
3838
p = NestedParser(
3939
data, {"raise_duplicate": False, "assign_duplicate": True, "separator": "mixed-dot"})
@@ -49,8 +49,8 @@ def test_assign_nested_duplicate_number_after_list(self):
4949

5050
def test_assign_nested_duplicate_number_after_list2(self):
5151
data = {
52-
"title[0]sub": 42,
53-
"title[0]sub[0]": 101,
52+
"title[0].sub": 42,
53+
"title[0].sub[0]": 101,
5454
}
5555
p = NestedParser(
5656
data, {"raise_duplicate": False, "assign_duplicate": True, "separator": "mixed-dot"})
@@ -66,8 +66,8 @@ def test_assign_nested_duplicate_number_after_list2(self):
6666

6767
def test_assign_nested_duplicate_number_after_dict(self):
6868
data = {
69-
"title[0]sub": 42,
70-
"title[0]sub.title": 101,
69+
"title[0].sub": 42,
70+
"title[0].sub.title": 101,
7171
}
7272
p = NestedParser(
7373
data, {"raise_duplicate": False, "assign_duplicate": True, "separator": "mixed-dot"})
@@ -85,8 +85,8 @@ def test_assign_nested_duplicate_number_after_dict(self):
8585

8686
def test_assign_nested_duplicate_number_after_dict2(self):
8787
data = {
88-
"title[0]sub.title": 101,
89-
"title[0]sub": 42,
88+
"title[0].sub.title": 101,
89+
"title[0].sub": 42,
9090
}
9191
p = NestedParser(
9292
data, {"raise_duplicate": False, "assign_duplicate": True, "separator": "mixed-dot"})
@@ -149,14 +149,14 @@ def test_real(self):
149149
data = {
150150
'title': 'title',
151151
'date': "time",
152-
'langs[0]id': "id",
153-
'langs[0]title': 'title',
154-
'langs[0]description': 'description',
155-
'langs[0]language': "language",
156-
'langs[1]id': "id1",
157-
'langs[1]title': 'title1',
158-
'langs[1]description': 'description1',
159-
'langs[1]language': "language1"
152+
'langs[0].id': "id",
153+
'langs[0].title': 'title',
154+
'langs[0].description': 'description',
155+
'langs[0].language': "language",
156+
'langs[1].id': "id1",
157+
'langs[1].title': 'title1',
158+
'langs[1].description': 'description1',
159+
'langs[1].language': "language1"
160160
}
161161
parser = NestedParser(data, {"separator": "mixed-dot"})
162162
self.assertTrue(parser.is_valid())
@@ -247,15 +247,15 @@ def test_mixed_invalid_object2(self):
247247
def test_mixed_invalid_object3(self):
248248
data = {
249249
'title': 'lalal',
250-
'article[0].op': 'lalal',
250+
'article.op..': 'lalal',
251251
}
252252
parser = NestedParser(data, {"separator": "mixed-dot"})
253253
self.assertFalse(parser.is_valid())
254254

255255
def test_mixed_invalid_object4(self):
256256
data = {
257257
'title': 'lalal',
258-
'article.op..': 'lalal',
258+
'article[0]op': 'lalal',
259259
}
260260
parser = NestedParser(data, {"separator": "mixed-dot"})
261261
self.assertFalse(parser.is_valid())

tests/test_mixed_separator.py

Lines changed: 20 additions & 20 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, "separator": "mixed", "separator": "mixed"})
13+
data, {"raise_duplicate": False, "assign_duplicate": True, "separator": "mixed"})
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, "separator": "mixed", "separator": "mixed"})
26+
data, {"raise_duplicate": False, "assign_duplicate": True, "separator": "mixed"})
2727
self.assertTrue(p.is_valid())
2828
expected = {
2929
"title": 42
@@ -32,8 +32,8 @@ def test_assign_duplicate_number_after_list(self):
3232

3333
def test_assign_nested_duplicate_number_after_list(self):
3434
data = {
35-
"title[0].sub[0]": 101,
36-
"title[0].sub": 42,
35+
"title[0]sub[0]": 101,
36+
"title[0]sub": 42,
3737
}
3838
p = NestedParser(
3939
data, {"raise_duplicate": False, "assign_duplicate": True, "separator": "mixed"})
@@ -49,8 +49,8 @@ def test_assign_nested_duplicate_number_after_list(self):
4949

5050
def test_assign_nested_duplicate_number_after_list2(self):
5151
data = {
52-
"title[0].sub": 42,
53-
"title[0].sub[0]": 101,
52+
"title[0]sub": 42,
53+
"title[0]sub[0]": 101,
5454
}
5555
p = NestedParser(
5656
data, {"raise_duplicate": False, "assign_duplicate": True, "separator": "mixed"})
@@ -66,8 +66,8 @@ def test_assign_nested_duplicate_number_after_list2(self):
6666

6767
def test_assign_nested_duplicate_number_after_dict(self):
6868
data = {
69-
"title[0].sub": 42,
70-
"title[0].sub.title": 101,
69+
"title[0]sub": 42,
70+
"title[0]sub.title": 101,
7171
}
7272
p = NestedParser(
7373
data, {"raise_duplicate": False, "assign_duplicate": True, "separator": "mixed"})
@@ -85,8 +85,8 @@ def test_assign_nested_duplicate_number_after_dict(self):
8585

8686
def test_assign_nested_duplicate_number_after_dict2(self):
8787
data = {
88-
"title[0].sub.title": 101,
89-
"title[0].sub": 42,
88+
"title[0]sub.title": 101,
89+
"title[0]sub": 42,
9090
}
9191
p = NestedParser(
9292
data, {"raise_duplicate": False, "assign_duplicate": True, "separator": "mixed"})
@@ -149,14 +149,14 @@ def test_real(self):
149149
data = {
150150
'title': 'title',
151151
'date': "time",
152-
'langs[0].id': "id",
153-
'langs[0].title': 'title',
154-
'langs[0].description': 'description',
155-
'langs[0].language': "language",
156-
'langs[1].id': "id1",
157-
'langs[1].title': 'title1',
158-
'langs[1].description': 'description1',
159-
'langs[1].language': "language1"
152+
'langs[0]id': "id",
153+
'langs[0]title': 'title',
154+
'langs[0]description': 'description',
155+
'langs[0]language': "language",
156+
'langs[1]id': "id1",
157+
'langs[1]title': 'title1',
158+
'langs[1]description': 'description1',
159+
'langs[1]language': "language1"
160160
}
161161
parser = NestedParser(data, {"separator": "mixed"})
162162
self.assertTrue(parser.is_valid())
@@ -247,15 +247,15 @@ def test_mixed_invalid_object2(self):
247247
def test_mixed_invalid_object3(self):
248248
data = {
249249
'title': 'lalal',
250-
'article.op..': 'lalal',
250+
'article[0].op': 'lalal',
251251
}
252252
parser = NestedParser(data, {"separator": "mixed"})
253253
self.assertFalse(parser.is_valid())
254254

255255
def test_mixed_invalid_object4(self):
256256
data = {
257257
'title': 'lalal',
258-
'article[0]op': 'lalal',
258+
'article.op..': 'lalal',
259259
}
260260
parser = NestedParser(data, {"separator": "mixed"})
261261
self.assertFalse(parser.is_valid())

0 commit comments

Comments
 (0)