Skip to content

Rizhiy/class-cache

Repository files navigation

Class based cache

tests codecov publish Python Version from PEP 621 TOML PyPI - Version Code Style: Ruff

Installation

Recommended installation with pip:

pip install class-cache

Usage

  • Basic usage:

    from class_cache import Cache
    
    # Create cache
    cache = Cache()
    # Set item in cache
    # NOTE: Keys and values have to be pickle-serialisable
    cache["foo"] = "bar"
    # Save cache to backend (disk by default)
    cache.write()
    
    # During another program run just create same cache again and you can retrieve data
    del cache
    cache2 = Cache()
    assert cache2["foo"] == "bar"
  • Use multiple caches:

    cache1 = Cache(1)
    cache2 = Cache(2)
    
    cache1["foo"] = "bar"
    cache2["foo"] = "zar"
    
    assert cache1["foo"] != cache2["foo"]
  • Use cache with default factory:

    from class_cache import CacheWithDefault
    
    class MyCache(CacheWithDefault[str, str]):
        NON_HASH_ATTRIBUTES = frozenset({*CacheWithDefault.NON_HASH_ATTRIBUTES, "_misc"})
        def __init__(self, name: str):
            # Attributes which affect default value generation should come before super().__init__()
            # They will be used to generate a unique id
            self._name = name
            super().__init__()
            # Other attributes should not affect how default value is generated, add them to NON_HASH_ATTRIBUTES
            self._misc = "foo"
    
        # Define logic for defaults in _get_data
        def _get_data(self, key: str) -> str:
            return f"{self._name}_{key}"
    
    cache = MyCache("first")
    assert cache["foo"] == "first_foo"
  • Compress data before storing:

    from class_cache.wrappers import BrotliCompressWrapper
    from class_cache import Cache
    
    cache = BrotliCompressWrapper(Cache())
    # Use cache as normal

    This wrapper uses brotli algorithm for compression, which optimises read-time at expense of write-time. This will generally lead to less space being used and potentially faster reads if your data is compressible, e.g. text.

Development

  • Install dev dependencies: pip install -e ".[dev]"

  • For linting and basic fixes ruff is used: ruff check . --fix

  • This repository follows strict formatting style which will be checked by the CI.

    • To format the code, use the black format: black .
    • To sort the imports, user isort utility: isort .
  • To test code, use pytest: pytest .

  • This repository follows semantic-release, which means all commit messages have to follow a style. You can use tools like commitizen to write your commits.

  • You can also use pre-commit to help verify that all changes are valid. Multiple hooks are used, so use the following commands to install:

    pre-commit install
    pre-commit install --hook-type commit-msg

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages