Skip to content

Commit 92c2942

Browse files
committed
Switch obx_models_by_name from set to list #59
Deterministic order of entity types is important; e.g. it fixes a test condition relying on entity type IDs.
1 parent 1d419ab commit 92c2942

File tree

2 files changed

+17
-17
lines changed

2 files changed

+17
-17
lines changed

objectbox/model/entity.py

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -273,8 +273,9 @@ def _unmarshal(self, data: bytes):
273273
setattr(obj, prop.name, val)
274274
return obj
275275

276-
# Dictionary of entity types (metadata) collected by the Entity decorator
277-
obx_models_by_name: Dict[str, Set[_Entity]] = {}
276+
# Dictionary of entity types (metadata) collected by the Entity decorator.
277+
# Note: using a list not a set to keep the order of entities as they were defined (set would not be deterministic).
278+
obx_models_by_name: Dict[str, List[_Entity]] = {}
278279

279280

280281
def Entity(uid: int = 0, model: str = "default") -> Callable[[Type], _Entity]:
@@ -288,21 +289,21 @@ def wrapper(class_):
288289
obj = class_member[1]()
289290
setattr(class_, class_member[0], obj)
290291

291-
metadata_set = obx_models_by_name.get(model)
292-
if metadata_set is None:
293-
metadata_set = set()
294-
obx_models_by_name[model] = metadata_set
292+
types = obx_models_by_name.get(model)
293+
if types is None:
294+
types = []
295+
obx_models_by_name[model] = types
295296

296-
metadata = _Entity(class_, uid)
297-
for existing in metadata_set:
298-
if existing.name == metadata.name:
297+
entity_type = _Entity(class_, uid)
298+
for existing in types:
299+
if existing.name == entity_type.name:
299300
# OK for tests, where multiple models are created with the same entity name
300-
logging.warning(f"Model \"{model}\" already contains an entity \"{metadata.name}\"; replacing it.")
301-
metadata_set.remove(existing)
301+
logging.warning(f"Model \"{model}\" already contains an entity type \"{entity_type.name}\"; replacing it.")
302+
types.remove(existing)
302303
break
303304

304-
obx_models_by_name[model].add(metadata)
305-
logging.info(f"Entity {metadata.name} added to model {model}")
306-
return metadata
305+
obx_models_by_name[model].append(entity_type)
306+
logging.info(f"Entity type {entity_type.name} added to model {model}")
307+
return entity_type
307308

308309
return wrapper

tests/test_idsync.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -575,9 +575,8 @@ class EntityB2:
575575
# with pytest.raises(ValueError):
576576
# store_a.box(EntityB)
577577

578-
# TODO XXX this should never fail, but is flaky
579-
#with pytest.raises(CoreException):
580-
# store_a.box(EntityB2)
578+
with pytest.raises(CoreException):
579+
store_a.box(EntityB2)
581580

582581
box_b = store_b.box(EntityB)
583582
id = box_b.put(EntityB(int_b=42))

0 commit comments

Comments
 (0)