Metadata-Version: 2.1
Name: dcache
Version: 0.0.1
Summary: Distributed Cache for Humans
Home-page: https://github.com/HBN3tw0rk/dcache
Author: HBN3tw0rk
License: GNU Lesser General Public License v2.1
Keywords: dcache
Classifier: Development Status :: 2 - Pre-Alpha
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: GNU Lesser General Public License v2 (LGPLv2)
Classifier: Natural Language :: English
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Requires-Python: >=3.6
License-File: LICENSE

======
dcache
======


.. image:: https://img.shields.io/pypi/v/dcache.svg
        :target: https://pypi.python.org/pypi/dcache
        :alt: PyPI

.. image:: https://coveralls.io/repos/github/HBN3tw0rk/dcache/badge.svg?branch=master
        :target: https://coveralls.io/github/HBN3tw0rk/dcache?branch=master
        :alt: Coverage Status

.. image:: https://readthedocs.org/projects/dcache/badge/?version=latest
        :target: https://dcache.readthedocs.io/en/latest/?version=latest
        :alt: Documentation Status

Distributed Cache for Humans


* Documentation: https://dcache.readthedocs.io.


Installation
------------

.. code:: bash

    pip install dcache




How to Use
----------
- TODO


Contributing
------------
Contributions are welcome, feel free to open an Issue or Pull Request.

Pull requests must be for the `develop` branch.

.. code:: bash

    git clone https://github.com/HBN3tw0rk/dcache
    cd dcache
    git checkout develop
    python -m venv .venv
    pip install -r requirements_dev.txt
    pre-commit install
    pytest


Pitch (Portuguese)
------------------
* Part 1: https://www.loom.com/share/ee553d6915ca4dc5ba8609d48b59bd55
* Part 2: https://www.loom.com/share/50cb4ff9560943879d78864f5fa1b4e0


What is
-------
* distributed cache for humans
* simple API like `lru_cache`
* multiple backends
* easy to switch the backend
* good documentation


API
---

dcache
^^^^^^

.. code:: python

    from dcache import dcache

    @dcache
    def slow_function(n):
        return n ** 1000


dcache vs redis
^^^^^^^^^^^^^^^

.. code:: python

    import redis
    redis = redis.Redis(host='localhost', port=6379, db=0)

    def slow_function(n):
        cached = redis.get(n)
        if cached:
            return cached
        value = n ** 1000
        redis.set(n, value)
        return value

    def slow_function2(n):
        cached = redis.get(n)
        if cached:
            return cached
        value = n ** 1000
        redis.set(n, value)
        return value

.. code:: python

    from dcache import cache
    from dcache.backends import RedisBackend

    cache = dcache(RedisBackend(host='localhost', port=6379, db=0))

    @cache
    def slow_function(n):
        return n ** 1000

    @cache
    def slow_function2(n):
        return n ** 1000


real example
^^^^^^^^^^^^

.. code:: python

    def process(id, input):
        cache_path = get_content_cache_path(id, input)

        if resource.file_exist(cache_path):
            return resource.get_json(cache_path)

        response = slow_function(id, input)
          resource.put_json(body=response, file_path=cache_path)
        return response

.. code:: python

    from dcache import dcache
    from dcache.backends import S3Backend

    @dcache(S3Backend())
    def process(id, input):
        return slow_function(id, input)


Ideas
-----

* integration tests using containers

multiple backends
^^^^^^^^^^^^^^^^^

.. code:: python

    from dcache import dcache
    from dcache.backends import InMemoryBackend, RedisBackend

    @dcache(multiple=[
        InMemoryBackend(),
        RedisBackend(host='localhost', port=6379, db=0),
    ])
    def slow_function(n):
            return n ** 1000

1. search on the in-memory cache;
2. if exists, return, if not, search on Redis;
3. * if exists on Redis, save in memory and return;
4. * if not, exists on Redis, run the `slow_function`, save on Redis, save in-memory and return;

* doesn't run if already returned


MVP
---
* in memory


Roadmap
-------
* backends: Redis, Memcached, Filesystem, database, S3, etc.
* multiple backends
* plugins


=========
Changelog
=========

0.0.1 (2022-07-30)
------------------
* First release on PyPI.
