33 lines
908 B
Python
33 lines
908 B
Python
"""JARVIS quality of life utilities."""
|
|
|
|
|
|
class Singleton(object):
|
|
REQUIRED = []
|
|
OPTIONAL = {}
|
|
|
|
def __new__(cls, *args: list, **kwargs: dict):
|
|
"""Create a new singleton."""
|
|
inst = cls.__dict__.get("inst")
|
|
if inst is not None:
|
|
return inst
|
|
|
|
inst = object.__new__(cls)
|
|
inst.init(*args, **kwargs)
|
|
inst._validate()
|
|
cls.__inst__ = inst
|
|
|
|
return inst
|
|
|
|
def _validate(self) -> None:
|
|
for key in self.REQUIRED:
|
|
if not getattr(self, key, None):
|
|
raise ValueError(f"Missing required key: {key}")
|
|
|
|
def init(self, **kwargs: dict) -> None:
|
|
"""Initialize the object."""
|
|
for key, value in kwargs.items():
|
|
setattr(self, key, value)
|
|
|
|
for key, value in self.OPTIONAL.items():
|
|
if not getattr(self, key, None):
|
|
setattr(self, key, value)
|