Source code for betty.cache.no_op

"""
Provide no-op caching.
"""

from __future__ import annotations

from contextlib import asynccontextmanager
from typing import (
    Self,
    Any,
    AsyncContextManager,
    TypeAlias,
    overload,
    Literal,
    TYPE_CHECKING,
    final,
)

from typing_extensions import override

from betty.cache import CacheItem, Cache, CacheItemValueSetter
from betty.typing import threadsafe

if TYPE_CHECKING:
    from types import TracebackType
    from collections.abc import AsyncIterator


_GetSet: TypeAlias = tuple[
    CacheItem[Any] | None,
    CacheItemValueSetter[Any] | None,
]


class _NoOpGetSet:
    def __init__(self, has_setter: bool):
        self._has_setter = has_setter

    async def __aenter__(self) -> _GetSet:
        return None, self._set if self._has_setter else None

    async def _set(self, value: Any) -> None:
        return

    async def __aexit__(
        self,
        exc_type: type[BaseException] | None,
        exc_val: BaseException | None,
        exc_tb: TracebackType | None,
    ) -> None:
        return


[docs] @final @threadsafe class NoOpCache(Cache[Any]): """ Provide a cache that does nothing. """
[docs] @override def with_scope(self, scope: str) -> Self: return self
[docs] @override @asynccontextmanager async def get(self, cache_item_id: str) -> AsyncIterator[CacheItem[Any] | None]: yield None
[docs] @override async def set( self, cache_item_id: str, value: Any, *, modified: int | float | None = None, ) -> None: return
@overload def getset( self, cache_item_id: str ) -> AsyncContextManager[ tuple[ CacheItem[Any] | None, CacheItemValueSetter[Any], ] ]: pass @overload def getset( self, cache_item_id: str, *, wait: Literal[False] = False ) -> AsyncContextManager[ tuple[ CacheItem[Any] | None, CacheItemValueSetter[Any] | None, ] ]: pass
[docs] @override def getset( self, cache_item_id: str, *, wait: bool = True ) -> AsyncContextManager[_GetSet]: return _NoOpGetSet(wait)
[docs] @override async def delete(self, cache_item_id: str) -> None: return
[docs] @override async def clear(self) -> None: return