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 built on the idea of ensuring best maintainability of your code while being as easy to use as possible. It also provides the fastest injection with @inject allowing you to use it virtually anywhere and fast full isolation of your tests.

Antidote 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 annotated type hints, but it supports a lot more!

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

    • Documented, everything has tested examples.

    • No need for any custom setup, just use your injected function as usual. You just don’t have to specify injected arguments anymore. Allowing you to gradually migrate an existing project.

    • Documented, with a lot of tested examples.

  • Flexibility
    • Most common dependencies out of the box: services, configuration, factories, interface/implementation.

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

    • Scope support

    • Async injection

  • Maintainability
    • All dependencies can be tracked back to their declaration/implementation easily.

    • Mypy compatibility and usage of type hints as much as possible.

    • Overriding dependencies will raise an error outside of tests.

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

    • No double injection.

    • Everything is as explicit as possible, @inject does not inject anything implicitly.

    • Type checks when a type is explicitly defined with world.get, world.lazy and constants.

    • Thread-safe, cycle detection.

    • Immutable whenever possible. Overrides are not possible outside of tests.

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

    • Fully isolate each test with world.test.clone. They will work on the separate objects.

    • Override any dependency locally in a test.

    • When encountering issues you can retrieve the full dependency tree, nicely formatted, with world.debug.

  • Performance*
    • Fastest @inject with heavily tuned Cython.

    • As much as possible is done at import time.

    • Testing utilities are tuned to ensure that even with full isolation it stays fast.

    • Benchmarks: comparison, injection, test utilities

*with the compiled version, in Cython. Pre-built wheels for Linux. See further down for more details.

Comparison benchmark image

Installation

To install Antidote, simply run this command:

pip install antidote

Documentation

Beginner friendly tutorial, recipes, the reference and a FAQ can be found in the documentation.

Here are some links:

Issues / Questions

Feel free to open an issue on Github for questions or issues !

Hands-on quick start

Showcase of the most important features of Antidote with short and concise examples. Checkout the Getting started for a full beginner friendly tutorial.

Injection

from antidote import Service, inject, Provide

class Database(Service):
    pass

@inject
def f(db: Provide[Database]):
    pass

f()  # works !

Simple, right ? And you can still use it like a normal function, typically when testing it:

f(Database())

@inject supports a lot of different ways to express which dependency should be used, the most important ones are:

  • annotated type hints:
    @inject
    def f(db: Provide[Database]):
        pass
  • list:
    @inject([Database])
    def f(db):
        pass
  • dictionary:
    @inject({'db': Database})
    def f(db):
        pass
  • auto_provide
    # All class type hints are treated as dependencies
    @inject(auto_provide=True)
    def f(db: Database):
        pass

You can also retrieve the dependency by hand with world.get:

from antidote import world

# Retrieve dependencies by hand, in tests typically
world.get(Database)
world.get[Database](Database)  # with type hint
world.get[Database]()  # omit dependency if it's the type hint itself

Service

Services are classes for which Antidote provides an instance. It can be a singleton or not. Scopes are also supported. Every method is injected by default, relying on annotated type hints. It can also be parametrized or configured differently.

from antidote import Service, Provide, inject

class QueryBuilder(Service):
    __antidote__ = Service.Conf(singleton=False)  # new instance each time

    # methods injected by default
    def __init__(self, db: Provide[Database]):
        self._db = db

@inject({'builder': QueryBuilder})
def load_data(builder):
    pass

load_data()  # yeah !

If you don’t want to inherit from Service you can use the class decorator service instead.

from antidote import service, inject

@service(singleton=False)
class QueryBuilder:
    # methods are also injected by default
    def __init__(self, db: Provide[Database]):
        self._db = db

Constants

Constants are, by definition, constants that Antidote provides lazily. It’s primary use case is configuration:

from antidote import inject, Constants, const

class Config(Constants):
    DB_HOST = const('localhost')

@inject([Config.DB_HOST])
def ping_db(db_host: str):
    pass

ping_db()  # nice !

Now this looks a bit overkill, but it allows you to refactor it easily or load complex configuration lazily. Here is a similar example, but loading the configuration from the environment:

from typing import Annotated
# from typing_extensions import Annotated # Python < 3.9
from antidote import inject, Constants, const, Get

class Config(Constants):
    DB_HOST = const[str]()  # used as a type annotation
    DB_PORT = const[int]()  # and also to cast the value retrieved from `provide_const`
    DB_USER = const[str](default='postgres')  # defaults are supported

    def provide_const(self, name: str, arg: object):
        return os.environ[name]

import os
os.environ['DB_HOST'] = 'localhost'
os.environ['DB_PORT'] = '5432'

@inject()
def check_connection(db_host: Annotated[str, Get(Config.DB_HOST)],
                     db_port: Annotated[int, Get(Config.DB_PORT)]):
    pass

check_connection()  # perfect !

Note that we could have replaced the previous Config without any changes in the clients.

Factory

Factories are used by Antidote to generate a dependency. It can either be a class or a function. The resulting dependency can be a singleton or not. Scopes are also supported. If a class is used it’ll be wired (injection of methods) in the same way as Service:

from antidote import factory, inject, Provide

class User:
    pass

@factory(singleton=False)  # annotated type hints can be used or you can @inject manually
def current_user(db: Provide[Database]) -> User:  # return type annotation is used
    return User()

# Note that here you *know* exactly where it's coming from.
@inject({'user': User @ current_user})
def is_admin(user: User):
    pass

Easy to understand where the dependency is actually coming from ! Like Service, you can also retrieve it by hand:

from antidote import world

world.get(User @ current_user)
world.get[User](User @ current_user)  # with type hint
world.get[User] @ current_user  # same, but shorter

Now with a request scope and a factory class:

from typing import Annotated
# from typing_extensions import Annotated # Python < 3.9
from antidote import Factory, inject, Provide, world, From

REQUEST_SCOPE = world.scopes.new(name='request')

class CurrentUser(Factory):
    __antidote__ = Factory.Conf(scope=REQUEST_SCOPE)

    # injecting it in __call__() would have also worked
    def __init__(self, db: Provide[Database]):
        self._db = db

    def __call__(self) -> User:
        return User()

@inject
def is_admin(user: Annotated[User, From(CurrentUser)]):
    pass

is_admin()

# Reset all dependencies in the specified scope.
world.scopes.reset(REQUEST_SCOPE)

Here also, knowing where and how a scope is used is straightforward with an IDE.

Interface/Implementation

The distinction between an interface and its implementation lets you choose between multiple implementations, which one to use. This choice can be permanent or not. For the latter, Antidote will retrieve the current implementation each time:

from antidote import Service, implementation, inject, factory

class Cache:
    pass

class MemoryCache(Cache, Service):
    pass

class Redis:
    """ class from an external library """

@factory
def redis_cache() -> Redis:
    return Redis()

@implementation(Cache)
def cache_impl():
    import os

    if os.environ.get('USE_REDIS_CACHE'):
        return Redis @ redis_cache

    # Returning the dependency that must be retrieved
    return MemoryCache

The cache can then be retrieved with the same syntax as a factory:

from typing import Annotated
# from typing_extensions import Annotated # Python < 3.9
from antidote import world, inject, From

@inject
def heavy_compute(cache: Annotated[Cache, From(cache_impl)]):
    pass


world.get[Cache] @ cache_impl

Like factories, it’s easy to know where the dependency is coming from !

Testing and Debugging

inject always allows you to pass your own argument to override the injection:

from antidote import Service, inject, Provide

class Database(Service):
    pass

@inject
def f(db: Provide[Database]):
    pass

f()
f(Database())  # test with specific arguments in unit tests

You can also fully isolate your tests from each other and override any dependency within that context:

from antidote import world

# Clone current world to isolate it from the rest
with world.test.clone():
    x = object()
    # Override the Database
    world.test.override.singleton(Database, x)
    f()  # will have `x` injected for the Databas

    @world.test.override.factory(Database)
    def override_database():
        class DatabaseMock:
            pass

        return DatabaseMock()

    f()  # will have `DatabaseMock()` injected for the Database

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:

def function_with_complex_dependencies():
    pass

world.debug(function_with_complex_dependencies)
# would output something like this:
"""
main
└── Permanent implementation: MovieDB @ current_movie_db
    └──<∅> IMDBMovieDB
        └── ImdbAPI @ imdb_factory
            └── imdb_factory
                ├── Const: Config.IMDB_API_KEY
                │   └── Config
                ├── Const: Config.IMDB_PORT
                │   └── Config
                └── Const: Config.IMDB_HOST
                    └── Config

Singletons have no scope markers.
<∅> = no scope (new instance each time)
<name> = custom scope
"""

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

Compiled

The compiled implementation is roughly 10x faster than the Python one and strictly follows the same API than the pure Python implementation. Pre-compiled wheels are available only for Linux currently. You can check whether you’re using the compiled version or not with:

from antidote import is_compiled

f"Is Antidote compiled ? {is_compiled()}"

You can force the compilation of antidote yourself when installing:

ANTIDOTE_COMPILED=true pip install antidote

On the contrary, you can force the pure Python version with:

pip install --no-binary antidote

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:

  • public classes/functions have not docstrings documenting their behavior with examples.

  • tests do not cover all of code changes (100% coverage) in the pure python.

If you face issues with the Cython part of Antidote, I may implement it myself.

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

Uploaded Source

Built Distributions

antidote-0.14.2-cp39-cp39-manylinux2014_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.9

antidote-0.14.2-cp39-cp39-manylinux2014_i686.whl (2.1 MB view details)

Uploaded CPython 3.9

antidote-0.14.2-cp39-cp39-manylinux2010_x86_64.whl (2.1 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.12+ x86-64

antidote-0.14.2-cp39-cp39-manylinux1_x86_64.whl (2.1 MB view details)

Uploaded CPython 3.9

antidote-0.14.2-cp39-cp39-manylinux1_i686.whl (2.1 MB view details)

Uploaded CPython 3.9

antidote-0.14.2-cp38-cp38-manylinux2014_x86_64.whl (2.3 MB view details)

Uploaded CPython 3.8

antidote-0.14.2-cp38-cp38-manylinux2014_i686.whl (2.2 MB view details)

Uploaded CPython 3.8

antidote-0.14.2-cp38-cp38-manylinux2010_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.12+ x86-64

antidote-0.14.2-cp38-cp38-manylinux1_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.8

antidote-0.14.2-cp38-cp38-manylinux1_i686.whl (2.2 MB view details)

Uploaded CPython 3.8

antidote-0.14.2-cp37-cp37m-manylinux2014_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.7m

antidote-0.14.2-cp37-cp37m-manylinux2014_i686.whl (1.9 MB view details)

Uploaded CPython 3.7m

antidote-0.14.2-cp37-cp37m-manylinux2010_x86_64.whl (1.9 MB view details)

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

antidote-0.14.2-cp37-cp37m-manylinux1_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.7m

antidote-0.14.2-cp37-cp37m-manylinux1_i686.whl (1.9 MB view details)

Uploaded CPython 3.7m

antidote-0.14.2-cp36-cp36m-manylinux2014_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.6m

antidote-0.14.2-cp36-cp36m-manylinux2014_i686.whl (1.9 MB view details)

Uploaded CPython 3.6m

antidote-0.14.2-cp36-cp36m-manylinux2010_x86_64.whl (1.9 MB view details)

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

antidote-0.14.2-cp36-cp36m-manylinux1_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.6m

antidote-0.14.2-cp36-cp36m-manylinux1_i686.whl (1.9 MB view details)

Uploaded CPython 3.6m

File details

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

File metadata

  • Download URL: antidote-0.14.2.tar.gz
  • Upload date:
  • Size: 178.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.0.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.9.2

File hashes

Hashes for antidote-0.14.2.tar.gz
Algorithm Hash digest
SHA256 6dd07e5a74e0889ec79ad813512e38cd129341247de95c9f661e151dd68df5e9
MD5 73784b3e542728af34a1f91c348270ab
BLAKE2b-256 b731470d9cdb52b0d9103ff274338e2ad43a3b2573c24cca74e20c02143dc990

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.14.2-cp39-cp39-manylinux2014_x86_64.whl
  • Upload date:
  • Size: 2.2 MB
  • Tags: CPython 3.9
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.0.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.9.2

File hashes

Hashes for antidote-0.14.2-cp39-cp39-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 16e470669fd0f4f2bb94a712dfc6a9956139f2e60fe249d58a56c4aba4a63346
MD5 bc0cdb4784ae231c7c77c58eecd4ee20
BLAKE2b-256 390bcbf77c5c7bc68865b32cb31267a26ab7b729a8ccb5532d43dce8c35873cb

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.14.2-cp39-cp39-manylinux2014_i686.whl
  • Upload date:
  • Size: 2.1 MB
  • Tags: CPython 3.9
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.0.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.9.2

File hashes

Hashes for antidote-0.14.2-cp39-cp39-manylinux2014_i686.whl
Algorithm Hash digest
SHA256 16703dc67c402eb315dd9a288d36842fb490a10e86658e043743ee813c49e343
MD5 5b50c926b920762b6402bc27376ca9d7
BLAKE2b-256 7b99c4e913316528d098004d5dd6482de592c5896d9ab65ef1532e08134e92b2

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.14.2-cp39-cp39-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 2.1 MB
  • Tags: CPython 3.9, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.0.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.9.2

File hashes

Hashes for antidote-0.14.2-cp39-cp39-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 7c321297bba64ac005eb0646295042b2eb7d46e08ea8395fc8ecaee2d5e1e2ef
MD5 ba86d2592e887f327225985503c3c402
BLAKE2b-256 7c7bfef3430097aedbbed90d174174a9260211eb92faffbaab5cb6983df1b4c6

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.14.2-cp39-cp39-manylinux1_x86_64.whl
  • Upload date:
  • Size: 2.1 MB
  • Tags: CPython 3.9
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.0.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.9.2

File hashes

Hashes for antidote-0.14.2-cp39-cp39-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 02f798deb0d9c75c50c602587afbf5eb71bfefd7ee3c11b1f7845939478b8309
MD5 2cfa3fdfad712fbebbc075b138aa4e4d
BLAKE2b-256 e002533bd4d481ff40cad9372fc38bc3de04ba79756b3a9f228ed6b0bd03b342

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.14.2-cp39-cp39-manylinux1_i686.whl
  • Upload date:
  • Size: 2.1 MB
  • Tags: CPython 3.9
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.0.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.9.2

File hashes

Hashes for antidote-0.14.2-cp39-cp39-manylinux1_i686.whl
Algorithm Hash digest
SHA256 d31911c3ef2f4420e0fb7a172b7da5f1da51237681fbe706a2cddb62f65934c1
MD5 b79e1f6e4d95e44af496e3228cd9e953
BLAKE2b-256 b54f9c1f2391a0eed7501d5622cc2325e561de997177baad6a92c04a8ba014e4

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.14.2-cp38-cp38-manylinux2014_x86_64.whl
  • Upload date:
  • Size: 2.3 MB
  • Tags: CPython 3.8
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.0.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.9.2

File hashes

Hashes for antidote-0.14.2-cp38-cp38-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b9fbc1238e5b849629da920027e1152b8f88480ade803b816a3b4370952cf9ab
MD5 9018fe405f5b905b3510c06c23a4cd26
BLAKE2b-256 c9453506eff09a16e9d444828171b7a2eac992954afa6dc7b14d697259c50e67

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.14.2-cp38-cp38-manylinux2014_i686.whl
  • Upload date:
  • Size: 2.2 MB
  • Tags: CPython 3.8
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.0.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.9.2

File hashes

Hashes for antidote-0.14.2-cp38-cp38-manylinux2014_i686.whl
Algorithm Hash digest
SHA256 4aecbdd5f4e66e4ae92f3684f96002944229b68ee0ee7d59f71ede4409653c51
MD5 2cdfeef3ec68bda8ce69e979884abaf1
BLAKE2b-256 2aea6a33bca2b649e3a0435730cc0612c3ca42e06880ed8fce2a8ef8dde46b1d

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.14.2-cp38-cp38-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 2.2 MB
  • Tags: CPython 3.8, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.0.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.9.2

File hashes

Hashes for antidote-0.14.2-cp38-cp38-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 c0820c75e8dfa3dcfda02183061182cb449bf8d28bc62485066e71873eef8b16
MD5 cbbf9fdfe09fcb98bfa2bc54f2786824
BLAKE2b-256 7df4fde5058ecd9ae1181019a2d03f794047b017a69301d891d8d9aaf4931be7

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.14.2-cp38-cp38-manylinux1_x86_64.whl
  • Upload date:
  • Size: 2.2 MB
  • Tags: CPython 3.8
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.0.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.9.2

File hashes

Hashes for antidote-0.14.2-cp38-cp38-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 5d60d6460ca38f5233671df794a46cf2f09d84134de03c3a903bf63226946ab5
MD5 13d20a60079759f8fe7fb1d370ab98f2
BLAKE2b-256 4289f98ab0e81ee738cd9094d8282d9deb20e760219bf024c37c7968324bcbbd

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.14.2-cp38-cp38-manylinux1_i686.whl
  • Upload date:
  • Size: 2.2 MB
  • Tags: CPython 3.8
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.0.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.9.2

File hashes

Hashes for antidote-0.14.2-cp38-cp38-manylinux1_i686.whl
Algorithm Hash digest
SHA256 5b4093846e9a3bb05f7867fa70b70a67e7a32e7f3f35c24dc45a4c189e0b569f
MD5 37fc6079fa6ad6ab23ed2d5e6661bb9a
BLAKE2b-256 7c6f0c159989a9ab4f31c14a9b7d08217be706eb6a7c2003989310e3d162c26c

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.14.2-cp37-cp37m-manylinux2014_x86_64.whl
  • Upload date:
  • Size: 2.0 MB
  • Tags: CPython 3.7m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.0.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.9.2

File hashes

Hashes for antidote-0.14.2-cp37-cp37m-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 00322661796ba1cb2b7dd4093ce1c983218932916b89a0aba9d79339b554ccde
MD5 3adf14afda19a515c201e488817cd787
BLAKE2b-256 8f2b11714e10d3c0224505ba78028f209592564c09d1dfcb82821f83bf991d07

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.14.2-cp37-cp37m-manylinux2014_i686.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: CPython 3.7m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.0.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.9.2

File hashes

Hashes for antidote-0.14.2-cp37-cp37m-manylinux2014_i686.whl
Algorithm Hash digest
SHA256 f475b2fc5b433a18337bbfd82b6f3a2e4b9a1c07225cd1e9bfbf0eaa8e817fac
MD5 ac37a63b2c87ab00711e6e7423bbe400
BLAKE2b-256 323016a4c6e786ed5fd3b43da8ec44b77a2a5d25466f502dc7c0648a94ca3e09

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.14.2-cp37-cp37m-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: CPython 3.7m, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.0.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.9.2

File hashes

Hashes for antidote-0.14.2-cp37-cp37m-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 7dc877cd24e0121cffa36041c448b350a2015a078257da23062707f3a496548a
MD5 3f50d33d35fa3b0206f61291d4ebec1d
BLAKE2b-256 9c97054d565f1c4b06694b1fb9d7ae039163e4c9a29989d8fcbb5a71a983753b

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.14.2-cp37-cp37m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: CPython 3.7m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.0.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.9.2

File hashes

Hashes for antidote-0.14.2-cp37-cp37m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 40b27e11f900a84b81b2c6ded6e5f06a1872a872e7784d93710fc50ef19a3e28
MD5 7066058c428fa144bd637cb304516986
BLAKE2b-256 7abb4d55e80ff715f52415939e181fd5fa108f61719d046cec05a3c76ebaa01e

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.14.2-cp37-cp37m-manylinux1_i686.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: CPython 3.7m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.0.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.9.2

File hashes

Hashes for antidote-0.14.2-cp37-cp37m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 be978f8121aefdc514b1e902080c99143884e68630d273ccdfc109616a0838ec
MD5 7120b9abc2284af4f9ebffcd6b3738b6
BLAKE2b-256 569ccb0c956f24dd67b330a7440adbaeab46fcfd1bc28c63276673facf7d472f

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.14.2-cp36-cp36m-manylinux2014_x86_64.whl
  • Upload date:
  • Size: 2.0 MB
  • Tags: CPython 3.6m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.0.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.9.2

File hashes

Hashes for antidote-0.14.2-cp36-cp36m-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a262887c882a63a4a0226bf17dac4b5b72b77a329b9feff7ede634198e4f8cd5
MD5 d2e7d5aca40737ebc1c35f5fd900a32b
BLAKE2b-256 47c233b87941d2cc48acc24432d4fb554f8d5608f5a41c0d3b4d89e414e3e17b

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.14.2-cp36-cp36m-manylinux2014_i686.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: CPython 3.6m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.0.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.9.2

File hashes

Hashes for antidote-0.14.2-cp36-cp36m-manylinux2014_i686.whl
Algorithm Hash digest
SHA256 6b1dc4c7ae751f5723a2900778f84ef9b972dcf4431a0ef86fa91a5720945f0e
MD5 1a08dad76b03cfa55ab8714002b633d0
BLAKE2b-256 51c45e136e83deb422db7c9251ff8ce039b811eb5633529e64e04248de989f25

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.14.2-cp36-cp36m-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: CPython 3.6m, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.0.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.9.2

File hashes

Hashes for antidote-0.14.2-cp36-cp36m-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 1565877b4f76ea5334824ee2514eab95778399f37a5064673136b53c806971c3
MD5 fda43b13efa217f7b7ee54b7411988c4
BLAKE2b-256 3d920315642c54536e752c3ef012c4bfd3aa685828580468c6cbce718e893acf

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.14.2-cp36-cp36m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: CPython 3.6m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.0.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.9.2

File hashes

Hashes for antidote-0.14.2-cp36-cp36m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 0ef27c5a1582100ebb2851091db0f31e7dbb536e7ad5166b7509f629bdd10da6
MD5 4307900d9fdea80232084f4c314d474c
BLAKE2b-256 9240c3c2170e88844e7ba3e88f5af2c7ba547533967eee03cefad7f00ee77109

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.14.2-cp36-cp36m-manylinux1_i686.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: CPython 3.6m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.0.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.9.2

File hashes

Hashes for antidote-0.14.2-cp36-cp36m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 8f801ceff770a2b530b676ea6aa527388960fa519ff05551302bdaf2e8a310aa
MD5 40fc14bd4d90fdf47b10c71fd72a8a13
BLAKE2b-256 0078628bbccd5a12af8484d286779fbac7d35df803d9af5a2273507baf9a2c90

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