From 470d44c820ef8461799d77bc3ad5cf977c2787ba Mon Sep 17 00:00:00 2001 From: Florian Kromer Date: Sat, 22 Nov 2025 18:01:01 +0100 Subject: [PATCH 1/2] poetry -> uv, proper python library --- .gitignore | 2 + CONTRIBUTING.md | 105 ++++- CONTRIBUTORS.md | 10 - Dockerfile | 8 +- MANIFEST.in | 2 - Makefile | 6 +- README.md | 4 +- SECURITY.md | 5 +- SUMMARY.md | 4 - docs/advanced_template.md | 2 +- docs/basic_template.md | 2 +- {.gitbook/assets => docs/diagrams}/dfd.png | Bin {.gitbook/assets => docs/diagrams}/sample.png | Bin {.gitbook/assets => docs/diagrams}/seq.png | Bin docs/reveal.md | 3 +- docs/sample.png | Bin 17098 -> 0 bytes poetry.lock | 417 ------------------ pyproject.toml | 57 ++- requirements-dev.txt | 222 +++++++++- requirements.txt | 224 +++++++++- {pytm => src/pytm}/TODO.txt | 0 {pytm => src/pytm}/__init__.py | 0 {pytm => src/pytm}/flows.py | 0 {pytm => src/pytm}/images/datastore.png | Bin {pytm => src/pytm}/images/datastore_black.png | Bin .../pytm}/images/datastore_darkgreen.png | Bin .../pytm}/images/datastore_firebrick3.png | Bin {pytm => src/pytm}/images/datastore_gold.png | Bin {pytm => src/pytm}/images/lambda.png | Bin {pytm => src/pytm}/json.py | 0 {pytm => src/pytm}/pytm.py | 54 ++- {pytm => src/pytm}/report_util.py | 0 {pytm => src/pytm}/template_engine.py | 0 {pytm => src/pytm}/threatlib/threats.json | 0 tests/output.json | 2 +- tests/output.md | 2 +- tests/test_pytmfunc.py | 6 +- uv.lock | 224 ++++++++++ 38 files changed, 854 insertions(+), 507 deletions(-) delete mode 100644 CONTRIBUTORS.md delete mode 100644 MANIFEST.in delete mode 100644 SUMMARY.md rename {.gitbook/assets => docs/diagrams}/dfd.png (100%) rename {.gitbook/assets => docs/diagrams}/sample.png (100%) rename {.gitbook/assets => docs/diagrams}/seq.png (100%) delete mode 100644 docs/sample.png delete mode 100644 poetry.lock rename {pytm => src/pytm}/TODO.txt (100%) rename {pytm => src/pytm}/__init__.py (100%) rename {pytm => src/pytm}/flows.py (100%) rename {pytm => src/pytm}/images/datastore.png (100%) rename {pytm => src/pytm}/images/datastore_black.png (100%) rename {pytm => src/pytm}/images/datastore_darkgreen.png (100%) rename {pytm => src/pytm}/images/datastore_firebrick3.png (100%) rename {pytm => src/pytm}/images/datastore_gold.png (100%) rename {pytm => src/pytm}/images/lambda.png (100%) rename {pytm => src/pytm}/json.py (100%) rename {pytm => src/pytm}/pytm.py (98%) rename {pytm => src/pytm}/report_util.py (100%) rename {pytm => src/pytm}/template_engine.py (100%) rename {pytm => src/pytm}/threatlib/threats.json (100%) create mode 100644 uv.lock diff --git a/.gitignore b/.gitignore index 73f7be44..ac0aa87e 100644 --- a/.gitignore +++ b/.gitignore @@ -132,3 +132,5 @@ devbox.lock # zed .zed + +sbom.json diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4f98ca7e..f5b75585 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -7,21 +7,22 @@ Please read those before starting an issue or a pull request. Specific PyTM design and development issues, bugs, and feature requests are maintained by GitHub Issues. -*Please do not post installation, build, usage, or modeling questions, or other requests for help to Issues.* +_Please do not post installation, build, usage, or modeling questions, or other requests for help to Issues._ Use the [PyTM-users list](https://groups.google.com/forum/#!forum/pytm-users) instead. This helps developers maintain a clear, uncluttered, and efficient view of the state of PyTM. See the chapter [PyTM-users](#PyTM-users) below for guidance on posting to the users list. When reporting an issue, it's most helpful to provide the following information, where applicable: -* How does the problem look like and what steps reproduce it? -* Can you reproduce it using the latest [master](https://github.com/izar/pytm/tree/master)? -* What is your running environment? In particular: - * OS, - * Python version, - * Dot or PlantUML version, if relevant, - * Your model file, if possible. -* **What have you already tried** to solve the problem? How did it fail? Are there any other issues related to yours? -* If the bug is a crash, provide the backtrace (usually printed by PyTM). + +- How does the problem look like and what steps reproduce it? +- Can you reproduce it using the latest [master](https://github.com/izar/pytm/tree/master)? +- What is your running environment? In particular: + - OS, + - Python version, + - Dot or PlantUML version, if relevant, + - Your model file, if possible. +- **What have you already tried** to solve the problem? How did it fail? Are there any other issues related to yours? +- If the bug is a crash, provide the backtrace (usually printed by PyTM). If only a small portion of the code/log is relevant to your issue, you may paste it directly into the post, preferably using Markdown syntax for code block: triple backtick ( \`\`\` ) to open/close a block. In other cases (multiple files, or long files), please **attach** them to the post - this greatly improves readability. @@ -34,13 +35,85 @@ Try to give your issue a title that is succinct and specific. The devs will rena To execute the test suite, from the root of the repo run `make test`. To control what tests to run, use `python3 -m unittest -v tests/`. -To regenerate test fixtures for `json.dumps` and report tests add a `print(output)` statement in the test and run `make test 2>/dev/null > tests/output.json` or `make test 2>/dev/null > tests/output.md`. +To regenerate test fixtures for `json.dumps` and report tests add a `print(output)` statement in the test and run `make test 2>/dev/null > tests/output.json` or `make test 2>/dev/null > tests/output.md`. + +## Host setup + +### brew-capable OSes + +Operating system with builtin support (e.g. macOS or [Bluefin](https://projectbluefin.io/)) or extended with support for [brew](https://brew.sh/): + + brew install uv + brew install graphviz + brew install pandoc + brew install plantuml + +## Python package management + +The project uses the [`uv`](https://github.com/astral-sh/uv) package manager. + +## Project setup + +`uv` installs the library `pytm` as [editable package](https://docs.astral.sh/uv/guides/package/#editable-packages) +and considers [development dependencies](https://docs.astral.sh/uv/concepts/projects/sync/#syncing-development-dependencies). + + uv sync + +[Activate the virtual environment](https://docs.astral.sh/uv/pip/environments/#using-a-virtual-environment) +(depending on your shell you might need to activate differently, for the `fish` shell e.g. `source .venv/bin/activate.fish`): + + source .venv/bin/activate + +## Running tests + + uv run pytest + +## Check report and diagram generation + + mkdir -p tm + ./tm.py --report docs/basic_template.md | pandoc -f markdown -t html > tm/report.html + ./tm.py --dfd | dot -Tpng -o tm/dfd.png + ./tm.py --seq | plantuml -tpng -pipe > tm/seq.png + +## Bump the version + +[Update the version](https://docs.astral.sh/uv/guides/package/#updating-your-version) with e.g. + + uv version --bump minor + +## Build the library + +[build](https://docs.astral.sh/uv/guides/package/#building-your-package) the library with + + uv build + +The project is a Python [library](https://docs.astral.sh/uv/concepts/projects/init/#libraries) and is packaged with the +[`build-backend` of `uv`](https://docs.astral.sh/uv/reference/settings/#build-backend). + +## Publish the library (project maintainers only) + +[publish](https://docs.astral.sh/uv/guides/package/#publishing-your-package) the library with + + uv publish + +## Generating a requirements file + +Docker/OCI containers depend on a requirements file. + + uv export --no-editable --no-dev --format requirements.txt --output-file requirements.txt + uv export --no-editable --only-dev --format requirements.txt --output-file requirements-dev.txt + +## Export SBOM metadata + +`uv` supports [CycloneDX](https://github.com/CycloneDX) format out of the box. + + uv export --format cyclonedx1.5 --output-file sbom.json ## PyTM-users Before you post to the [PyTM-users list](https://groups.google.com/forum/#!forum/pytm-users), make sure you look for existing solutions. -* [GitHub issues](https://github.com/izar/pytm/issues) tracker (some problems have been answered there), +- [GitHub issues](https://github.com/izar/pytm/issues) tracker (some problems have been answered there), Found a post/issue with your exact problem, but with no answer? Don't just leave a "me too" message - provide the details of your case. @@ -56,9 +129,9 @@ PyTM welcomes all contributions. Briefly: read commit by commit, a PR should tell a clean, compelling story of _one_ improvement to PyTM. In particular: -* A PR should do one clear thing that obviously improves PyTM, and nothing more. Making many smaller PRs is better than making one large PR; review effort is superlinear in the amount of code involved. -* Similarly, each commit should be a small, atomic change representing one step in development. PRs should be made of many commits where appropriate. -* Please do rewrite PR history to be clean rather than chronological. Within-PR bugfixes, style cleanups, reversions, etc. should be squashed and should not appear in merged PR history. -* Anything nonobvious from the code should be explained in comments, commit messages, or the PR description, as appropriate. +- A PR should do one clear thing that obviously improves PyTM, and nothing more. Making many smaller PRs is better than making one large PR; review effort is superlinear in the amount of code involved. +- Similarly, each commit should be a small, atomic change representing one step in development. PRs should be made of many commits where appropriate. +- Please do rewrite PR history to be clean rather than chronological. Within-PR bugfixes, style cleanups, reversions, etc. should be squashed and should not appear in merged PR history. +- Anything nonobvious from the code should be explained in comments, commit messages, or the PR description, as appropriate. (With many thanks to the Caffe project for their original CONTRIBUTING.md file) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md deleted file mode 100644 index 6d0626e8..00000000 --- a/CONTRIBUTORS.md +++ /dev/null @@ -1,10 +0,0 @@ -# PyTM Main Contributors - -* Was, Jan -* Avhad, Pooja -* Coles, Matthew -* Ozmore, Nick -* Shambhuni, Rohit -* Tarandach, Izar - -Join us! diff --git a/Dockerfile b/Dockerfile index e40e4998..a67a7a76 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,5 @@ - FROM python:3.12-rc-alpine - WORKDIR /usr/src/app ENTRYPOINT ["sh"] @@ -20,10 +18,10 @@ RUN apk add --no-cache graphviz openjdk11-jre fontconfig make curl ttf-liberatio ENV _JAVA_OPTIONS -Duser.home=/tmp -Dawt.useSystemAAFontSettings=gasp RUN printf '@startuml\n@enduml' | java -Djava.awt.headless=true -jar $PLANTUML_PATH -tpng -pipe >/dev/null -COPY requirements.txt requirements-dev.txt ./ -RUN pip install --no-cache-dir -r requirements-dev.txt \ +COPY requirements.txt ./ +RUN pip install --no-cache-dir -r requirements.txt \ && apk del .build-deps -COPY pytm ./pytm +COPY src/pytm ./pytm COPY docs ./docs COPY *.py Makefile ./ diff --git a/MANIFEST.in b/MANIFEST.in deleted file mode 100644 index 247c40ad..00000000 --- a/MANIFEST.in +++ /dev/null @@ -1,2 +0,0 @@ -include images/lambda.png -include threatlib/threats.json diff --git a/Makefile b/Makefile index 62f07c6e..ffa72d9f 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,7 @@ endif MODEL?=tm -libs := $(wildcard pytm/*.py) $(wildcard pytm/threatlib/*.json) $(wildcard pytm/images/*) +libs := $(wildcard src/pytm/*.py) $(wildcard src/pytm/threatlib/*.json) $(wildcard src/pytm/images/*) all: clean docs/pytm/index.html $(MODEL) @@ -26,7 +26,7 @@ endif docs/pytm/index.html: $(wildcard pytm/*.py) PYTHONPATH=. pdoc --html --force --output-dir docs pytm -docs/threats.md: $(wildcard pytm/threatlib/*.json) +docs/threats.md: $(wildcard src/pytm/threatlib/*.json) printf "# Threat database\n" > $@ jq -r ".[] | \"$$(cat docs/threats.jq)\"" $< >> $@ @@ -69,4 +69,4 @@ docs: docs/pytm/index.html docs/threats.md .PHONY: fmt fmt: - black $(wildcard pytm/*.py) $(wildcard tests/*.py) $(wildcard *.py) + black $(wildcard src/pytm/*.py) $(wildcard tests/*.py) $(wildcard *.py) diff --git a/README.md b/README.md index dad22575..25ace955 100644 --- a/README.md +++ b/README.md @@ -239,7 +239,7 @@ tm.py --dfd | dot -Tpng -o sample.png Generates this diagram: -![dfd.png](.gitbook/assets/dfd.png) +![dfd.png](docs/diagrams/dfd.png) Adding ".levels = [1,2]" attributes to an element will cause it (and its associated Dataflows if both flow endings are in the same DFD level) to render (or not) depending on the command argument "--levels 1 2". @@ -253,7 +253,7 @@ tm.py --seq | java -Djava.awt.headless=true -jar plantuml.jar -tpng -pipe > seq. Generates this diagram: -![seq.png](.gitbook/assets/seq.png) +![seq.png](docs/diagrams/seq.png) ### Creating a Report diff --git a/SECURITY.md b/SECURITY.md index fb55b814..ddcae00e 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -1,4 +1,3 @@ -Reporting a Vulnerability -Please report (suspected) security vulnerabilities as a project issue. You will receive a response from us within 48 hours. If the issue is confirmed, we will release a patch as soon as possible depending on complexity but historically within a few days. - +# Reporting a Vulnerability +Please report (suspected) security vulnerabilities as a project issue. You will receive a response from us within 48 hours. If the issue is confirmed, we will release a patch as soon as possible depending on complexity but historically within a few days. diff --git a/SUMMARY.md b/SUMMARY.md deleted file mode 100644 index a5a4b34b..00000000 --- a/SUMMARY.md +++ /dev/null @@ -1,4 +0,0 @@ -# Table of contents - -* [pytm](README.md) - diff --git a/docs/advanced_template.md b/docs/advanced_template.md index 03918666..f1b1a07d 100644 --- a/docs/advanced_template.md +++ b/docs/advanced_template.md @@ -6,7 +6,7 @@ ## Dataflow Diagram - Level 0 DFD -![](sample.png) +![sample.png](diagrams/sample.png)   diff --git a/docs/basic_template.md b/docs/basic_template.md index 451711b4..07f64313 100644 --- a/docs/basic_template.md +++ b/docs/basic_template.md @@ -22,7 +22,7 @@ ## Dataflow Diagram - Level 0 DFD -![](sample.png) +![sample.png](diagrams/sample.png)   diff --git a/.gitbook/assets/dfd.png b/docs/diagrams/dfd.png similarity index 100% rename from .gitbook/assets/dfd.png rename to docs/diagrams/dfd.png diff --git a/.gitbook/assets/sample.png b/docs/diagrams/sample.png similarity index 100% rename from .gitbook/assets/sample.png rename to docs/diagrams/sample.png diff --git a/.gitbook/assets/seq.png b/docs/diagrams/seq.png similarity index 100% rename from .gitbook/assets/seq.png rename to docs/diagrams/seq.png diff --git a/docs/reveal.md b/docs/reveal.md index 4fb4c162..c9bba8dd 100644 --- a/docs/reveal.md +++ b/docs/reveal.md @@ -10,7 +10,7 @@ ## Dataflow Diagram -![](sample.png) +![sample.png](docs/diagrams/sample.png) --- @@ -182,4 +182,3 @@ Finding Count|{{item:call:getFindingCount}}| }} }} } - diff --git a/docs/sample.png b/docs/sample.png deleted file mode 100644 index 09a328e63b11334979e56cb39858a4bea56ec982..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17098 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 Sdf=Z^plGP*D%U95MEno+)Kho> diff --git a/poetry.lock b/poetry.lock deleted file mode 100644 index 7c47da05..00000000 --- a/poetry.lock +++ /dev/null @@ -1,417 +0,0 @@ -# This file is automatically @generated by Poetry 2.1.4 and should not be changed by hand. - -[[package]] -name = "black" -version = "25.9.0" -description = "The uncompromising code formatter." -optional = false -python-versions = ">=3.9" -groups = ["dev"] -files = [ - {file = "black-25.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ce41ed2614b706fd55fd0b4a6909d06b5bab344ffbfadc6ef34ae50adba3d4f7"}, - {file = "black-25.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ab0ce111ef026790e9b13bd216fa7bc48edd934ffc4cbf78808b235793cbc92"}, - {file = "black-25.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f96b6726d690c96c60ba682955199f8c39abc1ae0c3a494a9c62c0184049a713"}, - {file = "black-25.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:d119957b37cc641596063cd7db2656c5be3752ac17877017b2ffcdb9dfc4d2b1"}, - {file = "black-25.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:456386fe87bad41b806d53c062e2974615825c7a52159cde7ccaeb0695fa28fa"}, - {file = "black-25.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a16b14a44c1af60a210d8da28e108e13e75a284bf21a9afa6b4571f96ab8bb9d"}, - {file = "black-25.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aaf319612536d502fdd0e88ce52d8f1352b2c0a955cc2798f79eeca9d3af0608"}, - {file = "black-25.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:c0372a93e16b3954208417bfe448e09b0de5cc721d521866cd9e0acac3c04a1f"}, - {file = "black-25.9.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:1b9dc70c21ef8b43248f1d86aedd2aaf75ae110b958a7909ad8463c4aa0880b0"}, - {file = "black-25.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8e46eecf65a095fa62e53245ae2795c90bdecabd53b50c448d0a8bcd0d2e74c4"}, - {file = "black-25.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9101ee58ddc2442199a25cb648d46ba22cd580b00ca4b44234a324e3ec7a0f7e"}, - {file = "black-25.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:77e7060a00c5ec4b3367c55f39cf9b06e68965a4f2e61cecacd6d0d9b7ec945a"}, - {file = "black-25.9.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0172a012f725b792c358d57fe7b6b6e8e67375dd157f64fa7a3097b3ed3e2175"}, - {file = "black-25.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3bec74ee60f8dfef564b573a96b8930f7b6a538e846123d5ad77ba14a8d7a64f"}, - {file = "black-25.9.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b756fc75871cb1bcac5499552d771822fd9db5a2bb8db2a7247936ca48f39831"}, - {file = "black-25.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:846d58e3ce7879ec1ffe816bb9df6d006cd9590515ed5d17db14e17666b2b357"}, - {file = "black-25.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ef69351df3c84485a8beb6f7b8f9721e2009e20ef80a8d619e2d1788b7816d47"}, - {file = "black-25.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e3c1f4cd5e93842774d9ee4ef6cd8d17790e65f44f7cdbaab5f2cf8ccf22a823"}, - {file = "black-25.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:154b06d618233fe468236ba1f0e40823d4eb08b26f5e9261526fde34916b9140"}, - {file = "black-25.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:e593466de7b998374ea2585a471ba90553283fb9beefcfa430d84a2651ed5933"}, - {file = "black-25.9.0-py3-none-any.whl", hash = "sha256:474b34c1342cdc157d307b56c4c65bce916480c4a8f6551fdc6bf9b486a7c4ae"}, - {file = "black-25.9.0.tar.gz", hash = "sha256:0474bca9a0dd1b51791fcc507a4e02078a1c63f6d4e4ae5544b9848c7adfb619"}, -] - -[package.dependencies] -click = ">=8.0.0" -mypy-extensions = ">=0.4.3" -packaging = ">=22.0" -pathspec = ">=0.9.0" -platformdirs = ">=2" -pytokens = ">=0.1.10" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} - -[package.extras] -colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.10)"] -jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -uvloop = ["uvloop (>=0.15.2)"] - -[[package]] -name = "click" -version = "8.1.8" -description = "Composable command line interface toolkit" -optional = false -python-versions = ">=3.7" -groups = ["dev"] -files = [ - {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, - {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - -[[package]] -name = "colorama" -version = "0.4.6" -description = "Cross-platform colored terminal text." -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -groups = ["dev"] -markers = "platform_system == \"Windows\"" -files = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] - -[[package]] -name = "importlib-metadata" -version = "8.7.0" -description = "Read metadata from Python packages" -optional = false -python-versions = ">=3.9" -groups = ["dev"] -markers = "python_version == \"3.9\"" -files = [ - {file = "importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd"}, - {file = "importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000"}, -] - -[package.dependencies] -zipp = ">=3.20" - -[package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] -cover = ["pytest-cov"] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -enabler = ["pytest-enabler (>=2.2)"] -perf = ["ipython"] -test = ["flufl.flake8", "importlib_resources (>=1.3) ; python_version < \"3.9\"", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] -type = ["pytest-mypy"] - -[[package]] -name = "mako" -version = "1.3.10" -description = "A super-fast templating language that borrows the best ideas from the existing templating languages." -optional = false -python-versions = ">=3.8" -groups = ["dev"] -files = [ - {file = "mako-1.3.10-py3-none-any.whl", hash = "sha256:baef24a52fc4fc514a0887ac600f9f1cff3d82c61d4d700a1fa84d597b88db59"}, - {file = "mako-1.3.10.tar.gz", hash = "sha256:99579a6f39583fa7e5630a28c3c1f440e4e97a414b80372649c0ce338da2ea28"}, -] - -[package.dependencies] -MarkupSafe = ">=0.9.2" - -[package.extras] -babel = ["Babel"] -lingua = ["lingua"] -testing = ["pytest"] - -[[package]] -name = "markdown" -version = "3.9" -description = "Python implementation of John Gruber's Markdown." -optional = false -python-versions = ">=3.9" -groups = ["dev"] -files = [ - {file = "markdown-3.9-py3-none-any.whl", hash = "sha256:9f4d91ed810864ea88a6f32c07ba8bee1346c0cc1f6b1f9f6c822f2a9667d280"}, - {file = "markdown-3.9.tar.gz", hash = "sha256:d2900fe1782bd33bdbbd56859defef70c2e78fc46668f8eb9df3128138f2cb6a"}, -] - -[package.dependencies] -importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} - -[package.extras] -docs = ["mdx_gh_links (>=0.2)", "mkdocs (>=1.6)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"] -testing = ["coverage", "pyyaml"] - -[[package]] -name = "markupsafe" -version = "3.0.3" -description = "Safely add untrusted strings to HTML/XML markup." -optional = false -python-versions = ">=3.9" -groups = ["dev"] -files = [ - {file = "markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559"}, - {file = "markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419"}, - {file = "markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695"}, - {file = "markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591"}, - {file = "markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c"}, - {file = "markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f"}, - {file = "markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6"}, - {file = "markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1"}, - {file = "markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa"}, - {file = "markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8"}, - {file = "markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1"}, - {file = "markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad"}, - {file = "markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a"}, - {file = "markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50"}, - {file = "markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf"}, - {file = "markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f"}, - {file = "markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a"}, - {file = "markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115"}, - {file = "markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a"}, - {file = "markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19"}, - {file = "markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01"}, - {file = "markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c"}, - {file = "markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e"}, - {file = "markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce"}, - {file = "markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d"}, - {file = "markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d"}, - {file = "markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a"}, - {file = "markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b"}, - {file = "markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f"}, - {file = "markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b"}, - {file = "markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d"}, - {file = "markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c"}, - {file = "markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f"}, - {file = "markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795"}, - {file = "markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219"}, - {file = "markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6"}, - {file = "markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676"}, - {file = "markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9"}, - {file = "markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1"}, - {file = "markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc"}, - {file = "markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12"}, - {file = "markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed"}, - {file = "markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5"}, - {file = "markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485"}, - {file = "markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73"}, - {file = "markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37"}, - {file = "markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19"}, - {file = "markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025"}, - {file = "markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6"}, - {file = "markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f"}, - {file = "markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb"}, - {file = "markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009"}, - {file = "markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354"}, - {file = "markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218"}, - {file = "markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287"}, - {file = "markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe"}, - {file = "markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026"}, - {file = "markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737"}, - {file = "markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97"}, - {file = "markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d"}, - {file = "markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda"}, - {file = "markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf"}, - {file = "markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe"}, - {file = "markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9"}, - {file = "markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581"}, - {file = "markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4"}, - {file = "markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab"}, - {file = "markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175"}, - {file = "markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634"}, - {file = "markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50"}, - {file = "markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e"}, - {file = "markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5"}, - {file = "markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523"}, - {file = "markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc"}, - {file = "markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d"}, - {file = "markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9"}, - {file = "markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa"}, - {file = "markupsafe-3.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15d939a21d546304880945ca1ecb8a039db6b4dc49b2c5a400387cdae6a62e26"}, - {file = "markupsafe-3.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f71a396b3bf33ecaa1626c255855702aca4d3d9fea5e051b41ac59a9c1c41edc"}, - {file = "markupsafe-3.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f4b68347f8c5eab4a13419215bdfd7f8c9b19f2b25520968adfad23eb0ce60c"}, - {file = "markupsafe-3.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e8fc20152abba6b83724d7ff268c249fa196d8259ff481f3b1476383f8f24e42"}, - {file = "markupsafe-3.0.3-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:949b8d66bc381ee8b007cd945914c721d9aba8e27f71959d750a46f7c282b20b"}, - {file = "markupsafe-3.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:3537e01efc9d4dccdf77221fb1cb3b8e1a38d5428920e0657ce299b20324d758"}, - {file = "markupsafe-3.0.3-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:591ae9f2a647529ca990bc681daebdd52c8791ff06c2bfa05b65163e28102ef2"}, - {file = "markupsafe-3.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a320721ab5a1aba0a233739394eb907f8c8da5c98c9181d1161e77a0c8e36f2d"}, - {file = "markupsafe-3.0.3-cp39-cp39-win32.whl", hash = "sha256:df2449253ef108a379b8b5d6b43f4b1a8e81a061d6537becd5582fba5f9196d7"}, - {file = "markupsafe-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:7c3fb7d25180895632e5d3148dbdc29ea38ccb7fd210aa27acbd1201a1902c6e"}, - {file = "markupsafe-3.0.3-cp39-cp39-win_arm64.whl", hash = "sha256:38664109c14ffc9e7437e86b4dceb442b0096dfe3541d7864d9cbe1da4cf36c8"}, - {file = "markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698"}, -] - -[[package]] -name = "mypy-extensions" -version = "1.1.0" -description = "Type system extensions for programs checked with the mypy type checker." -optional = false -python-versions = ">=3.8" -groups = ["dev"] -files = [ - {file = "mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505"}, - {file = "mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558"}, -] - -[[package]] -name = "packaging" -version = "25.0" -description = "Core utilities for Python packages" -optional = false -python-versions = ">=3.8" -groups = ["dev"] -files = [ - {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, - {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, -] - -[[package]] -name = "pathspec" -version = "0.12.1" -description = "Utility library for gitignore style pattern matching of file paths." -optional = false -python-versions = ">=3.8" -groups = ["dev"] -files = [ - {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, - {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, -] - -[[package]] -name = "pdoc3" -version = "0.11.6" -description = "Auto-generate API documentation for Python projects." -optional = false -python-versions = ">=3.9" -groups = ["dev"] -files = [ - {file = "pdoc3-0.11.6-py3-none-any.whl", hash = "sha256:8b72723767bd48d899812d2aec8375fc1c3476e179455db0b4575e6dccb44b93"}, - {file = "pdoc3-0.11.6.tar.gz", hash = "sha256:1ea5e84b87a754d191fb64bf5e517ca6c50d0d84a614c1efecf6b46d290ae387"}, -] - -[package.dependencies] -mako = "*" -markdown = ">=3.0" - -[[package]] -name = "platformdirs" -version = "4.4.0" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." -optional = false -python-versions = ">=3.9" -groups = ["dev"] -files = [ - {file = "platformdirs-4.4.0-py3-none-any.whl", hash = "sha256:abd01743f24e5287cd7a5db3752faf1a2d65353f38ec26d98e25a6db65958c85"}, - {file = "platformdirs-4.4.0.tar.gz", hash = "sha256:ca753cf4d81dc309bc67b0ea38fd15dc97bc30ce419a7f58d13eb3bf14c4febf"}, -] - -[package.extras] -docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.1.3)", "sphinx-autodoc-typehints (>=3)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.4)", "pytest-cov (>=6)", "pytest-mock (>=3.14)"] -type = ["mypy (>=1.14.1)"] - -[[package]] -name = "pydal" -version = "20200714.1" -description = "a pure Python Database Abstraction Layer (for python version 2.7 and 3.x)" -optional = false -python-versions = "*" -groups = ["main"] -files = [ - {file = "pydal-20200714.1.tar.gz", hash = "sha256:dd35b8ecb009099cce7efa72a40707d2e9bdcdf85924f30683a52d5172d1242f"}, -] - -[[package]] -name = "pytokens" -version = "0.1.10" -description = "A Fast, spec compliant Python 3.12+ tokenizer that runs on older Pythons." -optional = false -python-versions = ">=3.8" -groups = ["dev"] -files = [ - {file = "pytokens-0.1.10-py3-none-any.whl", hash = "sha256:db7b72284e480e69fb085d9f251f66b3d2df8b7166059261258ff35f50fb711b"}, - {file = "pytokens-0.1.10.tar.gz", hash = "sha256:c9a4bfa0be1d26aebce03e6884ba454e842f186a59ea43a6d3b25af58223c044"}, -] - -[package.extras] -dev = ["black", "build", "mypy", "pytest", "pytest-cov", "setuptools", "tox", "twine", "wheel"] - -[[package]] -name = "tomli" -version = "2.2.1" -description = "A lil' TOML parser" -optional = false -python-versions = ">=3.8" -groups = ["dev"] -markers = "python_version < \"3.11\"" -files = [ - {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, - {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, - {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, - {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, - {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, - {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, - {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, - {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, - {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, - {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, - {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, - {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, - {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, - {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, - {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, - {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, - {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, - {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, - {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, - {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, - {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, - {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, - {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, - {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, - {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, - {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, - {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, - {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, - {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, - {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, - {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, - {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, -] - -[[package]] -name = "typing-extensions" -version = "4.15.0" -description = "Backported and Experimental Type Hints for Python 3.9+" -optional = false -python-versions = ">=3.9" -groups = ["dev"] -markers = "python_version < \"3.11\"" -files = [ - {file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"}, - {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"}, -] - -[[package]] -name = "zipp" -version = "3.23.0" -description = "Backport of pathlib-compatible object wrapper for zip files" -optional = false -python-versions = ">=3.9" -groups = ["dev"] -markers = "python_version == \"3.9\"" -files = [ - {file = "zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e"}, - {file = "zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166"}, -] - -[package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] -cover = ["pytest-cov"] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -enabler = ["pytest-enabler (>=2.2)"] -test = ["big-O", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more_itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] -type = ["pytest-mypy"] - -[metadata] -lock-version = "2.1" -python-versions = ">=3.9,<=3.11.13" -content-hash = "db76b1120c727c70e551fdf885e3eb4ee6a99b0c17e332662ca8b1c1d39aa63d" diff --git a/pyproject.toml b/pyproject.toml index 56a5d28c..ca3a5f5b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,18 +1,53 @@ -[tool.poetry] +[project] name = "pytm" version = "1.3.1" description = "A Pythonic framework for threat modeling" -authors = ["pytm Team"] -license = "MIT License" +readme = { file = "README.md", content-type = "text/markdown" } +authors = [ + { name = "pytm team", email = "please_use_github_issues@nowhere.com" }, + { name = "Izar Tarandach" }, + { name = "Rohit Shambhuni" }, + { name = "Nick Ozmore" }, + { name = "Matthew Coles" }, + { name = "Pooja Avhad" }, + { name = "Jan Was" }, +] +license = { text = "MIT License" } +classifiers = [ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", + "Development Status :: 5 - Production/Stable", + "Environment :: Console", + "Intended Audience :: Developers", + "Topic :: Security", + "Natural Language :: English", +] +urls = { "Repository" = "https://github.com/OWASP/pytm" } +requires-python = ">=3.10" +dependencies = [ + "pydal>=20200714.1" +] -[tool.poetry.dependencies] -python = ">=3.9,<=3.11.13" -pydal = "~20200714.1" +[dependency-groups] +dev = [ + "basedpyright>=1.34.0", + "pytest>=9.0.1", + "ruff>=0.14.6", +] -[tool.poetry.group.dev.dependencies] -black = "^25.9.0" -pdoc3 = "^0.11.6" +[tool.uv] +required-version = ">=0.9.11" [build-system] -requires = ["poetry>=0.12"] -build-backend = "poetry.masonry.api" +requires = ["uv_build>=0.9.10,<0.10.0"] +build-backend = "uv_build" + +[tool.uv.build-backend] +data = {} +default-excludes = true +module-name = "pytm" +module-root = "src" +namespace = false +source-exclude = ["docs/**"] +source-include = [] diff --git a/requirements-dev.txt b/requirements-dev.txt index 432090a0..f45306e5 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,3 +1,219 @@ --r requirements.txt -pdoc3 -black +# This file was autogenerated by uv via the following command: +# uv export --no-editable --only-dev --format requirements.txt --output-file requirements-dev.txt +black==25.11.0 \ + --hash=sha256:0a1d40348b6621cc20d3d7530a5b8d67e9714906dfd7346338249ad9c6cedf2b \ + --hash=sha256:0c0f7c461df55cf32929b002335883946a4893d759f2df343389c4396f3b6b37 \ + --hash=sha256:1032639c90208c15711334d681de2e24821af0575573db2810b0763bcd62e0f0 \ + --hash=sha256:35690a383f22dd3e468c85dc4b915217f87667ad9cce781d7b42678ce63c4170 \ + --hash=sha256:51c65d7d60bb25429ea2bf0731c32b2a2442eb4bd3b2afcb47830f0b13e58bfd \ + --hash=sha256:5bd4a22a0b37401c8e492e994bce79e614f91b14d9ea911f44f36e262195fdda \ + --hash=sha256:6cb2d54a39e0ef021d6c5eef442e10fd71fcb491be6413d083a320ee768329dd \ + --hash=sha256:6cced12b747c4c76bc09b4db057c319d8545307266f41aaee665540bc0e04e96 \ + --hash=sha256:7eebd4744dfe92ef1ee349dc532defbf012a88b087bb7ddd688ff59a447b080e \ + --hash=sha256:80e7486ad3535636657aa180ad32a7d67d7c273a80e12f1b4bfa0823d54e8fac \ + --hash=sha256:895571922a35434a9d8ca67ef926da6bc9ad464522a5fe0db99b394ef1c0675a \ + --hash=sha256:936c4dd07669269f40b497440159a221ee435e3fddcf668e0c05244a9be71993 \ + --hash=sha256:9a323ac32f5dc75ce7470501b887250be5005a01602e931a15e45593f70f6e08 \ + --hash=sha256:aa211411e94fdf86519996b7f5f05e71ba34835d8f0c0f03c00a26271da02664 \ + --hash=sha256:ae263af2f496940438e5be1a0c1020e13b09154f3af4df0835ea7f9fe7bfa409 \ + --hash=sha256:cb4f4b65d717062191bdec8e4a442539a8ea065e6af1c4f4d36f0cdb5f71e170 \ + --hash=sha256:d81a44cbc7e4f73a9d6ae449ec2317ad81512d1e7dce7d57f6333fd6259737bc \ + --hash=sha256:dae49ef7369c6caa1a1833fd5efb7c3024bb7e4499bf64833f65ad27791b1545 \ + --hash=sha256:e3f562da087791e96cefcd9dda058380a442ab322a02e222add53736451f604b \ + --hash=sha256:ec311e22458eec32a807f029b2646f661e6859c3f61bc6d9ffb67958779f392e \ + --hash=sha256:f42c0ea7f59994490f4dccd64e6b2dd49ac57c7c84f38b8faab50f8759db245c \ + --hash=sha256:f9786c24d8e9bd5f20dc7a7f0cdd742644656987f6ea6947629306f937726c03 +click==8.3.1 \ + --hash=sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a \ + --hash=sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6 + # via black +colorama==0.4.6 ; sys_platform == 'win32' \ + --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ + --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 + # via + # click + # pytest +exceptiongroup==1.3.1 ; python_full_version < '3.11' \ + --hash=sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219 \ + --hash=sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598 + # via pytest +iniconfig==2.3.0 \ + --hash=sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730 \ + --hash=sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12 + # via pytest +mako==1.3.10 \ + --hash=sha256:99579a6f39583fa7e5630a28c3c1f440e4e97a414b80372649c0ce338da2ea28 \ + --hash=sha256:baef24a52fc4fc514a0887ac600f9f1cff3d82c61d4d700a1fa84d597b88db59 + # via pdoc3 +markdown==3.10 \ + --hash=sha256:37062d4f2aa4b2b6b32aefb80faa300f82cc790cb949a35b8caede34f2b68c0e \ + --hash=sha256:b5b99d6951e2e4948d939255596523444c0e677c669700b1d17aa4a8a464cb7c + # via pdoc3 +markupsafe==3.0.3 \ + --hash=sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f \ + --hash=sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a \ + --hash=sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf \ + --hash=sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19 \ + --hash=sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf \ + --hash=sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175 \ + --hash=sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219 \ + --hash=sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb \ + --hash=sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6 \ + --hash=sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab \ + --hash=sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1 \ + --hash=sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce \ + --hash=sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218 \ + --hash=sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634 \ + --hash=sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695 \ + --hash=sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad \ + --hash=sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73 \ + --hash=sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c \ + --hash=sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe \ + --hash=sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa \ + --hash=sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559 \ + --hash=sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa \ + --hash=sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37 \ + --hash=sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f \ + --hash=sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d \ + --hash=sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c \ + --hash=sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97 \ + --hash=sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a \ + --hash=sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19 \ + --hash=sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9 \ + --hash=sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9 \ + --hash=sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc \ + --hash=sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4 \ + --hash=sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354 \ + --hash=sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50 \ + --hash=sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698 \ + --hash=sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9 \ + --hash=sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b \ + --hash=sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc \ + --hash=sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115 \ + --hash=sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485 \ + --hash=sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f \ + --hash=sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12 \ + --hash=sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025 \ + --hash=sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009 \ + --hash=sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d \ + --hash=sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a \ + --hash=sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5 \ + --hash=sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f \ + --hash=sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1 \ + --hash=sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287 \ + --hash=sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6 \ + --hash=sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f \ + --hash=sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581 \ + --hash=sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed \ + --hash=sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b \ + --hash=sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c \ + --hash=sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026 \ + --hash=sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8 \ + --hash=sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676 \ + --hash=sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6 \ + --hash=sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e \ + --hash=sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d \ + --hash=sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d \ + --hash=sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01 \ + --hash=sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419 \ + --hash=sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795 \ + --hash=sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1 \ + --hash=sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5 \ + --hash=sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d \ + --hash=sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe \ + --hash=sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda \ + --hash=sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e \ + --hash=sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737 \ + --hash=sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523 \ + --hash=sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591 \ + --hash=sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a \ + --hash=sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50 + # via mako +mypy-extensions==1.1.0 \ + --hash=sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505 \ + --hash=sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558 + # via black +packaging==25.0 \ + --hash=sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484 \ + --hash=sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f + # via + # black + # pytest +pathspec==0.12.1 \ + --hash=sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08 \ + --hash=sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712 + # via black +pdoc3==0.11.6 \ + --hash=sha256:1ea5e84b87a754d191fb64bf5e517ca6c50d0d84a614c1efecf6b46d290ae387 \ + --hash=sha256:8b72723767bd48d899812d2aec8375fc1c3476e179455db0b4575e6dccb44b93 +platformdirs==4.5.0 \ + --hash=sha256:70ddccdd7c99fc5942e9fc25636a8b34d04c24b335100223152c2803e4063312 \ + --hash=sha256:e578a81bb873cbb89a41fcc904c7ef523cc18284b7e3b3ccf06aca1403b7ebd3 + # via black +pluggy==1.6.0 \ + --hash=sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3 \ + --hash=sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746 + # via pytest +pygments==2.19.2 \ + --hash=sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887 \ + --hash=sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b + # via pytest +pytest==9.0.1 \ + --hash=sha256:3e9c069ea73583e255c3b21cf46b8d3c56f6e3a1a8f6da94ccb0fcf57b9d73c8 \ + --hash=sha256:67be0030d194df2dfa7b556f2e56fb3c3315bd5c8822c6951162b92b32ce7dad +pytokens==0.3.0 \ + --hash=sha256:2f932b14ed08de5fcf0b391ace2642f858f1394c0857202959000b68ed7a458a \ + --hash=sha256:95b2b5eaf832e469d141a378872480ede3f251a5a5041b8ec6e581d3ac71bbf3 + # via black +tomli==2.3.0 ; python_full_version < '3.11' \ + --hash=sha256:00b5f5d95bbfc7d12f91ad8c593a1659b6387b43f054104cda404be6bda62456 \ + --hash=sha256:0a154a9ae14bfcf5d8917a59b51ffd5a3ac1fd149b71b47a3a104ca4edcfa845 \ + --hash=sha256:0c95ca56fbe89e065c6ead5b593ee64b84a26fca063b5d71a1122bf26e533999 \ + --hash=sha256:0eea8cc5c5e9f89c9b90c4896a8deefc74f518db5927d0e0e8d4a80953d774d0 \ + --hash=sha256:1cb4ed918939151a03f33d4242ccd0aa5f11b3547d0cf30f7c74a408a5b99878 \ + --hash=sha256:4021923f97266babc6ccab9f5068642a0095faa0a51a246a6a02fccbb3514eaf \ + --hash=sha256:4c2ef0244c75aba9355561272009d934953817c49f47d768070c3c94355c2aa3 \ + --hash=sha256:4dc4ce8483a5d429ab602f111a93a6ab1ed425eae3122032db7e9acf449451be \ + --hash=sha256:4f195fe57ecceac95a66a75ac24d9d5fbc98ef0962e09b2eddec5d39375aae52 \ + --hash=sha256:5192f562738228945d7b13d4930baffda67b69425a7f0da96d360b0a3888136b \ + --hash=sha256:5e01decd096b1530d97d5d85cb4dff4af2d8347bd35686654a004f8dea20fc67 \ + --hash=sha256:64be704a875d2a59753d80ee8a533c3fe183e3f06807ff7dc2232938ccb01549 \ + --hash=sha256:70a251f8d4ba2d9ac2542eecf008b3c8a9fc5c3f9f02c56a9d7952612be2fdba \ + --hash=sha256:73ee0b47d4dad1c5e996e3cd33b8a76a50167ae5f96a2607cbe8cc773506ab22 \ + --hash=sha256:74bf8464ff93e413514fefd2be591c3b0b23231a77f901db1eb30d6f712fc42c \ + --hash=sha256:792262b94d5d0a466afb5bc63c7daa9d75520110971ee269152083270998316f \ + --hash=sha256:7b0882799624980785240ab732537fcfc372601015c00f7fc367c55308c186f6 \ + --hash=sha256:883b1c0d6398a6a9d29b508c331fa56adbcdff647f6ace4dfca0f50e90dfd0ba \ + --hash=sha256:88bd15eb972f3664f5ed4b57c1634a97153b4bac4479dcb6a495f41921eb7f45 \ + --hash=sha256:8a35dd0e643bb2610f156cca8db95d213a90015c11fee76c946aa62b7ae7e02f \ + --hash=sha256:940d56ee0410fa17ee1f12b817b37a4d4e4dc4d27340863cc67236c74f582e77 \ + --hash=sha256:97d5eec30149fd3294270e889b4234023f2c69747e555a27bd708828353ab606 \ + --hash=sha256:a0e285d2649b78c0d9027570d4da3425bdb49830a6156121360b3f8511ea3441 \ + --hash=sha256:a1f7f282fe248311650081faafa5f4732bdbfef5d45fe3f2e702fbc6f2d496e0 \ + --hash=sha256:a4ea38c40145a357d513bffad0ed869f13c1773716cf71ccaa83b0fa0cc4e42f \ + --hash=sha256:a56212bdcce682e56b0aaf79e869ba5d15a6163f88d5451cbde388d48b13f530 \ + --hash=sha256:ad805ea85eda330dbad64c7ea7a4556259665bdf9d2672f5dccc740eb9d3ca05 \ + --hash=sha256:b273fcbd7fc64dc3600c098e39136522650c49bca95df2d11cf3b626422392c8 \ + --hash=sha256:b5870b50c9db823c595983571d1296a6ff3e1b88f734a4c8f6fc6188397de005 \ + --hash=sha256:b74a0e59ec5d15127acdabd75ea17726ac4c5178ae51b85bfe39c4f8a278e879 \ + --hash=sha256:be71c93a63d738597996be9528f4abe628d1adf5e6eb11607bc8fe1a510b5dae \ + --hash=sha256:c22a8bf253bacc0cf11f35ad9808b6cb75ada2631c2d97c971122583b129afbc \ + --hash=sha256:c4665508bcbac83a31ff8ab08f424b665200c0e1e645d2bd9ab3d3e557b6185b \ + --hash=sha256:c5f3ffd1e098dfc032d4d3af5c0ac64f6d286d98bc148698356847b80fa4de1b \ + --hash=sha256:cebc6fe843e0733ee827a282aca4999b596241195f43b4cc371d64fc6639da9e \ + --hash=sha256:d1381caf13ab9f300e30dd8feadb3de072aeb86f1d34a8569453ff32a7dea4bf \ + --hash=sha256:d7d86942e56ded512a594786a5ba0a5e521d02529b3826e7761a05138341a2ac \ + --hash=sha256:e31d432427dcbf4d86958c184b9bfd1e96b5b71f8eb17e6d02531f434fd335b8 \ + --hash=sha256:e95b1af3c5b07d9e643909b5abbec77cd9f1217e6d0bca72b0234736b9fb1f1b \ + --hash=sha256:f85209946d1fe94416debbb88d00eb92ce9cd5266775424ff81bc959e001acaf \ + --hash=sha256:feb0dacc61170ed7ab602d3d972a58f14ee3ee60494292d384649a3dc38ef463 \ + --hash=sha256:ff72b71b5d10d22ecb084d345fc26f42b5143c5533db5e2eaba7d2d335358876 + # via + # black + # pytest +typing-extensions==4.15.0 ; python_full_version < '3.11' \ + --hash=sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466 \ + --hash=sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548 + # via + # black + # exceptiongroup diff --git a/requirements.txt b/requirements.txt index d5223819..05dd2ab4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,223 @@ -pydal>=20200714.1 +# This file was autogenerated by uv via the following command: +# uv export --no-editable --format requirements.txt +black==25.11.0 \ + --hash=sha256:0a1d40348b6621cc20d3d7530a5b8d67e9714906dfd7346338249ad9c6cedf2b \ + --hash=sha256:0c0f7c461df55cf32929b002335883946a4893d759f2df343389c4396f3b6b37 \ + --hash=sha256:1032639c90208c15711334d681de2e24821af0575573db2810b0763bcd62e0f0 \ + --hash=sha256:35690a383f22dd3e468c85dc4b915217f87667ad9cce781d7b42678ce63c4170 \ + --hash=sha256:51c65d7d60bb25429ea2bf0731c32b2a2442eb4bd3b2afcb47830f0b13e58bfd \ + --hash=sha256:5bd4a22a0b37401c8e492e994bce79e614f91b14d9ea911f44f36e262195fdda \ + --hash=sha256:6cb2d54a39e0ef021d6c5eef442e10fd71fcb491be6413d083a320ee768329dd \ + --hash=sha256:6cced12b747c4c76bc09b4db057c319d8545307266f41aaee665540bc0e04e96 \ + --hash=sha256:7eebd4744dfe92ef1ee349dc532defbf012a88b087bb7ddd688ff59a447b080e \ + --hash=sha256:80e7486ad3535636657aa180ad32a7d67d7c273a80e12f1b4bfa0823d54e8fac \ + --hash=sha256:895571922a35434a9d8ca67ef926da6bc9ad464522a5fe0db99b394ef1c0675a \ + --hash=sha256:936c4dd07669269f40b497440159a221ee435e3fddcf668e0c05244a9be71993 \ + --hash=sha256:9a323ac32f5dc75ce7470501b887250be5005a01602e931a15e45593f70f6e08 \ + --hash=sha256:aa211411e94fdf86519996b7f5f05e71ba34835d8f0c0f03c00a26271da02664 \ + --hash=sha256:ae263af2f496940438e5be1a0c1020e13b09154f3af4df0835ea7f9fe7bfa409 \ + --hash=sha256:cb4f4b65d717062191bdec8e4a442539a8ea065e6af1c4f4d36f0cdb5f71e170 \ + --hash=sha256:d81a44cbc7e4f73a9d6ae449ec2317ad81512d1e7dce7d57f6333fd6259737bc \ + --hash=sha256:dae49ef7369c6caa1a1833fd5efb7c3024bb7e4499bf64833f65ad27791b1545 \ + --hash=sha256:e3f562da087791e96cefcd9dda058380a442ab322a02e222add53736451f604b \ + --hash=sha256:ec311e22458eec32a807f029b2646f661e6859c3f61bc6d9ffb67958779f392e \ + --hash=sha256:f42c0ea7f59994490f4dccd64e6b2dd49ac57c7c84f38b8faab50f8759db245c \ + --hash=sha256:f9786c24d8e9bd5f20dc7a7f0cdd742644656987f6ea6947629306f937726c03 +click==8.3.1 \ + --hash=sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a \ + --hash=sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6 + # via black +colorama==0.4.6 ; sys_platform == 'win32' \ + --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ + --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 + # via + # click + # pytest +exceptiongroup==1.3.1 ; python_full_version < '3.11' \ + --hash=sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219 \ + --hash=sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598 + # via pytest +iniconfig==2.3.0 \ + --hash=sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730 \ + --hash=sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12 + # via pytest +mako==1.3.10 \ + --hash=sha256:99579a6f39583fa7e5630a28c3c1f440e4e97a414b80372649c0ce338da2ea28 \ + --hash=sha256:baef24a52fc4fc514a0887ac600f9f1cff3d82c61d4d700a1fa84d597b88db59 + # via pdoc3 +markdown==3.10 \ + --hash=sha256:37062d4f2aa4b2b6b32aefb80faa300f82cc790cb949a35b8caede34f2b68c0e \ + --hash=sha256:b5b99d6951e2e4948d939255596523444c0e677c669700b1d17aa4a8a464cb7c + # via pdoc3 +markupsafe==3.0.3 \ + --hash=sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f \ + --hash=sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a \ + --hash=sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf \ + --hash=sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19 \ + --hash=sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf \ + --hash=sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175 \ + --hash=sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219 \ + --hash=sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb \ + --hash=sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6 \ + --hash=sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab \ + --hash=sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1 \ + --hash=sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce \ + --hash=sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218 \ + --hash=sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634 \ + --hash=sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695 \ + --hash=sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad \ + --hash=sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73 \ + --hash=sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c \ + --hash=sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe \ + --hash=sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa \ + --hash=sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559 \ + --hash=sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa \ + --hash=sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37 \ + --hash=sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f \ + --hash=sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d \ + --hash=sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c \ + --hash=sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97 \ + --hash=sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a \ + --hash=sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19 \ + --hash=sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9 \ + --hash=sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9 \ + --hash=sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc \ + --hash=sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4 \ + --hash=sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354 \ + --hash=sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50 \ + --hash=sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698 \ + --hash=sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9 \ + --hash=sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b \ + --hash=sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc \ + --hash=sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115 \ + --hash=sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485 \ + --hash=sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f \ + --hash=sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12 \ + --hash=sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025 \ + --hash=sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009 \ + --hash=sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d \ + --hash=sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a \ + --hash=sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5 \ + --hash=sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f \ + --hash=sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1 \ + --hash=sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287 \ + --hash=sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6 \ + --hash=sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f \ + --hash=sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581 \ + --hash=sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed \ + --hash=sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b \ + --hash=sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c \ + --hash=sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026 \ + --hash=sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8 \ + --hash=sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676 \ + --hash=sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6 \ + --hash=sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e \ + --hash=sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d \ + --hash=sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d \ + --hash=sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01 \ + --hash=sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419 \ + --hash=sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795 \ + --hash=sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1 \ + --hash=sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5 \ + --hash=sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d \ + --hash=sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe \ + --hash=sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda \ + --hash=sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e \ + --hash=sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737 \ + --hash=sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523 \ + --hash=sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591 \ + --hash=sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a \ + --hash=sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50 + # via mako +mypy-extensions==1.1.0 \ + --hash=sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505 \ + --hash=sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558 + # via black +packaging==25.0 \ + --hash=sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484 \ + --hash=sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f + # via + # black + # pytest +pathspec==0.12.1 \ + --hash=sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08 \ + --hash=sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712 + # via black +pdoc3==0.11.6 \ + --hash=sha256:1ea5e84b87a754d191fb64bf5e517ca6c50d0d84a614c1efecf6b46d290ae387 \ + --hash=sha256:8b72723767bd48d899812d2aec8375fc1c3476e179455db0b4575e6dccb44b93 +platformdirs==4.5.0 \ + --hash=sha256:70ddccdd7c99fc5942e9fc25636a8b34d04c24b335100223152c2803e4063312 \ + --hash=sha256:e578a81bb873cbb89a41fcc904c7ef523cc18284b7e3b3ccf06aca1403b7ebd3 + # via black +pluggy==1.6.0 \ + --hash=sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3 \ + --hash=sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746 + # via pytest +pydal==20251115.1 \ + --hash=sha256:d381bb0e4b0e2de61a34dbf0ebecbc95b8175423f3a8ea64b15d03672e067080 \ + --hash=sha256:d726b0f1209b29228d6a283ef444c03a634ebaf6cb54e509b491414c41a72a97 + # via pytm +pygments==2.19.2 \ + --hash=sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887 \ + --hash=sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b + # via pytest +pytest==9.0.1 \ + --hash=sha256:3e9c069ea73583e255c3b21cf46b8d3c56f6e3a1a8f6da94ccb0fcf57b9d73c8 \ + --hash=sha256:67be0030d194df2dfa7b556f2e56fb3c3315bd5c8822c6951162b92b32ce7dad +pytokens==0.3.0 \ + --hash=sha256:2f932b14ed08de5fcf0b391ace2642f858f1394c0857202959000b68ed7a458a \ + --hash=sha256:95b2b5eaf832e469d141a378872480ede3f251a5a5041b8ec6e581d3ac71bbf3 + # via black +tomli==2.3.0 ; python_full_version < '3.11' \ + --hash=sha256:00b5f5d95bbfc7d12f91ad8c593a1659b6387b43f054104cda404be6bda62456 \ + --hash=sha256:0a154a9ae14bfcf5d8917a59b51ffd5a3ac1fd149b71b47a3a104ca4edcfa845 \ + --hash=sha256:0c95ca56fbe89e065c6ead5b593ee64b84a26fca063b5d71a1122bf26e533999 \ + --hash=sha256:0eea8cc5c5e9f89c9b90c4896a8deefc74f518db5927d0e0e8d4a80953d774d0 \ + --hash=sha256:1cb4ed918939151a03f33d4242ccd0aa5f11b3547d0cf30f7c74a408a5b99878 \ + --hash=sha256:4021923f97266babc6ccab9f5068642a0095faa0a51a246a6a02fccbb3514eaf \ + --hash=sha256:4c2ef0244c75aba9355561272009d934953817c49f47d768070c3c94355c2aa3 \ + --hash=sha256:4dc4ce8483a5d429ab602f111a93a6ab1ed425eae3122032db7e9acf449451be \ + --hash=sha256:4f195fe57ecceac95a66a75ac24d9d5fbc98ef0962e09b2eddec5d39375aae52 \ + --hash=sha256:5192f562738228945d7b13d4930baffda67b69425a7f0da96d360b0a3888136b \ + --hash=sha256:5e01decd096b1530d97d5d85cb4dff4af2d8347bd35686654a004f8dea20fc67 \ + --hash=sha256:64be704a875d2a59753d80ee8a533c3fe183e3f06807ff7dc2232938ccb01549 \ + --hash=sha256:70a251f8d4ba2d9ac2542eecf008b3c8a9fc5c3f9f02c56a9d7952612be2fdba \ + --hash=sha256:73ee0b47d4dad1c5e996e3cd33b8a76a50167ae5f96a2607cbe8cc773506ab22 \ + --hash=sha256:74bf8464ff93e413514fefd2be591c3b0b23231a77f901db1eb30d6f712fc42c \ + --hash=sha256:792262b94d5d0a466afb5bc63c7daa9d75520110971ee269152083270998316f \ + --hash=sha256:7b0882799624980785240ab732537fcfc372601015c00f7fc367c55308c186f6 \ + --hash=sha256:883b1c0d6398a6a9d29b508c331fa56adbcdff647f6ace4dfca0f50e90dfd0ba \ + --hash=sha256:88bd15eb972f3664f5ed4b57c1634a97153b4bac4479dcb6a495f41921eb7f45 \ + --hash=sha256:8a35dd0e643bb2610f156cca8db95d213a90015c11fee76c946aa62b7ae7e02f \ + --hash=sha256:940d56ee0410fa17ee1f12b817b37a4d4e4dc4d27340863cc67236c74f582e77 \ + --hash=sha256:97d5eec30149fd3294270e889b4234023f2c69747e555a27bd708828353ab606 \ + --hash=sha256:a0e285d2649b78c0d9027570d4da3425bdb49830a6156121360b3f8511ea3441 \ + --hash=sha256:a1f7f282fe248311650081faafa5f4732bdbfef5d45fe3f2e702fbc6f2d496e0 \ + --hash=sha256:a4ea38c40145a357d513bffad0ed869f13c1773716cf71ccaa83b0fa0cc4e42f \ + --hash=sha256:a56212bdcce682e56b0aaf79e869ba5d15a6163f88d5451cbde388d48b13f530 \ + --hash=sha256:ad805ea85eda330dbad64c7ea7a4556259665bdf9d2672f5dccc740eb9d3ca05 \ + --hash=sha256:b273fcbd7fc64dc3600c098e39136522650c49bca95df2d11cf3b626422392c8 \ + --hash=sha256:b5870b50c9db823c595983571d1296a6ff3e1b88f734a4c8f6fc6188397de005 \ + --hash=sha256:b74a0e59ec5d15127acdabd75ea17726ac4c5178ae51b85bfe39c4f8a278e879 \ + --hash=sha256:be71c93a63d738597996be9528f4abe628d1adf5e6eb11607bc8fe1a510b5dae \ + --hash=sha256:c22a8bf253bacc0cf11f35ad9808b6cb75ada2631c2d97c971122583b129afbc \ + --hash=sha256:c4665508bcbac83a31ff8ab08f424b665200c0e1e645d2bd9ab3d3e557b6185b \ + --hash=sha256:c5f3ffd1e098dfc032d4d3af5c0ac64f6d286d98bc148698356847b80fa4de1b \ + --hash=sha256:cebc6fe843e0733ee827a282aca4999b596241195f43b4cc371d64fc6639da9e \ + --hash=sha256:d1381caf13ab9f300e30dd8feadb3de072aeb86f1d34a8569453ff32a7dea4bf \ + --hash=sha256:d7d86942e56ded512a594786a5ba0a5e521d02529b3826e7761a05138341a2ac \ + --hash=sha256:e31d432427dcbf4d86958c184b9bfd1e96b5b71f8eb17e6d02531f434fd335b8 \ + --hash=sha256:e95b1af3c5b07d9e643909b5abbec77cd9f1217e6d0bca72b0234736b9fb1f1b \ + --hash=sha256:f85209946d1fe94416debbb88d00eb92ce9cd5266775424ff81bc959e001acaf \ + --hash=sha256:feb0dacc61170ed7ab602d3d972a58f14ee3ee60494292d384649a3dc38ef463 \ + --hash=sha256:ff72b71b5d10d22ecb084d345fc26f42b5143c5533db5e2eaba7d2d335358876 + # via + # black + # pytest +typing-extensions==4.15.0 ; python_full_version < '3.11' \ + --hash=sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466 \ + --hash=sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548 + # via + # black + # exceptiongroup diff --git a/pytm/TODO.txt b/src/pytm/TODO.txt similarity index 100% rename from pytm/TODO.txt rename to src/pytm/TODO.txt diff --git a/pytm/__init__.py b/src/pytm/__init__.py similarity index 100% rename from pytm/__init__.py rename to src/pytm/__init__.py diff --git a/pytm/flows.py b/src/pytm/flows.py similarity index 100% rename from pytm/flows.py rename to src/pytm/flows.py diff --git a/pytm/images/datastore.png b/src/pytm/images/datastore.png similarity index 100% rename from pytm/images/datastore.png rename to src/pytm/images/datastore.png diff --git a/pytm/images/datastore_black.png b/src/pytm/images/datastore_black.png similarity index 100% rename from pytm/images/datastore_black.png rename to src/pytm/images/datastore_black.png diff --git a/pytm/images/datastore_darkgreen.png b/src/pytm/images/datastore_darkgreen.png similarity index 100% rename from pytm/images/datastore_darkgreen.png rename to src/pytm/images/datastore_darkgreen.png diff --git a/pytm/images/datastore_firebrick3.png b/src/pytm/images/datastore_firebrick3.png similarity index 100% rename from pytm/images/datastore_firebrick3.png rename to src/pytm/images/datastore_firebrick3.png diff --git a/pytm/images/datastore_gold.png b/src/pytm/images/datastore_gold.png similarity index 100% rename from pytm/images/datastore_gold.png rename to src/pytm/images/datastore_gold.png diff --git a/pytm/images/lambda.png b/src/pytm/images/lambda.png similarity index 100% rename from pytm/images/lambda.png rename to src/pytm/images/lambda.png diff --git a/pytm/json.py b/src/pytm/json.py similarity index 100% rename from pytm/json.py rename to src/pytm/json.py diff --git a/pytm/pytm.py b/src/pytm/pytm.py similarity index 98% rename from pytm/pytm.py rename to src/pytm/pytm.py index a7116878..83feb5ea 100644 --- a/pytm/pytm.py +++ b/src/pytm/pytm.py @@ -1,5 +1,7 @@ import argparse +import copy import errno +import html import inspect import json import logging @@ -7,19 +9,17 @@ import random import sys import uuid -import html -import copy - from collections import Counter, defaultdict from collections.abc import Iterable +from datetime import datetime from enum import Enum from functools import lru_cache, singledispatch from hashlib import sha224 +from importlib import resources from itertools import combinations from shutil import rmtree from textwrap import indent, wrap from weakref import WeakKeyDictionary -from datetime import datetime from .template_engine import SuperFormatter @@ -142,8 +142,9 @@ class varElement(var): def __set__(self, instance, value): if not isinstance(value, Element): raise ValueError( - "expecting an Element (or inherited) " - "value, got a {}".format(type(value)) + "expecting an Element (or inherited) value, got a {}".format( + type(value) + ) ) super().__set__(instance, value) @@ -262,9 +263,7 @@ def __str__(self): class varControls(var): def __set__(self, instance, value): if not isinstance(value, Controls): - raise ValueError( - f"expecting an Controls value, got a {type(value)}" - ) + raise ValueError(f"expecting an Controls value, got a {type(value)}") super().__set__(instance, value) @@ -283,9 +282,7 @@ def __set__(self, instance, value): class varAssumption(var): def __set__(self, instance, value): if not isinstance(value, Assumption): - raise ValueError( - f"expecting an Assumption value, got a {type(value)}" - ) + raise ValueError(f"expecting an Assumption value, got a {type(value)}") super().__set__(instance, value) @@ -560,7 +557,7 @@ def _describe_classes(classes): docs.append("required") if attr.default or isinstance(attr.default, bool): docs.append("default: {}".format(attr.default)) - lpadding = f'\n{" ":<{longest+2}}' + lpadding = f"\n{' ':<{longest + 2}}" print(f" {i:<{longest}}{lpadding.join(docs)}") print() @@ -687,7 +684,11 @@ class Finding: threat_id = varString("", required=True, doc="Threat ID") references = varString("", required=True, doc="Threat references") condition = varString("", required=True, doc="Threat condition") - assumption = varAssumption(None, required=False, doc="The assumption, that caused this finding to be excluded") + assumption = varAssumption( + None, + required=False, + doc="The assumption, that caused this finding to be excluded", + ) response = varString( "", required=False, @@ -799,7 +800,7 @@ class TM: excluded_findings = varFindings( [], doc="Threats found for elements of this model, " - "that were excluded on a per-element basis, using the Assumptions class" + "that were excluded on a per-element basis, using the Assumptions class", ) onDuplicates = varAction( Action.NO_ACTION, @@ -845,7 +846,9 @@ def _add_threats(self): raise UIError( e, f"while trying to open the the threat file ({self.threatsFile})." ) - active_threats = (threat for threat in threats_json if "DEPRECATED" not in threat) + active_threats = ( + threat for threat in threats_json if "DEPRECATED" not in threat + ) for threat in active_threats: TM._threats.append(Threat(**threat)) @@ -883,7 +886,12 @@ def resolve(self): for assumption in e.assumptions + global_assumptions: # type: Assumption if t.id in assumption.exclude: excluded_finding_count += 1 - f = Finding(e, id=str(excluded_finding_count), threat=t, assumption=assumption) + f = Finding( + e, + id=str(excluded_finding_count), + threat=t, + assumption=assumption, + ) excluded_findings.append(f) _continue = True break @@ -1223,9 +1231,10 @@ def sqlDump(self, filename): from pydal import DAL, Field except ImportError as e: raise UIError( - e, """This feature requires the pyDAL package, + e, + """This feature requires the pyDAL package, Please install the package via pip or your packagemanger of choice. - """ + """, ) @lru_cache(maxsize=None) @@ -1278,7 +1287,6 @@ def get_table(db, klass): db.close() - class Controls: """Controls implemented by/on and Element""" @@ -1383,8 +1391,12 @@ class Assumption: Assumption used by an Element. Used to exclude threats on a per-element basis. """ + name = varString("", required=True) - exclude = varStrings([], doc="A list of threat SIDs to exclude for this assumption. For example: INP01") + exclude = varStrings( + [], + doc="A list of threat SIDs to exclude for this assumption. For example: INP01", + ) description = varString("", doc="An additional description of the assumption") def __init__(self, name, **kwargs): diff --git a/pytm/report_util.py b/src/pytm/report_util.py similarity index 100% rename from pytm/report_util.py rename to src/pytm/report_util.py diff --git a/pytm/template_engine.py b/src/pytm/template_engine.py similarity index 100% rename from pytm/template_engine.py rename to src/pytm/template_engine.py diff --git a/pytm/threatlib/threats.json b/src/pytm/threatlib/threats.json similarity index 100% rename from pytm/threatlib/threats.json rename to src/pytm/threatlib/threats.json diff --git a/tests/output.json b/tests/output.json index 942519f0..15afe60e 100644 --- a/tests/output.json +++ b/tests/output.json @@ -1405,5 +1405,5 @@ "name": "my test tm", "onDuplicates": "Action.NO_ACTION", "threatsExcluded": [], - "threatsFile": "pytm/threatlib/threats.json" + "threatsFile": "src/pytm/threatlib/threats.json" } diff --git a/tests/output.md b/tests/output.md index e0199328..2b2f36e8 100644 --- a/tests/output.md +++ b/tests/output.md @@ -12,7 +12,7 @@ aaa ## Dataflow Diagram - Level 0 DFD -![](sample.png) +![sample.png](diagrams/sample.png)   diff --git a/tests/test_pytmfunc.py b/tests/test_pytmfunc.py index f94d042c..61198603 100644 --- a/tests/test_pytmfunc.py +++ b/tests/test_pytmfunc.py @@ -31,7 +31,7 @@ with open( os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) - + "/pytm/threatlib/threats.json", + + "/src/pytm/threatlib/threats.json", "r", ) as threat_file: threats = {t["SID"]: Threat(**t) for t in json.load(threat_file)} @@ -352,7 +352,7 @@ def test_json_dumps(self): expected = x.read().strip() TM.reset() tm = TM( - "my test tm", description="aaa", threatsFile="pytm/threatlib/threats.json" + "my test tm", description="aaa", threatsFile="src/pytm/threatlib/threats.json" ) tm.isOrdered = True internet = Boundary("Internet") @@ -422,7 +422,7 @@ def test_report(self): TM.reset() tm = TM( - "my test tm", description="aaa", threatsFile="pytm/threatlib/threats.json" + "my test tm", description="aaa", threatsFile="src/pytm/threatlib/threats.json" ) tm.isOrdered = True internet = Boundary("Internet") diff --git a/uv.lock b/uv.lock new file mode 100644 index 00000000..ae45b72a --- /dev/null +++ b/uv.lock @@ -0,0 +1,224 @@ +version = 1 +revision = 3 +requires-python = ">=3.10" + +[[package]] +name = "basedpyright" +version = "1.34.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nodejs-wheel-binaries" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/77/ded02ba2b400807b291fa2b9d29ac7f473e86a45d1f5212d8276e9029107/basedpyright-1.34.0.tar.gz", hash = "sha256:7ae3b06f644fac15fdd14a00d0d1f12f92a8205ae1609aabd5a0799b1a68be1d", size = 22803348, upload-time = "2025-11-19T14:48:16.38Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/9e/ced31964ed49f06be6197bd530958b6ddca9a079a8d7ee0ee7429cae9e27/basedpyright-1.34.0-py3-none-any.whl", hash = "sha256:e76015c1ebb671d2c6d7fef8a12bc0f1b9d15d74e17847b7b95a3a66e187c70f", size = 11865958, upload-time = "2025-11-19T14:48:13.724Z" }, +] + +[[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 = "exceptiongroup" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "nodejs-wheel-binaries" +version = "24.11.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/89/da307731fdbb05a5f640b26de5b8ac0dc463fef059162accfc89e32f73bc/nodejs_wheel_binaries-24.11.1.tar.gz", hash = "sha256:413dfffeadfb91edb4d8256545dea797c237bba9b3faefea973cde92d96bb922", size = 8059, upload-time = "2025-11-18T18:21:58.207Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e4/5f/be5a4112e678143d4c15264d918f9a2dc086905c6426eb44515cf391a958/nodejs_wheel_binaries-24.11.1-py2.py3-none-macosx_13_0_arm64.whl", hash = "sha256:0e14874c3579def458245cdbc3239e37610702b0aa0975c1dc55e2cb80e42102", size = 55114309, upload-time = "2025-11-18T18:21:21.697Z" }, + { url = "https://files.pythonhosted.org/packages/fa/1c/2e9d6af2ea32b65928c42b3e5baa7a306870711d93c3536cb25fc090a80d/nodejs_wheel_binaries-24.11.1-py2.py3-none-macosx_13_0_x86_64.whl", hash = "sha256:c2741525c9874b69b3e5a6d6c9179a6fe484ea0c3d5e7b7c01121c8e5d78b7e2", size = 55285957, upload-time = "2025-11-18T18:21:27.177Z" }, + { url = "https://files.pythonhosted.org/packages/d0/79/35696d7ba41b1bd35ef8682f13d46ba38c826c59e58b86b267458eb53d87/nodejs_wheel_binaries-24.11.1-py2.py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:5ef598101b0fb1c2bf643abb76dfbf6f76f1686198ed17ae46009049ee83c546", size = 59645875, upload-time = "2025-11-18T18:21:33.004Z" }, + { url = "https://files.pythonhosted.org/packages/b4/98/2a9694adee0af72bc602a046b0632a0c89e26586090c558b1c9199b187cc/nodejs_wheel_binaries-24.11.1-py2.py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:cde41d5e4705266688a8d8071debf4f8a6fcea264c61292782672ee75a6905f9", size = 60140941, upload-time = "2025-11-18T18:21:37.228Z" }, + { url = "https://files.pythonhosted.org/packages/d0/d6/573e5e2cba9d934f5f89d0beab00c3315e2e6604eb4df0fcd1d80c5a07a8/nodejs_wheel_binaries-24.11.1-py2.py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:78bc5bb889313b565df8969bb7423849a9c7fc218bf735ff0ce176b56b3e96f0", size = 61644243, upload-time = "2025-11-18T18:21:43.325Z" }, + { url = "https://files.pythonhosted.org/packages/c7/e6/643234d5e94067df8ce8d7bba10f3804106668f7a1050aeb10fdd226ead4/nodejs_wheel_binaries-24.11.1-py2.py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:c79a7e43869ccecab1cae8183778249cceb14ca2de67b5650b223385682c6239", size = 62225657, upload-time = "2025-11-18T18:21:47.708Z" }, + { url = "https://files.pythonhosted.org/packages/4d/1c/2fb05127102a80225cab7a75c0e9edf88a0a1b79f912e1e36c7c1aaa8f4e/nodejs_wheel_binaries-24.11.1-py2.py3-none-win_amd64.whl", hash = "sha256:10197b1c9c04d79403501766f76508b0dac101ab34371ef8a46fcf51773497d0", size = 41322308, upload-time = "2025-11-18T18:21:51.347Z" }, + { url = "https://files.pythonhosted.org/packages/ad/b7/bc0cdbc2cc3a66fcac82c79912e135a0110b37b790a14c477f18e18d90cd/nodejs_wheel_binaries-24.11.1-py2.py3-none-win_arm64.whl", hash = "sha256:376b9ea1c4bc1207878975dfeb604f7aa5668c260c6154dcd2af9d42f7734116", size = 39026497, upload-time = "2025-11-18T18:21:54.634Z" }, +] + +[[package]] +name = "packaging" +version = "25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } +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 = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "pydal" +version = "20251115.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/50/58/6e6b31fa0f5151b90b440a3dad7ee2eb155795ea2d2b933dd8ca59898da0/pydal-20251115.1.tar.gz", hash = "sha256:d381bb0e4b0e2de61a34dbf0ebecbc95b8175423f3a8ea64b15d03672e067080", size = 634691, upload-time = "2025-11-15T22:06:36.275Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/06/d0/266ab2d098125c1143c3c9e19a677690f8630f4524a448f6941a99be3b25/pydal-20251115.1-py2.py3-none-any.whl", hash = "sha256:d726b0f1209b29228d6a283ef444c03a634ebaf6cb54e509b491414c41a72a97", size = 252469, upload-time = "2025-11-15T22:06:33.775Z" }, +] + +[[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 = "pytest" +version = "9.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/07/56/f013048ac4bc4c1d9be45afd4ab209ea62822fb1598f40687e6bf45dcea4/pytest-9.0.1.tar.gz", hash = "sha256:3e9c069ea73583e255c3b21cf46b8d3c56f6e3a1a8f6da94ccb0fcf57b9d73c8", size = 1564125, upload-time = "2025-11-12T13:05:09.333Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/8b/6300fb80f858cda1c51ffa17075df5d846757081d11ab4aa35cef9e6258b/pytest-9.0.1-py3-none-any.whl", hash = "sha256:67be0030d194df2dfa7b556f2e56fb3c3315bd5c8822c6951162b92b32ce7dad", size = 373668, upload-time = "2025-11-12T13:05:07.379Z" }, +] + +[[package]] +name = "pytm" +version = "1.3.1" +source = { editable = "." } +dependencies = [ + { name = "pydal" }, +] + +[package.dev-dependencies] +dev = [ + { name = "basedpyright" }, + { name = "pytest" }, + { name = "ruff" }, +] + +[package.metadata] +requires-dist = [{ name = "pydal", specifier = ">=20200714.1" }] + +[package.metadata.requires-dev] +dev = [ + { name = "basedpyright", specifier = ">=1.34.0" }, + { name = "pytest", specifier = ">=9.0.1" }, + { name = "ruff", specifier = ">=0.14.6" }, +] + +[[package]] +name = "ruff" +version = "0.14.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/52/f0/62b5a1a723fe183650109407fa56abb433b00aa1c0b9ba555f9c4efec2c6/ruff-0.14.6.tar.gz", hash = "sha256:6f0c742ca6a7783a736b867a263b9a7a80a45ce9bee391eeda296895f1b4e1cc", size = 5669501, upload-time = "2025-11-21T14:26:17.903Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/d2/7dd544116d107fffb24a0064d41a5d2ed1c9d6372d142f9ba108c8e39207/ruff-0.14.6-py3-none-linux_armv6l.whl", hash = "sha256:d724ac2f1c240dbd01a2ae98db5d1d9a5e1d9e96eba999d1c48e30062df578a3", size = 13326119, upload-time = "2025-11-21T14:25:24.2Z" }, + { url = "https://files.pythonhosted.org/packages/36/6a/ad66d0a3315d6327ed6b01f759d83df3c4d5f86c30462121024361137b6a/ruff-0.14.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:9f7539ea257aa4d07b7ce87aed580e485c40143f2473ff2f2b75aee003186004", size = 13526007, upload-time = "2025-11-21T14:25:26.906Z" }, + { url = "https://files.pythonhosted.org/packages/a3/9d/dae6db96df28e0a15dea8e986ee393af70fc97fd57669808728080529c37/ruff-0.14.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:7f6007e55b90a2a7e93083ba48a9f23c3158c433591c33ee2e99a49b889c6332", size = 12676572, upload-time = "2025-11-21T14:25:29.826Z" }, + { url = "https://files.pythonhosted.org/packages/76/a4/f319e87759949062cfee1b26245048e92e2acce900ad3a909285f9db1859/ruff-0.14.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a8e7b9d73d8728b68f632aa8e824ef041d068d231d8dbc7808532d3629a6bef", size = 13140745, upload-time = "2025-11-21T14:25:32.788Z" }, + { url = "https://files.pythonhosted.org/packages/95/d3/248c1efc71a0a8ed4e8e10b4b2266845d7dfc7a0ab64354afe049eaa1310/ruff-0.14.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d50d45d4553a3ebcbd33e7c5e0fe6ca4aafd9a9122492de357205c2c48f00775", size = 13076486, upload-time = "2025-11-21T14:25:35.601Z" }, + { url = "https://files.pythonhosted.org/packages/a5/19/b68d4563fe50eba4b8c92aa842149bb56dd24d198389c0ed12e7faff4f7d/ruff-0.14.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:118548dd121f8a21bfa8ab2c5b80e5b4aed67ead4b7567790962554f38e598ce", size = 13727563, upload-time = "2025-11-21T14:25:38.514Z" }, + { url = "https://files.pythonhosted.org/packages/47/ac/943169436832d4b0e867235abbdb57ce3a82367b47e0280fa7b4eabb7593/ruff-0.14.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:57256efafbfefcb8748df9d1d766062f62b20150691021f8ab79e2d919f7c11f", size = 15199755, upload-time = "2025-11-21T14:25:41.516Z" }, + { url = "https://files.pythonhosted.org/packages/c9/b9/288bb2399860a36d4bb0541cb66cce3c0f4156aaff009dc8499be0c24bf2/ruff-0.14.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ff18134841e5c68f8e5df1999a64429a02d5549036b394fafbe410f886e1989d", size = 14850608, upload-time = "2025-11-21T14:25:44.428Z" }, + { url = "https://files.pythonhosted.org/packages/ee/b1/a0d549dd4364e240f37e7d2907e97ee80587480d98c7799d2d8dc7a2f605/ruff-0.14.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:29c4b7ec1e66a105d5c27bd57fa93203637d66a26d10ca9809dc7fc18ec58440", size = 14118754, upload-time = "2025-11-21T14:25:47.214Z" }, + { url = "https://files.pythonhosted.org/packages/13/ac/9b9fe63716af8bdfddfacd0882bc1586f29985d3b988b3c62ddce2e202c3/ruff-0.14.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:167843a6f78680746d7e226f255d920aeed5e4ad9c03258094a2d49d3028b105", size = 13949214, upload-time = "2025-11-21T14:25:50.002Z" }, + { url = "https://files.pythonhosted.org/packages/12/27/4dad6c6a77fede9560b7df6802b1b697e97e49ceabe1f12baf3ea20862e9/ruff-0.14.6-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:16a33af621c9c523b1ae006b1b99b159bf5ac7e4b1f20b85b2572455018e0821", size = 14106112, upload-time = "2025-11-21T14:25:52.841Z" }, + { url = "https://files.pythonhosted.org/packages/6a/db/23e322d7177873eaedea59a7932ca5084ec5b7e20cb30f341ab594130a71/ruff-0.14.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:1432ab6e1ae2dc565a7eea707d3b03a0c234ef401482a6f1621bc1f427c2ff55", size = 13035010, upload-time = "2025-11-21T14:25:55.536Z" }, + { url = "https://files.pythonhosted.org/packages/a8/9c/20e21d4d69dbb35e6a1df7691e02f363423658a20a2afacf2a2c011800dc/ruff-0.14.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:4c55cfbbe7abb61eb914bfd20683d14cdfb38a6d56c6c66efa55ec6570ee4e71", size = 13054082, upload-time = "2025-11-21T14:25:58.625Z" }, + { url = "https://files.pythonhosted.org/packages/66/25/906ee6a0464c3125c8d673c589771a974965c2be1a1e28b5c3b96cb6ef88/ruff-0.14.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:efea3c0f21901a685fff4befda6d61a1bf4cb43de16da87e8226a281d614350b", size = 13303354, upload-time = "2025-11-21T14:26:01.816Z" }, + { url = "https://files.pythonhosted.org/packages/4c/58/60577569e198d56922b7ead07b465f559002b7b11d53f40937e95067ca1c/ruff-0.14.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:344d97172576d75dc6afc0e9243376dbe1668559c72de1864439c4fc95f78185", size = 14054487, upload-time = "2025-11-21T14:26:05.058Z" }, + { url = "https://files.pythonhosted.org/packages/67/0b/8e4e0639e4cc12547f41cb771b0b44ec8225b6b6a93393176d75fe6f7d40/ruff-0.14.6-py3-none-win32.whl", hash = "sha256:00169c0c8b85396516fdd9ce3446c7ca20c2a8f90a77aa945ba6b8f2bfe99e85", size = 13013361, upload-time = "2025-11-21T14:26:08.152Z" }, + { url = "https://files.pythonhosted.org/packages/fb/02/82240553b77fd1341f80ebb3eaae43ba011c7a91b4224a9f317d8e6591af/ruff-0.14.6-py3-none-win_amd64.whl", hash = "sha256:390e6480c5e3659f8a4c8d6a0373027820419ac14fa0d2713bd8e6c3e125b8b9", size = 14432087, upload-time = "2025-11-21T14:26:10.891Z" }, + { url = "https://files.pythonhosted.org/packages/a5/1f/93f9b0fad9470e4c829a5bb678da4012f0c710d09331b860ee555216f4ea/ruff-0.14.6-py3-none-win_arm64.whl", hash = "sha256:d43c81fbeae52cfa8728d8766bbf46ee4298c888072105815b392da70ca836b2", size = 13520930, upload-time = "2025-11-21T14:26:13.951Z" }, +] + +[[package]] +name = "tomli" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/52/ed/3f73f72945444548f33eba9a87fc7a6e969915e7b1acc8260b30e1f76a2f/tomli-2.3.0.tar.gz", hash = "sha256:64be704a875d2a59753d80ee8a533c3fe183e3f06807ff7dc2232938ccb01549", size = 17392, upload-time = "2025-10-08T22:01:47.119Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/2e/299f62b401438d5fe1624119c723f5d877acc86a4c2492da405626665f12/tomli-2.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:88bd15eb972f3664f5ed4b57c1634a97153b4bac4479dcb6a495f41921eb7f45", size = 153236, upload-time = "2025-10-08T22:01:00.137Z" }, + { url = "https://files.pythonhosted.org/packages/86/7f/d8fffe6a7aefdb61bced88fcb5e280cfd71e08939da5894161bd71bea022/tomli-2.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:883b1c0d6398a6a9d29b508c331fa56adbcdff647f6ace4dfca0f50e90dfd0ba", size = 148084, upload-time = "2025-10-08T22:01:01.63Z" }, + { url = "https://files.pythonhosted.org/packages/47/5c/24935fb6a2ee63e86d80e4d3b58b222dafaf438c416752c8b58537c8b89a/tomli-2.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1381caf13ab9f300e30dd8feadb3de072aeb86f1d34a8569453ff32a7dea4bf", size = 234832, upload-time = "2025-10-08T22:01:02.543Z" }, + { url = "https://files.pythonhosted.org/packages/89/da/75dfd804fc11e6612846758a23f13271b76d577e299592b4371a4ca4cd09/tomli-2.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a0e285d2649b78c0d9027570d4da3425bdb49830a6156121360b3f8511ea3441", size = 242052, upload-time = "2025-10-08T22:01:03.836Z" }, + { url = "https://files.pythonhosted.org/packages/70/8c/f48ac899f7b3ca7eb13af73bacbc93aec37f9c954df3c08ad96991c8c373/tomli-2.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a154a9ae14bfcf5d8917a59b51ffd5a3ac1fd149b71b47a3a104ca4edcfa845", size = 239555, upload-time = "2025-10-08T22:01:04.834Z" }, + { url = "https://files.pythonhosted.org/packages/ba/28/72f8afd73f1d0e7829bfc093f4cb98ce0a40ffc0cc997009ee1ed94ba705/tomli-2.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:74bf8464ff93e413514fefd2be591c3b0b23231a77f901db1eb30d6f712fc42c", size = 245128, upload-time = "2025-10-08T22:01:05.84Z" }, + { url = "https://files.pythonhosted.org/packages/b6/eb/a7679c8ac85208706d27436e8d421dfa39d4c914dcf5fa8083a9305f58d9/tomli-2.3.0-cp311-cp311-win32.whl", hash = "sha256:00b5f5d95bbfc7d12f91ad8c593a1659b6387b43f054104cda404be6bda62456", size = 96445, upload-time = "2025-10-08T22:01:06.896Z" }, + { url = "https://files.pythonhosted.org/packages/0a/fe/3d3420c4cb1ad9cb462fb52967080575f15898da97e21cb6f1361d505383/tomli-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:4dc4ce8483a5d429ab602f111a93a6ab1ed425eae3122032db7e9acf449451be", size = 107165, upload-time = "2025-10-08T22:01:08.107Z" }, + { url = "https://files.pythonhosted.org/packages/ff/b7/40f36368fcabc518bb11c8f06379a0fd631985046c038aca08c6d6a43c6e/tomli-2.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d7d86942e56ded512a594786a5ba0a5e521d02529b3826e7761a05138341a2ac", size = 154891, upload-time = "2025-10-08T22:01:09.082Z" }, + { url = "https://files.pythonhosted.org/packages/f9/3f/d9dd692199e3b3aab2e4e4dd948abd0f790d9ded8cd10cbaae276a898434/tomli-2.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:73ee0b47d4dad1c5e996e3cd33b8a76a50167ae5f96a2607cbe8cc773506ab22", size = 148796, upload-time = "2025-10-08T22:01:10.266Z" }, + { url = "https://files.pythonhosted.org/packages/60/83/59bff4996c2cf9f9387a0f5a3394629c7efa5ef16142076a23a90f1955fa/tomli-2.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:792262b94d5d0a466afb5bc63c7daa9d75520110971ee269152083270998316f", size = 242121, upload-time = "2025-10-08T22:01:11.332Z" }, + { url = "https://files.pythonhosted.org/packages/45/e5/7c5119ff39de8693d6baab6c0b6dcb556d192c165596e9fc231ea1052041/tomli-2.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f195fe57ecceac95a66a75ac24d9d5fbc98ef0962e09b2eddec5d39375aae52", size = 250070, upload-time = "2025-10-08T22:01:12.498Z" }, + { url = "https://files.pythonhosted.org/packages/45/12/ad5126d3a278f27e6701abde51d342aa78d06e27ce2bb596a01f7709a5a2/tomli-2.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e31d432427dcbf4d86958c184b9bfd1e96b5b71f8eb17e6d02531f434fd335b8", size = 245859, upload-time = "2025-10-08T22:01:13.551Z" }, + { url = "https://files.pythonhosted.org/packages/fb/a1/4d6865da6a71c603cfe6ad0e6556c73c76548557a8d658f9e3b142df245f/tomli-2.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b0882799624980785240ab732537fcfc372601015c00f7fc367c55308c186f6", size = 250296, upload-time = "2025-10-08T22:01:14.614Z" }, + { url = "https://files.pythonhosted.org/packages/a0/b7/a7a7042715d55c9ba6e8b196d65d2cb662578b4d8cd17d882d45322b0d78/tomli-2.3.0-cp312-cp312-win32.whl", hash = "sha256:ff72b71b5d10d22ecb084d345fc26f42b5143c5533db5e2eaba7d2d335358876", size = 97124, upload-time = "2025-10-08T22:01:15.629Z" }, + { url = "https://files.pythonhosted.org/packages/06/1e/f22f100db15a68b520664eb3328fb0ae4e90530887928558112c8d1f4515/tomli-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:1cb4ed918939151a03f33d4242ccd0aa5f11b3547d0cf30f7c74a408a5b99878", size = 107698, upload-time = "2025-10-08T22:01:16.51Z" }, + { url = "https://files.pythonhosted.org/packages/89/48/06ee6eabe4fdd9ecd48bf488f4ac783844fd777f547b8d1b61c11939974e/tomli-2.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5192f562738228945d7b13d4930baffda67b69425a7f0da96d360b0a3888136b", size = 154819, upload-time = "2025-10-08T22:01:17.964Z" }, + { url = "https://files.pythonhosted.org/packages/f1/01/88793757d54d8937015c75dcdfb673c65471945f6be98e6a0410fba167ed/tomli-2.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:be71c93a63d738597996be9528f4abe628d1adf5e6eb11607bc8fe1a510b5dae", size = 148766, upload-time = "2025-10-08T22:01:18.959Z" }, + { url = "https://files.pythonhosted.org/packages/42/17/5e2c956f0144b812e7e107f94f1cc54af734eb17b5191c0bbfb72de5e93e/tomli-2.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4665508bcbac83a31ff8ab08f424b665200c0e1e645d2bd9ab3d3e557b6185b", size = 240771, upload-time = "2025-10-08T22:01:20.106Z" }, + { url = "https://files.pythonhosted.org/packages/d5/f4/0fbd014909748706c01d16824eadb0307115f9562a15cbb012cd9b3512c5/tomli-2.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4021923f97266babc6ccab9f5068642a0095faa0a51a246a6a02fccbb3514eaf", size = 248586, upload-time = "2025-10-08T22:01:21.164Z" }, + { url = "https://files.pythonhosted.org/packages/30/77/fed85e114bde5e81ecf9bc5da0cc69f2914b38f4708c80ae67d0c10180c5/tomli-2.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4ea38c40145a357d513bffad0ed869f13c1773716cf71ccaa83b0fa0cc4e42f", size = 244792, upload-time = "2025-10-08T22:01:22.417Z" }, + { url = "https://files.pythonhosted.org/packages/55/92/afed3d497f7c186dc71e6ee6d4fcb0acfa5f7d0a1a2878f8beae379ae0cc/tomli-2.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ad805ea85eda330dbad64c7ea7a4556259665bdf9d2672f5dccc740eb9d3ca05", size = 248909, upload-time = "2025-10-08T22:01:23.859Z" }, + { url = "https://files.pythonhosted.org/packages/f8/84/ef50c51b5a9472e7265ce1ffc7f24cd4023d289e109f669bdb1553f6a7c2/tomli-2.3.0-cp313-cp313-win32.whl", hash = "sha256:97d5eec30149fd3294270e889b4234023f2c69747e555a27bd708828353ab606", size = 96946, upload-time = "2025-10-08T22:01:24.893Z" }, + { url = "https://files.pythonhosted.org/packages/b2/b7/718cd1da0884f281f95ccfa3a6cc572d30053cba64603f79d431d3c9b61b/tomli-2.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0c95ca56fbe89e065c6ead5b593ee64b84a26fca063b5d71a1122bf26e533999", size = 107705, upload-time = "2025-10-08T22:01:26.153Z" }, + { url = "https://files.pythonhosted.org/packages/19/94/aeafa14a52e16163008060506fcb6aa1949d13548d13752171a755c65611/tomli-2.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:cebc6fe843e0733ee827a282aca4999b596241195f43b4cc371d64fc6639da9e", size = 154244, upload-time = "2025-10-08T22:01:27.06Z" }, + { url = "https://files.pythonhosted.org/packages/db/e4/1e58409aa78eefa47ccd19779fc6f36787edbe7d4cd330eeeedb33a4515b/tomli-2.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4c2ef0244c75aba9355561272009d934953817c49f47d768070c3c94355c2aa3", size = 148637, upload-time = "2025-10-08T22:01:28.059Z" }, + { url = "https://files.pythonhosted.org/packages/26/b6/d1eccb62f665e44359226811064596dd6a366ea1f985839c566cd61525ae/tomli-2.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c22a8bf253bacc0cf11f35ad9808b6cb75ada2631c2d97c971122583b129afbc", size = 241925, upload-time = "2025-10-08T22:01:29.066Z" }, + { url = "https://files.pythonhosted.org/packages/70/91/7cdab9a03e6d3d2bb11beae108da5bdc1c34bdeb06e21163482544ddcc90/tomli-2.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0eea8cc5c5e9f89c9b90c4896a8deefc74f518db5927d0e0e8d4a80953d774d0", size = 249045, upload-time = "2025-10-08T22:01:31.98Z" }, + { url = "https://files.pythonhosted.org/packages/15/1b/8c26874ed1f6e4f1fcfeb868db8a794cbe9f227299402db58cfcc858766c/tomli-2.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b74a0e59ec5d15127acdabd75ea17726ac4c5178ae51b85bfe39c4f8a278e879", size = 245835, upload-time = "2025-10-08T22:01:32.989Z" }, + { url = "https://files.pythonhosted.org/packages/fd/42/8e3c6a9a4b1a1360c1a2a39f0b972cef2cc9ebd56025168c4137192a9321/tomli-2.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b5870b50c9db823c595983571d1296a6ff3e1b88f734a4c8f6fc6188397de005", size = 253109, upload-time = "2025-10-08T22:01:34.052Z" }, + { url = "https://files.pythonhosted.org/packages/22/0c/b4da635000a71b5f80130937eeac12e686eefb376b8dee113b4a582bba42/tomli-2.3.0-cp314-cp314-win32.whl", hash = "sha256:feb0dacc61170ed7ab602d3d972a58f14ee3ee60494292d384649a3dc38ef463", size = 97930, upload-time = "2025-10-08T22:01:35.082Z" }, + { url = "https://files.pythonhosted.org/packages/b9/74/cb1abc870a418ae99cd5c9547d6bce30701a954e0e721821df483ef7223c/tomli-2.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:b273fcbd7fc64dc3600c098e39136522650c49bca95df2d11cf3b626422392c8", size = 107964, upload-time = "2025-10-08T22:01:36.057Z" }, + { url = "https://files.pythonhosted.org/packages/54/78/5c46fff6432a712af9f792944f4fcd7067d8823157949f4e40c56b8b3c83/tomli-2.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:940d56ee0410fa17ee1f12b817b37a4d4e4dc4d27340863cc67236c74f582e77", size = 163065, upload-time = "2025-10-08T22:01:37.27Z" }, + { url = "https://files.pythonhosted.org/packages/39/67/f85d9bd23182f45eca8939cd2bc7050e1f90c41f4a2ecbbd5963a1d1c486/tomli-2.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f85209946d1fe94416debbb88d00eb92ce9cd5266775424ff81bc959e001acaf", size = 159088, upload-time = "2025-10-08T22:01:38.235Z" }, + { url = "https://files.pythonhosted.org/packages/26/5a/4b546a0405b9cc0659b399f12b6adb750757baf04250b148d3c5059fc4eb/tomli-2.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a56212bdcce682e56b0aaf79e869ba5d15a6163f88d5451cbde388d48b13f530", size = 268193, upload-time = "2025-10-08T22:01:39.712Z" }, + { url = "https://files.pythonhosted.org/packages/42/4f/2c12a72ae22cf7b59a7fe75b3465b7aba40ea9145d026ba41cb382075b0e/tomli-2.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5f3ffd1e098dfc032d4d3af5c0ac64f6d286d98bc148698356847b80fa4de1b", size = 275488, upload-time = "2025-10-08T22:01:40.773Z" }, + { url = "https://files.pythonhosted.org/packages/92/04/a038d65dbe160c3aa5a624e93ad98111090f6804027d474ba9c37c8ae186/tomli-2.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e01decd096b1530d97d5d85cb4dff4af2d8347bd35686654a004f8dea20fc67", size = 272669, upload-time = "2025-10-08T22:01:41.824Z" }, + { url = "https://files.pythonhosted.org/packages/be/2f/8b7c60a9d1612a7cbc39ffcca4f21a73bf368a80fc25bccf8253e2563267/tomli-2.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8a35dd0e643bb2610f156cca8db95d213a90015c11fee76c946aa62b7ae7e02f", size = 279709, upload-time = "2025-10-08T22:01:43.177Z" }, + { url = "https://files.pythonhosted.org/packages/7e/46/cc36c679f09f27ded940281c38607716c86cf8ba4a518d524e349c8b4874/tomli-2.3.0-cp314-cp314t-win32.whl", hash = "sha256:a1f7f282fe248311650081faafa5f4732bdbfef5d45fe3f2e702fbc6f2d496e0", size = 107563, upload-time = "2025-10-08T22:01:44.233Z" }, + { url = "https://files.pythonhosted.org/packages/84/ff/426ca8683cf7b753614480484f6437f568fd2fda2edbdf57a2d3d8b27a0b/tomli-2.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:70a251f8d4ba2d9ac2542eecf008b3c8a9fc5c3f9f02c56a9d7952612be2fdba", size = 119756, upload-time = "2025-10-08T22:01:45.234Z" }, + { url = "https://files.pythonhosted.org/packages/77/b8/0135fadc89e73be292b473cb820b4f5a08197779206b33191e801feeae40/tomli-2.3.0-py3-none-any.whl", hash = "sha256:e95b1af3c5b07d9e643909b5abbec77cd9f1217e6d0bca72b0234736b9fb1f1b", size = 14408, upload-time = "2025-10-08T22:01:46.04Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] From d9d3dc251dfd5630a538b322c32cc5dd930d9cfd Mon Sep 17 00:00:00 2001 From: Florian Kromer Date: Sat, 22 Nov 2025 21:12:06 +0100 Subject: [PATCH 2/2] ci: update to uv --- .github/workflows/main.yml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 5b66c277..4ce6ecb0 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -21,19 +21,19 @@ jobs: strategy: matrix: - python-version: ["3.9", "3.10", "3.11"] + # https://endoflife.date/python + python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"] - # Steps represent a sequence of tasks that will be executed as part of the job steps: - # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - - uses: actions/checkout@v4 - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v6 + # https://github.com/actions/checkout + - uses: actions/checkout@v6 + # https://docs.astral.sh/uv/guides/integration/github/#multiple-python-versions + # https://github.com/astral-sh/setup-uv + - name: Install uv and set the Python version + uses: astral-sh/setup-uv@v7 with: python-version: ${{ matrix.python-version }} - - name: Install Poetry - run: pip install poetry - - name: Install dependencies - run: poetry install --with dev + - name: Install the project + run: uv sync --locked --dev - name: Run tests - run: poetry run pytest + run: uv run pytest tests