Skip to content

Commit 9fa9d54

Browse files
committed
Refactor methods
1 parent 541d1cb commit 9fa9d54

2 files changed

Lines changed: 28 additions & 25 deletions

File tree

sqlalchemy_serializer/serializer.py

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,8 @@ class Serializer:
116116
def __init__(self, **kwargs):
117117
self.set_serialization_depth(0)
118118
self.set_options(Options(**kwargs))
119+
self.init_callbacks()
120+
119121
self.schema = Schema()
120122

121123
def __call__(self, value, only=(), extend=()):
@@ -136,10 +138,9 @@ def set_serialization_depth(self, value: int):
136138

137139
def set_options(self, opts: Options):
138140
self.opts = opts
139-
self.apply_opts()
140141

141-
def apply_opts(self):
142-
"""Apply current Options to callbacks"""
142+
def init_callbacks(self):
143+
"""Initialize callbacks"""
143144
self.serialize_types = (
144145
*(self.opts.serialize_types or ()),
145146
(self.atomic_types, lambda x: x), # Should be checked before any other type
@@ -187,17 +188,17 @@ def is_forkable(self, value):
187188
value, (Iterable, dict, SerializerMixin)
188189
)
189190

190-
def fork(self, value, key: str):
191+
def fork(self, key: str) -> "Serializer":
191192
"""
192-
Process data in a separate serializer
193+
Return new serializer for a key
193194
:return: serialized value
194195
"""
195196
serializer = Serializer(**self.opts._asdict())
196197
serializer.set_serialization_depth(self.serialization_depth + 1)
197198
serializer.schema = self.schema.fork(key=key)
198199

199-
logger.debug("Fork serializer for type:%s key:%s", get_type(value), key)
200-
return serializer(value)
200+
logger.debug("Fork serializer for key:%s", key)
201+
return serializer
201202

202203
def serialize(self, value):
203204
if self.is_valid_callable(value):
@@ -225,10 +226,12 @@ def serialize_dict(self, value: dict) -> dict:
225226
for k, v in value.items():
226227
if self.schema.is_included(k): # TODO: Skip check if is NOT greedy
227228
logger.debug("Serialize key:%s type:%s of dict", k, get_type(v))
229+
230+
serializer = self
228231
if self.is_forkable(v):
229-
res[k] = self.fork(key=k, value=v)
230-
else:
231-
res[k] = self.serialize(v)
232+
serializer = self.fork(key=k)
233+
234+
res[k] = serializer.serialize(v)
232235
else:
233236
logger.debug("Skip key:%s of dict", k)
234237
return res
@@ -247,10 +250,12 @@ def serialize_model(self, value) -> dict:
247250
logger.debug(
248251
"Serialize key:%s type:%s model:%s", k, get_type(v), get_type(value)
249252
)
253+
254+
serializer = self
250255
if self.is_forkable(v):
251-
res[k] = self.fork(key=k, value=v)
252-
else:
253-
res[k] = self.serialize(v)
256+
serializer = self.fork(key=k)
257+
258+
res[k] = serializer.serialize(v)
254259

255260
else:
256261
logger.debug("Skip key:%s of model:%s", k, get_type(value))
Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,26 @@
1+
from sqlalchemy_serializer.serializer import Serializer
2+
3+
14
def test_fork_with_key(mocker, get_serializer):
2-
value, key, expected = "test_value", "test_key", "serialized"
5+
key = "test_value"
36
schema = mocker.MagicMock()
47
serializer = get_serializer()
58

6-
mocker.patch(
7-
"sqlalchemy_serializer.serializer.Serializer.__call__", return_value=expected
8-
)
9-
109
mocker.patch.object(serializer, "schema", schema)
11-
result = serializer.fork(value=value, key=key)
10+
result = serializer.fork(key=key)
1211

13-
assert result == expected
12+
assert isinstance(result, Serializer)
13+
assert result.opts == serializer.opts
1414
schema.fork.assert_called_once_with(key=key)
1515

1616

1717
def test_fork_logger(mocker, get_serializer):
18-
value, key = "test_value", "test_key"
18+
key = "test_key"
1919
mocked_logger = mocker.patch("sqlalchemy_serializer.serializer.logger")
2020
mocker.patch("sqlalchemy_serializer.serializer.Serializer.__call__")
2121
serializer = get_serializer()
2222

2323
mocker.patch.object(serializer, "schema", mocker.MagicMock())
24-
serializer.fork(value, key=key)
24+
serializer.fork(key=key)
2525

26-
mocked_logger.debug.assert_called_once_with(
27-
"Fork serializer for type:%s key:%s", "str", key
28-
)
26+
mocked_logger.debug.assert_called_once_with("Fork serializer for key:%s", key)

0 commit comments

Comments
 (0)