# -*- coding: utf-8 -*-
"""The definition manager."""
from typing import Iterator
from typing import Type
from l2tscaffolder.definitions import interface
[docs]class DefinitionManager:
"""The definition manager."""
_definition_classes = {}
[docs] @classmethod
def DeregisterDefinition(
cls, definition_class: Type[interface.ScaffolderDefinition]):
"""Deregisters a definition class.
Definition classes are identified by their NAME attribute.
Args:
definition_class (type): definition class (subclass of
ScaffolderDefinition).
Raises:
KeyError: if definition class is not set for the corresponding name.
"""
definition_name = definition_class.NAME
if definition_name not in cls._definition_classes:
raise KeyError('Definition class not set for name: {0:s}.'.format(
definition_name))
del cls._definition_classes[definition_name]
[docs] @classmethod
def GetDefinitionByName(
cls, name: str) -> Type[interface.ScaffolderDefinition]:
"""Returns a definition class based on registered name.
Args:
name (str): name of the definition.
Returns:
interface.ScaffolderDefinition: definition class or None
if name is not registered.
"""
return cls._definition_classes.get(name, None)
[docs] @classmethod
def GetDefinitionNames(cls) -> Iterator[str]:
"""Yields all names of registered definition classes.
Yields:
str: definition names.
"""
for definition_name in cls._definition_classes:
yield definition_name
[docs] @classmethod
def GetDefinitionObjects(cls) -> Iterator[interface.ScaffolderDefinition]:
"""Yields instances of each registered definition class.
Yields:
ScaffolderDefinition: definition object.
"""
for definition_class in cls._definition_classes.values():
yield definition_class()
[docs] @classmethod
def RegisterDefinition(
cls, definition_class: Type[interface.ScaffolderDefinition]):
"""Registers a definition class.
Definition classes are identified by their NAME attribute.
Args:
definition_class (ScaffolderDefinition): definition class.
Raises:
KeyError: if definition class is already set for the corresponding name.
"""
definition_name = definition_class.NAME
if definition_name in cls._definition_classes:
raise KeyError('Project class already set for name: {0:s}.'.format(
definition_name))
cls._definition_classes[definition_name] = definition_class