Dependency injection.
Project description
Antidotes is a dependency injection micro-framework for Python 3.6+. It is designed on two core ideas:
Keep dependency declaration close to the actual code as it’s deeply related. Dependency injection is about removing the responsibility of building dependencies from their clients. Not separating how a dependency is built from its implementation.
It should help creating maintainable code in a straightforward way and offer effortless integration. One must be able to integrate it partially.
It provides the following features:
- Ease of use
injection anywhere you need through a decorator @inject, be it static methods, functions, etc.. By default it will only rely on type hints, but it supports a lot more !
no **kwargs arguments hiding actual arguments and fully mypy typed, helping you and your IDE.
documented, see https://antidote.readthedocs.io/en/stable. If you don’t find what you need, open an issue ;)
thread-safe, cycle detection
- Flexibility
A rich ecosystem of dependencies out of the box: services, configuration, factories, interface/implementation, tags.
All of those are implemented on top of the core implementation. If Antidote doesn’t provide what you need, there’s a good chance you can implement it yourself quickly.
- Maintainability
The different kind of dependencies are designed to be easy to track back. Finding where a dependency is defined is easy.
Overriding dependencies (duplicates) and injecting twice will raise an exception.
Dependencies can be frozen, which blocks any new definitions.
- Testability
@inject lets you override any injections by passing explicitly the arguments.
Change dependencies locally within a context manager.
- Performance
Antidote has two implementations: the pure Python one which is the reference and the Cython one which is heavily tuned for fast injection. Injection is roughly 10x times faster than with the pure Python. It allows using injections without impact on most functions. See injection benchmark
Installation
To install Antidote, simply run this command:
pip install antidote
Quick Start
How does injection looks like ? Here is a simple example:
from antidote import inject, Service, Constants, const, world
class Conf(Constants):
DB_HOST = const[str]('host')
DB_HOST_UNTYPED = const('host')
def __init__(self):
self._data = {'host': 'localhost:6789'}
# Used to retrieve lazily the const, so injecting Conf.DB_HOST is equivalent
# Conf().get('host')
def get(self, key: str):
return self._data[key]
class Database(Service): # Defined as a Service, so injectable.
@inject(dependencies=dict(host=Conf.DB_HOST))
def __init__(self, host: str):
self._host = host # <=> Conf().get('host')
@inject # By default only type annotations are used.
def f(db: Database = None):
# Defaulting to None allows for MyPy compatibility but isn't required to work.
assert db is not None
pass
f() # Service will be automatically injected if not provided
f(Database('localhost:6789')) # but you can still use the function normally
# You can also retrieve dependencies by hand
world.get(Conf.DB_HOST)
world.get[str](Conf.DB_HOST) # with type hint
# if the dependency is the type itself, you may omit it:
world.get[Database]()
# If you need to handle multiple different host for some reason you can
# specify them in the dependency itself. As Database returns, by default,
# a singleton this will also be the case here. Using the same host, will
# return the same instance.
world.get[Database](Database.with_kwargs(host='XX'))
Want more ? Here is an over-engineered example to showcase a lot more features:
"""
Simple example where a MovieDB interface is defined which can be used
to retrieve the best movies. In our case the implementation uses IMDB
to dot it.
"""
from antidote import Constants, factory, Implementation, inject, world, const
class MovieDB:
""" Interface """
def get_best_movies(self):
pass
class ImdbAPI:
""" Class from an external library. """
def __init__(self, *args, **kwargs):
pass
world.singletons.add('conf_path', '/etc/app.conf')
class Conf(Constants):
IMDB_HOST = const[str]('imdb.host')
# Constants will by default automatically enforce the cast to int,
# float and str. Can be removed or extended to support Enums.
IMDB_PORT = const[int]('imdb.port')
IMDB_API_KEY = const[str]('imdb.api_key')
@inject(use_names=True) # injecting world.get('conf_path')
def __init__(self, conf_path: str):
""" Load configuration from `conf_path` """
self._raw_conf = {
'imdb': {
'host': 'dummy_host',
'api_key': 'dummy_api_key',
'port': '80'
}
}
def get(self, key: str):
from functools import reduce
# self.get('a.b') <=> self._raw_conf['a']['b']
return reduce(dict.get, key.split('.'), self._raw_conf) # type: ignore
# Provides ImdbAPI, as defined by the return type annotation.
@factory(dependencies=(Conf.IMDB_HOST, Conf.IMDB_PORT, Conf.IMDB_API_KEY))
def imdb_factory(host: str, port: int, api_key: str) -> ImdbAPI:
# Here host = Conf().get('imdb.host')
return ImdbAPI(host=host, port=port, api_key=api_key)
# When requesting MovieDB, a IMDBMovieDB instance will be provided.
class IMDBMovieDB(MovieDB, Implementation):
# New instance each time
__antidote__ = Implementation.Conf(singleton=False)
@inject(dependencies={'imdb_api': ImdbAPI @ imdb_factory})
def __init__(self, imdb_api: ImdbAPI):
self._imdb_api = imdb_api
def get_best_movies(self):
pass
@inject
def f(movie_db: MovieDB = None):
assert movie_db is not None # for Mypy
pass
f()
That looks all good, but what about testability ?
# You can still explicitly pass the arguments to override
# injection.
conf = Conf('/path')
f(IMDBMovieDB(imdb_factory(
# The class attributes will retrieve the actual value when called on a instance.
# Hence this is equivalent to conf.get('imdb.host'), making your tests easier.
host=conf.IMDB_HOST,
port=conf.IMDB_PORT,
api_key=conf.IMDB_API_KEY, # <=> conf.get('imdb.api_key')
)))
# When testing you can also override locally some dependencies:
with world.test.clone(overridable=True, keep_singletons=True):
world.test.override.singleton({
Conf.IMDB_HOST: 'other host'
})
f()
If you ever need to debug your dependency injections, Antidote also provides a tool to have a quick summary of what is actually going on. This would be especially helpful if you encounter cyclic dependencies for example.
world.debug(f)
# will output:
"""
f
└── Static link: MovieDB -> IMDBMovieDB
└── IMDBMovieDB
└── ImdbAPI @ imdb_factory
└── imdb_factory
├── Const: Conf.IMDB_API_KEY
│ └── Lazy: Conf() #0BjHAQ
│ └── Singleton 'conf_path' -> '/...'
├── Const: Conf.IMDB_HOST
│ └── Lazy: Conf() #0BjHAQ
│ └── Singleton 'conf_path' -> '/...'
└── Const: Conf.IMDB_PORT
└── Lazy: Conf() #0BjHAQ
└── Singleton 'conf_path' -> '/...'
"""
# For example suppose we don't have the singleton `'conf_path'`
with world.test.clone(keep_singletons=False):
world.debug(f)
# As you can see, 'conf_path` is not found. Hence when Conf will be instantiated
# it will fail.
"""
f
└── Static link: MovieDB -> IMDBMovieDB
└── IMDBMovieDB
└── ImdbAPI @ imdb_factory
└── imdb_factory
├── Const: Conf.IMDB_API_KEY
│ └── Lazy: Conf() #0BjHAQ
│ └── /!\\ Unknown: 'conf_path'
├── Const: Conf.IMDB_HOST
│ └── Lazy: Conf() #0BjHAQ
│ └── /!\\ Unknown: 'conf_path'
└── Const: Conf.IMDB_PORT
└── Lazy: Conf() #0BjHAQ
└── /!\\ Unknown: 'conf_path'
"""
Hooked ? Check out the documentation ! There are still features not presented here !
Cython
The cython implementation is roughly 10x faster than the Python one and strictly follows the same API than the pure Python implementation. This implies that you cannot depend on it in your own Cython code if any. It may be moved to another language.
If you encounter any inconsistencies, please open an issue ! You can avoid the Cython version from PyPI with the following:
pip install --no-binary antidote
Note that PyPy is tested with the pure Python version, not the Cython one.
Mypy
Antidote passes the strict Mypy check and exposes its type information (PEP 561).
Unfortunately static typing for decorators is limited to simple cases, hence Antidote @inject
will just
return the same signature from Mypys point of view. The best way, currently that I know of, is to
define arguments as optional as shown below:
from antidote import inject, Service
class MyService(Service):
pass
@inject
def f(my_service: MyService = None) -> MyService:
# We never expect it to be None, but it Mypy will now
# understand that my_service may not be provided.
assert my_service is not None
return my_service
s: MyService = f()
# You can also overload the function, if you want a more accurate type definition:
from typing import overload
@overload
def g(my_service: MyService) -> MyService: ...
@overload
def g() -> MyService: ...
@inject
def g(my_service: MyService = None) -> MyService:
assert my_service is not None
return my_service
s2: MyService = g()
Note that any of this is only necessary if you’re calling _explicitly_ the function, if only
instantiate MyService
through Antidote for example, you won’t need this for its
__init__()
function typically. You could also use a Protocol
to define
a different signature, but it’s more complex.
Issues / Feature Requests / Questions
Feel free to open an issue on Github for questions, requests or issues ! ;)
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).
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.10.0.tar.gz
.
File metadata
- Download URL: antidote-0.10.0.tar.gz
- Upload date:
- Size: 118.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.6.11
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | f18f8f3c925ab3e87f5625dccc5e37b17d346873bff6619fd96e1975f3d170bd |
|
MD5 | 725437ef523effc1564bfe24a1bdc3ff |
|
BLAKE2b-256 | d43dfc2ab232acb617c94081ec7aff9396817c2c36c19d27243c5072dbb8c6a1 |
Provenance
File details
Details for the file antidote-0.10.0-cp39-cp39-manylinux2014_x86_64.whl
.
File metadata
- Download URL: antidote-0.10.0-cp39-cp39-manylinux2014_x86_64.whl
- Upload date:
- Size: 2.0 MB
- Tags: CPython 3.9
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.6.11
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 37ca429c457d5d202ca0c863e21c45b614d38954a99434e1514953583a96abd3 |
|
MD5 | 2acb9aef770dbb55a2643725db12fc0d |
|
BLAKE2b-256 | 2569bf5cac266fe5cb0b00124b3d4f2f74bacaafd1694768bbd10a9e75628530 |
Provenance
File details
Details for the file antidote-0.10.0-cp39-cp39-manylinux2014_i686.whl
.
File metadata
- Download URL: antidote-0.10.0-cp39-cp39-manylinux2014_i686.whl
- Upload date:
- Size: 1.9 MB
- Tags: CPython 3.9
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.6.11
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1bd7b891a4c1eb640dba4d06cdfb72c3d66816aad90121ae31b40a95fa4750a3 |
|
MD5 | f718bd6acbde0692af4be3d55e8e15a3 |
|
BLAKE2b-256 | 18e5a7f48eb3f1e9f450951c01abdb5d307f2f4b5869defd64dc6339c1c941d6 |
Provenance
File details
Details for the file antidote-0.10.0-cp39-cp39-manylinux2010_x86_64.whl
.
File metadata
- Download URL: antidote-0.10.0-cp39-cp39-manylinux2010_x86_64.whl
- Upload date:
- Size: 1.9 MB
- Tags: CPython 3.9, manylinux: glibc 2.12+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.6.11
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | e655f28cffa15c42a5d876b51ab8e7b687aefdc1981e3fded7c096166dde1d43 |
|
MD5 | 6786b6f25a21678ce489488b9031a542 |
|
BLAKE2b-256 | 02efd8380f3eb0cab20d53384251abd72714451c20b38d9ae35e0f0e62fd9943 |
Provenance
File details
Details for the file antidote-0.10.0-cp39-cp39-manylinux1_x86_64.whl
.
File metadata
- Download URL: antidote-0.10.0-cp39-cp39-manylinux1_x86_64.whl
- Upload date:
- Size: 1.9 MB
- Tags: CPython 3.9
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.6.11
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 47015d65294569df3a90f6adbd815120474315af4c5cb9b5eb20cdd26294223b |
|
MD5 | 9cb320df54f25918902111b777d732ec |
|
BLAKE2b-256 | cc89061f3854af8193f6f461708f0c969c148a216fb71b06d514ee60441c5ffc |
Provenance
File details
Details for the file antidote-0.10.0-cp39-cp39-manylinux1_i686.whl
.
File metadata
- Download URL: antidote-0.10.0-cp39-cp39-manylinux1_i686.whl
- Upload date:
- Size: 1.9 MB
- Tags: CPython 3.9
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.6.11
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3c49c5d6316b723172c654919bf7ed6f3bbb861955fda6779d5e13597c07af40 |
|
MD5 | dabacc6efbcb2d2a971b1f0fecec10f9 |
|
BLAKE2b-256 | 5f3e4ec4428497d21c66947cbbce15457a510e54dade9a7abbd4847c6eb6a367 |
Provenance
File details
Details for the file antidote-0.10.0-cp38-cp38-manylinux2014_x86_64.whl
.
File metadata
- Download URL: antidote-0.10.0-cp38-cp38-manylinux2014_x86_64.whl
- Upload date:
- Size: 2.2 MB
- Tags: CPython 3.8
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.6.11
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | cf79d7072d4011aebd84ce30a51a3ce268f3ea8119099b05b9a733e2da3e45c4 |
|
MD5 | 553e4570235760d6d589b49a4f9f1acf |
|
BLAKE2b-256 | 544fc49c25ea3e71d000491ee82acb8920aae79e84e17992ef55219b31ade952 |
Provenance
File details
Details for the file antidote-0.10.0-cp38-cp38-manylinux2014_i686.whl
.
File metadata
- Download URL: antidote-0.10.0-cp38-cp38-manylinux2014_i686.whl
- Upload date:
- Size: 2.1 MB
- Tags: CPython 3.8
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.6.11
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | ce4336f7ec44a17b51afd26f248fbe2c07baef7610fad5e57f1ca1e725e85f91 |
|
MD5 | a95d268e37feac2a02e8eac528978938 |
|
BLAKE2b-256 | 91d92622a1fd6cd3d9540c10935dbd2d95a3394b5270a5553bb8759e69d410a3 |
Provenance
File details
Details for the file antidote-0.10.0-cp38-cp38-manylinux2010_x86_64.whl
.
File metadata
- Download URL: antidote-0.10.0-cp38-cp38-manylinux2010_x86_64.whl
- Upload date:
- Size: 2.0 MB
- Tags: CPython 3.8, manylinux: glibc 2.12+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.6.11
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4a9dc47b2ab0b97271bd78c9ea2e377867199b02bf9ab0a7e962a10b384637e1 |
|
MD5 | 22d64951a98ba71d8758f85e6a6d0978 |
|
BLAKE2b-256 | c85613f34874040930935e05f3cde2e1cf8218c2b3d93092c31d84ff1d5b05ea |
Provenance
File details
Details for the file antidote-0.10.0-cp38-cp38-manylinux1_x86_64.whl
.
File metadata
- Download URL: antidote-0.10.0-cp38-cp38-manylinux1_x86_64.whl
- Upload date:
- Size: 2.0 MB
- Tags: CPython 3.8
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.6.11
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | cb0980fa0689004c8db2ebc86bf8c1fd6e8a846423f63435d01e4a89bd533f05 |
|
MD5 | 051e67a78928d113016de1ed4687b0f0 |
|
BLAKE2b-256 | 264a280d8032cca489596410897b62543cc80104afe4ad936e3368d9dfa7a881 |
Provenance
File details
Details for the file antidote-0.10.0-cp38-cp38-manylinux1_i686.whl
.
File metadata
- Download URL: antidote-0.10.0-cp38-cp38-manylinux1_i686.whl
- Upload date:
- Size: 2.1 MB
- Tags: CPython 3.8
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.6.11
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 84650060c94c6e94fd614a95bead8b94c7aa02b333889883f7c968df7fa17140 |
|
MD5 | 293129ffbc43016b579a6e01d64975ff |
|
BLAKE2b-256 | 6a905cba4ce8a323786c37214aa89fd8650ba67f78ccc00dd62e9c431d3f4d18 |
Provenance
File details
Details for the file antidote-0.10.0-cp37-cp37m-manylinux2014_x86_64.whl
.
File metadata
- Download URL: antidote-0.10.0-cp37-cp37m-manylinux2014_x86_64.whl
- Upload date:
- Size: 1.9 MB
- Tags: CPython 3.7m
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.6.11
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | d819ffc8e73e0854b042f3fcb0ef972a7b15da378725fb635f8d01f2f1983e95 |
|
MD5 | 55661faa22e0ba6475cfe98e931f0e14 |
|
BLAKE2b-256 | 0aa0ce32b4a5ed8f3468fbf2a8367ce6cbe0d13618cb06b6417d8e92e2fcd806 |
Provenance
File details
Details for the file antidote-0.10.0-cp37-cp37m-manylinux2014_i686.whl
.
File metadata
- Download URL: antidote-0.10.0-cp37-cp37m-manylinux2014_i686.whl
- Upload date:
- Size: 1.8 MB
- Tags: CPython 3.7m
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.6.11
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 20a87ced05829a5ae40432ae3c7fa0bbbab28ac3ddbcad7edb8bd2090f1ae6a8 |
|
MD5 | 5893a4527f202933c3239d971e28fc3f |
|
BLAKE2b-256 | 9cc57caae079ad435cc26a3755c4eb7bde6ba9a0b104f5025cbebb2923cd8185 |
Provenance
File details
Details for the file antidote-0.10.0-cp37-cp37m-manylinux2010_x86_64.whl
.
File metadata
- Download URL: antidote-0.10.0-cp37-cp37m-manylinux2010_x86_64.whl
- Upload date:
- Size: 1.7 MB
- Tags: CPython 3.7m, manylinux: glibc 2.12+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.6.11
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 86f8214da1d3c0df42f4d1483fcd47e569ba08d30630e0235e8c048bacc52165 |
|
MD5 | 5c73c15cc1570d4f64893ba8e242fa89 |
|
BLAKE2b-256 | f456c0f55e78aee8392d11399b75ac1e50b24501930b297923455e3b02b5cd8c |
Provenance
File details
Details for the file antidote-0.10.0-cp37-cp37m-manylinux1_x86_64.whl
.
File metadata
- Download URL: antidote-0.10.0-cp37-cp37m-manylinux1_x86_64.whl
- Upload date:
- Size: 1.7 MB
- Tags: CPython 3.7m
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.6.11
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3cdd6d1e5703259ec2a33c55970f2910e8f392be9ec62e90e6cff794f05f00e3 |
|
MD5 | 6af001e12244cd067102cc4b11e58dae |
|
BLAKE2b-256 | c55c4df2f856a5287177354c95f1e52be5417fcbabf50e114eaa0be7f1ebf58c |
Provenance
File details
Details for the file antidote-0.10.0-cp37-cp37m-manylinux1_i686.whl
.
File metadata
- Download URL: antidote-0.10.0-cp37-cp37m-manylinux1_i686.whl
- Upload date:
- Size: 1.8 MB
- Tags: CPython 3.7m
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.6.11
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 52440ef8ef15319d6d6fd53737269f2a0d427422be9433fc42cc8932e2ba473e |
|
MD5 | ab87e9fcdad24363171d293f72b3403e |
|
BLAKE2b-256 | e6a64e2fcae4297d2ff5e20cc955baa1db101a74e58710c18a77e2d2acf3e9c1 |
Provenance
File details
Details for the file antidote-0.10.0-cp36-cp36m-manylinux2014_x86_64.whl
.
File metadata
- Download URL: antidote-0.10.0-cp36-cp36m-manylinux2014_x86_64.whl
- Upload date:
- Size: 1.8 MB
- Tags: CPython 3.6m
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.6.11
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | b39842fb92fac9bbf0b33192a8da60def034ffb5ffe689182d4ebde1d7093346 |
|
MD5 | ac5fbb5b5e8ce9c05bc24c1e2904acc6 |
|
BLAKE2b-256 | 38255ed14cb68801bb7e8c5a96a7860575887c42802b30f68756587fdecbbc84 |
Provenance
File details
Details for the file antidote-0.10.0-cp36-cp36m-manylinux2014_i686.whl
.
File metadata
- Download URL: antidote-0.10.0-cp36-cp36m-manylinux2014_i686.whl
- Upload date:
- Size: 1.8 MB
- Tags: CPython 3.6m
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.6.11
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | f3a0b308e5a5dc03ba9faf1fd32a3454ee38ff5ec85cd8377ac1c096b9116886 |
|
MD5 | 9869ac6e50c0d8c8864e9d2a33922bae |
|
BLAKE2b-256 | a4f77990c2d72457e59966880e24f638ab206123921349dd9d578ac1d35fbdc3 |
Provenance
File details
Details for the file antidote-0.10.0-cp36-cp36m-manylinux2010_x86_64.whl
.
File metadata
- Download URL: antidote-0.10.0-cp36-cp36m-manylinux2010_x86_64.whl
- Upload date:
- Size: 1.7 MB
- Tags: CPython 3.6m, manylinux: glibc 2.12+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.6.11
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | fe3885144dedf41a6c24a4545b802a78443ef46cf5e1baeae81426884b5b9f5f |
|
MD5 | cc8eda4109669ee373aceaf382ad9de4 |
|
BLAKE2b-256 | b0d7b949bdac1353fe0271834e2769fa5fa6cc9af5f7aab413209479c939847b |
Provenance
File details
Details for the file antidote-0.10.0-cp36-cp36m-manylinux1_x86_64.whl
.
File metadata
- Download URL: antidote-0.10.0-cp36-cp36m-manylinux1_x86_64.whl
- Upload date:
- Size: 1.7 MB
- Tags: CPython 3.6m
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.6.11
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8b571051c6d4325e47e8f672c7c48e1d6b0731d2a6e35f1c0fc2e78f7d158f8f |
|
MD5 | b20fd25e3ef7768ef64912ad863a7bcb |
|
BLAKE2b-256 | 9321f06836a5aa3b7d20226f7fcb96481a29c1af04e3654d5f9f96ebe58e9488 |
Provenance
File details
Details for the file antidote-0.10.0-cp36-cp36m-manylinux1_i686.whl
.
File metadata
- Download URL: antidote-0.10.0-cp36-cp36m-manylinux1_i686.whl
- Upload date:
- Size: 1.8 MB
- Tags: CPython 3.6m
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.6.11
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1bb67e5cb8bc7ef6083acebd78b6572789ad53d729d5e30aedf2457df4ed01a6 |
|
MD5 | 0da0ccd9f66a51f0148c70041aec51be |
|
BLAKE2b-256 | 5aa7981a07a205cb4e79460870064e8c0d56ae56d2c2049898fb79d65499f6a9 |