modak


Namemodak JSON
Version 0.3.9 PyPI version JSON
download
home_pageNone
SummaryA simple, opinionated task manager
upload_time2025-08-05 17:52:08
maintainerNone
docs_urlNone
authorNone
requires_python>=3.12
licenseNone
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/a2/73/404481b6c3f48b5ce3729896bf77d3c3d880134d26718d76ea9776a46a21/modak-0.3.9.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": null,
    "summary": "A simple, opinionated task manager",
    "version": "0.3.9",
    "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": "3e01ae86f3aeeae42acc5f01e8095dcce9183327a5369e6124e25071d2ca8e74",
                "md5": "3d3486d3d6580a8d480a8f00688da47b",
                "sha256": "e7c3c152bb4e780dfb71a3d38c48987500cc57d7affb05c8a45a256e349b9963"
            },
            "downloads": -1,
            "filename": "modak-0.3.9-cp312-cp312-macosx_10_12_x86_64.whl",
            "has_sig": false,
            "md5_digest": "3d3486d3d6580a8d480a8f00688da47b",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.12",
            "size": 1662429,
            "upload_time": "2025-08-05T17:51:47",
            "upload_time_iso_8601": "2025-08-05T17:51:47.507473Z",
            "url": "https://files.pythonhosted.org/packages/3e/01/ae86f3aeeae42acc5f01e8095dcce9183327a5369e6124e25071d2ca8e74/modak-0.3.9-cp312-cp312-macosx_10_12_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "3628271be6be9384ebf2bf9bca24eefd0181ee11629c129dc0a2244e262744c2",
                "md5": "e6cb625c12ab3682c84c6a6d22e1c586",
                "sha256": "d1f87882ccdbcdeafe4785a65213c286d37a9b255c1ebbc1de30231482c90a9f"
            },
            "downloads": -1,
            "filename": "modak-0.3.9-cp312-cp312-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "e6cb625c12ab3682c84c6a6d22e1c586",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.12",
            "size": 1560581,
            "upload_time": "2025-08-05T17:51:44",
            "upload_time_iso_8601": "2025-08-05T17:51:44.417703Z",
            "url": "https://files.pythonhosted.org/packages/36/28/271be6be9384ebf2bf9bca24eefd0181ee11629c129dc0a2244e262744c2/modak-0.3.9-cp312-cp312-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "3a4d9300da2ea98edab702d396add394a112535975695b511da13e1d95b316dd",
                "md5": "d3a37588b7ccac2a2e1cdb57745e33b9",
                "sha256": "cc5fca202a3078fbeb17aa67eedf30e7739bad35d87add6d75ad509662c0942c"
            },
            "downloads": -1,
            "filename": "modak-0.3.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "d3a37588b7ccac2a2e1cdb57745e33b9",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.12",
            "size": 1600629,
            "upload_time": "2025-08-05T17:51:18",
            "upload_time_iso_8601": "2025-08-05T17:51:18.907117Z",
            "url": "https://files.pythonhosted.org/packages/3a/4d/9300da2ea98edab702d396add394a112535975695b511da13e1d95b316dd/modak-0.3.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "71b28e78c73430887ac6822c10bc1096dffb9234af7e0b7ab6736a8562236fbe",
                "md5": "e204d569eabf0d275d606c07df604509",
                "sha256": "40bf1f5e4397427adb75fc40bd0896b41819d60472aa7af6daf3e6532f7b9741"
            },
            "downloads": -1,
            "filename": "modak-0.3.9-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
            "has_sig": false,
            "md5_digest": "e204d569eabf0d275d606c07df604509",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.12",
            "size": 1581530,
            "upload_time": "2025-08-05T17:51:23",
            "upload_time_iso_8601": "2025-08-05T17:51:23.508518Z",
            "url": "https://files.pythonhosted.org/packages/71/b2/8e78c73430887ac6822c10bc1096dffb9234af7e0b7ab6736a8562236fbe/modak-0.3.9-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f845040a9adde8b7e6188281d9225cb0adc60334d88f197ef036d25124363123",
                "md5": "58e12f6991aa432b7c7532f29342d406",
                "sha256": "8b687e7b936ac60e23755878132e7dbe7d9f463113afcf779afe96dac5eead02"
            },
            "downloads": -1,
            "filename": "modak-0.3.9-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl",
            "has_sig": false,
            "md5_digest": "58e12f6991aa432b7c7532f29342d406",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.12",
            "size": 1894250,
            "upload_time": "2025-08-05T17:51:36",
            "upload_time_iso_8601": "2025-08-05T17:51:36.470789Z",
            "url": "https://files.pythonhosted.org/packages/f8/45/040a9adde8b7e6188281d9225cb0adc60334d88f197ef036d25124363123/modak-0.3.9-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "3fbd6a619cdf4b4dbc9a1edf0b6f079bebfef14ec086c791e07c9e0415696d80",
                "md5": "2ab690df4682141605300d3b14c5d521",
                "sha256": "d765c74c69679e9dfc1c56257d47620e7ffe5173b950b8e98cc003c5d48b0e02"
            },
            "downloads": -1,
            "filename": "modak-0.3.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
            "has_sig": false,
            "md5_digest": "2ab690df4682141605300d3b14c5d521",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.12",
            "size": 1916578,
            "upload_time": "2025-08-05T17:51:27",
            "upload_time_iso_8601": "2025-08-05T17:51:27.545325Z",
            "url": "https://files.pythonhosted.org/packages/3f/bd/6a619cdf4b4dbc9a1edf0b6f079bebfef14ec086c791e07c9e0415696d80/modak-0.3.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "3aab5bd9085e34a7dffa98a002f7c854b4ce4ed4ebcd107ec2e1ee57f77c1959",
                "md5": "bc749ba6928fac9d1a642536440cf18e",
                "sha256": "a93da1dbb6b4d0116de618ab5cfd839a11705dcd03d7174ccc9d1fb5efc51b02"
            },
            "downloads": -1,
            "filename": "modak-0.3.9-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl",
            "has_sig": false,
            "md5_digest": "bc749ba6928fac9d1a642536440cf18e",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.12",
            "size": 1824579,
            "upload_time": "2025-08-05T17:51:31",
            "upload_time_iso_8601": "2025-08-05T17:51:31.670479Z",
            "url": "https://files.pythonhosted.org/packages/3a/ab/5bd9085e34a7dffa98a002f7c854b4ce4ed4ebcd107ec2e1ee57f77c1959/modak-0.3.9-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "2a329302ad6ba83c8cbe217d6b2e70bfd1faa444c6cb28015486b5827399f0d4",
                "md5": "f8b5ec97220c65c339573d184ce9882a",
                "sha256": "b12b7714adc889cc969aaf1da85ec5a5d1e21d20eb8679538dc1156bb58a3047"
            },
            "downloads": -1,
            "filename": "modak-0.3.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "f8b5ec97220c65c339573d184ce9882a",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.12",
            "size": 1747028,
            "upload_time": "2025-08-05T17:51:40",
            "upload_time_iso_8601": "2025-08-05T17:51:40.486896Z",
            "url": "https://files.pythonhosted.org/packages/2a/32/9302ad6ba83c8cbe217d6b2e70bfd1faa444c6cb28015486b5827399f0d4/modak-0.3.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "1c0df4346c1490a741cb5f688490de62389e0da70d60b359f0888da0efdf971e",
                "md5": "f8c4dad38979d86b8d15716620f2e8b3",
                "sha256": "0884fcaea77d9eedb6ecb6618d608e600972a796aea20bb324b0320dadefd7a6"
            },
            "downloads": -1,
            "filename": "modak-0.3.9-cp312-cp312-musllinux_1_2_aarch64.whl",
            "has_sig": false,
            "md5_digest": "f8c4dad38979d86b8d15716620f2e8b3",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.12",
            "size": 1887954,
            "upload_time": "2025-08-05T17:51:50",
            "upload_time_iso_8601": "2025-08-05T17:51:50.245936Z",
            "url": "https://files.pythonhosted.org/packages/1c/0d/f4346c1490a741cb5f688490de62389e0da70d60b359f0888da0efdf971e/modak-0.3.9-cp312-cp312-musllinux_1_2_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "9ddea963060ae223e1f6bc09fdaae7151625ba198f3f40356cc3a32824155aff",
                "md5": "b1c946efb9773ec236882f46a292c79d",
                "sha256": "109c9e0db90c58070fdc2dcc8dedcce593a4455f000e8362cb1425587e580eec"
            },
            "downloads": -1,
            "filename": "modak-0.3.9-cp312-cp312-musllinux_1_2_armv7l.whl",
            "has_sig": false,
            "md5_digest": "b1c946efb9773ec236882f46a292c79d",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.12",
            "size": 1951044,
            "upload_time": "2025-08-05T17:51:55",
            "upload_time_iso_8601": "2025-08-05T17:51:55.582395Z",
            "url": "https://files.pythonhosted.org/packages/9d/de/a963060ae223e1f6bc09fdaae7151625ba198f3f40356cc3a32824155aff/modak-0.3.9-cp312-cp312-musllinux_1_2_armv7l.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "6619f58b5e177ec2d6213c72d0657d2226c409433187cd5a82aefd6ef264ae6b",
                "md5": "afe12f8692d23f84fdecce85f343a248",
                "sha256": "17a7df9dcae249ad8b7af428902321b24fea2a6c3d61e5e284c18a0bdee93615"
            },
            "downloads": -1,
            "filename": "modak-0.3.9-cp312-cp312-musllinux_1_2_i686.whl",
            "has_sig": false,
            "md5_digest": "afe12f8692d23f84fdecce85f343a248",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.12",
            "size": 2044551,
            "upload_time": "2025-08-05T17:51:59",
            "upload_time_iso_8601": "2025-08-05T17:51:59.549660Z",
            "url": "https://files.pythonhosted.org/packages/66/19/f58b5e177ec2d6213c72d0657d2226c409433187cd5a82aefd6ef264ae6b/modak-0.3.9-cp312-cp312-musllinux_1_2_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "1bac1e9847c59275f9811fa07e21a38c048562b7db8a14836615f16b0666fef3",
                "md5": "b0bfc8e5bf10a3f666d9a6809dddbe82",
                "sha256": "df2958949f053e54e106023a3655ecdc0019c3c68c078012eef605abe7c9e506"
            },
            "downloads": -1,
            "filename": "modak-0.3.9-cp312-cp312-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "b0bfc8e5bf10a3f666d9a6809dddbe82",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.12",
            "size": 1923553,
            "upload_time": "2025-08-05T17:52:03",
            "upload_time_iso_8601": "2025-08-05T17:52:03.510974Z",
            "url": "https://files.pythonhosted.org/packages/1b/ac/1e9847c59275f9811fa07e21a38c048562b7db8a14836615f16b0666fef3/modak-0.3.9-cp312-cp312-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "865e00151d51587fa91302d422d0ead8213d113f411d42483502e65ea36e96b9",
                "md5": "9aa19ef47462df62013d9c548d867592",
                "sha256": "9f16e58b70e3e0100fe27e16943bb5ea939f78a9aa4eae8b558139673149874f"
            },
            "downloads": -1,
            "filename": "modak-0.3.9-cp312-cp312-win32.whl",
            "has_sig": false,
            "md5_digest": "9aa19ef47462df62013d9c548d867592",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.12",
            "size": 1262046,
            "upload_time": "2025-08-05T17:52:12",
            "upload_time_iso_8601": "2025-08-05T17:52:12.519299Z",
            "url": "https://files.pythonhosted.org/packages/86/5e/00151d51587fa91302d422d0ead8213d113f411d42483502e65ea36e96b9/modak-0.3.9-cp312-cp312-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "dd914b792ce991679e170c1b9e47ccb457328fff5816787994f3df0139d3e63c",
                "md5": "84a7a395e642b9207d3bf894cb4783ed",
                "sha256": "4cf021ecda418dac91a5a3737a4e88282d1588bf36f8112cf5e440c6fc092b44"
            },
            "downloads": -1,
            "filename": "modak-0.3.9-cp312-cp312-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "84a7a395e642b9207d3bf894cb4783ed",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.12",
            "size": 1445611,
            "upload_time": "2025-08-05T17:52:10",
            "upload_time_iso_8601": "2025-08-05T17:52:10.005666Z",
            "url": "https://files.pythonhosted.org/packages/dd/91/4b792ce991679e170c1b9e47ccb457328fff5816787994f3df0139d3e63c/modak-0.3.9-cp312-cp312-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "4cbc314dfb58d558b2948eed0e3db29d34b053763ad17543cb8211abe0b6c3fa",
                "md5": "7b6fcef49c0f6c5575ac9ad332573290",
                "sha256": "4c8fc35b1ffe78d95616801374bcd664cf8eec60384cfeabd5d5677abf5d8ea4"
            },
            "downloads": -1,
            "filename": "modak-0.3.9-cp313-cp313-macosx_10_12_x86_64.whl",
            "has_sig": false,
            "md5_digest": "7b6fcef49c0f6c5575ac9ad332573290",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.12",
            "size": 1662115,
            "upload_time": "2025-08-05T17:51:48",
            "upload_time_iso_8601": "2025-08-05T17:51:48.775194Z",
            "url": "https://files.pythonhosted.org/packages/4c/bc/314dfb58d558b2948eed0e3db29d34b053763ad17543cb8211abe0b6c3fa/modak-0.3.9-cp313-cp313-macosx_10_12_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "d09646d160e659df7386012a9c6882c58107dfa63cd9a1528a37ed1fd4d74dd1",
                "md5": "ff10ba6bf9d45e980effee9c81374a86",
                "sha256": "cbdca4148bb3801652a7aebf7233208e206a5e6f3bddc1a2078590ad8bec3702"
            },
            "downloads": -1,
            "filename": "modak-0.3.9-cp313-cp313-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "ff10ba6bf9d45e980effee9c81374a86",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.12",
            "size": 1559831,
            "upload_time": "2025-08-05T17:51:45",
            "upload_time_iso_8601": "2025-08-05T17:51:45.673425Z",
            "url": "https://files.pythonhosted.org/packages/d0/96/46d160e659df7386012a9c6882c58107dfa63cd9a1528a37ed1fd4d74dd1/modak-0.3.9-cp313-cp313-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "9f1b657ffe8ad5d128cbff020658a246197d5659a1cf59ac6e8b63d1a5bcc366",
                "md5": "f664e933e91ab8342ec15f59f121c9a7",
                "sha256": "cd0c289e2f7914108bf4bebe1190d1f300ba78b1bcab4749f4ae8dd41c4ea1f0"
            },
            "downloads": -1,
            "filename": "modak-0.3.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "f664e933e91ab8342ec15f59f121c9a7",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.12",
            "size": 1599993,
            "upload_time": "2025-08-05T17:51:20",
            "upload_time_iso_8601": "2025-08-05T17:51:20.854567Z",
            "url": "https://files.pythonhosted.org/packages/9f/1b/657ffe8ad5d128cbff020658a246197d5659a1cf59ac6e8b63d1a5bcc366/modak-0.3.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "aa53e9c56297ba0e443460765c5fca29e64479ba251a66d035ecfc22dc54a2dc",
                "md5": "e78eda216459f9f669d6aeb26952a5f1",
                "sha256": "638758ad4f247e139069f8fd3fa3fc2975732e6fd25ec03bd2f386009a457865"
            },
            "downloads": -1,
            "filename": "modak-0.3.9-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
            "has_sig": false,
            "md5_digest": "e78eda216459f9f669d6aeb26952a5f1",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.12",
            "size": 1581106,
            "upload_time": "2025-08-05T17:51:24",
            "upload_time_iso_8601": "2025-08-05T17:51:24.865214Z",
            "url": "https://files.pythonhosted.org/packages/aa/53/e9c56297ba0e443460765c5fca29e64479ba251a66d035ecfc22dc54a2dc/modak-0.3.9-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "a7a87a080b6928f743d3490d76ecc96a66107ba2e7530bcb1fbe4f61d35efeaf",
                "md5": "72c1456962c7abaa0ea43f093e5c7528",
                "sha256": "57e5cb590e79a0e053d98a5ffa5f93b27444aadf39e8a9993030217f212636c6"
            },
            "downloads": -1,
            "filename": "modak-0.3.9-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl",
            "has_sig": false,
            "md5_digest": "72c1456962c7abaa0ea43f093e5c7528",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.12",
            "size": 1893184,
            "upload_time": "2025-08-05T17:51:37",
            "upload_time_iso_8601": "2025-08-05T17:51:37.673638Z",
            "url": "https://files.pythonhosted.org/packages/a7/a8/7a080b6928f743d3490d76ecc96a66107ba2e7530bcb1fbe4f61d35efeaf/modak-0.3.9-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "051dfd78563da8ece2741acedb14ba5ca41895ab073f7fa78f644ad0b22e3144",
                "md5": "a9d1e076c653c14e445638d697550608",
                "sha256": "a13a36d5454f7c0c2e0d74b68bce438900376e700341088be1d37396a99d7e27"
            },
            "downloads": -1,
            "filename": "modak-0.3.9-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
            "has_sig": false,
            "md5_digest": "a9d1e076c653c14e445638d697550608",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.12",
            "size": 1915089,
            "upload_time": "2025-08-05T17:51:28",
            "upload_time_iso_8601": "2025-08-05T17:51:28.798301Z",
            "url": "https://files.pythonhosted.org/packages/05/1d/fd78563da8ece2741acedb14ba5ca41895ab073f7fa78f644ad0b22e3144/modak-0.3.9-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "e3a1452037af9c056fc9529a2721104e6faf80f5e963b86a64838e694820d71f",
                "md5": "186aac9a0b4e284d73463e9dc063c450",
                "sha256": "d90ea2cd160469780b3bbce0a39c88f8f0bf9b54048d5ad6f4ff3b6f4d33441c"
            },
            "downloads": -1,
            "filename": "modak-0.3.9-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl",
            "has_sig": false,
            "md5_digest": "186aac9a0b4e284d73463e9dc063c450",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.12",
            "size": 1824919,
            "upload_time": "2025-08-05T17:51:33",
            "upload_time_iso_8601": "2025-08-05T17:51:33.196250Z",
            "url": "https://files.pythonhosted.org/packages/e3/a1/452037af9c056fc9529a2721104e6faf80f5e963b86a64838e694820d71f/modak-0.3.9-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "31ed2292f7973c4238d04ead02f47d5a5c61903977d3591e43abd52de0fdd947",
                "md5": "d58a6366044efcc161722311e93f549d",
                "sha256": "316c832c4ea62fef7be7ad590c111b3c94a48584b209c3508c4b4d1870f9a9cb"
            },
            "downloads": -1,
            "filename": "modak-0.3.9-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "d58a6366044efcc161722311e93f549d",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.12",
            "size": 1746614,
            "upload_time": "2025-08-05T17:51:41",
            "upload_time_iso_8601": "2025-08-05T17:51:41.956092Z",
            "url": "https://files.pythonhosted.org/packages/31/ed/2292f7973c4238d04ead02f47d5a5c61903977d3591e43abd52de0fdd947/modak-0.3.9-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "11d64ca4cdaeca7c5d69455a36dadcabe1eb717463abd63440c5b837bbd2839a",
                "md5": "b8b42a4ac4f9af791f4f1181e5792416",
                "sha256": "3ca97c74eb119913deae90972e34b9ea91cba431e51a97f56118b673ec1bc131"
            },
            "downloads": -1,
            "filename": "modak-0.3.9-cp313-cp313-musllinux_1_2_aarch64.whl",
            "has_sig": false,
            "md5_digest": "b8b42a4ac4f9af791f4f1181e5792416",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.12",
            "size": 1887400,
            "upload_time": "2025-08-05T17:51:51",
            "upload_time_iso_8601": "2025-08-05T17:51:51.586289Z",
            "url": "https://files.pythonhosted.org/packages/11/d6/4ca4cdaeca7c5d69455a36dadcabe1eb717463abd63440c5b837bbd2839a/modak-0.3.9-cp313-cp313-musllinux_1_2_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "19725bb90ca15d05a5578eaf9286b8a07bc696bc7bbcfae953cc9866bbe0c6a1",
                "md5": "4d26156d1fa0fc26a7e22a44dc222550",
                "sha256": "879ae142b4dd7f536dbaf4c4f3c9eda06c68be2bb4101021736d491d6b1d9f9d"
            },
            "downloads": -1,
            "filename": "modak-0.3.9-cp313-cp313-musllinux_1_2_armv7l.whl",
            "has_sig": false,
            "md5_digest": "4d26156d1fa0fc26a7e22a44dc222550",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.12",
            "size": 1950393,
            "upload_time": "2025-08-05T17:51:56",
            "upload_time_iso_8601": "2025-08-05T17:51:56.798381Z",
            "url": "https://files.pythonhosted.org/packages/19/72/5bb90ca15d05a5578eaf9286b8a07bc696bc7bbcfae953cc9866bbe0c6a1/modak-0.3.9-cp313-cp313-musllinux_1_2_armv7l.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "b1f1ba34f75b6df46d254482f8e103c4c0825028d0e9d4b52f1729311958707a",
                "md5": "bc0b031ee7fd02b0b6b63565ecc134ae",
                "sha256": "581fb8951fd320f0022c819a21c649c4b9cfcd06e275d00b9d9f9bb47238ba2c"
            },
            "downloads": -1,
            "filename": "modak-0.3.9-cp313-cp313-musllinux_1_2_i686.whl",
            "has_sig": false,
            "md5_digest": "bc0b031ee7fd02b0b6b63565ecc134ae",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.12",
            "size": 2044059,
            "upload_time": "2025-08-05T17:52:00",
            "upload_time_iso_8601": "2025-08-05T17:52:00.789486Z",
            "url": "https://files.pythonhosted.org/packages/b1/f1/ba34f75b6df46d254482f8e103c4c0825028d0e9d4b52f1729311958707a/modak-0.3.9-cp313-cp313-musllinux_1_2_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "7439db677372a3124803e0e66dbdb5c4ffff0573d702d3535e49d3a0d3158faa",
                "md5": "70cf70dd5a5235831f249d7f7d9c4e6b",
                "sha256": "d7b32cc4179cf42bb547eee13d3a924b0ce4fce0de314e034366527c64dd747c"
            },
            "downloads": -1,
            "filename": "modak-0.3.9-cp313-cp313-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "70cf70dd5a5235831f249d7f7d9c4e6b",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.12",
            "size": 1922952,
            "upload_time": "2025-08-05T17:52:05",
            "upload_time_iso_8601": "2025-08-05T17:52:05.180791Z",
            "url": "https://files.pythonhosted.org/packages/74/39/db677372a3124803e0e66dbdb5c4ffff0573d702d3535e49d3a0d3158faa/modak-0.3.9-cp313-cp313-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "bdc0f48da086d3b9a6a56a03469d40fd0fbfd31d017019ee6c285463d2c968dc",
                "md5": "059ef3c4a4a810e8efeb7126654f3a62",
                "sha256": "8da02b34b3d8a82080790fadaac3fa7c3c8efde9a9c6fa8f4d43dc6ab1829255"
            },
            "downloads": -1,
            "filename": "modak-0.3.9-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "059ef3c4a4a810e8efeb7126654f3a62",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.12",
            "size": 1598443,
            "upload_time": "2025-08-05T17:51:22",
            "upload_time_iso_8601": "2025-08-05T17:51:22.272442Z",
            "url": "https://files.pythonhosted.org/packages/bd/c0/f48da086d3b9a6a56a03469d40fd0fbfd31d017019ee6c285463d2c968dc/modak-0.3.9-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "92d4f449fbcaa0a4983d9a02f1d05a709bf1de5e332eb010791690e7eabe076b",
                "md5": "7bcbe41d8ed874a33754dfaecf75477d",
                "sha256": "be89f246edb781138c10d93ce0494c2611d725371ea739940ad2453ab959dfd7"
            },
            "downloads": -1,
            "filename": "modak-0.3.9-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
            "has_sig": false,
            "md5_digest": "7bcbe41d8ed874a33754dfaecf75477d",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.12",
            "size": 1581161,
            "upload_time": "2025-08-05T17:51:26",
            "upload_time_iso_8601": "2025-08-05T17:51:26.345265Z",
            "url": "https://files.pythonhosted.org/packages/92/d4/f449fbcaa0a4983d9a02f1d05a709bf1de5e332eb010791690e7eabe076b/modak-0.3.9-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "4353af4f4e3b466a68b7213abccb7c318f6c15043e05c020f3e53223f523fc01",
                "md5": "20121d868d67c54b903adde067be2663",
                "sha256": "19a56d637258eac1fd19d6b10169462f5ac02ccb5ab6ec9ba4498c52d99f92a2"
            },
            "downloads": -1,
            "filename": "modak-0.3.9-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
            "has_sig": false,
            "md5_digest": "20121d868d67c54b903adde067be2663",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.12",
            "size": 1910017,
            "upload_time": "2025-08-05T17:51:30",
            "upload_time_iso_8601": "2025-08-05T17:51:30.255375Z",
            "url": "https://files.pythonhosted.org/packages/43/53/af4f4e3b466a68b7213abccb7c318f6c15043e05c020f3e53223f523fc01/modak-0.3.9-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "209f52971650725fcb57761cab1c62832dbac98f40c2b773bd315c06f6373ce5",
                "md5": "133712aa35179ea3a6d84ee1a23ea260",
                "sha256": "5fb38180bf90c7015bf3df20eeec00ff8487dc7f92586692340ffd7048a6c24f"
            },
            "downloads": -1,
            "filename": "modak-0.3.9-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl",
            "has_sig": false,
            "md5_digest": "133712aa35179ea3a6d84ee1a23ea260",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.12",
            "size": 1821760,
            "upload_time": "2025-08-05T17:51:34",
            "upload_time_iso_8601": "2025-08-05T17:51:34.366759Z",
            "url": "https://files.pythonhosted.org/packages/20/9f/52971650725fcb57761cab1c62832dbac98f40c2b773bd315c06f6373ce5/modak-0.3.9-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "dd8adc16eee1b44d3f336ef675bd01ac61de33044fb41fe1358c2944a3045c22",
                "md5": "2b0eb6557d09555f54544d19aba18812",
                "sha256": "f4ef75980c357f9e4ece8208322535ae1565e2f043fdae9d7b34a49231c3d642"
            },
            "downloads": -1,
            "filename": "modak-0.3.9-cp313-cp313t-musllinux_1_2_aarch64.whl",
            "has_sig": false,
            "md5_digest": "2b0eb6557d09555f54544d19aba18812",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.12",
            "size": 1886003,
            "upload_time": "2025-08-05T17:51:53",
            "upload_time_iso_8601": "2025-08-05T17:51:53.903181Z",
            "url": "https://files.pythonhosted.org/packages/dd/8a/dc16eee1b44d3f336ef675bd01ac61de33044fb41fe1358c2944a3045c22/modak-0.3.9-cp313-cp313t-musllinux_1_2_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "10ee4127f90aa13df6605e35da94ab6f1eb729d077755de997473b8b866ff380",
                "md5": "8874f7e5de7fceb26166dc0ef3ecf032",
                "sha256": "93b5034492ab441bde72305552e3f0e8977736be331c43e465b7e17ff1a5e637"
            },
            "downloads": -1,
            "filename": "modak-0.3.9-cp313-cp313t-musllinux_1_2_armv7l.whl",
            "has_sig": false,
            "md5_digest": "8874f7e5de7fceb26166dc0ef3ecf032",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.12",
            "size": 1950665,
            "upload_time": "2025-08-05T17:51:58",
            "upload_time_iso_8601": "2025-08-05T17:51:58.102773Z",
            "url": "https://files.pythonhosted.org/packages/10/ee/4127f90aa13df6605e35da94ab6f1eb729d077755de997473b8b866ff380/modak-0.3.9-cp313-cp313t-musllinux_1_2_armv7l.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "3c11206cde4b280d0959ff888665ad4a94f46270d46b086fcb10a053d19f7dd2",
                "md5": "22bb56d71352d00a4fe4f5584a02d6ad",
                "sha256": "a5bac3af831c557a227208d4d9b5f9b9b4933948b3e57135538207804dd448b4"
            },
            "downloads": -1,
            "filename": "modak-0.3.9-cp313-cp313t-musllinux_1_2_i686.whl",
            "has_sig": false,
            "md5_digest": "22bb56d71352d00a4fe4f5584a02d6ad",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.12",
            "size": 2044241,
            "upload_time": "2025-08-05T17:52:02",
            "upload_time_iso_8601": "2025-08-05T17:52:02.250678Z",
            "url": "https://files.pythonhosted.org/packages/3c/11/206cde4b280d0959ff888665ad4a94f46270d46b086fcb10a053d19f7dd2/modak-0.3.9-cp313-cp313t-musllinux_1_2_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "ef14370428a6bc71e3bc72fe4cfc0325ed4dd4fa5f1053f20c2dc01232bcc1c5",
                "md5": "b8543a82e4eaa7fd791de31de323e930",
                "sha256": "13fbb32bc95ee598897d0bf2b93a4e2b6088c58b063f76b96c71a8b3d6219ca2"
            },
            "downloads": -1,
            "filename": "modak-0.3.9-cp313-cp313t-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "b8543a82e4eaa7fd791de31de323e930",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.12",
            "size": 1920786,
            "upload_time": "2025-08-05T17:52:07",
            "upload_time_iso_8601": "2025-08-05T17:52:07.456752Z",
            "url": "https://files.pythonhosted.org/packages/ef/14/370428a6bc71e3bc72fe4cfc0325ed4dd4fa5f1053f20c2dc01232bcc1c5/modak-0.3.9-cp313-cp313t-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "734efec986e8804169a59b02cde684b8b44f784ddac822cc2b26227d5fd01d8c",
                "md5": "edc5ffc099d5b7a6da3c2a8d667ad143",
                "sha256": "bf062131d8f5913000b4cffc47ec35d7a1591573fed1e914d4ee0aa13179172c"
            },
            "downloads": -1,
            "filename": "modak-0.3.9-cp313-cp313-win32.whl",
            "has_sig": false,
            "md5_digest": "edc5ffc099d5b7a6da3c2a8d667ad143",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.12",
            "size": 1261633,
            "upload_time": "2025-08-05T17:52:13",
            "upload_time_iso_8601": "2025-08-05T17:52:13.570976Z",
            "url": "https://files.pythonhosted.org/packages/73/4e/fec986e8804169a59b02cde684b8b44f784ddac822cc2b26227d5fd01d8c/modak-0.3.9-cp313-cp313-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "ebe577e8853a9ef150ff965bac919839c198cde0f57f73eeae18fb4b772f9f5f",
                "md5": "c0541ebebabbda8d4615c3c9cfe89339",
                "sha256": "e8bf1a1a9a99a73071d15d3f75d1c62c8c0a831343a4972812f56a2341b2ac48"
            },
            "downloads": -1,
            "filename": "modak-0.3.9-cp313-cp313-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "c0541ebebabbda8d4615c3c9cfe89339",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.12",
            "size": 1445025,
            "upload_time": "2025-08-05T17:52:11",
            "upload_time_iso_8601": "2025-08-05T17:52:11.282052Z",
            "url": "https://files.pythonhosted.org/packages/eb/e5/77e8853a9ef150ff965bac919839c198cde0f57f73eeae18fb4b772f9f5f/modak-0.3.9-cp313-cp313-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "c9b2788adad8a57c85d5febfcad0d7a178b744e1a68ec4898b466ad293f6e5f8",
                "md5": "0b816e1b4a5890ecf0c3598919e68035",
                "sha256": "29b7e5e2c4ffa420d34cfda7909a68e63a4532def2c99934ddfd3ba01a6104af"
            },
            "downloads": -1,
            "filename": "modak-0.3.9-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl",
            "has_sig": false,
            "md5_digest": "0b816e1b4a5890ecf0c3598919e68035",
            "packagetype": "bdist_wheel",
            "python_version": "cp314",
            "requires_python": ">=3.12",
            "size": 1893399,
            "upload_time": "2025-08-05T17:51:39",
            "upload_time_iso_8601": "2025-08-05T17:51:39.201890Z",
            "url": "https://files.pythonhosted.org/packages/c9/b2/788adad8a57c85d5febfcad0d7a178b744e1a68ec4898b466ad293f6e5f8/modak-0.3.9-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "788c153845388894f35ce7abf822693b276c5c4b427801501a709d1dc5a248d8",
                "md5": "1716cfc0fca02964fb986371fb2f564a",
                "sha256": "d19f8ae283182ed6e00df0450902a4f375fba5a8eadfacae8a7e77775f3e0664"
            },
            "downloads": -1,
            "filename": "modak-0.3.9-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "1716cfc0fca02964fb986371fb2f564a",
            "packagetype": "bdist_wheel",
            "python_version": "cp314",
            "requires_python": ">=3.12",
            "size": 1747133,
            "upload_time": "2025-08-05T17:51:43",
            "upload_time_iso_8601": "2025-08-05T17:51:43.114167Z",
            "url": "https://files.pythonhosted.org/packages/78/8c/153845388894f35ce7abf822693b276c5c4b427801501a709d1dc5a248d8/modak-0.3.9-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "a273404481b6c3f48b5ce3729896bf77d3c3d880134d26718d76ea9776a46a21",
                "md5": "f2153ddcb8c89864bd333ec723644950",
                "sha256": "a8b4af49a6e1295171a34c15021f76fdabfa4e1b473ee005b4fa4c67d94ef73f"
            },
            "downloads": -1,
            "filename": "modak-0.3.9.tar.gz",
            "has_sig": false,
            "md5_digest": "f2153ddcb8c89864bd333ec723644950",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.12",
            "size": 46359,
            "upload_time": "2025-08-05T17:52:08",
            "upload_time_iso_8601": "2025-08-05T17:52:08.841091Z",
            "url": "https://files.pythonhosted.org/packages/a2/73/404481b6c3f48b5ce3729896bf77d3c3d880134d26718d76ea9776a46a21/modak-0.3.9.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-05 17:52:08",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "denehoffman",
    "github_project": "modak",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "modak"
}
        
Elapsed time: 1.66504s