Skip to content

Commit dd9f8de

Browse files
committed
refactor: BaseModel._deserialize
1 parent 5510df1 commit dd9f8de

File tree

1 file changed

+30
-42
lines changed

1 file changed

+30
-42
lines changed

src/libtimed/models.py

Lines changed: 30 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -43,59 +43,47 @@ def __init__(self, client) -> None:
4343
relationships: list[tuple]
4444
filters: list[tuple]
4545

46-
def _deserialize(self, item, included): # noqa: C901
46+
def _get_included_item(self, item_type: str, item_id, included: dict):
47+
included_item = next(
48+
(
49+
included_item
50+
for included_item in included
51+
if included_item.get("type") == item_type and included_item.get("id") == item_id
52+
),
53+
None,
54+
)
55+
if not included_item:
56+
return None
57+
included_model = self.client._type_map[item_type](self.client)
58+
return included_model._deserialize(included_item, included)
59+
60+
def _deserialize(self, item, included):
4761
for key, value in item["attributes"].items():
4862
transform = next(
4963
(transform for name, _, transform in self.__class__.attributes if name == key),
5064
None,
5165
)
5266
item["attributes"][key] = (transform).deserialize(value) if transform else value
53-
relationships = item.get("relationships")
54-
if not relationships:
67+
68+
if not (relationships := item.get("relationships")):
5569
return item
5670
for key, value in relationships.items():
57-
if not value:
71+
if not value or not (data := value.get("data")):
5872
continue
59-
if value.get("data"):
60-
data = value["data"]
61-
if isinstance(data, list):
62-
included_items = []
63-
for rel_data in data:
64-
item_type = rel_data["type"]
65-
item_id = rel_data["id"]
66-
included_item = next(
67-
(
68-
included_item
69-
for included_item in included
70-
if included_item.get("type") == item_type
71-
and included_item.get("id") == item_id
72-
),
73-
None,
73+
if isinstance(data, list):
74+
if included_items := [
75+
included_item
76+
for relationship_data in data
77+
if (
78+
included_item := self._get_included_item(
79+
relationship_data["type"], relationship_data["id"], included
7480
)
75-
if included_item:
76-
included_model = self.client._type_map[item_type](self.client)
77-
included_items.append(
78-
included_model._deserialize(included_item, included)
79-
)
80-
item["relationships"][key] = included_items
81-
else:
82-
item_type = data["type"]
83-
item_id = data["id"]
84-
included_item = next(
85-
(
86-
included_item
87-
for included_item in included
88-
if included_item.get("type") == item_type
89-
and included_item.get("id") == item_id
90-
),
91-
None,
9281
)
93-
if included_item:
94-
included_model = self.client._type_map[item_type](self.client)
95-
item["relationships"][key] = included_model._deserialize(
96-
included_item, included
97-
)
98-
82+
]:
83+
item["relationships"][key] = included_items
84+
continue
85+
if included_item := self._get_included_item(data["type"], data["id"], included):
86+
item["relationships"][key] = included_item
9987
return item
10088

10189
def get(

0 commit comments

Comments
 (0)