Name | modak JSON |
Version |
0.3.6
JSON |
| download |
home_page | None |
Summary | A simple, opinionated task manager |
upload_time | 2025-07-09 19:52:03 |
maintainer | None |
docs_url | None |
author | None |
requires_python | >=3.12 |
license | MIT OR Apache-2.0 |
keywords |
task
job
scheduler
monitor
|
VCS |
 |
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
<!-- markdownlint-disable MD033 MD041 -->
<p align="center">
<h1 align="center">modak</h1>
</p>
<p align="center">
<img alt="GitHub Release" src="https://img.shields.io/github/v/release/denehoffman/modak?style=for-the-badge&logo=github"></a>
<a href="https://github.com/denehoffman/modak/commits/main/" alt="Latest Commits">
<img alt="GitHub last commit" src="https://img.shields.io/github/last-commit/denehoffman/modak?style=for-the-badge&logo=github"></a>
<a href="LICENSE-APACHE" alt="License">
<img alt="GitHub License" src="https://img.shields.io/github/license/denehoffman/modak?style=for-the-badge"></a>
<a href="https://pypi.org/project/modak/" alt="View project on PyPI">
<img alt="PyPI - Version" src="https://img.shields.io/pypi/v/modak?style=for-the-badge&logo=python&logoColor=yellow&labelColor=blue"></a>
</p>
`modak` is a simple-to-use, opinionated task queue system with dependency
management, resource allocation, and isolation control. Tasks are run
respecting topological dependencies, resource limits, and optional isolation.
This library only has two classes, `Task`s, which are an abstract class with a
single method to override, `run(self) -> None`, and a `TaskQueue` which manages
the execution order. Additionally, `modak` comes with a task monitor TUI which
can be invoked with the `modak` shell command.
The `TaskQueue` has been written in Rust to get past issues with parallelism
and the GIL. Instead of using a thread pool or even a multiprocessing pool,
the tasks are serialized into bytes and passed to the Rust-side manager, which
handles dispatching and execution. Each task is then run as a separate subprocess
spawned in a Rust thread. This means the only way to share state between tasks is
by writing to an output file and having a task depend on that file.
By default, `modak` scripts will create a state file called `.modak` in the
current working directory. This can be changed by setting it in the `TaskQueue`'s
initialization method. The `modak` CLI also supports an optional argument to
point to the location of the state file.
## Features
- Topological task scheduling
- Persistent state and log files
- Resource-aware execution
- Isolated task handling
- Skipping of previously completed tasks
## Installation
```shell
pip install modak
```
Or with `uv`:
```shell
pip install modak
```
## FAQ
> Q: What do you mean by "opinionated"?
A: The library is meant to do one thing (and hopefully do it well): run tasks
and write output files. Some users might want more flexibility, like writing
to a database or having a target that isn't written to at all, but that is
not a goal of this library. If you need this level of control, try [`airflow`](https://airflow.apache.org/)
or [`luigi`](https://github.com/spotify/luigi).
> Q: Why make another task manager?
A: [`luigi`](https://github.com/spotify/luigi) is nice, but I've been annoyed by
the poor type hints for task parameters. It's also very confusing for
first-time users, and has a lot of features that I don't really think people
use unless they are working with products like Spotify. I built `modak` with
research pipelines in mind, so I wanted something that was so simple to use,
you don't have to think too hard about what you're doing and can focus on
the data instead. I haven't used [airflow](https://airflow.apache.org/) much,
but it also seems like a tool intended for enterprise. My goal here is
simplicity and a minimal learning curve. There are only two classes. `luigi`
has the added annoyance of running a web server to visualize the state of the
DAG, which is very tricky to use on a remote server if you don't have the
proper permissions.
> Q: Isn't Rust a bit overkill?
A: Rust isn't as scary as it sounds. I don't actually care much about memory
safety (although I'll take it for free), I like the development experience.
> Q: Any sharp corners?
A: In development, I've found that libraries that do something when imported
need to be handled with care. Such libraries should be imported inside the
`run` method of the task. This is because the task gets serialized and sent
to the `__main__` module, but the imports from your code are run before
serialization. An example of this is the `loguru` library, which sets
up the global logger [on import](https://github.com/Delgan/loguru/blob/a69bfc451413f71b81761a238db4b5833cf0a992/loguru/__init__.py#L18).
If `loguru` is only imported outside the task, the `logger` instance will have
no sink added because [these lines](https://github.com/Delgan/loguru/blob/a69bfc451413f71b81761a238db4b5833cf0a992/loguru/__init__.py#L31-L32)
will not be run when the task is deserialized. This will not effect most code,
it's just something to be aware of.
## Examples
### A simple chain of tasks
```python
from modak import Task, TaskQueue
class PrintTask(Task):
def run(self):
self.logger.info(f"Running {self.name}")
t1 = PrintTask(name="task1")
t2 = PrintTask(name="task2", inputs=[t1])
t3 = PrintTask(name="task3", inputs=[t2])
queue = TaskQueue('example1')
queue.run([t3])
```
### Fan-in, fan-out
```python
from pathlib import Path
from modak import Task, TaskQueue
class DummyTask(Task):
def run(self):
self.logger.info(f"Running {self.name}")
for output in self.outputs:
output.write_text(f"Output of {self.name}")
# Leaf tasks
a = DummyTask(name="A", outputs=[Path("a.out")])
b = DummyTask(name="B", outputs=[Path("b.out")])
c = DummyTask(name="C", outputs=[Path("c.out")])
# Fan-in: D depends on A, B, C
d = DummyTask(name="D", inputs=[a, b, c], outputs=[Path("d.out")])
# Fan-out: E and F both depend on D
e = DummyTask(name="E", inputs=[d], outputs=[Path("e.out")])
f = DummyTask(name="F", inputs=[d], outputs=[Path("f.out")])
queue = TaskQueue('example2')
queue.run([e, f])
```
### A complex workflow
```python
from pathlib import Path
from modak import Task, TaskQueue
class SimTask(Task):
def run(self):
self.logger.info(f"{self.name} starting with {self.resources}")
for out in self.outputs:
out.write_text(f"Generated by {self.name}")
# Raw data preprocessing
pre_a = SimTask(name="PreA", outputs=[Path("a.pre")], resources={"cpu": 1})
pre_b = SimTask(name="PreB", outputs=[Path("b.pre")], resources={"cpu": 1})
pre_c = SimTask(name="PreC", outputs=[Path("c.pre")], resources={"cpu": 1})
# Feature extraction (can run in parallel)
feat1 = SimTask(name="Feature1", inputs=[pre_a], outputs=[Path("a.feat")], resources={"cpu": 2})
feat2 = SimTask(name="Feature2", inputs=[pre_b], outputs=[Path("b.feat")], resources={"cpu": 2})
feat3 = SimTask(name="Feature3", inputs=[pre_c], outputs=[Path("c.feat")], resources={"cpu": 2})
# Aggregation step
aggregate = SimTask(
name="Aggregate",
inputs=[feat1, feat2, feat3],
outputs=[Path("agg.out")],
resources={"cpu": 3}
)
# Final model training (expensive, must be isolated)
train = SimTask(
name="TrainModel",
inputs=[aggregate],
outputs=[Path("model.bin")],
isolated=True,
resources={"cpu": 3, "gpu": 1}
)
# Side analysis and visualization can run independently
viz = SimTask(name="Visualization", inputs=[feat1, feat2], outputs=[Path("viz.png")], resources={"cpu": 1})
stats = SimTask(name="Stats", inputs=[feat3], outputs=[Path("stats.txt")], resources={"cpu": 1})
queue = TaskQueue(
'example3',
workers=4,
resources={"cpu": 4, "gpu": 1}
)
queue.run([train, viz, stats])
```
## Future Plans
I'll probably make small improvements to the TUI and add features as I find the
need. Contributions are welcome, just open an issue or pull request on GitHub
and I'll try to respond as soon as I can.
Raw data
{
"_id": null,
"home_page": null,
"name": "modak",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.12",
"maintainer_email": null,
"keywords": "task, job, scheduler, monitor",
"author": null,
"author_email": "Nathaniel Dene Hoffman <dene@cmu.edu>",
"download_url": "https://files.pythonhosted.org/packages/87/0c/198b168869cf79316f40df0b0aa2bb571bf21232962fcf956a59b0878e83/modak-0.3.6.tar.gz",
"platform": null,
"description": "<!-- markdownlint-disable MD033 MD041 -->\n<p align=\"center\">\n <h1 align=\"center\">modak</h1>\n</p>\n<p align=\"center\">\n <img alt=\"GitHub Release\" src=\"https://img.shields.io/github/v/release/denehoffman/modak?style=for-the-badge&logo=github\"></a>\n <a href=\"https://github.com/denehoffman/modak/commits/main/\" alt=\"Latest Commits\">\n <img alt=\"GitHub last commit\" src=\"https://img.shields.io/github/last-commit/denehoffman/modak?style=for-the-badge&logo=github\"></a>\n <a href=\"LICENSE-APACHE\" alt=\"License\">\n <img alt=\"GitHub License\" src=\"https://img.shields.io/github/license/denehoffman/modak?style=for-the-badge\"></a>\n <a href=\"https://pypi.org/project/modak/\" alt=\"View project on PyPI\">\n <img alt=\"PyPI - Version\" src=\"https://img.shields.io/pypi/v/modak?style=for-the-badge&logo=python&logoColor=yellow&labelColor=blue\"></a>\n</p>\n\n`modak` is a simple-to-use, opinionated task queue system with dependency\nmanagement, resource allocation, and isolation control. Tasks are run\nrespecting topological dependencies, resource limits, and optional isolation.\n\nThis library only has two classes, `Task`s, which are an abstract class with a\nsingle method to override, `run(self) -> None`, and a `TaskQueue` which manages\nthe execution order. Additionally, `modak` comes with a task monitor TUI which\ncan be invoked with the `modak` shell command.\n\nThe `TaskQueue` has been written in Rust to get past issues with parallelism\nand the GIL. Instead of using a thread pool or even a multiprocessing pool,\nthe tasks are serialized into bytes and passed to the Rust-side manager, which\nhandles dispatching and execution. Each task is then run as a separate subprocess\nspawned in a Rust thread. This means the only way to share state between tasks is\nby writing to an output file and having a task depend on that file.\n\nBy default, `modak` scripts will create a state file called `.modak` in the\ncurrent working directory. This can be changed by setting it in the `TaskQueue`'s\ninitialization method. The `modak` CLI also supports an optional argument to\npoint to the location of the state file.\n\n## Features\n\n- Topological task scheduling\n- Persistent state and log files\n- Resource-aware execution\n- Isolated task handling\n- Skipping of previously completed tasks\n\n## Installation\n\n```shell\npip install modak\n```\n\nOr with `uv`:\n\n```shell\npip install modak\n```\n\n## FAQ\n\n> Q: What do you mean by \"opinionated\"?\n\nA: The library is meant to do one thing (and hopefully do it well): run tasks\nand write output files. Some users might want more flexibility, like writing\nto a database or having a target that isn't written to at all, but that is\nnot a goal of this library. If you need this level of control, try [`airflow`](https://airflow.apache.org/)\nor [`luigi`](https://github.com/spotify/luigi).\n\n> Q: Why make another task manager?\n\nA: [`luigi`](https://github.com/spotify/luigi) is nice, but I've been annoyed by\nthe poor type hints for task parameters. It's also very confusing for\nfirst-time users, and has a lot of features that I don't really think people\nuse unless they are working with products like Spotify. I built `modak` with\nresearch pipelines in mind, so I wanted something that was so simple to use,\nyou don't have to think too hard about what you're doing and can focus on\nthe data instead. I haven't used [airflow](https://airflow.apache.org/) much,\nbut it also seems like a tool intended for enterprise. My goal here is\nsimplicity and a minimal learning curve. There are only two classes. `luigi`\nhas the added annoyance of running a web server to visualize the state of the\nDAG, which is very tricky to use on a remote server if you don't have the\nproper permissions.\n\n> Q: Isn't Rust a bit overkill?\n\nA: Rust isn't as scary as it sounds. I don't actually care much about memory\nsafety (although I'll take it for free), I like the development experience.\n\n> Q: Any sharp corners?\n\nA: In development, I've found that libraries that do something when imported\nneed to be handled with care. Such libraries should be imported inside the\n`run` method of the task. This is because the task gets serialized and sent\nto the `__main__` module, but the imports from your code are run before\nserialization. An example of this is the `loguru` library, which sets\nup the global logger [on import](https://github.com/Delgan/loguru/blob/a69bfc451413f71b81761a238db4b5833cf0a992/loguru/__init__.py#L18).\nIf `loguru` is only imported outside the task, the `logger` instance will have\nno sink added because [these lines](https://github.com/Delgan/loguru/blob/a69bfc451413f71b81761a238db4b5833cf0a992/loguru/__init__.py#L31-L32)\nwill not be run when the task is deserialized. This will not effect most code,\nit's just something to be aware of.\n\n## Examples\n\n### A simple chain of tasks\n\n```python\nfrom modak import Task, TaskQueue\n\nclass PrintTask(Task):\n def run(self):\n self.logger.info(f\"Running {self.name}\")\n\nt1 = PrintTask(name=\"task1\")\nt2 = PrintTask(name=\"task2\", inputs=[t1])\nt3 = PrintTask(name=\"task3\", inputs=[t2])\n\nqueue = TaskQueue('example1')\nqueue.run([t3])\n```\n\n### Fan-in, fan-out\n\n```python\nfrom pathlib import Path\nfrom modak import Task, TaskQueue\n\nclass DummyTask(Task):\n def run(self):\n self.logger.info(f\"Running {self.name}\")\n for output in self.outputs:\n output.write_text(f\"Output of {self.name}\")\n\n# Leaf tasks\na = DummyTask(name=\"A\", outputs=[Path(\"a.out\")])\nb = DummyTask(name=\"B\", outputs=[Path(\"b.out\")])\nc = DummyTask(name=\"C\", outputs=[Path(\"c.out\")])\n\n# Fan-in: D depends on A, B, C\nd = DummyTask(name=\"D\", inputs=[a, b, c], outputs=[Path(\"d.out\")])\n\n# Fan-out: E and F both depend on D\ne = DummyTask(name=\"E\", inputs=[d], outputs=[Path(\"e.out\")])\nf = DummyTask(name=\"F\", inputs=[d], outputs=[Path(\"f.out\")])\n\nqueue = TaskQueue('example2')\nqueue.run([e, f])\n\n```\n\n### A complex workflow\n\n```python\nfrom pathlib import Path\nfrom modak import Task, TaskQueue\n\nclass SimTask(Task):\n def run(self):\n self.logger.info(f\"{self.name} starting with {self.resources}\")\n for out in self.outputs:\n out.write_text(f\"Generated by {self.name}\")\n\n# Raw data preprocessing\npre_a = SimTask(name=\"PreA\", outputs=[Path(\"a.pre\")], resources={\"cpu\": 1})\npre_b = SimTask(name=\"PreB\", outputs=[Path(\"b.pre\")], resources={\"cpu\": 1})\npre_c = SimTask(name=\"PreC\", outputs=[Path(\"c.pre\")], resources={\"cpu\": 1})\n\n# Feature extraction (can run in parallel)\nfeat1 = SimTask(name=\"Feature1\", inputs=[pre_a], outputs=[Path(\"a.feat\")], resources={\"cpu\": 2})\nfeat2 = SimTask(name=\"Feature2\", inputs=[pre_b], outputs=[Path(\"b.feat\")], resources={\"cpu\": 2})\nfeat3 = SimTask(name=\"Feature3\", inputs=[pre_c], outputs=[Path(\"c.feat\")], resources={\"cpu\": 2})\n\n# Aggregation step\naggregate = SimTask(\n name=\"Aggregate\",\n inputs=[feat1, feat2, feat3],\n outputs=[Path(\"agg.out\")],\n resources={\"cpu\": 3}\n)\n\n# Final model training (expensive, must be isolated)\ntrain = SimTask(\n name=\"TrainModel\",\n inputs=[aggregate],\n outputs=[Path(\"model.bin\")],\n isolated=True,\n resources={\"cpu\": 3, \"gpu\": 1}\n)\n\n# Side analysis and visualization can run independently\nviz = SimTask(name=\"Visualization\", inputs=[feat1, feat2], outputs=[Path(\"viz.png\")], resources={\"cpu\": 1})\nstats = SimTask(name=\"Stats\", inputs=[feat3], outputs=[Path(\"stats.txt\")], resources={\"cpu\": 1})\n\nqueue = TaskQueue(\n 'example3',\n workers=4,\n resources={\"cpu\": 4, \"gpu\": 1}\n)\n\nqueue.run([train, viz, stats])\n\n```\n\n## Future Plans\n\nI'll probably make small improvements to the TUI and add features as I find the\nneed. Contributions are welcome, just open an issue or pull request on GitHub\nand I'll try to respond as soon as I can.\n\n",
"bugtrack_url": null,
"license": "MIT OR Apache-2.0",
"summary": "A simple, opinionated task manager",
"version": "0.3.6",
"project_urls": {
"Homepage": "https://github.com/denehoffman/modak",
"Issues": "https://github.com/denehoffman/modak/issues",
"Repository": "https://github.com/denehoffman/modak"
},
"split_keywords": [
"task",
" job",
" scheduler",
" monitor"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "f03d55ff2ee4c49a2f780c41252c770422128ac2fe72a69015a01c718a609983",
"md5": "36f2a407d8350235a210db83f07357d1",
"sha256": "bedf086246f609ac9e52bdf90773fe4f3c10f17177bb4658b5e18b8d4d652043"
},
"downloads": -1,
"filename": "modak-0.3.6-cp312-cp312-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "36f2a407d8350235a210db83f07357d1",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.12",
"size": 1664175,
"upload_time": "2025-07-09T19:51:44",
"upload_time_iso_8601": "2025-07-09T19:51:44.314169Z",
"url": "https://files.pythonhosted.org/packages/f0/3d/55ff2ee4c49a2f780c41252c770422128ac2fe72a69015a01c718a609983/modak-0.3.6-cp312-cp312-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "39aade462c8ce83cdc76290bc022530fe4638c7c290f73eed56d590e5043faa1",
"md5": "ff4a4493b0d7ad7abfcdd880018bf895",
"sha256": "6979f5b9e7f8be90584682023eb9ef87f192d9a14d699f2efbaca1cefdf3383a"
},
"downloads": -1,
"filename": "modak-0.3.6-cp312-cp312-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "ff4a4493b0d7ad7abfcdd880018bf895",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.12",
"size": 1563370,
"upload_time": "2025-07-09T19:51:41",
"upload_time_iso_8601": "2025-07-09T19:51:41.735778Z",
"url": "https://files.pythonhosted.org/packages/39/aa/de462c8ce83cdc76290bc022530fe4638c7c290f73eed56d590e5043faa1/modak-0.3.6-cp312-cp312-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "77fcde73ad47a755a894ae1f487abe5fb3b87ac0231935ee1494957b8836b71c",
"md5": "d5af0405f986ce66903c4d036ab2bdcc",
"sha256": "a1f3514579eedf531b9b76672f96816ea883981598658de801c03af377ed081d"
},
"downloads": -1,
"filename": "modak-0.3.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "d5af0405f986ce66903c4d036ab2bdcc",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.12",
"size": 1599807,
"upload_time": "2025-07-09T19:51:14",
"upload_time_iso_8601": "2025-07-09T19:51:14.886534Z",
"url": "https://files.pythonhosted.org/packages/77/fc/de73ad47a755a894ae1f487abe5fb3b87ac0231935ee1494957b8836b71c/modak-0.3.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "8ba24777e2b9322d3845866f4e935777099dc05d1c4e1d85707050b5155db188",
"md5": "45573501c64b3fb7423d20f669b0f4d4",
"sha256": "bd07dd32f097ae0a25c4ecac00e9208c562b0230d20cce0092afb517f75d9637"
},
"downloads": -1,
"filename": "modak-0.3.6-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
"has_sig": false,
"md5_digest": "45573501c64b3fb7423d20f669b0f4d4",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.12",
"size": 1582315,
"upload_time": "2025-07-09T19:51:19",
"upload_time_iso_8601": "2025-07-09T19:51:19.851242Z",
"url": "https://files.pythonhosted.org/packages/8b/a2/4777e2b9322d3845866f4e935777099dc05d1c4e1d85707050b5155db188/modak-0.3.6-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "9f818339ef4bebbe878fa2a6012465a82f3e30aa6bef6542a332a2e7f3eb699d",
"md5": "c5c2ee03f45f5b53d29b69fbb747a9a1",
"sha256": "5f86bdad0a927be308162d08413d7ca10e04278060d2fda964c440940e116c18"
},
"downloads": -1,
"filename": "modak-0.3.6-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl",
"has_sig": false,
"md5_digest": "c5c2ee03f45f5b53d29b69fbb747a9a1",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.12",
"size": 1891250,
"upload_time": "2025-07-09T19:51:32",
"upload_time_iso_8601": "2025-07-09T19:51:32.370315Z",
"url": "https://files.pythonhosted.org/packages/9f/81/8339ef4bebbe878fa2a6012465a82f3e30aa6bef6542a332a2e7f3eb699d/modak-0.3.6-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "01c8fb48ab48afbc2cf316631079d0381f78db72a886ba0f853f0b8b4238f28e",
"md5": "79d6ecf7c8d1dd23a057c226dc7d6ebd",
"sha256": "0ac63b78517ec5fa9ffa2e94681233c6361158237e7acd9b39c29c782837040f"
},
"downloads": -1,
"filename": "modak-0.3.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
"has_sig": false,
"md5_digest": "79d6ecf7c8d1dd23a057c226dc7d6ebd",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.12",
"size": 1913115,
"upload_time": "2025-07-09T19:51:24",
"upload_time_iso_8601": "2025-07-09T19:51:24.452748Z",
"url": "https://files.pythonhosted.org/packages/01/c8/fb48ab48afbc2cf316631079d0381f78db72a886ba0f853f0b8b4238f28e/modak-0.3.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "6fada43b6be71fe870074cd575115a924e2d7b86232900c9c6f8d86d8fcd1980",
"md5": "5071bb69ec43cfbbd288cb1d97a1d4e3",
"sha256": "f5178a8ef065cdfe3d7ae74672b881961175ddb7dcce32a698a4c058d97a843f"
},
"downloads": -1,
"filename": "modak-0.3.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl",
"has_sig": false,
"md5_digest": "5071bb69ec43cfbbd288cb1d97a1d4e3",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.12",
"size": 1822005,
"upload_time": "2025-07-09T19:51:28",
"upload_time_iso_8601": "2025-07-09T19:51:28.231701Z",
"url": "https://files.pythonhosted.org/packages/6f/ad/a43b6be71fe870074cd575115a924e2d7b86232900c9c6f8d86d8fcd1980/modak-0.3.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "620888316c6f2137a531a9ff2cde6d73b372cf29fa9fbe6b5798d80f0b236d59",
"md5": "97eeb0eb9bd516acef6e77b214b610e8",
"sha256": "d8241bdaee50580d187fcaebaa5740c7384c5635bd4f36ffd58cf5c968331696"
},
"downloads": -1,
"filename": "modak-0.3.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "97eeb0eb9bd516acef6e77b214b610e8",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.12",
"size": 1746698,
"upload_time": "2025-07-09T19:51:37",
"upload_time_iso_8601": "2025-07-09T19:51:37.182584Z",
"url": "https://files.pythonhosted.org/packages/62/08/88316c6f2137a531a9ff2cde6d73b372cf29fa9fbe6b5798d80f0b236d59/modak-0.3.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "bb22c2068fbfc092813016c550c0a3f1128f231306cdecddae243be37b98ebb8",
"md5": "3118ebf3f2408a72d3b9bf12b3f4db18",
"sha256": "6147fb8a448878ad69ebee0131d7edb9a32f64378675a928cb6770ceada5981e"
},
"downloads": -1,
"filename": "modak-0.3.6-cp312-cp312-musllinux_1_2_aarch64.whl",
"has_sig": false,
"md5_digest": "3118ebf3f2408a72d3b9bf12b3f4db18",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.12",
"size": 1887426,
"upload_time": "2025-07-09T19:51:46",
"upload_time_iso_8601": "2025-07-09T19:51:46.951513Z",
"url": "https://files.pythonhosted.org/packages/bb/22/c2068fbfc092813016c550c0a3f1128f231306cdecddae243be37b98ebb8/modak-0.3.6-cp312-cp312-musllinux_1_2_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "cd6479d9f39ab5e2edfb0101c7b7cecb126596aee9b0fa023f57f03d53f771b9",
"md5": "fff3d2b906dc8cfe922127b40a1c030b",
"sha256": "f88fdf962afa9b6a1ace28d321f0daa19d341ec6f4100e68bca6929c441eb135"
},
"downloads": -1,
"filename": "modak-0.3.6-cp312-cp312-musllinux_1_2_armv7l.whl",
"has_sig": false,
"md5_digest": "fff3d2b906dc8cfe922127b40a1c030b",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.12",
"size": 1952074,
"upload_time": "2025-07-09T19:51:50",
"upload_time_iso_8601": "2025-07-09T19:51:50.924902Z",
"url": "https://files.pythonhosted.org/packages/cd/64/79d9f39ab5e2edfb0101c7b7cecb126596aee9b0fa023f57f03d53f771b9/modak-0.3.6-cp312-cp312-musllinux_1_2_armv7l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "325933ea338a5834308cf76c9b6101b805c4abbace5cafd637c6ab817cf40baa",
"md5": "0e2503588420af5c053d96b0b11ccaf1",
"sha256": "7a9821bf7ae4c4ab213a6adec5f7a3c180d5564a666f29b8addde0e49c5023f2"
},
"downloads": -1,
"filename": "modak-0.3.6-cp312-cp312-musllinux_1_2_i686.whl",
"has_sig": false,
"md5_digest": "0e2503588420af5c053d96b0b11ccaf1",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.12",
"size": 2042870,
"upload_time": "2025-07-09T19:51:54",
"upload_time_iso_8601": "2025-07-09T19:51:54.988616Z",
"url": "https://files.pythonhosted.org/packages/32/59/33ea338a5834308cf76c9b6101b805c4abbace5cafd637c6ab817cf40baa/modak-0.3.6-cp312-cp312-musllinux_1_2_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "eb22417fefb435c74a18f114901e8d05b676421e1eb8395e5536fe01debe0bb3",
"md5": "ac1d1fa74e44eb39b4b3f414e5f0b6e1",
"sha256": "42451363c599ed6304fc0a24b1b2d0dd266443e768e1fe94e1b2f50e3c13ca43"
},
"downloads": -1,
"filename": "modak-0.3.6-cp312-cp312-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "ac1d1fa74e44eb39b4b3f414e5f0b6e1",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.12",
"size": 1923066,
"upload_time": "2025-07-09T19:51:59",
"upload_time_iso_8601": "2025-07-09T19:51:59.114710Z",
"url": "https://files.pythonhosted.org/packages/eb/22/417fefb435c74a18f114901e8d05b676421e1eb8395e5536fe01debe0bb3/modak-0.3.6-cp312-cp312-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "4abd198d1b947a9c0d762b452fb8d15d82f2fbb293b81b41db22285c7ce1577a",
"md5": "f1115702a75cf473dfd82ba798c019f6",
"sha256": "7aac8b3b4f5e95844ebce19250e885b340a0dd4a15fb86b16f65d6b92a6e2776"
},
"downloads": -1,
"filename": "modak-0.3.6-cp312-cp312-win32.whl",
"has_sig": false,
"md5_digest": "f1115702a75cf473dfd82ba798c019f6",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.12",
"size": 1259937,
"upload_time": "2025-07-09T19:52:07",
"upload_time_iso_8601": "2025-07-09T19:52:07.046246Z",
"url": "https://files.pythonhosted.org/packages/4a/bd/198d1b947a9c0d762b452fb8d15d82f2fbb293b81b41db22285c7ce1577a/modak-0.3.6-cp312-cp312-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "c38691bcf1b848e71f50eb969c1c0fa01101184144b45e92a22e2725919028f0",
"md5": "d230cf4abea174e6b3b0d09dcc361b4a",
"sha256": "7aa0c4e82b96c490f90ec3fc49ded3d03d725ebf8d3f23b7b82d9d48c9fd32f4"
},
"downloads": -1,
"filename": "modak-0.3.6-cp312-cp312-win_amd64.whl",
"has_sig": false,
"md5_digest": "d230cf4abea174e6b3b0d09dcc361b4a",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.12",
"size": 1450481,
"upload_time": "2025-07-09T19:52:04",
"upload_time_iso_8601": "2025-07-09T19:52:04.166002Z",
"url": "https://files.pythonhosted.org/packages/c3/86/91bcf1b848e71f50eb969c1c0fa01101184144b45e92a22e2725919028f0/modak-0.3.6-cp312-cp312-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "69af9c7aabd9fbfd6431d0b5906c0d3d5cd3e0ccd79b612184e476e35fe50f8c",
"md5": "ec28845138224a3904cd9c74fb9ee2fc",
"sha256": "e5405893d232ac6e2833edc114f8a3be39daeadbb361e0a2e91747a90f26335e"
},
"downloads": -1,
"filename": "modak-0.3.6-cp313-cp313-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "ec28845138224a3904cd9c74fb9ee2fc",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.12",
"size": 1663919,
"upload_time": "2025-07-09T19:51:45",
"upload_time_iso_8601": "2025-07-09T19:51:45.606984Z",
"url": "https://files.pythonhosted.org/packages/69/af/9c7aabd9fbfd6431d0b5906c0d3d5cd3e0ccd79b612184e476e35fe50f8c/modak-0.3.6-cp313-cp313-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "5e6630c19a44eb8059f0391da2f1f68ffc625aeed4511cd137efceb883e50970",
"md5": "2c801d306645c0b4e24282118b2c515f",
"sha256": "279dd47032e52d31925637b9db3a5ec17f73b2c7f3fcf894b5c3869c94a34286"
},
"downloads": -1,
"filename": "modak-0.3.6-cp313-cp313-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "2c801d306645c0b4e24282118b2c515f",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.12",
"size": 1562909,
"upload_time": "2025-07-09T19:51:42",
"upload_time_iso_8601": "2025-07-09T19:51:42.993087Z",
"url": "https://files.pythonhosted.org/packages/5e/66/30c19a44eb8059f0391da2f1f68ffc625aeed4511cd137efceb883e50970/modak-0.3.6-cp313-cp313-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "d46598b6ae647a6a3e1637fc181d3b9901e0231f1c814d4f6c8e8c3fe16cbe5b",
"md5": "15bbbf7482758ec2e9268dda96739208",
"sha256": "137aae72f1bcaa8e885e701f58e6e6e7065e89683f4a3a43bcecad0e23a67e79"
},
"downloads": -1,
"filename": "modak-0.3.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "15bbbf7482758ec2e9268dda96739208",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.12",
"size": 1599230,
"upload_time": "2025-07-09T19:51:16",
"upload_time_iso_8601": "2025-07-09T19:51:16.851029Z",
"url": "https://files.pythonhosted.org/packages/d4/65/98b6ae647a6a3e1637fc181d3b9901e0231f1c814d4f6c8e8c3fe16cbe5b/modak-0.3.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "eb7e049b31eb3893d1adff591cf3e58b5987ab305d98801051da84993741bc64",
"md5": "c59d84007d6af6be07d51e46bffa13fd",
"sha256": "e7f20ee70d1c4448b75f77060bedbb371a66bfcbc87c5e0ea21958d6436ff15f"
},
"downloads": -1,
"filename": "modak-0.3.6-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
"has_sig": false,
"md5_digest": "c59d84007d6af6be07d51e46bffa13fd",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.12",
"size": 1581839,
"upload_time": "2025-07-09T19:51:21",
"upload_time_iso_8601": "2025-07-09T19:51:21.105121Z",
"url": "https://files.pythonhosted.org/packages/eb/7e/049b31eb3893d1adff591cf3e58b5987ab305d98801051da84993741bc64/modak-0.3.6-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "ab686373f371bb58ce8925ac5b474789ab221406272d097a77cf1a41d82df404",
"md5": "571b6aaef9c451af2e490d0831486c88",
"sha256": "7276419481d4b3dd23f267c5919711c444fca9f95cdcf86e841fc9af4bc09288"
},
"downloads": -1,
"filename": "modak-0.3.6-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl",
"has_sig": false,
"md5_digest": "571b6aaef9c451af2e490d0831486c88",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.12",
"size": 1890280,
"upload_time": "2025-07-09T19:51:34",
"upload_time_iso_8601": "2025-07-09T19:51:34.087902Z",
"url": "https://files.pythonhosted.org/packages/ab/68/6373f371bb58ce8925ac5b474789ab221406272d097a77cf1a41d82df404/modak-0.3.6-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "0ee0e7be9a7e8f9a4b75063f8b169e12d7d5217f033e2c8b2bde8d32e8145af0",
"md5": "d010d2e426b432396d1773ea765da6ab",
"sha256": "a7a369ef70de2486e4340ab0172fa152bd601659bb290c0ba2dde32ea1a6cb18"
},
"downloads": -1,
"filename": "modak-0.3.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
"has_sig": false,
"md5_digest": "d010d2e426b432396d1773ea765da6ab",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.12",
"size": 1911885,
"upload_time": "2025-07-09T19:51:25",
"upload_time_iso_8601": "2025-07-09T19:51:25.723229Z",
"url": "https://files.pythonhosted.org/packages/0e/e0/e7be9a7e8f9a4b75063f8b169e12d7d5217f033e2c8b2bde8d32e8145af0/modak-0.3.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "6bb88a513eba27ec3d2f241aaddcad0bb29318b849aee3f6d0ad42217d167012",
"md5": "6303308a2bbd03ca391da984efc1f684",
"sha256": "b781a09a2d533f35022a330ee5bd4cb3d027219068763728aba29490d7ebc08f"
},
"downloads": -1,
"filename": "modak-0.3.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl",
"has_sig": false,
"md5_digest": "6303308a2bbd03ca391da984efc1f684",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.12",
"size": 1822025,
"upload_time": "2025-07-09T19:51:29",
"upload_time_iso_8601": "2025-07-09T19:51:29.488165Z",
"url": "https://files.pythonhosted.org/packages/6b/b8/8a513eba27ec3d2f241aaddcad0bb29318b849aee3f6d0ad42217d167012/modak-0.3.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b27d0d71ff7df8c7c9f4bef0a49aefcc5566514443d8161e3139f31def3859a9",
"md5": "e2f4ec1093422c9f30e57c7fc98abb78",
"sha256": "51ac3352862e93ce166d3b6f52bfbd806064039da5cab307b24e9315ddf9f375"
},
"downloads": -1,
"filename": "modak-0.3.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "e2f4ec1093422c9f30e57c7fc98abb78",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.12",
"size": 1746267,
"upload_time": "2025-07-09T19:51:38",
"upload_time_iso_8601": "2025-07-09T19:51:38.462569Z",
"url": "https://files.pythonhosted.org/packages/b2/7d/0d71ff7df8c7c9f4bef0a49aefcc5566514443d8161e3139f31def3859a9/modak-0.3.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "9a6789b5d54a04d99a73d6d2038cb4d23d70b7466be2ed15cd473df560242771",
"md5": "f08e77b43231c638580c705254ffb39d",
"sha256": "281ff91e6c14dbf6dad4fca173b51b3d82aba109bf1786c4deebeaa18c30dc0c"
},
"downloads": -1,
"filename": "modak-0.3.6-cp313-cp313-musllinux_1_2_aarch64.whl",
"has_sig": false,
"md5_digest": "f08e77b43231c638580c705254ffb39d",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.12",
"size": 1887078,
"upload_time": "2025-07-09T19:51:48",
"upload_time_iso_8601": "2025-07-09T19:51:48.150373Z",
"url": "https://files.pythonhosted.org/packages/9a/67/89b5d54a04d99a73d6d2038cb4d23d70b7466be2ed15cd473df560242771/modak-0.3.6-cp313-cp313-musllinux_1_2_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "e56bb2b29fac92b5ac16fdb1d53b09e95dd3477dd84f9829fb79d3f30955c9d4",
"md5": "78738555f314a7c9fded7cf9ae96d880",
"sha256": "37dcf6776c33445a3f75ed183992eed5e5a54dd534b2973cd46864b284aba9f7"
},
"downloads": -1,
"filename": "modak-0.3.6-cp313-cp313-musllinux_1_2_armv7l.whl",
"has_sig": false,
"md5_digest": "78738555f314a7c9fded7cf9ae96d880",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.12",
"size": 1951377,
"upload_time": "2025-07-09T19:51:52",
"upload_time_iso_8601": "2025-07-09T19:51:52.432378Z",
"url": "https://files.pythonhosted.org/packages/e5/6b/b2b29fac92b5ac16fdb1d53b09e95dd3477dd84f9829fb79d3f30955c9d4/modak-0.3.6-cp313-cp313-musllinux_1_2_armv7l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "69b2fac7349dab9a53d9fd37a8c6cba84e994a6d536f9f25b193c46a45b165b8",
"md5": "97465d72a38496b376e2e69eb23c933b",
"sha256": "a7025f6b4e76562a7dd2378e6cbdbd30d880e553204f81372044cc87603e5916"
},
"downloads": -1,
"filename": "modak-0.3.6-cp313-cp313-musllinux_1_2_i686.whl",
"has_sig": false,
"md5_digest": "97465d72a38496b376e2e69eb23c933b",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.12",
"size": 2042166,
"upload_time": "2025-07-09T19:51:56",
"upload_time_iso_8601": "2025-07-09T19:51:56.197657Z",
"url": "https://files.pythonhosted.org/packages/69/b2/fac7349dab9a53d9fd37a8c6cba84e994a6d536f9f25b193c46a45b165b8/modak-0.3.6-cp313-cp313-musllinux_1_2_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "a64e4a48b8755424ab1856fd9a400d683213997d33420c8d0599be29f901b81f",
"md5": "ce8533e34fcdaf70a749b10492e29936",
"sha256": "23ac742cbd4984ba8e29875ce5da9ea816ac74dbca1d212cdd899609e4fdd37b"
},
"downloads": -1,
"filename": "modak-0.3.6-cp313-cp313-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "ce8533e34fcdaf70a749b10492e29936",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.12",
"size": 1922689,
"upload_time": "2025-07-09T19:52:00",
"upload_time_iso_8601": "2025-07-09T19:52:00.428592Z",
"url": "https://files.pythonhosted.org/packages/a6/4e/4a48b8755424ab1856fd9a400d683213997d33420c8d0599be29f901b81f/modak-0.3.6-cp313-cp313-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b978e9ae63629c0784ff7124e8d513013ff22d63c905593da0aac53fdd165533",
"md5": "3ff4d37b08f5bfa460845248007b3fd1",
"sha256": "eb86c3f401750e4b2f872f5f955e574741e29deeef1c6e43561123ac0e7b4ea3"
},
"downloads": -1,
"filename": "modak-0.3.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "3ff4d37b08f5bfa460845248007b3fd1",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.12",
"size": 1598968,
"upload_time": "2025-07-09T19:51:18",
"upload_time_iso_8601": "2025-07-09T19:51:18.225115Z",
"url": "https://files.pythonhosted.org/packages/b9/78/e9ae63629c0784ff7124e8d513013ff22d63c905593da0aac53fdd165533/modak-0.3.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "7f0161f56ff39f7c5c0ae666d74f89217e863530acb06c7e70badce08c6ba6f2",
"md5": "95fbb3ee98b3b53225f6a1f158f07162",
"sha256": "255d3c16b9699694466a5be41f777e757007b82f4c51c99853dcf986538ac1f2"
},
"downloads": -1,
"filename": "modak-0.3.6-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
"has_sig": false,
"md5_digest": "95fbb3ee98b3b53225f6a1f158f07162",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.12",
"size": 1580653,
"upload_time": "2025-07-09T19:51:22",
"upload_time_iso_8601": "2025-07-09T19:51:22.671185Z",
"url": "https://files.pythonhosted.org/packages/7f/01/61f56ff39f7c5c0ae666d74f89217e863530acb06c7e70badce08c6ba6f2/modak-0.3.6-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "731185632fdc71e360fa7562af7dd9a4bd3678820e7de2da15aca57bed48d39b",
"md5": "5220a3b82de03d652f50d8fc6b782e0d",
"sha256": "333852b5f3c04f7419cc957a234825d6a06fe5b2befaf7b5de7708376acc7ffd"
},
"downloads": -1,
"filename": "modak-0.3.6-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
"has_sig": false,
"md5_digest": "5220a3b82de03d652f50d8fc6b782e0d",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.12",
"size": 1911339,
"upload_time": "2025-07-09T19:51:26",
"upload_time_iso_8601": "2025-07-09T19:51:26.992572Z",
"url": "https://files.pythonhosted.org/packages/73/11/85632fdc71e360fa7562af7dd9a4bd3678820e7de2da15aca57bed48d39b/modak-0.3.6-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "36e6a478b3e5bd4ec16268b42a8217b7e48deae79434b02ed069441a5fcb44bd",
"md5": "e96e7375848ab5062d50262f3bd49c86",
"sha256": "5f811f8a97e1bb1e50067de7212a45930207970365b4c030c2d5d32ceec2c643"
},
"downloads": -1,
"filename": "modak-0.3.6-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl",
"has_sig": false,
"md5_digest": "e96e7375848ab5062d50262f3bd49c86",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.12",
"size": 1822605,
"upload_time": "2025-07-09T19:51:30",
"upload_time_iso_8601": "2025-07-09T19:51:30.785543Z",
"url": "https://files.pythonhosted.org/packages/36/e6/a478b3e5bd4ec16268b42a8217b7e48deae79434b02ed069441a5fcb44bd/modak-0.3.6-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "0e156281a06b2195f360d91e537bdde7d4cb90b67396745c28643ed1ce1a2673",
"md5": "590d7457250d52375d2f40c2581f137e",
"sha256": "e3e975f6ec07166145f15c21e9c06491fb4f952fe9f638c25a2fbd9d3ff0705f"
},
"downloads": -1,
"filename": "modak-0.3.6-cp313-cp313t-musllinux_1_2_aarch64.whl",
"has_sig": false,
"md5_digest": "590d7457250d52375d2f40c2581f137e",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.12",
"size": 1886232,
"upload_time": "2025-07-09T19:51:49",
"upload_time_iso_8601": "2025-07-09T19:51:49.646043Z",
"url": "https://files.pythonhosted.org/packages/0e/15/6281a06b2195f360d91e537bdde7d4cb90b67396745c28643ed1ce1a2673/modak-0.3.6-cp313-cp313t-musllinux_1_2_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "e94f16c3ca2dfda1cbe4ba66705e2062fdb713760a7c71fecbf37bb3452594bf",
"md5": "30bff437fca26548663c5f963d8b744d",
"sha256": "cfa1ad7d6ab5fade6ab4c30629b8be67056a634ce5420997c65fc1a050cd09d0"
},
"downloads": -1,
"filename": "modak-0.3.6-cp313-cp313t-musllinux_1_2_armv7l.whl",
"has_sig": false,
"md5_digest": "30bff437fca26548663c5f963d8b744d",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.12",
"size": 1949990,
"upload_time": "2025-07-09T19:51:53",
"upload_time_iso_8601": "2025-07-09T19:51:53.702414Z",
"url": "https://files.pythonhosted.org/packages/e9/4f/16c3ca2dfda1cbe4ba66705e2062fdb713760a7c71fecbf37bb3452594bf/modak-0.3.6-cp313-cp313t-musllinux_1_2_armv7l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "7555480b60dd54ace09cb54e069708d48997943465e4ec7ba3d070402b909f07",
"md5": "e1fdaa4bd1cee6648e310457088d600a",
"sha256": "8cc3d826d838a23c48344c2ba50b5fb25bf51d484509cac34b502b42305fee78"
},
"downloads": -1,
"filename": "modak-0.3.6-cp313-cp313t-musllinux_1_2_i686.whl",
"has_sig": false,
"md5_digest": "e1fdaa4bd1cee6648e310457088d600a",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.12",
"size": 2043066,
"upload_time": "2025-07-09T19:51:57",
"upload_time_iso_8601": "2025-07-09T19:51:57.417142Z",
"url": "https://files.pythonhosted.org/packages/75/55/480b60dd54ace09cb54e069708d48997943465e4ec7ba3d070402b909f07/modak-0.3.6-cp313-cp313t-musllinux_1_2_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "4e7f08b234caf5ea6d423903573111d73882884bdad9f38d78d5b8cfcf5c5cf0",
"md5": "beb783f7ea89488aba62b6b4e6abb8c6",
"sha256": "a172b183dd27525b4787929731842a8dce8da01bd21ddd9870b4142ff39478b9"
},
"downloads": -1,
"filename": "modak-0.3.6-cp313-cp313t-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "beb783f7ea89488aba62b6b4e6abb8c6",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.12",
"size": 1923030,
"upload_time": "2025-07-09T19:52:02",
"upload_time_iso_8601": "2025-07-09T19:52:02.072265Z",
"url": "https://files.pythonhosted.org/packages/4e/7f/08b234caf5ea6d423903573111d73882884bdad9f38d78d5b8cfcf5c5cf0/modak-0.3.6-cp313-cp313t-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "10d6b84a00be99e133c63389abf1e97693afa8a6d0a9664e7a8e666aad6caecd",
"md5": "1672d06154202ba44cc62fb521aef1cd",
"sha256": "64015764fc495ffd90afddd19dd5c45d9430d9cd7e5077070d5aabb55ac55c06"
},
"downloads": -1,
"filename": "modak-0.3.6-cp313-cp313-win32.whl",
"has_sig": false,
"md5_digest": "1672d06154202ba44cc62fb521aef1cd",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.12",
"size": 1259833,
"upload_time": "2025-07-09T19:52:08",
"upload_time_iso_8601": "2025-07-09T19:52:08.332028Z",
"url": "https://files.pythonhosted.org/packages/10/d6/b84a00be99e133c63389abf1e97693afa8a6d0a9664e7a8e666aad6caecd/modak-0.3.6-cp313-cp313-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "11c660dd09084a9e0ce361b579c5ef3f8e41ce5eca0f211117c35eecd54a0f1f",
"md5": "08a07a65fe081994dd4a5f81cebda7fa",
"sha256": "06015b33dfb335fe946f50fcee2a60d68e65aa9c65aa3b270fbd5ceecfc671c2"
},
"downloads": -1,
"filename": "modak-0.3.6-cp313-cp313-win_amd64.whl",
"has_sig": false,
"md5_digest": "08a07a65fe081994dd4a5f81cebda7fa",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.12",
"size": 1449652,
"upload_time": "2025-07-09T19:52:05",
"upload_time_iso_8601": "2025-07-09T19:52:05.403557Z",
"url": "https://files.pythonhosted.org/packages/11/c6/60dd09084a9e0ce361b579c5ef3f8e41ce5eca0f211117c35eecd54a0f1f/modak-0.3.6-cp313-cp313-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "90134d14716015b498c6ea04a332edfa81cedbe9016e11d9fd5081007fea2042",
"md5": "0d88d0d74d6ca5c84b553248a5295ac3",
"sha256": "952c406c5d4528aca8d4a111c41bb4ac789a43554b7466f6bafd937deb262db2"
},
"downloads": -1,
"filename": "modak-0.3.6-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl",
"has_sig": false,
"md5_digest": "0d88d0d74d6ca5c84b553248a5295ac3",
"packagetype": "bdist_wheel",
"python_version": "cp314",
"requires_python": ">=3.12",
"size": 1891667,
"upload_time": "2025-07-09T19:51:35",
"upload_time_iso_8601": "2025-07-09T19:51:35.577503Z",
"url": "https://files.pythonhosted.org/packages/90/13/4d14716015b498c6ea04a332edfa81cedbe9016e11d9fd5081007fea2042/modak-0.3.6-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "9708a2145814ceb4e9fd155de5ed4e9e89dae5d3aa785ee15fc81d2e4971a8cb",
"md5": "d09e862f07032ecea2a5cf775d3f122c",
"sha256": "d5b8e5d8da2e16d7d6115d57f9dbe51df9dca31659efb7dbbfd51263f3206ad3"
},
"downloads": -1,
"filename": "modak-0.3.6-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "d09e862f07032ecea2a5cf775d3f122c",
"packagetype": "bdist_wheel",
"python_version": "cp314",
"requires_python": ">=3.12",
"size": 1747359,
"upload_time": "2025-07-09T19:51:40",
"upload_time_iso_8601": "2025-07-09T19:51:40.262623Z",
"url": "https://files.pythonhosted.org/packages/97/08/a2145814ceb4e9fd155de5ed4e9e89dae5d3aa785ee15fc81d2e4971a8cb/modak-0.3.6-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "870c198b168869cf79316f40df0b0aa2bb571bf21232962fcf956a59b0878e83",
"md5": "7474a94dbaa6ad7a0c3f56fefa1e32e5",
"sha256": "ba428212988fcc38fc707ca64f88209d173c51098d0c9f74cc3c625b10dddbc2"
},
"downloads": -1,
"filename": "modak-0.3.6.tar.gz",
"has_sig": false,
"md5_digest": "7474a94dbaa6ad7a0c3f56fefa1e32e5",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.12",
"size": 46063,
"upload_time": "2025-07-09T19:52:03",
"upload_time_iso_8601": "2025-07-09T19:52:03.329443Z",
"url": "https://files.pythonhosted.org/packages/87/0c/198b168869cf79316f40df0b0aa2bb571bf21232962fcf956a59b0878e83/modak-0.3.6.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-09 19:52:03",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "denehoffman",
"github_project": "modak",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "modak"
}