Skip to content

Commit d80847b

Browse files
authored
Merge pull request #235 from classy-python/remove-duplicate-descendants
Remove duplicate descendants
2 parents c0e18c3 + f20fe9d commit d80847b

2 files changed

Lines changed: 31 additions & 5 deletions

File tree

cbv/importer/storages.py

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
from collections import defaultdict
22
from collections.abc import Mapping, Sequence
33

4+
from attrs import frozen
5+
46
from cbv import models
57
from cbv.importer.dataclasses import Klass, KlassAttribute, Method, Module
68
from cbv.importer.importers import CodeImporter
@@ -81,12 +83,28 @@ def _wipe_clashing_data(self, *, project_version: str) -> None:
8183
).delete()
8284

8385

86+
@frozen
87+
class Attribute:
88+
klass_pk: int
89+
line_number: int
90+
name: str
91+
value: str
92+
93+
def to_model(self) -> models.KlassAttribute:
94+
return models.KlassAttribute(
95+
klass_id=self.klass_pk,
96+
line_number=self.line_number,
97+
name=self.name,
98+
value=self.value,
99+
)
100+
101+
84102
def create_attributes(
85103
attributes: Mapping[tuple[str, str], Sequence[tuple[str, int]]],
86104
klass_lookup: Mapping[str, models.Klass],
87105
) -> None:
88106
# Go over each name/value pair to create KlassAttributes
89-
attribute_models = []
107+
collected_attributes = set()
90108
for (name, value), klasses in attributes.items():
91109
# Find all the descendants of each Klass.
92110
descendants = set()
@@ -106,13 +124,19 @@ def create_attributes(
106124
# Now we can create the KlassAttributes
107125
for klass_path, line in remaining_klasses:
108126
klass = klass_lookup[klass_path]
109-
attribute_models.append(
110-
models.KlassAttribute(
111-
klass=klass, line_number=line, name=name, value=value
127+
128+
collected_attributes.add(
129+
Attribute(
130+
klass_pk=klass.pk,
131+
line_number=line,
132+
name=name,
133+
value=value,
112134
)
113135
)
114136

115-
models.KlassAttribute.objects.bulk_create(attribute_models)
137+
models.KlassAttribute.objects.bulk_create(
138+
[attribute.to_model() for attribute in collected_attributes]
139+
)
116140

117141

118142
def create_inheritance(

core/settings.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
"django_pygmy",
2424
"sans_db",
2525
# Django
26+
"django.contrib.auth",
27+
"django.contrib.contenttypes",
2628
"django.contrib.staticfiles",
2729
]
2830

0 commit comments

Comments
 (0)