Skip to content

Commit dad97d5

Browse files
committed
Fix models merging
1 parent 8ceb22c commit dad97d5

File tree

2 files changed

+68
-9
lines changed

2 files changed

+68
-9
lines changed

json_to_models/registry.py

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from collections import defaultdict
22
from itertools import chain, combinations
3-
from typing import Dict, Iterable, List, Set, Tuple
3+
from typing import Dict, FrozenSet, Iterable, List, Set, Tuple
44

55
from ordered_set import OrderedSet
66

@@ -153,15 +153,22 @@ def merge_models(self, generator, strict=False) -> List[Tuple[ModelMeta, Set[Mod
153153
flag = True
154154
while flag:
155155
flag = False
156-
new_groups: OrderedSet[Set[ModelMeta]] = OrderedSet()
157-
for gr1, gr2 in combinations(groups, 2):
158-
if gr1 & gr2:
159-
old_len = len(new_groups)
160-
new_groups.add(frozenset(gr1 | gr2))
161-
added = old_len < len(new_groups)
162-
flag = flag or added
156+
new_groups: OrderedSet[FrozenSet[ModelMeta]] = OrderedSet()
157+
for gr1 in groups:
158+
in_set = False
159+
for gr2 in groups:
160+
if gr1 is gr2:
161+
continue
162+
if gr1 & gr2:
163+
in_set = True
164+
old_len = len(new_groups)
165+
new_groups.add(frozenset(gr1 | gr2))
166+
added = old_len < len(new_groups)
167+
flag = flag or added
168+
if not in_set:
169+
new_groups.add(gr1)
163170
if flag:
164-
groups = new_groups
171+
groups: OrderedSet[FrozenSet[ModelMeta]] = new_groups
165172

166173
replaces = []
167174
replaces_ids = set()

test/test_registry/test_registry_merge_models.py

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,58 @@
214214
],
215215
id="merge_models_with_optional_field"
216216
),
217+
pytest.param(
218+
[
219+
{
220+
"a" + str(i): int for i in range(20)
221+
},
222+
{
223+
**{
224+
"a" + str(i): int for i in range(20)
225+
},
226+
**{
227+
"b" + str(i): int for i in range(20)
228+
}
229+
},
230+
{
231+
"b" + str(i): int for i in range(20)
232+
},
233+
{
234+
"c" + str(i): int for i in range(20)
235+
},
236+
{
237+
**{
238+
"b" + str(i): int for i in range(20)
239+
},
240+
**{
241+
"c" + str(i): int for i in range(20)
242+
}
243+
},
244+
{
245+
"field1": int
246+
},
247+
{
248+
"field1": int
249+
}
250+
],
251+
[
252+
{
253+
**{
254+
"a" + str(i): DOptional(int) for i in range(20)
255+
},
256+
**{
257+
"b" + str(i): DOptional(int) for i in range(20)
258+
},
259+
**{
260+
"c" + str(i): DOptional(int) for i in range(20)
261+
}
262+
},
263+
{
264+
"field1": int
265+
}
266+
],
267+
id="multistage_merge"
268+
),
217269
]
218270

219271

0 commit comments

Comments
 (0)