Base implementation for ClassRegistry
This commit is contained in:
parent
37784170a6
commit
b17611d45a
|
@ -0,0 +1,47 @@
|
|||
from typing import MutableMapping, Any, Callable
|
||||
from cached_property import cached_property
|
||||
|
||||
|
||||
class ClassRegistry(MutableMapping[str, Callable]):
|
||||
|
||||
def check_key(self, key: str) -> None:
|
||||
pass
|
||||
|
||||
def check_value(self, value: Callable) -> None:
|
||||
pass
|
||||
|
||||
def check(self, key: str, value: Callable) -> None:
|
||||
try:
|
||||
self.check_key(key)
|
||||
except KeyError:
|
||||
raise
|
||||
except Exception as e:
|
||||
raise KeyError(str(e))
|
||||
|
||||
try:
|
||||
self.check_value(value)
|
||||
except ValueError:
|
||||
raise
|
||||
except Exception as e:
|
||||
raise ValueError(str(e))
|
||||
|
||||
def register(self, key: str, value: Callable) -> None:
|
||||
self[key] = value
|
||||
|
||||
def unregister(self, key: str) -> None:
|
||||
del self[key]
|
||||
|
||||
def __setitem__(self, key: str, value: Callable) -> None:
|
||||
self.check(key, value)
|
||||
super().__setitem__(key, value)
|
||||
|
||||
@cached_property
|
||||
def metaclass(self) -> type:
|
||||
class RegistryMetaclass(type):
|
||||
|
||||
def __new__(cls, name: str, *args: Any, **kwargs: Any) -> type:
|
||||
newclass = super().__new__(cls, name, *args, **kwargs)
|
||||
self.register(name, newclass)
|
||||
return newclass
|
||||
|
||||
return RegistryMetaclass
|
|
@ -0,0 +1 @@
|
|||
cached-property>=1.5.1
|
Loading…
Reference in New Issue