diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index b9a674a878..7d9834bc0e 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -17,7 +17,7 @@ // cache pip installs "mounts": ["type=volume,source=dev-pip-cache,target=/root/.cache/uv"], - "postCreateCommand": "uv sync && uv run pre-commit install || true && npm ci", + "postCreateCommand": "uv sync --frozen && uv run pre-commit install || true && npm ci", "customizations": { "vscode": { @@ -35,7 +35,6 @@ "ms-vscode.test-adapter-converter", "njpwerner.autodocstring", "cschlosser.doxdocgen", - "davidanson.vscode-markdownlint", // version pinned (for now) since an old version (1.6.2) is installed otherwise "biomejs.biome@3.3.0" ], diff --git a/.github/dependabot.yml b/.github/dependabot.yml index d6ee6af5e7..0c785f3fd6 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -7,4 +7,23 @@ updates: - package-ecosystem: "github-actions" directory: "/" schedule: - interval: "weekly" + interval: "cron" + cronjob: "0 8 * * 1" # Every Monday at 8:00 UTC + groups: + all-dependencies: + patterns: + - "*" + cooldown: + default-days: 7 + + - package-ecosystem: "uv" + directory: "/" + schedule: + interval: "cron" + cronjob: "0 8 * * 1" # Every Monday at 8:00 UTC + groups: + all-dependencies: + patterns: + - "*" + cooldown: + default-days: 7 diff --git a/.github/workflows/check-code-quality.yml b/.github/workflows/check-code-quality.yml index 13f32c62c0..9598a2ce2f 100644 --- a/.github/workflows/check-code-quality.yml +++ b/.github/workflows/check-code-quality.yml @@ -32,34 +32,34 @@ jobs: - name: Install most linters from uv run: | - CC=gcc-14 CXX=g++-14 uv sync --group lint + CC=gcc-14 CXX=g++-14 uv sync --locked --group lint - name: Run mypy run: | - uv run mypy . + uv run --frozen mypy . - name: Run ruff run: | - uv run ruff check . - uv run ruff format . + uv run --frozen ruff check . + uv run --frozen ruff format . git restore README.md - name: Run clang-format run: | - git ls-files -z -- '*.h' '*.c' '*.cpp' '*.hpp' '*.cc' '*.cxx' | xargs -0 -r uv run clang-format -style=file -i + git ls-files -z -- '*.h' '*.c' '*.cpp' '*.hpp' '*.cc' '*.cxx' | xargs -0 -r uv run --frozen clang-format -style=file -i - name: Run cmake-linter run: | - uv run gersemi -i --warnings-as-errors src/ tests/ cmake/ + uv run --frozen gersemi -i --warnings-as-errors src/ tests/ cmake/ - - name: Install npm packages + - name: Run pymarkdown run: | - npm ci + echo "Running pymarkdown" + git ls-files -z -- '*.md' | xargs -0 -r uv run --frozen pymarkdown fix - - name: Run markdownlint + - name: Install npm packages run: | - echo "Running markdownlint" - npx markdownlint --fix . + npm ci - name: Run Biome run: | @@ -77,8 +77,8 @@ jobs: - name: Check generated code if: success() run: | - uv sync --group code-generation - uv run code_generation/code_gen.py + uv sync --locked --group code-generation + uv run --frozen code_generation/code_gen.py if [ -n "$(git status --porcelain)" ]; then echo echo "The following files are outdated or were manually updated:" diff --git a/.github/workflows/refresh-lock-and-linter-dependencies.yml b/.github/workflows/refresh-lock-and-linter-dependencies.yml index 4464f765c0..28d201c2f3 100644 --- a/.github/workflows/refresh-lock-and-linter-dependencies.yml +++ b/.github/workflows/refresh-lock-and-linter-dependencies.yml @@ -41,11 +41,11 @@ jobs: uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0 - name: upgrade uv lock - run: uv lock --upgrade + run: uv lock --upgrade - name: Install linters from uv run: | - uv sync --only-group lint + uv sync --locked --only-group lint - name: retrieve uv package versions id: versions_uv @@ -78,7 +78,6 @@ jobs: echo "${nospecialchars_pkg}=$version" >> "$GITHUB_OUTPUT" } grab_installed_version_npm "@biomejs/biome" - grab_installed_version_npm "markdownlint-cli" - name: Update .pre-commit-config.yaml uses: cuchi/jinja2-action@8bd801365a8d36a0b20f45ee969161685de7785a # v1.3.0 @@ -91,7 +90,6 @@ jobs: mypy=${{ steps.versions_uv.outputs.mypy }} gersemi=${{ steps.versions_uv.outputs.gersemi }} biome=${{ steps.versions_npm.outputs.biomejsbiome }} - markdownlint_cli=${{ steps.versions_npm.outputs.markdownlint-cli }} - name: show changed files run: | diff --git a/.github/workflows/sonar.yml b/.github/workflows/sonar.yml index 8bc921e7e3..55174c864c 100644 --- a/.github/workflows/sonar.yml +++ b/.github/workflows/sonar.yml @@ -48,8 +48,8 @@ jobs: - name: Python test and coverage run: | - CC=clang CXX=clang++ uv sync --no-default-groups --group test - uv run pytest + CC=clang CXX=clang++ uv sync --locked --no-default-groups --group test + uv run --frozen pytest - name: Run build-wrapper for C++ run: | diff --git a/.markdownlint.yaml b/.markdownlint.yaml deleted file mode 100644 index 97271f4664..0000000000 --- a/.markdownlint.yaml +++ /dev/null @@ -1,16 +0,0 @@ -# SPDX-FileCopyrightText: Contributors to the Power Grid Model project -# -# SPDX-License-Identifier: MPL-2.0 - -# MD001/heading-increment : Heading levels should only increment by one level at a time : https://github.com/DavidAnson/markdownlint/blob/v0.37.4/doc/md001.md -MD001: false - -# MD013/line-length : Line length : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md013.md -line-length: - line_length: 120 - code_blocks: false - tables: false - stern: true - -# MD024/no-duplicate-heading : Multiple headings with the same content : https://github.com/DavidAnson/markdownlint/blob/v0.37.4/doc/md024.md -MD024: false diff --git a/.markdownlintignore b/.markdownlintignore deleted file mode 100644 index 4c1d102d3f..0000000000 --- a/.markdownlintignore +++ /dev/null @@ -1,14 +0,0 @@ -# SPDX-FileCopyrightText: Contributors to the Power Grid Model project -# -# SPDX-License-Identifier: MPL-2.0 - -.git -.mypy_cache -.pytest_cache -.ruff_cache -.venv -.clangd -cpp_build -build -node_modules -python_cov_html diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 6a63e39a46..bd2cd8b678 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,54 +3,70 @@ # SPDX-License-Identifier: MPL-2.0 repos: - - repo: https://github.com/fsfe/reuse-tool # outside pypi - rev: v6.2.0 + - repo: local hooks: - id: reuse - - repo: https://github.com/astral-sh/ruff-pre-commit - # Ruff version. - rev: v0.15.22 - hooks: - # Run the linter. - - id: ruff-check - name: ruff-check - args: [ --fix ] - # Run the formatter. + name: reuse + entry: uv run --frozen reuse lint + language: system + pass_filenames: false + - id: pytest + name: pytest + entry: uv run --frozen pytest + language: system + pass_filenames: false + types_or: [ python, c++, c ] - id: ruff-format name: ruff-format - - repo: https://github.com/pre-commit/mirrors-mypy - rev: v2.3.0 - hooks: + entry: uv run --frozen ruff format + language: system + pass_filenames: false + types: [ python ] + - id: ruff-check + name: ruff-check + entry: uv run --frozen ruff check + language: system + pass_filenames: false + types: [ python ] - id: mypy - additional_dependencies: - - numpy - - repo: local - hooks: - - id: pytest - name: pytest - entry: uv run pytest + name: mypy + entry: uv run --frozen mypy . language: system pass_filenames: false - always_run: true - - repo: https://github.com/pre-commit/mirrors-clang-format - rev: v18.1.8 - hooks: + types: [ python ] - id: clang-format + name: clang-format + entry: uv run --frozen clang-format -style=file -i + language: system + pass_filenames: true types_or: [ c++, c ] - - repo: https://github.com/BlankSpruce/gersemi-pre-commit - rev: 0.27.7 - hooks: - id: gersemi name: cmake-linter alias: cmake-linter - - repo: https://github.com/igorshubovych/markdownlint-cli # outside pypi - rev: v0.49.1 - hooks: - - id: markdownlint - args: ["--fix"] + entry: uv run --frozen gersemi -i --warnings-as-errors + language: system + pass_filenames: true + types: [ cmake ] + - id: pymarkdown-fix + name: pymarkdown-fix + alias: markdown-fix + entry: uv run --frozen pymarkdown fix + language: system + pass_filenames: true + types: [ markdown ] + require_serial: true + - id: pymarkdown-scan + name: pymarkdown-scan + alias: markdown-check + entry: uv run --frozen pymarkdown scan + language: system + pass_filenames: true + types: [ markdown ] + require_serial: true + # format .json and .jsonc files # format .json and .jsonc files - repo: https://github.com/biomejs/pre-commit # outside pypi - rev: v2.5.4 + rev: v2.5.6 hooks: # configuration is located in biome.jsonc - id: biome-format diff --git a/.pre-commit-config.yaml.jinja b/.pre-commit-config.yaml.jinja index d09b338a92..2fa1a44e7f 100644 --- a/.pre-commit-config.yaml.jinja +++ b/.pre-commit-config.yaml.jinja @@ -3,51 +3,67 @@ # SPDX-License-Identifier: MPL-2.0 repos: - - repo: https://github.com/fsfe/reuse-tool # outside pypi - rev: v6.2.0 + - repo: local hooks: - id: reuse - - repo: https://github.com/astral-sh/ruff-pre-commit - # Ruff version. - rev: v{{ ruff }} - hooks: - # Run the linter. - - id: ruff-check - name: ruff-check - args: [ --fix ] - # Run the formatter. + name: reuse + entry: uv run --frozen reuse lint + language: system + pass_filenames: false + - id: pytest + name: pytest + entry: uv run --frozen pytest + language: system + pass_filenames: false + types_or: [ python, c++, c ] - id: ruff-format name: ruff-format - - repo: https://github.com/pre-commit/mirrors-mypy - rev: v{{ mypy }} - hooks: + entry: uv run --frozen ruff format + language: system + pass_filenames: false + types: [ python ] + - id: ruff-check + name: ruff-check + entry: uv run --frozen ruff check + language: system + pass_filenames: false + types: [ python ] - id: mypy - additional_dependencies: - - numpy - - repo: local - hooks: - - id: pytest - name: pytest - entry: uv run pytest + name: mypy + entry: uv run --frozen mypy . language: system pass_filenames: false - always_run: true - - repo: https://github.com/pre-commit/mirrors-clang-format - rev: v{{ clang_format }} - hooks: + types: [ python ] - id: clang-format + name: clang-format + entry: uv run --frozen clang-format -style=file -i + language: system + pass_filenames: true types_or: [ c++, c ] - - repo: https://github.com/BlankSpruce/gersemi-pre-commit - rev: {{ gersemi }} - hooks: - id: gersemi name: cmake-linter alias: cmake-linter - - repo: https://github.com/igorshubovych/markdownlint-cli # outside pypi - rev: v{{ markdownlint_cli }} - hooks: - - id: markdownlint - args: ["--fix"] + entry: uv run --frozen gersemi -i --warnings-as-errors + language: system + pass_filenames: true + types: [ cmake ] + - id: pymarkdown-fix + name: pymarkdown-fix + alias: markdown-fix + entry: uv run --frozen pymarkdown fix + language: system + pass_filenames: true + types: [ markdown ] + require_serial: true + - id: pymarkdown-scan + name: pymarkdown-scan + alias: markdown-check + entry: uv run --frozen pymarkdown scan + language: system + pass_filenames: true + types: [ markdown ] + require_serial: true + # format .json and .jsonc files # format .json and .jsonc files - repo: https://github.com/biomejs/pre-commit # outside pypi rev: v{{ biome }} diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 001f6aa2cd..6ac3f1ca39 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -24,7 +24,7 @@ build: create_environment: - uv venv "${READTHEDOCS_VIRTUALENV_PATH}" install: - - CC=gcc-14 CXX=g++-14 UV_PROJECT_ENVIRONMENT="${READTHEDOCS_VIRTUALENV_PATH}" uv sync --frozen --group doc + - CC=gcc-14 CXX=g++-14 UV_PROJECT_ENVIRONMENT="${READTHEDOCS_VIRTUALENV_PATH}" uv sync --locked --group doc post_install: # remove API DLL define in header - find power_grid_model_c/power_grid_model_c/include -name *.h -exec sed -i -r "s/#define PGM.*//g" {} \; diff --git a/README.md b/README.md index dcf7eb6c05..6969863b74 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,8 @@ SPDX-FileCopyrightText: Contributors to the Power Grid Model project -[![Power Grid Model logo](https://raw.githubusercontent.com/PowerGridModel/.github/main/artwork/svg/color.svg)](#) + +[![Power Grid Model logo](https://raw.githubusercontent.com/PowerGridModel/.github/main/artwork/svg/color.svg)](#) [![PyPI version](https://badge.fury.io/py/power-grid-model.svg?no-cache)](https://badge.fury.io/py/power-grid-model) [![PyPI Downloads](https://static.pepy.tech/badge/power-grid-model)](https://pepy.tech/project/power-grid-model) @@ -110,6 +111,7 @@ references. [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.8054429.svg)](https://zenodo.org/record/8054429) + ```bibtex @software{Xiang_PowerGridModel_power-grid-model, author = {Xiang, Yu and Salemink, Peter and van Westering, Werner and Bharambe, Nitish and Govers, Martinus G.H. and van den Bogaard, Jonas and Stoeller, Bram and Wang, Zhen and Guo, Jerry Jinfeng and Figueroa Manrique, Santiago and Jagutis, Laurynas and Wang, Chenguang and van Raalte, Marc and {Contributors to the LF Energy project Power Grid Model}}, @@ -130,6 +132,7 @@ references. doi={10.1049/icp.2023.0633} } ``` + ## Contact diff --git a/docs/advanced_documentation/build-guide.md b/docs/advanced_documentation/build-guide.md index 2ef28e3356..44f3b21f11 100644 --- a/docs/advanced_documentation/build-guide.md +++ b/docs/advanced_documentation/build-guide.md @@ -83,7 +83,9 @@ These are handled automatically in CI. For local development, use your system's * Latest XCode release tested in CI. ```{note} -Once your compiler of choice is installed, you need to define the environment variables `CC` and `CXX` to specify the compiler. For example `export CC=clang-18` and `export CXX=clang++-18` to select the `clang` compiler in Ubuntu. +Once your compiler of choice is installed, you need to define the environment variables `CC` and `CXX` to specify the +compiler. +For example `export CC=clang-18` and `export CXX=clang++-18` to select the `clang` compiler in Ubuntu. ``` ### Build System for CMake Project @@ -97,9 +99,12 @@ This repository uses [CMake](https://cmake.org/) (version 3.23 or later) as its The table below shows the C++ build dependencies. ```{note} -The C++ dependencies below are **build-time only**. When building the Python package from source (via `uv sync`), they are automatically downloaded and used during the build — you do not need to install them manually. Manual installation is only required for standalone CMake builds. +The C++ dependencies below are **build-time only**. When building the Python package from source (via `uv sync`), they +are automatically downloaded and used during the build — you do not need to install them manually. +Manual installation is only required for standalone CMake builds. ``` + | Library name | Requirements to build Python package | Requirements to build CMake project | Remark | License | | ------------------------------------------------------------------- | ------------------------------------ | ------------------------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------ | | [boost](https://www.boost.org/) | Installed automatically | CMake needs to be able find `boost` | header-only | [Boost Software License - Version 1.0](https://www.boost.org/LICENSE_1_0.txt) | @@ -107,6 +112,7 @@ The C++ dependencies below are **build-time only**. When building the Python pac | [nlohmann-json](https://github.com/nlohmann/json) | Installed automatically | CMake needs to be able find `nlohmann_json` | header-only | [MIT](https://github.com/nlohmann/json/blob/develop/LICENSE.MIT) | | [msgpack-cxx](https://github.com/msgpack/msgpack-c/tree/cpp_master) | Installed automatically | CMake needs to be able find `msgpack-cxx` | header-only | [Boost Software License - Version 1.0](https://github.com/msgpack/msgpack-c/blob/cpp_master/LICENSE_1_0.txt) | | [doctest](https://github.com/doctest/doctest) | None | CMake needs to be able find `doctest` | header-only | [MIT](https://github.com/doctest/doctest/blob/master/LICENSE.txt) | + To install the C++ dependencies for a CMake build, use your platform's package manager of choice. In the platform-specific examples below, we will give some suggestions. @@ -120,6 +126,7 @@ Set `CMAKE_PREFIX_PATH` to the installation prefix of your package manager so CM The table below shows the Python dependencies. + | Library name | Remark | License | |------------------------------------------------------------------------|------------------------|--------------------------------------------------------------------------------------------| | [numpy](https://numpy.org/) | Runtime dependency | [BSD-3](https://github.com/numpy/numpy/blob/main/LICENSE.txt) | @@ -128,6 +135,7 @@ The table below shows the Python dependencies. | [pytest-cov](https://github.com/pytest-dev/pytest-cov) | Development dependency | [MIT](https://github.com/pytest-dev/pytest-cov/blob/master/LICENSE) | | [msgpack-python](https://github.com/msgpack/msgpack-python) | Development dependency | [Apache License, Version 2.0](https://github.com/msgpack/msgpack-python/blob/main/COPYING) | | [uv](https://github.com/astral-sh/uv) | Development dependency | [Apache License, Version 2.0](https://github.com/astral-sh/uv/blob/main/LICENSE-APACHE) | + ## Build Python Package @@ -355,9 +363,11 @@ conda create --yes -p C:\conda_envs\cpp_pkgs -c conda-forge libboost-headers eig Set `CMAKE_PREFIX_PATH` so CMake can locate the C++ libraries. In PowerShell: + ```powershell $env:CMAKE_PREFIX_PATH = C:\conda_envs\cpp_pkgs\Library ``` + To make it persistent across sessions: @@ -386,14 +396,14 @@ For debugging purposes, it may be useful to build the Power Grid Model with debu To do so, the following command can be used to override the default build settings. ```powershell -uv sync --config-settings=cmake.build-type="RelWithDebInfo" +uv sync --locked --config-settings=cmake.build-type="RelWithDebInfo" ``` It is also possible to install the Power Grid Model as a full debug build, including extra sanity checks and with a lower degree of optimizations. Note this may come with a significant impact on the performance. ```powershell -uv sync --config-settings=cmake.build-type="Debug" +uv sync --locked --config-settings=cmake.build-type="Debug" ``` ### Build CMake Project @@ -464,6 +474,7 @@ As a quick start, from the root of the repository: ```{note} Test coverage is not supported on macOS. +``` ## Package tests @@ -510,7 +521,7 @@ In addition, the `power-grid-model` Python package needs to be built by followin After that, the documentation specific packages can be installed via: ```shell -uv sync --group doc +uv sync --locked --group doc ``` ```{note} diff --git a/docs/advanced_documentation/c-api.md b/docs/advanced_documentation/c-api.md index b1442faf0a..268f89800e 100644 --- a/docs/advanced_documentation/c-api.md +++ b/docs/advanced_documentation/c-api.md @@ -121,6 +121,7 @@ versions, compilers, operating systems and architectures. * an aligned size of 8 bytes * a 4 bytes alignment + ```txt <-- 3 lines. | | | | | | | <-- alignment: a line may start every 4 bytes. @@ -128,6 +129,7 @@ iiiift iiiift iiiift <-- data: 6 bytes per line: 4 bytes for the ID, 1 for | ..| ..| ..| <-- padding: (4 - (6 mod 4) = 2) bytes after every line. | | | | <-- aligned size: (6 + 2 = 8) bytes every line. ``` + #### Create and destroy buffer diff --git a/docs/advanced_documentation/core-design.md b/docs/advanced_documentation/core-design.md index 0e1d0382bc..b8ed489b13 100644 --- a/docs/advanced_documentation/core-design.md +++ b/docs/advanced_documentation/core-design.md @@ -17,6 +17,7 @@ The `MainModel` itself can be deconstructed into an API part, a dispatch part, t The logic involved in power grid calculations in turn can be devided in a number of separate modules. Coincidentally, those phases also translate to fields of expertise, which enables a reasonably clean architecture. + | Logic/control module | Description | Expertise | | -------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | ---------------------- | | I/O | Constructing, updating and outputting components in the power grid | Software Engineering | @@ -24,6 +25,7 @@ Coincidentally, those phases also translate to fields of expertise, which enable | $Y_{\text{bus}}$ construction/Component extraction | Constructing $Y_{\text{bus}}$ from the power grid components and topology | Electrical Engineering | | Solver construction/Grid extraction | Translation from $Y_{\text{bus}}$ to a solvable system of equations and from the solution back to physical values | Physics | | Solving | Abstract solution to the system of equations | Mathematics | + ```{note} Software Engineering obviously also plays a role in the general design, but that general design does not involve the diff --git a/docs/advanced_documentation/high-level-design.md b/docs/advanced_documentation/high-level-design.md index efadc1d193..88aaf786e6 100644 --- a/docs/advanced_documentation/high-level-design.md +++ b/docs/advanced_documentation/high-level-design.md @@ -34,18 +34,21 @@ abstraction. The following library interfaces are currently included in the power-grid-model. + | Interface type | Status | Layer | Explanation | Supported by | | -------------- | ------------ | ------------------ | --------------------------------------------------------------- | --------------------------------------------------- | | C API | Stable | Raw interface | Shared object / DLL that contains the core implementation | All programming languages with dynamic load support | | C headers | Stable | Exposition-only | Exposition-only library using dynamic linking | C and C++ | | C++ headers | Experimental | Wrapper | Handles memory management and basic error handling | C++ | | Python library | Stable | Feature-rich layer | Library with useful functions, conversions and extensive checks | Python | + Note that the Python library in turn also follows the pattern of a feature-rich library that uses a module-internal wrapper layer core module, that wraps the exposition-only core module, that exposes the raw interface. This can be visualized graphically as follows. + ```{mermaid} :title: Full design @@ -93,6 +96,7 @@ flowchart TD cpp_user -->|experimental
links +
includes| power_grid_model_cpp -->|links +
includes| power_grid_model_c python_user -->|import| power_grid_model_python -->|internal import| power_grid_model_core_python -->|internal import| power_grid_core_python -->|"CDLL
(dynamic loading)"| power_grid_model_c_dll ``` + ## Creating a custom library or interface diff --git a/docs/advanced_documentation/native-data-interface.md b/docs/advanced_documentation/native-data-interface.md index 8442217dfe..1e68a54d0f 100644 --- a/docs/advanced_documentation/native-data-interface.md +++ b/docs/advanced_documentation/native-data-interface.md @@ -119,12 +119,14 @@ The pointers are passed into C++ code so that the C++ program can write results The basic data types used in the interface between C++ and Python are shown in the table below. + | C++ type | `numpy.dtype` | null value | usage | | ----------- | ------------- | --------------------------------------------------- | --------------------------------------------------------------------------------------- | | `int32_t` | `'i4'` | - 2^31 | ids of physical components | | `int8_t` | `'i1'` | - 2^7 | enumeration types, boolean types, and small integers (e.g. tap position of transformer) | | `double` | `'f8'` | NaN ([IEEE 754](https://en.wikipedia.org/wiki/NaN)) | physical quantities (e.g. voltage) | | `double[3]` | `'(3, )f8'` | NaN ([IEEE 754](https://en.wikipedia.org/wiki/NaN)) | three-phase asymmetric physical quantities (e.g. voltage) | + *The [endianness](https://en.wikipedia.org/wiki/Endianness) of C++ and Python side is also matched. For `x86-64` platform the little endian is used, so that the `numpy.dtype` is `' 1. Initialize the permutations $\mathbf{P}$ and $\mathbf{Q}$ to the identity permutation. 2. Initialize fill-in elements to $0$. 3. Loop over all rows: $p = 0..(N-1)$: @@ -326,11 +327,12 @@ $\mathbf{M}\left[0:3, j\right]$. 2. $\mathbf{M}_p\left[0:N_p,0\right] \leftrightarrow \mathbf{M}\left[0:N_p,j_p\right]$ 6. Apply Gaussian elimination for the current pivot element: 1. $\mathbf{M}_p\left[0,0:N_p\right] \gets \frac{1}{\mathbf{M}_p[0,0]}\mathbf{M}_p\left[0,0:N_p\right]$ - 2. $\mathbf{M}_p\left[1:N_p,0:N_p\right] \gets \mathbf{M}_p\left[1:N_p,0:N_p\right] - \mathbf{M}_p\left[1:N_p,0\right] \otimes \mathbf{M}_p\left[0,0:N_p\right]$ + 2. $\mathbf{M}_p\left[1:N_p,0:N_p\right] \gets \mathbf{M}_p\left[1:N_p,0:N_p\right] - \mathbf{M}_p\left[1:N_p,0\right] \otimes \mathbf{M}_p\left[0,0:N_p\right]$ 7. Accumulate the permutation matrices: 1. In $\mathbf{P}$: swap $p \leftrightarrow p + i_p$ 2. In $\mathbf{Q}$: swap $p \leftrightarrow p + j_p$ 8. Continue with the next $p$ to factorize the the bottom-right block. + $\mathbf{L}$ is now the matrix containing the lower triangle of $\mathbf{M}$, ones on the diagonal and zeros in the upper triangle. @@ -801,7 +803,7 @@ The equation $\mathbf{L}\boldsymbol{y} = \mathbf{P}\boldsymbol{b}$ is solved as 1. Loop over all block-rows: $i=0..(N-1)$: 1. Loop over all lower-triangle off-diagonal columns (beware of sparsity): $j=0..(i-1)$: - 1. $\boldsymbol{b}\left[i\right] \gets \boldsymbol{b}\left[i\right] - \mathbf{L}\left[i,j\right] \cdot \boldsymbol{b}\left[j\right]$. + 1. $\boldsymbol{b}\left[i\right] \gets \boldsymbol{b}\left[i\right] - \mathbf{L}\left[i,j\right] \cdot \boldsymbol{b}\left[j\right]$. 2. Continue with next block-column. 2. If the matrix is a block matrix: 1. Follow the same steps within the block. @@ -815,7 +817,7 @@ The equation $Uz = y$ is solved as follows. 1. Loop over all block-rows in reverse order: $i=(N-1)..0$: 1. Loop over all upper-triangle off-diagonal columns (beware of sparsity): $j=(i+1)..0$: - 1. $\boldsymbol{b}\left[i\right] \gets \boldsymbol{b}\left[i\right] - \mathbf{U}\left[i,j\right] \cdot \boldsymbol{b}\left[j\right]$. + 1. $\boldsymbol{b}\left[i\right] \gets \boldsymbol{b}\left[i\right] - \mathbf{U}\left[i,j\right] \cdot \boldsymbol{b}\left[j\right]$. 2. Continue with next block-column. 2. Handle the diagonal element: 1. If the matrix is a block matrix: @@ -1131,7 +1133,7 @@ with dimensions $N_i\times N_j$. 3. Loop over all rows of the current block: $k = 0..(N_{i,j} - 1)$: 1. $\text{block\_row\_norm} \gets 0$. 2. Loop over all columns of the current block: $l = 0..(N_{i,j} - 1)$: - 1. $\text{block\_row\_norm} \gets \text{block\_row\_norm} + \left\|\mathbf{M}_{i,j}\left[k,l\right]\right\|$. + 1. $\text{block\_row\_norm} \gets \text{block\_row\_norm} + \left\|\mathbf{M}_{i,j}\left[k,l\right]\right\|$. 3. Calculate the new block norm: set $\text{block\_norm} \gets \max\left\{\text{block\_norm}, \text{block\_row\_norm}\right\}$. 4. Continue with the next row of the current block. @@ -1186,10 +1188,11 @@ $$ \end{bmatrix} $$ + * The regular $L_{\infty}$-norm is $\max\left\{1+3, 3, 5, \frac{1}{2}, 1, 1\right\} = 5$. * The block-wise off-diagonal infinity $L_{\infty ,\text{bwod}}$-norm is - $\max\left\{\max\left\{1, 3\right\}+\max\left\{3, 0\right\},\max\left\{5, 0\right\} + \max\left\{0, \frac{1}{2}\right\}, 1\right\} = \max\left\{3+3, 5+\frac{1}{2}, 1, 1\right\} = 6$. + The two norms clearly differ and even the elements that contribute most to the norm are different. @@ -1214,9 +1217,10 @@ $$ \end{bmatrix} $$ + * The regular $L_{\infty}$-norm is $\max\left\{20+20+2+2,30+3,100,3+1\right\} = \max\left\{44,33,100,4\right\} = 100$. * The block-wise infinity norm with diagonals would be - $\max\left\{\max\left\{20+20, 30\right\}+\max\left\{2+2, 3\right\},\max\left\{0,3\right\} + \max\left\{100, 1\right\}\right\} = \max\left\{40+4, 3+100\right\} = \max\left\{44, 103\right\} = 103$. * The $L_{\infty ,\text{bwod}}$-norm is $\max\left\{\max\left\{2+2, 3\right\},\max\left\{0,3\right\}\right\} = \max\left\{4, 3\right\} = 4$. + diff --git a/docs/algorithms/pf-algorithms.md b/docs/algorithms/pf-algorithms.md index fb1cbc92ca..ed3967e3e0 100644 --- a/docs/algorithms/pf-algorithms.md +++ b/docs/algorithms/pf-algorithms.md @@ -37,7 +37,9 @@ The following bus types can be present in the system: Note: this bus is not supported by power-grid-model yet. ```{note} -Asymmetric power flow calculations require the network to have a reference to ground. For details and internal solution of asymmetric floating grids calculations in power-grid-model, please refer to [Floating grid handling](../user_manual/calculations.md#floating-grid-handling). +Asymmetric power flow calculations require the network to have a reference to ground. +For details and internal solution of asymmetric floating grids calculations in power-grid-model, please refer to +[Floating grid handling](../user_manual/calculations.md#floating-grid-handling). ``` ## Newton-Raphson power flow diff --git a/docs/algorithms/sc-algorithms.md b/docs/algorithms/sc-algorithms.md index 8c60a8fb5f..748969050f 100644 --- a/docs/algorithms/sc-algorithms.md +++ b/docs/algorithms/sc-algorithms.md @@ -22,7 +22,8 @@ This gives the initial symmetrical short circuit current ($I_k^{\prime\prime}$) This quantity is then used to derive almost all further calculations of short circuit studies applications. ```{note} -Short-circuit calculations are currently implemented in the phase (abc) domain and therefore require a grounded network, similar to asymmetric power flow calculations. +Short-circuit calculations are currently implemented in the phase (abc) domain and therefore require a grounded network, +similar to asymmetric power flow calculations. Note that this limitation does not exist in the sequence (0-1-2) domain but is present in the phase domain calculation. ``` diff --git a/docs/algorithms/se-algorithms.md b/docs/algorithms/se-algorithms.md index a189755c9d..efd4bbef30 100644 --- a/docs/algorithms/se-algorithms.md +++ b/docs/algorithms/se-algorithms.md @@ -105,8 +105,8 @@ It is not possible to mix [power sensors](../user_manual/components.md#generic-p [current sensors](../user_manual/components.md#generic-current-sensor) on the same terminal of the same component. It is also not possible to mix [current sensors with global angle measurement type](../user_manual/components.md#global-angle-current-sensors) with -[current sensors with local angle measurement type](../user_manual/components.md#local-angle-current-sensors) on the same terminal -of the same component. +[current sensors with local angle measurement type](../user_manual/components.md#local-angle-current-sensors) on the +same terminal of the same component. However, such mixing of sensor types is allowed as long as they are on different terminals. ``` @@ -313,7 +313,7 @@ Consequently, the iteration process differs slightly from that of $\widetilde{\boldsymbol{U}}^{(k)}$ and $\widetilde{\boldsymbol{\theta}}^{(k)}$, using the prefactorized matrix. See also [Matrix-prefactorization](../user_manual/performance-guide.md#matrix-prefactorization) - Normalize the result voltage phasor angle by setting angle of slack bus to zero: - $\underline{U}_i^{(k)} = \widetilde{\underline{U}}_i^{(k)} \times |\widetilde{\underline{U}}_s^{(k)}| / \widetilde{\underline{U}}_s^{(k)}$. + $\underline{U}_i^{(k)} = \widetilde{\underline{U}}_i^{(k)} \times |\widetilde{\underline{U}}_s^{(k)}| / \widetilde{\underline{U}}_s^{(k)}$. - If the maximum deviation between $\underline{\boldsymbol{U}}^{(k)}$ and $\underline{\boldsymbol{U}}^{(k-1)}$ is smaller than the tolerance $\epsilon$, stop the iteration, otherwise continue until the maximum number of iterations is reached. diff --git a/docs/algorithms/tap-changing-algorithms.md b/docs/algorithms/tap-changing-algorithms.md index 60c82ad423..ef080bc002 100644 --- a/docs/algorithms/tap-changing-algorithms.md +++ b/docs/algorithms/tap-changing-algorithms.md @@ -41,24 +41,28 @@ regulator is automatic. The following table specifies the behaviour of regulated transformers based on the {py:class}`TapChangingStrategy ` chosen and whether `tap_pos` is regulated. + |TapChangingStrategy|tap_pos is regulated?|Initialization phase|Exploitation phase| |---|---|---|---| |{py:class}`any_valid_tap `|Yes|Set the tap position to `tap_nom` (default middle tap position)|Binary search (default)| |{py:class}`any_valid_tap `|No|Clamp the tap position to stay within `tap_min` and `tap_max`|Do not regulate| |{py:class}`min_voltage_tap ` / {py:class}`max_voltage_tap `|Yes|Set the tap position to `tap_min` or `tap_max` respectively|Do not regulate| |{py:class}`min_voltage_tap ` / {py:class}`max_voltage_tap `|No|Clamp the tap position to stay within `tap_min` and `tap_max`|Do not regulate| + Some transformer configurations require clamping due to `regulated_object` and `tap_side` pointing to different sides of the transformer. For a three-winding transformer the requirements are similar to a regular transformer with the additional consideration that the primary side tap changer regulates only the secondary or tertiary side voltages: + |Tapping on side|Regulated object|Voltage control side|`tap_side`|`regulated_object`|`control_side`| |---|---|---|---|---|---| |HV (0)|LV (1)|LV (1)|`BranchSide.from_side` / `Branch3Side.side_1`|`TransformerTapSide.side_1` / `Branch3Side.side_2`|`BranchSide.to_side` / `Branch3Side.side_2`| |HV (0)|LV (1)|HV (0)|`BranchSide.from_side` / `Branch3Side.side_1`|`TransformerTapSide.side_1` / `Branch3Side.side_2`|`BranchSide.from_side` / `Branch3Side.side_1`| |LV (1)|HV (0)|LV (1)|`BranchSide.to_side` / `Branch3Side.side_2`|`TransformerTapSide.side_2` / `Branch3Side.side_1`|`BranchSide.to_side` / `Branch3Side.side_2`| |LV (1)|HV (0)|HV (0)|`BranchSide.to_side` / `Branch3Side.side_2`|`TransformerTapSide.side_2` / `Branch3Side.side_1`|`BranchSide.from_side` / `Branch3Side.side_1`| + ## Search methods used for tap changing optimization @@ -66,11 +70,13 @@ By default, the algorithm uses binary search to find the optimal tap position to Users can also choose other search methods via {py:class}`TapChangingStrategy `: + |{py:class}`TapChangingStrategy `|Description| |---|---| |{py:class}`fast_any_tap `|Very fast search (single step per iteration)| |{py:class}`any_valid_tap `|Binary search (default)| |{py:class}`min_voltage_tap ` / {py:class}`max_voltage_tap `|Set to extreme tap and do not regulate| + ## Regulatable voltage range outside `u_band` diff --git a/docs/contribution/folder-structure.md b/docs/contribution/folder-structure.md index 199a4ef2c5..57d0e0334d 100644 --- a/docs/contribution/folder-structure.md +++ b/docs/contribution/folder-structure.md @@ -8,8 +8,9 @@ SPDX-License-Identifier: MPL-2.0 The repository folder structure is as follows. The `docs` and `scripts` folders are self-explanatory. + - The C++ calculation core is inside - {{ "[power_grid_model_c/power_grid_model/include/power_grid_model]({}/power_grid_model_c/power_grid_model/include/power_grid_model)".format(gh_link_head_tree) }}. + {{ "[power_grid_model_c/power_grid_model/include/power_grid_model]({}/power_grid_model_c/power_grid_model/include/power_grid_model)".format(gh_link_head_tree) }}. - The C API is inside {{ "[power_grid_model_c/power_grid_model_c]({}/power_grid_model_c/power_grid_model_c)".format(gh_link_head_tree) }}. - The C program example to use the C API is inside @@ -29,3 +30,4 @@ The repository folder structure is as follows. The `docs` and `scripts` folders - `data` contains validation test cases designed for every component and algorithm. Some sample network types are also included. The validation is either against popular power system analysis software or hand calculation. + diff --git a/docs/user_manual/calculations.md b/docs/user_manual/calculations.md index 47ac854f38..e97db67a98 100644 --- a/docs/user_manual/calculations.md +++ b/docs/user_manual/calculations.md @@ -124,7 +124,8 @@ However, such mixing of sensor types is allowed as long as they are on different ``` ```{warning} -The [iterative linear](../algorithms/se-algorithms.md#iterative-linear-state-estimation) and [Newton-Raphson](../algorithms/se-algorithms.md#newton-raphson-state-estimation) state +The [iterative linear](../algorithms/se-algorithms.md#iterative-linear-state-estimation) and +[Newton-Raphson](../algorithms/se-algorithms.md#newton-raphson-state-estimation) state estimation algorithms will assume angles to be zero by default (see the details about voltage sensors). In observable systems this helps better outputting correct results. On the other hand with unobservable systems, exceptions raised from calculations due to faulty results will be @@ -193,8 +194,11 @@ Output: - Current flowing through branches and fault. ```{note} -Short-circuit calculations are currently implemented in the phase (abc) domain and therefore require a grounded configurations in certain cases, similar to asymmetric power flow calculations. -For details on how floating grids are treated in power-grid-model, please refer to[Floating grid handling](calulations.md#floating-grid-handling). +Short-circuit calculations are currently implemented in the phase (abc) domain and therefore require a grounded +configurations in certain cases, similar to asymmetric power flow calculations. +For details on how floating grids are treated in power-grid-model, please refer to +[Floating grid handling](calulations.md#floating-grid-handling). +``` #### Common calculations @@ -240,7 +244,10 @@ The option affects which attributes are required and how results are exposed. for all output variables. ```{note} -In power-grid model, asymmetric calculations with certain configurations require the network to have a reference to ground. For details on how floating grids are treated in power-grid-model, please refer to [Floating grid handling](calulations.md#floating-grid-handling). +In power-grid model, asymmetric calculations with certain configurations require the network to have a reference to +ground. +For details on how floating grids are treated in power-grid-model, please refer to +[Floating grid handling](calulations.md#floating-grid-handling). ``` ```{note} @@ -287,20 +294,22 @@ right one. At the moment, the following power flow algorithms are implemented. + | Algorithm | Speed | Result | Convergence | Typical Use Cases | Algorithm call | |--------------------------------------------------------------------------------- |---------------------------------- |---------------------------------- |-------------------- |------------------------------------------------------------------------ |----------------------------------------------------------------------------------------------------------- | | [Newton-Raphson](../algorithms/pf-algorithms.md#newton-raphson-power-flow) | Medium | Accurate within `error_tolerance` | Quadratic, robust | General purpose, any type of grid | {py:class}`CalculationMethod.newton_raphson ` | | [Iterative current](../algorithms/pf-algorithms.md#iterative-current-power-flow) | Fast (Radial) Slow (Meshed) | Accurate within `error_tolerance` | Linear, less robust | Non-topological change batch calculations like timeseries, radial grids | {py:class}`CalculationMethod.iterative_current `| | [Linear](../algorithms/pf-algorithms.md#linear-power-flow) | Much Faster | Approximate | Single iteration | Large number of calculations, troubleshooting iterative methods | {py:class}`CalculationMethod.linear ` | | [Linear current](../algorithms/pf-algorithms.md#linear-current-power-flow) | Much Faster | Approximate | Single iteration | Large number of calculations | {py:class}`CalculationMethod.linear_current ` | + ```{note} By default, the [Newton-Raphson](../algorithms/pf-algorithms.md#newton-raphson-power-flow) method is used. ``` ```{note} -When all the load/generation types are of constant impedance, the [Linear](../algorithms/pf-algorithms.md#linear-power-flow) method will be the -fastest without loss of accuracy. +When all the load/generation types are of constant impedance, the +[Linear](../algorithms/pf-algorithms.md#linear-power-flow) method will be the fastest without loss of accuracy. Therefore power-grid-model will use this method regardless of the input provided by the user in this case. ``` @@ -351,9 +360,11 @@ Regulated power flow calculations are disabled by default. At the time of writing, the following regulated power flow calculation types are implemented. Please refer to their respective sections for detailed documentation. + | Regulation type | Setting | Enum values | | ----------------------------------------------------------------- | --------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- | | [Automatic tap changing](#power-flow-with-automatic-tap-changing) | {py:meth}`tap_changing_strategy ` | {py:class}`TapChangingStrategy ` | + #### Power flow with automatic tap changing @@ -366,6 +377,7 @@ Power flow calculations that take the behavior of these regulators into account following strategies to the {py:meth}`tap_changing_strategy ` option. + | Algorithm | Default | Speed | Algorithm call | | --------------------------------------------------------------------------- | -------- | -------- | ----------------------------------------------------------------------------------------------------------- | | No automatic tap changing (regular power flow) | ✔ | ✔ | {py:class}`TapChangingStrategy.disabled ` | @@ -373,6 +385,7 @@ option. | Optimize tap positions for lowest possible voltage in the voltage band | | | {py:class}`TapChangingStrategy.min_voltage_tap ` | | Optimize tap positions for lowest possible voltage in the voltage band | | | {py:class}`TapChangingStrategy.max_voltage_tap ` | | Optimize tap positions for any value in the voltage band with binary search | | ✔ | {py:class}`TapChangingStrategy.fast_any_tap ` | + For detailed control logic, initialization behavior, search methods, and error handling for automatic tap changing, see [Automatic Tap Changing Algorithm Details](../algorithms/tap-changing-algorithms.md). @@ -384,10 +397,12 @@ the highest likelihood given (pseudo) measurement input. At the moment, the following state estimation algorithms are implemented. + | Algorithm | Default | Speed | Accuracy | Algorithm call | | --------- | ------- | ----- | -------- | -------------- | | [Iterative linear](../algorithms/se-algorithms.md#iterative-linear-state-estimation) | ✔ | ✔ | | {py:class}`CalculationMethod.iterative_linear ` | | [Newton-Raphson](../algorithms/se-algorithms.md#newton-raphson-state-estimation) | | | ✔ | {py:class}`CalculationMethod.newton_raphson ` | + ```{note} By default, the [Iterative linear](../algorithms/se-algorithms.md#iterative-linear-state-estimation) method is used. @@ -404,9 +419,11 @@ of short circuit studies applications. At the moment, the following short circuit algorithms are implemented. + | Algorithm | Default | Speed | Accuracy | Algorithm call | | --------- | ------- | ----- | -------- | -------------- | | [IEC 60909](../algorithms/sc-algorithms.md#iec-60909-short-circuit-calculation) | ✔ | ✔ | | {py:class}`CalculationMethod.iec60909 ` | + For detailed mathematical descriptions including the short circuit equations and IEC 60909 implementation details, see [Short Circuit Algorithm Details](../algorithms/sc-algorithms.md). diff --git a/docs/user_manual/components.md b/docs/user_manual/components.md index 639fa08157..569c90a3d3 100644 --- a/docs/user_manual/components.md +++ b/docs/user_manual/components.md @@ -21,9 +21,11 @@ The base type for all power-grid-model components. #### Input + | name | data type | unit | description | required | update | |------|-----------|------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------|:--------:|:--------------------:| | `id` | `int32_t` | - | ID of a component. The ID should be unique across all components within the same scenario, e.g., you cannot have a node with `id=5` and another line with `id=5`. | ✔ | ❌ (see below) | + If a component update is uniform and is updating all the elements with the same component type, IDs can be omitted or set to `nan`s. @@ -37,10 +39,12 @@ An example of the usage of optional IDs is given in [Power Flow Example](./Power #### Steady state output and Short circuit output + | name | data type | unit | description | |-------------|-----------|------|------------------------------------------------------------------------------------------------------------------------------------| | `id` | `int32_t` | - | ID of a component, the ID should be unique across all components, e.g., you cannot have a node with `id=5` and a line with `id=5`. | | `energized` | `int8_t` | - | Indicates if a component is energized, i.e. connected to a source | + ## Node @@ -58,6 +62,7 @@ Physically a node can be a busbar, a joint, or other similar component. #### Steady state output + | name | data type | unit | description | |-----------|-------------------|----------------------------|-------------------------------------------------------------------------------------------------| | `u_pu` | `RealValueOutput` | - | per-unit voltage magnitude | @@ -65,9 +70,10 @@ Physically a node can be a busbar, a joint, or other similar component. | `u` | `RealValueOutput` | volt (V) | voltage magnitude, line-line for symmetric calculation, line-neutral for asymmetric calculation | | `p` | `RealValueOutput` | watt (W) | active power injection | | `q` | `RealValueOutput` | volt-ampere-reactive (var) | reactive power injection | + ```{note} -The `p` and `q` output of injection follows the `generator` reference direction as mentioned in +The `p` and `q` output of injection follows the `generator` reference direction as mentioned in [Reference Direction](data-model.md#reference-direction) ``` @@ -101,6 +107,7 @@ In this case, the attribute `from_status` and `to_status` is always 1. #### Steady state output + | name | data type | unit | description | |-----------|-------------------|----------------------------|------------------------------------------------------------| | `p_from` | `RealValueOutput` | watt (W) | active power flowing into the branch at from-side | @@ -112,6 +119,7 @@ In this case, the attribute `from_status` and `to_status` is always 1. | `i_to` | `RealValueOutput` | ampere (A) | magnitude of current at to-side | | `s_to` | `RealValueOutput` | volt-ampere (VA) | apparent power flowing at to-side | | `loading` | `double` | - | relative loading of the branch, `1.0` meaning 100% loaded. | + #### Short circuit output @@ -133,6 +141,7 @@ If `i_n` is not provided, `loading` of line will be a `nan` value. #### Input + | name | data type | unit | description | required | update | valid values | |--------|-----------|------------|----------------------------------------------------|:-----------------------------------------:|:--------:|:----------------------------------:| | `r1` | `double` | ohm (Ω) | positive-sequence serial resistance | ✔ | ❌ | `r1` and `x1` cannot be both `0.0` | @@ -144,6 +153,7 @@ If `i_n` is not provided, `loading` of line will be a `nan` value. | `c0` | `double` | farad (F) | zero-sequence shunt capacitance | ✨ only for asymmetric calculations | ❌ | | | `tan0` | `double` | - | zero-sequence shunt loss factor (tan δ) | ✨ only for asymmetric calculations | ❌ | | | `i_n` | `double` | ampere (A) | rated current | ❌ | ❌ | `> 0` | + ```{note} In case of short circuit calculations, the zero-sequence parameters are required only if any of the faults in any of the @@ -191,6 +201,7 @@ An example of usage of transformer is given in [Transformer Examples](../example #### Input + | name | data type | unit | description | required | update | valid values | |--------------------|-------------------------------------------------------------|------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:--------------------------------------------------------:|:--------:|:----------------------------------------------------------------------:| | `u1` | `double` | volt (V) | rated voltage at from-side | ✔ | ❌ | `> 0` | @@ -219,6 +230,7 @@ An example of usage of transformer is given in [Transformer Examples](../example | `x_grounding_from` | `double` | ohm (Ω) | grounding reactance at from-side, if relevant | ❌ default `0` | ❌ | | | `r_grounding_to` | `double` | ohm (Ω) | grounding resistance at to-side, if relevant | ❌ default `0` | ❌ | | | `x_grounding_to` | `double` | ohm (Ω) | grounding reactance at to-side, if relevant | ❌ default `0` | ❌ | | + ```{note} It can happen that `tap_min > tap_max`. @@ -276,6 +288,7 @@ using a `generic_branch`. #### Input + | name | data type | unit | description | required | update | valid values | |---------|-----------|------------------|-------------------------------|:----------------------:|:--------:|:------------:| | `r1` | `double` | ohm | positive-sequence resistance | ✔ | ❌ | | @@ -285,6 +298,7 @@ using a `generic_branch`. | `k` | `double` | - | off-nominal ratio | ❌ default `1.0` | ❌ | `> 0` | | `theta` | `double` | radian | angle shift | ❌ default `0.0` | ❌ | | | `sn` | `double` | volt-ampere (VA) | rated power | ❌ default `0.0` | ❌ | `>= 0` | + ```{note} The impedance (`r1`, `x1`) and admittance (`g1`, `b1`) attributes are calculated with reference to the "to" side of the @@ -347,6 +361,7 @@ $$ This representation holds for all values `r_aa` ... `r_nn`, `x_aa` ... `x_nn` and `c_aa` ... `c_cc`. If the neutral values are not provided, the last row and column from the above matrix are omitted. + | name | data type | unit | description | required | update | valid values | |--------|-----------|------------|-----------------------------------|------------------------------|:--------:|:------------:| | `r_aa` | `double` | ohm (Ω) | Series serial resistance aa | ✔ | ❌ | `> 0` | @@ -378,6 +393,7 @@ If the neutral values are not provided, the last row and column from the above m | `c0` | `double` | farad (F) | zero-sequence shunt capacitance | ✨ without a c matrix | ❌ | `> 0` | | `c1` | `double` | farad (F) | Series shunt capacitance | ✨ without a c matrix | ❌ | `> 0` | | `i_n` | `double` | ampere (A) | rated current | ❌ | ❌ | `> 0` | + For the r and x matrices providing values for the neutral phase is optional. To clarify which input values are required, please consult the tables below: @@ -480,6 +496,7 @@ In reality such switches may not exist. #### Steady state output + | name | data type | unit | description | |-----------|-------------------|----------------------------|------------------------------------------------------------| | `p_1` | `RealValueOutput` | watt (W) | active power flowing into the branch at side 1 | @@ -495,6 +512,7 @@ In reality such switches may not exist. | `i_3` | `RealValueOutput` | ampere (A) | current at side 3 | | `s_3` | `RealValueOutput` | volt-ampere (VA) | apparent power flowing at side 3 | | `loading` | `double` | - | relative loading of the branch, `1.0` meaning 100% loaded. | + #### Short circuit output @@ -516,6 +534,7 @@ An example of usage of three-winding transformer is given in #### Input + | name | data type | unit | description | required | update | valid values | |-----------------|-------------------------------------------------------------|------------------|-----------------------------------------------------------------------------------------------------------|:-------------------------------------------------------:|:--------:|:----------------------------------------------------------------------:| | `u1` | `double` | volt (V) | rated voltage at side 1 | ✔ | ❌ | `> 0` | @@ -561,6 +580,7 @@ An example of usage of three-winding transformer is given in | `x_grounding_2` | `double` | ohm (Ω) | grounding reactance at side 2, if relevant | ❌ default `0` | ❌ | | | `r_grounding_3` | `double` | ohm (Ω) | grounding resistance at side 3, if relevant | ❌ default `0` | ❌ | | | `x_grounding_3` | `double` | ohm (Ω) | grounding reactance at side 3, if relevant | ❌ default `0` | ❌ | | + ```{note} It can happen that `tap_min > tap_max`. @@ -621,6 +641,7 @@ The impedance is specified by convention as short circuit power. #### Input + | name | data type | unit | description | required | update | valid values | |---------------|-----------|------------------|----------------------------------------------------|:----------------------------:|:--------:|:------------:| | `u_ref` | `double` | - | reference voltage in per-unit | ✨ only for power flow | ✔ | `> 0` | @@ -628,6 +649,7 @@ The impedance is specified by convention as short circuit power. | `sk` | `double` | volt-ampere (VA) | short circuit power | ❌ default `1e10` | ✔ | `> 0` | | `rx_ratio` | `double` | - | R to X ratio | ❌ default `0.1` | ✔ | `>= 0` | | `z01_ratio` | `double` | - | zero-sequence to positive sequence impedance ratio | ❌ default `1.0` | ✔ | `> 0` | + #### Electric Model @@ -663,9 +685,11 @@ $$ `generic_load_gen` is an abstract load/generation [appliance](#appliance) which contains only the type of the load/generation with response to voltage. + | name | data type | unit | description | required | update | |--------|-------------------------------------------------------------|------|-------------------------------------------------|:--------:|:--------:| | `type` | {py:class}`LoadGenType ` | - | type of load/generator with response to voltage | ✔ | ❌ | + #### Load/Generator Concrete Types @@ -682,10 +706,12 @@ However, the reference direction and meaning of `RealValueInput` is different, a ##### Input + | name | data type | unit | description | required | update | |---------------|------------------|----------------------------|--------------------------|:----------------------------:|:--------:| | `p_specified` | `RealValueInput` | watt (W) | specified active power | ✨ only for power flow | ✔ | | `q_specified` | `RealValueInput` | volt-ampere-reactive (var) | specified reactive power | ✨ only for power flow | ✔ | + ##### Electric model @@ -724,12 +750,14 @@ It behaves similar to a load/generator with type `const_impedance`. #### Input + | name | data type | unit | description | required | update | |------|-----------|-------------|-------------------------------------|:----------------------------------------:|:--------:| | `g1` | `double` | siemens (S) | positive-sequence shunt conductance | ✔ | ✔ | | `b1` | `double` | siemens (S) | positive-sequence shunt susceptance | ✔ | ✔ | | `g0` | `double` | siemens (S) | zero-sequence shunt conductance | ✨ only for asymmetric calculation | ✔ | | `b0` | `double` | siemens (S) | zero-sequence shunt susceptance | ✨ only for asymmetric calculation | ✔ | + ```{note} In power-grid-model, shunts may also be used to introduce a ground reference in an otherwise floating grid. @@ -775,9 +803,11 @@ It measures the magnitude and (optionally) the angle of the voltage of a `node`. #### Input + | name | data type | unit | description | required | update | valid values | |-----------|-----------|----------|-----------------------------------------------------------------------------------------------------------------|:----------------------------------:|:--------:|:------------:| | `u_sigma` | `double` | volt (V) | standard deviation of the measurement error. Usually this is the absolute measurement error range divided by 3. | ✨ only for state estimation | ✔ | `> 0` | + #### Voltage Sensor Concrete Types @@ -793,10 +823,12 @@ In a `asym_voltage_sensor` the measured voltage is a 3-phase line-to-ground volt ##### Input + | name | data type | unit | description | required | update | valid values | |--------------------|------------------|----------|----------------------------------------------------------------------|:----------------------------------------------------------------------------------------------------------------:|:--------:|:------------:| | `u_measured` | `RealValueInput` | volt (V) | measured voltage magnitude | ✨ only for state estimation | ✔ | `> 0` | | `u_angle_measured` | `RealValueInput` | rad | measured voltage angle (only possible with phasor measurement units) | ✨ only for state estimation when a current sensor with `global_angle` `angle_measurement_type` is present | ✔ | | + ```{note} When a current sensor with `global_angle` `angle_measurement_type` is present there needs to be a voltage sensor with @@ -810,10 +842,12 @@ A sensor only has output for state estimation. For other calculation types, sensor output is undefined. ``` + | name | data type | unit | description | |--------------------|-------------------|----------|--------------------------------------------------------------------------------------------------------------------------| | `u_residual` | `RealValueOutput` | volt (V) | residual value between measured voltage magnitude and calculated voltage magnitude | | `u_angle_residual` | `RealValueOutput` | rad | residual value between measured voltage angle and calculated voltage angle (only possible with phasor measurement units) | + #### Electric Model @@ -866,10 +900,12 @@ However, such mixing of sensor types is allowed as long as they are on different ##### Input + | name | data type | unit | description | required | update | valid values | |--------------------------|-------------------------------------------------------------------------------|------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------:|:--------:|:----------------------------------------------------:| | `measured_terminal_type` | {py:class}`MeasuredTerminalType ` | - | indicate if it measures an `appliance` or a `branch` | ✔ | ❌ | the terminal type should match the `measured_object` | | `power_sigma` | `double` | volt-ampere (VA) | standard deviation of the measurement error. Usually this is the absolute measurement error range divided by 3. See [Power Sensor Concrete Types](#power-sensor-concrete-types). | ✨ in certain cases for state estimation. See the explanation for [concrete types](#power-sensor-concrete-types) below. | ✔ | `> 0` | + #### Power Sensor Concrete Types @@ -883,12 +919,14 @@ They share similar attributes: the meaning of `RealValueInput` is different, as ##### Input + | name | data type | unit | description | required | update | valid values | |--------------|------------------|----------------------------|--------------------------------------------------------------------------------------------------------------------------------|:-----------------------------------:|:--------:|:------------:| | `p_measured` | `RealValueInput` | watt (W) | measured active power | ✨ only for state estimation | ✔ | | | `q_measured` | `RealValueInput` | volt-ampere-reactive (var) | measured reactive power | ✨ only for state estimation | ✔ | | | `p_sigma` | `RealValueInput` | watt (W) | standard deviation of the active power measurement error. Usually this is the absolute measurement error range divided by 3. | ❌ see the explanation below. | ✔ | `> 0` | | `q_sigma` | `RealValueInput` | volt-ampere-reactive (var) | standard deviation of the reactive power measurement error. Usually this is the absolute measurement error range divided by 3. | ❌ see the explanation below. | ✔ | `> 0` | + Valid combinations of `power_sigma`, `p_sigma` and `q_sigma` are: @@ -910,6 +948,7 @@ measurement. 2. If neither `p_sigma` nor `q_sigma` are provided, `power_sigma` represents the standard deviation of the apparent power. In this case, infinite value of `power_sigma` disables the entire measurement. + 3. Providing only one of `p_sigma` and `q_sigma` results in undefined behaviour. ``` @@ -925,10 +964,12 @@ A sensor only has output for state estimation. For other calculation types, sensor output is undefined. ``` + | name | data type | unit | description | |--------------|-------------------|----------------------------|------------------------------------------------------------------------------| | `p_residual` | `RealValueOutput` | watt (W) | residual value between measured active power and calculated active power | | `q_residual` | `RealValueOutput` | volt-ampere-reactive (var) | residual value between measured reactive power and calculated reactive power | + #### Electric Model @@ -967,12 +1008,14 @@ However, such mixing of sensor types is allowed as long as they are on different ##### Input + | name | data type | unit | description | required | update | valid values | |--------------------------|-------------------------------------------------------------------------------|------------|-------------------------------------------------------------------------------------------------------------------------------------------|:----------------------------------:|:--------:|:----------------------------------------------------:| | `measured_terminal_type` | {py:class}`MeasuredTerminalType ` | - | indicate the side of the `branch` | ✔ | ❌ | the terminal type should match the `measured_object` | | `angle_measurement_type` | {py:class}`AngleMeasurementType ` | - | indicate whether the measured angle is a global angle or a local angle; (see the [electric model](#local-angle-current-sensors) below) | ✔ | ❌ | | | `i_sigma` | `double` | ampere (A) | standard deviation of the current (`i`) measurement error. Usually this is the absolute measurement error range divided by 3. | ✨ only for state estimation | ✔ | `> 0` | | `i_angle_sigma` | `double` | rad | standard deviation of the current (`i`) phase angle measurement error. Usually this is the absolute measurement error range divided by 3. | ✨ only for state estimation | ✔ | `> 0` | + #### Current Sensor Concrete Types @@ -986,10 +1029,12 @@ They share similar attributes: the meaning of `RealValueInput` is different, as ##### Input + | name | data type | unit | description | required | update | |--------------------|------------------|------------|---------------------------------------------------------------------------------------------------------|:----------------------------------:|:--------:| | `i_measured` | `RealValueInput` | ampere (A) | measured current (`i`) magnitude | ✨ only for state estimation | ✔ | | `i_angle_measured` | `RealValueInput` | rad | measured phase angle of the current (`i`; see the [electric model](#local-angle-current-sensors) below) | ✨ only for state estimation | ✔ | + See the documentation on [state estimation calculation methods](calculations.md#state-estimation-algorithms) for details per method on how the variances are taken into account for both the global and local angle measurement types and for the @@ -1007,10 +1052,12 @@ A sensor only has output for state estimation. For other calculation types, sensor output is undefined. ``` + | name | data type | unit | description | |--------------------|-------------------|------------|---------------------------------------------------------------------------------------------| | `i_residual` | `RealValueOutput` | ampere (A) | residual value between measured current (`i`) and calculated current (`i`) | | `i_angle_residual` | `RealValueOutput` | rad | residual value between measured phase angle and calculated phase angle of the current (`i`) | + #### Electric Model @@ -1078,6 +1125,7 @@ A fault can only happen at a `node`. #### Input + | name | data type | unit | description | required | update | valid values | |----------------|-----------------------------------------------------------|---------|-----------------------------------------------------|:-------------------------------------------------------------------------------------------------------:|:--------:|:-----------------:| | `status` | `int8_t` | - | whether the fault is active | ✔ | ✔ | `0` or `1` | @@ -1086,6 +1134,7 @@ A fault can only happen at a `node`. | `fault_object` | `int32_t` | - | ID of the component where the short circuit happens | ✔ | ✔ | A valid `node` ID | | `r_f` | `double` | ohm (Ω) | short circuit resistance | ❌ default `0.0` | ✔ | | | `x_f` | `double` | ohm (Ω) | short circuit reactance | ❌ default `0.0` | ✔ | | + ```{note} Multiple faults may exist within one calculation. @@ -1119,12 +1168,14 @@ In case the `fault_phase` is not specified or is equal to `FaultPhase.default_va `fault_type`-dependent set of fault phases. The supported values of `fault_phase`, as well as its default value, are listed in the table below. + | `fault_type` | supported values of `fault_phase` | `FaultPhase.default_value` | description | |------------------------------------|---------------------------------------------------|----------------------------|------------------------------------------------------------------------| | `FaultType.three_phase` | `FaultPhase.abc` | `FaultPhase.abc` | Three phases are connected with fault impedance. | | `FaultType.single_phase_to_ground` | `FaultPhase.a`, `FaultPhase.b`, `FaultPhase.c` | `FaultPhase.a` | One phase is grounded with fault impedance, and other phases are open. | | `FaultType.two_phase` | `FaultPhase.bc`, `FaultPhase.ac`, `FaultPhase.ab` | `FaultPhase.bc` | Two phases are connected with fault impedance. | | `FaultType.two_phase_to_ground` | `FaultPhase.bc`, `FaultPhase.ac`, `FaultPhase.ab` | `FaultPhase.bc` | Two phases are connected with fault impedance then grounded. | + ## Regulator @@ -1137,10 +1188,12 @@ Which object types are supported as `regulated_object` is regulator type-depende #### Input + | name | data type | unit | description | required | update | valid values | |--------------------|-----------|------|-------------------------------------------|:--------:|:--------:|:---------------------------:| | `regulated_object` | `int32_t` | - | ID of the regulated object | ✔ | ❌ | a valid regulated object ID | | `status` | `int8_t` | - | connection status to the regulated object | ✔ | ✔ | `0` or `1` | + ### Transformer tap regulator @@ -1167,6 +1220,7 @@ The actual grid state is not changed after calculations are done. #### Input + | name | data type | unit | description | required | update | valid values | |----------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------|---------------------------------------------------------------------------------------------------------|:----------------------------:|:--------:|:----------------------------------------------------------------:| | `control_side` | {py:class}`BranchSide ` if the regulated object is a [transformer](#transformer) and {py:class}`Branch3Side ` if it the regulated object is a [Three-Winding Transformer](#three-winding-transformer) | - | the controlled side of the transformer | ✨ only for power flow | ❌ | `control_side` should be the relatively further side to a source | @@ -1174,6 +1228,7 @@ The actual grid state is not changed after calculations are done. | `u_band` | `double` | volt (V) | the width of the voltage band ($=2*\left(\Delta U\right)_{\text{acceptable}}$) | ✨ only for power flow | ✔ | `> 0` (see below) | | `line_drop_compensation_r` | `double` | ohm (Ω) | compensation for voltage drop due to resistance during transport (see [below](#line-drop-compensation)) | ❌ default `0.0` | ✔ | `>= 0` | | `line_drop_compensation_x` | `double` | ohm (Ω) | compensation for voltage drop due to reactance during transport (see [below](#line-drop-compensation)) | ❌ default `0.0` | ✔ | `>= 0` | + The following additional requirements exist on the input parameters. @@ -1284,18 +1339,22 @@ the voltage regulator should operate at the limit and the voltage may deviate fr #### Input + | name | data type | unit | description | required | update | valid values | | -------- | --------- | -------------------------- | --------------------------------------------------- | :--------------------------: | :------: | :----------: | | `u_ref` | `double` | - | reference voltage in per-unit at the generator node | ✨ only for power flow | ✔ | `> 0` | | `q_min` | `double` | volt-ampere-reactive (var) | minimum reactive power limit of the generator | ❌ | ✔ | | | `q_max` | `double` | volt-ampere-reactive (var) | maximum reactive power limit of the generator | ❌ | ✔ | | + #### Steady state output + | name | data type | unit | description | | ----------------- | ----------------- | -------------------------- | -------------------------------------------------------------------- | | `q` | `RealValueOutput` | volt-ampere-reactive (var) | reactive power provided by the voltage regulator | | `limit_violated` | `int8_t` | - | reactive power limit violation indicator (not yet fully implemented) | + #### Short circuit output diff --git a/docs/user_manual/data-model.md b/docs/user_manual/data-model.md index 64b2c0e55a..6778a04388 100644 --- a/docs/user_manual/data-model.md +++ b/docs/user_manual/data-model.md @@ -14,6 +14,7 @@ The components types are organized in an inheritance-like hierarchy. A sub-type has all the attributes from its parent type. The hierarchy tree of the component types is shown below. + ```{mermaid} graph LR base-->node @@ -43,6 +44,7 @@ graph LR classDef green fill:#9f6,stroke:#333,stroke-width:2px class node,line,link,generic_branch,transformer,three_winding_transformer,source,shunt,sym_load,sym_gen,asym_load,asym_gen,sym_voltage_sensor,asym_voltage_sensor,sym_power_sensor,asym_power_sensor green ``` + ```{note} The type names in the hierarchy are exactly the same as the component type names in diff --git a/docs/user_manual/dataset-terminology.md b/docs/user_manual/dataset-terminology.md index d0212ecded..2ae8ad8f21 100644 --- a/docs/user_manual/dataset-terminology.md +++ b/docs/user_manual/dataset-terminology.md @@ -204,12 +204,14 @@ graph TD The dimensions of numpy arrays and the interpretation of each dimension is as follows. + | **Data Type** | **1D** | **2D** | **3D** | | ------------------- | -------------------------------- | ---------------------------------------------------- | -------------------------------------------------------------------------- | | **SingleArray** | Corresponds to a single dataset. | ❌ | ❌ | | **DenseBatchArray** | ❌ | Batch number $\times$ Component within that batch | ❌ | | **SingleColumn** | Component within that batch. | Component within that batch $\times$ Phases ✨ | ❌ | | **BatchColumn** | ❌ | Batch number $\times$ Component within that batch | Batch number $\times$ Component within that batch $\times$ Phases ✨ | + ```{note} ✨ The "Phases" dimension is optional and is available only when the attributes are asymmetric. @@ -281,6 +283,7 @@ The batch size is the number of scenarios. ## Attributes of Components + | Attribute | Description | | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | name | Name of the attribute. It is exactly the same as the attribute name in `power_grid_model.power_grid_meta_data`. They are included under the enum {py:class}`AttributeType `. | @@ -292,3 +295,4 @@ The batch size is the number of scenarios. | required | Whether the attribute is required. If not, then it is optional. Note if you choose not to specify an optional attribute, it should have the null value as defined in [](../advanced_documentation/native-data-interface.md#basic-data-types). | | update | Whether the attribute can be mutated by the update call `PowerGridModel.update` on an existing instance, only applicable when this attribute is part of an input dataset. | | valid values | Whether applicable or not; an indication of value validity for the input data. | + diff --git a/docs/user_manual/model-validation.md b/docs/user_manual/model-validation.md index 6a7be1d762..5dec22a828 100644 --- a/docs/user_manual/model-validation.md +++ b/docs/user_manual/model-validation.md @@ -221,7 +221,7 @@ The circuit diagram is as follows (The node 6 is same in both lines): Gen(_22)---|_2--transformer(_31)--|_4 |_5-------line(_15)----|_6 | shunt(_29)---| shunt(_28)---|-load(_24) - + |----line(_16)-------| |---line(_19)---|_9---transformer(_32)---|_11---source(_20) | |---line(_18)---| diff --git a/docs/user_manual/non-pgm-components.md b/docs/user_manual/non-pgm-components.md index 403edd6e90..c8a6043f28 100644 --- a/docs/user_manual/non-pgm-components.md +++ b/docs/user_manual/non-pgm-components.md @@ -20,7 +20,7 @@ New contributions and ideas for modeling grid components are very welcome! ## Ideal transformer -An ideal transformer can be modeled as a [link](./components.md#link). +An ideal transformer can be modeled as a [link](./components.md#link). To this end, it is explicitly allowed to place a link between two different voltage levels. Trivially, no additional electrical parameters need to be specified. diff --git a/package-lock.json b/package-lock.json index 9189203a2e..4e547883f7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,14 +5,13 @@ "packages": { "": { "devDependencies": { - "@biomejs/biome": "*", - "markdownlint-cli": "*" + "@biomejs/biome": "*" } }, "node_modules/@biomejs/biome": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.5.4.tgz", - "integrity": "sha512-xy5FNE5kQJKyK5MR1gJy6ztXYx4WBAbYGlK04lMEgmyPRWKybY9NFwiG9yo0XdzOU8Xvhj41u034J1ywfoWfMw==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.5.6.tgz", + "integrity": "sha512-lxVNjv7UF6KfhMJfL9gaUHbWdJdHbsAj6OSmwSYNdhRuG67NxNQ4Xdvh3TUxsSK9sBzJBQhEJj3AopmmNJ5pSA==", "dev": true, "license": "MIT OR Apache-2.0", "bin": { @@ -26,20 +25,20 @@ "url": "https://opencollective.com/biome" }, "optionalDependencies": { - "@biomejs/cli-darwin-arm64": "2.5.4", - "@biomejs/cli-darwin-x64": "2.5.4", - "@biomejs/cli-linux-arm64": "2.5.4", - "@biomejs/cli-linux-arm64-musl": "2.5.4", - "@biomejs/cli-linux-x64": "2.5.4", - "@biomejs/cli-linux-x64-musl": "2.5.4", - "@biomejs/cli-win32-arm64": "2.5.4", - "@biomejs/cli-win32-x64": "2.5.4" + "@biomejs/cli-darwin-arm64": "2.5.6", + "@biomejs/cli-darwin-x64": "2.5.6", + "@biomejs/cli-linux-arm64": "2.5.6", + "@biomejs/cli-linux-arm64-musl": "2.5.6", + "@biomejs/cli-linux-x64": "2.5.6", + "@biomejs/cli-linux-x64-musl": "2.5.6", + "@biomejs/cli-win32-arm64": "2.5.6", + "@biomejs/cli-win32-x64": "2.5.6" } }, "node_modules/@biomejs/cli-darwin-arm64": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.5.4.tgz", - "integrity": "sha512-4o3NFRobXHynkgcFVrlZsoDAFtF2ldlEGN8sORSws5ZQqyY4PXnPUIylu4ksfyHuwkfvDREuWh3JK+niRwGq3w==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.5.6.tgz", + "integrity": "sha512-zMOLZP4oMrjh6m1zcSj1ud2awUPgTuMVbmQhYYWL7J8HwCnbHHBvTm7VBTRuY7epT5bez76IpKYQ11ZAqHFlnw==", "cpu": [ "arm64" ], @@ -54,9 +53,9 @@ } }, "node_modules/@biomejs/cli-darwin-x64": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.5.4.tgz", - "integrity": "sha512-D32P5HkU2Y6PySuC/WsVDTOgsDwVFmujzhhhOQjajtATpVWFDXuVd3oRbsWNSEA+aaFzyzZm22szsyydBYlSyQ==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.5.6.tgz", + "integrity": "sha512-JAC1VqzvO7Th5ZplU0G2uGfkZbxEe9uDDektPAhF0JLusoz1w+T4okp2bkykI0bbaO2vslKiRfj4gU43JaGreA==", "cpu": [ "x64" ], @@ -71,9 +70,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.5.4.tgz", - "integrity": "sha512-pSEfW7B8kTsXUjUxC1xVVK+y85Ht3C5XxZ9gclmC7/3Ku9Vqz8jmI7k0p/BNIjQ6t4sFERI2sFeH73ybiZl6YQ==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.5.6.tgz", + "integrity": "sha512-6XsYwCFkp5sMxl85ffhgeGpGgs6A7dRYFnkceZ7WVxvycuTnGdD5xa534Z3xfrBQ0JCMK/mujT6ZNPJoghedwg==", "cpu": [ "arm64" ], @@ -88,9 +87,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64-musl": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.5.4.tgz", - "integrity": "sha512-Rpm5/AT1m+DlJmUoYvS4/vXc+0tXJPJ2NQz25TGPyHVF5JrWy75PE0GH6kVxsKtQDuCH4OgzquZq0R4kj/wCVg==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.5.6.tgz", + "integrity": "sha512-eUa3jeeYvfMt19LBeh6E5PUZpxnTC4JqNWo+EDjTtQjAr2xLGnWaxACtVU1DQqmHYbvThlJzLX+ZsYgrqh2qVw==", "cpu": [ "arm64" ], @@ -105,9 +104,9 @@ } }, "node_modules/@biomejs/cli-linux-x64": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.5.4.tgz", - "integrity": "sha512-FNxojWJkL7EajAuzBgoLe0T2G0y112M4lBrDIFl/DomFTx8yqenYOIdsRLNXvOvBBofE8hJi85LjzLmBDpY7/Q==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.5.6.tgz", + "integrity": "sha512-Pop9VXCFUhFTMfFefZ39S+u2rOPyNp5iHlxbZRwXGACHLy2r0jjiRgJHmaEKJzL3SyxlVeGShXhvvElvWowonA==", "cpu": [ "x64" ], @@ -122,9 +121,9 @@ } }, "node_modules/@biomejs/cli-linux-x64-musl": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.5.4.tgz", - "integrity": "sha512-aby/PohmmgbShcHqFsZVzG8H6D98+P+A6xRWRrQcLW1pCjabcov5UUlke4UqNQBYTkDQav+jB4zyyDDeKB2GaA==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.5.6.tgz", + "integrity": "sha512-2Vp13QdKysH3HIWLaYLhUUwbK+jbZonJD1K+Lr0d0RO4wH7mkYd43vJixEDm8cUWrowoRz4UUHF1nm9Ae7ym8A==", "cpu": [ "x64" ], @@ -139,9 +138,9 @@ } }, "node_modules/@biomejs/cli-win32-arm64": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.5.4.tgz", - "integrity": "sha512-emoXexPZIPAZkz2RKmA95WJUqK3I5MJNYtwEbL5ESciRzhmFMMyekDhNG8hpeOaK+ZGRDxAU4wvGuA5IHQ0h0w==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.5.6.tgz", + "integrity": "sha512-tDGshcm6BdkZOCGnTDX0Y8/U4IfBSlnUU7T56nNDuPEfed+aHg+u8G36NB43fJVl0Os6+QURXIE1yuD7AaEofA==", "cpu": [ "arm64" ], @@ -156,9 +155,9 @@ } }, "node_modules/@biomejs/cli-win32-x64": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.5.4.tgz", - "integrity": "sha512-U1jaluLw1qQc2Tx7/CeSoL9N5XcqIH+GWjpUAy1ouB5nVjSCMNO+NNHdY3RAs8zxNurLWAdj6pehQdCA2zyU+Q==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.5.6.tgz", + "integrity": "sha512-WN05KwXnTO/2J45RQPvzZMXf7tZUIofHoR35xIPfCo7pQ2RFidxI8sfb5mGsaTxdMmEOzHzOPRCdA5/fCpc7xQ==", "cpu": [ "x64" ], @@ -171,1185 +170,6 @@ "engines": { "node": ">=14.21.3" } - }, - "node_modules/@types/debug": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", - "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/katex": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.8.tgz", - "integrity": "sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "dev": true, - "license": "MIT" - }, - "node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/brace-expansion": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", - "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-reference-invalid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/commander": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-15.0.0.tgz", - "integrity": "sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=22.12.0" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decode-named-character-reference": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", - "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "character-entities": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/get-east-asian-width": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", - "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ignore": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.6.tgz", - "integrity": "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/ini": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-7.0.0.tgz", - "integrity": "sha512-ifK0CgjALofS5bkrcTy4RaQ9Vx2Knf/eLeIO+NaswQEpH1UblrtTSCIvN71qQDMq0PeQ/SSPojvEJp9vvvfr+w==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^22.22.2 || ^24.15.0 || >=26.0.0" - } - }, - "node_modules/is-alphabetical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", - "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-alphanumerical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", - "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-alphabetical": "^2.0.0", - "is-decimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-decimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", - "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-hexadecimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", - "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/js-yaml": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-5.2.1.tgz", - "integrity": "sha512-zfLtNfQqxVqq3uaTqSkh4x4hZw3KHobGUA0fJUj4wawW8bsQLTVqpHdXSIzidh7o+4lEW36tANuAGdaFx6Zgnw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/puzrin" - }, - { - "type": "github", - "url": "https://github.com/sponsors/nodeca" - } - ], - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.mjs" - } - }, - "node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/jsonpointer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", - "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/katex": { - "version": "0.16.47", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.47.tgz", - "integrity": "sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==", - "dev": true, - "funding": [ - "https://opencollective.com/katex", - "https://github.com/sponsors/katex" - ], - "license": "MIT", - "dependencies": { - "commander": "^8.3.0" - }, - "bin": { - "katex": "cli.js" - } - }, - "node_modules/katex/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/linkify-it": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.2.tgz", - "integrity": "sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/puzrin" - }, - { - "type": "github", - "url": "https://github.com/sponsors/markdown-it" - } - ], - "license": "MIT", - "dependencies": { - "uc.micro": "^2.0.0" - } - }, - "node_modules/markdown-it": { - "version": "14.3.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.3.0.tgz", - "integrity": "sha512-RCEsPjR+sr0x+AuYp601tKTkgFG4YEPLCzHST3cQ/fhlJkqAkz1L2/Qbp1j9qw5SBwQHFBoW8+hoN5xssOF0Tw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/puzrin" - }, - { - "type": "github", - "url": "https://github.com/sponsors/markdown-it" - } - ], - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1", - "entities": "^4.5.0", - "linkify-it": "^5.0.2", - "mdurl": "^2.0.0", - "punycode.js": "^2.3.1", - "uc.micro": "^2.1.0" - }, - "bin": { - "markdown-it": "bin/markdown-it.mjs" - } - }, - "node_modules/markdownlint": { - "version": "0.41.1", - "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.41.1.tgz", - "integrity": "sha512-qHKeU2E1bdyNAT077go2FVTNXvYcktN5IHtF6XyeD1l0PClxzSp2tUApAV14ORI8DGX4H9bNKZEzelZp4qn8IA==", - "dev": true, - "license": "MIT", - "dependencies": { - "micromark": "4.0.2", - "micromark-core-commonmark": "2.0.3", - "micromark-extension-directive": "4.0.0", - "micromark-extension-gfm-autolink-literal": "2.1.0", - "micromark-extension-gfm-footnote": "2.1.0", - "micromark-extension-gfm-table": "2.1.1", - "micromark-extension-math": "3.1.0", - "micromark-util-types": "2.0.2", - "string-width": "8.2.1" - }, - "engines": { - "node": ">=22" - }, - "funding": { - "url": "https://github.com/sponsors/DavidAnson" - } - }, - "node_modules/markdownlint-cli": { - "version": "0.49.1", - "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.49.1.tgz", - "integrity": "sha512-qpYqJbSYf3jv57bdnFmCaZ/Wlu6IYHp2b6SOKrKBJ7OnPrDHIKmx4NERWH49QH9viTI6yO6raVDDn5nrf60VQQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "commander": "~15.0.0", - "deep-extend": "~0.6.0", - "ignore": "~7.0.6", - "js-yaml": "~5.2.1", - "jsonc-parser": "~3.3.1", - "jsonpointer": "~5.0.1", - "markdown-it": "~14.3.0", - "markdownlint": "~0.41.1", - "minimatch": "~10.2.5", - "run-con": "~1.3.3", - "smol-toml": "~1.7.0", - "tinyglobby": "~0.2.17" - }, - "bin": { - "markdownlint": "markdownlint.js" - }, - "engines": { - "node": ">=22" - } - }, - "node_modules/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", - "dev": true, - "license": "MIT" - }, - "node_modules/micromark": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", - "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", - "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-destination": "^2.0.0", - "micromark-factory-label": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-title": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-html-tag-name": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-directive": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-4.0.0.tgz", - "integrity": "sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "parse-entities": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", - "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", - "dev": true, - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-footnote": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", - "dev": true, - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-table": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", - "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", - "dev": true, - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-math": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-3.1.0.tgz", - "integrity": "sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/katex": "^0.16.0", - "devlop": "^1.0.0", - "katex": "^0.16.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-factory-destination": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", - "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-label": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", - "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-title": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", - "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-whitespace": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", - "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-chunked": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", - "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-classify-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", - "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-combine-extensions": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", - "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", - "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-encode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", - "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-html-tag-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", - "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-normalize-identifier": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", - "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-resolve-all": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", - "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", - "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-subtokenize": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", - "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", - "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.5" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/parse-entities": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", - "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "character-entities-legacy": "^3.0.0", - "character-reference-invalid": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0", - "is-hexadecimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/picomatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", - "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/punycode.js": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", - "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/run-con": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/run-con/-/run-con-1.3.3.tgz", - "integrity": "sha512-Lb7OKM9aaykzyoNiHGhSVCjZsvbyy6qDMp2vDXL+MoCfz3GfNJtHYH7uYsU3QNMyInBk++xx+EZ8xZ8Sxs5fNQ==", - "dev": true, - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~7.0.0", - "minimist": "^1.2.8", - "strip-json-comments": "~3.1.1" - }, - "bin": { - "run-con": "cli.js" - } - }, - "node_modules/smol-toml": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.7.0.tgz", - "integrity": "sha512-aqVvWoyO21L23mb+drl4RmMXbf6N7FdHjAhTRA9ZBL7apWBgfWC16KjrASI+1p9GAroljyMHj6fK67i0UiTNvQ==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 18" - }, - "funding": { - "url": "https://github.com/sponsors/cyyynthia" - } - }, - "node_modules/string-width": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.1.tgz", - "integrity": "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-east-asian-width": "^1.5.0", - "strip-ansi": "^7.1.2" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", - "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/uc.micro": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", - "dev": true, - "license": "MIT" } } } diff --git a/package.json b/package.json index 12899060a1..b135b3273c 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,6 @@ { "private": true, "devDependencies": { - "@biomejs/biome": "*", - "markdownlint-cli": "*" + "@biomejs/biome": "*" } } diff --git a/pyproject.toml b/pyproject.toml index 03e7474384..d5464e55f7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,7 +30,9 @@ classifiers = [ "Topic :: Scientific/Engineering :: Physics", ] requires-python = ">=3.12" -dependencies = ["numpy>=2.0.0"] +dependencies = [ + "numpy>=2.0.0", +] dynamic = ["version"] [dependency-groups] @@ -41,9 +43,11 @@ lint = [ "pre-commit", "ruff", "mypy", - "numpy", # needed for mypy - "gersemi", # CMake linter - "clang-format ~= 18.0", # C++ formatter + "numpy", # needed for mypy + "gersemi", # CMake linter + "clang-format ~= 18.0", # C/C++ formatter + "pymarkdownlnt", # Markdown linter + "reuse[charset-normalizer,chardet]", # license check ] example = ["ipykernel"] @@ -80,6 +84,9 @@ Discussion = "https://github.com/orgs/PowerGridModel/discussions" [project.entry-points."cmake.root"] power_grid_model = "power_grid_model._core.power_grid_model_c" +[tool.uv] +exclude-newer = "7 days" + [tool.scikit-build] logging.level = "INFO" @@ -197,6 +204,13 @@ show_column_numbers = true non_interactive = true install_types = true +[tool.pymarkdown] +plugins.heading-increment.enabled = false +plugins.no-duplicate-heading.enabled = false +plugins.line-length.line_length = 120 +plugins.line-length.heading_line_length = 120 +plugins.line-length.code_block_line_length = 120 + # CI build options [tool.cibuildwheel] build-frontend = "build[uv]" diff --git a/tests/data/power_flow/generic_branch/README.md b/tests/data/power_flow/generic_branch/README.md index 1f2d46cc05..76b0929a4d 100644 --- a/tests/data/power_flow/generic_branch/README.md +++ b/tests/data/power_flow/generic_branch/README.md @@ -11,5 +11,5 @@ Test case for validation of the generic_branch component for symmetrical power f The circuit diagram is as follows: ```txt -source_4--node_1--generic_branch_3--node_2--load_5 +source_4--node_1--generic_branch_3--node_2--load_5 ``` diff --git a/uv.lock b/uv.lock index 63605ee1e8..9798c2966d 100644 --- a/uv.lock +++ b/uv.lock @@ -13,6 +13,10 @@ resolution-markers = [ "python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] +[options] +exclude-newer = "0001-01-01T00:00:00Z" # This has no effect and is included for backwards compatibility when using relative exclude-newer values. +exclude-newer-span = "P7D" + [[package]] name = "alabaster" version = "1.0.0" @@ -22,6 +26,34 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b", size = 13929, upload-time = "2024-07-26T18:15:02.05Z" }, ] +[[package]] +name = "application-file-scanner" +version = "0.6.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "py-walk" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ea/22/e872546d298103527380955f51191ff87cd178e6aac62bb87de73c3e074f/application_file_scanner-0.6.4.tar.gz", hash = "sha256:581c48c5017345747be7f49507da84fec36d1f7b4f67003e9fbaf2f0bc6a3f66", size = 28540, upload-time = "2026-01-19T23:32:15.695Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/83/e9a5a14c1b6c20ad44abcdb7bb2f34d860aa4f4ee64c526247066b6c42fb/application_file_scanner-0.6.4-py3-none-any.whl", hash = "sha256:49c211c60f1932812477facc38701d58037b07b031fdb6a6061fdee3fd53e35f", size = 15445, upload-time = "2026-01-19T23:32:14.4Z" }, +] + +[[package]] +name = "application-properties" +version = "0.9.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyjson5" }, + { name = "pyyaml" }, + { name = "tomli" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/bb/321da0e373416080801d05b8dd9c0a8da77fe305c697adf8c025470ce170/application_properties-0.9.3.tar.gz", hash = "sha256:7dc7d8f23d11e539427e7b8e3afa70353e159c16f703bad6dd082cc6cdfeeaa8", size = 43304, upload-time = "2026-06-02T03:52:07.6Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/72/3ac1bda73e9c95444b1e13a0de73e847048a776e5ac5b3977c37f04167f9/application_properties-0.9.3-py3-none-any.whl", hash = "sha256:32dbd62b3fb657ec1c7fdc352590463c2ffd14950ffd258a5c091e8798d8aec0", size = 24595, upload-time = "2026-06-02T03:52:06.416Z" }, +] + [[package]] name = "appnope" version = "0.1.4" @@ -108,6 +140,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl", hash = "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35", size = 10196845, upload-time = "2026-02-01T12:30:53.445Z" }, ] +[[package]] +name = "boolean-py" +version = "5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c4/cf/85379f13b76f3a69bca86b60237978af17d6aa0bc5998978c3b8cf05abb2/boolean_py-5.0.tar.gz", hash = "sha256:60cbc4bad079753721d32649545505362c754e121570ada4658b852a3a318d95", size = 37047, upload-time = "2025-04-03T10:39:49.734Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/ca/78d423b324b8d77900030fa59c4aa9054261ef0925631cd2501dd015b7b7/boolean_py-5.0-py3-none-any.whl", hash = "sha256:ef28a70bd43115208441b53a045d1549e2f0ec6e3d08a9d142cbc41c1938e8d9", size = 26577, upload-time = "2025-04-03T10:39:48.449Z" }, +] + [[package]] name = "breathe" version = "4.36.0" @@ -122,11 +163,11 @@ wheels = [ [[package]] name = "certifi" -version = "2026.6.17" +version = "2026.7.22" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c9/c7/424b75da314c1045981bd9777432fad05a9e0c69daa4ed7e308bbaffe405/certifi-2026.6.17.tar.gz", hash = "sha256:024c88eeec92ca068db80f02b8b07c9cef7b9fe261d1d535abfd5abd6f6af432", size = 134594, upload-time = "2026-06-17T10:31:07.894Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/c2/24167ea9858356b47a87a50d39908bfdb72ceeefe0041586e704e5376b3a/certifi-2026.7.22.tar.gz", hash = "sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55", size = 138112, upload-time = "2026-07-22T03:35:12.644Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/2f/c5464532e965badff2f4c4c1a3a83f5697f0d7c407ed0cda44aaa99bb451/certifi-2026.6.17-py3-none-any.whl", hash = "sha256:2227dcbaafe0d2f59279d1762ddddc37783ed4354594f194ffc31d20f41fc3db", size = 133289, upload-time = "2026-06-17T10:31:06.348Z" }, + { url = "https://files.pythonhosted.org/packages/0b/a7/71ac2cff56fec219ed242bb11b8efb69fcc4bec75db06fb7bfe35de520e6/certifi-2026.7.22-py3-none-any.whl", hash = "sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775", size = 136983, upload-time = "2026-07-22T03:35:11.276Z" }, ] [[package]] @@ -134,7 +175,7 @@ name = "cffi" version = "2.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pycparser", marker = "implementation_name != 'PyPy'" }, + { name = "pycparser" }, ] sdist = { url = "https://files.pythonhosted.org/packages/57/5f/ff100cae70ebe9d8df1c01a00e510e45d9adb5c1fdda84791b199141de97/cffi-2.1.0.tar.gz", hash = "sha256:efc1cdd798b1aaf39b4610bba7aad28c9bea9b910f25c784ccf9ec1fa719d1f9", size = 531036, upload-time = "2026-07-06T21:34:30.382Z" } wheels = [ @@ -223,6 +264,37 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl", hash = "sha256:a8dc6b26ad22ff227d2634a65cb388215ce6cc96bbcc5cfde7641ae87e8dacc0", size = 7445, upload-time = "2025-11-19T20:55:50.744Z" }, ] +[[package]] +name = "chardet" +version = "7.4.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/19/b6/9df434a8eeba2e6628c465a1dfa31034228ef79b26f76f46278f4ef7e49d/chardet-7.4.3.tar.gz", hash = "sha256:cc1d4eb92a4ec1c2df3b490836ffa46922e599d34ce0bb75cf41fd2bf6303d56", size = 784800, upload-time = "2026-04-13T21:33:39.803Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/61/33/29de185079e6675c3f375546e30a559b7ddc75ce972f18d6e566cd9ea4eb/chardet-7.4.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:75d3c65cc16bddf40b8da1fd25ba84fca5f8070f2b14e86083653c1c85aee971", size = 874870, upload-time = "2026-04-13T21:33:05.977Z" }, + { url = "https://files.pythonhosted.org/packages/9c/2f/4c5af01fd1a7506a1d5375403d68925eac70289229492db5aa68b58103d8/chardet-7.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:29af5999f654e8729d251f1724a62b538b1262d9292cccaefddf8a02aae1ef6a", size = 854859, upload-time = "2026-04-13T21:33:07.381Z" }, + { url = "https://files.pythonhosted.org/packages/36/21/edb36ad5dfa48d7f8eed97ab43931ecdaa8c15166c21b1d614967e49d681/chardet-7.4.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:626f00299ad62dfe937058a09572beed442ccc7b58f87aa667949b20fd3db235", size = 875032, upload-time = "2026-04-13T21:33:08.741Z" }, + { url = "https://files.pythonhosted.org/packages/e5/59/a32a241d861cf180853a11c8e5a67641cb1b2af13c3a5ccce83ec07e2c9f/chardet-7.4.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9a4904dd5f071b7a7d7f50b4a67a86db3c902d243bf31708f1d5cde2f68239cb", size = 888283, upload-time = "2026-04-13T21:33:10.213Z" }, + { url = "https://files.pythonhosted.org/packages/87/2e/e1ee6a77abf3782c00e05b89c4d4328c8353bf9500661c4348df1dd68614/chardet-7.4.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5d2879598bc220689e8ce509fe9c3f37ad2fca53a36be9c9bd91abdd91dd364f", size = 879974, upload-time = "2026-04-13T21:33:11.448Z" }, + { url = "https://files.pythonhosted.org/packages/32/60/fca69c534602a7ced04280c952a246ad1edde2a6ca3a164f65d32ac41fe7/chardet-7.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:4b2799bd58e7245cfa8d4ab2e8ad1d76a5c3a5b1f32318eb6acca4c69a3e7101", size = 943973, upload-time = "2026-04-13T21:33:12.756Z" }, + { url = "https://files.pythonhosted.org/packages/7c/43/79ac9b4db5bc87020c9dbc419125371d80882d1d197e9c4765ba8682b605/chardet-7.4.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a9e4486df251b8962e86ea9f139ca235aa6e0542a00f7844c9a04160afb99aa9", size = 873769, upload-time = "2026-04-13T21:33:14.002Z" }, + { url = "https://files.pythonhosted.org/packages/55/5f/25bdec773905bff0ff6cf35ca73b17bd05593b4f87bd8c5fa43705f7167d/chardet-7.4.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4fbff1907925b0c5a1064cffb5e040cd5e338585c9c552625f30de6bc2f3107a", size = 853991, upload-time = "2026-04-13T21:33:15.564Z" }, + { url = "https://files.pythonhosted.org/packages/b4/07/a29380ee0b215d23d77733b5ad60c5c0c7969650e080c667acdf9462040d/chardet-7.4.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:365135eaf37ba65a828f8e668eb0a8c38c479dcbec724dc25f4dfd781049c357", size = 874024, upload-time = "2026-04-13T21:33:16.915Z" }, + { url = "https://files.pythonhosted.org/packages/a8/b1/3338e121cbd4c8a126b8ccb1061170c2ce51a53f678c502793ea49c6fd6d/chardet-7.4.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bfc134b70c846c21ead8e43ada3ae1a805fff732f6922f8abcf2ff27b8f6493d", size = 887410, upload-time = "2026-04-13T21:33:18.368Z" }, + { url = "https://files.pythonhosted.org/packages/63/1c/44a9a9e0c59c185a5d307ceaeee8768afa1558f0a24f7a4b5fa11b67586b/chardet-7.4.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9acd9988a93e09390f3cd231201ea7166c415eb8da1b735928990ffc05cb9fbb", size = 879269, upload-time = "2026-04-13T21:33:20.377Z" }, + { url = "https://files.pythonhosted.org/packages/1b/b3/5d0e77ea774bd3224321c248880ea0c0379000ac5c2bb6d77609549de247/chardet-7.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:e1b98790c284ff813f18f7cf7de5f05ea2435a080030c7f1a8318f3a4f80b131", size = 944155, upload-time = "2026-04-13T21:33:21.694Z" }, + { url = "https://files.pythonhosted.org/packages/70/a8/bf0811d859e13801279a2ae64f37a408027b282f2047bc0001c75dd356ad/chardet-7.4.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d892d3dcd652fdef53e3d6327d39b17c0df40a899dfc919abaeb64c974497531", size = 872887, upload-time = "2026-04-13T21:33:23.328Z" }, + { url = "https://files.pythonhosted.org/packages/51/ac/b9d68ebddfe1b02c77af5bf81120e12b036b4432dc6af7a303d90e2bc38b/chardet-7.4.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:acc46d1b8b7d5783216afe15db56d1c179b9a40e5a1558bc13164c4fd20674c4", size = 853964, upload-time = "2026-04-13T21:33:24.724Z" }, + { url = "https://files.pythonhosted.org/packages/2a/81/17fa103ea9caf5d325a5e4051ab2ba65996fd66baa60b81ee41af1f54e10/chardet-7.4.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ac3bf11c645734a1701a3804e43eabd98851838192267d08c353a834ab79fea", size = 876006, upload-time = "2026-04-13T21:33:26.098Z" }, + { url = "https://files.pythonhosted.org/packages/c2/20/193faab46a68ea550587331a698c3dca8099f8901d10937c4443135c7ed9/chardet-7.4.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6e3bd9f936e04bae89c254262af08d9e5b98f805175ba1e29d454e6cba3107b7", size = 887680, upload-time = "2026-04-13T21:33:27.49Z" }, + { url = "https://files.pythonhosted.org/packages/40/c6/94a3c673327392652ee8bdea9a45bc8a5f5365197a7387d68f0eed007115/chardet-7.4.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:27cc23da03630cdecc9aa81a895aa86629c211f995cd57651f0fbc280717bf93", size = 879865, upload-time = "2026-04-13T21:33:29.052Z" }, + { url = "https://files.pythonhosted.org/packages/b1/2c/cad8b5e3623a987f3c930b68e2bdd06cfc388cd91cd42ed05f1227701b73/chardet-7.4.3-cp314-cp314-win_amd64.whl", hash = "sha256:b95c934b9ad59e2ba8abb9be49df70d3ad1b0d95d864b9fdb7588d4fa8bd921c", size = 939594, upload-time = "2026-04-13T21:33:31.391Z" }, + { url = "https://files.pythonhosted.org/packages/33/e0/d06e42fd6f02a58e5e227e5106587751cb38adcff0aaf949add744b78b6e/chardet-7.4.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:c77867f0c1cb8bd819502249fcdc500364aedb07881e11b743726fa2148e7b6e", size = 889714, upload-time = "2026-04-13T21:33:32.772Z" }, + { url = "https://files.pythonhosted.org/packages/d4/ed/40d091954d48abea037baae6be8fb79905e5f78d34d12ea955132c7d8011/chardet-7.4.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:cf1efeaf65a6ef2f5b9cc3a1df6f08ba2831b369ccaa4c7018eaf90aa757bb11", size = 872319, upload-time = "2026-04-13T21:33:34.427Z" }, + { url = "https://files.pythonhosted.org/packages/bb/77/82a46821dbfbdfe062710d2bf2ede13426304e3567a23c57d919c0c31630/chardet-7.4.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9f3504c139a2ad544077dd2d9e412cd08b01786843d76997cd43bb6de311723c", size = 892021, upload-time = "2026-04-13T21:33:35.766Z" }, + { url = "https://files.pythonhosted.org/packages/49/57/42d30c562bda5b4a839766c1aad8d5856b798ad2a1c3247b72a679afec94/chardet-7.4.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457f619882ba66327d4d8d14c6c342269bdb1e4e1c38e8117df941d14d351b04", size = 902509, upload-time = "2026-04-13T21:33:37.096Z" }, + { url = "https://files.pythonhosted.org/packages/8c/6c/0a40afdb50a0fe041ab95553b835a8160b6cf0e81edf2ae2fe9f5224cbf9/chardet-7.4.3-py3-none-any.whl", hash = "sha256:1173b74051570cf08099d7429d92e4882d375ad4217f92a6e5240ccfb26f231e", size = 626562, upload-time = "2026-04-13T21:33:38.559Z" }, +] + [[package]] name = "charset-normalizer" version = "3.4.9" @@ -327,6 +399,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, ] +[[package]] +name = "columnar" +version = "1.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "toolz" }, + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5e/0d/a0b2fd781050d29c9df64ac6df30b5f18b775724b79779f56fc5a8298fe9/Columnar-1.4.1.tar.gz", hash = "sha256:c3cb57273333b2ff9cfaafc86f09307419330c97faa88dcfe23df05e6fbb9c72", size = 11386, upload-time = "2021-12-27T21:58:56.123Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/06/00/a17a5657bf090b9dffdb310ac273c553a38f9252f60224da9fe62d9b60e9/Columnar-1.4.1-py3-none-any.whl", hash = "sha256:8efb692a7e6ca07dcc8f4ea889960421331a5dffa8e5af81f0a67ad8ea1fc798", size = 11845, upload-time = "2021-12-27T21:58:54.388Z" }, +] + [[package]] name = "comm" version = "0.2.3" @@ -495,48 +580,46 @@ wheels = [ [[package]] name = "filelock" -version = "3.31.0" +version = "3.32.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4a/9f/994e80905542b748eb5b9f36d71458f0aea51a7be0fcb52ad959787dc1b7/filelock-3.31.0.tar.gz", hash = "sha256:c188cbc4307c18894c5424fa73f97ea7fa127ddf62192487546da3a214d0a381", size = 180931, upload-time = "2026-07-18T05:53:29.262Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c0/80/8232b582c4b318b817cf1274ba74976b07b34d35ef439b3eb948f98645a1/filelock-3.32.0.tar.gz", hash = "sha256:7be2ad23a14607ccc71808e68fe30848aeace7058ace17852f68e2a68e310402", size = 213757, upload-time = "2026-07-21T13:17:42.898Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5b/4a/e213905d3b8ad3d35d14fc056b36134a274e7f6a1050e94428b5be10a94c/filelock-3.31.0-py3-none-any.whl", hash = "sha256:739b73e580fe88bb78d830aeddbc492519ece3d97ac8368de13a2032c61010c1", size = 96080, upload-time = "2026-07-18T05:53:27.732Z" }, + { url = "https://files.pythonhosted.org/packages/06/79/b4c714bef36bc4ec2beeae1e0c124f0223888cd8c6feb1cdc56038116920/filelock-3.32.0-py3-none-any.whl", hash = "sha256:d396bea984af47333ef05e50eae7eff88c84256de6112aea0ec48a233c064fe3", size = 97732, upload-time = "2026-07-21T13:17:41.55Z" }, ] [[package]] name = "gersemi" -version = "0.27.7" +version = "0.28.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "ignore-python" }, - { name = "platformdirs" }, { name = "pyyaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/01/45/93f06bcc8fd631e50875ae70c542de7a46e6a06b9e19f39fb903b61e8ac8/gersemi-0.27.7.tar.gz", hash = "sha256:f598d62bd2bee0b6cbfc4e71f82c86f768ab31d135a312585fabbd7e57b64e09", size = 110225, upload-time = "2026-05-27T18:13:52.462Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/38/4a/8afe2fdb45b6add56437ad044dd1a46a545ccdda6f723834d8dede0fe4c0/gersemi-0.27.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f5322b29da2a5bb87b05a70c437c03cc4db9ce46fbe9d4a68d75ae37bb85e28", size = 991695, upload-time = "2026-05-27T18:12:59.924Z" }, - { url = "https://files.pythonhosted.org/packages/ac/b0/01f46c2ff8050a0f541eb132129bb5d2fba42e5d8371063c93806ccb9815/gersemi-0.27.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fb223aa8c4b14e1969d074eaea3134fb4b3604c34d90c0afe4d7abe0839a1d03", size = 943100, upload-time = "2026-05-27T18:13:01.328Z" }, - { url = "https://files.pythonhosted.org/packages/b8/6d/8869a40850775592a087be5ce2b0dedd9c236080f8dbff1fb3bd46b45b51/gersemi-0.27.7-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:ad071dc7f07558c165a50aa5c270950f5489c640e7d268601350f9b89d0d3bb6", size = 1065670, upload-time = "2026-05-27T18:13:02.654Z" }, - { url = "https://files.pythonhosted.org/packages/f8/aa/fa88abdb7cf4ccf46e00d84d021fc12ac2fcab0a4d83fb04683f54ad19fe/gersemi-0.27.7-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:a98a9b5e2df6157661d2ec4c3c15252e38a08e91fe309c93bef35a597ff81aa9", size = 1091832, upload-time = "2026-05-27T18:13:04.18Z" }, - { url = "https://files.pythonhosted.org/packages/8b/fe/e385324f81593128a9505338fe0fd753b412709c73f16b5450c037b8160a/gersemi-0.27.7-cp312-cp312-win_amd64.whl", hash = "sha256:77484d011e5bef1826dda0c73a23ac290d84f3c4612655996b0002904390172d", size = 838981, upload-time = "2026-05-27T18:13:05.673Z" }, - { url = "https://files.pythonhosted.org/packages/e5/4d/7ac410e7cf4e97e288c202c48910eaea74e590d7afe104cfc33e5ff6f097/gersemi-0.27.7-cp312-cp312-win_arm64.whl", hash = "sha256:9be671800739dd15716b5e33fae1da7b3b81a2d3e93f3d1b16b6d95cc64513c8", size = 782900, upload-time = "2026-05-27T18:13:07.186Z" }, - { url = "https://files.pythonhosted.org/packages/0d/07/e9f0b935da25cffd378dc4100937108e905e0c3da9b74303d0e80dffabb9/gersemi-0.27.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d328ca0170c359e5c76369de4d8bc9ee64aed964d4159de3b74dd187efdbdae8", size = 992569, upload-time = "2026-05-27T18:13:08.549Z" }, - { url = "https://files.pythonhosted.org/packages/64/08/943349f99403c56ba18085f9d53894928e1bbd8cd9cc5f6ab05bed59712d/gersemi-0.27.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:859458d7fe3c10dd0dfeaba9006198bb346e52bfad29a9f9e6d2d4f17e0aef8f", size = 943229, upload-time = "2026-05-27T18:13:10.076Z" }, - { url = "https://files.pythonhosted.org/packages/81/ec/d8cc5f5a888d924c1bcdb0cd654ab787746e5de41b963ebc10c841c78686/gersemi-0.27.7-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:7568dcebd3471867aa83b3681ff48c5f58a40a9d87c7cc58bf1c2752d1e836a9", size = 1064882, upload-time = "2026-05-27T18:13:11.8Z" }, - { url = "https://files.pythonhosted.org/packages/62/c1/c455be45ee4d3a886d2353d8c6af5071536d35fee7adf2c4fdf56713fbf9/gersemi-0.27.7-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:a1816240cdefdd548d37af57a9771875db53d4ddd7883452e96e1af53c554c5f", size = 1091235, upload-time = "2026-05-27T18:13:13.263Z" }, - { url = "https://files.pythonhosted.org/packages/dc/6e/62c43391645e7ca7ce53ec4885fc3d9e81209eb6499a21b904a10dec774d/gersemi-0.27.7-cp313-cp313-win_amd64.whl", hash = "sha256:8ec5a54016f7c73b12061ffa6ca6d00ae1da572cd238d828127c3270ae58b002", size = 838942, upload-time = "2026-05-27T18:13:14.569Z" }, - { url = "https://files.pythonhosted.org/packages/20/ca/b1ca9bf17d8526748fc103a30b6559d0ec733df88ccb8e7dc1d0e30289cb/gersemi-0.27.7-cp313-cp313-win_arm64.whl", hash = "sha256:e4e3246c0e649fb66de1a9c39287aff42f5bb4f2d0a08457c90a1f94c170860e", size = 782784, upload-time = "2026-05-27T18:13:15.883Z" }, - { url = "https://files.pythonhosted.org/packages/12/31/1dfa82c1facd7d0c3b2df4f30f1e7c2b53242fd850a66cefb4db4728786a/gersemi-0.27.7-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:197f5728c8fdc996858c0dfd739cac1025ac0982ccf10f2bba14ebcac4c4de50", size = 991744, upload-time = "2026-05-27T18:13:17.4Z" }, - { url = "https://files.pythonhosted.org/packages/87/c9/2727676ef2098ba0008fd35c40233d654d77305897e1ecd6bfcb2a818e6f/gersemi-0.27.7-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f2eb0a080992ce288de5ecea4af9648c870030bfada7c167d7329615c6f090d6", size = 943540, upload-time = "2026-05-27T18:13:18.819Z" }, - { url = "https://files.pythonhosted.org/packages/29/62/46111de88885b0507db6ca527ba26b4df7182b9e239290b3897ba609615a/gersemi-0.27.7-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:159e41e19c2f6716c7e6bb56e81a24a0be93f8faad351b06fc6f117b677f92f4", size = 1064923, upload-time = "2026-05-27T18:13:20.384Z" }, - { url = "https://files.pythonhosted.org/packages/1f/24/d78b534075bfc9cf51b555c7d180ff516636b83e42565263dc84b8f4b794/gersemi-0.27.7-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:18eac04a70f4e9578e200f10d1da4f2af4d2487e65a0d54aa4f12701fb9af4f6", size = 1091055, upload-time = "2026-05-27T18:13:21.792Z" }, - { url = "https://files.pythonhosted.org/packages/0b/0c/0de1e27cd4187def5fe771b8002a9aacb6d886b8222e4ec50f957e79a729/gersemi-0.27.7-cp314-cp314-win_amd64.whl", hash = "sha256:c51ae9ce838b0ce9289c9e0857ddfe7f02c4c7f862a704af91ee323dc0d9e12c", size = 880494, upload-time = "2026-05-27T18:13:23.071Z" }, - { url = "https://files.pythonhosted.org/packages/30/45/afcf4850525f363bf17cc9b332f683cc675ca588a926660c9888cc0668ca/gersemi-0.27.7-cp314-cp314-win_arm64.whl", hash = "sha256:c32ecca8b4150a1ba80efebc9ca27072f77ea2adffa3f12d854a804e16a9a675", size = 826708, upload-time = "2026-05-27T18:13:24.827Z" }, - { url = "https://files.pythonhosted.org/packages/01/a4/b4556cddb6f9fbbddf237b228d632a8cd8db64ffeb370d6603691c7f5c80/gersemi-0.27.7-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d31598ba73206b6f57ab56149c2020703aaf7dcfb806a50194b99e28ba945b75", size = 989811, upload-time = "2026-05-27T18:13:26.299Z" }, - { url = "https://files.pythonhosted.org/packages/66/d1/5439f8470eb4280910a371b3572886484f06d85b993408c59b5a8fed3836/gersemi-0.27.7-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:04fbdb8927b2e645f11812100aafc32f231a1e48dfbbaf88a9f6cd97188058c9", size = 940513, upload-time = "2026-05-27T18:13:27.801Z" }, - { url = "https://files.pythonhosted.org/packages/7c/80/c731270ab4e095570524fa114ea1c5c8b1b1cf37ceec6b4af676bf2d0a90/gersemi-0.27.7-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:5e1016240632e446e4a17dd2cf0c45d3c4be4ba94efdb01197d5c278942402f8", size = 1063737, upload-time = "2026-05-27T18:13:29.59Z" }, - { url = "https://files.pythonhosted.org/packages/de/ea/610d2a1a8436268cc2acd581e366418020cfc5d3cbee56f0dda7d7816c31/gersemi-0.27.7-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:c5169c69f5c7c8d52a6d5e30cff2073a3abf114bd2a42da76d642b3bb27e6fa1", size = 1089363, upload-time = "2026-05-27T18:13:31.42Z" }, - { url = "https://files.pythonhosted.org/packages/bd/71/39d9aebb3b7bf8836367711cfb6292cca28852e1aca928b6f66e1e48b705/gersemi-0.27.7-cp314-cp314t-win_amd64.whl", hash = "sha256:16fe395f6e8f1d36e836be14f0bef120bf694a7b81ab70f4bc6d2e00a1e6f497", size = 878196, upload-time = "2026-05-27T18:13:32.779Z" }, - { url = "https://files.pythonhosted.org/packages/bd/c8/784b6c906e35335fe6a05077476603ab41b9e611fa417f10d2dbdf91f716/gersemi-0.27.7-cp314-cp314t-win_arm64.whl", hash = "sha256:b18a13b3e65c0a1d65ac3d07e3eba42a3d1d5fc3ebfd1ef0f0fafe5eaa669e03", size = 825225, upload-time = "2026-05-27T18:13:34.131Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/96/3d/babcff7d305561ebe96124298dbb7e3acaaa21f04a6490a8f0987130233e/gersemi-0.28.0.tar.gz", hash = "sha256:984b488fd7b4c6a77fb41e4291ca63b08fc2dfe46a722b6309e23b4fee5df7e0", size = 123682, upload-time = "2026-07-21T17:03:08.755Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/15/0a/24e77a12b38e5ce43adda3f507be73fb854fd0bdfb9901c00b3cd92ed21e/gersemi-0.28.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c21705a8610e5656946b89cb7fed04b31613e54d84a0ff5ca1ec77a945769718", size = 2639272, upload-time = "2026-07-21T17:02:14.906Z" }, + { url = "https://files.pythonhosted.org/packages/53/27/836237ef1c2ab3466f6510141b89b0cf1844cb551b54e512865c4ff3358f/gersemi-0.28.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4b76113212ed3b97ee28cdd74fcdff22266344af3b39e711918a79e98fdf7332", size = 2501140, upload-time = "2026-07-21T17:02:16.276Z" }, + { url = "https://files.pythonhosted.org/packages/2d/0b/39f8d77421238408b1e78d6070e2623170ba89dbad0bf986e56c43a0c303/gersemi-0.28.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:9d781dc72758082326fe1767eda1e3b4b206f3c02b271096b19d4d054d4956e8", size = 2790128, upload-time = "2026-07-21T17:02:17.767Z" }, + { url = "https://files.pythonhosted.org/packages/69/86/021b786118298a129919b2afb290acbdbca4ab58465f79bd307dd8d3dcaa/gersemi-0.28.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:aeddee34b59aab7ed381a7d92e4437761eafd3a9eae1135eb975e2d45b993451", size = 2927464, upload-time = "2026-07-21T17:02:19.394Z" }, + { url = "https://files.pythonhosted.org/packages/83/d6/64e1021b45206170f5f02c811a4accb85a9d7a72a8641788fa554eb991f4/gersemi-0.28.0-cp312-cp312-win_amd64.whl", hash = "sha256:6574621b95fd915229bb8117a387a30b3b1d41613cd167332c834643a3676c79", size = 2363228, upload-time = "2026-07-21T17:02:20.864Z" }, + { url = "https://files.pythonhosted.org/packages/c4/4f/cac8f4caa6cfb1fad35ad876fa654dfca97e383afe4c9bb03469003d75dc/gersemi-0.28.0-cp312-cp312-win_arm64.whl", hash = "sha256:374ca1662f7a218dd7e2405442c88a23a331a22785e0b33d77af1b58b1eda685", size = 2127718, upload-time = "2026-07-21T17:02:22.677Z" }, + { url = "https://files.pythonhosted.org/packages/91/c3/411990565179e6697b317063479c35721ec9f7d8e9c87ae498561629ed54/gersemi-0.28.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:732273e5f4c5c113c91b580ac83d623bae9c0eb3966417d9f227ce8d5bc7fe8c", size = 2638978, upload-time = "2026-07-21T17:02:23.976Z" }, + { url = "https://files.pythonhosted.org/packages/0f/99/b271e583b7a6f14ce4d1d05ad306780bdd5d915bbc7cd4b4691b87c1baa9/gersemi-0.28.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f94e96aaccea72b37ac89a7e5981d658fbd1b3fc5e30d6f71f4122dee6ece133", size = 2500362, upload-time = "2026-07-21T17:02:25.518Z" }, + { url = "https://files.pythonhosted.org/packages/34/4a/b1b1dc48bc9df3174c81ecada39363cd032b99632af0569356fcd78111b7/gersemi-0.28.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:27f1f1b22ae85413b72ab8262ed19f0b471820f8309568bb076ea62904d08840", size = 2849103, upload-time = "2026-07-21T17:02:27.013Z" }, + { url = "https://files.pythonhosted.org/packages/20/ea/5abe742c9d5f60aeb249f02c3a160b8bb72476e695ecb0bbb9230df5e3c7/gersemi-0.28.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:61b7d977680ff649bebeee29dfd3913b3dfa6a748c5a4e6b8bc70a4375a7f430", size = 2926611, upload-time = "2026-07-21T17:02:28.287Z" }, + { url = "https://files.pythonhosted.org/packages/dd/b1/c592689d39fbddef63e4fb218b702447d8dc23d3cf37892f710cea871ec4/gersemi-0.28.0-cp313-cp313-win_amd64.whl", hash = "sha256:217e6082faa084e4348fea3eb11e005007a3f6f4f314fa3810379c418ded06a6", size = 2417328, upload-time = "2026-07-21T17:02:30.286Z" }, + { url = "https://files.pythonhosted.org/packages/0d/2b/f013951b0489c7b10893a8de4f70bd98ee6a3c1af2adafeecb2ff6521495/gersemi-0.28.0-cp313-cp313-win_arm64.whl", hash = "sha256:325c20350af648b5e5f5b710980212f92b7ff5585356370e6d66f1b74dc08e42", size = 2127185, upload-time = "2026-07-21T17:02:31.746Z" }, + { url = "https://files.pythonhosted.org/packages/dc/24/cd0a6b9d96c5bbb796bc17737ef9b827a15e9e498fa6babc2e9aee350e45/gersemi-0.28.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:b5ac19badc78f0ca6642b2c97eb8630014af3a9ca35696b40c44495fe09cf9fb", size = 2639679, upload-time = "2026-07-21T17:02:33.077Z" }, + { url = "https://files.pythonhosted.org/packages/52/4a/a1dbc3aadbc0bed74f7d7834b819fc912a8b43dbfa74625a2a7d5395f2ef/gersemi-0.28.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e804f3e045cc978b46b7345eacaf279b7e2ec713220e1ad3c5804f58ed29a0c9", size = 2499622, upload-time = "2026-07-21T17:02:34.595Z" }, + { url = "https://files.pythonhosted.org/packages/11/49/f209645dba902f8197531cec5d76551d37a65888b6773fd5a36aad7378bc/gersemi-0.28.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:ff8f9f977ca9e15a8ec944d1ac631dc5a588073865e313a2d1e90920fab9a80d", size = 2849541, upload-time = "2026-07-21T17:02:36.2Z" }, + { url = "https://files.pythonhosted.org/packages/6f/6e/93b09b0e6da931841a779ab926c913e524901eba8c6ee8920550816239c1/gersemi-0.28.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:33f5868f68feeaaf9b7f8a0a097a847494135ac7f1765b8e7b400d442a4a5748", size = 2927154, upload-time = "2026-07-21T17:02:37.64Z" }, + { url = "https://files.pythonhosted.org/packages/63/07/00df8aed7b41881e47002761af58c60daad27c930ae3782e22637da881bb/gersemi-0.28.0-cp314-cp314-win_amd64.whl", hash = "sha256:7fbb2f14caaaf2b30aa870e08d49838e555d05ae4040327675ee44a842b0503a", size = 2509801, upload-time = "2026-07-21T17:02:39.094Z" }, + { url = "https://files.pythonhosted.org/packages/28/f1/992b26095a1add422b1a55eca1e09e1a9e17f69accc05b67ba0b4dc44368/gersemi-0.28.0-cp314-cp314-win_arm64.whl", hash = "sha256:315c3179b9c4b92698fbd132e53df4ea1b81c99fd2cd8eafbe858368d466798e", size = 2219225, upload-time = "2026-07-21T17:02:40.781Z" }, + { url = "https://files.pythonhosted.org/packages/1f/09/1d94374e3aeb7133a711a410f5c635da2cbea1f482466248f35f9df66228/gersemi-0.28.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:b8fb2f6870545ae63e4ddf13ef0545d2c46c43771c2fc4912fc9604eb5c4ae0d", size = 2638887, upload-time = "2026-07-21T17:02:42.412Z" }, + { url = "https://files.pythonhosted.org/packages/5d/48/6c643bb218b32f20372d396fc4124def60db48b903beaab12dde493c082d/gersemi-0.28.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c9fc6ef55bd9c2e841a5fbc1acc3c7b254bee0d6558b7e5e50346c6b6f94d59a", size = 2502553, upload-time = "2026-07-21T17:02:44.342Z" }, + { url = "https://files.pythonhosted.org/packages/d7/8e/7f09fab3fb4939defa587362f6d8b12db46c94009dd9d4453f40bf2afc0f/gersemi-0.28.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:70291eae99e79b543f70f37921095018a9ab5c69f14168f59419ffc669147810", size = 2792381, upload-time = "2026-07-21T17:02:45.805Z" }, + { url = "https://files.pythonhosted.org/packages/50/a1/018c0f16f0748eb859f85fa543aa5ba2533dddb749018740e58d54749e3d/gersemi-0.28.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:0d24ed27c1761ef99e1e73c4f43e66bf085a98efc726ed42936171031eb6b518", size = 2862817, upload-time = "2026-07-21T17:02:47.598Z" }, + { url = "https://files.pythonhosted.org/packages/8b/5c/f1501fe4977e00acc08ced4b6c845a7357d9a53fd3b4123ce9d9b33e68c4/gersemi-0.28.0-cp314-cp314t-win_amd64.whl", hash = "sha256:5996957810c244db9c1e3252a22dfe1068ed5930c8867e3f71961a4ec46f7931", size = 2452734, upload-time = "2026-07-21T17:02:49.137Z" }, + { url = "https://files.pythonhosted.org/packages/d2/fb/ec755c6f08c97deffebdc3c4bc4792aff01990448d2c3ff392ab2aa4de19/gersemi-0.28.0-cp314-cp314t-win_arm64.whl", hash = "sha256:f8c301efc2cb4a758031ebb267161b606de56ed727701b7691df40a1ce7d4f81", size = 2214439, upload-time = "2026-07-21T17:02:50.517Z" }, ] [[package]] @@ -636,73 +719,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl", hash = "sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2", size = 65455, upload-time = "2026-06-02T14:34:06.319Z" }, ] -[[package]] -name = "ignore-python" -version = "0.3.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f4/4a/37928a560a345c6efb207452cf81d3c14f25a6d83df0fa5a00752c0c912b/ignore_python-0.3.3.tar.gz", hash = "sha256:dc80ac80ace112da6d02f44681b6beb2ccecb68d6ac2b5e1b82d7f84347e1cf6", size = 12240, upload-time = "2026-03-10T18:47:50.139Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/94/09/a89778efcd14cc4d7c332133a58ce2cb3933ee0dc066aeeb7f749637c3b9/ignore_python-0.3.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:429a9b792afdca7dd9cff59f5ace44c2f55d01fc30b0ce3d28d63bee223116ed", size = 904068, upload-time = "2026-03-10T18:46:26.183Z" }, - { url = "https://files.pythonhosted.org/packages/d9/3a/33afae6b7102e957506dd702ae74346fe368a541d4675e9aba5725381997/ignore_python-0.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:365ab0bf94b64f3def2264fdca58f6e9811763830ad1a48a41d70574a496e5b9", size = 850092, upload-time = "2026-03-10T18:48:07.691Z" }, - { url = "https://files.pythonhosted.org/packages/c8/d7/545c0aabd0c51a08f2245062dfa4be2ea50285148ae78a5fcf013841a37a/ignore_python-0.3.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ed9c8c858dfe2ba91bc4ab60ebd9d12dd4602a4d0d555e0fee9c8621f9ca292", size = 925657, upload-time = "2026-03-10T18:47:15.927Z" }, - { url = "https://files.pythonhosted.org/packages/a4/bc/d510141c02207147c6ca5eb16412cfbbab556abd8ec2fc4cba061cd67981/ignore_python-0.3.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e397f034d675ef14980f2df0a074dec3218963a912b7011d0e8e94f9a3d87d41", size = 896437, upload-time = "2026-03-10T18:46:54.826Z" }, - { url = "https://files.pythonhosted.org/packages/7b/8f/083356b171a87168b281a0af3da5d558e55fde13a792ee7b079a99ad01ee/ignore_python-0.3.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5756229d699ec5ab8caf4cec3ce9827d02145059c79a2416f363e2df4406d378", size = 1179547, upload-time = "2026-03-10T18:49:28.622Z" }, - { url = "https://files.pythonhosted.org/packages/f0/63/9c4665a4ea2894eb269bd69043f2004c571024a5699cc231a11219aa00a9/ignore_python-0.3.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:130d9ace07988b69669e871ed84dc77088d7b5ce35265efbb0b0d425085e2a99", size = 954238, upload-time = "2026-03-10T18:48:11.752Z" }, - { url = "https://files.pythonhosted.org/packages/06/a2/6db321813eba49f04f680af7b83dddda117f09e5a33e8fa2de7cbbe26f36/ignore_python-0.3.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f8c85a6738c632abd477c217297f8929ec1cafb261b94fa05a7fcf28095d70f", size = 975409, upload-time = "2026-03-10T18:48:52.719Z" }, - { url = "https://files.pythonhosted.org/packages/db/20/54bfd6688b19fcd7978163e39078c43f397c9e1730a3ae6149c9573b6401/ignore_python-0.3.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7e49780796e39812ade8001b0c7d2a2f1a9aeac90964e8e757c2013d30dfbe4e", size = 1011078, upload-time = "2026-03-10T18:48:14.739Z" }, - { url = "https://files.pythonhosted.org/packages/c7/64/dbbbe3d4bc43207772aba5ea9aee8c24444e578790088bca4bb7acd8572e/ignore_python-0.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:af35c6b8c3a9a27721e5c2a849e2ee21973e14b8b7d2e76e15940475a8ace443", size = 1102010, upload-time = "2026-03-10T18:46:41.084Z" }, - { url = "https://files.pythonhosted.org/packages/a8/c6/53f2cff5be0b05f153aaa1e4f72e14f43c5b3980d4453672d9d718e62ff9/ignore_python-0.3.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b730d11384a02bc4fb195b8a73555cb450e325d2676b39c8b5d20a0786102f37", size = 1170631, upload-time = "2026-03-10T18:47:05.699Z" }, - { url = "https://files.pythonhosted.org/packages/7c/b4/aadf114682a3495361f12b827a38d1f4ee8f452166747513cfbc18818121/ignore_python-0.3.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:de10b31770a8978e381c8f0c05479e18d6ea1defa18a0aa825b0487acd1f082c", size = 1183491, upload-time = "2026-03-10T18:46:19.608Z" }, - { url = "https://files.pythonhosted.org/packages/43/ee/611f7c7d8973d288e2908a14aaf48b8e65ee0d3e11ba59c7b62e8b07ef69/ignore_python-0.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e9c95f8c3a68449f7d3bd5860ea832b5827a04803337796da72d8340786e9268", size = 1181520, upload-time = "2026-03-10T18:49:21.439Z" }, - { url = "https://files.pythonhosted.org/packages/8b/b2/24102dc6c85b3fcfb29c9928d69e8d8656557e14ec50d1dd5caf437a6e6f/ignore_python-0.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:152c5aecf42e709138c8e3da2ac733d00f5efdcd004c240a95193e62b6bd024e", size = 755922, upload-time = "2026-03-10T18:49:03.718Z" }, - { url = "https://files.pythonhosted.org/packages/40/f0/3ad575b0a10d4d69efe87e745c7e94a4bbc824963707b24272d49a150bda/ignore_python-0.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:3623ce12eb96976c0db36a0ad99c65c669fdafece71e7221a538f12fa6fa41ef", size = 698668, upload-time = "2026-03-10T18:49:18.01Z" }, - { url = "https://files.pythonhosted.org/packages/5e/e9/b8e55bd15b231ff44028b7ad5ffd231cf038b8181bf288b58f8ce2324072/ignore_python-0.3.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:593679d7714b4228d7e8c3bda0005badb9f0d4cb37cd8dda8385ef734e675e23", size = 903605, upload-time = "2026-03-10T18:48:32.751Z" }, - { url = "https://files.pythonhosted.org/packages/d6/31/71cc339d9a76585f0d3dedf9ea47e070278e792ba87ab88779d02e3765a2/ignore_python-0.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:000ae12f6187791bc4748e40e7073b9769ca6ddb0cabfc11d1c682ca0e6a3953", size = 849791, upload-time = "2026-03-10T18:49:16.118Z" }, - { url = "https://files.pythonhosted.org/packages/b2/30/2f337d260e0169a3a8ee1425c59093b08e055735110c9b62dab5a785f4bf/ignore_python-0.3.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05ccc5bdf2ad1f840a0a2296efff5f4761a26f015185ed0bb835ad1901f08ee8", size = 925522, upload-time = "2026-03-10T18:47:22.989Z" }, - { url = "https://files.pythonhosted.org/packages/fd/34/af959f5525f98f93167a2a06e70373a1532734f5f1fc716d9f885c9a6164/ignore_python-0.3.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d4f8b4137b0153c95ea7e4e3acff4c5e6f6c25206d3e3b86dbe879658b00c927", size = 895769, upload-time = "2026-03-10T18:49:23.325Z" }, - { url = "https://files.pythonhosted.org/packages/cb/2a/86804702f3d0820b75c67fa19180812a6cb7c945a720d7054862823c3246/ignore_python-0.3.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39e7b9d976c12c68b09b9944328a000b012725f1f7c4655510eb890761016fb3", size = 1177257, upload-time = "2026-03-10T18:47:58.432Z" }, - { url = "https://files.pythonhosted.org/packages/77/d2/be1a05941346a51384a5a71e1aa9933cfdc8a4508ed6f03ae925bb37dffc/ignore_python-0.3.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8e9085cec8d730b43ac8c86ef5da0c902f0f57da8da2ee009045e7006fe4860f", size = 954112, upload-time = "2026-03-10T18:47:25.072Z" }, - { url = "https://files.pythonhosted.org/packages/d2/a8/84baf48e05b603480b963f655e73b97230f7296433d3cc8206b742c167fd/ignore_python-0.3.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ebb00b54e5a01d8b10a51a7de7d2f884359375f4abb5352378f6f7f2c8878a58", size = 975286, upload-time = "2026-03-10T18:48:04.689Z" }, - { url = "https://files.pythonhosted.org/packages/aa/b1/c3d851fbf68d1a70cbe49e66b17d10f43af831ef06c34d7d6d385b59499e/ignore_python-0.3.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d8be9b991c63fd8c76a6a9deac24ed164533824da1bdb2356a33511bfa446d54", size = 1010396, upload-time = "2026-03-10T18:47:28.251Z" }, - { url = "https://files.pythonhosted.org/packages/8c/00/f3f82228067b68f0f66594261a1f51e090fbc32616e1494fbe32339a13fd/ignore_python-0.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1b2ff29dbe59bbbd370feacb99e5bec7791abe730dd535b5db848de5b5210d7e", size = 1101497, upload-time = "2026-03-10T18:46:28.577Z" }, - { url = "https://files.pythonhosted.org/packages/75/be/c220b77b9997f2ae81d30af3562bf7dee8e4c68a4de0a0404098b98fb49f/ignore_python-0.3.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:0dfa531bbf65f45f9a233e2809f8b0a49aa9078686dbb0e4f3e30848e09cc208", size = 1169639, upload-time = "2026-03-10T18:46:10.311Z" }, - { url = "https://files.pythonhosted.org/packages/95/cf/1417966361c38b3acb80e2a427cf34883b9c1dc4274dc1097cd9c3c6af2d/ignore_python-0.3.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e4786eac47d2e9dab245fc376157bdc458f4b3269b81006b80a74d514b37efb7", size = 1183312, upload-time = "2026-03-10T18:48:13.284Z" }, - { url = "https://files.pythonhosted.org/packages/cc/32/3e44ceceb0111c9d6cdcb24aaf7d531c4dc0037c51cdd22a75fd2d71de9d/ignore_python-0.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f88aa2ee7335399c823aa050edec118e28ddafe7859e0db4093de0ca815467e", size = 1181638, upload-time = "2026-03-10T18:48:09.724Z" }, - { url = "https://files.pythonhosted.org/packages/c7/89/c1a25074ee04c2db36ec1a1638a72dc91f0056674924783ed3f227fb2346/ignore_python-0.3.3-cp313-cp313-win32.whl", hash = "sha256:97db61620be5c56a78115967d05e0d7a130a27a68f401eb98bf0753d3f770cb5", size = 658894, upload-time = "2026-03-10T18:48:31.24Z" }, - { url = "https://files.pythonhosted.org/packages/3d/00/176044e51c351465221f6b98ced3639d7660330bb12d89fb99e13423803c/ignore_python-0.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:2af502d988282cc360094dc7b2733a7b68e54a8e3cf0128178ab1ba84f9ec290", size = 755588, upload-time = "2026-03-10T18:48:43.824Z" }, - { url = "https://files.pythonhosted.org/packages/d5/d8/b868b289dc2466f3339e72602861379905d4ba1ef32d5c89c0874bf5a1e0/ignore_python-0.3.3-cp313-cp313-win_arm64.whl", hash = "sha256:842572b228382c9bb6283428f14ff4481b3822cb7488ce4388281a8c6c465a81", size = 698168, upload-time = "2026-03-10T18:46:14.617Z" }, - { url = "https://files.pythonhosted.org/packages/2a/fd/dbb1ed9af9bc50d53a2edcb71e0e236d32d28fdb60a62ccc965f3cad8811/ignore_python-0.3.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f0edb622f5a8b7f735e14a7ca13d4cb7ca04b6fd7e844f5fa0fd9f86622b986", size = 923396, upload-time = "2026-03-10T18:46:37.979Z" }, - { url = "https://files.pythonhosted.org/packages/03/76/2b0cf84c80d973b285831ae59f795635eb518342e00aab1d96a0c918bbe6/ignore_python-0.3.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a999ef004caa048e5ecccb5f3383d857105baa37b8895a0a2b7cd66f9cb0b0b4", size = 894013, upload-time = "2026-03-10T18:49:08.76Z" }, - { url = "https://files.pythonhosted.org/packages/c0/1b/90b799876f7129bc045811ee80025f5f1a2cfed300fed972bb5790466b35/ignore_python-0.3.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:17749af58a6fe6aaa3198b285c874fbf0f036ef2cb684225ef62288b62948d26", size = 1178944, upload-time = "2026-03-10T18:47:07.924Z" }, - { url = "https://files.pythonhosted.org/packages/0f/e4/e260e5cb1b289230a6be99de15db5eb0697e6334830cb1ff3907568414ab/ignore_python-0.3.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df78545bc5d54abf875a70a70db7e1e12e606377d1c9f4e68b6763e8c701a748", size = 952118, upload-time = "2026-03-10T18:47:17.918Z" }, - { url = "https://files.pythonhosted.org/packages/eb/ea/f30078aa0359d777056bf83efc38463258056ae6e904246588200f55157d/ignore_python-0.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a2cdfbd3c9df9e98dd067858fce7d6ab919f2fb038f6b3124fc5f05b8825b546", size = 1100030, upload-time = "2026-03-10T18:49:12.518Z" }, - { url = "https://files.pythonhosted.org/packages/8c/90/7d1d5ddca496189b61d8ccccbc0fbb579a7c2c5b2dbd5e41eec944068dc8/ignore_python-0.3.3-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:cc49302f8fdbd3426eba4b99671ba10f0d150d90ea4f344a0204e4ac8e4fcb66", size = 1168207, upload-time = "2026-03-10T18:47:54.471Z" }, - { url = "https://files.pythonhosted.org/packages/63/03/c1890e428c05445eb14523e76fe87ba71151bae370874e05bb0f32276700/ignore_python-0.3.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:7e9bea86436a59eb3f24e8e15bb3b3a36cdb98aec950c70aa619e33f35eb6beb", size = 1181807, upload-time = "2026-03-10T18:47:09.997Z" }, - { url = "https://files.pythonhosted.org/packages/c6/bd/a37cd31e6d4c6eaabe6ceb22defdb278246973d4f50f9deffea12b1ea037/ignore_python-0.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3c40627f3bde32a37e75950b97733b586e9167fd545c958195dbf1bb73d96a81", size = 1181135, upload-time = "2026-03-10T18:48:23.716Z" }, - { url = "https://files.pythonhosted.org/packages/f0/65/4730b11443d4da0fef9ed7525879529d452d862001c5287f1383d9c2a9ac/ignore_python-0.3.3-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:d01b0578252d0df17b64400103ffbfea5b8332483a3da01d116f4919467128de", size = 901963, upload-time = "2026-03-10T18:47:01.711Z" }, - { url = "https://files.pythonhosted.org/packages/1e/ce/f82e5156b64c3f8e8835c36ef1cb046d280af8294192672ec99a5f0efb6d/ignore_python-0.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c3430b73a99af300b0b1203da2cd30f1831f504466d94343b065b1ef0435802c", size = 848941, upload-time = "2026-03-10T18:47:37.063Z" }, - { url = "https://files.pythonhosted.org/packages/12/30/976ce0f8e1002fc19781ea48b6d5519200f734b19be03d769eefeb0ca749/ignore_python-0.3.3-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71dc7505c0520e066c5d567f49d7173703c34192af1b8f89ce401a34098391f5", size = 924477, upload-time = "2026-03-10T18:48:58.986Z" }, - { url = "https://files.pythonhosted.org/packages/f3/a1/e907e02bc252f8c7efdab0d317019741cb243dc5eb00bf07e6680f66096f/ignore_python-0.3.3-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8528c819c151ccabbd1bb9e591dd99495c2d0423b10ccdef47d48fe25da2b2d6", size = 893944, upload-time = "2026-03-10T18:47:19.341Z" }, - { url = "https://files.pythonhosted.org/packages/58/fc/f7cfe4a5ea6be67bbaa42afb6fe3d8fbaca6d3a71aa63bf86c22a7fac53b/ignore_python-0.3.3-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44bf617535f5ead500a6f83178426f7c607e015bcf9e614e18ae88aa3de1a340", size = 1179202, upload-time = "2026-03-10T18:46:16.401Z" }, - { url = "https://files.pythonhosted.org/packages/5c/83/ba162a3b82eca12ddbb7f229a3d05b79ec5be66bde44007eab3de7abed7b/ignore_python-0.3.3-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c9408949156bf4ae07e60d5c8f356114be1482dc8f708ecd5785151e9ae21fa", size = 952914, upload-time = "2026-03-10T18:49:25.465Z" }, - { url = "https://files.pythonhosted.org/packages/49/14/32e3a2c4313367a38b9c8b564785444bb3ed31317386fb81efd80496a5af/ignore_python-0.3.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f50dd3c3f0ef982e256d9e702b44c1d81cbe0da2d98746d5b189bc1fd5191cd", size = 973331, upload-time = "2026-03-10T18:47:14.441Z" }, - { url = "https://files.pythonhosted.org/packages/d7/2c/ca2816e41d182f1b60d859906414e831b0cb6182006eb76f7cb4ade0630b/ignore_python-0.3.3-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f24c6af8fd78b5c58e0f2683004e0b6fac146ee047b2d8fc8d7b16c69e0a3aaa", size = 1009735, upload-time = "2026-03-10T18:46:30.975Z" }, - { url = "https://files.pythonhosted.org/packages/90/db/d28201d52730132f63ecc3bebcc4ba8694a2764157c65425ffd86ba05903/ignore_python-0.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1ac4491082df61d370f7fc087d5c0b16bc84b647e126e3f45a97d31cf3b2f514", size = 1100547, upload-time = "2026-03-10T18:48:54.408Z" }, - { url = "https://files.pythonhosted.org/packages/6a/b8/7ef6326e648aacbc34ee31f2c4c9db073473f85d1f649cd5bda799f47d60/ignore_python-0.3.3-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:b0f0bc9eab99a36f54e0a4e3043768e529107565bc67a7f420b4febff8006f32", size = 1167588, upload-time = "2026-03-10T18:47:29.778Z" }, - { url = "https://files.pythonhosted.org/packages/62/d0/ac58193a1ec6c8ec06da209fcbead510938a8dde89fc6478cace59cb77b7/ignore_python-0.3.3-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:4252f803f3cdae6c8775f1e905f5babd6e77860781f4c29cf798452ee5fd6936", size = 1183065, upload-time = "2026-03-10T18:49:27.019Z" }, - { url = "https://files.pythonhosted.org/packages/3a/17/f0d111f0d90ae0d2322ba0c4a2002b2b6634dd64555ad9f42eaae20b633b/ignore_python-0.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:dda677506171a0c4f27925e13f9f8b4b652941969f0e0e6b555ce795e18b7467", size = 1180088, upload-time = "2026-03-10T18:48:03.183Z" }, - { url = "https://files.pythonhosted.org/packages/71/81/f2dd6e0ab7aa9b860d82c1b3ce195ed5d7284e92cde2cbe5a6915241a8c4/ignore_python-0.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:fabb25c4352d3d4f1a2a197d6fb403848026344aab73e1674bcb31e4a7f54914", size = 753756, upload-time = "2026-03-10T18:46:12.668Z" }, - { url = "https://files.pythonhosted.org/packages/db/de/aa50c31cdabf694b4e76e42f0a771ba6527e5d9e2b0d1c2bdc9e2a3a6b2b/ignore_python-0.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:c545cfd062a463c6d8e90b2738ec93fb9228f12c0aa80866fdc80f64fbc8f1a3", size = 697128, upload-time = "2026-03-10T18:46:17.861Z" }, - { url = "https://files.pythonhosted.org/packages/aa/8e/97ed261d173b12101c590682b812759d6e787cd1161fb49921707399149b/ignore_python-0.3.3-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c73743c4c8622ebed7998990c5f18a2c2a4fae915288798aeb8fef6d5411743b", size = 922672, upload-time = "2026-03-10T18:46:22.527Z" }, - { url = "https://files.pythonhosted.org/packages/30/60/d0c7be4619a9d8537e0e930b26d358b870f14820ec89eaba80e97d00481d/ignore_python-0.3.3-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1206189e1c988a3d0fb7de3298e5f7dd5284b4a23781878fb8f9f6224659b270", size = 891722, upload-time = "2026-03-10T18:48:29.442Z" }, - { url = "https://files.pythonhosted.org/packages/d7/cf/ae857c74b643ad0cda78501c3fd9ef4107cc4551d0dce04b0a3907f616f5/ignore_python-0.3.3-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:89b2efb712c5bc0c57cc5a9deabfbcb2196504139d2d108a4afedd140c02063f", size = 1177764, upload-time = "2026-03-10T18:48:40.572Z" }, - { url = "https://files.pythonhosted.org/packages/7e/ea/4bd00b6848a5c93a7c9f179709ab1e09edea7728287177145f878c68630d/ignore_python-0.3.3-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8f0e8379d4eff6842b61c01c7f03dc7415afac994b96e4a7d24f80b1078d5c1d", size = 951321, upload-time = "2026-03-10T18:47:00.201Z" }, - { url = "https://files.pythonhosted.org/packages/cc/cb/30c8862795c88c8c249a34e584ee95e27748ca890466ab9044e94f32b717/ignore_python-0.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:4aac18bf9346f06fd17412d5bcfca53090a72456f53f3ffdf3b1e896f15cc356", size = 1099642, upload-time = "2026-03-10T18:48:42.201Z" }, - { url = "https://files.pythonhosted.org/packages/63/63/31483b9985ca2c4b1d828457ecccc1e60b02f3887d548ecbaa565176618a/ignore_python-0.3.3-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:356b783877c7e88eba69c99bcc5e2d9fb07c2fe54f2c64e03897b7ae2adce2a7", size = 1165028, upload-time = "2026-03-10T18:48:21.994Z" }, - { url = "https://files.pythonhosted.org/packages/29/94/17a644d95f13c08845bc6be9750f16e19e7d0650a6f43e6ce63de57556b0/ignore_python-0.3.3-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:8dd30b865dfd3206756212796cb13686b6c45befa5cc495ccc9866108215f7c1", size = 1181211, upload-time = "2026-03-10T18:46:48.24Z" }, - { url = "https://files.pythonhosted.org/packages/f9/a5/2aee7c1997f904aa0fdf5e34471c6e3c5cd6254a55b9aa8c3f2e0a158353/ignore_python-0.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:49ccb834be168a7e72b104ffc02024d4eb4d91840bc30e2948787551f5242ff0", size = 1179933, upload-time = "2026-03-10T18:46:33.621Z" }, -] - [[package]] name = "imagesize" version = "2.0.0" @@ -962,6 +978,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5f/5d/3dcec2884ba1b0806d1408612555c38dd5d68e90156b59f75f6e36435c3a/librt-0.13.0-cp314-cp314t-win_arm64.whl", hash = "sha256:2f281549a4c52ac7bb97997f14353f8bd0e53a34ca0dad1c905cfd0b4a58ae99", size = 110771, upload-time = "2026-07-08T12:26:12.303Z" }, ] +[[package]] +name = "license-expression" +version = "30.4.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "boolean-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/40/71/d89bb0e71b1415453980fd32315f2a037aad9f7f70f695c7cec7035feb13/license_expression-30.4.4.tar.gz", hash = "sha256:73448f0aacd8d0808895bdc4b2c8e01a8d67646e4188f887375398c761f340fd", size = 186402, upload-time = "2025-07-22T11:13:32.17Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/40/791891d4c0c4dab4c5e187c17261cedc26285fd41541577f900470a45a4d/license_expression-30.4.4-py3-none-any.whl", hash = "sha256:421788fdcadb41f049d2dc934ce666626265aeccefddd25e162a26f23bcbf8a4", size = 120615, upload-time = "2025-07-22T11:13:31.217Z" }, +] + [[package]] name = "markdown-it-py" version = "4.2.0" @@ -1430,7 +1458,7 @@ name = "pexpect" version = "4.9.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "ptyprocess", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "ptyprocess" }, ] sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" } wheels = [ @@ -1439,11 +1467,11 @@ wheels = [ [[package]] name = "platformdirs" -version = "4.10.1" +version = "4.11.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/52/cd/4f25b2f95b23f5d2c9c1fe43e49841bff5800562149b2666afc09309aa8f/platformdirs-4.10.1.tar.gz", hash = "sha256:ceab4084426fe6319ce18e86deada8ab1b7487c7aee7040c55e277c9ae793695", size = 31678, upload-time = "2026-07-18T03:53:43.808Z" } +sdist = { url = "https://files.pythonhosted.org/packages/78/9b/560e4be8e26f6fd133a03630a8df0c663b9e8d61b4ade152b72005aec83b/platformdirs-4.11.0.tar.gz", hash = "sha256:0555d18370482847566ffabcaa53ad7c6c1c29f195989ae1ed634a05f76ea1e0", size = 31953, upload-time = "2026-07-21T13:09:36.565Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/73/6fd0bb9ce84138c3857f12e9de63bc901852975a092d545f18087a204aa2/platformdirs-4.10.1-py3-none-any.whl", hash = "sha256:0e4eff26be2d75293977f7cddc153fd9b8eaa7fb0c7b64ffe4076cb443117443", size = 22906, upload-time = "2026-07-18T03:53:42.576Z" }, + { url = "https://files.pythonhosted.org/packages/7d/68/d8d58938dfb1370b266a1a729e6d77a985be23689a0496498ee17b2cbf90/platformdirs-4.11.0-py3-none-any.whl", hash = "sha256:360ccded2b7fce0af0ff80cc8f5942a1c5d99b0e856033acb030bfc634709e74", size = 23247, upload-time = "2026-07-21T13:09:35.422Z" }, ] [[package]] @@ -1475,8 +1503,10 @@ dev = [ { name = "mypy" }, { name = "numpy" }, { name = "pre-commit" }, + { name = "pymarkdownlnt" }, { name = "pytest" }, { name = "pytest-cov" }, + { name = "reuse", extra = ["chardet", "charset-normalizer"] }, { name = "ruff" }, ] doc = [ @@ -1501,6 +1531,8 @@ lint = [ { name = "mypy" }, { name = "numpy" }, { name = "pre-commit" }, + { name = "pymarkdownlnt" }, + { name = "reuse", extra = ["chardet", "charset-normalizer"] }, { name = "ruff" }, ] test = [ @@ -1525,8 +1557,10 @@ dev = [ { name = "mypy" }, { name = "numpy" }, { name = "pre-commit" }, + { name = "pymarkdownlnt" }, { name = "pytest" }, { name = "pytest-cov" }, + { name = "reuse", extras = ["charset-normalizer", "chardet"] }, { name = "ruff" }, ] doc = [ @@ -1549,6 +1583,8 @@ lint = [ { name = "mypy" }, { name = "numpy" }, { name = "pre-commit" }, + { name = "pymarkdownlnt" }, + { name = "reuse", extras = ["charset-normalizer", "chardet"] }, { name = "ruff" }, ] test = [ @@ -1559,7 +1595,7 @@ test = [ [[package]] name = "pre-commit" -version = "4.6.0" +version = "4.6.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cfgv" }, @@ -1568,9 +1604,9 @@ dependencies = [ { name = "pyyaml" }, { name = "virtualenv" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8e/22/2de9408ac81acbb8a7d05d4cc064a152ccf33b3d480ebe0cd292153db239/pre_commit-4.6.0.tar.gz", hash = "sha256:718d2208cef53fdc38206e40524a6d4d9576d103eb16f0fec11c875e7716e9d9", size = 198525, upload-time = "2026-04-21T20:31:41.613Z" } +sdist = { url = "https://files.pythonhosted.org/packages/25/3a/ddb78f32a0814e66b18a099377a106a2dcdce92d86a034d69d65df9b256e/pre_commit-4.6.1.tar.gz", hash = "sha256:03e809865c7d178b9979d06c761fcbfe6808fdaded8581a745bb110e52050421", size = 198646, upload-time = "2026-07-21T20:56:58.225Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/80/6e/4b28b62ecb6aae56769c34a8ff1d661473ec1e9519e2d5f8b2c150086b26/pre_commit-4.6.0-py2.py3-none-any.whl", hash = "sha256:e2cf246f7299edcabcf15f9b0571fdce06058527f0a06535068a86d38089f29b", size = 226472, upload-time = "2026-04-21T20:31:40.092Z" }, + { url = "https://files.pythonhosted.org/packages/fb/49/bc925106abcdac498074f2cbe6137e94e09f418dd2b7775df5b577dc0313/pre_commit-4.6.1-py2.py3-none-any.whl", hash = "sha256:0e3b2942510d1fb34eec167a3ec57331bf8442122f1153a9fb8b58f5c49b2717", size = 226186, upload-time = "2026-07-21T20:56:57.064Z" }, ] [[package]] @@ -1631,6 +1667,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload-time = "2024-07-21T12:58:20.04Z" }, ] +[[package]] +name = "py-walk" +version = "0.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "sly" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b3/b5/e2f3fab1e11d4089b1c3dfd72175fdb2408ff8028e01bdb0d308923609bb/py_walk-0.3.3.tar.gz", hash = "sha256:a1b28d6079f27203fa3098b69a98572675b3ff5bd02286c43e6dacd66615f879", size = 1815727, upload-time = "2024-10-26T14:30:39.421Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/38/56b67abdbf6797475dfe2f62d391b4a6ead851c76acbaf07e118e53651b6/py_walk-0.3.3-py3-none-any.whl", hash = "sha256:238fc018165138021ce0bfd9c351cdc473d3120ccc5534df35611b92608c94d5", size = 14537, upload-time = "2024-10-26T14:30:38.06Z" }, +] + [[package]] name = "pycparser" version = "3.0" @@ -1649,6 +1697,114 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, ] +[[package]] +name = "pyjson5" +version = "2.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/9a/3db19560e968d6e85b2a4ddf4b949c6ebf9dd1dcfb5a9f37736f8adeb927/pyjson5-2.0.1.tar.gz", hash = "sha256:a5b0e322e847b198a50d8a1ef16d6b2b19129644dc018d76773e81ef1487ca39", size = 352242, upload-time = "2026-05-15T16:12:54.931Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/68/41/be622b742fe4749fefa9d8a923b1cf5e51a1e8e4b4930fa8ea8c531b243d/pyjson5-2.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ee62394660d54e76ff8a968c8194b252be23d184f05a00238d4def9624454ea6", size = 302636, upload-time = "2026-05-15T16:06:08.006Z" }, + { url = "https://files.pythonhosted.org/packages/4b/e2/50378c3bec9164c1bb983ca15ed59f8be498981b790a90d1410a1016ffe2/pyjson5-2.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:58dfa4cf5c327e14c530b16c23e812c021fe53b19e6f9cdfce257d8c02244895", size = 158588, upload-time = "2026-05-15T16:06:09.684Z" }, + { url = "https://files.pythonhosted.org/packages/cb/7d/5de0f82c144b6fc2fa2e3fde5517257733a91d24734b5d2415b7e991e8fd/pyjson5-2.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:07cb90a31f962a6de9e49592a306046ee015da73510c6d215e9481a2a21c9ac2", size = 153741, upload-time = "2026-05-15T16:06:11.114Z" }, + { url = "https://files.pythonhosted.org/packages/f5/ac/174ca02e5f3ed8245dc48247e534880bbec1528c0c4eaa768fafa9417dda/pyjson5-2.0.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:ef4026a90a68cd2bcb64d89ca064a1615b60a61c7694714e2b8ef30434f365b5", size = 185450, upload-time = "2026-05-15T16:06:12.883Z" }, + { url = "https://files.pythonhosted.org/packages/8f/0d/bfc553176b7e109b72f23697ab1fd1a77d7fd5c6626d6e23936f13d5884e/pyjson5-2.0.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:04b4929a7adf0e0720da92ac54c92d408e8057158be3ccc34da17c7767a9af78", size = 163331, upload-time = "2026-05-15T16:06:14.314Z" }, + { url = "https://files.pythonhosted.org/packages/b3/05/b0e67106f78c8ea5ffcf6ce0b8421f38a04d5f37ea88ac70123199755bcb/pyjson5-2.0.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e889b039d6bffda9a6b8d822073bbdb4a60166af22f075e7faa0c03c2dfcf17b", size = 166429, upload-time = "2026-05-15T16:06:16.076Z" }, + { url = "https://files.pythonhosted.org/packages/81/3c/2366f8ecf053434470eafe1f120f2e235d13015fc50d7f06e55e39b550ab/pyjson5-2.0.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a08e99d0a33463728fb016f5eec680504499c4be280dac016de2da70ec55b0db", size = 180499, upload-time = "2026-05-15T16:06:17.544Z" }, + { url = "https://files.pythonhosted.org/packages/76/65/9a70876d4dd09ce17678024266406b94b8f1edf9db6c2e3bf76cfa653a13/pyjson5-2.0.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:035c094feb6a9d4312183f9f34228d976102eefb971e9e3dd972d8c7900a466a", size = 187469, upload-time = "2026-05-15T16:06:19.212Z" }, + { url = "https://files.pythonhosted.org/packages/5b/43/0c0bcbf9a9ef7fdcd49dc0992a3a206244c2c2baa7b409932464cf26f1a5/pyjson5-2.0.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6d178025a5317db44663dc87aab90f34674991b3da40dbedc3c108e7b03b6466", size = 176032, upload-time = "2026-05-15T16:06:21.153Z" }, + { url = "https://files.pythonhosted.org/packages/82/2c/32213674010c44db265d45e977a431cbde971c45342b483f7af337811403/pyjson5-2.0.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:381ca5b3172bccf9c29c5823a0173ab9118d579d0f5bb4fca20b803daa6e72d5", size = 171477, upload-time = "2026-05-15T16:06:23.017Z" }, + { url = "https://files.pythonhosted.org/packages/f1/49/da5417d592ac75a23d1ca2dfda846391ccf137edd89054b780866c592b65/pyjson5-2.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8e158caf0dd7fbf7afe12f92fcc9cba26bceac4b38615c087fd592e9e3240d9f", size = 1145571, upload-time = "2026-05-15T16:06:24.757Z" }, + { url = "https://files.pythonhosted.org/packages/60/f8/1f0c326b3a3267f28b7b9e2ac07121386ec20ee8f9dd49955af4faa17ba7/pyjson5-2.0.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c8010e9a02b6a0719234f8d074639f9051afe579ff0f74d3367af1d8b4c7d839", size = 1010388, upload-time = "2026-05-15T16:06:26.574Z" }, + { url = "https://files.pythonhosted.org/packages/de/c8/76f2739a8715061755f12f4d2795f6c4079aeadd166c56d0992521442d5b/pyjson5-2.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3543e067d1d8ab6cb1cd41add38a42eaf82e9a7e802e8a08f1acda9f22199b00", size = 1323111, upload-time = "2026-05-15T16:06:28.805Z" }, + { url = "https://files.pythonhosted.org/packages/50/7a/683e1586fa076fb344aec23a647d67f427847b6bffb1001d56e86aa8da33/pyjson5-2.0.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3e496938e7e0defc33bfbd0ff581d4ffdc428c598cc5d679232f34df27f7330a", size = 1240671, upload-time = "2026-05-15T16:06:30.473Z" }, + { url = "https://files.pythonhosted.org/packages/c0/8e/6638b0b22344b23cae1271b0211668be54b3f76183bd8d4f89a2edd8e562/pyjson5-2.0.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:2badbc101908123905a38789cc552b99ab896a7ec0ce4fa6ee2bb7b613c85c1b", size = 1178013, upload-time = "2026-05-15T16:06:32.212Z" }, + { url = "https://files.pythonhosted.org/packages/7a/21/d44540d3cdc670e5c6e665471361f557ef8c7d56964cd433524208b3707b/pyjson5-2.0.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:b1b0df4898e2e046fa1e9b5df436fe11d9b681b1e5fc9877508d982d2059aaf1", size = 1354907, upload-time = "2026-05-15T16:06:33.922Z" }, + { url = "https://files.pythonhosted.org/packages/3c/74/fceedd2709760f5c85e75b508002af9b4c2da8af20a80e62b2d0e2358a15/pyjson5-2.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8fcc96c429888f2293f672e33d01da8a0847cd5116a773c9a1903b8bc2f12bc1", size = 1208847, upload-time = "2026-05-15T16:06:35.883Z" }, + { url = "https://files.pythonhosted.org/packages/b8/3a/d2f062b5801b3034ecb16ffb0801d7b4a1d6abae4cd4615482dbf62f1ed8/pyjson5-2.0.1-cp312-cp312-win32.whl", hash = "sha256:48c97e2f7f02171948f8a7ed6c9b2b2faea00653a3348d9e810238a688f07b6c", size = 115562, upload-time = "2026-05-15T16:09:24.807Z" }, + { url = "https://files.pythonhosted.org/packages/26/13/2265cf16720defdc87672b68ff5edf83820bd76e59e32f8384c9cb1ae619/pyjson5-2.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:8dea9976eea0aa7af8b5ad49df3fa831d6bda08ffd7bb11409d6a81961491219", size = 136176, upload-time = "2026-05-15T16:09:25.931Z" }, + { url = "https://files.pythonhosted.org/packages/9c/92/a8947e646ce642555ac22b31f44b7168c81b0e364d0f2711d571955229b6/pyjson5-2.0.1-cp312-cp312-win_arm64.whl", hash = "sha256:264ab65fb7d68a763567c2302151f1f074bf053c8479939aa8e75f5f9518fe31", size = 116752, upload-time = "2026-05-15T16:09:27.274Z" }, + { url = "https://files.pythonhosted.org/packages/93/2c/0619f89a9576f335ba63eb851e73ba507480a8c7f28a2e7de2501ed3d303/pyjson5-2.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8a661d292801b38434d5288bf7329f9b50b3a693b1d2941c7595175842692eba", size = 301821, upload-time = "2026-05-15T16:09:28.721Z" }, + { url = "https://files.pythonhosted.org/packages/91/31/7824913ec71e7421d6a57bc06228f3e2d946d8e8f738f898572dded0dc57/pyjson5-2.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cb5c1c066038ce6e1922d9d5be23f5cd14d5b5a3c96e6358aa5d0e379014a93", size = 158201, upload-time = "2026-05-15T16:09:30.261Z" }, + { url = "https://files.pythonhosted.org/packages/bc/7d/4ddb249563a838425242342d2cf67976ccc292a831b543a92fa1a8a83b11/pyjson5-2.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7417eab751817fa5f070e41975d9df4aec3532d21389073318161f63cd96d636", size = 153244, upload-time = "2026-05-15T16:09:32.04Z" }, + { url = "https://files.pythonhosted.org/packages/02/39/7622416ac0570d9ce377447bd5b2ec9383c1282e63cc6d0b65779f1336fa/pyjson5-2.0.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cc4802093b4ab9039367774988486fd04754cf416c32aebf94a94bafd8b8a478", size = 185568, upload-time = "2026-05-15T16:09:33.719Z" }, + { url = "https://files.pythonhosted.org/packages/d8/90/2f317da231477b77481020d79c73bbe10625e4925ceeae77603726ef1763/pyjson5-2.0.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bc3181274ed19ecb2315cf85a499bf83002554f42c72453666c616059d665a7b", size = 163169, upload-time = "2026-05-15T16:09:34.865Z" }, + { url = "https://files.pythonhosted.org/packages/02/b3/20023c3cfe2f2c2523007d7031b5b7ad7ccd8856d2665547683cebaa6f8e/pyjson5-2.0.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5398306b8aa253e620af9ed8085767de9cd28d6846da45e535e80fcffa9f33d7", size = 166514, upload-time = "2026-05-15T16:09:36.383Z" }, + { url = "https://files.pythonhosted.org/packages/e2/1c/b863e502153477b2845a54b688b72436457aca5107b300fca95e98184551/pyjson5-2.0.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b97b592287d52a6ec5af84dca94aab02b185f72f8ddb6fc99c58efb8891be5cd", size = 179907, upload-time = "2026-05-15T16:09:38.166Z" }, + { url = "https://files.pythonhosted.org/packages/fc/b2/413fcb76632e5f6fa89a2ec83976755b5bb4696c6d9eca9ff3c70cd717b6/pyjson5-2.0.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4efbf5e910a3aa6f330a92d1ae940dda5ed662976ed5056526baaf2e1821f95d", size = 187171, upload-time = "2026-05-15T16:09:39.624Z" }, + { url = "https://files.pythonhosted.org/packages/d6/11/66151b819407ab589aef36582038257f1ef42dc065e3423b3d8274f4fcd2/pyjson5-2.0.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e042f9b869e7f21d5f53a2638e5d0cf1daaba2342127c8777c502daf972602e", size = 175564, upload-time = "2026-05-15T16:09:41.356Z" }, + { url = "https://files.pythonhosted.org/packages/f2/98/deb70690dab994474ea527cba91f43ae55928bcff498c441e812b60fc1e2/pyjson5-2.0.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:26074370d7a6dd38b6e8c28a2f10c790fc6dec938ec22ec3de6c93c97d195f10", size = 171530, upload-time = "2026-05-15T16:09:42.78Z" }, + { url = "https://files.pythonhosted.org/packages/a9/be/969752a3a052d00698b6e1dd926c627d7a6475a7c8dd390db148363544f8/pyjson5-2.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3cb163a495096716a7a01d052b60bda0308ecfaeddcb2d50a247ba9d707e3e40", size = 1145510, upload-time = "2026-05-15T16:09:45.005Z" }, + { url = "https://files.pythonhosted.org/packages/d0/be/4c5c92cdda5a911ee4450a74281782335e7ce6715638308322beb96be639/pyjson5-2.0.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:5fdd66bdddc2d53421ab7427bedcd2ca9b2f1b4b3b464381aa60d305c94be38c", size = 1010114, upload-time = "2026-05-15T16:09:47.081Z" }, + { url = "https://files.pythonhosted.org/packages/89/1e/72283bc505d77dcdab7eaeb0020cf0fd79a05d2991e886d1fcfa73e88ae1/pyjson5-2.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4ad222a3eff1cc93f9b70894c5f3d2ff5e46531e88feaa4818e329d5f3ae4307", size = 1322915, upload-time = "2026-05-15T16:09:48.885Z" }, + { url = "https://files.pythonhosted.org/packages/06/b4/94a09e744a6bb6e76108b61a28a7cc5ecab1b8105cacde7548359b3b74a3/pyjson5-2.0.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:63f5cf25113dd1bf3bfeda211d99413e58ec6b9036ff34f7b69f85f23695e9c4", size = 1240126, upload-time = "2026-05-15T16:09:50.638Z" }, + { url = "https://files.pythonhosted.org/packages/af/29/4549380cae425ee112f3c154606c35f5211c12ddf415f079c2b23f2d493b/pyjson5-2.0.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:b0001eecce9080e6c170e978786501e8931e2075a3d15f5260e1bdd6a45e8976", size = 1178022, upload-time = "2026-05-15T16:09:52.639Z" }, + { url = "https://files.pythonhosted.org/packages/1c/1a/5a8a869e855645858e45dbd077204cec3a85b2f2e669bc3c8cefe9c4a70e/pyjson5-2.0.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:40371c73cc83ed81914028786a6cc5950bdf300ae82443df83a5dfa80c582fca", size = 1355161, upload-time = "2026-05-15T16:09:55.177Z" }, + { url = "https://files.pythonhosted.org/packages/82/32/827066cd946447648275a892f494f4572d78e6a79d877fa6b6c14af599d8/pyjson5-2.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c9dca542eeb6e8fbbc1fe3373bfd18ae6250f1aedc78f39242ac12c8837091b8", size = 1208864, upload-time = "2026-05-15T16:09:56.919Z" }, + { url = "https://files.pythonhosted.org/packages/2d/cc/a9bc12aff47d8bfd3074a21e3fb056ec0028fac28f8ec7e0fe4449d050f5/pyjson5-2.0.1-cp313-cp313-win32.whl", hash = "sha256:d30c8b2c91d530be475a8fab6dde8c3bcd3e89b999c9e0f05aec2bf2c24b0638", size = 115461, upload-time = "2026-05-15T16:10:30.711Z" }, + { url = "https://files.pythonhosted.org/packages/c9/c7/fa3fc956fbc3fa6250c8b99ef75a8f52b691780fca1bfb368340283bd898/pyjson5-2.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:67f8f5b8d3e3b2ca5f618c928729986aa00fb588c476c0d0d3a151633ff41e0d", size = 135836, upload-time = "2026-05-15T16:10:32.062Z" }, + { url = "https://files.pythonhosted.org/packages/f0/0a/e457b20d1e36a766d3ccd09c418b7ef41acabb679ff2248bb1cd38247ce6/pyjson5-2.0.1-cp313-cp313-win_arm64.whl", hash = "sha256:bdf30ce5b1242f63254d936b30af75cae237fab0ee71cc2544163c82b6bc9201", size = 116652, upload-time = "2026-05-15T16:10:33.39Z" }, + { url = "https://files.pythonhosted.org/packages/2b/4c/6266789e615576b62d2db6de26a3b4b8f4cc7a8ff23fe24e48363bca1682/pyjson5-2.0.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:954c14d40022fa40e0d36e0ebd337e9e90fd71145592d25a0e2868344e3daca0", size = 320487, upload-time = "2026-05-15T16:09:58.38Z" }, + { url = "https://files.pythonhosted.org/packages/dc/75/c4a563034805e20b274fe4db963e1d480001931d88fe70b7d082033b7dcb/pyjson5-2.0.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:f57529b98d21e8b76f8bc51af9d3c3057dd04a92287fd21ef7ec55255ca6f5c5", size = 166879, upload-time = "2026-05-15T16:09:59.849Z" }, + { url = "https://files.pythonhosted.org/packages/f3/d2/5e6ec3580379794e9a99a402465f74586e93e93814974172202d1254fa89/pyjson5-2.0.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:545b655ef0b59f39fc29e2b63b4dadd45e447ad77bad2fdca859ff4db69e21f5", size = 162235, upload-time = "2026-05-15T16:10:01.147Z" }, + { url = "https://files.pythonhosted.org/packages/5b/48/b2d0e868ef8375eb0696ddc74f71028fc4fcd26cdddaeb34485214f2dc87/pyjson5-2.0.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:b519de49dd4cbf254179749e5c6bfe9bd8fd1f97e7755bff2e17cc6f79f85aa5", size = 182162, upload-time = "2026-05-15T16:10:02.523Z" }, + { url = "https://files.pythonhosted.org/packages/ce/18/fed02a3d68c3badb87394e8420b72d7cb165ade208c1e02561637409aa99/pyjson5-2.0.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de48fbd0466c114c17f408be7bcbc5b3aedeb29ff5f73187022915e6d5eb7817", size = 169487, upload-time = "2026-05-15T16:10:03.876Z" }, + { url = "https://files.pythonhosted.org/packages/8b/90/dc897332dda24e949828616e8e74d7937b587a56789f3aca148fcadddde2/pyjson5-2.0.1-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:fe6516ff9ab94368c18ff8ac0ebdb53fac9e047da093d43e67d5e7cd98cdd0bf", size = 164128, upload-time = "2026-05-15T16:10:05.588Z" }, + { url = "https://files.pythonhosted.org/packages/39/09/90104baeab58adfe63bda804174ef1806b1cabb1692e047fabc2f4aa1799/pyjson5-2.0.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ea7aadacac7ac6661117b708175f6beff75e132322c08bbf3794d8ec4ba572b4", size = 184306, upload-time = "2026-05-15T16:10:06.986Z" }, + { url = "https://files.pythonhosted.org/packages/89/73/613efc3cdab5cf9ec399e6c5a0463b672e5f5cbd693a3a4d82cbdda19476/pyjson5-2.0.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e5c339bcac113dfc30a1f88f23af273d67bb6169abee1684c0dd27daa71a32f9", size = 192239, upload-time = "2026-05-15T16:10:08.727Z" }, + { url = "https://files.pythonhosted.org/packages/47/2a/17b97e02b37ab9353fc9713e56470be3d2539501ed18d6c676cfbcd0a57c/pyjson5-2.0.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:075de0f1e5e0ffee174a8941b5d9d8af632772a6e5eebe92fb0899db7f6ab7fa", size = 177652, upload-time = "2026-05-15T16:10:10.19Z" }, + { url = "https://files.pythonhosted.org/packages/1c/43/a05331ba88fd1aa09ca418548c6b06692e34b2a64b109bb363e01ecafdeb/pyjson5-2.0.1-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c463c9bf508c1d316191898a3c0bfc03dd3de67bdc02f480b0742ac5c859eaeb", size = 174860, upload-time = "2026-05-15T16:10:11.976Z" }, + { url = "https://files.pythonhosted.org/packages/2e/00/5d253751f4d27b7e63fdfd765041593fa588395f45b9cea496878d964448/pyjson5-2.0.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:54427c8cad0c1a516bad5b4457167cde1e7ef7ee563e28a944f59b3c7413b6a0", size = 1151556, upload-time = "2026-05-15T16:10:13.608Z" }, + { url = "https://files.pythonhosted.org/packages/9c/f7/a30eed477295e92dfd59553063cf82bf510a7052efc7720c9c50d0082fdb/pyjson5-2.0.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:ca04839cecd364cb53de7ebcd81fd5915193707d968730ea1c8d4ff5c9c2f1a8", size = 1012330, upload-time = "2026-05-15T16:10:15.171Z" }, + { url = "https://files.pythonhosted.org/packages/9c/60/80818fad90a99336f8bfc686d76d0b2d7c8bb51e8de5d031620fa1a2d7a1/pyjson5-2.0.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:13a2de8b14aeb576b1623c8af419510bf871b8d9cc2308db41a46bcc94d00f2f", size = 1320970, upload-time = "2026-05-15T16:10:16.863Z" }, + { url = "https://files.pythonhosted.org/packages/7c/3f/090eb3e0971d067defb58bbfd738f74a09be495c6f4f00d5d76a10755bca/pyjson5-2.0.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:c8a689f5252e9791bfbc8fa916999202556a1e8c7b24dfd72de1ad84c493e10a", size = 1244775, upload-time = "2026-05-15T16:10:19.416Z" }, + { url = "https://files.pythonhosted.org/packages/61/38/e7546ad733affe51a5462bad21bceb4fd659baf24930bd141627ce56279b/pyjson5-2.0.1-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:3dc0c2c80fd9d1e4c26f8b6c91a54d38b48648b93ae3f09355856c75fda3e460", size = 1182149, upload-time = "2026-05-15T16:10:21.696Z" }, + { url = "https://files.pythonhosted.org/packages/90/2c/016647580d8a82ee53b4cb9ddb96deb4b157ccea9624bba61de4aa2cd25c/pyjson5-2.0.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:13d78b3e2c60b81bd7e6b00e6ab24a664ba1fd64b5d86baa65c4cdfae1fff7ae", size = 1358579, upload-time = "2026-05-15T16:10:23.649Z" }, + { url = "https://files.pythonhosted.org/packages/01/45/8b84ff7a0c4d8c12a76e097c67af62abe986a18d1ab2540764dd6eaa0253/pyjson5-2.0.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a7b640dbeabbd7d975170f793f90a7500cc5d510aeae9364a1bc558bcc5336ed", size = 1211015, upload-time = "2026-05-15T16:10:25.4Z" }, + { url = "https://files.pythonhosted.org/packages/cf/48/d8f34de7a7319f5966bdfd10f133e689ba01f138d2040bf792f1ca8b18e1/pyjson5-2.0.1-cp313-cp313t-win32.whl", hash = "sha256:46e7c5525034fde8abf3aaf100ed7660c1b618ccd3205544ed7c99e4c55cf201", size = 131660, upload-time = "2026-05-15T16:10:26.747Z" }, + { url = "https://files.pythonhosted.org/packages/06/aa/0bd437252134115a846ffc061078c85f8e8c325c86abcaa862c134d3c57e/pyjson5-2.0.1-cp313-cp313t-win_amd64.whl", hash = "sha256:207c00e7f9641e0358bdc848a1c0610f26f2e8bd51d73bd64e5a0ab3b725f1d8", size = 157717, upload-time = "2026-05-15T16:10:28.053Z" }, + { url = "https://files.pythonhosted.org/packages/24/61/7849b04a0dc78f73905189400ac99c45de8eec2ec451ce9c6990fb3588e5/pyjson5-2.0.1-cp313-cp313t-win_arm64.whl", hash = "sha256:4917d5b6186bfa48ec4d85326e2a09769a5f7844963307ab2710429e1f743264", size = 126281, upload-time = "2026-05-15T16:10:29.378Z" }, + { url = "https://files.pythonhosted.org/packages/89/41/70aa1cb1fb0a3ac4c9b8cd405c0c85ba935c53fdfae6271b8eae364b92d1/pyjson5-2.0.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:573fecd7cad4e24d232053f9ebf331c80fe1b0ed6e2064f7614797a7f691e7ca", size = 303706, upload-time = "2026-05-15T16:10:35.163Z" }, + { url = "https://files.pythonhosted.org/packages/0c/d9/caf44bf3d33b9502dc4b8ed5d0c7a8af8fbe33001e82414c0407f39f18bd/pyjson5-2.0.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a8ade508a046a5407a322c098e3b7e6033216b158a7746eb8962b7a4cdbf9248", size = 158915, upload-time = "2026-05-15T16:10:36.496Z" }, + { url = "https://files.pythonhosted.org/packages/3f/94/f2bab1ce2eac8f77e16dcd0a1ba39de20733a84b9961c3504af0dd68bceb/pyjson5-2.0.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4635e349bb1d1f1e854dc790f14be31b6cb198d6453848e8d86818104074f805", size = 154199, upload-time = "2026-05-15T16:10:37.902Z" }, + { url = "https://files.pythonhosted.org/packages/82/c4/d94573ca37486af3d6a72f2582844d7d490d8e55639e0cfba371ce91442f/pyjson5-2.0.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3d274697f81f143abac12ce256a06b61635c30d0f8cc11eefae7182655dac9a5", size = 186060, upload-time = "2026-05-15T16:10:39.603Z" }, + { url = "https://files.pythonhosted.org/packages/03/cc/c42e697def319b286fdcb912939c044cc94bd1cfc7338b6dbb566f817f29/pyjson5-2.0.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be4e2242e55a2651fd8696cfd67ec8e04f54f4ed6c089cceea2b63763a7516d8", size = 165796, upload-time = "2026-05-15T16:10:40.967Z" }, + { url = "https://files.pythonhosted.org/packages/3f/dd/f22a5f0e619ef22b8e32520a91bd92f815d50f9ec2d67cfe5974eab9476c/pyjson5-2.0.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:af855c680feaa39cae4a44914ee2863eeae1549f37ce58069c747b3d4803999a", size = 165262, upload-time = "2026-05-15T16:10:42.391Z" }, + { url = "https://files.pythonhosted.org/packages/99/8b/90e22ecb12d51ccdc68325b6b051002e6103cc4600a335d9ed13828acdd9/pyjson5-2.0.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bb769d90516da904e6cf0ba58f3d5830f4a5804486b5e85c5ca42ba3146d187a", size = 181608, upload-time = "2026-05-15T16:10:43.914Z" }, + { url = "https://files.pythonhosted.org/packages/e0/ab/237f9036eed73e08cf8861466d3d1182ef1c88506bd29955740dcadb24ff/pyjson5-2.0.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6484c14e07aa46abeb3cb2ff0204a765260763ad7cf3f87f601f26b20ed607f3", size = 189582, upload-time = "2026-05-15T16:10:45.367Z" }, + { url = "https://files.pythonhosted.org/packages/c4/3d/3df8d5f003910a9291e5f04fa178f626e3c8553a5986dc62589ca74195ff/pyjson5-2.0.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cc03673adb544324500d79b2acfe2ced038998b2aceb564d335de9cc238cbdb0", size = 176321, upload-time = "2026-05-15T16:10:47.134Z" }, + { url = "https://files.pythonhosted.org/packages/c0/d9/a458a54f780bafec1b44ee3c27cb3007a83fb7bd4f1c17ac6bf519fd6151/pyjson5-2.0.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5d714daf784bec2e14fc06c0c26e4a373a6157eaeddaed2d5a7b7b6ae2aabc33", size = 171956, upload-time = "2026-05-15T16:10:49.174Z" }, + { url = "https://files.pythonhosted.org/packages/78/d8/1010e0147c8862dc0881cf3656364d3d87a5e336d290fe4cb0b92223e14c/pyjson5-2.0.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:5cf3ded356730e08b5941a16db6525efc0de26f35468ab09ad573056c4efc6e5", size = 1147679, upload-time = "2026-05-15T16:10:51.005Z" }, + { url = "https://files.pythonhosted.org/packages/19/2f/91c8d8cdb4a2e4bbe8f14b9b57d717988e14830f2ed4a4f08d503cb5edde/pyjson5-2.0.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:cc00d4669fb4170c28b2c9ed3cd1c2af9f21727c55d6866030cc154f31f68747", size = 1008216, upload-time = "2026-05-15T16:10:53.252Z" }, + { url = "https://files.pythonhosted.org/packages/d7/d7/25c3f8693660a35be7bb4eb71b0d10d9a6981e986723a4881d607f0c6462/pyjson5-2.0.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:a77a91c2e019476345c03cde105da44100daaabc3fa56f82f2bd9eb2ebbcb698", size = 1323856, upload-time = "2026-05-15T16:10:55.517Z" }, + { url = "https://files.pythonhosted.org/packages/c8/25/82f0f83556ff68ec0ca1129ba9afeb14149cd421dc74823cdf10c209c95c/pyjson5-2.0.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:9ae54e5d717982cb7a082c700ab1f7f965c6aedea6fcb003ec4bdeac4f02bf52", size = 1241860, upload-time = "2026-05-15T16:10:57.635Z" }, + { url = "https://files.pythonhosted.org/packages/c1/01/2c4695fc06a0f3f29041a875d3bb24f904c9ae7b3d8dbfa1f8db17ce995c/pyjson5-2.0.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:ce4f5b67b3a6fab623a31d83416b51a5b2c97cb172194f214078484bbb4783a6", size = 1178443, upload-time = "2026-05-15T16:10:59.398Z" }, + { url = "https://files.pythonhosted.org/packages/9a/ae/c10f534037b096aca21b90017ac9d41f791572dc3ec31fcd92db8ddcd256/pyjson5-2.0.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f8d2e61f7bed0b40cfe5f62375581bf56d7b5b9707c9d74747b5931149d7d376", size = 1357739, upload-time = "2026-05-15T16:11:01.189Z" }, + { url = "https://files.pythonhosted.org/packages/0c/f0/655224f78ede087aa6a295c4745423e0104dd31f67928675b1a4cea72a0a/pyjson5-2.0.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2930140edd1a64eb42689993c5ae317bca2e6bc785b5dc5053bd5e9d184c98ad", size = 1209542, upload-time = "2026-05-15T16:11:03.364Z" }, + { url = "https://files.pythonhosted.org/packages/73/52/a7b2a26625136fcd0f92e17beaaae51e04923cc2e28502db354d4de061b4/pyjson5-2.0.1-cp314-cp314-win32.whl", hash = "sha256:51733f91dda897239ca10928f363ce6f4b5eadaf797e74477f6c1c3222c185a7", size = 118342, upload-time = "2026-05-15T16:11:40.009Z" }, + { url = "https://files.pythonhosted.org/packages/3a/8e/79db426fff3a41610076989d4060cc18a6508ebd3c7877155f6709eea102/pyjson5-2.0.1-cp314-cp314-win_amd64.whl", hash = "sha256:698c73aacff49ea35bbbf7f700a97785626201ea7aa2e1f1e0a4fe23788c3be2", size = 138408, upload-time = "2026-05-15T16:11:41.757Z" }, + { url = "https://files.pythonhosted.org/packages/c7/1b/385da14c05412bca15e86551dde91959686c8bddf7e78722bdc627fa6815/pyjson5-2.0.1-cp314-cp314-win_arm64.whl", hash = "sha256:d447e2e5756f89abfd0ad82d1438075bcbc701c1cc9279b43d24825aaac67356", size = 120905, upload-time = "2026-05-15T16:11:43.146Z" }, + { url = "https://files.pythonhosted.org/packages/dd/04/cd69739556d304d3ea48064ea7d47e5ff7321b0032d7ad78864bceaa0cae/pyjson5-2.0.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:5603be4f0cb9685d7c2cbd408ddec21b33f415252bee00ac7969f20b5789a1d1", size = 321150, upload-time = "2026-05-15T16:11:05.07Z" }, + { url = "https://files.pythonhosted.org/packages/84/d4/6d98268ed07a2cac1e79634fcd3dc280d2503ade5f3c465f7aa095951444/pyjson5-2.0.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:87267520a256b3f2dba7f2995b745e8b3f2dd72bbf8436010a5191f7809f8ab6", size = 167540, upload-time = "2026-05-15T16:11:06.822Z" }, + { url = "https://files.pythonhosted.org/packages/c8/c6/8855a9462bdbc8306cba62793e23cc2952dfcbcbcab8e0413f570c891361/pyjson5-2.0.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:77e58307b74019d90aff9f2781bcffbbea3315b15fc814f8fa9b8d334b956ff4", size = 162533, upload-time = "2026-05-15T16:11:08.218Z" }, + { url = "https://files.pythonhosted.org/packages/a6/a3/1092f68538ee71ed8027393ab5e71aa9c4a114e493e30a55e46e34c2ffb9/pyjson5-2.0.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:dd1712038837342dea73ed526883e53c6e85a158242b6f574b9ad9cdd3199c7f", size = 184165, upload-time = "2026-05-15T16:11:09.639Z" }, + { url = "https://files.pythonhosted.org/packages/46/63/bb9f42a4047284ea59064c134c88dfac3b7f5273e40fe548d6a086cea452/pyjson5-2.0.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1dba36677c77aed5d680827c65478933705ca156a34838f1250ea191ffc27662", size = 170075, upload-time = "2026-05-15T16:11:11.105Z" }, + { url = "https://files.pythonhosted.org/packages/55/2a/0379aa5184e986d0f9af2919712c148d81928ce7d2d7950407e271b1df3b/pyjson5-2.0.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:04356d0c09e58907f60675d33859f269473479b90add5026231ef2fadba5207e", size = 164100, upload-time = "2026-05-15T16:11:12.909Z" }, + { url = "https://files.pythonhosted.org/packages/15/d5/2087af69695c28c7fe796afc73dec7f0b0b9bc123ec329e45928d58d4705/pyjson5-2.0.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b331a0fbe2ae26f4ccb88045ebaecc00aeeeab23ff858f9a2223cedd969ec6d6", size = 184674, upload-time = "2026-05-15T16:11:14.448Z" }, + { url = "https://files.pythonhosted.org/packages/2a/06/cf1b2744e07f1689cb0ac663e162a060b81cd358474754fe9f3bf02d5398/pyjson5-2.0.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5ca55878d923ba5764254ad1c020c22b33e6161b3555d1f457b8060f2b3c6c17", size = 193047, upload-time = "2026-05-15T16:11:15.969Z" }, + { url = "https://files.pythonhosted.org/packages/54/e6/a6b0deb6a3f393907c6d9115a7ac8e27557109204b56b05d3b57c51fc2ca/pyjson5-2.0.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:35e18d11e4c2034b78a664affe18c153a8efbf8872cf6bed7f12dc4fb819d440", size = 178712, upload-time = "2026-05-15T16:11:17.364Z" }, + { url = "https://files.pythonhosted.org/packages/6e/48/9e5c16daba56dfdb481baab85d1197e14ae3f403902fc23cdca14d14351b/pyjson5-2.0.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b710a7489b6e134890eaa1fdb285e9644a1e730c1cfcf1cd90a87859b87a84a9", size = 175642, upload-time = "2026-05-15T16:11:18.781Z" }, + { url = "https://files.pythonhosted.org/packages/c3/32/f07d4dbd8cf733f9e3f3e9c9abedfbc23da1e5cfa7fed46aebae07ca6f25/pyjson5-2.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:08920c0dd6aba3fb6bc6c849e6f05731c5fb2716cd651de424ff60cdd12eae65", size = 1152219, upload-time = "2026-05-15T16:11:20.54Z" }, + { url = "https://files.pythonhosted.org/packages/01/9d/0ddbb89d381bc27f3740850d5d664c1f6f76620ad879ff5eb2506a4dfd6c/pyjson5-2.0.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:e166dadb3275025cff5ee8602131372a3ea171c6727b3fc6e44697348e3972c5", size = 1013305, upload-time = "2026-05-15T16:11:22.702Z" }, + { url = "https://files.pythonhosted.org/packages/bb/93/0f44886391dd2249ad9cf98c2deb3f26d1a115dd5a215629af7455765968/pyjson5-2.0.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:ea3c2b4e7b8e209e7f59bd6a925d79b69cd0a4ffa12f2df0c6af55514c8b2227", size = 1322840, upload-time = "2026-05-15T16:11:24.918Z" }, + { url = "https://files.pythonhosted.org/packages/d4/29/c478dc24dfcfc07e407ff8669df265ecc51fed5e7d47e51a01f17fd1c53f/pyjson5-2.0.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b710fc8ce00c984c8865131f05a8536163e1d3caffb9d081647879eca7424670", size = 1245221, upload-time = "2026-05-15T16:11:26.873Z" }, + { url = "https://files.pythonhosted.org/packages/e2/f0/5fef8c47c5b7052da79af6425a021040402a9a09b37c5687d91f98696a27/pyjson5-2.0.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:a9784d79275d1b06d95f2920c3f260ce5d3f6671f65a1fae1464f83fbfc834a0", size = 1182991, upload-time = "2026-05-15T16:11:29.258Z" }, + { url = "https://files.pythonhosted.org/packages/90/33/4d3a9d3159cdff1f1886d39f1991e6c8d5927f9b606cfc9743b5bef98c2a/pyjson5-2.0.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0ef86c53d0e14991b5b0fe58f225e3d8faec437aa0a70da4762525b6bc2fca10", size = 1359104, upload-time = "2026-05-15T16:11:31.651Z" }, + { url = "https://files.pythonhosted.org/packages/0f/04/20eb16c52453aea0af68a697f4058378c9ff871bd2f0bea28eb76ffe12f8/pyjson5-2.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:1d9faccf5a9e86f14104eec31c13428ef8baeb867182ce107e0c68fcc5c62477", size = 1212847, upload-time = "2026-05-15T16:11:33.767Z" }, + { url = "https://files.pythonhosted.org/packages/b9/a3/69bbe93275eafb7802a5b29230cc5c28f9b924c68d15b3ab2d43cfe19825/pyjson5-2.0.1-cp314-cp314t-win32.whl", hash = "sha256:2df497af7ab03cf82d9278a4707a83d0ae4e6d727f919a883b5ccec3f7d92650", size = 139137, upload-time = "2026-05-15T16:11:35.487Z" }, + { url = "https://files.pythonhosted.org/packages/48/45/b865ca6e0ae6887bc2b6b17cd123470ae43ac0fa04a2362d77d4b9f5bd43/pyjson5-2.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:3b31cf4f4a4f01800812865af3b02f6700cefb9377e4d9a9c6b78fdcf41fd973", size = 169412, upload-time = "2026-05-15T16:11:36.887Z" }, + { url = "https://files.pythonhosted.org/packages/68/55/02c734459fef0a955ab3e7e745df415d5f9fc873a4c288765f60f22fbc13/pyjson5-2.0.1-cp314-cp314t-win_arm64.whl", hash = "sha256:15f0d8baea89d35c6c01c60b944c778a79cac10f77f71b727f1b244e2c7a8ccb", size = 129061, upload-time = "2026-05-15T16:11:38.712Z" }, +] + [[package]] name = "pylint" version = "4.0.6" @@ -1667,6 +1823,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ab/da/acb2e7d4dbd2dfb792d38c0d850481f29ad7049b356d23f56c687d35203b/pylint-4.0.6-py3-none-any.whl", hash = "sha256:d11a0e1fdb7b1cd46ec5d6fc78fee8b95f28695b2d6140e5809925f61e32ea54", size = 538389, upload-time = "2026-06-14T14:43:24.873Z" }, ] +[[package]] +name = "pymarkdownlnt" +version = "0.9.39" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "application-file-scanner" }, + { name = "application-properties" }, + { name = "columnar" }, + { name = "py-walk" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d4/aa/9f6ac3a91b5c02cedb5ada2ae12fddf4954fe3faab176941a68510e9830e/pymarkdownlnt-0.9.39.tar.gz", hash = "sha256:5f422d593244942e4b545b54b512f6b7e509f907752d707695c051bfe8584948", size = 454763, upload-time = "2026-07-12T01:14:22.332Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/68/4f/9e129701e6799733fd541d0e4bc624695e70259b4c279dd43fb124e4ff63/pymarkdownlnt-0.9.39-py3-none-any.whl", hash = "sha256:3e6f32517c7cc088dc466830b43ca7a04326bd4fc62d7f5379925ae7ee2f5ad9", size = 532072, upload-time = "2026-07-12T01:14:20.995Z" }, +] + [[package]] name = "pytest" version = "9.1.1" @@ -1709,17 +1881,35 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, ] +[[package]] +name = "python-debian" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/75/36/f90e7d006dd9311a6185f1c34b403dd6d76ff583e7962c56e9374c462a48/python_debian-1.1.1.tar.gz", hash = "sha256:fe4fc3dc798dbf1f0ef5865e2b1b4f7cc0352b6a511b25ab7594906c64a73629", size = 127956, upload-time = "2026-06-07T11:06:58.282Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6e/47/e184f0004e63dbc49c4bad5e811218f66bece1b519f80b06a619b42e6ec3/python_debian-1.1.1-py3-none-any.whl", hash = "sha256:f98ae013e8e5310e49041cc3860a7105df73af73d4ff1d8afb474770d328a6ad", size = 138101, upload-time = "2026-06-07T11:06:56.632Z" }, +] + [[package]] name = "python-discovery" -version = "1.4.4" +version = "1.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "filelock" }, { name = "platformdirs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4c/81/58c70036dffeccb7fe7d79d6260c69f7a28272bbd3909c29a01ea9422744/python_discovery-1.4.4.tar.gz", hash = "sha256:5cad33982d412c1f3ffb8f9ca4ea292c9680bca3942451d30b69c37fce53a4a3", size = 72212, upload-time = "2026-07-08T23:06:50.691Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/51/276f964496a5714ab9f320896195639086881c2b39c03b5ad13de84acbb8/python_discovery-1.5.0.tar.gz", hash = "sha256:3e014c6327154d3dda27939a9a0dc9c5c000439f1906d3f303b48f984bd2ecef", size = 72483, upload-time = "2026-07-21T13:14:14.641Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9d/ae/84bc0d2440c95772272bb6f4b3d09ccf08b2898fce89b3d4f969a9fc74e9/python_discovery-1.4.4-py3-none-any.whl", hash = "sha256:abebe9120b43453b68c908acfb1e72a19d1a959ed2cb620ad38fc57d08056dbe", size = 34181, upload-time = "2026-07-08T23:06:49.402Z" }, + { url = "https://files.pythonhosted.org/packages/c7/7b/14882602ddee241d7984a742fcb423cb4a30fb0d6efc546ac3129fba475a/python_discovery-1.5.0-py3-none-any.whl", hash = "sha256:70c4fc61b4e7404e44f01d6fc44a715c4d685ca6cea83d295922f05891877c98", size = 34205, upload-time = "2026-07-21T13:14:13.398Z" }, +] + +[[package]] +name = "python-magic" +version = "0.4.27" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/da/db/0b3e28ac047452d079d375ec6798bf76a036a08182dbb39ed38116a49130/python-magic-0.4.27.tar.gz", hash = "sha256:c1ba14b08e4a5f5c31a302b7721239695b2f0f058d125bd5ce1ee36b9d9d3c3b", size = 14677, upload-time = "2022-06-07T20:16:59.508Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6c/73/9f872cb81fc5c3bb48f7227872c28975f998f3e7c2b1c16e95e6432bbb90/python_magic-0.4.27-py2.py3-none-any.whl", hash = "sha256:c212960ad306f700aa0d01e5d7a325d20548ff97eb9920dcd29513174f0294d3", size = 13840, upload-time = "2022-06-07T20:16:57.763Z" }, ] [[package]] @@ -1849,6 +2039,29 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, ] +[[package]] +name = "reuse" +version = "6.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "click" }, + { name = "jinja2" }, + { name = "license-expression" }, + { name = "python-debian" }, + { name = "python-magic" }, + { name = "tomlkit" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/05/35/298d9410b3635107ce586725cdfbca4c219c08d77a3511551f5e479a78db/reuse-6.2.0.tar.gz", hash = "sha256:4feae057a2334c9a513e6933cdb9be819d8b822f3b5b435a36138bd218897d23", size = 1615611, upload-time = "2025-10-27T15:25:46.336Z" } + +[package.optional-dependencies] +chardet = [ + { name = "chardet" }, +] +charset-normalizer = [ + { name = "charset-normalizer" }, +] + [[package]] name = "roman-numerals" version = "4.1.0" @@ -1988,6 +2201,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, ] +[[package]] +name = "sly" +version = "0.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/41/8a/59e943f7b27904c7756a7b565ffbd55f3841f5cd3d2da2b2b0713c49e488/sly-0.5.tar.gz", hash = "sha256:251d42015e8507158aec2164f06035df4a82b0314ce6450f457d7125e7649024", size = 66702, upload-time = "2022-10-25T14:35:30.592Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/4d/c96d807295183f2360329cd8d8bf5e8072c53d664125b3858c04153f026e/sly-0.5-py3-none-any.whl", hash = "sha256:20485483259eec7f6ba85ff4d2e96a4e50c6621902667fc2695cc8bc2a3e5133", size = 28864, upload-time = "2022-10-25T14:35:28.054Z" }, +] + [[package]] name = "smmap" version = "5.0.3" @@ -2201,6 +2423,51 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/99/55/db07de81b5c630da5cbf5c7df646580ca26dfaefa593667fc6f2fe016d2e/tabulate-0.10.0-py3-none-any.whl", hash = "sha256:f0b0622e567335c8fabaaa659f1b33bcb6ddfe2e496071b743aa113f8774f2d3", size = 39814, upload-time = "2026-03-04T18:55:31.284Z" }, ] +[[package]] +name = "tomli" +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/ba/42f134a3fe2b370f555f44b1d72feebb94debcab01676bf918d0cb70e9aa/tomli-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c742f741d58a28940ce01d58f0ab2ea3ced8b12402f162f4d534dfe18ba1cd6a", size = 155924, upload-time = "2026-03-25T20:21:21.626Z" }, + { url = "https://files.pythonhosted.org/packages/dc/c7/62d7a17c26487ade21c5422b646110f2162f1fcc95980ef7f63e73c68f14/tomli-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7f86fd587c4ed9dd76f318225e7d9b29cfc5a9d43de44e5754db8d1128487085", size = 150018, upload-time = "2026-03-25T20:21:23.002Z" }, + { url = "https://files.pythonhosted.org/packages/5c/05/79d13d7c15f13bdef410bdd49a6485b1c37d28968314eabee452c22a7fda/tomli-2.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff18e6a727ee0ab0388507b89d1bc6a22b138d1e2fa56d1ad494586d61d2eae9", size = 244948, upload-time = "2026-03-25T20:21:24.04Z" }, + { url = "https://files.pythonhosted.org/packages/10/90/d62ce007a1c80d0b2c93e02cab211224756240884751b94ca72df8a875ca/tomli-2.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:136443dbd7e1dee43c68ac2694fde36b2849865fa258d39bf822c10e8068eac5", size = 253341, upload-time = "2026-03-25T20:21:25.177Z" }, + { url = "https://files.pythonhosted.org/packages/1a/7e/caf6496d60152ad4ed09282c1885cca4eea150bfd007da84aea07bcc0a3e/tomli-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e262d41726bc187e69af7825504c933b6794dc3fbd5945e41a79bb14c31f585", size = 248159, upload-time = "2026-03-25T20:21:26.364Z" }, + { url = "https://files.pythonhosted.org/packages/99/e7/c6f69c3120de34bbd882c6fba7975f3d7a746e9218e56ab46a1bc4b42552/tomli-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5cb41aa38891e073ee49d55fbc7839cfdb2bc0e600add13874d048c94aadddd1", size = 253290, upload-time = "2026-03-25T20:21:27.46Z" }, + { url = "https://files.pythonhosted.org/packages/d6/2f/4a3c322f22c5c66c4b836ec58211641a4067364f5dcdd7b974b4c5da300c/tomli-2.4.1-cp312-cp312-win32.whl", hash = "sha256:da25dc3563bff5965356133435b757a795a17b17d01dbc0f42fb32447ddfd917", size = 98141, upload-time = "2026-03-25T20:21:28.492Z" }, + { url = "https://files.pythonhosted.org/packages/24/22/4daacd05391b92c55759d55eaee21e1dfaea86ce5c571f10083360adf534/tomli-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:52c8ef851d9a240f11a88c003eacb03c31fc1c9c4ec64a99a0f922b93874fda9", size = 108847, upload-time = "2026-03-25T20:21:29.386Z" }, + { url = "https://files.pythonhosted.org/packages/68/fd/70e768887666ddd9e9f5d85129e84910f2db2796f9096aa02b721a53098d/tomli-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:f758f1b9299d059cc3f6546ae2af89670cb1c4d48ea29c3cacc4fe7de3058257", size = 95088, upload-time = "2026-03-25T20:21:30.677Z" }, + { url = "https://files.pythonhosted.org/packages/07/06/b823a7e818c756d9a7123ba2cda7d07bc2dd32835648d1a7b7b7a05d848d/tomli-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36d2bd2ad5fb9eaddba5226aa02c8ec3fa4f192631e347b3ed28186d43be6b54", size = 155866, upload-time = "2026-03-25T20:21:31.65Z" }, + { url = "https://files.pythonhosted.org/packages/14/6f/12645cf7f08e1a20c7eb8c297c6f11d31c1b50f316a7e7e1e1de6e2e7b7e/tomli-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb0dc4e38e6a1fd579e5d50369aa2e10acfc9cace504579b2faabb478e76941a", size = 149887, upload-time = "2026-03-25T20:21:33.028Z" }, + { url = "https://files.pythonhosted.org/packages/5c/e0/90637574e5e7212c09099c67ad349b04ec4d6020324539297b634a0192b0/tomli-2.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7f2c7f2b9ca6bdeef8f0fa897f8e05085923eb091721675170254cbc5b02897", size = 243704, upload-time = "2026-03-25T20:21:34.51Z" }, + { url = "https://files.pythonhosted.org/packages/10/8f/d3ddb16c5a4befdf31a23307f72828686ab2096f068eaf56631e136c1fdd/tomli-2.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3c6818a1a86dd6dca7ddcaaf76947d5ba31aecc28cb1b67009a5877c9a64f3f", size = 251628, upload-time = "2026-03-25T20:21:36.012Z" }, + { url = "https://files.pythonhosted.org/packages/e3/f1/dbeeb9116715abee2485bf0a12d07a8f31af94d71608c171c45f64c0469d/tomli-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d312ef37c91508b0ab2cee7da26ec0b3ed2f03ce12bd87a588d771ae15dcf82d", size = 247180, upload-time = "2026-03-25T20:21:37.136Z" }, + { url = "https://files.pythonhosted.org/packages/d3/74/16336ffd19ed4da28a70959f92f506233bd7cfc2332b20bdb01591e8b1d1/tomli-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51529d40e3ca50046d7606fa99ce3956a617f9b36380da3b7f0dd3dd28e68cb5", size = 251674, upload-time = "2026-03-25T20:21:38.298Z" }, + { url = "https://files.pythonhosted.org/packages/16/f9/229fa3434c590ddf6c0aa9af64d3af4b752540686cace29e6281e3458469/tomli-2.4.1-cp313-cp313-win32.whl", hash = "sha256:2190f2e9dd7508d2a90ded5ed369255980a1bcdd58e52f7fe24b8162bf9fedbd", size = 97976, upload-time = "2026-03-25T20:21:39.316Z" }, + { url = "https://files.pythonhosted.org/packages/6a/1e/71dfd96bcc1c775420cb8befe7a9d35f2e5b1309798f009dca17b7708c1e/tomli-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d65a2fbf9d2f8352685bc1364177ee3923d6baf5e7f43ea4959d7d8bc326a36", size = 108755, upload-time = "2026-03-25T20:21:40.248Z" }, + { url = "https://files.pythonhosted.org/packages/83/7a/d34f422a021d62420b78f5c538e5b102f62bea616d1d75a13f0a88acb04a/tomli-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:4b605484e43cdc43f0954ddae319fb75f04cc10dd80d830540060ee7cd0243cd", size = 95265, upload-time = "2026-03-25T20:21:41.219Z" }, + { url = "https://files.pythonhosted.org/packages/3c/fb/9a5c8d27dbab540869f7c1f8eb0abb3244189ce780ba9cd73f3770662072/tomli-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fd0409a3653af6c147209d267a0e4243f0ae46b011aa978b1080359fddc9b6cf", size = 155726, upload-time = "2026-03-25T20:21:42.23Z" }, + { url = "https://files.pythonhosted.org/packages/62/05/d2f816630cc771ad836af54f5001f47a6f611d2d39535364f148b6a92d6b/tomli-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a120733b01c45e9a0c34aeef92bf0cf1d56cfe81ed9d47d562f9ed591a9828ac", size = 149859, upload-time = "2026-03-25T20:21:43.386Z" }, + { url = "https://files.pythonhosted.org/packages/ce/48/66341bdb858ad9bd0ceab5a86f90eddab127cf8b046418009f2125630ecb/tomli-2.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:559db847dc486944896521f68d8190be1c9e719fced785720d2216fe7022b662", size = 244713, upload-time = "2026-03-25T20:21:44.474Z" }, + { url = "https://files.pythonhosted.org/packages/df/6d/c5fad00d82b3c7a3ab6189bd4b10e60466f22cfe8a08a9394185c8a8111c/tomli-2.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01f520d4f53ef97964a240a035ec2a869fe1a37dde002b57ebc4417a27ccd853", size = 252084, upload-time = "2026-03-25T20:21:45.62Z" }, + { url = "https://files.pythonhosted.org/packages/00/71/3a69e86f3eafe8c7a59d008d245888051005bd657760e96d5fbfb0b740c2/tomli-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7f94b27a62cfad8496c8d2513e1a222dd446f095fca8987fceef261225538a15", size = 247973, upload-time = "2026-03-25T20:21:46.937Z" }, + { url = "https://files.pythonhosted.org/packages/67/50/361e986652847fec4bd5e4a0208752fbe64689c603c7ae5ea7cb16b1c0ca/tomli-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ede3e6487c5ef5d28634ba3f31f989030ad6af71edfb0055cbbd14189ff240ba", size = 256223, upload-time = "2026-03-25T20:21:48.467Z" }, + { url = "https://files.pythonhosted.org/packages/8c/9a/b4173689a9203472e5467217e0154b00e260621caa227b6fa01feab16998/tomli-2.4.1-cp314-cp314-win32.whl", hash = "sha256:3d48a93ee1c9b79c04bb38772ee1b64dcf18ff43085896ea460ca8dec96f35f6", size = 98973, upload-time = "2026-03-25T20:21:49.526Z" }, + { url = "https://files.pythonhosted.org/packages/14/58/640ac93bf230cd27d002462c9af0d837779f8773bc03dee06b5835208214/tomli-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:88dceee75c2c63af144e456745e10101eb67361050196b0b6af5d717254dddf7", size = 109082, upload-time = "2026-03-25T20:21:50.506Z" }, + { url = "https://files.pythonhosted.org/packages/d5/2f/702d5e05b227401c1068f0d386d79a589bb12bf64c3d2c72ce0631e3bc49/tomli-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:b8c198f8c1805dc42708689ed6864951fd2494f924149d3e4bce7710f8eb5232", size = 96490, upload-time = "2026-03-25T20:21:51.474Z" }, + { url = "https://files.pythonhosted.org/packages/45/4b/b877b05c8ba62927d9865dd980e34a755de541eb65fffba52b4cc495d4d2/tomli-2.4.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d4d8fe59808a54658fcc0160ecfb1b30f9089906c50b23bcb4c69eddc19ec2b4", size = 164263, upload-time = "2026-03-25T20:21:52.543Z" }, + { url = "https://files.pythonhosted.org/packages/24/79/6ab420d37a270b89f7195dec5448f79400d9e9c1826df982f3f8e97b24fd/tomli-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7008df2e7655c495dd12d2a4ad038ff878d4ca4b81fccaf82b714e07eae4402c", size = 160736, upload-time = "2026-03-25T20:21:53.674Z" }, + { url = "https://files.pythonhosted.org/packages/02/e0/3630057d8eb170310785723ed5adcdfb7d50cb7e6455f85ba8a3deed642b/tomli-2.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d8591993e228b0c930c4bb0db464bdad97b3289fb981255d6c9a41aedc84b2d", size = 270717, upload-time = "2026-03-25T20:21:55.129Z" }, + { url = "https://files.pythonhosted.org/packages/7a/b4/1613716072e544d1a7891f548d8f9ec6ce2faf42ca65acae01d76ea06bb0/tomli-2.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:734e20b57ba95624ecf1841e72b53f6e186355e216e5412de414e3c51e5e3c41", size = 278461, upload-time = "2026-03-25T20:21:56.228Z" }, + { url = "https://files.pythonhosted.org/packages/05/38/30f541baf6a3f6df77b3df16b01ba319221389e2da59427e221ef417ac0c/tomli-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8a650c2dbafa08d42e51ba0b62740dae4ecb9338eefa093aa5c78ceb546fcd5c", size = 274855, upload-time = "2026-03-25T20:21:57.653Z" }, + { url = "https://files.pythonhosted.org/packages/77/a3/ec9dd4fd2c38e98de34223b995a3b34813e6bdadf86c75314c928350ed14/tomli-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:504aa796fe0569bb43171066009ead363de03675276d2d121ac1a4572397870f", size = 283144, upload-time = "2026-03-25T20:21:59.089Z" }, + { url = "https://files.pythonhosted.org/packages/ef/be/605a6261cac79fba2ec0c9827e986e00323a1945700969b8ee0b30d85453/tomli-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:b1d22e6e9387bf4739fbe23bfa80e93f6b0373a7f1b96c6227c32bef95a4d7a8", size = 108683, upload-time = "2026-03-25T20:22:00.214Z" }, + { url = "https://files.pythonhosted.org/packages/12/64/da524626d3b9cc40c168a13da8335fe1c51be12c0a63685cc6db7308daae/tomli-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2c1c351919aca02858f740c6d33adea0c5deea37f9ecca1cc1ef9e884a619d26", size = 121196, upload-time = "2026-03-25T20:22:01.169Z" }, + { url = "https://files.pythonhosted.org/packages/5a/cd/e80b62269fc78fc36c9af5a6b89c835baa8af28ff5ad28c7028d60860320/tomli-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:eab21f45c7f66c13f2a9e0e1535309cee140182a9cdae1e041d02e47291e8396", size = 100393, upload-time = "2026-03-25T20:22:02.137Z" }, + { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, +] + [[package]] name = "tomlkit" version = "0.15.1" @@ -2210,6 +2477,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/13/bc/8c13eb66537dce1d2bd3a57132902f38d0e7f5bb46fa9f4daed9fe9d76ee/tomlkit-0.15.1-py3-none-any.whl", hash = "sha256:177a05aece5a8ca5266fd3c448abb47b8d352f09d477d3ca8332db4d89b24304", size = 49449, upload-time = "2026-07-17T01:48:05.728Z" }, ] +[[package]] +name = "toolz" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/11/d6/114b492226588d6ff54579d95847662fc69196bdeec318eb45393b24c192/toolz-1.1.0.tar.gz", hash = "sha256:27a5c770d068c110d9ed9323f24f1543e83b2f300a687b7891c1a6d56b697b5b", size = 52613, upload-time = "2025-10-17T04:03:21.661Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl", hash = "sha256:15ccc861ac51c53696de0a5d6d4607f99c210739caf987b5d2054f3efed429d8", size = 58093, upload-time = "2025-10-17T04:03:20.435Z" }, +] + [[package]] name = "tornado" version = "6.5.7" @@ -2278,7 +2554,7 @@ wheels = [ [[package]] name = "virtualenv" -version = "21.6.1" +version = "21.7.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "distlib" }, @@ -2286,9 +2562,9 @@ dependencies = [ { name = "platformdirs" }, { name = "python-discovery" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/34/d9/b477fddb68840b570af8b22afe9b035cbc277b5fb7b33dea390617a8b10f/virtualenv-21.6.1.tar.gz", hash = "sha256:15f978b7cd329f24855ff4a0c4b4899cc7678589f49adbdcbbb4d3232e641128", size = 5526620, upload-time = "2026-07-10T19:33:53.312Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/25/e367a7229b0914772ca8d81b41fde012d9feda68523b52644a571bb21ce8/virtualenv-21.7.0.tar.gz", hash = "sha256:7f9519b9432ff11b6e1a3e94061664efc2ff99ea21780e3cf4f6bd0a5da8b37c", size = 5527510, upload-time = "2026-07-21T13:12:14.109Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/7c/4e7225d46d634a0d8d534dd8a6ce0c319d09b4d0cf0337eb314ca4789d8c/virtualenv-21.6.1-py3-none-any.whl", hash = "sha256:afe991df855715a2b2f60edfcc0107ef95a79fdfd8cb4cdaa71603d1c12e463b", size = 5506392, upload-time = "2026-07-10T19:33:51.629Z" }, + { url = "https://files.pythonhosted.org/packages/a5/7a/ae29312b1e88a22e81f5d21fc11526d2a114089776c2550d2b205b6c2a47/virtualenv-21.7.0-py3-none-any.whl", hash = "sha256:a8370c1c5530fbabf955e40b8fbbc68a431648b10f9433faa587db30a06e51dd", size = 5507078, upload-time = "2026-07-21T13:12:12.136Z" }, ] [[package]]