Source code for pysecret.singleton

# -*- coding: utf-8 -*-

import weakref


[docs]class CachedSpam(object): """ Cache instance with based on its' name. """ settings_uuid_field = None _cache = None def __init__(self, *args, **kwargs): msg = "Can't instantiate directly, use {}.new(...) instead." \ .format(self.__class__.__name__) raise RuntimeError(msg) def __real_init__(self, *args, **kwargs): msg = ("You have to implement ``def __real_init__(self, ...)`` " "like you implement ``def __init__(self, ...)``!") raise NotImplementedError(msg) @classmethod def _init_cache(cls): if cls._cache is None: cls._cache = weakref.WeakValueDictionary() @classmethod def new(cls, *args, **kwargs): cls._init_cache() if cls.settings_uuid_field is None: msg = "You have to specify `CachedSpam.settings_uuid_field`!" raise NotImplementedError(msg) if cls.settings_uuid_field not in kwargs: msg = "Can't find '{}' in {} Please use `CachedSpam.new({}=xxx)`".format( cls.settings_uuid_field, kwargs, cls.settings_uuid_field) raise SyntaxError(msg) uuid = kwargs[cls.settings_uuid_field] if uuid in cls._cache: return cls._cache[uuid] else: self = cls.__new__(cls) self.__real_init__(*args, **kwargs) cls._cache[uuid] = self return self