Metadata-Version: 2.5
Name: bda.cache
Version: 2.0.0
Summary: Simple caching infrastructure.
Project-URL: Homepage, https://github.com/bluedynamics/bda.cache
Author-email: Robert Niederreiter <rnix@squarewave.at>
License: GNU General Public License v2 or later (GPLv2+)
Keywords: caching,fscache,memcached,zca,zope
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Web Environment
Classifier: License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+)
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
Requires-Python: >=3.10
Requires-Dist: python-memcached
Requires-Dist: zope-component
Provides-Extra: libmc
Requires-Dist: libmc; extra == 'libmc'
Provides-Extra: pylibmc
Requires-Dist: pylibmc; extra == 'pylibmc'
Provides-Extra: test
Requires-Dist: pytest; extra == 'test'
Description-Content-Type: text/x-rst

.. image:: https://img.shields.io/pypi/v/bda.cache.svg
    :target: https://pypi.python.org/pypi/bda.cache
    :alt: Latest PyPI version

.. image:: https://img.shields.io/pypi/dm/bda.cache.svg
    :target: https://pypi.python.org/pypi/bda.cache
    :alt: Number of PyPI downloads

.. image:: https://github.com/bluedynamics/bda.cache/actions/workflows/test.yml/badge.svg
    :target: https://github.com/bluedynamics/bda.cache/actions/workflows/test.yml
    :alt: Test bda.cache


General Caching API
===================

This package is designed to be used by applications which require different
kinds of caching flavour. This is abstracted due to the interfaces
``ICacheProvider`` and  ``ICacheManager``. ICacheProvider takes care of the
concrete cache implementation, ICacheManager is the read/write interface.

The convention is to adapt a concrete ICacheProvider implementation

.. code-block:: python

    from bda.cache import ICacheManager
    from bda.cache import Memcached

    provider = Memcached(['127.0.0.1:11211'])
    manager = ICacheManager(provider)

We can ask the manager for data inside the cache

.. code-block:: python

    data = manager.get('somekey', force_reload=False)

If ``force_reload`` is set to True, try to delete data with key from cache and
return None.

We're also able to manipulate the cache's data (some restrictions my result out
of backend not providing them)

.. code-block:: python

    manager.set('somekey', object())

There exist a convenience to use some API's and cache it's results all at once.

.. code-block:: python

    data = manager.getData(func, key, force_reload=False, args=[], kwargs={})

First the data for ``key`` is looked up inside the cache provider. If not found
there or if ``force_reload`` is set to True, call given ``func`` . The return
value of this function will be stored in the cache provider. ``args`` and
``kwargs`` are passed as parameters to given function if it's call is required.

You might ask why all this is done due to 2 seperate interfaces...

Some usecase might require different cache providers i.e. for different payload
size. This way you can implement any other cache provider usage as well due to
the cache manager interface.


Dependencies
------------

- ``zope.interface``

- ``zope.component``

- ``bda.cache.memcached.Memcached`` requires ``python-memcached``


Notes
-----

If you're interessted to contribute; Feel free but keep in mind that this code
is planned to be released under a BSD like licence in future.


Changes
=======

2.0.0 (2026-10-31)
------------------

- Fix the client library selection in ``bda.cache.memcached`` if both
  ``libmc`` and ``pylibmc`` are installed. ``pylibmc.Client`` was initialized
  with the ``libmc`` arguments. ``libmc`` is preferred now, as intended.
  [rnix]

- Drop the Python 2 remnants: the ``six`` imports in ``bda.cache.fscache``
  and ``bda.cache.memcached`` (``six`` never was a declared dependency),
  ``class X(object)`` and the ``IOError`` alias. Remove the unreachable code
  in ``FSCache.__delitem__`` and the unused ``ICacheProvider`` import in
  ``bda.cache.memcached``. Behaviour unchanged.
  [rnix]

- Convert the doctests to unittest tests and use pytest as test runner. The
  memcached tests use a fake client and no longer need a running memcached
  server. Drop the ``interlude`` and ``zope.testing`` test dependencies.
  [rnix]

- Sort the imports with ruff (one per line, ``from`` imports first, no
  sections) and format the code with ``ruff format`` (90 characters per line,
  single quotes).
  [rnix]

- Add ``Makefile`` (mxmake) with ``qa.ruff``, ``qa.test`` and ``qa.coverage``
  domains, pin the ruff configuration in ``pyproject.toml`` and add a GitHub
  Actions test workflow.
  [rnix]

- Refactor package layout to use ``pyproject.toml`` and implicit namespace
  packages.
  [rnix]

- Drop Python 2 support. Python >= 3.10 is required.
  [rnix]


1.3.0 (2019-02-05)
------------------

- Python 3 comaptibility [reinhardt]

- Code style (black/isort) [jensens]

1.2.0 (2017-10-19)
------------------

- Change to use libmc or pylibmc when available

- Add option to require with bda.cache[pylibmc] or bda.cache[libmc]


1.1.2 (2009-02-10)
------------------

- remove legacy code


1.1.1 (2009-02-10)
------------------

- bugfix in zcml configuration.


1.1 (2009-02-09)
----------------

- Cache Managers are now adapters.

- Implement memcached server support

- deprecate the default CacheManager

- Fix tests for FSCache


1.0
---

- Initial work

