diff --git a/.github/dependabot.yml b/.github/dependabot.yml index fbb58d45..be4ca538 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -5,8 +5,11 @@ updates: directory: "/" schedule: interval: "weekly" - groups: github-actions: patterns: - "*" + - package-ecosystem: "uv" + directory: "/" + schedule: + interval: "weekly" diff --git a/.python-version b/.python-version index 6324d401..24ee5b1b 100644 --- a/.python-version +++ b/.python-version @@ -1 +1 @@ -3.14 +3.13 diff --git a/README.md b/README.md index 88a4df12..b72fb5d6 100644 --- a/README.md +++ b/README.md @@ -62,8 +62,6 @@ or $ pixi add pytask ``` -or use pip, conda, or mamba if you like. - Color support is automatically available on non-Windows platforms. On Windows, please, use [Windows Terminal](https://github.com/microsoft/terminal), which can be, for example, installed via the [Microsoft Store](https://aka.ms/terminal). diff --git a/docs/source/developers_guide.md b/docs/source/developers_guide.md index fbd06b77..7a4a7df7 100644 --- a/docs/source/developers_guide.md +++ b/docs/source/developers_guide.md @@ -52,7 +52,11 @@ $ python -m cProfile -o log.pstats -m pytask directory/with/tasks The profile can be visualized with ```console -$ pip install yelp-gprof2dot +$ uv add yelp-gprof2dot + +# or + +$ pixi add --pypi yelp-gprof2dot $ gprof2dot log.pstats | dot -T svg -o out.svg ``` diff --git a/docs/source/how_to_guides/hashing_inputs_of_tasks.md b/docs/source/how_to_guides/hashing_inputs_of_tasks.md index afd3144b..a38971cb 100644 --- a/docs/source/how_to_guides/hashing_inputs_of_tasks.md +++ b/docs/source/how_to_guides/hashing_inputs_of_tasks.md @@ -54,8 +54,8 @@ function to the {class}`~pytask.PythonNode` that generates a stable hash. First, install `deepdiff`. ```console -$ pip install deepdiff -$ conda install deepdiff +$ uv add deepdiff +$ pixi add deepdiff ``` Then, create the hash function and pass it to the node. Make sure it returns either an diff --git a/docs/source/how_to_guides/migrating_from_scripts_to_pytask.md b/docs/source/how_to_guides/migrating_from_scripts_to_pytask.md index ffd0fb5c..8806e35d 100644 --- a/docs/source/how_to_guides/migrating_from_scripts_to_pytask.md +++ b/docs/source/how_to_guides/migrating_from_scripts_to_pytask.md @@ -21,12 +21,12 @@ guide concludes with an additional example of an R script. ## Installation -To get started with pytask, simply install it with pip or conda: +To get started with pytask, install it with uv or pixi: ```console -$ pip install pytask pytask-parallel +$ uv add pytask pytask-parallel -$ conda -c conda-forge pytask pytask-parallel +$ pixi add pytask pytask-parallel ``` ## From Python script to task @@ -104,9 +104,9 @@ about the plugin in the repo's readme. First, we will install the package. ```console -$ pip install pytask-r +$ uv add pytask-r -$ conda install -c conda-forge pytask-r +$ pixi add pytask-r ``` ```{seealso} diff --git a/docs/source/tutorials/installation.md b/docs/source/tutorials/installation.md index 3abbda03..492186c0 100644 --- a/docs/source/tutorials/installation.md +++ b/docs/source/tutorials/installation.md @@ -22,20 +22,6 @@ $ pixi add pytask Learn more about [uv](https://docs.astral.sh/uv/) and [pixi](https://pixi.sh/). -## Traditional - -You can also install pytask using traditional package managers: - -```console -$ pip install pytask -``` - -or - -```console -$ conda install -c conda-forge pytask -``` - Verify the installation by displaying the help page listing all available commands and diff --git a/docs/source/tutorials/set_up_a_project.md b/docs/source/tutorials/set_up_a_project.md index 891e8d9b..e647ac2a 100644 --- a/docs/source/tutorials/set_up_a_project.md +++ b/docs/source/tutorials/set_up_a_project.md @@ -128,68 +128,7 @@ paths = ["src/my_project"] ```` -````{tab-item} pip -:sync: pip -Create a `pyproject.toml` file for project configuration: - -```toml -[project] -name = "my_project" -version = "0.1.0" -requires-python = ">=3.10" -dependencies = ["pytask"] - -[build-system] -requires = ["hatchling"] -build-backend = "hatchling.build" - -[tool.pytask.ini_options] -paths = ["src/my_project"] -``` - -Also create a `requirements.txt` file: - -```text -pytask -``` - -```` - -````{tab-item} conda/mamba -:sync: conda - -Create an `environment.yml` file that includes the editable install: - -```yaml -name: my_project -channels: - - conda-forge -dependencies: - - python>=3.10 - - pytask - - pip - - pip: - - -e . -``` - -And a `pyproject.toml` file for project configuration: - -```toml -[project] -name = "my_project" -version = "0.1.0" -requires-python = ">=3.10" - -[build-system] -requires = ["hatchling"] -build-backend = "hatchling" - -[tool.pytask.ini_options] -paths = ["src/my_project"] -``` - -```` ````` The `[tool.pytask.ini_options]` section tells pytask to look for tasks in @@ -227,33 +166,4 @@ pixi automatically creates the environment and installs dependencies. pixi will ```` -````{tab-item} pip -:sync: pip - -```console -$ pip install -e . -``` - -This creates an editable install where changes in the package's source files are immediately available in the installed version. - -```` - -````{tab-item} conda/mamba -:sync: conda - -```console -$ conda env create -f environment.yml -$ conda activate my_project -``` - -Or with mamba: - -```console -$ mamba env create -f environment.yml -$ mamba activate my_project -``` - -The editable install is automatically handled by the `pip: -e .` entry in `environment.yml`. - -```` ````` diff --git a/docs/source/tutorials/visualizing_the_dag.md b/docs/source/tutorials/visualizing_the_dag.md index 80d97d4f..96d7bb29 100644 --- a/docs/source/tutorials/visualizing_the_dag.md +++ b/docs/source/tutorials/visualizing_the_dag.md @@ -2,10 +2,10 @@ To visualize the {term}`DAG` of the project, first, install [pygraphviz](https://github.com/pygraphviz/pygraphviz) and -[graphviz](https://graphviz.org/). For example, you can both install with conda +[graphviz](https://graphviz.org/). For example, you can both install with pixi ```console -$ conda install -c conda-forge pygraphviz +$ pixi add pygraphviz graphviz ``` After that, pytask offers two interfaces to visualize your project's {term}`DAG`. diff --git a/justfile b/justfile index 4c1314f9..4cfdf4f5 100644 --- a/justfile +++ b/justfile @@ -12,7 +12,7 @@ test-cov *FLAGS: # Run type checking typing: - uv run --group typing --group test ty check src/ tests/ + uv run --group typing --group test --isolated ty check src/ tests/ # Run linting lint: diff --git a/pyproject.toml b/pyproject.toml index 330b5fa0..70aa5f19 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -78,7 +78,7 @@ test = [ "coiled>=1.42.0", "pygraphviz>=1.12;platform_system=='Linux'", ] -typing = ["ty>=0.0.7"] +typing = ["ty>=0.0.8"] [project.urls] Changelog = "https://pytask-dev.readthedocs.io/en/stable/changes.html" diff --git a/src/_pytask/click.py b/src/_pytask/click.py index 741ce650..85cc9487 100644 --- a/src/_pytask/click.py +++ b/src/_pytask/click.py @@ -10,6 +10,7 @@ from typing import TYPE_CHECKING from typing import Any from typing import ClassVar +from typing import cast import click from click import Choice @@ -28,6 +29,7 @@ from _pytask.console import create_panel_title if TYPE_CHECKING: + from collections.abc import Callable from collections.abc import Sequence @@ -39,7 +41,10 @@ else: from click.parser import _split_opt # ty: ignore[unresolved-import] -split_opt = _split_opt + +def split_opt(option: str) -> tuple[str, str]: + """Split an option into prefix and name.""" + return cast("Callable[[str], tuple[str, str]]", _split_opt)(option) class EnumChoice(Choice): @@ -251,7 +256,8 @@ def _print_options(group_or_command: Command | DefaultGroup, ctx: Context) -> No if param.metavar: opt2 += Text(f" {param.metavar}", style="metavar") elif isinstance(param.type, click.Choice): - choices = "[" + "|".join(param.type.choices) + "]" + choices_values = cast("Sequence[Any]", param.type.choices) + choices = "[" + "|".join(str(choice) for choice in choices_values) + "]" opt2 += Text(f" {choices}", style="metavar", overflow="fold") help_text = _format_help_text(param, ctx) diff --git a/uv.lock b/uv.lock index 4d0ccf28..da73057c 100644 --- a/uv.lock +++ b/uv.lock @@ -2763,7 +2763,7 @@ test = [ { name = "pytest-xdist", specifier = ">=3.6.1" }, { name = "syrupy", specifier = ">=4.5.0" }, ] -typing = [{ name = "ty", specifier = ">=0.0.7" }] +typing = [{ name = "ty", specifier = ">=0.0.8" }] [[package]] name = "pytest" @@ -3754,27 +3754,27 @@ wheels = [ [[package]] name = "ty" -version = "0.0.7" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b3/43/8be3ec2e2ce6119cff9ee3a207fae0cb4f2b4f8ed6534175130a32be24a7/ty-0.0.7.tar.gz", hash = "sha256:90e53b20b86c418ee41a8385f17da44cc7f916f96f9eee87593423ce8292ca72", size = 4826677, upload-time = "2025-12-24T21:28:49.136Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6e/56/fafa123acf955089306372add312f16e97aba61f7c4daf74e2bb9c350d23/ty-0.0.7-py3-none-linux_armv6l.whl", hash = "sha256:b30105bd9a0b064497111c50c206d5b6a032f29bcf39f09a12085c3009d72784", size = 9862360, upload-time = "2025-12-24T21:28:36.762Z" }, - { url = "https://files.pythonhosted.org/packages/71/f4/9c30ff498d9a60e24f16d26c0cf93cd03a119913ffa720a77149f02df06e/ty-0.0.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b4df20889115f3d5611a9d9cdedc222e3fd82b5fe87bb0a9f7246e53a23becc7", size = 9712866, upload-time = "2025-12-24T21:28:25.926Z" }, - { url = "https://files.pythonhosted.org/packages/43/84/e06a4a6e4011890027ffee41efbf261b1335103d09009d625ace7f1a60eb/ty-0.0.7-py3-none-macosx_11_0_arm64.whl", hash = "sha256:f699589d8511e1e17c5a7edfc5f4a4e80f2a6d4a3932a0e9e3422fd32d731472", size = 9221692, upload-time = "2025-12-24T21:28:29.649Z" }, - { url = "https://files.pythonhosted.org/packages/7a/e9/ebb4192d3627730125d40ee403a17dc91bab59d69c3eff286453b3218d01/ty-0.0.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3eaec2d8aa153ee4bcc43b17a384d0f9e66177c8c8127be3358b6b8348b9e3b", size = 9710340, upload-time = "2025-12-24T21:28:55.148Z" }, - { url = "https://files.pythonhosted.org/packages/8f/4a/ec144458a9cfb324d5cb471483094e62e74d73179343dff262a5cca1a1e1/ty-0.0.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:177d160295e6a56bdf0b61f6120bc4502fff301d4d10855ba711c109aa7f37fb", size = 9670317, upload-time = "2025-12-24T21:28:43.096Z" }, - { url = "https://files.pythonhosted.org/packages/b6/94/fe7106fd5e2ac06b81fba7b785a6216774618edc3fda9e17f58efe3cede6/ty-0.0.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30518b95ab5cc83615794cca765a5fb86df39a0d9c3dadc0ab2d787ab7830008", size = 10096517, upload-time = "2025-12-24T21:28:23.667Z" }, - { url = "https://files.pythonhosted.org/packages/45/d9/db96ccfd663c96bdd4bb63db72899198c01445012f939477a5318a563f14/ty-0.0.7-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:7867b3f75c2d9602cc6fb3b6d462580b707c2d112d4b27037142b0d01f8bfd03", size = 10996406, upload-time = "2025-12-24T21:28:39.134Z" }, - { url = "https://files.pythonhosted.org/packages/94/da/103915c08c3e6a14f95959614646fcdc9a240cd9a039fadbdcd086c819ee/ty-0.0.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:878d45858e209b7904753fbc5155f4cb75dadc20a26bbb77614bfef31580f9ae", size = 10712829, upload-time = "2025-12-24T21:28:27.745Z" }, - { url = "https://files.pythonhosted.org/packages/47/c0/d9be417bc8e459e13e9698978579eec9868f91f4c5d6ef663249967fec8b/ty-0.0.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:651820b193901825afce40ae68f6a51cd64dbfa4b81a45db90061401261f25e4", size = 10486541, upload-time = "2025-12-24T21:28:45.17Z" }, - { url = "https://files.pythonhosted.org/packages/ad/09/d1858c66620d8ae566e021ad0d7168914b1568841f8fe9e439116ce6b440/ty-0.0.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f56a5a0c1c045863b1b70c358a392b3f73b8528c5c571d409f19dd465525e116", size = 10255312, upload-time = "2025-12-24T21:28:53.17Z" }, - { url = "https://files.pythonhosted.org/packages/b6/0a/78f75089db491fd5fcc13d2845a0b2771b7f7d377450c64c6616e9c227bc/ty-0.0.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:748218fbc1f7b7f1b9d14e77d4f3d7fec72af794417e26b0185bdb94153afe1c", size = 9696201, upload-time = "2025-12-24T21:28:57.345Z" }, - { url = "https://files.pythonhosted.org/packages/01/9e/b26e94832fd563fef6f77a4487affc77a027b0e53106422c66aafb37fa01/ty-0.0.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:1ff80f3985a52a7358b9069b4a8d223e92cf312544a934a062d6d3a4fb6876b3", size = 9688907, upload-time = "2025-12-24T21:28:59.485Z" }, - { url = "https://files.pythonhosted.org/packages/5a/8f/cc48601fb92c964cf6c34277e0d947076146b7de47aa11b5dbae45e01ce7/ty-0.0.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:a808910ce672ba4446699f4c021283208f58f988bcfc3bdbdfc6e005819d9ee0", size = 9829982, upload-time = "2025-12-24T21:28:34.429Z" }, - { url = "https://files.pythonhosted.org/packages/b5/af/7fa9c2bfa25865968bded637f7e71f1a712f4fbede88f487b6a9101ab936/ty-0.0.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:2718fea5f314eda01703fb406ec89b1fc8710b3fc6a09bbd6f7a4f3502ddc889", size = 10361037, upload-time = "2025-12-24T21:28:47.027Z" }, - { url = "https://files.pythonhosted.org/packages/1c/5b/1a6ff1495975cd1c02aa8d03bc5c9d8006eaeb8bf354446f88d70f0518fd/ty-0.0.7-py3-none-win32.whl", hash = "sha256:ae89bb8dc50deb66f34eab3113aa61ac5d7f85ecf16279e5918548085a89021c", size = 9295092, upload-time = "2025-12-24T21:28:51.041Z" }, - { url = "https://files.pythonhosted.org/packages/ff/f6/47e9364635d048002354f84d2d0d6dfc9eb166dc67850739f88e1fec4fc5/ty-0.0.7-py3-none-win_amd64.whl", hash = "sha256:25bd20e3d4d0f07b422f9b42711ba24d28116031273bd23dbda66cec14df1c06", size = 10162816, upload-time = "2025-12-24T21:28:41.006Z" }, - { url = "https://files.pythonhosted.org/packages/7f/f4/c4fc28410c4493982b7481fb23f62bacb02fd2912ebec3b9bc7de18bebb8/ty-0.0.7-py3-none-win_arm64.whl", hash = "sha256:c87d27484dba9fca0053b6a9eee47eecc760aab2bbb8e6eab3d7f81531d1ad0c", size = 9653112, upload-time = "2025-12-24T21:28:31.562Z" }, +version = "0.0.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/9d/59e955cc39206a0d58df5374808785c45ec2a8a2a230eb1638fbb4fe5c5d/ty-0.0.8.tar.gz", hash = "sha256:352ac93d6e0050763be57ad1e02087f454a842887e618ec14ac2103feac48676", size = 4828477, upload-time = "2025-12-29T13:50:07.193Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/2b/dd61f7e50a69c72f72c625d026e9ab64a0db62b2dd32e7426b520e2429c6/ty-0.0.8-py3-none-linux_armv6l.whl", hash = "sha256:a289d033c5576fa3b4a582b37d63395edf971cdbf70d2d2e6b8c95638d1a4fcd", size = 9853417, upload-time = "2025-12-29T13:50:08.979Z" }, + { url = "https://files.pythonhosted.org/packages/90/72/3f1d3c64a049a388e199de4493689a51fc6aa5ff9884c03dea52b4966657/ty-0.0.8-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:788ea97dc8153a94e476c4d57b2551a9458f79c187c4aba48fcb81f05372924a", size = 9657890, upload-time = "2025-12-29T13:50:27.867Z" }, + { url = "https://files.pythonhosted.org/packages/71/d1/08ac676bd536de3c2baba0deb60e67b3196683a2fabebfd35659d794b5e9/ty-0.0.8-py3-none-macosx_11_0_arm64.whl", hash = "sha256:1b5f1f3d3e230f35a29e520be7c3d90194a5229f755b721e9092879c00842d31", size = 9180129, upload-time = "2025-12-29T13:50:22.842Z" }, + { url = "https://files.pythonhosted.org/packages/af/93/610000e2cfeea1875900f73a375ba917624b0a008d4b8a6c18c894c8dbbc/ty-0.0.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6da9ed377fbbcec0a3b60b2ca5fd30496e15068f47cef2344ba87923e78ba996", size = 9683517, upload-time = "2025-12-29T13:50:18.658Z" }, + { url = "https://files.pythonhosted.org/packages/05/04/bef50ba7d8580b0140be597de5cc0ba9a63abe50d3f65560235f23658762/ty-0.0.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7d0a2bdce5e701d19eb8d46d9da0fe31340f079cecb7c438f5ac6897c73fc5ba", size = 9676279, upload-time = "2025-12-29T13:50:25.207Z" }, + { url = "https://files.pythonhosted.org/packages/aa/b9/2aff1ef1f41b25898bc963173ae67fc8f04ca666ac9439a9c4e78d5cc0ff/ty-0.0.8-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef9078799d26d3cc65366e02392e2b78f64f72911b599e80a8497d2ec3117ddb", size = 10073015, upload-time = "2025-12-29T13:50:35.422Z" }, + { url = "https://files.pythonhosted.org/packages/df/0e/9feb6794b6ff0a157c3e6a8eb6365cbfa3adb9c0f7976e2abdc48615dd72/ty-0.0.8-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:54814ac39b4ab67cf111fc0a236818155cf49828976152378347a7678d30ee89", size = 10961649, upload-time = "2025-12-29T13:49:58.717Z" }, + { url = "https://files.pythonhosted.org/packages/f4/3b/faf7328b14f00408f4f65c9d01efe52e11b9bcc4a79e06187b370457b004/ty-0.0.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4baf0a80398e8b6c68fa36ff85045a50ede1906cd4edb41fb4fab46d471f1d4", size = 10676190, upload-time = "2025-12-29T13:50:01.11Z" }, + { url = "https://files.pythonhosted.org/packages/64/a5/cfeca780de7eeab7852c911c06a84615a174d23e9ae08aae42a645771094/ty-0.0.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ac8e23c3faefc579686799ef1649af8d158653169ad5c3a7df56b152781eeb67", size = 10438641, upload-time = "2025-12-29T13:50:29.664Z" }, + { url = "https://files.pythonhosted.org/packages/0e/8d/8667c7e0ac9f13c461ded487c8d7350f440cd39ba866d0160a8e1b1efd6c/ty-0.0.8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b558a647a073d0c25540aaa10f8947de826cb8757d034dd61ecf50ab8dbd77bf", size = 10214082, upload-time = "2025-12-29T13:50:31.531Z" }, + { url = "https://files.pythonhosted.org/packages/f8/11/e563229870e2c1d089e7e715c6c3b7605a34436dddf6f58e9205823020c2/ty-0.0.8-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:8c0104327bf480508bd81f320e22074477df159d9eff85207df39e9c62ad5e96", size = 9664364, upload-time = "2025-12-29T13:50:05.443Z" }, + { url = "https://files.pythonhosted.org/packages/b1/ad/05b79b778bf5237bcd7ee08763b226130aa8da872cbb151c8cfa2e886203/ty-0.0.8-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:496f1cb87261dd1a036a5609da80ee13de2e6ee4718a661bfa2afb91352fe528", size = 9679440, upload-time = "2025-12-29T13:50:11.289Z" }, + { url = "https://files.pythonhosted.org/packages/12/b5/23ba887769c4a7b8abfd1b6395947dc3dcc87533fbf86379d3a57f87ae8f/ty-0.0.8-py3-none-musllinux_1_2_i686.whl", hash = "sha256:2c488031f92a075ae39d13ac6295fdce2141164ec38c5d47aa8dc24ee3afa37e", size = 9808201, upload-time = "2025-12-29T13:50:21.003Z" }, + { url = "https://files.pythonhosted.org/packages/f8/90/5a82ac0a0707db55376922aed80cd5fca6b2e6d6e9bcd8c286e6b43b4084/ty-0.0.8-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:90d6f08c5982fa3e802b8918a32e326153519077b827f91c66eea4913a86756a", size = 10313262, upload-time = "2025-12-29T13:50:03.306Z" }, + { url = "https://files.pythonhosted.org/packages/14/f7/ff97f37f0a75db9495ddbc47738ec4339837867c4bfa145bdcfbd0d1eb2f/ty-0.0.8-py3-none-win32.whl", hash = "sha256:d7f460ad6fc9325e9cc8ea898949bbd88141b4609d1088d7ede02ce2ef06e776", size = 9254675, upload-time = "2025-12-29T13:50:33.35Z" }, + { url = "https://files.pythonhosted.org/packages/af/51/eba5d83015e04630002209e3590c310a0ff1d26e1815af204a322617a42e/ty-0.0.8-py3-none-win_amd64.whl", hash = "sha256:1641fb8dedc3d2da43279d21c3c7c1f80d84eae5c264a1e8daa544458e433c19", size = 10131382, upload-time = "2025-12-29T13:50:13.719Z" }, + { url = "https://files.pythonhosted.org/packages/38/1c/0d8454ff0f0f258737ecfe84f6e508729191d29663b404832f98fa5626b7/ty-0.0.8-py3-none-win_arm64.whl", hash = "sha256:ec74f022f315bede478ecae1277a01ab618e6500c1d68450d7883f5cd6ed554a", size = 9636374, upload-time = "2025-12-29T13:50:16.344Z" }, ] [[package]]