Dependency injection.
Project description
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.
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
Check for open issues or open a fresh issue to start a discussion around a feature or a bug.
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.
Start making your changes to the master branch.
Writes tests which shows that your code is working as intended. (This also means 100% coverage.)
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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6dd07e5a74e0889ec79ad813512e38cd129341247de95c9f661e151dd68df5e9 |
|
MD5 | 73784b3e542728af34a1f91c348270ab |
|
BLAKE2b-256 | b731470d9cdb52b0d9103ff274338e2ad43a3b2573c24cca74e20c02143dc990 |
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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 16e470669fd0f4f2bb94a712dfc6a9956139f2e60fe249d58a56c4aba4a63346 |
|
MD5 | bc0cdb4784ae231c7c77c58eecd4ee20 |
|
BLAKE2b-256 | 390bcbf77c5c7bc68865b32cb31267a26ab7b729a8ccb5532d43dce8c35873cb |
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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 16703dc67c402eb315dd9a288d36842fb490a10e86658e043743ee813c49e343 |
|
MD5 | 5b50c926b920762b6402bc27376ca9d7 |
|
BLAKE2b-256 | 7b99c4e913316528d098004d5dd6482de592c5896d9ab65ef1532e08134e92b2 |
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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7c321297bba64ac005eb0646295042b2eb7d46e08ea8395fc8ecaee2d5e1e2ef |
|
MD5 | ba86d2592e887f327225985503c3c402 |
|
BLAKE2b-256 | 7c7bfef3430097aedbbed90d174174a9260211eb92faffbaab5cb6983df1b4c6 |
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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 02f798deb0d9c75c50c602587afbf5eb71bfefd7ee3c11b1f7845939478b8309 |
|
MD5 | 2cfa3fdfad712fbebbc075b138aa4e4d |
|
BLAKE2b-256 | e002533bd4d481ff40cad9372fc38bc3de04ba79756b3a9f228ed6b0bd03b342 |
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
Algorithm | Hash digest | |
---|---|---|
SHA256 | d31911c3ef2f4420e0fb7a172b7da5f1da51237681fbe706a2cddb62f65934c1 |
|
MD5 | b79e1f6e4d95e44af496e3228cd9e953 |
|
BLAKE2b-256 | b54f9c1f2391a0eed7501d5622cc2325e561de997177baad6a92c04a8ba014e4 |
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
Algorithm | Hash digest | |
---|---|---|
SHA256 | b9fbc1238e5b849629da920027e1152b8f88480ade803b816a3b4370952cf9ab |
|
MD5 | 9018fe405f5b905b3510c06c23a4cd26 |
|
BLAKE2b-256 | c9453506eff09a16e9d444828171b7a2eac992954afa6dc7b14d697259c50e67 |
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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4aecbdd5f4e66e4ae92f3684f96002944229b68ee0ee7d59f71ede4409653c51 |
|
MD5 | 2cdfeef3ec68bda8ce69e979884abaf1 |
|
BLAKE2b-256 | 2aea6a33bca2b649e3a0435730cc0612c3ca42e06880ed8fce2a8ef8dde46b1d |
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
Algorithm | Hash digest | |
---|---|---|
SHA256 | c0820c75e8dfa3dcfda02183061182cb449bf8d28bc62485066e71873eef8b16 |
|
MD5 | cbbf9fdfe09fcb98bfa2bc54f2786824 |
|
BLAKE2b-256 | 7df4fde5058ecd9ae1181019a2d03f794047b017a69301d891d8d9aaf4931be7 |
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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 5d60d6460ca38f5233671df794a46cf2f09d84134de03c3a903bf63226946ab5 |
|
MD5 | 13d20a60079759f8fe7fb1d370ab98f2 |
|
BLAKE2b-256 | 4289f98ab0e81ee738cd9094d8282d9deb20e760219bf024c37c7968324bcbbd |
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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 5b4093846e9a3bb05f7867fa70b70a67e7a32e7f3f35c24dc45a4c189e0b569f |
|
MD5 | 37fc6079fa6ad6ab23ed2d5e6661bb9a |
|
BLAKE2b-256 | 7c6f0c159989a9ab4f31c14a9b7d08217be706eb6a7c2003989310e3d162c26c |
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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 00322661796ba1cb2b7dd4093ce1c983218932916b89a0aba9d79339b554ccde |
|
MD5 | 3adf14afda19a515c201e488817cd787 |
|
BLAKE2b-256 | 8f2b11714e10d3c0224505ba78028f209592564c09d1dfcb82821f83bf991d07 |
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
Algorithm | Hash digest | |
---|---|---|
SHA256 | f475b2fc5b433a18337bbfd82b6f3a2e4b9a1c07225cd1e9bfbf0eaa8e817fac |
|
MD5 | ac37a63b2c87ab00711e6e7423bbe400 |
|
BLAKE2b-256 | 323016a4c6e786ed5fd3b43da8ec44b77a2a5d25466f502dc7c0648a94ca3e09 |
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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7dc877cd24e0121cffa36041c448b350a2015a078257da23062707f3a496548a |
|
MD5 | 3f50d33d35fa3b0206f61291d4ebec1d |
|
BLAKE2b-256 | 9c97054d565f1c4b06694b1fb9d7ae039163e4c9a29989d8fcbb5a71a983753b |
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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 40b27e11f900a84b81b2c6ded6e5f06a1872a872e7784d93710fc50ef19a3e28 |
|
MD5 | 7066058c428fa144bd637cb304516986 |
|
BLAKE2b-256 | 7abb4d55e80ff715f52415939e181fd5fa108f61719d046cec05a3c76ebaa01e |
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
Algorithm | Hash digest | |
---|---|---|
SHA256 | be978f8121aefdc514b1e902080c99143884e68630d273ccdfc109616a0838ec |
|
MD5 | 7120b9abc2284af4f9ebffcd6b3738b6 |
|
BLAKE2b-256 | 569ccb0c956f24dd67b330a7440adbaeab46fcfd1bc28c63276673facf7d472f |
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
Algorithm | Hash digest | |
---|---|---|
SHA256 | a262887c882a63a4a0226bf17dac4b5b72b77a329b9feff7ede634198e4f8cd5 |
|
MD5 | d2e7d5aca40737ebc1c35f5fd900a32b |
|
BLAKE2b-256 | 47c233b87941d2cc48acc24432d4fb554f8d5608f5a41c0d3b4d89e414e3e17b |
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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6b1dc4c7ae751f5723a2900778f84ef9b972dcf4431a0ef86fa91a5720945f0e |
|
MD5 | 1a08dad76b03cfa55ab8714002b633d0 |
|
BLAKE2b-256 | 51c45e136e83deb422db7c9251ff8ce039b811eb5633529e64e04248de989f25 |
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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1565877b4f76ea5334824ee2514eab95778399f37a5064673136b53c806971c3 |
|
MD5 | fda43b13efa217f7b7ee54b7411988c4 |
|
BLAKE2b-256 | 3d920315642c54536e752c3ef012c4bfd3aa685828580468c6cbce718e893acf |
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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0ef27c5a1582100ebb2851091db0f31e7dbb536e7ad5166b7509f629bdd10da6 |
|
MD5 | 4307900d9fdea80232084f4c314d474c |
|
BLAKE2b-256 | 9240c3c2170e88844e7ba3e88f5af2c7ba547533967eee03cefad7f00ee77109 |
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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8f801ceff770a2b530b676ea6aa527388960fa519ff05551302bdaf2e8a310aa |
|
MD5 | 40fc14bd4d90fdf47b10c71fd72a8a13 |
|
BLAKE2b-256 | 0078628bbccd5a12af8484d286779fbac7d35df803d9af5a2273507baf9a2c90 |