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.

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

  • 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 / Feature Requests / Questions

Feel free to open an issue on Github for questions, requests 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, Service and Constants

How does injection looks like ?

from typing import Annotated
# from typing_extensions import Annotated # Python < 3.9
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

Now let’s get back to our Database. It lacks some configuration !

from antidote import inject, Service, Constants, const

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

class Database(Service):
    @inject([Config.DB_HOST])  # self is ignored when specifying a list
    def __init__(self, host: str):
        self._host = host

@inject({'db': Database})
def f(db: Database):
    pass

f()  # yeah !

Looks a bit overkill here, but doing so allows you to change later how DB_HOST is actually retrieved. You could load a configuration file for example, it wouldn’t change the rest of your code. And you can easily find where a configuration parameter is used.

You can also retrieve dependencies by hand when testing for example:

from antidote import world

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

If you want to be compatible with Mypy type checking, you just need to do the following:

@inject
def f(db: Provide[Database] = None):
    # Used to tell Mypy that `db` is optional but must be either injected or given.
    assert db is not None
    pass

This might look a bit cumbersome, but in reality you’ll only need to do it in functions you are actually calling yourself in your code. Typically Database.__init__() won’t need it because it’ll always be Antidote injecting the arguments.

Factories and Interface/Implementation

Want more ? Here is an over-engineered example to showcase a lot more features. First we have an ImdbAPI coming from a external library:

# from a library
class ImdbAPI:
    def __init__(self, host: str, port: int, api_key: str):
        pass

You have your own interface to manipulate the movies:

# movie.py
class MovieDB:
    """ Interface """

    def get_best_movies(self):
        pass

Now that’s the entry point of your application:

# main.py
from movie import MovieDB
from current_movie import current_movie_db


@inject([MovieDB @ current_movie_db])
def main(movie_db: MovieDB = None):
    assert movie_db is not None  # for Mypy, to understand that movie_db is optional
    pass

# Or with annotated type hints
@inject
def main(movie_db: Annotated[MovieDB, From(current_movie_db)]):
    pass

main()

Note that you can search for the definition of current_movie_db. So you can simply use “Go to definition” of your IDE which would open:

# current_movie.py
# Code implementing/managing MovieDB
from antidote import factory, inject, Service, implementation
from config import Config

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

class IMDBMovieDB(MovieDB, Service):
    __antidote__ = Service.Conf(singleton=False)  # New instance each time

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

    def get_best_movies(self):
        pass

@implementation(MovieDB)
def current_movie_db() -> object:
    return IMDBMovieDB  # dependency to be provided for MovieDB

Or with annotated type hints:

# current_movie.py
# Code implementing/managing MovieDB
from antidote import factory, Service, Get, From
from typing import Annotated
# from typing_extensions import Annotated # Python < 3.9
from config import Config

@factory
def imdb_factory(host: Annotated[str, Get(Config.IMDB_HOST)],
                 port: Annotated[int, Get(Config.IMDB_PORT)],
                 api_key: Annotated[str, Get(Config.IMDB_API_KEY)]
                 ) -> ImdbAPI:
    return ImdbAPI(host, port, api_key)

class IMDBMovieDB(MovieDB, Service):
    __antidote__ = Service.Conf(singleton=False)

    def __init__(self, imdb_api: Annotated[ImdbAPI, From(imdb_factory)]):
        self._imdb_api = imdb_api

    def get_best_movies(self):
        pass

The configuration can also be easily tracked down:

# config.py
from antidote import Constants, const

class Config(Constants):
    # with str/int/float, the type hint is enforced. Can be removed or extend to
    # support Enums.
    IMDB_HOST = const[str]('imdb.host')
    IMDB_PORT = const[int]('imdb.port')
    IMDB_API_KEY = const('imdb.api_key')

    def __init__(self):
        self._raw_conf = {
            'imdb': {
                'host': 'dummy_host',
                'api_key': 'dummy_api_key',
                'port': '80'
            }
        }

    def provide_const(self, name: str, arg: str):
        root, key = arg.split('.')
        return self._raw_conf[root][key]

Testing and Debugging

Based on the previous example. You can test your application by simply overriding any of the arguments:

conf = Config()
main(IMDBMovieDB(imdb_factory(
    # constants can be retrieved directly on an instance
    host=conf.IMDB_HOST,
    port=conf.IMDB_PORT,
    api_key=conf.IMDB_API_KEY,
)))

You can also fully isolate your tests from each other while relying on Antidote and override any dependencies within that context:

from antidote import world

# Clone current world to isolate it from the rest
with world.test.clone():
    # Override the configuration
    world.test.override.singleton(Config.IMDB_HOST, 'other host')
    main()

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:

world.debug(main)
# will output:
"""
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

print(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:

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

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

If you face issues with the Cython part of Antidote just send the pull request, I can adapt the Cython part 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.13.0.tar.gz (175.5 kB view details)

Uploaded Source

Built Distributions

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

Uploaded CPython 3.9

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

Uploaded CPython 3.9

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

Uploaded CPython 3.9 manylinux: glibc 2.12+ x86-64

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

Uploaded CPython 3.9

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

Uploaded CPython 3.9

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

Uploaded CPython 3.8

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

Uploaded CPython 3.8

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

Uploaded CPython 3.8 manylinux: glibc 2.12+ x86-64

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

Uploaded CPython 3.8

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

Uploaded CPython 3.8

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

Uploaded CPython 3.7m

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

Uploaded CPython 3.7m

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

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

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

Uploaded CPython 3.7m

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

Uploaded CPython 3.7m

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

Uploaded CPython 3.6m

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

Uploaded CPython 3.6m

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

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

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

Uploaded CPython 3.6m

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

Uploaded CPython 3.6m

File details

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

File metadata

  • Download URL: antidote-0.13.0.tar.gz
  • Upload date:
  • Size: 175.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/53.0.0 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.9.1

File hashes

Hashes for antidote-0.13.0.tar.gz
Algorithm Hash digest
SHA256 80cced5ea1db9069afc696b4b9baacbc7b21bcc0343b409d3a2b975ad9655daa
MD5 56cb4b886342f58c9adc227bbc0bac2b
BLAKE2b-256 20887edb9d1e960461edc5f31b365525daf01bf9bef6a5f106f9157f88979df3

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.13.0-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.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/53.0.0 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.9.1

File hashes

Hashes for antidote-0.13.0-cp39-cp39-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ae9273e144ab8797ac7dfb2b52131e6a3045aded3d5ff09b2429c8ae98b76784
MD5 cb214b25c742f4d247d36c826b661ff2
BLAKE2b-256 e669b1c30766e5ee85a704ddf7796f622ac2798cfdd9a9fb5c83b1f90f0e5bfe

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.13.0-cp39-cp39-manylinux2014_i686.whl
  • Upload date:
  • Size: 2.1 MB
  • Tags: CPython 3.9
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/53.0.0 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.9.1

File hashes

Hashes for antidote-0.13.0-cp39-cp39-manylinux2014_i686.whl
Algorithm Hash digest
SHA256 f571aae5b40759d5a48e1150237cddabaff6cc39099352d4225394140418f193
MD5 9fe695b0ffac965a6d7e58ead531017f
BLAKE2b-256 6f9e6ff82236e4b6de1002a19df47e3ca5366523e4df6bc05b58fd347ba07013

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.13.0-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.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/53.0.0 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.9.1

File hashes

Hashes for antidote-0.13.0-cp39-cp39-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 c7b3fe63dcf231a10656f508bf8aef44334c2a26993ec6f2de283c4552809ed8
MD5 341efcb34ab35455bda7ca074687ddcb
BLAKE2b-256 ca7a24598055c20966a01f3fa064294bac60bd593fc5a82e0bf6cec01dd655ee

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.13.0-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.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/53.0.0 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.9.1

File hashes

Hashes for antidote-0.13.0-cp39-cp39-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 6fac6782f706605660beb92b427886006a0dede8546e46632f7096009af18836
MD5 3e536c2cc082dd50f8d296722fe2aeb2
BLAKE2b-256 29a59604c81813969621a73e29bc24134a97679b9e73e6bfbcd42bdd0d9a4205

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.13.0-cp39-cp39-manylinux1_i686.whl
  • Upload date:
  • Size: 2.1 MB
  • Tags: CPython 3.9
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/53.0.0 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.9.1

File hashes

Hashes for antidote-0.13.0-cp39-cp39-manylinux1_i686.whl
Algorithm Hash digest
SHA256 2ea47a30eae31b6bf2c4e7ec9169f8e46712d629a5044ab91de353816a47ee02
MD5 0adc212c04a812d08f52abdb49f79c7b
BLAKE2b-256 abbee9f1b54f19d70e24f4dc9a2c1a50db8eabb02ca6998072adf868e5dd5d84

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.13.0-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.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/53.0.0 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.9.1

File hashes

Hashes for antidote-0.13.0-cp38-cp38-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 551de0a2ac9ef777d069fd1e05ad5518806b34acae1dddd8d76916ee05715cc7
MD5 2768103270514720cbdb46a7e44aab4e
BLAKE2b-256 4da4093a633de0c11e0ac68ebd796e6fb1b31f13d65241d13cd40ed397ea7a0c

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.13.0-cp38-cp38-manylinux2014_i686.whl
  • Upload date:
  • Size: 2.2 MB
  • Tags: CPython 3.8
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/53.0.0 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.9.1

File hashes

Hashes for antidote-0.13.0-cp38-cp38-manylinux2014_i686.whl
Algorithm Hash digest
SHA256 813f2a0a98729327454af535058acfbf3ee2d0f579602e691d14974459472691
MD5 75acaea30fc27061a6487d5eecbe03da
BLAKE2b-256 f260ce6b6fddbe19f01cea0483d2145124e35e3d77786065ccf492fbd117c793

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.13.0-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.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/53.0.0 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.9.1

File hashes

Hashes for antidote-0.13.0-cp38-cp38-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 7bac82e7402edaa66aaee06708db2e9ab8475639687da4e39dc59f31dc2ca450
MD5 23067960414ba888a02ce348fb3e322f
BLAKE2b-256 c7e63d580137ee5898dcbf01cca5a5e21a93ffe85706e1cedeb249dfd6ec85ca

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.13.0-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.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/53.0.0 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.9.1

File hashes

Hashes for antidote-0.13.0-cp38-cp38-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 10f2be3c73b1c65f94794d98736d68a11ce25b0d94c5cfc020ff9e475d40ec99
MD5 9eea9d59ebbb1766a600d88ddb024c08
BLAKE2b-256 b3f41991d02ee9fe7673bd12b543ce7480addf71e90c428802ef75b1164b2a1a

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.13.0-cp38-cp38-manylinux1_i686.whl
  • Upload date:
  • Size: 2.2 MB
  • Tags: CPython 3.8
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/53.0.0 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.9.1

File hashes

Hashes for antidote-0.13.0-cp38-cp38-manylinux1_i686.whl
Algorithm Hash digest
SHA256 66d708776cd0448f0af3a6cd7037c8955f314e88b20d60ae220c341940b2eca8
MD5 7a684db473d19d87070e65538ea3a5f2
BLAKE2b-256 157329c8131d63a7b430bbe33496db36299a9c4b3603794a3493e74895aabf5e

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.13.0-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.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/53.0.0 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.9.1

File hashes

Hashes for antidote-0.13.0-cp37-cp37m-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e229e46f3f6ae50072afb075d21fd7f5fc32ddf5679ed6867d36d2126217ff46
MD5 2bcd6fd8f7e58eb540e04620500762a8
BLAKE2b-256 7de15a66c9ae935a02c43999b5d5ba1d09650b8f11e138a8ad6aac45fb3e87a7

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.13.0-cp37-cp37m-manylinux2014_i686.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: CPython 3.7m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/53.0.0 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.9.1

File hashes

Hashes for antidote-0.13.0-cp37-cp37m-manylinux2014_i686.whl
Algorithm Hash digest
SHA256 5e7d3fbb5c7c092d5a61d7c89dd4e0a0430f0a0b69376866fcbd03cd1fe562e9
MD5 4671dbd8344e94413dcc8251a2adc28f
BLAKE2b-256 7449b74f376059e9c14e8ccb90979b6c5ef93ffcc611d296a6abe19f8b6a7a3f

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.13.0-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.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/53.0.0 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.9.1

File hashes

Hashes for antidote-0.13.0-cp37-cp37m-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 851d30015ef3361e682133e766c002c2e91d2862f7d120b6f7c276e14d3919af
MD5 e741b7176238f69e868aa2b298fd8eaa
BLAKE2b-256 46ad7a20b8d33f99660de95735be310b572b6f447ac487b933c3358b2c5fd0af

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.13.0-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.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/53.0.0 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.9.1

File hashes

Hashes for antidote-0.13.0-cp37-cp37m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 32d224af9fe0a9190ff474f3e13df57042fdc74c6f1af9680a84f9b213313ebd
MD5 c0d97b9f4ee09818b9de443e7843715f
BLAKE2b-256 4fd1a7c51532ce379791dfbc123f8f002b794c5ede208b5af598cfcc7bec4aa1

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.13.0-cp37-cp37m-manylinux1_i686.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: CPython 3.7m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/53.0.0 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.9.1

File hashes

Hashes for antidote-0.13.0-cp37-cp37m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 0e4df07f36c17a25c142e85bf4263bfa62bdc0f0b5eeff990e5621de1229926e
MD5 b7b28a85d081586c4e7a07c003285180
BLAKE2b-256 a52ce5f88a73a9eacbd2bb300f216b09797dbf4be02d82a6d5ed35a9d5b02bf2

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.13.0-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.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/53.0.0 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.9.1

File hashes

Hashes for antidote-0.13.0-cp36-cp36m-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 54bd5d69765eed41442448d999b11d7e38046f34d2f854744cbeafce3cc4dde0
MD5 3cca88f09a78c6d3c07cd07b0b319745
BLAKE2b-256 e32eb4856e8b1f7765f7bb096308847430d71481b491aec2dff4b26369391c55

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.13.0-cp36-cp36m-manylinux2014_i686.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: CPython 3.6m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/53.0.0 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.9.1

File hashes

Hashes for antidote-0.13.0-cp36-cp36m-manylinux2014_i686.whl
Algorithm Hash digest
SHA256 05cc414631a55e10da383d79d9a28652bfea429a624c8d79efdf8c2d0655d609
MD5 383c1ed89ffed09aea7673c2966230ea
BLAKE2b-256 a97eed83525428032e3e087913864092771694baa557bb65ca936c3bf1a83f20

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.13.0-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.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/53.0.0 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.9.1

File hashes

Hashes for antidote-0.13.0-cp36-cp36m-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 d2e604d2916616b406e0e0d88705d5f371018baba1f488e6cab234f3fee1ea73
MD5 b3e0fa945e4cbf804404c2214db0c136
BLAKE2b-256 dd29a9496421b42223732767726dc6895f92ba17a2415a3180cd9775be3c1752

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.13.0-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.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/53.0.0 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.9.1

File hashes

Hashes for antidote-0.13.0-cp36-cp36m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 7ec5ad8afae33fb5cbc3bf641215f7853afa4235bbaa5a4a839e31bdab9ba5ae
MD5 934137f8bd89e6b051a2099f98505902
BLAKE2b-256 1149172a60d80f1c11a08cd4810ae783b23b5a24d5a0e6ef5302d0a766197fc2

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: antidote-0.13.0-cp36-cp36m-manylinux1_i686.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: CPython 3.6m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/53.0.0 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.9.1

File hashes

Hashes for antidote-0.13.0-cp36-cp36m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 24f7f01badf37d483deaa75e14208b78010e60da2f3d7a4370903b9251d194a0
MD5 7ce306b5d405075d297b0d0896c199cc
BLAKE2b-256 f69427b17224c38e610504fb9f82ca66c14f299510e19ab2c4a1798508d61fdd

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