Skip to main content

Dependency injection.

Project description

https://img.shields.io/pypi/v/antidote.svg https://img.shields.io/pypi/l/antidote.svg https://img.shields.io/pypi/pyversions/antidote.svg https://travis-ci.org/Finistere/antidote.svg?branch=master https://codecov.io/gh/Finistere/antidote/branch/master/graph/badge.svg https://readthedocs.org/projects/antidote/badge/?version=latest

Antidotes is a dependency injection micro-framework for Python 3.6+. It is designed on two core ideas:

  • Keep dependency declaration close to the actual code as it’s deeply related. Dependency injection is about removing the responsibility of building dependencies from their clients. Not separating how a dependency is built from its implementation.

  • It should help creating maintainable code in a straightforward way and offer effortless integration. One must be able to integrate it partially.

It provides the following features:

  • Ease of use
    • injection anywhere you need through a decorator @inject, be it static methods, functions, etc.. By default it will only rely on type hints, but it supports a lot more !

    • no **kwargs arguments hiding actual arguments and fully mypy typed, helping you and your IDE.

    • documented, see https://antidote.readthedocs.io/en/stable. If you don’t find what you need, open an issue ;)

    • thread-safe, cycle detection

  • Flexibility
    • A rich ecosystem of dependencies out of the box: services, configuration, factories, interface/implementation, tags.

    • All of those are implemented on top of the core implementation. If Antidote doesn’t provide what you need, there’s a good chance you can implement it yourself quickly.

  • Maintainability
    • The different kind of dependencies are designed to be easy to track back. Finding where a dependency is defined is easy.

    • Overriding dependencies (duplicates) and injecting twice will raise an exception.

    • Dependencies can be frozen, which blocks any new definitions.

  • Testability
    • @inject lets you override any injections by passing explicitly the arguments.

    • Change dependencies locally within a context manager.

  • Performance
    • Antidote has two implementations: the pure Python one which is the reference and the Cython one which is heavily tuned for fast injection. Injection is roughly 10x times faster than with the pure Python. It allows using injections without impact on most functions. See injection benchmark

Installation

To install Antidote, simply run this command:

pip install antidote

Quick Start

How does injection looks like ? Here is a simple example:

from antidote import inject, Service, Constants, const, world

class Conf(Constants):
    DB_HOST = const[str]('host')
    DB_HOST_UNTYPED = const('host')

    def __init__(self):
        self._data = {'host': 'localhost:6789'}

    # Used to retrieve lazily the const, so injecting Conf.DB_HOST is equivalent
    # Conf().get('host')
    def get(self, key: str):
        return self._data[key]

class Database(Service):  # Defined as a Service, so injectable.
    @inject(dependencies=dict(host=Conf.DB_HOST))
    def __init__(self, host: str):
        self._host = host  # <=> Conf().get('host')

@inject # By default only type annotations are used.
def f(db: Database = None):
    # Defaulting to None allows for MyPy compatibility but isn't required to work.
    assert db is not None
    pass

f()  # Service will be automatically injected if not provided
f(Database('localhost:6789'))  # but you can still use the function normally

# You can also retrieve dependencies by hand
world.get(Conf.DB_HOST)
world.get[str](Conf.DB_HOST) # with type hint
# if the dependency is the type itself, you may omit it:
world.get[Database]()

# If you need to handle multiple different host for some reason you can
# specify them in the dependency itself. As Database returns, by default,
# a singleton this will also be the case here. Using the same host, will
# return the same instance.
world.get[Database](Database.with_kwargs(host='XX'))

Want more ? Here is an over-engineered example to showcase a lot more features:

"""
Simple example where a MovieDB interface is defined which can be used
to retrieve the best movies. In our case the implementation uses IMDB
to dot it.
"""
from antidote import Constants, factory, Implementation, inject, world, const

class MovieDB:
    """ Interface """

    def get_best_movies(self):
        pass

class ImdbAPI:
    """ Class from an external library. """

    def __init__(self, *args, **kwargs):
        pass

world.singletons.add('conf_path', '/etc/app.conf')

class Conf(Constants):
    IMDB_HOST = const[str]('imdb.host')
    # Constants will by default automatically enforce the cast to int,
    # float and str. Can be removed or extended to support Enums.
    IMDB_PORT = const[int]('imdb.port')
    IMDB_API_KEY = const[str]('imdb.api_key')

    @inject(use_names=True)  # injecting world.get('conf_path')
    def __init__(self, conf_path: str):
        """ Load configuration from `conf_path` """
        self._raw_conf = {
            'imdb': {
                'host': 'dummy_host',
                'api_key': 'dummy_api_key',
                'port': '80'
            }
        }

    def get(self, key: str):
        from functools import reduce
        # self.get('a.b') <=> self._raw_conf['a']['b']
        return reduce(dict.get, key.split('.'), self._raw_conf)  # type: ignore

# Provides ImdbAPI, as defined by the return type annotation.
@factory(dependencies=(Conf.IMDB_HOST, Conf.IMDB_PORT, Conf.IMDB_API_KEY))
def imdb_factory(host: str, port: int, api_key: str) -> ImdbAPI:
    # Here host = Conf().get('imdb.host')
    return ImdbAPI(host=host, port=port, api_key=api_key)

# When requesting MovieDB, a IMDBMovieDB instance will be provided.
class IMDBMovieDB(MovieDB, Implementation):
    # New instance each time
    __antidote__ = Implementation.Conf(singleton=False)

    @inject(dependencies={'imdb_api': ImdbAPI @ imdb_factory})
    def __init__(self, imdb_api: ImdbAPI):
        self._imdb_api = imdb_api

    def get_best_movies(self):
        pass

@inject
def f(movie_db: MovieDB = None):
    assert movie_db is not None  # for Mypy
    pass

f()

That looks all good, but what about testability ?

# You can still explicitly pass the arguments to override
# injection.
conf = Conf('/path')
f(IMDBMovieDB(imdb_factory(
    # The class attributes will retrieve the actual value when called on a instance.
    # Hence this is equivalent to conf.get('imdb.host'), making your tests easier.
    host=conf.IMDB_HOST,
    port=conf.IMDB_PORT,
    api_key=conf.IMDB_API_KEY,  # <=> conf.get('imdb.api_key')
)))

# When testing you can also override locally some dependencies:
with world.test.clone(overridable=True, keep_singletons=True):
    world.test.override.singleton({
        Conf.IMDB_HOST: 'other host'
    })
    f()

If you ever need to debug your dependency injections, Antidote also provides a tool to have a quick summary of what is actually going on. This would be especially helpful if you encounter cyclic dependencies for example.

world.debug(f)
# will output:
"""
f
└── Static link: MovieDB -> IMDBMovieDB
    └── IMDBMovieDB
        └── ImdbAPI @ imdb_factory
            └── imdb_factory
                ├── Const: Conf.IMDB_API_KEY
                │   └── Lazy: Conf()  #0BjHAQ
                │       └── Singleton 'conf_path' -> '/...'
                ├── Const: Conf.IMDB_HOST
                │   └── Lazy: Conf()  #0BjHAQ
                │       └── Singleton 'conf_path' -> '/...'
                └── Const: Conf.IMDB_PORT
                    └── Lazy: Conf()  #0BjHAQ
                        └── Singleton 'conf_path' -> '/...'
"""

# For example suppose we don't have the singleton `'conf_path'`
with world.test.clone(keep_singletons=False):
    world.debug(f)
    # As you can see, 'conf_path` is not found. Hence when Conf will be instantiated
    # it will fail.
    """
    f
    └── Static link: MovieDB -> IMDBMovieDB
        └── IMDBMovieDB
            └── ImdbAPI @ imdb_factory
                └── imdb_factory
                    ├── Const: Conf.IMDB_API_KEY
                    │   └── Lazy: Conf()  #0BjHAQ
                    │       └── /!\\ Unknown: 'conf_path'
                    ├── Const: Conf.IMDB_HOST
                    │   └── Lazy: Conf()  #0BjHAQ
                    │       └── /!\\ Unknown: 'conf_path'
                    └── Const: Conf.IMDB_PORT
                        └── Lazy: Conf()  #0BjHAQ
                            └── /!\\ Unknown: 'conf_path'
    """

Hooked ? Check out the documentation ! There are still features not presented here !

Cython

The cython implementation is roughly 10x faster than the Python one and strictly follows the same API than the pure Python implementation. This implies that you cannot depend on it in your own Cython code if any. It may be moved to another language.

If you encounter any inconsistencies, please open an issue ! You can avoid the Cython version from PyPI with the following:

pip install --no-binary antidote

Note that PyPy is tested with the pure Python version, not the Cython one.

Mypy

Antidote passes the strict Mypy check and exposes its type information (PEP 561). Unfortunately static typing for decorators is limited to simple cases, hence Antidote @inject will just return the same signature from Mypys point of view. The best way, currently that I know of, is to define arguments as optional as shown below:

from antidote import inject, Service

class MyService(Service):
    pass

@inject
def f(my_service: MyService = None) -> MyService:
    # We never expect it to be None, but it Mypy will now
    # understand that my_service may not be provided.
    assert my_service is not None
    return my_service


s: MyService = f()

# You can also overload the function, if you want a more accurate type definition:
from typing import overload

@overload
def g(my_service: MyService) -> MyService: ...

@overload
def g() -> MyService: ...

@inject
def g(my_service: MyService = None) -> MyService:
    assert my_service is not None
    return my_service


s2: MyService = g()

Note that any of this is only necessary if you’re calling _explicitly_ the function, if only instantiate MyService through Antidote for example, you won’t need this for its __init__() function typically. You could also use a Protocol to define a different signature, but it’s more complex.

Issues / Feature Requests / Questions

Feel free to open an issue on Github for questions, requests or issues ! ;)

How to Contribute

  1. Check for open issues or open a fresh issue to start a discussion around a feature or a bug.

  2. Fork the repo on GitHub. Run the tests to confirm they all pass on your machine. If you cannot find why it fails, open an issue.

  3. Start making your changes to the master branch.

  4. Writes tests which shows that your code is working as intended. (This also means 100% coverage.)

  5. Send a pull request.

Be sure to merge the latest from “upstream” before making a pull request!

If you have any issue during development or just want some feedback, don’t hesitate to open a pull request and ask for help !

Pull requests will not be accepted if:

  • classes and non trivial functions have not docstrings documenting their behavior.

  • tests do not cover all of code changes (100% coverage).

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

antidote-0.10.0.tar.gz (118.6 kB view details)

Uploaded Source

Built Distributions

antidote-0.10.0-cp39-cp39-manylinux2014_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.9

antidote-0.10.0-cp39-cp39-manylinux2014_i686.whl (1.9 MB view details)

Uploaded CPython 3.9

antidote-0.10.0-cp39-cp39-manylinux2010_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.12+ x86-64

antidote-0.10.0-cp39-cp39-manylinux1_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.9

antidote-0.10.0-cp39-cp39-manylinux1_i686.whl (1.9 MB view details)

Uploaded CPython 3.9

antidote-0.10.0-cp38-cp38-manylinux2014_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.8

antidote-0.10.0-cp38-cp38-manylinux2014_i686.whl (2.1 MB view details)

Uploaded CPython 3.8

antidote-0.10.0-cp38-cp38-manylinux2010_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.12+ x86-64

antidote-0.10.0-cp38-cp38-manylinux1_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.8

antidote-0.10.0-cp38-cp38-manylinux1_i686.whl (2.1 MB view details)

Uploaded CPython 3.8

antidote-0.10.0-cp37-cp37m-manylinux2014_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.7m

antidote-0.10.0-cp37-cp37m-manylinux2014_i686.whl (1.8 MB view details)

Uploaded CPython 3.7m

antidote-0.10.0-cp37-cp37m-manylinux2010_x86_64.whl (1.7 MB view details)

Uploaded CPython 3.7m manylinux: glibc 2.12+ x86-64

antidote-0.10.0-cp37-cp37m-manylinux1_x86_64.whl (1.7 MB view details)

Uploaded CPython 3.7m

antidote-0.10.0-cp37-cp37m-manylinux1_i686.whl (1.8 MB view details)

Uploaded CPython 3.7m

antidote-0.10.0-cp36-cp36m-manylinux2014_x86_64.whl (1.8 MB view details)

Uploaded CPython 3.6m

antidote-0.10.0-cp36-cp36m-manylinux2014_i686.whl (1.8 MB view details)

Uploaded CPython 3.6m

antidote-0.10.0-cp36-cp36m-manylinux2010_x86_64.whl (1.7 MB view details)

Uploaded CPython 3.6m manylinux: glibc 2.12+ x86-64

antidote-0.10.0-cp36-cp36m-manylinux1_x86_64.whl (1.7 MB view details)

Uploaded CPython 3.6m

antidote-0.10.0-cp36-cp36m-manylinux1_i686.whl (1.8 MB view details)

Uploaded CPython 3.6m

File details

Details for the file antidote-0.10.0.tar.gz.

File metadata

  • Download URL: antidote-0.10.0.tar.gz
  • Upload date:
  • Size: 118.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.6.11

File hashes

Hashes for antidote-0.10.0.tar.gz
Algorithm Hash digest
SHA256 f18f8f3c925ab3e87f5625dccc5e37b17d346873bff6619fd96e1975f3d170bd
MD5 725437ef523effc1564bfe24a1bdc3ff
BLAKE2b-256 d43dfc2ab232acb617c94081ec7aff9396817c2c36c19d27243c5072dbb8c6a1

See more details on using hashes here.

Provenance

File details

Details for the file antidote-0.10.0-cp39-cp39-manylinux2014_x86_64.whl.

File metadata

  • Download URL: antidote-0.10.0-cp39-cp39-manylinux2014_x86_64.whl
  • Upload date:
  • Size: 2.0 MB
  • Tags: CPython 3.9
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.6.11

File hashes

Hashes for antidote-0.10.0-cp39-cp39-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 37ca429c457d5d202ca0c863e21c45b614d38954a99434e1514953583a96abd3
MD5 2acb9aef770dbb55a2643725db12fc0d
BLAKE2b-256 2569bf5cac266fe5cb0b00124b3d4f2f74bacaafd1694768bbd10a9e75628530

See more details on using hashes here.

Provenance

File details

Details for the file antidote-0.10.0-cp39-cp39-manylinux2014_i686.whl.

File metadata

  • Download URL: antidote-0.10.0-cp39-cp39-manylinux2014_i686.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: CPython 3.9
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.6.11

File hashes

Hashes for antidote-0.10.0-cp39-cp39-manylinux2014_i686.whl
Algorithm Hash digest
SHA256 1bd7b891a4c1eb640dba4d06cdfb72c3d66816aad90121ae31b40a95fa4750a3
MD5 f718bd6acbde0692af4be3d55e8e15a3
BLAKE2b-256 18e5a7f48eb3f1e9f450951c01abdb5d307f2f4b5869defd64dc6339c1c941d6

See more details on using hashes here.

Provenance

File details

Details for the file antidote-0.10.0-cp39-cp39-manylinux2010_x86_64.whl.

File metadata

  • Download URL: antidote-0.10.0-cp39-cp39-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: CPython 3.9, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.6.11

File hashes

Hashes for antidote-0.10.0-cp39-cp39-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 e655f28cffa15c42a5d876b51ab8e7b687aefdc1981e3fded7c096166dde1d43
MD5 6786b6f25a21678ce489488b9031a542
BLAKE2b-256 02efd8380f3eb0cab20d53384251abd72714451c20b38d9ae35e0f0e62fd9943

See more details on using hashes here.

Provenance

File details

Details for the file antidote-0.10.0-cp39-cp39-manylinux1_x86_64.whl.

File metadata

  • Download URL: antidote-0.10.0-cp39-cp39-manylinux1_x86_64.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: CPython 3.9
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.6.11

File hashes

Hashes for antidote-0.10.0-cp39-cp39-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 47015d65294569df3a90f6adbd815120474315af4c5cb9b5eb20cdd26294223b
MD5 9cb320df54f25918902111b777d732ec
BLAKE2b-256 cc89061f3854af8193f6f461708f0c969c148a216fb71b06d514ee60441c5ffc

See more details on using hashes here.

Provenance

File details

Details for the file antidote-0.10.0-cp39-cp39-manylinux1_i686.whl.

File metadata

  • Download URL: antidote-0.10.0-cp39-cp39-manylinux1_i686.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: CPython 3.9
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.6.11

File hashes

Hashes for antidote-0.10.0-cp39-cp39-manylinux1_i686.whl
Algorithm Hash digest
SHA256 3c49c5d6316b723172c654919bf7ed6f3bbb861955fda6779d5e13597c07af40
MD5 dabacc6efbcb2d2a971b1f0fecec10f9
BLAKE2b-256 5f3e4ec4428497d21c66947cbbce15457a510e54dade9a7abbd4847c6eb6a367

See more details on using hashes here.

Provenance

File details

Details for the file antidote-0.10.0-cp38-cp38-manylinux2014_x86_64.whl.

File metadata

  • Download URL: antidote-0.10.0-cp38-cp38-manylinux2014_x86_64.whl
  • Upload date:
  • Size: 2.2 MB
  • Tags: CPython 3.8
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.6.11

File hashes

Hashes for antidote-0.10.0-cp38-cp38-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 cf79d7072d4011aebd84ce30a51a3ce268f3ea8119099b05b9a733e2da3e45c4
MD5 553e4570235760d6d589b49a4f9f1acf
BLAKE2b-256 544fc49c25ea3e71d000491ee82acb8920aae79e84e17992ef55219b31ade952

See more details on using hashes here.

Provenance

File details

Details for the file antidote-0.10.0-cp38-cp38-manylinux2014_i686.whl.

File metadata

  • Download URL: antidote-0.10.0-cp38-cp38-manylinux2014_i686.whl
  • Upload date:
  • Size: 2.1 MB
  • Tags: CPython 3.8
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.6.11

File hashes

Hashes for antidote-0.10.0-cp38-cp38-manylinux2014_i686.whl
Algorithm Hash digest
SHA256 ce4336f7ec44a17b51afd26f248fbe2c07baef7610fad5e57f1ca1e725e85f91
MD5 a95d268e37feac2a02e8eac528978938
BLAKE2b-256 91d92622a1fd6cd3d9540c10935dbd2d95a3394b5270a5553bb8759e69d410a3

See more details on using hashes here.

Provenance

File details

Details for the file antidote-0.10.0-cp38-cp38-manylinux2010_x86_64.whl.

File metadata

  • Download URL: antidote-0.10.0-cp38-cp38-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 2.0 MB
  • Tags: CPython 3.8, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.6.11

File hashes

Hashes for antidote-0.10.0-cp38-cp38-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 4a9dc47b2ab0b97271bd78c9ea2e377867199b02bf9ab0a7e962a10b384637e1
MD5 22d64951a98ba71d8758f85e6a6d0978
BLAKE2b-256 c85613f34874040930935e05f3cde2e1cf8218c2b3d93092c31d84ff1d5b05ea

See more details on using hashes here.

Provenance

File details

Details for the file antidote-0.10.0-cp38-cp38-manylinux1_x86_64.whl.

File metadata

  • Download URL: antidote-0.10.0-cp38-cp38-manylinux1_x86_64.whl
  • Upload date:
  • Size: 2.0 MB
  • Tags: CPython 3.8
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.6.11

File hashes

Hashes for antidote-0.10.0-cp38-cp38-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 cb0980fa0689004c8db2ebc86bf8c1fd6e8a846423f63435d01e4a89bd533f05
MD5 051e67a78928d113016de1ed4687b0f0
BLAKE2b-256 264a280d8032cca489596410897b62543cc80104afe4ad936e3368d9dfa7a881

See more details on using hashes here.

Provenance

File details

Details for the file antidote-0.10.0-cp38-cp38-manylinux1_i686.whl.

File metadata

  • Download URL: antidote-0.10.0-cp38-cp38-manylinux1_i686.whl
  • Upload date:
  • Size: 2.1 MB
  • Tags: CPython 3.8
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.6.11

File hashes

Hashes for antidote-0.10.0-cp38-cp38-manylinux1_i686.whl
Algorithm Hash digest
SHA256 84650060c94c6e94fd614a95bead8b94c7aa02b333889883f7c968df7fa17140
MD5 293129ffbc43016b579a6e01d64975ff
BLAKE2b-256 6a905cba4ce8a323786c37214aa89fd8650ba67f78ccc00dd62e9c431d3f4d18

See more details on using hashes here.

Provenance

File details

Details for the file antidote-0.10.0-cp37-cp37m-manylinux2014_x86_64.whl.

File metadata

  • Download URL: antidote-0.10.0-cp37-cp37m-manylinux2014_x86_64.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: CPython 3.7m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.6.11

File hashes

Hashes for antidote-0.10.0-cp37-cp37m-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d819ffc8e73e0854b042f3fcb0ef972a7b15da378725fb635f8d01f2f1983e95
MD5 55661faa22e0ba6475cfe98e931f0e14
BLAKE2b-256 0aa0ce32b4a5ed8f3468fbf2a8367ce6cbe0d13618cb06b6417d8e92e2fcd806

See more details on using hashes here.

Provenance

File details

Details for the file antidote-0.10.0-cp37-cp37m-manylinux2014_i686.whl.

File metadata

  • Download URL: antidote-0.10.0-cp37-cp37m-manylinux2014_i686.whl
  • Upload date:
  • Size: 1.8 MB
  • Tags: CPython 3.7m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.6.11

File hashes

Hashes for antidote-0.10.0-cp37-cp37m-manylinux2014_i686.whl
Algorithm Hash digest
SHA256 20a87ced05829a5ae40432ae3c7fa0bbbab28ac3ddbcad7edb8bd2090f1ae6a8
MD5 5893a4527f202933c3239d971e28fc3f
BLAKE2b-256 9cc57caae079ad435cc26a3755c4eb7bde6ba9a0b104f5025cbebb2923cd8185

See more details on using hashes here.

Provenance

File details

Details for the file antidote-0.10.0-cp37-cp37m-manylinux2010_x86_64.whl.

File metadata

  • Download URL: antidote-0.10.0-cp37-cp37m-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: CPython 3.7m, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.6.11

File hashes

Hashes for antidote-0.10.0-cp37-cp37m-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 86f8214da1d3c0df42f4d1483fcd47e569ba08d30630e0235e8c048bacc52165
MD5 5c73c15cc1570d4f64893ba8e242fa89
BLAKE2b-256 f456c0f55e78aee8392d11399b75ac1e50b24501930b297923455e3b02b5cd8c

See more details on using hashes here.

Provenance

File details

Details for the file antidote-0.10.0-cp37-cp37m-manylinux1_x86_64.whl.

File metadata

  • Download URL: antidote-0.10.0-cp37-cp37m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: CPython 3.7m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.6.11

File hashes

Hashes for antidote-0.10.0-cp37-cp37m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 3cdd6d1e5703259ec2a33c55970f2910e8f392be9ec62e90e6cff794f05f00e3
MD5 6af001e12244cd067102cc4b11e58dae
BLAKE2b-256 c55c4df2f856a5287177354c95f1e52be5417fcbabf50e114eaa0be7f1ebf58c

See more details on using hashes here.

Provenance

File details

Details for the file antidote-0.10.0-cp37-cp37m-manylinux1_i686.whl.

File metadata

  • Download URL: antidote-0.10.0-cp37-cp37m-manylinux1_i686.whl
  • Upload date:
  • Size: 1.8 MB
  • Tags: CPython 3.7m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.6.11

File hashes

Hashes for antidote-0.10.0-cp37-cp37m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 52440ef8ef15319d6d6fd53737269f2a0d427422be9433fc42cc8932e2ba473e
MD5 ab87e9fcdad24363171d293f72b3403e
BLAKE2b-256 e6a64e2fcae4297d2ff5e20cc955baa1db101a74e58710c18a77e2d2acf3e9c1

See more details on using hashes here.

Provenance

File details

Details for the file antidote-0.10.0-cp36-cp36m-manylinux2014_x86_64.whl.

File metadata

  • Download URL: antidote-0.10.0-cp36-cp36m-manylinux2014_x86_64.whl
  • Upload date:
  • Size: 1.8 MB
  • Tags: CPython 3.6m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.6.11

File hashes

Hashes for antidote-0.10.0-cp36-cp36m-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b39842fb92fac9bbf0b33192a8da60def034ffb5ffe689182d4ebde1d7093346
MD5 ac5fbb5b5e8ce9c05bc24c1e2904acc6
BLAKE2b-256 38255ed14cb68801bb7e8c5a96a7860575887c42802b30f68756587fdecbbc84

See more details on using hashes here.

Provenance

File details

Details for the file antidote-0.10.0-cp36-cp36m-manylinux2014_i686.whl.

File metadata

  • Download URL: antidote-0.10.0-cp36-cp36m-manylinux2014_i686.whl
  • Upload date:
  • Size: 1.8 MB
  • Tags: CPython 3.6m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.6.11

File hashes

Hashes for antidote-0.10.0-cp36-cp36m-manylinux2014_i686.whl
Algorithm Hash digest
SHA256 f3a0b308e5a5dc03ba9faf1fd32a3454ee38ff5ec85cd8377ac1c096b9116886
MD5 9869ac6e50c0d8c8864e9d2a33922bae
BLAKE2b-256 a4f77990c2d72457e59966880e24f638ab206123921349dd9d578ac1d35fbdc3

See more details on using hashes here.

Provenance

File details

Details for the file antidote-0.10.0-cp36-cp36m-manylinux2010_x86_64.whl.

File metadata

  • Download URL: antidote-0.10.0-cp36-cp36m-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: CPython 3.6m, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.6.11

File hashes

Hashes for antidote-0.10.0-cp36-cp36m-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 fe3885144dedf41a6c24a4545b802a78443ef46cf5e1baeae81426884b5b9f5f
MD5 cc8eda4109669ee373aceaf382ad9de4
BLAKE2b-256 b0d7b949bdac1353fe0271834e2769fa5fa6cc9af5f7aab413209479c939847b

See more details on using hashes here.

Provenance

File details

Details for the file antidote-0.10.0-cp36-cp36m-manylinux1_x86_64.whl.

File metadata

  • Download URL: antidote-0.10.0-cp36-cp36m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: CPython 3.6m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.6.11

File hashes

Hashes for antidote-0.10.0-cp36-cp36m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 8b571051c6d4325e47e8f672c7c48e1d6b0731d2a6e35f1c0fc2e78f7d158f8f
MD5 b20fd25e3ef7768ef64912ad863a7bcb
BLAKE2b-256 9321f06836a5aa3b7d20226f7fcb96481a29c1af04e3654d5f9f96ebe58e9488

See more details on using hashes here.

Provenance

File details

Details for the file antidote-0.10.0-cp36-cp36m-manylinux1_i686.whl.

File metadata

  • Download URL: antidote-0.10.0-cp36-cp36m-manylinux1_i686.whl
  • Upload date:
  • Size: 1.8 MB
  • Tags: CPython 3.6m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.6.11

File hashes

Hashes for antidote-0.10.0-cp36-cp36m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 1bb67e5cb8bc7ef6083acebd78b6572789ad53d729d5e30aedf2457df4ed01a6
MD5 0da0ccd9f66a51f0148c70041aec51be
BLAKE2b-256 5aa7981a07a205cb4e79460870064e8c0d56ae56d2c2049898fb79d65499f6a9

See more details on using hashes here.

Provenance

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page