Skip to content

Commit 3a1689d

Browse files
committed
feat: replace NestedElement to tempElement
1 parent c287a30 commit 3a1689d

File tree

3 files changed

+85
-81
lines changed

3 files changed

+85
-81
lines changed

nested_multipart_parser/declare.py

Lines changed: 0 additions & 73 deletions
This file was deleted.

nested_multipart_parser/parser.py

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1-
from nested_multipart_parser.declare import NestedDeclare
21
from nested_multipart_parser.options import (
3-
NestedParserOptionsMixedDot,
4-
NestedParserOptionsMixed,
52
NestedParserOptionsBracket,
63
NestedParserOptionsDot,
4+
NestedParserOptionsMixed,
5+
NestedParserOptionsMixedDot,
76
)
8-
7+
from nested_multipart_parser.temp_element import TempDict, TempList
98

109
DEFAULT_OPTIONS = {
1110
"separator": "mixed-dot",
@@ -29,7 +28,12 @@ def __init__(self, data, options={}):
2928
self.data = data
3029
self._options = {**DEFAULT_OPTIONS, **options}
3130

32-
assert self._options["separator"] in ["dot", "bracket", "mixed", "mixed-dot"]
31+
assert self._options["separator"] in [
32+
"dot",
33+
"bracket",
34+
"mixed",
35+
"mixed-dot",
36+
]
3337
assert isinstance(self._options["raise_duplicate"], bool)
3438
assert isinstance(self._options["assign_duplicate"], bool)
3539

@@ -47,16 +51,16 @@ def convert_value(self, value):
4751
return value
4852

4953
def construct(self, data):
50-
dictionary = NestedDeclare(dict, self._options)
54+
dictionary = TempDict(self._options)
5155

5256
for keys, value in self._split_keys(data):
5357
tmp = dictionary
5458

5559
for actual_key, next_key in zip(keys, keys[1:]):
5660
if isinstance(next_key, int):
57-
tmp[actual_key] = NestedDeclare(list, self._options)
61+
tmp[actual_key] = TempList(self._options)
5862
else:
59-
tmp[actual_key] = NestedDeclare(dict, self._options)
63+
tmp[actual_key] = TempDict(self._options)
6064
tmp = tmp[actual_key]
6165

6266
tmp[keys[-1]] = self.convert_value(value)
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
import abc
2+
from typing import Any
3+
4+
5+
class TempElement(abc.ABC):
6+
@abc.abstractclassmethod
7+
def __setitem__(self, key, val):
8+
"""method to set element"""
9+
10+
def check(self, key, value):
11+
if key in self._elements:
12+
# same instance like templist to templist, we ignore it
13+
if isinstance(self._elements[key], type(value)):
14+
return
15+
16+
if self._options.get("raise_duplicate"):
17+
raise ValueError("key is already set")
18+
19+
if not self._options.get("assign_duplicate"):
20+
return
21+
22+
self._elements[key] = value
23+
24+
def __getitem__(self, key):
25+
if key not in self._elements:
26+
self[key] = type(self)(options=self._options)
27+
return self._elements[key]
28+
29+
def conv_value(self, value: Any) -> Any:
30+
if isinstance(value, TempElement):
31+
value = value.convert()
32+
return value
33+
34+
@abc.abstractmethod
35+
def convert(self):
36+
"""method to convert tempoary element to real python element"""
37+
38+
39+
class TempList(TempElement):
40+
def __init__(self, options=None):
41+
self._options = options or {}
42+
self._elements = {}
43+
44+
def __setitem__(self, key: int, value: Any):
45+
assert isinstance(key, int), (
46+
f"Invalid key for list, need to be int, type={type(key)}"
47+
)
48+
self.check(key, value)
49+
50+
def convert(self) -> list:
51+
keys = sorted(self._elements.keys())
52+
# check if index start to 0 and end to number of elements
53+
if any((keys[0] != 0, keys[-1] != (len(self._elements) - 1))):
54+
raise ValueError("invalid format list keys")
55+
56+
return [self.conv_value(self._elements[key]) for key in keys]
57+
58+
59+
class TempDict(TempElement):
60+
def __init__(self, options=None):
61+
self._options = options or {}
62+
self._elements = {}
63+
64+
def __setitem__(self, key: str, value: Any):
65+
assert isinstance(key, str), (
66+
f"Invalid key for dict, need to be str, type={type(key)}"
67+
)
68+
self.check(key, value)
69+
70+
def convert(self) -> dict:
71+
return {
72+
key: self.conv_value(value) for key, value in self._elements.items()
73+
}

0 commit comments

Comments
 (0)