From 6873684ae99c97a308d0ffa1bdcefd9a6ce1605f Mon Sep 17 00:00:00 2001 From: ISOR3X Date: Sun, 21 Dec 2025 16:16:59 +0100 Subject: [PATCH 01/16] feat: add create copy script --- .gitignore | 4 +- CONTRIBUTING.md | 19 ++ pyproject.toml | 1 + scripts/create_copy.py | 18 ++ uv.lock | 409 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 450 insertions(+), 1 deletion(-) create mode 100644 CONTRIBUTING.md create mode 100644 scripts/create_copy.py diff --git a/.gitignore b/.gitignore index 3428d0f..60ff621 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,8 @@ **/__pycache__/ - + **/node_modules/ target/ .venv/ .idea/ + +.generated_template diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..5986464 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,19 @@ +# Contributing + +Contributions are welcome, and they are greatly appreciated! Every little bit helps, and credit will always be given. + +## Environment setup + +Make sure you have installed `Python`, `uv`, `Node.js` and `pnpm` as documented. + +Also, you need `bash`. If you are on Windows, you can use [Git for Windows](https://gitforwindows.org/). + +```bash +# install dev dependencies and tools +uv sync + +# activate venv +.venv\Scripts\activate + + +``` diff --git a/pyproject.toml b/pyproject.toml index ed8ec9b..b272451 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,6 +9,7 @@ dependencies = [ # [build-system] "setuptools >= 80", "setuptools-scm >= 8", + "copier>=9.10.3", ] [tool.uv] diff --git a/scripts/create_copy.py b/scripts/create_copy.py new file mode 100644 index 0000000..20e65e9 --- /dev/null +++ b/scripts/create_copy.py @@ -0,0 +1,18 @@ +import os +from pathlib import Path +from copier import run_copy + +if __name__ == "__main__": + TEMPLATE_DIR = Path(__file__).parent.parent + OUTPUT_DIR = Path(__file__).parent.parent / ".generated_template" / "pytauri-app" + + kwargs = { + "project_name": "pytauri-app", + "identifier": "com.username.pytauri-app", + "template": "vue" + } + + if OUTPUT_DIR.exists(): + os.remove(OUTPUT_DIR) + + run_copy(str(TEMPLATE_DIR), str(OUTPUT_DIR), kwargs) diff --git a/uv.lock b/uv.lock index c9e26d2..730e416 100644 --- a/uv.lock +++ b/uv.lock @@ -1,6 +1,10 @@ version = 1 revision = 3 requires-python = ">=3.9" +resolution-markers = [ + "python_full_version >= '3.10'", + "python_full_version < '3.10'", +] [[package]] name = "annotated-types" @@ -26,12 +30,80 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c", size = 100916, upload-time = "2025-03-17T00:02:52.713Z" }, ] +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "copier" +version = "9.10.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.10'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version < '3.10'" }, + { name = "dunamai", marker = "python_full_version < '3.10'" }, + { name = "eval-type-backport", marker = "python_full_version < '3.10'" }, + { name = "funcy", marker = "python_full_version < '3.10'" }, + { name = "jinja2", marker = "python_full_version < '3.10'" }, + { name = "jinja2-ansible-filters", marker = "python_full_version < '3.10'" }, + { name = "packaging", marker = "python_full_version < '3.10'" }, + { name = "pathspec", marker = "python_full_version < '3.10'" }, + { name = "platformdirs", version = "4.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "plumbum", marker = "python_full_version < '3.10'" }, + { name = "pydantic", marker = "python_full_version < '3.10'" }, + { name = "pygments", marker = "python_full_version < '3.10'" }, + { name = "pyyaml", marker = "python_full_version < '3.10'" }, + { name = "questionary", marker = "python_full_version < '3.10'" }, + { name = "typing-extensions", marker = "python_full_version < '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/82/c6/1f61fe2b011347c0b9d7637d02ef3dc1c2874640a4fd5fb059ea8b5493f2/copier-9.10.3.tar.gz", hash = "sha256:6e965d8f719678ee3bc5e611ef0d1b182d6b01a3d5385a5f1ba43aaade51caf7", size = 598697, upload-time = "2025-10-17T18:26:04.217Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/f2/58ee35dbd55d0ffa13197365ec4725c36da2f7ec72eaa1dd154bfbd2676e/copier-9.10.3-py3-none-any.whl", hash = "sha256:7165239566f68e9e36c148f71e0552bf1e4911eef96bfa7cf33e6a0dbfed3c96", size = 56186, upload-time = "2025-10-17T18:26:02.856Z" }, +] + +[[package]] +name = "copier" +version = "9.11.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version >= '3.10'" }, + { name = "dunamai", marker = "python_full_version >= '3.10'" }, + { name = "funcy", marker = "python_full_version >= '3.10'" }, + { name = "jinja2", marker = "python_full_version >= '3.10'" }, + { name = "jinja2-ansible-filters", marker = "python_full_version >= '3.10'" }, + { name = "packaging", marker = "python_full_version >= '3.10'" }, + { name = "pathspec", marker = "python_full_version >= '3.10'" }, + { name = "platformdirs", version = "4.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "plumbum", marker = "python_full_version >= '3.10'" }, + { name = "pydantic", marker = "python_full_version >= '3.10'" }, + { name = "pygments", marker = "python_full_version >= '3.10'" }, + { name = "pyyaml", marker = "python_full_version >= '3.10'" }, + { name = "questionary", marker = "python_full_version >= '3.10'" }, + { name = "typing-extensions", marker = "python_full_version == '3.10.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/61/226642b1efad2a39008ee5b913cd82a6f22a564b652e8f0645488a27a2e2/copier-9.11.0.tar.gz", hash = "sha256:e73d6989fa140b621a5c571984c46122704086a9caa84a6e07699a5234d297ab", size = 592030, upload-time = "2025-11-20T21:08:01.419Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/ee/657b24e9b2406f572db273e943237c39c86da7d06ac7bc0686cacea1f59d/copier-9.11.0-py3-none-any.whl", hash = "sha256:628adac090f7b333bb64bf5cab03456b99971a77e4d5b2b979e30b8451cbda9d", size = 56432, upload-time = "2025-11-20T21:07:59.618Z" }, +] + [[package]] name = "create-pytauri-app" version = "0.1.0" source = { virtual = "." } dependencies = [ { name = "anyio" }, + { name = "copier", version = "9.10.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "copier", version = "9.11.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "pydantic" }, { name = "pytauri" }, { name = "setuptools" }, @@ -41,12 +113,34 @@ dependencies = [ [package.metadata] requires-dist = [ { name = "anyio", specifier = "==4.*" }, + { name = "copier", specifier = ">=9.10.3" }, { name = "pydantic", specifier = "==2.*" }, { name = "pytauri", specifier = "==0.8.*" }, { name = "setuptools", specifier = ">=80" }, { name = "setuptools-scm", specifier = ">=8" }, ] +[[package]] +name = "dunamai" +version = "1.25.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f1/2f/194d9a34c4d831c6563d2d990720850f0baef9ab60cb4ad8ae0eff6acd34/dunamai-1.25.0.tar.gz", hash = "sha256:a7f8360ea286d3dbaf0b6a1473f9253280ac93d619836ad4514facb70c0719d1", size = 46155, upload-time = "2025-07-04T19:25:56.082Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/36/41/04e2a649058b0713b00d6c9bd22da35618bb157289e05d068e51fddf8d7e/dunamai-1.25.0-py3-none-any.whl", hash = "sha256:7f9dc687dd3256e613b6cc978d9daabfd2bb5deb8adc541fc135ee423ffa98ab", size = 27022, upload-time = "2025-07-04T19:25:54.863Z" }, +] + +[[package]] +name = "eval-type-backport" +version = "0.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/30/ea/8b0ac4469d4c347c6a385ff09dc3c048c2d021696664e26c7ee6791631b5/eval_type_backport-0.2.2.tar.gz", hash = "sha256:f0576b4cf01ebb5bd358d02314d31846af5e07678387486e2c798af0e7d849c1", size = 9079, upload-time = "2024-12-21T20:09:46.005Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/31/55cd413eaccd39125368be33c46de24a1f639f2e12349b0361b4678f3915/eval_type_backport-0.2.2-py3-none-any.whl", hash = "sha256:cb6ad7c393517f476f96d456d0412ea80f0a8cf96f6892834cd9340149111b0a", size = 5830, upload-time = "2024-12-21T20:09:44.175Z" }, +] + [[package]] name = "exceptiongroup" version = "1.2.2" @@ -56,6 +150,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/02/cc/b7e31358aac6ed1ef2bb790a9746ac2c69bcb3c8588b41616914eb106eaf/exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b", size = 16453, upload-time = "2024-07-12T22:25:58.476Z" }, ] +[[package]] +name = "funcy" +version = "2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/70/b8/c6081521ff70afdff55cd9512b2220bbf4fa88804dae51d1b57b4b58ef32/funcy-2.0.tar.gz", hash = "sha256:3963315d59d41c6f30c04bc910e10ab50a3ac4a225868bfa96feed133df075cb", size = 537931, upload-time = "2023-03-28T06:22:46.764Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl", hash = "sha256:53df23c8bb1651b12f095df764bfb057935d49537a56de211b098f4c79614bb0", size = 30891, upload-time = "2023-03-28T06:22:42.576Z" }, +] + [[package]] name = "idna" version = "3.10" @@ -77,6 +180,127 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/20/b0/36bd937216ec521246249be3bf9855081de4c5e06a0c9b4219dbeda50373/importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd", size = 27656, upload-time = "2025-04-27T15:29:00.214Z" }, ] +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, +] + +[[package]] +name = "jinja2-ansible-filters" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jinja2" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1a/27/fa186af4b246eb869ffca8ffa42d92b05abaec08c99329e74d88b2c46ec7/jinja2-ansible-filters-1.3.2.tar.gz", hash = "sha256:07c10cf44d7073f4f01102ca12d9a2dc31b41d47e4c61ed92ef6a6d2669b356b", size = 16945, upload-time = "2022-06-30T14:08:50.775Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/72/b9/313e8f2f2e9517ae050a692ae7b3e4b3f17cc5e6dfea0db51fe14e586580/jinja2_ansible_filters-1.3.2-py3-none-any.whl", hash = "sha256:e1082f5564917649c76fed239117820610516ec10f87735d0338688800a55b34", size = 18975, upload-time = "2022-06-30T14:08:49.571Z" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/4b/3541d44f3937ba468b75da9eebcae497dcf67adb65caa16760b0a6807ebb/markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559", size = 11631, upload-time = "2025-09-27T18:36:05.558Z" }, + { url = "https://files.pythonhosted.org/packages/98/1b/fbd8eed11021cabd9226c37342fa6ca4e8a98d8188a8d9b66740494960e4/markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419", size = 12057, upload-time = "2025-09-27T18:36:07.165Z" }, + { url = "https://files.pythonhosted.org/packages/40/01/e560d658dc0bb8ab762670ece35281dec7b6c1b33f5fbc09ebb57a185519/markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695", size = 22050, upload-time = "2025-09-27T18:36:08.005Z" }, + { url = "https://files.pythonhosted.org/packages/af/cd/ce6e848bbf2c32314c9b237839119c5a564a59725b53157c856e90937b7a/markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591", size = 20681, upload-time = "2025-09-27T18:36:08.881Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2a/b5c12c809f1c3045c4d580b035a743d12fcde53cf685dbc44660826308da/markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c", size = 20705, upload-time = "2025-09-27T18:36:10.131Z" }, + { url = "https://files.pythonhosted.org/packages/cf/e3/9427a68c82728d0a88c50f890d0fc072a1484de2f3ac1ad0bfc1a7214fd5/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f", size = 21524, upload-time = "2025-09-27T18:36:11.324Z" }, + { url = "https://files.pythonhosted.org/packages/bc/36/23578f29e9e582a4d0278e009b38081dbe363c5e7165113fad546918a232/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6", size = 20282, upload-time = "2025-09-27T18:36:12.573Z" }, + { url = "https://files.pythonhosted.org/packages/56/21/dca11354e756ebd03e036bd8ad58d6d7168c80ce1fe5e75218e4945cbab7/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1", size = 20745, upload-time = "2025-09-27T18:36:13.504Z" }, + { url = "https://files.pythonhosted.org/packages/87/99/faba9369a7ad6e4d10b6a5fbf71fa2a188fe4a593b15f0963b73859a1bbd/markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa", size = 14571, upload-time = "2025-09-27T18:36:14.779Z" }, + { url = "https://files.pythonhosted.org/packages/d6/25/55dc3ab959917602c96985cb1253efaa4ff42f71194bddeb61eb7278b8be/markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8", size = 15056, upload-time = "2025-09-27T18:36:16.125Z" }, + { url = "https://files.pythonhosted.org/packages/d0/9e/0a02226640c255d1da0b8d12e24ac2aa6734da68bff14c05dd53b94a0fc3/markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1", size = 13932, upload-time = "2025-09-27T18:36:17.311Z" }, + { url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631, upload-time = "2025-09-27T18:36:18.185Z" }, + { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058, upload-time = "2025-09-27T18:36:19.444Z" }, + { url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287, upload-time = "2025-09-27T18:36:20.768Z" }, + { url = "https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf", size = 22940, upload-time = "2025-09-27T18:36:22.249Z" }, + { url = "https://files.pythonhosted.org/packages/19/ae/31c1be199ef767124c042c6c3e904da327a2f7f0cd63a0337e1eca2967a8/markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", size = 21887, upload-time = "2025-09-27T18:36:23.535Z" }, + { url = "https://files.pythonhosted.org/packages/b2/76/7edcab99d5349a4532a459e1fe64f0b0467a3365056ae550d3bcf3f79e1e/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", size = 23692, upload-time = "2025-09-27T18:36:24.823Z" }, + { url = "https://files.pythonhosted.org/packages/a4/28/6e74cdd26d7514849143d69f0bf2399f929c37dc2b31e6829fd2045b2765/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", size = 21471, upload-time = "2025-09-27T18:36:25.95Z" }, + { url = "https://files.pythonhosted.org/packages/62/7e/a145f36a5c2945673e590850a6f8014318d5577ed7e5920a4b3448e0865d/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", size = 22923, upload-time = "2025-09-27T18:36:27.109Z" }, + { url = "https://files.pythonhosted.org/packages/0f/62/d9c46a7f5c9adbeeeda52f5b8d802e1094e9717705a645efc71b0913a0a8/markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19", size = 14572, upload-time = "2025-09-27T18:36:28.045Z" }, + { url = "https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01", size = 15077, upload-time = "2025-09-27T18:36:29.025Z" }, + { url = "https://files.pythonhosted.org/packages/35/73/893072b42e6862f319b5207adc9ae06070f095b358655f077f69a35601f0/markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c", size = 13876, upload-time = "2025-09-27T18:36:29.954Z" }, + { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, + { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, + { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, + { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, + { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, + { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, + { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, + { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" }, + { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" }, + { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, + { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" }, + { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" }, + { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" }, + { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" }, + { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" }, + { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" }, + { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" }, + { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" }, + { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" }, + { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" }, + { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" }, + { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" }, + { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" }, + { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" }, + { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" }, + { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" }, + { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" }, + { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" }, + { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" }, + { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" }, + { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" }, + { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, + { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, + { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, + { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, + { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" }, + { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" }, + { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" }, + { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" }, + { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" }, + { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, + { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, + { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, + { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, + { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, + { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, + { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, + { url = "https://files.pythonhosted.org/packages/56/23/0d8c13a44bde9154821586520840643467aee574d8ce79a17da539ee7fed/markupsafe-3.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15d939a21d546304880945ca1ecb8a039db6b4dc49b2c5a400387cdae6a62e26", size = 11623, upload-time = "2025-09-27T18:37:29.296Z" }, + { url = "https://files.pythonhosted.org/packages/fd/23/07a2cb9a8045d5f3f0890a8c3bc0859d7a47bfd9a560b563899bec7b72ed/markupsafe-3.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f71a396b3bf33ecaa1626c255855702aca4d3d9fea5e051b41ac59a9c1c41edc", size = 12049, upload-time = "2025-09-27T18:37:30.234Z" }, + { url = "https://files.pythonhosted.org/packages/bc/e4/6be85eb81503f8e11b61c0b6369b6e077dcf0a74adbd9ebf6b349937b4e9/markupsafe-3.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f4b68347f8c5eab4a13419215bdfd7f8c9b19f2b25520968adfad23eb0ce60c", size = 21923, upload-time = "2025-09-27T18:37:31.177Z" }, + { url = "https://files.pythonhosted.org/packages/6f/bc/4dc914ead3fe6ddaef035341fee0fc956949bbd27335b611829292b89ee2/markupsafe-3.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e8fc20152abba6b83724d7ff268c249fa196d8259ff481f3b1476383f8f24e42", size = 20543, upload-time = "2025-09-27T18:37:32.168Z" }, + { url = "https://files.pythonhosted.org/packages/89/6e/5fe81fbcfba4aef4093d5f856e5c774ec2057946052d18d168219b7bd9f9/markupsafe-3.0.3-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:949b8d66bc381ee8b007cd945914c721d9aba8e27f71959d750a46f7c282b20b", size = 20585, upload-time = "2025-09-27T18:37:33.166Z" }, + { url = "https://files.pythonhosted.org/packages/f6/f6/e0e5a3d3ae9c4020f696cd055f940ef86b64fe88de26f3a0308b9d3d048c/markupsafe-3.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:3537e01efc9d4dccdf77221fb1cb3b8e1a38d5428920e0657ce299b20324d758", size = 21387, upload-time = "2025-09-27T18:37:34.185Z" }, + { url = "https://files.pythonhosted.org/packages/c8/25/651753ef4dea08ea790f4fbb65146a9a44a014986996ca40102e237aa49a/markupsafe-3.0.3-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:591ae9f2a647529ca990bc681daebdd52c8791ff06c2bfa05b65163e28102ef2", size = 20133, upload-time = "2025-09-27T18:37:35.138Z" }, + { url = "https://files.pythonhosted.org/packages/dc/0a/c3cf2b4fef5f0426e8a6d7fce3cb966a17817c568ce59d76b92a233fdbec/markupsafe-3.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a320721ab5a1aba0a233739394eb907f8c8da5c98c9181d1161e77a0c8e36f2d", size = 20588, upload-time = "2025-09-27T18:37:36.096Z" }, + { url = "https://files.pythonhosted.org/packages/cd/1b/a7782984844bd519ad4ffdbebbba2671ec5d0ebbeac34736c15fb86399e8/markupsafe-3.0.3-cp39-cp39-win32.whl", hash = "sha256:df2449253ef108a379b8b5d6b43f4b1a8e81a061d6537becd5582fba5f9196d7", size = 14566, upload-time = "2025-09-27T18:37:37.09Z" }, + { url = "https://files.pythonhosted.org/packages/18/1f/8d9c20e1c9440e215a44be5ab64359e207fcb4f675543f1cf9a2a7f648d0/markupsafe-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:7c3fb7d25180895632e5d3148dbdc29ea38ccb7fd210aa27acbd1201a1902c6e", size = 15053, upload-time = "2025-09-27T18:37:38.054Z" }, + { url = "https://files.pythonhosted.org/packages/4e/d3/fe08482b5cd995033556d45041a4f4e76e7f0521112a9c9991d40d39825f/markupsafe-3.0.3-cp39-cp39-win_arm64.whl", hash = "sha256:38664109c14ffc9e7437e86b4dceb442b0096dfe3541d7864d9cbe1da4cf36c8", size = 13928, upload-time = "2025-09-27T18:37:39.037Z" }, +] + [[package]] name = "packaging" version = "25.0" @@ -86,6 +310,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, ] +[[package]] +name = "pathspec" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043, upload-time = "2023-12-10T22:30:45Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload-time = "2023-12-10T22:30:43.14Z" }, +] + [[package]] name = "pillow" version = "11.2.1" @@ -174,6 +407,54 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/21/2c/5e05f58658cf49b6667762cca03d6e7d85cededde2caf2ab37b81f80e574/pillow-11.2.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:208653868d5c9ecc2b327f9b9ef34e0e42a4cdd172c2988fd81d62d2bc9bc044", size = 2674751, upload-time = "2025-04-12T17:49:59.628Z" }, ] +[[package]] +name = "platformdirs" +version = "4.4.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.10'", +] +sdist = { url = "https://files.pythonhosted.org/packages/23/e8/21db9c9987b0e728855bd57bff6984f67952bea55d6f75e055c46b5383e8/platformdirs-4.4.0.tar.gz", hash = "sha256:ca753cf4d81dc309bc67b0ea38fd15dc97bc30ce419a7f58d13eb3bf14c4febf", size = 21634, upload-time = "2025-08-26T14:32:04.268Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/4b/2028861e724d3bd36227adfa20d3fd24c3fc6d52032f4a93c133be5d17ce/platformdirs-4.4.0-py3-none-any.whl", hash = "sha256:abd01743f24e5287cd7a5db3752faf1a2d65353f38ec26d98e25a6db65958c85", size = 18654, upload-time = "2025-08-26T14:32:02.735Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.5.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.10'", +] +sdist = { url = "https://files.pythonhosted.org/packages/cf/86/0248f086a84f01b37aaec0fa567b397df1a119f73c16f6c7a9aac73ea309/platformdirs-4.5.1.tar.gz", hash = "sha256:61d5cdcc6065745cdd94f0f878977f8de9437be93de97c1c12f853c9c0cdcbda", size = 21715, upload-time = "2025-12-05T13:52:58.638Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl", hash = "sha256:d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31", size = 18731, upload-time = "2025-12-05T13:52:56.823Z" }, +] + +[[package]] +name = "plumbum" +version = "1.10.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pywin32", marker = "platform_python_implementation != 'PyPy' and sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/dc/c8/11a5f792704b70f071a3dbc329105a98e9cc8d25daaf09f733c44eb0ef8e/plumbum-1.10.0.tar.gz", hash = "sha256:f8cbf0ecec0b73ff4e349398b65112a9e3f9300e7dc019001217dcc148d5c97c", size = 320039, upload-time = "2025-10-31T05:02:48.697Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/ad/45312df6b63ba64ea35b8d8f5f0c577aac16e6b416eafe8e1cb34e03f9a7/plumbum-1.10.0-py3-none-any.whl", hash = "sha256:9583d737ac901c474d99d030e4d5eec4c4e6d2d7417b1cf49728cf3be34f6dc8", size = 127383, upload-time = "2025-10-31T05:02:47.002Z" }, +] + +[[package]] +name = "prompt-toolkit" +version = "3.0.52" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/96/06e01a7b38dce6fe1db213e061a4602dd6032a8a97ef6c1a862537732421/prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855", size = 434198, upload-time = "2025-08-27T15:24:02.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955", size = 391431, upload-time = "2025-08-27T15:23:59.498Z" }, +] + [[package]] name = "pydantic" version = "2.11.4" @@ -298,6 +579,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d4/29/3cade8a924a61f60ccfa10842f75eb12787e1440e2b8660ceffeb26685e7/pydantic_core-2.33.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2807668ba86cb38c6817ad9bc66215ab8584d1d304030ce4f0887336f28a5e27", size = 2066661, upload-time = "2025-04-23T18:33:49.995Z" }, ] +[[package]] +name = "pygments" +version = "2.19.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, +] + [[package]] name = "pytauri" version = "0.8.0" @@ -314,6 +604,116 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5d/15/2679cf676f1c621a9decbf79abfa33891b9d7882d9bcd24751b5e554a095/pytauri-0.8.0-py3-none-any.whl", hash = "sha256:e7dc9b21f5ecf081b1e2751abf788792c8804cb3b2637de2b2d0b11a04794174", size = 62559, upload-time = "2025-09-01T09:25:15.428Z" }, ] +[[package]] +name = "pywin32" +version = "311" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/40/44efbb0dfbd33aca6a6483191dae0716070ed99e2ecb0c53683f400a0b4f/pywin32-311-cp310-cp310-win32.whl", hash = "sha256:d03ff496d2a0cd4a5893504789d4a15399133fe82517455e78bad62efbb7f0a3", size = 8760432, upload-time = "2025-07-14T20:13:05.9Z" }, + { url = "https://files.pythonhosted.org/packages/5e/bf/360243b1e953bd254a82f12653974be395ba880e7ec23e3731d9f73921cc/pywin32-311-cp310-cp310-win_amd64.whl", hash = "sha256:797c2772017851984b97180b0bebe4b620bb86328e8a884bb626156295a63b3b", size = 9590103, upload-time = "2025-07-14T20:13:07.698Z" }, + { url = "https://files.pythonhosted.org/packages/57/38/d290720e6f138086fb3d5ffe0b6caa019a791dd57866940c82e4eeaf2012/pywin32-311-cp310-cp310-win_arm64.whl", hash = "sha256:0502d1facf1fed4839a9a51ccbcc63d952cf318f78ffc00a7e78528ac27d7a2b", size = 8778557, upload-time = "2025-07-14T20:13:11.11Z" }, + { url = "https://files.pythonhosted.org/packages/7c/af/449a6a91e5d6db51420875c54f6aff7c97a86a3b13a0b4f1a5c13b988de3/pywin32-311-cp311-cp311-win32.whl", hash = "sha256:184eb5e436dea364dcd3d2316d577d625c0351bf237c4e9a5fabbcfa5a58b151", size = 8697031, upload-time = "2025-07-14T20:13:13.266Z" }, + { url = "https://files.pythonhosted.org/packages/51/8f/9bb81dd5bb77d22243d33c8397f09377056d5c687aa6d4042bea7fbf8364/pywin32-311-cp311-cp311-win_amd64.whl", hash = "sha256:3ce80b34b22b17ccbd937a6e78e7225d80c52f5ab9940fe0506a1a16f3dab503", size = 9508308, upload-time = "2025-07-14T20:13:15.147Z" }, + { url = "https://files.pythonhosted.org/packages/44/7b/9c2ab54f74a138c491aba1b1cd0795ba61f144c711daea84a88b63dc0f6c/pywin32-311-cp311-cp311-win_arm64.whl", hash = "sha256:a733f1388e1a842abb67ffa8e7aad0e70ac519e09b0f6a784e65a136ec7cefd2", size = 8703930, upload-time = "2025-07-14T20:13:16.945Z" }, + { url = "https://files.pythonhosted.org/packages/e7/ab/01ea1943d4eba0f850c3c61e78e8dd59757ff815ff3ccd0a84de5f541f42/pywin32-311-cp312-cp312-win32.whl", hash = "sha256:750ec6e621af2b948540032557b10a2d43b0cee2ae9758c54154d711cc852d31", size = 8706543, upload-time = "2025-07-14T20:13:20.765Z" }, + { url = "https://files.pythonhosted.org/packages/d1/a8/a0e8d07d4d051ec7502cd58b291ec98dcc0c3fff027caad0470b72cfcc2f/pywin32-311-cp312-cp312-win_amd64.whl", hash = "sha256:b8c095edad5c211ff31c05223658e71bf7116daa0ecf3ad85f3201ea3190d067", size = 9495040, upload-time = "2025-07-14T20:13:22.543Z" }, + { url = "https://files.pythonhosted.org/packages/ba/3a/2ae996277b4b50f17d61f0603efd8253cb2d79cc7ae159468007b586396d/pywin32-311-cp312-cp312-win_arm64.whl", hash = "sha256:e286f46a9a39c4a18b319c28f59b61de793654af2f395c102b4f819e584b5852", size = 8710102, upload-time = "2025-07-14T20:13:24.682Z" }, + { url = "https://files.pythonhosted.org/packages/a5/be/3fd5de0979fcb3994bfee0d65ed8ca9506a8a1260651b86174f6a86f52b3/pywin32-311-cp313-cp313-win32.whl", hash = "sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d", size = 8705700, upload-time = "2025-07-14T20:13:26.471Z" }, + { url = "https://files.pythonhosted.org/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl", hash = "sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d", size = 9494700, upload-time = "2025-07-14T20:13:28.243Z" }, + { url = "https://files.pythonhosted.org/packages/04/bf/90339ac0f55726dce7d794e6d79a18a91265bdf3aa70b6b9ca52f35e022a/pywin32-311-cp313-cp313-win_arm64.whl", hash = "sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a", size = 8709318, upload-time = "2025-07-14T20:13:30.348Z" }, + { url = "https://files.pythonhosted.org/packages/c9/31/097f2e132c4f16d99a22bfb777e0fd88bd8e1c634304e102f313af69ace5/pywin32-311-cp314-cp314-win32.whl", hash = "sha256:b7a2c10b93f8986666d0c803ee19b5990885872a7de910fc460f9b0c2fbf92ee", size = 8840714, upload-time = "2025-07-14T20:13:32.449Z" }, + { url = "https://files.pythonhosted.org/packages/90/4b/07c77d8ba0e01349358082713400435347df8426208171ce297da32c313d/pywin32-311-cp314-cp314-win_amd64.whl", hash = "sha256:3aca44c046bd2ed8c90de9cb8427f581c479e594e99b5c0bb19b29c10fd6cb87", size = 9656800, upload-time = "2025-07-14T20:13:34.312Z" }, + { url = "https://files.pythonhosted.org/packages/c0/d2/21af5c535501a7233e734b8af901574572da66fcc254cb35d0609c9080dd/pywin32-311-cp314-cp314-win_arm64.whl", hash = "sha256:a508e2d9025764a8270f93111a970e1d0fbfc33f4153b388bb649b7eec4f9b42", size = 8932540, upload-time = "2025-07-14T20:13:36.379Z" }, + { url = "https://files.pythonhosted.org/packages/59/42/b86689aac0cdaee7ae1c58d464b0ff04ca909c19bb6502d4973cdd9f9544/pywin32-311-cp39-cp39-win32.whl", hash = "sha256:aba8f82d551a942cb20d4a83413ccbac30790b50efb89a75e4f586ac0bb8056b", size = 8760837, upload-time = "2025-07-14T20:12:59.59Z" }, + { url = "https://files.pythonhosted.org/packages/9f/8a/1403d0353f8c5a2f0829d2b1c4becbf9da2f0a4d040886404fc4a5431e4d/pywin32-311-cp39-cp39-win_amd64.whl", hash = "sha256:e0c4cfb0621281fe40387df582097fd796e80430597cb9944f0ae70447bacd91", size = 9590187, upload-time = "2025-07-14T20:13:01.419Z" }, + { url = "https://files.pythonhosted.org/packages/60/22/e0e8d802f124772cec9c75430b01a212f86f9de7546bda715e54140d5aeb/pywin32-311-cp39-cp39-win_arm64.whl", hash = "sha256:62ea666235135fee79bb154e695f3ff67370afefd71bd7fea7512fc70ef31e3d", size = 8778162, upload-time = "2025-07-14T20:13:03.544Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227, upload-time = "2025-09-25T21:31:46.04Z" }, + { url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019, upload-time = "2025-09-25T21:31:47.706Z" }, + { url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646, upload-time = "2025-09-25T21:31:49.21Z" }, + { url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793, upload-time = "2025-09-25T21:31:50.735Z" }, + { url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293, upload-time = "2025-09-25T21:31:51.828Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872, upload-time = "2025-09-25T21:31:53.282Z" }, + { url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828, upload-time = "2025-09-25T21:31:54.807Z" }, + { url = "https://files.pythonhosted.org/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", size = 142415, upload-time = "2025-09-25T21:31:55.885Z" }, + { url = "https://files.pythonhosted.org/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", size = 158561, upload-time = "2025-09-25T21:31:57.406Z" }, + { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" }, + { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" }, + { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" }, + { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" }, + { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" }, + { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" }, + { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" }, + { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" }, + { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" }, + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, + { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, + { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, + { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, + { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, + { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, + { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, + { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, + { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, + { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, + { url = "https://files.pythonhosted.org/packages/9f/62/67fc8e68a75f738c9200422bf65693fb79a4cd0dc5b23310e5202e978090/pyyaml-6.0.3-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da", size = 184450, upload-time = "2025-09-25T21:33:00.618Z" }, + { url = "https://files.pythonhosted.org/packages/ae/92/861f152ce87c452b11b9d0977952259aa7df792d71c1053365cc7b09cc08/pyyaml-6.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917", size = 174319, upload-time = "2025-09-25T21:33:02.086Z" }, + { url = "https://files.pythonhosted.org/packages/d0/cd/f0cfc8c74f8a030017a2b9c771b7f47e5dd702c3e28e5b2071374bda2948/pyyaml-6.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9", size = 737631, upload-time = "2025-09-25T21:33:03.25Z" }, + { url = "https://files.pythonhosted.org/packages/ef/b2/18f2bd28cd2055a79a46c9b0895c0b3d987ce40ee471cecf58a1a0199805/pyyaml-6.0.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5", size = 836795, upload-time = "2025-09-25T21:33:05.014Z" }, + { url = "https://files.pythonhosted.org/packages/73/b9/793686b2d54b531203c160ef12bec60228a0109c79bae6c1277961026770/pyyaml-6.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a", size = 750767, upload-time = "2025-09-25T21:33:06.398Z" }, + { url = "https://files.pythonhosted.org/packages/a9/86/a137b39a611def2ed78b0e66ce2fe13ee701a07c07aebe55c340ed2a050e/pyyaml-6.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926", size = 727982, upload-time = "2025-09-25T21:33:08.708Z" }, + { url = "https://files.pythonhosted.org/packages/dd/62/71c27c94f457cf4418ef8ccc71735324c549f7e3ea9d34aba50874563561/pyyaml-6.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7", size = 755677, upload-time = "2025-09-25T21:33:09.876Z" }, + { url = "https://files.pythonhosted.org/packages/29/3d/6f5e0d58bd924fb0d06c3a6bad00effbdae2de5adb5cda5648006ffbd8d3/pyyaml-6.0.3-cp39-cp39-win32.whl", hash = "sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0", size = 142592, upload-time = "2025-09-25T21:33:10.983Z" }, + { url = "https://files.pythonhosted.org/packages/f0/0c/25113e0b5e103d7f1490c0e947e303fe4a696c10b501dea7a9f49d4e876c/pyyaml-6.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007", size = 158777, upload-time = "2025-09-25T21:33:15.55Z" }, +] + +[[package]] +name = "questionary" +version = "2.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "prompt-toolkit" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f6/45/eafb0bba0f9988f6a2520f9ca2df2c82ddfa8d67c95d6625452e97b204a5/questionary-2.1.1.tar.gz", hash = "sha256:3d7e980292bb0107abaa79c68dd3eee3c561b83a0f89ae482860b181c8bd412d", size = 25845, upload-time = "2025-08-28T19:00:20.851Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/26/1062c7ec1b053db9e499b4d2d5bc231743201b74051c973dadeac80a8f43/questionary-2.1.1-py3-none-any.whl", hash = "sha256:a51af13f345f1cdea62347589fbb6df3b290306ab8930713bfae4d475a7d4a59", size = 36753, upload-time = "2025-08-28T19:00:19.56Z" }, +] + [[package]] name = "setuptools" version = "80.9.0" @@ -408,6 +808,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f", size = 14125, upload-time = "2025-02-25T17:27:57.754Z" }, ] +[[package]] +name = "wcwidth" +version = "0.2.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/30/6b0809f4510673dc723187aeaf24c7f5459922d01e2f794277a3dfb90345/wcwidth-0.2.14.tar.gz", hash = "sha256:4d478375d31bc5395a3c55c40ccdf3354688364cd61c4f6adacaa9215d0b3605", size = 102293, upload-time = "2025-09-22T16:29:53.023Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1", size = 37286, upload-time = "2025-09-22T16:29:51.641Z" }, +] + [[package]] name = "zipp" version = "3.21.0" From 8c510f80604e269de83bcffad09b147cb3035cd8 Mon Sep 17 00:00:00 2001 From: ISOR3X Date: Sun, 21 Dec 2025 17:06:35 +0100 Subject: [PATCH 02/16] feat: initial wheel support --- copier.yaml | 72 +++++++++++-------- scripts/create_copy.py | 11 +-- .../{{ '.' }}/{{ project_name }}/.gitignore | 1 + .../pyproject.toml.jinja | 18 +++++ .../src/{{ package_name }}/__init__.py | 46 ++++++++++++ .../src}/{{ package_name }}/__main__.py.jinja | 0 .../src}/{{ package_name }}/py.typed | 0 .../.github/workflows/publish.yaml.jinja | 0 .../Cargo.toml.jinja | 0 .../pyproject.toml.jinja | 0 .../scripts/README.md | 0 .../scripts/linux/build.sh.jinja | 0 .../scripts/linux/download-py.sh | 0 .../scripts/macos/build.sh.jinja | 0 .../scripts/macos/download-py.sh | 0 .../scripts/windows/build.ps1.jinja | 0 .../scripts/windows/download-py.ps1 | 0 .../src-tauri/.gitignore | 0 .../src-tauri/.taurignore | 0 .../src-tauri/Cargo.toml.jinja | 0 .../src-tauri/build.rs | 0 .../src-tauri/pyproject.toml.jinja | 0 .../src-python/{{ package_name }}/__init__.py | 0 .../{{ package_name }}/__main__.py.jinja | 14 ++++ .../src-python/{{ package_name }}/py.typed | 0 .../src-tauri/src/lib.rs | 0 .../src-tauri/src/main.rs.jinja | 0 .../src-tauri/tauri.bundle.json | 0 28 files changed, 127 insertions(+), 35 deletions(-) create mode 100644 templates/{{ '.' }}/{{ project_name }}/{% if with_rust == false %}.{% endif %}/pyproject.toml.jinja create mode 100644 templates/{{ '.' }}/{{ project_name }}/{% if with_rust == false %}.{% endif %}/src/{{ package_name }}/__init__.py rename templates/{{ '.' }}/{{ project_name }}/{src-tauri/src-python => {% if with_rust == false %}.{% endif %}/src}/{{ package_name }}/__main__.py.jinja (100%) rename templates/{{ '.' }}/{{ project_name }}/{src-tauri/src-python => {% if with_rust == false %}.{% endif %}/src}/{{ package_name }}/py.typed (100%) rename templates/{{ '.' }}/{{ project_name }}/{ => {% if with_rust == true %}.{% endif %}}/.github/workflows/publish.yaml.jinja (100%) rename templates/{{ '.' }}/{{ project_name }}/{ => {% if with_rust == true %}.{% endif %}}/Cargo.toml.jinja (100%) rename templates/{{ '.' }}/{{ project_name }}/{ => {% if with_rust == true %}.{% endif %}}/pyproject.toml.jinja (100%) rename templates/{{ '.' }}/{{ project_name }}/{ => {% if with_rust == true %}.{% endif %}}/scripts/README.md (100%) rename templates/{{ '.' }}/{{ project_name }}/{ => {% if with_rust == true %}.{% endif %}}/scripts/linux/build.sh.jinja (100%) rename templates/{{ '.' }}/{{ project_name }}/{ => {% if with_rust == true %}.{% endif %}}/scripts/linux/download-py.sh (100%) rename templates/{{ '.' }}/{{ project_name }}/{ => {% if with_rust == true %}.{% endif %}}/scripts/macos/build.sh.jinja (100%) rename templates/{{ '.' }}/{{ project_name }}/{ => {% if with_rust == true %}.{% endif %}}/scripts/macos/download-py.sh (100%) rename templates/{{ '.' }}/{{ project_name }}/{ => {% if with_rust == true %}.{% endif %}}/scripts/windows/build.ps1.jinja (100%) rename templates/{{ '.' }}/{{ project_name }}/{ => {% if with_rust == true %}.{% endif %}}/scripts/windows/download-py.ps1 (100%) rename templates/{{ '.' }}/{{ project_name }}/{ => {% if with_rust == true %}.{% endif %}}/src-tauri/.gitignore (100%) rename templates/{{ '.' }}/{{ project_name }}/{ => {% if with_rust == true %}.{% endif %}}/src-tauri/.taurignore (100%) rename templates/{{ '.' }}/{{ project_name }}/{ => {% if with_rust == true %}.{% endif %}}/src-tauri/Cargo.toml.jinja (100%) rename templates/{{ '.' }}/{{ project_name }}/{ => {% if with_rust == true %}.{% endif %}}/src-tauri/build.rs (100%) rename templates/{{ '.' }}/{{ project_name }}/{ => {% if with_rust == true %}.{% endif %}}/src-tauri/pyproject.toml.jinja (100%) rename templates/{{ '.' }}/{{ project_name }}/{ => {% if with_rust == true %}.{% endif %}}/src-tauri/src-python/{{ package_name }}/__init__.py (100%) create mode 100644 templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/src-python/{{ package_name }}/__main__.py.jinja create mode 100644 templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/src-python/{{ package_name }}/py.typed rename templates/{{ '.' }}/{{ project_name }}/{ => {% if with_rust == true %}.{% endif %}}/src-tauri/src/lib.rs (100%) rename templates/{{ '.' }}/{{ project_name }}/{ => {% if with_rust == true %}.{% endif %}}/src-tauri/src/main.rs.jinja (100%) rename templates/{{ '.' }}/{{ project_name }}/{ => {% if with_rust == true %}.{% endif %}}/src-tauri/tauri.bundle.json (100%) diff --git a/copier.yaml b/copier.yaml index 9f05df6..7a007bb 100644 --- a/copier.yaml +++ b/copier.yaml @@ -1,42 +1,52 @@ _subdirectory: "templates/" project_name: - type: str - help: Project name - default: pytauri-app + type: str + help: Project name + default: pytauri-app package_name: - type: str - default: "{{ project_name | replace('-', '_')}}" - when: false + type: str + default: "{{ project_name | replace('-', '_')}}" + when: false identifier: - type: str - help: Identifier - default: "com.username.{{ project_name }}" + type: str + help: Identifier + default: "com.username.{{ project_name }}" + +with_rust: + type: bool + help: Do you want to use Rust? + default: false template: - type: str - help: Choose your UI template - choices: - Vue: vue - React: react - Svelte: svelte - default: vue + type: str + help: Choose your UI template + choices: + Vue: vue + React: react + Svelte: svelte + default: vue + +_frontend_path: + type: str + default: "{% if with_rust == true %}.{% else %}./app{% endif %}" + when: false _message_after_copy: | - Template created! To get started run: - cd {{ project_name }} - pnpm install - uv venv --python-preference only-system - {%- if _copier_conf.os == "windows" %} - .venv\Scripts\activate - {%- else %} - source .venv/bin/activate - {%- endif %} - uv sync - - For Desktop development, run: - pnpm tauri dev - - For building a standalone app, see the `scripts/` folder. + Template created! To get started run: + cd {{ project_name }} + pnpm install + uv venv --python-preference only-system + {%- if _copier_conf.os == "windows" %} + .venv\Scripts\activate + {%- else %} + source .venv/bin/activate + {%- endif %} + uv sync + + For Desktop development, run: + pnpm tauri dev + + For building a standalone app, see the `scripts/` folder. diff --git a/scripts/create_copy.py b/scripts/create_copy.py index 20e65e9..392d6b2 100644 --- a/scripts/create_copy.py +++ b/scripts/create_copy.py @@ -1,5 +1,6 @@ -import os +import shutil from pathlib import Path + from copier import run_copy if __name__ == "__main__": @@ -9,10 +10,12 @@ kwargs = { "project_name": "pytauri-app", "identifier": "com.username.pytauri-app", - "template": "vue" + "template": "vue", + "with_rust": "false", } + # Clean up old templates to ensure a new, clean one. if OUTPUT_DIR.exists(): - os.remove(OUTPUT_DIR) + shutil.rmtree(OUTPUT_DIR) - run_copy(str(TEMPLATE_DIR), str(OUTPUT_DIR), kwargs) + run_copy(str(TEMPLATE_DIR), str(OUTPUT_DIR), vcs_ref="HEAD", data=kwargs) diff --git a/templates/{{ '.' }}/{{ project_name }}/.gitignore b/templates/{{ '.' }}/{{ project_name }}/.gitignore index 6d65b50..0d7fbe3 100644 --- a/templates/{{ '.' }}/{{ project_name }}/.gitignore +++ b/templates/{{ '.' }}/{{ project_name }}/.gitignore @@ -25,3 +25,4 @@ dist-ssr /.venv/ /target/ +/dist/ diff --git a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == false %}.{% endif %}/pyproject.toml.jinja b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == false %}.{% endif %}/pyproject.toml.jinja new file mode 100644 index 0000000..e2826c7 --- /dev/null +++ b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == false %}.{% endif %}/pyproject.toml.jinja @@ -0,0 +1,18 @@ +[project] +name = "{{ project_name }}" +version = "0.1.0" +description = "Add your description here" +readme = "README.md" +authors = [ + { name = "you" } +] +requires-python = ">=3.9" +dependencies = [ + "pytauri-wheel>=0.8.0", + "pydantic == 2.*", + "anyio == 4.*" +] + +[build-system] +requires = ["uv_build>=0.9.2,<0.10.0"] +build-backend = "uv_build" diff --git a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == false %}.{% endif %}/src/{{ package_name }}/__init__.py b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == false %}.{% endif %}/src/{{ package_name }}/__init__.py new file mode 100644 index 0000000..ef81ca6 --- /dev/null +++ b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == false %}.{% endif %}/src/{{ package_name }}/__init__.py @@ -0,0 +1,46 @@ +import sys +from os import environ +from pathlib import Path + +from anyio.from_thread import start_blocking_portal +from pydantic import BaseModel +from pytauri import Commands +from pytauri_wheel.lib import builder_factory, context_factory + +SRC_TAURI_DIR = Path(__file__).parent.parent.parent.absolute() + + +# If the DEV_SERVER env. variable is set, use that server for development (allows hot-reloading). Otherwise, use the built assets to serve the frontend. +DEV_SERVER = environ.get("DEV_SERVER") # Default: http://localhost:1420 + +if DEV_SERVER is not None: + tauri_config = { + "build": { + "frontendDist": DEV_SERVER, + }, + } +else: + tauri_config = None + + +class Person(BaseModel): + name: str + + +commands: Commands = Commands() + + +@commands.command() +async def greet(body: Person) -> str: + return f"Hello, {body.name}! You've been greeted from Python {sys.version}!" + + +def main() -> int: + with start_blocking_portal("asyncio") as portal: + app = builder_factory().build( + context=context_factory(SRC_TAURI_DIR, tauri_config=tauri_config), + invoke_handler=commands.generate_handler(portal), + plugins=[], + ) + exit_code = app.run_return() + return exit_code diff --git a/templates/{{ '.' }}/{{ project_name }}/src-tauri/src-python/{{ package_name }}/__main__.py.jinja b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == false %}.{% endif %}/src/{{ package_name }}/__main__.py.jinja similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/src-tauri/src-python/{{ package_name }}/__main__.py.jinja rename to templates/{{ '.' }}/{{ project_name }}/{% if with_rust == false %}.{% endif %}/src/{{ package_name }}/__main__.py.jinja diff --git a/templates/{{ '.' }}/{{ project_name }}/src-tauri/src-python/{{ package_name }}/py.typed b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == false %}.{% endif %}/src/{{ package_name }}/py.typed similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/src-tauri/src-python/{{ package_name }}/py.typed rename to templates/{{ '.' }}/{{ project_name }}/{% if with_rust == false %}.{% endif %}/src/{{ package_name }}/py.typed diff --git a/templates/{{ '.' }}/{{ project_name }}/.github/workflows/publish.yaml.jinja b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/.github/workflows/publish.yaml.jinja similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/.github/workflows/publish.yaml.jinja rename to templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/.github/workflows/publish.yaml.jinja diff --git a/templates/{{ '.' }}/{{ project_name }}/Cargo.toml.jinja b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/Cargo.toml.jinja similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/Cargo.toml.jinja rename to templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/Cargo.toml.jinja diff --git a/templates/{{ '.' }}/{{ project_name }}/pyproject.toml.jinja b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/pyproject.toml.jinja similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/pyproject.toml.jinja rename to templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/pyproject.toml.jinja diff --git a/templates/{{ '.' }}/{{ project_name }}/scripts/README.md b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/scripts/README.md similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/scripts/README.md rename to templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/scripts/README.md diff --git a/templates/{{ '.' }}/{{ project_name }}/scripts/linux/build.sh.jinja b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/scripts/linux/build.sh.jinja similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/scripts/linux/build.sh.jinja rename to templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/scripts/linux/build.sh.jinja diff --git a/templates/{{ '.' }}/{{ project_name }}/scripts/linux/download-py.sh b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/scripts/linux/download-py.sh similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/scripts/linux/download-py.sh rename to templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/scripts/linux/download-py.sh diff --git a/templates/{{ '.' }}/{{ project_name }}/scripts/macos/build.sh.jinja b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/scripts/macos/build.sh.jinja similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/scripts/macos/build.sh.jinja rename to templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/scripts/macos/build.sh.jinja diff --git a/templates/{{ '.' }}/{{ project_name }}/scripts/macos/download-py.sh b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/scripts/macos/download-py.sh similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/scripts/macos/download-py.sh rename to templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/scripts/macos/download-py.sh diff --git a/templates/{{ '.' }}/{{ project_name }}/scripts/windows/build.ps1.jinja b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/scripts/windows/build.ps1.jinja similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/scripts/windows/build.ps1.jinja rename to templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/scripts/windows/build.ps1.jinja diff --git a/templates/{{ '.' }}/{{ project_name }}/scripts/windows/download-py.ps1 b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/scripts/windows/download-py.ps1 similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/scripts/windows/download-py.ps1 rename to templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/scripts/windows/download-py.ps1 diff --git a/templates/{{ '.' }}/{{ project_name }}/src-tauri/.gitignore b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/.gitignore similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/src-tauri/.gitignore rename to templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/.gitignore diff --git a/templates/{{ '.' }}/{{ project_name }}/src-tauri/.taurignore b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/.taurignore similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/src-tauri/.taurignore rename to templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/.taurignore diff --git a/templates/{{ '.' }}/{{ project_name }}/src-tauri/Cargo.toml.jinja b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/Cargo.toml.jinja similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/src-tauri/Cargo.toml.jinja rename to templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/Cargo.toml.jinja diff --git a/templates/{{ '.' }}/{{ project_name }}/src-tauri/build.rs b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/build.rs similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/src-tauri/build.rs rename to templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/build.rs diff --git a/templates/{{ '.' }}/{{ project_name }}/src-tauri/pyproject.toml.jinja b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/pyproject.toml.jinja similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/src-tauri/pyproject.toml.jinja rename to templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/pyproject.toml.jinja diff --git a/templates/{{ '.' }}/{{ project_name }}/src-tauri/src-python/{{ package_name }}/__init__.py b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/src-python/{{ package_name }}/__init__.py similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/src-tauri/src-python/{{ package_name }}/__init__.py rename to templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/src-python/{{ package_name }}/__init__.py diff --git a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/src-python/{{ package_name }}/__main__.py.jinja b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/src-python/{{ package_name }}/__main__.py.jinja new file mode 100644 index 0000000..59dd5e7 --- /dev/null +++ b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/src-python/{{ package_name }}/__main__.py.jinja @@ -0,0 +1,14 @@ +"""The main entry point for the Tauri app.""" + +import sys +from multiprocessing import freeze_support + +from {{ package_name }} import main + +# - If you don't use `multiprocessing`, you can remove this line. +# - If you do use `multiprocessing` but without this line, +# you will get endless spawn loop of your application process. +# See: . +freeze_support() + +sys.exit(main()) diff --git a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/src-python/{{ package_name }}/py.typed b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/src-python/{{ package_name }}/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/templates/{{ '.' }}/{{ project_name }}/src-tauri/src/lib.rs b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/src/lib.rs similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/src-tauri/src/lib.rs rename to templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/src/lib.rs diff --git a/templates/{{ '.' }}/{{ project_name }}/src-tauri/src/main.rs.jinja b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/src/main.rs.jinja similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/src-tauri/src/main.rs.jinja rename to templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/src/main.rs.jinja diff --git a/templates/{{ '.' }}/{{ project_name }}/src-tauri/tauri.bundle.json b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/tauri.bundle.json similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/src-tauri/tauri.bundle.json rename to templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/tauri.bundle.json From e90e9895b7c80cd07beec777f832d7f743c489d1 Mon Sep 17 00:00:00 2001 From: ISOR3X Date: Sun, 21 Dec 2025 17:33:06 +0100 Subject: [PATCH 03/16] feat: working wheel and full versions --- copier.yaml | 18 ++++++++++++++++-- .../.vscode/extensions.json | 0 .../README.md | 0 .../index.html | 0 .../package.json.jinja | 0 .../public/pytauri.svg | 0 .../public/python.svg | 0 .../public/tauri.svg | 0 .../public/vite.svg | 0 .../src/App.css | 0 .../src/App.tsx | 0 .../src/assets/react.svg | 0 .../src/main.tsx | 0 .../src/vite-env.d.ts | 0 .../tsconfig.json | 0 .../tsconfig.node.json | 0 .../vite.config.ts | 0 .../.vscode/extensions.json | 0 .../.vscode/settings.json | 0 .../README.md | 0 .../package.json.jinja | 0 .../src/app.html | 0 .../src/routes/+layout.ts | 0 .../src/routes/+page.svelte | 0 .../static/pytauri.svg | 0 .../static/python.svg | 0 .../static/svelte.svg | 0 .../static/tauri.svg | 0 .../static/vite.svg | 0 .../svelte.config.js | 0 .../tsconfig.json | 0 .../vite.config.js | 0 .../.vscode/extensions.json | 0 .../README.md | 0 .../index.html | 0 .../package.json.jinja | 0 .../public/pytauri.svg | 0 .../public/python.svg | 0 .../public/tauri.svg | 0 .../public/vite.svg | 0 .../src/App.vue | 0 .../src/assets/vue.svg | 0 .../src/main.ts | 0 .../src/vite-env.d.ts | 0 .../tsconfig.json | 0 .../tsconfig.node.json | 0 .../vite.config.ts | 0 .../src/{{ package_name }}/__init__.py | 2 +- .../capabilities/default.json | 0 .../icons/128x128.png | Bin .../icons/128x128@2x.png | Bin .../icons/32x32.png | Bin .../icons/Square107x107Logo.png | Bin .../icons/Square142x142Logo.png | Bin .../icons/Square150x150Logo.png | Bin .../icons/Square284x284Logo.png | Bin .../icons/Square30x30Logo.png | Bin .../icons/Square310x310Logo.png | Bin .../icons/Square44x44Logo.png | Bin .../icons/Square71x71Logo.png | Bin .../icons/Square89x89Logo.png | Bin .../icons/StoreLogo.png | Bin .../icons/icon.icns | Bin .../icons/icon.ico | Bin .../icons/icon.png | Bin .../tauri.conf.json.jinja | 0 66 files changed, 17 insertions(+), 3 deletions(-) rename templates/{% if template == 'react' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/.vscode/extensions.json (100%) rename templates/{% if template == 'react' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/README.md (100%) rename templates/{% if template == 'react' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/index.html (100%) rename templates/{% if template == 'react' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/package.json.jinja (100%) rename templates/{% if template == 'react' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/public/pytauri.svg (100%) rename templates/{% if template == 'react' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/public/python.svg (100%) rename templates/{% if template == 'react' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/public/tauri.svg (100%) rename templates/{% if template == 'react' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/public/vite.svg (100%) rename templates/{% if template == 'react' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/src/App.css (100%) rename templates/{% if template == 'react' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/src/App.tsx (100%) rename templates/{% if template == 'react' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/src/assets/react.svg (100%) rename templates/{% if template == 'react' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/src/main.tsx (100%) rename templates/{% if template == 'react' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/src/vite-env.d.ts (100%) rename templates/{% if template == 'react' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/tsconfig.json (100%) rename templates/{% if template == 'react' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/tsconfig.node.json (100%) rename templates/{% if template == 'react' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/vite.config.ts (100%) rename templates/{% if template == 'svelte' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/.vscode/extensions.json (100%) rename templates/{% if template == 'svelte' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/.vscode/settings.json (100%) rename templates/{% if template == 'svelte' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/README.md (100%) rename templates/{% if template == 'svelte' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/package.json.jinja (100%) rename templates/{% if template == 'svelte' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/src/app.html (100%) rename templates/{% if template == 'svelte' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/src/routes/+layout.ts (100%) rename templates/{% if template == 'svelte' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/src/routes/+page.svelte (100%) rename templates/{% if template == 'svelte' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/static/pytauri.svg (100%) rename templates/{% if template == 'svelte' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/static/python.svg (100%) rename templates/{% if template == 'svelte' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/static/svelte.svg (100%) rename templates/{% if template == 'svelte' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/static/tauri.svg (100%) rename templates/{% if template == 'svelte' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/static/vite.svg (100%) rename templates/{% if template == 'svelte' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/svelte.config.js (100%) rename templates/{% if template == 'svelte' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/tsconfig.json (100%) rename templates/{% if template == 'svelte' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/vite.config.js (100%) rename templates/{% if template == 'vue' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/.vscode/extensions.json (100%) rename templates/{% if template == 'vue' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/README.md (100%) rename templates/{% if template == 'vue' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/index.html (100%) rename templates/{% if template == 'vue' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/package.json.jinja (100%) rename templates/{% if template == 'vue' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/public/pytauri.svg (100%) rename templates/{% if template == 'vue' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/public/python.svg (100%) rename templates/{% if template == 'vue' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/public/tauri.svg (100%) rename templates/{% if template == 'vue' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/public/vite.svg (100%) rename templates/{% if template == 'vue' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/src/App.vue (100%) rename templates/{% if template == 'vue' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/src/assets/vue.svg (100%) rename templates/{% if template == 'vue' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/src/main.ts (100%) rename templates/{% if template == 'vue' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/src/vite-env.d.ts (100%) rename templates/{% if template == 'vue' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/tsconfig.json (100%) rename templates/{% if template == 'vue' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/tsconfig.node.json (100%) rename templates/{% if template == 'vue' %}.{% endif %}/{{{ project_name }} => {{ project_name }}{{ frontend_path }}}/vite.config.ts (100%) rename templates/{{ '.' }}/{{ project_name }}/{src-tauri => {{ frontend_path }}src-tauri}/capabilities/default.json (100%) rename templates/{{ '.' }}/{{ project_name }}/{src-tauri => {{ frontend_path }}src-tauri}/icons/128x128.png (100%) rename templates/{{ '.' }}/{{ project_name }}/{src-tauri => {{ frontend_path }}src-tauri}/icons/128x128@2x.png (100%) rename templates/{{ '.' }}/{{ project_name }}/{src-tauri => {{ frontend_path }}src-tauri}/icons/32x32.png (100%) rename templates/{{ '.' }}/{{ project_name }}/{src-tauri => {{ frontend_path }}src-tauri}/icons/Square107x107Logo.png (100%) rename templates/{{ '.' }}/{{ project_name }}/{src-tauri => {{ frontend_path }}src-tauri}/icons/Square142x142Logo.png (100%) rename templates/{{ '.' }}/{{ project_name }}/{src-tauri => {{ frontend_path }}src-tauri}/icons/Square150x150Logo.png (100%) rename templates/{{ '.' }}/{{ project_name }}/{src-tauri => {{ frontend_path }}src-tauri}/icons/Square284x284Logo.png (100%) rename templates/{{ '.' }}/{{ project_name }}/{src-tauri => {{ frontend_path }}src-tauri}/icons/Square30x30Logo.png (100%) rename templates/{{ '.' }}/{{ project_name }}/{src-tauri => {{ frontend_path }}src-tauri}/icons/Square310x310Logo.png (100%) rename templates/{{ '.' }}/{{ project_name }}/{src-tauri => {{ frontend_path }}src-tauri}/icons/Square44x44Logo.png (100%) rename templates/{{ '.' }}/{{ project_name }}/{src-tauri => {{ frontend_path }}src-tauri}/icons/Square71x71Logo.png (100%) rename templates/{{ '.' }}/{{ project_name }}/{src-tauri => {{ frontend_path }}src-tauri}/icons/Square89x89Logo.png (100%) rename templates/{{ '.' }}/{{ project_name }}/{src-tauri => {{ frontend_path }}src-tauri}/icons/StoreLogo.png (100%) rename templates/{{ '.' }}/{{ project_name }}/{src-tauri => {{ frontend_path }}src-tauri}/icons/icon.icns (100%) rename templates/{{ '.' }}/{{ project_name }}/{src-tauri => {{ frontend_path }}src-tauri}/icons/icon.ico (100%) rename templates/{{ '.' }}/{{ project_name }}/{src-tauri => {{ frontend_path }}src-tauri}/icons/icon.png (100%) rename templates/{{ '.' }}/{{ project_name }}/{src-tauri => {{ frontend_path }}src-tauri}/tauri.conf.json.jinja (100%) diff --git a/copier.yaml b/copier.yaml index 7a007bb..598fe79 100644 --- a/copier.yaml +++ b/copier.yaml @@ -29,12 +29,13 @@ template: Svelte: svelte default: vue -_frontend_path: +frontend_path: type: str - default: "{% if with_rust == true %}.{% else %}./app{% endif %}" + default: "{% if with_rust == true %}./{% else %}./app/{% endif %}" when: false _message_after_copy: | + {% if with_rust == true %} Template created! To get started run: cd {{ project_name }} pnpm install @@ -50,3 +51,16 @@ _message_after_copy: | pnpm tauri dev For building a standalone app, see the `scripts/` folder. + {% else %} + Template created! To get started run: + cd {{ project_name }} + pnpm install + pnpm build + uv venv + {%- if _copier_conf.os == "windows" %} + .venv\Scripts\activate + {%- else %} + source .venv/bin/activate + {%- endif %} + uv sync + {% endif %} diff --git a/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}/.vscode/extensions.json b/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/.vscode/extensions.json similarity index 100% rename from templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}/.vscode/extensions.json rename to templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/.vscode/extensions.json diff --git a/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}/README.md b/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/README.md similarity index 100% rename from templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}/README.md rename to templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/README.md diff --git a/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}/index.html b/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/index.html similarity index 100% rename from templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}/index.html rename to templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/index.html diff --git a/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}/package.json.jinja b/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/package.json.jinja similarity index 100% rename from templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}/package.json.jinja rename to templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/package.json.jinja diff --git a/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}/public/pytauri.svg b/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public/pytauri.svg similarity index 100% rename from templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}/public/pytauri.svg rename to templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public/pytauri.svg diff --git a/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}/public/python.svg b/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public/python.svg similarity index 100% rename from templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}/public/python.svg rename to templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public/python.svg diff --git a/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}/public/tauri.svg b/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public/tauri.svg similarity index 100% rename from templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}/public/tauri.svg rename to templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public/tauri.svg diff --git a/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}/public/vite.svg b/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public/vite.svg similarity index 100% rename from templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}/public/vite.svg rename to templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public/vite.svg diff --git a/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}/src/App.css b/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/App.css similarity index 100% rename from templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}/src/App.css rename to templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/App.css diff --git a/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}/src/App.tsx b/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/App.tsx similarity index 100% rename from templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}/src/App.tsx rename to templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/App.tsx diff --git a/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}/src/assets/react.svg b/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/assets/react.svg similarity index 100% rename from templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}/src/assets/react.svg rename to templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/assets/react.svg diff --git a/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}/src/main.tsx b/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/main.tsx similarity index 100% rename from templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}/src/main.tsx rename to templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/main.tsx diff --git a/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}/src/vite-env.d.ts b/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/vite-env.d.ts similarity index 100% rename from templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}/src/vite-env.d.ts rename to templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/vite-env.d.ts diff --git a/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}/tsconfig.json b/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/tsconfig.json similarity index 100% rename from templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}/tsconfig.json rename to templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/tsconfig.json diff --git a/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}/tsconfig.node.json b/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/tsconfig.node.json similarity index 100% rename from templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}/tsconfig.node.json rename to templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/tsconfig.node.json diff --git a/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}/vite.config.ts b/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/vite.config.ts similarity index 100% rename from templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}/vite.config.ts rename to templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/vite.config.ts diff --git a/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}/.vscode/extensions.json b/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/.vscode/extensions.json similarity index 100% rename from templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}/.vscode/extensions.json rename to templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/.vscode/extensions.json diff --git a/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}/.vscode/settings.json b/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/.vscode/settings.json similarity index 100% rename from templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}/.vscode/settings.json rename to templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/.vscode/settings.json diff --git a/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}/README.md b/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/README.md similarity index 100% rename from templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}/README.md rename to templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/README.md diff --git a/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}/package.json.jinja b/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/package.json.jinja similarity index 100% rename from templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}/package.json.jinja rename to templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/package.json.jinja diff --git a/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}/src/app.html b/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/app.html similarity index 100% rename from templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}/src/app.html rename to templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/app.html diff --git a/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}/src/routes/+layout.ts b/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/routes/+layout.ts similarity index 100% rename from templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}/src/routes/+layout.ts rename to templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/routes/+layout.ts diff --git a/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}/src/routes/+page.svelte b/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/routes/+page.svelte similarity index 100% rename from templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}/src/routes/+page.svelte rename to templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/routes/+page.svelte diff --git a/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}/static/pytauri.svg b/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/static/pytauri.svg similarity index 100% rename from templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}/static/pytauri.svg rename to templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/static/pytauri.svg diff --git a/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}/static/python.svg b/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/static/python.svg similarity index 100% rename from templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}/static/python.svg rename to templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/static/python.svg diff --git a/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}/static/svelte.svg b/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/static/svelte.svg similarity index 100% rename from templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}/static/svelte.svg rename to templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/static/svelte.svg diff --git a/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}/static/tauri.svg b/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/static/tauri.svg similarity index 100% rename from templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}/static/tauri.svg rename to templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/static/tauri.svg diff --git a/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}/static/vite.svg b/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/static/vite.svg similarity index 100% rename from templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}/static/vite.svg rename to templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/static/vite.svg diff --git a/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}/svelte.config.js b/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/svelte.config.js similarity index 100% rename from templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}/svelte.config.js rename to templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/svelte.config.js diff --git a/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}/tsconfig.json b/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/tsconfig.json similarity index 100% rename from templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}/tsconfig.json rename to templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/tsconfig.json diff --git a/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}/vite.config.js b/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/vite.config.js similarity index 100% rename from templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}/vite.config.js rename to templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/vite.config.js diff --git a/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}/.vscode/extensions.json b/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/.vscode/extensions.json similarity index 100% rename from templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}/.vscode/extensions.json rename to templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/.vscode/extensions.json diff --git a/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}/README.md b/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/README.md similarity index 100% rename from templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}/README.md rename to templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/README.md diff --git a/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}/index.html b/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/index.html similarity index 100% rename from templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}/index.html rename to templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/index.html diff --git a/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}/package.json.jinja b/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/package.json.jinja similarity index 100% rename from templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}/package.json.jinja rename to templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/package.json.jinja diff --git a/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}/public/pytauri.svg b/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public/pytauri.svg similarity index 100% rename from templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}/public/pytauri.svg rename to templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public/pytauri.svg diff --git a/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}/public/python.svg b/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public/python.svg similarity index 100% rename from templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}/public/python.svg rename to templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public/python.svg diff --git a/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}/public/tauri.svg b/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public/tauri.svg similarity index 100% rename from templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}/public/tauri.svg rename to templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public/tauri.svg diff --git a/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}/public/vite.svg b/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public/vite.svg similarity index 100% rename from templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}/public/vite.svg rename to templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public/vite.svg diff --git a/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}/src/App.vue b/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/App.vue similarity index 100% rename from templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}/src/App.vue rename to templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/App.vue diff --git a/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}/src/assets/vue.svg b/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/assets/vue.svg similarity index 100% rename from templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}/src/assets/vue.svg rename to templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/assets/vue.svg diff --git a/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}/src/main.ts b/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/main.ts similarity index 100% rename from templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}/src/main.ts rename to templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/main.ts diff --git a/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}/src/vite-env.d.ts b/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/vite-env.d.ts similarity index 100% rename from templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}/src/vite-env.d.ts rename to templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/vite-env.d.ts diff --git a/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}/tsconfig.json b/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/tsconfig.json similarity index 100% rename from templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}/tsconfig.json rename to templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/tsconfig.json diff --git a/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}/tsconfig.node.json b/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/tsconfig.node.json similarity index 100% rename from templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}/tsconfig.node.json rename to templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/tsconfig.node.json diff --git a/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}/vite.config.ts b/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/vite.config.ts similarity index 100% rename from templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}/vite.config.ts rename to templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/vite.config.ts diff --git a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == false %}.{% endif %}/src/{{ package_name }}/__init__.py b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == false %}.{% endif %}/src/{{ package_name }}/__init__.py index ef81ca6..9efb352 100644 --- a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == false %}.{% endif %}/src/{{ package_name }}/__init__.py +++ b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == false %}.{% endif %}/src/{{ package_name }}/__init__.py @@ -7,7 +7,7 @@ from pytauri import Commands from pytauri_wheel.lib import builder_factory, context_factory -SRC_TAURI_DIR = Path(__file__).parent.parent.parent.absolute() +SRC_TAURI_DIR = Path(__file__).parent.parent.parent / "app" / "src-tauri" # If the DEV_SERVER env. variable is set, use that server for development (allows hot-reloading). Otherwise, use the built assets to serve the frontend. diff --git a/templates/{{ '.' }}/{{ project_name }}/src-tauri/capabilities/default.json b/templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/capabilities/default.json similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/src-tauri/capabilities/default.json rename to templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/capabilities/default.json diff --git a/templates/{{ '.' }}/{{ project_name }}/src-tauri/icons/128x128.png b/templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/128x128.png similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/src-tauri/icons/128x128.png rename to templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/128x128.png diff --git a/templates/{{ '.' }}/{{ project_name }}/src-tauri/icons/128x128@2x.png b/templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/128x128@2x.png similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/src-tauri/icons/128x128@2x.png rename to templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/128x128@2x.png diff --git a/templates/{{ '.' }}/{{ project_name }}/src-tauri/icons/32x32.png b/templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/32x32.png similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/src-tauri/icons/32x32.png rename to templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/32x32.png diff --git a/templates/{{ '.' }}/{{ project_name }}/src-tauri/icons/Square107x107Logo.png b/templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/Square107x107Logo.png similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/src-tauri/icons/Square107x107Logo.png rename to templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/Square107x107Logo.png diff --git a/templates/{{ '.' }}/{{ project_name }}/src-tauri/icons/Square142x142Logo.png b/templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/Square142x142Logo.png similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/src-tauri/icons/Square142x142Logo.png rename to templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/Square142x142Logo.png diff --git a/templates/{{ '.' }}/{{ project_name }}/src-tauri/icons/Square150x150Logo.png b/templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/Square150x150Logo.png similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/src-tauri/icons/Square150x150Logo.png rename to templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/Square150x150Logo.png diff --git a/templates/{{ '.' }}/{{ project_name }}/src-tauri/icons/Square284x284Logo.png b/templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/Square284x284Logo.png similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/src-tauri/icons/Square284x284Logo.png rename to templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/Square284x284Logo.png diff --git a/templates/{{ '.' }}/{{ project_name }}/src-tauri/icons/Square30x30Logo.png b/templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/Square30x30Logo.png similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/src-tauri/icons/Square30x30Logo.png rename to templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/Square30x30Logo.png diff --git a/templates/{{ '.' }}/{{ project_name }}/src-tauri/icons/Square310x310Logo.png b/templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/Square310x310Logo.png similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/src-tauri/icons/Square310x310Logo.png rename to templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/Square310x310Logo.png diff --git a/templates/{{ '.' }}/{{ project_name }}/src-tauri/icons/Square44x44Logo.png b/templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/Square44x44Logo.png similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/src-tauri/icons/Square44x44Logo.png rename to templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/Square44x44Logo.png diff --git a/templates/{{ '.' }}/{{ project_name }}/src-tauri/icons/Square71x71Logo.png b/templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/Square71x71Logo.png similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/src-tauri/icons/Square71x71Logo.png rename to templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/Square71x71Logo.png diff --git a/templates/{{ '.' }}/{{ project_name }}/src-tauri/icons/Square89x89Logo.png b/templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/Square89x89Logo.png similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/src-tauri/icons/Square89x89Logo.png rename to templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/Square89x89Logo.png diff --git a/templates/{{ '.' }}/{{ project_name }}/src-tauri/icons/StoreLogo.png b/templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/StoreLogo.png similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/src-tauri/icons/StoreLogo.png rename to templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/StoreLogo.png diff --git a/templates/{{ '.' }}/{{ project_name }}/src-tauri/icons/icon.icns b/templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/icon.icns similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/src-tauri/icons/icon.icns rename to templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/icon.icns diff --git a/templates/{{ '.' }}/{{ project_name }}/src-tauri/icons/icon.ico b/templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/icon.ico similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/src-tauri/icons/icon.ico rename to templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/icon.ico diff --git a/templates/{{ '.' }}/{{ project_name }}/src-tauri/icons/icon.png b/templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/icon.png similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/src-tauri/icons/icon.png rename to templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/icon.png diff --git a/templates/{{ '.' }}/{{ project_name }}/src-tauri/tauri.conf.json.jinja b/templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/tauri.conf.json.jinja similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/src-tauri/tauri.conf.json.jinja rename to templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/tauri.conf.json.jinja From 2b4dc9a54326fe92562b03e5702dc9776df2269b Mon Sep 17 00:00:00 2001 From: ISOR3X Date: Wed, 24 Dec 2025 13:14:48 +0100 Subject: [PATCH 04/16] feat: new template structure --- scripts/create_copy.py | 2 +- .../public => _assets_}/pytauri.svg | 0 .../public => _assets_}/python.svg | 0 .../public => _assets_}/tauri.svg | 0 .../public => _assets_}/vite.svg | 0 .../src-tauri/.gitignore | 0 .../src-tauri/.taurignore | 0 .../src-tauri/Cargo.toml.jinja | 0 .../src-tauri/build.rs | 0 .../src-tauri}/capabilities/default.json | 0 .../src-tauri}/icons/128x128.png | Bin .../src-tauri}/icons/128x128@2x.png | Bin .../src-tauri}/icons/32x32.png | Bin .../src-tauri}/icons/Square107x107Logo.png | Bin .../src-tauri}/icons/Square142x142Logo.png | Bin .../src-tauri}/icons/Square150x150Logo.png | Bin .../src-tauri}/icons/Square284x284Logo.png | Bin .../src-tauri}/icons/Square30x30Logo.png | Bin .../src-tauri}/icons/Square310x310Logo.png | Bin .../src-tauri}/icons/Square44x44Logo.png | Bin .../src-tauri}/icons/Square71x71Logo.png | Bin .../src-tauri}/icons/Square89x89Logo.png | Bin .../src-tauri}/icons/StoreLogo.png | Bin .../src-tauri}/icons/icon.icns | Bin .../src-tauri}/icons/icon.ico | Bin .../src-tauri}/icons/icon.png | Bin .../src-tauri/pyproject.toml.jinja | 0 .../src-python/{{ package_name }}/__init__.py | 0 .../{{ package_name }}/__main__.py.jinja | 0 .../src-python}/{{ package_name }}/py.typed | 0 .../src-tauri/src/lib.rs | 0 .../src-tauri/src/main.rs.jinja | 0 .../src-tauri/tauri.bundle.json | 0 .../src-tauri}/tauri.conf.json.jinja | 0 .../.vscode/extensions.json | 0 .../README.md | 0 .../index.html | 0 .../package.json.jinja | 0 .../src/App.css | 0 .../src/App.tsx | 0 .../src/assets/react.svg | 0 .../src/main.tsx | 0 .../src/vite-env.d.ts | 0 .../tsconfig.json | 0 .../tsconfig.node.json | 0 .../vite.config.ts | 0 .../.vscode/extensions.json | 0 .../.vscode/settings.json | 0 .../README.md | 0 .../package.json.jinja | 0 .../src/app.html | 0 .../src/routes/+layout.ts | 0 .../src/routes/+page.svelte | 0 .../svelte.config.js | 0 .../tsconfig.json | 0 .../vite.config.js | 0 .../.vscode/extensions.json | 0 .../README.md | 0 .../index.html | 0 .../package.json.jinja | 0 .../public}/pytauri.svg | 0 .../public}/python.svg | 0 .../public}/tauri.svg | 0 .../public}/vite.svg | 0 .../src/App.vue | 0 .../src/assets/vue.svg | 0 .../src/main.ts | 0 .../src/vite-env.d.ts | 0 .../tsconfig.json | 0 .../tsconfig.node.json | 0 .../vite.config.ts | 0 .../static/svelte.svg | 1 - .../public/pytauri.svg | 19 -- .../public/python.svg | 19 -- .../public/tauri.svg | 6 - .../public/vite.svg | 1 - .../{{ '.' }}/{{ project_name }}/.gitignore | 28 --- .../pyproject.toml.jinja | 18 -- .../src/{{ package_name }}/__init__.py | 46 ----- .../.github/workflows/publish.yaml.jinja | 163 ------------------ .../Cargo.toml.jinja | 18 -- .../pyproject.toml.jinja | 30 ---- .../scripts/README.md | 7 - .../scripts/linux/build.sh.jinja | 23 --- .../scripts/linux/download-py.sh | 19 -- .../scripts/macos/build.sh.jinja | 23 --- .../scripts/macos/download-py.sh | 23 --- .../scripts/windows/build.ps1.jinja | 15 -- .../scripts/windows/download-py.ps1 | 22 --- .../{{ package_name }}/__main__.py.jinja | 14 -- .../src-python/{{ package_name }}/py.typed | 0 91 files changed, 1 insertion(+), 496 deletions(-) rename templates/{{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public => _assets_}/pytauri.svg (100%) rename templates/{{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public => _assets_}/python.svg (100%) rename templates/{{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public => _assets_}/tauri.svg (100%) rename templates/{{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public => _assets_}/vite.svg (100%) rename templates/{{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %} => _base_}/src-tauri/.gitignore (100%) rename templates/{{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %} => _base_}/src-tauri/.taurignore (100%) rename templates/{{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %} => _base_}/src-tauri/Cargo.toml.jinja (100%) rename templates/{{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %} => _base_}/src-tauri/build.rs (100%) rename templates/{{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri => _base_/src-tauri}/capabilities/default.json (100%) rename templates/{{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri => _base_/src-tauri}/icons/128x128.png (100%) rename templates/{{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri => _base_/src-tauri}/icons/128x128@2x.png (100%) rename templates/{{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri => _base_/src-tauri}/icons/32x32.png (100%) rename templates/{{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri => _base_/src-tauri}/icons/Square107x107Logo.png (100%) rename templates/{{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri => _base_/src-tauri}/icons/Square142x142Logo.png (100%) rename templates/{{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri => _base_/src-tauri}/icons/Square150x150Logo.png (100%) rename templates/{{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri => _base_/src-tauri}/icons/Square284x284Logo.png (100%) rename templates/{{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri => _base_/src-tauri}/icons/Square30x30Logo.png (100%) rename templates/{{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri => _base_/src-tauri}/icons/Square310x310Logo.png (100%) rename templates/{{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri => _base_/src-tauri}/icons/Square44x44Logo.png (100%) rename templates/{{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri => _base_/src-tauri}/icons/Square71x71Logo.png (100%) rename templates/{{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri => _base_/src-tauri}/icons/Square89x89Logo.png (100%) rename templates/{{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri => _base_/src-tauri}/icons/StoreLogo.png (100%) rename templates/{{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri => _base_/src-tauri}/icons/icon.icns (100%) rename templates/{{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri => _base_/src-tauri}/icons/icon.ico (100%) rename templates/{{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri => _base_/src-tauri}/icons/icon.png (100%) rename templates/{{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %} => _base_}/src-tauri/pyproject.toml.jinja (100%) rename templates/{{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %} => _base_}/src-tauri/src-python/{{ package_name }}/__init__.py (100%) rename templates/{{{ '.' }}/{{ project_name }}/{% if with_rust == false %}.{% endif %}/src => _base_/src-tauri/src-python}/{{ package_name }}/__main__.py.jinja (100%) rename templates/{{{ '.' }}/{{ project_name }}/{% if with_rust == false %}.{% endif %}/src => _base_/src-tauri/src-python}/{{ package_name }}/py.typed (100%) rename templates/{{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %} => _base_}/src-tauri/src/lib.rs (100%) rename templates/{{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %} => _base_}/src-tauri/src/main.rs.jinja (100%) rename templates/{{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %} => _base_}/src-tauri/tauri.bundle.json (100%) rename templates/{{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri => _base_/src-tauri}/tauri.conf.json.jinja (100%) rename templates/{{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }} => template-react-ts}/.vscode/extensions.json (100%) rename templates/{{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }} => template-react-ts}/README.md (100%) rename templates/{{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }} => template-react-ts}/index.html (100%) rename templates/{{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }} => template-react-ts}/package.json.jinja (100%) rename templates/{{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }} => template-react-ts}/src/App.css (100%) rename templates/{{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }} => template-react-ts}/src/App.tsx (100%) rename templates/{{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }} => template-react-ts}/src/assets/react.svg (100%) rename templates/{{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }} => template-react-ts}/src/main.tsx (100%) rename templates/{{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }} => template-react-ts}/src/vite-env.d.ts (100%) rename templates/{{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }} => template-react-ts}/tsconfig.json (100%) rename templates/{{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }} => template-react-ts}/tsconfig.node.json (100%) rename templates/{{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }} => template-react-ts}/vite.config.ts (100%) rename templates/{{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }} => template-svelte-ts}/.vscode/extensions.json (100%) rename templates/{{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }} => template-svelte-ts}/.vscode/settings.json (100%) rename templates/{{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }} => template-svelte-ts}/README.md (100%) rename templates/{{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }} => template-svelte-ts}/package.json.jinja (100%) rename templates/{{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }} => template-svelte-ts}/src/app.html (100%) rename templates/{{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }} => template-svelte-ts}/src/routes/+layout.ts (100%) rename templates/{{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }} => template-svelte-ts}/src/routes/+page.svelte (100%) rename templates/{{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }} => template-svelte-ts}/svelte.config.js (100%) rename templates/{{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }} => template-svelte-ts}/tsconfig.json (100%) rename templates/{{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }} => template-svelte-ts}/vite.config.js (100%) rename templates/{{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }} => template-vue-ts}/.vscode/extensions.json (100%) rename templates/{{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }} => template-vue-ts}/README.md (100%) rename templates/{{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }} => template-vue-ts}/index.html (100%) rename templates/{{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }} => template-vue-ts}/package.json.jinja (100%) rename templates/{{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/static => template-vue-ts/public}/pytauri.svg (100%) rename templates/{{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/static => template-vue-ts/public}/python.svg (100%) rename templates/{{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/static => template-vue-ts/public}/tauri.svg (100%) rename templates/{{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/static => template-vue-ts/public}/vite.svg (100%) rename templates/{{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }} => template-vue-ts}/src/App.vue (100%) rename templates/{{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }} => template-vue-ts}/src/assets/vue.svg (100%) rename templates/{{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }} => template-vue-ts}/src/main.ts (100%) rename templates/{{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }} => template-vue-ts}/src/vite-env.d.ts (100%) rename templates/{{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }} => template-vue-ts}/tsconfig.json (100%) rename templates/{{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }} => template-vue-ts}/tsconfig.node.json (100%) rename templates/{{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }} => template-vue-ts}/vite.config.ts (100%) delete mode 100644 templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/static/svelte.svg delete mode 100644 templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public/pytauri.svg delete mode 100644 templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public/python.svg delete mode 100644 templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public/tauri.svg delete mode 100644 templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public/vite.svg delete mode 100644 templates/{{ '.' }}/{{ project_name }}/.gitignore delete mode 100644 templates/{{ '.' }}/{{ project_name }}/{% if with_rust == false %}.{% endif %}/pyproject.toml.jinja delete mode 100644 templates/{{ '.' }}/{{ project_name }}/{% if with_rust == false %}.{% endif %}/src/{{ package_name }}/__init__.py delete mode 100644 templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/.github/workflows/publish.yaml.jinja delete mode 100644 templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/Cargo.toml.jinja delete mode 100644 templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/pyproject.toml.jinja delete mode 100644 templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/scripts/README.md delete mode 100644 templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/scripts/linux/build.sh.jinja delete mode 100644 templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/scripts/linux/download-py.sh delete mode 100644 templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/scripts/macos/build.sh.jinja delete mode 100644 templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/scripts/macos/download-py.sh delete mode 100644 templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/scripts/windows/build.ps1.jinja delete mode 100644 templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/scripts/windows/download-py.ps1 delete mode 100644 templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/src-python/{{ package_name }}/__main__.py.jinja delete mode 100644 templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/src-python/{{ package_name }}/py.typed diff --git a/scripts/create_copy.py b/scripts/create_copy.py index 392d6b2..5ec44a5 100644 --- a/scripts/create_copy.py +++ b/scripts/create_copy.py @@ -8,7 +8,7 @@ OUTPUT_DIR = Path(__file__).parent.parent / ".generated_template" / "pytauri-app" kwargs = { - "project_name": "pytauri-app", + # "project_name": "pytauri-app", "identifier": "com.username.pytauri-app", "template": "vue", "with_rust": "false", diff --git a/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public/pytauri.svg b/templates/_assets_/pytauri.svg similarity index 100% rename from templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public/pytauri.svg rename to templates/_assets_/pytauri.svg diff --git a/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public/python.svg b/templates/_assets_/python.svg similarity index 100% rename from templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public/python.svg rename to templates/_assets_/python.svg diff --git a/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public/tauri.svg b/templates/_assets_/tauri.svg similarity index 100% rename from templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public/tauri.svg rename to templates/_assets_/tauri.svg diff --git a/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public/vite.svg b/templates/_assets_/vite.svg similarity index 100% rename from templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public/vite.svg rename to templates/_assets_/vite.svg diff --git a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/.gitignore b/templates/_base_/src-tauri/.gitignore similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/.gitignore rename to templates/_base_/src-tauri/.gitignore diff --git a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/.taurignore b/templates/_base_/src-tauri/.taurignore similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/.taurignore rename to templates/_base_/src-tauri/.taurignore diff --git a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/Cargo.toml.jinja b/templates/_base_/src-tauri/Cargo.toml.jinja similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/Cargo.toml.jinja rename to templates/_base_/src-tauri/Cargo.toml.jinja diff --git a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/build.rs b/templates/_base_/src-tauri/build.rs similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/build.rs rename to templates/_base_/src-tauri/build.rs diff --git a/templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/capabilities/default.json b/templates/_base_/src-tauri/capabilities/default.json similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/capabilities/default.json rename to templates/_base_/src-tauri/capabilities/default.json diff --git a/templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/128x128.png b/templates/_base_/src-tauri/icons/128x128.png similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/128x128.png rename to templates/_base_/src-tauri/icons/128x128.png diff --git a/templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/128x128@2x.png b/templates/_base_/src-tauri/icons/128x128@2x.png similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/128x128@2x.png rename to templates/_base_/src-tauri/icons/128x128@2x.png diff --git a/templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/32x32.png b/templates/_base_/src-tauri/icons/32x32.png similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/32x32.png rename to templates/_base_/src-tauri/icons/32x32.png diff --git a/templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/Square107x107Logo.png b/templates/_base_/src-tauri/icons/Square107x107Logo.png similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/Square107x107Logo.png rename to templates/_base_/src-tauri/icons/Square107x107Logo.png diff --git a/templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/Square142x142Logo.png b/templates/_base_/src-tauri/icons/Square142x142Logo.png similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/Square142x142Logo.png rename to templates/_base_/src-tauri/icons/Square142x142Logo.png diff --git a/templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/Square150x150Logo.png b/templates/_base_/src-tauri/icons/Square150x150Logo.png similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/Square150x150Logo.png rename to templates/_base_/src-tauri/icons/Square150x150Logo.png diff --git a/templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/Square284x284Logo.png b/templates/_base_/src-tauri/icons/Square284x284Logo.png similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/Square284x284Logo.png rename to templates/_base_/src-tauri/icons/Square284x284Logo.png diff --git a/templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/Square30x30Logo.png b/templates/_base_/src-tauri/icons/Square30x30Logo.png similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/Square30x30Logo.png rename to templates/_base_/src-tauri/icons/Square30x30Logo.png diff --git a/templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/Square310x310Logo.png b/templates/_base_/src-tauri/icons/Square310x310Logo.png similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/Square310x310Logo.png rename to templates/_base_/src-tauri/icons/Square310x310Logo.png diff --git a/templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/Square44x44Logo.png b/templates/_base_/src-tauri/icons/Square44x44Logo.png similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/Square44x44Logo.png rename to templates/_base_/src-tauri/icons/Square44x44Logo.png diff --git a/templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/Square71x71Logo.png b/templates/_base_/src-tauri/icons/Square71x71Logo.png similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/Square71x71Logo.png rename to templates/_base_/src-tauri/icons/Square71x71Logo.png diff --git a/templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/Square89x89Logo.png b/templates/_base_/src-tauri/icons/Square89x89Logo.png similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/Square89x89Logo.png rename to templates/_base_/src-tauri/icons/Square89x89Logo.png diff --git a/templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/StoreLogo.png b/templates/_base_/src-tauri/icons/StoreLogo.png similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/StoreLogo.png rename to templates/_base_/src-tauri/icons/StoreLogo.png diff --git a/templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/icon.icns b/templates/_base_/src-tauri/icons/icon.icns similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/icon.icns rename to templates/_base_/src-tauri/icons/icon.icns diff --git a/templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/icon.ico b/templates/_base_/src-tauri/icons/icon.ico similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/icon.ico rename to templates/_base_/src-tauri/icons/icon.ico diff --git a/templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/icon.png b/templates/_base_/src-tauri/icons/icon.png similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/icons/icon.png rename to templates/_base_/src-tauri/icons/icon.png diff --git a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/pyproject.toml.jinja b/templates/_base_/src-tauri/pyproject.toml.jinja similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/pyproject.toml.jinja rename to templates/_base_/src-tauri/pyproject.toml.jinja diff --git a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/src-python/{{ package_name }}/__init__.py b/templates/_base_/src-tauri/src-python/{{ package_name }}/__init__.py similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/src-python/{{ package_name }}/__init__.py rename to templates/_base_/src-tauri/src-python/{{ package_name }}/__init__.py diff --git a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == false %}.{% endif %}/src/{{ package_name }}/__main__.py.jinja b/templates/_base_/src-tauri/src-python/{{ package_name }}/__main__.py.jinja similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/{% if with_rust == false %}.{% endif %}/src/{{ package_name }}/__main__.py.jinja rename to templates/_base_/src-tauri/src-python/{{ package_name }}/__main__.py.jinja diff --git a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == false %}.{% endif %}/src/{{ package_name }}/py.typed b/templates/_base_/src-tauri/src-python/{{ package_name }}/py.typed similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/{% if with_rust == false %}.{% endif %}/src/{{ package_name }}/py.typed rename to templates/_base_/src-tauri/src-python/{{ package_name }}/py.typed diff --git a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/src/lib.rs b/templates/_base_/src-tauri/src/lib.rs similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/src/lib.rs rename to templates/_base_/src-tauri/src/lib.rs diff --git a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/src/main.rs.jinja b/templates/_base_/src-tauri/src/main.rs.jinja similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/src/main.rs.jinja rename to templates/_base_/src-tauri/src/main.rs.jinja diff --git a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/tauri.bundle.json b/templates/_base_/src-tauri/tauri.bundle.json similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/tauri.bundle.json rename to templates/_base_/src-tauri/tauri.bundle.json diff --git a/templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/tauri.conf.json.jinja b/templates/_base_/src-tauri/tauri.conf.json.jinja similarity index 100% rename from templates/{{ '.' }}/{{ project_name }}/{{ frontend_path }}src-tauri/tauri.conf.json.jinja rename to templates/_base_/src-tauri/tauri.conf.json.jinja diff --git a/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/.vscode/extensions.json b/templates/template-react-ts/.vscode/extensions.json similarity index 100% rename from templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/.vscode/extensions.json rename to templates/template-react-ts/.vscode/extensions.json diff --git a/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/README.md b/templates/template-react-ts/README.md similarity index 100% rename from templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/README.md rename to templates/template-react-ts/README.md diff --git a/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/index.html b/templates/template-react-ts/index.html similarity index 100% rename from templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/index.html rename to templates/template-react-ts/index.html diff --git a/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/package.json.jinja b/templates/template-react-ts/package.json.jinja similarity index 100% rename from templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/package.json.jinja rename to templates/template-react-ts/package.json.jinja diff --git a/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/App.css b/templates/template-react-ts/src/App.css similarity index 100% rename from templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/App.css rename to templates/template-react-ts/src/App.css diff --git a/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/App.tsx b/templates/template-react-ts/src/App.tsx similarity index 100% rename from templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/App.tsx rename to templates/template-react-ts/src/App.tsx diff --git a/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/assets/react.svg b/templates/template-react-ts/src/assets/react.svg similarity index 100% rename from templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/assets/react.svg rename to templates/template-react-ts/src/assets/react.svg diff --git a/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/main.tsx b/templates/template-react-ts/src/main.tsx similarity index 100% rename from templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/main.tsx rename to templates/template-react-ts/src/main.tsx diff --git a/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/vite-env.d.ts b/templates/template-react-ts/src/vite-env.d.ts similarity index 100% rename from templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/vite-env.d.ts rename to templates/template-react-ts/src/vite-env.d.ts diff --git a/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/tsconfig.json b/templates/template-react-ts/tsconfig.json similarity index 100% rename from templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/tsconfig.json rename to templates/template-react-ts/tsconfig.json diff --git a/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/tsconfig.node.json b/templates/template-react-ts/tsconfig.node.json similarity index 100% rename from templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/tsconfig.node.json rename to templates/template-react-ts/tsconfig.node.json diff --git a/templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/vite.config.ts b/templates/template-react-ts/vite.config.ts similarity index 100% rename from templates/{% if template == 'react' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/vite.config.ts rename to templates/template-react-ts/vite.config.ts diff --git a/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/.vscode/extensions.json b/templates/template-svelte-ts/.vscode/extensions.json similarity index 100% rename from templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/.vscode/extensions.json rename to templates/template-svelte-ts/.vscode/extensions.json diff --git a/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/.vscode/settings.json b/templates/template-svelte-ts/.vscode/settings.json similarity index 100% rename from templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/.vscode/settings.json rename to templates/template-svelte-ts/.vscode/settings.json diff --git a/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/README.md b/templates/template-svelte-ts/README.md similarity index 100% rename from templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/README.md rename to templates/template-svelte-ts/README.md diff --git a/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/package.json.jinja b/templates/template-svelte-ts/package.json.jinja similarity index 100% rename from templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/package.json.jinja rename to templates/template-svelte-ts/package.json.jinja diff --git a/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/app.html b/templates/template-svelte-ts/src/app.html similarity index 100% rename from templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/app.html rename to templates/template-svelte-ts/src/app.html diff --git a/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/routes/+layout.ts b/templates/template-svelte-ts/src/routes/+layout.ts similarity index 100% rename from templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/routes/+layout.ts rename to templates/template-svelte-ts/src/routes/+layout.ts diff --git a/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/routes/+page.svelte b/templates/template-svelte-ts/src/routes/+page.svelte similarity index 100% rename from templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/routes/+page.svelte rename to templates/template-svelte-ts/src/routes/+page.svelte diff --git a/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/svelte.config.js b/templates/template-svelte-ts/svelte.config.js similarity index 100% rename from templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/svelte.config.js rename to templates/template-svelte-ts/svelte.config.js diff --git a/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/tsconfig.json b/templates/template-svelte-ts/tsconfig.json similarity index 100% rename from templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/tsconfig.json rename to templates/template-svelte-ts/tsconfig.json diff --git a/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/vite.config.js b/templates/template-svelte-ts/vite.config.js similarity index 100% rename from templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/vite.config.js rename to templates/template-svelte-ts/vite.config.js diff --git a/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/.vscode/extensions.json b/templates/template-vue-ts/.vscode/extensions.json similarity index 100% rename from templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/.vscode/extensions.json rename to templates/template-vue-ts/.vscode/extensions.json diff --git a/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/README.md b/templates/template-vue-ts/README.md similarity index 100% rename from templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/README.md rename to templates/template-vue-ts/README.md diff --git a/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/index.html b/templates/template-vue-ts/index.html similarity index 100% rename from templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/index.html rename to templates/template-vue-ts/index.html diff --git a/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/package.json.jinja b/templates/template-vue-ts/package.json.jinja similarity index 100% rename from templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/package.json.jinja rename to templates/template-vue-ts/package.json.jinja diff --git a/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/static/pytauri.svg b/templates/template-vue-ts/public/pytauri.svg similarity index 100% rename from templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/static/pytauri.svg rename to templates/template-vue-ts/public/pytauri.svg diff --git a/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/static/python.svg b/templates/template-vue-ts/public/python.svg similarity index 100% rename from templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/static/python.svg rename to templates/template-vue-ts/public/python.svg diff --git a/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/static/tauri.svg b/templates/template-vue-ts/public/tauri.svg similarity index 100% rename from templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/static/tauri.svg rename to templates/template-vue-ts/public/tauri.svg diff --git a/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/static/vite.svg b/templates/template-vue-ts/public/vite.svg similarity index 100% rename from templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/static/vite.svg rename to templates/template-vue-ts/public/vite.svg diff --git a/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/App.vue b/templates/template-vue-ts/src/App.vue similarity index 100% rename from templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/App.vue rename to templates/template-vue-ts/src/App.vue diff --git a/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/assets/vue.svg b/templates/template-vue-ts/src/assets/vue.svg similarity index 100% rename from templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/assets/vue.svg rename to templates/template-vue-ts/src/assets/vue.svg diff --git a/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/main.ts b/templates/template-vue-ts/src/main.ts similarity index 100% rename from templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/main.ts rename to templates/template-vue-ts/src/main.ts diff --git a/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/vite-env.d.ts b/templates/template-vue-ts/src/vite-env.d.ts similarity index 100% rename from templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/src/vite-env.d.ts rename to templates/template-vue-ts/src/vite-env.d.ts diff --git a/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/tsconfig.json b/templates/template-vue-ts/tsconfig.json similarity index 100% rename from templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/tsconfig.json rename to templates/template-vue-ts/tsconfig.json diff --git a/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/tsconfig.node.json b/templates/template-vue-ts/tsconfig.node.json similarity index 100% rename from templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/tsconfig.node.json rename to templates/template-vue-ts/tsconfig.node.json diff --git a/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/vite.config.ts b/templates/template-vue-ts/vite.config.ts similarity index 100% rename from templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/vite.config.ts rename to templates/template-vue-ts/vite.config.ts diff --git a/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/static/svelte.svg b/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/static/svelte.svg deleted file mode 100644 index c5e0848..0000000 --- a/templates/{% if template == 'svelte' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/static/svelte.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public/pytauri.svg b/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public/pytauri.svg deleted file mode 100644 index 1c938aa..0000000 --- a/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public/pytauri.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public/python.svg b/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public/python.svg deleted file mode 100644 index 51ad6c4..0000000 --- a/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public/python.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public/tauri.svg b/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public/tauri.svg deleted file mode 100644 index 31b62c9..0000000 --- a/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public/tauri.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public/vite.svg b/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public/vite.svg deleted file mode 100644 index e7b8dfb..0000000 --- a/templates/{% if template == 'vue' %}.{% endif %}/{{ project_name }}{{ frontend_path }}/public/vite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/templates/{{ '.' }}/{{ project_name }}/.gitignore b/templates/{{ '.' }}/{{ project_name }}/.gitignore deleted file mode 100644 index 0d7fbe3..0000000 --- a/templates/{{ '.' }}/{{ project_name }}/.gitignore +++ /dev/null @@ -1,28 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? - -/.venv/ -/target/ -/dist/ diff --git a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == false %}.{% endif %}/pyproject.toml.jinja b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == false %}.{% endif %}/pyproject.toml.jinja deleted file mode 100644 index e2826c7..0000000 --- a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == false %}.{% endif %}/pyproject.toml.jinja +++ /dev/null @@ -1,18 +0,0 @@ -[project] -name = "{{ project_name }}" -version = "0.1.0" -description = "Add your description here" -readme = "README.md" -authors = [ - { name = "you" } -] -requires-python = ">=3.9" -dependencies = [ - "pytauri-wheel>=0.8.0", - "pydantic == 2.*", - "anyio == 4.*" -] - -[build-system] -requires = ["uv_build>=0.9.2,<0.10.0"] -build-backend = "uv_build" diff --git a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == false %}.{% endif %}/src/{{ package_name }}/__init__.py b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == false %}.{% endif %}/src/{{ package_name }}/__init__.py deleted file mode 100644 index 9efb352..0000000 --- a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == false %}.{% endif %}/src/{{ package_name }}/__init__.py +++ /dev/null @@ -1,46 +0,0 @@ -import sys -from os import environ -from pathlib import Path - -from anyio.from_thread import start_blocking_portal -from pydantic import BaseModel -from pytauri import Commands -from pytauri_wheel.lib import builder_factory, context_factory - -SRC_TAURI_DIR = Path(__file__).parent.parent.parent / "app" / "src-tauri" - - -# If the DEV_SERVER env. variable is set, use that server for development (allows hot-reloading). Otherwise, use the built assets to serve the frontend. -DEV_SERVER = environ.get("DEV_SERVER") # Default: http://localhost:1420 - -if DEV_SERVER is not None: - tauri_config = { - "build": { - "frontendDist": DEV_SERVER, - }, - } -else: - tauri_config = None - - -class Person(BaseModel): - name: str - - -commands: Commands = Commands() - - -@commands.command() -async def greet(body: Person) -> str: - return f"Hello, {body.name}! You've been greeted from Python {sys.version}!" - - -def main() -> int: - with start_blocking_portal("asyncio") as portal: - app = builder_factory().build( - context=context_factory(SRC_TAURI_DIR, tauri_config=tauri_config), - invoke_handler=commands.generate_handler(portal), - plugins=[], - ) - exit_code = app.run_return() - return exit_code diff --git a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/.github/workflows/publish.yaml.jinja b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/.github/workflows/publish.yaml.jinja deleted file mode 100644 index f524784..0000000 --- a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/.github/workflows/publish.yaml.jinja +++ /dev/null @@ -1,163 +0,0 @@ -# See: -# - -# - - -name: "publish" - -on: - # Manual trigger - workflow_dispatch: - # On push to `release` branch - push: - branches: - - release - -defaults: - run: - shell: bash - -jobs: - publish-tauri: - permissions: - contents: write # required for creating github releases - strategy: - fail-fast: false - matrix: - include: - - platform: "macos-14" # for Intel based macs. - target: "x86_64-apple-darwin" - - platform: "macos-14" # for Arm based macs (M1 and above). - target: "aarch64-apple-darwin" - - platform: "ubuntu-22.04" - target: "x86_64-unknown-linux-gnu" - - platform: "ubuntu-22.04-arm" - target: "aarch64-unknown-linux-gnu" - - platform: "windows-2022" - target: "x86_64-pc-windows-msvc" - - platform: "windows-11-arm" - target: "aarch64-pc-windows-msvc" - - runs-on: {% raw %}${{ matrix.platform }}{% endraw %} - steps: - - uses: actions/checkout@v4 - - - name: Install system dependencies (ubuntu only) - if: runner.os == 'Linux' - run: | - sudo apt-get update - sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf - - - name: Install Rust stable - uses: dtolnay/rust-toolchain@stable - with: - targets: {% raw %}${{ matrix.target }}{% endraw %} - - name: Rust cache - uses: swatinem/rust-cache@v2 - - - name: Install uv - uses: astral-sh/setup-uv@v6 - with: - enable-cache: true - # version-file: "pyproject.toml" - - - name: Install pnpm - uses: pnpm/action-setup@v4 - with: - # Optional: when there is a `packageManager` field in the `package.json` - version: "latest" - - name: Install Node.js - uses: actions/setup-node@v4 - with: - # Or: `node-version-file: package.json` - node-version: lts/* - cache: "pnpm" - - - name: Install project dependencies - run: | - pnpm install - - # See: - # - - # - - # - - - name: Download python-build-standalone - env: - PYTHON_VERSION: "3.13.7" # update this by yourself - TAG: "20250828" # update this by yourself - TARGET: {% raw %}${{ matrix.target }}{% endraw %} - {% raw -%} - run: | - url="https://github.com/astral-sh/python-build-standalone/releases/download/${TAG}/cpython-${PYTHON_VERSION}+${TAG}-${TARGET}-install_only_stripped.tar.gz" - DEST_DIR="src-tauri/pyembed" - - mkdir "$DEST_DIR" - curl -L "$url" | tar -xz -C "$DEST_DIR" - - # ref: - if [[ "${{ runner.os }}" == "macOS" ]]; then - python_major_minor="${PYTHON_VERSION%.*}" # "3.13.7" -> "3.13" - install_name_tool -id "@rpath/libpython${python_major_minor}.dylib" "$DEST_DIR/python/lib/libpython${python_major_minor}.dylib" - fi - {%- endraw %} - - - name: Install the project into the embedded python environment - env: - PYTAURI_STANDALONE: 1 # see your `setup.py` - PYTHON_PATH: {% raw %}${{ runner.os == 'Windows' && './src-tauri/pyembed/python/python.exe' || './src-tauri/pyembed/python/bin/python3' }}{% endraw %} - {% raw -%} - run: | - uv pip install \ - --exact \ - --compile-bytecode \ - --python=${{ env.PYTHON_PATH }} \ - ./src-tauri - {%- endraw %} - - # Set build environment variables, see: - # - - - name: Set build environment variables (windows) - if: runner.os == 'Windows' - shell: pwsh - run: | - $PYO3_PYTHON = (Resolve-Path -LiteralPath ".\src-tauri\pyembed\python\python.exe").Path - echo "PYO3_PYTHON=$PYO3_PYTHON" >> $env:GITHUB_ENV - - - name: Set build environment variables (linux) - if: runner.os == 'Linux' - shell: bash - env: - # `{{ project_name }}` is your app `productName` in `tauri.conf.json` - PRODUCT_NAME: "{{ project_name }}" - run: | - PYO3_PYTHON=$(realpath ./src-tauri/pyembed/python/bin/python3) - RUSTFLAGS=" \ - -C link-arg=-Wl,-rpath,\$ORIGIN/../lib/$PRODUCT_NAME/lib \ - -L $(realpath ./src-tauri/pyembed/python/lib)" - - echo "PYO3_PYTHON=$PYO3_PYTHON" >> $GITHUB_ENV - echo "RUSTFLAGS=$RUSTFLAGS" >> $GITHUB_ENV - - - name: Set build environment variables (macos) - if: runner.os == 'macOS' - shell: bash - run: | - PYO3_PYTHON=$(realpath ./src-tauri/pyembed/python/bin/python3) - RUSTFLAGS=" \ - -C link-arg=-Wl,-rpath,@executable_path/../Resources/lib \ - -L $(realpath ./src-tauri/pyembed/python/lib)" - - echo "PYO3_PYTHON=$PYO3_PYTHON" >> $GITHUB_ENV - echo "RUSTFLAGS=$RUSTFLAGS" >> $GITHUB_ENV - - - name: Build and bundle the app - uses: tauri-apps/tauri-action@v0 - env: - GITHUB_TOKEN: {% raw %}${{ secrets.GITHUB_TOKEN }}{% endraw %} - with: - tagName: app-v__VERSION__ # the action automatically replaces \_\_VERSION\_\_ with the app version. - releaseName: "App v__VERSION__" - releaseBody: "See the assets to download this version and install." - releaseDraft: true - includeDebug: true # Optional, disable to speed up the build - args: {% raw %}'--target ${{ matrix.target }} --config src-tauri/tauri.bundle.json --verbose'{% endraw %} diff --git a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/Cargo.toml.jinja b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/Cargo.toml.jinja deleted file mode 100644 index b1df28e..0000000 --- a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/Cargo.toml.jinja +++ /dev/null @@ -1,18 +0,0 @@ -[workspace] -members = ["src-tauri"] -resolver = "2" - -[workspace.package] -version = "0.1.0" -edition = "2021" - - -[profile.release] -lto = "thin" - -# See: -[profile.bundle-dev] -inherits = "dev" - -[profile.bundle-release] -inherits = "release" diff --git a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/pyproject.toml.jinja b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/pyproject.toml.jinja deleted file mode 100644 index 8b49a0d..0000000 --- a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/pyproject.toml.jinja +++ /dev/null @@ -1,30 +0,0 @@ -[project] -name = "workspace" -version = "0.1.0" -requires-python = ">=3.9" -dependencies = [] - -[dependency-groups] -dev = ["{{ project_name }}"] - -[tool.uv.workspace] -members = ["src-tauri"] - -[tool.uv.sources] -{{ project_name }} = { workspace = true } - - -[tool.pyright] -# See: -# ref: -exclude = [ - "**/node_modules", - "**/__pycache__", - "**/dist", - "**/.*", - "**/pyembed", - # 👇 necessary, because when `tauri-cli bundles python, - # it will copy `pyembed` to the target directory (i.e., rust output dir). - "**/target", - # 👆 -] diff --git a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/scripts/README.md b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/scripts/README.md deleted file mode 100644 index ae38e46..0000000 --- a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/scripts/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# Build Standalone App - -> ref: - -1. Use `download-py` to download `python-build-standalone` (only needed for the first build). - You can modify `download-py` to customize the required Python version. -2. Use `build` to build the app. diff --git a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/scripts/linux/build.sh.jinja b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/scripts/linux/build.sh.jinja deleted file mode 100644 index 666e399..0000000 --- a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/scripts/linux/build.sh.jinja +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash - -set -e - -cd "$(dirname "$0")/../.." - -PROJECT_NAME="{{ project_name }}" -PYLIB_DIR="$(realpath src-tauri/pyembed/python/lib)" - -export PYTAURI_STANDALONE="1" -export PYO3_PYTHON="$(realpath src-tauri/pyembed/python/bin/python3)" -export RUSTFLAGS=" \ - -C link-arg=-Wl,-rpath,\$ORIGIN/../lib/$PROJECT_NAME/lib \ - -L $PYLIB_DIR" - -uv pip install \ - --exact \ - --compile-bytecode \ - --python="$PYO3_PYTHON" \ - --reinstall-package="$PROJECT_NAME" \ - ./src-tauri - -pnpm tauri build --config="src-tauri/tauri.bundle.json" -- --profile bundle-release diff --git a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/scripts/linux/download-py.sh b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/scripts/linux/download-py.sh deleted file mode 100644 index 7372e45..0000000 --- a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/scripts/linux/download-py.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash - -### Argument ### - -PYTHON_VERSION="3.13.7" # update these by yourself -TAG="20250828" # update these by yourself -TARGET="x86_64-unknown-linux-gnu" - -################ - -set -e - -cd "$(dirname "$0")/../.." - -url="https://github.com/astral-sh/python-build-standalone/releases/download/${TAG}/cpython-${PYTHON_VERSION}+${TAG}-${TARGET}-install_only_stripped.tar.gz" - -DEST_DIR="src-tauri/pyembed" -mkdir "$DEST_DIR" -curl -L "$url" | tar -xz -C "$DEST_DIR" diff --git a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/scripts/macos/build.sh.jinja b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/scripts/macos/build.sh.jinja deleted file mode 100644 index 47b9970..0000000 --- a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/scripts/macos/build.sh.jinja +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash - -set -e - -cd "$(dirname "$0")/../.." - -PROJECT_NAME="{{ project_name }}" -PYLIB_DIR="$(realpath src-tauri/pyembed/python/lib)" - -export PYTAURI_STANDALONE="1" -export PYO3_PYTHON="$(realpath src-tauri/pyembed/python/bin/python3)" -export RUSTFLAGS=" \ - -C link-arg=-Wl,-rpath,@executable_path/../Resources/lib \ - -L $PYLIB_DIR" - -uv pip install \ - --exact \ - --compile-bytecode \ - --python="$PYO3_PYTHON" \ - --reinstall-package="$PROJECT_NAME" \ - ./src-tauri - -pnpm tauri build --config="src-tauri/tauri.bundle.json" -- --profile bundle-release diff --git a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/scripts/macos/download-py.sh b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/scripts/macos/download-py.sh deleted file mode 100644 index ef47c74..0000000 --- a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/scripts/macos/download-py.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash - -### Argument ### - -PYTHON_VERSION="3.13.7" # update these by yourself -TAG="20250828" # update these by yourself -TARGET="aarch64-apple-darwin" - -################ - -set -e - -cd "$(dirname "$0")/../.." - -url="https://github.com/astral-sh/python-build-standalone/releases/download/${TAG}/cpython-${PYTHON_VERSION}+${TAG}-${TARGET}-install_only_stripped.tar.gz" - -DEST_DIR="src-tauri/pyembed" -mkdir "$DEST_DIR" -curl -L "$url" | tar -xz -C "$DEST_DIR" - -# ref: -python_major_minor="${PYTHON_VERSION%.*}" # "3.13.7" -> "3.13" -install_name_tool -id "@rpath/libpython$python_major_minor.dylib" "$DEST_DIR/python/lib/libpython$python_major_minor.dylib" diff --git a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/scripts/windows/build.ps1.jinja b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/scripts/windows/build.ps1.jinja deleted file mode 100644 index 5e95874..0000000 --- a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/scripts/windows/build.ps1.jinja +++ /dev/null @@ -1,15 +0,0 @@ -Set-Location (Resolve-Path "$PSScriptRoot\..\..") - -$PROJECT_NAME = "{{ project_name }}" - -$env:PYTAURI_STANDALONE = "1" -$env:PYO3_PYTHON = (Resolve-Path -LiteralPath "src-tauri\pyembed\python\python.exe").Path - -uv.exe pip install ` - --exact ` - --compile-bytecode ` - --python="$env:PYO3_PYTHON" ` - --reinstall-package="$PROJECT_NAME" ` - .\src-tauri - -pnpm -- tauri build --config="src-tauri\tauri.bundle.json" -- --profile bundle-release diff --git a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/scripts/windows/download-py.ps1 b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/scripts/windows/download-py.ps1 deleted file mode 100644 index e0a47cb..0000000 --- a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/scripts/windows/download-py.ps1 +++ /dev/null @@ -1,22 +0,0 @@ -### Argument ### - -$PYTHON_VERSION = "3.13.7" # update these by yourself -$TAG = "20250828" # update these by yourself -$TARGET = "x86_64-pc-windows-msvc" - -################ - -Set-Location (Resolve-Path "$PSScriptRoot\..\..") - -$url = "https://github.com/astral-sh/python-build-standalone/releases/download/${TAG}/cpython-${PYTHON_VERSION}+${TAG}-${TARGET}-install_only_stripped.tar.gz" - -$DEST_DIR = "src-tauri\pyembed" -$TEMP_FILE = ".python-standalone.tar.gz" -try { - curl.exe -L "$url" -o "$TEMP_FILE" - mkdir "$DEST_DIR" - tar.exe -xzf "$TEMP_FILE" -C "$DEST_DIR" -} -finally { - Remove-Item "$TEMP_FILE" -} diff --git a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/src-python/{{ package_name }}/__main__.py.jinja b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/src-python/{{ package_name }}/__main__.py.jinja deleted file mode 100644 index 59dd5e7..0000000 --- a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/src-python/{{ package_name }}/__main__.py.jinja +++ /dev/null @@ -1,14 +0,0 @@ -"""The main entry point for the Tauri app.""" - -import sys -from multiprocessing import freeze_support - -from {{ package_name }} import main - -# - If you don't use `multiprocessing`, you can remove this line. -# - If you do use `multiprocessing` but without this line, -# you will get endless spawn loop of your application process. -# See: . -freeze_support() - -sys.exit(main()) diff --git a/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/src-python/{{ package_name }}/py.typed b/templates/{{ '.' }}/{{ project_name }}/{% if with_rust == true %}.{% endif %}/src-tauri/src-python/{{ package_name }}/py.typed deleted file mode 100644 index e69de29..0000000 From fc7d417e7e6741595ad2185f87aae2ebf3c6d9bc Mon Sep 17 00:00:00 2001 From: ISOR3X Date: Wed, 24 Dec 2025 14:44:10 +0100 Subject: [PATCH 05/16] feat: add custom questionnaire --- .python-version | 1 + CONTRIBUTING.md | 2 - copier.yaml | 66 ---- pyproject.toml | 26 +- src/create_pytauri_app/__init__.py | 65 ++++ src/create_pytauri_app/__main__.py | 4 + src/create_pytauri_app/prompting.py | 230 ++++++++++++ src/create_pytauri_app/py.typed | 0 src/create_pytauri_app/questionnaire.py | 83 +++++ src/create_pytauri_app/utils.py | 5 + uv.lock | 475 +----------------------- 11 files changed, 422 insertions(+), 535 deletions(-) create mode 100644 .python-version delete mode 100644 copier.yaml create mode 100644 src/create_pytauri_app/__init__.py create mode 100644 src/create_pytauri_app/__main__.py create mode 100644 src/create_pytauri_app/prompting.py create mode 100644 src/create_pytauri_app/py.typed create mode 100644 src/create_pytauri_app/questionnaire.py create mode 100644 src/create_pytauri_app/utils.py diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..e4fba21 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.12 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5986464..6ed607d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -14,6 +14,4 @@ uv sync # activate venv .venv\Scripts\activate - - ``` diff --git a/copier.yaml b/copier.yaml deleted file mode 100644 index 598fe79..0000000 --- a/copier.yaml +++ /dev/null @@ -1,66 +0,0 @@ -_subdirectory: "templates/" - -project_name: - type: str - help: Project name - default: pytauri-app - -package_name: - type: str - default: "{{ project_name | replace('-', '_')}}" - when: false - -identifier: - type: str - help: Identifier - default: "com.username.{{ project_name }}" - -with_rust: - type: bool - help: Do you want to use Rust? - default: false - -template: - type: str - help: Choose your UI template - choices: - Vue: vue - React: react - Svelte: svelte - default: vue - -frontend_path: - type: str - default: "{% if with_rust == true %}./{% else %}./app/{% endif %}" - when: false - -_message_after_copy: | - {% if with_rust == true %} - Template created! To get started run: - cd {{ project_name }} - pnpm install - uv venv --python-preference only-system - {%- if _copier_conf.os == "windows" %} - .venv\Scripts\activate - {%- else %} - source .venv/bin/activate - {%- endif %} - uv sync - - For Desktop development, run: - pnpm tauri dev - - For building a standalone app, see the `scripts/` folder. - {% else %} - Template created! To get started run: - cd {{ project_name }} - pnpm install - pnpm build - uv venv - {%- if _copier_conf.os == "windows" %} - .venv\Scripts\activate - {%- else %} - source .venv/bin/activate - {%- endif %} - uv sync - {% endif %} diff --git a/pyproject.toml b/pyproject.toml index b272451..125eedc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,16 +1,24 @@ [project] name = "create-pytauri-app" version = "0.1.0" -requires-python = ">=3.9" +description = "Add your description here" +readme = "README.md" +authors = [ + { name = "ISOR3X", email = "isorex@icloud.com" } +] +requires-python = ">=3.12" dependencies = [ - "pytauri == 0.8.*", - "pydantic == 2.*", - "anyio == 4.*", - # [build-system] - "setuptools >= 80", - "setuptools-scm >= 8", + # [cli] "copier>=9.10.3", + # [project] + # "pytauri == 0.8.*", + # "pydantic == 2.*", + # "anyio == 4.*", + # [build-system] + # "setuptools >= 80", + # "setuptools-scm >= 8", ] -[tool.uv] -required-version = ">=0.8.14" +[build-system] +requires = ["uv_build>=0.9.2,<0.10.0"] +build-backend = "uv_build" diff --git a/src/create_pytauri_app/__init__.py b/src/create_pytauri_app/__init__.py new file mode 100644 index 0000000..11d6045 --- /dev/null +++ b/src/create_pytauri_app/__init__.py @@ -0,0 +1,65 @@ +from create_pytauri_app.utils import get_project_root +import shutil +from pathlib import Path + +from copier import run_copy + +from create_pytauri_app.prompting import ask, choose +from create_pytauri_app.questionnaire import Answer, ask_info + + +def get_info(ask: bool = False) -> Answer: + info = ( + ask_info() + if ask + else Answer( + project_name="pytauri-app", + identifier="com.username.pytauri-app", + frontend_lang="js", + frontend_flavor="ts", + frontend_template="vue", + use_rust=True, + ) + ) + + return info + + +def main(): + TEMPLATE_DIR = get_project_root() / "templates" + OUTPUT_DIR = get_project_root() / ".generated_template" + + info = get_info() + + project_dir = OUTPUT_DIR / info.project_name + print(project_dir) + + # Clean up old templates to ensure a new, clean one. + if project_dir.exists() and choose("Directory is not empty, delete?"): + shutil.rmtree(project_dir) + + project_dir.mkdir() + + frontend_dir = TEMPLATE_DIR / f"template-{info.frontend_template_full}" + tauri_dir = TEMPLATE_DIR / "_base_" / "src-tauri" + + # Copy over frontend + run_copy( + str(frontend_dir), + str(project_dir), + vcs_ref="HEAD", + data=info.to_dict(), + quiet=True, + ) + + # Copy over src-tauri + run_copy( + str(tauri_dir), + str(project_dir / "src-tauri"), + vcs_ref="HEAD", + data=info.to_dict(), + quiet=True, + ) + + # Copy over assets + # ... diff --git a/src/create_pytauri_app/__main__.py b/src/create_pytauri_app/__main__.py new file mode 100644 index 0000000..e593a9e --- /dev/null +++ b/src/create_pytauri_app/__main__.py @@ -0,0 +1,4 @@ +from create_pytauri_app import main + +if __name__ == "__main__": + main() diff --git a/src/create_pytauri_app/prompting.py b/src/create_pytauri_app/prompting.py new file mode 100644 index 0000000..70de381 --- /dev/null +++ b/src/create_pytauri_app/prompting.py @@ -0,0 +1,230 @@ +import platform +import sys +from dataclasses import dataclass +from enum import Enum + +if platform.system() == "Windows": + import msvcrt +else: + import termios + import tty + + +@dataclass +class Choice: + value: str + label: str | None = None + meta: str | None = None + + +class Color(Enum): + """ANSI color codes""" + + GREEN = "\033[32m" + CYAN = "\033[36m" + DIM = "\033[2m" + RESET = "\033[0m" + BOLD = "\033[1m" + + +class Command(Enum): + """ANSI terminal commands""" + + CLEAR_LINE = "\033[2K" + MOVE_UP = "\033[F" + CURSOR_UP = "\033[A" + + +def colored(text: str, color: Color) -> str: + return f"{color.value}{text}{Color.RESET.value}" + + +def format_question(question: str, default: str | None = None) -> str: + question = f"{colored('?', Color.GREEN)} {question}{Color.DIM.value}" + if default: + question += f" ({default})" + question += f" > {Color.RESET.value}" + return question + + +def format_answer(question: str, answer: str) -> str: + return f"{colored('✓', Color.GREEN)} {question}{colored(' - ', Color.DIM)}{colored(answer, Color.GREEN)}" + + +def print_questions(choices: list[Choice], index): + for i, choice in enumerate(choices): + selected = i == index + prefix = "> " if selected else " " + + sys.stdout.write(Command.CLEAR_LINE.value) + if selected: + sys.stdout.write( + colored( + prefix + (choice.label or choice.value.capitalize()), Color.GREEN + ) + ) + if choice.meta: + sys.stdout.write(colored(f" ({choice.meta})", Color.DIM)) + else: + sys.stdout.write(f"{prefix}{choice.label or choice.value.capitalize()}") + sys.stdout.write("\n") + sys.stdout.flush() + + +def read_key_windows(): + """Read a single key press on Windows""" + while True: + if msvcrt.kbhit(): + ch = msvcrt.getch() + + # Handle special keys (arrow keys return two bytes) + if ch in (b"\x00", b"\xe0"): + ch2 = msvcrt.getch() + if ch2 == b"H": + return "up" + elif ch2 == b"P": + return "down" + elif ch == b"\r": + return "enter" + elif ch == b"\x03": # Ctrl-C + return "ctrl-c" + + return ch.decode("utf-8", errors="ignore") + + +def read_key_unix(): + """Read a single key press on Unix""" + fd = sys.stdin.fileno() + old_settings = termios.tcgetattr(fd) + try: + tty.setraw(fd) + ch = sys.stdin.read(1) + + # Handle arrow keys (escape sequences) + if ch == "\x1b": + ch2 = sys.stdin.read(1) + if ch2 == "[": + ch3 = sys.stdin.read(1) + if ch3 == "A": + return "up" + elif ch3 == "B": + return "down" + elif ch == "\r" or ch == "\n": + return "enter" + elif ch == "\x03": # Ctrl-C + return "ctrl-c" + + return ch + finally: + termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) + + +def read_key(): + """Read a single key press (OS-agnostic)""" + if platform.system() == "Windows": + return read_key_windows() + else: + return read_key_unix() + + +def ask(question: str, default: str | None = None) -> str: + """ + Ask a question with a default value. + Returns the user's answer or the default if empty. + """ + prompt = format_question(question, default) + answer = input(prompt).strip() or default + + assert answer is not None + + # Move cursor up one line and clear it + sys.stdout.write(Command.MOVE_UP.value) + sys.stdout.write(Command.CLEAR_LINE.value) + + # Print final result + # We use print here because we want to end with \n + print(format_answer(question, answer)) + + return answer + + +def choose(question: str, default: bool = False) -> bool: + """ + Ask a yes/no question. + Returns True for yes, False for no. + """ + suffix = " [Y/n]" if default else " [y/N]" + prompt = format_question(question + suffix) + + answer = input(prompt).strip().lower() + + # Determine the result + if answer == "": + result = default + elif answer in ("y", "yes"): + result = True + elif answer in ("n", "no"): + result = False + else: + # Invalid input, use default + result = default + + # Move cursor up one line and clear it + sys.stdout.write(Command.MOVE_UP.value) + sys.stdout.write(Command.CLEAR_LINE.value) + + # Print final result + answer_text = "Yes" if result else "No" + print(format_answer(question, answer_text)) + + return result + + +def select(question: str, choices: list[Choice]): + """ + Display an interactive selection menu. + """ + index = 0 + prompt = format_question(question) + + def render(): + # Move cursor to start of menu + sys.stdout.write(Command.MOVE_UP.value * (len(choices) + 1)) + + # Render question + sys.stdout.write(Command.CLEAR_LINE.value) + print(prompt) + + # Render choices + print_questions(choices, index) + + # Initial render - print all lines first + print(prompt) + print_questions(choices, index) + + while True: + key = read_key() + + if key == "up": + index = (index - 1) % len(choices) + render() + elif key == "down": + index = (index + 1) % len(choices) + render() + elif key == "enter": + answer = choices[index] + + # Clear the menu + sys.stdout.write(Command.MOVE_UP.value * (len(choices) + 1)) + for _ in range(len(choices) + 1): + sys.stdout.write(Command.CLEAR_LINE.value + "\n") + sys.stdout.write(Command.MOVE_UP.value * (len(choices) + 1)) + + # Print final result + # We use print here because we want to end with \n + print(format_answer(question, answer.label or answer.value.capitalize())) + + return answer.value + elif key == "ctrl-c": + sys.stdout.write("\n") + sys.exit(0) diff --git a/src/create_pytauri_app/py.typed b/src/create_pytauri_app/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/src/create_pytauri_app/questionnaire.py b/src/create_pytauri_app/questionnaire.py new file mode 100644 index 0000000..eb78125 --- /dev/null +++ b/src/create_pytauri_app/questionnaire.py @@ -0,0 +1,83 @@ +from dataclasses import asdict, dataclass +from pathlib import Path +from typing import Literal + +from .prompting import Choice, ask, choose, select + + +@dataclass +class Answer: + project_name: str + identifier: str + frontend_lang: Literal["js", "py"] + frontend_flavor: Literal["ts", "js"] | None + frontend_template: str + use_rust: bool + + @property + def package_name(self) -> str: + return self.project_name.replace("-", "_") + + @property + def frontend_template_full(self): + frontend_template = self.frontend_template + if self.frontend_lang == "js": + frontend_template += "-ts" if self.frontend_flavor == "ts" else "" + return frontend_template + + def to_dict(self): + return {k: str(v) for k, v in asdict(self).items()} + + +def ask_info() -> Answer: + project_name = ask("Project name", "pytauri-app") + user = Path.home().name.lower() + identifier = ask("Identifier", f"com.{user}.{project_name}") + + frontend_langs = [ + Choice(label="Python", value="py", meta="uv"), + Choice( + label="TypeScript / JavaScript", value="js", meta="pnpm, yarn, npm, bun" + ), + ] + + frontend_lang = select( + "Choose which language to use for your frontend", frontend_langs + ) + + match frontend_lang: + case "js": + frontend_frameworks = [ + Choice(value="vanilla"), + Choice(value="vue", meta="https://vuejs.org/"), + Choice(value="svelte", meta="https://svelte.dev/"), + Choice(value="react", meta="https://react.dev/"), + ] + case _: + frontend_frameworks = [ + Choice(label="NiceGUI", value="nicegui", meta="https://nicegui.io/"), + ] + + frontend_template = select("Choose your UI template", frontend_frameworks) + + frontend_flavor = None + if frontend_lang == "js": + frontend_flavors = [ + Choice(label="TypeScript", value="ts"), + Choice(label="JavaScript", value="js"), + ] + frontend_flavor = select("Choose your UI flavor", frontend_flavors) + + use_rust = choose("Choose if you want to use Rust") + + if frontend_template == "nicegui": + raise NotImplementedError("No template is available for NiceGUI yet!") + + return Answer( + project_name=project_name, + identifier=identifier, + frontend_lang=frontend_lang, + frontend_flavor=frontend_flavor, + frontend_template=frontend_template, + use_rust=use_rust, + ) diff --git a/src/create_pytauri_app/utils.py b/src/create_pytauri_app/utils.py new file mode 100644 index 0000000..a2627cc --- /dev/null +++ b/src/create_pytauri_app/utils.py @@ -0,0 +1,5 @@ +from pathlib import Path + + +def get_project_root(): + return Path(__file__).parent.parent.parent diff --git a/uv.lock b/uv.lock index 730e416..a1e9945 100644 --- a/uv.lock +++ b/uv.lock @@ -1,10 +1,6 @@ version = 1 revision = 3 -requires-python = ">=3.9" -resolution-markers = [ - "python_full_version >= '3.10'", - "python_full_version < '3.10'", -] +requires-python = ">=3.12" [[package]] name = "annotated-types" @@ -15,21 +11,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, ] -[[package]] -name = "anyio" -version = "4.9.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, - { name = "idna" }, - { name = "sniffio" }, - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", size = 190949, upload-time = "2025-03-17T00:02:54.77Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c", size = 100916, upload-time = "2025-03-17T00:02:52.713Z" }, -] - [[package]] name = "colorama" version = "0.4.6" @@ -39,57 +20,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, ] -[[package]] -name = "copier" -version = "9.10.3" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.10'", -] -dependencies = [ - { name = "colorama", marker = "python_full_version < '3.10'" }, - { name = "dunamai", marker = "python_full_version < '3.10'" }, - { name = "eval-type-backport", marker = "python_full_version < '3.10'" }, - { name = "funcy", marker = "python_full_version < '3.10'" }, - { name = "jinja2", marker = "python_full_version < '3.10'" }, - { name = "jinja2-ansible-filters", marker = "python_full_version < '3.10'" }, - { name = "packaging", marker = "python_full_version < '3.10'" }, - { name = "pathspec", marker = "python_full_version < '3.10'" }, - { name = "platformdirs", version = "4.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "plumbum", marker = "python_full_version < '3.10'" }, - { name = "pydantic", marker = "python_full_version < '3.10'" }, - { name = "pygments", marker = "python_full_version < '3.10'" }, - { name = "pyyaml", marker = "python_full_version < '3.10'" }, - { name = "questionary", marker = "python_full_version < '3.10'" }, - { name = "typing-extensions", marker = "python_full_version < '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/82/c6/1f61fe2b011347c0b9d7637d02ef3dc1c2874640a4fd5fb059ea8b5493f2/copier-9.10.3.tar.gz", hash = "sha256:6e965d8f719678ee3bc5e611ef0d1b182d6b01a3d5385a5f1ba43aaade51caf7", size = 598697, upload-time = "2025-10-17T18:26:04.217Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/f2/58ee35dbd55d0ffa13197365ec4725c36da2f7ec72eaa1dd154bfbd2676e/copier-9.10.3-py3-none-any.whl", hash = "sha256:7165239566f68e9e36c148f71e0552bf1e4911eef96bfa7cf33e6a0dbfed3c96", size = 56186, upload-time = "2025-10-17T18:26:02.856Z" }, -] - [[package]] name = "copier" version = "9.11.0" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.10'", -] dependencies = [ - { name = "colorama", marker = "python_full_version >= '3.10'" }, - { name = "dunamai", marker = "python_full_version >= '3.10'" }, - { name = "funcy", marker = "python_full_version >= '3.10'" }, - { name = "jinja2", marker = "python_full_version >= '3.10'" }, - { name = "jinja2-ansible-filters", marker = "python_full_version >= '3.10'" }, - { name = "packaging", marker = "python_full_version >= '3.10'" }, - { name = "pathspec", marker = "python_full_version >= '3.10'" }, - { name = "platformdirs", version = "4.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "plumbum", marker = "python_full_version >= '3.10'" }, - { name = "pydantic", marker = "python_full_version >= '3.10'" }, - { name = "pygments", marker = "python_full_version >= '3.10'" }, - { name = "pyyaml", marker = "python_full_version >= '3.10'" }, - { name = "questionary", marker = "python_full_version >= '3.10'" }, - { name = "typing-extensions", marker = "python_full_version == '3.10.*'" }, + { name = "colorama" }, + { name = "dunamai" }, + { name = "funcy" }, + { name = "jinja2" }, + { name = "jinja2-ansible-filters" }, + { name = "packaging" }, + { name = "pathspec" }, + { name = "platformdirs" }, + { name = "plumbum" }, + { name = "pydantic" }, + { name = "pygments" }, + { name = "pyyaml" }, + { name = "questionary" }, ] sdist = { url = "https://files.pythonhosted.org/packages/06/61/226642b1efad2a39008ee5b913cd82a6f22a564b652e8f0645488a27a2e2/copier-9.11.0.tar.gz", hash = "sha256:e73d6989fa140b621a5c571984c46122704086a9caa84a6e07699a5234d297ab", size = 592030, upload-time = "2025-11-20T21:08:01.419Z" } wheels = [ @@ -99,26 +47,13 @@ wheels = [ [[package]] name = "create-pytauri-app" version = "0.1.0" -source = { virtual = "." } +source = { editable = "." } dependencies = [ - { name = "anyio" }, - { name = "copier", version = "9.10.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "copier", version = "9.11.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "pydantic" }, - { name = "pytauri" }, - { name = "setuptools" }, - { name = "setuptools-scm" }, + { name = "copier" }, ] [package.metadata] -requires-dist = [ - { name = "anyio", specifier = "==4.*" }, - { name = "copier", specifier = ">=9.10.3" }, - { name = "pydantic", specifier = "==2.*" }, - { name = "pytauri", specifier = "==0.8.*" }, - { name = "setuptools", specifier = ">=80" }, - { name = "setuptools-scm", specifier = ">=8" }, -] +requires-dist = [{ name = "copier", specifier = ">=9.10.3" }] [[package]] name = "dunamai" @@ -132,24 +67,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/36/41/04e2a649058b0713b00d6c9bd22da35618bb157289e05d068e51fddf8d7e/dunamai-1.25.0-py3-none-any.whl", hash = "sha256:7f9dc687dd3256e613b6cc978d9daabfd2bb5deb8adc541fc135ee423ffa98ab", size = 27022, upload-time = "2025-07-04T19:25:54.863Z" }, ] -[[package]] -name = "eval-type-backport" -version = "0.2.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/30/ea/8b0ac4469d4c347c6a385ff09dc3c048c2d021696664e26c7ee6791631b5/eval_type_backport-0.2.2.tar.gz", hash = "sha256:f0576b4cf01ebb5bd358d02314d31846af5e07678387486e2c798af0e7d849c1", size = 9079, upload-time = "2024-12-21T20:09:46.005Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ce/31/55cd413eaccd39125368be33c46de24a1f639f2e12349b0361b4678f3915/eval_type_backport-0.2.2-py3-none-any.whl", hash = "sha256:cb6ad7c393517f476f96d456d0412ea80f0a8cf96f6892834cd9340149111b0a", size = 5830, upload-time = "2024-12-21T20:09:44.175Z" }, -] - -[[package]] -name = "exceptiongroup" -version = "1.2.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/09/35/2495c4ac46b980e4ca1f6ad6db102322ef3ad2410b79fdde159a4b0f3b92/exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc", size = 28883, upload-time = "2024-07-12T22:26:00.161Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/02/cc/b7e31358aac6ed1ef2bb790a9746ac2c69bcb3c8588b41616914eb106eaf/exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b", size = 16453, upload-time = "2024-07-12T22:25:58.476Z" }, -] - [[package]] name = "funcy" version = "2.0" @@ -159,27 +76,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d5/08/c2409cb01d5368dcfedcbaffa7d044cc8957d57a9d0855244a5eb4709d30/funcy-2.0-py2.py3-none-any.whl", hash = "sha256:53df23c8bb1651b12f095df764bfb057935d49537a56de211b098f4c79614bb0", size = 30891, upload-time = "2023-03-28T06:22:42.576Z" }, ] -[[package]] -name = "idna" -version = "3.10" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload-time = "2024-09-15T18:07:39.745Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" }, -] - -[[package]] -name = "importlib-metadata" -version = "8.7.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "zipp" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/76/66/650a33bd90f786193e4de4b3ad86ea60b53c89b669a5c7be931fac31cdb0/importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000", size = 56641, upload-time = "2025-04-27T15:29:01.736Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/20/b0/36bd937216ec521246249be3bf9855081de4c5e06a0c9b4219dbeda50373/importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd", size = 27656, upload-time = "2025-04-27T15:29:00.214Z" }, -] - [[package]] name = "jinja2" version = "3.1.6" @@ -211,28 +107,6 @@ version = "3.0.3" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e8/4b/3541d44f3937ba468b75da9eebcae497dcf67adb65caa16760b0a6807ebb/markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559", size = 11631, upload-time = "2025-09-27T18:36:05.558Z" }, - { url = "https://files.pythonhosted.org/packages/98/1b/fbd8eed11021cabd9226c37342fa6ca4e8a98d8188a8d9b66740494960e4/markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419", size = 12057, upload-time = "2025-09-27T18:36:07.165Z" }, - { url = "https://files.pythonhosted.org/packages/40/01/e560d658dc0bb8ab762670ece35281dec7b6c1b33f5fbc09ebb57a185519/markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695", size = 22050, upload-time = "2025-09-27T18:36:08.005Z" }, - { url = "https://files.pythonhosted.org/packages/af/cd/ce6e848bbf2c32314c9b237839119c5a564a59725b53157c856e90937b7a/markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591", size = 20681, upload-time = "2025-09-27T18:36:08.881Z" }, - { url = "https://files.pythonhosted.org/packages/c9/2a/b5c12c809f1c3045c4d580b035a743d12fcde53cf685dbc44660826308da/markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c", size = 20705, upload-time = "2025-09-27T18:36:10.131Z" }, - { url = "https://files.pythonhosted.org/packages/cf/e3/9427a68c82728d0a88c50f890d0fc072a1484de2f3ac1ad0bfc1a7214fd5/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f", size = 21524, upload-time = "2025-09-27T18:36:11.324Z" }, - { url = "https://files.pythonhosted.org/packages/bc/36/23578f29e9e582a4d0278e009b38081dbe363c5e7165113fad546918a232/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6", size = 20282, upload-time = "2025-09-27T18:36:12.573Z" }, - { url = "https://files.pythonhosted.org/packages/56/21/dca11354e756ebd03e036bd8ad58d6d7168c80ce1fe5e75218e4945cbab7/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1", size = 20745, upload-time = "2025-09-27T18:36:13.504Z" }, - { url = "https://files.pythonhosted.org/packages/87/99/faba9369a7ad6e4d10b6a5fbf71fa2a188fe4a593b15f0963b73859a1bbd/markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa", size = 14571, upload-time = "2025-09-27T18:36:14.779Z" }, - { url = "https://files.pythonhosted.org/packages/d6/25/55dc3ab959917602c96985cb1253efaa4ff42f71194bddeb61eb7278b8be/markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8", size = 15056, upload-time = "2025-09-27T18:36:16.125Z" }, - { url = "https://files.pythonhosted.org/packages/d0/9e/0a02226640c255d1da0b8d12e24ac2aa6734da68bff14c05dd53b94a0fc3/markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1", size = 13932, upload-time = "2025-09-27T18:36:17.311Z" }, - { url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631, upload-time = "2025-09-27T18:36:18.185Z" }, - { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058, upload-time = "2025-09-27T18:36:19.444Z" }, - { url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287, upload-time = "2025-09-27T18:36:20.768Z" }, - { url = "https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf", size = 22940, upload-time = "2025-09-27T18:36:22.249Z" }, - { url = "https://files.pythonhosted.org/packages/19/ae/31c1be199ef767124c042c6c3e904da327a2f7f0cd63a0337e1eca2967a8/markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", size = 21887, upload-time = "2025-09-27T18:36:23.535Z" }, - { url = "https://files.pythonhosted.org/packages/b2/76/7edcab99d5349a4532a459e1fe64f0b0467a3365056ae550d3bcf3f79e1e/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", size = 23692, upload-time = "2025-09-27T18:36:24.823Z" }, - { url = "https://files.pythonhosted.org/packages/a4/28/6e74cdd26d7514849143d69f0bf2399f929c37dc2b31e6829fd2045b2765/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", size = 21471, upload-time = "2025-09-27T18:36:25.95Z" }, - { url = "https://files.pythonhosted.org/packages/62/7e/a145f36a5c2945673e590850a6f8014318d5577ed7e5920a4b3448e0865d/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", size = 22923, upload-time = "2025-09-27T18:36:27.109Z" }, - { url = "https://files.pythonhosted.org/packages/0f/62/d9c46a7f5c9adbeeeda52f5b8d802e1094e9717705a645efc71b0913a0a8/markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19", size = 14572, upload-time = "2025-09-27T18:36:28.045Z" }, - { url = "https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01", size = 15077, upload-time = "2025-09-27T18:36:29.025Z" }, - { url = "https://files.pythonhosted.org/packages/35/73/893072b42e6862f319b5207adc9ae06070f095b358655f077f69a35601f0/markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c", size = 13876, upload-time = "2025-09-27T18:36:29.954Z" }, { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, @@ -288,17 +162,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, - { url = "https://files.pythonhosted.org/packages/56/23/0d8c13a44bde9154821586520840643467aee574d8ce79a17da539ee7fed/markupsafe-3.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15d939a21d546304880945ca1ecb8a039db6b4dc49b2c5a400387cdae6a62e26", size = 11623, upload-time = "2025-09-27T18:37:29.296Z" }, - { url = "https://files.pythonhosted.org/packages/fd/23/07a2cb9a8045d5f3f0890a8c3bc0859d7a47bfd9a560b563899bec7b72ed/markupsafe-3.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f71a396b3bf33ecaa1626c255855702aca4d3d9fea5e051b41ac59a9c1c41edc", size = 12049, upload-time = "2025-09-27T18:37:30.234Z" }, - { url = "https://files.pythonhosted.org/packages/bc/e4/6be85eb81503f8e11b61c0b6369b6e077dcf0a74adbd9ebf6b349937b4e9/markupsafe-3.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f4b68347f8c5eab4a13419215bdfd7f8c9b19f2b25520968adfad23eb0ce60c", size = 21923, upload-time = "2025-09-27T18:37:31.177Z" }, - { url = "https://files.pythonhosted.org/packages/6f/bc/4dc914ead3fe6ddaef035341fee0fc956949bbd27335b611829292b89ee2/markupsafe-3.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e8fc20152abba6b83724d7ff268c249fa196d8259ff481f3b1476383f8f24e42", size = 20543, upload-time = "2025-09-27T18:37:32.168Z" }, - { url = "https://files.pythonhosted.org/packages/89/6e/5fe81fbcfba4aef4093d5f856e5c774ec2057946052d18d168219b7bd9f9/markupsafe-3.0.3-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:949b8d66bc381ee8b007cd945914c721d9aba8e27f71959d750a46f7c282b20b", size = 20585, upload-time = "2025-09-27T18:37:33.166Z" }, - { url = "https://files.pythonhosted.org/packages/f6/f6/e0e5a3d3ae9c4020f696cd055f940ef86b64fe88de26f3a0308b9d3d048c/markupsafe-3.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:3537e01efc9d4dccdf77221fb1cb3b8e1a38d5428920e0657ce299b20324d758", size = 21387, upload-time = "2025-09-27T18:37:34.185Z" }, - { url = "https://files.pythonhosted.org/packages/c8/25/651753ef4dea08ea790f4fbb65146a9a44a014986996ca40102e237aa49a/markupsafe-3.0.3-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:591ae9f2a647529ca990bc681daebdd52c8791ff06c2bfa05b65163e28102ef2", size = 20133, upload-time = "2025-09-27T18:37:35.138Z" }, - { url = "https://files.pythonhosted.org/packages/dc/0a/c3cf2b4fef5f0426e8a6d7fce3cb966a17817c568ce59d76b92a233fdbec/markupsafe-3.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a320721ab5a1aba0a233739394eb907f8c8da5c98c9181d1161e77a0c8e36f2d", size = 20588, upload-time = "2025-09-27T18:37:36.096Z" }, - { url = "https://files.pythonhosted.org/packages/cd/1b/a7782984844bd519ad4ffdbebbba2671ec5d0ebbeac34736c15fb86399e8/markupsafe-3.0.3-cp39-cp39-win32.whl", hash = "sha256:df2449253ef108a379b8b5d6b43f4b1a8e81a061d6537becd5582fba5f9196d7", size = 14566, upload-time = "2025-09-27T18:37:37.09Z" }, - { url = "https://files.pythonhosted.org/packages/18/1f/8d9c20e1c9440e215a44be5ab64359e207fcb4f675543f1cf9a2a7f648d0/markupsafe-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:7c3fb7d25180895632e5d3148dbdc29ea38ccb7fd210aa27acbd1201a1902c6e", size = 15053, upload-time = "2025-09-27T18:37:38.054Z" }, - { url = "https://files.pythonhosted.org/packages/4e/d3/fe08482b5cd995033556d45041a4f4e76e7f0521112a9c9991d40d39825f/markupsafe-3.0.3-cp39-cp39-win_arm64.whl", hash = "sha256:38664109c14ffc9e7437e86b4dceb442b0096dfe3541d7864d9cbe1da4cf36c8", size = 13928, upload-time = "2025-09-27T18:37:39.037Z" }, ] [[package]] @@ -319,113 +182,10 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload-time = "2023-12-10T22:30:43.14Z" }, ] -[[package]] -name = "pillow" -version = "11.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/af/cb/bb5c01fcd2a69335b86c22142b2bccfc3464087efb7fd382eee5ffc7fdf7/pillow-11.2.1.tar.gz", hash = "sha256:a64dd61998416367b7ef979b73d3a85853ba9bec4c2925f74e588879a58716b6", size = 47026707, upload-time = "2025-04-12T17:50:03.289Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0d/8b/b158ad57ed44d3cc54db8d68ad7c0a58b8fc0e4c7a3f995f9d62d5b464a1/pillow-11.2.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:d57a75d53922fc20c165016a20d9c44f73305e67c351bbc60d1adaf662e74047", size = 3198442, upload-time = "2025-04-12T17:47:10.666Z" }, - { url = "https://files.pythonhosted.org/packages/b1/f8/bb5d956142f86c2d6cc36704943fa761f2d2e4c48b7436fd0a85c20f1713/pillow-11.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:127bf6ac4a5b58b3d32fc8289656f77f80567d65660bc46f72c0d77e6600cc95", size = 3030553, upload-time = "2025-04-12T17:47:13.153Z" }, - { url = "https://files.pythonhosted.org/packages/22/7f/0e413bb3e2aa797b9ca2c5c38cb2e2e45d88654e5b12da91ad446964cfae/pillow-11.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4ba4be812c7a40280629e55ae0b14a0aafa150dd6451297562e1764808bbe61", size = 4405503, upload-time = "2025-04-12T17:47:15.36Z" }, - { url = "https://files.pythonhosted.org/packages/f3/b4/cc647f4d13f3eb837d3065824aa58b9bcf10821f029dc79955ee43f793bd/pillow-11.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8bd62331e5032bc396a93609982a9ab6b411c05078a52f5fe3cc59234a3abd1", size = 4490648, upload-time = "2025-04-12T17:47:17.37Z" }, - { url = "https://files.pythonhosted.org/packages/c2/6f/240b772a3b35cdd7384166461567aa6713799b4e78d180c555bd284844ea/pillow-11.2.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:562d11134c97a62fe3af29581f083033179f7ff435f78392565a1ad2d1c2c45c", size = 4508937, upload-time = "2025-04-12T17:47:19.066Z" }, - { url = "https://files.pythonhosted.org/packages/f3/5e/7ca9c815ade5fdca18853db86d812f2f188212792780208bdb37a0a6aef4/pillow-11.2.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:c97209e85b5be259994eb5b69ff50c5d20cca0f458ef9abd835e262d9d88b39d", size = 4599802, upload-time = "2025-04-12T17:47:21.404Z" }, - { url = "https://files.pythonhosted.org/packages/02/81/c3d9d38ce0c4878a77245d4cf2c46d45a4ad0f93000227910a46caff52f3/pillow-11.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0c3e6d0f59171dfa2e25d7116217543310908dfa2770aa64b8f87605f8cacc97", size = 4576717, upload-time = "2025-04-12T17:47:23.571Z" }, - { url = "https://files.pythonhosted.org/packages/42/49/52b719b89ac7da3185b8d29c94d0e6aec8140059e3d8adcaa46da3751180/pillow-11.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc1c3bc53befb6096b84165956e886b1729634a799e9d6329a0c512ab651e579", size = 4654874, upload-time = "2025-04-12T17:47:25.783Z" }, - { url = "https://files.pythonhosted.org/packages/5b/0b/ede75063ba6023798267023dc0d0401f13695d228194d2242d5a7ba2f964/pillow-11.2.1-cp310-cp310-win32.whl", hash = "sha256:312c77b7f07ab2139924d2639860e084ec2a13e72af54d4f08ac843a5fc9c79d", size = 2331717, upload-time = "2025-04-12T17:47:28.922Z" }, - { url = "https://files.pythonhosted.org/packages/ed/3c/9831da3edea527c2ed9a09f31a2c04e77cd705847f13b69ca60269eec370/pillow-11.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:9bc7ae48b8057a611e5fe9f853baa88093b9a76303937449397899385da06fad", size = 2676204, upload-time = "2025-04-12T17:47:31.283Z" }, - { url = "https://files.pythonhosted.org/packages/01/97/1f66ff8a1503d8cbfc5bae4dc99d54c6ec1e22ad2b946241365320caabc2/pillow-11.2.1-cp310-cp310-win_arm64.whl", hash = "sha256:2728567e249cdd939f6cc3d1f049595c66e4187f3c34078cbc0a7d21c47482d2", size = 2414767, upload-time = "2025-04-12T17:47:34.655Z" }, - { url = "https://files.pythonhosted.org/packages/68/08/3fbf4b98924c73037a8e8b4c2c774784805e0fb4ebca6c5bb60795c40125/pillow-11.2.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:35ca289f712ccfc699508c4658a1d14652e8033e9b69839edf83cbdd0ba39e70", size = 3198450, upload-time = "2025-04-12T17:47:37.135Z" }, - { url = "https://files.pythonhosted.org/packages/84/92/6505b1af3d2849d5e714fc75ba9e69b7255c05ee42383a35a4d58f576b16/pillow-11.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0409af9f829f87a2dfb7e259f78f317a5351f2045158be321fd135973fff7bf", size = 3030550, upload-time = "2025-04-12T17:47:39.345Z" }, - { url = "https://files.pythonhosted.org/packages/3c/8c/ac2f99d2a70ff966bc7eb13dacacfaab57c0549b2ffb351b6537c7840b12/pillow-11.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4e5c5edee874dce4f653dbe59db7c73a600119fbea8d31f53423586ee2aafd7", size = 4415018, upload-time = "2025-04-12T17:47:41.128Z" }, - { url = "https://files.pythonhosted.org/packages/1f/e3/0a58b5d838687f40891fff9cbaf8669f90c96b64dc8f91f87894413856c6/pillow-11.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b93a07e76d13bff9444f1a029e0af2964e654bfc2e2c2d46bfd080df5ad5f3d8", size = 4498006, upload-time = "2025-04-12T17:47:42.912Z" }, - { url = "https://files.pythonhosted.org/packages/21/f5/6ba14718135f08fbfa33308efe027dd02b781d3f1d5c471444a395933aac/pillow-11.2.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:e6def7eed9e7fa90fde255afaf08060dc4b343bbe524a8f69bdd2a2f0018f600", size = 4517773, upload-time = "2025-04-12T17:47:44.611Z" }, - { url = "https://files.pythonhosted.org/packages/20/f2/805ad600fc59ebe4f1ba6129cd3a75fb0da126975c8579b8f57abeb61e80/pillow-11.2.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8f4f3724c068be008c08257207210c138d5f3731af6c155a81c2b09a9eb3a788", size = 4607069, upload-time = "2025-04-12T17:47:46.46Z" }, - { url = "https://files.pythonhosted.org/packages/71/6b/4ef8a288b4bb2e0180cba13ca0a519fa27aa982875882392b65131401099/pillow-11.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a0a6709b47019dff32e678bc12c63008311b82b9327613f534e496dacaefb71e", size = 4583460, upload-time = "2025-04-12T17:47:49.255Z" }, - { url = "https://files.pythonhosted.org/packages/62/ae/f29c705a09cbc9e2a456590816e5c234382ae5d32584f451c3eb41a62062/pillow-11.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f6b0c664ccb879109ee3ca702a9272d877f4fcd21e5eb63c26422fd6e415365e", size = 4661304, upload-time = "2025-04-12T17:47:51.067Z" }, - { url = "https://files.pythonhosted.org/packages/6e/1a/c8217b6f2f73794a5e219fbad087701f412337ae6dbb956db37d69a9bc43/pillow-11.2.1-cp311-cp311-win32.whl", hash = "sha256:cc5d875d56e49f112b6def6813c4e3d3036d269c008bf8aef72cd08d20ca6df6", size = 2331809, upload-time = "2025-04-12T17:47:54.425Z" }, - { url = "https://files.pythonhosted.org/packages/e2/72/25a8f40170dc262e86e90f37cb72cb3de5e307f75bf4b02535a61afcd519/pillow-11.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:0f5c7eda47bf8e3c8a283762cab94e496ba977a420868cb819159980b6709193", size = 2676338, upload-time = "2025-04-12T17:47:56.535Z" }, - { url = "https://files.pythonhosted.org/packages/06/9e/76825e39efee61efea258b479391ca77d64dbd9e5804e4ad0fa453b4ba55/pillow-11.2.1-cp311-cp311-win_arm64.whl", hash = "sha256:4d375eb838755f2528ac8cbc926c3e31cc49ca4ad0cf79cff48b20e30634a4a7", size = 2414918, upload-time = "2025-04-12T17:47:58.217Z" }, - { url = "https://files.pythonhosted.org/packages/c7/40/052610b15a1b8961f52537cc8326ca6a881408bc2bdad0d852edeb6ed33b/pillow-11.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:78afba22027b4accef10dbd5eed84425930ba41b3ea0a86fa8d20baaf19d807f", size = 3190185, upload-time = "2025-04-12T17:48:00.417Z" }, - { url = "https://files.pythonhosted.org/packages/e5/7e/b86dbd35a5f938632093dc40d1682874c33dcfe832558fc80ca56bfcb774/pillow-11.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:78092232a4ab376a35d68c4e6d5e00dfd73454bd12b230420025fbe178ee3b0b", size = 3030306, upload-time = "2025-04-12T17:48:02.391Z" }, - { url = "https://files.pythonhosted.org/packages/a4/5c/467a161f9ed53e5eab51a42923c33051bf8d1a2af4626ac04f5166e58e0c/pillow-11.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25a5f306095c6780c52e6bbb6109624b95c5b18e40aab1c3041da3e9e0cd3e2d", size = 4416121, upload-time = "2025-04-12T17:48:04.554Z" }, - { url = "https://files.pythonhosted.org/packages/62/73/972b7742e38ae0e2ac76ab137ca6005dcf877480da0d9d61d93b613065b4/pillow-11.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c7b29dbd4281923a2bfe562acb734cee96bbb129e96e6972d315ed9f232bef4", size = 4501707, upload-time = "2025-04-12T17:48:06.831Z" }, - { url = "https://files.pythonhosted.org/packages/e4/3a/427e4cb0b9e177efbc1a84798ed20498c4f233abde003c06d2650a6d60cb/pillow-11.2.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:3e645b020f3209a0181a418bffe7b4a93171eef6c4ef6cc20980b30bebf17b7d", size = 4522921, upload-time = "2025-04-12T17:48:09.229Z" }, - { url = "https://files.pythonhosted.org/packages/fe/7c/d8b1330458e4d2f3f45d9508796d7caf0c0d3764c00c823d10f6f1a3b76d/pillow-11.2.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b2dbea1012ccb784a65349f57bbc93730b96e85b42e9bf7b01ef40443db720b4", size = 4612523, upload-time = "2025-04-12T17:48:11.631Z" }, - { url = "https://files.pythonhosted.org/packages/b3/2f/65738384e0b1acf451de5a573d8153fe84103772d139e1e0bdf1596be2ea/pillow-11.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:da3104c57bbd72948d75f6a9389e6727d2ab6333c3617f0a89d72d4940aa0443", size = 4587836, upload-time = "2025-04-12T17:48:13.592Z" }, - { url = "https://files.pythonhosted.org/packages/6a/c5/e795c9f2ddf3debb2dedd0df889f2fe4b053308bb59a3cc02a0cd144d641/pillow-11.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:598174aef4589af795f66f9caab87ba4ff860ce08cd5bb447c6fc553ffee603c", size = 4669390, upload-time = "2025-04-12T17:48:15.938Z" }, - { url = "https://files.pythonhosted.org/packages/96/ae/ca0099a3995976a9fce2f423166f7bff9b12244afdc7520f6ed38911539a/pillow-11.2.1-cp312-cp312-win32.whl", hash = "sha256:1d535df14716e7f8776b9e7fee118576d65572b4aad3ed639be9e4fa88a1cad3", size = 2332309, upload-time = "2025-04-12T17:48:17.885Z" }, - { url = "https://files.pythonhosted.org/packages/7c/18/24bff2ad716257fc03da964c5e8f05d9790a779a8895d6566e493ccf0189/pillow-11.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:14e33b28bf17c7a38eede290f77db7c664e4eb01f7869e37fa98a5aa95978941", size = 2676768, upload-time = "2025-04-12T17:48:19.655Z" }, - { url = "https://files.pythonhosted.org/packages/da/bb/e8d656c9543276517ee40184aaa39dcb41e683bca121022f9323ae11b39d/pillow-11.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:21e1470ac9e5739ff880c211fc3af01e3ae505859392bf65458c224d0bf283eb", size = 2415087, upload-time = "2025-04-12T17:48:21.991Z" }, - { url = "https://files.pythonhosted.org/packages/36/9c/447528ee3776e7ab8897fe33697a7ff3f0475bb490c5ac1456a03dc57956/pillow-11.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fdec757fea0b793056419bca3e9932eb2b0ceec90ef4813ea4c1e072c389eb28", size = 3190098, upload-time = "2025-04-12T17:48:23.915Z" }, - { url = "https://files.pythonhosted.org/packages/b5/09/29d5cd052f7566a63e5b506fac9c60526e9ecc553825551333e1e18a4858/pillow-11.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b0e130705d568e2f43a17bcbe74d90958e8a16263868a12c3e0d9c8162690830", size = 3030166, upload-time = "2025-04-12T17:48:25.738Z" }, - { url = "https://files.pythonhosted.org/packages/71/5d/446ee132ad35e7600652133f9c2840b4799bbd8e4adba881284860da0a36/pillow-11.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bdb5e09068332578214cadd9c05e3d64d99e0e87591be22a324bdbc18925be0", size = 4408674, upload-time = "2025-04-12T17:48:27.908Z" }, - { url = "https://files.pythonhosted.org/packages/69/5f/cbe509c0ddf91cc3a03bbacf40e5c2339c4912d16458fcb797bb47bcb269/pillow-11.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d189ba1bebfbc0c0e529159631ec72bb9e9bc041f01ec6d3233d6d82eb823bc1", size = 4496005, upload-time = "2025-04-12T17:48:29.888Z" }, - { url = "https://files.pythonhosted.org/packages/f9/b3/dd4338d8fb8a5f312021f2977fb8198a1184893f9b00b02b75d565c33b51/pillow-11.2.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:191955c55d8a712fab8934a42bfefbf99dd0b5875078240943f913bb66d46d9f", size = 4518707, upload-time = "2025-04-12T17:48:31.874Z" }, - { url = "https://files.pythonhosted.org/packages/13/eb/2552ecebc0b887f539111c2cd241f538b8ff5891b8903dfe672e997529be/pillow-11.2.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:ad275964d52e2243430472fc5d2c2334b4fc3ff9c16cb0a19254e25efa03a155", size = 4610008, upload-time = "2025-04-12T17:48:34.422Z" }, - { url = "https://files.pythonhosted.org/packages/72/d1/924ce51bea494cb6e7959522d69d7b1c7e74f6821d84c63c3dc430cbbf3b/pillow-11.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:750f96efe0597382660d8b53e90dd1dd44568a8edb51cb7f9d5d918b80d4de14", size = 4585420, upload-time = "2025-04-12T17:48:37.641Z" }, - { url = "https://files.pythonhosted.org/packages/43/ab/8f81312d255d713b99ca37479a4cb4b0f48195e530cdc1611990eb8fd04b/pillow-11.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fe15238d3798788d00716637b3d4e7bb6bde18b26e5d08335a96e88564a36b6b", size = 4667655, upload-time = "2025-04-12T17:48:39.652Z" }, - { url = "https://files.pythonhosted.org/packages/94/86/8f2e9d2dc3d308dfd137a07fe1cc478df0a23d42a6c4093b087e738e4827/pillow-11.2.1-cp313-cp313-win32.whl", hash = "sha256:3fe735ced9a607fee4f481423a9c36701a39719252a9bb251679635f99d0f7d2", size = 2332329, upload-time = "2025-04-12T17:48:41.765Z" }, - { url = "https://files.pythonhosted.org/packages/6d/ec/1179083b8d6067a613e4d595359b5fdea65d0a3b7ad623fee906e1b3c4d2/pillow-11.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:74ee3d7ecb3f3c05459ba95eed5efa28d6092d751ce9bf20e3e253a4e497e691", size = 2676388, upload-time = "2025-04-12T17:48:43.625Z" }, - { url = "https://files.pythonhosted.org/packages/23/f1/2fc1e1e294de897df39fa8622d829b8828ddad938b0eaea256d65b84dd72/pillow-11.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:5119225c622403afb4b44bad4c1ca6c1f98eed79db8d3bc6e4e160fc6339d66c", size = 2414950, upload-time = "2025-04-12T17:48:45.475Z" }, - { url = "https://files.pythonhosted.org/packages/c4/3e/c328c48b3f0ead7bab765a84b4977acb29f101d10e4ef57a5e3400447c03/pillow-11.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8ce2e8411c7aaef53e6bb29fe98f28cd4fbd9a1d9be2eeea434331aac0536b22", size = 3192759, upload-time = "2025-04-12T17:48:47.866Z" }, - { url = "https://files.pythonhosted.org/packages/18/0e/1c68532d833fc8b9f404d3a642991441d9058eccd5606eab31617f29b6d4/pillow-11.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9ee66787e095127116d91dea2143db65c7bb1e232f617aa5957c0d9d2a3f23a7", size = 3033284, upload-time = "2025-04-12T17:48:50.189Z" }, - { url = "https://files.pythonhosted.org/packages/b7/cb/6faf3fb1e7705fd2db74e070f3bf6f88693601b0ed8e81049a8266de4754/pillow-11.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9622e3b6c1d8b551b6e6f21873bdcc55762b4b2126633014cea1803368a9aa16", size = 4445826, upload-time = "2025-04-12T17:48:52.346Z" }, - { url = "https://files.pythonhosted.org/packages/07/94/8be03d50b70ca47fb434a358919d6a8d6580f282bbb7af7e4aa40103461d/pillow-11.2.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63b5dff3a68f371ea06025a1a6966c9a1e1ee452fc8020c2cd0ea41b83e9037b", size = 4527329, upload-time = "2025-04-12T17:48:54.403Z" }, - { url = "https://files.pythonhosted.org/packages/fd/a4/bfe78777076dc405e3bd2080bc32da5ab3945b5a25dc5d8acaa9de64a162/pillow-11.2.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:31df6e2d3d8fc99f993fd253e97fae451a8db2e7207acf97859732273e108406", size = 4549049, upload-time = "2025-04-12T17:48:56.383Z" }, - { url = "https://files.pythonhosted.org/packages/65/4d/eaf9068dc687c24979e977ce5677e253624bd8b616b286f543f0c1b91662/pillow-11.2.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:062b7a42d672c45a70fa1f8b43d1d38ff76b63421cbbe7f88146b39e8a558d91", size = 4635408, upload-time = "2025-04-12T17:48:58.782Z" }, - { url = "https://files.pythonhosted.org/packages/1d/26/0fd443365d9c63bc79feb219f97d935cd4b93af28353cba78d8e77b61719/pillow-11.2.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4eb92eca2711ef8be42fd3f67533765d9fd043b8c80db204f16c8ea62ee1a751", size = 4614863, upload-time = "2025-04-12T17:49:00.709Z" }, - { url = "https://files.pythonhosted.org/packages/49/65/dca4d2506be482c2c6641cacdba5c602bc76d8ceb618fd37de855653a419/pillow-11.2.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f91ebf30830a48c825590aede79376cb40f110b387c17ee9bd59932c961044f9", size = 4692938, upload-time = "2025-04-12T17:49:02.946Z" }, - { url = "https://files.pythonhosted.org/packages/b3/92/1ca0c3f09233bd7decf8f7105a1c4e3162fb9142128c74adad0fb361b7eb/pillow-11.2.1-cp313-cp313t-win32.whl", hash = "sha256:e0b55f27f584ed623221cfe995c912c61606be8513bfa0e07d2c674b4516d9dd", size = 2335774, upload-time = "2025-04-12T17:49:04.889Z" }, - { url = "https://files.pythonhosted.org/packages/a5/ac/77525347cb43b83ae905ffe257bbe2cc6fd23acb9796639a1f56aa59d191/pillow-11.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:36d6b82164c39ce5482f649b437382c0fb2395eabc1e2b1702a6deb8ad647d6e", size = 2681895, upload-time = "2025-04-12T17:49:06.635Z" }, - { url = "https://files.pythonhosted.org/packages/67/32/32dc030cfa91ca0fc52baebbba2e009bb001122a1daa8b6a79ad830b38d3/pillow-11.2.1-cp313-cp313t-win_arm64.whl", hash = "sha256:225c832a13326e34f212d2072982bb1adb210e0cc0b153e688743018c94a2681", size = 2417234, upload-time = "2025-04-12T17:49:08.399Z" }, - { url = "https://files.pythonhosted.org/packages/21/3a/c1835d1c7cf83559e95b4f4ed07ab0bb7acc689712adfce406b3f456e9fd/pillow-11.2.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:7491cf8a79b8eb867d419648fff2f83cb0b3891c8b36da92cc7f1931d46108c8", size = 3198391, upload-time = "2025-04-12T17:49:10.122Z" }, - { url = "https://files.pythonhosted.org/packages/b6/4d/dcb7a9af3fc1e8653267c38ed622605d9d1793349274b3ef7af06457e257/pillow-11.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8b02d8f9cb83c52578a0b4beadba92e37d83a4ef11570a8688bbf43f4ca50909", size = 3030573, upload-time = "2025-04-12T17:49:11.938Z" }, - { url = "https://files.pythonhosted.org/packages/9d/29/530ca098c1a1eb31d4e163d317d0e24e6d2ead907991c69ca5b663de1bc5/pillow-11.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:014ca0050c85003620526b0ac1ac53f56fc93af128f7546623cc8e31875ab928", size = 4398677, upload-time = "2025-04-12T17:49:13.861Z" }, - { url = "https://files.pythonhosted.org/packages/8b/ee/0e5e51db34de1690264e5f30dcd25328c540aa11d50a3bc0b540e2a445b6/pillow-11.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3692b68c87096ac6308296d96354eddd25f98740c9d2ab54e1549d6c8aea9d79", size = 4484986, upload-time = "2025-04-12T17:49:15.948Z" }, - { url = "https://files.pythonhosted.org/packages/93/7d/bc723b41ce3d2c28532c47678ec988974f731b5c6fadd5b3a4fba9015e4f/pillow-11.2.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:f781dcb0bc9929adc77bad571b8621ecb1e4cdef86e940fe2e5b5ee24fd33b35", size = 4501897, upload-time = "2025-04-12T17:49:17.839Z" }, - { url = "https://files.pythonhosted.org/packages/be/0b/532e31abc7389617ddff12551af625a9b03cd61d2989fa595e43c470ec67/pillow-11.2.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:2b490402c96f907a166615e9a5afacf2519e28295f157ec3a2bb9bd57de638cb", size = 4592618, upload-time = "2025-04-12T17:49:19.7Z" }, - { url = "https://files.pythonhosted.org/packages/4c/f0/21ed6499a6216fef753e2e2254a19d08bff3747108ba042422383f3e9faa/pillow-11.2.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dd6b20b93b3ccc9c1b597999209e4bc5cf2853f9ee66e3fc9a400a78733ffc9a", size = 4570493, upload-time = "2025-04-12T17:49:21.703Z" }, - { url = "https://files.pythonhosted.org/packages/68/de/17004ddb8ab855573fe1127ab0168d11378cdfe4a7ee2a792a70ff2e9ba7/pillow-11.2.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:4b835d89c08a6c2ee7781b8dd0a30209a8012b5f09c0a665b65b0eb3560b6f36", size = 4647748, upload-time = "2025-04-12T17:49:23.579Z" }, - { url = "https://files.pythonhosted.org/packages/c7/23/82ecb486384bb3578115c509d4a00bb52f463ee700a5ca1be53da3c88c19/pillow-11.2.1-cp39-cp39-win32.whl", hash = "sha256:b10428b3416d4f9c61f94b494681280be7686bda15898a3a9e08eb66a6d92d67", size = 2331731, upload-time = "2025-04-12T17:49:25.58Z" }, - { url = "https://files.pythonhosted.org/packages/58/bb/87efd58b3689537a623d44dbb2550ef0bb5ff6a62769707a0fe8b1a7bdeb/pillow-11.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:6ebce70c3f486acf7591a3d73431fa504a4e18a9b97ff27f5f47b7368e4b9dd1", size = 2676346, upload-time = "2025-04-12T17:49:27.342Z" }, - { url = "https://files.pythonhosted.org/packages/80/08/dc268475b22887b816e5dcfae31bce897f524b4646bab130c2142c9b2400/pillow-11.2.1-cp39-cp39-win_arm64.whl", hash = "sha256:c27476257b2fdcd7872d54cfd119b3a9ce4610fb85c8e32b70b42e3680a29a1e", size = 2414623, upload-time = "2025-04-12T17:49:29.139Z" }, - { url = "https://files.pythonhosted.org/packages/33/49/c8c21e4255b4f4a2c0c68ac18125d7f5460b109acc6dfdef1a24f9b960ef/pillow-11.2.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:9b7b0d4fd2635f54ad82785d56bc0d94f147096493a79985d0ab57aedd563156", size = 3181727, upload-time = "2025-04-12T17:49:31.898Z" }, - { url = "https://files.pythonhosted.org/packages/6d/f1/f7255c0838f8c1ef6d55b625cfb286835c17e8136ce4351c5577d02c443b/pillow-11.2.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:aa442755e31c64037aa7c1cb186e0b369f8416c567381852c63444dd666fb772", size = 2999833, upload-time = "2025-04-12T17:49:34.2Z" }, - { url = "https://files.pythonhosted.org/packages/e2/57/9968114457bd131063da98d87790d080366218f64fa2943b65ac6739abb3/pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0d3348c95b766f54b76116d53d4cb171b52992a1027e7ca50c81b43b9d9e363", size = 3437472, upload-time = "2025-04-12T17:49:36.294Z" }, - { url = "https://files.pythonhosted.org/packages/b2/1b/e35d8a158e21372ecc48aac9c453518cfe23907bb82f950d6e1c72811eb0/pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85d27ea4c889342f7e35f6d56e7e1cb345632ad592e8c51b693d7b7556043ce0", size = 3459976, upload-time = "2025-04-12T17:49:38.988Z" }, - { url = "https://files.pythonhosted.org/packages/26/da/2c11d03b765efff0ccc473f1c4186dc2770110464f2177efaed9cf6fae01/pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:bf2c33d6791c598142f00c9c4c7d47f6476731c31081331664eb26d6ab583e01", size = 3527133, upload-time = "2025-04-12T17:49:40.985Z" }, - { url = "https://files.pythonhosted.org/packages/79/1a/4e85bd7cadf78412c2a3069249a09c32ef3323650fd3005c97cca7aa21df/pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e616e7154c37669fc1dfc14584f11e284e05d1c650e1c0f972f281c4ccc53193", size = 3571555, upload-time = "2025-04-12T17:49:42.964Z" }, - { url = "https://files.pythonhosted.org/packages/69/03/239939915216de1e95e0ce2334bf17a7870ae185eb390fab6d706aadbfc0/pillow-11.2.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:39ad2e0f424394e3aebc40168845fee52df1394a4673a6ee512d840d14ab3013", size = 2674713, upload-time = "2025-04-12T17:49:44.944Z" }, - { url = "https://files.pythonhosted.org/packages/a4/ad/2613c04633c7257d9481ab21d6b5364b59fc5d75faafd7cb8693523945a3/pillow-11.2.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:80f1df8dbe9572b4b7abdfa17eb5d78dd620b1d55d9e25f834efdbee872d3aed", size = 3181734, upload-time = "2025-04-12T17:49:46.789Z" }, - { url = "https://files.pythonhosted.org/packages/a4/fd/dcdda4471ed667de57bb5405bb42d751e6cfdd4011a12c248b455c778e03/pillow-11.2.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ea926cfbc3957090becbcbbb65ad177161a2ff2ad578b5a6ec9bb1e1cd78753c", size = 2999841, upload-time = "2025-04-12T17:49:48.812Z" }, - { url = "https://files.pythonhosted.org/packages/ac/89/8a2536e95e77432833f0db6fd72a8d310c8e4272a04461fb833eb021bf94/pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:738db0e0941ca0376804d4de6a782c005245264edaa253ffce24e5a15cbdc7bd", size = 3437470, upload-time = "2025-04-12T17:49:50.831Z" }, - { url = "https://files.pythonhosted.org/packages/9d/8f/abd47b73c60712f88e9eda32baced7bfc3e9bd6a7619bb64b93acff28c3e/pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9db98ab6565c69082ec9b0d4e40dd9f6181dab0dd236d26f7a50b8b9bfbd5076", size = 3460013, upload-time = "2025-04-12T17:49:53.278Z" }, - { url = "https://files.pythonhosted.org/packages/f6/20/5c0a0aa83b213b7a07ec01e71a3d6ea2cf4ad1d2c686cc0168173b6089e7/pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:036e53f4170e270ddb8797d4c590e6dd14d28e15c7da375c18978045f7e6c37b", size = 3527165, upload-time = "2025-04-12T17:49:55.164Z" }, - { url = "https://files.pythonhosted.org/packages/58/0e/2abab98a72202d91146abc839e10c14f7cf36166f12838ea0c4db3ca6ecb/pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:14f73f7c291279bd65fda51ee87affd7c1e097709f7fdd0188957a16c264601f", size = 3571586, upload-time = "2025-04-12T17:49:57.171Z" }, - { url = "https://files.pythonhosted.org/packages/21/2c/5e05f58658cf49b6667762cca03d6e7d85cededde2caf2ab37b81f80e574/pillow-11.2.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:208653868d5c9ecc2b327f9b9ef34e0e42a4cdd172c2988fd81d62d2bc9bc044", size = 2674751, upload-time = "2025-04-12T17:49:59.628Z" }, -] - -[[package]] -name = "platformdirs" -version = "4.4.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.10'", -] -sdist = { url = "https://files.pythonhosted.org/packages/23/e8/21db9c9987b0e728855bd57bff6984f67952bea55d6f75e055c46b5383e8/platformdirs-4.4.0.tar.gz", hash = "sha256:ca753cf4d81dc309bc67b0ea38fd15dc97bc30ce419a7f58d13eb3bf14c4febf", size = 21634, upload-time = "2025-08-26T14:32:04.268Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/40/4b/2028861e724d3bd36227adfa20d3fd24c3fc6d52032f4a93c133be5d17ce/platformdirs-4.4.0-py3-none-any.whl", hash = "sha256:abd01743f24e5287cd7a5db3752faf1a2d65353f38ec26d98e25a6db65958c85", size = 18654, upload-time = "2025-08-26T14:32:02.735Z" }, -] - [[package]] name = "platformdirs" version = "4.5.1" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.10'", -] sdist = { url = "https://files.pythonhosted.org/packages/cf/86/0248f086a84f01b37aaec0fa567b397df1a119f73c16f6c7a9aac73ea309/platformdirs-4.5.1.tar.gz", hash = "sha256:61d5cdcc6065745cdd94f0f878977f8de9437be93de97c1c12f853c9c0cdcbda", size = 21715, upload-time = "2025-12-05T13:52:58.638Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl", hash = "sha256:d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31", size = 18731, upload-time = "2025-12-05T13:52:56.823Z" }, @@ -479,33 +239,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195, upload-time = "2025-04-23T18:33:52.104Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/92/b31726561b5dae176c2d2c2dc43a9c5bfba5d32f96f8b4c0a600dd492447/pydantic_core-2.33.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2b3d326aaef0c0399d9afffeb6367d5e26ddc24d351dbc9c636840ac355dc5d8", size = 2028817, upload-time = "2025-04-23T18:30:43.919Z" }, - { url = "https://files.pythonhosted.org/packages/a3/44/3f0b95fafdaca04a483c4e685fe437c6891001bf3ce8b2fded82b9ea3aa1/pydantic_core-2.33.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e5b2671f05ba48b94cb90ce55d8bdcaaedb8ba00cc5359f6810fc918713983d", size = 1861357, upload-time = "2025-04-23T18:30:46.372Z" }, - { url = "https://files.pythonhosted.org/packages/30/97/e8f13b55766234caae05372826e8e4b3b96e7b248be3157f53237682e43c/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0069c9acc3f3981b9ff4cdfaf088e98d83440a4c7ea1bc07460af3d4dc22e72d", size = 1898011, upload-time = "2025-04-23T18:30:47.591Z" }, - { url = "https://files.pythonhosted.org/packages/9b/a3/99c48cf7bafc991cc3ee66fd544c0aae8dc907b752f1dad2d79b1b5a471f/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d53b22f2032c42eaaf025f7c40c2e3b94568ae077a606f006d206a463bc69572", size = 1982730, upload-time = "2025-04-23T18:30:49.328Z" }, - { url = "https://files.pythonhosted.org/packages/de/8e/a5b882ec4307010a840fb8b58bd9bf65d1840c92eae7534c7441709bf54b/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0405262705a123b7ce9f0b92f123334d67b70fd1f20a9372b907ce1080c7ba02", size = 2136178, upload-time = "2025-04-23T18:30:50.907Z" }, - { url = "https://files.pythonhosted.org/packages/e4/bb/71e35fc3ed05af6834e890edb75968e2802fe98778971ab5cba20a162315/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b25d91e288e2c4e0662b8038a28c6a07eaac3e196cfc4ff69de4ea3db992a1b", size = 2736462, upload-time = "2025-04-23T18:30:52.083Z" }, - { url = "https://files.pythonhosted.org/packages/31/0d/c8f7593e6bc7066289bbc366f2235701dcbebcd1ff0ef8e64f6f239fb47d/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bdfe4b3789761f3bcb4b1ddf33355a71079858958e3a552f16d5af19768fef2", size = 2005652, upload-time = "2025-04-23T18:30:53.389Z" }, - { url = "https://files.pythonhosted.org/packages/d2/7a/996d8bd75f3eda405e3dd219ff5ff0a283cd8e34add39d8ef9157e722867/pydantic_core-2.33.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:efec8db3266b76ef9607c2c4c419bdb06bf335ae433b80816089ea7585816f6a", size = 2113306, upload-time = "2025-04-23T18:30:54.661Z" }, - { url = "https://files.pythonhosted.org/packages/ff/84/daf2a6fb2db40ffda6578a7e8c5a6e9c8affb251a05c233ae37098118788/pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:031c57d67ca86902726e0fae2214ce6770bbe2f710dc33063187a68744a5ecac", size = 2073720, upload-time = "2025-04-23T18:30:56.11Z" }, - { url = "https://files.pythonhosted.org/packages/77/fb/2258da019f4825128445ae79456a5499c032b55849dbd5bed78c95ccf163/pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:f8de619080e944347f5f20de29a975c2d815d9ddd8be9b9b7268e2e3ef68605a", size = 2244915, upload-time = "2025-04-23T18:30:57.501Z" }, - { url = "https://files.pythonhosted.org/packages/d8/7a/925ff73756031289468326e355b6fa8316960d0d65f8b5d6b3a3e7866de7/pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:73662edf539e72a9440129f231ed3757faab89630d291b784ca99237fb94db2b", size = 2241884, upload-time = "2025-04-23T18:30:58.867Z" }, - { url = "https://files.pythonhosted.org/packages/0b/b0/249ee6d2646f1cdadcb813805fe76265745c4010cf20a8eba7b0e639d9b2/pydantic_core-2.33.2-cp310-cp310-win32.whl", hash = "sha256:0a39979dcbb70998b0e505fb1556a1d550a0781463ce84ebf915ba293ccb7e22", size = 1910496, upload-time = "2025-04-23T18:31:00.078Z" }, - { url = "https://files.pythonhosted.org/packages/66/ff/172ba8f12a42d4b552917aa65d1f2328990d3ccfc01d5b7c943ec084299f/pydantic_core-2.33.2-cp310-cp310-win_amd64.whl", hash = "sha256:b0379a2b24882fef529ec3b4987cb5d003b9cda32256024e6fe1586ac45fc640", size = 1955019, upload-time = "2025-04-23T18:31:01.335Z" }, - { url = "https://files.pythonhosted.org/packages/3f/8d/71db63483d518cbbf290261a1fc2839d17ff89fce7089e08cad07ccfce67/pydantic_core-2.33.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4c5b0a576fb381edd6d27f0a85915c6daf2f8138dc5c267a57c08a62900758c7", size = 2028584, upload-time = "2025-04-23T18:31:03.106Z" }, - { url = "https://files.pythonhosted.org/packages/24/2f/3cfa7244ae292dd850989f328722d2aef313f74ffc471184dc509e1e4e5a/pydantic_core-2.33.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e799c050df38a639db758c617ec771fd8fb7a5f8eaaa4b27b101f266b216a246", size = 1855071, upload-time = "2025-04-23T18:31:04.621Z" }, - { url = "https://files.pythonhosted.org/packages/b3/d3/4ae42d33f5e3f50dd467761304be2fa0a9417fbf09735bc2cce003480f2a/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc46a01bf8d62f227d5ecee74178ffc448ff4e5197c756331f71efcc66dc980f", size = 1897823, upload-time = "2025-04-23T18:31:06.377Z" }, - { url = "https://files.pythonhosted.org/packages/f4/f3/aa5976e8352b7695ff808599794b1fba2a9ae2ee954a3426855935799488/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a144d4f717285c6d9234a66778059f33a89096dfb9b39117663fd8413d582dcc", size = 1983792, upload-time = "2025-04-23T18:31:07.93Z" }, - { url = "https://files.pythonhosted.org/packages/d5/7a/cda9b5a23c552037717f2b2a5257e9b2bfe45e687386df9591eff7b46d28/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73cf6373c21bc80b2e0dc88444f41ae60b2f070ed02095754eb5a01df12256de", size = 2136338, upload-time = "2025-04-23T18:31:09.283Z" }, - { url = "https://files.pythonhosted.org/packages/2b/9f/b8f9ec8dd1417eb9da784e91e1667d58a2a4a7b7b34cf4af765ef663a7e5/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dc625f4aa79713512d1976fe9f0bc99f706a9dee21dfd1810b4bbbf228d0e8a", size = 2730998, upload-time = "2025-04-23T18:31:11.7Z" }, - { url = "https://files.pythonhosted.org/packages/47/bc/cd720e078576bdb8255d5032c5d63ee5c0bf4b7173dd955185a1d658c456/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b21b5549499972441da4758d662aeea93f1923f953e9cbaff14b8b9565aef", size = 2003200, upload-time = "2025-04-23T18:31:13.536Z" }, - { url = "https://files.pythonhosted.org/packages/ca/22/3602b895ee2cd29d11a2b349372446ae9727c32e78a94b3d588a40fdf187/pydantic_core-2.33.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bdc25f3681f7b78572699569514036afe3c243bc3059d3942624e936ec93450e", size = 2113890, upload-time = "2025-04-23T18:31:15.011Z" }, - { url = "https://files.pythonhosted.org/packages/ff/e6/e3c5908c03cf00d629eb38393a98fccc38ee0ce8ecce32f69fc7d7b558a7/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fe5b32187cbc0c862ee201ad66c30cf218e5ed468ec8dc1cf49dec66e160cc4d", size = 2073359, upload-time = "2025-04-23T18:31:16.393Z" }, - { url = "https://files.pythonhosted.org/packages/12/e7/6a36a07c59ebefc8777d1ffdaf5ae71b06b21952582e4b07eba88a421c79/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:bc7aee6f634a6f4a95676fcb5d6559a2c2a390330098dba5e5a5f28a2e4ada30", size = 2245883, upload-time = "2025-04-23T18:31:17.892Z" }, - { url = "https://files.pythonhosted.org/packages/16/3f/59b3187aaa6cc0c1e6616e8045b284de2b6a87b027cce2ffcea073adf1d2/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:235f45e5dbcccf6bd99f9f472858849f73d11120d76ea8707115415f8e5ebebf", size = 2241074, upload-time = "2025-04-23T18:31:19.205Z" }, - { url = "https://files.pythonhosted.org/packages/e0/ed/55532bb88f674d5d8f67ab121a2a13c385df382de2a1677f30ad385f7438/pydantic_core-2.33.2-cp311-cp311-win32.whl", hash = "sha256:6368900c2d3ef09b69cb0b913f9f8263b03786e5b2a387706c5afb66800efd51", size = 1910538, upload-time = "2025-04-23T18:31:20.541Z" }, - { url = "https://files.pythonhosted.org/packages/fe/1b/25b7cccd4519c0b23c2dd636ad39d381abf113085ce4f7bec2b0dc755eb1/pydantic_core-2.33.2-cp311-cp311-win_amd64.whl", hash = "sha256:1e063337ef9e9820c77acc768546325ebe04ee38b08703244c1309cccc4f1bab", size = 1952909, upload-time = "2025-04-23T18:31:22.371Z" }, - { url = "https://files.pythonhosted.org/packages/49/a9/d809358e49126438055884c4366a1f6227f0f84f635a9014e2deb9b9de54/pydantic_core-2.33.2-cp311-cp311-win_arm64.whl", hash = "sha256:6b99022f1d19bc32a4c2a0d544fc9a76e3be90f0b3f4af413f87d38749300e65", size = 1897786, upload-time = "2025-04-23T18:31:24.161Z" }, { url = "https://files.pythonhosted.org/packages/18/8a/2b41c97f554ec8c71f2a8a5f85cb56a8b0956addfe8b0efb5b3d77e8bdc3/pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc", size = 2009000, upload-time = "2025-04-23T18:31:25.863Z" }, { url = "https://files.pythonhosted.org/packages/a1/02/6224312aacb3c8ecbaa959897af57181fb6cf3a3d7917fd44d0f2917e6f2/pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7", size = 1847996, upload-time = "2025-04-23T18:31:27.341Z" }, { url = "https://files.pythonhosted.org/packages/d6/46/6dcdf084a523dbe0a0be59d054734b86a981726f221f4562aed313dbcb49/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025", size = 1880957, upload-time = "2025-04-23T18:31:28.956Z" }, @@ -537,46 +270,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a4/7d/e09391c2eebeab681df2b74bfe6c43422fffede8dc74187b2b0bf6fd7571/pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", size = 1806162, upload-time = "2025-04-23T18:32:20.188Z" }, { url = "https://files.pythonhosted.org/packages/f1/3d/847b6b1fed9f8ed3bb95a9ad04fbd0b212e832d4f0f50ff4d9ee5a9f15cf/pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", size = 1981560, upload-time = "2025-04-23T18:32:22.354Z" }, { url = "https://files.pythonhosted.org/packages/6f/9a/e73262f6c6656262b5fdd723ad90f518f579b7bc8622e43a942eec53c938/pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", size = 1935777, upload-time = "2025-04-23T18:32:25.088Z" }, - { url = "https://files.pythonhosted.org/packages/53/ea/bbe9095cdd771987d13c82d104a9c8559ae9aec1e29f139e286fd2e9256e/pydantic_core-2.33.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a2b911a5b90e0374d03813674bf0a5fbbb7741570dcd4b4e85a2e48d17def29d", size = 2028677, upload-time = "2025-04-23T18:32:27.227Z" }, - { url = "https://files.pythonhosted.org/packages/49/1d/4ac5ed228078737d457a609013e8f7edc64adc37b91d619ea965758369e5/pydantic_core-2.33.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6fa6dfc3e4d1f734a34710f391ae822e0a8eb8559a85c6979e14e65ee6ba2954", size = 1864735, upload-time = "2025-04-23T18:32:29.019Z" }, - { url = "https://files.pythonhosted.org/packages/23/9a/2e70d6388d7cda488ae38f57bc2f7b03ee442fbcf0d75d848304ac7e405b/pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c54c939ee22dc8e2d545da79fc5381f1c020d6d3141d3bd747eab59164dc89fb", size = 1898467, upload-time = "2025-04-23T18:32:31.119Z" }, - { url = "https://files.pythonhosted.org/packages/ff/2e/1568934feb43370c1ffb78a77f0baaa5a8b6897513e7a91051af707ffdc4/pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53a57d2ed685940a504248187d5685e49eb5eef0f696853647bf37c418c538f7", size = 1983041, upload-time = "2025-04-23T18:32:33.655Z" }, - { url = "https://files.pythonhosted.org/packages/01/1a/1a1118f38ab64eac2f6269eb8c120ab915be30e387bb561e3af904b12499/pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09fb9dd6571aacd023fe6aaca316bd01cf60ab27240d7eb39ebd66a3a15293b4", size = 2136503, upload-time = "2025-04-23T18:32:35.519Z" }, - { url = "https://files.pythonhosted.org/packages/5c/da/44754d1d7ae0f22d6d3ce6c6b1486fc07ac2c524ed8f6eca636e2e1ee49b/pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0e6116757f7959a712db11f3e9c0a99ade00a5bbedae83cb801985aa154f071b", size = 2736079, upload-time = "2025-04-23T18:32:37.659Z" }, - { url = "https://files.pythonhosted.org/packages/4d/98/f43cd89172220ec5aa86654967b22d862146bc4d736b1350b4c41e7c9c03/pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d55ab81c57b8ff8548c3e4947f119551253f4e3787a7bbc0b6b3ca47498a9d3", size = 2006508, upload-time = "2025-04-23T18:32:39.637Z" }, - { url = "https://files.pythonhosted.org/packages/2b/cc/f77e8e242171d2158309f830f7d5d07e0531b756106f36bc18712dc439df/pydantic_core-2.33.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c20c462aa4434b33a2661701b861604913f912254e441ab8d78d30485736115a", size = 2113693, upload-time = "2025-04-23T18:32:41.818Z" }, - { url = "https://files.pythonhosted.org/packages/54/7a/7be6a7bd43e0a47c147ba7fbf124fe8aaf1200bc587da925509641113b2d/pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:44857c3227d3fb5e753d5fe4a3420d6376fa594b07b621e220cd93703fe21782", size = 2074224, upload-time = "2025-04-23T18:32:44.033Z" }, - { url = "https://files.pythonhosted.org/packages/2a/07/31cf8fadffbb03be1cb520850e00a8490c0927ec456e8293cafda0726184/pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:eb9b459ca4df0e5c87deb59d37377461a538852765293f9e6ee834f0435a93b9", size = 2245403, upload-time = "2025-04-23T18:32:45.836Z" }, - { url = "https://files.pythonhosted.org/packages/b6/8d/bbaf4c6721b668d44f01861f297eb01c9b35f612f6b8e14173cb204e6240/pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9fcd347d2cc5c23b06de6d3b7b8275be558a0c90549495c699e379a80bf8379e", size = 2242331, upload-time = "2025-04-23T18:32:47.618Z" }, - { url = "https://files.pythonhosted.org/packages/bb/93/3cc157026bca8f5006250e74515119fcaa6d6858aceee8f67ab6dc548c16/pydantic_core-2.33.2-cp39-cp39-win32.whl", hash = "sha256:83aa99b1285bc8f038941ddf598501a86f1536789740991d7d8756e34f1e74d9", size = 1910571, upload-time = "2025-04-23T18:32:49.401Z" }, - { url = "https://files.pythonhosted.org/packages/5b/90/7edc3b2a0d9f0dda8806c04e511a67b0b7a41d2187e2003673a996fb4310/pydantic_core-2.33.2-cp39-cp39-win_amd64.whl", hash = "sha256:f481959862f57f29601ccced557cc2e817bce7533ab8e01a797a48b49c9692b3", size = 1956504, upload-time = "2025-04-23T18:32:51.287Z" }, - { url = "https://files.pythonhosted.org/packages/30/68/373d55e58b7e83ce371691f6eaa7175e3a24b956c44628eb25d7da007917/pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5c4aa4e82353f65e548c476b37e64189783aa5384903bfea4f41580f255fddfa", size = 2023982, upload-time = "2025-04-23T18:32:53.14Z" }, - { url = "https://files.pythonhosted.org/packages/a4/16/145f54ac08c96a63d8ed6442f9dec17b2773d19920b627b18d4f10a061ea/pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d946c8bf0d5c24bf4fe333af284c59a19358aa3ec18cb3dc4370080da1e8ad29", size = 1858412, upload-time = "2025-04-23T18:32:55.52Z" }, - { url = "https://files.pythonhosted.org/packages/41/b1/c6dc6c3e2de4516c0bb2c46f6a373b91b5660312342a0cf5826e38ad82fa/pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87b31b6846e361ef83fedb187bb5b4372d0da3f7e28d85415efa92d6125d6e6d", size = 1892749, upload-time = "2025-04-23T18:32:57.546Z" }, - { url = "https://files.pythonhosted.org/packages/12/73/8cd57e20afba760b21b742106f9dbdfa6697f1570b189c7457a1af4cd8a0/pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa9d91b338f2df0508606f7009fde642391425189bba6d8c653afd80fd6bb64e", size = 2067527, upload-time = "2025-04-23T18:32:59.771Z" }, - { url = "https://files.pythonhosted.org/packages/e3/d5/0bb5d988cc019b3cba4a78f2d4b3854427fc47ee8ec8e9eaabf787da239c/pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2058a32994f1fde4ca0480ab9d1e75a0e8c87c22b53a3ae66554f9af78f2fe8c", size = 2108225, upload-time = "2025-04-23T18:33:04.51Z" }, - { url = "https://files.pythonhosted.org/packages/f1/c5/00c02d1571913d496aabf146106ad8239dc132485ee22efe08085084ff7c/pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:0e03262ab796d986f978f79c943fc5f620381be7287148b8010b4097f79a39ec", size = 2069490, upload-time = "2025-04-23T18:33:06.391Z" }, - { url = "https://files.pythonhosted.org/packages/22/a8/dccc38768274d3ed3a59b5d06f59ccb845778687652daa71df0cab4040d7/pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:1a8695a8d00c73e50bff9dfda4d540b7dee29ff9b8053e38380426a85ef10052", size = 2237525, upload-time = "2025-04-23T18:33:08.44Z" }, - { url = "https://files.pythonhosted.org/packages/d4/e7/4f98c0b125dda7cf7ccd14ba936218397b44f50a56dd8c16a3091df116c3/pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:fa754d1850735a0b0e03bcffd9d4b4343eb417e47196e4485d9cca326073a42c", size = 2238446, upload-time = "2025-04-23T18:33:10.313Z" }, - { url = "https://files.pythonhosted.org/packages/ce/91/2ec36480fdb0b783cd9ef6795753c1dea13882f2e68e73bce76ae8c21e6a/pydantic_core-2.33.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a11c8d26a50bfab49002947d3d237abe4d9e4b5bdc8846a63537b6488e197808", size = 2066678, upload-time = "2025-04-23T18:33:12.224Z" }, - { url = "https://files.pythonhosted.org/packages/7b/27/d4ae6487d73948d6f20dddcd94be4ea43e74349b56eba82e9bdee2d7494c/pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:dd14041875d09cc0f9308e37a6f8b65f5585cf2598a53aa0123df8b129d481f8", size = 2025200, upload-time = "2025-04-23T18:33:14.199Z" }, - { url = "https://files.pythonhosted.org/packages/f1/b8/b3cb95375f05d33801024079b9392a5ab45267a63400bf1866e7ce0f0de4/pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d87c561733f66531dced0da6e864f44ebf89a8fba55f31407b00c2f7f9449593", size = 1859123, upload-time = "2025-04-23T18:33:16.555Z" }, - { url = "https://files.pythonhosted.org/packages/05/bc/0d0b5adeda59a261cd30a1235a445bf55c7e46ae44aea28f7bd6ed46e091/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f82865531efd18d6e07a04a17331af02cb7a651583c418df8266f17a63c6612", size = 1892852, upload-time = "2025-04-23T18:33:18.513Z" }, - { url = "https://files.pythonhosted.org/packages/3e/11/d37bdebbda2e449cb3f519f6ce950927b56d62f0b84fd9cb9e372a26a3d5/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bfb5112df54209d820d7bf9317c7a6c9025ea52e49f46b6a2060104bba37de7", size = 2067484, upload-time = "2025-04-23T18:33:20.475Z" }, - { url = "https://files.pythonhosted.org/packages/8c/55/1f95f0a05ce72ecb02a8a8a1c3be0579bbc29b1d5ab68f1378b7bebc5057/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:64632ff9d614e5eecfb495796ad51b0ed98c453e447a76bcbeeb69615079fc7e", size = 2108896, upload-time = "2025-04-23T18:33:22.501Z" }, - { url = "https://files.pythonhosted.org/packages/53/89/2b2de6c81fa131f423246a9109d7b2a375e83968ad0800d6e57d0574629b/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f889f7a40498cc077332c7ab6b4608d296d852182211787d4f3ee377aaae66e8", size = 2069475, upload-time = "2025-04-23T18:33:24.528Z" }, - { url = "https://files.pythonhosted.org/packages/b8/e9/1f7efbe20d0b2b10f6718944b5d8ece9152390904f29a78e68d4e7961159/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:de4b83bb311557e439b9e186f733f6c645b9417c84e2eb8203f3f820a4b988bf", size = 2239013, upload-time = "2025-04-23T18:33:26.621Z" }, - { url = "https://files.pythonhosted.org/packages/3c/b2/5309c905a93811524a49b4e031e9851a6b00ff0fb668794472ea7746b448/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:82f68293f055f51b51ea42fafc74b6aad03e70e191799430b90c13d643059ebb", size = 2238715, upload-time = "2025-04-23T18:33:28.656Z" }, - { url = "https://files.pythonhosted.org/packages/32/56/8a7ca5d2cd2cda1d245d34b1c9a942920a718082ae8e54e5f3e5a58b7add/pydantic_core-2.33.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1", size = 2066757, upload-time = "2025-04-23T18:33:30.645Z" }, - { url = "https://files.pythonhosted.org/packages/08/98/dbf3fdfabaf81cda5622154fda78ea9965ac467e3239078e0dcd6df159e7/pydantic_core-2.33.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:87acbfcf8e90ca885206e98359d7dca4bcbb35abdc0ff66672a293e1d7a19101", size = 2024034, upload-time = "2025-04-23T18:33:32.843Z" }, - { url = "https://files.pythonhosted.org/packages/8d/99/7810aa9256e7f2ccd492590f86b79d370df1e9292f1f80b000b6a75bd2fb/pydantic_core-2.33.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:7f92c15cd1e97d4b12acd1cc9004fa092578acfa57b67ad5e43a197175d01a64", size = 1858578, upload-time = "2025-04-23T18:33:34.912Z" }, - { url = "https://files.pythonhosted.org/packages/d8/60/bc06fa9027c7006cc6dd21e48dbf39076dc39d9abbaf718a1604973a9670/pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3f26877a748dc4251cfcfda9dfb5f13fcb034f5308388066bcfe9031b63ae7d", size = 1892858, upload-time = "2025-04-23T18:33:36.933Z" }, - { url = "https://files.pythonhosted.org/packages/f2/40/9d03997d9518816c68b4dfccb88969756b9146031b61cd37f781c74c9b6a/pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac89aea9af8cd672fa7b510e7b8c33b0bba9a43186680550ccf23020f32d535", size = 2068498, upload-time = "2025-04-23T18:33:38.997Z" }, - { url = "https://files.pythonhosted.org/packages/d8/62/d490198d05d2d86672dc269f52579cad7261ced64c2df213d5c16e0aecb1/pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:970919794d126ba8645f3837ab6046fb4e72bbc057b3709144066204c19a455d", size = 2108428, upload-time = "2025-04-23T18:33:41.18Z" }, - { url = "https://files.pythonhosted.org/packages/9a/ec/4cd215534fd10b8549015f12ea650a1a973da20ce46430b68fc3185573e8/pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3eb3fe62804e8f859c49ed20a8451342de53ed764150cb14ca71357c765dc2a6", size = 2069854, upload-time = "2025-04-23T18:33:43.446Z" }, - { url = "https://files.pythonhosted.org/packages/1a/1a/abbd63d47e1d9b0d632fee6bb15785d0889c8a6e0a6c3b5a8e28ac1ec5d2/pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:3abcd9392a36025e3bd55f9bd38d908bd17962cc49bc6da8e7e96285336e2bca", size = 2237859, upload-time = "2025-04-23T18:33:45.56Z" }, - { url = "https://files.pythonhosted.org/packages/80/1c/fa883643429908b1c90598fd2642af8839efd1d835b65af1f75fba4d94fe/pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:3a1c81334778f9e3af2f8aeb7a960736e5cab1dfebfb26aabca09afd2906c039", size = 2239059, upload-time = "2025-04-23T18:33:47.735Z" }, - { url = "https://files.pythonhosted.org/packages/d4/29/3cade8a924a61f60ccfa10842f75eb12787e1440e2b8660ceffeb26685e7/pydantic_core-2.33.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2807668ba86cb38c6817ad9bc66215ab8584d1d304030ce4f0887336f28a5e27", size = 2066661, upload-time = "2025-04-23T18:33:49.995Z" }, ] [[package]] @@ -588,33 +281,11 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, ] -[[package]] -name = "pytauri" -version = "0.8.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, - { name = "importlib-metadata" }, - { name = "pillow" }, - { name = "pydantic" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/cc/4b/5dfba4c317436b5882e5446e66504cb6d06594f338ff9cced3ace9b71aa1/pytauri-0.8.0.tar.gz", hash = "sha256:e172f08c6afd46b8b772f951082456356cfb6e3b192379d9557ede9699ac24c2", size = 40400, upload-time = "2025-09-01T09:25:16.525Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/15/2679cf676f1c621a9decbf79abfa33891b9d7882d9bcd24751b5e554a095/pytauri-0.8.0-py3-none-any.whl", hash = "sha256:e7dc9b21f5ecf081b1e2751abf788792c8804cb3b2637de2b2d0b11a04794174", size = 62559, upload-time = "2025-09-01T09:25:15.428Z" }, -] - [[package]] name = "pywin32" version = "311" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/40/44efbb0dfbd33aca6a6483191dae0716070ed99e2ecb0c53683f400a0b4f/pywin32-311-cp310-cp310-win32.whl", hash = "sha256:d03ff496d2a0cd4a5893504789d4a15399133fe82517455e78bad62efbb7f0a3", size = 8760432, upload-time = "2025-07-14T20:13:05.9Z" }, - { url = "https://files.pythonhosted.org/packages/5e/bf/360243b1e953bd254a82f12653974be395ba880e7ec23e3731d9f73921cc/pywin32-311-cp310-cp310-win_amd64.whl", hash = "sha256:797c2772017851984b97180b0bebe4b620bb86328e8a884bb626156295a63b3b", size = 9590103, upload-time = "2025-07-14T20:13:07.698Z" }, - { url = "https://files.pythonhosted.org/packages/57/38/d290720e6f138086fb3d5ffe0b6caa019a791dd57866940c82e4eeaf2012/pywin32-311-cp310-cp310-win_arm64.whl", hash = "sha256:0502d1facf1fed4839a9a51ccbcc63d952cf318f78ffc00a7e78528ac27d7a2b", size = 8778557, upload-time = "2025-07-14T20:13:11.11Z" }, - { url = "https://files.pythonhosted.org/packages/7c/af/449a6a91e5d6db51420875c54f6aff7c97a86a3b13a0b4f1a5c13b988de3/pywin32-311-cp311-cp311-win32.whl", hash = "sha256:184eb5e436dea364dcd3d2316d577d625c0351bf237c4e9a5fabbcfa5a58b151", size = 8697031, upload-time = "2025-07-14T20:13:13.266Z" }, - { url = "https://files.pythonhosted.org/packages/51/8f/9bb81dd5bb77d22243d33c8397f09377056d5c687aa6d4042bea7fbf8364/pywin32-311-cp311-cp311-win_amd64.whl", hash = "sha256:3ce80b34b22b17ccbd937a6e78e7225d80c52f5ab9940fe0506a1a16f3dab503", size = 9508308, upload-time = "2025-07-14T20:13:15.147Z" }, - { url = "https://files.pythonhosted.org/packages/44/7b/9c2ab54f74a138c491aba1b1cd0795ba61f144c711daea84a88b63dc0f6c/pywin32-311-cp311-cp311-win_arm64.whl", hash = "sha256:a733f1388e1a842abb67ffa8e7aad0e70ac519e09b0f6a784e65a136ec7cefd2", size = 8703930, upload-time = "2025-07-14T20:13:16.945Z" }, { url = "https://files.pythonhosted.org/packages/e7/ab/01ea1943d4eba0f850c3c61e78e8dd59757ff815ff3ccd0a84de5f541f42/pywin32-311-cp312-cp312-win32.whl", hash = "sha256:750ec6e621af2b948540032557b10a2d43b0cee2ae9758c54154d711cc852d31", size = 8706543, upload-time = "2025-07-14T20:13:20.765Z" }, { url = "https://files.pythonhosted.org/packages/d1/a8/a0e8d07d4d051ec7502cd58b291ec98dcc0c3fff027caad0470b72cfcc2f/pywin32-311-cp312-cp312-win_amd64.whl", hash = "sha256:b8c095edad5c211ff31c05223658e71bf7116daa0ecf3ad85f3201ea3190d067", size = 9495040, upload-time = "2025-07-14T20:13:22.543Z" }, { url = "https://files.pythonhosted.org/packages/ba/3a/2ae996277b4b50f17d61f0603efd8253cb2d79cc7ae159468007b586396d/pywin32-311-cp312-cp312-win_arm64.whl", hash = "sha256:e286f46a9a39c4a18b319c28f59b61de793654af2f395c102b4f819e584b5852", size = 8710102, upload-time = "2025-07-14T20:13:24.682Z" }, @@ -624,9 +295,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c9/31/097f2e132c4f16d99a22bfb777e0fd88bd8e1c634304e102f313af69ace5/pywin32-311-cp314-cp314-win32.whl", hash = "sha256:b7a2c10b93f8986666d0c803ee19b5990885872a7de910fc460f9b0c2fbf92ee", size = 8840714, upload-time = "2025-07-14T20:13:32.449Z" }, { url = "https://files.pythonhosted.org/packages/90/4b/07c77d8ba0e01349358082713400435347df8426208171ce297da32c313d/pywin32-311-cp314-cp314-win_amd64.whl", hash = "sha256:3aca44c046bd2ed8c90de9cb8427f581c479e594e99b5c0bb19b29c10fd6cb87", size = 9656800, upload-time = "2025-07-14T20:13:34.312Z" }, { url = "https://files.pythonhosted.org/packages/c0/d2/21af5c535501a7233e734b8af901574572da66fcc254cb35d0609c9080dd/pywin32-311-cp314-cp314-win_arm64.whl", hash = "sha256:a508e2d9025764a8270f93111a970e1d0fbfc33f4153b388bb649b7eec4f9b42", size = 8932540, upload-time = "2025-07-14T20:13:36.379Z" }, - { url = "https://files.pythonhosted.org/packages/59/42/b86689aac0cdaee7ae1c58d464b0ff04ca909c19bb6502d4973cdd9f9544/pywin32-311-cp39-cp39-win32.whl", hash = "sha256:aba8f82d551a942cb20d4a83413ccbac30790b50efb89a75e4f586ac0bb8056b", size = 8760837, upload-time = "2025-07-14T20:12:59.59Z" }, - { url = "https://files.pythonhosted.org/packages/9f/8a/1403d0353f8c5a2f0829d2b1c4becbf9da2f0a4d040886404fc4a5431e4d/pywin32-311-cp39-cp39-win_amd64.whl", hash = "sha256:e0c4cfb0621281fe40387df582097fd796e80430597cb9944f0ae70447bacd91", size = 9590187, upload-time = "2025-07-14T20:13:01.419Z" }, - { url = "https://files.pythonhosted.org/packages/60/22/e0e8d802f124772cec9c75430b01a212f86f9de7546bda715e54140d5aeb/pywin32-311-cp39-cp39-win_arm64.whl", hash = "sha256:62ea666235135fee79bb154e695f3ff67370afefd71bd7fea7512fc70ef31e3d", size = 8778162, upload-time = "2025-07-14T20:13:03.544Z" }, ] [[package]] @@ -635,24 +303,6 @@ version = "6.0.3" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227, upload-time = "2025-09-25T21:31:46.04Z" }, - { url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019, upload-time = "2025-09-25T21:31:47.706Z" }, - { url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646, upload-time = "2025-09-25T21:31:49.21Z" }, - { url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793, upload-time = "2025-09-25T21:31:50.735Z" }, - { url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293, upload-time = "2025-09-25T21:31:51.828Z" }, - { url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872, upload-time = "2025-09-25T21:31:53.282Z" }, - { url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828, upload-time = "2025-09-25T21:31:54.807Z" }, - { url = "https://files.pythonhosted.org/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", size = 142415, upload-time = "2025-09-25T21:31:55.885Z" }, - { url = "https://files.pythonhosted.org/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", size = 158561, upload-time = "2025-09-25T21:31:57.406Z" }, - { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" }, - { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" }, - { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" }, - { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" }, - { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" }, - { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" }, - { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" }, - { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" }, - { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" }, { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, @@ -691,15 +341,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, - { url = "https://files.pythonhosted.org/packages/9f/62/67fc8e68a75f738c9200422bf65693fb79a4cd0dc5b23310e5202e978090/pyyaml-6.0.3-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da", size = 184450, upload-time = "2025-09-25T21:33:00.618Z" }, - { url = "https://files.pythonhosted.org/packages/ae/92/861f152ce87c452b11b9d0977952259aa7df792d71c1053365cc7b09cc08/pyyaml-6.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917", size = 174319, upload-time = "2025-09-25T21:33:02.086Z" }, - { url = "https://files.pythonhosted.org/packages/d0/cd/f0cfc8c74f8a030017a2b9c771b7f47e5dd702c3e28e5b2071374bda2948/pyyaml-6.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9", size = 737631, upload-time = "2025-09-25T21:33:03.25Z" }, - { url = "https://files.pythonhosted.org/packages/ef/b2/18f2bd28cd2055a79a46c9b0895c0b3d987ce40ee471cecf58a1a0199805/pyyaml-6.0.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5", size = 836795, upload-time = "2025-09-25T21:33:05.014Z" }, - { url = "https://files.pythonhosted.org/packages/73/b9/793686b2d54b531203c160ef12bec60228a0109c79bae6c1277961026770/pyyaml-6.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a", size = 750767, upload-time = "2025-09-25T21:33:06.398Z" }, - { url = "https://files.pythonhosted.org/packages/a9/86/a137b39a611def2ed78b0e66ce2fe13ee701a07c07aebe55c340ed2a050e/pyyaml-6.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926", size = 727982, upload-time = "2025-09-25T21:33:08.708Z" }, - { url = "https://files.pythonhosted.org/packages/dd/62/71c27c94f457cf4418ef8ccc71735324c549f7e3ea9d34aba50874563561/pyyaml-6.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7", size = 755677, upload-time = "2025-09-25T21:33:09.876Z" }, - { url = "https://files.pythonhosted.org/packages/29/3d/6f5e0d58bd924fb0d06c3a6bad00effbdae2de5adb5cda5648006ffbd8d3/pyyaml-6.0.3-cp39-cp39-win32.whl", hash = "sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0", size = 142592, upload-time = "2025-09-25T21:33:10.983Z" }, - { url = "https://files.pythonhosted.org/packages/f0/0c/25113e0b5e103d7f1490c0e947e303fe4a696c10b501dea7a9f49d4e876c/pyyaml-6.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007", size = 158777, upload-time = "2025-09-25T21:33:15.55Z" }, ] [[package]] @@ -714,79 +355,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3c/26/1062c7ec1b053db9e499b4d2d5bc231743201b74051c973dadeac80a8f43/questionary-2.1.1-py3-none-any.whl", hash = "sha256:a51af13f345f1cdea62347589fbb6df3b290306ab8930713bfae4d475a7d4a59", size = 36753, upload-time = "2025-08-28T19:00:19.56Z" }, ] -[[package]] -name = "setuptools" -version = "80.9.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958, upload-time = "2025-05-27T00:56:51.443Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486, upload-time = "2025-05-27T00:56:49.664Z" }, -] - -[[package]] -name = "setuptools-scm" -version = "8.3.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "importlib-metadata", marker = "python_full_version < '3.10'" }, - { name = "packaging" }, - { name = "setuptools" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, - { name = "typing-extensions", marker = "python_full_version < '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b9/19/7ae64b70b2429c48c3a7a4ed36f50f94687d3bfcd0ae2f152367b6410dff/setuptools_scm-8.3.1.tar.gz", hash = "sha256:3d555e92b75dacd037d32bafdf94f97af51ea29ae8c7b234cf94b7a5bd242a63", size = 78088, upload-time = "2025-04-23T11:53:19.739Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ab/ac/8f96ba9b4cfe3e4ea201f23f4f97165862395e9331a424ed325ae37024a8/setuptools_scm-8.3.1-py3-none-any.whl", hash = "sha256:332ca0d43791b818b841213e76b1971b7711a960761c5bea5fc5cdb5196fbce3", size = 43935, upload-time = "2025-04-23T11:53:17.922Z" }, -] - -[[package]] -name = "sniffio" -version = "1.3.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, -] - -[[package]] -name = "tomli" -version = "2.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", size = 17175, upload-time = "2024-11-27T22:38:36.873Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/43/ca/75707e6efa2b37c77dadb324ae7d9571cb424e61ea73fad7c56c2d14527f/tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", size = 131077, upload-time = "2024-11-27T22:37:54.956Z" }, - { url = "https://files.pythonhosted.org/packages/c7/16/51ae563a8615d472fdbffc43a3f3d46588c264ac4f024f63f01283becfbb/tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", size = 123429, upload-time = "2024-11-27T22:37:56.698Z" }, - { url = "https://files.pythonhosted.org/packages/f1/dd/4f6cd1e7b160041db83c694abc78e100473c15d54620083dbd5aae7b990e/tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", size = 226067, upload-time = "2024-11-27T22:37:57.63Z" }, - { url = "https://files.pythonhosted.org/packages/a9/6b/c54ede5dc70d648cc6361eaf429304b02f2871a345bbdd51e993d6cdf550/tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", size = 236030, upload-time = "2024-11-27T22:37:59.344Z" }, - { url = "https://files.pythonhosted.org/packages/1f/47/999514fa49cfaf7a92c805a86c3c43f4215621855d151b61c602abb38091/tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", size = 240898, upload-time = "2024-11-27T22:38:00.429Z" }, - { url = "https://files.pythonhosted.org/packages/73/41/0a01279a7ae09ee1573b423318e7934674ce06eb33f50936655071d81a24/tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", size = 229894, upload-time = "2024-11-27T22:38:02.094Z" }, - { url = "https://files.pythonhosted.org/packages/55/18/5d8bc5b0a0362311ce4d18830a5d28943667599a60d20118074ea1b01bb7/tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", size = 245319, upload-time = "2024-11-27T22:38:03.206Z" }, - { url = "https://files.pythonhosted.org/packages/92/a3/7ade0576d17f3cdf5ff44d61390d4b3febb8a9fc2b480c75c47ea048c646/tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", size = 238273, upload-time = "2024-11-27T22:38:04.217Z" }, - { url = "https://files.pythonhosted.org/packages/72/6f/fa64ef058ac1446a1e51110c375339b3ec6be245af9d14c87c4a6412dd32/tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", size = 98310, upload-time = "2024-11-27T22:38:05.908Z" }, - { url = "https://files.pythonhosted.org/packages/6a/1c/4a2dcde4a51b81be3530565e92eda625d94dafb46dbeb15069df4caffc34/tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", size = 108309, upload-time = "2024-11-27T22:38:06.812Z" }, - { url = "https://files.pythonhosted.org/packages/52/e1/f8af4c2fcde17500422858155aeb0d7e93477a0d59a98e56cbfe75070fd0/tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", size = 132762, upload-time = "2024-11-27T22:38:07.731Z" }, - { url = "https://files.pythonhosted.org/packages/03/b8/152c68bb84fc00396b83e7bbddd5ec0bd3dd409db4195e2a9b3e398ad2e3/tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", size = 123453, upload-time = "2024-11-27T22:38:09.384Z" }, - { url = "https://files.pythonhosted.org/packages/c8/d6/fc9267af9166f79ac528ff7e8c55c8181ded34eb4b0e93daa767b8841573/tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", size = 233486, upload-time = "2024-11-27T22:38:10.329Z" }, - { url = "https://files.pythonhosted.org/packages/5c/51/51c3f2884d7bab89af25f678447ea7d297b53b5a3b5730a7cb2ef6069f07/tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", size = 242349, upload-time = "2024-11-27T22:38:11.443Z" }, - { url = "https://files.pythonhosted.org/packages/ab/df/bfa89627d13a5cc22402e441e8a931ef2108403db390ff3345c05253935e/tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", size = 252159, upload-time = "2024-11-27T22:38:13.099Z" }, - { url = "https://files.pythonhosted.org/packages/9e/6e/fa2b916dced65763a5168c6ccb91066f7639bdc88b48adda990db10c8c0b/tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", size = 237243, upload-time = "2024-11-27T22:38:14.766Z" }, - { url = "https://files.pythonhosted.org/packages/b4/04/885d3b1f650e1153cbb93a6a9782c58a972b94ea4483ae4ac5cedd5e4a09/tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", size = 259645, upload-time = "2024-11-27T22:38:15.843Z" }, - { url = "https://files.pythonhosted.org/packages/9c/de/6b432d66e986e501586da298e28ebeefd3edc2c780f3ad73d22566034239/tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", size = 244584, upload-time = "2024-11-27T22:38:17.645Z" }, - { url = "https://files.pythonhosted.org/packages/1c/9a/47c0449b98e6e7d1be6cbac02f93dd79003234ddc4aaab6ba07a9a7482e2/tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", size = 98875, upload-time = "2024-11-27T22:38:19.159Z" }, - { url = "https://files.pythonhosted.org/packages/ef/60/9b9638f081c6f1261e2688bd487625cd1e660d0a85bd469e91d8db969734/tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", size = 109418, upload-time = "2024-11-27T22:38:20.064Z" }, - { url = "https://files.pythonhosted.org/packages/04/90/2ee5f2e0362cb8a0b6499dc44f4d7d48f8fff06d28ba46e6f1eaa61a1388/tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7", size = 132708, upload-time = "2024-11-27T22:38:21.659Z" }, - { url = "https://files.pythonhosted.org/packages/c0/ec/46b4108816de6b385141f082ba99e315501ccd0a2ea23db4a100dd3990ea/tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", size = 123582, upload-time = "2024-11-27T22:38:22.693Z" }, - { url = "https://files.pythonhosted.org/packages/a0/bd/b470466d0137b37b68d24556c38a0cc819e8febe392d5b199dcd7f578365/tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", size = 232543, upload-time = "2024-11-27T22:38:24.367Z" }, - { url = "https://files.pythonhosted.org/packages/d9/e5/82e80ff3b751373f7cead2815bcbe2d51c895b3c990686741a8e56ec42ab/tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", size = 241691, upload-time = "2024-11-27T22:38:26.081Z" }, - { url = "https://files.pythonhosted.org/packages/05/7e/2a110bc2713557d6a1bfb06af23dd01e7dde52b6ee7dadc589868f9abfac/tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", size = 251170, upload-time = "2024-11-27T22:38:27.921Z" }, - { url = "https://files.pythonhosted.org/packages/64/7b/22d713946efe00e0adbcdfd6d1aa119ae03fd0b60ebed51ebb3fa9f5a2e5/tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", size = 236530, upload-time = "2024-11-27T22:38:29.591Z" }, - { url = "https://files.pythonhosted.org/packages/38/31/3a76f67da4b0cf37b742ca76beaf819dca0ebef26d78fc794a576e08accf/tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", size = 258666, upload-time = "2024-11-27T22:38:30.639Z" }, - { url = "https://files.pythonhosted.org/packages/07/10/5af1293da642aded87e8a988753945d0cf7e00a9452d3911dd3bb354c9e2/tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", size = 243954, upload-time = "2024-11-27T22:38:31.702Z" }, - { url = "https://files.pythonhosted.org/packages/5b/b9/1ed31d167be802da0fc95020d04cd27b7d7065cc6fbefdd2f9186f60d7bd/tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec", size = 98724, upload-time = "2024-11-27T22:38:32.837Z" }, - { url = "https://files.pythonhosted.org/packages/c7/32/b0963458706accd9afcfeb867c0f9175a741bf7b19cd424230714d722198/tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69", size = 109383, upload-time = "2024-11-27T22:38:34.455Z" }, - { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257, upload-time = "2024-11-27T22:38:35.385Z" }, -] - [[package]] name = "typing-extensions" version = "4.14.1" @@ -816,12 +384,3 @@ sdist = { url = "https://files.pythonhosted.org/packages/24/30/6b0809f4510673dc7 wheels = [ { url = "https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1", size = 37286, upload-time = "2025-09-22T16:29:51.641Z" }, ] - -[[package]] -name = "zipp" -version = "3.21.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3f/50/bad581df71744867e9468ebd0bcd6505de3b275e06f202c2cb016e3ff56f/zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4", size = 24545, upload-time = "2024-11-10T15:05:20.202Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/1a/7e4798e9339adc931158c9d69ecc34f5e6791489d469f5e50ec15e35f458/zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931", size = 9630, upload-time = "2024-11-10T15:05:19.275Z" }, -] From 7804a131c10c4a370c36c258c743baa184554bf4 Mon Sep 17 00:00:00 2001 From: ISOR3X Date: Wed, 24 Dec 2025 15:31:49 +0100 Subject: [PATCH 06/16] feat: update questionnaire --- pyproject.toml | 5 +++ src/create_pytauri_app/__init__.py | 32 ++++++++++--------- src/create_pytauri_app/prompting.py | 41 +++++++++++++------------ src/create_pytauri_app/questionnaire.py | 19 ++++++------ src/create_pytauri_app/utils.py | 40 ++++++++++++++++++++++++ uv.lock | 34 ++++++++++++++++++++ 6 files changed, 127 insertions(+), 44 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 125eedc..a42e9ec 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,3 +22,8 @@ dependencies = [ [build-system] requires = ["uv_build>=0.9.2,<0.10.0"] build-backend = "uv_build" + +[dependency-groups] +dev = [ + "ruff>=0.14.10", +] diff --git a/src/create_pytauri_app/__init__.py b/src/create_pytauri_app/__init__.py index 11d6045..1bfcf0a 100644 --- a/src/create_pytauri_app/__init__.py +++ b/src/create_pytauri_app/__init__.py @@ -1,17 +1,16 @@ -from create_pytauri_app.utils import get_project_root import shutil -from pathlib import Path from copier import run_copy -from create_pytauri_app.prompting import ask, choose +from create_pytauri_app.prompting import choose from create_pytauri_app.questionnaire import Answer, ask_info +from create_pytauri_app.utils import construct_finish_msg, get_project_root -def get_info(ask: bool = False) -> Answer: +def get_info(use_fake: bool = False) -> Answer: info = ( ask_info() - if ask + if use_fake else Answer( project_name="pytauri-app", identifier="com.username.pytauri-app", @@ -26,13 +25,14 @@ def get_info(ask: bool = False) -> Answer: def main(): - TEMPLATE_DIR = get_project_root() / "templates" - OUTPUT_DIR = get_project_root() / ".generated_template" + output_dir = get_project_root() / ".generated_template" + + template_dir = get_project_root() / "templates" + tauri_dir = template_dir / "_base_" / "src-tauri" info = get_info() - project_dir = OUTPUT_DIR / info.project_name - print(project_dir) + project_dir = output_dir / info.project_name # Clean up old templates to ensure a new, clean one. if project_dir.exists() and choose("Directory is not empty, delete?"): @@ -40,15 +40,14 @@ def main(): project_dir.mkdir() - frontend_dir = TEMPLATE_DIR / f"template-{info.frontend_template_full}" - tauri_dir = TEMPLATE_DIR / "_base_" / "src-tauri" + frontend_template_dir = template_dir / f"template-{info.frontend_template_full}" # Copy over frontend run_copy( - str(frontend_dir), + str(frontend_template_dir), str(project_dir), vcs_ref="HEAD", - data=info.to_dict(), + data=info.model_dump(), quiet=True, ) @@ -57,9 +56,12 @@ def main(): str(tauri_dir), str(project_dir / "src-tauri"), vcs_ref="HEAD", - data=info.to_dict(), quiet=True, + data=info.model_dump(), ) # Copy over assets - # ... + asset_dir = "static" if info.frontend_template == "svelte" else "public" + run_copy(str(template_dir / "_assets_"), str(project_dir / asset_dir), quiet=True) + + print(construct_finish_msg(info)) diff --git a/src/create_pytauri_app/prompting.py b/src/create_pytauri_app/prompting.py index 70de381..4c22718 100644 --- a/src/create_pytauri_app/prompting.py +++ b/src/create_pytauri_app/prompting.py @@ -89,7 +89,9 @@ def read_key_windows(): elif ch == b"\x03": # Ctrl-C return "ctrl-c" - return ch.decode("utf-8", errors="ignore") + # Decode and return the character + char = ch.decode("utf-8", errors="ignore") + return char.lower() if char else None def read_key_unix(): @@ -114,7 +116,7 @@ def read_key_unix(): elif ch == "\x03": # Ctrl-C return "ctrl-c" - return ch + return ch.lower() if ch else None finally: termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) @@ -152,25 +154,29 @@ def choose(question: str, default: bool = False) -> bool: """ Ask a yes/no question. Returns True for yes, False for no. + Press 'y' for yes, 'n' for no, or Enter for default. """ suffix = " [Y/n]" if default else " [y/N]" - prompt = format_question(question + suffix) + prompt = format_question(question + colored(suffix, Color.DIM)) - answer = input(prompt).strip().lower() + # Print the prompt + sys.stdout.write(prompt) + sys.stdout.flush() # Write directly - # Determine the result - if answer == "": - result = default - elif answer in ("y", "yes"): - result = True - elif answer in ("n", "no"): - result = False - else: - # Invalid input, use default - result = default + while True: + key = read_key() + if key == "y": + result = True + break + elif key == "n": + result = False + break + elif key == "enter": + result = default + break - # Move cursor up one line and clear it - sys.stdout.write(Command.MOVE_UP.value) + # Move cursor to beginning of the line and clear it + sys.stdout.write("\r") sys.stdout.write(Command.CLEAR_LINE.value) # Print final result @@ -225,6 +231,3 @@ def render(): print(format_answer(question, answer.label or answer.value.capitalize())) return answer.value - elif key == "ctrl-c": - sys.stdout.write("\n") - sys.exit(0) diff --git a/src/create_pytauri_app/questionnaire.py b/src/create_pytauri_app/questionnaire.py index eb78125..3dd4893 100644 --- a/src/create_pytauri_app/questionnaire.py +++ b/src/create_pytauri_app/questionnaire.py @@ -2,11 +2,12 @@ from pathlib import Path from typing import Literal +from pydantic import BaseModel, computed_field + from .prompting import Choice, ask, choose, select -@dataclass -class Answer: +class Answer(BaseModel): project_name: str identifier: str frontend_lang: Literal["js", "py"] @@ -14,19 +15,17 @@ class Answer: frontend_template: str use_rust: bool + @computed_field @property def package_name(self) -> str: return self.project_name.replace("-", "_") + @computed_field @property - def frontend_template_full(self): - frontend_template = self.frontend_template - if self.frontend_lang == "js": - frontend_template += "-ts" if self.frontend_flavor == "ts" else "" - return frontend_template - - def to_dict(self): - return {k: str(v) for k, v in asdict(self).items()} + def frontend_template_full(self) -> str: + if self.frontend_lang == "js" and self.frontend_flavor == "ts": + return f"{self.frontend_template}-ts" + return self.frontend_template def ask_info() -> Answer: diff --git a/src/create_pytauri_app/utils.py b/src/create_pytauri_app/utils.py index a2627cc..446a9fa 100644 --- a/src/create_pytauri_app/utils.py +++ b/src/create_pytauri_app/utils.py @@ -1,5 +1,45 @@ +import platform from pathlib import Path +from create_pytauri_app.questionnaire import Answer + def get_project_root(): return Path(__file__).parent.parent.parent + + +def construct_finish_msg(info: Answer) -> str: + msg = "Template created! To get started, run:\n" + cmds = [ + f"cd {info.project_name}", + "pnpm install", + ] + if info.use_rust: + cmds.append( + "uv --python-preference only-system", + ) + + else: + cmds.append( + "pnpm build", + ) + + if platform.system() == "Windows": + cmds.append(r".venv\Scripts\activate") + else: + cmds.append(r"source .venv/bin/activate") + + cmds.append("uv sync") + + msg += "\n".join(f" {cmd}" for cmd in cmds) + + if info.use_rust: + dev_start_msg = "\nFor development, run:\n" + dev_cmd = " pnpm tauri dev" + else: + dev_start_msg = "" + dev_cmd = f" python -m {info.package_name}" + + msg += "\n" + dev_start_msg + dev_cmd + + return msg diff --git a/uv.lock b/uv.lock index a1e9945..2c53263 100644 --- a/uv.lock +++ b/uv.lock @@ -52,9 +52,17 @@ dependencies = [ { name = "copier" }, ] +[package.dev-dependencies] +dev = [ + { name = "ruff" }, +] + [package.metadata] requires-dist = [{ name = "copier", specifier = ">=9.10.3" }] +[package.metadata.requires-dev] +dev = [{ name = "ruff", specifier = ">=0.14.10" }] + [[package]] name = "dunamai" version = "1.25.0" @@ -355,6 +363,32 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3c/26/1062c7ec1b053db9e499b4d2d5bc231743201b74051c973dadeac80a8f43/questionary-2.1.1-py3-none-any.whl", hash = "sha256:a51af13f345f1cdea62347589fbb6df3b290306ab8930713bfae4d475a7d4a59", size = 36753, upload-time = "2025-08-28T19:00:19.56Z" }, ] +[[package]] +name = "ruff" +version = "0.14.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/08/52232a877978dd8f9cf2aeddce3e611b40a63287dfca29b6b8da791f5e8d/ruff-0.14.10.tar.gz", hash = "sha256:9a2e830f075d1a42cd28420d7809ace390832a490ed0966fe373ba288e77aaf4", size = 5859763, upload-time = "2025-12-18T19:28:57.98Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/01/933704d69f3f05ee16ef11406b78881733c186fe14b6a46b05cfcaf6d3b2/ruff-0.14.10-py3-none-linux_armv6l.whl", hash = "sha256:7a3ce585f2ade3e1f29ec1b92df13e3da262178df8c8bdf876f48fa0e8316c49", size = 13527080, upload-time = "2025-12-18T19:29:25.642Z" }, + { url = "https://files.pythonhosted.org/packages/df/58/a0349197a7dfa603ffb7f5b0470391efa79ddc327c1e29c4851e85b09cc5/ruff-0.14.10-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:674f9be9372907f7257c51f1d4fc902cb7cf014b9980152b802794317941f08f", size = 13797320, upload-time = "2025-12-18T19:29:02.571Z" }, + { url = "https://files.pythonhosted.org/packages/7b/82/36be59f00a6082e38c23536df4e71cdbc6af8d7c707eade97fcad5c98235/ruff-0.14.10-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d85713d522348837ef9df8efca33ccb8bd6fcfc86a2cde3ccb4bc9d28a18003d", size = 12918434, upload-time = "2025-12-18T19:28:51.202Z" }, + { url = "https://files.pythonhosted.org/packages/a6/00/45c62a7f7e34da92a25804f813ebe05c88aa9e0c25e5cb5a7d23dd7450e3/ruff-0.14.10-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6987ebe0501ae4f4308d7d24e2d0fe3d7a98430f5adfd0f1fead050a740a3a77", size = 13371961, upload-time = "2025-12-18T19:29:04.991Z" }, + { url = "https://files.pythonhosted.org/packages/40/31/a5906d60f0405f7e57045a70f2d57084a93ca7425f22e1d66904769d1628/ruff-0.14.10-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:16a01dfb7b9e4eee556fbfd5392806b1b8550c9b4a9f6acd3dbe6812b193c70a", size = 13275629, upload-time = "2025-12-18T19:29:21.381Z" }, + { url = "https://files.pythonhosted.org/packages/3e/60/61c0087df21894cf9d928dc04bcd4fb10e8b2e8dca7b1a276ba2155b2002/ruff-0.14.10-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7165d31a925b7a294465fa81be8c12a0e9b60fb02bf177e79067c867e71f8b1f", size = 14029234, upload-time = "2025-12-18T19:29:00.132Z" }, + { url = "https://files.pythonhosted.org/packages/44/84/77d911bee3b92348b6e5dab5a0c898d87084ea03ac5dc708f46d88407def/ruff-0.14.10-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:c561695675b972effb0c0a45db233f2c816ff3da8dcfbe7dfc7eed625f218935", size = 15449890, upload-time = "2025-12-18T19:28:53.573Z" }, + { url = "https://files.pythonhosted.org/packages/e9/36/480206eaefa24a7ec321582dda580443a8f0671fdbf6b1c80e9c3e93a16a/ruff-0.14.10-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4bb98fcbbc61725968893682fd4df8966a34611239c9fd07a1f6a07e7103d08e", size = 15123172, upload-time = "2025-12-18T19:29:23.453Z" }, + { url = "https://files.pythonhosted.org/packages/5c/38/68e414156015ba80cef5473d57919d27dfb62ec804b96180bafdeaf0e090/ruff-0.14.10-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f24b47993a9d8cb858429e97bdf8544c78029f09b520af615c1d261bf827001d", size = 14460260, upload-time = "2025-12-18T19:29:27.808Z" }, + { url = "https://files.pythonhosted.org/packages/b3/19/9e050c0dca8aba824d67cc0db69fb459c28d8cd3f6855b1405b3f29cc91d/ruff-0.14.10-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59aabd2e2c4fd614d2862e7939c34a532c04f1084476d6833dddef4afab87e9f", size = 14229978, upload-time = "2025-12-18T19:29:11.32Z" }, + { url = "https://files.pythonhosted.org/packages/51/eb/e8dd1dd6e05b9e695aa9dd420f4577debdd0f87a5ff2fedda33c09e9be8c/ruff-0.14.10-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:213db2b2e44be8625002dbea33bb9c60c66ea2c07c084a00d55732689d697a7f", size = 14338036, upload-time = "2025-12-18T19:29:09.184Z" }, + { url = "https://files.pythonhosted.org/packages/6a/12/f3e3a505db7c19303b70af370d137795fcfec136d670d5de5391e295c134/ruff-0.14.10-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:b914c40ab64865a17a9a5b67911d14df72346a634527240039eb3bd650e5979d", size = 13264051, upload-time = "2025-12-18T19:29:13.431Z" }, + { url = "https://files.pythonhosted.org/packages/08/64/8c3a47eaccfef8ac20e0484e68e0772013eb85802f8a9f7603ca751eb166/ruff-0.14.10-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:1484983559f026788e3a5c07c81ef7d1e97c1c78ed03041a18f75df104c45405", size = 13283998, upload-time = "2025-12-18T19:29:06.994Z" }, + { url = "https://files.pythonhosted.org/packages/12/84/534a5506f4074e5cc0529e5cd96cfc01bb480e460c7edf5af70d2bcae55e/ruff-0.14.10-py3-none-musllinux_1_2_i686.whl", hash = "sha256:c70427132db492d25f982fffc8d6c7535cc2fd2c83fc8888f05caaa248521e60", size = 13601891, upload-time = "2025-12-18T19:28:55.811Z" }, + { url = "https://files.pythonhosted.org/packages/0d/1e/14c916087d8598917dbad9b2921d340f7884824ad6e9c55de948a93b106d/ruff-0.14.10-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:5bcf45b681e9f1ee6445d317ce1fa9d6cba9a6049542d1c3d5b5958986be8830", size = 14336660, upload-time = "2025-12-18T19:29:16.531Z" }, + { url = "https://files.pythonhosted.org/packages/f2/1c/d7b67ab43f30013b47c12b42d1acd354c195351a3f7a1d67f59e54227ede/ruff-0.14.10-py3-none-win32.whl", hash = "sha256:104c49fc7ab73f3f3a758039adea978869a918f31b73280db175b43a2d9b51d6", size = 13196187, upload-time = "2025-12-18T19:29:19.006Z" }, + { url = "https://files.pythonhosted.org/packages/fb/9c/896c862e13886fae2af961bef3e6312db9ebc6adc2b156fe95e615dee8c1/ruff-0.14.10-py3-none-win_amd64.whl", hash = "sha256:466297bd73638c6bdf06485683e812db1c00c7ac96d4ddd0294a338c62fdc154", size = 14661283, upload-time = "2025-12-18T19:29:30.16Z" }, + { url = "https://files.pythonhosted.org/packages/74/31/b0e29d572670dca3674eeee78e418f20bdf97fa8aa9ea71380885e175ca0/ruff-0.14.10-py3-none-win_arm64.whl", hash = "sha256:e51d046cf6dda98a4633b8a8a771451107413b0f07183b2bef03f075599e44e6", size = 13729839, upload-time = "2025-12-18T19:28:48.636Z" }, +] + [[package]] name = "typing-extensions" version = "4.14.1" From 91bb723729eed6f865bfd0496fe6e7c2609f67a7 Mon Sep 17 00:00:00 2001 From: ISOR3X Date: Wed, 24 Dec 2025 15:41:12 +0100 Subject: [PATCH 07/16] chore: update entrypoint --- scripts/create_copy.py | 72 ++++++++++++++++++++----- src/create_pytauri_app/__init__.py | 24 ++------- src/create_pytauri_app/questionnaire.py | 1 - 3 files changed, 63 insertions(+), 34 deletions(-) diff --git a/scripts/create_copy.py b/scripts/create_copy.py index 5ec44a5..1bfcf0a 100644 --- a/scripts/create_copy.py +++ b/scripts/create_copy.py @@ -1,21 +1,67 @@ import shutil -from pathlib import Path from copier import run_copy -if __name__ == "__main__": - TEMPLATE_DIR = Path(__file__).parent.parent - OUTPUT_DIR = Path(__file__).parent.parent / ".generated_template" / "pytauri-app" +from create_pytauri_app.prompting import choose +from create_pytauri_app.questionnaire import Answer, ask_info +from create_pytauri_app.utils import construct_finish_msg, get_project_root - kwargs = { - # "project_name": "pytauri-app", - "identifier": "com.username.pytauri-app", - "template": "vue", - "with_rust": "false", - } + +def get_info(use_fake: bool = False) -> Answer: + info = ( + ask_info() + if use_fake + else Answer( + project_name="pytauri-app", + identifier="com.username.pytauri-app", + frontend_lang="js", + frontend_flavor="ts", + frontend_template="vue", + use_rust=True, + ) + ) + + return info + + +def main(): + output_dir = get_project_root() / ".generated_template" + + template_dir = get_project_root() / "templates" + tauri_dir = template_dir / "_base_" / "src-tauri" + + info = get_info() + + project_dir = output_dir / info.project_name # Clean up old templates to ensure a new, clean one. - if OUTPUT_DIR.exists(): - shutil.rmtree(OUTPUT_DIR) + if project_dir.exists() and choose("Directory is not empty, delete?"): + shutil.rmtree(project_dir) + + project_dir.mkdir() + + frontend_template_dir = template_dir / f"template-{info.frontend_template_full}" + + # Copy over frontend + run_copy( + str(frontend_template_dir), + str(project_dir), + vcs_ref="HEAD", + data=info.model_dump(), + quiet=True, + ) + + # Copy over src-tauri + run_copy( + str(tauri_dir), + str(project_dir / "src-tauri"), + vcs_ref="HEAD", + quiet=True, + data=info.model_dump(), + ) + + # Copy over assets + asset_dir = "static" if info.frontend_template == "svelte" else "public" + run_copy(str(template_dir / "_assets_"), str(project_dir / asset_dir), quiet=True) - run_copy(str(TEMPLATE_DIR), str(OUTPUT_DIR), vcs_ref="HEAD", data=kwargs) + print(construct_finish_msg(info)) diff --git a/src/create_pytauri_app/__init__.py b/src/create_pytauri_app/__init__.py index 1bfcf0a..526d76c 100644 --- a/src/create_pytauri_app/__init__.py +++ b/src/create_pytauri_app/__init__.py @@ -1,36 +1,20 @@ import shutil +from pathlib import Path from copier import run_copy from create_pytauri_app.prompting import choose -from create_pytauri_app.questionnaire import Answer, ask_info +from create_pytauri_app.questionnaire import ask_info from create_pytauri_app.utils import construct_finish_msg, get_project_root -def get_info(use_fake: bool = False) -> Answer: - info = ( - ask_info() - if use_fake - else Answer( - project_name="pytauri-app", - identifier="com.username.pytauri-app", - frontend_lang="js", - frontend_flavor="ts", - frontend_template="vue", - use_rust=True, - ) - ) - - return info - - def main(): - output_dir = get_project_root() / ".generated_template" + output_dir = Path(".") template_dir = get_project_root() / "templates" tauri_dir = template_dir / "_base_" / "src-tauri" - info = get_info() + info = ask_info() project_dir = output_dir / info.project_name diff --git a/src/create_pytauri_app/questionnaire.py b/src/create_pytauri_app/questionnaire.py index 3dd4893..1eef183 100644 --- a/src/create_pytauri_app/questionnaire.py +++ b/src/create_pytauri_app/questionnaire.py @@ -1,4 +1,3 @@ -from dataclasses import asdict, dataclass from pathlib import Path from typing import Literal From 599d9d055f52ed2a6319b7a88e9a5d68e4a9063b Mon Sep 17 00:00:00 2001 From: ISOR3X Date: Wed, 24 Dec 2025 15:46:55 +0100 Subject: [PATCH 08/16] chore: add uv script entrypoint --- pyproject.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index a42e9ec..e523ddf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,6 +19,9 @@ dependencies = [ # "setuptools-scm >= 8", ] +[project.scripts] +create-pytauri-app = "create_pytauri_app:main" + [build-system] requires = ["uv_build>=0.9.2,<0.10.0"] build-backend = "uv_build" From 0adad213361dfcc1809b86ef0b68869b354a7712 Mon Sep 17 00:00:00 2001 From: ISOR3X Date: Wed, 24 Dec 2025 15:58:53 +0100 Subject: [PATCH 09/16] chore: update README.md --- README.md | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 607f7aa..22644ad 100644 --- a/README.md +++ b/README.md @@ -6,12 +6,18 @@ The recommended way to start a new PyTauri project. ## How to use -Make sure you have [uv](https://docs.astral.sh/uv/) and [pnpm](https://pnpm.io/) installed. +Make sure you have [uv](https://docs.astral.sh/uv/) installed. + +For single use: ```shell -uvx copier copy https://github.com/pytauri/create-pytauri-app . +uvx --from git+https://github.com/pytauri/create-pytauri-app@feat/v0.6.0 create-pytauri-app ``` -## Refer +To install the tool (allows usage from anywhere) + +```shell +uv tool install git+https://github.com/pytauri/create-pytauri-app@feat/v0.6.0 +``` -- +More info on using tools in uv: https://docs.astral.sh/uv/guides/tools From 89871741b61ebb671045c3f1b9a42abf4b170cf5 Mon Sep 17 00:00:00 2001 From: ISOR3X Date: Wed, 24 Dec 2025 16:50:22 +0100 Subject: [PATCH 10/16] feat: split template files - Added back wheel template code - Moved common code to _common_ - Added workspace for wheel --- src/create_pytauri_app/__init__.py | 53 ++++++++++++++---- src/create_pytauri_app/utils.py | 2 +- .../capabilities/default.json | 0 .../{src-tauri => _common_}/icons/128x128.png | Bin .../icons/128x128@2x.png | Bin .../{src-tauri => _common_}/icons/32x32.png | Bin .../icons/Square107x107Logo.png | Bin .../icons/Square142x142Logo.png | Bin .../icons/Square150x150Logo.png | Bin .../icons/Square284x284Logo.png | Bin .../icons/Square30x30Logo.png | Bin .../icons/Square310x310Logo.png | Bin .../icons/Square44x44Logo.png | Bin .../icons/Square71x71Logo.png | Bin .../icons/Square89x89Logo.png | Bin .../icons/StoreLogo.png | Bin .../{src-tauri => _common_}/icons/icon.icns | Bin .../{src-tauri => _common_}/icons/icon.ico | Bin .../{src-tauri => _common_}/icons/icon.png | Bin .../tauri.conf.json.jinja | 0 .../py.typed => _python_/.gitignore} | 0 templates/_base_/_python_/README.md | 0 templates/_base_/_python_/package.json.jinja | 7 +++ templates/_base_/_python_/pnpm-workspace.yaml | 2 + .../_base_/_python_/pyproject.toml.jinja | 19 +++++++ .../src}/{{ package_name }}/__init__.py | 7 +-- .../src}/{{ package_name }}/__main__.py.jinja | 0 .../_python_/src/{{ package_name }}/py.typed | 0 templates/_base_/_rust_/.gitignore | 27 +++++++++ templates/_base_/_rust_/Cargo.toml | 18 ++++++ templates/_base_/_rust_/pyproject.toml | 30 ++++++++++ templates/_base_/_rust_/scripts/README.md | 7 +++ .../_base_/_rust_/scripts/linux/build.sh | 23 ++++++++ .../_rust_/scripts/linux/download-py.sh | 19 +++++++ .../_base_/_rust_/scripts/macos/build.sh | 23 ++++++++ .../_rust_/scripts/macos/download-py.sh | 23 ++++++++ .../_base_/_rust_/scripts/windows/build.ps1 | 15 +++++ .../_rust_/scripts/windows/download-py.ps1 | 22 ++++++++ .../_base_/{ => _rust_}/src-tauri/.gitignore | 0 .../_base_/{ => _rust_}/src-tauri/.taurignore | 0 .../{ => _rust_}/src-tauri/Cargo.toml.jinja | 0 .../_base_/{ => _rust_}/src-tauri/build.rs | 0 .../src-tauri/pyproject.toml.jinja | 0 .../src-python/{{ package_name }}/__init__.py | 27 +++++++++ .../{{ package_name }}/__main__.py.jinja | 14 +++++ .../src-python/{{ package_name }}/py.typed | 0 .../_base_/{ => _rust_}/src-tauri/src/lib.rs | 0 .../{ => _rust_}/src-tauri/src/main.rs.jinja | 0 .../{ => _rust_}/src-tauri/tauri.bundle.json | 0 49 files changed, 320 insertions(+), 18 deletions(-) rename templates/_base_/{src-tauri => _common_}/capabilities/default.json (100%) rename templates/_base_/{src-tauri => _common_}/icons/128x128.png (100%) rename templates/_base_/{src-tauri => _common_}/icons/128x128@2x.png (100%) rename templates/_base_/{src-tauri => _common_}/icons/32x32.png (100%) rename templates/_base_/{src-tauri => _common_}/icons/Square107x107Logo.png (100%) rename templates/_base_/{src-tauri => _common_}/icons/Square142x142Logo.png (100%) rename templates/_base_/{src-tauri => _common_}/icons/Square150x150Logo.png (100%) rename templates/_base_/{src-tauri => _common_}/icons/Square284x284Logo.png (100%) rename templates/_base_/{src-tauri => _common_}/icons/Square30x30Logo.png (100%) rename templates/_base_/{src-tauri => _common_}/icons/Square310x310Logo.png (100%) rename templates/_base_/{src-tauri => _common_}/icons/Square44x44Logo.png (100%) rename templates/_base_/{src-tauri => _common_}/icons/Square71x71Logo.png (100%) rename templates/_base_/{src-tauri => _common_}/icons/Square89x89Logo.png (100%) rename templates/_base_/{src-tauri => _common_}/icons/StoreLogo.png (100%) rename templates/_base_/{src-tauri => _common_}/icons/icon.icns (100%) rename templates/_base_/{src-tauri => _common_}/icons/icon.ico (100%) rename templates/_base_/{src-tauri => _common_}/icons/icon.png (100%) rename templates/_base_/{src-tauri => _common_}/tauri.conf.json.jinja (100%) rename templates/_base_/{src-tauri/src-python/{{ package_name }}/py.typed => _python_/.gitignore} (100%) create mode 100644 templates/_base_/_python_/README.md create mode 100644 templates/_base_/_python_/package.json.jinja create mode 100644 templates/_base_/_python_/pnpm-workspace.yaml create mode 100644 templates/_base_/_python_/pyproject.toml.jinja rename templates/_base_/{src-tauri/src-python => _python_/src}/{{ package_name }}/__init__.py (86%) rename templates/_base_/{src-tauri/src-python => _python_/src}/{{ package_name }}/__main__.py.jinja (100%) create mode 100644 templates/_base_/_python_/src/{{ package_name }}/py.typed create mode 100644 templates/_base_/_rust_/.gitignore create mode 100644 templates/_base_/_rust_/Cargo.toml create mode 100644 templates/_base_/_rust_/pyproject.toml create mode 100644 templates/_base_/_rust_/scripts/README.md create mode 100644 templates/_base_/_rust_/scripts/linux/build.sh create mode 100644 templates/_base_/_rust_/scripts/linux/download-py.sh create mode 100644 templates/_base_/_rust_/scripts/macos/build.sh create mode 100644 templates/_base_/_rust_/scripts/macos/download-py.sh create mode 100644 templates/_base_/_rust_/scripts/windows/build.ps1 create mode 100644 templates/_base_/_rust_/scripts/windows/download-py.ps1 rename templates/_base_/{ => _rust_}/src-tauri/.gitignore (100%) rename templates/_base_/{ => _rust_}/src-tauri/.taurignore (100%) rename templates/_base_/{ => _rust_}/src-tauri/Cargo.toml.jinja (100%) rename templates/_base_/{ => _rust_}/src-tauri/build.rs (100%) rename templates/_base_/{ => _rust_}/src-tauri/pyproject.toml.jinja (100%) create mode 100644 templates/_base_/_rust_/src-tauri/src-python/{{ package_name }}/__init__.py create mode 100644 templates/_base_/_rust_/src-tauri/src-python/{{ package_name }}/__main__.py.jinja create mode 100644 templates/_base_/_rust_/src-tauri/src-python/{{ package_name }}/py.typed rename templates/_base_/{ => _rust_}/src-tauri/src/lib.rs (100%) rename templates/_base_/{ => _rust_}/src-tauri/src/main.rs.jinja (100%) rename templates/_base_/{ => _rust_}/src-tauri/tauri.bundle.json (100%) diff --git a/src/create_pytauri_app/__init__.py b/src/create_pytauri_app/__init__.py index 526d76c..827b33f 100644 --- a/src/create_pytauri_app/__init__.py +++ b/src/create_pytauri_app/__init__.py @@ -9,10 +9,10 @@ def main(): - output_dir = Path(".") + # output_dir = Path(".") + output_dir = get_project_root() / ".generated_template" template_dir = get_project_root() / "templates" - tauri_dir = template_dir / "_base_" / "src-tauri" info = ask_info() @@ -26,26 +26,55 @@ def main(): frontend_template_dir = template_dir / f"template-{info.frontend_template_full}" + frontend_dir = project_dir if info.use_rust else project_dir / "app" + # Copy over frontend run_copy( str(frontend_template_dir), - str(project_dir), + str(frontend_dir), vcs_ref="HEAD", data=info.model_dump(), quiet=True, ) - # Copy over src-tauri - run_copy( - str(tauri_dir), - str(project_dir / "src-tauri"), - vcs_ref="HEAD", - quiet=True, - data=info.model_dump(), - ) + # Copy over backend + if info.use_rust: + # Copy over rust + run_copy( + str(template_dir / "_base_" / "_rust_"), + str(project_dir), + vcs_ref="HEAD", + quiet=True, + data=info.model_dump(), + ) + # Copy over common + run_copy( + str(template_dir / "_base_" / "_common_"), + str(project_dir / "src-tauri" / info.package_name), + vcs_ref="HEAD", + quiet=True, + data=info.model_dump(), + ) + else: + # Copy over python + run_copy( + str(template_dir / "_base_" / "_python_"), + str(project_dir), + vcs_ref="HEAD", + quiet=True, + data=info.model_dump(), + ) + # Copy over common + run_copy( + str(template_dir / "_base_" / "_common_"), + str(project_dir / "src" / info.package_name / "tauri"), + vcs_ref="HEAD", + quiet=True, + data=info.model_dump(), + ) # Copy over assets asset_dir = "static" if info.frontend_template == "svelte" else "public" - run_copy(str(template_dir / "_assets_"), str(project_dir / asset_dir), quiet=True) + run_copy(str(template_dir / "_assets_"), str(frontend_dir / asset_dir), quiet=True) print(construct_finish_msg(info)) diff --git a/src/create_pytauri_app/utils.py b/src/create_pytauri_app/utils.py index 446a9fa..6df43ad 100644 --- a/src/create_pytauri_app/utils.py +++ b/src/create_pytauri_app/utils.py @@ -9,7 +9,7 @@ def get_project_root(): def construct_finish_msg(info: Answer) -> str: - msg = "Template created! To get started, run:\n" + msg = "\nTemplate created! To get started, run:\n" cmds = [ f"cd {info.project_name}", "pnpm install", diff --git a/templates/_base_/src-tauri/capabilities/default.json b/templates/_base_/_common_/capabilities/default.json similarity index 100% rename from templates/_base_/src-tauri/capabilities/default.json rename to templates/_base_/_common_/capabilities/default.json diff --git a/templates/_base_/src-tauri/icons/128x128.png b/templates/_base_/_common_/icons/128x128.png similarity index 100% rename from templates/_base_/src-tauri/icons/128x128.png rename to templates/_base_/_common_/icons/128x128.png diff --git a/templates/_base_/src-tauri/icons/128x128@2x.png b/templates/_base_/_common_/icons/128x128@2x.png similarity index 100% rename from templates/_base_/src-tauri/icons/128x128@2x.png rename to templates/_base_/_common_/icons/128x128@2x.png diff --git a/templates/_base_/src-tauri/icons/32x32.png b/templates/_base_/_common_/icons/32x32.png similarity index 100% rename from templates/_base_/src-tauri/icons/32x32.png rename to templates/_base_/_common_/icons/32x32.png diff --git a/templates/_base_/src-tauri/icons/Square107x107Logo.png b/templates/_base_/_common_/icons/Square107x107Logo.png similarity index 100% rename from templates/_base_/src-tauri/icons/Square107x107Logo.png rename to templates/_base_/_common_/icons/Square107x107Logo.png diff --git a/templates/_base_/src-tauri/icons/Square142x142Logo.png b/templates/_base_/_common_/icons/Square142x142Logo.png similarity index 100% rename from templates/_base_/src-tauri/icons/Square142x142Logo.png rename to templates/_base_/_common_/icons/Square142x142Logo.png diff --git a/templates/_base_/src-tauri/icons/Square150x150Logo.png b/templates/_base_/_common_/icons/Square150x150Logo.png similarity index 100% rename from templates/_base_/src-tauri/icons/Square150x150Logo.png rename to templates/_base_/_common_/icons/Square150x150Logo.png diff --git a/templates/_base_/src-tauri/icons/Square284x284Logo.png b/templates/_base_/_common_/icons/Square284x284Logo.png similarity index 100% rename from templates/_base_/src-tauri/icons/Square284x284Logo.png rename to templates/_base_/_common_/icons/Square284x284Logo.png diff --git a/templates/_base_/src-tauri/icons/Square30x30Logo.png b/templates/_base_/_common_/icons/Square30x30Logo.png similarity index 100% rename from templates/_base_/src-tauri/icons/Square30x30Logo.png rename to templates/_base_/_common_/icons/Square30x30Logo.png diff --git a/templates/_base_/src-tauri/icons/Square310x310Logo.png b/templates/_base_/_common_/icons/Square310x310Logo.png similarity index 100% rename from templates/_base_/src-tauri/icons/Square310x310Logo.png rename to templates/_base_/_common_/icons/Square310x310Logo.png diff --git a/templates/_base_/src-tauri/icons/Square44x44Logo.png b/templates/_base_/_common_/icons/Square44x44Logo.png similarity index 100% rename from templates/_base_/src-tauri/icons/Square44x44Logo.png rename to templates/_base_/_common_/icons/Square44x44Logo.png diff --git a/templates/_base_/src-tauri/icons/Square71x71Logo.png b/templates/_base_/_common_/icons/Square71x71Logo.png similarity index 100% rename from templates/_base_/src-tauri/icons/Square71x71Logo.png rename to templates/_base_/_common_/icons/Square71x71Logo.png diff --git a/templates/_base_/src-tauri/icons/Square89x89Logo.png b/templates/_base_/_common_/icons/Square89x89Logo.png similarity index 100% rename from templates/_base_/src-tauri/icons/Square89x89Logo.png rename to templates/_base_/_common_/icons/Square89x89Logo.png diff --git a/templates/_base_/src-tauri/icons/StoreLogo.png b/templates/_base_/_common_/icons/StoreLogo.png similarity index 100% rename from templates/_base_/src-tauri/icons/StoreLogo.png rename to templates/_base_/_common_/icons/StoreLogo.png diff --git a/templates/_base_/src-tauri/icons/icon.icns b/templates/_base_/_common_/icons/icon.icns similarity index 100% rename from templates/_base_/src-tauri/icons/icon.icns rename to templates/_base_/_common_/icons/icon.icns diff --git a/templates/_base_/src-tauri/icons/icon.ico b/templates/_base_/_common_/icons/icon.ico similarity index 100% rename from templates/_base_/src-tauri/icons/icon.ico rename to templates/_base_/_common_/icons/icon.ico diff --git a/templates/_base_/src-tauri/icons/icon.png b/templates/_base_/_common_/icons/icon.png similarity index 100% rename from templates/_base_/src-tauri/icons/icon.png rename to templates/_base_/_common_/icons/icon.png diff --git a/templates/_base_/src-tauri/tauri.conf.json.jinja b/templates/_base_/_common_/tauri.conf.json.jinja similarity index 100% rename from templates/_base_/src-tauri/tauri.conf.json.jinja rename to templates/_base_/_common_/tauri.conf.json.jinja diff --git a/templates/_base_/src-tauri/src-python/{{ package_name }}/py.typed b/templates/_base_/_python_/.gitignore similarity index 100% rename from templates/_base_/src-tauri/src-python/{{ package_name }}/py.typed rename to templates/_base_/_python_/.gitignore diff --git a/templates/_base_/_python_/README.md b/templates/_base_/_python_/README.md new file mode 100644 index 0000000..e69de29 diff --git a/templates/_base_/_python_/package.json.jinja b/templates/_base_/_python_/package.json.jinja new file mode 100644 index 0000000..db365d0 --- /dev/null +++ b/templates/_base_/_python_/package.json.jinja @@ -0,0 +1,7 @@ +{ + "name": "{{ package_name }}", + "private": true, + "version": "0.1.0", + "type": "module", + "packageManager": "pnpm@10.24.0" +} diff --git a/templates/_base_/_python_/pnpm-workspace.yaml b/templates/_base_/_python_/pnpm-workspace.yaml new file mode 100644 index 0000000..e9ecf5c --- /dev/null +++ b/templates/_base_/_python_/pnpm-workspace.yaml @@ -0,0 +1,2 @@ +packages: + - "app" diff --git a/templates/_base_/_python_/pyproject.toml.jinja b/templates/_base_/_python_/pyproject.toml.jinja new file mode 100644 index 0000000..b442404 --- /dev/null +++ b/templates/_base_/_python_/pyproject.toml.jinja @@ -0,0 +1,19 @@ +[project] +name = "{{ project_name }}" +version = "0.1.0" +description = "Add your description here" +readme = "README.md" +authors = [ + { name = "ISOR3X", email = "isorex@icloud.com" } +] +requires-python = ">=3.12" +dependencies = [ + "pytauri == 0.8.*", + "pydantic == 2.*", + "anyio == 4.*", + "pytauri-wheel == 0.8.*", +] + +[build-system] +requires = ["uv_build>=0.9.2,<0.10.0"] +build-backend = "uv_build" diff --git a/templates/_base_/src-tauri/src-python/{{ package_name }}/__init__.py b/templates/_base_/_python_/src/{{ package_name }}/__init__.py similarity index 86% rename from templates/_base_/src-tauri/src-python/{{ package_name }}/__init__.py rename to templates/_base_/_python_/src/{{ package_name }}/__init__.py index acbe437..9681ee9 100644 --- a/templates/_base_/src-tauri/src-python/{{ package_name }}/__init__.py +++ b/templates/_base_/_python_/src/{{ package_name }}/__init__.py @@ -2,11 +2,8 @@ from anyio.from_thread import start_blocking_portal from pydantic import BaseModel -from pytauri import ( - Commands, - builder_factory, - context_factory, -) +from pytauri import Commands +from pytauri_wheel.lib import builder_factory, context_factory commands: Commands = Commands() diff --git a/templates/_base_/src-tauri/src-python/{{ package_name }}/__main__.py.jinja b/templates/_base_/_python_/src/{{ package_name }}/__main__.py.jinja similarity index 100% rename from templates/_base_/src-tauri/src-python/{{ package_name }}/__main__.py.jinja rename to templates/_base_/_python_/src/{{ package_name }}/__main__.py.jinja diff --git a/templates/_base_/_python_/src/{{ package_name }}/py.typed b/templates/_base_/_python_/src/{{ package_name }}/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/templates/_base_/_rust_/.gitignore b/templates/_base_/_rust_/.gitignore new file mode 100644 index 0000000..6d65b50 --- /dev/null +++ b/templates/_base_/_rust_/.gitignore @@ -0,0 +1,27 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +/.venv/ +/target/ diff --git a/templates/_base_/_rust_/Cargo.toml b/templates/_base_/_rust_/Cargo.toml new file mode 100644 index 0000000..b1df28e --- /dev/null +++ b/templates/_base_/_rust_/Cargo.toml @@ -0,0 +1,18 @@ +[workspace] +members = ["src-tauri"] +resolver = "2" + +[workspace.package] +version = "0.1.0" +edition = "2021" + + +[profile.release] +lto = "thin" + +# See: +[profile.bundle-dev] +inherits = "dev" + +[profile.bundle-release] +inherits = "release" diff --git a/templates/_base_/_rust_/pyproject.toml b/templates/_base_/_rust_/pyproject.toml new file mode 100644 index 0000000..8588fb8 --- /dev/null +++ b/templates/_base_/_rust_/pyproject.toml @@ -0,0 +1,30 @@ +[project] +name = "workspace" +version = "0.1.0" +requires-python = ">=3.9" +dependencies = [] + +[dependency-groups] +dev = ["pytauri-project"] + +[tool.uv.workspace] +members = ["src-tauri"] + +[tool.uv.sources] +pytauri-project = { workspace = true } + + +[tool.pyright] +# See: +# ref: +exclude = [ + "**/node_modules", + "**/__pycache__", + "**/dist", + "**/.*", + "**/pyembed", + # 👇 necessary, because when `tauri-cli bundles python, + # it will copy `pyembed` to the target directory (i.e., rust output dir). + "**/target", + # 👆 +] diff --git a/templates/_base_/_rust_/scripts/README.md b/templates/_base_/_rust_/scripts/README.md new file mode 100644 index 0000000..ae38e46 --- /dev/null +++ b/templates/_base_/_rust_/scripts/README.md @@ -0,0 +1,7 @@ +# Build Standalone App + +> ref: + +1. Use `download-py` to download `python-build-standalone` (only needed for the first build). + You can modify `download-py` to customize the required Python version. +2. Use `build` to build the app. diff --git a/templates/_base_/_rust_/scripts/linux/build.sh b/templates/_base_/_rust_/scripts/linux/build.sh new file mode 100644 index 0000000..01ff062 --- /dev/null +++ b/templates/_base_/_rust_/scripts/linux/build.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +set -e + +cd "$(dirname "$0")/../.." + +PROJECT_NAME="pytauri-project" +PYLIB_DIR="$(realpath src-tauri/pyembed/python/lib)" + +export PYTAURI_STANDALONE="1" +export PYO3_PYTHON="$(realpath src-tauri/pyembed/python/bin/python3)" +export RUSTFLAGS=" \ + -C link-arg=-Wl,-rpath,\$ORIGIN/../lib/$PROJECT_NAME/lib \ + -L $PYLIB_DIR" + +uv pip install \ + --exact \ + --compile-bytecode \ + --python="$PYO3_PYTHON" \ + --reinstall-package="$PROJECT_NAME" \ + ./src-tauri + +pnpm tauri build --config="src-tauri/tauri.bundle.json" -- --profile bundle-release diff --git a/templates/_base_/_rust_/scripts/linux/download-py.sh b/templates/_base_/_rust_/scripts/linux/download-py.sh new file mode 100644 index 0000000..7372e45 --- /dev/null +++ b/templates/_base_/_rust_/scripts/linux/download-py.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +### Argument ### + +PYTHON_VERSION="3.13.7" # update these by yourself +TAG="20250828" # update these by yourself +TARGET="x86_64-unknown-linux-gnu" + +################ + +set -e + +cd "$(dirname "$0")/../.." + +url="https://github.com/astral-sh/python-build-standalone/releases/download/${TAG}/cpython-${PYTHON_VERSION}+${TAG}-${TARGET}-install_only_stripped.tar.gz" + +DEST_DIR="src-tauri/pyembed" +mkdir "$DEST_DIR" +curl -L "$url" | tar -xz -C "$DEST_DIR" diff --git a/templates/_base_/_rust_/scripts/macos/build.sh b/templates/_base_/_rust_/scripts/macos/build.sh new file mode 100644 index 0000000..aeadb04 --- /dev/null +++ b/templates/_base_/_rust_/scripts/macos/build.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +set -e + +cd "$(dirname "$0")/../.." + +PROJECT_NAME="pytauri-project" +PYLIB_DIR="$(realpath src-tauri/pyembed/python/lib)" + +export PYTAURI_STANDALONE="1" +export PYO3_PYTHON="$(realpath src-tauri/pyembed/python/bin/python3)" +export RUSTFLAGS=" \ + -C link-arg=-Wl,-rpath,@executable_path/../Resources/lib \ + -L $PYLIB_DIR" + +uv pip install \ + --exact \ + --compile-bytecode \ + --python="$PYO3_PYTHON" \ + --reinstall-package="$PROJECT_NAME" \ + ./src-tauri + +pnpm tauri build --config="src-tauri/tauri.bundle.json" -- --profile bundle-release diff --git a/templates/_base_/_rust_/scripts/macos/download-py.sh b/templates/_base_/_rust_/scripts/macos/download-py.sh new file mode 100644 index 0000000..ef47c74 --- /dev/null +++ b/templates/_base_/_rust_/scripts/macos/download-py.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +### Argument ### + +PYTHON_VERSION="3.13.7" # update these by yourself +TAG="20250828" # update these by yourself +TARGET="aarch64-apple-darwin" + +################ + +set -e + +cd "$(dirname "$0")/../.." + +url="https://github.com/astral-sh/python-build-standalone/releases/download/${TAG}/cpython-${PYTHON_VERSION}+${TAG}-${TARGET}-install_only_stripped.tar.gz" + +DEST_DIR="src-tauri/pyembed" +mkdir "$DEST_DIR" +curl -L "$url" | tar -xz -C "$DEST_DIR" + +# ref: +python_major_minor="${PYTHON_VERSION%.*}" # "3.13.7" -> "3.13" +install_name_tool -id "@rpath/libpython$python_major_minor.dylib" "$DEST_DIR/python/lib/libpython$python_major_minor.dylib" diff --git a/templates/_base_/_rust_/scripts/windows/build.ps1 b/templates/_base_/_rust_/scripts/windows/build.ps1 new file mode 100644 index 0000000..192b2e3 --- /dev/null +++ b/templates/_base_/_rust_/scripts/windows/build.ps1 @@ -0,0 +1,15 @@ +Set-Location (Resolve-Path "$PSScriptRoot\..\..") + +$PROJECT_NAME = "pytauri-project" + +$env:PYTAURI_STANDALONE = "1" +$env:PYO3_PYTHON = (Resolve-Path -LiteralPath "src-tauri\pyembed\python\python.exe").Path + +uv.exe pip install ` + --exact ` + --compile-bytecode ` + --python="$env:PYO3_PYTHON" ` + --reinstall-package="$PROJECT_NAME" ` + .\src-tauri + +pnpm -- tauri build --config="src-tauri\tauri.bundle.json" -- --profile bundle-release diff --git a/templates/_base_/_rust_/scripts/windows/download-py.ps1 b/templates/_base_/_rust_/scripts/windows/download-py.ps1 new file mode 100644 index 0000000..e0a47cb --- /dev/null +++ b/templates/_base_/_rust_/scripts/windows/download-py.ps1 @@ -0,0 +1,22 @@ +### Argument ### + +$PYTHON_VERSION = "3.13.7" # update these by yourself +$TAG = "20250828" # update these by yourself +$TARGET = "x86_64-pc-windows-msvc" + +################ + +Set-Location (Resolve-Path "$PSScriptRoot\..\..") + +$url = "https://github.com/astral-sh/python-build-standalone/releases/download/${TAG}/cpython-${PYTHON_VERSION}+${TAG}-${TARGET}-install_only_stripped.tar.gz" + +$DEST_DIR = "src-tauri\pyembed" +$TEMP_FILE = ".python-standalone.tar.gz" +try { + curl.exe -L "$url" -o "$TEMP_FILE" + mkdir "$DEST_DIR" + tar.exe -xzf "$TEMP_FILE" -C "$DEST_DIR" +} +finally { + Remove-Item "$TEMP_FILE" +} diff --git a/templates/_base_/src-tauri/.gitignore b/templates/_base_/_rust_/src-tauri/.gitignore similarity index 100% rename from templates/_base_/src-tauri/.gitignore rename to templates/_base_/_rust_/src-tauri/.gitignore diff --git a/templates/_base_/src-tauri/.taurignore b/templates/_base_/_rust_/src-tauri/.taurignore similarity index 100% rename from templates/_base_/src-tauri/.taurignore rename to templates/_base_/_rust_/src-tauri/.taurignore diff --git a/templates/_base_/src-tauri/Cargo.toml.jinja b/templates/_base_/_rust_/src-tauri/Cargo.toml.jinja similarity index 100% rename from templates/_base_/src-tauri/Cargo.toml.jinja rename to templates/_base_/_rust_/src-tauri/Cargo.toml.jinja diff --git a/templates/_base_/src-tauri/build.rs b/templates/_base_/_rust_/src-tauri/build.rs similarity index 100% rename from templates/_base_/src-tauri/build.rs rename to templates/_base_/_rust_/src-tauri/build.rs diff --git a/templates/_base_/src-tauri/pyproject.toml.jinja b/templates/_base_/_rust_/src-tauri/pyproject.toml.jinja similarity index 100% rename from templates/_base_/src-tauri/pyproject.toml.jinja rename to templates/_base_/_rust_/src-tauri/pyproject.toml.jinja diff --git a/templates/_base_/_rust_/src-tauri/src-python/{{ package_name }}/__init__.py b/templates/_base_/_rust_/src-tauri/src-python/{{ package_name }}/__init__.py new file mode 100644 index 0000000..9681ee9 --- /dev/null +++ b/templates/_base_/_rust_/src-tauri/src-python/{{ package_name }}/__init__.py @@ -0,0 +1,27 @@ +import sys + +from anyio.from_thread import start_blocking_portal +from pydantic import BaseModel +from pytauri import Commands +from pytauri_wheel.lib import builder_factory, context_factory + +commands: Commands = Commands() + + +class Person(BaseModel): + name: str + + +@commands.command() +async def greet(body: Person) -> str: + return f"Hello, {body.name}! You've been greeted from Python {sys.version}!" + + +def main() -> int: + with start_blocking_portal("asyncio") as portal: # or `trio` + app = builder_factory().build( + context=context_factory(), + invoke_handler=commands.generate_handler(portal), + ) + exit_code = app.run_return() + return exit_code diff --git a/templates/_base_/_rust_/src-tauri/src-python/{{ package_name }}/__main__.py.jinja b/templates/_base_/_rust_/src-tauri/src-python/{{ package_name }}/__main__.py.jinja new file mode 100644 index 0000000..59dd5e7 --- /dev/null +++ b/templates/_base_/_rust_/src-tauri/src-python/{{ package_name }}/__main__.py.jinja @@ -0,0 +1,14 @@ +"""The main entry point for the Tauri app.""" + +import sys +from multiprocessing import freeze_support + +from {{ package_name }} import main + +# - If you don't use `multiprocessing`, you can remove this line. +# - If you do use `multiprocessing` but without this line, +# you will get endless spawn loop of your application process. +# See: . +freeze_support() + +sys.exit(main()) diff --git a/templates/_base_/_rust_/src-tauri/src-python/{{ package_name }}/py.typed b/templates/_base_/_rust_/src-tauri/src-python/{{ package_name }}/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/templates/_base_/src-tauri/src/lib.rs b/templates/_base_/_rust_/src-tauri/src/lib.rs similarity index 100% rename from templates/_base_/src-tauri/src/lib.rs rename to templates/_base_/_rust_/src-tauri/src/lib.rs diff --git a/templates/_base_/src-tauri/src/main.rs.jinja b/templates/_base_/_rust_/src-tauri/src/main.rs.jinja similarity index 100% rename from templates/_base_/src-tauri/src/main.rs.jinja rename to templates/_base_/_rust_/src-tauri/src/main.rs.jinja diff --git a/templates/_base_/src-tauri/tauri.bundle.json b/templates/_base_/_rust_/src-tauri/tauri.bundle.json similarity index 100% rename from templates/_base_/src-tauri/tauri.bundle.json rename to templates/_base_/_rust_/src-tauri/tauri.bundle.json From 35c3fa280a13d148211027a5e83ceb0b41929cb8 Mon Sep 17 00:00:00 2001 From: ISOR3X Date: Wed, 24 Dec 2025 16:55:27 +0100 Subject: [PATCH 11/16] chore: format --- .github/workflows/test.yaml | 62 ++++++------- CHANGELOG.md | 26 +++--- package.json | 23 ++--- pnpm-lock.yaml | 91 +++++++++++++++++++ pyproject.toml | 26 +++--- src/create_pytauri_app/__init__.py | 1 - src/create_pytauri_app/prompting.py | 2 +- src/create_pytauri_app/utils.py | 2 +- .../_base_/_common_/capabilities/default.json | 6 +- templates/_base_/_rust_/pyproject.toml | 18 ++-- templates/_base_/_rust_/scripts/README.md | 2 +- .../_base_/_rust_/src-tauri/tauri.bundle.json | 9 +- .../template-react-ts/.vscode/extensions.json | 2 +- templates/template-react-ts/src/App.css | 2 - .../template-vue-ts/.vscode/extensions.json | 2 +- 15 files changed, 173 insertions(+), 101 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 99c3a15..90b4acd 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -65,25 +65,25 @@ jobs: - name: Checkout uses: actions/checkout@v4 with: - fetch-depth: 0 # copier dont like shallow clone + fetch-depth: 0 # copier dont like shallow clone path: ${{ env.repo-dir }} - name: Install Copier run: pipx install copier -v - name: Generate project from template run: | - copier copy ${{ env.repo-dir }} . \ - --vcs-ref HEAD --force --defaults \ - --data project_name=${{ env.project-name }} \ - --data template=${{ matrix.template }} - shopt -s dotglob nullglob - mv ${{ env.project-name }}/* ./ - rmdir ${{ env.project-name }} - rm -rf ${{ env.repo-dir }} + copier copy ${{ env.repo-dir }} . \ + --vcs-ref HEAD --force --defaults \ + --data project_name=${{ env.project-name }} \ + --data template=${{ matrix.template }} + shopt -s dotglob nullglob + mv ${{ env.project-name }}/* ./ + rmdir ${{ env.project-name }} + rm -rf ${{ env.repo-dir }} - name: List files run: | - echo "PWD: $PWD" - echo "Files:" - find . + echo "PWD: $PWD" + echo "Files:" + find . - name: Upload generated project uses: actions/upload-artifact@v4 with: @@ -151,33 +151,33 @@ jobs: - name: Install system dependencies (ubuntu only) if: matrix.os == 'ubuntu-latest' run: | - sudo apt-get update - sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf + sudo apt-get update + sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf - name: Install project dependencies run: | - pnpm install - uv sync + pnpm install + uv sync - name: Test Building (Windows) if: matrix.os == 'windows-latest' shell: pwsh run: | - scripts\windows\download-py.ps1 - scripts\windows\build.ps1 + scripts\windows\download-py.ps1 + scripts\windows\build.ps1 - name: Test Building (Linux) if: matrix.os == 'ubuntu-latest' shell: bash run: | - chmod +x scripts/linux/*.sh - scripts/linux/download-py.sh - scripts/linux/build.sh + chmod +x scripts/linux/*.sh + scripts/linux/download-py.sh + scripts/linux/build.sh - name: Test Building (macOS) if: matrix.os == 'macos-latest' shell: bash run: | - chmod +x scripts/macos/*.sh - scripts/macos/download-py.sh - scripts/macos/build.sh + chmod +x scripts/macos/*.sh + scripts/macos/download-py.sh + scripts/macos/build.sh - name: Upload build artifacts uses: actions/upload-artifact@v4 @@ -189,13 +189,13 @@ jobs: # ``` # see: path: | - target/*/bundle/*/*.deb - target/*/bundle/*/*.rpm - target/*/bundle/*/*.AppImage - target/*/bundle/*/*.msi - target/*/bundle/*/*.exe - target/*/bundle/*/*.dmg - target/*/bundle/*/*.app/ + target/*/bundle/*/*.deb + target/*/bundle/*/*.rpm + target/*/bundle/*/*.AppImage + target/*/bundle/*/*.msi + target/*/bundle/*/*.exe + target/*/bundle/*/*.dmg + target/*/bundle/*/*.app/ if-no-files-found: error # https://github.com/marketplace/actions/alls-green#why diff --git a/CHANGELOG.md b/CHANGELOG.md index 591beba..61f7a33 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,24 +38,23 @@ Alternatively, you can modify it to suit your workflow. - [#22](https://github.com/pytauri/create-pytauri-app/pull/22) - fix(svelte): fix incorrect `frontendDist` path in svelte template. - The output directory for Svelte template has now been changed from `build` directory to `dist` directory to match the `build.frontendDist` setting in `tauri.conf.json`. + The output directory for Svelte template has now been changed from `build` directory to `dist` directory to match the `build.frontendDist` setting in `tauri.conf.json`. - [#20](https://github.com/pytauri/create-pytauri-app/pull/20) - fix: fix Linux and macOS build scripts. + - Pass the `libpython` path correctly on Linux and macOS as `-L` arguments to `RUSTFLAGS`. + - Temporarily disable `appimage` bundle target - - Pass the `libpython` path correctly on Linux and macOS as `-L` arguments to `RUSTFLAGS`. - - Temporarily disable `appimage` bundle target + Currently unable to build `appimage`, see . - Currently unable to build `appimage`, see . + - Change the default `identifier` to `com.username.{{ project_name }}` - - Change the default `identifier` to `com.username.{{ project_name }}` - - Tauri no longer recommends identifiers ending with `.app`, see . + Tauri no longer recommends identifiers ending with `.app`, see . ### Security - [#19](https://github.com/pytauri/create-pytauri-app/pull/19) - chore(deps-dev): bump vite from 6.3.5 to 6.3.6 in the npm_and_yarn group across 1 directory. - bump `vite` to `6.3.6` to fix security advisory. + bump `vite` to `6.3.6` to fix security advisory. ### Internal @@ -66,9 +65,8 @@ Alternatively, you can modify it to suit your workflow. ### Added - [#18](https://github.com/pytauri/create-pytauri-app/pull/18) - feat: bump `pytauri` to `v0.8`. - - - bump `pytauri` monorepo to `v0.8` - - bump `python-build-standard` to `20250828` + - bump `pytauri` monorepo to `v0.8` + - bump `python-build-standard` to `20250828` ### Changed @@ -97,9 +95,9 @@ Alternatively, you can modify it to suit your workflow. ### Changed - [#7](https://github.com/pytauri/create-pytauri-app/pull/7) - feat: update to pytauri `v0.6.0`. - - Bump all pytauri packages to `0.6` - - Migrate for pytauri `v0.6` [breaking changes](https://pytauri.github.io/pytauri/0.6/CHANGELOG/) - - Bump `pyo3` to `0.25` + - Bump all pytauri packages to `0.6` + - Migrate for pytauri `v0.6` [breaking changes](https://pytauri.github.io/pytauri/0.6/CHANGELOG/) + - Bump `pyo3` to `0.25` ## [0.1.0] diff --git a/package.json b/package.json index f662b1a..c9a0543 100644 --- a/package.json +++ b/package.json @@ -1,31 +1,32 @@ { "name": "create-pytauri-app", - "private": true, "version": "0.1.0", + "private": true, "type": "module", "scripts": {}, "dependencies": { - "vue": "^3.5.13", - "react": "^18.3.1", - "react-dom": "^18.3.1", "@tauri-apps/api": "^2", "@tauri-apps/plugin-opener": "^2", - "tauri-plugin-pytauri-api": "^0.8.0" + "react": "^18.3.1", + "react-dom": "^18.3.1", + "tauri-plugin-pytauri-api": "^0.8.0", + "vue": "^3.5.13" }, "devDependencies": { - "vue-tsc": "^2.1.10", - "@vitejs/plugin-vue": "^5.2.1", - "@types/react": "^18.3.1", - "@types/react-dom": "^18.3.1", - "@vitejs/plugin-react": "^4.3.4", "@sveltejs/adapter-static": "^3.0.6", "@sveltejs/kit": "^2.9.0", "@sveltejs/vite-plugin-svelte": "^5.0.0", + "@tauri-apps/cli": "^2", + "@types/react": "^18.3.1", + "@types/react-dom": "^18.3.1", + "@vitejs/plugin-react": "^4.3.4", + "@vitejs/plugin-vue": "^5.2.1", + "oxfmt": "^0.20.0", "svelte": "^5.0.0", "svelte-check": "^4.0.0", "typescript": "~5.6.2", "vite": "^6.3.6", - "@tauri-apps/cli": "^2" + "vue-tsc": "^2.1.10" }, "packageManager": "pnpm@10.11.1+sha256.211e9990148495c9fc30b7e58396f7eeda83d9243eb75407ea4f8650fb161f7c" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2fd55d9..2ae22fc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -51,6 +51,9 @@ importers: '@vitejs/plugin-vue': specifier: ^5.2.1 version: 5.2.4(vite@6.3.6)(vue@3.5.16(typescript@5.6.3)) + oxfmt: + specifier: ^0.20.0 + version: 0.20.0 svelte: specifier: ^5.0.0 version: 5.33.17 @@ -326,6 +329,46 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@oxfmt/darwin-arm64@0.20.0': + resolution: {integrity: sha512-bjR5dqvrd9gxKYfYR0ljUu3/T3+TuDVWcwA7d+tsfmx9lqidlw3zhgBTblnjF1mrd1zkPMoc5zzq86GeSEt1cA==} + cpu: [arm64] + os: [darwin] + + '@oxfmt/darwin-x64@0.20.0': + resolution: {integrity: sha512-esUDes8FlJX3IY4TVjFLgZrnZlIIyPDlhkCaHgGR3+z2eHFZOvQu68kTSpZLCEJmGXdSpU5rlveycQ6n8tk9ew==} + cpu: [x64] + os: [darwin] + + '@oxfmt/linux-arm64-gnu@0.20.0': + resolution: {integrity: sha512-irE0RO9B0R6ziQE6kUVZtZ6IuTdRyuumn1cPWhDfpa0XUa5sE0ly8pjVsvJbj/J9qerVtidU05txeXBB5CirQg==} + cpu: [arm64] + os: [linux] + + '@oxfmt/linux-arm64-musl@0.20.0': + resolution: {integrity: sha512-eXPBLwYJm26DCmwMwhelEwQMRwuGNaYhYZOhd+CYYsmVoF+h6L6dtjwj0Ovuu0Gqh18EL8vfsaoUvb+jr3vEBg==} + cpu: [arm64] + os: [linux] + + '@oxfmt/linux-x64-gnu@0.20.0': + resolution: {integrity: sha512-dTPW38Hjgb7LoD2mNgyQGBaJ1hu5YgPrxImhl5Eb04eiws+ETCM0wrb2TWGduA+Nv3rHKn3vZEkMTEjklZXgRw==} + cpu: [x64] + os: [linux] + + '@oxfmt/linux-x64-musl@0.20.0': + resolution: {integrity: sha512-b4duw9JGDK/kZoqrPNU9tBOOZQdUW8KJPZ7gW7z54X1eGSqCJ1PT0XLNmZ7SOA1BzQwQ0a3qmQWfFVOsH3a5bw==} + cpu: [x64] + os: [linux] + + '@oxfmt/win32-arm64@0.20.0': + resolution: {integrity: sha512-XAzvBhw4K+Fe16dBaFgYAdob9WaM8RYEXl0ibbm5NlNaQEq+5bH9xwc0oaYlHFnLfcgXWmn9ceTAYqNlONQRNA==} + cpu: [arm64] + os: [win32] + + '@oxfmt/win32-x64@0.20.0': + resolution: {integrity: sha512-fkJqHbJaoOMRmrjHSljyb4/7BgXO3xPLBsJSFGtm3mpfW0HHFbAKvd4/6njhqJz9KY+b3RWP1WssjFshcqQQ4w==} + cpu: [x64] + os: [win32] + '@polka/url@1.0.0-next.29': resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} @@ -830,6 +873,11 @@ packages: node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + oxfmt@0.20.0: + resolution: {integrity: sha512-+7f8eV8iaK3tENN/FUVxZM1g78HjPehybN8/+/dvEA1O893Dcvk6O7/Q1wTQOHMD7wvdwWdujKl+Uo8QMiKDrQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} @@ -907,6 +955,10 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} + tinypool@2.0.0: + resolution: {integrity: sha512-/RX9RzeH2xU5ADE7n2Ykvmi9ED3FBGPAjw9u3zucrNNaEBIO0HPSYgL0NT7+3p147ojeSdaVu08F6hjpv31HJg==} + engines: {node: ^20.0.0 || >=22.0.0} + totalist@3.0.1: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} @@ -1205,6 +1257,30 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@oxfmt/darwin-arm64@0.20.0': + optional: true + + '@oxfmt/darwin-x64@0.20.0': + optional: true + + '@oxfmt/linux-arm64-gnu@0.20.0': + optional: true + + '@oxfmt/linux-arm64-musl@0.20.0': + optional: true + + '@oxfmt/linux-x64-gnu@0.20.0': + optional: true + + '@oxfmt/linux-x64-musl@0.20.0': + optional: true + + '@oxfmt/win32-arm64@0.20.0': + optional: true + + '@oxfmt/win32-x64@0.20.0': + optional: true + '@polka/url@1.0.0-next.29': {} '@rolldown/pluginutils@1.0.0-beta.9': {} @@ -1661,6 +1737,19 @@ snapshots: node-releases@2.0.19: {} + oxfmt@0.20.0: + dependencies: + tinypool: 2.0.0 + optionalDependencies: + '@oxfmt/darwin-arm64': 0.20.0 + '@oxfmt/darwin-x64': 0.20.0 + '@oxfmt/linux-arm64-gnu': 0.20.0 + '@oxfmt/linux-arm64-musl': 0.20.0 + '@oxfmt/linux-x64-gnu': 0.20.0 + '@oxfmt/linux-x64-musl': 0.20.0 + '@oxfmt/win32-arm64': 0.20.0 + '@oxfmt/win32-x64': 0.20.0 + path-browserify@1.0.1: {} picocolors@1.1.1: {} @@ -1772,6 +1861,8 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 + tinypool@2.0.0: {} + totalist@3.0.1: {} typescript@5.6.3: {} diff --git a/pyproject.toml b/pyproject.toml index e523ddf..366065e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,20 +3,18 @@ name = "create-pytauri-app" version = "0.1.0" description = "Add your description here" readme = "README.md" -authors = [ - { name = "ISOR3X", email = "isorex@icloud.com" } -] +authors = [{ name = "ISOR3X", email = "isorex@icloud.com" }] requires-python = ">=3.12" dependencies = [ - # [cli] - "copier>=9.10.3", - # [project] - # "pytauri == 0.8.*", - # "pydantic == 2.*", - # "anyio == 4.*", - # [build-system] - # "setuptools >= 80", - # "setuptools-scm >= 8", + # [cli] + "copier>=9.10.3", + # [project] + # "pytauri == 0.8.*", + # "pydantic == 2.*", + # "anyio == 4.*", + # [build-system] + # "setuptools >= 80", + # "setuptools-scm >= 8", ] [project.scripts] @@ -27,6 +25,4 @@ requires = ["uv_build>=0.9.2,<0.10.0"] build-backend = "uv_build" [dependency-groups] -dev = [ - "ruff>=0.14.10", -] +dev = ["ruff>=0.14.10"] diff --git a/src/create_pytauri_app/__init__.py b/src/create_pytauri_app/__init__.py index 827b33f..6deb143 100644 --- a/src/create_pytauri_app/__init__.py +++ b/src/create_pytauri_app/__init__.py @@ -1,5 +1,4 @@ import shutil -from pathlib import Path from copier import run_copy diff --git a/src/create_pytauri_app/prompting.py b/src/create_pytauri_app/prompting.py index 4c22718..cb1ce4e 100644 --- a/src/create_pytauri_app/prompting.py +++ b/src/create_pytauri_app/prompting.py @@ -161,7 +161,7 @@ def choose(question: str, default: bool = False) -> bool: # Print the prompt sys.stdout.write(prompt) - sys.stdout.flush() # Write directly + sys.stdout.flush() # Write directly while True: key = read_key() diff --git a/src/create_pytauri_app/utils.py b/src/create_pytauri_app/utils.py index 6df43ad..fbff359 100644 --- a/src/create_pytauri_app/utils.py +++ b/src/create_pytauri_app/utils.py @@ -39,7 +39,7 @@ def construct_finish_msg(info: Answer) -> str: else: dev_start_msg = "" dev_cmd = f" python -m {info.package_name}" - + msg += "\n" + dev_start_msg + dev_cmd return msg diff --git a/templates/_base_/_common_/capabilities/default.json b/templates/_base_/_common_/capabilities/default.json index 3fd2018..3d05915 100644 --- a/templates/_base_/_common_/capabilities/default.json +++ b/templates/_base_/_common_/capabilities/default.json @@ -3,9 +3,5 @@ "identifier": "default", "description": "Capability for the main window", "windows": ["main"], - "permissions": [ - "core:default", - "opener:default", - "pytauri:default" - ] + "permissions": ["core:default", "opener:default", "pytauri:default"] } diff --git a/templates/_base_/_rust_/pyproject.toml b/templates/_base_/_rust_/pyproject.toml index 8588fb8..892b1d5 100644 --- a/templates/_base_/_rust_/pyproject.toml +++ b/templates/_base_/_rust_/pyproject.toml @@ -18,13 +18,13 @@ pytauri-project = { workspace = true } # See: # ref: exclude = [ - "**/node_modules", - "**/__pycache__", - "**/dist", - "**/.*", - "**/pyembed", - # 👇 necessary, because when `tauri-cli bundles python, - # it will copy `pyembed` to the target directory (i.e., rust output dir). - "**/target", - # 👆 + "**/node_modules", + "**/__pycache__", + "**/dist", + "**/.*", + "**/pyembed", + # 👇 necessary, because when `tauri-cli bundles python, + # it will copy `pyembed` to the target directory (i.e., rust output dir). + "**/target", + # 👆 ] diff --git a/templates/_base_/_rust_/scripts/README.md b/templates/_base_/_rust_/scripts/README.md index ae38e46..46752b8 100644 --- a/templates/_base_/_rust_/scripts/README.md +++ b/templates/_base_/_rust_/scripts/README.md @@ -3,5 +3,5 @@ > ref: 1. Use `download-py` to download `python-build-standalone` (only needed for the first build). - You can modify `download-py` to customize the required Python version. + You can modify `download-py` to customize the required Python version. 2. Use `build` to build the app. diff --git a/templates/_base_/_rust_/src-tauri/tauri.bundle.json b/templates/_base_/_rust_/src-tauri/tauri.bundle.json index 7911059..6ae88e8 100644 --- a/templates/_base_/_rust_/src-tauri/tauri.bundle.json +++ b/templates/_base_/_rust_/src-tauri/tauri.bundle.json @@ -1,14 +1,7 @@ { "bundle": { "active": true, - "targets": [ - "deb", - "rpm", - "msi", - "nsis", - "app", - "dmg" - ], + "targets": ["deb", "rpm", "msi", "nsis", "app", "dmg"], "resources": { "pyembed/python": "./" } diff --git a/templates/template-react-ts/.vscode/extensions.json b/templates/template-react-ts/.vscode/extensions.json index f8dc608..37b0935 100644 --- a/templates/template-react-ts/.vscode/extensions.json +++ b/templates/template-react-ts/.vscode/extensions.json @@ -6,6 +6,6 @@ "ms-python.vscode-pylance", "charliermarsh.ruff", "ms-python.debugpy", - "tauri-apps.tauri-vscode", + "tauri-apps.tauri-vscode" ] } diff --git a/templates/template-react-ts/src/App.css b/templates/template-react-ts/src/App.css index bd7e110..09b25a6 100644 --- a/templates/template-react-ts/src/App.css +++ b/templates/template-react-ts/src/App.css @@ -42,7 +42,6 @@ body { } } - .row { display: flex; justify-content: center; @@ -100,7 +99,6 @@ button { &:active { opacity: 30%; - } } diff --git a/templates/template-vue-ts/.vscode/extensions.json b/templates/template-vue-ts/.vscode/extensions.json index 25f69c1..60b86fe 100644 --- a/templates/template-vue-ts/.vscode/extensions.json +++ b/templates/template-vue-ts/.vscode/extensions.json @@ -7,6 +7,6 @@ "ms-python.vscode-pylance", "charliermarsh.ruff", "ms-python.debugpy", - "tauri-apps.tauri-vscode", + "tauri-apps.tauri-vscode" ] } From dd6d1dbeae3289ff34bf8a9422a8e642abeca7c5 Mon Sep 17 00:00:00 2001 From: ISOR3X Date: Wed, 24 Dec 2025 16:56:09 +0100 Subject: [PATCH 12/16] chore(wheel): revert tauri code in seperate folder --- src/create_pytauri_app/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/create_pytauri_app/__init__.py b/src/create_pytauri_app/__init__.py index 6deb143..4e4c54c 100644 --- a/src/create_pytauri_app/__init__.py +++ b/src/create_pytauri_app/__init__.py @@ -66,7 +66,7 @@ def main(): # Copy over common run_copy( str(template_dir / "_base_" / "_common_"), - str(project_dir / "src" / info.package_name / "tauri"), + str(project_dir / "src" / info.package_name), vcs_ref="HEAD", quiet=True, data=info.model_dump(), From 67b436525cdd1469d98224b7e0f8648487eaf2e0 Mon Sep 17 00:00:00 2001 From: ISOR3X Date: Wed, 24 Dec 2025 17:29:49 +0100 Subject: [PATCH 13/16] fix: many fixes - Each version has been generated (wheel and default) and tested --- src/create_pytauri_app/__init__.py | 7 ++++--- src/create_pytauri_app/questionnaire.py | 6 +++--- src/create_pytauri_app/utils.py | 11 +++++----- .../_base_/_common_/tauri.conf.json.jinja | 2 +- templates/_base_/_python_/.gitignore | 13 ++++++++++++ .../src/{{ package_name }}/__init__.py | 21 +++++++++++++++++-- templates/_base_/_rust_/.gitignore | 1 + .../{pyproject.toml => pyproject.toml.jinja} | 4 ++-- .../src-python/{{ package_name }}/__init__.py | 7 +++++-- 9 files changed, 53 insertions(+), 19 deletions(-) rename templates/_base_/_rust_/{pyproject.toml => pyproject.toml.jinja} (90%) diff --git a/src/create_pytauri_app/__init__.py b/src/create_pytauri_app/__init__.py index 4e4c54c..3e2cd67 100644 --- a/src/create_pytauri_app/__init__.py +++ b/src/create_pytauri_app/__init__.py @@ -26,6 +26,7 @@ def main(): frontend_template_dir = template_dir / f"template-{info.frontend_template_full}" frontend_dir = project_dir if info.use_rust else project_dir / "app" + frontend_dist = "../dist" if info.use_rust else "../../app/dist" # Copy over frontend run_copy( @@ -49,10 +50,10 @@ def main(): # Copy over common run_copy( str(template_dir / "_base_" / "_common_"), - str(project_dir / "src-tauri" / info.package_name), + str(project_dir / "src-tauri"), vcs_ref="HEAD", quiet=True, - data=info.model_dump(), + data={**info.model_dump(), "frontend_dist": frontend_dist}, ) else: # Copy over python @@ -69,7 +70,7 @@ def main(): str(project_dir / "src" / info.package_name), vcs_ref="HEAD", quiet=True, - data=info.model_dump(), + data={**info.model_dump(), "frontend_dist": frontend_dist}, ) # Copy over assets diff --git a/src/create_pytauri_app/questionnaire.py b/src/create_pytauri_app/questionnaire.py index 1eef183..768a7e3 100644 --- a/src/create_pytauri_app/questionnaire.py +++ b/src/create_pytauri_app/questionnaire.py @@ -33,7 +33,7 @@ def ask_info() -> Answer: identifier = ask("Identifier", f"com.{user}.{project_name}") frontend_langs = [ - Choice(label="Python", value="py", meta="uv"), + # Choice(label="Python", value="py", meta="uv"), Choice( label="TypeScript / JavaScript", value="js", meta="pnpm, yarn, npm, bun" ), @@ -46,7 +46,7 @@ def ask_info() -> Answer: match frontend_lang: case "js": frontend_frameworks = [ - Choice(value="vanilla"), + # Choice(value="vanilla"), Choice(value="vue", meta="https://vuejs.org/"), Choice(value="svelte", meta="https://svelte.dev/"), Choice(value="react", meta="https://react.dev/"), @@ -62,7 +62,7 @@ def ask_info() -> Answer: if frontend_lang == "js": frontend_flavors = [ Choice(label="TypeScript", value="ts"), - Choice(label="JavaScript", value="js"), + # Choice(label="JavaScript", value="js"), ] frontend_flavor = select("Choose your UI flavor", frontend_flavors) diff --git a/src/create_pytauri_app/utils.py b/src/create_pytauri_app/utils.py index fbff359..2123526 100644 --- a/src/create_pytauri_app/utils.py +++ b/src/create_pytauri_app/utils.py @@ -18,17 +18,16 @@ def construct_finish_msg(info: Answer) -> str: cmds.append( "uv --python-preference only-system", ) + if platform.system() == "Windows": + cmds.append(r".venv\Scripts\activate") + else: + cmds.append(r"source .venv/bin/activate") else: cmds.append( "pnpm build", ) - if platform.system() == "Windows": - cmds.append(r".venv\Scripts\activate") - else: - cmds.append(r"source .venv/bin/activate") - cmds.append("uv sync") msg += "\n".join(f" {cmd}" for cmd in cmds) @@ -37,7 +36,7 @@ def construct_finish_msg(info: Answer) -> str: dev_start_msg = "\nFor development, run:\n" dev_cmd = " pnpm tauri dev" else: - dev_start_msg = "" + dev_start_msg = "\nFor development, run:\n" dev_cmd = f" python -m {info.package_name}" msg += "\n" + dev_start_msg + dev_cmd diff --git a/templates/_base_/_common_/tauri.conf.json.jinja b/templates/_base_/_common_/tauri.conf.json.jinja index df73dfe..9eb3b48 100644 --- a/templates/_base_/_common_/tauri.conf.json.jinja +++ b/templates/_base_/_common_/tauri.conf.json.jinja @@ -7,7 +7,7 @@ "beforeDevCommand": "pnpm dev", "devUrl": "http://localhost:1420", "beforeBuildCommand": "pnpm build", - "frontendDist": "../dist", + "frontendDist": "{{ frontend_dist }}", "features": ["pytauri/standalone"] }, "app": { diff --git a/templates/_base_/_python_/.gitignore b/templates/_base_/_python_/.gitignore index e69de29..d3725b3 100644 --- a/templates/_base_/_python_/.gitignore +++ b/templates/_base_/_python_/.gitignore @@ -0,0 +1,13 @@ +# Python-generated files +__pycache__/ +*.py[oc] +build/ +dist/ +wheels/ +*.egg-info + +# Virtual environments +.venv + +/.idea +/dist/ diff --git a/templates/_base_/_python_/src/{{ package_name }}/__init__.py b/templates/_base_/_python_/src/{{ package_name }}/__init__.py index 9681ee9..97f7647 100644 --- a/templates/_base_/_python_/src/{{ package_name }}/__init__.py +++ b/templates/_base_/_python_/src/{{ package_name }}/__init__.py @@ -1,3 +1,5 @@ +from os import environ +from pathlib import Path import sys from anyio.from_thread import start_blocking_portal @@ -5,6 +7,21 @@ from pytauri import Commands from pytauri_wheel.lib import builder_factory, context_factory +SRC_TAURI_DIR = Path(__file__).parent.absolute() + +# If the DEV_SERVER env. variable is set, use that server for development (allows hot-reloading). Otherwise, use the built assets to serve the frontend. +DEV_SERVER = environ.get("DEV_SERVER") # Default: http://localhost:1420 + +if DEV_SERVER is not None: + tauri_config = { + "build": { + "frontendDist": DEV_SERVER, + }, + } +else: + tauri_config = None + + commands: Commands = Commands() @@ -18,9 +35,9 @@ async def greet(body: Person) -> str: def main() -> int: - with start_blocking_portal("asyncio") as portal: # or `trio` + with start_blocking_portal("asyncio") as portal: app = builder_factory().build( - context=context_factory(), + context=context_factory(SRC_TAURI_DIR, tauri_config=tauri_config), invoke_handler=commands.generate_handler(portal), ) exit_code = app.run_return() diff --git a/templates/_base_/_rust_/.gitignore b/templates/_base_/_rust_/.gitignore index 6d65b50..92a1dac 100644 --- a/templates/_base_/_rust_/.gitignore +++ b/templates/_base_/_rust_/.gitignore @@ -25,3 +25,4 @@ dist-ssr /.venv/ /target/ +/dist/ \ No newline at end of file diff --git a/templates/_base_/_rust_/pyproject.toml b/templates/_base_/_rust_/pyproject.toml.jinja similarity index 90% rename from templates/_base_/_rust_/pyproject.toml rename to templates/_base_/_rust_/pyproject.toml.jinja index 892b1d5..3bf79f6 100644 --- a/templates/_base_/_rust_/pyproject.toml +++ b/templates/_base_/_rust_/pyproject.toml.jinja @@ -5,13 +5,13 @@ requires-python = ">=3.9" dependencies = [] [dependency-groups] -dev = ["pytauri-project"] +dev = ["{{ project_name }}"] [tool.uv.workspace] members = ["src-tauri"] [tool.uv.sources] -pytauri-project = { workspace = true } +{{ project_name }} = { workspace = true } [tool.pyright] diff --git a/templates/_base_/_rust_/src-tauri/src-python/{{ package_name }}/__init__.py b/templates/_base_/_rust_/src-tauri/src-python/{{ package_name }}/__init__.py index 9681ee9..acbe437 100644 --- a/templates/_base_/_rust_/src-tauri/src-python/{{ package_name }}/__init__.py +++ b/templates/_base_/_rust_/src-tauri/src-python/{{ package_name }}/__init__.py @@ -2,8 +2,11 @@ from anyio.from_thread import start_blocking_portal from pydantic import BaseModel -from pytauri import Commands -from pytauri_wheel.lib import builder_factory, context_factory +from pytauri import ( + Commands, + builder_factory, + context_factory, +) commands: Commands = Commands() From 746fe3e2465e7696f4d06ab2219f2143f5577acd Mon Sep 17 00:00:00 2001 From: ISOR3X Date: Wed, 24 Dec 2025 17:31:39 +0100 Subject: [PATCH 14/16] chore: remove ruff cache --- .gitignore | 1 + templates/_base_/_python_/.gitignore | 2 ++ templates/_base_/_rust_/.gitignore | 4 +++- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 60ff621..9dc5e85 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ target/ .idea/ .generated_template +.ruff_cache \ No newline at end of file diff --git a/templates/_base_/_python_/.gitignore b/templates/_base_/_python_/.gitignore index d3725b3..8a1f88c 100644 --- a/templates/_base_/_python_/.gitignore +++ b/templates/_base_/_python_/.gitignore @@ -11,3 +11,5 @@ wheels/ /.idea /dist/ + +.ruff_cache \ No newline at end of file diff --git a/templates/_base_/_rust_/.gitignore b/templates/_base_/_rust_/.gitignore index 92a1dac..bcb64ff 100644 --- a/templates/_base_/_rust_/.gitignore +++ b/templates/_base_/_rust_/.gitignore @@ -25,4 +25,6 @@ dist-ssr /.venv/ /target/ -/dist/ \ No newline at end of file +/dist/ + +.ruff_cache From 603d7f678ebbdca0716fce818d91f3d157346396 Mon Sep 17 00:00:00 2001 From: ISOR3X Date: Wed, 24 Dec 2025 17:43:06 +0100 Subject: [PATCH 15/16] chore: add passing path --- scripts/create_copy.py | 78 +++++------------------------- src/create_pytauri_app/__init__.py | 27 ++++++++--- 2 files changed, 34 insertions(+), 71 deletions(-) diff --git a/scripts/create_copy.py b/scripts/create_copy.py index 1bfcf0a..0b6618b 100644 --- a/scripts/create_copy.py +++ b/scripts/create_copy.py @@ -1,67 +1,15 @@ -import shutil - -from copier import run_copy - -from create_pytauri_app.prompting import choose -from create_pytauri_app.questionnaire import Answer, ask_info -from create_pytauri_app.utils import construct_finish_msg, get_project_root - - -def get_info(use_fake: bool = False) -> Answer: - info = ( - ask_info() - if use_fake - else Answer( - project_name="pytauri-app", - identifier="com.username.pytauri-app", - frontend_lang="js", - frontend_flavor="ts", - frontend_template="vue", - use_rust=True, - ) +from create_pytauri_app import _main +from create_pytauri_app.questionnaire import Answer +from create_pytauri_app.utils import get_project_root + +if __name__ == "__main__": + answer = Answer( + project_name="pytauri-app", + identifier="com.username.pytauri-app", + frontend_lang="js", + frontend_flavor="ts", + frontend_template="vue", + use_rust=True, ) - - return info - - -def main(): output_dir = get_project_root() / ".generated_template" - - template_dir = get_project_root() / "templates" - tauri_dir = template_dir / "_base_" / "src-tauri" - - info = get_info() - - project_dir = output_dir / info.project_name - - # Clean up old templates to ensure a new, clean one. - if project_dir.exists() and choose("Directory is not empty, delete?"): - shutil.rmtree(project_dir) - - project_dir.mkdir() - - frontend_template_dir = template_dir / f"template-{info.frontend_template_full}" - - # Copy over frontend - run_copy( - str(frontend_template_dir), - str(project_dir), - vcs_ref="HEAD", - data=info.model_dump(), - quiet=True, - ) - - # Copy over src-tauri - run_copy( - str(tauri_dir), - str(project_dir / "src-tauri"), - vcs_ref="HEAD", - quiet=True, - data=info.model_dump(), - ) - - # Copy over assets - asset_dir = "static" if info.frontend_template == "svelte" else "public" - run_copy(str(template_dir / "_assets_"), str(project_dir / asset_dir), quiet=True) - - print(construct_finish_msg(info)) + _main(output_dir, answer) diff --git a/src/create_pytauri_app/__init__.py b/src/create_pytauri_app/__init__.py index 3e2cd67..1d5c7b4 100644 --- a/src/create_pytauri_app/__init__.py +++ b/src/create_pytauri_app/__init__.py @@ -1,19 +1,18 @@ +import argparse import shutil +from pathlib import Path from copier import run_copy from create_pytauri_app.prompting import choose -from create_pytauri_app.questionnaire import ask_info +from create_pytauri_app.questionnaire import Answer, ask_info from create_pytauri_app.utils import construct_finish_msg, get_project_root -def main(): - # output_dir = Path(".") - output_dir = get_project_root() / ".generated_template" - +def _main(output_dir: Path, answer: Answer | None = None) -> None: template_dir = get_project_root() / "templates" - info = ask_info() + info = answer or ask_info() project_dir = output_dir / info.project_name @@ -78,3 +77,19 @@ def main(): run_copy(str(template_dir / "_assets_"), str(frontend_dir / asset_dir), quiet=True) print(construct_finish_msg(info)) + + +def main(): + parser = argparse.ArgumentParser() + + parser.add_argument( + "--path", + help="path where to generate the project", + default=".", + type=Path, + required=False, + ) + + args = parser.parse_args() + + _main(args.path) From 9da83fd0f025bfb5f22d610c60bf9d322deab85d Mon Sep 17 00:00:00 2001 From: ISOR3X Date: Sun, 28 Dec 2025 18:03:23 +0100 Subject: [PATCH 16/16] fix: allow pnpm commands from root --- templates/_base_/_python_/package.json.jinja | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/templates/_base_/_python_/package.json.jinja b/templates/_base_/_python_/package.json.jinja index db365d0..8901bbc 100644 --- a/templates/_base_/_python_/package.json.jinja +++ b/templates/_base_/_python_/package.json.jinja @@ -3,5 +3,9 @@ "private": true, "version": "0.1.0", "type": "module", - "packageManager": "pnpm@10.24.0" + "packageManager": "pnpm@10.24.0", + "scripts": { + "dev": "pnpm --filter \"./app\" dev", + "build": "pnpm --filter \"./app\" build" + } }