# Althaia
[![PyPI Version](https://badgen.net/pypi/v/althaia)](https://pypi.org/project/althaia/)
[![License](https://badgen.net/pypi/license/althaia)](https://pypi.org/project/althaia/)
[![PyPI Python](https://badgen.net/pypi/python/althaia)](https://pypi.org/project/althaia/)
[![Downloads](https://pepy.tech/badge/althaia)](https://pepy.tech/project/althaia)
Althaia: _from Latin althaea, from Greek althaia - marsh mallow (literally: healing plant), from Greek althein to heal_
## What is it?
Althaia is a very simple fork of [marshmallow][], with patches to improve the performance when dumping large sets
of data. It is then also compiled via [cython][] for some extra performance boost. Ideally, these patches will
one day find their way into the upstream marshmallow in some cleaner form, and this package will become obsolete.
## How does it work?
During the serialization process, marshmallow repeats a lot of lookup operations for each object it's attempting to
serialize, even though these values never change during the single execution. The main patch in this repo is
basically reading those values once and creating a serializer function, which is much more performant on large
data sets.
The entire thing is then compiled into C extension modules and released only as binary wheels.
Check out the original [upstream PR][] for some discussion, or my [original announcement][dsi-announcement].
## How fast is it?
It really depends on your data and usage, but using the `benchmark.py` test from the upstream marshmallow repo,
Althaia seems to shave off some ~30% of execution time on average. These values are an example test run results
from the upstream benchmark:
| Upstream(usec/dump) | Althaia(usec/dump) | Improvement(%) |
|--------------------:|-------------------:|---------------:|
| 374.64 | 258.61 | -30.97 |
| 19189.83 | 13275.84 | -30.81 |
| 396368.67 | 275365.67 | -30.52 |
| 198163.58 | 133714.07 | -32.52 |
The table is the result of the following commands:
python performance/benchmark.py
python performance/benchmark.py --object-count 1000
python performance/benchmark.py --iterations=5 --repeat=5 --object-count 20000
python performance/benchmark.py --iterations=10 --repeat=10 --object-count 10000
They are also available in this repo as `poetry run task upstream-performance`. Note that you may get different
results while running the benchmarks (the numbers above were obtained with Althaia v3.20.1, generally speaking you
should be getting better results with newer versions, but sometimes not).
Contribution into the [serialization benchmark][] is in the works (update: [stalled][serialization-stalled]), but
local run seems to be almost comparable to [Toasted Marshmallow][], which is stuck on an old marshmallow 2.x branch.
This means that Althaia gives you (almost) the speed of Toasted Marshmallow, with all the goodies of the latest
marshmallow.
| Library | Many Objects (seconds) | One Object (seconds) | Relative |
| -------------------- | ----------------------- | ------------------- | ---------- |
| serpyco | 0.00767612 | 0.00389147 | 1 |
| Custom | 0.00965786 | 0.00467634 | 1.23917 |
| lima | 0.0116959 | 0.00583649 | 1.51564 |
| Pickle | 0.0137603 | 0.0136833 | 2.37246 |
| serpy | 0.0352728 | 0.0181508 | 4.61839 |
| Strainer | 0.0516005 | 0.0260506 | 6.71281 |
| Toasted Marshmallow | 0.076792 | 0.0412786 | 10.207 |
| **Althaia** | **0.101892** | **0.0484211** | **12.9943** |
| Colander | 0.208514 | 0.105719 | 27.1649 |
| Avro | 0.303786 | 0.151184 | 39.3314 |
| Lollipop | 0.352331 | 0.173141 | 45.4262 |
| Marshmallow | 0.531636 | 0.276243 | 69.8398 |
| Django REST Framework | 0.531175 | 0.387527 | 79.4203 |
| kim | 0.669759 | 0.336132 | 86.9576 |
## Installation
```bash
pip install althaia
```
**NOTE**: This is still a work in progress and a wheel may not be available for your platform yet. PRs welcome!
## Usage
There are two ways to use Althaia: as a standalone package, or as a drop-in replacement for marshmallow.
Latter method is the recommended one. Add the following code as early as possible in your app bootstrap:
```python
import althaia
althaia.patch()
```
This will install a Python meta path importer which will mimic marshmallow for the rest of your project, without any
changes to the codebase, i.e. `import marshmallow` will work as expected. If and when this package becomes obsolete,
there will be no need to change the rest of your source to revert to upstream marshmallow.
Alternatively, you can use Althaia directly:
```python
from althaia import marshmallow
# or, e.g.
from althaia.marshmallow import Schema
```
Though I'm not sure why one would do that.
> Obviously, for all _actual_ usage of marshmallow, you should always refer to the excellent [marshmallow docs][].
## Bugs & Contributing
If there are bugs, please make sure they are not upstream marshmallow bugs before reporting them. Since the patches
applied are picking apart some of the marshmallow internals, any breakage should be immediately visible, and the
chances are that most bugs _will_ be upstream bugs.
Contributing [manylinux][] builds for the CI pipeline is most welcome.
**When opening pull requests, please target the `develop` branch by default.**
If you have any other ideas on how to tweak the performance, feel free to contribute in any way you can!
## Versioning & Releases
Althaia will always follow the upstream version of marshmallow to reduce confusion. In other words, Althaia version
`X.Y.Z` will use marshmallow version `X.Y.Z`.
Additionally, if it comes to some changes on Althaia side (repo structure, build process, bugfixes),
PEP440 will be followed and will be released either as alpha, beta, rc (`X.Y.ZaN`, `X.Y.ZbN`, `X.Y.ZrcN`) if there is
still no change in the upstream dependency, or post-releases (`X.Y.ZpostN`). Since bugfixing is discouraged for
post-releases, there may also be a hotfix release as `X.Y.Z.N`, where `N` is the hotfix version.
`dev` releases may appear on test PyPI (`X.Y.Z.devN`), but these are not relevant to the general public.
There will obviously be some delay between marshmallow and Althaia releases, and it is inevitable that I will get
sloppy over time, so feel free to create a GitHub issue if you need an urgent update to latest marshmallow.
## Developing
Althaia is using [Poetry][] with a custom build script, and some [taskipy][] scripts to facilitate things.
You can see them defined in `pyproject.toml`, or just type `poetry run task --list`.
Preparing a new version TL;DR:
* Edit `pyproject.toml` and change the version of the packages for upstream marshmallow and Althaia itself.
* Run `poetry run task version-check`.
* Run `poetry run task build`.
* Run `poetry run task upstream-test`.
* [Optional] Run `poetry run task upstream-performance`.
* [Optional] Inspect the wheel content with `poetry run task inspect`.
* Run `poetry run task publish-test` to deploy to test PyPI.
## Known Issues
* If you have any marshmallow warnings ignored in your `pytest.ini`, i.e. you have `filterwarnings` set up
to ignore an error starting with `marshmallow.warnings`, you will get an import error even if you're doing
`althaia.patch()` in your `conftest.py`. As a workaround, you can change it to start with
`althaia.marshmallow.warnings`. This happens because pytest is trying to import marshmallow before Althaia
gets a chance to patch the importer.
* Since althaia 3.20.1, the support for python3.7 and 3.8 has been dropped, unlike marshmallow which has dropped
support only for python3.7. The reason for this are massive changes in typing annotation starting from python3.9,
which are no longer supported by the recently released Cython 3.0.0. Maintaining patches for 3.8 and 3.9+
would be difficult without being a significant time sink. Since python3.8 is already in security-updates-only state,
it's much easier to just drop it.
[marshmallow]: https://github.com/marshmallow-code/marshmallow
[cython]: https://github.com/cython/cython
[upstream PR]: https://github.com/marshmallow-code/marshmallow/pull/1649
[serialization benchmark]: https://voidfiles.github.io/python-serialization-benchmark/
[serialization-stalled]: https://github.com/voidfiles/python-serialization-benchmark/issues/26
[Toasted Marshmallow]: https://github.com/lyft/toasted-marshmallow
[marshmallow docs]: https://marshmallow.readthedocs.io/en/stable/
[manylinux]: https://github.com/pypa/manylinux
[Poetry]: https://python-poetry.org/
[taskipy]: https://github.com/illBeRoy/taskipy
[dsi-announcement]: http://dsimidzija.github.io/posts/introducing-althaia-speedy-marshmallow-fork/
Raw data
{
"_id": null,
"home_page": "https://dsimidzija.github.io",
"name": "althaia",
"maintainer": "Dusko Simidzija",
"docs_url": null,
"requires_python": "<4.0,>=3.9",
"maintainer_email": "dusko.simidzija@gmail.com",
"keywords": "serialization, rest, json, api, marshal, marshalling, deserialization, validation, schema",
"author": "Dusko Simidzija",
"author_email": "dusko.simidzija@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/af/b6/283dad89ea981fb740b32c614cd2d1a8e284825e6528f784b22ba6cabd1d/althaia-3.21.1.tar.gz",
"platform": null,
"description": "# Althaia\n\n[![PyPI Version](https://badgen.net/pypi/v/althaia)](https://pypi.org/project/althaia/)\n[![License](https://badgen.net/pypi/license/althaia)](https://pypi.org/project/althaia/)\n[![PyPI Python](https://badgen.net/pypi/python/althaia)](https://pypi.org/project/althaia/)\n[![Downloads](https://pepy.tech/badge/althaia)](https://pepy.tech/project/althaia)\n\nAlthaia: _from Latin althaea, from Greek althaia - marsh mallow (literally: healing plant), from Greek althein to heal_\n\n## What is it?\n\nAlthaia is a very simple fork of [marshmallow][], with patches to improve the performance when dumping large sets\nof data. It is then also compiled via [cython][] for some extra performance boost. Ideally, these patches will\none day find their way into the upstream marshmallow in some cleaner form, and this package will become obsolete.\n\n## How does it work?\n\nDuring the serialization process, marshmallow repeats a lot of lookup operations for each object it's attempting to\nserialize, even though these values never change during the single execution. The main patch in this repo is\nbasically reading those values once and creating a serializer function, which is much more performant on large\ndata sets.\n\nThe entire thing is then compiled into C extension modules and released only as binary wheels.\n\nCheck out the original [upstream PR][] for some discussion, or my [original announcement][dsi-announcement].\n\n## How fast is it?\n\nIt really depends on your data and usage, but using the `benchmark.py` test from the upstream marshmallow repo,\nAlthaia seems to shave off some ~30% of execution time on average. These values are an example test run results\nfrom the upstream benchmark:\n\n| Upstream(usec/dump) | Althaia(usec/dump) | Improvement(%) |\n|--------------------:|-------------------:|---------------:|\n| 374.64 | 258.61 | -30.97 |\n| 19189.83 | 13275.84 | -30.81 |\n| 396368.67 | 275365.67 | -30.52 |\n| 198163.58 | 133714.07 | -32.52 |\n\nThe table is the result of the following commands:\n\n python performance/benchmark.py\n python performance/benchmark.py --object-count 1000\n python performance/benchmark.py --iterations=5 --repeat=5 --object-count 20000\n python performance/benchmark.py --iterations=10 --repeat=10 --object-count 10000\n\nThey are also available in this repo as `poetry run task upstream-performance`. Note that you may get different\nresults while running the benchmarks (the numbers above were obtained with Althaia v3.20.1, generally speaking you\nshould be getting better results with newer versions, but sometimes not).\n\nContribution into the [serialization benchmark][] is in the works (update: [stalled][serialization-stalled]), but\nlocal run seems to be almost comparable to [Toasted Marshmallow][], which is stuck on an old marshmallow 2.x branch.\nThis means that Althaia gives you (almost) the speed of Toasted Marshmallow, with all the goodies of the latest\nmarshmallow.\n\n| Library | Many Objects (seconds) | One Object (seconds) | Relative |\n| -------------------- | ----------------------- | ------------------- | ---------- |\n| serpyco | 0.00767612 | 0.00389147 | 1 |\n| Custom | 0.00965786 | 0.00467634 | 1.23917 |\n| lima | 0.0116959 | 0.00583649 | 1.51564 |\n| Pickle | 0.0137603 | 0.0136833 | 2.37246 |\n| serpy | 0.0352728 | 0.0181508 | 4.61839 |\n| Strainer | 0.0516005 | 0.0260506 | 6.71281 |\n| Toasted Marshmallow | 0.076792 | 0.0412786 | 10.207 |\n| **Althaia** | **0.101892** | **0.0484211** | **12.9943** |\n| Colander | 0.208514 | 0.105719 | 27.1649 |\n| Avro | 0.303786 | 0.151184 | 39.3314 |\n| Lollipop | 0.352331 | 0.173141 | 45.4262 |\n| Marshmallow | 0.531636 | 0.276243 | 69.8398 |\n| Django REST Framework | 0.531175 | 0.387527 | 79.4203 |\n| kim | 0.669759 | 0.336132 | 86.9576 |\n\n## Installation\n\n```bash\npip install althaia\n```\n\n**NOTE**: This is still a work in progress and a wheel may not be available for your platform yet. PRs welcome!\n\n## Usage\n\nThere are two ways to use Althaia: as a standalone package, or as a drop-in replacement for marshmallow.\nLatter method is the recommended one. Add the following code as early as possible in your app bootstrap:\n\n```python\nimport althaia\nalthaia.patch()\n```\n\nThis will install a Python meta path importer which will mimic marshmallow for the rest of your project, without any\nchanges to the codebase, i.e. `import marshmallow` will work as expected. If and when this package becomes obsolete,\nthere will be no need to change the rest of your source to revert to upstream marshmallow.\n\nAlternatively, you can use Althaia directly:\n\n```python\nfrom althaia import marshmallow\n# or, e.g.\nfrom althaia.marshmallow import Schema\n```\n\nThough I'm not sure why one would do that.\n\n> Obviously, for all _actual_ usage of marshmallow, you should always refer to the excellent [marshmallow docs][].\n\n## Bugs & Contributing\n\nIf there are bugs, please make sure they are not upstream marshmallow bugs before reporting them. Since the patches\napplied are picking apart some of the marshmallow internals, any breakage should be immediately visible, and the\nchances are that most bugs _will_ be upstream bugs.\n\nContributing [manylinux][] builds for the CI pipeline is most welcome.\n\n**When opening pull requests, please target the `develop` branch by default.**\n\nIf you have any other ideas on how to tweak the performance, feel free to contribute in any way you can!\n\n## Versioning & Releases\n\nAlthaia will always follow the upstream version of marshmallow to reduce confusion. In other words, Althaia version\n`X.Y.Z` will use marshmallow version `X.Y.Z`.\n\nAdditionally, if it comes to some changes on Althaia side (repo structure, build process, bugfixes),\nPEP440 will be followed and will be released either as alpha, beta, rc (`X.Y.ZaN`, `X.Y.ZbN`, `X.Y.ZrcN`) if there is\nstill no change in the upstream dependency, or post-releases (`X.Y.ZpostN`). Since bugfixing is discouraged for\npost-releases, there may also be a hotfix release as `X.Y.Z.N`, where `N` is the hotfix version.\n\n`dev` releases may appear on test PyPI (`X.Y.Z.devN`), but these are not relevant to the general public.\n\nThere will obviously be some delay between marshmallow and Althaia releases, and it is inevitable that I will get\nsloppy over time, so feel free to create a GitHub issue if you need an urgent update to latest marshmallow.\n\n## Developing\n\nAlthaia is using [Poetry][] with a custom build script, and some [taskipy][] scripts to facilitate things.\nYou can see them defined in `pyproject.toml`, or just type `poetry run task --list`.\n\nPreparing a new version TL;DR:\n\n* Edit `pyproject.toml` and change the version of the packages for upstream marshmallow and Althaia itself.\n* Run `poetry run task version-check`.\n* Run `poetry run task build`.\n* Run `poetry run task upstream-test`.\n* [Optional] Run `poetry run task upstream-performance`.\n* [Optional] Inspect the wheel content with `poetry run task inspect`.\n* Run `poetry run task publish-test` to deploy to test PyPI.\n\n## Known Issues\n\n* If you have any marshmallow warnings ignored in your `pytest.ini`, i.e. you have `filterwarnings` set up\n to ignore an error starting with `marshmallow.warnings`, you will get an import error even if you're doing\n `althaia.patch()` in your `conftest.py`. As a workaround, you can change it to start with\n `althaia.marshmallow.warnings`. This happens because pytest is trying to import marshmallow before Althaia\n gets a chance to patch the importer.\n* Since althaia 3.20.1, the support for python3.7 and 3.8 has been dropped, unlike marshmallow which has dropped\n support only for python3.7. The reason for this are massive changes in typing annotation starting from python3.9,\n which are no longer supported by the recently released Cython 3.0.0. Maintaining patches for 3.8 and 3.9+\n would be difficult without being a significant time sink. Since python3.8 is already in security-updates-only state,\n it's much easier to just drop it.\n\n[marshmallow]: https://github.com/marshmallow-code/marshmallow\n[cython]: https://github.com/cython/cython\n[upstream PR]: https://github.com/marshmallow-code/marshmallow/pull/1649\n[serialization benchmark]: https://voidfiles.github.io/python-serialization-benchmark/\n[serialization-stalled]: https://github.com/voidfiles/python-serialization-benchmark/issues/26\n[Toasted Marshmallow]: https://github.com/lyft/toasted-marshmallow\n[marshmallow docs]: https://marshmallow.readthedocs.io/en/stable/\n[manylinux]: https://github.com/pypa/manylinux\n[Poetry]: https://python-poetry.org/\n[taskipy]: https://github.com/illBeRoy/taskipy\n[dsi-announcement]: http://dsimidzija.github.io/posts/introducing-althaia-speedy-marshmallow-fork/\n\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Marshmallow fork optimized for dumping speed.",
"version": "3.21.1",
"project_urls": {
"Homepage": "https://dsimidzija.github.io",
"Repository": "https://github.com/dsimidzija/python-althaia"
},
"split_keywords": [
"serialization",
" rest",
" json",
" api",
" marshal",
" marshalling",
" deserialization",
" validation",
" schema"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "2835e4c13a030d460ee8dd588d461a3d0dbddde38e53b00c45528b54553f52bc",
"md5": "a50cbc5e4100e4e8d5466e71d2dee550",
"sha256": "d47f9e799330291692d0a3db2d3b3d7fbbcd0186497e3b1953075d7651f467ef"
},
"downloads": -1,
"filename": "althaia-3.21.1-cp310-cp310-macosx_11_0_x86_64.whl",
"has_sig": false,
"md5_digest": "a50cbc5e4100e4e8d5466e71d2dee550",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": "<4.0,>=3.9",
"size": 970196,
"upload_time": "2024-04-10T00:12:02",
"upload_time_iso_8601": "2024-04-10T00:12:02.600021Z",
"url": "https://files.pythonhosted.org/packages/28/35/e4c13a030d460ee8dd588d461a3d0dbddde38e53b00c45528b54553f52bc/althaia-3.21.1-cp310-cp310-macosx_11_0_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "9fc2bfa5918c18c914fa559540e345d5405d0945c7b2727768dbf5021e45136c",
"md5": "50313d729838b7d2b6932f8974514588",
"sha256": "07459660d4a4bc60ddc615f8e741f17fdf4135641e7b0316d2b6b6dfa452198f"
},
"downloads": -1,
"filename": "althaia-3.21.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "50313d729838b7d2b6932f8974514588",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": "<4.0,>=3.9",
"size": 1035826,
"upload_time": "2024-04-10T00:12:14",
"upload_time_iso_8601": "2024-04-10T00:12:14.418564Z",
"url": "https://files.pythonhosted.org/packages/9f/c2/bfa5918c18c914fa559540e345d5405d0945c7b2727768dbf5021e45136c/althaia-3.21.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "9f012760d8297edfd0b75322d18c167e1473650e9ec5f264016f0cd1a8137dbf",
"md5": "8f6fb5b4b0a9b7b742182271fbe41e23",
"sha256": "fafbf8ed2e07b24071082d2a4c25bc006cef5f829e66a511b3a60752b77fa30b"
},
"downloads": -1,
"filename": "althaia-3.21.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "8f6fb5b4b0a9b7b742182271fbe41e23",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": "<4.0,>=3.9",
"size": 1095313,
"upload_time": "2024-04-10T00:12:16",
"upload_time_iso_8601": "2024-04-10T00:12:16.565298Z",
"url": "https://files.pythonhosted.org/packages/9f/01/2760d8297edfd0b75322d18c167e1473650e9ec5f264016f0cd1a8137dbf/althaia-3.21.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "e7b089ab383bf19b9648e8307141770c618f0b127b0a53269a0de150245a964a",
"md5": "3def15c11bb76a942338c487a08748f7",
"sha256": "555c8bfce6b8c241ec64418ce7ac7f6f3001c02f0563039ed036842d2042d311"
},
"downloads": -1,
"filename": "althaia-3.21.1-cp310-cp310-musllinux_1_1_aarch64.whl",
"has_sig": false,
"md5_digest": "3def15c11bb76a942338c487a08748f7",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": "<4.0,>=3.9",
"size": 1036745,
"upload_time": "2024-04-10T00:12:18",
"upload_time_iso_8601": "2024-04-10T00:12:18.784720Z",
"url": "https://files.pythonhosted.org/packages/e7/b0/89ab383bf19b9648e8307141770c618f0b127b0a53269a0de150245a964a/althaia-3.21.1-cp310-cp310-musllinux_1_1_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "77abd543939e86ae1086f785fcee1f02fdf75019583e2aa09f3146ab3ec603b5",
"md5": "39a49cfd58f930838e24a56df4e01103",
"sha256": "5aac87b198c4f23dae43e7400c8e86489998a48fa41dce89d61d91fc48399613"
},
"downloads": -1,
"filename": "althaia-3.21.1-cp310-cp310-musllinux_1_1_x86_64.whl",
"has_sig": false,
"md5_digest": "39a49cfd58f930838e24a56df4e01103",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": "<4.0,>=3.9",
"size": 1104324,
"upload_time": "2024-04-10T00:12:20",
"upload_time_iso_8601": "2024-04-10T00:12:20.952008Z",
"url": "https://files.pythonhosted.org/packages/77/ab/d543939e86ae1086f785fcee1f02fdf75019583e2aa09f3146ab3ec603b5/althaia-3.21.1-cp310-cp310-musllinux_1_1_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "721bc3341f729c3b2ef5665b26fe5f9eda4e662e9ee0b2599d717ec59be9751d",
"md5": "a5f6827228a7bfd6e0ccbee499d49419",
"sha256": "977133010dfb5cf81ae53a4f82591fd757bef4918ea4850ee2c242c2de4243b3"
},
"downloads": -1,
"filename": "althaia-3.21.1-cp310-cp310-win_amd64.whl",
"has_sig": false,
"md5_digest": "a5f6827228a7bfd6e0ccbee499d49419",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": "<4.0,>=3.9",
"size": 781820,
"upload_time": "2024-04-10T00:12:23",
"upload_time_iso_8601": "2024-04-10T00:12:23.022234Z",
"url": "https://files.pythonhosted.org/packages/72/1b/c3341f729c3b2ef5665b26fe5f9eda4e662e9ee0b2599d717ec59be9751d/althaia-3.21.1-cp310-cp310-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "a42f271af74f6bd6d7e1f347051dfab3e50982a83f87929af6175914c87f0f46",
"md5": "202db1d07c8e2b817795b592acbb40a7",
"sha256": "1fa1f87c67e0291fed199f0c709f1468ac69999ac817fbbf21620dddf5f9feee"
},
"downloads": -1,
"filename": "althaia-3.21.1-cp311-cp311-macosx_11_0_x86_64.whl",
"has_sig": false,
"md5_digest": "202db1d07c8e2b817795b592acbb40a7",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": "<4.0,>=3.9",
"size": 977629,
"upload_time": "2024-04-10T00:12:24",
"upload_time_iso_8601": "2024-04-10T00:12:24.454942Z",
"url": "https://files.pythonhosted.org/packages/a4/2f/271af74f6bd6d7e1f347051dfab3e50982a83f87929af6175914c87f0f46/althaia-3.21.1-cp311-cp311-macosx_11_0_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "e4ccece21a325ff09bbde59448d9c4e60c3fc5ef2f03a3f142a8d61a619aa52e",
"md5": "21333c17c762b8deab028dcf8228f071",
"sha256": "cce5f77e0066a009cbc79af61b4da4af78f6004e3acba87f6251eed8baab5bfc"
},
"downloads": -1,
"filename": "althaia-3.21.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "21333c17c762b8deab028dcf8228f071",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": "<4.0,>=3.9",
"size": 1044756,
"upload_time": "2024-04-10T00:12:26",
"upload_time_iso_8601": "2024-04-10T00:12:26.556152Z",
"url": "https://files.pythonhosted.org/packages/e4/cc/ece21a325ff09bbde59448d9c4e60c3fc5ef2f03a3f142a8d61a619aa52e/althaia-3.21.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "75c2864bdb4efc0a387c06e2fa6a17efb4e551c241059997cfb9d8606c20596e",
"md5": "0ef95ba3c5501d3ab17555383ae3e2ad",
"sha256": "1b4e18d201c9258ab2d3fa3f7252c2612a0626b1e51bf033a460220bf1345f84"
},
"downloads": -1,
"filename": "althaia-3.21.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "0ef95ba3c5501d3ab17555383ae3e2ad",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": "<4.0,>=3.9",
"size": 1105680,
"upload_time": "2024-04-10T00:12:27",
"upload_time_iso_8601": "2024-04-10T00:12:27.974946Z",
"url": "https://files.pythonhosted.org/packages/75/c2/864bdb4efc0a387c06e2fa6a17efb4e551c241059997cfb9d8606c20596e/althaia-3.21.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "f606c1a805c24aa2c9ff645aa71784a6b8e7c10785dfcb42dc07df18082c8329",
"md5": "958e7a276b5457454698910f6ccc6c96",
"sha256": "8380534c40b0ab4c1fa8c6af61405ed902f4030626708ca41e2fe00b3a468ae7"
},
"downloads": -1,
"filename": "althaia-3.21.1-cp311-cp311-musllinux_1_1_aarch64.whl",
"has_sig": false,
"md5_digest": "958e7a276b5457454698910f6ccc6c96",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": "<4.0,>=3.9",
"size": 1045582,
"upload_time": "2024-04-10T00:12:29",
"upload_time_iso_8601": "2024-04-10T00:12:29.990483Z",
"url": "https://files.pythonhosted.org/packages/f6/06/c1a805c24aa2c9ff645aa71784a6b8e7c10785dfcb42dc07df18082c8329/althaia-3.21.1-cp311-cp311-musllinux_1_1_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "c913959a5c2168e6813fb19ff9ed34f13826b40a1034d2269c351b9773ad29e7",
"md5": "33b3673b60a3170e7556689b1fb339af",
"sha256": "222e413c7831d7e2e897e31d332f30b97de2ceb1e66f2cc50b9d2066ebcb45f6"
},
"downloads": -1,
"filename": "althaia-3.21.1-cp311-cp311-musllinux_1_1_x86_64.whl",
"has_sig": false,
"md5_digest": "33b3673b60a3170e7556689b1fb339af",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": "<4.0,>=3.9",
"size": 1114158,
"upload_time": "2024-04-10T00:12:31",
"upload_time_iso_8601": "2024-04-10T00:12:31.594093Z",
"url": "https://files.pythonhosted.org/packages/c9/13/959a5c2168e6813fb19ff9ed34f13826b40a1034d2269c351b9773ad29e7/althaia-3.21.1-cp311-cp311-musllinux_1_1_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "a400e07f2a58d6bab3b348cab730228b683340c4d1de7ebfbaf2da2bfb531363",
"md5": "b921f9f97a6f1f7d7ce0da7d13c30e5b",
"sha256": "7ac3a88befc3581f860e26c163bc1730b61aa097304c3d2721b21890d9ab3fbf"
},
"downloads": -1,
"filename": "althaia-3.21.1-cp311-cp311-win_amd64.whl",
"has_sig": false,
"md5_digest": "b921f9f97a6f1f7d7ce0da7d13c30e5b",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": "<4.0,>=3.9",
"size": 789263,
"upload_time": "2024-04-10T00:12:33",
"upload_time_iso_8601": "2024-04-10T00:12:33.781604Z",
"url": "https://files.pythonhosted.org/packages/a4/00/e07f2a58d6bab3b348cab730228b683340c4d1de7ebfbaf2da2bfb531363/althaia-3.21.1-cp311-cp311-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "540d3f629d508a6d5c483ac95e0ce1e25b6ffb89fe0dad8396d415d6d8932669",
"md5": "10db75a064269c5bf8672c52e1aba450",
"sha256": "af580f0c72263f2e29793cab7121bd35411dafd8ba0133b6bf81430fe26492a0"
},
"downloads": -1,
"filename": "althaia-3.21.1-cp312-cp312-macosx_11_0_x86_64.whl",
"has_sig": false,
"md5_digest": "10db75a064269c5bf8672c52e1aba450",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": "<4.0,>=3.9",
"size": 943185,
"upload_time": "2024-04-10T00:12:36",
"upload_time_iso_8601": "2024-04-10T00:12:36.507233Z",
"url": "https://files.pythonhosted.org/packages/54/0d/3f629d508a6d5c483ac95e0ce1e25b6ffb89fe0dad8396d415d6d8932669/althaia-3.21.1-cp312-cp312-macosx_11_0_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "27c729c439a1a41950de44d2bb1e55eada1e4466a2f05826862a816635bf669f",
"md5": "8f602f01ebee20b16bfaa4631920eb59",
"sha256": "c9d454f006b9649791341ccb34b5d1e4e0b4bfa3308bd704eea306621314e0fd"
},
"downloads": -1,
"filename": "althaia-3.21.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "8f602f01ebee20b16bfaa4631920eb59",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": "<4.0,>=3.9",
"size": 987150,
"upload_time": "2024-04-10T00:12:38",
"upload_time_iso_8601": "2024-04-10T00:12:38.876371Z",
"url": "https://files.pythonhosted.org/packages/27/c7/29c439a1a41950de44d2bb1e55eada1e4466a2f05826862a816635bf669f/althaia-3.21.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "c84a9182e92f494b73210f0e4ad634d16890c9b9e27d4867f4087d1a0a0097ff",
"md5": "33358746f5b6de7bc4a6272d1bb5f21d",
"sha256": "eb5d35ca0ebb33ddf093bd9485aaae4c07b31114fa8e4ed2a21d6fa11446785a"
},
"downloads": -1,
"filename": "althaia-3.21.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "33358746f5b6de7bc4a6272d1bb5f21d",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": "<4.0,>=3.9",
"size": 1053486,
"upload_time": "2024-04-10T00:12:40",
"upload_time_iso_8601": "2024-04-10T00:12:40.263264Z",
"url": "https://files.pythonhosted.org/packages/c8/4a/9182e92f494b73210f0e4ad634d16890c9b9e27d4867f4087d1a0a0097ff/althaia-3.21.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "a42807a615c34e16a07b7e1a0861caead129496dc76772aac1b9639f22b6e243",
"md5": "a5d6711802c60d315501197df6b90016",
"sha256": "6e0fa6153bafaddfed928823483de47b7b12e08f2e0737ecebf3be775d452d96"
},
"downloads": -1,
"filename": "althaia-3.21.1-cp312-cp312-musllinux_1_1_aarch64.whl",
"has_sig": false,
"md5_digest": "a5d6711802c60d315501197df6b90016",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": "<4.0,>=3.9",
"size": 989848,
"upload_time": "2024-04-10T00:12:41",
"upload_time_iso_8601": "2024-04-10T00:12:41.703652Z",
"url": "https://files.pythonhosted.org/packages/a4/28/07a615c34e16a07b7e1a0861caead129496dc76772aac1b9639f22b6e243/althaia-3.21.1-cp312-cp312-musllinux_1_1_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "38cf849b280bba2b525637bfa48ee5b876e6fe4012a3cb2355c94230c38ce651",
"md5": "f0741e01a2bb325a07b56aecddb4d563",
"sha256": "7d74589f299194adc79659a8a85af3601259c5cf6b16cf9c1296f0a515e2b27c"
},
"downloads": -1,
"filename": "althaia-3.21.1-cp312-cp312-musllinux_1_1_x86_64.whl",
"has_sig": false,
"md5_digest": "f0741e01a2bb325a07b56aecddb4d563",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": "<4.0,>=3.9",
"size": 1058458,
"upload_time": "2024-04-10T00:12:43",
"upload_time_iso_8601": "2024-04-10T00:12:43.956878Z",
"url": "https://files.pythonhosted.org/packages/38/cf/849b280bba2b525637bfa48ee5b876e6fe4012a3cb2355c94230c38ce651/althaia-3.21.1-cp312-cp312-musllinux_1_1_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "faec36da923d50004824a203703522d1e249fbf99af53c162c70c9dd863d5c0f",
"md5": "c6cd4e518477969ae2460341641a3c8f",
"sha256": "59f622890c600d9eabcdeb1ba1c7f6ec9f398760d9b047481c8d78ee9017048c"
},
"downloads": -1,
"filename": "althaia-3.21.1-cp312-cp312-win_amd64.whl",
"has_sig": false,
"md5_digest": "c6cd4e518477969ae2460341641a3c8f",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": "<4.0,>=3.9",
"size": 767380,
"upload_time": "2024-04-10T00:12:46",
"upload_time_iso_8601": "2024-04-10T00:12:46.332480Z",
"url": "https://files.pythonhosted.org/packages/fa/ec/36da923d50004824a203703522d1e249fbf99af53c162c70c9dd863d5c0f/althaia-3.21.1-cp312-cp312-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "57ab66dee7343ccfd5297bdcfe97e89c6ff831b20f3c3e1034159afd4e756340",
"md5": "970bf4f2ce31597c4ad2938a0958e211",
"sha256": "0e936fb04876c3faed3dcf478c1b3c3ead603471c2cce13af75ce6ddf00ad903"
},
"downloads": -1,
"filename": "althaia-3.21.1-cp39-cp39-macosx_11_0_x86_64.whl",
"has_sig": false,
"md5_digest": "970bf4f2ce31597c4ad2938a0958e211",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": "<4.0,>=3.9",
"size": 971975,
"upload_time": "2024-04-10T00:12:48",
"upload_time_iso_8601": "2024-04-10T00:12:48.387756Z",
"url": "https://files.pythonhosted.org/packages/57/ab/66dee7343ccfd5297bdcfe97e89c6ff831b20f3c3e1034159afd4e756340/althaia-3.21.1-cp39-cp39-macosx_11_0_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "b3f21bd8f0a4964fc3f5a53b881c44ea90b99f1485c98aa008a324902e2348a0",
"md5": "b7a71d68fb01ed356129a231074bdb29",
"sha256": "b80ba0c964375b0666d6a69f61e86d27e2446a88e1dfa12fc0dc57e7e89c988a"
},
"downloads": -1,
"filename": "althaia-3.21.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "b7a71d68fb01ed356129a231074bdb29",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": "<4.0,>=3.9",
"size": 1038217,
"upload_time": "2024-04-10T00:12:49",
"upload_time_iso_8601": "2024-04-10T00:12:49.859157Z",
"url": "https://files.pythonhosted.org/packages/b3/f2/1bd8f0a4964fc3f5a53b881c44ea90b99f1485c98aa008a324902e2348a0/althaia-3.21.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "5244a01e830781f97eedd75ec62998a55eb21248c74481e97fe3e7395a03c15b",
"md5": "ef6a692e9a49482003d6532f5678e794",
"sha256": "fe24b41a6ae869ac3df34d0850626e1f3c080c093a82568c7c573b9d4557c453"
},
"downloads": -1,
"filename": "althaia-3.21.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "ef6a692e9a49482003d6532f5678e794",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": "<4.0,>=3.9",
"size": 1097539,
"upload_time": "2024-04-10T00:12:52",
"upload_time_iso_8601": "2024-04-10T00:12:52.353408Z",
"url": "https://files.pythonhosted.org/packages/52/44/a01e830781f97eedd75ec62998a55eb21248c74481e97fe3e7395a03c15b/althaia-3.21.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "86f82af69f8901e6c8aa7a63638b01aa350f002cd16c2f8b809cb33e75ce14f3",
"md5": "7b48034b76159785cbd9e0d0b3622152",
"sha256": "6dec24cfd10cc265cc33d26338853b68fdca68e52c0d994ea41194d81ea4a780"
},
"downloads": -1,
"filename": "althaia-3.21.1-cp39-cp39-musllinux_1_1_aarch64.whl",
"has_sig": false,
"md5_digest": "7b48034b76159785cbd9e0d0b3622152",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": "<4.0,>=3.9",
"size": 1040442,
"upload_time": "2024-04-10T00:12:54",
"upload_time_iso_8601": "2024-04-10T00:12:54.603005Z",
"url": "https://files.pythonhosted.org/packages/86/f8/2af69f8901e6c8aa7a63638b01aa350f002cd16c2f8b809cb33e75ce14f3/althaia-3.21.1-cp39-cp39-musllinux_1_1_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "a87d0f9d38deeac916ef006b6f3e12aad659e8f84832cf49e9c543537bf2b398",
"md5": "bbbd396f7926598295c66a39990f03c9",
"sha256": "2e8236f4cea185b7f62730fce461633a4a5db3a35b345c034e431e8e460ec5a1"
},
"downloads": -1,
"filename": "althaia-3.21.1-cp39-cp39-musllinux_1_1_x86_64.whl",
"has_sig": false,
"md5_digest": "bbbd396f7926598295c66a39990f03c9",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": "<4.0,>=3.9",
"size": 1105294,
"upload_time": "2024-04-10T00:12:56",
"upload_time_iso_8601": "2024-04-10T00:12:56.376336Z",
"url": "https://files.pythonhosted.org/packages/a8/7d/0f9d38deeac916ef006b6f3e12aad659e8f84832cf49e9c543537bf2b398/althaia-3.21.1-cp39-cp39-musllinux_1_1_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "2907e4120dedb1a3c11cb3cc33808263741128e6ba0f87622cb65465b5ccd2cd",
"md5": "f77fa0870109e7e7b0ab359c3ab5c53b",
"sha256": "b36d92ef8acd4541e51bda5da04993d512b1ba29e532f43106b9b42c49dc652f"
},
"downloads": -1,
"filename": "althaia-3.21.1-cp39-cp39-win_amd64.whl",
"has_sig": false,
"md5_digest": "f77fa0870109e7e7b0ab359c3ab5c53b",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": "<4.0,>=3.9",
"size": 781897,
"upload_time": "2024-04-10T00:12:58",
"upload_time_iso_8601": "2024-04-10T00:12:58.300673Z",
"url": "https://files.pythonhosted.org/packages/29/07/e4120dedb1a3c11cb3cc33808263741128e6ba0f87622cb65465b5ccd2cd/althaia-3.21.1-cp39-cp39-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "afb6283dad89ea981fb740b32c614cd2d1a8e284825e6528f784b22ba6cabd1d",
"md5": "8d3e57fc467c67663a93000f3dff3382",
"sha256": "fc7a7d8d9539e1e09e0bc054bd4ca8c1f5460c1947fd2b3035cd4816cf2fdb45"
},
"downloads": -1,
"filename": "althaia-3.21.1.tar.gz",
"has_sig": false,
"md5_digest": "8d3e57fc467c67663a93000f3dff3382",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<4.0,>=3.9",
"size": 53256,
"upload_time": "2024-04-10T00:12:59",
"upload_time_iso_8601": "2024-04-10T00:12:59.685170Z",
"url": "https://files.pythonhosted.org/packages/af/b6/283dad89ea981fb740b32c614cd2d1a8e284825e6528f784b22ba6cabd1d/althaia-3.21.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-04-10 00:12:59",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "dsimidzija",
"github_project": "python-althaia",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "althaia"
}