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.
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.
- 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
fully isolate all the dependencies of each test.
@inject
lets you override any injections by passing explicitly the arguments.Override locally in a test any dependency.
When encountering issues you can retrieve the full dependency tree, nicely formatted, with
world.debug
.
- Performance*
fastest
@inject
with heavily tuned Cython.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 / 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.
A simple service
How does injection looks like ? Here is a simple example:
from antidote import inject, Service, Constants, const, world
class Conf(Constants):
DB_HOST = const('localhost:5432')
class Database(Service):
@inject([Conf.DB_HOST]) # based on argument position
def __init__(self, host: str):
self._host = host
@inject({'db': Database})
def f(db: Database):
pass
f() # yeah !
f(Database('localhost:5432')) # override injection
# Retrieve dependencies by hand, in tests typically
world.get(Conf.DB_HOST)
world.get[str](Conf.DB_HOST) # with type hint
world.get[Database]() # omit dependency if it's the type hint itself
Or with annotated type hints (PEP-593):
from typing import Annotated
# from typing_extensions import Annotated # Python < 3.9
from antidote import Get, Provide
class Database(Service):
# All methods are decorated with @inject by default
def __init__(self, host: Annotated[str, Get(Conf.DB_HOST)]):
self._host = host
@inject
def f(db: Provide[Database]):
pass
Or with auto_provide
:
# auto_provide => Class type hints are treated as dependencies.
@inject(auto_provide=True)
def f(db: Database):
pass
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.
A more complex case
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
if __name__ == '__main__':
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]
Now you can override any of the arguments, typically in tests:
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
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:
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
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.12.1.tar.gz
.
File metadata
- Download URL: antidote-0.12.1.tar.gz
- Upload date:
- Size: 171.6 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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3602b224f2ef731847f9d765a9e79b307ee8f66d853c58aeed76062108e24978 |
|
MD5 | 6e257559dc40ea6587ecf9e17a886436 |
|
BLAKE2b-256 | c6fd078c1a90eaf8ff7ec144ad3a229c5c78e95ee80fae3d6cbd58e8783c38d1 |
Provenance
File details
Details for the file antidote-0.12.1-cp39-cp39-manylinux2014_x86_64.whl
.
File metadata
- Download URL: antidote-0.12.1-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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 29d5f80888d359ce4fd94c8ae43e6c05031f8b9788c367e4e9d751d96bee46ee |
|
MD5 | 3c372633f054cd6cacd5e071b054e2e6 |
|
BLAKE2b-256 | 7e49d8a5fd7fa535b4713eeac925f86af02391a46bb709fd560da3f9218d957e |
Provenance
File details
Details for the file antidote-0.12.1-cp39-cp39-manylinux2014_i686.whl
.
File metadata
- Download URL: antidote-0.12.1-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
Algorithm | Hash digest | |
---|---|---|
SHA256 | fca2e039e6dc12600c7ec4a43429e91cfaab41d2b6687ea861f11406846aac84 |
|
MD5 | efe7a282b0f1e7b576fdd59e41328d51 |
|
BLAKE2b-256 | 5fe5a69e2127730bfb529840dd3a9d331be8194b36fa30c338940cbe85b10f4c |
Provenance
File details
Details for the file antidote-0.12.1-cp39-cp39-manylinux2010_x86_64.whl
.
File metadata
- Download URL: antidote-0.12.1-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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 55249e270e043330de3a0efb1d0665dc7338bc67712020fa811c493e2f294af8 |
|
MD5 | 678dac4bdeb0397ed77c00bab7131aef |
|
BLAKE2b-256 | 31baeb34ab1b9f9bd1efe4c2bed20e8805fa001dcf499533b0e94cfca1dddb71 |
Provenance
File details
Details for the file antidote-0.12.1-cp39-cp39-manylinux1_x86_64.whl
.
File metadata
- Download URL: antidote-0.12.1-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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3ec1b7024bf2033f15a79f2a6e116cc40a229575fd5210facfb14377d9e3b337 |
|
MD5 | 25bc1c2012db18bc32586ceb4d0a974f |
|
BLAKE2b-256 | 975c1043f7d6d4be6ea39a59d68f687a7a69628366af85b31fb9ee58ee2196e0 |
Provenance
File details
Details for the file antidote-0.12.1-cp39-cp39-manylinux1_i686.whl
.
File metadata
- Download URL: antidote-0.12.1-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
Algorithm | Hash digest | |
---|---|---|
SHA256 | ff7e8ac823efcf695e1948b67cb33bebfffd2afc9317c770beb9961f12488ab5 |
|
MD5 | 8a8c0dd80380a9d7a437be55c978696f |
|
BLAKE2b-256 | e3142ea0dfd188cc464928e5ad30525a7b31d6648746670c6f56d67b660f34b8 |
Provenance
File details
Details for the file antidote-0.12.1-cp38-cp38-manylinux2014_x86_64.whl
.
File metadata
- Download URL: antidote-0.12.1-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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0c1b18b11a52d10502fd50cebdda08955353c5d4fd680fb2b4b78ddc5ca2e894 |
|
MD5 | 6679919e71ab8a793ac13dde45116e22 |
|
BLAKE2b-256 | 63aa0a9f6a91ba4434ac23064f3fff776385a0603d69d0e9bd52bc270887adf0 |
Provenance
File details
Details for the file antidote-0.12.1-cp38-cp38-manylinux2014_i686.whl
.
File metadata
- Download URL: antidote-0.12.1-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
Algorithm | Hash digest | |
---|---|---|
SHA256 | b9fb3a597fd1a0121341372f7d119461968806987b73500be4cb76da79680d1e |
|
MD5 | 38595c276c65d9c78ec751d08c4d5e96 |
|
BLAKE2b-256 | 975032b6bd811e18f67ec393fb75dda147f4a1ef9eea367183428fff431fa51d |
Provenance
File details
Details for the file antidote-0.12.1-cp38-cp38-manylinux2010_x86_64.whl
.
File metadata
- Download URL: antidote-0.12.1-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
Algorithm | Hash digest | |
---|---|---|
SHA256 | f56dc051024b393acf26efaff259a018d86605ea1e0dd392bd419d9bcc92fda2 |
|
MD5 | 54ce0cd60179b750292c4c5bfbfadea2 |
|
BLAKE2b-256 | a0348c92271573dcda2e0874abd2333c58501fd2b2bed9468bc74a2cc27a7ee0 |
Provenance
File details
Details for the file antidote-0.12.1-cp38-cp38-manylinux1_x86_64.whl
.
File metadata
- Download URL: antidote-0.12.1-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
Algorithm | Hash digest | |
---|---|---|
SHA256 | d77fed44983aa1eb8267a08a3023c7a6f4d1e5e4bc96602eb837cfd12d4a15bb |
|
MD5 | ebf6e2c80af1552c613a1cf2ca16cfc7 |
|
BLAKE2b-256 | 3118e336df440eb2a4df790bd24ec62c28c9e4f5787fb5de01f602a5c9f30bdd |
Provenance
File details
Details for the file antidote-0.12.1-cp38-cp38-manylinux1_i686.whl
.
File metadata
- Download URL: antidote-0.12.1-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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 070a538915202839ecee78b2a9e27b8a4ee6bf7f047c0167a496b04dff9b6a50 |
|
MD5 | 78c41886277b230a60dd4d058a731444 |
|
BLAKE2b-256 | 1218f8e04a5cb8e04451baf62d7309673234511f15265369524a6d7d42bb8012 |
Provenance
File details
Details for the file antidote-0.12.1-cp37-cp37m-manylinux2014_x86_64.whl
.
File metadata
- Download URL: antidote-0.12.1-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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 008b28789db23303bde8d4c5ac8a2f93e2454c4e3c0192d85cbe31d1028dce14 |
|
MD5 | 57ad9ea53e2ee0f22ef741c22e281dc8 |
|
BLAKE2b-256 | ab764f5d5fe3d6665d8458fd43ec4558a98d18abd1fa51e4ebff838397563eda |
Provenance
File details
Details for the file antidote-0.12.1-cp37-cp37m-manylinux2014_i686.whl
.
File metadata
- Download URL: antidote-0.12.1-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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 84b192e3fb6d5162f12be5470b7849f05cbb7591a1434555f4605d28f5594e24 |
|
MD5 | 870bdcbb6b1fd554fd8e57d437a1fc5f |
|
BLAKE2b-256 | 719d481b89fb135bc5ea3e3e55c68f778331e6778ddd240d019feefcd5949e44 |
Provenance
File details
Details for the file antidote-0.12.1-cp37-cp37m-manylinux2010_x86_64.whl
.
File metadata
- Download URL: antidote-0.12.1-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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8e7dacdea4cd2229841a8b2c02e66220ed28e67a3fcde15d53901406f4adc0f6 |
|
MD5 | 468b9e39f54b49e59bbf3e9a6d02903b |
|
BLAKE2b-256 | 200fa2d0a609b1d724f10b9d797bd5d7834ccac4c465da37006416aa78260211 |
Provenance
File details
Details for the file antidote-0.12.1-cp37-cp37m-manylinux1_x86_64.whl
.
File metadata
- Download URL: antidote-0.12.1-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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9fea6d3697fbdff8c54be0b79d2c6b87d13a56a6cb3281a99360ba8f9ee4f908 |
|
MD5 | ff00d5dc20ead9ab0a6064ed4a578de3 |
|
BLAKE2b-256 | c65aed58680d3ff66820736e26857352e53dc23a21d6b52fe691c3acb0bdbdd3 |
Provenance
File details
Details for the file antidote-0.12.1-cp37-cp37m-manylinux1_i686.whl
.
File metadata
- Download URL: antidote-0.12.1-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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 908612f06c6edc4938aea1371aeaacd6121598060a4c65fe66f32a71000bdd1a |
|
MD5 | 06f437f6cdf5798a21e203461ad6995e |
|
BLAKE2b-256 | d74d197f43ae1241d6f302699a2645ec71f381a839b0b1e62bdd31e49ea76ba1 |
Provenance
File details
Details for the file antidote-0.12.1-cp36-cp36m-manylinux2014_x86_64.whl
.
File metadata
- Download URL: antidote-0.12.1-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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 95b07a25eb694a4da161ee5cd36ecfaac302813b3f2a1e4c95021044e25a1de7 |
|
MD5 | 17a9cf8c4a342786b3a1ca344938618d |
|
BLAKE2b-256 | 0cc75c89559e76f24426279dbe5a128f56d8638e2570e0f65c83589bf7ccdd9d |
Provenance
File details
Details for the file antidote-0.12.1-cp36-cp36m-manylinux2014_i686.whl
.
File metadata
- Download URL: antidote-0.12.1-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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 27f5c90285935f73d90eac5983b5dbdf039b66b4c10956a489399d8420650a90 |
|
MD5 | 59f9692c368dfb213be567bff1a19a10 |
|
BLAKE2b-256 | ccceac59f202759322a5ea9a12cf8e3869e0d5a349708da4016f11932d332499 |
Provenance
File details
Details for the file antidote-0.12.1-cp36-cp36m-manylinux2010_x86_64.whl
.
File metadata
- Download URL: antidote-0.12.1-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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 58f54b893322fd066cf6d2db6f6f1dbd9efaf62a37badaf0eafb014307e18a15 |
|
MD5 | 6cfcd137996cbcfe6935b1e28fdda3aa |
|
BLAKE2b-256 | e2f74dd69d61dc0d613fbb50f2ef722ab26692e33e640c434d3634dd54e45258 |
Provenance
File details
Details for the file antidote-0.12.1-cp36-cp36m-manylinux1_x86_64.whl
.
File metadata
- Download URL: antidote-0.12.1-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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 2d355456733ffbd17b90d476297926256a4b2ebae4bf16e8025ac085e20863df |
|
MD5 | ec19c3a51ad827dc109e816c9e419aee |
|
BLAKE2b-256 | 0a70494820d0870a05833be0567b4f95199f881bfe74e8631905f68721e14b2b |
Provenance
File details
Details for the file antidote-0.12.1-cp36-cp36m-manylinux1_i686.whl
.
File metadata
- Download URL: antidote-0.12.1-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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 5f6ea74dd4749ca7490cfba4c551c2c488b756aef0e35a0ac75f472753b42ae7 |
|
MD5 | bccb9deb196b01464ec4e855ed427f95 |
|
BLAKE2b-256 | 78dbbc449f549bb5df7f776c308a63f0957b453d6d68f70669b393350934d125 |