prevent duplicates in Registry

This commit is contained in:
Mira Weller
2025-01-13 14:22:24 +01:00
parent 0c41dcb2ed
commit 4f7dfdf98a
+7 -3
View File
@@ -258,7 +258,7 @@ class Registry:
When a new entry is registered, all accessor functions are called with the new entry as parameter. When a new entry is registered, all accessor functions are called with the new entry as parameter.
Their return value is stored as the metadata value for that key. Their return value is stored as the metadata value for that key.
""" """
self.registered_entries = list() self.registered_entries = dict()
self.keys = keys self.keys = keys
self.by_key = {key: {} for key in self.keys.keys()} self.by_key = {key: {} for key in self.keys.keys()}
@@ -276,11 +276,15 @@ class Registry:
# ... # ...
""" """
for obj in objs: for obj in objs:
if obj in self.registered_entries:
raise RuntimeError('Object already registered: {}'.format(obj))
meta = {k: accessor(obj) for k, accessor in self.keys.items()} meta = {k: accessor(obj) for k, accessor in self.keys.items()}
tup = (obj, meta) tup = (obj, meta)
for key, value in meta.items(): for key, value in meta.items():
self.by_key[key][value] = tup self.by_key[key][value] = tup
self.registered_entries.append(tup) self.registered_entries[obj] = meta
if len(objs) == 1: if len(objs) == 1:
return objs[0] return objs[0]
@@ -310,7 +314,7 @@ class Registry:
def filter(self, **kwargs): def filter(self, **kwargs):
return ( return (
(entry, meta) (entry, meta)
for entry, meta in self.registered_entries for entry, meta in self.registered_entries.items()
if all(value == meta[key] for key, value in kwargs.items()) if all(value == meta[key] for key, value in kwargs.items())
) )