From 22e907e1e1890e75474232cd097894d76b98b66f Mon Sep 17 00:00:00 2001 From: Anghelo Carvajal Date: Sat, 17 Jan 2026 08:30:21 -0300 Subject: [PATCH 1/6] Test adding 3.14t and other wheels to ci --- .github/scripts/ci_check_wheel.ps1 | 40 +++ .github/scripts/ci_check_wheel.sh | 38 +++ .github/workflows/maturin_upload_pypi.yml | 226 ++++++++++++-- Cargo.lock | 2 +- Cargo.toml | 2 +- pyproject.toml | 6 +- src/mapfile_parser/__init__.py | 4 +- src/rs/lib.rs | 2 +- uv.lock | 342 ++++++++++++++++++++++ 9 files changed, 629 insertions(+), 33 deletions(-) create mode 100644 .github/scripts/ci_check_wheel.ps1 create mode 100755 .github/scripts/ci_check_wheel.sh create mode 100644 uv.lock diff --git a/.github/scripts/ci_check_wheel.ps1 b/.github/scripts/ci_check_wheel.ps1 new file mode 100644 index 0000000..4c28f3e --- /dev/null +++ b/.github/scripts/ci_check_wheel.ps1 @@ -0,0 +1,40 @@ +# A Powershell port of `ci_check_wheel.sh`. Refer to that script instead. + +# Any change made here should be made in `ci_check_wheel.sh` too. + +param ( + [Parameter(Mandatory = $true)] + [string]$PYTHON_VERSION, + + [Parameter(Mandatory = $true)] + [string]$KEY, + + [string]$EXTRA +) + +# Equivalent to `set -e` +$ErrorActionPreference = "Stop" + +if (Test-Path ".venv") { + Remove-Item -Recurse -Force ".venv" +} + +# When $EXTRA is empty powershell passes the argument as an empty argument to +# uv, so we need to explicitly check the argument and only pass it if it is not +# empty to avoid uv from erroring +if ($EXTRA) { + uv venv --no-project .venv -p $PYTHON_VERSION $EXTRA +} else { + uv venv --no-project .venv -p $PYTHON_VERSION +} + +uv run --no-sync python --version + +$WHEEL = $(Get-ChildItem -Path .\dist\ -Recurse -Filter "mapfile_parser-*-abi3-*") +if ([string]::IsNullOrEmpty($WHEEL)) { + Write-Host "Wheel not found" + exit 1 +} +uv pip install --no-cache --no-config $WHEEL + +uv run --no-sync python -c "import mapfile_parser; print(help(mapfile_parser.scan_for_config))" diff --git a/.github/scripts/ci_check_wheel.sh b/.github/scripts/ci_check_wheel.sh new file mode 100755 index 0000000..62d58f1 --- /dev/null +++ b/.github/scripts/ci_check_wheel.sh @@ -0,0 +1,38 @@ +# This script checks a given Python wheel inside the `dist` is installable in a +# given Python version. +# +# It recieves the following arguments: +# - The python version to check, it must be compatible with uv. +# - A key value to allow searching for the wheel in the `dist` folder. Only a +# single wheel in the folder must contain this value in its name. +# Recommended values: abi3, cp314t, pypy39 and similar values. +# - (OPTIONAL) A single aditional flag to pass to `uv venv`. +# Usually `--managed-python`. + +# Any change made here should be made in `ci_check_wheel.ps1` too. + +PYTHON_VERSION=$1 +KEY=$2 +EXTRA=$3 + +# Exit with an error value if any command produces an error. +set -e + +# We make a venv with the Python version we were told to. +rm -rf .venv +uv venv --no-project -p $PYTHON_VERSION $EXTRA +# Allows us to check we are actually using the requested Python version. +# --no-sync avoids building the wheel from source +uv run --no-sync python --version + +# We install the wheel by looking it up in the dist folder. +# We need to do a `find` command here because we don't know the exact name of +# the wheel (it can be affected by package version, arch, python version, etc.). +WHEEL=$(find ./dist/ -name "mapfile_parser-*-$KEY*") +if [ -z "$WHEEL" ]; then + echo "Wheel not found" + exit 1 +fi +uv pip install --no-cache --no-config "$WHEEL" +# Check something basic to make sure it was installed correctly. +uv run --no-sync python -c "import mapfile_parser; print(help(mapfile_parser.scan_for_config))" diff --git a/.github/workflows/maturin_upload_pypi.yml b/.github/workflows/maturin_upload_pypi.yml index a26c83c..1e16cff 100644 --- a/.github/workflows/maturin_upload_pypi.yml +++ b/.github/workflows/maturin_upload_pypi.yml @@ -1,4 +1,4 @@ -# This file is autogenerated by maturin v1.8.2 +# This file is autogenerated by maturin v1.11.4 # To update, run # # maturin generate-ci github @@ -13,34 +13,55 @@ on: permissions: contents: read +# At the time of writing, PyO3 has a hard minimal Python version of 3.7, so +# there's no use trying to go any lower than that. + jobs: linux: runs-on: ${{ matrix.platform.runner }} strategy: + fail-fast: false matrix: platform: - runner: ubuntu-22.04 target: x86_64 + python_version_min: '3.7' + python_version_max: '3.14' - runner: ubuntu-22.04 target: x86 + python_version_min: '3.7' + python_version_max: '3.14' - runner: ubuntu-22.04 target: aarch64 + python_version_min: '3.7' + python_version_max: '3.14' - runner: ubuntu-22.04 target: armv7 + python_version_min: '3.7' + python_version_max: '3.14' - runner: ubuntu-22.04 target: s390x + python_version_min: '3.7' + python_version_max: '3.14' - runner: ubuntu-22.04 target: ppc64le + python_version_min: '3.7' + python_version_max: '3.14' steps: - uses: actions/checkout@main - - uses: actions/setup-python@main + - uses: actions/setup-python@v6 with: - python-version: 3.x + python-version: | + ${{ matrix.platform.python_version_min }} + 3.14t + pypy3.9 + pypy3.10 + pypy3.11 - name: Build wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.platform.target }} - args: --release --out dist --find-interpreter + args: --release --out dist -i python${{ matrix.platform.python_version_min }} python3.14t pypy3.9 pypy3.10 pypy3.11 sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} manylinux: auto - name: Upload wheels @@ -48,30 +69,74 @@ jobs: with: name: wheels-linux-${{ matrix.platform.target }} path: dist + if-no-files-found: error + + # Test the built wheels are installable in the min and max Python + # versions we are about. + # We do this by installing the Python version in a venv using uv, + # installing the built wheel into the venv and running some simple + # command like printing the mapfile_parser version from within Python. + # We can only test the wheels that matches the architecture of the runner + # so we hope the other built wheels will just work, hopefully. + - name: Install uv + uses: astral-sh/setup-uv@v7 + if: ${{ matrix.platform.target == 'x86_64' }} + - name: Test wheels with min version (${{ matrix.platform.python_version_min }}) + if: ${{ matrix.platform.target == 'x86_64' }} + # Check the built wheel is installable on the oldest Python supported + run: | + .github/scripts/ci_check_wheel.sh ${{ matrix.platform.python_version_min }} abi3 + - name: Test wheels with max version (${{ matrix.platform.python_version_max }}) + if: ${{ matrix.platform.target == 'x86_64' }} + # Check the built wheel is installable on the newest Python we know of + run: | + .github/scripts/ci_check_wheel.sh ${{ matrix.platform.python_version_max }} abi3 --managed-python + + - name: Test free threaded wheels + if: ${{ matrix.platform.target == 'x86_64' }} + run: | + .github/scripts/ci_check_wheel.sh 3.14t cp314t --managed-python + + - name: Test pypy wheels + if: ${{ matrix.platform.target == 'x86_64' }} + run: | + .github/scripts/ci_check_wheel.sh pypy3.9 pypy39 --managed-python + .github/scripts/ci_check_wheel.sh pypy3.10 pypy310 --managed-python + .github/scripts/ci_check_wheel.sh pypy3.11 pypy311 --managed-python musllinux: runs-on: ${{ matrix.platform.runner }} strategy: + fail-fast: false matrix: platform: - runner: ubuntu-22.04 target: x86_64 + python_version_min: '3.7' - runner: ubuntu-22.04 target: x86 + python_version_min: '3.7' - runner: ubuntu-22.04 target: aarch64 + python_version_min: '3.7' - runner: ubuntu-22.04 target: armv7 + python_version_min: '3.7' steps: - uses: actions/checkout@main - - uses: actions/setup-python@main + - uses: actions/setup-python@v6 with: - python-version: 3.x + python-version: | + ${{ matrix.platform.python_version_min }} + 3.14t + pypy3.9 + pypy3.10 + pypy3.11 - name: Build wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.platform.target }} - args: --release --out dist --find-interpreter + args: --release --out dist -i python${{ matrix.platform.python_version_min }} python3.14t pypy3.9 pypy3.10 pypy3.11 sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} manylinux: musllinux_1_2 - name: Upload wheels @@ -79,59 +144,165 @@ jobs: with: name: wheels-musllinux-${{ matrix.platform.target }} path: dist + if-no-files-found: error + + # We can't test musllinux wheels on manylinux runners windows: runs-on: ${{ matrix.platform.runner }} strategy: + fail-fast: false matrix: platform: - runner: windows-latest target: x64 + python_arch: x64 + python_version_min: '3.7' + python_version_max: '3.14' - runner: windows-latest target: x86 + python_arch: x86 + python_version_min: '3.7' + python_version_max: '3.14' + steps: + - uses: actions/checkout@main + - uses: actions/setup-python@v6 + with: + python-version: | + ${{ matrix.platform.python_version_min }} + 3.14t + architecture: ${{ matrix.platform.python_arch }} + - name: Build wheels + uses: PyO3/maturin-action@v1 + with: + target: ${{ matrix.platform.target }} + args: --release --out dist -i python${{ matrix.platform.python_version_min }} python3.14t + sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} + - name: Upload wheels + uses: actions/upload-artifact@main + with: + name: wheels-windows-${{ matrix.platform.target }} + path: dist + if-no-files-found: error + + - name: Install uv + uses: astral-sh/setup-uv@v7 + if: ${{ matrix.platform.target == 'x64' }} + - name: Test wheels with min version (${{ matrix.platform.python_version_min }}) + if: ${{ matrix.platform.target == 'x64' }} + # Check the built wheel is installable on the oldest Python supported + run: | + .github/scripts/ci_check_wheel.ps1 ${{ matrix.platform.python_version_min }} abi3 + - name: Test wheels with max version (${{ matrix.platform.python_version_max }}) + if: ${{ matrix.platform.target == 'x64' }} + run: | + .github/scripts/ci_check_wheel.ps1 ${{ matrix.platform.python_version_max }} abi3 --managed-python + + - name: Test free threaded wheels + if: ${{ matrix.platform.target == 'x64' }} + run: | + .github/scripts/ci_check_wheel.sh 3.14t cp314t --managed-python + + # Windows ARM is kinda broken, for some reason it can't setup Python 3.14t, + # so I gave up trying, hopefully nobody will be using ARM Windows with 3.14t + windows_arm: + runs-on: ${{ matrix.platform.runner }} + strategy: + fail-fast: false + matrix: + platform: + - runner: windows-11-arm + target: aarch64 + python_arch: arm64 + python_version_min: '3.11' + python_version_max: '3.14' steps: - uses: actions/checkout@main - - uses: actions/setup-python@main + - uses: actions/setup-python@v6 with: - python-version: 3.x - architecture: ${{ matrix.platform.target }} + python-version: | + ${{ matrix.platform.python_version_min }} + architecture: ${{ matrix.platform.python_arch }} - name: Build wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.platform.target }} - args: --release --out dist --find-interpreter + args: --release --out dist -i python${{ matrix.platform.python_version_min }} sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} - name: Upload wheels uses: actions/upload-artifact@main with: name: wheels-windows-${{ matrix.platform.target }} path: dist + if-no-files-found: error + + - name: Test wheels with min version (${{ matrix.platform.python_version_min }}) + if: ${{ matrix.platform.target == 'x64' }} + # Check the built wheel is installable on the oldest Python supported + run: | + .github/scripts/ci_check_wheel.ps1 ${{ matrix.platform.python_version_min }} abi3 + - name: Test wheels with max version (${{ matrix.platform.python_version_max }}) + if: ${{ matrix.platform.target == 'x64' }} + run: | + .github/scripts/ci_check_wheel.ps1 ${{ matrix.platform.python_version_max }} abi3 --managed-python macos: runs-on: ${{ matrix.platform.runner }} strategy: + fail-fast: false matrix: platform: - - runner: macos-13 + - runner: macos-15-intel target: x86_64 - - runner: macos-14 + python_version_min: '3.7' + python_version_max: '3.14' + - runner: macos-latest target: aarch64 + python_version_min: '3.8' + python_version_max: '3.14' steps: - uses: actions/checkout@main - - uses: actions/setup-python@main + - uses: actions/setup-python@v6 with: - python-version: 3.x + python-version: | + ${{ matrix.platform.python_version_min }} + 3.14t + pypy3.9 + pypy3.10 + pypy3.11 - name: Build wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.platform.target }} - args: --release --out dist --find-interpreter + args: --release --out dist -i python${{ matrix.platform.python_version_min }} python3.14t pypy3.9 pypy3.10 pypy3.11 sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} - name: Upload wheels uses: actions/upload-artifact@main with: name: wheels-macos-${{ matrix.platform.target }} path: dist + if-no-files-found: error + + - name: Install uv + uses: astral-sh/setup-uv@v7 + - name: Test wheels with min version (${{ matrix.platform.python_version_min }}) + # Check the built wheel is installable on the oldest Python supported + run: | + .github/scripts/ci_check_wheel.sh ${{ matrix.platform.python_version_min }} abi3 + - name: Test wheels with max version (${{ matrix.platform.python_version_max }}) + # Check the built wheel is installable on the oldest Python supported + run: | + .github/scripts/ci_check_wheel.sh ${{ matrix.platform.python_version_max }} abi3 --managed-python + + - name: Test free threaded wheels + run: | + .github/scripts/ci_check_wheel.sh 3.14t cp314t --managed-python + + - name: Test pypy wheels + run: | + .github/scripts/ci_check_wheel.sh pypy3.9 pypy39 --managed-python + .github/scripts/ci_check_wheel.sh pypy3.10 pypy310 --managed-python + .github/scripts/ci_check_wheel.sh pypy3.11 pypy311 --managed-python sdist: runs-on: ubuntu-latest @@ -147,6 +318,7 @@ jobs: with: name: wheels-sdist path: dist + if-no-files-found: error check_clippy_python_bindings: name: Check clippy for Python bindings @@ -158,6 +330,8 @@ jobs: - name: Setup Rust toolchain uses: dtolnay/rust-toolchain@stable + with: + toolchain: stable - name: Setup clippy run: rustup component add clippy @@ -168,8 +342,7 @@ jobs: release: name: Release runs-on: ubuntu-latest - if: ${{ startsWith(github.ref, 'refs/tags/') || github.event_name == 'workflow_dispatch' }} - needs: [linux, musllinux, windows, macos, sdist, check_clippy_python_bindings] + needs: [linux, musllinux, windows, windows_arm, macos, sdist, check_clippy_python_bindings] permissions: # Use to sign the release artifacts id-token: write @@ -178,16 +351,19 @@ jobs: # Used to generate artifact attestation attestations: write steps: - - uses: actions/download-artifact@main + - uses: actions/download-artifact@v6 - name: Generate artifact attestation - uses: actions/attest-build-provenance@v1 + if: ${{ startsWith(github.ref, 'refs/tags/') }} + uses: actions/attest-build-provenance@v3 with: subject-path: 'wheels-*/*' + - name: Install uv + uses: astral-sh/setup-uv@v7 + - name: Publish to PyPI (dry-run) + if: ${{ !startsWith(github.ref, 'refs/tags/') }} + run: uv publish 'wheels-*/*' --dry-run - name: Publish to PyPI if: ${{ startsWith(github.ref, 'refs/tags/') }} - uses: PyO3/maturin-action@v1 + run: uv publish 'wheels-*/*' env: - MATURIN_PYPI_TOKEN: ${{ secrets.PYPI_PASSWORD }} - with: - command: upload - args: --non-interactive --skip-existing wheels-*/* + UV_PUBLISH_TOKEN: ${{ secrets.PYPI_API_TOKEN }} diff --git a/Cargo.lock b/Cargo.lock index 0d7a668..52a3228 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -171,7 +171,7 @@ checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] name = "mapfile_parser" -version = "2.12.0" +version = "2.12.1" dependencies = [ "lazy_static", "objdiff-core", diff --git a/Cargo.toml b/Cargo.toml index 21e1426..7bf25eb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,7 @@ [package] name = "mapfile_parser" -version = "2.12.0" +version = "2.12.1" edition = "2021" rust-version = "1.74.0" authors = ["Anghelo Carvajal "] diff --git a/pyproject.toml b/pyproject.toml index a43230b..5cc6ce7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,13 +3,13 @@ [project] name = "mapfile_parser" -version = "2.12.0" +version = "2.12.1" description = "Map file parser library focusing decompilation projects" readme = "README.md" -requires-python = ">=3.9" +requires-python = ">=3.7" dependencies = [ "requests", - "decomp-settings==0.0.9", + "decomp-settings==0.0.10", ] classifiers = [ "Programming Language :: Rust", diff --git a/src/mapfile_parser/__init__.py b/src/mapfile_parser/__init__.py index b9fa7b2..f07f287 100644 --- a/src/mapfile_parser/__init__.py +++ b/src/mapfile_parser/__init__.py @@ -5,8 +5,8 @@ from __future__ import annotations -__version_info__ = (2, 12, 0) -__version__ = ".".join(map(str, __version_info__)) # + "-dev0" +__version_info__ = (2, 12, 1) +__version__ = ".".join(map(str, __version_info__)) # + "-dev0" __author__ = "Decompollaborate" from . import utils as utils diff --git a/src/rs/lib.rs b/src/rs/lib.rs index fc4122a..a45f20b 100644 --- a/src/rs/lib.rs +++ b/src/rs/lib.rs @@ -39,7 +39,7 @@ extern crate lazy_static; use pyo3::prelude::*; #[cfg(feature = "python_bindings")] -#[pymodule] +#[pymodule(gil_used = false)] fn mapfile_parser(m: &Bound<'_, PyModule>) -> PyResult<()> { m.add_class::()?; m.add_class::()?; diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..7b0e946 --- /dev/null +++ b/uv.lock @@ -0,0 +1,342 @@ +version = 1 +revision = 3 +requires-python = ">=3.7" +resolution-markers = [ + "python_full_version >= '3.9'", + "python_full_version == '3.8.*'", + "python_full_version < '3.8'", +] + +[[package]] +name = "certifi" +version = "2026.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/2d/a891ca51311197f6ad14a7ef42e2399f36cf2f9bd44752b3dc4eab60fdc5/certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120", size = 154268, upload-time = "2026-01-04T02:42:41.825Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/ad/3cc14f097111b4de0040c83a525973216457bbeeb63739ef1ed275c1c021/certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c", size = 152900, upload-time = "2026-01-04T02:42:40.15Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/13/69/33ddede1939fdd074bce5434295f38fae7136463422fe4fd3e0e89b98062/charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", size = 129418, upload-time = "2025-10-14T04:42:32.879Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1f/b8/6d51fc1d52cbd52cd4ccedd5b5b2f0f6a11bbf6765c782298b0f3e808541/charset_normalizer-3.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e824f1492727fa856dd6eda4f7cee25f8518a12f3c4a56a74e8095695089cf6d", size = 209709, upload-time = "2025-10-14T04:40:11.385Z" }, + { url = "https://files.pythonhosted.org/packages/5c/af/1f9d7f7faafe2ddfb6f72a2e07a548a629c61ad510fe60f9630309908fef/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8", size = 148814, upload-time = "2025-10-14T04:40:13.135Z" }, + { url = "https://files.pythonhosted.org/packages/79/3d/f2e3ac2bbc056ca0c204298ea4e3d9db9b4afe437812638759db2c976b5f/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:027f6de494925c0ab2a55eab46ae5129951638a49a34d87f4c3eda90f696b4ad", size = 144467, upload-time = "2025-10-14T04:40:14.728Z" }, + { url = "https://files.pythonhosted.org/packages/ec/85/1bf997003815e60d57de7bd972c57dc6950446a3e4ccac43bc3070721856/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f820802628d2694cb7e56db99213f930856014862f3fd943d290ea8438d07ca8", size = 162280, upload-time = "2025-10-14T04:40:16.14Z" }, + { url = "https://files.pythonhosted.org/packages/3e/8e/6aa1952f56b192f54921c436b87f2aaf7c7a7c3d0d1a765547d64fd83c13/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:798d75d81754988d2565bff1b97ba5a44411867c0cf32b77a7e8f8d84796b10d", size = 159454, upload-time = "2025-10-14T04:40:17.567Z" }, + { url = "https://files.pythonhosted.org/packages/36/3b/60cbd1f8e93aa25d1c669c649b7a655b0b5fb4c571858910ea9332678558/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d1bb833febdff5c8927f922386db610b49db6e0d4f4ee29601d71e7c2694313", size = 153609, upload-time = "2025-10-14T04:40:19.08Z" }, + { url = "https://files.pythonhosted.org/packages/64/91/6a13396948b8fd3c4b4fd5bc74d045f5637d78c9675585e8e9fbe5636554/charset_normalizer-3.4.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cd98cdc06614a2f768d2b7286d66805f94c48cde050acdbbb7db2600ab3197e", size = 151849, upload-time = "2025-10-14T04:40:20.607Z" }, + { url = "https://files.pythonhosted.org/packages/b7/7a/59482e28b9981d105691e968c544cc0df3b7d6133152fb3dcdc8f135da7a/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:077fbb858e903c73f6c9db43374fd213b0b6a778106bc7032446a8e8b5b38b93", size = 151586, upload-time = "2025-10-14T04:40:21.719Z" }, + { url = "https://files.pythonhosted.org/packages/92/59/f64ef6a1c4bdd2baf892b04cd78792ed8684fbc48d4c2afe467d96b4df57/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:244bfb999c71b35de57821b8ea746b24e863398194a4014e4c76adc2bbdfeff0", size = 145290, upload-time = "2025-10-14T04:40:23.069Z" }, + { url = "https://files.pythonhosted.org/packages/6b/63/3bf9f279ddfa641ffa1962b0db6a57a9c294361cc2f5fcac997049a00e9c/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:64b55f9dce520635f018f907ff1b0df1fdc31f2795a922fb49dd14fbcdf48c84", size = 163663, upload-time = "2025-10-14T04:40:24.17Z" }, + { url = "https://files.pythonhosted.org/packages/ed/09/c9e38fc8fa9e0849b172b581fd9803bdf6e694041127933934184e19f8c3/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:faa3a41b2b66b6e50f84ae4a68c64fcd0c44355741c6374813a800cd6695db9e", size = 151964, upload-time = "2025-10-14T04:40:25.368Z" }, + { url = "https://files.pythonhosted.org/packages/d2/d1/d28b747e512d0da79d8b6a1ac18b7ab2ecfd81b2944c4c710e166d8dd09c/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6515f3182dbe4ea06ced2d9e8666d97b46ef4c75e326b79bb624110f122551db", size = 161064, upload-time = "2025-10-14T04:40:26.806Z" }, + { url = "https://files.pythonhosted.org/packages/bb/9a/31d62b611d901c3b9e5500c36aab0ff5eb442043fb3a1c254200d3d397d9/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc00f04ed596e9dc0da42ed17ac5e596c6ccba999ba6bd92b0e0aef2f170f2d6", size = 155015, upload-time = "2025-10-14T04:40:28.284Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f3/107e008fa2bff0c8b9319584174418e5e5285fef32f79d8ee6a430d0039c/charset_normalizer-3.4.4-cp310-cp310-win32.whl", hash = "sha256:f34be2938726fc13801220747472850852fe6b1ea75869a048d6f896838c896f", size = 99792, upload-time = "2025-10-14T04:40:29.613Z" }, + { url = "https://files.pythonhosted.org/packages/eb/66/e396e8a408843337d7315bab30dbf106c38966f1819f123257f5520f8a96/charset_normalizer-3.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:a61900df84c667873b292c3de315a786dd8dac506704dea57bc957bd31e22c7d", size = 107198, upload-time = "2025-10-14T04:40:30.644Z" }, + { url = "https://files.pythonhosted.org/packages/b5/58/01b4f815bf0312704c267f2ccb6e5d42bcc7752340cd487bc9f8c3710597/charset_normalizer-3.4.4-cp310-cp310-win_arm64.whl", hash = "sha256:cead0978fc57397645f12578bfd2d5ea9138ea0fac82b2f63f7f7c6877986a69", size = 100262, upload-time = "2025-10-14T04:40:32.108Z" }, + { url = "https://files.pythonhosted.org/packages/ed/27/c6491ff4954e58a10f69ad90aca8a1b6fe9c5d3c6f380907af3c37435b59/charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8", size = 206988, upload-time = "2025-10-14T04:40:33.79Z" }, + { url = "https://files.pythonhosted.org/packages/94/59/2e87300fe67ab820b5428580a53cad894272dbb97f38a7a814a2a1ac1011/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0", size = 147324, upload-time = "2025-10-14T04:40:34.961Z" }, + { url = "https://files.pythonhosted.org/packages/07/fb/0cf61dc84b2b088391830f6274cb57c82e4da8bbc2efeac8c025edb88772/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3", size = 142742, upload-time = "2025-10-14T04:40:36.105Z" }, + { url = "https://files.pythonhosted.org/packages/62/8b/171935adf2312cd745d290ed93cf16cf0dfe320863ab7cbeeae1dcd6535f/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc", size = 160863, upload-time = "2025-10-14T04:40:37.188Z" }, + { url = "https://files.pythonhosted.org/packages/09/73/ad875b192bda14f2173bfc1bc9a55e009808484a4b256748d931b6948442/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897", size = 157837, upload-time = "2025-10-14T04:40:38.435Z" }, + { url = "https://files.pythonhosted.org/packages/6d/fc/de9cce525b2c5b94b47c70a4b4fb19f871b24995c728e957ee68ab1671ea/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381", size = 151550, upload-time = "2025-10-14T04:40:40.053Z" }, + { url = "https://files.pythonhosted.org/packages/55/c2/43edd615fdfba8c6f2dfbd459b25a6b3b551f24ea21981e23fb768503ce1/charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815", size = 149162, upload-time = "2025-10-14T04:40:41.163Z" }, + { url = "https://files.pythonhosted.org/packages/03/86/bde4ad8b4d0e9429a4e82c1e8f5c659993a9a863ad62c7df05cf7b678d75/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0", size = 150019, upload-time = "2025-10-14T04:40:42.276Z" }, + { url = "https://files.pythonhosted.org/packages/1f/86/a151eb2af293a7e7bac3a739b81072585ce36ccfb4493039f49f1d3cae8c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161", size = 143310, upload-time = "2025-10-14T04:40:43.439Z" }, + { url = "https://files.pythonhosted.org/packages/b5/fe/43dae6144a7e07b87478fdfc4dbe9efd5defb0e7ec29f5f58a55aeef7bf7/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4", size = 162022, upload-time = "2025-10-14T04:40:44.547Z" }, + { url = "https://files.pythonhosted.org/packages/80/e6/7aab83774f5d2bca81f42ac58d04caf44f0cc2b65fc6db2b3b2e8a05f3b3/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89", size = 149383, upload-time = "2025-10-14T04:40:46.018Z" }, + { url = "https://files.pythonhosted.org/packages/4f/e8/b289173b4edae05c0dde07f69f8db476a0b511eac556dfe0d6bda3c43384/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569", size = 159098, upload-time = "2025-10-14T04:40:47.081Z" }, + { url = "https://files.pythonhosted.org/packages/d8/df/fe699727754cae3f8478493c7f45f777b17c3ef0600e28abfec8619eb49c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224", size = 152991, upload-time = "2025-10-14T04:40:48.246Z" }, + { url = "https://files.pythonhosted.org/packages/1a/86/584869fe4ddb6ffa3bd9f491b87a01568797fb9bd8933f557dba9771beaf/charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a", size = 99456, upload-time = "2025-10-14T04:40:49.376Z" }, + { url = "https://files.pythonhosted.org/packages/65/f6/62fdd5feb60530f50f7e38b4f6a1d5203f4d16ff4f9f0952962c044e919a/charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016", size = 106978, upload-time = "2025-10-14T04:40:50.844Z" }, + { url = "https://files.pythonhosted.org/packages/7a/9d/0710916e6c82948b3be62d9d398cb4fcf4e97b56d6a6aeccd66c4b2f2bd5/charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1", size = 99969, upload-time = "2025-10-14T04:40:52.272Z" }, + { url = "https://files.pythonhosted.org/packages/f3/85/1637cd4af66fa687396e757dec650f28025f2a2f5a5531a3208dc0ec43f2/charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394", size = 208425, upload-time = "2025-10-14T04:40:53.353Z" }, + { url = "https://files.pythonhosted.org/packages/9d/6a/04130023fef2a0d9c62d0bae2649b69f7b7d8d24ea5536feef50551029df/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25", size = 148162, upload-time = "2025-10-14T04:40:54.558Z" }, + { url = "https://files.pythonhosted.org/packages/78/29/62328d79aa60da22c9e0b9a66539feae06ca0f5a4171ac4f7dc285b83688/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef", size = 144558, upload-time = "2025-10-14T04:40:55.677Z" }, + { url = "https://files.pythonhosted.org/packages/86/bb/b32194a4bf15b88403537c2e120b817c61cd4ecffa9b6876e941c3ee38fe/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d", size = 161497, upload-time = "2025-10-14T04:40:57.217Z" }, + { url = "https://files.pythonhosted.org/packages/19/89/a54c82b253d5b9b111dc74aca196ba5ccfcca8242d0fb64146d4d3183ff1/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8", size = 159240, upload-time = "2025-10-14T04:40:58.358Z" }, + { url = "https://files.pythonhosted.org/packages/c0/10/d20b513afe03acc89ec33948320a5544d31f21b05368436d580dec4e234d/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86", size = 153471, upload-time = "2025-10-14T04:40:59.468Z" }, + { url = "https://files.pythonhosted.org/packages/61/fa/fbf177b55bdd727010f9c0a3c49eefa1d10f960e5f09d1d887bf93c2e698/charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a", size = 150864, upload-time = "2025-10-14T04:41:00.623Z" }, + { url = "https://files.pythonhosted.org/packages/05/12/9fbc6a4d39c0198adeebbde20b619790e9236557ca59fc40e0e3cebe6f40/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f", size = 150647, upload-time = "2025-10-14T04:41:01.754Z" }, + { url = "https://files.pythonhosted.org/packages/ad/1f/6a9a593d52e3e8c5d2b167daf8c6b968808efb57ef4c210acb907c365bc4/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc", size = 145110, upload-time = "2025-10-14T04:41:03.231Z" }, + { url = "https://files.pythonhosted.org/packages/30/42/9a52c609e72471b0fc54386dc63c3781a387bb4fe61c20231a4ebcd58bdd/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf", size = 162839, upload-time = "2025-10-14T04:41:04.715Z" }, + { url = "https://files.pythonhosted.org/packages/c4/5b/c0682bbf9f11597073052628ddd38344a3d673fda35a36773f7d19344b23/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15", size = 150667, upload-time = "2025-10-14T04:41:05.827Z" }, + { url = "https://files.pythonhosted.org/packages/e4/24/a41afeab6f990cf2daf6cb8c67419b63b48cf518e4f56022230840c9bfb2/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9", size = 160535, upload-time = "2025-10-14T04:41:06.938Z" }, + { url = "https://files.pythonhosted.org/packages/2a/e5/6a4ce77ed243c4a50a1fecca6aaaab419628c818a49434be428fe24c9957/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0", size = 154816, upload-time = "2025-10-14T04:41:08.101Z" }, + { url = "https://files.pythonhosted.org/packages/a8/ef/89297262b8092b312d29cdb2517cb1237e51db8ecef2e9af5edbe7b683b1/charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26", size = 99694, upload-time = "2025-10-14T04:41:09.23Z" }, + { url = "https://files.pythonhosted.org/packages/3d/2d/1e5ed9dd3b3803994c155cd9aacb60c82c331bad84daf75bcb9c91b3295e/charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525", size = 107131, upload-time = "2025-10-14T04:41:10.467Z" }, + { url = "https://files.pythonhosted.org/packages/d0/d9/0ed4c7098a861482a7b6a95603edce4c0d9db2311af23da1fb2b75ec26fc/charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3", size = 100390, upload-time = "2025-10-14T04:41:11.915Z" }, + { url = "https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794", size = 208091, upload-time = "2025-10-14T04:41:13.346Z" }, + { url = "https://files.pythonhosted.org/packages/7d/62/73a6d7450829655a35bb88a88fca7d736f9882a27eacdca2c6d505b57e2e/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed", size = 147936, upload-time = "2025-10-14T04:41:14.461Z" }, + { url = "https://files.pythonhosted.org/packages/89/c5/adb8c8b3d6625bef6d88b251bbb0d95f8205831b987631ab0c8bb5d937c2/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72", size = 144180, upload-time = "2025-10-14T04:41:15.588Z" }, + { url = "https://files.pythonhosted.org/packages/91/ed/9706e4070682d1cc219050b6048bfd293ccf67b3d4f5a4f39207453d4b99/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328", size = 161346, upload-time = "2025-10-14T04:41:16.738Z" }, + { url = "https://files.pythonhosted.org/packages/d5/0d/031f0d95e4972901a2f6f09ef055751805ff541511dc1252ba3ca1f80cf5/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede", size = 158874, upload-time = "2025-10-14T04:41:17.923Z" }, + { url = "https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894", size = 153076, upload-time = "2025-10-14T04:41:19.106Z" }, + { url = "https://files.pythonhosted.org/packages/75/1e/5ff781ddf5260e387d6419959ee89ef13878229732732ee73cdae01800f2/charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1", size = 150601, upload-time = "2025-10-14T04:41:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/d7/57/71be810965493d3510a6ca79b90c19e48696fb1ff964da319334b12677f0/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490", size = 150376, upload-time = "2025-10-14T04:41:21.398Z" }, + { url = "https://files.pythonhosted.org/packages/e5/d5/c3d057a78c181d007014feb7e9f2e65905a6c4ef182c0ddf0de2924edd65/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44", size = 144825, upload-time = "2025-10-14T04:41:22.583Z" }, + { url = "https://files.pythonhosted.org/packages/e6/8c/d0406294828d4976f275ffbe66f00266c4b3136b7506941d87c00cab5272/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133", size = 162583, upload-time = "2025-10-14T04:41:23.754Z" }, + { url = "https://files.pythonhosted.org/packages/d7/24/e2aa1f18c8f15c4c0e932d9287b8609dd30ad56dbe41d926bd846e22fb8d/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3", size = 150366, upload-time = "2025-10-14T04:41:25.27Z" }, + { url = "https://files.pythonhosted.org/packages/e4/5b/1e6160c7739aad1e2df054300cc618b06bf784a7a164b0f238360721ab86/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e", size = 160300, upload-time = "2025-10-14T04:41:26.725Z" }, + { url = "https://files.pythonhosted.org/packages/7a/10/f882167cd207fbdd743e55534d5d9620e095089d176d55cb22d5322f2afd/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc", size = 154465, upload-time = "2025-10-14T04:41:28.322Z" }, + { url = "https://files.pythonhosted.org/packages/89/66/c7a9e1b7429be72123441bfdbaf2bc13faab3f90b933f664db506dea5915/charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac", size = 99404, upload-time = "2025-10-14T04:41:29.95Z" }, + { url = "https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14", size = 107092, upload-time = "2025-10-14T04:41:31.188Z" }, + { url = "https://files.pythonhosted.org/packages/af/8f/3ed4bfa0c0c72a7ca17f0380cd9e4dd842b09f664e780c13cff1dcf2ef1b/charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2", size = 100408, upload-time = "2025-10-14T04:41:32.624Z" }, + { url = "https://files.pythonhosted.org/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd", size = 207746, upload-time = "2025-10-14T04:41:33.773Z" }, + { url = "https://files.pythonhosted.org/packages/10/9a/97c8d48ef10d6cd4fcead2415523221624bf58bcf68a802721a6bc807c8f/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb", size = 147889, upload-time = "2025-10-14T04:41:34.897Z" }, + { url = "https://files.pythonhosted.org/packages/10/bf/979224a919a1b606c82bd2c5fa49b5c6d5727aa47b4312bb27b1734f53cd/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e", size = 143641, upload-time = "2025-10-14T04:41:36.116Z" }, + { url = "https://files.pythonhosted.org/packages/ba/33/0ad65587441fc730dc7bd90e9716b30b4702dc7b617e6ba4997dc8651495/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14", size = 160779, upload-time = "2025-10-14T04:41:37.229Z" }, + { url = "https://files.pythonhosted.org/packages/67/ed/331d6b249259ee71ddea93f6f2f0a56cfebd46938bde6fcc6f7b9a3d0e09/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191", size = 159035, upload-time = "2025-10-14T04:41:38.368Z" }, + { url = "https://files.pythonhosted.org/packages/67/ff/f6b948ca32e4f2a4576aa129d8bed61f2e0543bf9f5f2b7fc3758ed005c9/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838", size = 152542, upload-time = "2025-10-14T04:41:39.862Z" }, + { url = "https://files.pythonhosted.org/packages/16/85/276033dcbcc369eb176594de22728541a925b2632f9716428c851b149e83/charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6", size = 149524, upload-time = "2025-10-14T04:41:41.319Z" }, + { url = "https://files.pythonhosted.org/packages/9e/f2/6a2a1f722b6aba37050e626530a46a68f74e63683947a8acff92569f979a/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e", size = 150395, upload-time = "2025-10-14T04:41:42.539Z" }, + { url = "https://files.pythonhosted.org/packages/60/bb/2186cb2f2bbaea6338cad15ce23a67f9b0672929744381e28b0592676824/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c", size = 143680, upload-time = "2025-10-14T04:41:43.661Z" }, + { url = "https://files.pythonhosted.org/packages/7d/a5/bf6f13b772fbb2a90360eb620d52ed8f796f3c5caee8398c3b2eb7b1c60d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090", size = 162045, upload-time = "2025-10-14T04:41:44.821Z" }, + { url = "https://files.pythonhosted.org/packages/df/c5/d1be898bf0dc3ef9030c3825e5d3b83f2c528d207d246cbabe245966808d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152", size = 149687, upload-time = "2025-10-14T04:41:46.442Z" }, + { url = "https://files.pythonhosted.org/packages/a5/42/90c1f7b9341eef50c8a1cb3f098ac43b0508413f33affd762855f67a410e/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828", size = 160014, upload-time = "2025-10-14T04:41:47.631Z" }, + { url = "https://files.pythonhosted.org/packages/76/be/4d3ee471e8145d12795ab655ece37baed0929462a86e72372fd25859047c/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec", size = 154044, upload-time = "2025-10-14T04:41:48.81Z" }, + { url = "https://files.pythonhosted.org/packages/b0/6f/8f7af07237c34a1defe7defc565a9bc1807762f672c0fde711a4b22bf9c0/charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9", size = 99940, upload-time = "2025-10-14T04:41:49.946Z" }, + { url = "https://files.pythonhosted.org/packages/4b/51/8ade005e5ca5b0d80fb4aff72a3775b325bdc3d27408c8113811a7cbe640/charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c", size = 107104, upload-time = "2025-10-14T04:41:51.051Z" }, + { url = "https://files.pythonhosted.org/packages/da/5f/6b8f83a55bb8278772c5ae54a577f3099025f9ade59d0136ac24a0df4bde/charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2", size = 100743, upload-time = "2025-10-14T04:41:52.122Z" }, + { url = "https://files.pythonhosted.org/packages/0a/4e/3926a1c11f0433791985727965263f788af00db3482d89a7545ca5ecc921/charset_normalizer-3.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ce8a0633f41a967713a59c4139d29110c07e826d131a316b50ce11b1d79b4f84", size = 198599, upload-time = "2025-10-14T04:41:53.213Z" }, + { url = "https://files.pythonhosted.org/packages/ec/7c/b92d1d1dcffc34592e71ea19c882b6709e43d20fa498042dea8b815638d7/charset_normalizer-3.4.4-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaabd426fe94daf8fd157c32e571c85cb12e66692f15516a83a03264b08d06c3", size = 143090, upload-time = "2025-10-14T04:41:54.385Z" }, + { url = "https://files.pythonhosted.org/packages/84/ce/61a28d3bb77281eb24107b937a497f3c43089326d27832a63dcedaab0478/charset_normalizer-3.4.4-cp38-cp38-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c4ef880e27901b6cc782f1b95f82da9313c0eb95c3af699103088fa0ac3ce9ac", size = 139490, upload-time = "2025-10-14T04:41:55.551Z" }, + { url = "https://files.pythonhosted.org/packages/c0/bd/c9e59a91b2061c6f8bb98a150670cb16d4cd7c4ba7d11ad0cdf789155f41/charset_normalizer-3.4.4-cp38-cp38-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2aaba3b0819274cc41757a1da876f810a3e4d7b6eb25699253a4effef9e8e4af", size = 155334, upload-time = "2025-10-14T04:41:56.724Z" }, + { url = "https://files.pythonhosted.org/packages/bf/37/f17ae176a80f22ff823456af91ba3bc59df308154ff53aef0d39eb3d3419/charset_normalizer-3.4.4-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:778d2e08eda00f4256d7f672ca9fef386071c9202f5e4607920b86d7803387f2", size = 152823, upload-time = "2025-10-14T04:41:58.236Z" }, + { url = "https://files.pythonhosted.org/packages/bf/fa/cf5bb2409a385f78750e78c8d2e24780964976acdaaed65dbd6083ae5b40/charset_normalizer-3.4.4-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f155a433c2ec037d4e8df17d18922c3a0d9b3232a396690f17175d2946f0218d", size = 147618, upload-time = "2025-10-14T04:41:59.409Z" }, + { url = "https://files.pythonhosted.org/packages/9b/63/579784a65bc7de2d4518d40bb8f1870900163e86f17f21fd1384318c459d/charset_normalizer-3.4.4-cp38-cp38-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a8bf8d0f749c5757af2142fe7903a9df1d2e8aa3841559b2bad34b08d0e2bcf3", size = 145516, upload-time = "2025-10-14T04:42:00.579Z" }, + { url = "https://files.pythonhosted.org/packages/a3/a9/94ec6266cd394e8f93a4d69cca651d61bf6ac58d2a0422163b30c698f2c7/charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:194f08cbb32dc406d6e1aea671a68be0823673db2832b38405deba2fb0d88f63", size = 145266, upload-time = "2025-10-14T04:42:01.684Z" }, + { url = "https://files.pythonhosted.org/packages/09/14/d6626eb97764b58c2779fa7928fa7d1a49adb8ce687c2dbba4db003c1939/charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:6aee717dcfead04c6eb1ce3bd29ac1e22663cdea57f943c87d1eab9a025438d7", size = 139559, upload-time = "2025-10-14T04:42:02.902Z" }, + { url = "https://files.pythonhosted.org/packages/09/01/ddbe6b01313ba191dbb0a43c7563bc770f2448c18127f9ea4b119c44dff0/charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:cd4b7ca9984e5e7985c12bc60a6f173f3c958eae74f3ef6624bb6b26e2abbae4", size = 156653, upload-time = "2025-10-14T04:42:04.005Z" }, + { url = "https://files.pythonhosted.org/packages/95/c8/d05543378bea89296e9af4510b44c704626e191da447235c8fdedfc5b7b2/charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_riscv64.whl", hash = "sha256:b7cf1017d601aa35e6bb650b6ad28652c9cd78ee6caff19f3c28d03e1c80acbf", size = 145644, upload-time = "2025-10-14T04:42:05.211Z" }, + { url = "https://files.pythonhosted.org/packages/72/01/2866c4377998ef8a1f6802f6431e774a4c8ebe75b0a6e569ceec55c9cbfb/charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:e912091979546adf63357d7e2ccff9b44f026c075aeaf25a52d0e95ad2281074", size = 153964, upload-time = "2025-10-14T04:42:06.341Z" }, + { url = "https://files.pythonhosted.org/packages/4a/66/66c72468a737b4cbd7851ba2c522fe35c600575fbeac944460b4fd4a06fe/charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:5cb4d72eea50c8868f5288b7f7f33ed276118325c1dfd3957089f6b519e1382a", size = 148777, upload-time = "2025-10-14T04:42:07.535Z" }, + { url = "https://files.pythonhosted.org/packages/50/94/d0d56677fdddbffa8ca00ec411f67bb8c947f9876374ddc9d160d4f2c4b3/charset_normalizer-3.4.4-cp38-cp38-win32.whl", hash = "sha256:837c2ce8c5a65a2035be9b3569c684358dfbf109fd3b6969630a87535495ceaa", size = 98687, upload-time = "2025-10-14T04:42:08.678Z" }, + { url = "https://files.pythonhosted.org/packages/00/64/c3bc303d1b586480b1c8e6e1e2191a6d6dd40255244e5cf16763dcec52e6/charset_normalizer-3.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:44c2a8734b333e0578090c4cd6b16f275e07aa6614ca8715e6c038e865e70576", size = 106115, upload-time = "2025-10-14T04:42:09.793Z" }, + { url = "https://files.pythonhosted.org/packages/46/7c/0c4760bccf082737ca7ab84a4c2034fcc06b1f21cf3032ea98bd6feb1725/charset_normalizer-3.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a9768c477b9d7bd54bc0c86dbaebdec6f03306675526c9927c0e8a04e8f94af9", size = 209609, upload-time = "2025-10-14T04:42:10.922Z" }, + { url = "https://files.pythonhosted.org/packages/bb/a4/69719daef2f3d7f1819de60c9a6be981b8eeead7542d5ec4440f3c80e111/charset_normalizer-3.4.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1bee1e43c28aa63cb16e5c14e582580546b08e535299b8b6158a7c9c768a1f3d", size = 149029, upload-time = "2025-10-14T04:42:12.38Z" }, + { url = "https://files.pythonhosted.org/packages/e6/21/8d4e1d6c1e6070d3672908b8e4533a71b5b53e71d16828cc24d0efec564c/charset_normalizer-3.4.4-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:fd44c878ea55ba351104cb93cc85e74916eb8fa440ca7903e57575e97394f608", size = 144580, upload-time = "2025-10-14T04:42:13.549Z" }, + { url = "https://files.pythonhosted.org/packages/a7/0a/a616d001b3f25647a9068e0b9199f697ce507ec898cacb06a0d5a1617c99/charset_normalizer-3.4.4-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0f04b14ffe5fdc8c4933862d8306109a2c51e0704acfa35d51598eb45a1e89fc", size = 162340, upload-time = "2025-10-14T04:42:14.892Z" }, + { url = "https://files.pythonhosted.org/packages/85/93/060b52deb249a5450460e0585c88a904a83aec474ab8e7aba787f45e79f2/charset_normalizer-3.4.4-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:cd09d08005f958f370f539f186d10aec3377d55b9eeb0d796025d4886119d76e", size = 159619, upload-time = "2025-10-14T04:42:16.676Z" }, + { url = "https://files.pythonhosted.org/packages/dd/21/0274deb1cc0632cd587a9a0ec6b4674d9108e461cb4cd40d457adaeb0564/charset_normalizer-3.4.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4fe7859a4e3e8457458e2ff592f15ccb02f3da787fcd31e0183879c3ad4692a1", size = 153980, upload-time = "2025-10-14T04:42:17.917Z" }, + { url = "https://files.pythonhosted.org/packages/28/2b/e3d7d982858dccc11b31906976323d790dded2017a0572f093ff982d692f/charset_normalizer-3.4.4-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fa09f53c465e532f4d3db095e0c55b615f010ad81803d383195b6b5ca6cbf5f3", size = 152174, upload-time = "2025-10-14T04:42:19.018Z" }, + { url = "https://files.pythonhosted.org/packages/6e/ff/4a269f8e35f1e58b2df52c131a1fa019acb7ef3f8697b7d464b07e9b492d/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7fa17817dc5625de8a027cb8b26d9fefa3ea28c8253929b8d6649e705d2835b6", size = 151666, upload-time = "2025-10-14T04:42:20.171Z" }, + { url = "https://files.pythonhosted.org/packages/da/c9/ec39870f0b330d58486001dd8e532c6b9a905f5765f58a6f8204926b4a93/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:5947809c8a2417be3267efc979c47d76a079758166f7d43ef5ae8e9f92751f88", size = 145550, upload-time = "2025-10-14T04:42:21.324Z" }, + { url = "https://files.pythonhosted.org/packages/75/8f/d186ab99e40e0ed9f82f033d6e49001701c81244d01905dd4a6924191a30/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:4902828217069c3c5c71094537a8e623f5d097858ac6ca8252f7b4d10b7560f1", size = 163721, upload-time = "2025-10-14T04:42:22.46Z" }, + { url = "https://files.pythonhosted.org/packages/96/b1/6047663b9744df26a7e479ac1e77af7134b1fcf9026243bb48ee2d18810f/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:7c308f7e26e4363d79df40ca5b2be1c6ba9f02bdbccfed5abddb7859a6ce72cf", size = 152127, upload-time = "2025-10-14T04:42:23.712Z" }, + { url = "https://files.pythonhosted.org/packages/59/78/e5a6eac9179f24f704d1be67d08704c3c6ab9f00963963524be27c18ed87/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2c9d3c380143a1fedbff95a312aa798578371eb29da42106a29019368a475318", size = 161175, upload-time = "2025-10-14T04:42:24.87Z" }, + { url = "https://files.pythonhosted.org/packages/e5/43/0e626e42d54dd2f8dd6fc5e1c5ff00f05fbca17cb699bedead2cae69c62f/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cb01158d8b88ee68f15949894ccc6712278243d95f344770fa7593fa2d94410c", size = 155375, upload-time = "2025-10-14T04:42:27.246Z" }, + { url = "https://files.pythonhosted.org/packages/e9/91/d9615bf2e06f35e4997616ff31248c3657ed649c5ab9d35ea12fce54e380/charset_normalizer-3.4.4-cp39-cp39-win32.whl", hash = "sha256:2677acec1a2f8ef614c6888b5b4ae4060cc184174a938ed4e8ef690e15d3e505", size = 99692, upload-time = "2025-10-14T04:42:28.425Z" }, + { url = "https://files.pythonhosted.org/packages/d1/a9/6c040053909d9d1ef4fcab45fddec083aedc9052c10078339b47c8573ea8/charset_normalizer-3.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:f8e160feb2aed042cd657a72acc0b481212ed28b1b9a95c0cee1621b524e1966", size = 107192, upload-time = "2025-10-14T04:42:29.482Z" }, + { url = "https://files.pythonhosted.org/packages/f0/c6/4fa536b2c0cd3edfb7ccf8469fa0f363ea67b7213a842b90909ca33dd851/charset_normalizer-3.4.4-cp39-cp39-win_arm64.whl", hash = "sha256:b5d84d37db046c5ca74ee7bb47dd6cbc13f80665fdde3e8040bdd3fb015ecb50", size = 100220, upload-time = "2025-10-14T04:42:30.632Z" }, + { url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402, upload-time = "2025-10-14T04:42:31.76Z" }, +] + +[[package]] +name = "decomp-settings" +version = "0.0.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/30/deb36acf1abf05ba7755985451dd942f560fd6769db6babbf05d88f77205/decomp_settings-0.0.10.tar.gz", hash = "sha256:856d589f8e7f52e8d5a31de603297caa9f33a9209ea35aa33b98a8834edd0a5a", size = 58592, upload-time = "2026-01-16T12:32:29.252Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/19/4fd5cba25c4ba30c15cb441ca552cbe9d5200a638490ab8737ec481e79a2/decomp_settings-0.0.10-cp311-abi3-win_arm64.whl", hash = "sha256:0ecf422009abd792bee1566d1ef0e8ce142e1c87a6dbc05e33ccbb1bd5bc9dc3", size = 320961, upload-time = "2026-01-16T12:32:57.141Z" }, + { url = "https://files.pythonhosted.org/packages/fc/0f/4b8b6457979221525bb01594f4f6ce0c398f8dcd3c098a9309b5b31c902e/decomp_settings-0.0.10-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:a8ae74554fea88ca5e8a33318373f3a26e050cc0f3c94a8f15c9b010b2fdca82", size = 443087, upload-time = "2026-01-16T12:32:05.131Z" }, + { url = "https://files.pythonhosted.org/packages/af/50/8666e6e7d1a625e5360ee7d6e69cc5d6b0229e51b9a9c437bf38874301a7/decomp_settings-0.0.10-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6e95f0c40090166e4f2c9360dab8c21d4a08b9aeb529f6b9612624bf706ec8d1", size = 433834, upload-time = "2026-01-16T12:32:44.778Z" }, + { url = "https://files.pythonhosted.org/packages/e5/b5/bcc7cd2ede063da906c3317c237118547e16d4f24bce0e6acf9993a0e8dc/decomp_settings-0.0.10-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5190582c4c0caa0923685c6f45e172fbedf414b5d44f9a205f117018c7576187", size = 480489, upload-time = "2026-01-16T12:31:47.464Z" }, + { url = "https://files.pythonhosted.org/packages/c4/9b/c53fc19947a7c19679bd411f84d23cd1590843fbe58dbf575583a3b9120e/decomp_settings-0.0.10-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c68d83f3bd7ac6504142c6ca6ee47f20489b6b6bdfe2a31bb0358c8e71d70f9e", size = 491786, upload-time = "2026-01-16T12:32:43.844Z" }, + { url = "https://files.pythonhosted.org/packages/d5/9f/e1c638009811530ba1fa9956ba484de8fedfb3b6f276fcb1db68c65c4b17/decomp_settings-0.0.10-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e1de78323d26cea7816d07cbb7bd7ce6386ef3a37b17291d2f26f7c20ea7aef3", size = 617480, upload-time = "2026-01-16T12:32:20.176Z" }, + { url = "https://files.pythonhosted.org/packages/1e/d5/4bbc28b2a9957bf9a1b4c2042772cc061317c2ed1f77221b271756d35d70/decomp_settings-0.0.10-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ab7829814bc6bf003fb495b81478ab393139f8b8eb7c17fe8e162d012c359c5", size = 518354, upload-time = "2026-01-16T12:32:53.629Z" }, + { url = "https://files.pythonhosted.org/packages/09/74/21b95ee8c4dd740d2d955ad917bac8679b3a3b668bf80a6b0f678c55d2d1/decomp_settings-0.0.10-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b6482ebf15e369c2f009202bdee80288528b0a4d776e96a1e5d277e47ac7570", size = 488368, upload-time = "2026-01-16T12:32:42.751Z" }, + { url = "https://files.pythonhosted.org/packages/25/4b/8f4490a642a2a50c91aa52caac252e843856421b7eb0c9ea150445abb8a1/decomp_settings-0.0.10-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:819b1aba42cc455d4fbf99a7352faa38d965de68982bc18af91c605e775742a8", size = 519939, upload-time = "2026-01-16T12:32:51.346Z" }, + { url = "https://files.pythonhosted.org/packages/7a/a2/6e649904dfed9338adf28f67df246f9a7f49849287d27d5eda5dfdc5d849/decomp_settings-0.0.10-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9be3d6fd148103991cfaa48f91609ab3514ffb8987be784480cf3a9ad4eefb9a", size = 663224, upload-time = "2026-01-16T12:32:27.272Z" }, + { url = "https://files.pythonhosted.org/packages/aa/03/9c4a7923995bdd266883b4c693614176d343b886fb1301466aceb3efe6dc/decomp_settings-0.0.10-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:00403c7db6bfa76bcb068008ec6e89c6f8fe2ec066e18ba8faf3247e91db78db", size = 761270, upload-time = "2026-01-16T12:32:38.997Z" }, + { url = "https://files.pythonhosted.org/packages/9b/13/03e33dd4a179bdc8d13dfae0657110d05197eb1662746d5b94dd7a7d0416/decomp_settings-0.0.10-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:59e3c49fc2892fd9b90d4c7c7e31d01658d6c6c2badee1f355065d69941c1922", size = 729537, upload-time = "2026-01-16T12:32:23.957Z" }, + { url = "https://files.pythonhosted.org/packages/95/da/a5280465de003bb7641b4786d026c8bb0f7f166cee82f46a49a266968179/decomp_settings-0.0.10-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5f83835ec03ee9206ae93a237964e19748e264dfb8c72b78d1ecf10bc87b5eb7", size = 694638, upload-time = "2026-01-16T12:32:36.805Z" }, + { url = "https://files.pythonhosted.org/packages/88/17/ee43ba85feead5e69ae8f2c58ad77c3f1f707ab39f20014bcf6c75638bba/decomp_settings-0.0.10-cp314-cp314t-win32.whl", hash = "sha256:fdc8cfeb6a701d9fe94634168f90edf2d6e94db8fe2472b36338b4309f3c0e54", size = 316732, upload-time = "2026-01-16T12:32:50.51Z" }, + { url = "https://files.pythonhosted.org/packages/c8/76/4803672b4f132ef494ba1a83bea49795c9a77666a27b92935b0180f4a787/decomp_settings-0.0.10-cp314-cp314t-win_amd64.whl", hash = "sha256:a6f0c0e1c906c0baa9ff1a342ebea7b6038709848db360fec6466d4d48d7d9b9", size = 333324, upload-time = "2026-01-16T12:32:49.576Z" }, + { url = "https://files.pythonhosted.org/packages/c3/97/9e905d860f2800e43e7604a74b9ff475a7bc071a4282e5dde63c2b7b5e20/decomp_settings-0.0.10-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:b96060d280972f52aa96fd0a33d816e33d6ed0eaffce1d3ad9eb6b1992676cd1", size = 451310, upload-time = "2026-01-16T12:31:46.454Z" }, + { url = "https://files.pythonhosted.org/packages/54/db/2f55628ff81eabc260bd7fe8a24f215ca428b6c5755a3a73a1ad143d597e/decomp_settings-0.0.10-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38bf2972cc9e494424e8a5e713432b81baffe19024f9a7813b117efe3b95fbab", size = 486378, upload-time = "2026-01-16T12:32:13.672Z" }, + { url = "https://files.pythonhosted.org/packages/a2/23/2e07defc4a368ddfcd6413b6f100cb9f5e8a0af458fde3990a5a5ead3d8c/decomp_settings-0.0.10-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c58c233bf1329a2b51c8c36aac6a0036e50ee2d3e160a64fe115fea42930a28f", size = 495959, upload-time = "2026-01-16T12:32:30.025Z" }, + { url = "https://files.pythonhosted.org/packages/8c/ed/c101fc0986c8b759c5b53b9f6240d038463eacb3ef566876b2b00602fad3/decomp_settings-0.0.10-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:daece49294f982a7abc8f20f6abde23e956a42523717195e402ed745a92b3a31", size = 622398, upload-time = "2026-01-16T12:31:54.507Z" }, + { url = "https://files.pythonhosted.org/packages/1b/53/dbd66d86e5a89e840a35cc0ef1d6dc7a60619c31fcc01faa86b6a83e86b6/decomp_settings-0.0.10-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ec5918d582948efd55454f85b432876e9dee8abc4d4ca1e16b4ed7c8c7c8b5e0", size = 522097, upload-time = "2026-01-16T12:31:51.368Z" }, + { url = "https://files.pythonhosted.org/packages/46/df/bc2b5bc0b415450799d485c1cdfe5a87cd9eebc6d61e7eba2c0175ee5aec/decomp_settings-0.0.10-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:583f6038ef802019d5c127c2541656780d5695f16f9b02c25329788a928beac7", size = 492009, upload-time = "2026-01-16T12:32:00.334Z" }, + { url = "https://files.pythonhosted.org/packages/46/ba/0328c8ca83dc49011f0b823cf33ad17437318e183e77ccc236addd6bc1a1/decomp_settings-0.0.10-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9d44cd8eeb01ac62b2bdd2943700a86d05d4cfb70b4751220effa570db002993", size = 524521, upload-time = "2026-01-16T12:32:03.158Z" }, + { url = "https://files.pythonhosted.org/packages/90/a5/97fae5e07fd35f95178b40d1ee92c825b39a943b0cc58ddebf85cac7513d/decomp_settings-0.0.10-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:beedf13725526862a5784282ce80bdd13e1ebc86e87310fe3b0c1c09affee3f9", size = 667945, upload-time = "2026-01-16T12:32:37.747Z" }, + { url = "https://files.pythonhosted.org/packages/8c/c8/0ca3650e9651bec3ab788f87147bcf7f50956d88263d17d2369c310fedff/decomp_settings-0.0.10-cp37-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:514d3c2fde8fa756cde0a15638573e90ac44e32649ce84bb3e6e51b253b31901", size = 764827, upload-time = "2026-01-16T12:31:53.507Z" }, + { url = "https://files.pythonhosted.org/packages/a7/fc/f6b9d8d3112576cc15a72dd816cafbce5d211fe880c216325c47a05ced22/decomp_settings-0.0.10-cp37-abi3-musllinux_1_2_i686.whl", hash = "sha256:83e74cf0066178cba6221c075a23ac083431eae910329f5f931daab30d10c48a", size = 734574, upload-time = "2026-01-16T12:31:57.68Z" }, + { url = "https://files.pythonhosted.org/packages/b2/1e/be08770b24c38546c128eb4612747ac2f1ccaa0d0d2417e8b829f3c11db7/decomp_settings-0.0.10-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:0c0f85509cb4efb07a302e2bbc26bb2a387c5118315307486cec6cd1d19e6b34", size = 698723, upload-time = "2026-01-16T12:32:41.86Z" }, + { url = "https://files.pythonhosted.org/packages/2a/27/489e168ec9ee67ed7760e1907f2619d2b76c1a13c1cf5c1768d3553211cf/decomp_settings-0.0.10-cp37-abi3-win32.whl", hash = "sha256:d3aa4aa6c026095ae4af275db4a21e61b91151dda5dae0bcf9d336b3104e8ff8", size = 319091, upload-time = "2026-01-16T12:32:11.619Z" }, + { url = "https://files.pythonhosted.org/packages/40/0b/0ec778345483d77a682d4c00c966faa518e571f564d5e4e5fa7428c8f02e/decomp_settings-0.0.10-cp37-abi3-win_amd64.whl", hash = "sha256:56dd8ef894833a128ec96a7a20bc14cb7de6b0ace92435db08e66ea1e4b1b70d", size = 336680, upload-time = "2026-01-16T12:32:55.955Z" }, + { url = "https://files.pythonhosted.org/packages/fb/92/b5dd38b4f91ffa855d41b33fccb2a5478a5d6666023d60f8fcef4e8f3951/decomp_settings-0.0.10-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:672a63d755d39cc638d19ee9446b28f7ae11d050f5a2ecbec046f6bf1cb7479f", size = 439889, upload-time = "2026-01-16T12:32:04.059Z" }, + { url = "https://files.pythonhosted.org/packages/65/54/091f37d559e0306dce3f54ee52efe37e5cafc7d63d8f04747b19b5cc8dbc/decomp_settings-0.0.10-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5f32a550d5dbe22f9bd2229c2237ff4df9cb7f320f540849a7316b220c449582", size = 451105, upload-time = "2026-01-16T12:31:52.546Z" }, + { url = "https://files.pythonhosted.org/packages/7b/4c/472052d6bf855b99653cafd38d9f9afd121b483955122ab488a71d68c3fb/decomp_settings-0.0.10-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:68bcf496c215e1e0b7dc2578de3a771aeed0eac13f76c92f7e6c0b23525bf563", size = 439893, upload-time = "2026-01-16T12:32:01.208Z" }, + { url = "https://files.pythonhosted.org/packages/b2/50/766832cb9b75fc3d647bcff2865e5242cd1a154aa073d64631875a727116/decomp_settings-0.0.10-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ca1512fe069d66b71a69411adc4188fdb226215a8c549f9e1566ad68a11caa7", size = 484818, upload-time = "2026-01-16T12:32:12.738Z" }, + { url = "https://files.pythonhosted.org/packages/32/62/3413b70adf42d86066cf85818229817d77a49392faf77979a497bdd59529/decomp_settings-0.0.10-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:68410671e822226298a9eb4f1930330c8510c1f0a9cb451773616f56a071a512", size = 495271, upload-time = "2026-01-16T12:32:23.071Z" }, + { url = "https://files.pythonhosted.org/packages/7d/c8/f3961571b371e2e2643fc6555431a8f275a649859bfe45e7022eaca57c4f/decomp_settings-0.0.10-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:934573e237fb76a2b04167f96812f3f2fba0e92c7e0bd93738eab505bff45a76", size = 620210, upload-time = "2026-01-16T12:32:16.653Z" }, + { url = "https://files.pythonhosted.org/packages/8e/b9/8faf318a91b77e3e13e8af60e377ec87d52b0b319807510d6a2b18f56e59/decomp_settings-0.0.10-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c4723193eff34e5c2583718fed53d6fdbbf18fd54207f25b1c01d7beda1faf27", size = 521922, upload-time = "2026-01-16T12:31:48.637Z" }, + { url = "https://files.pythonhosted.org/packages/64/72/5fd2da4a592a6fc4bd401c21f6ad6c0d9345988d7b297bcf84ca4d0f2c36/decomp_settings-0.0.10-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4eff17aef4a01e730beede212c9b083dc3fc77d067bcff52bd94cf576169e68f", size = 490943, upload-time = "2026-01-16T12:32:09.484Z" }, + { url = "https://files.pythonhosted.org/packages/ab/97/fde192136ad5d2d4fabbc3e7e7c81a5273fe868230f8ffb80ead6e559c4c/decomp_settings-0.0.10-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fdb3252cdc3df4a93a30eb6477797f81a2e901d4a1fe513d4a17f8e2f57c59b6", size = 524175, upload-time = "2026-01-16T12:32:54.949Z" }, + { url = "https://files.pythonhosted.org/packages/b6/3a/05f23aeaffdb3aee66d318d6470570cf92f71180da54329419534a6a74c6/decomp_settings-0.0.10-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:808a5f8b968397f5224ef5ad7b3a53e6403229e7bab2b084c1cee747376b1e05", size = 666339, upload-time = "2026-01-16T12:32:19.21Z" }, + { url = "https://files.pythonhosted.org/packages/a4/4d/d034a2df5d96c5f441c6838027f1a2b9ed508c507c15ce35eaab02e87eec/decomp_settings-0.0.10-pp310-pypy310_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:5cef6677d449dcfb51fc6b8cc126997836781cb9c52dc101ccde258505f47c9c", size = 764782, upload-time = "2026-01-16T12:32:33.283Z" }, + { url = "https://files.pythonhosted.org/packages/4b/82/a7d1a013ffd730225ef5181c950ff171f34f036f544fda8e1d60291614ae/decomp_settings-0.0.10-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:da6a7c4fa2f34738955e120b99fe30df6313d949b2f6ca852bc8a195450301c1", size = 732966, upload-time = "2026-01-16T12:31:56.615Z" }, + { url = "https://files.pythonhosted.org/packages/eb/9f/a9e333810a720ac1fc4bf9de3be3dee823c203884401deecb334622712a7/decomp_settings-0.0.10-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:0be362ab0cdddf9433d7893b10dd44f8195e8d1ecfaafed11149d25fd290c91d", size = 697223, upload-time = "2026-01-16T12:32:52.413Z" }, + { url = "https://files.pythonhosted.org/packages/a2/6a/7a8ff95d7b525bceb103bc81251d36aaa5814c2ec477e2189b9567af7d3c/decomp_settings-0.0.10-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2a3ffb198abd4a785cdb418e2fa31e14f29dbd1c30adc32e92996ff5d7e33735", size = 447464, upload-time = "2026-01-16T12:32:28.278Z" }, + { url = "https://files.pythonhosted.org/packages/00/c8/50c2e3244cd21d5ffec0de3a60fd56b9657631f36235e594ef443a9e1611/decomp_settings-0.0.10-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:5a4986e3b0566ea6607062575d9b6d25348bf230776bf4ccbe0c889743bd8460", size = 436083, upload-time = "2026-01-16T12:32:25.325Z" }, + { url = "https://files.pythonhosted.org/packages/b4/51/62a2de41c38530988a50d850231d836d839ee6e91663db4df00c76d41605/decomp_settings-0.0.10-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:122c5f1f723cf45bafe012adcf03353f8ec3ba43f72d68e581d86530ecf9a664", size = 481021, upload-time = "2026-01-16T12:32:15.579Z" }, + { url = "https://files.pythonhosted.org/packages/9d/7c/46ad34d6b04d7c0d8e8bea71e50e6a88fccba415f77973a0cd840ffce9ed/decomp_settings-0.0.10-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2c87a5ee55a7ecc7b7f2a7e7432c8f651776ea5eee452dc7d4f16397a482161f", size = 492183, upload-time = "2026-01-16T12:32:10.567Z" }, + { url = "https://files.pythonhosted.org/packages/f5/fe/056d30f7552bb46755f906426677735ae954c473184614bc225769279ff3/decomp_settings-0.0.10-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:985d9eef124c915fd034880bd548ea4cf4f6a0adbeed4932b01704839f02fb9e", size = 617335, upload-time = "2026-01-16T12:32:17.69Z" }, + { url = "https://files.pythonhosted.org/packages/c0/2f/65d6abd6aef57f01e7e7542db86351b40013cb6ef1271deec7064a2441e0/decomp_settings-0.0.10-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9d7b87b1802d06c0dfe14e6718137300ac4f1524237bdfd76d97bde0dd3445d", size = 518712, upload-time = "2026-01-16T12:32:02.157Z" }, + { url = "https://files.pythonhosted.org/packages/70/32/c7a6d7bc5a4206123502af299413356ff62183f08b05d88ce07236bb7973/decomp_settings-0.0.10-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd629bfd9f8a0be9b3d759368969dac88ef0ba4056f07db59cbcda3d0ebfe0f5", size = 488755, upload-time = "2026-01-16T12:32:22.176Z" }, + { url = "https://files.pythonhosted.org/packages/b6/90/d3e3c5645f5ca25b51f0e9c05500cfd9b2f277f422e8ed14e1615341b7bb/decomp_settings-0.0.10-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:247660b8a12806ea0fdd3c191f0ab25667593211a50ef71916e07f5dce8c9373", size = 521208, upload-time = "2026-01-16T12:32:48.586Z" }, + { url = "https://files.pythonhosted.org/packages/8a/ee/ab82a69cedff89783d3ef3ac433cd56dbbd4877d45f11df317d166a147e1/decomp_settings-0.0.10-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:882fc350bab1809bd7a4858691445bf56acec65c194b5c49a185f007a5602cc8", size = 663716, upload-time = "2026-01-16T12:31:45.075Z" }, + { url = "https://files.pythonhosted.org/packages/3d/ff/1eaf56bb1840c0824656fbf95b07fbaa4d8c9297b174f8af6bf53a8589b2/decomp_settings-0.0.10-pp311-pypy311_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:5a1beac2daed8be2d8439241d5312f861caed87cb7a0d27d98ad5b5fa513e193", size = 761734, upload-time = "2026-01-16T12:32:46.07Z" }, + { url = "https://files.pythonhosted.org/packages/bd/45/9837a4d043243e98577810ac76052a48df9ff8176d395b442489a90a63fe/decomp_settings-0.0.10-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:33c7427366ff154939aa8dd1aa581847c4ff5168193b6abf72702d2a8bef4462", size = 728931, upload-time = "2026-01-16T12:32:34.69Z" }, + { url = "https://files.pythonhosted.org/packages/9f/fd/113f7c186e5a3dc0c61795e0528d51789e698037cbaac7a6fd01314864df/decomp_settings-0.0.10-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:2bb366136567a8a30315eb72f002891ed6d6f0300d631b8e8f744e34fe4cb36b", size = 693830, upload-time = "2026-01-16T12:32:07.617Z" }, + { url = "https://files.pythonhosted.org/packages/33/32/1bf478d494c3b638f89f2782ea74954e7fe858814eacf34af1dd3bf1d8df/decomp_settings-0.0.10-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:91ee81ac3e8ea79252105e67dd7fc8cc278231096b5f5bb3cd84bec695db7e58", size = 450647, upload-time = "2026-01-16T12:32:35.894Z" }, + { url = "https://files.pythonhosted.org/packages/38/a0/6982d388dabfc109259a9d38196e157479420cdd1e4479d963efb9ceb5b8/decomp_settings-0.0.10-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ac703080a3a5f3d1fb9bc791cf05be675dba7281a6b74952c54a4113a69dd434", size = 440559, upload-time = "2026-01-16T12:31:49.89Z" }, + { url = "https://files.pythonhosted.org/packages/eb/c5/f20228da309795d9fa5a24bfc00b12a4bf640f40e884ff3244fc4d49d0f7/decomp_settings-0.0.10-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d19f439381d98a29c3a709863a905f52c999cf14a26969ef49166a3d9c907cc6", size = 486208, upload-time = "2026-01-16T12:32:31.192Z" }, + { url = "https://files.pythonhosted.org/packages/a3/69/4f33d38eb0bdedda1d3bf9c8687aaa6dfb97a90ce1dfe14fe927166b354c/decomp_settings-0.0.10-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a3b61159febb85b09ac03bd53d9a98e3693f39e55b8f444ef3a6ebb04f28e4b9", size = 495819, upload-time = "2026-01-16T12:32:32.057Z" }, + { url = "https://files.pythonhosted.org/packages/13/a4/50207ef2252777c00770aab49b1bef57902b9b9ca6a0834b91f21576f045/decomp_settings-0.0.10-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b64f1ddf77cb24c08989c4808fd04deb63cfece8cbf7d595b52aaf391cd59c3a", size = 618396, upload-time = "2026-01-16T12:32:06.276Z" }, + { url = "https://files.pythonhosted.org/packages/0e/aa/9050dc69689beb97af0790dcc4a1e2693660e82efbcbf3fdd2119f941e19/decomp_settings-0.0.10-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c846b10b5f5816a700cf7ea70cb73d269c6620a13511fe668810eddb3f27ba58", size = 522316, upload-time = "2026-01-16T12:32:26.314Z" }, + { url = "https://files.pythonhosted.org/packages/c6/b7/81d7e8f42cd8b6b95fe4bcb696e4da5bdf9badb7b433ecb379863080f998/decomp_settings-0.0.10-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6da9e8dc1c5133193f509703471e9ccde7a5c66eddb0a2415fec2f331fe53bca", size = 491785, upload-time = "2026-01-16T12:32:08.594Z" }, + { url = "https://files.pythonhosted.org/packages/83/a8/94161489d668192605b6ae447f26f6983afefe58d16e1ced2eaec34fbf2a/decomp_settings-0.0.10-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0be5c5f49b3d03ee93b08200577e83f745585dc8532f4d20503f21d5e80a50a2", size = 524533, upload-time = "2026-01-16T12:32:14.724Z" }, + { url = "https://files.pythonhosted.org/packages/12/25/e228a7fefff2a9295abf639268e59fde4e2babf4a5d5dfc76626dc7a6f29/decomp_settings-0.0.10-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:78d8271274a23290127088bf507038302bd8e0f5c84180a525d1ce0d572f691c", size = 668106, upload-time = "2026-01-16T12:31:58.945Z" }, + { url = "https://files.pythonhosted.org/packages/5c/d2/518e0dac6d65d0197d305b365afe548de8b22caa1cba2e532aaad3714150/decomp_settings-0.0.10-pp39-pypy39_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:63f1bd83851229fcdc93f1ce3a35fc6efa58e205cef20c41d30010b1a933593f", size = 764581, upload-time = "2026-01-16T12:31:55.629Z" }, + { url = "https://files.pythonhosted.org/packages/9d/18/24a48c53caa928c2232be1c8e022072152ca41f617700de6b845ef1bf630/decomp_settings-0.0.10-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:b53df7d481399b844c92ef80c0a39a676e8ac9f7778b6ec18a602055f8903008", size = 734670, upload-time = "2026-01-16T12:32:47.541Z" }, + { url = "https://files.pythonhosted.org/packages/14/d3/cfac3281c2af3826ef528e9a8645457672b1191f15e14141d22718665d06/decomp_settings-0.0.10-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:2ebd8896a6cf451cea88f34d3b1a4c3fae357cc8dc9c35e8d94c01b17c14752b", size = 698866, upload-time = "2026-01-16T12:32:21.156Z" }, +] + +[[package]] +name = "idna" +version = "3.10" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.8'", +] +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload-time = "2024-09-15T18:07:39.745Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" }, +] + +[[package]] +name = "idna" +version = "3.11" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.9'", + "python_full_version == '3.8.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, +] + +[[package]] +name = "mapfile-parser" +version = "2.12.1" +source = { editable = "." } +dependencies = [ + { name = "decomp-settings" }, + { name = "requests", version = "2.31.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "requests", version = "2.32.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "requests", version = "2.32.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, +] + +[package.metadata] +requires-dist = [ + { name = "decomp-settings", specifier = "==0.0.10" }, + { name = "requests" }, +] + +[[package]] +name = "requests" +version = "2.31.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.8'", +] +dependencies = [ + { name = "certifi", marker = "python_full_version < '3.8'" }, + { name = "charset-normalizer", marker = "python_full_version < '3.8'" }, + { name = "idna", version = "3.10", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "urllib3", version = "2.0.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9d/be/10918a2eac4ae9f02f6cfe6414b7a155ccd8f7f9d4380d62fd5b955065c3/requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1", size = 110794, upload-time = "2023-05-22T15:12:44.175Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/70/8e/0e2d847013cb52cd35b38c009bb167a1a26b2ce6cd6965bf26b47bc0bf44/requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", size = 62574, upload-time = "2023-05-22T15:12:42.313Z" }, +] + +[[package]] +name = "requests" +version = "2.32.4" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.8.*'", +] +dependencies = [ + { name = "certifi", marker = "python_full_version == '3.8.*'" }, + { name = "charset-normalizer", marker = "python_full_version == '3.8.*'" }, + { name = "idna", version = "3.11", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "urllib3", version = "2.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e1/0a/929373653770d8a0d7ea76c37de6e41f11eb07559b103b1c02cafb3f7cf8/requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422", size = 135258, upload-time = "2025-06-09T16:43:07.34Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7c/e4/56027c4a6b4ae70ca9de302488c5ca95ad4a39e190093d6c1a8ace08341b/requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", size = 64847, upload-time = "2025-06-09T16:43:05.728Z" }, +] + +[[package]] +name = "requests" +version = "2.32.5" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.9'", +] +dependencies = [ + { name = "certifi", marker = "python_full_version >= '3.9'" }, + { name = "charset-normalizer", marker = "python_full_version >= '3.9'" }, + { name = "idna", version = "3.11", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "urllib3", version = "2.6.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, +] + +[[package]] +name = "urllib3" +version = "2.0.7" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.8'", +] +sdist = { url = "https://files.pythonhosted.org/packages/af/47/b215df9f71b4fdba1025fc05a77db2ad243fa0926755a52c5e71659f4e3c/urllib3-2.0.7.tar.gz", hash = "sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84", size = 282546, upload-time = "2023-10-17T17:46:50.542Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/b2/b157855192a68541a91ba7b2bbcb91f1b4faa51f8bae38d8005c034be524/urllib3-2.0.7-py3-none-any.whl", hash = "sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e", size = 124213, upload-time = "2023-10-17T17:46:48.538Z" }, +] + +[[package]] +name = "urllib3" +version = "2.2.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.8.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/ed/63/22ba4ebfe7430b76388e7cd448d5478814d3032121827c12a2cc287e2260/urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9", size = 300677, upload-time = "2024-09-12T10:52:18.401Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", size = 126338, upload-time = "2024-09-12T10:52:16.589Z" }, +] + +[[package]] +name = "urllib3" +version = "2.6.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.9'", +] +sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" }, +] From 836d1480aa133282e65cb7bf9e003a16f4675c8f Mon Sep 17 00:00:00 2001 From: Anghelo Carvajal Date: Sat, 17 Jan 2026 09:22:59 -0300 Subject: [PATCH 2/6] Change Python tests to run with different Python versions --- .github/workflows/linting.yml | 79 ---------- .github/workflows/python_linting.yml | 101 +++++++++++++ .github/workflows/tests.yml | 136 +++++++++++++----- Cargo.toml | 2 +- mypy.ini | 2 +- pyproject.toml | 2 - requirements.txt | 2 +- .../frontends/objdiff_report.py | 6 +- src/mapfile_parser/mapfile.py | 6 +- 9 files changed, 214 insertions(+), 122 deletions(-) delete mode 100644 .github/workflows/linting.yml create mode 100644 .github/workflows/python_linting.yml diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml deleted file mode 100644 index a050877..0000000 --- a/.github/workflows/linting.yml +++ /dev/null @@ -1,79 +0,0 @@ -name: Linting - -# Build on every branch push, tag push, and pull request change: -on: [push, pull_request] - -jobs: - mypy: - name: mypy - runs-on: ubuntu-latest - steps: - - name: Checkout reposistory - uses: actions/checkout@main - - - name: Set up Python 3.9 - uses: actions/setup-python@main - with: - python-version: 3.9 - - - name: Install Dependencies - run: | - python3 -m pip install -r requirements.txt - python3 -m pip install -U maturin - python3 -m pip install -U mypy - - - name: mypy - run: mypy --show-column-numbers --hide-error-context . - - ruff: - runs-on: ubuntu-latest - name: ruff - steps: - - name: Checkout repository - uses: actions/checkout@main - - - name: Set up Python 3.9 - uses: actions/setup-python@main - with: - python-version: '3.9' - - - name: Setup venv - run: | - python3 -m venv .venv - - - name: Install Dependencies - run: | - . .venv/bin/activate - python3 -m pip install -U -r requirements.txt - python3 -m pip install -U ruff - - - name: mypy - run: | - . .venv/bin/activate - ruff check - - ruff_format: - name: ruff format - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@main - - - name: Set up Python 3.9 - uses: actions/setup-python@main - with: - python-version: 3.9 - - - name: Setup venv - run: | - python3 -m venv .venv - - - name: Install dependencies - run: | - . .venv/bin/activate - python3 -m pip install -U ruff - - - name: mypy - run: | - . .venv/bin/activate - ruff format src/ --check diff --git a/.github/workflows/python_linting.yml b/.github/workflows/python_linting.yml new file mode 100644 index 0000000..5e0682d --- /dev/null +++ b/.github/workflows/python_linting.yml @@ -0,0 +1,101 @@ +name: Python linting + +# Build on every branch push, tag push, and pull request change: +on: [push, pull_request] + +jobs: + mypy: + name: mypy + runs-on: ubuntu-22.04 + strategy: + fail-fast: false + matrix: + py_version: + - '3.8' + + steps: + - name: Checkout reposistory + uses: actions/checkout@main + + - name: Set up Python ${{ matrix.py_version }} + uses: actions/setup-python@main + with: + python-version: ${{ matrix.py_version }} + + - name: Install uv + uses: astral-sh/setup-uv@v7 + + # Setup venv and install dependencies without building the project from source. + - name: Install Dependencies + run: | + uv venv --no-project --python ${{ matrix.py_version }} + uv sync --no-install-project + uv pip install -U mypy + + - name: mypy + run: | + uv run --no-sync mypy --show-column-numbers --hide-error-context . + + ruff: + name: ruff + runs-on: ubuntu-22.04 + strategy: + fail-fast: false + matrix: + py_version: + - '3.8' + + steps: + - name: Checkout repository + uses: actions/checkout@main + + - name: Set up Python ${{ matrix.py_version }} + uses: actions/setup-python@main + with: + python-version: ${{ matrix.py_version }} + + - name: Install uv + uses: astral-sh/setup-uv@v7 + + # Setup venv and install dependencies without building the project from source. + - name: Install Dependencies + run: | + uv venv --no-project --python ${{ matrix.py_version }} + uv sync --no-install-project + uv pip install -U ruff + + - name: ruff + run: | + ruff check src/ + + ruff_format: + name: ruff format + runs-on: ubuntu-22.04 + strategy: + fail-fast: false + matrix: + py_version: + - '3.8' + + steps: + - name: Checkout repository + uses: actions/checkout@main + + - name: Set up Python ${{ matrix.py_version }} + uses: actions/setup-python@main + with: + python-version: ${{ matrix.py_version }} + + - name: Install uv + uses: astral-sh/setup-uv@v7 + + # Setup venv and install dependencies without building the project from source. + - name: Install Dependencies + run: | + uv venv --no-project --python ${{ matrix.py_version }} + uv sync --no-install-project + uv pip install -U ruff + + - name: ruff + run: | + ruff format src/ --check diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index a8c991d..6de4340 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -5,8 +5,22 @@ on: [push, pull_request] jobs: check_if_output_files_changed: - name: Check if output files changed - runs-on: ubuntu-latest + name: Check if output files changed (Python ${{ matrix.py_version }}) + runs-on: ubuntu-22.04 + strategy: + fail-fast: false + matrix: + py_version: + - '3.7' + - '3.8' + - '3.9' + - '3.10' + - '3.11' + - '3.12' + - '3.13' + - '3.14' + - '3.14t' + - '3.x' # Explicit latest steps: - name: Checkout reposistory @@ -15,16 +29,31 @@ jobs: - name: Setup Rust toolchain uses: dtolnay/rust-toolchain@stable - - name: Setup requirements + - name: Set up Python ${{ matrix.py_version }} + uses: actions/setup-python@main + with: + python-version: ${{ matrix.py_version }} + + - name: Install uv + uses: astral-sh/setup-uv@v7 + + - name: Setup venv ${{ matrix.py_version }} + if: ${{ matrix.py_version != '3.x' }} + run: | + uv venv --python ${{ matrix.py_version }} + # `--python 3 --managed-python` makes uv to install the latest python version available + - name: Setup venv 3.x + if: ${{ matrix.py_version == '3.x' }} run: | - python3 -m pip install -U -r requirements.txt - python3 -m pip install -U maturin + uv venv --python 3 --managed-python - - name: Install local mapfile_parser - run: python3 -m pip install . + - name: Sync venv + run: | + uv sync - name: Update tests outputs - run: python3 tests/update_outputs.py + run: | + uv run tests/update_outputs.py - name: Check if there are any changes in the test cases id: tests_changes @@ -38,8 +67,22 @@ jobs: exit 1 check_progress_nonmatchings: - name: Check progress by NON_MATCHING symbols - runs-on: ubuntu-latest + name: Check progress by NON_MATCHING symbols (Python ${{ matrix.py_version }}) + runs-on: ubuntu-22.04 + strategy: + fail-fast: false + matrix: + py_version: + - '3.7' + - '3.8' + - '3.9' + - '3.10' + - '3.11' + - '3.12' + - '3.13' + - '3.14' + - '3.14t' + - '3.x' # Explicit latest steps: - name: Checkout reposistory @@ -48,20 +91,40 @@ jobs: - name: Setup Rust toolchain uses: dtolnay/rust-toolchain@stable - - name: Setup requirements - run: | - python3 -m pip install -U -r requirements.txt - python3 -m pip install -U maturin + - name: Set up Python ${{ matrix.py_version }} + uses: actions/setup-python@main + with: + python-version: ${{ matrix.py_version }} - - name: Install local mapfile_parser - run: python3 -m pip install . + - name: Install uv + uses: astral-sh/setup-uv@v7 + + - name: Setup project + run: | + uv venv --python ${{ matrix.py_version }} + uv sync - name: Update tests outputs - run: python3 tests/check_progress_nonmatchings.py + run: | + uv run tests/check_progress_nonmatchings.py check_frontends: - name: Check frontends aren't broken - runs-on: ubuntu-latest + name: Check frontends aren't broken (Python ${{ matrix.py_version }}) + runs-on: ubuntu-22.04 + strategy: + fail-fast: false + matrix: + py_version: + - '3.7' + - '3.8' + - '3.9' + - '3.10' + - '3.11' + - '3.12' + - '3.13' + - '3.14' + - '3.14t' + - '3.x' # Explicit latest steps: - name: Checkout reposistory @@ -70,37 +133,42 @@ jobs: - name: Setup Rust toolchain uses: dtolnay/rust-toolchain@stable - - name: Setup requirements - run: | - python3 -m pip install -U -r requirements.txt - python3 -m pip install -U maturin + - name: Set up Python ${{ matrix.py_version }} + uses: actions/setup-python@main + with: + python-version: ${{ matrix.py_version }} + + - name: Install uv + uses: astral-sh/setup-uv@v7 - - name: Install local mapfile_parser - run: python3 -m pip install . + - name: Setup project + run: | + uv venv --python ${{ matrix.py_version }} + uv sync - name: bss_check - run: python3 -m mapfile_parser bss_check tests/maps/gnuld/n64/drmario64.us.map tests/maps/gnuld/n64/drmario64.us.map + run: uv run mapfile_parser bss_check tests/maps/gnuld/n64/drmario64.us.map tests/maps/gnuld/n64/drmario64.us.map - name: first_diff - run: python3 -m mapfile_parser first_diff tests/maps/gnuld/n64/drmario64.us.map tests/maps/gnuld/n64/drmario64.us.map tests/maps/gnuld/n64/drmario64.us.map tests/maps/gnuld/n64/drmario64.us.map + run: uv run mapfile_parser first_diff tests/maps/gnuld/n64/drmario64.us.map tests/maps/gnuld/n64/drmario64.us.map tests/maps/gnuld/n64/drmario64.us.map tests/maps/gnuld/n64/drmario64.us.map - name: jsonify - run: python3 -m mapfile_parser jsonify tests/maps/gnuld/n64/drmario64.us.map + run: uv run mapfile_parser jsonify tests/maps/gnuld/n64/drmario64.us.map - name: objdiff_report - run: python3 -m mapfile_parser objdiff_report tests/maps/gnuld/n64/drmario64.us.map objdiff_report.json + run: uv run mapfile_parser objdiff_report tests/maps/gnuld/n64/drmario64.us.map objdiff_report.json - name: pj64_syms - run: python3 -m mapfile_parser pj64_syms tests/maps/gnuld/n64/drmario64.us.map + run: uv run mapfile_parser pj64_syms tests/maps/gnuld/n64/drmario64.us.map - name: progress - run: python3 -m mapfile_parser progress tests/maps/gnuld/n64/drmario64.us.map asm asm/nonmatchings + run: uv run mapfile_parser progress tests/maps/gnuld/n64/drmario64.us.map asm asm/nonmatchings - name: sym_info - run: python3 -m mapfile_parser sym_info tests/maps/gnuld/n64/drmario64.us.map entrypoint + run: uv run mapfile_parser sym_info tests/maps/gnuld/n64/drmario64.us.map entrypoint - name: symbol_sizes_csv - run: python3 -m mapfile_parser symbol_sizes_csv tests/maps/gnuld/n64/drmario64.us.map + run: uv run mapfile_parser symbol_sizes_csv tests/maps/gnuld/n64/drmario64.us.map - name: upload_frogress - run: python3 -m mapfile_parser upload_frogress tests/maps/gnuld/n64/drmario64.us.map asm asm/nonmatchings drmario64 us code --verbose --dry-run + run: uv run mapfile_parser upload_frogress tests/maps/gnuld/n64/drmario64.us.map asm asm/nonmatchings drmario64 us code --verbose --dry-run diff --git a/Cargo.toml b/Cargo.toml index 7bf25eb..876d2f5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -47,4 +47,4 @@ serde = { version = "1", features = ["derive"], optional = true } objdiff-core = { version = "2.3.3", default-features = false, features = ["bindings"], optional = true } # objdiff-core = { git = "https://github.com/encounter/objdiff.git", rev="a367af612b8b30b5bdf40e5c1d0e45df46a5e3e9", default-features = false, features = ["bindings", "std"], optional = true } serde_json = { version = "1", optional = true } -pyo3 = { version = "0.26", optional = true, features = ["extension-module"]} +pyo3 = { version = "0.26", optional = true, features = ["extension-module", "abi3"]} diff --git a/mypy.ini b/mypy.ini index 2145f40..3a3ba44 100644 --- a/mypy.ini +++ b/mypy.ini @@ -1,3 +1,3 @@ [mypy] -python_version = 3.9 +python_version = 3.8 check_untyped_defs = True diff --git a/pyproject.toml b/pyproject.toml index 5cc6ce7..757ff0a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,8 +28,6 @@ build-backend = "maturin" [project.scripts] mapfile_parser = "mapfile_parser.__main__:mapfileParserMain" -[tool.cibuildwheel] -skip = ["cp36-*"] [tool.maturin] features = ["pyo3/extension-module", "python_bindings"] diff --git a/requirements.txt b/requirements.txt index e3b401e..eeb8f0d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,2 @@ requests -decomp-settings==0.0.9 +decomp-settings==0.0.10 diff --git a/src/mapfile_parser/frontends/objdiff_report.py b/src/mapfile_parser/frontends/objdiff_report.py index 875385d..e190662 100644 --- a/src/mapfile_parser/frontends/objdiff_report.py +++ b/src/mapfile_parser/frontends/objdiff_report.py @@ -105,9 +105,11 @@ def removePrefix(path: Path) -> Path: # Trim the first prefix found in the list for x in prefixesToTrim: if current.startswith(x): - current = current.removeprefix(x) + # remove prefix + current = current[len(x):] break - current = current.removeprefix("/") + # current.removeprefix("/") + current = current[1:] if current[0] == "/" else current return Path(current) categoriesByPath: list[Category] = [] diff --git a/src/mapfile_parser/mapfile.py b/src/mapfile_parser/mapfile.py index f3918e0..2f81521 100644 --- a/src/mapfile_parser/mapfile.py +++ b/src/mapfile_parser/mapfile.py @@ -1168,7 +1168,8 @@ def resolvePartiallyLinkedFiles( # Only read the map if this is a new plf. if sect.filepath in knownMaps: continue - if (other_map_path := resolver(sect.filepath)) is not None: + other_map_path = resolver(sect.filepath) + if other_map_path is not None: knownMaps[sect.filepath] = MapFile.newFromMapFile(other_map_path) return self._resolve_plf_impl(knownMaps) @@ -1181,7 +1182,8 @@ def _resolve_plf_impl(self, knownMaps: dict[Path, MapFile]) -> MapFile: newSeg = seg.cloneNoSectionlist() for sect in seg._sectionsList: - if (otherMap := knownMaps.get(sect.filepath)) is not None: + otherMap = knownMaps.get(sect.filepath) + if otherMap is not None: # Each segment of a plf is just a normal elf section partialSegment = None for x in otherMap._segmentsList: From fa808af6161b96c0e221e6b16f46aa68cdd32bc1 Mon Sep 17 00:00:00 2001 From: Anghelo Carvajal Date: Sat, 17 Jan 2026 09:32:31 -0300 Subject: [PATCH 3/6] bump to 3.8 --- .github/workflows/maturin_upload_pypi.yml | 29 ++++---- .github/workflows/python_linting.yml | 18 +---- .github/workflows/tests.yml | 3 - pyproject.toml | 2 +- .../frontends/objdiff_report.py | 2 +- uv.lock | 68 +++---------------- 6 files changed, 27 insertions(+), 95 deletions(-) diff --git a/.github/workflows/maturin_upload_pypi.yml b/.github/workflows/maturin_upload_pypi.yml index 1e16cff..7eea367 100644 --- a/.github/workflows/maturin_upload_pypi.yml +++ b/.github/workflows/maturin_upload_pypi.yml @@ -13,9 +13,6 @@ on: permissions: contents: read -# At the time of writing, PyO3 has a hard minimal Python version of 3.7, so -# there's no use trying to go any lower than that. - jobs: linux: runs-on: ${{ matrix.platform.runner }} @@ -25,27 +22,27 @@ jobs: platform: - runner: ubuntu-22.04 target: x86_64 - python_version_min: '3.7' + python_version_min: '3.8' python_version_max: '3.14' - runner: ubuntu-22.04 target: x86 - python_version_min: '3.7' + python_version_min: '3.8' python_version_max: '3.14' - runner: ubuntu-22.04 target: aarch64 - python_version_min: '3.7' + python_version_min: '3.8' python_version_max: '3.14' - runner: ubuntu-22.04 target: armv7 - python_version_min: '3.7' + python_version_min: '3.8' python_version_max: '3.14' - runner: ubuntu-22.04 target: s390x - python_version_min: '3.7' + python_version_min: '3.8' python_version_max: '3.14' - runner: ubuntu-22.04 target: ppc64le - python_version_min: '3.7' + python_version_min: '3.8' python_version_max: '3.14' steps: - uses: actions/checkout@main @@ -112,16 +109,16 @@ jobs: platform: - runner: ubuntu-22.04 target: x86_64 - python_version_min: '3.7' + python_version_min: '3.8' - runner: ubuntu-22.04 target: x86 - python_version_min: '3.7' + python_version_min: '3.8' - runner: ubuntu-22.04 target: aarch64 - python_version_min: '3.7' + python_version_min: '3.8' - runner: ubuntu-22.04 target: armv7 - python_version_min: '3.7' + python_version_min: '3.8' steps: - uses: actions/checkout@main - uses: actions/setup-python@v6 @@ -157,12 +154,12 @@ jobs: - runner: windows-latest target: x64 python_arch: x64 - python_version_min: '3.7' + python_version_min: '3.8' python_version_max: '3.14' - runner: windows-latest target: x86 python_arch: x86 - python_version_min: '3.7' + python_version_min: '3.8' python_version_max: '3.14' steps: - uses: actions/checkout@main @@ -254,7 +251,7 @@ jobs: platform: - runner: macos-15-intel target: x86_64 - python_version_min: '3.7' + python_version_min: '3.8' python_version_max: '3.14' - runner: macos-latest target: aarch64 diff --git a/.github/workflows/python_linting.yml b/.github/workflows/python_linting.yml index 5e0682d..476fffd 100644 --- a/.github/workflows/python_linting.yml +++ b/.github/workflows/python_linting.yml @@ -57,16 +57,9 @@ jobs: - name: Install uv uses: astral-sh/setup-uv@v7 - # Setup venv and install dependencies without building the project from source. - - name: Install Dependencies - run: | - uv venv --no-project --python ${{ matrix.py_version }} - uv sync --no-install-project - uv pip install -U ruff - - name: ruff run: | - ruff check src/ + uvx ruff check src/ ruff_format: name: ruff format @@ -89,13 +82,6 @@ jobs: - name: Install uv uses: astral-sh/setup-uv@v7 - # Setup venv and install dependencies without building the project from source. - - name: Install Dependencies - run: | - uv venv --no-project --python ${{ matrix.py_version }} - uv sync --no-install-project - uv pip install -U ruff - - name: ruff run: | - ruff format src/ --check + uvx ruff format src/ --check diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 6de4340..fd187d9 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -11,7 +11,6 @@ jobs: fail-fast: false matrix: py_version: - - '3.7' - '3.8' - '3.9' - '3.10' @@ -73,7 +72,6 @@ jobs: fail-fast: false matrix: py_version: - - '3.7' - '3.8' - '3.9' - '3.10' @@ -115,7 +113,6 @@ jobs: fail-fast: false matrix: py_version: - - '3.7' - '3.8' - '3.9' - '3.10' diff --git a/pyproject.toml b/pyproject.toml index 757ff0a..6737778 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,7 +6,7 @@ name = "mapfile_parser" version = "2.12.1" description = "Map file parser library focusing decompilation projects" readme = "README.md" -requires-python = ">=3.7" +requires-python = ">=3.8" dependencies = [ "requests", "decomp-settings==0.0.10", diff --git a/src/mapfile_parser/frontends/objdiff_report.py b/src/mapfile_parser/frontends/objdiff_report.py index e190662..be0369b 100644 --- a/src/mapfile_parser/frontends/objdiff_report.py +++ b/src/mapfile_parser/frontends/objdiff_report.py @@ -106,7 +106,7 @@ def removePrefix(path: Path) -> Path: for x in prefixesToTrim: if current.startswith(x): # remove prefix - current = current[len(x):] + current = current[len(x) :] break # current.removeprefix("/") current = current[1:] if current[0] == "/" else current diff --git a/uv.lock b/uv.lock index 7b0e946..3603116 100644 --- a/uv.lock +++ b/uv.lock @@ -1,10 +1,9 @@ version = 1 revision = 3 -requires-python = ">=3.7" +requires-python = ">=3.8" resolution-markers = [ "python_full_version >= '3.9'", - "python_full_version == '3.8.*'", - "python_full_version < '3.8'", + "python_full_version < '3.9'", ] [[package]] @@ -209,26 +208,10 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/14/d3/cfac3281c2af3826ef528e9a8645457672b1191f15e14141d22718665d06/decomp_settings-0.0.10-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:2ebd8896a6cf451cea88f34d3b1a4c3fae357cc8dc9c35e8d94c01b17c14752b", size = 698866, upload-time = "2026-01-16T12:32:21.156Z" }, ] -[[package]] -name = "idna" -version = "3.10" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.8'", -] -sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload-time = "2024-09-15T18:07:39.745Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" }, -] - [[package]] name = "idna" version = "3.11" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.9'", - "python_full_version == '3.8.*'", -] sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, @@ -240,8 +223,7 @@ version = "2.12.1" source = { editable = "." } dependencies = [ { name = "decomp-settings" }, - { name = "requests", version = "2.31.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, - { name = "requests", version = "2.32.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "requests", version = "2.32.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, { name = "requests", version = "2.32.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, ] @@ -251,36 +233,18 @@ requires-dist = [ { name = "requests" }, ] -[[package]] -name = "requests" -version = "2.31.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.8'", -] -dependencies = [ - { name = "certifi", marker = "python_full_version < '3.8'" }, - { name = "charset-normalizer", marker = "python_full_version < '3.8'" }, - { name = "idna", version = "3.10", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, - { name = "urllib3", version = "2.0.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/9d/be/10918a2eac4ae9f02f6cfe6414b7a155ccd8f7f9d4380d62fd5b955065c3/requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1", size = 110794, upload-time = "2023-05-22T15:12:44.175Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/70/8e/0e2d847013cb52cd35b38c009bb167a1a26b2ce6cd6965bf26b47bc0bf44/requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", size = 62574, upload-time = "2023-05-22T15:12:42.313Z" }, -] - [[package]] name = "requests" version = "2.32.4" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version == '3.8.*'", + "python_full_version < '3.9'", ] dependencies = [ - { name = "certifi", marker = "python_full_version == '3.8.*'" }, - { name = "charset-normalizer", marker = "python_full_version == '3.8.*'" }, - { name = "idna", version = "3.11", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, - { name = "urllib3", version = "2.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "certifi", marker = "python_full_version < '3.9'" }, + { name = "charset-normalizer", marker = "python_full_version < '3.9'" }, + { name = "idna", marker = "python_full_version < '3.9'" }, + { name = "urllib3", version = "2.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/e1/0a/929373653770d8a0d7ea76c37de6e41f11eb07559b103b1c02cafb3f7cf8/requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422", size = 135258, upload-time = "2025-06-09T16:43:07.34Z" } wheels = [ @@ -297,7 +261,7 @@ resolution-markers = [ dependencies = [ { name = "certifi", marker = "python_full_version >= '3.9'" }, { name = "charset-normalizer", marker = "python_full_version >= '3.9'" }, - { name = "idna", version = "3.11", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "idna", marker = "python_full_version >= '3.9'" }, { name = "urllib3", version = "2.6.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } @@ -305,24 +269,12 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, ] -[[package]] -name = "urllib3" -version = "2.0.7" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.8'", -] -sdist = { url = "https://files.pythonhosted.org/packages/af/47/b215df9f71b4fdba1025fc05a77db2ad243fa0926755a52c5e71659f4e3c/urllib3-2.0.7.tar.gz", hash = "sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84", size = 282546, upload-time = "2023-10-17T17:46:50.542Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/b2/b157855192a68541a91ba7b2bbcb91f1b4faa51f8bae38d8005c034be524/urllib3-2.0.7-py3-none-any.whl", hash = "sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e", size = 124213, upload-time = "2023-10-17T17:46:48.538Z" }, -] - [[package]] name = "urllib3" version = "2.2.3" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version == '3.8.*'", + "python_full_version < '3.9'", ] sdist = { url = "https://files.pythonhosted.org/packages/ed/63/22ba4ebfe7430b76388e7cd448d5478814d3032121827c12a2cc287e2260/urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9", size = 300677, upload-time = "2024-09-12T10:52:18.401Z" } wheels = [ From d190c1a179572786f137421a3e91732c74a2bea4 Mon Sep 17 00:00:00 2001 From: Anghelo Carvajal Date: Sat, 17 Jan 2026 09:44:54 -0300 Subject: [PATCH 4/6] fix --- .github/scripts/ci_check_wheel.ps1 | 2 +- .github/scripts/ci_check_wheel.sh | 2 +- .github/workflows/tests.yml | 22 ++++++++++++++++++++-- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/.github/scripts/ci_check_wheel.ps1 b/.github/scripts/ci_check_wheel.ps1 index 4c28f3e..f28fa6f 100644 --- a/.github/scripts/ci_check_wheel.ps1 +++ b/.github/scripts/ci_check_wheel.ps1 @@ -37,4 +37,4 @@ if ([string]::IsNullOrEmpty($WHEEL)) { } uv pip install --no-cache --no-config $WHEEL -uv run --no-sync python -c "import mapfile_parser; print(help(mapfile_parser.scan_for_config))" +uv run --no-sync python -c "import mapfile_parser; print(mapfile_parser.__version__)" diff --git a/.github/scripts/ci_check_wheel.sh b/.github/scripts/ci_check_wheel.sh index 62d58f1..77f174d 100755 --- a/.github/scripts/ci_check_wheel.sh +++ b/.github/scripts/ci_check_wheel.sh @@ -35,4 +35,4 @@ if [ -z "$WHEEL" ]; then fi uv pip install --no-cache --no-config "$WHEEL" # Check something basic to make sure it was installed correctly. -uv run --no-sync python -c "import mapfile_parser; print(help(mapfile_parser.scan_for_config))" +uv run --no-sync python -c "import mapfile_parser; print(mapfile_parser.__version__)" diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index fd187d9..a6ef4c7 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -97,9 +97,18 @@ jobs: - name: Install uv uses: astral-sh/setup-uv@v7 - - name: Setup project + - name: Setup venv ${{ matrix.py_version }} + if: ${{ matrix.py_version != '3.x' }} run: | uv venv --python ${{ matrix.py_version }} + # `--python 3 --managed-python` makes uv to install the latest python version available + - name: Setup venv 3.x + if: ${{ matrix.py_version == '3.x' }} + run: | + uv venv --python 3 --managed-python + + - name: Sync venv + run: | uv sync - name: Update tests outputs @@ -138,9 +147,18 @@ jobs: - name: Install uv uses: astral-sh/setup-uv@v7 - - name: Setup project + - name: Setup venv ${{ matrix.py_version }} + if: ${{ matrix.py_version != '3.x' }} run: | uv venv --python ${{ matrix.py_version }} + # `--python 3 --managed-python` makes uv to install the latest python version available + - name: Setup venv 3.x + if: ${{ matrix.py_version == '3.x' }} + run: | + uv venv --python 3 --managed-python + + - name: Sync venv + run: | uv sync - name: bss_check From 31489c79f149a854860d5271779ba53d3ae1fa54 Mon Sep 17 00:00:00 2001 From: Anghelo Carvajal Date: Sat, 17 Jan 2026 09:54:40 -0300 Subject: [PATCH 5/6] get rid of dry run --- .github/workflows/maturin_upload_pypi.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/maturin_upload_pypi.yml b/.github/workflows/maturin_upload_pypi.yml index 7eea367..170893d 100644 --- a/.github/workflows/maturin_upload_pypi.yml +++ b/.github/workflows/maturin_upload_pypi.yml @@ -339,6 +339,7 @@ jobs: release: name: Release runs-on: ubuntu-latest + if: ${{ startsWith(github.ref, 'refs/tags/') }} needs: [linux, musllinux, windows, windows_arm, macos, sdist, check_clippy_python_bindings] permissions: # Use to sign the release artifacts @@ -350,17 +351,12 @@ jobs: steps: - uses: actions/download-artifact@v6 - name: Generate artifact attestation - if: ${{ startsWith(github.ref, 'refs/tags/') }} uses: actions/attest-build-provenance@v3 with: subject-path: 'wheels-*/*' - name: Install uv uses: astral-sh/setup-uv@v7 - - name: Publish to PyPI (dry-run) - if: ${{ !startsWith(github.ref, 'refs/tags/') }} - run: uv publish 'wheels-*/*' --dry-run - name: Publish to PyPI - if: ${{ startsWith(github.ref, 'refs/tags/') }} run: uv publish 'wheels-*/*' env: UV_PUBLISH_TOKEN: ${{ secrets.PYPI_API_TOKEN }} From 4046e0e993ce4f20e1c8eae5ddfcc82e847f26d9 Mon Sep 17 00:00:00 2001 From: Anghelo Carvajal Date: Sat, 17 Jan 2026 10:24:49 -0300 Subject: [PATCH 6/6] changelog --- .../{python_linting.yml => linting.yml} | 0 .github/workflows/maturin_upload_pypi.yml | 2 +- CHANGELOG.md | 24 ++++++++++++++++++- README.md | 2 +- src/mapfile_parser/mapfile.py | 6 ++--- 5 files changed, 27 insertions(+), 7 deletions(-) rename .github/workflows/{python_linting.yml => linting.yml} (100%) diff --git a/.github/workflows/python_linting.yml b/.github/workflows/linting.yml similarity index 100% rename from .github/workflows/python_linting.yml rename to .github/workflows/linting.yml diff --git a/.github/workflows/maturin_upload_pypi.yml b/.github/workflows/maturin_upload_pypi.yml index 170893d..bf958b4 100644 --- a/.github/workflows/maturin_upload_pypi.yml +++ b/.github/workflows/maturin_upload_pypi.yml @@ -359,4 +359,4 @@ jobs: - name: Publish to PyPI run: uv publish 'wheels-*/*' env: - UV_PUBLISH_TOKEN: ${{ secrets.PYPI_API_TOKEN }} + UV_PUBLISH_TOKEN: ${{ secrets.PYPI_PASSWORD }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b90bfc..9812beb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,27 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [2.12.1] - 2026-01-17 + +### Added + +- Add support for Python 3.8 again. + - Figured out how to have CI to test compatibility with Python 3.8 again. +- Wheels for free threaded Python (3.14t). + - Hopefully nothing will break when running without the GIL. +- Wheels are now tested to be installable in CI. + - Specifically useful for abi3 wheels, so we can ensure the wheel is + installable in the oldest Python version we support for each OS/arch combo. +- Integrate `uv` in CI for Python and dependencies management. + +### Changed + +- Wheels now use the stable abi3 abi instead of building a single wheel for + each version for GIL Python. +- Python tests in CI are now run against all the Python versions we support + instead of relying on whatever Python version the Github runner has. +- `decomp-settings` 0.0.10 is now required. + ## [2.12.0] - 2025-10-11 ### Added @@ -678,7 +699,8 @@ Full changes: =2.12.0,<3.0.0 +mapfile_parser>=2.12.1,<3.0.0 ``` #### Development version diff --git a/src/mapfile_parser/mapfile.py b/src/mapfile_parser/mapfile.py index 2f81521..f3918e0 100644 --- a/src/mapfile_parser/mapfile.py +++ b/src/mapfile_parser/mapfile.py @@ -1168,8 +1168,7 @@ def resolvePartiallyLinkedFiles( # Only read the map if this is a new plf. if sect.filepath in knownMaps: continue - other_map_path = resolver(sect.filepath) - if other_map_path is not None: + if (other_map_path := resolver(sect.filepath)) is not None: knownMaps[sect.filepath] = MapFile.newFromMapFile(other_map_path) return self._resolve_plf_impl(knownMaps) @@ -1182,8 +1181,7 @@ def _resolve_plf_impl(self, knownMaps: dict[Path, MapFile]) -> MapFile: newSeg = seg.cloneNoSectionlist() for sect in seg._sectionsList: - otherMap = knownMaps.get(sect.filepath) - if otherMap is not None: + if (otherMap := knownMaps.get(sect.filepath)) is not None: # Each segment of a plf is just a normal elf section partialSegment = None for x in otherMap._segmentsList: