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 declarative 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.

Hence 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

    • magic is frowned upon and avoided as much as possible. But it is used when it doesn’t hurt understandability and improves readability.

  • 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 will raise an exception (no duplicates) and one can freeze the dependency space. Once frozen, no new dependencies can be defined.

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

    • Override 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 very simple example:

from antidote import inject, Service, Constants

class Conf(Constants):
    # Configuration values are identified by public uppercase class
    # attributes. It helps refactoring as it's easy to find their usage
    # and their definition.
    # The Constants super class will treat their associated value as the input
    # argument of get(). This allows you to load lazily any configuration.
    DB_HOST = 'host'

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

    def get(self, key):
        return self._data[key]

# Declare Database as a dependency that can be injected
class Database(Service):
    # Antidotes configuration for this class. `__init__()` is wired (injected) by
    # default.
    __antidote__ = Service.Conf().with_wiring(
        # Specifying that arguments named 'host' should be injected with the
        # dependency Conf.DB_HOST.
        dependencies=dict(host=Conf.DB_HOST))

    # You could have wired yourself `__init__()` by applying:
    # @inject(dependencies=dict(host=Conf.DB_HOST))
    def __init__(self, host: str):
        self._host = host

# Inject dependencies in f(), by default only type annotations are used. But
# arguments name, explicit mapping, etc.. can also be used.
@inject
def f(db: Database):
    pass

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

Want more ? Here is a more complex example:

"""
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

class MovieDB:
    """ Interface """

    def get_best_movies(self):
        pass

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

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

# Defining a singleton. Can only be overridden in tests.
world.singletons.add('conf_path', '/...')

class Conf(Constants):
    IMDB_HOST = 'imdb.host'
    IMDB_API_KEY = 'imdb.api_key'

    # `use_names=True` specifies that Antidote can use the argument names
    # when type hints are not present or too generic (builtins typically).
    __antidote__ = Constants.Conf().with_wiring(use_names=True)

    def __init__(self, conf_path: str):
        """ Load configuration from `conf_path` """
        self._raw_conf = {
            'imdb': {
                'host': 'dummy_host',
                'api_key': 'dummy_api_key'
            }
        }

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

# ImdbAPI will be provided by this factory, as defined by the return type annotation.
# The dependencies arguments specifies what must be injected
@factory(dependencies=(Conf.IMDB_HOST, Conf.IMDB_API_KEY))
def imdb_factory(host: str, api_key: str) -> ImdbAPI:
    # Here host = Conf().get('imdb.host')
    return ImdbAPI(host=host, api_key=api_key)

# Implementation tells Antidote that this class should be used as an implementation of
# the interface MovieDB
class IMDBMovieDB(MovieDB, Implementation):
    # As ImdbAPI is provided by imdb_factory, Antidote requires it to be explicitly
    # specified. This ensures that can always track back where dependencies are
    # coming from.
    __antidote__ = Implementation.Conf().with_wiring(
        dependencies=dict(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):
    pass

# You can also retrieve dependencies by hand
world.get[str](Conf.IMDB_HOST)  # the result will be cast to `str`
# To avoid repetition, if the type is the dependency itself you can do:
world.get[IMDBMovieDB]()

# If you need to handle multiple different api_keys for some reason you can
# specify them in the dependency itself:
world.get[ImdbAPI](ImdbAPI @ imdb_factory.with_kwargs(api_key='XX'))
# As imdb_factory returns a singleton, by default, this will also be the case
# here. Using the same API key, will return the same instance. This avoids boilerplate
# code when the same instance is needed with different arguments. The same works
# with a Service. In the previous example you could have
# used `Database.with_kwargs(host='something')`

# Like before you can call f() without any arguments:
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,
    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' -> '/...'
"""

# 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'
    """

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 pre-compiled wheels from PyPI with the following:

pip install --no-binary antidote

Note that it will nonetheless try to compile with Cython if available.

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.8.0.tar.gz (112.6 kB view details)

Uploaded Source

Built Distributions

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

Uploaded CPython 3.9

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

Uploaded CPython 3.9

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

Uploaded CPython 3.9 manylinux: glibc 2.12+ x86-64

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

Uploaded CPython 3.9

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

Uploaded CPython 3.9

antidote-0.8.0-cp38-cp38-manylinux2014_x86_64.whl (2.1 MB view details)

Uploaded CPython 3.8

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

Uploaded CPython 3.8

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

Uploaded CPython 3.8 manylinux: glibc 2.12+ x86-64

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

Uploaded CPython 3.8

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

Uploaded CPython 3.8

antidote-0.8.0-cp37-cp37m-manylinux2014_x86_64.whl (1.8 MB view details)

Uploaded CPython 3.7m

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

Uploaded CPython 3.7m

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

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

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

Uploaded CPython 3.7m

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

Uploaded CPython 3.7m

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

Uploaded CPython 3.6m

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

Uploaded CPython 3.6m

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

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

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

Uploaded CPython 3.6m

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

Uploaded CPython 3.6m

File details

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

File metadata

  • Download URL: antidote-0.8.0.tar.gz
  • Upload date:
  • Size: 112.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.8.0.tar.gz
Algorithm Hash digest
SHA256 d9994ce9565f0127f9308941f22fdb9939bcb62bcd95aa91df7194ce8415b16c
MD5 621fb3d534d5a54a9c4b2f126c9abca0
BLAKE2b-256 78a365ace96579dd5744510cfa2ccf779e57fb634cb18f990d33c8e8ab4be97e

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.8.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.8.0-cp39-cp39-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a94aef868bd3d0286c5cdb07caba66b30dae59874780f569d34a29ad56e15fc0
MD5 b38eced56d7493ddd53a386808835af9
BLAKE2b-256 2175c630b148d77b284993bf17b25348072b64a2eff705ffda8c9239722ab3bf

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.8.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.8.0-cp39-cp39-manylinux2014_i686.whl
Algorithm Hash digest
SHA256 98177a714e5dc5772b9d534a5ddfc706d0d21a5e96ffbc326102055204916466
MD5 f0bbe720ccaa54f9da6fc982426332be
BLAKE2b-256 5b74a50274fe55efbc40aeba6f33fe283d4eb14d24937230ce0a8cd5d8b909bf

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.8.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.8.0-cp39-cp39-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 ada97f7b8a92b366d0dc9fc0119f9cadc7a0c24cc0e1806eed8961dd10ede5d0
MD5 5a5b9e0944e9702d4f0f6137a6896202
BLAKE2b-256 77ba73ed02e8d84f1f7647685ba6158ebf376d1643a4de6e0efa90c6f66e83cc

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.8.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.8.0-cp39-cp39-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 569a41c6e9af8605f86e8bce910876accc2be91d417d73372f78c993b40344e7
MD5 cd697b388dfd19c82d2ea32a81106d00
BLAKE2b-256 91e16baf7f251b4f69a3c33607018a5fd45392c9af2ec6a514e8c5610d446f22

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.8.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.8.0-cp39-cp39-manylinux1_i686.whl
Algorithm Hash digest
SHA256 54f313355b82495cdab02cce22904f2f5c79df530e2aa957405c8be80715de62
MD5 b79ecb07da05f986d0c00ca27cc38434
BLAKE2b-256 d45047d707f93c2015dc60c0276bf2e4539410302d0aec13c42ee61377f45f32

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.8.0-cp38-cp38-manylinux2014_x86_64.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.8.0-cp38-cp38-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8ea899163644b0700ce2bcb4f1c319fee4f74d2649bf2e6aa7e75d23410d3c8f
MD5 817ed310c896bb709212baa3e81b5346
BLAKE2b-256 eac841112224016e3f68309bf9f6d1921fa53c1fa2a0d126226ad8b259667281

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.8.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.8.0-cp38-cp38-manylinux2014_i686.whl
Algorithm Hash digest
SHA256 7424489547dc44ec36975342d7c8417b2d9c79a4182ce9db3b92370202610afa
MD5 718d59483bcefc4bc25bca659659ca7e
BLAKE2b-256 3bd81169507990632b760e2bad30d19f5b650d238cc1b86b4d0a088babd350ea

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.8.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.8.0-cp38-cp38-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 43c1258ec20b589ea57810de1fbd233caec23063313799d697d3f8614cb8de54
MD5 7eb23b461f999b0323400218f5b09e05
BLAKE2b-256 f9f21f68473ec449a53ed730ac17331b0843645cb53fc96d6e80e9e3c2d5d61a

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.8.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.8.0-cp38-cp38-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 75d08c333d8f04c2e9f43e04ce30fbbc3c32bf5eafdada875aab9bd857f63deb
MD5 2ef6a8058598b7431ec1045e857235e5
BLAKE2b-256 906cde56efeea855863112dc62fe8fda385543ae6d1720697d8de39bfb171fd3

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.8.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.8.0-cp38-cp38-manylinux1_i686.whl
Algorithm Hash digest
SHA256 35cb1637a946e881f1a1fc48da4df3740733c49c64c2360091f7a4ff861d9118
MD5 c34dca0b84dd84c3cab119b87db345b0
BLAKE2b-256 c71acd1b421ef9f7a5605703f7e960e436d01efeb24c61147d0a78c2dd35fd5d

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.8.0-cp37-cp37m-manylinux2014_x86_64.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.8.0-cp37-cp37m-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ed0a35b1317a8455344b952ef54bdf7d73bcef9a1642b4dc32c4eb5d41b9b0fa
MD5 e5e02df7a2bf663782bdd81a0bb709fe
BLAKE2b-256 72a5975e12bd9135fac0addb1a6b63344bb50abe657a13f21dab80db92ec70c8

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.8.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.8.0-cp37-cp37m-manylinux2014_i686.whl
Algorithm Hash digest
SHA256 2c5fc99676a701dd4cd423e30f312ef03ed117f745390db8a9f0c6f4ffb0a61e
MD5 b81e38edb60bbb8bd140240fcfb5d614
BLAKE2b-256 5939ad618457c60c4aa6db744d2e9d0e788543b363a83a0f2689ad4e54dc7f35

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.8.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.8.0-cp37-cp37m-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 3acca04979263350d8d73dcd372ea48863ed6f144516e4c94b9a866ceeb8b1b0
MD5 96e7c333934a9f37b4a516e6b87a0706
BLAKE2b-256 6a29f16717d6d442cc1a0cabd00a6874b1c82ab1e75c099aad7d0305965f38dc

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.8.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.8.0-cp37-cp37m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 155cf34ed4be220530ac5a6f4343de574bfe4b489f3a3cea26282bdc464615c4
MD5 58ee9d674d35d29fec3801eec0218d4b
BLAKE2b-256 1382a3549144822d5d1ff5646bc9a01e94294902683636e1d2141bb0d50be8b6

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.8.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.8.0-cp37-cp37m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 85693908904222130cdfeb479641bf4e4c3f518b7a41b96bde11d75cf5a9b8c6
MD5 104b9199d6334dd10447621cad3c34b5
BLAKE2b-256 ed6be30a9dc722d954835da88de2a416f3022903e30136cd8674e9a5412d1b42

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.8.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.8.0-cp36-cp36m-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 fa30c18f96fa749c78da58d81f183ea05f9ba2d2dac113654d6bac4d21a0d6b2
MD5 c15a8e7657aad5dfea828bd7b7546e5d
BLAKE2b-256 fcec12fc70e8a829b9b719e37e75aa61c718f0eb16547d469cdcc5e82b942d54

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.8.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.8.0-cp36-cp36m-manylinux2014_i686.whl
Algorithm Hash digest
SHA256 21880636afb1af356b3ea681ade43b78abe131b14f4a5a9ce84426ac22dd8aa0
MD5 5c450114b207f2246f41606e8eee030e
BLAKE2b-256 d11f641ec244c229a9890ec7df496d4f8e864c42ec718f2129fe50470426b1f7

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.8.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.8.0-cp36-cp36m-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 0e5417e6664ea53d4852fec2c7259509c253f28f249ed09a6cade7145b109c7a
MD5 11e55854209d966f8f50b787121023d6
BLAKE2b-256 d3e65ad10a807426537c065bb7b4c985c8aaffe2b05f2bf53d550a930e1391ea

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.8.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.8.0-cp36-cp36m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 7f21e0931e3eb6880c29c4ee9b0b4425b6f7df86aefcbe9dbcde8230dc731063
MD5 961f122fc93a9bfd9208871838d04db9
BLAKE2b-256 772b80b02c80cd541e2d61e71ed09d193ef9fd6bc4dcc81f0b932b3f53f80986

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.8.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.8.0-cp36-cp36m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 c9c8479fc48b62d31126d822955a983b9ea969062047975c5aa88323e78a8601
MD5 4d69428f2403f99dcddffde2aa8c48b7
BLAKE2b-256 b70dba048fe0fb793f11e12d6e4ddffe1cfddab2105217078e1dacc396ca79e7

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