diff --git a/.github/WORKFLOWS.md b/.github/WORKFLOWS.md index f16c617..9c469ea 100644 --- a/.github/WORKFLOWS.md +++ b/.github/WORKFLOWS.md @@ -22,7 +22,7 @@ GitHub Actions and CI/CD helpers for this repository (see [`.github/`](../.githu | [`workflows/ci-package.yml`](workflows/ci-package.yml) | Build and package checks | | [`workflows/ci-dependencies.yml`](workflows/ci-dependencies.yml) | Dependency and license audit | | [`workflows/ci-weblate-pin.yml`](workflows/ci-weblate-pin.yml) | **Weblate version sync** — callable from CI; runs [`scripts/check-weblate-pin-sync.sh`](../scripts/check-weblate-pin-sync.sh) so `pyproject.toml` and `Dockerfile.weblate-plugin` pins match | -| [`workflows/weblate-pin-bump.yml`](workflows/weblate-pin-bump.yml) | Scheduled Weblate pin bump (PyPI + Docker + `uv.lock`) | +| [`workflows/weblate-pin-bump.yml`](workflows/weblate-pin-bump.yml) | Scheduled Weblate pin bump (PyPI + Docker + `uv.lock`); runs **upstream contract check** ([`scripts/check-weblate-internal-contract.sh`](../scripts/check-weblate-internal-contract.sh) `--latest`) before bump/PR | | [`workflows/ci-plugin-smoke.yml`](workflows/ci-plugin-smoke.yml) | Plugin smoke (Docker stack) | | [`workflows/ci-plugin-functional.yml`](workflows/ci-plugin-functional.yml) | Plugin functional tests | | [`workflows/ci-plugin-auth.yml`](workflows/ci-plugin-auth.yml) | Plugin auth tests | @@ -118,7 +118,7 @@ Weblate is **not** bumped by Dependabot. A single logical release is pinned in t | Location | Example | Format | |----------|---------|--------| -| [`pyproject.toml`](../pyproject.toml) | `Weblate[all]==2026.5` | PyPI calver | +| [`pyproject.toml`](../pyproject.toml) | `Weblate[postgres]==2026.5` | PyPI calver | | [`docker/Dockerfile.weblate-plugin`](../docker/Dockerfile.weblate-plugin) | `FROM weblate/weblate:2026.5.0.0` | Docker fixed tag `YEAR.MONTH.PATCH.BUILD` | Mapping lives in [`scripts/weblate-version-map.sh`](../scripts/weblate-version-map.sh). CI runs [`scripts/check-weblate-pin-sync.sh`](../scripts/check-weblate-pin-sync.sh) on every PR. [`weblate-pin-bump.yml`](workflows/weblate-pin-bump.yml) opens a PR weekly (Monday 09:00 UTC) when a newer PyPI release has a matching Docker fixed tag. diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 93b40d9..0a06c1c 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -21,7 +21,7 @@ updates: labels: - dependencies - python - # Direct deps only (packaging, Weblate[all]). Transitive lockfile entries are + # Direct deps only (packaging, Weblate[postgres]). Transitive lockfile entries are # pinned by Weblate and updated via weblate-pin-bump, not independently. allow: - dependency-type: direct diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 60dcd2a..0575fa4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -35,12 +35,12 @@ jobs: plugin_version = data["project"]["version"] weblate_version = None for dep in data["project"]["dependencies"]: - match = re.fullmatch(r"Weblate\[all\]==(.+)", dep) + match = re.fullmatch(r"Weblate(?:\[[^\]]+\])?==(.+)", dep) if match: weblate_version = match.group(1) break if not weblate_version: - raise SystemExit("Weblate[all]== pin not found in pyproject.toml") + raise SystemExit("Weblate pin not found in pyproject.toml") print(f"plugin_version={plugin_version}") print(f"weblate_version={weblate_version}") print(f"tag=v{plugin_version}") diff --git a/.github/workflows/weblate-pin-bump.yml b/.github/workflows/weblate-pin-bump.yml index 30d2235..f83a2a4 100644 --- a/.github/workflows/weblate-pin-bump.yml +++ b/.github/workflows/weblate-pin-bump.yml @@ -20,7 +20,29 @@ permissions: pull-requests: write jobs: + contract-latest: + name: Weblate upstream contract (latest PyPI) + runs-on: ubuntu-latest + permissions: + contents: read + steps: + # actions/checkout v6.0.2 + - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 + with: + persist-credentials: false + # astral-sh/setup-uv v8.1.0 + - uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 + with: + version: 0.11.12 + - name: Install apt dependencies (Weblate venv) + run: sudo ./.github/ci/apt-install + - name: Install plugin dependencies + run: uv sync --frozen --group dev + - name: Verify Weblate internal API contracts (latest PyPI) + run: bash scripts/check-weblate-internal-contract.sh --latest + bump-weblate-pin: + needs: [contract-latest] name: Bump Weblate pin runs-on: ubuntu-latest steps: @@ -127,7 +149,7 @@ jobs: if ! git diff --cached --quiet; then git commit \ -m "chore(deps): bump Weblate pin to ${target_pypi}" \ - -m "PyPI Weblate[all]==${target_pypi}" \ + -m "PyPI Weblate[postgres]==${target_pypi}" \ -m "Docker weblate/weblate:${target_docker}" fi diff --git a/CHANGELOG.md b/CHANGELOG.md index 93f3053..d4f4270 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,7 +13,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] -## [1.0.0] - 2026-06-11 +### Changed + +- **Dependencies** — Replaced `Weblate[all]` with `Weblate[postgres]` in `pyproject.toml` (postgres extra required to import `weblate.urls`); removed redundant direct `packaging` pin (still provided by Weblate). Docker deployments are unaffected (full base image unchanged); local/CI installs use a smaller dependency tree. + ### Added @@ -26,7 +29,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **Rate limiting** — scoped DRF throttles for protected endpoints (`info`: 60/minute; `add-or-update`: 10/hour); `BOOST_ENDPOINT_THROTTLE_INFO` and `BOOST_ENDPOINT_THROTTLE_ADD_OR_UPDATE` env overrides; HTTP 429 with `Retry-After`. - **CI pipeline** — umbrella `ci.yml` with lint, test (90% coverage gate), package, dependency audit, Weblate pin sync, and Docker-based plugin smoke/auth/functional jobs. - **CD pipeline** — staging auto-deploy on `develop` (`cd.yml`); production via `promote-main.yml` (ff-only `develop` → `main`) followed by `main` CD. -- **Weblate version pinning** — `Weblate[all]==…` in `pyproject.toml` synced with Docker `FROM weblate/weblate:…`; enforced by `ci-weblate-pin.yml`; scheduled bumps via `weblate-pin-bump.yml`. +- **Weblate version pinning** — `Weblate[postgres]==…` in `pyproject.toml` synced with Docker `FROM weblate/weblate:…`; enforced by `ci-weblate-pin.yml`; scheduled bumps via `weblate-pin-bump.yml`. - **Release workflow** — manual `release.yml` tags `main` from `pyproject.toml` version and creates GitHub Releases. ## Deprecation Policy diff --git a/README.md b/README.md index 3a6255f..caca84a 100644 --- a/README.md +++ b/README.md @@ -290,7 +290,7 @@ Triggered on push and PR to `main` and `develop`. Calls nine reusable sub-workfl | `benchmark` | [`.github/workflows/ci-benchmark.yml`](.github/workflows/ci-benchmark.yml) | QuickBook parser benchmarks (`pytest-benchmark`); JSON artifact; optional regression gate vs `.benchmarks/` baseline | | `package` | [`.github/workflows/ci-package.yml`](.github/workflows/ci-package.yml) | `uv build`, twine, pydistcheck, pyroma, check-wheel-contents, check-manifest | | `dependencies` | [`.github/workflows/ci-dependencies.yml`](.github/workflows/ci-dependencies.yml) | pip-audit, liccheck, dependency review (on PRs) | -| `weblate-pin` | [`.github/workflows/ci-weblate-pin.yml`](.github/workflows/ci-weblate-pin.yml) | PyPI `Weblate[all]==…` in `pyproject.toml` matches Docker `FROM weblate/weblate:…` (`scripts/check-weblate-pin-sync.sh`) | +| `weblate-pin` | [`.github/workflows/ci-weblate-pin.yml`](.github/workflows/ci-weblate-pin.yml) | PyPI `Weblate[postgres]==…` in `pyproject.toml` matches Docker `FROM weblate/weblate:…` (`scripts/check-weblate-pin-sync.sh`) | | `plugin-smoke` | [`.github/workflows/ci-plugin-smoke.yml`](.github/workflows/ci-plugin-smoke.yml) | Docker stack → P0 smoke tests (`scripts/plugin-smoke.sh`) | | `plugin-auth` | [`.github/workflows/ci-plugin-auth.yml`](.github/workflows/ci-plugin-auth.yml) | Docker stack → auth tests (`scripts/plugin-auth.sh`) | | `plugin-functional` | [`.github/workflows/ci-plugin-functional.yml`](.github/workflows/ci-plugin-functional.yml) | Docker stack → E2E functional tests (`scripts/plugin-functional.sh`); optional `GH_TEST_REPO_TOKEN` secret for GitHub-backed tests | diff --git a/docs/deployment-runbook.md b/docs/deployment-runbook.md index 5395867..86da946 100644 --- a/docs/deployment-runbook.md +++ b/docs/deployment-runbook.md @@ -171,7 +171,7 @@ The Dockerfile builds an overlay image on a **pinned** `weblate/weblate` tag ali | File | Example | |------|---------| -| `pyproject.toml` | `Weblate[all]==2026.5` | +| `pyproject.toml` | `Weblate[postgres]==2026.5` | | `docker/Dockerfile.weblate-plugin` | `FROM weblate/weblate:2026.5.0.0` | PyPI uses calver (`2026.5`, `2026.6.1`, …). Docker fixed production tags add patch and build components (`2026.5.0.0`, `2026.6.1.0`). CI enforces the mapping via `scripts/check-weblate-pin-sync.sh`. Bumps are proposed by the `Weblate pin bump` GitHub Actions workflow when both registries have the release. @@ -385,7 +385,7 @@ The workflow does not check deploy status or server health. 1. Checks out `main` and reads [`pyproject.toml`](../pyproject.toml): - Plugin version: `[project].version` (e.g. `1.0.0`) - - Weblate pin: `Weblate[all]==…` (e.g. `2026.5`) + - Weblate pin: `Weblate[postgres]==…` (e.g. `2026.5`) 2. Fails if tag `v` already exists on `origin` (prevents duplicate releases) 3. Extracts the matching `## []` section from [`CHANGELOG.md`](../CHANGELOG.md) (fails if missing, before any tag is pushed) 4. Creates annotated tag `v` on current `main` HEAD and pushes it diff --git a/pyproject.toml b/pyproject.toml index 695cec5..defe61e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -48,8 +48,7 @@ classifiers = [ "Topic :: Software Development :: Localization" ] dependencies = [ - "packaging==26.2", - "Weblate[all]==2026.5" + "Weblate[postgres]==2026.5" ] description = "Standalone Weblate plugin for Boost documentation translation." keywords = [ @@ -137,12 +136,13 @@ level = "cautious" unauthorized_licenses = [] [tool.pytest.ini_options] -addopts = ["-m", "not plugin and not benchmark and not fuzz"] +addopts = ["-m", "not plugin and not benchmark and not fuzz and not weblate_contract"] markers = [ "benchmark: parser performance benchmarks (slow; excluded from default test runs)", "plugin: requires live Weblate stack (Docker Compose) and optional WEBLATE_API_TOKEN", "slow: long-running plugin integration test", - "fuzz: property-based / fuzz tests (excluded from default test runs; pytest -m fuzz)" + "fuzz: property-based / fuzz tests (excluded from default test runs; pytest -m fuzz)", + "weblate_contract: verifies undocumented Weblate internal APIs (pin-bump gate only)" ] python_classes = ["Test*"] python_files = ["test_*.py", "*_test.py"] diff --git a/scripts/bump-weblate-version.sh b/scripts/bump-weblate-version.sh index 537c16f..2126c5d 100755 --- a/scripts/bump-weblate-version.sh +++ b/scripts/bump-weblate-version.sh @@ -61,29 +61,19 @@ if [[ -z "$current" ]]; then fi list_weblate_pypi_candidates() { + local releases list_status=0 + releases="$(list_modern_weblate_pypi_releases)" || list_status=$? + if [[ $list_status -ne 0 ]]; then + return 1 + fi + uv run --with packaging python3 - "$current" "$FORCE_VERSION" <<'PY' -import json -import re import sys -import urllib.request from packaging.version import Version current = Version(sys.argv[1]) force = sys.argv[2] - -calver = re.compile(r"^\d{4}\.\d+(?:\.\d+)?$") - -def is_modern_calver(name: str) -> bool: - if not calver.match(name): - return False - year = int(name.split(".", 1)[0]) - return year >= 2020 - -with urllib.request.urlopen("https://pypi.org/pypi/Weblate/json") as resp: - data = json.load(resp) - -releases = [v for v in data["releases"] if is_modern_calver(v)] -releases.sort(key=Version, reverse=True) +releases = [line.strip() for line in sys.stdin if line.strip()] if force: if force not in releases: @@ -99,6 +89,7 @@ if not candidates: for candidate in candidates: print(candidate) PY +<<<"$releases" } resolve_target() { @@ -175,7 +166,7 @@ if [[ "$DRY_RUN" -eq 1 ]]; then exit 0 fi -sed -i "s/Weblate\\[all\\]==[0-9][0-9.]*/Weblate[all]==${target_pypi}/" "$PYPI_FILE" +sed -i "s/Weblate\\(\\[[^]]*\\]\\)\\?==[0-9][0-9.]*/Weblate[postgres]==${target_pypi}/" "$PYPI_FILE" sed -i "s|^FROM weblate/weblate:[0-9][0-9.]*|FROM weblate/weblate:${target_docker}|" "$DOCKER_FILE" ( diff --git a/scripts/check-weblate-internal-contract.sh b/scripts/check-weblate-internal-contract.sh new file mode 100755 index 0000000..9612f6d --- /dev/null +++ b/scripts/check-weblate-internal-contract.sh @@ -0,0 +1,70 @@ +#!/usr/bin/env bash +# SPDX-FileCopyrightText: 2026 Andrew Zhang +# +# SPDX-License-Identifier: BSL-1.0 +# +# Verify plugin assumptions about undocumented Weblate internals +# (FormatsConf.FORMATS AST, WEBLATE_FORMATS, weblate.urls.real_patterns). + +set -euo pipefail + +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +cd "$ROOT" +# shellcheck source=weblate-version-map.sh +source "${ROOT}/scripts/weblate-version-map.sh" + +LATEST=0 + +usage() { + cat <<'EOF' +Usage: check-weblate-internal-contract.sh [--latest] + + (default) Run contract tests against the already-installed Weblate version. + --latest Install the newest modern calver Weblate from PyPI, then run tests. +EOF +} + +while [[ $# -gt 0 ]]; do + case "$1" in + --latest) + LATEST=1 + shift + ;; + -h | --help) + usage + exit 0 + ;; + *) + echo "Unknown argument: $1" >&2 + usage >&2 + exit 2 + ;; + esac +done + +if [[ "$LATEST" -eq 1 ]]; then + latest_ver="$(latest_modern_weblate_pypi_release)" + echo "Installing latest PyPI Weblate[postgres]==${latest_ver}" + uv pip install "Weblate[postgres]==${latest_ver}" +fi + +weblate_version="$(uv run python3 -c 'import importlib.metadata; print(importlib.metadata.version("Weblate"))')" +echo "Weblate version under test: ${weblate_version}" +echo "Contracts checked:" +echo " - FormatsConf.FORMATS AST (weblate/formats/models.py)" +echo " - WEBLATE_FORMATS (weblate_formats_with_plugin_formats)" +echo " - weblate.urls.real_patterns (list accepts URLResolver append)" + +set +e +uv run --group dev pytest tests/test_weblate_internal_contract.py -v --tb=short -m weblate_contract +pytest_status=$? +set -e + +if [[ "$pytest_status" -ne 0 ]]; then + echo "Weblate internal API contract check failed." >&2 + echo "Review pytest output above for which contract broke:" >&2 + echo " [FormatsConf.FORMATS AST] | [WEBLATE_FORMATS] | [weblate.urls.real_patterns]" >&2 + exit "$pytest_status" +fi + +echo "Weblate internal API contract check passed (Weblate ${weblate_version})." diff --git a/scripts/check-weblate-pin-sync.sh b/scripts/check-weblate-pin-sync.sh index 279214f..772ac83 100755 --- a/scripts/check-weblate-pin-sync.sh +++ b/scripts/check-weblate-pin-sync.sh @@ -16,7 +16,7 @@ pypi_ver="$(parse_pypi_weblate_version "$PYPI_FILE")" docker_tag="$(parse_docker_weblate_tag "$DOCKER_FILE")" if [[ -z "$pypi_ver" ]]; then - echo "ERROR: could not parse Weblate[all]==… from ${PYPI_FILE}" >&2 + echo "ERROR: could not parse Weblate[…]==… from ${PYPI_FILE}" >&2 exit 1 fi @@ -29,7 +29,7 @@ expected_docker="$(pypi_to_docker_fixed "$pypi_ver")" if [[ "$docker_tag" != "$expected_docker" ]]; then echo "ERROR: Weblate pin mismatch between PyPI and Docker base image." >&2 - echo " pyproject.toml (PyPI): Weblate[all]==${pypi_ver}" >&2 + echo " pyproject.toml (PyPI): Weblate[postgres]==${pypi_ver}" >&2 echo " Dockerfile tag: weblate/weblate:${docker_tag}" >&2 echo " expected Docker fixed tag: weblate/weblate:${expected_docker}" >&2 exit 1 diff --git a/scripts/weblate-version-map.sh b/scripts/weblate-version-map.sh index c32b084..a551bf8 100644 --- a/scripts/weblate-version-map.sh +++ b/scripts/weblate-version-map.sh @@ -17,9 +17,9 @@ pypi_to_docker_fixed() { parse_pypi_weblate_version() { local file="${1:-pyproject.toml}" - grep -E '^[[:space:]]*"Weblate\[all\]==[0-9][0-9.]+"' "$file" \ + grep -E '^[[:space:]]*"Weblate(\[[^]]+\])?==[0-9][0-9.]+"' "$file" \ | head -n1 \ - | sed -E 's/.*Weblate\[all\]==([0-9][0-9.]+).*/\1/' + | sed -E 's/.*Weblate(\[[^]]+\])?==([0-9][0-9.]+).*/\2/' } parse_docker_weblate_tag() { @@ -36,3 +36,39 @@ docker_weblate_tag_exists() { "https://hub.docker.com/v2/repositories/weblate/weblate/tags/${tag}/")" [[ "$code" == "200" ]] } + +# Modern calver Weblate releases from PyPI (newest first, one per line). +list_modern_weblate_pypi_releases() { + uv run --with packaging python3 - <<'PY' +import json +import re +import sys +import urllib.request +from packaging.version import Version + +calver = re.compile(r"^\d{4}\.\d+(?:\.\d+)?$") + +def is_modern_calver(name: str) -> bool: + if not calver.match(name): + return False + year = int(name.split(".", 1)[0]) + return year >= 2020 + +with urllib.request.urlopen( + "https://pypi.org/pypi/Weblate/json", timeout=30 +) as resp: + data = json.load(resp) + +releases = [v for v in data["releases"] if is_modern_calver(v)] +if not releases: + print("ERROR: no modern calver Weblate releases found on PyPI", file=sys.stderr) + raise SystemExit(1) + +for version in sorted(releases, key=Version, reverse=True): + print(version) +PY +} + +latest_modern_weblate_pypi_release() { + list_modern_weblate_pypi_releases | head -n1 +} diff --git a/tests/test_weblate_internal_contract.py b/tests/test_weblate_internal_contract.py new file mode 100644 index 0000000..db932d8 --- /dev/null +++ b/tests/test_weblate_internal_contract.py @@ -0,0 +1,121 @@ +# SPDX-FileCopyrightText: 2026 Andrew Zhang +# +# SPDX-License-Identifier: BSL-1.0 + +"""Verify undocumented Weblate internal APIs the plugin depends on (pin-bump gate).""" + +from __future__ import annotations + +import importlib.util +from pathlib import Path + +import pytest +from django.urls import URLResolver + +from boost_weblate.endpoint.weblate_urls_adapter import ( + _assert_weblate_url_layout, + _boost_endpoint_route, +) +from boost_weblate.settings_override import ( + _parse_formatsconf_formats_ast, + weblate_formats_with_plugin_formats, +) + +_CONTRACT_PREFIX_FORMATSCONF = "Weblate contract broken [FormatsConf.FORMATS AST]:" +_CONTRACT_PREFIX_WEBLATE_FORMATS = "Weblate contract broken [WEBLATE_FORMATS]:" +_CONTRACT_PREFIX_REAL_PATTERNS = "Weblate contract broken [weblate.urls.real_patterns]:" + + +def _load_weblate_formats_models_source() -> str: + spec = importlib.util.find_spec("weblate") + if spec is None or not spec.submodule_search_locations: + msg = f"{_CONTRACT_PREFIX_FORMATSCONF} Weblate is not installed" + raise AssertionError(msg) + path = Path(spec.submodule_search_locations[0]) / "formats" / "models.py" + return path.read_text(encoding="utf-8") + + +@pytest.mark.weblate_contract +def test_weblate_contract_formatsconf_ast() -> None: + try: + parsed = _parse_formatsconf_formats_ast(_load_weblate_formats_models_source()) + except RuntimeError as exc: + msg = f"{_CONTRACT_PREFIX_FORMATSCONF} {exc}" + raise AssertionError(msg) from exc + if not parsed: + msg = ( + f"{_CONTRACT_PREFIX_FORMATSCONF} " + "FormatsConf.FORMATS parsed to an empty sequence" + ) + raise AssertionError(msg) + + +@pytest.mark.weblate_contract +def test_weblate_contract_weblate_formats_non_empty() -> None: + try: + formats = weblate_formats_with_plugin_formats() + except RuntimeError as exc: + msg = f"{_CONTRACT_PREFIX_WEBLATE_FORMATS} {exc}" + raise AssertionError(msg) from exc + if not isinstance(formats, tuple): + msg = ( + f"{_CONTRACT_PREFIX_WEBLATE_FORMATS} " + f"expected tuple, got {type(formats).__name__}" + ) + raise AssertionError(msg) + if not formats: + msg = ( + f"{_CONTRACT_PREFIX_WEBLATE_FORMATS} " + "weblate_formats_with_plugin_formats() returned an empty tuple" + ) + raise AssertionError(msg) + + +@pytest.mark.weblate_contract +def test_weblate_contract_real_patterns_accepts_resolver() -> None: + try: + import weblate.urls as wl_urls + except ModuleNotFoundError as exc: + msg = f"{_CONTRACT_PREFIX_REAL_PATTERNS} weblate.urls is not importable: {exc}" + raise AssertionError(msg) from exc + + try: + _assert_weblate_url_layout(wl_urls) + except Exception as exc: + msg = f"{_CONTRACT_PREFIX_REAL_PATTERNS} {exc}" + raise AssertionError(msg) from exc + + real_patterns = wl_urls.real_patterns + if not isinstance(real_patterns, list): + msg = ( + f"{_CONTRACT_PREFIX_REAL_PATTERNS} " + f"real_patterns is not a list (got {type(real_patterns).__name__})" + ) + raise AssertionError(msg) + + route = _boost_endpoint_route() + if not isinstance(route, URLResolver): + msg = ( + f"{_CONTRACT_PREFIX_REAL_PATTERNS} " + f"expected URLResolver from _boost_endpoint_route(), " + f"got {type(route).__name__}" + ) + raise AssertionError(msg) + + before_len = len(real_patterns) + real_patterns.append(route) + try: + if len(real_patterns) != before_len + 1: + msg = ( + f"{_CONTRACT_PREFIX_REAL_PATTERNS} " + "real_patterns did not accept appended URLResolver" + ) + raise AssertionError(msg) + if real_patterns[-1] is not route: + msg = ( + f"{_CONTRACT_PREFIX_REAL_PATTERNS} " + "appended URLResolver was not retained at list tail" + ) + raise AssertionError(msg) + finally: + real_patterns.pop() diff --git a/uv.lock b/uv.lock index 557c28e..7e2ba6b 100644 --- a/uv.lock +++ b/uv.lock @@ -47,15 +47,6 @@ wheels = [ {url = "https://files.pythonhosted.org/packages/2d/df/6d1e865db65e928ebb525f728e062e53bcdd8b8ebde64ce17f6c3db7ebfd/ahocorasick_rs-1.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:c1ba1ade1e260c5b6772f7f3857dabaf78bd44813c71923cbb4b00b82e50b7a1", size = 268606, upload-time = "2025-10-08T15:39:28.583Z"} ] -[[package]] -name = "alabaster" -sdist = {url = "https://files.pythonhosted.org/packages/a6/f8/d9c74d0daf3f742840fd818d69cfae176fa332022fd44e3469487d5a9420/alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e", size = 24210, upload-time = "2024-07-26T18:15:03.762Z"} -source = {registry = "https://pypi.org/simple"} -version = "1.0.0" -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 = "altcha" sdist = {url = "https://files.pythonhosted.org/packages/17/94/ba7bf097d4fa50de1dc0028cf1f837fb69b1e15b8a722ae77a9389d8d32a/altcha-2.0.0.tar.gz", hash = "sha256:51aeb28cc40ba9e467e962dff0a9f8ca78ceea07e7279b13e81808cc90e330ca", size = 23026, upload-time = "2026-04-07T11:56:53.682Z"} @@ -160,15 +151,6 @@ wheels = [ {url = "https://files.pythonhosted.org/packages/02/ff/1175b0b7371e46244032d43a56862d0af455823b5280a50c63d99cc50f18/automat-25.4.16-py3-none-any.whl", hash = "sha256:04e9bce696a8d5671ee698005af6e5a9fa15354140a87f4870744604dcdd3ba1", size = 42842, upload-time = "2025-04-16T20:12:14.447Z"} ] -[[package]] -name = "babel" -sdist = {url = "https://files.pythonhosted.org/packages/7d/b2/51899539b6ceeeb420d40ed3cd4b7a40519404f9baf3d4ac99dc413a834b/babel-2.18.0.tar.gz", hash = "sha256:b80b99a14bd085fcacfa15c9165f651fbb3406e66cc603abf11c5750937c992d", size = 9959554, upload-time = "2026-02-01T12:30:56.078Z"} -source = {registry = "https://pypi.org/simple"} -version = "2.18.0" -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 = "backports-zstd" sdist = {url = "https://files.pythonhosted.org/packages/d4/05/480d439b482edf59b786bc19b474d990c61942e372f5de3dc14acac8154d/backports_zstd-1.5.0.tar.gz", hash = "sha256:a5e622a82eb183b4fbe18032755ce0a15fa9a82f2adb9b621620b91247aaedb7", size = 998556, upload-time = "2026-05-11T19:54:24.923Z"} @@ -244,34 +226,6 @@ sdist = {url = "https://files.pythonhosted.org/packages/eb/38/7fc8c8c7d9dba455f0 source = {registry = "https://pypi.org/simple"} version = "1.4.4" -[[package]] -dependencies = [ - {name = "botocore"}, - {name = "jmespath"}, - {name = "s3transfer"} -] -name = "boto3" -sdist = {url = "https://files.pythonhosted.org/packages/c5/a8/5422bd25bd2520a6122cb82b2dfa280c66e380102533761b96e7a10f1a4d/boto3-1.43.8.tar.gz", hash = "sha256:d1235602d715c727c1923ef4bcdb5612a20575a9a5e4f2db00d571e0ea1f85fc", size = 113144, upload-time = "2026-05-14T19:34:36.518Z"} -source = {registry = "https://pypi.org/simple"} -version = "1.43.8" -wheels = [ - {url = "https://files.pythonhosted.org/packages/38/48/920c58e5b4450dd389ef3e56dca8803af093ccc0a8e04dd69a60812b7f94/boto3-1.43.8-py3-none-any.whl", hash = "sha256:1894497c383e3cdf50e210f1f57a43e9f4047a5d3accc73ffdb7eacc3b0f011b", size = 140523, upload-time = "2026-05-14T19:34:33.883Z"} -] - -[[package]] -dependencies = [ - {name = "jmespath"}, - {name = "python-dateutil"}, - {name = "urllib3"} -] -name = "botocore" -sdist = {url = "https://files.pythonhosted.org/packages/5b/04/ab59a00e6f003a5bee49464a14fa801b1498ecf1fb1ec32d5d847ab0e639/botocore-1.43.20.tar.gz", hash = "sha256:84fec90a8f25d11bb98176a3fa31c8b8e031b5be37d56f9a1a16f825b483ad4b", size = 15453850, upload-time = "2026-06-02T19:43:25.572Z"} -source = {registry = "https://pypi.org/simple"} -version = "1.43.20" -wheels = [ - {url = "https://files.pythonhosted.org/packages/94/97/0bf341f86389a02cd3c4e6e2c597d15c7bf6c033a2abf1352473fc2e8354/botocore-1.43.20-py3-none-any.whl", hash = "sha256:1ee28afba70210f726c24f4bed1bf238a33542937fa2cf1b8cf2107287b85e04", size = 15135023, upload-time = "2026-06-02T19:43:20.939Z"} -] - [[package]] name = "brotli" sdist = {url = "https://files.pythonhosted.org/packages/f7/16/c92ca344d646e71a43b8bb353f0a6490d7f6e06210f8554c8f874e454285/brotli-1.2.0.tar.gz", hash = "sha256:e310f77e41941c13340a95976fe66a8a95b01e783d430eeaf7a2f87e0a57dd0a", size = 7388632, upload-time = "2025-11-05T18:39:42.86Z"} @@ -697,8 +651,7 @@ wheels = [ [[package]] dependencies = [ - {name = "packaging"}, - {name = "weblate", extra = ["all"]} + {name = "weblate", extra = ["postgres"]} ] name = "cppa-weblate-plugin" source = {editable = "."} @@ -737,11 +690,10 @@ provides-extras = ["dev"] requires-dist = [ {name = "coverage", extras = ["toml"], marker = "extra == 'dev'", specifier = "==7.14.1"}, {name = "hypothesis", marker = "extra == 'dev'", specifier = "==6.155.3"}, - {name = "packaging", specifier = "==26.2"}, {name = "prek", marker = "extra == 'dev'", specifier = "==0.4.4"}, {name = "pytest", marker = "extra == 'dev'", specifier = "==9.0.3"}, {name = "pytest-cov", marker = "extra == 'dev'", specifier = "==7.1.0"}, - {name = "weblate", extras = ["all"], specifier = "==2026.5"} + {name = "weblate", extras = ["postgres"], specifier = "==2026.5"} ] [package.metadata.requires-dev] @@ -988,19 +940,6 @@ wheels = [ {url = "https://files.pythonhosted.org/packages/e8/e6/4c34d94dfb74bbcbc489606e61f1924933de30d22c593dd1f429f35fbd7f/django_appconf-1.2.0-py3-none-any.whl", hash = "sha256:b81bce5ef0ceb9d84df48dfb623a32235d941c78cc5e45dbb6947f154ea277f4", size = 6500, upload-time = "2025-11-08T15:46:25.957Z"} ] -[[package]] -dependencies = [ - {name = "django"}, - {name = "python-ldap"} -] -name = "django-auth-ldap" -sdist = {url = "https://files.pythonhosted.org/packages/a6/6d/d3ceb4b49e7153811a4b2d92bbe198a5ef2e2820469add3d6dc129ef2fab/django_auth_ldap-5.3.0.tar.gz", hash = "sha256:743d8107b146240b46f7e97207dc06cb11facc0cd70dce490b7ca09dd5643d19", size = 55272, upload-time = "2025-12-26T15:00:14.272Z"} -source = {registry = "https://pypi.org/simple"} -version = "5.3.0" -wheels = [ - {url = "https://files.pythonhosted.org/packages/a9/91/38ba24b9d76925ce166b2eebe1b4ea460063b8ba8cf91d39d97ee3bad517/django_auth_ldap-5.3.0-py3-none-any.whl", hash = "sha256:aa880415983149b072f876d976ef8ec755a438090e176817998263a6ed9e1038", size = 20975, upload-time = "2025-12-26T15:00:12.52Z"} -] - [[package]] dependencies = [ {name = "celery"}, @@ -1122,19 +1061,6 @@ wheels = [ {url = "https://files.pythonhosted.org/packages/41/7f/d885667401515b467f84569c56075bc9add72c9fd425fca51a25f4c997e1/django_timezone_field-7.2.1-py3-none-any.whl", hash = "sha256:276915b72c5816f57c3baf9e43f816c695ef940d1b21f91ebf6203c09bf4ad44", size = 13284, upload-time = "2025-12-06T23:50:43.302Z"} ] -[[package]] -dependencies = [ - {name = "django"}, - {name = "zxcvbn"} -] -name = "django-zxcvbn-password-validator" -sdist = {url = "https://files.pythonhosted.org/packages/82/cd/c3b59802974beac681db2d93d72afe872fb8a7e892f557a60ec5a144c487/django_zxcvbn_password_validator-1.6.0.tar.gz", hash = "sha256:5afd5d92313dd0e274817706a16211f0660ff771ec4fb3e6d79b2512d1308ff1", size = 304767, upload-time = "2026-03-24T13:01:18.438Z"} -source = {registry = "https://pypi.org/simple"} -version = "1.6.0" -wheels = [ - {url = "https://files.pythonhosted.org/packages/11/0b/78be05d394e63d64925edaf37c149c4a47b39f4b22ac314c454235595fca/django_zxcvbn_password_validator-1.6.0-py3-none-any.whl", hash = "sha256:41d10997fb6325ed8f1d4694c8ebdeef760fb34994553df6f5603718035bb1b9", size = 432257, upload-time = "2026-03-24T13:01:16.743Z"} -] - [[package]] dependencies = [ {name = "django"} @@ -1281,18 +1207,6 @@ wheels = [ {url = "https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014", size = 9121, upload-time = "2021-03-11T07:16:28.351Z"} ] -[[package]] -dependencies = [ - {name = "requests"} -] -name = "git-review" -sdist = {url = "https://files.pythonhosted.org/packages/da/92/ddc922d34061791a4d0fd483ee4ffc5e026e93783b70fe5a29a129d0cf63/git_review-2.5.0.tar.gz", hash = "sha256:1bcffaef02848a5a3b066e8268c7d700a77cbd8b2e56b128d30f60cd431cf0a8", size = 72645, upload-time = "2025-05-19T19:06:19.367Z"} -source = {registry = "https://pypi.org/simple"} -version = "2.5.0" -wheels = [ - {url = "https://files.pythonhosted.org/packages/a2/09/e65301fd79f605e472877ecafe55013e22c5e49f1dead77c68f4ceec91ac/git_review-2.5.0-py3-none-any.whl", hash = "sha256:fcaa16edeceaf635b4d0dc5d645b47379e676d35cf39b0c24ffcdf0f86515f9f", size = 53717, upload-time = "2025-05-19T19:06:18.381Z"} -] - [[package]] dependencies = [ {name = "smmap"} @@ -1317,210 +1231,6 @@ wheels = [ {url = "https://files.pythonhosted.org/packages/20/7a/1c6e3562dfd8950adbb11ffbc65d21e7c89d01a6e4f137fa981056de25c5/gitpython-3.1.50-py3-none-any.whl", hash = "sha256:d352abe2908d07355014abdd21ddf798c2a961469239afec4962e9da884858f9", size = 212507, upload-time = "2026-05-06T04:01:23.799Z"} ] -[[package]] -dependencies = [ - {name = "google-auth"}, - {name = "googleapis-common-protos"}, - {name = "proto-plus"}, - {name = "protobuf"}, - {name = "requests"} -] -name = "google-api-core" -sdist = {url = "https://files.pythonhosted.org/packages/16/ce/502a57fb0ec752026d24df1280b162294b22a0afb98a326084f9a979138b/google_api_core-2.30.3.tar.gz", hash = "sha256:e601a37f148585319b26db36e219df68c5d07b6382cff2d580e83404e44d641b", size = 177001, upload-time = "2026-04-10T00:41:28.035Z"} -source = {registry = "https://pypi.org/simple"} -version = "2.30.3" -wheels = [ - {url = "https://files.pythonhosted.org/packages/03/15/e56f351cf6ef1cfea58e6ac226a7318ed1deb2218c4b3cc9bd9e4b786c5a/google_api_core-2.30.3-py3-none-any.whl", hash = "sha256:a85761ba72c444dad5d611c2220633480b2b6be2521eca69cca2dbb3ffd6bfe8", size = 173274, upload-time = "2026-04-09T22:57:16.198Z"} -] - -[package.optional-dependencies] -grpc = [ - {name = "grpcio"}, - {name = "grpcio-status"} -] - -[[package]] -dependencies = [ - {name = "cryptography"}, - {name = "pyasn1-modules"} -] -name = "google-auth" -sdist = {url = "https://files.pythonhosted.org/packages/c6/ad/ff781329bbbdc0974a098d996e89c9e1f7024262f9e3eec442fbb9ad1ac6/google_auth-2.53.0.tar.gz", hash = "sha256:e7e6aa16f6bee7b2b264830fd04f08087a1d5a836df516251a5d15327b246c9c", size = 335844, upload-time = "2026-05-15T20:53:07.928Z"} -source = {registry = "https://pypi.org/simple"} -version = "2.53.0" -wheels = [ - {url = "https://files.pythonhosted.org/packages/4a/c9/db44165ba7c581268c6d46017ef63339110378305062830104fc7fa144cb/google_auth-2.53.0-py3-none-any.whl", hash = "sha256:6e7449917c599b35126a99ec268ec6880301f2fea41dce198fe8fd83ff642b68", size = 246071, upload-time = "2026-05-15T20:53:05.609Z"} -] - -[[package]] -dependencies = [ - {name = "google-api-core"}, - {name = "google-auth"} -] -name = "google-cloud-core" -sdist = {url = "https://files.pythonhosted.org/packages/a8/dd/1eef226e470369b26824a505c34482c0b493bc35fe8e0c6b003b5feca21a/google_cloud_core-2.6.0.tar.gz", hash = "sha256:e76149739f90fac1fc6757c09f47eaccb3145b54adbd7759b0f7c4b235f46c83", size = 36001, upload-time = "2026-05-07T08:04:04.124Z"} -source = {registry = "https://pypi.org/simple"} -version = "2.6.0" -wheels = [ - {url = "https://files.pythonhosted.org/packages/84/4a/98da8930ab109c73d9a5d13782a9ebb81ea8c111f6d534a567b71d23e52b/google_cloud_core-2.6.0-py3-none-any.whl", hash = "sha256:6d63ac8e5eca6d9e4319d0a1e2265fadcd7f1049904378caecfa01cf52dd869e", size = 29390, upload-time = "2026-05-07T08:02:34.672Z"} -] - -[[package]] -dependencies = [ - {name = "google-api-core"}, - {name = "google-auth"}, - {name = "google-cloud-core"}, - {name = "google-crc32c"}, - {name = "google-resumable-media"}, - {name = "requests"} -] -name = "google-cloud-storage" -sdist = {url = "https://files.pythonhosted.org/packages/4c/47/205eb8e9a1739b5345843e5a425775cbdc472cc38e7eda082ba5b8d02450/google_cloud_storage-3.10.1.tar.gz", hash = "sha256:97db9aa4460727982040edd2bd13ff3d5e2260b5331ad22895802da1fc2a5286", size = 17309950, upload-time = "2026-03-23T09:35:23.409Z"} -source = {registry = "https://pypi.org/simple"} -version = "3.10.1" -wheels = [ - {url = "https://files.pythonhosted.org/packages/ad/ff/ca9ab2417fa913d75aae38bf40bf856bb2749a604b2e0f701b37cfcd23cc/google_cloud_storage-3.10.1-py3-none-any.whl", hash = "sha256:a72f656759b7b99bda700f901adcb3425a828d4a29f911bc26b3ea79c5b1217f", size = 324453, upload-time = "2026-03-23T09:35:21.368Z"} -] - -[[package]] -dependencies = [ - {name = "google-api-core", extra = ["grpc"]}, - {name = "google-auth"}, - {name = "google-cloud-core"}, - {name = "grpc-google-iam-v1"}, - {name = "grpcio"}, - {name = "proto-plus"}, - {name = "protobuf"} -] -name = "google-cloud-translate" -sdist = {url = "https://files.pythonhosted.org/packages/45/52/3bc1f9b87511eb3b4d28c4d7da65f1f4ecc407df46e56cff0eae43b5d875/google_cloud_translate-3.26.0.tar.gz", hash = "sha256:74c4c302ea705daa1d7dda095288fd736bb616f943480db34314cd0cd52cc9dd", size = 276633, upload-time = "2026-04-10T00:41:26.769Z"} -source = {registry = "https://pypi.org/simple"} -version = "3.26.0" -wheels = [ - {url = "https://files.pythonhosted.org/packages/17/c2/50ed19071e57002ee1bb328e3fcfe43d71aafd9ab0b1e4a107d6c4d3c79d/google_cloud_translate-3.26.0-py3-none-any.whl", hash = "sha256:5b9f4d2cfdc41fcd357cda47d4d880acb6d720be7f0b8fdf95f2816dc982359d", size = 210892, upload-time = "2026-04-10T00:41:12.339Z"} -] - -[[package]] -name = "google-crc32c" -sdist = {url = "https://files.pythonhosted.org/packages/03/41/4b9c02f99e4c5fb477122cd5437403b552873f014616ac1d19ac8221a58d/google_crc32c-1.8.0.tar.gz", hash = "sha256:a428e25fb7691024de47fecfbff7ff957214da51eddded0da0ae0e0f03a2cf79", size = 14192, upload-time = "2025-12-16T00:35:25.142Z"} -source = {registry = "https://pypi.org/simple"} -version = "1.8.0" -wheels = [ - {url = "https://files.pythonhosted.org/packages/e9/5f/7307325b1198b59324c0fa9807cafb551afb65e831699f2ce211ad5c8240/google_crc32c-1.8.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:4b8286b659c1335172e39563ab0a768b8015e88e08329fa5321f774275fc3113", size = 31300, upload-time = "2025-12-16T00:21:56.723Z"}, - {url = "https://files.pythonhosted.org/packages/21/8e/58c0d5d86e2220e6a37befe7e6a94dd2f6006044b1a33edf1ff6d9f7e319/google_crc32c-1.8.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:2a3dc3318507de089c5384cc74d54318401410f82aa65b2d9cdde9d297aca7cb", size = 30867, upload-time = "2025-12-16T00:38:31.302Z"}, - {url = "https://files.pythonhosted.org/packages/ce/a9/a780cc66f86335a6019f557a8aaca8fbb970728f0efd2430d15ff1beae0e/google_crc32c-1.8.0-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:14f87e04d613dfa218d6135e81b78272c3b904e2a7053b841481b38a7d901411", size = 33364, upload-time = "2025-12-16T00:40:22.96Z"}, - {url = "https://files.pythonhosted.org/packages/21/3f/3457ea803db0198c9aaca2dd373750972ce28a26f00544b6b85088811939/google_crc32c-1.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cb5c869c2923d56cb0c8e6bcdd73c009c36ae39b652dbe46a05eb4ef0ad01454", size = 33740, upload-time = "2025-12-16T00:40:23.96Z"}, - {url = "https://files.pythonhosted.org/packages/df/c0/87c2073e0c72515bb8733d4eef7b21548e8d189f094b5dad20b0ecaf64f6/google_crc32c-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:3cc0c8912038065eafa603b238abf252e204accab2a704c63b9e14837a854962", size = 34437, upload-time = "2025-12-16T00:35:21.395Z"}, - {url = "https://files.pythonhosted.org/packages/d1/db/000f15b41724589b0e7bc24bc7a8967898d8d3bc8caf64c513d91ef1f6c0/google_crc32c-1.8.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:3ebb04528e83b2634857f43f9bb8ef5b2bbe7f10f140daeb01b58f972d04736b", size = 31297, upload-time = "2025-12-16T00:23:20.709Z"}, - {url = "https://files.pythonhosted.org/packages/d7/0d/8ebed0c39c53a7e838e2a486da8abb0e52de135f1b376ae2f0b160eb4c1a/google_crc32c-1.8.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:450dc98429d3e33ed2926fc99ee81001928d63460f8538f21a5d6060912a8e27", size = 30867, upload-time = "2025-12-16T00:43:14.628Z"}, - {url = "https://files.pythonhosted.org/packages/ce/42/b468aec74a0354b34c8cbf748db20d6e350a68a2b0912e128cabee49806c/google_crc32c-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3b9776774b24ba76831609ffbabce8cdf6fa2bd5e9df37b594221c7e333a81fa", size = 33344, upload-time = "2025-12-16T00:40:24.742Z"}, - {url = "https://files.pythonhosted.org/packages/1c/e8/b33784d6fc77fb5062a8a7854e43e1e618b87d5ddf610a88025e4de6226e/google_crc32c-1.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:89c17d53d75562edfff86679244830599ee0a48efc216200691de8b02ab6b2b8", size = 33694, upload-time = "2025-12-16T00:40:25.505Z"}, - {url = "https://files.pythonhosted.org/packages/92/b1/d3cbd4d988afb3d8e4db94ca953df429ed6db7282ed0e700d25e6c7bfc8d/google_crc32c-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:57a50a9035b75643996fbf224d6661e386c7162d1dfdab9bc4ca790947d1007f", size = 34435, upload-time = "2025-12-16T00:35:22.107Z"}, - {url = "https://files.pythonhosted.org/packages/21/88/8ecf3c2b864a490b9e7010c84fd203ec8cf3b280651106a3a74dd1b0ca72/google_crc32c-1.8.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:e6584b12cb06796d285d09e33f63309a09368b9d806a551d8036a4207ea43697", size = 31301, upload-time = "2025-12-16T00:24:48.527Z"}, - {url = "https://files.pythonhosted.org/packages/36/c6/f7ff6c11f5ca215d9f43d3629163727a272eabc356e5c9b2853df2bfe965/google_crc32c-1.8.0-cp314-cp314-macosx_12_0_x86_64.whl", hash = "sha256:f4b51844ef67d6cf2e9425983274da75f18b1597bb2c998e1c0a0e8d46f8f651", size = 30868, upload-time = "2025-12-16T00:48:12.163Z"}, - {url = "https://files.pythonhosted.org/packages/56/15/c25671c7aad70f8179d858c55a6ae8404902abe0cdcf32a29d581792b491/google_crc32c-1.8.0-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b0d1a7afc6e8e4635564ba8aa5c0548e3173e41b6384d7711a9123165f582de2", size = 33381, upload-time = "2025-12-16T00:40:26.268Z"}, - {url = "https://files.pythonhosted.org/packages/42/fa/f50f51260d7b0ef5d4898af122d8a7ec5a84e2984f676f746445f783705f/google_crc32c-1.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8b3f68782f3cbd1bce027e48768293072813469af6a61a86f6bb4977a4380f21", size = 33734, upload-time = "2025-12-16T00:40:27.028Z"}, - {url = "https://files.pythonhosted.org/packages/08/a5/7b059810934a09fb3ccb657e0843813c1fee1183d3bc2c8041800374aa2c/google_crc32c-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:d511b3153e7011a27ab6ee6bb3a5404a55b994dc1a7322c0b87b29606d9790e2", size = 34878, upload-time = "2025-12-16T00:35:23.142Z"} -] - -[[package]] -dependencies = [ - {name = "google-crc32c"} -] -name = "google-resumable-media" -sdist = {url = "https://files.pythonhosted.org/packages/00/4b/0b235beccc310d0a48adbc7246b719d173cca6c88c572dfa4b090e39143c/google_resumable_media-2.9.0.tar.gz", hash = "sha256:f7cfb224846a9dd444d125115dfbe8ef02a2b893e78f087762fe716a255a734b", size = 2164534, upload-time = "2026-05-07T08:04:44.236Z"} -source = {registry = "https://pypi.org/simple"} -version = "2.9.0" -wheels = [ - {url = "https://files.pythonhosted.org/packages/07/73/3518e63deb1667c5409a4579e28daf5e84479a87a72c547e0487f7883dcd/google_resumable_media-2.9.0-py3-none-any.whl", hash = "sha256:c8901e88e389af8bed64d9696c74d8bad961865eb2236e13e0bfca9bb0a65ca3", size = 81507, upload-time = "2026-05-07T08:03:23.809Z"} -] - -[[package]] -dependencies = [ - {name = "protobuf"} -] -name = "googleapis-common-protos" -sdist = {url = "https://files.pythonhosted.org/packages/b5/c8/f439cffde755cffa462bfbb156278fa6f9d09119719af9814b858fd4f81f/googleapis_common_protos-1.75.0.tar.gz", hash = "sha256:53a062ff3c32552fbd62c11fe23768b78e4ddf0494d5e5fd97d3f4689c75fbbd", size = 151035, upload-time = "2026-05-07T08:04:49.423Z"} -source = {registry = "https://pypi.org/simple"} -version = "1.75.0" -wheels = [ - {url = "https://files.pythonhosted.org/packages/e7/c8/e2645aa8ed02fd4c7a2f59d68783b65b1f3cbdfe39a6308e156509d1fee8/googleapis_common_protos-1.75.0-py3-none-any.whl", hash = "sha256:961ed60399c457ceb0ee8f285a84c870aabc9c6a832b9d37bb281b5bebde43ed", size = 300631, upload-time = "2026-05-07T08:03:30.345Z"} -] - -[package.optional-dependencies] -grpc = [ - {name = "grpcio"} -] - -[[package]] -dependencies = [ - {name = "googleapis-common-protos", extra = ["grpc"]}, - {name = "grpcio"}, - {name = "protobuf"} -] -name = "grpc-google-iam-v1" -sdist = {url = "https://files.pythonhosted.org/packages/44/4f/d098419ad0bfc06c9ce440575f05aa22d8973b6c276e86ac7890093d3c37/grpc_google_iam_v1-0.14.4.tar.gz", hash = "sha256:392b3796947ed6334e61171d9ab06bf7eb357f554e5fc7556ad7aab6d0e17038", size = 23706, upload-time = "2026-04-01T01:57:49.813Z"} -source = {registry = "https://pypi.org/simple"} -version = "0.14.4" -wheels = [ - {url = "https://files.pythonhosted.org/packages/89/22/c2dd50c09bf679bd38173656cd4402d2511e563b33bc88f90009cf50613c/grpc_google_iam_v1-0.14.4-py3-none-any.whl", hash = "sha256:412facc320fcbd94034b4df3d557662051d4d8adfa86e0ddb4dca70a3f739964", size = 32675, upload-time = "2026-04-01T01:57:47.69Z"} -] - -[[package]] -dependencies = [ - {name = "typing-extensions"} -] -name = "grpcio" -sdist = {url = "https://files.pythonhosted.org/packages/15/f3/23f47b24f8d8c2028eba501db3acfbb2f592cbb5995eaa6e363a627b74d7/grpcio-1.81.0.tar.gz", hash = "sha256:a5acd7efd3b1fe9b4eb0bcaaa1507eed68a0ad0678b654c3f7b464df9ba9dca5", size = 13032272, upload-time = "2026-06-01T05:56:22.827Z"} -source = {registry = "https://pypi.org/simple"} -version = "1.81.0" -wheels = [ - {url = "https://files.pythonhosted.org/packages/82/d5/896a3aaf07068d707d88b282a04914b872db4d32d3c7e6d88e43a3b911fa/grpcio-1.81.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:57b3b0e73a518fa286959b40c3eddd02703504ca186e8b7b2945954519bd8b2c", size = 6053538, upload-time = "2026-06-01T05:54:58.965Z"}, - {url = "https://files.pythonhosted.org/packages/68/6a/7e3eafa4727cd405ff917605ed2949e2af162f233f5cbdd773723a5fea7d/grpcio-1.81.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:8bb1789c94322a13336a2b6c58d9c14d68f8628b6e24205a799c69f5bf8516ce", size = 12053447, upload-time = "2026-06-01T05:55:01.862Z"}, - {url = "https://files.pythonhosted.org/packages/16/79/a4302aa82428de48a922421f522b027a1a727ab4d0926368454aa953d36d/grpcio-1.81.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e4d053900a0d24b75d7521139a3872150301b3d6bde3bed5e12318fb25791e4d", size = 6595872, upload-time = "2026-06-01T05:55:04.946Z"}, - {url = "https://files.pythonhosted.org/packages/b4/1f/7ff2850eaefbecf99af3f624dbb28dd1ad6c5fd4c1d8c26909ed6482673b/grpcio-1.81.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:db217c2e52931719f9937bd12082cd4d7b495b35803d5760686975c285924bf8", size = 7303857, upload-time = "2026-06-01T05:55:07.205Z"}, - {url = "https://files.pythonhosted.org/packages/e2/98/1f3896a9baae1f2aedf4e99c55291d6fa1f30ad9603d63bc18bda967b53e/grpcio-1.81.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:19f201da7b4e5c0559198abe5a97157e726f3abe6e8f5e832d4a50740f6dcc22", size = 6809676, upload-time = "2026-06-01T05:55:09.513Z"}, - {url = "https://files.pythonhosted.org/packages/34/8b/3441983718095208c5d797fd3239882e97ea89a629f41c8df94b4eef4df9/grpcio-1.81.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:275144b0115353339dbb8a6f28a9cf8997b5bf40e37f8f66ac0b0ea57e95b43f", size = 7412654, upload-time = "2026-06-01T05:55:12.777Z"}, - {url = "https://files.pythonhosted.org/packages/3c/98/1eddf07df6e4fe85cf67502a793f7b05468b2dca3d1ef35b972cf5d54468/grpcio-1.81.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5192857589f223e5a98ff0e31f6e551b19040e647d17bfe10116c8a2ce3b8696", size = 8408026, upload-time = "2026-06-01T05:55:15.514Z"}, - {url = "https://files.pythonhosted.org/packages/5c/73/3860341e6a1f5347be6ab35c6c0e1e3a8eb59d010388207fd561dcf01a88/grpcio-1.81.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c6ff087cb1f563f47b504b4e29e684129fc5ae4863faf3ebca08a327764ee6cb", size = 7849498, upload-time = "2026-06-01T05:55:18.078Z"}, - {url = "https://files.pythonhosted.org/packages/ae/3f/0ea06bd85c701966aa3f8f37314f2ed83520d2b7590f42d643d445d8bc8b/grpcio-1.81.0-cp312-cp312-win32.whl", hash = "sha256:98c6240f563178fc5877bd50e6ff274463e53e1472128f4110742450739659fa", size = 4184161, upload-time = "2026-06-01T05:55:20.127Z"}, - {url = "https://files.pythonhosted.org/packages/39/e3/a7c387406827a86f99ad7838b995bf9b4a182ffe2d2c439ed2873efec952/grpcio-1.81.0-cp312-cp312-win_amd64.whl", hash = "sha256:87e33b7afcfb3585121b5f007d2c52b8c534104d18f556e840d35193ca2a9141", size = 4929958, upload-time = "2026-06-01T05:55:22.736Z"}, - {url = "https://files.pythonhosted.org/packages/f3/29/779ee53c931d0fd55c1d459fde43e485172caa3ac87cbd43d003a13a0185/grpcio-1.81.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:62bbe463c9f0f2ff24e31bd25f8dd8b4bae78900e315915a3195a0ef1471a855", size = 6054973, upload-time = "2026-06-01T05:55:25.043Z"}, - {url = "https://files.pythonhosted.org/packages/9e/b6/7211807926b5a17f8d9a5d47c739a163d6812fefe3e4714e81cf92945ed7/grpcio-1.81.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:43c121e135ae44d1559b430db2b2dfad7421cbbe40e1deba506c7dc62b439719", size = 12048662, upload-time = "2026-06-01T05:55:28.453Z"}, - {url = "https://files.pythonhosted.org/packages/64/89/b1b93ef6b34bd20bbaf707fa99133bc9cc302139d5ec6f77a165c7169796/grpcio-1.81.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f345de40ef2e65f63645d53d251824e6070e07804827c5b00ec2e44555f9f901", size = 6599116, upload-time = "2026-06-01T05:55:31.185Z"}, - {url = "https://files.pythonhosted.org/packages/eb/bc/c89f9b9d1c22895715356a1e009554dae66319e97826bb4d30bcda7d29e8/grpcio-1.81.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:8c0855a350886f713b9e458e2a10d208009dcaa849f574e39cd6067db1fe1279", size = 7307591, upload-time = "2026-06-01T05:55:33.463Z"}, - {url = "https://files.pythonhosted.org/packages/65/4a/1df2a4cb4a1386e066ab7e4175e34bb884b35ccb60d3621c09c84af6aabb/grpcio-1.81.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a524cd530900bd24511fcb7f2ed144da4ea37711c4b094475d0bceca7a93a170", size = 6811797, upload-time = "2026-06-01T05:55:36.731Z"}, - {url = "https://files.pythonhosted.org/packages/8d/dc/fa189d20601a1be25b08850cfb733879bbb1047b62a8feec3a60e3e1a87b/grpcio-1.81.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e7746ba3e6efc9e2b748eff59470a2b8684d5a9ec607c6580bcaa5be175820bc", size = 7415131, upload-time = "2026-06-01T05:55:39.451Z"}, - {url = "https://files.pythonhosted.org/packages/ad/a3/5625c48cb48d23c6631b3e5294f88e4c751f22a52591ae78859fab96dca1/grpcio-1.81.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:aaaa4f7f2057d795952e4eacf3f342be8b5b156992f6ac85023c8b98794ebd47", size = 8408398, upload-time = "2026-06-01T05:55:42.219Z"}, - {url = "https://files.pythonhosted.org/packages/75/34/0f8202c6809a46c2b4d69125ef3667c40b1c211f8e19930e5fa1f1197039/grpcio-1.81.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0fba53cb96004b2b7fb758b46b2288cb49d0b658316a4e73f3ef67230616ee65", size = 7844481, upload-time = "2026-06-01T05:55:44.849Z"}, - {url = "https://files.pythonhosted.org/packages/c0/95/c3366b5b5edf4c4adc90f2e29ca16e57965a8e56dc8d2ee89565ba1905bb/grpcio-1.81.0-cp313-cp313-win32.whl", hash = "sha256:c197e2ef75a442528072b29e9755da299110e8610e8bcbb59a6b4cf55384f005", size = 4182777, upload-time = "2026-06-01T05:55:47.459Z"}, - {url = "https://files.pythonhosted.org/packages/a9/a7/932f2f748511a32e641a2aba0d30dded3ed6e8bc330e0924e4d5d86853e6/grpcio-1.81.0-cp313-cp313-win_amd64.whl", hash = "sha256:194eddfacc84d80f50512e9fd4ee851d5f2499f18f299c95aa8fb4748f0537e0", size = 4928085, upload-time = "2026-06-01T05:55:50.158Z"}, - {url = "https://files.pythonhosted.org/packages/c5/1d/28b231333857deb840bc3d182ae087510170ea6d68f21393aeb0fe499530/grpcio-1.81.0-cp314-cp314-linux_armv7l.whl", hash = "sha256:a9351055f52660b58f3d4890ea66188b5134399f82b11aa0c55bd4b99eff5390", size = 6055712, upload-time = "2026-06-01T05:55:52.889Z"}, - {url = "https://files.pythonhosted.org/packages/e8/b8/999c14f9dff0fc47549d2e827cba1343ddc18e1d1bf0d06d2cf628eecbd9/grpcio-1.81.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:300f3337b6425fd16ead9a4f9b2ac25801acb64aa5bc0b99eb69901645b2b1d2", size = 12057189, upload-time = "2026-06-01T05:55:55.952Z"}, - {url = "https://files.pythonhosted.org/packages/1e/3d/1fbde079572562af65351151d840525a13879eb7b481d35b55cd64c6127a/grpcio-1.81.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:97bbd623f7ded558fd4f7cb5a4f600c4d4de65c5dd364c83a5b14b2a10a2d3b5", size = 6608136, upload-time = "2026-06-01T05:55:59.069Z"}, - {url = "https://files.pythonhosted.org/packages/32/89/1f17cb6882abfd8e5a303a25d5d1665abef5a8c499a96198c65a651d1b85/grpcio-1.81.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:ff83d889e3ebf6341c8c7864ad8031591ad5ca61599072fc511644d1eb962d2b", size = 7307045, upload-time = "2026-06-01T05:56:02.376Z"}, - {url = "https://files.pythonhosted.org/packages/48/5a/f98e91b2e755652e637ea2144318b0229b290062199f761b445fe1fa6015/grpcio-1.81.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c4fe218c5a35e1d87a5a26544237f1fa41dfd9cbd3c856b0810a30061f8b0aaf", size = 6812794, upload-time = "2026-06-01T05:56:05.777Z"}, - {url = "https://files.pythonhosted.org/packages/0a/0c/77892d715ac41e7ec0ace2a50080ffb64e189188056f607a66fe0014d1ee/grpcio-1.81.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b8b025b6af43ee0ad4a70307025d77bcab5adde7c4597786010d802c203e9fc5", size = 7422767, upload-time = "2026-06-01T05:56:08.524Z"}, - {url = "https://files.pythonhosted.org/packages/3f/b8/aa04590c6564714d94954515f15a236e59d4b9b3ad01e615f1b706d7792d/grpcio-1.81.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:3d4e0ce5a40a998cf608c8ba60ecfe18fdf364a9aa193ae4ac3faeecd0e86757", size = 8408551, upload-time = "2026-06-01T05:56:11.283Z"}, - {url = "https://files.pythonhosted.org/packages/43/3d/4f4a3450a1973568910c6909cb74abbf2126f68aefae5976962f9f7ad50d/grpcio-1.81.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:aa948712c8e5fa40ec250870bda14bc7578e1bb832a8912d9d2a0f720518edbe", size = 7846468, upload-time = "2026-06-01T05:56:14.536Z"}, - {url = "https://files.pythonhosted.org/packages/88/f4/5827fd248221ad3b44161c23ce9b5f4ee405b04fc6da5fd402a9aa87a84a/grpcio-1.81.0-cp314-cp314-win32.whl", hash = "sha256:fbbe81314a9d92156abce8b62c09364eb8bafc0ca2a19919a45ec64b5c6cb664", size = 4264427, upload-time = "2026-06-01T05:56:17.192Z"}, - {url = "https://files.pythonhosted.org/packages/0c/e8/127dc2b246096ad50ef7c8d9b7b31d757787aeb796368bcdd4454e4204c4/grpcio-1.81.0-cp314-cp314-win_amd64.whl", hash = "sha256:b93cee313cae4e113fbb3a0ce1ea5633db6f63cfde2b2dc1d817429026b2a50b", size = 5070848, upload-time = "2026-06-01T05:56:19.735Z"} -] - -[[package]] -dependencies = [ - {name = "googleapis-common-protos"}, - {name = "grpcio"}, - {name = "protobuf"} -] -name = "grpcio-status" -sdist = {url = "https://files.pythonhosted.org/packages/01/b6/cdc177114997d15c887fb09ccfd16705c8ceb8b4ca2487902b54a7bfd1af/grpcio_status-1.81.0.tar.gz", hash = "sha256:b6fe9788cfdd1f0f63c0528a1e0bfdb41e8ff0583e920d2d8e8888598c01bb69", size = 13900, upload-time = "2026-06-01T06:00:32.638Z"} -source = {registry = "https://pypi.org/simple"} -version = "1.81.0" -wheels = [ - {url = "https://files.pythonhosted.org/packages/f3/b7/5aa346bf1cdecd4ed64b86c10a4d5a089ce3da89145f8328caf0b22b240d/grpcio_status-1.81.0-py3-none-any.whl", hash = "sha256:10eb4c2309db902dc26c1873e80a821bf794be772c10dfd83030f7f59f165fab", size = 14634, upload-time = "2026-06-01T06:00:13.345Z"} -] - [[package]] name = "hiredis" sdist = {url = "https://files.pythonhosted.org/packages/97/d6/9bef6dc3052c168c93fbf7e6c0f2b12c45f0f741a2d30fd919096774343a/hiredis-3.3.1.tar.gz", hash = "sha256:da6f0302360e99d32bc2869772692797ebadd536e1b826d0103c72ba49d38698", size = 89101, upload-time = "2026-03-16T15:21:08.092Z"} @@ -1623,15 +1333,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 = "imagesize" -sdist = {url = "https://files.pythonhosted.org/packages/6c/e6/7bf14eeb8f8b7251141944835abd42eb20a658d89084b7e1f3e5fe394090/imagesize-2.0.0.tar.gz", hash = "sha256:8e8358c4a05c304f1fccf7ff96f036e7243a189e9e42e90851993c558cfe9ee3", size = 1773045, upload-time = "2026-03-03T14:18:29.941Z"} -source = {registry = "https://pypi.org/simple"} -version = "2.0.0" -wheels = [ - {url = "https://files.pythonhosted.org/packages/5f/53/fb7122b71361a0d121b669dcf3d31244ef75badbbb724af388948de543e2/imagesize-2.0.0-py2.py3-none-any.whl", hash = "sha256:5667c5bbb57ab3f1fa4bc366f4fbc971db3d5ed011fd2715fd8001f782718d96", size = 9441, upload-time = "2026-03-03T14:18:27.892Z"} -] - [[package]] dependencies = [ {name = "packaging"} @@ -1686,27 +1387,6 @@ wheels = [ {url = "https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042", size = 11321, upload-time = "2020-11-01T10:59:58.02Z"} ] -[[package]] -dependencies = [ - {name = "markupsafe"} -] -name = "jinja2" -sdist = {url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z"} -source = {registry = "https://pypi.org/simple"} -version = "3.1.6" -wheels = [ - {url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z"} -] - -[[package]] -name = "jmespath" -sdist = {url = "https://files.pythonhosted.org/packages/d3/59/322338183ecda247fb5d1763a6cbe46eff7222eaeebafd9fa65d4bf5cb11/jmespath-1.1.0.tar.gz", hash = "sha256:472c87d80f36026ae83c6ddd0f1d05d4e510134ed462851fd5f754c8c3cbb88d", size = 27377, upload-time = "2026-01-22T16:35:26.279Z"} -source = {registry = "https://pypi.org/simple"} -version = "1.1.0" -wheels = [ - {url = "https://files.pythonhosted.org/packages/14/2f/967ba146e6d58cf6a652da73885f52fc68001525b4197effc174321d70b4/jmespath-1.1.0-py3-none-any.whl", hash = "sha256:a5663118de4908c91729bea0acadca56526eb2698e83de10cd116ae0f4e97c64", size = 20419, upload-time = "2026-01-22T16:35:24.919Z"} -] - [[package]] name = "jsonpointer" sdist = {url = "https://files.pythonhosted.org/packages/18/c7/af399a2e7a67fd18d63c40c5e62d3af4e67b836a2107468b6a5ea24c4304/jsonpointer-3.1.1.tar.gz", hash = "sha256:0b801c7db33a904024f6004d526dcc53bbb8a4a0f4e32bfd10beadf60adf1900", size = 9068, upload-time = "2026-03-23T22:32:32.458Z"} @@ -1775,16 +1455,6 @@ redis = [ {name = "redis"} ] -[[package]] -dependencies = [ - {name = "marshmallow"}, - {name = "setuptools"} -] -name = "logging-gelf" -sdist = {url = "https://files.pythonhosted.org/packages/4c/60/ac333a39d69aa097aedad2cac6f90978fad197e3097095de8306c11416f9/logging-gelf-0.0.32.tar.gz", hash = "sha256:28ef1f425495831e7838f3407e8192e93dc5a623c6c0b8f33542329a7d16c6b8", size = 11019, upload-time = "2024-01-16T10:52:31.236Z"} -source = {registry = "https://pypi.org/simple"} -version = "0.0.32" - [[package]] name = "lxml" sdist = {url = "https://files.pythonhosted.org/packages/28/30/9abc9e34c657c33834eaf6cd02124c61bdf5944d802aa48e69be8da3585d/lxml-6.1.0.tar.gz", hash = "sha256:bfd57d8008c4965709a919c3e9a98f76c2c7cb319086b3d26858250620023b13", size = 4197006, upload-time = "2026-04-18T04:32:51.613Z"} @@ -1865,116 +1535,6 @@ wheels = [ {url = "https://files.pythonhosted.org/packages/2b/a0/9b916c68c0e57752c07f8f64b30138d9d4059dbeb27b90274dedbea128ff/lxml-6.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:26dd9f57ee3bd41e7d35b4c98a2ffd89ed11591649f421f0ec19f67d50ec67ac", size = 3817120, upload-time = "2026-04-18T04:32:15.803Z"} ] -[[package]] -name = "markupsafe" -sdist = {url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z"} -source = {registry = "https://pypi.org/simple"} -version = "3.0.3" -wheels = [ - {url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z"}, - {url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z"}, - {url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z"}, - {url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z"}, - {url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z"}, - {url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z"}, - {url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z"}, - {url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z"}, - {url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z"}, - {url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z"}, - {url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z"}, - {url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z"}, - {url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z"}, - {url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z"}, - {url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z"}, - {url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z"}, - {url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z"}, - {url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z"}, - {url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z"}, - {url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z"}, - {url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z"}, - {url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z"}, - {url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z"}, - {url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z"}, - {url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z"}, - {url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z"}, - {url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z"}, - {url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z"}, - {url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z"}, - {url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z"}, - {url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z"}, - {url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z"}, - {url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z"}, - {url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z"}, - {url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z"}, - {url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z"}, - {url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z"}, - {url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z"}, - {url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z"}, - {url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z"}, - {url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z"}, - {url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z"}, - {url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z"}, - {url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z"}, - {url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z"}, - {url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z"}, - {url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z"}, - {url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z"}, - {url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z"}, - {url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z"}, - {url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z"}, - {url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z"}, - {url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z"}, - {url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z"}, - {url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z"} -] - -[[package]] -name = "marshmallow" -sdist = {url = "https://files.pythonhosted.org/packages/25/7e/1dbd4096eb7c148cd2841841916f78820bb85a4d80a0c25c02d30815a7fb/marshmallow-4.3.0.tar.gz", hash = "sha256:fb43c53b3fe240b8f6af37223d6ef1636f927ad9bea8ab323afad95dff090880", size = 224485, upload-time = "2026-04-03T21:46:32.72Z"} -source = {registry = "https://pypi.org/simple"} -version = "4.3.0" -wheels = [ - {url = "https://files.pythonhosted.org/packages/f4/e0/ff24e25218bb59eb6290a530cea40651b14068b6e3659b20f9c175179632/marshmallow-4.3.0-py3-none-any.whl", hash = "sha256:46c4fe6984707e3cbd485dfebbf0a59874f58d695aad05c1668d15e8c6e13b46", size = 49148, upload-time = "2026-04-03T21:46:31.241Z"} -] - -[[package]] -name = "mercurial" -sdist = {url = "https://files.pythonhosted.org/packages/8f/e2/55e7cc74f4ffcce9e4d701945f61a5ab6536ff13e3eee9b1da6590731d27/mercurial-7.2.2.tar.gz", hash = "sha256:f2ec8e7eeef0500591706d374555f0ceb118822068e75fa3b32be07dd2184f6c", size = 9258506, upload-time = "2026-05-07T15:26:57.318Z"} -source = {registry = "https://pypi.org/simple"} -version = "7.2.2" -wheels = [ - {url = "https://files.pythonhosted.org/packages/d2/76/cb5be1112d780cd4ecda338adad71cf4c9732f9635a46735488f43cde772/mercurial-7.2.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e1df3811d2d307459935f4518efedac7e9e4ff43eed078eeae85eae2813ad9a0", size = 5419142, upload-time = "2026-05-07T15:25:29.776Z"}, - {url = "https://files.pythonhosted.org/packages/8f/c6/c64ba90dd38e7002f4cc8102f546dae89b32f83bfe102de0cc835bb8f713/mercurial-7.2.2-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:758a5bc1b674f2d8162b6aea6f9a69a2ac6616937c7af3034fda715dc423d2e5", size = 7276210, upload-time = "2026-05-07T15:25:31.739Z"}, - {url = "https://files.pythonhosted.org/packages/06/a4/c90d684f0111ac953c8e4bb9757e891b639cc46fcb65eba80f6c97e02944/mercurial-7.2.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8065fe5854c6040a60e8180d5926166db465611f3038285f9d8602c9b5f89e3e", size = 7299693, upload-time = "2026-05-07T15:25:35.687Z"}, - {url = "https://files.pythonhosted.org/packages/64/d4/01c272a14f153486da1ce68c7ef7cdce2fb7d03c1b3a8d60f4fd43b8a54f/mercurial-7.2.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e9a01cbef63e15e8ed4928ac6ea46217c9e54d1bf898bbe677c224558e1d09ca", size = 7583441, upload-time = "2026-05-07T15:25:37.563Z"}, - {url = "https://files.pythonhosted.org/packages/7f/7c/4e0b84b1a6c933e81e734507cea60eff5e593904a0abf2f564b794694b7e/mercurial-7.2.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:757ad8cc9bb9c66b0a2078985ac559a213902c942062074041427bd9c7a1e6fa", size = 7243936, upload-time = "2026-05-07T15:25:39.507Z"}, - {url = "https://files.pythonhosted.org/packages/01/03/a04b25cc51c9f932bd1d7ca5be6d88feccd93ad85dc325ac90d2fbcedf46/mercurial-7.2.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:733c638cac0c747da52ee2f78060df07e6a19ae5edd509864d7f17c5f9d6cc84", size = 7245379, upload-time = "2026-05-07T15:25:41.333Z"}, - {url = "https://files.pythonhosted.org/packages/ed/bc/2ed70d40081d66d875eea3a368c8ecbdd607e2c31854144ed3f3c9e5c3d1/mercurial-7.2.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:71414dd7e263d444dd087031d9fc6672813869b273116c0f9283a67027c9424c", size = 7470083, upload-time = "2026-05-07T15:25:43.436Z"}, - {url = "https://files.pythonhosted.org/packages/22/e9/46dde0a4cdfd688db10ef0a3b1ef081e79567915e5c4357126a9c8296047/mercurial-7.2.2-cp312-cp312-win32.whl", hash = "sha256:5c1df3fdad97c3fb79980322f1a0c4e841f60fea27e9aa45d7e62bc0082605db", size = 7045608, upload-time = "2026-05-07T15:25:45.676Z"}, - {url = "https://files.pythonhosted.org/packages/78/d8/7b1b17e2b6b5c6533f9025c846706211d9ec91dd313d5dccc6d0e8e13d57/mercurial-7.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:5d59df5ad5d3c7dabe0afe9e905b60bda1aa43cb4499eadc5f6c80a0ccd4b18c", size = 7371339, upload-time = "2026-05-07T15:25:47.944Z"}, - {url = "https://files.pythonhosted.org/packages/69/90/0e3ea22104d4e4768b1542dc9b157e490aa2416d33208ecc8de921e10ddb/mercurial-7.2.2-cp312-cp312-win_arm64.whl", hash = "sha256:3bd34910ce65aded7c87e456ced6126fac4dc2efdf24cb508f109fcca3692e4c", size = 7336047, upload-time = "2026-05-07T15:25:49.831Z"}, - {url = "https://files.pythonhosted.org/packages/aa/ce/96709b4cc014ba957948bee539c233620923dd8ea4700bb81d9b7c1b89f9/mercurial-7.2.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a952bf8b3bbd503d04d696d4fb23d619a28fdceff4fe49393d8edf5e3c10ab65", size = 5418950, upload-time = "2026-05-07T15:25:52.012Z"}, - {url = "https://files.pythonhosted.org/packages/2f/ea/1e28231ff97168b74672b632780313af0896b21239e75b3e8b95362e906b/mercurial-7.2.2-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:60219c61c898c5bc359a5d399775078a55e0d0f1a49f8b2502648bc52944c23d", size = 7276033, upload-time = "2026-05-07T15:25:54.282Z"}, - {url = "https://files.pythonhosted.org/packages/fa/9e/1a6cc4553448d5b5a616ef15288bb7581e07b491d0638a130bc4c794af39/mercurial-7.2.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b419029d1ddb708b558281e0e9b04536f48fbc52159ff1f1aa47d7a50ab3ae2", size = 7300702, upload-time = "2026-05-07T15:25:56.352Z"}, - {url = "https://files.pythonhosted.org/packages/e0/73/e6254a0159c9a5a8dba646ef9d380018305e2b4cc3e8fd103939717cc98a/mercurial-7.2.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e52706776ea710db1016c4dbddfb816dd84c9ae464b037aaf50b21f6cf7113c9", size = 7583687, upload-time = "2026-05-07T15:25:58.492Z"}, - {url = "https://files.pythonhosted.org/packages/09/80/43e88157ec207a0a517e0073800ab098dcdcac9b5c734123714e5d55f25d/mercurial-7.2.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c478e81e7364f2712af5f287588739505f318bc4d2c9981b88b7128de167f37e", size = 7244775, upload-time = "2026-05-07T15:26:00.618Z"}, - {url = "https://files.pythonhosted.org/packages/18/6a/63df78ad534f50fa395329afb58e073ac33052003590bdfc628d9c24188f/mercurial-7.2.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6f8059759dad72e11780478d1d78a15aa10482a23cdaf0b669a1b7e074d20ba2", size = 7245798, upload-time = "2026-05-07T15:26:02.758Z"}, - {url = "https://files.pythonhosted.org/packages/05/8a/868dec8c94a989e2fd45645638b5d2452f5a4438cd6a080fc890c9f7b1c9/mercurial-7.2.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b52d8617a84ef37aa39cf190726d5aaa2ac0c4616deefaabb753a2bd853849b4", size = 7470603, upload-time = "2026-05-07T15:26:05.114Z"}, - {url = "https://files.pythonhosted.org/packages/76/ea/a0003441d2c485bddd37a58d5e0f361ae755022e7c7c7a28329dd9cd75dc/mercurial-7.2.2-cp313-cp313-win32.whl", hash = "sha256:cf8920881fe773bd7da9dfd817e380b99f7306f2687e8ce6b16b78d8e1ba533c", size = 6918891, upload-time = "2026-05-07T15:26:06.994Z"}, - {url = "https://files.pythonhosted.org/packages/a1/7f/da6826178f376090cd94b8ae82b7213519663022419d92d5af75aa97ca0b/mercurial-7.2.2-cp313-cp313-win_amd64.whl", hash = "sha256:b75ad77ec2cf875f8aa441d195b0006a1dd39ae3132c8bef62675316e7df4a1b", size = 7310493, upload-time = "2026-05-07T15:26:09.58Z"}, - {url = "https://files.pythonhosted.org/packages/b6/0f/8b8730aff6a8fd28d0b849072303dcf691fa422b33dd1a2719212c41f956/mercurial-7.2.2-cp313-cp313-win_arm64.whl", hash = "sha256:e682c90f36a05388d8e7113dfb848d5837489d0c5cdb3278cc8dbb3c06ce643d", size = 7275146, upload-time = "2026-05-07T15:26:12.182Z"}, - {url = "https://files.pythonhosted.org/packages/72/81/315a536ffc9f239ff0af65d056a473fb19ab07265f6bbca0060aa59980f2/mercurial-7.2.2-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:4533aaf6e0868cc35ed1e8c9b9c816412521a1101c873c5ab40c6b006a62a432", size = 5420595, upload-time = "2026-05-07T15:26:14.21Z"}, - {url = "https://files.pythonhosted.org/packages/23/d5/a41075a5198f6c24f212d00e5fd7d206a8b9e58a1645ae833e678971e1ab/mercurial-7.2.2-cp314-cp314-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:2e2e9543c819554c41c1d59435b33ebd9fdbb30c175efe42c3a74f3179e19e88", size = 7277559, upload-time = "2026-05-07T15:26:16.423Z"}, - {url = "https://files.pythonhosted.org/packages/5c/dc/43d0174910902229c5e604f57f28328dd9677cee0245cafe98ba968bba20/mercurial-7.2.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a4dbcda57033d209b07a0eb5aa6c18741e7a9c36c1350649b5e500908867d7c7", size = 7301712, upload-time = "2026-05-07T15:26:18.505Z"}, - {url = "https://files.pythonhosted.org/packages/ba/06/e39d3035767b39105cfefc83e11404ad1bcc9b0f163927100e8a55b459bb/mercurial-7.2.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:445ee29c253a5297c774005b86ddd1e8d79a30a1bfff67ebd833aac32c5425bf", size = 7584113, upload-time = "2026-05-07T15:26:20.437Z"}, - {url = "https://files.pythonhosted.org/packages/f2/92/1d09102c702867338f0774223b5a1d5c7ec2fd1998986d6b7bd82ff3b3ce/mercurial-7.2.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:05032119e726fc73a55db17188373363d30c079c06131d4c0bcecffa527de70c", size = 7246415, upload-time = "2026-05-07T15:26:22.287Z"}, - {url = "https://files.pythonhosted.org/packages/53/a5/ef6397abd9ac9025ab509dee7d238918b56b5a6a55a06d5295e64d5ddf10/mercurial-7.2.2-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:2f92d309a2f198dc8e6bea67f122cc629f35f33f3f97fa07f6c3a09ac8f4d31b", size = 7246630, upload-time = "2026-05-07T15:26:24.339Z"}, - {url = "https://files.pythonhosted.org/packages/c7/2f/93c9acf580f76caf99f9f4251ba22fb575fb243e16a72e054763dc4f0102/mercurial-7.2.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:8523c2def15ac061af5d6b74cf49ff7506514dffcd5ab0502bd272d529e3e6e4", size = 7470418, upload-time = "2026-05-07T15:26:26.309Z"}, - {url = "https://files.pythonhosted.org/packages/92/1f/c9a67e813100b8360de1970756c0b0139f30cd24dd81c6fd57e5b5a87329/mercurial-7.2.2-cp314-cp314-win32.whl", hash = "sha256:f79db196b6553ce76175b0ca7bd05df4b232898a1dd505be45edd5a0d46415ab", size = 7175495, upload-time = "2026-05-07T15:26:28.439Z"}, - {url = "https://files.pythonhosted.org/packages/75/91/ac057dc19ba4effe00544abfcb8ebc76866e4652a87800c89e149c78283a/mercurial-7.2.2-cp314-cp314-win_amd64.whl", hash = "sha256:4b6334b2663f4b814ff810e0913f1209297a44bd877bca091585e29d9189521e", size = 7652823, upload-time = "2026-05-07T15:26:30.993Z"}, - {url = "https://files.pythonhosted.org/packages/ea/7c/263b762a45f03c99a1332006c91731f48c57e3464a7835c331e867335a1c/mercurial-7.2.2-cp314-cp314-win_arm64.whl", hash = "sha256:cdf791a55685320234af99845685946b63e5cc62e08998e038e4660819f2de4f", size = 7619761, upload-time = "2026-05-07T15:26:34.086Z"} -] - [[package]] name = "mistletoe" sdist = {url = "https://files.pythonhosted.org/packages/31/ae/d33647e2a26a8899224f36afc5e7b7a670af30f1fd87231e9f07ca19d673/mistletoe-1.5.1.tar.gz", hash = "sha256:c5571ce6ca9cfdc7ce9151c3ae79acb418e067812000907616427197648030a3", size = 111769, upload-time = "2025-12-07T16:19:01.066Z"} @@ -2236,33 +1796,6 @@ wheels = [ {url = "https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955", size = 391431, upload-time = "2025-08-27T15:23:59.498Z"} ] -[[package]] -dependencies = [ - {name = "protobuf"} -] -name = "proto-plus" -sdist = {url = "https://files.pythonhosted.org/packages/c9/56/e647b0c675392d2da368da7b6f158f7368b18542fd6f7d7400a2f39de000/proto_plus-1.28.0.tar.gz", hash = "sha256:38e5696342835b08fc116f30a25665b29531cda9d5d5643e9b81fc312385abd9", size = 57221, upload-time = "2026-05-07T08:04:50.811Z"} -source = {registry = "https://pypi.org/simple"} -version = "1.28.0" -wheels = [ - {url = "https://files.pythonhosted.org/packages/7c/20/b122d4626976acb81132036d2ad1bb35a1a8775fceb837ec30964622516a/proto_plus-1.28.0-py3-none-any.whl", hash = "sha256:a630604310899e73c59ec302e5765c058d412b2f090b9c79c8822589f14955b8", size = 50410, upload-time = "2026-05-07T08:03:31.962Z"} -] - -[[package]] -name = "protobuf" -sdist = {url = "https://files.pythonhosted.org/packages/60/fd/5b1491d9e4b586d621c54f4c36b888714164b6875f8d6afa3f9072906a51/protobuf-7.35.0.tar.gz", hash = "sha256:a2efd84605f41e559f1881b0912b44099d0a2ac9bf46b3474823f10fb393b0e6", size = 458677, upload-time = "2026-05-19T23:02:29.197Z"} -source = {registry = "https://pypi.org/simple"} -version = "7.35.0" -wheels = [ - {url = "https://files.pythonhosted.org/packages/83/ee/93d06e358a4aa32280b00e722d3ea0a1f25fc3cc5778d80581c9cca2c10e/protobuf-7.35.0-cp310-abi3-macosx_10_9_universal2.whl", hash = "sha256:66be6c513931c794fa92c080ffee41671390da3d79da219cf9c0c0907f035dda", size = 433225, upload-time = "2026-05-19T23:02:19.884Z"}, - {url = "https://files.pythonhosted.org/packages/8b/39/1c76c2da93f3c507e958e0aecee2391cc44d4625de6c728bbc555195b5a8/protobuf-7.35.0-cp310-abi3-manylinux2014_aarch64.whl", hash = "sha256:fcbe42a4ac09d3ec9c987ddfcd956afd0b15f1ff613bd8371bde9405ffd5c8e5", size = 328847, upload-time = "2026-05-19T23:02:22.3Z"}, - {url = "https://files.pythonhosted.org/packages/91/1a/39f7ce90a238c1a987a4d81ec26379e02ca0aff367de68e4a1fa474215b9/protobuf-7.35.0-cp310-abi3-manylinux2014_s390x.whl", hash = "sha256:4cbf5cc286130e06a6c9bbefac442431173906dfcc979712183d4adcc01b37ee", size = 344030, upload-time = "2026-05-19T23:02:23.591Z"}, - {url = "https://files.pythonhosted.org/packages/70/5b/6baf9008817964454055ff3fe65f1de0b5f1e26c80c82f7fb108b7cd4ea3/protobuf-7.35.0-cp310-abi3-manylinux2014_x86_64.whl", hash = "sha256:6c0f98f10c8a05ea30f8993dfef2de093d27b490fdae78bb60c8343795d55011", size = 327130, upload-time = "2026-05-19T23:02:24.637Z"}, - {url = "https://files.pythonhosted.org/packages/8e/e5/e46adb0badc388bfb84877a5f9f026aff63f60e611016cf64dbe77e05446/protobuf-7.35.0-cp310-abi3-win32.whl", hash = "sha256:4c4617b83ade0e279d1d2bfe04025a1adb87f9ed657de038620dc0ff959357f6", size = 428946, upload-time = "2026-05-19T23:02:25.741Z"}, - {url = "https://files.pythonhosted.org/packages/a7/ab/547fbd9e16d879dd13c167478f8ae0a83a428008ca07a5e06acdc23ad473/protobuf-7.35.0-cp310-abi3-win_amd64.whl", hash = "sha256:f05bcadf9a2a6b8dda047007075135fb7d08c73d9177aabc067e1be46881a201", size = 439996, upload-time = "2026-05-19T23:02:26.808Z"}, - {url = "https://files.pythonhosted.org/packages/b8/ef/50433d346c56657a70d27f156c7b349ac59a068b01de4eb796e747eecc43/protobuf-7.35.0-py3-none-any.whl", hash = "sha256:c13f325cf242bad135c350629eeb5d54b24228eb472fb3e2e9ebbd4c5dc20ca0", size = 171659, upload-time = "2026-05-19T23:02:27.842Z"} -] - [[package]] dependencies = [ {name = "typing-extensions", marker = "python_full_version < '3.13'"}, @@ -2362,18 +1895,6 @@ wheels = [ {url = "https://files.pythonhosted.org/packages/5d/a0/7d793dce3fa811fe047d6ae2431c672364b462850c6235ae306c0efd025f/pyasn1-0.6.3-py3-none-any.whl", hash = "sha256:a80184d120f0864a52a073acc6fc642847d0be408e7c7252f31390c0f4eadcde", size = 83997, upload-time = "2026-03-17T01:06:52.036Z"} ] -[[package]] -dependencies = [ - {name = "pyasn1"} -] -name = "pyasn1-modules" -sdist = {url = "https://files.pythonhosted.org/packages/e9/e6/78ebbb10a8c8e4b61a59249394a4a594c1a7af95593dc933a349c8d00964/pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6", size = 307892, upload-time = "2025-03-28T02:41:22.17Z"} -source = {registry = "https://pypi.org/simple"} -version = "0.4.2" -wheels = [ - {url = "https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", size = 181259, upload-time = "2025-03-28T02:41:19.028Z"} -] - [[package]] name = "pycairo" sdist = {url = "https://files.pythonhosted.org/packages/22/d9/1728840a22a4ef8a8f479b9156aa2943cd98c3907accd3849fb0d5f82bfd/pycairo-1.29.0.tar.gz", hash = "sha256:f3f7fde97325cae80224c09f12564ef58d0d0f655da0e3b040f5807bd5bd3142", size = 665871, upload-time = "2025-11-11T19:13:01.584Z"} @@ -2554,16 +2075,6 @@ 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]] -dependencies = [ - {name = "pyasn1"}, - {name = "pyasn1-modules"} -] -name = "python-ldap" -sdist = {url = "https://files.pythonhosted.org/packages/b2/f4/60edeb794bbc9ed0ff2149bbaeec605f3ed331766459d195832ecbd0ba2d/python_ldap-3.4.7.tar.gz", hash = "sha256:bacd9fb680d20263d8570ade1cf234d90d281149a8beb4f079dd8f33f7613dc8", size = 387477, upload-time = "2026-05-20T13:41:04.358Z"} -source = {registry = "https://pypi.org/simple"} -version = "3.4.7" - [[package]] dependencies = [ {name = "defusedxml"} @@ -2942,39 +2453,6 @@ wheels = [ {url = "https://files.pythonhosted.org/packages/00/f3/37a4672ddb1307eb57d9b54ba89a48f483a04a63cac4e1471fdb4cba76e6/rjsmin-1.2.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:47dad1732a2c4779bdc76d5b3183fdf2ec27838f31071fa9dfcc79483d3480e2", size = 34161, upload-time = "2025-10-12T10:51:23.761Z"} ] -[[package]] -dependencies = [ - {name = "requests"} -] -name = "rollbar" -sdist = {url = "https://files.pythonhosted.org/packages/d2/43/966a7d64ff2c0901451aa2fcbe205a68528b6c6fbac6760b5ad5a705a944/rollbar-1.3.0.tar.gz", hash = "sha256:519402eac39bcc4fa484821872f6bb18497fb7b6c81167047867d17714d3b379", size = 85300, upload-time = "2025-03-26T15:12:19.274Z"} -source = {registry = "https://pypi.org/simple"} -version = "1.3.0" -wheels = [ - {url = "https://files.pythonhosted.org/packages/c3/d2/b6bf3f24349bc3bc681522fa8c55271923614b47e5e9d923f443523de81a/rollbar-1.3.0-py3-none-any.whl", hash = "sha256:d800c4265a4d5aae547cb3f29e48414b6d4fedaa7f679cd0fd64dac16a1eded3", size = 117183, upload-time = "2025-03-26T15:12:17.828Z"} -] - -[[package]] -name = "roman-numerals" -sdist = {url = "https://files.pythonhosted.org/packages/ae/f9/41dc953bbeb056c17d5f7a519f50fdf010bd0553be2d630bc69d1e022703/roman_numerals-4.1.0.tar.gz", hash = "sha256:1af8b147eb1405d5839e78aeb93131690495fe9da5c91856cb33ad55a7f1e5b2", size = 9077, upload-time = "2025-12-17T18:25:34.381Z"} -source = {registry = "https://pypi.org/simple"} -version = "4.1.0" -wheels = [ - {url = "https://files.pythonhosted.org/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl", hash = "sha256:647ba99caddc2cc1e55a51e4360689115551bf4476d90e8162cf8c345fe233c7", size = 7676, upload-time = "2025-12-17T18:25:33.098Z"} -] - -[[package]] -dependencies = [ - {name = "roman-numerals"} -] -name = "roman-numerals-py" -sdist = {url = "https://files.pythonhosted.org/packages/cb/b5/de96fca640f4f656eb79bbee0e79aeec52e3e0e359f8a3e6a0d366378b64/roman_numerals_py-4.1.0.tar.gz", hash = "sha256:f5d7b2b4ca52dd855ef7ab8eb3590f428c0b1ea480736ce32b01fef2a5f8daf9", size = 4274, upload-time = "2025-12-17T18:25:41.153Z"} -source = {registry = "https://pypi.org/simple"} -version = "4.1.0" -wheels = [ - {url = "https://files.pythonhosted.org/packages/27/2c/daca29684cbe9fd4bc711f8246da3c10adca1ccc4d24436b17572eb2590e/roman_numerals_py-4.1.0-py3-none-any.whl", hash = "sha256:553114c1167141c1283a51743759723ecd05604a1b6b507225e91dc1a6df0780", size = 4547, upload-time = "2025-12-17T18:25:40.136Z"} -] - [[package]] name = "rpds-py" sdist = {url = "https://files.pythonhosted.org/packages/2e/43/25a8dcd3feedd735039a8f0b5b7e3b118232b5eae288c4fd9ab200d41094/rpds_py-2026.5.1.tar.gz", hash = "sha256:07b24fea40541e28570e5b795a4a38fbdcd12550c06bd0748005ecc8116ca256", size = 64459, upload-time = "2026-05-28T12:02:13.232Z"} @@ -3094,18 +2572,6 @@ wheels = [ {url = "https://files.pythonhosted.org/packages/b8/0c/51f6841f1d84f404f92463fc2b1ba0da357ca1e3db6b7fbda26956c3b82a/ruamel_yaml-0.19.1-py3-none-any.whl", hash = "sha256:27592957fedf6e0b62f281e96effd28043345e0e66001f97683aa9a40c667c93", size = 118102, upload-time = "2026-01-02T16:50:29.201Z"} ] -[[package]] -dependencies = [ - {name = "botocore"} -] -name = "s3transfer" -sdist = {url = "https://files.pythonhosted.org/packages/11/b3/bcdc2f58fa92592db511beda154c2c08d28f21f6c4637f06a42a24b10c21/s3transfer-0.17.1.tar.gz", hash = "sha256:042dd5e3b1b512355e35a23f0223e426b7042e80b97830ea2680ddce327fc45e", size = 159439, upload-time = "2026-05-26T19:45:01.714Z"} -source = {registry = "https://pypi.org/simple"} -version = "0.17.1" -wheels = [ - {url = "https://files.pythonhosted.org/packages/85/dd/904873250a6554fbae40cddbf9198e3cc37a2f1319d5e1a5ce82fe269c17/s3transfer-0.17.1-py3-none-any.whl", hash = "sha256:5b9827d1044159bbb01b86ef8902760ea39281927f5de31de75e1d657177bf4c", size = 88264, upload-time = "2026-05-26T19:45:00.452Z"} -] - [[package]] dependencies = [ {name = "certifi"}, @@ -3132,15 +2598,6 @@ wheels = [ {url = "https://files.pythonhosted.org/packages/93/eb/2433e1af4ff903499144de4846569fb3300b816179ae99a03c2f011b666a/service_identity-26.1.0-py3-none-any.whl", hash = "sha256:68c32dadbb69135fb951077677e07cd7f6031020f3a8c8f47a28cda8a0742118", size = 11370, upload-time = "2026-05-30T12:04:53.911Z"} ] -[[package]] -name = "setuptools" -sdist = {url = "https://files.pythonhosted.org/packages/4f/db/cfac1baf10650ab4d1c111714410d2fbb77ac5a616db26775db562c8fab2/setuptools-82.0.1.tar.gz", hash = "sha256:7d872682c5d01cfde07da7bccc7b65469d3dca203318515ada1de5eda35efbf9", size = 1152316, upload-time = "2026-03-09T12:47:17.221Z"} -source = {registry = "https://pypi.org/simple"} -version = "82.0.1" -wheels = [ - {url = "https://files.pythonhosted.org/packages/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl", hash = "sha256:a59e362652f08dcd477c78bb6e7bd9d80a7995bc73ce773050228a348ce2e5bb", size = 1006223, upload-time = "2026-03-09T12:47:15.026Z"} -] - [[package]] name = "siphashc" sdist = {url = "https://files.pythonhosted.org/packages/67/d8/2314d736070d14d560ced064a524dcaba3dbefa8a46aded886f22e28bea0/siphashc-2.7.tar.gz", hash = "sha256:a6944d73768cf52a3a8342ee9c191ad9404559002f724f44e0eb7ab0e0bdea33", size = 9529, upload-time = "2025-11-03T09:03:34.001Z"} @@ -3177,15 +2634,6 @@ wheels = [ {url = "https://files.pythonhosted.org/packages/c1/d4/59e74daffcb57a07668852eeeb6035af9f32cbfd7a1d2511f17d2fe6a738/smmap-5.0.3-py3-none-any.whl", hash = "sha256:c106e05d5a61449cf6ba9a1e650227ecfb141590d2a98412103ff35d89fc7b2f", size = 24390, upload-time = "2026-03-09T03:43:24.361Z"} ] -[[package]] -name = "snowballstemmer" -sdist = {url = "https://files.pythonhosted.org/packages/63/ee/67eef9600338e245ad7838230969a34c823ddbdbccc5e1fc43cd75b55bc9/snowballstemmer-3.1.0.tar.gz", hash = "sha256:fd9e34526b23340cd23ffea6c9f9760974ecc2c2ac9e1d81401443ccdb2a801f", size = 122523, upload-time = "2026-05-24T19:04:19.691Z"} -source = {registry = "https://pypi.org/simple"} -version = "3.1.0" -wheels = [ - {url = "https://files.pythonhosted.org/packages/49/83/ddbf4533c62dd32667ef1238952abef155f3d3391f5be69a352ad1638a42/snowballstemmer-3.1.0-py3-none-any.whl", hash = "sha256:17e6d1da216aa07db6dad37139ea70cf13c4b2e9a096f6e64a9648fc657d3154", size = 104550, upload-time = "2026-05-24T19:04:18.026Z"} -] - [[package]] dependencies = [ {name = "asgiref"}, @@ -3227,88 +2675,6 @@ wheels = [ {url = "https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0", size = 29575, upload-time = "2021-05-16T22:03:41.177Z"} ] -[[package]] -dependencies = [ - {name = "alabaster"}, - {name = "babel"}, - {name = "colorama", marker = "sys_platform == 'win32'"}, - {name = "docutils"}, - {name = "imagesize"}, - {name = "jinja2"}, - {name = "packaging"}, - {name = "pygments"}, - {name = "requests"}, - {name = "roman-numerals-py"}, - {name = "snowballstemmer"}, - {name = "sphinxcontrib-applehelp"}, - {name = "sphinxcontrib-devhelp"}, - {name = "sphinxcontrib-htmlhelp"}, - {name = "sphinxcontrib-jsmath"}, - {name = "sphinxcontrib-qthelp"}, - {name = "sphinxcontrib-serializinghtml"} -] -name = "sphinx" -sdist = {url = "https://files.pythonhosted.org/packages/38/ad/4360e50ed56cb483667b8e6dadf2d3fda62359593faabbe749a27c4eaca6/sphinx-8.2.3.tar.gz", hash = "sha256:398ad29dee7f63a75888314e9424d40f52ce5a6a87ae88e7071e80af296ec348", size = 8321876, upload-time = "2025-03-02T22:31:59.658Z"} -source = {registry = "https://pypi.org/simple"} -version = "8.2.3" -wheels = [ - {url = "https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl", hash = "sha256:4405915165f13521d875a8c29c8970800a0141c14cc5416a38feca4ea5d9b9c3", size = 3589741, upload-time = "2025-03-02T22:31:56.836Z"} -] - -[[package]] -name = "sphinxcontrib-applehelp" -sdist = {url = "https://files.pythonhosted.org/packages/ba/6e/b837e84a1a704953c62ef8776d45c3e8d759876b4a84fe14eba2859106fe/sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1", size = 20053, upload-time = "2024-07-29T01:09:00.465Z"} -source = {registry = "https://pypi.org/simple"} -version = "2.0.0" -wheels = [ - {url = "https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5", size = 119300, upload-time = "2024-07-29T01:08:58.99Z"} -] - -[[package]] -name = "sphinxcontrib-devhelp" -sdist = {url = "https://files.pythonhosted.org/packages/f6/d2/5beee64d3e4e747f316bae86b55943f51e82bb86ecd325883ef65741e7da/sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad", size = 12967, upload-time = "2024-07-29T01:09:23.417Z"} -source = {registry = "https://pypi.org/simple"} -version = "2.0.0" -wheels = [ - {url = "https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2", size = 82530, upload-time = "2024-07-29T01:09:21.945Z"} -] - -[[package]] -name = "sphinxcontrib-htmlhelp" -sdist = {url = "https://files.pythonhosted.org/packages/43/93/983afd9aa001e5201eab16b5a444ed5b9b0a7a010541e0ddfbbfd0b2470c/sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9", size = 22617, upload-time = "2024-07-29T01:09:37.889Z"} -source = {registry = "https://pypi.org/simple"} -version = "2.1.0" -wheels = [ - {url = "https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8", size = 98705, upload-time = "2024-07-29T01:09:36.407Z"} -] - -[[package]] -name = "sphinxcontrib-jsmath" -sdist = {url = "https://files.pythonhosted.org/packages/b2/e8/9ed3830aeed71f17c026a07a5097edcf44b692850ef215b161b8ad875729/sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8", size = 5787, upload-time = "2019-01-21T16:10:16.347Z"} -source = {registry = "https://pypi.org/simple"} -version = "1.0.1" -wheels = [ - {url = "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", size = 5071, upload-time = "2019-01-21T16:10:14.333Z"} -] - -[[package]] -name = "sphinxcontrib-qthelp" -sdist = {url = "https://files.pythonhosted.org/packages/68/bc/9104308fc285eb3e0b31b67688235db556cd5b0ef31d96f30e45f2e51cae/sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab", size = 17165, upload-time = "2024-07-29T01:09:56.435Z"} -source = {registry = "https://pypi.org/simple"} -version = "2.0.0" -wheels = [ - {url = "https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb", size = 88743, upload-time = "2024-07-29T01:09:54.885Z"} -] - -[[package]] -name = "sphinxcontrib-serializinghtml" -sdist = {url = "https://files.pythonhosted.org/packages/3b/44/6716b257b0aa6bfd51a1b31665d1c205fb12cb5ad56de752dfa15657de2f/sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d", size = 16080, upload-time = "2024-07-29T01:10:09.332Z"} -source = {registry = "https://pypi.org/simple"} -version = "2.0.0" -wheels = [ - {url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", size = 92072, upload-time = "2024-07-29T01:10:08.203Z"} -] - [[package]] name = "sqlparse" sdist = {url = "https://files.pythonhosted.org/packages/90/76/437d71068094df0726366574cf3432a4ed754217b436eb7429415cf2d480/sqlparse-0.5.5.tar.gz", hash = "sha256:e20d4a9b0b8585fdf63b10d30066c7c94c5d7a7ec47c889a2d83a3caa93ff28e", size = 120815, upload-time = "2025-12-19T07:17:45.073Z"} @@ -3768,18 +3134,8 @@ wheels = [ ] [package.optional-dependencies] -all = [ - {name = "boto3"}, - {name = "django-auth-ldap"}, - {name = "django-zxcvbn-password-validator"}, - {name = "git-review"}, - {name = "google-cloud-storage"}, - {name = "google-cloud-translate"}, - {name = "logging-gelf"}, - {name = "mercurial"}, - {name = "psycopg", extra = ["binary"]}, - {name = "rollbar"}, - {name = "sphinx"} +postgres = [ + {name = "psycopg", extra = ["binary"]} ] [[package]] @@ -3910,12 +3266,3 @@ wheels = [ {url = "https://files.pythonhosted.org/packages/0f/da/6881b48803a0ee8d23eb5efa30fce3ed218a2bd9de5758ce489d224fee81/zope_interface-8.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:798b7c87d0e59a7d5d086d642208d0d8700ff0d55c4029134b3c479c3bfb110f", size = 304672, upload-time = "2026-05-26T06:50:10.563Z"}, {url = "https://files.pythonhosted.org/packages/2e/0e/b4c01320859ff1d585438bc231fd60bd258d096359bccf6654fecdf0cffb/zope_interface-8.5-cp314-cp314t-win_amd64.whl", hash = "sha256:0fc3a9d45f114d27eaa1e53beeb144533689edca8a9f66505b1e8e8b3f075e42", size = 217241, upload-time = "2026-05-26T06:50:12.171Z"} ] - -[[package]] -name = "zxcvbn" -sdist = {url = "https://files.pythonhosted.org/packages/ae/40/9366940b1484fd4e9423c8decbbf34a73bf52badb36281e082fe02b57aca/zxcvbn-4.5.0.tar.gz", hash = "sha256:70392c0fff39459d7f55d0211151401e79e76fcc6e2c22b61add62900359c7c1", size = 411249, upload-time = "2025-02-19T19:03:02.699Z"} -source = {registry = "https://pypi.org/simple"} -version = "4.5.0" -wheels = [ - {url = "https://files.pythonhosted.org/packages/c2/16/7410f8e714a109d43d17f4e27c8eabb351557653a9b570db1bd7dfdfd822/zxcvbn-4.5.0-py2.py3-none-any.whl", hash = "sha256:2b6eed621612ce6d65e6e4c7455b966acee87d0280e257956b1f06ccc66bd5ff", size = 409397, upload-time = "2025-02-19T19:03:00.521Z"} -]