Source code for evennia.contrib.base_systems.components.dbfield

"""
Components - ChrisLR 2022

This file contains the Descriptors used to set Fields in Components
"""

import typing

from evennia.typeclasses.attributes import AttributeProperty, NAttributeProperty

if typing.TYPE_CHECKING:
    from .components import Component


[docs]class DBField(AttributeProperty): """ Component Attribute Descriptor. Allows you to set attributes related to a component on the class. It uses AttributeProperty under the hood but prefixes the key with the component name. """
[docs] def __init__(self, default=None, autocreate=False, **kwargs): super().__init__(default=default, autocreate=autocreate, **kwargs)
def __set_name__(self, owner: "Component", name): """ Called when descriptor is first assigned to the class. Args: owner (Component): The component classF on which this is set name (str): The name that was used to set the DBField. """ self._key = f"{owner.get_component_slot()}::{name}" owner.add_field(name, self)
[docs] def at_added(self, component): """ Called when the parent component is added to a host. Args: component (Component): The component instance being added. """ if self._autocreate: self.__get__(component, type(component))
[docs] def at_removed(self, component): """ Called when the parent component is removed from a host. Args: component (Component): The component instance being removed. """ self.__delete__(component)
[docs]class NDBField(NAttributeProperty): """ Component In-Memory Attribute Descriptor. Allows you to set in-memory attributes related to a component on the class. It uses NAttributeProperty under the hood but prefixes the key with the component name. """ def __set_name__(self, owner: "Component", name): """ Called when descriptor is first assigned to the class. Args: owner (Component): The component class on which this is set name (str): The name that was used to set the DBField. """ self._key = f"{owner.get_component_slot()}::{name}" owner.add_field(name, self)
[docs] def at_added(self, component): """ Called when the parent component is added to a host. Args: component (Component): The component instance being added. """ if self._autocreate: self.__set__(component, self._default)
[docs] def at_removed(self, component): """ Called when the parent component is removed from a host. Args: component (Component): The component instance being removed. """ self.__delete__(component)
[docs]class TagField: """ Component Tags Descriptor. Allows you to set Tags related to a component on the class. The tags are set with a prefixed category, so it can support multiple tags or enforce a single one. Default value of a tag is added when the component is registered. Tags are removed if the component itself is removed. """
[docs] def __init__(self, default=None, enforce_single=False): self._category_key = None self._default = default self._enforce_single = enforce_single
def __set_name__(self, owner: "Component", name): """ Called when TagField is first assigned to the class. It is called with the component class and the name of the field. """ self._category_key = f"{owner.get_component_slot()}::{name}" owner.add_field(name, self) def __get__(self, instance, owner): """ Called when retrieving the value of the TagField. It is called with the component instance and the class. """ tag_value = instance.host.tags.get( default=self._default, category=self._category_key, ) return tag_value def __set__(self, instance, value): """ Called when setting a value on the TagField. It is called with the component instance and the value. """ tag_handler = instance.host.tags if self._enforce_single: tag_handler.clear(category=self._category_key) tag_handler.add( key=value, category=self._category_key, ) def __delete__(self, instance): """ Used when 'del' is called on the TagField. It is called with the component instance. """ instance.host.tags.clear(category=self._category_key)
[docs] def at_added(self, component): """ Called when the parent component is added to a host. Args: component (Component): The component instance being added. """ if self._default: self.__set__(component, self._default)
[docs] def at_removed(self, component): """ Called when the parent component is removed from a host. Args: component (Component): The component instance being removed. """ self.__delete__(component)