Base implementation for ClassRegistry

This commit is contained in:
Lucidiot 2019-09-15 13:10:00 +02:00
parent 37784170a6
commit b17611d45a
Signed by: lucidiot
GPG Key ID: 3358C1CA6906FB8D
2 changed files with 48 additions and 0 deletions

47
objtools/registry.py Normal file
View File

@ -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

1
requirements.txt Normal file
View File

@ -0,0 +1 @@
cached-property>=1.5.1