Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 12 additions & 12 deletions langex/classes/singleton.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
class Singleton:
def __init__(self, cls):
self.cls = cls
self.instance = None
from langex.classes.class_meta import ClassMeta

def __call__(self, *args, **kwargs):
if self.instance is None:
self.instance = self.cls(*args, **kwargs)
def Singleton(cls):
instance = ClassMeta(cls).use_primitive()()

return self.instance
class Wrapper():
def __call__(self):
return instance

def __getattr__(self, name):
if self.instance is None:
self.instance = self.cls()
def __getattr__(self, name):
return getattr(instance, name)

return getattr(self.instance, name)
def __setattr__(self, name, value):
return setattr(instance, name, value)

return Wrapper()

10 changes: 10 additions & 0 deletions langex/functions/function_meta.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,12 +32,22 @@ def __init__(self, func):
self.bounded = self.check_class_bound()
self.signature = Signature(self.qual)
self.is_abstract = False
self._inject_mimic(func)
self._inject()

def _inject(self):
setattr(self, LANGEX.MARKER, True)
setattr(self, LANGEX.FUNC_META, self)

def _inject_mimic(self, func):
self.__code__ = self.func.__code__
self.__defaults__ = self.func.__defaults__
self.__kwdefaults__ = self.func.__kwdefaults__
self.__annotations__ = self.func.__annotations__
self.__doc__ = self.func.__doc__
self.__qualname__ = self.func.__qualname__
self.__name__ = self.func.__name__

def check_class_bound(self):
parts = self.qual.split(".")

Expand Down
16 changes: 12 additions & 4 deletions tests/classes/test_singleton.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
from langex.core.classes import singleton
from langex.core.errors import ValidationError
from langex.core.functions import autosig
from langex.core.testing import discover_test, expects

@singleton
Expand All @@ -11,12 +13,18 @@ def next_id(self):

return self.value

@autosig
def next_id_with_prefix(self, prefix: str) -> str:
return f"{prefix}_{self.next_id()}"

@discover_test
def test_singleton():
id_gen1 = IdGenerator()
id_gen2 = IdGenerator()
(id_gen1.next_id ) @expects (1)
(id_gen1.next_id ) @expects (2)
(id_gen2.next_id ) @expects (3)
(lambda: id_gen1 is id_gen2) @expects (True)
(id_gen1.next_id ) @expects (1)
(id_gen1.next_id ) @expects (2)
(id_gen2.next_id ) @expects (3)
(lambda: id_gen1 is id_gen2 ) @expects (True)
(lambda: id_gen1.next_id_with_prefix(0) ) @expects (ValidationError)
(lambda: id_gen1.next_id_with_prefix("ID")) @expects ("ID_4")

Loading