mirror of
https://github.com/evennia/evennia.git
synced 2026-03-16 21:06:30 +01:00
Revert "Refactor _get_class_components"
This reverts commit c4ec977b9c.
This commit is contained in:
parent
5f9064c738
commit
cca93b032f
2 changed files with 26 additions and 24 deletions
|
|
@ -8,7 +8,3 @@ class ComponentDoesNotExist(ValueError):
|
|||
|
||||
class ComponentIsNotRegistered(ValueError):
|
||||
pass
|
||||
|
||||
|
||||
class ComponentSlotRegisteredTwice(ValueError):
|
||||
pass
|
||||
|
|
|
|||
|
|
@ -42,6 +42,14 @@ class ComponentProperty:
|
|||
def __set__(self, instance, value):
|
||||
raise Exception("Cannot set a class property")
|
||||
|
||||
def __set_name__(self, owner, name):
|
||||
# Retrieve the class_components set on the direct class only
|
||||
class_components = owner.__dict__.get("_class_components", [])
|
||||
if not class_components:
|
||||
setattr(owner, "_class_components", class_components)
|
||||
|
||||
class_components.append((self.name, self.values))
|
||||
|
||||
|
||||
class ComponentHandler:
|
||||
"""
|
||||
|
|
@ -262,29 +270,27 @@ class ComponentHolderMixin:
|
|||
return getattr(self, "_signal_handler", None)
|
||||
|
||||
def _get_class_components(self):
|
||||
self_class = type(self)
|
||||
class_components = getattr(self_class, "_class_components", None)
|
||||
if class_components is not None:
|
||||
return class_components
|
||||
class_components = {}
|
||||
|
||||
class_components_by_slot = {}
|
||||
for att_name in dir(self_class):
|
||||
if att_name.startswith("__"):
|
||||
continue
|
||||
def base_type_iterator():
|
||||
base_stack = [type(self)]
|
||||
while base_stack:
|
||||
_base_type = base_stack.pop()
|
||||
yield _base_type
|
||||
base_stack.extend(_base_type.__bases__)
|
||||
|
||||
att_obj = getattr(self_class, att_name, None)
|
||||
if isinstance(att_obj, ComponentProperty):
|
||||
cmp_name = att_obj.name
|
||||
for base_type in base_type_iterator():
|
||||
base_class_components = getattr(base_type, "_class_components", ())
|
||||
for cmp_name, cmp_values in base_class_components:
|
||||
cmp_class = get_component_class(cmp_name)
|
||||
cmp_slot = cmp_class.get_component_slot()
|
||||
if cmp_slot in class_components_by_slot:
|
||||
raise exceptions.ComponentSlotRegisteredTwice(
|
||||
f"Component slot={cmp_slot} is registered twice on class={self_class}"
|
||||
)
|
||||
class_components[cmp_slot] = (cmp_name, cmp_values)
|
||||
|
||||
class_components_by_slot[cmp_slot] = (cmp_name, att_obj.values)
|
||||
# TODO Is this necessary?
|
||||
instance_components = getattr(self, "_class_components", ())
|
||||
for cmp_name, cmp_values in instance_components:
|
||||
cmp_class = get_component_class(cmp_name)
|
||||
cmp_slot = cmp_class.get_component_slot()
|
||||
class_components[cmp_slot] = (cmp_name, cmp_values)
|
||||
|
||||
class_components = tuple(class_components_by_slot.values())
|
||||
setattr(self_class, "_class_components", class_components)
|
||||
|
||||
return class_components
|
||||
return tuple(class_components.values())
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue