Source code for swagger_spec_compatibility.cache

# -*- coding: utf-8 -*-
from __future__ import absolute_import
from __future__ import print_function
from __future__ import unicode_literals

import typing

try:
    from functools import lru_cache as _lru_cache  # type: ignore # py>=3.2
except ImportError:  # pragma: no cover
    from functools32 import lru_cache as _lru_cache  # py<3.2


T = typing.TypeVar('T')


[docs]class typed_lru_cache(object): __slots__ = ('maxsize', 'uncached_function', 'cached_function') def __init__(self, maxsize=None): # type: (typing.Optional[int]) -> None assert isinstance(maxsize, (int, type(None))) self.maxsize = maxsize # type: typing.Optional[int] self.uncached_function = None # type: typing.Optional[typing.Any] self.cached_function = None # type: typing.Optional[typing.Any] def __call__(self, fn): # type: (T) -> T # assert (self.cached_function is not None) == (self.uncached_function is not None) if self.cached_function is None: self.uncached_function = fn # type: T self.cached_function = _lru_cache(maxsize=self.maxsize)(fn) else: assert self.uncached_function == fn # pragma: no cover # defensive approach, this should not happen return typing.cast(T, self.cached_function)