From fcde6f5060b2200c8658723fb166874882d91a7f Mon Sep 17 00:00:00 2001
From: Ravencentric <78981416+Ravencentric@users.noreply.github.com>
Date: Sun, 2 Feb 2025 03:58:09 +0530
Subject: [PATCH] feat!: redesign core API (#6)
BREAKING CHANGE
---
.github/dependabot.yml | 11 +
.github/workflows/docs.yml | 9 +-
.github/workflows/lint-and-type-check.yml | 9 +-
.github/workflows/release.yml | 17 +-
.github/workflows/{test.yml => tests.yml} | 9 +-
README.md | 31 +-
docs/api-reference/exceptions.md | 5 +-
docs/api-reference/meta-editor.md | 2 +-
docs/api-reference/models.md | 4 -
docs/api-reference/parser.md | 5 +-
docs/index.md | 28 +-
docs/nzb-structure.md | 73 ++
docs/tutorial.md | 182 +++++
mkdocs.yml | 11 +-
pyproject.toml | 49 +-
src/nzb/__init__.py | 20 +-
src/nzb/_core.py | 480 +++++++++---
src/nzb/_exceptions.py | 12 +-
src/nzb/_models.py | 170 +---
src/nzb/_parser.py | 66 +-
src/nzb/_types.py | 4 +-
src/nzb/_utils.py | 83 +-
src/nzb/_version.py | 14 -
tests/__nzbs__/no_doctype.nzb | 13 -
tests/__nzbs__/spec_example_meta_append.nzb | 20 -
tests/__nzbs__/spec_example_meta_clear.nzb | 14 -
tests/__nzbs__/spec_example_meta_set.nzb | 19 -
tests/test_exceptions.py | 76 +-
tests/test_metaeditor.py | 423 ++++++++--
tests/test_nzbparser.py | 119 ++-
tests/test_utils.py | 65 +-
uv.lock | 822 ++++++++++++--------
32 files changed, 1870 insertions(+), 995 deletions(-)
create mode 100644 .github/dependabot.yml
rename .github/workflows/{test.yml => tests.yml} (84%)
delete mode 100644 docs/api-reference/models.md
create mode 100644 docs/nzb-structure.md
create mode 100644 docs/tutorial.md
delete mode 100644 src/nzb/_version.py
delete mode 100644 tests/__nzbs__/no_doctype.nzb
delete mode 100644 tests/__nzbs__/spec_example_meta_append.nzb
delete mode 100644 tests/__nzbs__/spec_example_meta_clear.nzb
delete mode 100644 tests/__nzbs__/spec_example_meta_set.nzb
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 0000000..6c4b369
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,11 @@
+version: 2
+updates:
+ # Maintain dependencies for GitHub Actions
+ - package-ecosystem: "github-actions"
+ directory: "/"
+ schedule:
+ interval: "weekly"
+ groups:
+ actions:
+ patterns:
+ - "*"
diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
index d0beca5..59b49c9 100644
--- a/.github/workflows/docs.yml
+++ b/.github/workflows/docs.yml
@@ -25,12 +25,9 @@ jobs:
git config user.name github-actions[bot]
git config user.email 41898282+github-actions[bot]@users.noreply.github.com
- - name: Install uv
- id: setup-uv
- uses: astral-sh/setup-uv@v3
-
- - name: Install the project
- run: uv sync --all-extras --python 3.12
+ - uses: astral-sh/setup-uv@v5
+ with:
+ python-version: "3.13"
- name: Deploy docs
run: uv run mkdocs gh-deploy --force
diff --git a/.github/workflows/lint-and-type-check.yml b/.github/workflows/lint-and-type-check.yml
index d6b10f7..4b08287 100644
--- a/.github/workflows/lint-and-type-check.yml
+++ b/.github/workflows/lint-and-type-check.yml
@@ -28,12 +28,9 @@ jobs:
- name: Checkout
uses: actions/checkout@v4
- - name: Install uv
- id: setup-uv
- uses: astral-sh/setup-uv@v3
-
- - name: Install the project
- run: uv sync --all-extras --python 3.12
+ - uses: astral-sh/setup-uv@v5
+ with:
+ python-version: "3.13"
- name: Run mypy
run: uv run mypy .
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index e47e29d..f3d12a4 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -22,20 +22,13 @@ jobs:
with:
fetch-depth: 0 # Important for changelog
- - name: Install uv
- id: setup-uv
- uses: astral-sh/setup-uv@v3
-
- - name: Install Python 3.12
- run: uv python install 3.12
+ - uses: astral-sh/setup-uv@v5
+ with:
+ python-version: "3.13"
- name: Build
run: uv build
- - uses: actions/attest-build-provenance@v1
- with:
- subject-path: "dist/*"
-
- name: Generate changelog with git-cliff
uses: tj-actions/git-cliff@v1
with:
@@ -46,7 +39,6 @@ jobs:
- name: Create Release
uses: ncipollo/release-action@v1
with:
- artifacts: "dist/*"
token: ${{ secrets.GITHUB_TOKEN }}
bodyFile: "CHANGELOG.md"
draft: false
@@ -54,5 +46,4 @@ jobs:
- name: Publish package distributions to PyPI
uses: pypa/gh-action-pypi-publish@release/v1
- with:
- attestations: true
+
diff --git a/.github/workflows/test.yml b/.github/workflows/tests.yml
similarity index 84%
rename from .github/workflows/test.yml
rename to .github/workflows/tests.yml
index 07855a3..1c32442 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/tests.yml
@@ -33,12 +33,9 @@ jobs:
- name: Checkout
uses: actions/checkout@v4
- - name: Install uv
- id: setup-uv
- uses: astral-sh/setup-uv@v3
-
- - name: Install the project with Python ${{ matrix.python-version }}
- run: uv sync --all-extras --python ${{ matrix.python-version }}
+ - uses: astral-sh/setup-uv@v5
+ with:
+ python-version: ${{ matrix.python-version }}
- name: Run tests and generate coverage
run: |
diff --git a/README.md b/README.md
index 4821f25..436ab7e 100644
--- a/README.md
+++ b/README.md
@@ -13,12 +13,12 @@
[](https://pypi.org/project/nzb/)


-
-
+
-
-
-[](https://codecov.io/gh/Ravencentric/nzb)
+
+
+
+[](https://codecov.io/gh/Ravencentric/nzb)
@@ -42,28 +42,9 @@ A [spec](https://sabnzbd.org/wiki/extra/nzb-spec) compliant parser and meta edit
pip install nzb
```
-## Usage
-
-```py
-from nzb import NZBParser
-
-nzb = NZBParser.from_file("Big Buck Bunny - S01E01.mkv.nzb").parse()
-
-print(f"{nzb.file.name} ({nzb.file.size.human_readable()})")
-#> Big Buck Bunny - S01E01.mkv (16.7MiB)
-
-for file in nzb.files:
- print((file.name, file.size, file.datetime.isoformat(), file.groups))
- #> ("Big Buck Bunny - S01E01.mkv", 17521761, "2024-01-28T11:18:28+00:00", ("alt.binaries.boneless",))
- #> ("Big Buck Bunny - S01E01.mkv.par2", 1089, "2024-01-28T11:18:29+00:00", ("alt.binaries.boneless",))
- #> ("Big Buck Bunny - S01E01.mkv.vol00+01.par2", 741017, "2024-01-28T11:18:29+00:00", ("alt.binaries.boneless",))
- #> ("Big Buck Bunny - S01E01.mkv.vol01+02.par2", 1480494, "2024-01-28T11:18:29+00:00", ("alt.binaries.boneless",))
- #> ("Big Buck Bunny - S01E01.mkv.vol03+04.par2", 2960528, "2024-01-28T11:18:29+00:00", ("alt.binaries.boneless",))
-```
-
## Docs
-Checkout the complete documentation [here](https://nzb.ravencentric.cc/).
+Checkout the [tutorial](https://nzb.ravencentric.cc/tutorial/) and the [API reference](https://nzb.ravencentric.cc/api-reference/parser/).
## License
diff --git a/docs/api-reference/exceptions.md b/docs/api-reference/exceptions.md
index 518c6e6..cb3f8dc 100644
--- a/docs/api-reference/exceptions.md
+++ b/docs/api-reference/exceptions.md
@@ -1,4 +1 @@
-::: nzb.NZBException
-::: nzb.InvalidNZBError
- options:
- members: true
+::: nzb.InvalidNzbError
diff --git a/docs/api-reference/meta-editor.md b/docs/api-reference/meta-editor.md
index 96e112c..f0d2d8e 100644
--- a/docs/api-reference/meta-editor.md
+++ b/docs/api-reference/meta-editor.md
@@ -1 +1 @@
-::: nzb.NZBMetaEditor
+::: nzb.NzbMetaEditor
diff --git a/docs/api-reference/models.md b/docs/api-reference/models.md
deleted file mode 100644
index ccbfc54..0000000
--- a/docs/api-reference/models.md
+++ /dev/null
@@ -1,4 +0,0 @@
-::: nzb.NZB
-::: nzb.Meta
-::: nzb.Segment
-::: nzb.File
diff --git a/docs/api-reference/parser.md b/docs/api-reference/parser.md
index e0af39a..7f5a0ac 100644
--- a/docs/api-reference/parser.md
+++ b/docs/api-reference/parser.md
@@ -1 +1,4 @@
-::: nzb.NZBParser
+::: nzb.Nzb
+::: nzb.Meta
+::: nzb.File
+::: nzb.Segment
diff --git a/docs/index.md b/docs/index.md
index 959e8f2..3aa721a 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -14,14 +14,13 @@
-
-
+
-
-
-
+
+
+
@@ -37,25 +36,6 @@ A [spec](https://sabnzbd.org/wiki/extra/nzb-spec) compliant parser and meta edit
pip install nzb
```
-## Usage
-
-```py
-from nzb import NZBParser
-
-nzb = NZBParser.from_file("Big Buck Bunny - S01E01.mkv.nzb").parse()
-
-print(f"{nzb.file.name} ({nzb.file.size.human_readable()})")
-#> Big Buck Bunny - S01E01.mkv (16.7MiB)
-
-for file in nzb.files:
- print((file.name, file.size, file.datetime.isoformat(), file.groups))
- #> ("Big Buck Bunny - S01E01.mkv", 17521761, "2024-01-28T11:18:28+00:00", ("alt.binaries.boneless",))
- #> ("Big Buck Bunny - S01E01.mkv.par2", 1089, "2024-01-28T11:18:29+00:00", ("alt.binaries.boneless",))
- #> ("Big Buck Bunny - S01E01.mkv.vol00+01.par2", 741017, "2024-01-28T11:18:29+00:00", ("alt.binaries.boneless",))
- #> ("Big Buck Bunny - S01E01.mkv.vol01+02.par2", 1480494, "2024-01-28T11:18:29+00:00", ("alt.binaries.boneless",))
- #> ("Big Buck Bunny - S01E01.mkv.vol03+04.par2", 2960528, "2024-01-28T11:18:29+00:00", ("alt.binaries.boneless",))
-```
-
## License
Distributed under the [MIT](https://choosealicense.com/licenses/mit/) License. See [LICENSE](https://github.com/Ravencentric/nzb/blob/main/LICENSE) for more information.
diff --git a/docs/nzb-structure.md b/docs/nzb-structure.md
new file mode 100644
index 0000000..6c6e651
--- /dev/null
+++ b/docs/nzb-structure.md
@@ -0,0 +1,73 @@
+# Structure of an NZB file
+
+## Overview
+
+[NZB is an XML-based file format for retrieving posts from NNTP (Usenet) servers](https://en.wikipedia.org/wiki/NZB).
+Here's an example file:
+
+```xml
+
+
+
+
+ Big Buck Bunny - S01E01.mkv
+ secret
+ HD
+ TV
+
+
+
+ alt.binaries.boneless
+
+
+ 9cacde4c986547369becbf97003fb2c5-9483514693959@example
+ 70a3a038ce324e618e2751e063d6a036-7285710986748@example
+
+
+
+```
+
+Behind all the ugly XML, the core is pretty simple. An NZB file has optional creator-defined metadata (some of which are ["standardized"](https://sabnzbd.org/wiki/extra/nzb-spec)) and several files.
+
+Each file has some metadata attached to it, belongs to one or more Usenet groups, and contains one or more segments.
+Each segment has a unique message ID and its size in bytes.
+Together, the segments form a single file.
+
+For instance, in the example above, `file` points to a file called `Big Buck Bunny - S01E01.mkv` that belongs to the `alt.binaries.boneless` group and was broken into 2 segments, each about 739 kilobytes in size.
+
+## Diagram
+
+Here's a class diagram representing the structure of an NZB, which mirrors the Python implementation.
+
+```mermaid
+classDiagram
+ class Meta {
+ title: str | None
+ passwords: tuple[str, ...]
+ tags: tuple[str, ...]
+ category: str | None
+ }
+
+ class Segment {
+ size: int
+ number: int
+ message_id: str
+ }
+
+ class File {
+ poster: str
+ posted_at: datetime
+ subject: str
+ groups: tuple[str, ...]
+ segments: tuple[Segment, ...]
+ }
+
+ class Nzb {
+ meta: Meta
+ files: tuple[File, ...]
+ }
+
+ Nzb -- Meta
+ Nzb -- File
+ File -- Segment
+```
\ No newline at end of file
diff --git a/docs/tutorial.md b/docs/tutorial.md
new file mode 100644
index 0000000..d16a712
--- /dev/null
+++ b/docs/tutorial.md
@@ -0,0 +1,182 @@
+## Parsing an NZB
+
+[`nzb.Nzb`][nzb.Nzb] allows you to parse NZB files from strings or files. The example below demonstrates basic parsing and metadata access.
+
+=== "code"
+
+ ```python
+ from nzb import Nzb
+
+ text = """
+
+
+
+
+ Big Buck Bunny - S01E01.mkv
+ secret
+ HD
+ TV
+
+
+
+ alt.binaries.boneless
+
+
+ 9cacde4c986547369becbf97003fb2c5-9483514693959@example
+ 70a3a038ce324e618e2751e063d6a036-7285710986748@example
+
+
+
+ """
+
+ nzb = Nzb.from_str(text)
+ # Alternatively, we can also pass an nzb file directly:
+ # nzb = Nzb.from_file("big_buck_bunny.nzb")
+
+ print(f"{nzb.file.name} ({nzb.meta.category}) was posted by {nzb.file.poster} on {nzb.file.posted_at}.")
+ print(f"Number of files: {len(nzb.files)}")
+ print(f"Total size in bytes: {nzb.size}")
+ ```
+
+=== "output"
+
+ ```text
+ Big Buck Bunny - S01E01.mkv (TV) was posted by John on 2024-01-28 11:18:28+00:00.
+ Number of files: 1
+ Total size in bytes: 1478616
+ ```
+
+## JSON round-tripping
+
+We can also serialize to JSON and deserialize from JSON.
+
+=== "code"
+
+ ```python
+ from nzb import Nzb
+
+ text = """
+
+
+
+
+ Big Buck Bunny - S01E01.mkv
+ secret
+ HD
+ TV
+
+
+
+ alt.binaries.boneless
+
+
+ 9cacde4c986547369becbf97003fb2c5-9483514693959@example
+ 70a3a038ce324e618e2751e063d6a036-7285710986748@example
+
+
+
+ """
+
+ original = Nzb.from_str(text)
+ serialized = original.to_json()
+ deserialized = Nzb.from_json(serialized)
+
+ assert original == deserialized # True
+ ```
+
+=== "json"
+
+ ```json
+ {
+ "meta": {
+ "title": "Big Buck Bunny - S01E01.mkv",
+ "passwords": ["secret"],
+ "tags": ["HD"],
+ "category": "TV"
+ },
+ "files": [
+ {
+ "poster": "John ",
+ "posted_at": "2024-01-28T11:18:28Z",
+ "subject": "[1/1] - \"Big Buck Bunny - S01E01.mkv\" yEnc (1/2) 1478616",
+ "groups": ["alt.binaries.boneless"],
+ "segments": [
+ {
+ "size": 739067,
+ "number": 1,
+ "message_id": "9cacde4c986547369becbf97003fb2c5-9483514693959@example"
+ },
+ {
+ "size": 739549,
+ "number": 2,
+ "message_id": "70a3a038ce324e618e2751e063d6a036-7285710986748@example"
+ }
+ ]
+ }
+ ]
+ }
+ ```
+
+## Editing metadata
+
+[`nzb.NzbMetaEditor`][nzb.NzbMetaEditor] allows you to manipulate the metadata fields in an NZB.
+
+=== "code"
+
+ ```python
+ from nzb import NzbMetaEditor
+
+ text = """
+
+
+
+
+ Big Buck Bunny - S01E01.mkv
+ secret
+ HD
+ TV
+
+
+
+ alt.binaries.boneless
+
+
+ 9cacde4c986547369becbf97003fb2c5-9483514693959@example
+ 70a3a038ce324e618e2751e063d6a036-7285710986748@example
+
+
+
+ """
+
+ editor = NzbMetaEditor(text)
+ # Alternatively, we can also pass an nzb file directly:
+ # editor = NzbMetaEditor.from_file("big_buck_bunny.nzb")
+
+ edited = editor.set(title="Big Buck Bunny").append(tags="1080p").to_str()
+
+ print(edited)
+ ```
+=== "output"
+
+ ```xml
+
+
+
+
+ Big Buck Bunny
+ TV
+ secret
+ HD
+ 1080p
+
+
+
+ alt.binaries.boneless
+
+
+ 9cacde4c986547369becbf97003fb2c5-9483514693959@example
+ 70a3a038ce324e618e2751e063d6a036-7285710986748@example
+
+
+
+ ```
diff --git a/mkdocs.yml b/mkdocs.yml
index f7fe1c9..6e127de 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -1,7 +1,7 @@
# Project information
site_name: nzb
site_author: Ravencentric
-site_description: A spec compliant parser and meta editor for NZB files
+site_description: A spec compliant parser and meta editor for NZB files.
# Repository
repo_name: nzb
@@ -9,6 +9,7 @@ repo_url: https://github.com/Ravencentric/nzb
edit_uri: edit/main/docs/
theme:
+ language: en
icon:
repo: fontawesome/brands/github
edit: material/pencil
@@ -70,15 +71,19 @@ markdown_extensions:
- pymdownx.inlinehilite
- pymdownx.snippets:
url_download: true
- - pymdownx.superfences
+ - pymdownx.superfences:
+ custom_fences:
+ - name: mermaid
+ class: mermaid
- pymdownx.tabbed:
alternate_style: true
nav:
- Home: index.md
+ - Tutorial: tutorial.md
+ - NZB Structure: nzb-structure.md
- API Reference:
- Parser: api-reference/parser.md
- Meta Editor: api-reference/meta-editor.md
- - Models: api-reference/models.md
- Types: api-reference/types.md
- Exceptions: api-reference/exceptions.md
diff --git a/pyproject.toml b/pyproject.toml
index 8e2d000..c6211fb 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,7 +1,7 @@
[project]
name = "nzb"
version = "0.3.0"
-description = "A spec compliant parser and meta editor for NZB files"
+description = "A spec compliant parser and meta editor for NZB files."
authors = [{ name = "Ravencentric", email = "me@ravencentric.cc" }]
readme = "README.md"
license = "MIT"
@@ -22,36 +22,53 @@ Homepage = "https://nzb.ravencentric.cc"
Documentation = "https://nzb.ravencentric.cc"
Repository = "https://github.com/Ravencentric/nzb"
-[tool.uv]
-dev-dependencies = [
- "coverage>=7.6.1",
- "mkdocs-autorefs>=1.2.0",
- "mkdocs-material>=9.5.36",
- "mkdocstrings[python]>=0.26.1",
- "mypy>=1.11.2",
- "pytest>=8.3.3",
- "ruff>=0.6.7",
- "types-xmltodict>=0.13.0.3",
- "typing-extensions>=4.12.2",
+[dependency-groups]
+docs = [
+ "mkdocs-autorefs>=1.3.0",
+ "mkdocs-material>=9.5.50",
+ "mkdocstrings[python]>=0.27.0",
+]
+test = [
+ "coverage[toml]>=7.6.10",
+ "pytest>=8.3.4",
+ "rnzb>=0.3.1",
+]
+lint = [
+ "mypy>=1.14.1",
+ "ruff>=0.9.3",
+ "types-xmltodict>=0.14.0.20241009",
+ "typing-extensions>=4.12.2",
+]
+dev = [
+ { include-group = "docs" },
+ { include-group = "test" },
+ { include-group = "lint" },
]
[tool.ruff]
line-length = 120
[tool.ruff.lint]
-extend-select = ["I"]
+extend-select = ["I", "RUF", "UP", "N", "PERF", "B", "D4"]
fixable = ["ALL"]
+[tool.ruff.lint.extend-per-file-ignores]
+"tests/*" = ["D"]
+
[tool.ruff.lint.isort]
required-imports = ["from __future__ import annotations"]
[tool.mypy]
strict = true
pretty = true
-exclude = "tests/"
+files = ["src/**/*.py", "tests/**/*.py"]
+enable_error_code = ["ignore-without-code"]
-[tool.coverage.run]
-omit = ["src/nzb/_version.py", "tests/*"]
+[tool.pytest.ini_options]
+addopts = ["-ra", "--showlocals", "--strict-markers", "--strict-config"]
+filterwarnings = ["error"]
+log_cli_level = "info"
+testpaths = ["tests"]
[tool.coverage.report]
exclude_also = [
diff --git a/src/nzb/__init__.py b/src/nzb/__init__.py
index 9cf3488..d91ba09 100644
--- a/src/nzb/__init__.py
+++ b/src/nzb/__init__.py
@@ -1,19 +1,17 @@
from __future__ import annotations
-from nzb._core import NZBMetaEditor, NZBParser
-from nzb._exceptions import InvalidNZBError, NZBException
-from nzb._models import NZB, File, Meta, Segment
-from nzb._version import __version__, __version_tuple__
+from nzb._core import Nzb, NzbMetaEditor
+from nzb._exceptions import InvalidNzbError
+from nzb._models import File, Meta, Segment
+
+__version__ = "0.3.0"
__all__ = (
- "NZBParser",
- "NZBMetaEditor",
- "Meta",
"File",
+ "InvalidNzbError",
+ "Meta",
+ "Nzb",
+ "NzbMetaEditor",
"Segment",
- "NZB",
- "NZBException",
- "InvalidNZBError",
"__version__",
- "__version_tuple__",
)
diff --git a/src/nzb/_core.py b/src/nzb/_core.py
index a8a5cdb..b52474d 100644
--- a/src/nzb/_core.py
+++ b/src/nzb/_core.py
@@ -1,17 +1,19 @@
from __future__ import annotations
from collections import OrderedDict
+from functools import cached_property
from pathlib import Path
from typing import TYPE_CHECKING, Literal, overload
from xml.parsers.expat import ExpatError
+from natsort import natsorted
from xmltodict import parse as xmltodict_parse
from xmltodict import unparse as xmltodict_unparse
-from nzb._exceptions import InvalidNZBError
-from nzb._models import NZB
+from nzb._exceptions import InvalidNzbError
+from nzb._models import File, Meta, ParentModel
from nzb._parser import parse_doctype, parse_files, parse_metadata
-from nzb._utils import meta_constructor, realpath
+from nzb._utils import construct_meta, realpath, remove_meta_fields, sort_meta
if TYPE_CHECKING:
from collections.abc import Iterable
@@ -21,92 +23,338 @@
from nzb._types import StrPath
-class NZBParser:
- def __init__(self, nzb: str, *, encoding: str | None = "utf-8") -> None:
+class Nzb(ParentModel):
+ """
+ Represents a complete NZB file.
+
+ Example:
+ -------
+ ```python
+ from nzb import Nzb
+
+ text = '''
+
+
+
+
+ Big Buck Bunny - S01E01.mkv
+ secret
+ HD
+ TV
+
+
+
+ alt.binaries.boneless
+
+
+ 9cacde4c986547369becbf97003fb2c5-9483514693959@example
+ 70a3a038ce324e618e2751e063d6a036-7285710986748@example
+
+
+
+ '''
+
+ nzb = Nzb.from_str(text)
+
+ print(f"{nzb.file.name} ({nzb.meta.category}) was posted by {nzb.file.poster} on {nzb.file.posted_at}.")
+ print(f"Number of files: {len(nzb.files)}")
+ print(f"Total size in bytes: {nzb.size}")
+ ```
+
+ """
+
+ meta: Meta = Meta()
+ """Optional creator-definable metadata for the contents of the NZB."""
+
+ files: tuple[File, ...]
+ """File objects representing the files included in the NZB."""
+
+ @cached_property
+ def file(self) -> File:
"""
- Initialize the NZBParser.
+ The main content file (episode, movie, etc) in the NZB.
+ This is determined by finding the largest file in the NZB
+ and may not always be accurate.
+ """
+ return max(self.files, key=lambda file: file.size)
+
+ @classmethod
+ def from_str(cls, nzb: str, /) -> Self:
+ """
+ Parse the given string into an [`Nzb`][nzb.Nzb].
Parameters
----------
nzb : str
- NZB content as a string.
- encoding : str, optional
- Encoding of the NZB content.
- """
- self.__nzb = nzb
- self.__encoding = encoding
-
- def parse(self) -> NZB:
- """
- Parse the NZB.
+ NZB string.
Returns
-------
- NZB
- NZB object representing the parsed NZB file.
+ Nzb
+ Object representing the parsed NZB file.
Raises
------
- InvalidNZBError
- Raised if the input is not valid NZB.
+ InvalidNzbError
+ Raised if the NZB is invalid.
+
"""
try:
- nzbdict = xmltodict_parse(self.__nzb, encoding=self.__encoding)
+ # Note: the .strip() is important, otherwise we get an ExpatError:
+ # xml.parsers.expat.ExpatError: XML or text declaration not at start of entity: line 2, column 0
+ # This can be easily reproduced with:
+ #
+ # ```py
+ # text = """
+ #
+ # """
+ # Nzb.from_str(text)
+ #
+ # ```
+ nzbdict = xmltodict_parse(nzb.strip())
except ExpatError as error:
- raise InvalidNZBError(error.args[0])
+ raise InvalidNzbError(error.args[0]) from None
meta = parse_metadata(nzbdict)
files = parse_files(nzbdict)
- return NZB(meta=meta, files=files)
+ return cls(meta=meta, files=files)
@classmethod
- def from_file(cls, nzb: StrPath, *, encoding: str | None = "utf-8") -> Self:
+ def from_file(cls, nzb: StrPath, /, *, encoding: str = "utf-8") -> Nzb:
"""
- Create an NZBParser instance from an NZB file path.
+ Parse the given file into an [`Nzb`][nzb.Nzb].
Parameters
----------
- nzb : StrPath
- File path to the NZB.
+ nzb : str | PathLike[str]
+ Path to the NZB file.
encoding : str, optional
- Encoding of the NZB, defaults to `utf-8`.
+ The encoding used to open the file.
+
+ Returns
+ -------
+ Nzb
+ Object representing the parsed NZB file.
+
+ Raises
+ ------
+ InvalidNzbError
+ Raised if the NZB is invalid.
+
+ """
+ if not isinstance(encoding, str):
+ raise ValueError("encoding must be a valid string!")
+
+ _nzb = realpath(nzb).read_text(encoding=encoding)
+ return cls.from_str(_nzb)
+
+ @classmethod
+ def from_json(cls, json: str, /) -> Nzb:
+ """
+ Deserialize the given JSON string into an [`Nzb`][nzb.Nzb].
+
+ Parameters
+ ----------
+ json : str
+ JSON string representing the NZB.
+
+ Returns
+ -------
+ Nzb
+ Object representing the parsed NZB file.
+
+ Raises
+ ------
+ InvalidNzbError
+ Raised if the NZB is invalid.
+
+ """
+ return cls.model_validate_json(json)
+
+ def to_json(self, *, pretty: bool = False) -> str:
+ """
+ Serialize the [`Nzb`][nzb.Nzb] object into a JSON string.
+
+ Parameters
+ ----------
+ pretty : bool, optional
+ Whether to pretty format the JSON string.
Returns
-------
- NZBParser
- An NZBParser instance initialized with the content of the specified NZB file.
+ str
+ JSON string representing the NZB.
+
+ """
+ indent = 2 if pretty else None
+ return self.model_dump_json(indent=indent)
+
+ @cached_property
+ def size(self) -> int:
+ """Total size of all the files in the NZB."""
+ return sum(file.size for file in self.files)
+
+ @cached_property
+ def filenames(self) -> tuple[str, ...]:
+ """
+ Tuple of unique file names across all the files in the NZB.
+ May return an empty tuple if it fails to extract the name for every file.
"""
- nzb = realpath(nzb).read_text(encoding=encoding)
- return cls(nzb, encoding=encoding)
+ return tuple(natsorted({file.name for file in self.files if file.name is not None}))
+ @cached_property
+ def posters(self) -> tuple[str, ...]:
+ """
+ Tuple of unique posters across all the files in the NZB.
+ """
+ return tuple(natsorted({file.poster for file in self.files}))
-class NZBMetaEditor:
- def __init__(self, nzb: str, *, encoding: str = "utf-8") -> None:
+ @cached_property
+ def groups(self) -> tuple[str, ...]:
+ """
+ Tuple of unique groups across all the files in the NZB.
+ """
+ groupset: set[str] = set()
+
+ for file in self.files:
+ groupset.update(file.groups)
+
+ return tuple(natsorted(groupset))
+
+ @cached_property
+ def par2_size(self) -> int:
+ """
+ Total size of all the `.par2` files.
+ """
+ return sum(file.size for file in self.files if file.is_par2())
+
+ @cached_property
+ def par2_percentage(self) -> float:
+ """
+ Percentage of the size of all the `.par2` files relative to the total size.
"""
- Initialize the NZBMetaEditor instance.
+ return (self.par2_size / self.size) * 100
+
+ def has_rar(self) -> bool:
+ """
+ Return `True` if any file in the NZB is a `.rar` file, `False` otherwise.
+ """
+ return any(file.is_rar() for file in self.files)
+
+ def is_rar(self) -> bool:
+ """
+ Return `True` if all files in the NZB are `.rar` files, `False` otherwise.
+ """
+ return all(file.is_rar() for file in self.files)
+
+ def is_obfuscated(self) -> bool:
+ """
+ Return `True` if any file in the NZB is obfuscated, `False` otherwise.
+ """
+ return any(file.is_obfuscated() for file in self.files)
+
+ def has_par2(self) -> bool:
+ """
+ Return `True` if there's at least one `.par2` file in the NZB, `False` otherwise.
+ """
+ return any(file.is_par2() for file in self.files)
+
+
+class NzbMetaEditor:
+ def __init__(self, nzb: str) -> None:
+ """
+ Create an NzbMetaEditor instance.
Parameters
----------
nzb : str
NZB content as a string.
- encoding : str, optional
- Encoding of the NZB content, defaults to `utf-8`.
Raises
------
- InvalidNZBError
- Raised if the input is not valid XML.
- However, being valid XML doesn't guarantee it's a correctly structured NZB.
+ InvalidNzbError
+ If the string cannot be parsed as valid XML.
+
+ Note
+ ----
+ This does not validate the given NZB.
+
+ Example
+ -------
+ ```python
+ from nzb import NzbMetaEditor
+
+ text = '''
+
+
+
+
+ Big Buck Bunny - S01E01.mkv
+ secret
+ HD
+ TV
+
+
+
+ alt.binaries.boneless
+
+
+ 9cacde4c986547369becbf97003fb2c5-9483514693959@example
+ 70a3a038ce324e618e2751e063d6a036-7285710986748@example
+
+
+
+ '''
+
+ editor = NzbMetaEditor(text)
+ edited = editor.set(title="Big Buck Bunny").append(tags="1080p").to_str()
+ print(edited)
+ ```
+
"""
- self.__nzb = nzb
- self.__encoding = encoding
+ self._nzb = nzb
try:
- self.__nzbdict = xmltodict_parse(self.__nzb, encoding=self.__encoding)
+ # Note: the .strip() is important, otherwise we get an ExpatError:
+ # xml.parsers.expat.ExpatError: XML or text declaration not at start of entity: line 2, column 0
+ # This can be easily reproduced with:
+ #
+ # ```py
+ # text = """
+ #
+ # """
+ # NzbMetaEditor(text)
+ #
+ # ```
+ self._nzbdict = xmltodict_parse(self._nzb.strip())
except ExpatError as error:
- raise InvalidNZBError(error.args[0])
+ raise InvalidNzbError(error.args[0]) from None
- def __get_meta(self) -> list[dict[str, str]] | dict[str, str] | None:
+ @classmethod
+ def from_file(cls, nzb: StrPath, *, encoding: str = "utf-8") -> Self:
+ """
+ Create an NzbMetaEditor instance from an NZB file path.
+
+ Parameters
+ ----------
+ nzb : StrPath
+ File path to the NZB.
+ encoding : str, optional
+ The encoding used to open the file.
+
+ Returns
+ -------
+ Self
+ Returns itself.
+
+ """
+ if not isinstance(encoding, str):
+ raise ValueError("encoding must be a valid string!")
+ data = realpath(nzb).read_text(encoding=encoding)
+ instance = cls(data)
+ return instance
+
+ def _get_meta(self) -> list[dict[str, str]] | dict[str, str] | None:
"""
Retrieve current metadata from the NZB.
@@ -114,8 +362,9 @@ def __get_meta(self) -> list[dict[str, str]] | dict[str, str] | None:
-------
list[dict[str, str]] | dict[str, str] | None
The metadata as a list of dictionaries, a single dictionary, or `None` if not found.
+
"""
- return self.__nzbdict.get("nzb", {}).get("head", {}).get("meta") # type: ignore
+ return self._nzbdict.get("nzb", {}).get("head", {}).get("meta") # type: ignore[no-any-return]
def set(
self,
@@ -127,7 +376,8 @@ def set(
) -> Self:
"""
Set metadata fields in the NZB.
- This will also remove all existing metadata fields.
+ Provided fields are replaced entirely if they already exist.
+ Fields that aren't provided remain unchanged.
Parameters
----------
@@ -144,60 +394,71 @@ def set(
-------
Self
Returns itself.
+
"""
if title is None and passwords is None and tags is None and category is None:
return self
- nzb = OrderedDict(self.__nzbdict["nzb"])
+ meta = self._get_meta()
+
+ if meta is None:
+ nzb = OrderedDict(self._nzbdict["nzb"])
+ nzb["head"] = {}
+ nzb["head"]["meta"] = sort_meta(
+ construct_meta(title=title, passwords=passwords, tags=tags, category=category)
+ )
+ nzb.move_to_end("file")
+ self._nzbdict["nzb"] = nzb
+ return self
+
+ new_meta = [meta] if isinstance(meta, dict) else meta
+
+ fields_to_remove = {
+ "title": title is not None,
+ "category": category is not None,
+ "password": passwords is not None,
+ "tag": tags is not None,
+ }
+
+ filtered_meta = remove_meta_fields(new_meta, [k for k, v in fields_to_remove.items() if v])
+ filtered_meta.extend(construct_meta(title=title, passwords=passwords, tags=tags, category=category))
+ self._nzbdict["nzb"]["head"]["meta"] = sort_meta(filtered_meta)
- nzb["head"] = {}
- nzb["head"]["meta"] = meta_constructor(title=title, passwords=passwords, tags=tags, category=category)
- nzb.move_to_end("file")
- self.__nzbdict["nzb"] = nzb
return self
def append(
self,
*,
- title: str | None = None,
passwords: Iterable[str] | str | None = None,
tags: Iterable[str] | str | None = None,
- category: str | None = None,
) -> Self:
"""
Append metadata fields to the existing metadata in the NZB.
Parameters
----------
- title : str, optional
- The title metadata field.
passwords : Iterable[str] | str, optional
Password(s) for the NZB file.
tags : Iterable[str] | str, optional
Tag(s) associated with the NZB file.
- category : str, optional
- Category of the NZB file.
Returns
-------
Self
Returns itself.
+
"""
- meta = self.__get_meta()
+ meta = self._get_meta()
if meta is None:
- self.set(title=title, passwords=passwords, tags=tags, category=category)
+ return self.set(passwords=passwords, tags=tags)
- elif isinstance(meta, dict):
- new_meta = [meta]
- new_meta.extend(meta_constructor(title=title, passwords=passwords, tags=tags, category=category))
- self.__nzbdict["nzb"]["head"]["meta"] = new_meta
+ new_meta = [meta] if isinstance(meta, dict) else meta
+ new_meta.extend(construct_meta(passwords=passwords, tags=tags))
- else:
- meta.extend(meta_constructor(title=title, passwords=passwords, tags=tags, category=category))
- self.__nzbdict["nzb"]["head"]["meta"] = meta
+ self._nzbdict["nzb"]["head"]["meta"] = sort_meta(new_meta)
return self
@@ -221,9 +482,10 @@ def remove(self, key: Literal["title", "password", "tag", "category"] | str) ->
-------
Self
Returns itself.
+
"""
- meta = self.__get_meta()
+ meta = self._get_meta()
if meta is None:
return self
@@ -235,7 +497,7 @@ def remove(self, key: Literal["title", "password", "tag", "category"] | str) ->
return self
else:
new_meta = [row for row in meta if row["@type"] != key]
- self.__nzbdict["nzb"]["head"]["meta"] = new_meta
+ self._nzbdict["nzb"]["head"]["meta"] = new_meta
return self
def clear(self) -> Self:
@@ -246,15 +508,36 @@ def clear(self) -> Self:
-------
Self
Returns itself.
+
"""
try:
- del self.__nzbdict["nzb"]["head"]
+ del self._nzbdict["nzb"]["head"]
except KeyError:
pass
return self
- def save(self, filename: StrPath | None = None, *, overwrite: bool = False) -> Path:
+ def to_str(self) -> str:
+ """
+ Return the edited NZB as a string.
+
+ Returns
+ -------
+ str
+ Edited NZB.
+
+ """
+ unparsed = xmltodict_unparse(self._nzbdict, encoding="utf-8", pretty=True, indent=" ")
+
+ if doctype := parse_doctype(self._nzb):
+ # see: https://github.com/martinblech/xmltodict/issues/351
+ nzb = unparsed.splitlines()
+ nzb.insert(1, doctype)
+ return "\n".join(nzb)
+
+ return unparsed.strip()
+
+ def to_file(self, filename: StrPath, *, overwrite: bool = False) -> Path:
"""
Save the edited NZB to a file.
@@ -262,7 +545,6 @@ def save(self, filename: StrPath | None = None, *, overwrite: bool = False) -> P
----------
filename : StrPath, optional
Destination path for saving the NZB.
- If not provided, uses the original file path if available.
This will also create the path if it doesn't exist already.
overwrite : bool, optional
Whether to overwrite the file if it exists, defaults to `False`.
@@ -274,58 +556,16 @@ def save(self, filename: StrPath | None = None, *, overwrite: bool = False) -> P
Raises
------
- FileNotFoundError
- If no filename is specified and the original file path is unknown.
FileExistsError
If the file exists and overwrite is `False`.
+
"""
- self_filename: Path | None = getattr(self, "__nzb_file", None)
+ outfile = realpath(filename)
- if filename is None:
- if self_filename is None:
- raise FileNotFoundError("No filename specified!")
- else:
- if overwrite:
- outfile = self_filename
- else:
- raise FileExistsError(self_filename)
- else:
- outfile = realpath(filename)
+ if outfile.is_file() and not overwrite:
+ raise FileExistsError(outfile)
outfile.parent.mkdir(parents=True, exist_ok=True)
- unparsed = xmltodict_unparse(self.__nzbdict, encoding=self.__encoding, pretty=True, indent=" ")
-
- if doctype := parse_doctype(self.__nzb):
- # see: https://github.com/martinblech/xmltodict/issues/351
- nzb = unparsed.splitlines(keepends=True)
- nzb.insert(1, f"{doctype}\n")
- with open(outfile, "w", encoding=self.__encoding) as f:
- f.writelines(nzb)
- else:
- outfile.write_text(unparsed, encoding=self.__encoding)
-
- return outfile
-
- @classmethod
- def from_file(cls, nzb: StrPath, *, encoding: str = "utf-8") -> Self:
- """
- Create an NZBMetaEditor instance from an NZB file path.
-
- Parameters
- ----------
- nzb : StrPath
- File path to the NZB.
- encoding : str, optional
- Encoding of the NZB, defaults to `utf-8`.
-
- Returns
- -------
- Self
- Returns itself.
- """
- __nzb_file = realpath(nzb)
- data = __nzb_file.read_text(encoding=encoding)
- instance = cls(data, encoding=encoding)
- setattr(instance, "__nzb_file", __nzb_file)
- return instance
+ outfile.write_text(self.to_str(), encoding="utf-8")
+ return outfile.resolve()
diff --git a/src/nzb/_exceptions.py b/src/nzb/_exceptions.py
index a3451f6..6d29055 100644
--- a/src/nzb/_exceptions.py
+++ b/src/nzb/_exceptions.py
@@ -1,20 +1,16 @@
from __future__ import annotations
-class NZBException(Exception):
- """Base exception for all nzb exceptions"""
-
-
-class InvalidNZBError(NZBException):
- """Invalid NZB"""
+class InvalidNzbError(Exception):
+ """Invalid NZB."""
def __init__(self, message: str) -> None:
self.message = message
- """Human readable error message"""
+ """Human readable error message."""
super().__init__(message)
def __str__(self) -> str:
- """Equivalent to accessing the .message attribute"""
+ """Equivalent to accessing the .message attribute."""
return self.message
def __repr__(self) -> str:
diff --git a/src/nzb/_models.py b/src/nzb/_models.py
index 79e362b..70be262 100644
--- a/src/nzb/_models.py
+++ b/src/nzb/_models.py
@@ -4,15 +4,10 @@
from functools import cached_property
from os.path import splitext
-from natsort import natsorted
-from pydantic import BaseModel, ByteSize, ConfigDict
+from pydantic import BaseModel, ConfigDict
from nzb._types import UTCDateTime
-from nzb._utils import (
- name_is_par2,
- name_is_rar,
- stem_is_obfuscated,
-)
+from nzb._utils import name_is_par2, name_is_rar, stem_is_obfuscated
class ParentModel(BaseModel):
@@ -25,42 +20,20 @@ class Meta(ParentModel):
title: str | None = None
"""Title."""
- passwords: tuple[str, ...] | None = None # Can be specified multiple times.
+ passwords: tuple[str, ...] = () # Can be specified multiple times.
"""Password(s)."""
- tags: tuple[str, ...] | None = None # Can be specified multiple times.
+ tags: tuple[str, ...] = () # Can be specified multiple times.
"""Tag(s)."""
category: str | None = None
"""Category."""
- @cached_property
- def password(self) -> str | None:
- """
- Return the first password from [`Meta.passwords`][nzb._models.Meta.passwords]
- if it exists, None otherwise.
-
- This is essentially just syntactic sugar for `password = passwords[0] if passwords else None`
- because although the spec allows multiple passwords, single passwords are far more common.
- """
- return self.passwords[0] if self.passwords else None
-
- @cached_property
- def tag(self) -> str | None:
- """
- The first tag from [`Meta.tags`][nzb._models.Meta.tags]
- if it exists, None otherwise.
-
- This is essentially just syntactic sugar for `tag = tags[0] if tags else None`
- because although the spec allows multiple tags, single tags are far more common.
- """
- return self.tags[0] if self.tags else None
-
class Segment(ParentModel):
"""One part segment of a file."""
- size: ByteSize
+ size: int
"""Size of the segment."""
number: int
"""Number of the segment."""
@@ -74,7 +47,7 @@ class File(ParentModel):
poster: str
"""The poster of the file."""
- datetime: UTCDateTime
+ posted_at: UTCDateTime
"""The date and time when the file was posted, in UTC."""
subject: str
@@ -87,15 +60,15 @@ class File(ParentModel):
"""Segments that make up the file."""
@cached_property
- def size(self) -> ByteSize:
+ def size(self) -> int:
"""Size of the file calculated from the sum of segment sizes."""
- return ByteSize(sum(segment.size for segment in self.segments))
+ return sum(segment.size for segment in self.segments)
@cached_property
- def name(self) -> str:
+ def name(self) -> str | None:
"""
Complete name of the file with it's extension extracted from the subject.
- May return an empty string if it fails to extract the name.
+ May return `None` if it fails to extract the name.
"""
# https://github.com/sabnzbd/sabnzbd/blob/02b4a116dd4b46b2d2f33f7bbf249f2294458f2e/sabnzbd/nzbstuff.py#L104-L106
if parsed := re.search(r'"([^"]*)"', self.subject):
@@ -105,31 +78,31 @@ def name(self) -> str:
):
return parsed.group(1).strip()
else:
- return ""
+ return None
@cached_property
- def stem(self) -> str:
+ def stem(self) -> str | None:
"""
Base name of the file without it's extension extracted from the [`File.name`][nzb._models.File.name].
- May return an empty string if it fails to extract the stem.
+ May return `None` if it fails to extract the stem.
"""
if not self.name:
- return ""
+ return None
else:
root, _ = splitext(self.name)
return root
@cached_property
- def suffix(self) -> str:
+ def extension(self) -> str | None:
"""
- Extension of the file extracted from the [`File.name`][nzb._models.File.name].
- May return an empty string if it fails to extract the extension.
+ Extension of the file without the leading dot extracted from the [`File.name`][nzb._models.File.name].
+ May return `None` if it fails to extract the extension.
"""
if not self.name:
- return ""
+ return None
else:
_, ext = splitext(self.name)
- return ext
+ return ext.removeprefix(".")
def is_par2(self) -> bool:
"""
@@ -148,108 +121,3 @@ def is_obfuscated(self) -> bool:
Return `True` if the file is obfuscated, `False` otherwise.
"""
return stem_is_obfuscated(self.stem)
-
-
-class NZB(ParentModel):
- """Represents a complete NZB file."""
-
- meta: Meta = Meta()
- """Optional creator-definable metadata for the contents of the NZB."""
-
- files: tuple[File, ...]
- """File objects representing the files included in the NZB."""
-
- @cached_property
- def file(self) -> File:
- """
- The main content file (episode, movie, etc) in the NZB.
- This is determined by finding the largest file in the NZB
- and may not always be accurate.
- """
- return max(self.files, key=lambda file: file.size)
-
- @cached_property
- def size(self) -> ByteSize:
- """Total size of all the files in the NZB."""
- return ByteSize(sum(file.size for file in self.files))
-
- @cached_property
- def names(self) -> tuple[str, ...]:
- """
- Tuple of unique file names across all the files in the NZB.
- May return an empty tuple if it fails to extract the name for every file.
- """
- return tuple(natsorted({file.name for file in self.files}))
-
- @cached_property
- def stems(self) -> tuple[str, ...]:
- """
- Tuple of unique file stems (basename) across all the files in the NZB.
- May return an empty tuple if it fails to extract the stem for every file.
- """
- return tuple(natsorted({file.stem for file in self.files}))
-
- @cached_property
- def suffixes(self) -> tuple[str, ...]:
- """
- Tuple of unique file extensions across all the files in the NZB.
- May return an empty tuple if it fails to extract the extension for every file.
- """
- return tuple(natsorted({file.suffix for file in self.files}))
-
- @cached_property
- def posters(self) -> tuple[str, ...]:
- """
- Tuple of unique posters across all the files in the NZB.
- """
- return tuple(natsorted({file.poster for file in self.files}))
-
- @cached_property
- def groups(self) -> tuple[str, ...]:
- """
- Tuple of unique groups across all the files in the NZB.
- """
- groupset: set[str] = set()
-
- for file in self.files:
- groupset.update(file.groups)
-
- return tuple(natsorted(groupset))
-
- @cached_property
- def par2_size(self) -> ByteSize:
- """
- Total size of all the `.par2` files.
- """
- return ByteSize(sum(file.size for file in self.files if file.is_par2()))
-
- @cached_property
- def par2_percentage(self) -> float:
- """
- Percentage of the size of all the `.par2` files relative to the total size.
- """
- return (self.par2_size / self.size) * 100
-
- def has_rar(self) -> bool:
- """
- Return `True` if any file in the NZB is a `.rar` file, `False` otherwise.
- """
- return any(file.is_rar() for file in self.files)
-
- def is_rar(self) -> bool:
- """
- Return `True` if all files in the NZB are `.rar` files, `False` otherwise.
- """
- return all(file.is_rar() for file in self.files)
-
- def is_obfuscated(self) -> bool:
- """
- Return `True` if any file in the NZB is obfuscated, `False` otherwise.
- """
- return any(file.is_obfuscated() for file in self.files)
-
- def has_par2(self) -> bool:
- """
- Return `True` if there's at least one `.par2` file in the NZB, `False` otherwise.
- """
- return any(file.is_par2() for file in self.files)
diff --git a/src/nzb/_parser.py b/src/nzb/_parser.py
index d51598c..1de6161 100644
--- a/src/nzb/_parser.py
+++ b/src/nzb/_parser.py
@@ -1,22 +1,22 @@
"""
https://sabnzbd.org/wiki/extra/nzb-spec
https://web.archive.org/web/20240709113825/https://sabnzbd.org/wiki/extra/nzb-spec
-"""
+""" # noqa: D400, D415
from __future__ import annotations
import re
-from typing import Any, TypeAlias, Union, cast
+from typing import Any, TypeAlias, cast
from natsort import natsorted
-from nzb._exceptions import InvalidNZBError
+from nzb._exceptions import InvalidNzbError
from nzb._models import File, Meta, Segment
def parse_metadata(nzb: dict[str, Any]) -> Meta:
"""
- Parses the `...` field present in an NZB.
+ Parse the `...` field present in an NZB.
```xml
@@ -39,7 +39,7 @@ def parse_metadata(nzb: dict[str, Any]) -> Meta:
# - None if there's no meta field
# Here's the type representation of the three possible cases that we need to handle
- MetaFieldType: TypeAlias = Union[list[dict[str, str]], dict[str, str], None]
+ MetaFieldType: TypeAlias = list[dict[str, str]] | dict[str, str] | None
# Explicit cast to tell typecheckers the return type based on the above 3 points.
meta = cast(MetaFieldType, meta)
@@ -52,8 +52,8 @@ def parse_metadata(nzb: dict[str, Any]) -> Meta:
if isinstance(meta, dict):
meta = [meta]
- passwordset = set()
- tagset = set()
+ passwords: list[str] = []
+ tags: list[str] = []
title = None
category = None
@@ -67,7 +67,7 @@ def parse_metadata(nzb: dict[str, Any]) -> Meta:
# secret2
# secret3
if password := item.get("#text"):
- passwordset.add(password)
+ passwords.append(password)
if item.get("@type", "").casefold() == "tag":
# spec allows for multiple tags by repeating the same field
@@ -75,22 +75,22 @@ def parse_metadata(nzb: dict[str, Any]) -> Meta:
# Anime
# 1080p
if tag := item.get("#text"):
- tagset.add(tag.strip())
+ tags.append(tag.strip())
if item.get("@type", "").casefold() == "category":
category = item.get("#text")
return Meta(
title=title,
- passwords=passwordset if passwordset else None, # type: ignore
- tags=tagset if tagset else None, # type: ignore
+ passwords=passwords, # type: ignore[arg-type]
+ tags=tags, # type: ignore[arg-type]
category=category,
)
def parse_segments(segmentdict: dict[str, list[dict[str, str]] | dict[str, str] | None] | None) -> tuple[Segment, ...]:
"""
- Parses the `...` field present in an NZB.
+ Parse the `...` field present in an NZB.
There's 3 possible things that we can get here:
- A list of dictionaries if there's more than 1 segment field present
@@ -115,12 +115,12 @@ def parse_segments(segmentdict: dict[str, list[dict[str, str]] | dict[str, str]
segments = segmentdict.get("segment") if segmentdict else None
if segments is None:
- raise InvalidNZBError("Missing or malformed ...!")
+ raise InvalidNzbError("Missing or malformed ...!")
if isinstance(segments, dict):
segments = [segments]
- segmentset: set[Segment] = set()
+ segmentlist: list[Segment] = []
for segment in segments:
try:
@@ -133,14 +133,14 @@ def parse_segments(segmentdict: dict[str, list[dict[str, str]] | dict[str, str]
# segments don't invalidate the nzb.
continue
- segmentset.add(Segment(size=size, number=number, message_id=message_id)) # type: ignore
+ segmentlist.append(Segment(size=size, number=number, message_id=message_id)) # type: ignore[arg-type]
- return tuple(natsorted(segmentset, key=lambda seg: seg.number))
+ return tuple(natsorted(segmentlist, key=lambda seg: seg.number))
def parse_files(nzb: dict[str, Any]) -> tuple[File, ...]:
"""
- Parses the `...` field present in an NZB.
+ Parse the `...` field present in an NZB.
```xml
@@ -161,21 +161,21 @@ def parse_files(nzb: dict[str, Any]) -> tuple[File, ...]:
# - None if there's no file field
# Here's the type representation of the three possible cases that we need to handle
- FileFieldType: TypeAlias = Union[list[dict[str, str]], dict[str, str], None]
+ FileFieldType: TypeAlias = list[dict[str, str]] | dict[str, str] | None
# Explicit cast to tell typecheckers the return type based on the above 3 points.
files = cast(FileFieldType, files)
if files is None:
- raise InvalidNZBError("Missing or malformed ...!")
+ raise InvalidNzbError("Missing or malformed ...!")
if isinstance(files, dict):
files = [files]
- fileset: set[File] = set()
+ filelist: list[File] = []
for file in files:
- groupset: set[str] = set()
+ grouplist: list[str] = []
groups = file.get("groups").get("group") if file.get("groups") else None
# There's 3 possible things that we can get from the above here:
@@ -184,35 +184,40 @@ def parse_files(nzb: dict[str, Any]) -> tuple[File, ...]:
# - None if there's no group field
# Here's the type representation of the three possible cases that we need to handle
- GroupFieldType: TypeAlias = Union[list[str], str, None]
+ GroupFieldType: TypeAlias = list[str] | str | None
# Explicit cast to tell typecheckers the return type based on the above 3 points.
groups = cast(GroupFieldType, groups)
if groups is None:
- raise InvalidNZBError("Missing or malformed ...!")
+ raise InvalidNzbError("Missing or malformed ...!")
if isinstance(groups, str):
- groupset.add(groups)
+ grouplist.append(groups)
else:
- groupset.update(groups)
+ grouplist.extend(groups)
- fileset.add(
+ filelist.append(
File(
poster=file.get("@poster"),
- datetime=file.get("@date"),
+ posted_at=file.get("@date"),
subject=file.get("@subject"),
- groups=natsorted(groupset), # type: ignore
+ groups=natsorted(grouplist), # type: ignore[arg-type]
segments=parse_segments(file.get("segments")),
)
)
- return tuple(natsorted(fileset, key=lambda file: file.subject))
+ if not filelist: # pragma: no cover
+ # I cannot think of any case where this will ever be raised
+ # but just in case
+ raise InvalidNzbError("Missing or malformed ...!")
+
+ return tuple(natsorted(filelist, key=lambda file: file.subject))
def parse_doctype(nzb: str) -> str | None:
"""
- Parses the DOCTYPE from an NZB file.
+ Parse the DOCTYPE from an NZB file.
Quoting https://www.oreilly.com/library/view/xml-pocket-reference/9780596100506/ch01s02s09.html:
"A document type or DOCTYPE declaration provides information to a validating XML parser about how to validate an XML document.
@@ -227,6 +232,7 @@ def parse_doctype(nzb: str) -> str | None:
...
```
+
"""
doctype = re.search(r"", nzb, re.IGNORECASE)
return doctype.group() if doctype else None
diff --git a/src/nzb/_types.py b/src/nzb/_types.py
index a30e6fa..3e7851b 100644
--- a/src/nzb/_types.py
+++ b/src/nzb/_types.py
@@ -2,11 +2,11 @@
from datetime import datetime, timezone
from os import PathLike
-from typing import Annotated, TypeAlias, Union
+from typing import Annotated, TypeAlias
from pydantic import AfterValidator
-StrPath: TypeAlias = Union[str, PathLike[str]]
+StrPath: TypeAlias = str | PathLike[str]
"""String or pathlib.Path"""
UTCDateTime = Annotated[datetime, AfterValidator(lambda dt: dt.astimezone(timezone.utc))]
diff --git a/src/nzb/_utils.py b/src/nzb/_utils.py
index 629677d..37054a0 100644
--- a/src/nzb/_utils.py
+++ b/src/nzb/_utils.py
@@ -6,15 +6,15 @@
from typing import TYPE_CHECKING
if TYPE_CHECKING:
- from collections.abc import Iterable
- from typing import Callable, ParamSpec, TypeVar
+ from collections.abc import Callable, Iterable
+ from typing import ParamSpec, TypeVar
from nzb._types import StrPath
T = TypeVar("T")
P = ParamSpec("P")
- def cache(user_function: Callable[P, T], /) -> Callable[P, T]: # type: ignore
+ def cache(user_function: Callable[P, T], /) -> Callable[P, T]: # type: ignore[misc]
return user_function
@@ -25,14 +25,14 @@ def realpath(path: StrPath, /) -> Path:
return Path(path).expanduser().resolve()
-def meta_constructor(
+def construct_meta(
title: str | None = None,
passwords: Iterable[str] | str | None = None,
tags: Iterable[str] | str | None = None,
category: str | None = None,
) -> list[dict[str, str]]:
"""
- Constructor that constructs valid ` .. ` fields
+ Construct ` .. ` fields.
"""
meta = []
@@ -45,14 +45,14 @@ def meta_constructor(
meta.append({"@type": "password", "#text": passwords})
else:
for password in passwords:
- meta.append({"@type": "password", "#text": password})
+ meta.append({"@type": "password", "#text": password}) # noqa: PERF401
if tags:
if isinstance(tags, str):
meta.append({"@type": "tag", "#text": tags})
else:
for tag in tags:
- meta.append({"@type": "tag", "#text": tag})
+ meta.append({"@type": "tag", "#text": tag}) # noqa: PERF401
if category:
meta.append({"@type": "category", "#text": category})
@@ -60,6 +60,70 @@ def meta_constructor(
return meta
+def sort_meta(meta: list[dict[str, str]]) -> list[dict[str, str]]:
+ """
+ Sort meta list elements based on predefined hierarchy.
+
+ This function provides a sorting key for meta elements, prioritizing them in the following order:
+ title (0) > category (1) > password (2) > tag (3) > everything else (-1)
+
+ Parameters
+ ----------
+ meta : list[dict[str, str]]
+ List of metadata dictionaries, where each dictionary contains '@type' and '#text' keys
+
+ Returns
+ -------
+ list[dict[str, str]]
+ Sorted list of meta dicts
+
+ Examples
+ --------
+ >>> meta = [
+ ... {"@type": "title", "#text": "Big Buck Bunny - S01E01.mkv"},
+ ... {"@type": "password", "#text": "secret"},
+ ... {"@type": "tag", "#text": "HD"},
+ ... {"@type": "category", "#text": "TV"},
+ ... ]
+ >>> sort_meta(meta)
+
+ """
+
+ def key(k: dict[str, str]) -> int:
+ sort_keys = {"title": 0, "category": 1, "password": 2, "tag": 3}
+ typ = k["@type"].strip().casefold()
+ return sort_keys.get(typ, -1)
+
+ return sorted(meta, key=key)
+
+
+def remove_meta_fields(
+ meta: list[dict[str, str]],
+ fields: Iterable[str] | None = None,
+) -> list[dict[str, str]]:
+ """
+ Remove specified fields from meta list.
+
+ Parameters
+ ----------
+ meta : list[dict[str, str]]
+ List of metadata dictionaries
+ fields : Iterable[str]] | None
+ Fields to remove from meta list. If None, return original meta list.
+
+ Returns
+ -------
+ list[dict[str, str]]
+ Meta list with specified fields removed
+
+ """
+ if fields is None:
+ return meta
+
+ fields_set = {field.strip().casefold() for field in fields}
+ return [item for item in meta if item["@type"].strip().casefold() not in fields_set]
+
+
@cache
def name_is_par2(filename: str) -> bool:
"""
@@ -68,10 +132,12 @@ def name_is_par2(filename: str) -> bool:
Parameters
----------
filename : str
+ Name of the file with it's extension, i.e., the final component in a path.
Returns
-------
bool
+
"""
if not filename:
return False
@@ -88,6 +154,7 @@ def name_is_rar(filename: str) -> bool:
Parameters
----------
filename : str
+ Name of the file with it's extension, i.e., the final component in a path.
Returns
-------
@@ -97,6 +164,7 @@ def name_is_rar(filename: str) -> bool:
-----
The regex used here was copy-pasted from SABnzbd:
https://github.com/sabnzbd/sabnzbd/blob/02b4a116dd4b46b2d2f33f7bbf249f2294458f2e/sabnzbd/nzbstuff.py#L107
+
"""
if not filename:
return False
@@ -124,6 +192,7 @@ def stem_is_obfuscated(filestem: str) -> bool: # pragma: no cover
-----
This function was copy-pasted from SABnzbd:
https://github.com/sabnzbd/sabnzbd/blob/297455cd35c71962d39a36b7f99622f905d2234e/sabnzbd/deobfuscate_filenames.py#L104
+
"""
if not filestem:
return True
diff --git a/src/nzb/_version.py b/src/nzb/_version.py
deleted file mode 100644
index 8cb5e3d..0000000
--- a/src/nzb/_version.py
+++ /dev/null
@@ -1,14 +0,0 @@
-from __future__ import annotations
-
-from importlib import metadata
-from typing import NamedTuple
-
-
-class Version(NamedTuple):
- major: int
- minor: int
- micro: int
-
-
-__version__ = metadata.version("nzb")
-__version_tuple__ = Version(*[int(i) for i in __version__.split(".")])
diff --git a/tests/__nzbs__/no_doctype.nzb b/tests/__nzbs__/no_doctype.nzb
deleted file mode 100644
index 6a30ac4..0000000
--- a/tests/__nzbs__/no_doctype.nzb
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
- alt.binaries.newzbin
- alt.binaries.mojo
-
-
- 123456789abcdef@news.newzbin.com
- 987654321fedbca@news.newzbin.com
-
-
-
diff --git a/tests/__nzbs__/spec_example_meta_append.nzb b/tests/__nzbs__/spec_example_meta_append.nzb
deleted file mode 100644
index 471fce7..0000000
--- a/tests/__nzbs__/spec_example_meta_append.nzb
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
- Your File!
- HD
- TV
- new secret!
-
-
-
- alt.binaries.newzbin
- alt.binaries.mojo
-
-
- 123456789abcdef@news.newzbin.com
- 987654321fedbca@news.newzbin.com
-
-
-
\ No newline at end of file
diff --git a/tests/__nzbs__/spec_example_meta_clear.nzb b/tests/__nzbs__/spec_example_meta_clear.nzb
deleted file mode 100644
index 87f068c..0000000
--- a/tests/__nzbs__/spec_example_meta_clear.nzb
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
- alt.binaries.newzbin
- alt.binaries.mojo
-
-
- 123456789abcdef@news.newzbin.com
- 987654321fedbca@news.newzbin.com
-
-
-
diff --git a/tests/__nzbs__/spec_example_meta_set.nzb b/tests/__nzbs__/spec_example_meta_set.nzb
deleted file mode 100644
index 410d3d2..0000000
--- a/tests/__nzbs__/spec_example_meta_set.nzb
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
- New title
- test
- test2
-
-
-
- alt.binaries.newzbin
- alt.binaries.mojo
-
-
- 123456789abcdef@news.newzbin.com
- 987654321fedbca@news.newzbin.com
-
-
-
\ No newline at end of file
diff --git a/tests/test_exceptions.py b/tests/test_exceptions.py
index 3f42355..6d1a200 100644
--- a/tests/test_exceptions.py
+++ b/tests/test_exceptions.py
@@ -4,9 +4,9 @@
import pytest
-from nzb import InvalidNZBError, NZBMetaEditor, NZBParser
+from nzb import InvalidNzbError, Nzb, NzbMetaEditor
-nzbs = Path("tests/__nzbs__/")
+NZB_DIR = Path(__file__).parent.resolve() / "__nzbs__"
invalid_xml = """\
@@ -49,45 +49,57 @@
def test_invalid_nzb_error() -> None:
try:
message = "Missing something in the NZB"
- raise InvalidNZBError(message)
- except InvalidNZBError as error:
+ raise InvalidNzbError(message)
+ except InvalidNzbError as error:
assert error.message == message
assert str(error) == message
- assert repr(error) == 'InvalidNZBError("Missing something in the NZB")'
+ assert repr(error) == 'InvalidNzbError("Missing something in the NZB")'
-def test_saving_without_filename() -> None:
- with pytest.raises(FileNotFoundError):
- NZBMetaEditor((nzbs / "spec_example.nzb").read_text()).save()
+def test_meta_editor_bad_encoding() -> None:
+ with pytest.raises(ValueError, match="encoding must be a valid string!"):
+ NzbMetaEditor.from_file(NZB_DIR / "spec_example.nzb", encoding=None) # type: ignore[arg-type]
-def test_saving_overwrite() -> None:
- with pytest.raises(FileExistsError):
- NZBMetaEditor.from_file(nzbs / "spec_example.nzb").save()
-
-
-def test_parsing_invalid_nzb() -> None:
- with pytest.raises(InvalidNZBError):
- NZBParser(invalid_xml).parse()
-
- with pytest.raises(InvalidNZBError):
- NZBParser(valid_xml_but_invalid_nzb).parse()
+def test_parser_bad_encoding() -> None:
+ with pytest.raises(ValueError, match="encoding must be a valid string!"):
+ Nzb.from_file(NZB_DIR / "spec_example.nzb", encoding=None) # type: ignore[arg-type]
-def test_editing_invalid_nzb() -> None:
- with pytest.raises(InvalidNZBError):
- NZBMetaEditor(invalid_xml)
-
+def test_saving_overwrite(tmp_path: Path) -> None:
+ with pytest.raises(FileExistsError):
+ file = NZB_DIR / "spec_example.nzb"
+ NzbMetaEditor.from_file(file).to_file(file)
-def test_parser_exceptions() -> None:
- with pytest.raises(InvalidNZBError):
- NZBParser.from_file(nzbs / "malformed_files.nzb").parse()
- with pytest.raises(InvalidNZBError):
- NZBParser.from_file(nzbs / "malformed_files2.nzb").parse()
+@pytest.mark.parametrize(
+ "input_xml, expected_error",
+ [
+ pytest.param(invalid_xml, "no element found: line 19, column 11", id="truncated_xml"),
+ pytest.param(
+ valid_xml_but_invalid_nzb, "Missing or malformed ...!", id="missing_segments"
+ ),
+ ],
+)
+def test_parsing_invalid_nzb(input_xml: str, expected_error: str) -> None:
+ with pytest.raises(InvalidNzbError, match=expected_error):
+ Nzb.from_str(input_xml)
- with pytest.raises(InvalidNZBError):
- NZBParser.from_file(nzbs / "malformed_groups.nzb").parse()
- with pytest.raises(InvalidNZBError):
- NZBParser.from_file(nzbs / "malformed_segments.nzb").parse()
+def test_editing_invalid_nzb() -> None:
+ with pytest.raises(InvalidNzbError, match="no element found: line 19, column 11"):
+ NzbMetaEditor(invalid_xml)
+
+
+@pytest.mark.parametrize(
+ "file_name, expected_error",
+ (
+ ("malformed_files.nzb", "Missing or malformed ...!"),
+ ("malformed_files2.nzb", "Missing or malformed ...!"),
+ ("malformed_groups.nzb", "Missing or malformed ...!"),
+ ("malformed_segments.nzb", "Missing or malformed ...!"),
+ ),
+)
+def test_parser_exceptions(file_name: str, expected_error: str) -> None:
+ with pytest.raises(InvalidNzbError, match=expected_error):
+ Nzb.from_file(NZB_DIR / file_name)
diff --git a/tests/test_metaeditor.py b/tests/test_metaeditor.py
index fdd133e..4e9668b 100644
--- a/tests/test_metaeditor.py
+++ b/tests/test_metaeditor.py
@@ -1,107 +1,398 @@
from __future__ import annotations
-import shutil
+import textwrap
from pathlib import Path
-from nzb import NZBMetaEditor, NZBParser
+from nzb import Nzb, NzbMetaEditor
-nzbs = Path("tests/__nzbs__").resolve()
+NZB_DIR = Path(__file__).parent.resolve() / "__nzbs__"
encoding = "utf-8"
-def test_meta_clear(tmp_path: Path) -> None:
- edited = nzbs / "spec_example_meta_clear.nzb"
- out = NZBMetaEditor.from_file(nzbs / "spec_example.nzb").clear().save(tmp_path / "spec_example_meta_clear.nzb")
- assert out.read_text(encoding).strip() == edited.read_text(encoding).strip()
+def dedent(s: str) -> str:
+ return textwrap.dedent(s).strip()
-def test_nzb_with_no_head_clear(tmp_path: Path) -> None:
- nzb = nzbs / "nzb_with_no_head.nzb"
- out = NZBMetaEditor.from_file(nzb).clear().save(tmp_path / "nzb_with_no_head.nzb")
- assert out.is_file()
+def test_meta_clear() -> None:
+ nzb = NZB_DIR / "spec_example.nzb"
+ edited = NzbMetaEditor.from_file(nzb).clear().to_str()
+ assert edited == dedent("""
+
+
+
+
+
+ alt.binaries.newzbin
+ alt.binaries.mojo
+
+
+ 123456789abcdef@news.newzbin.com
+ 987654321fedbca@news.newzbin.com
+
+
+
+ """)
-def test_meta_remove_append(tmp_path: Path) -> None:
- edited = nzbs / "spec_example_meta_append.nzb"
- out = (
- NZBMetaEditor.from_file(nzbs / "spec_example.nzb")
- .remove("password")
- .append(passwords="new secret!")
- .save(tmp_path / "spec_example.nzb")
- )
- assert out.read_text(encoding).strip() == edited.read_text(encoding).strip()
+def test_nzb_with_no_head_clear() -> None:
+ nzb = NZB_DIR / "nzb_with_no_head.nzb"
+ edited = NzbMetaEditor.from_file(nzb).clear().to_str()
+ assert edited == dedent("""
+
+
+
+
+
+ alt.binaries.newzbin
+ alt.binaries.mojo
+
+
+ 123456789abcdef@news.newzbin.com
+ 987654321fedbca@news.newzbin.com
+
+
+
+ """)
-def test_meta_append_when_file_has_no_meta(tmp_path: Path) -> None:
- append = NZBMetaEditor.from_file(nzbs / "no_meta.nzb").append(title="appending").save(tmp_path / "no_meta.nzb")
- set = NZBMetaEditor.from_file(nzbs / "no_meta.nzb").set(title="appending").save(tmp_path / "no_meta.nzb")
- assert append.read_text(encoding).strip() == set.read_text(encoding).strip()
+def test_meta_remove_append() -> None:
+ nzb = NZB_DIR / "spec_example.nzb"
+ edited = NzbMetaEditor.from_file(nzb).remove("password").append(passwords="new secret!").to_str()
+ assert edited == dedent("""
+
+
+
+
+ Your File!
+ TV
+ new secret!
+ HD
+
+
+
+ alt.binaries.newzbin
+ alt.binaries.mojo
+
+
+ 123456789abcdef@news.newzbin.com
+ 987654321fedbca@news.newzbin.com
+
+
+
+ """)
-def test_meta_append_when_file_has_single_meta(tmp_path: Path) -> None:
- append = (
- NZBMetaEditor.from_file(nzbs / "single_meta.nzb").append(title="appending").save(tmp_path / "single_meta.nzb")
- )
- parsed = NZBParser.from_file(append).parse()
- assert parsed.meta.title == "appending"
+def test_meta_append_when_file_has_no_meta() -> None:
+ nzb = NZB_DIR / "no_meta.nzb"
+ edited = NzbMetaEditor.from_file(nzb).append(passwords="password appended").to_str()
+ assert edited == dedent("""
+
+
+
+
+ password appended
+
+
+
+ alt.binaries.newzbin
+ alt.binaries.mojo
+
+
+ 123456789abcdef@news.newzbin.com
+ 987654321fedbca@news.newzbin.com
+
+
+
+ """)
+
+
+def test_meta_append_when_file_has_single_meta() -> None:
+ nzb = NZB_DIR / "single_meta.nzb"
+ edited = NzbMetaEditor.from_file(nzb).append(tags="tag appended").to_str()
+ assert edited == dedent("""
+
+
+
+
+ title
+ tag appended
+
+
+
+ alt.binaries.newzbin
+ alt.binaries.mojo
+
+
+ 123456789abcdef@news.newzbin.com
+ 987654321fedbca@news.newzbin.com
+
+
+
+ """)
+
+
+def test_meta_set_when_file_has_no_meta() -> None:
+ nzb = NZB_DIR / "no_meta.nzb"
+ edited = NzbMetaEditor.from_file(nzb).set(title="Big Buck Bunny").to_str()
+ assert edited == dedent("""
+
+
+
+
+ Big Buck Bunny
+
+
+
+ alt.binaries.newzbin
+ alt.binaries.mojo
+
+
+ 123456789abcdef@news.newzbin.com
+ 987654321fedbca@news.newzbin.com
+
+
+
+ """)
+
+
+def test_meta_set_when_file_has_single_meta() -> None:
+ nzb = NZB_DIR / "single_meta.nzb"
+ edited = NzbMetaEditor.from_file(nzb).set(title="Big Buck Bunny").to_str()
+ assert edited == dedent("""
+
+
+
+
+ Big Buck Bunny
+
+
+
+ alt.binaries.newzbin
+ alt.binaries.mojo
+
+
+ 123456789abcdef@news.newzbin.com
+ 987654321fedbca@news.newzbin.com
+
+
+
+ """)
def test_meta_remove_empty(tmp_path: Path) -> None:
- rm = (
- NZBMetaEditor.from_file(nzbs / "spec_example_meta_clear.nzb")
- .remove("category")
- .save(tmp_path / "spec_example_meta_clear.nzb")
- )
- parsed = NZBParser.from_file(rm).parse()
+ nzb = dedent("""
+
+
+
+
+
+ alt.binaries.newzbin
+ alt.binaries.mojo
+
+
+ 123456789abcdef@news.newzbin.com
+ 987654321fedbca@news.newzbin.com
+
+
+
+ """)
+ rm = NzbMetaEditor(nzb).remove("category").to_file(tmp_path / "test_meta_remove_empty.nzb")
+ parsed = Nzb.from_file(rm)
assert parsed.meta.title is None
- assert parsed.meta.passwords is None
- assert parsed.meta.tags is None
+ assert parsed.meta.passwords == ()
+ assert parsed.meta.tags == ()
assert parsed.meta.category is None
def test_meta_remove_one(tmp_path: Path) -> None:
- rm = NZBMetaEditor.from_file(nzbs / "single_meta.nzb").remove("title").save(tmp_path / "single_meta.nzb")
- parsed = NZBParser.from_file(rm).parse()
+ nzb = NZB_DIR / "single_meta.nzb"
+ rm = NzbMetaEditor.from_file(nzb).remove("title").to_file(tmp_path / "single_meta.nzb")
+ parsed = Nzb.from_file(rm)
assert parsed.meta.title is None
- assert parsed.meta.passwords is None
- assert parsed.meta.tags is None
+ assert parsed.meta.passwords == ()
+ assert parsed.meta.tags == ()
assert parsed.meta.category is None
def test_meta_remove_missing_key(tmp_path: Path) -> None:
- rm = NZBMetaEditor.from_file(nzbs / "single_meta.nzb").remove("akldakldjakldjs").save(tmp_path / "single_meta.nzb")
- parsed = NZBParser.from_file(rm).parse()
+ nzb = NZB_DIR / "single_meta.nzb"
+ rm = NzbMetaEditor.from_file(nzb).remove("akldakldjakldjs").to_file(tmp_path / "single_meta.nzb")
+ parsed = Nzb.from_file(rm)
assert parsed.meta.title is not None
- assert parsed.meta.passwords is None
- assert parsed.meta.tags is None
+ assert parsed.meta.passwords == ()
+ assert parsed.meta.tags == ()
assert parsed.meta.category is None
def test_meta_set(tmp_path: Path) -> None:
- edited = nzbs / "spec_example_meta_set.nzb"
- out = (
- NZBMetaEditor.from_file(nzbs / "spec_example.nzb")
- .set(title="New title", tags=["test", "test2"])
- .save(tmp_path / "spec_example.nzb")
- )
- assert out.read_text(encoding).strip() == edited.read_text(encoding).strip()
+ nzb = dedent("""
+
+
+
+
+ Your File!
+ secret
+ HD
+ TV
+
+
+
+ alt.binaries.newzbin
+ alt.binaries.mojo
+
+
+ 123456789abcdef@news.newzbin.com
+ 987654321fedbca@news.newzbin.com
+
+
+
+ """)
+ edited = NzbMetaEditor(nzb).set(title="New title", tags=["test", "test2"]).to_str()
+ assert edited == dedent("""
+
+
+
+
+ New title
+ TV
+ secret
+ test
+ test2
+
+
+
+ alt.binaries.newzbin
+ alt.binaries.mojo
+
+
+ 123456789abcdef@news.newzbin.com
+ 987654321fedbca@news.newzbin.com
+
+
+
+ """)
-def test_meta_set_empty(tmp_path: Path) -> None:
- edited = nzbs / "spec_example_meta_set.nzb"
- out = NZBMetaEditor.from_file(nzbs / "spec_example_meta_set.nzb").set().save(tmp_path / "spec_example_meta_set.nzb")
- assert out.read_text(encoding).strip() == edited.read_text(encoding).strip()
+
+def test_meta_set_empty() -> None:
+ nzb = dedent("""
+
+
+
+
+ Your File!
+ secret
+ HD
+ TV
+
+
+
+ alt.binaries.newzbin
+ alt.binaries.mojo
+
+
+ 123456789abcdef@news.newzbin.com
+ 987654321fedbca@news.newzbin.com
+
+
+
+ """)
+ out = NzbMetaEditor(nzb).set().to_str() # no-op
+ assert out == nzb
def test_meta_save_overwrite(tmp_path: Path) -> None:
- original = nzbs / "no_meta.nzb"
- tmp_nzb: Path = shutil.copy(original, tmp_path / "no_meta.nzb")
- NZBMetaEditor.from_file(tmp_nzb).save(overwrite=True)
- assert original.read_text(encoding).strip() == tmp_nzb.read_text(encoding).strip()
+ nzb = dedent("""
+
+
+
+
+
+ alt.binaries.newzbin
+ alt.binaries.mojo
+
+
+ 123456789abcdef@news.newzbin.com
+ 987654321fedbca@news.newzbin.com
+
+
+
+ """)
+
+ nzb_file = tmp_path / "test_meta_save_overwrite.nzb"
+ nzb_file.write_text(nzb, encoding="utf-8")
+
+ edited = NzbMetaEditor(nzb).to_file(nzb_file, overwrite=True)
+ assert nzb == edited.read_text("utf-8")
+
+
+def test_no_doctype() -> None:
+ # Since xmltodict does not preserve doctype,
+ # we do our own hack on top to preserve it *if* it's
+ # there, so we have this test to make sure we handle
+ # the case where there is no doctype.
+ original = dedent("""
+
+
+
+
+ alt.binaries.newzbin
+ alt.binaries.mojo
+
+
+ 123456789abcdef@news.newzbin.com
+ 987654321fedbca@news.newzbin.com
+
+
+
+ """)
+ edited = NzbMetaEditor(original).to_str()
+ assert original == edited
-def test_no_doctype(tmp_path: Path) -> None:
- original = nzbs / "no_doctype.nzb"
- tmp_nzb: Path = shutil.copy(original, tmp_path / "no_doctype.nzb")
- NZBMetaEditor.from_file(tmp_nzb).save(overwrite=True)
- assert original.read_text(encoding).strip() == tmp_nzb.read_text(encoding).strip()
+def test_meta_editor_append_title() -> None:
+ s = dedent("""
+
+
+
+
+ Big Buck Bunny - S01E01.mkv
+ secret
+ HD
+ TV
+
+
+
+ alt.binaries.boneless
+
+
+ 9cacde4c986547369becbf97003fb2c5-9483514693959@example
+ 70a3a038ce324e618e2751e063d6a036-7285710986748@example
+
+
+
+ """)
+ editor = NzbMetaEditor(s).set(title="Big Buck Bunny", category="Movie").append(tags="1080p", passwords="secret2")
+ assert editor.to_str() == dedent("""
+
+
+
+
+ Big Buck Bunny
+ Movie
+ secret
+ secret2
+ HD
+ 1080p
+
+
+
+ alt.binaries.boneless
+
+
+ 9cacde4c986547369becbf97003fb2c5-9483514693959@example
+ 70a3a038ce324e618e2751e063d6a036-7285710986748@example
+
+
+
+ """)
diff --git a/tests/test_nzbparser.py b/tests/test_nzbparser.py
index fb0a0bb..c71cd79 100644
--- a/tests/test_nzbparser.py
+++ b/tests/test_nzbparser.py
@@ -4,26 +4,25 @@
from pathlib import Path
import pytest
+from rnzb import Nzb as RustNzb
-from nzb import File, NZBParser, Segment
+from nzb import File, Nzb, Segment
-nzbs = Path("tests/__nzbs__").resolve()
+NZB_DIR = Path(__file__).parent.resolve() / "__nzbs__"
def test_spec_example_nzb() -> None:
- nzb = NZBParser.from_file(nzbs / "spec_example.nzb").parse()
+ nzb = Nzb.from_file(NZB_DIR / "spec_example.nzb")
assert nzb.meta.title == "Your File!"
assert nzb.meta.passwords == ("secret",)
assert nzb.meta.tags == ("HD",)
- assert nzb.meta.password == "secret"
- assert nzb.meta.tag == "HD"
assert nzb.meta.category == "TV"
assert len(nzb.files) == 1
assert nzb.is_rar() is True
assert nzb.is_obfuscated() is True
assert nzb.file.name == "abc-mr2a.r01"
assert nzb.file.stem == "abc-mr2a"
- assert nzb.file.suffix == ".r01"
+ assert nzb.file.extension == "r01"
assert nzb.size == 106895
assert len(nzb.files[0].segments) == 2
assert set(nzb.files[0].segments) == set(
@@ -36,13 +35,11 @@ def test_spec_example_nzb() -> None:
def test_big_buck_bunny() -> None:
- nzb = NZBParser.from_file(nzbs / "big_buck_bunny.nzb").parse()
+ nzb = Nzb.from_file(NZB_DIR / "big_buck_bunny.nzb")
assert nzb.meta.title is None
- assert nzb.meta.passwords is None
- assert nzb.meta.tags is None
- assert nzb.meta.password is None
- assert nzb.meta.tag is None
+ assert nzb.meta.passwords == ()
+ assert nzb.meta.tags == ()
assert nzb.meta.category is None
assert len(nzb.files) == 5
assert nzb.is_rar() is False
@@ -50,30 +47,29 @@ def test_big_buck_bunny() -> None:
assert nzb.has_par2() is True
assert nzb.file.name == "Big Buck Bunny - S01E01.mkv"
assert nzb.file.stem == "Big Buck Bunny - S01E01"
- assert nzb.file.suffix == ".mkv"
+ assert nzb.file.extension == "mkv"
assert nzb.size == 22704889
- assert set(nzb.names) == {
- "Big Buck Bunny - S01E01.mkv.vol03+04.par2",
- "Big Buck Bunny - S01E01.mkv.vol01+02.par2",
- "Big Buck Bunny - S01E01.mkv.par2",
+ assert [file.subject for file in nzb.files] == [
+ '[1/5] - "Big Buck Bunny - S01E01.mkv" yEnc (1/24) 16981056',
+ '[2/5] - "Big Buck Bunny - S01E01.mkv.par2" yEnc (1/1) 920',
+ '[3/5] - "Big Buck Bunny - S01E01.mkv.vol00+01.par2" yEnc (1/2) 717788',
+ '[4/5] - "Big Buck Bunny - S01E01.mkv.vol01+02.par2" yEnc (1/3) 1434656',
+ '[5/5] - "Big Buck Bunny - S01E01.mkv.vol03+04.par2" yEnc (1/5) 2869192',
+ ]
+ assert nzb.filenames == (
"Big Buck Bunny - S01E01.mkv",
+ "Big Buck Bunny - S01E01.mkv.par2",
"Big Buck Bunny - S01E01.mkv.vol00+01.par2",
- }
- assert set(nzb.stems) == {
- "Big Buck Bunny - S01E01",
- "Big Buck Bunny - S01E01.mkv",
- "Big Buck Bunny - S01E01.mkv.vol01+02",
- "Big Buck Bunny - S01E01.mkv.vol03+04",
- "Big Buck Bunny - S01E01.mkv.vol00+01",
- }
- assert set(nzb.suffixes) == {".mkv", ".par2"}
- assert set(nzb.posters) == {"John "}
- assert set(nzb.groups) == {"alt.binaries.boneless"}
+ "Big Buck Bunny - S01E01.mkv.vol01+02.par2",
+ "Big Buck Bunny - S01E01.mkv.vol03+04.par2",
+ )
+ assert nzb.posters == ("John ",)
+ assert nzb.groups == ("alt.binaries.boneless",)
assert nzb.par2_size == 5183128
assert nzb.par2_percentage == pytest.approx(22, 1.0)
assert nzb.file == File(
poster="John ",
- datetime=datetime.datetime(2024, 1, 28, 11, 18, 28, tzinfo=datetime.timezone.utc),
+ posted_at=datetime.datetime(2024, 1, 28, 11, 18, 28, tzinfo=datetime.timezone.utc),
subject='[1/5] - "Big Buck Bunny - S01E01.mkv" yEnc (1/24) 16981056',
groups=("alt.binaries.boneless",),
segments=(
@@ -106,11 +102,26 @@ def test_big_buck_bunny() -> None:
def test_valid_nzb_with_one_missing_segment() -> None:
- nzb = NZBParser.from_file(nzbs / "valid_nzb_with_one_missing_segment.nzb").parse()
+ nzb = Nzb.from_file(NZB_DIR / "valid_nzb_with_one_missing_segment.nzb")
+
+ assert [file.subject for file in nzb.files] == [
+ '[1/5] - "Big Buck Bunny - S01E01.mkv" yEnc (1/24) 16981056',
+ '[2/5] - "Big Buck Bunny - S01E01.mkv.par2" yEnc (1/1) 920',
+ '[3/5] - "Big Buck Bunny - S01E01.mkv.vol00+01.par2" yEnc (1/2) 717788',
+ '[4/5] - "Big Buck Bunny - S01E01.mkv.vol01+02.par2" yEnc (1/3) 1434656',
+ '[5/5] - "Big Buck Bunny - S01E01.mkv.vol03+04.par2" yEnc (1/5) 2869192',
+ ]
+ assert nzb.filenames == (
+ "Big Buck Bunny - S01E01.mkv",
+ "Big Buck Bunny - S01E01.mkv.par2",
+ "Big Buck Bunny - S01E01.mkv.vol00+01.par2",
+ "Big Buck Bunny - S01E01.mkv.vol01+02.par2",
+ "Big Buck Bunny - S01E01.mkv.vol03+04.par2",
+ )
assert nzb.file == File(
poster="John ",
- datetime=datetime.datetime(2024, 1, 28, 11, 18, 28, tzinfo=datetime.timezone.utc),
+ posted_at=datetime.datetime(2024, 1, 28, 11, 18, 28, tzinfo=datetime.timezone.utc),
subject='[1/5] - "Big Buck Bunny - S01E01.mkv" yEnc (1/24) 16981056',
groups=("alt.binaries.boneless",),
segments=(
@@ -143,10 +154,10 @@ def test_valid_nzb_with_one_missing_segment() -> None:
def test_bad_subject() -> None:
- nzb = NZBParser.from_file(nzbs / "bad_subject.nzb").parse()
- assert nzb.files[0].name == ""
- assert nzb.files[0].stem == ""
- assert nzb.files[0].suffix == ""
+ nzb = Nzb.from_file(NZB_DIR / "bad_subject.nzb")
+ assert nzb.files[0].name is None
+ assert nzb.files[0].stem is None
+ assert nzb.files[0].extension is None
assert nzb.files[0].is_par2() is False
assert nzb.files[0].is_rar() is False
assert nzb.is_rar() is False
@@ -155,22 +166,52 @@ def test_bad_subject() -> None:
def test_non_standard_meta() -> None:
- nzb = NZBParser.from_file(nzbs / "non_standard_meta.nzb").parse()
+ nzb = Nzb.from_file(NZB_DIR / "non_standard_meta.nzb")
assert nzb.meta.title is None
- assert nzb.meta.passwords is None
- assert nzb.meta.tags is None
+ assert nzb.meta.passwords == ()
+ assert nzb.meta.tags == ()
assert nzb.meta.category is None
def test_single_rar_nzb() -> None:
- nzb = NZBParser.from_file(nzbs / "one_rar_file.nzb").parse()
+ nzb = Nzb.from_file(NZB_DIR / "one_rar_file.nzb")
assert nzb.has_rar() is True
assert nzb.is_rar() is False
assert nzb.has_par2() is False
def test_multi_rar_nzb() -> None:
- nzb = NZBParser.from_file(nzbs / "multi_rar.nzb").parse()
+ nzb = Nzb.from_file(NZB_DIR / "multi_rar.nzb")
assert nzb.has_rar() is True
assert nzb.is_rar() is True
assert nzb.has_par2() is False
+
+
+@pytest.mark.parametrize(
+ "nzb_file",
+ [
+ "spec_example.nzb",
+ "big_buck_bunny.nzb",
+ "valid_nzb_with_one_missing_segment.nzb",
+ "bad_subject.nzb",
+ "non_standard_meta.nzb",
+ "one_rar_file.nzb",
+ "multi_rar.nzb",
+ ],
+)
+def test_json_roundtrip(nzb_file: str) -> None:
+ nzb_file = NZB_DIR / nzb_file # type: ignore[assignment]
+
+ original = Nzb.from_file(nzb_file)
+ original_rnzb = RustNzb.from_file(nzb_file)
+
+ serialized = original.to_json()
+ serialized_rnzb = original_rnzb.to_json()
+
+ assert serialized == serialized_rnzb
+
+ deserialized = Nzb.from_json(serialized)
+ deserialized_rnzb = RustNzb.from_json(serialized_rnzb)
+
+ assert original == deserialized
+ assert original_rnzb == deserialized_rnzb
diff --git a/tests/test_utils.py b/tests/test_utils.py
index 0ffac11..c8c21d6 100644
--- a/tests/test_utils.py
+++ b/tests/test_utils.py
@@ -1,18 +1,67 @@
from __future__ import annotations
-from nzb._utils import meta_constructor
+from nzb._utils import construct_meta, remove_meta_fields, sort_meta
-def test_meta_constructor() -> None:
- assert meta_constructor(title="hello") == [{"@type": "title", "#text": "hello"}]
- assert meta_constructor(passwords="secret") == [{"@type": "password", "#text": "secret"}]
- assert meta_constructor(passwords=("secret", "secret2")) == [
+def test_construct_meta() -> None:
+ assert construct_meta(title="hello") == [{"@type": "title", "#text": "hello"}]
+ assert construct_meta(passwords="secret") == [{"@type": "password", "#text": "secret"}]
+ assert construct_meta(passwords=("secret", "secret2")) == [
{"@type": "password", "#text": "secret"},
{"@type": "password", "#text": "secret2"},
]
- assert meta_constructor(tags="hd") == [{"@type": "tag", "#text": "hd"}]
- assert meta_constructor(tags=("hd", "tv")) == [
+ assert construct_meta(tags="hd") == [{"@type": "tag", "#text": "hd"}]
+ assert construct_meta(tags=("hd", "tv")) == [
{"@type": "tag", "#text": "hd"},
{"@type": "tag", "#text": "tv"},
]
- assert meta_constructor(category="cat") == [{"@type": "category", "#text": "cat"}]
+ assert construct_meta(category="cat") == [{"@type": "category", "#text": "cat"}]
+
+
+def test_sort_meta_list() -> None:
+ meta = [
+ {"@type": "category", "#text": "test"},
+ {"@type": "title", "#text": "test"},
+ {"@type": "unknown", "#text": "test"},
+ ]
+ assert sort_meta(meta) == [
+ {"@type": "unknown", "#text": "test"},
+ {"@type": "title", "#text": "test"},
+ {"@type": "category", "#text": "test"},
+ ]
+
+
+def test_sort_meta_mixed_case_list() -> None:
+ meta = [
+ {"@type": "TAG", "#text": "test"},
+ {"@type": "Password", "#text": "test"},
+ {"@type": "title", "#text": "test"},
+ ]
+ assert sort_meta(meta) == [
+ {"@type": "title", "#text": "test"},
+ {"@type": "Password", "#text": "test"},
+ {"@type": "TAG", "#text": "test"},
+ ]
+
+
+def test_remove_meta_fields_duplicates() -> None:
+ meta = [
+ {"@type": "title", "#text": "test"},
+ {"@type": "title", "#text": "test2"},
+ {"@type": "category", "#text": "test"},
+ ]
+ assert remove_meta_fields(meta, ["title"]) == [{"@type": "category", "#text": "test"}]
+
+
+def test_remove_meta_fields_none() -> None:
+ meta = [
+ {"@type": "title", "#text": "test"},
+ {"@type": "title", "#text": "test2"},
+ {"@type": "category", "#text": "test"},
+ ]
+ assert remove_meta_fields(meta) == meta
+
+
+def test_remove_meta_fields_empty_type() -> None:
+ meta = [{"@type": "", "#text": "test"}, {"@type": "category", "#text": "test"}]
+ assert remove_meta_fields(meta, ["title"]) == meta
diff --git a/uv.lock b/uv.lock
index 0480c80..089751b 100644
--- a/uv.lock
+++ b/uv.lock
@@ -1,8 +1,8 @@
version = 1
requires-python = ">=3.10"
resolution-markers = [
- "python_full_version < '3.13'",
"python_full_version >= '3.13'",
+ "python_full_version < '3.13'",
]
[[package]]
@@ -25,77 +25,84 @@ wheels = [
[[package]]
name = "certifi"
-version = "2024.8.30"
+version = "2024.12.14"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/b0/ee/9b19140fe824b367c04c5e1b369942dd754c4c5462d5674002f75c4dedc1/certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9", size = 168507 }
+sdist = { url = "https://files.pythonhosted.org/packages/0f/bd/1d41ee578ce09523c81a15426705dd20969f5abf006d1afe8aeff0dd776a/certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db", size = 166010 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/12/90/3c9ff0512038035f59d279fddeb79f5f1eccd8859f06d6163c58798b9487/certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", size = 167321 },
+ { url = "https://files.pythonhosted.org/packages/a5/32/8f6669fc4798494966bf446c8c4a162e0b5d893dff088afddf76414f70e1/certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56", size = 164927 },
]
[[package]]
name = "charset-normalizer"
-version = "3.3.2"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/63/09/c1bc53dab74b1816a00d8d030de5bf98f724c52c1635e07681d312f20be8/charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", size = 104809 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/2b/61/095a0aa1a84d1481998b534177c8566fdc50bb1233ea9a0478cd3cc075bd/charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3", size = 194219 },
- { url = "https://files.pythonhosted.org/packages/cc/94/f7cf5e5134175de79ad2059edf2adce18e0685ebdb9227ff0139975d0e93/charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", size = 122521 },
- { url = "https://files.pythonhosted.org/packages/46/6a/d5c26c41c49b546860cc1acabdddf48b0b3fb2685f4f5617ac59261b44ae/charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03", size = 120383 },
- { url = "https://files.pythonhosted.org/packages/b8/60/e2f67915a51be59d4539ed189eb0a2b0d292bf79270410746becb32bc2c3/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d", size = 138223 },
- { url = "https://files.pythonhosted.org/packages/05/8c/eb854996d5fef5e4f33ad56927ad053d04dc820e4a3d39023f35cad72617/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e", size = 148101 },
- { url = "https://files.pythonhosted.org/packages/f6/93/bb6cbeec3bf9da9b2eba458c15966658d1daa8b982c642f81c93ad9b40e1/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6", size = 140699 },
- { url = "https://files.pythonhosted.org/packages/da/f1/3702ba2a7470666a62fd81c58a4c40be00670e5006a67f4d626e57f013ae/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5", size = 142065 },
- { url = "https://files.pythonhosted.org/packages/3f/ba/3f5e7be00b215fa10e13d64b1f6237eb6ebea66676a41b2bcdd09fe74323/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537", size = 144505 },
- { url = "https://files.pythonhosted.org/packages/33/c3/3b96a435c5109dd5b6adc8a59ba1d678b302a97938f032e3770cc84cd354/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c", size = 139425 },
- { url = "https://files.pythonhosted.org/packages/43/05/3bf613e719efe68fb3a77f9c536a389f35b95d75424b96b426a47a45ef1d/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12", size = 145287 },
- { url = "https://files.pythonhosted.org/packages/58/78/a0bc646900994df12e07b4ae5c713f2b3e5998f58b9d3720cce2aa45652f/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f", size = 149929 },
- { url = "https://files.pythonhosted.org/packages/eb/5c/97d97248af4920bc68687d9c3b3c0f47c910e21a8ff80af4565a576bd2f0/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269", size = 141605 },
- { url = "https://files.pythonhosted.org/packages/a8/31/47d018ef89f95b8aded95c589a77c072c55e94b50a41aa99c0a2008a45a4/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", size = 142646 },
- { url = "https://files.pythonhosted.org/packages/ae/d5/4fecf1d58bedb1340a50f165ba1c7ddc0400252d6832ff619c4568b36cc0/charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73", size = 92846 },
- { url = "https://files.pythonhosted.org/packages/a2/a0/4af29e22cb5942488cf45630cbdd7cefd908768e69bdd90280842e4e8529/charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09", size = 100343 },
- { url = "https://files.pythonhosted.org/packages/68/77/02839016f6fbbf808e8b38601df6e0e66c17bbab76dff4613f7511413597/charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db", size = 191647 },
- { url = "https://files.pythonhosted.org/packages/3e/33/21a875a61057165e92227466e54ee076b73af1e21fe1b31f1e292251aa1e/charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96", size = 121434 },
- { url = "https://files.pythonhosted.org/packages/dd/51/68b61b90b24ca35495956b718f35a9756ef7d3dd4b3c1508056fa98d1a1b/charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e", size = 118979 },
- { url = "https://files.pythonhosted.org/packages/e4/a6/7ee57823d46331ddc37dd00749c95b0edec2c79b15fc0d6e6efb532e89ac/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f", size = 136582 },
- { url = "https://files.pythonhosted.org/packages/74/f1/0d9fe69ac441467b737ba7f48c68241487df2f4522dd7246d9426e7c690e/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574", size = 146645 },
- { url = "https://files.pythonhosted.org/packages/05/31/e1f51c76db7be1d4aef220d29fbfa5dbb4a99165d9833dcbf166753b6dc0/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4", size = 139398 },
- { url = "https://files.pythonhosted.org/packages/40/26/f35951c45070edc957ba40a5b1db3cf60a9dbb1b350c2d5bef03e01e61de/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8", size = 140273 },
- { url = "https://files.pythonhosted.org/packages/07/07/7e554f2bbce3295e191f7e653ff15d55309a9ca40d0362fcdab36f01063c/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc", size = 142577 },
- { url = "https://files.pythonhosted.org/packages/d8/b5/eb705c313100defa57da79277d9207dc8d8e45931035862fa64b625bfead/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae", size = 137747 },
- { url = "https://files.pythonhosted.org/packages/19/28/573147271fd041d351b438a5665be8223f1dd92f273713cb882ddafe214c/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887", size = 143375 },
- { url = "https://files.pythonhosted.org/packages/cf/7c/f3b682fa053cc21373c9a839e6beba7705857075686a05c72e0f8c4980ca/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae", size = 148474 },
- { url = "https://files.pythonhosted.org/packages/1e/49/7ab74d4ac537ece3bc3334ee08645e231f39f7d6df6347b29a74b0537103/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce", size = 140232 },
- { url = "https://files.pythonhosted.org/packages/2d/dc/9dacba68c9ac0ae781d40e1a0c0058e26302ea0660e574ddf6797a0347f7/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f", size = 140859 },
- { url = "https://files.pythonhosted.org/packages/6c/c2/4a583f800c0708dd22096298e49f887b49d9746d0e78bfc1d7e29816614c/charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab", size = 92509 },
- { url = "https://files.pythonhosted.org/packages/57/ec/80c8d48ac8b1741d5b963797b7c0c869335619e13d4744ca2f67fc11c6fc/charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", size = 99870 },
- { url = "https://files.pythonhosted.org/packages/d1/b2/fcedc8255ec42afee97f9e6f0145c734bbe104aac28300214593eb326f1d/charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", size = 192892 },
- { url = "https://files.pythonhosted.org/packages/2e/7d/2259318c202f3d17f3fe6438149b3b9e706d1070fe3fcbb28049730bb25c/charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", size = 122213 },
- { url = "https://files.pythonhosted.org/packages/3a/52/9f9d17c3b54dc238de384c4cb5a2ef0e27985b42a0e5cc8e8a31d918d48d/charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", size = 119404 },
- { url = "https://files.pythonhosted.org/packages/99/b0/9c365f6d79a9f0f3c379ddb40a256a67aa69c59609608fe7feb6235896e1/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", size = 137275 },
- { url = "https://files.pythonhosted.org/packages/91/33/749df346e93d7a30cdcb90cbfdd41a06026317bfbfb62cd68307c1a3c543/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", size = 147518 },
- { url = "https://files.pythonhosted.org/packages/72/1a/641d5c9f59e6af4c7b53da463d07600a695b9824e20849cb6eea8a627761/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", size = 140182 },
- { url = "https://files.pythonhosted.org/packages/ee/fb/14d30eb4956408ee3ae09ad34299131fb383c47df355ddb428a7331cfa1e/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", size = 141869 },
- { url = "https://files.pythonhosted.org/packages/df/3e/a06b18788ca2eb6695c9b22325b6fde7dde0f1d1838b1792a0076f58fe9d/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", size = 144042 },
- { url = "https://files.pythonhosted.org/packages/45/59/3d27019d3b447a88fe7e7d004a1e04be220227760264cc41b405e863891b/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", size = 138275 },
- { url = "https://files.pythonhosted.org/packages/7b/ef/5eb105530b4da8ae37d506ccfa25057961b7b63d581def6f99165ea89c7e/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", size = 144819 },
- { url = "https://files.pythonhosted.org/packages/a2/51/e5023f937d7f307c948ed3e5c29c4b7a3e42ed2ee0b8cdf8f3a706089bf0/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", size = 149415 },
- { url = "https://files.pythonhosted.org/packages/24/9d/2e3ef673dfd5be0154b20363c5cdcc5606f35666544381bee15af3778239/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", size = 141212 },
- { url = "https://files.pythonhosted.org/packages/5b/ae/ce2c12fcac59cb3860b2e2d76dc405253a4475436b1861d95fe75bdea520/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", size = 142167 },
- { url = "https://files.pythonhosted.org/packages/ed/3a/a448bf035dce5da359daf9ae8a16b8a39623cc395a2ffb1620aa1bce62b0/charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", size = 93041 },
- { url = "https://files.pythonhosted.org/packages/b6/7c/8debebb4f90174074b827c63242c23851bdf00a532489fba57fef3416e40/charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", size = 100397 },
- { url = "https://files.pythonhosted.org/packages/28/76/e6222113b83e3622caa4bb41032d0b1bf785250607392e1b778aca0b8a7d/charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", size = 48543 },
+version = "3.4.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/0d/58/5580c1716040bc89206c77d8f74418caf82ce519aae06450393ca73475d1/charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de", size = 198013 },
+ { url = "https://files.pythonhosted.org/packages/d0/11/00341177ae71c6f5159a08168bcb98c6e6d196d372c94511f9f6c9afe0c6/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176", size = 141285 },
+ { url = "https://files.pythonhosted.org/packages/01/09/11d684ea5819e5a8f5100fb0b38cf8d02b514746607934134d31233e02c8/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037", size = 151449 },
+ { url = "https://files.pythonhosted.org/packages/08/06/9f5a12939db324d905dc1f70591ae7d7898d030d7662f0d426e2286f68c9/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f", size = 143892 },
+ { url = "https://files.pythonhosted.org/packages/93/62/5e89cdfe04584cb7f4d36003ffa2936681b03ecc0754f8e969c2becb7e24/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a", size = 146123 },
+ { url = "https://files.pythonhosted.org/packages/a9/ac/ab729a15c516da2ab70a05f8722ecfccc3f04ed7a18e45c75bbbaa347d61/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a", size = 147943 },
+ { url = "https://files.pythonhosted.org/packages/03/d2/3f392f23f042615689456e9a274640c1d2e5dd1d52de36ab8f7955f8f050/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247", size = 142063 },
+ { url = "https://files.pythonhosted.org/packages/f2/e3/e20aae5e1039a2cd9b08d9205f52142329f887f8cf70da3650326670bddf/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408", size = 150578 },
+ { url = "https://files.pythonhosted.org/packages/8d/af/779ad72a4da0aed925e1139d458adc486e61076d7ecdcc09e610ea8678db/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb", size = 153629 },
+ { url = "https://files.pythonhosted.org/packages/c2/b6/7aa450b278e7aa92cf7732140bfd8be21f5f29d5bf334ae987c945276639/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d", size = 150778 },
+ { url = "https://files.pythonhosted.org/packages/39/f4/d9f4f712d0951dcbfd42920d3db81b00dd23b6ab520419626f4023334056/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807", size = 146453 },
+ { url = "https://files.pythonhosted.org/packages/49/2b/999d0314e4ee0cff3cb83e6bc9aeddd397eeed693edb4facb901eb8fbb69/charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f", size = 95479 },
+ { url = "https://files.pythonhosted.org/packages/2d/ce/3cbed41cff67e455a386fb5e5dd8906cdda2ed92fbc6297921f2e4419309/charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f", size = 102790 },
+ { url = "https://files.pythonhosted.org/packages/72/80/41ef5d5a7935d2d3a773e3eaebf0a9350542f2cab4eac59a7a4741fbbbbe/charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", size = 194995 },
+ { url = "https://files.pythonhosted.org/packages/7a/28/0b9fefa7b8b080ec492110af6d88aa3dea91c464b17d53474b6e9ba5d2c5/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", size = 139471 },
+ { url = "https://files.pythonhosted.org/packages/71/64/d24ab1a997efb06402e3fc07317e94da358e2585165930d9d59ad45fcae2/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", size = 149831 },
+ { url = "https://files.pythonhosted.org/packages/37/ed/be39e5258e198655240db5e19e0b11379163ad7070962d6b0c87ed2c4d39/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", size = 142335 },
+ { url = "https://files.pythonhosted.org/packages/88/83/489e9504711fa05d8dde1574996408026bdbdbd938f23be67deebb5eca92/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", size = 143862 },
+ { url = "https://files.pythonhosted.org/packages/c6/c7/32da20821cf387b759ad24627a9aca289d2822de929b8a41b6241767b461/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", size = 145673 },
+ { url = "https://files.pythonhosted.org/packages/68/85/f4288e96039abdd5aeb5c546fa20a37b50da71b5cf01e75e87f16cd43304/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", size = 140211 },
+ { url = "https://files.pythonhosted.org/packages/28/a3/a42e70d03cbdabc18997baf4f0227c73591a08041c149e710045c281f97b/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", size = 148039 },
+ { url = "https://files.pythonhosted.org/packages/85/e4/65699e8ab3014ecbe6f5c71d1a55d810fb716bbfd74f6283d5c2aa87febf/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", size = 151939 },
+ { url = "https://files.pythonhosted.org/packages/b1/82/8e9fe624cc5374193de6860aba3ea8070f584c8565ee77c168ec13274bd2/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", size = 149075 },
+ { url = "https://files.pythonhosted.org/packages/3d/7b/82865ba54c765560c8433f65e8acb9217cb839a9e32b42af4aa8e945870f/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", size = 144340 },
+ { url = "https://files.pythonhosted.org/packages/b5/b6/9674a4b7d4d99a0d2df9b215da766ee682718f88055751e1e5e753c82db0/charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", size = 95205 },
+ { url = "https://files.pythonhosted.org/packages/1e/ab/45b180e175de4402dcf7547e4fb617283bae54ce35c27930a6f35b6bef15/charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", size = 102441 },
+ { url = "https://files.pythonhosted.org/packages/0a/9a/dd1e1cdceb841925b7798369a09279bd1cf183cef0f9ddf15a3a6502ee45/charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", size = 196105 },
+ { url = "https://files.pythonhosted.org/packages/d3/8c/90bfabf8c4809ecb648f39794cf2a84ff2e7d2a6cf159fe68d9a26160467/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", size = 140404 },
+ { url = "https://files.pythonhosted.org/packages/ad/8f/e410d57c721945ea3b4f1a04b74f70ce8fa800d393d72899f0a40526401f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", size = 150423 },
+ { url = "https://files.pythonhosted.org/packages/f0/b8/e6825e25deb691ff98cf5c9072ee0605dc2acfca98af70c2d1b1bc75190d/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", size = 143184 },
+ { url = "https://files.pythonhosted.org/packages/3e/a2/513f6cbe752421f16d969e32f3583762bfd583848b763913ddab8d9bfd4f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", size = 145268 },
+ { url = "https://files.pythonhosted.org/packages/74/94/8a5277664f27c3c438546f3eb53b33f5b19568eb7424736bdc440a88a31f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616", size = 147601 },
+ { url = "https://files.pythonhosted.org/packages/7c/5f/6d352c51ee763623a98e31194823518e09bfa48be2a7e8383cf691bbb3d0/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", size = 141098 },
+ { url = "https://files.pythonhosted.org/packages/78/d4/f5704cb629ba5ab16d1d3d741396aec6dc3ca2b67757c45b0599bb010478/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", size = 149520 },
+ { url = "https://files.pythonhosted.org/packages/c5/96/64120b1d02b81785f222b976c0fb79a35875457fa9bb40827678e54d1bc8/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", size = 152852 },
+ { url = "https://files.pythonhosted.org/packages/84/c9/98e3732278a99f47d487fd3468bc60b882920cef29d1fa6ca460a1fdf4e6/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", size = 150488 },
+ { url = "https://files.pythonhosted.org/packages/13/0e/9c8d4cb99c98c1007cc11eda969ebfe837bbbd0acdb4736d228ccaabcd22/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", size = 146192 },
+ { url = "https://files.pythonhosted.org/packages/b2/21/2b6b5b860781a0b49427309cb8670785aa543fb2178de875b87b9cc97746/charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", size = 95550 },
+ { url = "https://files.pythonhosted.org/packages/21/5b/1b390b03b1d16c7e382b561c5329f83cc06623916aab983e8ab9239c7d5c/charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", size = 102785 },
+ { url = "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698 },
+ { url = "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162 },
+ { url = "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263 },
+ { url = "https://files.pythonhosted.org/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", size = 142966 },
+ { url = "https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", size = 144992 },
+ { url = "https://files.pythonhosted.org/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", size = 147162 },
+ { url = "https://files.pythonhosted.org/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", size = 140972 },
+ { url = "https://files.pythonhosted.org/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", size = 149095 },
+ { url = "https://files.pythonhosted.org/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", size = 152668 },
+ { url = "https://files.pythonhosted.org/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", size = 150073 },
+ { url = "https://files.pythonhosted.org/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", size = 145732 },
+ { url = "https://files.pythonhosted.org/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", size = 95391 },
+ { url = "https://files.pythonhosted.org/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", size = 102702 },
+ { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 },
]
[[package]]
name = "click"
-version = "8.1.7"
+version = "8.1.8"
source = { registry = "https://pypi.org/simple" }
dependencies = [
- { name = "colorama", marker = "platform_system == 'Windows'" },
+ { name = "colorama", marker = "sys_platform == 'win32'" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/96/d3/f04c7bfcf5c1862a2a5b845c6b2b360488cf47af55dfa79c98f6a6bf98b5/click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de", size = 336121 }
+sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", size = 97941 },
+ { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 },
]
[[package]]
@@ -109,61 +116,66 @@ wheels = [
[[package]]
name = "coverage"
-version = "7.6.1"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/f7/08/7e37f82e4d1aead42a7443ff06a1e406aabf7302c4f00a546e4b320b994c/coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d", size = 798791 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/7e/61/eb7ce5ed62bacf21beca4937a90fe32545c91a3c8a42a30c6616d48fc70d/coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16", size = 206690 },
- { url = "https://files.pythonhosted.org/packages/7d/73/041928e434442bd3afde5584bdc3f932fb4562b1597629f537387cec6f3d/coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36", size = 207127 },
- { url = "https://files.pythonhosted.org/packages/c7/c8/6ca52b5147828e45ad0242388477fdb90df2c6cbb9a441701a12b3c71bc8/coverage-7.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02", size = 235654 },
- { url = "https://files.pythonhosted.org/packages/d5/da/9ac2b62557f4340270942011d6efeab9833648380109e897d48ab7c1035d/coverage-7.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc", size = 233598 },
- { url = "https://files.pythonhosted.org/packages/53/23/9e2c114d0178abc42b6d8d5281f651a8e6519abfa0ef460a00a91f80879d/coverage-7.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23", size = 234732 },
- { url = "https://files.pythonhosted.org/packages/0f/7e/a0230756fb133343a52716e8b855045f13342b70e48e8ad41d8a0d60ab98/coverage-7.6.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34", size = 233816 },
- { url = "https://files.pythonhosted.org/packages/28/7c/3753c8b40d232b1e5eeaed798c875537cf3cb183fb5041017c1fdb7ec14e/coverage-7.6.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c", size = 232325 },
- { url = "https://files.pythonhosted.org/packages/57/e3/818a2b2af5b7573b4b82cf3e9f137ab158c90ea750a8f053716a32f20f06/coverage-7.6.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959", size = 233418 },
- { url = "https://files.pythonhosted.org/packages/c8/fb/4532b0b0cefb3f06d201648715e03b0feb822907edab3935112b61b885e2/coverage-7.6.1-cp310-cp310-win32.whl", hash = "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232", size = 209343 },
- { url = "https://files.pythonhosted.org/packages/5a/25/af337cc7421eca1c187cc9c315f0a755d48e755d2853715bfe8c418a45fa/coverage-7.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0", size = 210136 },
- { url = "https://files.pythonhosted.org/packages/ad/5f/67af7d60d7e8ce61a4e2ddcd1bd5fb787180c8d0ae0fbd073f903b3dd95d/coverage-7.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93", size = 206796 },
- { url = "https://files.pythonhosted.org/packages/e1/0e/e52332389e057daa2e03be1fbfef25bb4d626b37d12ed42ae6281d0a274c/coverage-7.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3", size = 207244 },
- { url = "https://files.pythonhosted.org/packages/aa/cd/766b45fb6e090f20f8927d9c7cb34237d41c73a939358bc881883fd3a40d/coverage-7.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff", size = 239279 },
- { url = "https://files.pythonhosted.org/packages/70/6c/a9ccd6fe50ddaf13442a1e2dd519ca805cbe0f1fcd377fba6d8339b98ccb/coverage-7.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d", size = 236859 },
- { url = "https://files.pythonhosted.org/packages/14/6f/8351b465febb4dbc1ca9929505202db909c5a635c6fdf33e089bbc3d7d85/coverage-7.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6", size = 238549 },
- { url = "https://files.pythonhosted.org/packages/68/3c/289b81fa18ad72138e6d78c4c11a82b5378a312c0e467e2f6b495c260907/coverage-7.6.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56", size = 237477 },
- { url = "https://files.pythonhosted.org/packages/ed/1c/aa1efa6459d822bd72c4abc0b9418cf268de3f60eeccd65dc4988553bd8d/coverage-7.6.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234", size = 236134 },
- { url = "https://files.pythonhosted.org/packages/fb/c8/521c698f2d2796565fe9c789c2ee1ccdae610b3aa20b9b2ef980cc253640/coverage-7.6.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133", size = 236910 },
- { url = "https://files.pythonhosted.org/packages/7d/30/033e663399ff17dca90d793ee8a2ea2890e7fdf085da58d82468b4220bf7/coverage-7.6.1-cp311-cp311-win32.whl", hash = "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c", size = 209348 },
- { url = "https://files.pythonhosted.org/packages/20/05/0d1ccbb52727ccdadaa3ff37e4d2dc1cd4d47f0c3df9eb58d9ec8508ca88/coverage-7.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6", size = 210230 },
- { url = "https://files.pythonhosted.org/packages/7e/d4/300fc921dff243cd518c7db3a4c614b7e4b2431b0d1145c1e274fd99bd70/coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778", size = 206983 },
- { url = "https://files.pythonhosted.org/packages/e1/ab/6bf00de5327ecb8db205f9ae596885417a31535eeda6e7b99463108782e1/coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391", size = 207221 },
- { url = "https://files.pythonhosted.org/packages/92/8f/2ead05e735022d1a7f3a0a683ac7f737de14850395a826192f0288703472/coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8", size = 240342 },
- { url = "https://files.pythonhosted.org/packages/0f/ef/94043e478201ffa85b8ae2d2c79b4081e5a1b73438aafafccf3e9bafb6b5/coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d", size = 237371 },
- { url = "https://files.pythonhosted.org/packages/1f/0f/c890339dd605f3ebc269543247bdd43b703cce6825b5ed42ff5f2d6122c7/coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca", size = 239455 },
- { url = "https://files.pythonhosted.org/packages/d1/04/7fd7b39ec7372a04efb0f70c70e35857a99b6a9188b5205efb4c77d6a57a/coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163", size = 238924 },
- { url = "https://files.pythonhosted.org/packages/ed/bf/73ce346a9d32a09cf369f14d2a06651329c984e106f5992c89579d25b27e/coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a", size = 237252 },
- { url = "https://files.pythonhosted.org/packages/86/74/1dc7a20969725e917b1e07fe71a955eb34bc606b938316bcc799f228374b/coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d", size = 238897 },
- { url = "https://files.pythonhosted.org/packages/b6/e9/d9cc3deceb361c491b81005c668578b0dfa51eed02cd081620e9a62f24ec/coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5", size = 209606 },
- { url = "https://files.pythonhosted.org/packages/47/c8/5a2e41922ea6740f77d555c4d47544acd7dc3f251fe14199c09c0f5958d3/coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb", size = 210373 },
- { url = "https://files.pythonhosted.org/packages/8c/f9/9aa4dfb751cb01c949c990d136a0f92027fbcc5781c6e921df1cb1563f20/coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106", size = 207007 },
- { url = "https://files.pythonhosted.org/packages/b9/67/e1413d5a8591622a46dd04ff80873b04c849268831ed5c304c16433e7e30/coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9", size = 207269 },
- { url = "https://files.pythonhosted.org/packages/14/5b/9dec847b305e44a5634d0fb8498d135ab1d88330482b74065fcec0622224/coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c", size = 239886 },
- { url = "https://files.pythonhosted.org/packages/7b/b7/35760a67c168e29f454928f51f970342d23cf75a2bb0323e0f07334c85f3/coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a", size = 237037 },
- { url = "https://files.pythonhosted.org/packages/f7/95/d2fd31f1d638df806cae59d7daea5abf2b15b5234016a5ebb502c2f3f7ee/coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060", size = 239038 },
- { url = "https://files.pythonhosted.org/packages/6e/bd/110689ff5752b67924efd5e2aedf5190cbbe245fc81b8dec1abaffba619d/coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862", size = 238690 },
- { url = "https://files.pythonhosted.org/packages/d3/a8/08d7b38e6ff8df52331c83130d0ab92d9c9a8b5462f9e99c9f051a4ae206/coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388", size = 236765 },
- { url = "https://files.pythonhosted.org/packages/d6/6a/9cf96839d3147d55ae713eb2d877f4d777e7dc5ba2bce227167d0118dfe8/coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155", size = 238611 },
- { url = "https://files.pythonhosted.org/packages/74/e4/7ff20d6a0b59eeaab40b3140a71e38cf52547ba21dbcf1d79c5a32bba61b/coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a", size = 209671 },
- { url = "https://files.pythonhosted.org/packages/35/59/1812f08a85b57c9fdb6d0b383d779e47b6f643bc278ed682859512517e83/coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129", size = 210368 },
- { url = "https://files.pythonhosted.org/packages/9c/15/08913be1c59d7562a3e39fce20661a98c0a3f59d5754312899acc6cb8a2d/coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e", size = 207758 },
- { url = "https://files.pythonhosted.org/packages/c4/ae/b5d58dff26cade02ada6ca612a76447acd69dccdbb3a478e9e088eb3d4b9/coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962", size = 208035 },
- { url = "https://files.pythonhosted.org/packages/b8/d7/62095e355ec0613b08dfb19206ce3033a0eedb6f4a67af5ed267a8800642/coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb", size = 250839 },
- { url = "https://files.pythonhosted.org/packages/7c/1e/c2967cb7991b112ba3766df0d9c21de46b476d103e32bb401b1b2adf3380/coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704", size = 246569 },
- { url = "https://files.pythonhosted.org/packages/8b/61/a7a6a55dd266007ed3b1df7a3386a0d760d014542d72f7c2c6938483b7bd/coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b", size = 248927 },
- { url = "https://files.pythonhosted.org/packages/c8/fa/13a6f56d72b429f56ef612eb3bc5ce1b75b7ee12864b3bd12526ab794847/coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f", size = 248401 },
- { url = "https://files.pythonhosted.org/packages/75/06/0429c652aa0fb761fc60e8c6b291338c9173c6aa0f4e40e1902345b42830/coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223", size = 246301 },
- { url = "https://files.pythonhosted.org/packages/52/76/1766bb8b803a88f93c3a2d07e30ffa359467810e5cbc68e375ebe6906efb/coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3", size = 247598 },
- { url = "https://files.pythonhosted.org/packages/66/8b/f54f8db2ae17188be9566e8166ac6df105c1c611e25da755738025708d54/coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f", size = 210307 },
- { url = "https://files.pythonhosted.org/packages/9f/b0/e0dca6da9170aefc07515cce067b97178cefafb512d00a87a1c717d2efd5/coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657", size = 211453 },
- { url = "https://files.pythonhosted.org/packages/a5/2b/0354ed096bca64dc8e32a7cbcae28b34cb5ad0b1fe2125d6d99583313ac0/coverage-7.6.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df", size = 198926 },
+version = "7.6.10"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/84/ba/ac14d281f80aab516275012e8875991bb06203957aa1e19950139238d658/coverage-7.6.10.tar.gz", hash = "sha256:7fb105327c8f8f0682e29843e2ff96af9dcbe5bab8eeb4b398c6a33a16d80a23", size = 803868 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c5/12/2a2a923edf4ddabdffed7ad6da50d96a5c126dae7b80a33df7310e329a1e/coverage-7.6.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5c912978f7fbf47ef99cec50c4401340436d200d41d714c7a4766f377c5b7b78", size = 207982 },
+ { url = "https://files.pythonhosted.org/packages/ca/49/6985dbca9c7be3f3cb62a2e6e492a0c88b65bf40579e16c71ae9c33c6b23/coverage-7.6.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a01ec4af7dfeb96ff0078ad9a48810bb0cc8abcb0115180c6013a6b26237626c", size = 208414 },
+ { url = "https://files.pythonhosted.org/packages/35/93/287e8f1d1ed2646f4e0b2605d14616c9a8a2697d0d1b453815eb5c6cebdb/coverage-7.6.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3b204c11e2b2d883946fe1d97f89403aa1811df28ce0447439178cc7463448a", size = 236860 },
+ { url = "https://files.pythonhosted.org/packages/de/e1/cfdb5627a03567a10031acc629b75d45a4ca1616e54f7133ca1fa366050a/coverage-7.6.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32ee6d8491fcfc82652a37109f69dee9a830e9379166cb73c16d8dc5c2915165", size = 234758 },
+ { url = "https://files.pythonhosted.org/packages/6d/85/fc0de2bcda3f97c2ee9fe8568f7d48f7279e91068958e5b2cc19e0e5f600/coverage-7.6.10-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675cefc4c06e3b4c876b85bfb7c59c5e2218167bbd4da5075cbe3b5790a28988", size = 235920 },
+ { url = "https://files.pythonhosted.org/packages/79/73/ef4ea0105531506a6f4cf4ba571a214b14a884630b567ed65b3d9c1975e1/coverage-7.6.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f4f620668dbc6f5e909a0946a877310fb3d57aea8198bde792aae369ee1c23b5", size = 234986 },
+ { url = "https://files.pythonhosted.org/packages/c6/4d/75afcfe4432e2ad0405c6f27adeb109ff8976c5e636af8604f94f29fa3fc/coverage-7.6.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:4eea95ef275de7abaef630c9b2c002ffbc01918b726a39f5a4353916ec72d2f3", size = 233446 },
+ { url = "https://files.pythonhosted.org/packages/86/5b/efee56a89c16171288cafff022e8af44f8f94075c2d8da563c3935212871/coverage-7.6.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e2f0280519e42b0a17550072861e0bc8a80a0870de260f9796157d3fca2733c5", size = 234566 },
+ { url = "https://files.pythonhosted.org/packages/f2/db/67770cceb4a64d3198bf2aa49946f411b85ec6b0a9b489e61c8467a4253b/coverage-7.6.10-cp310-cp310-win32.whl", hash = "sha256:bc67deb76bc3717f22e765ab3e07ee9c7a5e26b9019ca19a3b063d9f4b874244", size = 210675 },
+ { url = "https://files.pythonhosted.org/packages/8d/27/e8bfc43f5345ec2c27bc8a1fa77cdc5ce9dcf954445e11f14bb70b889d14/coverage-7.6.10-cp310-cp310-win_amd64.whl", hash = "sha256:0f460286cb94036455e703c66988851d970fdfd8acc2a1122ab7f4f904e4029e", size = 211518 },
+ { url = "https://files.pythonhosted.org/packages/85/d2/5e175fcf6766cf7501a8541d81778fd2f52f4870100e791f5327fd23270b/coverage-7.6.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ea3c8f04b3e4af80e17bab607c386a830ffc2fb88a5484e1df756478cf70d1d3", size = 208088 },
+ { url = "https://files.pythonhosted.org/packages/4b/6f/06db4dc8fca33c13b673986e20e466fd936235a6ec1f0045c3853ac1b593/coverage-7.6.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:507a20fc863cae1d5720797761b42d2d87a04b3e5aeb682ef3b7332e90598f43", size = 208536 },
+ { url = "https://files.pythonhosted.org/packages/0d/62/c6a0cf80318c1c1af376d52df444da3608eafc913b82c84a4600d8349472/coverage-7.6.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d37a84878285b903c0fe21ac8794c6dab58150e9359f1aaebbeddd6412d53132", size = 240474 },
+ { url = "https://files.pythonhosted.org/packages/a3/59/750adafc2e57786d2e8739a46b680d4fb0fbc2d57fbcb161290a9f1ecf23/coverage-7.6.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a534738b47b0de1995f85f582d983d94031dffb48ab86c95bdf88dc62212142f", size = 237880 },
+ { url = "https://files.pythonhosted.org/packages/2c/f8/ef009b3b98e9f7033c19deb40d629354aab1d8b2d7f9cfec284dbedf5096/coverage-7.6.10-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d7a2bf79378d8fb8afaa994f91bfd8215134f8631d27eba3e0e2c13546ce994", size = 239750 },
+ { url = "https://files.pythonhosted.org/packages/a6/e2/6622f3b70f5f5b59f705e680dae6db64421af05a5d1e389afd24dae62e5b/coverage-7.6.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6713ba4b4ebc330f3def51df1d5d38fad60b66720948112f114968feb52d3f99", size = 238642 },
+ { url = "https://files.pythonhosted.org/packages/2d/10/57ac3f191a3c95c67844099514ff44e6e19b2915cd1c22269fb27f9b17b6/coverage-7.6.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab32947f481f7e8c763fa2c92fd9f44eeb143e7610c4ca9ecd6a36adab4081bd", size = 237266 },
+ { url = "https://files.pythonhosted.org/packages/ee/2d/7016f4ad9d553cabcb7333ed78ff9d27248ec4eba8dd21fa488254dff894/coverage-7.6.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7bbd8c8f1b115b892e34ba66a097b915d3871db7ce0e6b9901f462ff3a975377", size = 238045 },
+ { url = "https://files.pythonhosted.org/packages/a7/fe/45af5c82389a71e0cae4546413266d2195c3744849669b0bab4b5f2c75da/coverage-7.6.10-cp311-cp311-win32.whl", hash = "sha256:299e91b274c5c9cdb64cbdf1b3e4a8fe538a7a86acdd08fae52301b28ba297f8", size = 210647 },
+ { url = "https://files.pythonhosted.org/packages/db/11/3f8e803a43b79bc534c6a506674da9d614e990e37118b4506faf70d46ed6/coverage-7.6.10-cp311-cp311-win_amd64.whl", hash = "sha256:489a01f94aa581dbd961f306e37d75d4ba16104bbfa2b0edb21d29b73be83609", size = 211508 },
+ { url = "https://files.pythonhosted.org/packages/86/77/19d09ea06f92fdf0487499283b1b7af06bc422ea94534c8fe3a4cd023641/coverage-7.6.10-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:27c6e64726b307782fa5cbe531e7647aee385a29b2107cd87ba7c0105a5d3853", size = 208281 },
+ { url = "https://files.pythonhosted.org/packages/b6/67/5479b9f2f99fcfb49c0d5cf61912a5255ef80b6e80a3cddba39c38146cf4/coverage-7.6.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c56e097019e72c373bae32d946ecf9858fda841e48d82df7e81c63ac25554078", size = 208514 },
+ { url = "https://files.pythonhosted.org/packages/15/d1/febf59030ce1c83b7331c3546d7317e5120c5966471727aa7ac157729c4b/coverage-7.6.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7827a5bc7bdb197b9e066cdf650b2887597ad124dd99777332776f7b7c7d0d0", size = 241537 },
+ { url = "https://files.pythonhosted.org/packages/4b/7e/5ac4c90192130e7cf8b63153fe620c8bfd9068f89a6d9b5f26f1550f7a26/coverage-7.6.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:204a8238afe787323a8b47d8be4df89772d5c1e4651b9ffa808552bdf20e1d50", size = 238572 },
+ { url = "https://files.pythonhosted.org/packages/dc/03/0334a79b26ecf59958f2fe9dd1f5ab3e2f88db876f5071933de39af09647/coverage-7.6.10-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67926f51821b8e9deb6426ff3164870976fe414d033ad90ea75e7ed0c2e5022", size = 240639 },
+ { url = "https://files.pythonhosted.org/packages/d7/45/8a707f23c202208d7b286d78ad6233f50dcf929319b664b6cc18a03c1aae/coverage-7.6.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e78b270eadb5702938c3dbe9367f878249b5ef9a2fcc5360ac7bff694310d17b", size = 240072 },
+ { url = "https://files.pythonhosted.org/packages/66/02/603ce0ac2d02bc7b393279ef618940b4a0535b0868ee791140bda9ecfa40/coverage-7.6.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:714f942b9c15c3a7a5fe6876ce30af831c2ad4ce902410b7466b662358c852c0", size = 238386 },
+ { url = "https://files.pythonhosted.org/packages/04/62/4e6887e9be060f5d18f1dd58c2838b2d9646faf353232dec4e2d4b1c8644/coverage-7.6.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:abb02e2f5a3187b2ac4cd46b8ced85a0858230b577ccb2c62c81482ca7d18852", size = 240054 },
+ { url = "https://files.pythonhosted.org/packages/5c/74/83ae4151c170d8bd071924f212add22a0e62a7fe2b149edf016aeecad17c/coverage-7.6.10-cp312-cp312-win32.whl", hash = "sha256:55b201b97286cf61f5e76063f9e2a1d8d2972fc2fcfd2c1272530172fd28c359", size = 210904 },
+ { url = "https://files.pythonhosted.org/packages/c3/54/de0893186a221478f5880283119fc40483bc460b27c4c71d1b8bba3474b9/coverage-7.6.10-cp312-cp312-win_amd64.whl", hash = "sha256:e4ae5ac5e0d1e4edfc9b4b57b4cbecd5bc266a6915c500f358817a8496739247", size = 211692 },
+ { url = "https://files.pythonhosted.org/packages/25/6d/31883d78865529257bf847df5789e2ae80e99de8a460c3453dbfbe0db069/coverage-7.6.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:05fca8ba6a87aabdd2d30d0b6c838b50510b56cdcfc604d40760dae7153b73d9", size = 208308 },
+ { url = "https://files.pythonhosted.org/packages/70/22/3f2b129cc08de00c83b0ad6252e034320946abfc3e4235c009e57cfeee05/coverage-7.6.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9e80eba8801c386f72e0712a0453431259c45c3249f0009aff537a517b52942b", size = 208565 },
+ { url = "https://files.pythonhosted.org/packages/97/0a/d89bc2d1cc61d3a8dfe9e9d75217b2be85f6c73ebf1b9e3c2f4e797f4531/coverage-7.6.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a372c89c939d57abe09e08c0578c1d212e7a678135d53aa16eec4430adc5e690", size = 241083 },
+ { url = "https://files.pythonhosted.org/packages/4c/81/6d64b88a00c7a7aaed3a657b8eaa0931f37a6395fcef61e53ff742b49c97/coverage-7.6.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ec22b5e7fe7a0fa8509181c4aac1db48f3dd4d3a566131b313d1efc102892c18", size = 238235 },
+ { url = "https://files.pythonhosted.org/packages/9a/0b/7797d4193f5adb4b837207ed87fecf5fc38f7cc612b369a8e8e12d9fa114/coverage-7.6.10-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26bcf5c4df41cad1b19c84af71c22cbc9ea9a547fc973f1f2cc9a290002c8b3c", size = 240220 },
+ { url = "https://files.pythonhosted.org/packages/65/4d/6f83ca1bddcf8e51bf8ff71572f39a1c73c34cf50e752a952c34f24d0a60/coverage-7.6.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e4630c26b6084c9b3cb53b15bd488f30ceb50b73c35c5ad7871b869cb7365fd", size = 239847 },
+ { url = "https://files.pythonhosted.org/packages/30/9d/2470df6aa146aff4c65fee0f87f58d2164a67533c771c9cc12ffcdb865d5/coverage-7.6.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2396e8116db77789f819d2bc8a7e200232b7a282c66e0ae2d2cd84581a89757e", size = 237922 },
+ { url = "https://files.pythonhosted.org/packages/08/dd/723fef5d901e6a89f2507094db66c091449c8ba03272861eaefa773ad95c/coverage-7.6.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:79109c70cc0882e4d2d002fe69a24aa504dec0cc17169b3c7f41a1d341a73694", size = 239783 },
+ { url = "https://files.pythonhosted.org/packages/3d/f7/64d3298b2baf261cb35466000628706ce20a82d42faf9b771af447cd2b76/coverage-7.6.10-cp313-cp313-win32.whl", hash = "sha256:9e1747bab246d6ff2c4f28b4d186b205adced9f7bd9dc362051cc37c4a0c7bd6", size = 210965 },
+ { url = "https://files.pythonhosted.org/packages/d5/58/ec43499a7fc681212fe7742fe90b2bc361cdb72e3181ace1604247a5b24d/coverage-7.6.10-cp313-cp313-win_amd64.whl", hash = "sha256:254f1a3b1eef5f7ed23ef265eaa89c65c8c5b6b257327c149db1ca9d4a35f25e", size = 211719 },
+ { url = "https://files.pythonhosted.org/packages/ab/c9/f2857a135bcff4330c1e90e7d03446b036b2363d4ad37eb5e3a47bbac8a6/coverage-7.6.10-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2ccf240eb719789cedbb9fd1338055de2761088202a9a0b73032857e53f612fe", size = 209050 },
+ { url = "https://files.pythonhosted.org/packages/aa/b3/f840e5bd777d8433caa9e4a1eb20503495709f697341ac1a8ee6a3c906ad/coverage-7.6.10-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0c807ca74d5a5e64427c8805de15b9ca140bba13572d6d74e262f46f50b13273", size = 209321 },
+ { url = "https://files.pythonhosted.org/packages/85/7d/125a5362180fcc1c03d91850fc020f3831d5cda09319522bcfa6b2b70be7/coverage-7.6.10-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bcfa46d7709b5a7ffe089075799b902020b62e7ee56ebaed2f4bdac04c508d8", size = 252039 },
+ { url = "https://files.pythonhosted.org/packages/a9/9c/4358bf3c74baf1f9bddd2baf3756b54c07f2cfd2535f0a47f1e7757e54b3/coverage-7.6.10-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e0de1e902669dccbf80b0415fb6b43d27edca2fbd48c74da378923b05316098", size = 247758 },
+ { url = "https://files.pythonhosted.org/packages/cf/c7/de3eb6fc5263b26fab5cda3de7a0f80e317597a4bad4781859f72885f300/coverage-7.6.10-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f7b444c42bbc533aaae6b5a2166fd1a797cdb5eb58ee51a92bee1eb94a1e1cb", size = 250119 },
+ { url = "https://files.pythonhosted.org/packages/3e/e6/43de91f8ba2ec9140c6a4af1102141712949903dc732cf739167cfa7a3bc/coverage-7.6.10-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b330368cb99ef72fcd2dc3ed260adf67b31499584dc8a20225e85bfe6f6cfed0", size = 249597 },
+ { url = "https://files.pythonhosted.org/packages/08/40/61158b5499aa2adf9e37bc6d0117e8f6788625b283d51e7e0c53cf340530/coverage-7.6.10-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:9a7cfb50515f87f7ed30bc882f68812fd98bc2852957df69f3003d22a2aa0abf", size = 247473 },
+ { url = "https://files.pythonhosted.org/packages/50/69/b3f2416725621e9f112e74e8470793d5b5995f146f596f133678a633b77e/coverage-7.6.10-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f93531882a5f68c28090f901b1d135de61b56331bba82028489bc51bdd818d2", size = 248737 },
+ { url = "https://files.pythonhosted.org/packages/3c/6e/fe899fb937657db6df31cc3e61c6968cb56d36d7326361847440a430152e/coverage-7.6.10-cp313-cp313t-win32.whl", hash = "sha256:89d76815a26197c858f53c7f6a656686ec392b25991f9e409bcef020cd532312", size = 211611 },
+ { url = "https://files.pythonhosted.org/packages/1c/55/52f5e66142a9d7bc93a15192eba7a78513d2abf6b3558d77b4ca32f5f424/coverage-7.6.10-cp313-cp313t-win_amd64.whl", hash = "sha256:54a5f0f43950a36312155dae55c505a76cd7f2b12d26abeebbe7a0b36dbc868d", size = 212781 },
+ { url = "https://files.pythonhosted.org/packages/a1/70/de81bfec9ed38a64fc44a77c7665e20ca507fc3265597c28b0d989e4082e/coverage-7.6.10-pp39.pp310-none-any.whl", hash = "sha256:fd34e7b3405f0cc7ab03d54a334c17a9e802897580d964bd8c2001f4b9fd488f", size = 200223 },
+]
+
+[package.optional-dependencies]
+toml = [
+ { name = "tomli", marker = "python_full_version <= '3.11'" },
]
[[package]]
@@ -189,14 +201,14 @@ wheels = [
[[package]]
name = "griffe"
-version = "1.3.1"
+version = "1.5.6"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "colorama" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/ae/d1/dcd486d6d577cb12490c78cfa88679fb9b481b227807f14632ba9bd82245/griffe-1.3.1.tar.gz", hash = "sha256:3f86a716b631a4c0f96a43cb75d05d3c85975003c20540426c0eba3b0581c56a", size = 382412 }
+sdist = { url = "https://files.pythonhosted.org/packages/88/f0/a001e06c321dfa220103418259afbac50b933eac7a86657a4b572f0517e8/griffe-1.5.6.tar.gz", hash = "sha256:181f6666d5aceb6cd6e2da5a2b646cfb431e47a0da1fda283845734b67e10944", size = 391173 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/1b/19/63971981a20aecfa7cbd07c5cac6914cf1180b3dd8db5fe8ab2ea410315f/griffe-1.3.1-py3-none-any.whl", hash = "sha256:940aeb630bc3054b4369567f150b6365be6f11eef46b0ed8623aea96e6d17b19", size = 126902 },
+ { url = "https://files.pythonhosted.org/packages/b6/87/505777c4e5ca9c4fa5ae53fa4b0d5c2ba13a6d55a503a5594e94a2ba9b5a/griffe-1.5.6-py3-none-any.whl", hash = "sha256:b2a3afe497c6c1f952e54a23095ecc09435016293e77af8478ed65df1022a394", size = 128176 },
]
[[package]]
@@ -219,14 +231,14 @@ wheels = [
[[package]]
name = "jinja2"
-version = "3.1.4"
+version = "3.1.5"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "markupsafe" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/ed/55/39036716d19cab0747a5020fc7e907f362fbf48c984b14e62127f7e68e5d/jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369", size = 240245 }
+sdist = { url = "https://files.pythonhosted.org/packages/af/92/b3130cbbf5591acf9ade8708c365f3238046ac7cb8ccba6e81abccb0ccff/jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb", size = 244674 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d", size = 133271 },
+ { url = "https://files.pythonhosted.org/packages/bd/0f/2ba5fbcd631e3e88689309dbe978c5769e883e4b84ebfe7da30b43275c5a/jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb", size = 134596 },
]
[[package]]
@@ -240,40 +252,60 @@ wheels = [
[[package]]
name = "markupsafe"
-version = "2.1.5"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/87/5b/aae44c6655f3801e81aa3eef09dbbf012431987ba564d7231722f68df02d/MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", size = 19384 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/e4/54/ad5eb37bf9d51800010a74e4665425831a9db4e7c4e0fde4352e391e808e/MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc", size = 18206 },
- { url = "https://files.pythonhosted.org/packages/6a/4a/a4d49415e600bacae038c67f9fecc1d5433b9d3c71a4de6f33537b89654c/MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5", size = 14079 },
- { url = "https://files.pythonhosted.org/packages/0a/7b/85681ae3c33c385b10ac0f8dd025c30af83c78cec1c37a6aa3b55e67f5ec/MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46", size = 26620 },
- { url = "https://files.pythonhosted.org/packages/7c/52/2b1b570f6b8b803cef5ac28fdf78c0da318916c7d2fe9402a84d591b394c/MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f", size = 25818 },
- { url = "https://files.pythonhosted.org/packages/29/fe/a36ba8c7ca55621620b2d7c585313efd10729e63ef81e4e61f52330da781/MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900", size = 25493 },
- { url = "https://files.pythonhosted.org/packages/60/ae/9c60231cdfda003434e8bd27282b1f4e197ad5a710c14bee8bea8a9ca4f0/MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff", size = 30630 },
- { url = "https://files.pythonhosted.org/packages/65/dc/1510be4d179869f5dafe071aecb3f1f41b45d37c02329dfba01ff59e5ac5/MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad", size = 29745 },
- { url = "https://files.pythonhosted.org/packages/30/39/8d845dd7d0b0613d86e0ef89549bfb5f61ed781f59af45fc96496e897f3a/MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd", size = 30021 },
- { url = "https://files.pythonhosted.org/packages/c7/5c/356a6f62e4f3c5fbf2602b4771376af22a3b16efa74eb8716fb4e328e01e/MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4", size = 16659 },
- { url = "https://files.pythonhosted.org/packages/69/48/acbf292615c65f0604a0c6fc402ce6d8c991276e16c80c46a8f758fbd30c/MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5", size = 17213 },
- { url = "https://files.pythonhosted.org/packages/11/e7/291e55127bb2ae67c64d66cef01432b5933859dfb7d6949daa721b89d0b3/MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f", size = 18219 },
- { url = "https://files.pythonhosted.org/packages/6b/cb/aed7a284c00dfa7c0682d14df85ad4955a350a21d2e3b06d8240497359bf/MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2", size = 14098 },
- { url = "https://files.pythonhosted.org/packages/1c/cf/35fe557e53709e93feb65575c93927942087e9b97213eabc3fe9d5b25a55/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced", size = 29014 },
- { url = "https://files.pythonhosted.org/packages/97/18/c30da5e7a0e7f4603abfc6780574131221d9148f323752c2755d48abad30/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5", size = 28220 },
- { url = "https://files.pythonhosted.org/packages/0c/40/2e73e7d532d030b1e41180807a80d564eda53babaf04d65e15c1cf897e40/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c", size = 27756 },
- { url = "https://files.pythonhosted.org/packages/18/46/5dca760547e8c59c5311b332f70605d24c99d1303dd9a6e1fc3ed0d73561/MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f", size = 33988 },
- { url = "https://files.pythonhosted.org/packages/6d/c5/27febe918ac36397919cd4a67d5579cbbfa8da027fa1238af6285bb368ea/MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a", size = 32718 },
- { url = "https://files.pythonhosted.org/packages/f8/81/56e567126a2c2bc2684d6391332e357589a96a76cb9f8e5052d85cb0ead8/MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f", size = 33317 },
- { url = "https://files.pythonhosted.org/packages/00/0b/23f4b2470accb53285c613a3ab9ec19dc944eaf53592cb6d9e2af8aa24cc/MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906", size = 16670 },
- { url = "https://files.pythonhosted.org/packages/b7/a2/c78a06a9ec6d04b3445a949615c4c7ed86a0b2eb68e44e7541b9d57067cc/MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617", size = 17224 },
- { url = "https://files.pythonhosted.org/packages/53/bd/583bf3e4c8d6a321938c13f49d44024dbe5ed63e0a7ba127e454a66da974/MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", size = 18215 },
- { url = "https://files.pythonhosted.org/packages/48/d6/e7cd795fc710292c3af3a06d80868ce4b02bfbbf370b7cee11d282815a2a/MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", size = 14069 },
- { url = "https://files.pythonhosted.org/packages/51/b5/5d8ec796e2a08fc814a2c7d2584b55f889a55cf17dd1a90f2beb70744e5c/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", size = 29452 },
- { url = "https://files.pythonhosted.org/packages/0a/0d/2454f072fae3b5a137c119abf15465d1771319dfe9e4acbb31722a0fff91/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", size = 28462 },
- { url = "https://files.pythonhosted.org/packages/2d/75/fd6cb2e68780f72d47e6671840ca517bda5ef663d30ada7616b0462ad1e3/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", size = 27869 },
- { url = "https://files.pythonhosted.org/packages/b0/81/147c477391c2750e8fc7705829f7351cf1cd3be64406edcf900dc633feb2/MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a", size = 33906 },
- { url = "https://files.pythonhosted.org/packages/8b/ff/9a52b71839d7a256b563e85d11050e307121000dcebc97df120176b3ad93/MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f", size = 32296 },
- { url = "https://files.pythonhosted.org/packages/88/07/2dc76aa51b481eb96a4c3198894f38b480490e834479611a4053fbf08623/MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", size = 33038 },
- { url = "https://files.pythonhosted.org/packages/96/0c/620c1fb3661858c0e37eb3cbffd8c6f732a67cd97296f725789679801b31/MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad", size = 16572 },
- { url = "https://files.pythonhosted.org/packages/3f/14/c3554d512d5f9100a95e737502f4a2323a1959f6d0d01e0d0997b35f7b10/MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", size = 17127 },
+version = "3.0.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/04/90/d08277ce111dd22f77149fd1a5d4653eeb3b3eaacbdfcbae5afb2600eebd/MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8", size = 14357 },
+ { url = "https://files.pythonhosted.org/packages/04/e1/6e2194baeae0bca1fae6629dc0cbbb968d4d941469cbab11a3872edff374/MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158", size = 12393 },
+ { url = "https://files.pythonhosted.org/packages/1d/69/35fa85a8ece0a437493dc61ce0bb6d459dcba482c34197e3efc829aa357f/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579", size = 21732 },
+ { url = "https://files.pythonhosted.org/packages/22/35/137da042dfb4720b638d2937c38a9c2df83fe32d20e8c8f3185dbfef05f7/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d", size = 20866 },
+ { url = "https://files.pythonhosted.org/packages/29/28/6d029a903727a1b62edb51863232152fd335d602def598dade38996887f0/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb", size = 20964 },
+ { url = "https://files.pythonhosted.org/packages/cc/cd/07438f95f83e8bc028279909d9c9bd39e24149b0d60053a97b2bc4f8aa51/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b", size = 21977 },
+ { url = "https://files.pythonhosted.org/packages/29/01/84b57395b4cc062f9c4c55ce0df7d3108ca32397299d9df00fedd9117d3d/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c", size = 21366 },
+ { url = "https://files.pythonhosted.org/packages/bd/6e/61ebf08d8940553afff20d1fb1ba7294b6f8d279df9fd0c0db911b4bbcfd/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171", size = 21091 },
+ { url = "https://files.pythonhosted.org/packages/11/23/ffbf53694e8c94ebd1e7e491de185124277964344733c45481f32ede2499/MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50", size = 15065 },
+ { url = "https://files.pythonhosted.org/packages/44/06/e7175d06dd6e9172d4a69a72592cb3f7a996a9c396eee29082826449bbc3/MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a", size = 15514 },
+ { url = "https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", size = 14353 },
+ { url = "https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", size = 12392 },
+ { url = "https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", size = 23984 },
+ { url = "https://files.pythonhosted.org/packages/f1/a4/aefb044a2cd8d7334c8a47d3fb2c9f328ac48cb349468cc31c20b539305f/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", size = 23120 },
+ { url = "https://files.pythonhosted.org/packages/8d/21/5e4851379f88f3fad1de30361db501300d4f07bcad047d3cb0449fc51f8c/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", size = 23032 },
+ { url = "https://files.pythonhosted.org/packages/00/7b/e92c64e079b2d0d7ddf69899c98842f3f9a60a1ae72657c89ce2655c999d/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", size = 24057 },
+ { url = "https://files.pythonhosted.org/packages/f9/ac/46f960ca323037caa0a10662ef97d0a4728e890334fc156b9f9e52bcc4ca/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", size = 23359 },
+ { url = "https://files.pythonhosted.org/packages/69/84/83439e16197337b8b14b6a5b9c2105fff81d42c2a7c5b58ac7b62ee2c3b1/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", size = 23306 },
+ { url = "https://files.pythonhosted.org/packages/9a/34/a15aa69f01e2181ed8d2b685c0d2f6655d5cca2c4db0ddea775e631918cd/MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", size = 15094 },
+ { url = "https://files.pythonhosted.org/packages/da/b8/3a3bd761922d416f3dc5d00bfbed11f66b1ab89a0c2b6e887240a30b0f6b/MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", size = 15521 },
+ { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274 },
+ { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348 },
+ { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149 },
+ { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118 },
+ { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993 },
+ { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178 },
+ { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319 },
+ { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352 },
+ { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097 },
+ { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601 },
+ { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274 },
+ { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352 },
+ { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122 },
+ { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085 },
+ { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978 },
+ { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208 },
+ { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357 },
+ { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344 },
+ { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101 },
+ { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603 },
+ { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510 },
+ { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486 },
+ { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480 },
+ { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914 },
+ { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796 },
+ { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473 },
+ { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114 },
+ { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098 },
+ { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208 },
+ { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739 },
]
[[package]]
@@ -291,7 +323,7 @@ version = "1.6.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "click" },
- { name = "colorama", marker = "platform_system == 'Windows'" },
+ { name = "colorama", marker = "sys_platform == 'win32'" },
{ name = "ghp-import" },
{ name = "jinja2" },
{ name = "markdown" },
@@ -311,16 +343,16 @@ wheels = [
[[package]]
name = "mkdocs-autorefs"
-version = "1.2.0"
+version = "1.3.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "markdown" },
{ name = "markupsafe" },
{ name = "mkdocs" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/fb/ae/0f1154c614d6a8b8a36fff084e5b82af3a15f7d2060cf0dcdb1c53297a71/mkdocs_autorefs-1.2.0.tar.gz", hash = "sha256:a86b93abff653521bda71cf3fc5596342b7a23982093915cb74273f67522190f", size = 40262 }
+sdist = { url = "https://files.pythonhosted.org/packages/fe/18/fb1e17fb705228b51bf7b2f791adaf83c0fa708e51bbc003411ba48ae21e/mkdocs_autorefs-1.3.0.tar.gz", hash = "sha256:6867764c099ace9025d6ac24fd07b85a98335fbd30107ef01053697c8f46db61", size = 42597 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/71/26/4d39d52ea2219604053a4d05b98e90d6a335511cc01806436ec4886b1028/mkdocs_autorefs-1.2.0-py3-none-any.whl", hash = "sha256:d588754ae89bd0ced0c70c06f58566a4ee43471eeeee5202427da7de9ef85a2f", size = 16522 },
+ { url = "https://files.pythonhosted.org/packages/f4/4a/960c441950f98becfa5dd419adab20274939fd575ab848aee2c87e3599ac/mkdocs_autorefs-1.3.0-py3-none-any.whl", hash = "sha256:d180f9778a04e78b7134e31418f238bba56f56d6a8af97873946ff661befffb3", size = 17642 },
]
[[package]]
@@ -339,7 +371,7 @@ wheels = [
[[package]]
name = "mkdocs-material"
-version = "9.5.36"
+version = "9.5.50"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "babel" },
@@ -354,9 +386,9 @@ dependencies = [
{ name = "regex" },
{ name = "requests" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/ae/0c/b11d76836daa8f18ca3dddb0fc2d3b20a7c9e608f6125712ead8a860b15d/mkdocs_material-9.5.36.tar.gz", hash = "sha256:140456f761320f72b399effc073fa3f8aac744c77b0970797c201cae2f6c967f", size = 3994362 }
+sdist = { url = "https://files.pythonhosted.org/packages/c7/16/c48d5a28bc4a67c49808180b6009d4d1b4c0753739ffee3cc37046ab29d7/mkdocs_material-9.5.50.tar.gz", hash = "sha256:ae5fe16f3d7c9ccd05bb6916a7da7420cf99a9ce5e33debd9d40403a090d5825", size = 3923354 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/52/f8/2e9d31e2cbcff5e3864cc1abcb15ae61dc4899446cf451aeac829a8e0641/mkdocs_material-9.5.36-py3-none-any.whl", hash = "sha256:36734c1fd9404bea74236242ba3359b267fc930c7233b9fd086b0898825d0ac9", size = 8698252 },
+ { url = "https://files.pythonhosted.org/packages/ee/b5/1bf29cd744896ae83bd38c72970782c843ba13e0240b1a85277bd3928637/mkdocs_material-9.5.50-py3-none-any.whl", hash = "sha256:f24100f234741f4d423a9d672a909d859668a4f404796be3cf035f10d6050385", size = 8645274 },
]
[[package]]
@@ -370,7 +402,7 @@ wheels = [
[[package]]
name = "mkdocstrings"
-version = "0.26.1"
+version = "0.27.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "click" },
@@ -382,9 +414,9 @@ dependencies = [
{ name = "platformdirs" },
{ name = "pymdown-extensions" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/e6/bf/170ff04de72227f715d67da32950c7b8434449f3805b2ec3dd1085db4d7c/mkdocstrings-0.26.1.tar.gz", hash = "sha256:bb8b8854d6713d5348ad05b069a09f3b79edbc6a0f33a34c6821141adb03fe33", size = 92677 }
+sdist = { url = "https://files.pythonhosted.org/packages/e2/5a/5de70538c2cefae7ac3a15b5601e306ef3717290cb2aab11d51cbbc2d1c0/mkdocstrings-0.27.0.tar.gz", hash = "sha256:16adca6d6b0a1f9e0c07ff0b02ced8e16f228a9d65a37c063ec4c14d7b76a657", size = 94830 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/23/cc/8ba127aaee5d1e9046b0d33fa5b3d17da95a9d705d44902792e0569257fd/mkdocstrings-0.26.1-py3-none-any.whl", hash = "sha256:29738bfb72b4608e8e55cc50fb8a54f325dc7ebd2014e4e3881a49892d5983cf", size = 29643 },
+ { url = "https://files.pythonhosted.org/packages/cd/10/4c27c3063c2b3681a4b7942f8dbdeb4fa34fecb2c19b594e7345ebf4f86f/mkdocstrings-0.27.0-py3-none-any.whl", hash = "sha256:6ceaa7ea830770959b55a16203ac63da24badd71325b96af950e59fd37366332", size = 30658 },
]
[package.optional-dependencies]
@@ -394,45 +426,54 @@ python = [
[[package]]
name = "mkdocstrings-python"
-version = "1.11.1"
+version = "1.13.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "griffe" },
{ name = "mkdocs-autorefs" },
{ name = "mkdocstrings" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/fc/ba/534c934cd0a809f51c91332d6ed278782ee4126b8ba8db02c2003f162b47/mkdocstrings_python-1.11.1.tar.gz", hash = "sha256:8824b115c5359304ab0b5378a91f6202324a849e1da907a3485b59208b797322", size = 166890 }
+sdist = { url = "https://files.pythonhosted.org/packages/ab/ae/32703e35d74040051c672400fd9f5f2b48a6ea094f5071dd8a0e3be35322/mkdocstrings_python-1.13.0.tar.gz", hash = "sha256:2dbd5757e8375b9720e81db16f52f1856bf59905428fd7ef88005d1370e2f64c", size = 185697 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/2f/f2/2a2c48fda645ac6bbe73bcc974587a579092b6868e6ff8bc6d177f4db38a/mkdocstrings_python-1.11.1-py3-none-any.whl", hash = "sha256:a21a1c05acef129a618517bb5aae3e33114f569b11588b1e7af3e9d4061a71af", size = 109297 },
+ { url = "https://files.pythonhosted.org/packages/51/23/d02d86553327296c3bf369d444194ea83410cce8f0e690565264f37f3261/mkdocstrings_python-1.13.0-py3-none-any.whl", hash = "sha256:b88bbb207bab4086434743849f8e796788b373bd32e7bfefbf8560ac45d88f97", size = 112254 },
]
[[package]]
name = "mypy"
-version = "1.11.2"
+version = "1.14.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "mypy-extensions" },
{ name = "tomli", marker = "python_full_version < '3.11'" },
{ name = "typing-extensions" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/5c/86/5d7cbc4974fd564550b80fbb8103c05501ea11aa7835edf3351d90095896/mypy-1.11.2.tar.gz", hash = "sha256:7f9993ad3e0ffdc95c2a14b66dee63729f021968bff8ad911867579c65d13a79", size = 3078806 }
+sdist = { url = "https://files.pythonhosted.org/packages/b9/eb/2c92d8ea1e684440f54fa49ac5d9a5f19967b7b472a281f419e69a8d228e/mypy-1.14.1.tar.gz", hash = "sha256:7ec88144fe9b510e8475ec2f5f251992690fcf89ccb4500b214b4226abcd32d6", size = 3216051 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/78/cd/815368cd83c3a31873e5e55b317551500b12f2d1d7549720632f32630333/mypy-1.11.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d42a6dd818ffce7be66cce644f1dff482f1d97c53ca70908dff0b9ddc120b77a", size = 10939401 },
- { url = "https://files.pythonhosted.org/packages/f1/27/e18c93a195d2fad75eb96e1f1cbc431842c332e8eba2e2b77eaf7313c6b7/mypy-1.11.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:801780c56d1cdb896eacd5619a83e427ce436d86a3bdf9112527f24a66618fef", size = 10111697 },
- { url = "https://files.pythonhosted.org/packages/dc/08/cdc1fc6d0d5a67d354741344cc4aa7d53f7128902ebcbe699ddd4f15a61c/mypy-1.11.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41ea707d036a5307ac674ea172875f40c9d55c5394f888b168033177fce47383", size = 12500508 },
- { url = "https://files.pythonhosted.org/packages/64/12/aad3af008c92c2d5d0720ea3b6674ba94a98cdb86888d389acdb5f218c30/mypy-1.11.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6e658bd2d20565ea86da7d91331b0eed6d2eee22dc031579e6297f3e12c758c8", size = 13020712 },
- { url = "https://files.pythonhosted.org/packages/03/e6/a7d97cc124a565be5e9b7d5c2a6ebf082379ffba99646e4863ed5bbcb3c3/mypy-1.11.2-cp310-cp310-win_amd64.whl", hash = "sha256:478db5f5036817fe45adb7332d927daa62417159d49783041338921dcf646fc7", size = 9567319 },
- { url = "https://files.pythonhosted.org/packages/e2/aa/cc56fb53ebe14c64f1fe91d32d838d6f4db948b9494e200d2f61b820b85d/mypy-1.11.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:75746e06d5fa1e91bfd5432448d00d34593b52e7e91a187d981d08d1f33d4385", size = 10859630 },
- { url = "https://files.pythonhosted.org/packages/04/c8/b19a760fab491c22c51975cf74e3d253b8c8ce2be7afaa2490fbf95a8c59/mypy-1.11.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a976775ab2256aadc6add633d44f100a2517d2388906ec4f13231fafbb0eccca", size = 10037973 },
- { url = "https://files.pythonhosted.org/packages/88/57/7e7e39f2619c8f74a22efb9a4c4eff32b09d3798335625a124436d121d89/mypy-1.11.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cd953f221ac1379050a8a646585a29574488974f79d8082cedef62744f0a0104", size = 12416659 },
- { url = "https://files.pythonhosted.org/packages/fc/a6/37f7544666b63a27e46c48f49caeee388bf3ce95f9c570eb5cfba5234405/mypy-1.11.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:57555a7715c0a34421013144a33d280e73c08df70f3a18a552938587ce9274f4", size = 12897010 },
- { url = "https://files.pythonhosted.org/packages/84/8b/459a513badc4d34acb31c736a0101c22d2bd0697b969796ad93294165cfb/mypy-1.11.2-cp311-cp311-win_amd64.whl", hash = "sha256:36383a4fcbad95f2657642a07ba22ff797de26277158f1cc7bd234821468b1b6", size = 9562873 },
- { url = "https://files.pythonhosted.org/packages/35/3a/ed7b12ecc3f6db2f664ccf85cb2e004d3e90bec928e9d7be6aa2f16b7cdf/mypy-1.11.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e8960dbbbf36906c5c0b7f4fbf2f0c7ffb20f4898e6a879fcf56a41a08b0d318", size = 10990335 },
- { url = "https://files.pythonhosted.org/packages/04/e4/1a9051e2ef10296d206519f1df13d2cc896aea39e8683302f89bf5792a59/mypy-1.11.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:06d26c277962f3fb50e13044674aa10553981ae514288cb7d0a738f495550b36", size = 10007119 },
- { url = "https://files.pythonhosted.org/packages/f3/3c/350a9da895f8a7e87ade0028b962be0252d152e0c2fbaafa6f0658b4d0d4/mypy-1.11.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6e7184632d89d677973a14d00ae4d03214c8bc301ceefcdaf5c474866814c987", size = 12506856 },
- { url = "https://files.pythonhosted.org/packages/b6/49/ee5adf6a49ff13f4202d949544d3d08abb0ea1f3e7f2a6d5b4c10ba0360a/mypy-1.11.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3a66169b92452f72117e2da3a576087025449018afc2d8e9bfe5ffab865709ca", size = 12952066 },
- { url = "https://files.pythonhosted.org/packages/27/c0/b19d709a42b24004d720db37446a42abadf844d5c46a2c442e2a074d70d9/mypy-1.11.2-cp312-cp312-win_amd64.whl", hash = "sha256:969ea3ef09617aff826885a22ece0ddef69d95852cdad2f60c8bb06bf1f71f70", size = 9664000 },
- { url = "https://files.pythonhosted.org/packages/42/3a/bdf730640ac523229dd6578e8a581795720a9321399de494374afc437ec5/mypy-1.11.2-py3-none-any.whl", hash = "sha256:b499bc07dbdcd3de92b0a8b29fdf592c111276f6a12fe29c30f6c417dd546d12", size = 2619625 },
+ { url = "https://files.pythonhosted.org/packages/9b/7a/87ae2adb31d68402da6da1e5f30c07ea6063e9f09b5e7cfc9dfa44075e74/mypy-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:52686e37cf13d559f668aa398dd7ddf1f92c5d613e4f8cb262be2fb4fedb0fcb", size = 11211002 },
+ { url = "https://files.pythonhosted.org/packages/e1/23/eada4c38608b444618a132be0d199b280049ded278b24cbb9d3fc59658e4/mypy-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1fb545ca340537d4b45d3eecdb3def05e913299ca72c290326be19b3804b39c0", size = 10358400 },
+ { url = "https://files.pythonhosted.org/packages/43/c9/d6785c6f66241c62fd2992b05057f404237deaad1566545e9f144ced07f5/mypy-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:90716d8b2d1f4cd503309788e51366f07c56635a3309b0f6a32547eaaa36a64d", size = 12095172 },
+ { url = "https://files.pythonhosted.org/packages/c3/62/daa7e787770c83c52ce2aaf1a111eae5893de9e004743f51bfcad9e487ec/mypy-1.14.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ae753f5c9fef278bcf12e1a564351764f2a6da579d4a81347e1d5a15819997b", size = 12828732 },
+ { url = "https://files.pythonhosted.org/packages/1b/a2/5fb18318a3637f29f16f4e41340b795da14f4751ef4f51c99ff39ab62e52/mypy-1.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e0fe0f5feaafcb04505bcf439e991c6d8f1bf8b15f12b05feeed96e9e7bf1427", size = 13012197 },
+ { url = "https://files.pythonhosted.org/packages/28/99/e153ce39105d164b5f02c06c35c7ba958aaff50a2babba7d080988b03fe7/mypy-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:7d54bd85b925e501c555a3227f3ec0cfc54ee8b6930bd6141ec872d1c572f81f", size = 9780836 },
+ { url = "https://files.pythonhosted.org/packages/da/11/a9422850fd506edbcdc7f6090682ecceaf1f87b9dd847f9df79942da8506/mypy-1.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f995e511de847791c3b11ed90084a7a0aafdc074ab88c5a9711622fe4751138c", size = 11120432 },
+ { url = "https://files.pythonhosted.org/packages/b6/9e/47e450fd39078d9c02d620545b2cb37993a8a8bdf7db3652ace2f80521ca/mypy-1.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d64169ec3b8461311f8ce2fd2eb5d33e2d0f2c7b49116259c51d0d96edee48d1", size = 10279515 },
+ { url = "https://files.pythonhosted.org/packages/01/b5/6c8d33bd0f851a7692a8bfe4ee75eb82b6983a3cf39e5e32a5d2a723f0c1/mypy-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba24549de7b89b6381b91fbc068d798192b1b5201987070319889e93038967a8", size = 12025791 },
+ { url = "https://files.pythonhosted.org/packages/f0/4c/e10e2c46ea37cab5c471d0ddaaa9a434dc1d28650078ac1b56c2d7b9b2e4/mypy-1.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:183cf0a45457d28ff9d758730cd0210419ac27d4d3f285beda038c9083363b1f", size = 12749203 },
+ { url = "https://files.pythonhosted.org/packages/88/55/beacb0c69beab2153a0f57671ec07861d27d735a0faff135a494cd4f5020/mypy-1.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f2a0ecc86378f45347f586e4163d1769dd81c5a223d577fe351f26b179e148b1", size = 12885900 },
+ { url = "https://files.pythonhosted.org/packages/a2/75/8c93ff7f315c4d086a2dfcde02f713004357d70a163eddb6c56a6a5eff40/mypy-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:ad3301ebebec9e8ee7135d8e3109ca76c23752bac1e717bc84cd3836b4bf3eae", size = 9777869 },
+ { url = "https://files.pythonhosted.org/packages/43/1b/b38c079609bb4627905b74fc6a49849835acf68547ac33d8ceb707de5f52/mypy-1.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:30ff5ef8519bbc2e18b3b54521ec319513a26f1bba19a7582e7b1f58a6e69f14", size = 11266668 },
+ { url = "https://files.pythonhosted.org/packages/6b/75/2ed0d2964c1ffc9971c729f7a544e9cd34b2cdabbe2d11afd148d7838aa2/mypy-1.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cb9f255c18052343c70234907e2e532bc7e55a62565d64536dbc7706a20b78b9", size = 10254060 },
+ { url = "https://files.pythonhosted.org/packages/a1/5f/7b8051552d4da3c51bbe8fcafffd76a6823779101a2b198d80886cd8f08e/mypy-1.14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b4e3413e0bddea671012b063e27591b953d653209e7a4fa5e48759cda77ca11", size = 11933167 },
+ { url = "https://files.pythonhosted.org/packages/04/90/f53971d3ac39d8b68bbaab9a4c6c58c8caa4d5fd3d587d16f5927eeeabe1/mypy-1.14.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:553c293b1fbdebb6c3c4030589dab9fafb6dfa768995a453d8a5d3b23784af2e", size = 12864341 },
+ { url = "https://files.pythonhosted.org/packages/03/d2/8bc0aeaaf2e88c977db41583559319f1821c069e943ada2701e86d0430b7/mypy-1.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fad79bfe3b65fe6a1efaed97b445c3d37f7be9fdc348bdb2d7cac75579607c89", size = 12972991 },
+ { url = "https://files.pythonhosted.org/packages/6f/17/07815114b903b49b0f2cf7499f1c130e5aa459411596668267535fe9243c/mypy-1.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:8fa2220e54d2946e94ab6dbb3ba0a992795bd68b16dc852db33028df2b00191b", size = 9879016 },
+ { url = "https://files.pythonhosted.org/packages/9e/15/bb6a686901f59222275ab228453de741185f9d54fecbaacec041679496c6/mypy-1.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:92c3ed5afb06c3a8e188cb5da4984cab9ec9a77ba956ee419c68a388b4595255", size = 11252097 },
+ { url = "https://files.pythonhosted.org/packages/f8/b3/8b0f74dfd072c802b7fa368829defdf3ee1566ba74c32a2cb2403f68024c/mypy-1.14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dbec574648b3e25f43d23577309b16534431db4ddc09fda50841f1e34e64ed34", size = 10239728 },
+ { url = "https://files.pythonhosted.org/packages/c5/9b/4fd95ab20c52bb5b8c03cc49169be5905d931de17edfe4d9d2986800b52e/mypy-1.14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8c6d94b16d62eb3e947281aa7347d78236688e21081f11de976376cf010eb31a", size = 11924965 },
+ { url = "https://files.pythonhosted.org/packages/56/9d/4a236b9c57f5d8f08ed346914b3f091a62dd7e19336b2b2a0d85485f82ff/mypy-1.14.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d4b19b03fdf54f3c5b2fa474c56b4c13c9dbfb9a2db4370ede7ec11a2c5927d9", size = 12867660 },
+ { url = "https://files.pythonhosted.org/packages/40/88/a61a5497e2f68d9027de2bb139c7bb9abaeb1be1584649fa9d807f80a338/mypy-1.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0c911fde686394753fff899c409fd4e16e9b294c24bfd5e1ea4675deae1ac6fd", size = 12969198 },
+ { url = "https://files.pythonhosted.org/packages/54/da/3d6fc5d92d324701b0c23fb413c853892bfe0e1dbe06c9138037d459756b/mypy-1.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:8b21525cb51671219f5307be85f7e646a153e5acc656e5cebf64bfa076c50107", size = 9885276 },
+ { url = "https://files.pythonhosted.org/packages/a0/b5/32dd67b69a16d088e533962e5044e51004176a9952419de0370cdaead0f8/mypy-1.14.1-py3-none-any.whl", hash = "sha256:b66a60cc4073aeb8ae00057f9c1f64d49e90f918fbcef9a977eb121da8b8f1d1", size = 2752905 },
]
[[package]]
@@ -455,7 +496,7 @@ wheels = [
[[package]]
name = "nzb"
-version = "0.2.2"
+version = "0.3.0"
source = { editable = "." }
dependencies = [
{ name = "natsort" },
@@ -465,16 +506,33 @@ dependencies = [
[package.dev-dependencies]
dev = [
- { name = "coverage" },
+ { name = "coverage", extra = ["toml"] },
{ name = "mkdocs-autorefs" },
{ name = "mkdocs-material" },
{ name = "mkdocstrings", extra = ["python"] },
{ name = "mypy" },
{ name = "pytest" },
+ { name = "rnzb" },
+ { name = "ruff" },
+ { name = "types-xmltodict" },
+ { name = "typing-extensions" },
+]
+docs = [
+ { name = "mkdocs-autorefs" },
+ { name = "mkdocs-material" },
+ { name = "mkdocstrings", extra = ["python"] },
+]
+lint = [
+ { name = "mypy" },
{ name = "ruff" },
{ name = "types-xmltodict" },
{ name = "typing-extensions" },
]
+test = [
+ { name = "coverage", extra = ["toml"] },
+ { name = "pytest" },
+ { name = "rnzb" },
+]
[package.metadata]
requires-dist = [
@@ -485,24 +543,41 @@ requires-dist = [
[package.metadata.requires-dev]
dev = [
- { name = "coverage", specifier = ">=7.6.1" },
- { name = "mkdocs-autorefs", specifier = ">=1.2.0" },
- { name = "mkdocs-material", specifier = ">=9.5.36" },
- { name = "mkdocstrings", extras = ["python"], specifier = ">=0.26.1" },
- { name = "mypy", specifier = ">=1.11.2" },
- { name = "pytest", specifier = ">=8.3.3" },
- { name = "ruff", specifier = ">=0.6.7" },
- { name = "types-xmltodict", specifier = ">=0.13.0.3" },
+ { name = "coverage", extras = ["toml"], specifier = ">=7.6.10" },
+ { name = "mkdocs-autorefs", specifier = ">=1.3.0" },
+ { name = "mkdocs-material", specifier = ">=9.5.50" },
+ { name = "mkdocstrings", extras = ["python"], specifier = ">=0.27.0" },
+ { name = "mypy", specifier = ">=1.14.1" },
+ { name = "pytest", specifier = ">=8.3.4" },
+ { name = "rnzb", specifier = ">=0.3.1" },
+ { name = "ruff", specifier = ">=0.9.3" },
+ { name = "types-xmltodict", specifier = ">=0.14.0.20241009" },
{ name = "typing-extensions", specifier = ">=4.12.2" },
]
+docs = [
+ { name = "mkdocs-autorefs", specifier = ">=1.3.0" },
+ { name = "mkdocs-material", specifier = ">=9.5.50" },
+ { name = "mkdocstrings", extras = ["python"], specifier = ">=0.27.0" },
+]
+lint = [
+ { name = "mypy", specifier = ">=1.14.1" },
+ { name = "ruff", specifier = ">=0.9.3" },
+ { name = "types-xmltodict", specifier = ">=0.14.0.20241009" },
+ { name = "typing-extensions", specifier = ">=4.12.2" },
+]
+test = [
+ { name = "coverage", extras = ["toml"], specifier = ">=7.6.10" },
+ { name = "pytest", specifier = ">=8.3.4" },
+ { name = "rnzb", specifier = ">=0.3.1" },
+]
[[package]]
name = "packaging"
-version = "24.1"
+version = "24.2"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/51/65/50db4dda066951078f0a96cf12f4b9ada6e4b811516bf0262c0f4f7064d4/packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", size = 148788 }
+sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/08/aa/cc0199a5f0ad350994d660967a8efb233fe0416e4639146c089643407ce6/packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124", size = 53985 },
+ { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 },
]
[[package]]
@@ -624,29 +699,29 @@ wheels = [
[[package]]
name = "pygments"
-version = "2.18.0"
+version = "2.19.1"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/8e/62/8336eff65bcbc8e4cb5d05b55faf041285951b6e80f33e2bff2024788f31/pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199", size = 4891905 }
+sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a", size = 1205513 },
+ { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 },
]
[[package]]
name = "pymdown-extensions"
-version = "10.10.1"
+version = "10.14.2"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "markdown" },
{ name = "pyyaml" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/d7/e6/51b83b93b74014ebc415f26de4b60320ccdb4802b6d6e37d4b4070619e20/pymdown_extensions-10.10.1.tar.gz", hash = "sha256:ad277ee4739ced051c3b6328d22ce782358a3bec39bc6ca52815ccbf44f7acdc", size = 828448 }
+sdist = { url = "https://files.pythonhosted.org/packages/aa/7b/de388047c577e43dc45ce35c23b9b349ec3df8c7023c3e3c4d413a850982/pymdown_extensions-10.14.2.tar.gz", hash = "sha256:7a77b8116dc04193f2c01143760a43387bd9dc4aa05efacb7d838885a7791253", size = 846777 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/f5/08/56121d5a6746c192172766c18be90c790018b632ff94598ad3fa39935b73/pymdown_extensions-10.10.1-py3-none-any.whl", hash = "sha256:6c74ea6c2e2285186a241417480fc2d3cc52941b3ec2dced4014c84dc78c5493", size = 258809 },
+ { url = "https://files.pythonhosted.org/packages/e7/a3/61527d80d84e9fd4d97649322e83bd7efde8200fc07fe34469c8c2bd0d91/pymdown_extensions-10.14.2-py3-none-any.whl", hash = "sha256:f45bc5892410e54fd738ab8ccd736098b7ff0cb27fdb4bf24d0a0c6584bc90e1", size = 264459 },
]
[[package]]
name = "pytest"
-version = "8.3.3"
+version = "8.3.4"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "colorama", marker = "sys_platform == 'win32'" },
@@ -656,9 +731,9 @@ dependencies = [
{ name = "pluggy" },
{ name = "tomli", marker = "python_full_version < '3.11'" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/8b/6c/62bbd536103af674e227c41a8f3dcd022d591f6eed5facb5a0f31ee33bbc/pytest-8.3.3.tar.gz", hash = "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181", size = 1442487 }
+sdist = { url = "https://files.pythonhosted.org/packages/05/35/30e0d83068951d90a01852cb1cef56e5d8a09d20c7f511634cc2f7e0372a/pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761", size = 1445919 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/6b/77/7440a06a8ead44c7757a64362dd22df5760f9b12dc5f11b6188cd2fc27a0/pytest-8.3.3-py3-none-any.whl", hash = "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2", size = 342341 },
+ { url = "https://files.pythonhosted.org/packages/11/92/76a1c94d3afee238333bc0a42b82935dd8f9cf8ce9e336ff87ee14d9e1cf/pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6", size = 343083 },
]
[[package]]
@@ -731,71 +806,71 @@ wheels = [
[[package]]
name = "regex"
-version = "2024.9.11"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/f9/38/148df33b4dbca3bd069b963acab5e0fa1a9dbd6820f8c322d0dd6faeff96/regex-2024.9.11.tar.gz", hash = "sha256:6c188c307e8433bcb63dc1915022deb553b4203a70722fc542c363bf120a01fd", size = 399403 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/63/12/497bd6599ce8a239ade68678132296aec5ee25ebea45fc8ba91aa60fceec/regex-2024.9.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1494fa8725c285a81d01dc8c06b55287a1ee5e0e382d8413adc0a9197aac6408", size = 482488 },
- { url = "https://files.pythonhosted.org/packages/c1/24/595ddb9bec2a9b151cdaf9565b0c9f3da9f0cb1dca6c158bc5175332ddf8/regex-2024.9.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0e12c481ad92d129c78f13a2a3662317e46ee7ef96c94fd332e1c29131875b7d", size = 287443 },
- { url = "https://files.pythonhosted.org/packages/69/a8/b2fb45d9715b1469383a0da7968f8cacc2f83e9fbbcd6b8713752dd980a6/regex-2024.9.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:16e13a7929791ac1216afde26f712802e3df7bf0360b32e4914dca3ab8baeea5", size = 284561 },
- { url = "https://files.pythonhosted.org/packages/88/87/1ce4a5357216b19b7055e7d3b0efc75a6e426133bf1e7d094321df514257/regex-2024.9.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46989629904bad940bbec2106528140a218b4a36bb3042d8406980be1941429c", size = 783177 },
- { url = "https://files.pythonhosted.org/packages/3c/65/b9f002ab32f7b68e7d1dcabb67926f3f47325b8dbc22cc50b6a043e1d07c/regex-2024.9.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a906ed5e47a0ce5f04b2c981af1c9acf9e8696066900bf03b9d7879a6f679fc8", size = 823193 },
- { url = "https://files.pythonhosted.org/packages/22/91/8339dd3abce101204d246e31bc26cdd7ec07c9f91598472459a3a902aa41/regex-2024.9.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a091b0550b3b0207784a7d6d0f1a00d1d1c8a11699c1a4d93db3fbefc3ad35", size = 809950 },
- { url = "https://files.pythonhosted.org/packages/cb/19/556638aa11c2ec9968a1da998f07f27ec0abb9bf3c647d7c7985ca0b8eea/regex-2024.9.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ddcd9a179c0a6fa8add279a4444015acddcd7f232a49071ae57fa6e278f1f71", size = 782661 },
- { url = "https://files.pythonhosted.org/packages/d1/e9/7a5bc4c6ef8d9cd2bdd83a667888fc35320da96a4cc4da5fa084330f53db/regex-2024.9.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6b41e1adc61fa347662b09398e31ad446afadff932a24807d3ceb955ed865cc8", size = 772348 },
- { url = "https://files.pythonhosted.org/packages/f1/0b/29f2105bfac3ed08e704914c38e93b07c784a6655f8a015297ee7173e95b/regex-2024.9.11-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ced479f601cd2f8ca1fd7b23925a7e0ad512a56d6e9476f79b8f381d9d37090a", size = 697460 },
- { url = "https://files.pythonhosted.org/packages/71/3a/52ff61054d15a4722605f5872ad03962b319a04c1ebaebe570b8b9b7dde1/regex-2024.9.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:635a1d96665f84b292e401c3d62775851aedc31d4f8784117b3c68c4fcd4118d", size = 769151 },
- { url = "https://files.pythonhosted.org/packages/97/07/37e460ab5ca84be8e1e197c3b526c5c86993dcc9e13cbc805c35fc2463c1/regex-2024.9.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c0256beda696edcf7d97ef16b2a33a8e5a875affd6fa6567b54f7c577b30a137", size = 777478 },
- { url = "https://files.pythonhosted.org/packages/65/7b/953075723dd5ab00780043ac2f9de667306ff9e2a85332975e9f19279174/regex-2024.9.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:3ce4f1185db3fbde8ed8aa223fc9620f276c58de8b0d4f8cc86fd1360829edb6", size = 845373 },
- { url = "https://files.pythonhosted.org/packages/40/b8/3e9484c6230b8b6e8f816ab7c9a080e631124991a4ae2c27a81631777db0/regex-2024.9.11-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:09d77559e80dcc9d24570da3745ab859a9cf91953062e4ab126ba9d5993688ca", size = 845369 },
- { url = "https://files.pythonhosted.org/packages/b7/99/38434984d912edbd2e1969d116257e869578f67461bd7462b894c45ed874/regex-2024.9.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7a22ccefd4db3f12b526eccb129390942fe874a3a9fdbdd24cf55773a1faab1a", size = 773935 },
- { url = "https://files.pythonhosted.org/packages/ab/67/43174d2b46fa947b7b9dfe56b6c8a8a76d44223f35b1d64645a732fd1d6f/regex-2024.9.11-cp310-cp310-win32.whl", hash = "sha256:f745ec09bc1b0bd15cfc73df6fa4f726dcc26bb16c23a03f9e3367d357eeedd0", size = 261624 },
- { url = "https://files.pythonhosted.org/packages/c4/2a/4f9c47d9395b6aff24874c761d8d620c0232f97c43ef3cf668c8b355e7a7/regex-2024.9.11-cp310-cp310-win_amd64.whl", hash = "sha256:01c2acb51f8a7d6494c8c5eafe3d8e06d76563d8a8a4643b37e9b2dd8a2ff623", size = 274020 },
- { url = "https://files.pythonhosted.org/packages/86/a1/d526b7b6095a0019aa360948c143aacfeb029919c898701ce7763bbe4c15/regex-2024.9.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2cce2449e5927a0bf084d346da6cd5eb016b2beca10d0013ab50e3c226ffc0df", size = 482483 },
- { url = "https://files.pythonhosted.org/packages/32/d9/bfdd153179867c275719e381e1e8e84a97bd186740456a0dcb3e7125c205/regex-2024.9.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b37fa423beefa44919e009745ccbf353d8c981516e807995b2bd11c2c77d268", size = 287442 },
- { url = "https://files.pythonhosted.org/packages/33/c4/60f3370735135e3a8d673ddcdb2507a8560d0e759e1398d366e43d000253/regex-2024.9.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:64ce2799bd75039b480cc0360907c4fb2f50022f030bf9e7a8705b636e408fad", size = 284561 },
- { url = "https://files.pythonhosted.org/packages/b1/51/91a5ebdff17f9ec4973cb0aa9d37635efec1c6868654bbc25d1543aca4ec/regex-2024.9.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4cc92bb6db56ab0c1cbd17294e14f5e9224f0cc6521167ef388332604e92679", size = 791779 },
- { url = "https://files.pythonhosted.org/packages/07/4a/022c5e6f0891a90cd7eb3d664d6c58ce2aba48bff107b00013f3d6167069/regex-2024.9.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d05ac6fa06959c4172eccd99a222e1fbf17b5670c4d596cb1e5cde99600674c4", size = 832605 },
- { url = "https://files.pythonhosted.org/packages/ac/1c/3793990c8c83ca04e018151ddda83b83ecc41d89964f0f17749f027fc44d/regex-2024.9.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:040562757795eeea356394a7fb13076ad4f99d3c62ab0f8bdfb21f99a1f85664", size = 818556 },
- { url = "https://files.pythonhosted.org/packages/e9/5c/8b385afbfacb853730682c57be56225f9fe275c5bf02ac1fc88edbff316d/regex-2024.9.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6113c008a7780792efc80f9dfe10ba0cd043cbf8dc9a76ef757850f51b4edc50", size = 792808 },
- { url = "https://files.pythonhosted.org/packages/9b/8b/a4723a838b53c771e9240951adde6af58c829fb6a6a28f554e8131f53839/regex-2024.9.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e5fb5f77c8745a60105403a774fe2c1759b71d3e7b4ca237a5e67ad066c7199", size = 781115 },
- { url = "https://files.pythonhosted.org/packages/83/5f/031a04b6017033d65b261259c09043c06f4ef2d4eac841d0649d76d69541/regex-2024.9.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:54d9ff35d4515debf14bc27f1e3b38bfc453eff3220f5bce159642fa762fe5d4", size = 778155 },
- { url = "https://files.pythonhosted.org/packages/fd/cd/4660756070b03ce4a66663a43f6c6e7ebc2266cc6b4c586c167917185eb4/regex-2024.9.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:df5cbb1fbc74a8305b6065d4ade43b993be03dbe0f8b30032cced0d7740994bd", size = 784614 },
- { url = "https://files.pythonhosted.org/packages/93/8d/65b9bea7df120a7be8337c415b6d256ba786cbc9107cebba3bf8ff09da99/regex-2024.9.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7fb89ee5d106e4a7a51bce305ac4efb981536301895f7bdcf93ec92ae0d91c7f", size = 853744 },
- { url = "https://files.pythonhosted.org/packages/96/a7/fba1eae75eb53a704475baf11bd44b3e6ccb95b316955027eb7748f24ef8/regex-2024.9.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a738b937d512b30bf75995c0159c0ddf9eec0775c9d72ac0202076c72f24aa96", size = 855890 },
- { url = "https://files.pythonhosted.org/packages/45/14/d864b2db80a1a3358534392373e8a281d95b28c29c87d8548aed58813910/regex-2024.9.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e28f9faeb14b6f23ac55bfbbfd3643f5c7c18ede093977f1df249f73fd22c7b1", size = 781887 },
- { url = "https://files.pythonhosted.org/packages/4d/a9/bfb29b3de3eb11dc9b412603437023b8e6c02fb4e11311863d9bf62c403a/regex-2024.9.11-cp311-cp311-win32.whl", hash = "sha256:18e707ce6c92d7282dfce370cd205098384b8ee21544e7cb29b8aab955b66fa9", size = 261644 },
- { url = "https://files.pythonhosted.org/packages/c7/ab/1ad2511cf6a208fde57fafe49829cab8ca018128ab0d0b48973d8218634a/regex-2024.9.11-cp311-cp311-win_amd64.whl", hash = "sha256:313ea15e5ff2a8cbbad96ccef6be638393041b0a7863183c2d31e0c6116688cf", size = 274033 },
- { url = "https://files.pythonhosted.org/packages/6e/92/407531450762bed778eedbde04407f68cbd75d13cee96c6f8d6903d9c6c1/regex-2024.9.11-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b0d0a6c64fcc4ef9c69bd5b3b3626cc3776520a1637d8abaa62b9edc147a58f7", size = 483590 },
- { url = "https://files.pythonhosted.org/packages/8e/a2/048acbc5ae1f615adc6cba36cc45734e679b5f1e4e58c3c77f0ed611d4e2/regex-2024.9.11-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:49b0e06786ea663f933f3710a51e9385ce0cba0ea56b67107fd841a55d56a231", size = 288175 },
- { url = "https://files.pythonhosted.org/packages/8a/ea/909d8620329ab710dfaf7b4adee41242ab7c9b95ea8d838e9bfe76244259/regex-2024.9.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5b513b6997a0b2f10e4fd3a1313568e373926e8c252bd76c960f96fd039cd28d", size = 284749 },
- { url = "https://files.pythonhosted.org/packages/ca/fa/521eb683b916389b4975337873e66954e0f6d8f91bd5774164a57b503185/regex-2024.9.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee439691d8c23e76f9802c42a95cfeebf9d47cf4ffd06f18489122dbb0a7ad64", size = 795181 },
- { url = "https://files.pythonhosted.org/packages/28/db/63047feddc3280cc242f9c74f7aeddc6ee662b1835f00046f57d5630c827/regex-2024.9.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8f877c89719d759e52783f7fe6e1c67121076b87b40542966c02de5503ace42", size = 835842 },
- { url = "https://files.pythonhosted.org/packages/e3/94/86adc259ff8ec26edf35fcca7e334566c1805c7493b192cb09679f9c3dee/regex-2024.9.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23b30c62d0f16827f2ae9f2bb87619bc4fba2044911e2e6c2eb1af0161cdb766", size = 823533 },
- { url = "https://files.pythonhosted.org/packages/29/52/84662b6636061277cb857f658518aa7db6672bc6d1a3f503ccd5aefc581e/regex-2024.9.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85ab7824093d8f10d44330fe1e6493f756f252d145323dd17ab6b48733ff6c0a", size = 797037 },
- { url = "https://files.pythonhosted.org/packages/c3/2a/cd4675dd987e4a7505f0364a958bc41f3b84942de9efaad0ef9a2646681c/regex-2024.9.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8dee5b4810a89447151999428fe096977346cf2f29f4d5e29609d2e19e0199c9", size = 784106 },
- { url = "https://files.pythonhosted.org/packages/6f/75/3ea7ec29de0bbf42f21f812f48781d41e627d57a634f3f23947c9a46e303/regex-2024.9.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98eeee2f2e63edae2181c886d7911ce502e1292794f4c5ee71e60e23e8d26b5d", size = 782468 },
- { url = "https://files.pythonhosted.org/packages/d3/67/15519d69b52c252b270e679cb578e22e0c02b8dd4e361f2b04efcc7f2335/regex-2024.9.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:57fdd2e0b2694ce6fc2e5ccf189789c3e2962916fb38779d3e3521ff8fe7a822", size = 790324 },
- { url = "https://files.pythonhosted.org/packages/9c/71/eff77d3fe7ba08ab0672920059ec30d63fa7e41aa0fb61c562726e9bd721/regex-2024.9.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d552c78411f60b1fdaafd117a1fca2f02e562e309223b9d44b7de8be451ec5e0", size = 860214 },
- { url = "https://files.pythonhosted.org/packages/81/11/e1bdf84a72372e56f1ea4b833dd583b822a23138a616ace7ab57a0e11556/regex-2024.9.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a0b2b80321c2ed3fcf0385ec9e51a12253c50f146fddb2abbb10f033fe3d049a", size = 859420 },
- { url = "https://files.pythonhosted.org/packages/ea/75/9753e9dcebfa7c3645563ef5c8a58f3a47e799c872165f37c55737dadd3e/regex-2024.9.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:18406efb2f5a0e57e3a5881cd9354c1512d3bb4f5c45d96d110a66114d84d23a", size = 787333 },
- { url = "https://files.pythonhosted.org/packages/bc/4e/ba1cbca93141f7416624b3ae63573e785d4bc1834c8be44a8f0747919eca/regex-2024.9.11-cp312-cp312-win32.whl", hash = "sha256:e464b467f1588e2c42d26814231edecbcfe77f5ac414d92cbf4e7b55b2c2a776", size = 262058 },
- { url = "https://files.pythonhosted.org/packages/6e/16/efc5f194778bf43e5888209e5cec4b258005d37c613b67ae137df3b89c53/regex-2024.9.11-cp312-cp312-win_amd64.whl", hash = "sha256:9e8719792ca63c6b8340380352c24dcb8cd7ec49dae36e963742a275dfae6009", size = 273526 },
- { url = "https://files.pythonhosted.org/packages/93/0a/d1c6b9af1ff1e36832fe38d74d5c5bab913f2bdcbbd6bc0e7f3ce8b2f577/regex-2024.9.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c157bb447303070f256e084668b702073db99bbb61d44f85d811025fcf38f784", size = 483376 },
- { url = "https://files.pythonhosted.org/packages/a4/42/5910a050c105d7f750a72dcb49c30220c3ae4e2654e54aaaa0e9bc0584cb/regex-2024.9.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4db21ece84dfeefc5d8a3863f101995de646c6cb0536952c321a2650aa202c36", size = 288112 },
- { url = "https://files.pythonhosted.org/packages/8d/56/0c262aff0e9224fa7ffce47b5458d373f4d3e3ff84e99b5ff0cb15e0b5b2/regex-2024.9.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:220e92a30b426daf23bb67a7962900ed4613589bab80382be09b48896d211e92", size = 284608 },
- { url = "https://files.pythonhosted.org/packages/b9/54/9fe8f9aec5007bbbbce28ba3d2e3eaca425f95387b7d1e84f0d137d25237/regex-2024.9.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb1ae19e64c14c7ec1995f40bd932448713d3c73509e82d8cd7744dc00e29e86", size = 795337 },
- { url = "https://files.pythonhosted.org/packages/b2/e7/6b2f642c3cded271c4f16cc4daa7231be544d30fe2b168e0223724b49a61/regex-2024.9.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f47cd43a5bfa48f86925fe26fbdd0a488ff15b62468abb5d2a1e092a4fb10e85", size = 835848 },
- { url = "https://files.pythonhosted.org/packages/cd/9e/187363bdf5d8c0e4662117b92aa32bf52f8f09620ae93abc7537d96d3311/regex-2024.9.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9d4a76b96f398697fe01117093613166e6aa8195d63f1b4ec3f21ab637632963", size = 823503 },
- { url = "https://files.pythonhosted.org/packages/f8/10/601303b8ee93589f879664b0cfd3127949ff32b17f9b6c490fb201106c4d/regex-2024.9.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ea51dcc0835eea2ea31d66456210a4e01a076d820e9039b04ae8d17ac11dee6", size = 797049 },
- { url = "https://files.pythonhosted.org/packages/ef/1c/ea200f61ce9f341763f2717ab4daebe4422d83e9fd4ac5e33435fd3a148d/regex-2024.9.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7aaa315101c6567a9a45d2839322c51c8d6e81f67683d529512f5bcfb99c802", size = 784144 },
- { url = "https://files.pythonhosted.org/packages/d8/5c/d2429be49ef3292def7688401d3deb11702c13dcaecdc71d2b407421275b/regex-2024.9.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c57d08ad67aba97af57a7263c2d9006d5c404d721c5f7542f077f109ec2a4a29", size = 782483 },
- { url = "https://files.pythonhosted.org/packages/12/d9/cbc30f2ff7164f3b26a7760f87c54bf8b2faed286f60efd80350a51c5b99/regex-2024.9.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f8404bf61298bb6f8224bb9176c1424548ee1181130818fcd2cbffddc768bed8", size = 790320 },
- { url = "https://files.pythonhosted.org/packages/19/1d/43ed03a236313639da5a45e61bc553c8d41e925bcf29b0f8ecff0c2c3f25/regex-2024.9.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dd4490a33eb909ef5078ab20f5f000087afa2a4daa27b4c072ccb3cb3050ad84", size = 860435 },
- { url = "https://files.pythonhosted.org/packages/34/4f/5d04da61c7c56e785058a46349f7285ae3ebc0726c6ea7c5c70600a52233/regex-2024.9.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:eee9130eaad130649fd73e5cd92f60e55708952260ede70da64de420cdcad554", size = 859571 },
- { url = "https://files.pythonhosted.org/packages/12/7f/8398c8155a3c70703a8e91c29532558186558e1aea44144b382faa2a6f7a/regex-2024.9.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6a2644a93da36c784e546de579ec1806bfd2763ef47babc1b03d765fe560c9f8", size = 787398 },
- { url = "https://files.pythonhosted.org/packages/58/3a/f5903977647a9a7e46d5535e9e96c194304aeeca7501240509bde2f9e17f/regex-2024.9.11-cp313-cp313-win32.whl", hash = "sha256:e997fd30430c57138adc06bba4c7c2968fb13d101e57dd5bb9355bf8ce3fa7e8", size = 262035 },
- { url = "https://files.pythonhosted.org/packages/ff/80/51ba3a4b7482f6011095b3a036e07374f64de180b7d870b704ed22509002/regex-2024.9.11-cp313-cp313-win_amd64.whl", hash = "sha256:042c55879cfeb21a8adacc84ea347721d3d83a159da6acdf1116859e2427c43f", size = 273510 },
+version = "2024.11.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/8e/5f/bd69653fbfb76cf8604468d3b4ec4c403197144c7bfe0e6a5fc9e02a07cb/regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519", size = 399494 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/95/3c/4651f6b130c6842a8f3df82461a8950f923925db8b6961063e82744bddcc/regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91", size = 482674 },
+ { url = "https://files.pythonhosted.org/packages/15/51/9f35d12da8434b489c7b7bffc205c474a0a9432a889457026e9bc06a297a/regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0", size = 287684 },
+ { url = "https://files.pythonhosted.org/packages/bd/18/b731f5510d1b8fb63c6b6d3484bfa9a59b84cc578ac8b5172970e05ae07c/regex-2024.11.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:164d8b7b3b4bcb2068b97428060b2a53be050085ef94eca7f240e7947f1b080e", size = 284589 },
+ { url = "https://files.pythonhosted.org/packages/78/a2/6dd36e16341ab95e4c6073426561b9bfdeb1a9c9b63ab1b579c2e96cb105/regex-2024.11.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3660c82f209655a06b587d55e723f0b813d3a7db2e32e5e7dc64ac2a9e86fde", size = 782511 },
+ { url = "https://files.pythonhosted.org/packages/1b/2b/323e72d5d2fd8de0d9baa443e1ed70363ed7e7b2fb526f5950c5cb99c364/regex-2024.11.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d22326fcdef5e08c154280b71163ced384b428343ae16a5ab2b3354aed12436e", size = 821149 },
+ { url = "https://files.pythonhosted.org/packages/90/30/63373b9ea468fbef8a907fd273e5c329b8c9535fee36fc8dba5fecac475d/regex-2024.11.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1ac758ef6aebfc8943560194e9fd0fa18bcb34d89fd8bd2af18183afd8da3a2", size = 809707 },
+ { url = "https://files.pythonhosted.org/packages/f2/98/26d3830875b53071f1f0ae6d547f1d98e964dd29ad35cbf94439120bb67a/regex-2024.11.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:997d6a487ff00807ba810e0f8332c18b4eb8d29463cfb7c820dc4b6e7562d0cf", size = 781702 },
+ { url = "https://files.pythonhosted.org/packages/87/55/eb2a068334274db86208ab9d5599ffa63631b9f0f67ed70ea7c82a69bbc8/regex-2024.11.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02a02d2bb04fec86ad61f3ea7f49c015a0681bf76abb9857f945d26159d2968c", size = 771976 },
+ { url = "https://files.pythonhosted.org/packages/74/c0/be707bcfe98254d8f9d2cff55d216e946f4ea48ad2fd8cf1428f8c5332ba/regex-2024.11.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f02f93b92358ee3f78660e43b4b0091229260c5d5c408d17d60bf26b6c900e86", size = 697397 },
+ { url = "https://files.pythonhosted.org/packages/49/dc/bb45572ceb49e0f6509f7596e4ba7031f6819ecb26bc7610979af5a77f45/regex-2024.11.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:06eb1be98df10e81ebaded73fcd51989dcf534e3c753466e4b60c4697a003b67", size = 768726 },
+ { url = "https://files.pythonhosted.org/packages/5a/db/f43fd75dc4c0c2d96d0881967897926942e935d700863666f3c844a72ce6/regex-2024.11.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:040df6fe1a5504eb0f04f048e6d09cd7c7110fef851d7c567a6b6e09942feb7d", size = 775098 },
+ { url = "https://files.pythonhosted.org/packages/99/d7/f94154db29ab5a89d69ff893159b19ada89e76b915c1293e98603d39838c/regex-2024.11.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabbfc59f2c6edba2a6622c647b716e34e8e3867e0ab975412c5c2f79b82da2", size = 839325 },
+ { url = "https://files.pythonhosted.org/packages/f7/17/3cbfab1f23356fbbf07708220ab438a7efa1e0f34195bf857433f79f1788/regex-2024.11.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8447d2d39b5abe381419319f942de20b7ecd60ce86f16a23b0698f22e1b70008", size = 843277 },
+ { url = "https://files.pythonhosted.org/packages/7e/f2/48b393b51900456155de3ad001900f94298965e1cad1c772b87f9cfea011/regex-2024.11.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:da8f5fc57d1933de22a9e23eec290a0d8a5927a5370d24bda9a6abe50683fe62", size = 773197 },
+ { url = "https://files.pythonhosted.org/packages/45/3f/ef9589aba93e084cd3f8471fded352826dcae8489b650d0b9b27bc5bba8a/regex-2024.11.6-cp310-cp310-win32.whl", hash = "sha256:b489578720afb782f6ccf2840920f3a32e31ba28a4b162e13900c3e6bd3f930e", size = 261714 },
+ { url = "https://files.pythonhosted.org/packages/42/7e/5f1b92c8468290c465fd50c5318da64319133231415a8aa6ea5ab995a815/regex-2024.11.6-cp310-cp310-win_amd64.whl", hash = "sha256:5071b2093e793357c9d8b2929dfc13ac5f0a6c650559503bb81189d0a3814519", size = 274042 },
+ { url = "https://files.pythonhosted.org/packages/58/58/7e4d9493a66c88a7da6d205768119f51af0f684fe7be7bac8328e217a52c/regex-2024.11.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5478c6962ad548b54a591778e93cd7c456a7a29f8eca9c49e4f9a806dcc5d638", size = 482669 },
+ { url = "https://files.pythonhosted.org/packages/34/4c/8f8e631fcdc2ff978609eaeef1d6994bf2f028b59d9ac67640ed051f1218/regex-2024.11.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c89a8cc122b25ce6945f0423dc1352cb9593c68abd19223eebbd4e56612c5b7", size = 287684 },
+ { url = "https://files.pythonhosted.org/packages/c5/1b/f0e4d13e6adf866ce9b069e191f303a30ab1277e037037a365c3aad5cc9c/regex-2024.11.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94d87b689cdd831934fa3ce16cc15cd65748e6d689f5d2b8f4f4df2065c9fa20", size = 284589 },
+ { url = "https://files.pythonhosted.org/packages/25/4d/ab21047f446693887f25510887e6820b93f791992994f6498b0318904d4a/regex-2024.11.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1062b39a0a2b75a9c694f7a08e7183a80c63c0d62b301418ffd9c35f55aaa114", size = 792121 },
+ { url = "https://files.pythonhosted.org/packages/45/ee/c867e15cd894985cb32b731d89576c41a4642a57850c162490ea34b78c3b/regex-2024.11.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:167ed4852351d8a750da48712c3930b031f6efdaa0f22fa1933716bfcd6bf4a3", size = 831275 },
+ { url = "https://files.pythonhosted.org/packages/b3/12/b0f480726cf1c60f6536fa5e1c95275a77624f3ac8fdccf79e6727499e28/regex-2024.11.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d548dafee61f06ebdb584080621f3e0c23fff312f0de1afc776e2a2ba99a74f", size = 818257 },
+ { url = "https://files.pythonhosted.org/packages/bf/ce/0d0e61429f603bac433910d99ef1a02ce45a8967ffbe3cbee48599e62d88/regex-2024.11.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a19f302cd1ce5dd01a9099aaa19cae6173306d1302a43b627f62e21cf18ac0", size = 792727 },
+ { url = "https://files.pythonhosted.org/packages/e4/c1/243c83c53d4a419c1556f43777ccb552bccdf79d08fda3980e4e77dd9137/regex-2024.11.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bec9931dfb61ddd8ef2ebc05646293812cb6b16b60cf7c9511a832b6f1854b55", size = 780667 },
+ { url = "https://files.pythonhosted.org/packages/c5/f4/75eb0dd4ce4b37f04928987f1d22547ddaf6c4bae697623c1b05da67a8aa/regex-2024.11.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9714398225f299aa85267fd222f7142fcb5c769e73d7733344efc46f2ef5cf89", size = 776963 },
+ { url = "https://files.pythonhosted.org/packages/16/5d/95c568574e630e141a69ff8a254c2f188b4398e813c40d49228c9bbd9875/regex-2024.11.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:202eb32e89f60fc147a41e55cb086db2a3f8cb82f9a9a88440dcfc5d37faae8d", size = 784700 },
+ { url = "https://files.pythonhosted.org/packages/8e/b5/f8495c7917f15cc6fee1e7f395e324ec3e00ab3c665a7dc9d27562fd5290/regex-2024.11.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4181b814e56078e9b00427ca358ec44333765f5ca1b45597ec7446d3a1ef6e34", size = 848592 },
+ { url = "https://files.pythonhosted.org/packages/1c/80/6dd7118e8cb212c3c60b191b932dc57db93fb2e36fb9e0e92f72a5909af9/regex-2024.11.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:068376da5a7e4da51968ce4c122a7cd31afaaec4fccc7856c92f63876e57b51d", size = 852929 },
+ { url = "https://files.pythonhosted.org/packages/11/9b/5a05d2040297d2d254baf95eeeb6df83554e5e1df03bc1a6687fc4ba1f66/regex-2024.11.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f2c4184420d881a3475fb2c6f4d95d53a8d50209a2500723d831036f7c45", size = 781213 },
+ { url = "https://files.pythonhosted.org/packages/26/b7/b14e2440156ab39e0177506c08c18accaf2b8932e39fb092074de733d868/regex-2024.11.6-cp311-cp311-win32.whl", hash = "sha256:c36f9b6f5f8649bb251a5f3f66564438977b7ef8386a52460ae77e6070d309d9", size = 261734 },
+ { url = "https://files.pythonhosted.org/packages/80/32/763a6cc01d21fb3819227a1cc3f60fd251c13c37c27a73b8ff4315433a8e/regex-2024.11.6-cp311-cp311-win_amd64.whl", hash = "sha256:02e28184be537f0e75c1f9b2f8847dc51e08e6e171c6bde130b2687e0c33cf60", size = 274052 },
+ { url = "https://files.pythonhosted.org/packages/ba/30/9a87ce8336b172cc232a0db89a3af97929d06c11ceaa19d97d84fa90a8f8/regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a", size = 483781 },
+ { url = "https://files.pythonhosted.org/packages/01/e8/00008ad4ff4be8b1844786ba6636035f7ef926db5686e4c0f98093612add/regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9", size = 288455 },
+ { url = "https://files.pythonhosted.org/packages/60/85/cebcc0aff603ea0a201667b203f13ba75d9fc8668fab917ac5b2de3967bc/regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2", size = 284759 },
+ { url = "https://files.pythonhosted.org/packages/94/2b/701a4b0585cb05472a4da28ee28fdfe155f3638f5e1ec92306d924e5faf0/regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4", size = 794976 },
+ { url = "https://files.pythonhosted.org/packages/4b/bf/fa87e563bf5fee75db8915f7352e1887b1249126a1be4813837f5dbec965/regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577", size = 833077 },
+ { url = "https://files.pythonhosted.org/packages/a1/56/7295e6bad94b047f4d0834e4779491b81216583c00c288252ef625c01d23/regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3", size = 823160 },
+ { url = "https://files.pythonhosted.org/packages/fb/13/e3b075031a738c9598c51cfbc4c7879e26729c53aa9cca59211c44235314/regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e", size = 796896 },
+ { url = "https://files.pythonhosted.org/packages/24/56/0b3f1b66d592be6efec23a795b37732682520b47c53da5a32c33ed7d84e3/regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe", size = 783997 },
+ { url = "https://files.pythonhosted.org/packages/f9/a1/eb378dada8b91c0e4c5f08ffb56f25fcae47bf52ad18f9b2f33b83e6d498/regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e", size = 781725 },
+ { url = "https://files.pythonhosted.org/packages/83/f2/033e7dec0cfd6dda93390089864732a3409246ffe8b042e9554afa9bff4e/regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29", size = 789481 },
+ { url = "https://files.pythonhosted.org/packages/83/23/15d4552ea28990a74e7696780c438aadd73a20318c47e527b47a4a5a596d/regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39", size = 852896 },
+ { url = "https://files.pythonhosted.org/packages/e3/39/ed4416bc90deedbfdada2568b2cb0bc1fdb98efe11f5378d9892b2a88f8f/regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51", size = 860138 },
+ { url = "https://files.pythonhosted.org/packages/93/2d/dd56bb76bd8e95bbce684326302f287455b56242a4f9c61f1bc76e28360e/regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad", size = 787692 },
+ { url = "https://files.pythonhosted.org/packages/0b/55/31877a249ab7a5156758246b9c59539abbeba22461b7d8adc9e8475ff73e/regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54", size = 262135 },
+ { url = "https://files.pythonhosted.org/packages/38/ec/ad2d7de49a600cdb8dd78434a1aeffe28b9d6fc42eb36afab4a27ad23384/regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b", size = 273567 },
+ { url = "https://files.pythonhosted.org/packages/90/73/bcb0e36614601016552fa9344544a3a2ae1809dc1401b100eab02e772e1f/regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84", size = 483525 },
+ { url = "https://files.pythonhosted.org/packages/0f/3f/f1a082a46b31e25291d830b369b6b0c5576a6f7fb89d3053a354c24b8a83/regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4", size = 288324 },
+ { url = "https://files.pythonhosted.org/packages/09/c9/4e68181a4a652fb3ef5099e077faf4fd2a694ea6e0f806a7737aff9e758a/regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0", size = 284617 },
+ { url = "https://files.pythonhosted.org/packages/fc/fd/37868b75eaf63843165f1d2122ca6cb94bfc0271e4428cf58c0616786dce/regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0", size = 795023 },
+ { url = "https://files.pythonhosted.org/packages/c4/7c/d4cd9c528502a3dedb5c13c146e7a7a539a3853dc20209c8e75d9ba9d1b2/regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7", size = 833072 },
+ { url = "https://files.pythonhosted.org/packages/4f/db/46f563a08f969159c5a0f0e722260568425363bea43bb7ae370becb66a67/regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7", size = 823130 },
+ { url = "https://files.pythonhosted.org/packages/db/60/1eeca2074f5b87df394fccaa432ae3fc06c9c9bfa97c5051aed70e6e00c2/regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c", size = 796857 },
+ { url = "https://files.pythonhosted.org/packages/10/db/ac718a08fcee981554d2f7bb8402f1faa7e868c1345c16ab1ebec54b0d7b/regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3", size = 784006 },
+ { url = "https://files.pythonhosted.org/packages/c2/41/7da3fe70216cea93144bf12da2b87367590bcf07db97604edeea55dac9ad/regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07", size = 781650 },
+ { url = "https://files.pythonhosted.org/packages/a7/d5/880921ee4eec393a4752e6ab9f0fe28009435417c3102fc413f3fe81c4e5/regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e", size = 789545 },
+ { url = "https://files.pythonhosted.org/packages/dc/96/53770115e507081122beca8899ab7f5ae28ae790bfcc82b5e38976df6a77/regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6", size = 853045 },
+ { url = "https://files.pythonhosted.org/packages/31/d3/1372add5251cc2d44b451bd94f43b2ec78e15a6e82bff6a290ef9fd8f00a/regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4", size = 860182 },
+ { url = "https://files.pythonhosted.org/packages/ed/e3/c446a64984ea9f69982ba1a69d4658d5014bc7a0ea468a07e1a1265db6e2/regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d", size = 787733 },
+ { url = "https://files.pythonhosted.org/packages/2b/f1/e40c8373e3480e4f29f2692bd21b3e05f296d3afebc7e5dcf21b9756ca1c/regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff", size = 262122 },
+ { url = "https://files.pythonhosted.org/packages/45/94/bc295babb3062a731f52621cdc992d123111282e291abaf23faa413443ea/regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a", size = 273545 },
]
[[package]]
@@ -813,56 +888,139 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 },
]
+[[package]]
+name = "rnzb"
+version = "0.3.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d8/e1/b2d1ab7009fc98881407495f39ca209fbcb7dc131b9c10b38a144154a6fc/rnzb-0.3.1.tar.gz", hash = "sha256:21bfb57864f3e9db2fd3f43c466a58da88525e7cdadc956a08c0a13d04604ede", size = 75985 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/98/af/846ac6f7046c8cc36ac05277d9422d09b7ed383073822a6c8f1aaf138cf3/rnzb-0.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:27ffbb64cd3232293fb9b95fafa675a173484043861fe93f867758ea709af1e5", size = 884320 },
+ { url = "https://files.pythonhosted.org/packages/b1/26/d312ca2d69ac5c5ed3d2b99cf07d8138e460856efef1e3a8358283cfc7ee/rnzb-0.3.1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:28365747a7174b258cc2a97e4c769a5ccd79e095edc7fad6676a5d765ed23058", size = 946655 },
+ { url = "https://files.pythonhosted.org/packages/b6/aa/7b5b486ce93fb452579b71aa60984eab5d7faf351a7a525e7bbec187fa72/rnzb-0.3.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:935eb1d25e4a58d7116abee3cf8bedd0074589c52b016ef430fb5c5fa5d2015e", size = 954360 },
+ { url = "https://files.pythonhosted.org/packages/1c/f8/48080ed1f7830eaf7d61d41d3911d4f8f96e14c4552c86a7891985c30e4f/rnzb-0.3.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:8872f3f6fd4b97e95595574d3c7f768335de93d8dcfe13848f1599750b022549", size = 1008252 },
+ { url = "https://files.pythonhosted.org/packages/a3/86/ccce1adedee989a8fb22a314fd36d983e9871ed8cbe42b18d0bd0b1b1605/rnzb-0.3.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:562d5cdd681a1137ea1726c61cc223cbe4476ec8b65c616bd41044f3d61a0be8", size = 999650 },
+ { url = "https://files.pythonhosted.org/packages/df/d7/f2db7c0a2ec9ce81526cb7bd6a931da7813b711f3f5bb72dca93d33319a7/rnzb-0.3.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:01e906af26dad2c4ef4f8eb48f5e86d66f340d2f12a6337a869aa1a302c63fbd", size = 1068926 },
+ { url = "https://files.pythonhosted.org/packages/3d/ab/df9f63b8519d1df8668b210d82b7e551b8ef32103b3f2a040b1b8b9952f7/rnzb-0.3.1-cp310-cp310-win32.whl", hash = "sha256:8649a2c36d2eab4c0d0ceaed86e1b259cf29baedcd4e96e0eccf0c061c04b23f", size = 787071 },
+ { url = "https://files.pythonhosted.org/packages/58/89/4fd0f3e498a6b9ed0486cda76bd365310dec6a6ce29ed3bba94a553ca0d1/rnzb-0.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:9963de9b8f75376c0838e8c174373ef0fb5a7b3fd25f45b5993a4f4289608262", size = 837192 },
+ { url = "https://files.pythonhosted.org/packages/2b/8c/96219590a79b2c3c5a2a17cad6ae4b6481bec156573e4cb671f7a8c8d406/rnzb-0.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a70750960a094148924fb4198da2a542a7659947c6ffcc20b08733355e48ed2d", size = 884093 },
+ { url = "https://files.pythonhosted.org/packages/63/70/a6715469d962bb441866d61e49555f8b95a6f9b305612c0c5d78d9081874/rnzb-0.3.1-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:2fce76e2121fb66ad01de03eeacb0fbf6a91e095af46859729f5d936d6341067", size = 946484 },
+ { url = "https://files.pythonhosted.org/packages/f4/24/7bcb8f333eb12e59a741d086c1ff7278cb90a2678f90f02fa09cdd127084/rnzb-0.3.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:a838da3156ba980634327bbe420d46f2f9e7c9ddcd0849bdcd25902783b09d02", size = 954204 },
+ { url = "https://files.pythonhosted.org/packages/62/8c/1df693e8fe55128ac41a238b956d5819d130c01439c2fa0e2be74fbb1843/rnzb-0.3.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:c72661b0821e9cb9309f171061b2f6aa08441b81619b0c63848135a2abdb314b", size = 1008043 },
+ { url = "https://files.pythonhosted.org/packages/03/f2/00208381a3346b6fca849a5d5d51ba05a5b1631adc12efc0f23720a11cbf/rnzb-0.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:91fcb8abd1a0e5299e42cdb74b1c4fa4cca6b05e83d4103d5ad1e784c71594de", size = 999565 },
+ { url = "https://files.pythonhosted.org/packages/5e/ad/fdd3f8ca43ef1e754e4bbbeb2769010af6cd28821c5ff940b205dabeb22c/rnzb-0.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:36afdd8696c012bc7cdc36919f783e6ce55ff0a9c8af39ad5e4b2c988676af20", size = 1068674 },
+ { url = "https://files.pythonhosted.org/packages/87/64/57c6034915973b269f9f06a18f672e787469ced76a6212ae2cec37de7d06/rnzb-0.3.1-cp311-cp311-win32.whl", hash = "sha256:70e08306868abb9b2eeb407ce7e394dc40852e94f3da87c4772001d24220fdeb", size = 787200 },
+ { url = "https://files.pythonhosted.org/packages/ff/dc/1372ca7c477a0447e9914ab5f572d9c4f7a00fea2812ca5bfda69834d827/rnzb-0.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:5587b76707c30fc02b58b8c211ce36f5db4304ecf4796a3eaa0a3b2610c7320e", size = 837269 },
+ { url = "https://files.pythonhosted.org/packages/38/ae/01124c55bc294eedc1c524e6820463abd4bc5c85267693804ebcf7688be6/rnzb-0.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0d233d1832afa063ef82ce0a73214dabe1e12e6ebc146af615ab565494483b1c", size = 880433 },
+ { url = "https://files.pythonhosted.org/packages/d8/bd/6b0fada8f61cf96dd1217c396889a3368d69331327bb7682cdbbbf088cc2/rnzb-0.3.1-cp312-cp312-macosx_11_0_x86_64.whl", hash = "sha256:e0b16d8d96255972ba146faa83a927500585136da2caedd22278aecb2a626578", size = 944094 },
+ { url = "https://files.pythonhosted.org/packages/28/4d/c029cadbf97c7f2b814007730c9621e0582122b44c238f0ac69bd8b55083/rnzb-0.3.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:d10a5cc96b6bac6e8c2076036ec2e69e4db3daedeaf1dc2c59403425a495b188", size = 951677 },
+ { url = "https://files.pythonhosted.org/packages/62/e2/ccf2e06b8766d51921e604f8049c61bba51d4b594ab441dc068a4ba5c6c7/rnzb-0.3.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:bf624e0687b041f9ff968d23e4251322e82e16875cf7d47ddd5caf8692969421", size = 1006418 },
+ { url = "https://files.pythonhosted.org/packages/51/f6/14c4795ae2ac1be5805ab3eeab869224e29ec4870afdc6cca93898f6e853/rnzb-0.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0eb3ea645dc2121a1bb8816385e2afb2e1ab18368502d5d013868e7abd7021dc", size = 997841 },
+ { url = "https://files.pythonhosted.org/packages/49/55/11bc417aa38232d5d5dbcdb8977dfbcaaedee58d0d6d6e4ee03aa9c45618/rnzb-0.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e04221c18f9d536c62026df7925f33a6e71435fb69d73724735694b174c779fa", size = 1066259 },
+ { url = "https://files.pythonhosted.org/packages/e9/89/d8b9c739aef93ad594274fa36dc13f5147809110cc1d3679e514b6545c68/rnzb-0.3.1-cp312-cp312-win32.whl", hash = "sha256:f633999ec4cdfa09983efbae104ec139749d208b2bc3abbe4b65a91a5b2af519", size = 786888 },
+ { url = "https://files.pythonhosted.org/packages/b3/0c/16800ba2d7a45e279a5736dd565067863540dc4df8bfb56e1f424d1c8437/rnzb-0.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:69eb8b571629601cbccffd1148d4e18e55d165db9c0ce12dda13ecfa65bf4761", size = 838397 },
+ { url = "https://files.pythonhosted.org/packages/65/90/daf61f06ed0f6951b399fabd1a3db68a04d4f655eeaec02f3471d861fb7e/rnzb-0.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e26dbbd2ff99d343bc0a71d16cb9967a6d58fbe22ad381d9ed5d2d5e79d3ff63", size = 880021 },
+ { url = "https://files.pythonhosted.org/packages/24/3b/23716593167fb5b1d1bf6c70c6df8c9c5e9ebfc079217f40809d3cda8b7c/rnzb-0.3.1-cp313-cp313-macosx_11_0_x86_64.whl", hash = "sha256:ab3918ae3a4542c135f593485eb3a2e20359f06b08f2b6f5f95694b23ea43a88", size = 943787 },
+ { url = "https://files.pythonhosted.org/packages/b3/12/171b26a414a2b373a3d80fa6e07070b4982d55cf795756526750dc5d7347/rnzb-0.3.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:43c05b78a800eeebce3f9294415208f3fd61d44e0447927081c356df648c20ae", size = 951325 },
+ { url = "https://files.pythonhosted.org/packages/ae/51/04ca2d80476b23464d97ff3cdaa0a0553566010e4156b8a7d6226b4652ae/rnzb-0.3.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:4b52a8b497dd2c3823e8e0811a3f8067d79250602eadbdf2d07d1ae0046baa6f", size = 1005853 },
+ { url = "https://files.pythonhosted.org/packages/38/18/0383338c81d6ecb7f941770ad441744bdf3f130963a315152253045dd928/rnzb-0.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ff0d3cf07c4d6c7a14f33802c6928f8d71e47d26e41157d10038ac3d8f4d90d4", size = 997264 },
+ { url = "https://files.pythonhosted.org/packages/6a/41/f22c5822358dc188fcd316c6b31676802a7a84d96576cc74b021564685c8/rnzb-0.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:90fe0ff0a88bfa37ecdd17c0dbd46fa497c810fcafcbb951bc9b46e14969f06f", size = 1065767 },
+ { url = "https://files.pythonhosted.org/packages/43/ee/cecb8e49fdd032aaadd50c5db43eda206f9e6638347f61fb6147ff9dbdd1/rnzb-0.3.1-cp313-cp313-win32.whl", hash = "sha256:af4de9a4a6bc1f19f868c100c1cd0c5aee5a8fd48a5869d1cb63900711aae91e", size = 786669 },
+ { url = "https://files.pythonhosted.org/packages/88/4c/d57d0c24c70909de7bb1c82abd14d428e5d4f487c0f04a8c000a57fd6df6/rnzb-0.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:da2fc8a6f8531330cab44d2d9962e9f7e0a4be287115fa5a93a4955fc1ab0a9f", size = 837860 },
+ { url = "https://files.pythonhosted.org/packages/a2/a0/c1898bc690996a645fb7a5632293fb6b766721e58b2f5b8c6b29ba4e41a2/rnzb-0.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:65fc0b537461e1a27baaa25e874d897ebdd79bd1367ac798060b47b57c942037", size = 878712 },
+ { url = "https://files.pythonhosted.org/packages/73/99/1342c73651e966367aefb7ef9ebf9b1d45e83a42ed045d106646a5ce1f13/rnzb-0.3.1-cp313-cp313t-macosx_11_0_x86_64.whl", hash = "sha256:2d7735ebdb77b91bba9713a0832956228010c383b404c886619c011a6d9230f3", size = 942829 },
+ { url = "https://files.pythonhosted.org/packages/b9/27/fbb5ba6f06a3c9630c4b3c8cc2d23740cf3e6b361889669338a8ac2a7682/rnzb-0.3.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:180f9f935ebc7587fe79d464f7856ede529a97f66069d53ec31e5840aadbc6f6", size = 949794 },
+ { url = "https://files.pythonhosted.org/packages/80/88/2982e848fc2b82e2a3449527d605df044307db322266c4d436424e0e3d3b/rnzb-0.3.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:2d0753e3cf01b62c1bf9a2a192a3390c0bfa81899e4057b1717debec5073d5e8", size = 1004775 },
+ { url = "https://files.pythonhosted.org/packages/b2/65/682363a4a0869bfb2edc81e7d39f990758dcb6cce27b23b77d897290d088/rnzb-0.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:62b1d44cda2f0b0fad1fc0397156e15864b37a41a118f442e85db76147e2fa91", size = 994511 },
+ { url = "https://files.pythonhosted.org/packages/73/a8/674b9080e38c75d6087de8131d5abefb745c94c7bb4aca229dae71c482a6/rnzb-0.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:7be2e96d43b85552fc25fd59e9d845c7d86144fe3b10d2c28a5f31445e594d74", size = 1064854 },
+ { url = "https://files.pythonhosted.org/packages/3e/eb/373b9d88aabf5089bbb831eda45a71826c01f5e8d5a5d6e0d458217782eb/rnzb-0.3.1-cp313-cp313t-win32.whl", hash = "sha256:50d029f61fe82c2c1a30311c31aceac98250ef444b65db6b63ab08412e3c19a9", size = 786021 },
+ { url = "https://files.pythonhosted.org/packages/5a/a1/7b5fa38fdcd97db36d88d8544e3908de740eff1fb68f10ec6d3b10b2a3cf/rnzb-0.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:777d251bb8beb0693ba809c394270313fa56c158b2304e3977f0d577c51b3a23", size = 837349 },
+ { url = "https://files.pythonhosted.org/packages/a3/88/bca50619c947df1139e5d1352e4917d70873475a7201efc74a749807c3d4/rnzb-0.3.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:82424e79abe5b11437f8fb43f3d0637863950baf45e8efc594c5eeb986ca9d61", size = 884911 },
+ { url = "https://files.pythonhosted.org/packages/e7/df/03747798aa75450c515a3c692e0a7eef8d0673e583a4c3f82efd3fd865e0/rnzb-0.3.1-pp310-pypy310_pp73-macosx_11_0_x86_64.whl", hash = "sha256:a27b5e19ea04d551b42df8dbbfc3c42efe0f0e512815bfcc02edc8d79631e180", size = 947111 },
+ { url = "https://files.pythonhosted.org/packages/fc/08/64703be68c917b9eddfbe5d02363e67abf326fc3acc177036193e4d4470f/rnzb-0.3.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:9a29f357ad5e2eafe9d9bd296e3f77fddeeab949e4b53848a6a7941f3c38f0b9", size = 955132 },
+ { url = "https://files.pythonhosted.org/packages/02/71/9c943b2e16e24b55e115947856fca6bee82bbcaadcafe884f2b6fb6a45bf/rnzb-0.3.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fe03b3fd5fb7b81747988e10ca9e402631b473895c66bb21b191da5a3a925a7e", size = 1008739 },
+ { url = "https://files.pythonhosted.org/packages/32/11/bdc2a3620870767aeddd714c7f2b4812d452577c8da3f4105010e4ce52ce/rnzb-0.3.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c5f8e529f9da5a2fe87364f8a4f3f030c344f20c951e4d4c21c140d7e3c18378", size = 837339 },
+]
+
[[package]]
name = "ruff"
-version = "0.6.7"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/8d/7c/3045a526c57cef4b5ec4d5d154692e31429749a49810a53e785de334c4f6/ruff-0.6.7.tar.gz", hash = "sha256:44e52129d82266fa59b587e2cd74def5637b730a69c4542525dfdecfaae38bd5", size = 3073785 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/22/c4/1c5c636f83f905c537785016e9cdd7a36df53c025a2d07940580ecb37bcf/ruff-0.6.7-py3-none-linux_armv6l.whl", hash = "sha256:08277b217534bfdcc2e1377f7f933e1c7957453e8a79764d004e44c40db923f2", size = 10336748 },
- { url = "https://files.pythonhosted.org/packages/84/d9/aa15a56be7ad796f4d7625362aff588f9fc013bbb7323a63571628a2cf2d/ruff-0.6.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:c6707a32e03b791f4448dc0dce24b636cbcdee4dd5607adc24e5ee73fd86c00a", size = 9958833 },
- { url = "https://files.pythonhosted.org/packages/27/25/5dd1c32bfc3ad3136c8ebe84312d1bdd2e6c908ac7f60692ec009b7050a8/ruff-0.6.7-py3-none-macosx_11_0_arm64.whl", hash = "sha256:533d66b7774ef224e7cf91506a7dafcc9e8ec7c059263ec46629e54e7b1f90ab", size = 9633369 },
- { url = "https://files.pythonhosted.org/packages/0e/3e/01b25484f3cb08fe6fddedf1f55f3f3c0af861a5b5f5082fbe60ab4b2596/ruff-0.6.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17a86aac6f915932d259f7bec79173e356165518859f94649d8c50b81ff087e9", size = 10637415 },
- { url = "https://files.pythonhosted.org/packages/8a/c9/5bb9b849e4777e0f961de43edf95d2af0ab34999a5feee957be096887876/ruff-0.6.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b3f8822defd260ae2460ea3832b24d37d203c3577f48b055590a426a722d50ef", size = 10097389 },
- { url = "https://files.pythonhosted.org/packages/52/cf/e08f1c290c7d848ddfb2ae811f24f445c18e1d3e50e01c38ffa7f5a50494/ruff-0.6.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9ba4efe5c6dbbb58be58dd83feedb83b5e95c00091bf09987b4baf510fee5c99", size = 10951440 },
- { url = "https://files.pythonhosted.org/packages/a2/2d/ca8aa0da5841913c302d8034c6de0ce56c401c685184d8dd23cfdd0003f9/ruff-0.6.7-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:525201b77f94d2b54868f0cbe5edc018e64c22563da6c5c2e5c107a4e85c1c0d", size = 11708900 },
- { url = "https://files.pythonhosted.org/packages/89/fc/9a83c57baee977c82392e19a328b52cebdaf61601af3d99498e278ef5104/ruff-0.6.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8854450839f339e1049fdbe15d875384242b8e85d5c6947bb2faad33c651020b", size = 11258892 },
- { url = "https://files.pythonhosted.org/packages/d3/a3/254cc7afef702c68ae9079290c2a1477ae0e81478589baf745026d8a4eb5/ruff-0.6.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f0b62056246234d59cbf2ea66e84812dc9ec4540518e37553513392c171cb18", size = 12367932 },
- { url = "https://files.pythonhosted.org/packages/9f/55/53f10c1bd8c3b2ae79aed18e62b22c6346f9296aa0ec80489b8442bd06a9/ruff-0.6.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b1462fa56c832dc0cea5b4041cfc9c97813505d11cce74ebc6d1aae068de36b", size = 10838629 },
- { url = "https://files.pythonhosted.org/packages/84/72/fb335c2b25432c63d15383ecbd7bfc1915e68cdf8d086a08042052144255/ruff-0.6.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:02b083770e4cdb1495ed313f5694c62808e71764ec6ee5db84eedd82fd32d8f5", size = 10648824 },
- { url = "https://files.pythonhosted.org/packages/92/a8/d57e135a8ad99b6a0c6e2a5c590bcacdd57f44340174f4409c3893368610/ruff-0.6.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:0c05fd37013de36dfa883a3854fae57b3113aaa8abf5dea79202675991d48624", size = 10174368 },
- { url = "https://files.pythonhosted.org/packages/a7/6f/1a30a6e81dcf2fa9ff3f7011eb87fe76c12a3c6bba74db6a1977d763de1f/ruff-0.6.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:f49c9caa28d9bbfac4a637ae10327b3db00f47d038f3fbb2195c4d682e925b14", size = 10514383 },
- { url = "https://files.pythonhosted.org/packages/0b/25/df6f2575bc9fe43a6dedfd8dee12896f09a94303e2c828d5f85856bb69a0/ruff-0.6.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:a0e1655868164e114ba43a908fd2d64a271a23660195017c17691fb6355d59bb", size = 10902340 },
- { url = "https://files.pythonhosted.org/packages/68/62/f2c1031e2fb7b94f9bf0603744e73db4ef90081b0eb1b9639a6feefd52ea/ruff-0.6.7-py3-none-win32.whl", hash = "sha256:a939ca435b49f6966a7dd64b765c9df16f1faed0ca3b6f16acdf7731969deb35", size = 8448033 },
- { url = "https://files.pythonhosted.org/packages/97/80/193d1604a3f7d75eb1b2a7ce6bf0fdbdbc136889a65caacea6ffb29501b1/ruff-0.6.7-py3-none-win_amd64.whl", hash = "sha256:590445eec5653f36248584579c06252ad2e110a5d1f32db5420de35fb0e1c977", size = 9273543 },
- { url = "https://files.pythonhosted.org/packages/8e/a8/4abb5a9f58f51e4b1ea386be5ab2e547035bc1ee57200d1eca2f8909a33e/ruff-0.6.7-py3-none-win_arm64.whl", hash = "sha256:b28f0d5e2f771c1fe3c7a45d3f53916fc74a480698c4b5731f0bea61e52137c8", size = 8618044 },
+version = "0.9.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/1e/7f/60fda2eec81f23f8aa7cbbfdf6ec2ca11eb11c273827933fb2541c2ce9d8/ruff-0.9.3.tar.gz", hash = "sha256:8293f89985a090ebc3ed1064df31f3b4b56320cdfcec8b60d3295bddb955c22a", size = 3586740 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f9/77/4fb790596d5d52c87fd55b7160c557c400e90f6116a56d82d76e95d9374a/ruff-0.9.3-py3-none-linux_armv6l.whl", hash = "sha256:7f39b879064c7d9670197d91124a75d118d00b0990586549949aae80cdc16624", size = 11656815 },
+ { url = "https://files.pythonhosted.org/packages/a2/a8/3338ecb97573eafe74505f28431df3842c1933c5f8eae615427c1de32858/ruff-0.9.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:a187171e7c09efa4b4cc30ee5d0d55a8d6c5311b3e1b74ac5cb96cc89bafc43c", size = 11594821 },
+ { url = "https://files.pythonhosted.org/packages/8e/89/320223c3421962762531a6b2dd58579b858ca9916fb2674874df5e97d628/ruff-0.9.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c59ab92f8e92d6725b7ded9d4a31be3ef42688a115c6d3da9457a5bda140e2b4", size = 11040475 },
+ { url = "https://files.pythonhosted.org/packages/b2/bd/1d775eac5e51409535804a3a888a9623e87a8f4b53e2491580858a083692/ruff-0.9.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dc153c25e715be41bb228bc651c1e9b1a88d5c6e5ed0194fa0dfea02b026439", size = 11856207 },
+ { url = "https://files.pythonhosted.org/packages/7f/c6/3e14e09be29587393d188454064a4aa85174910d16644051a80444e4fd88/ruff-0.9.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:646909a1e25e0dc28fbc529eab8eb7bb583079628e8cbe738192853dbbe43af5", size = 11420460 },
+ { url = "https://files.pythonhosted.org/packages/ef/42/b7ca38ffd568ae9b128a2fa76353e9a9a3c80ef19746408d4ce99217ecc1/ruff-0.9.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a5a46e09355695fbdbb30ed9889d6cf1c61b77b700a9fafc21b41f097bfbba4", size = 12605472 },
+ { url = "https://files.pythonhosted.org/packages/a6/a1/3167023f23e3530fde899497ccfe239e4523854cb874458ac082992d206c/ruff-0.9.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:c4bb09d2bbb394e3730d0918c00276e79b2de70ec2a5231cd4ebb51a57df9ba1", size = 13243123 },
+ { url = "https://files.pythonhosted.org/packages/d0/b4/3c600758e320f5bf7de16858502e849f4216cb0151f819fa0d1154874802/ruff-0.9.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:96a87ec31dc1044d8c2da2ebbed1c456d9b561e7d087734336518181b26b3aa5", size = 12744650 },
+ { url = "https://files.pythonhosted.org/packages/be/38/266fbcbb3d0088862c9bafa8b1b99486691d2945a90b9a7316336a0d9a1b/ruff-0.9.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bb7554aca6f842645022fe2d301c264e6925baa708b392867b7a62645304df4", size = 14458585 },
+ { url = "https://files.pythonhosted.org/packages/63/a6/47fd0e96990ee9b7a4abda62de26d291bd3f7647218d05b7d6d38af47c30/ruff-0.9.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cabc332b7075a914ecea912cd1f3d4370489c8018f2c945a30bcc934e3bc06a6", size = 12419624 },
+ { url = "https://files.pythonhosted.org/packages/84/5d/de0b7652e09f7dda49e1a3825a164a65f4998175b6486603c7601279baad/ruff-0.9.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:33866c3cc2a575cbd546f2cd02bdd466fed65118e4365ee538a3deffd6fcb730", size = 11843238 },
+ { url = "https://files.pythonhosted.org/packages/9e/be/3f341ceb1c62b565ec1fb6fd2139cc40b60ae6eff4b6fb8f94b1bb37c7a9/ruff-0.9.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:006e5de2621304c8810bcd2ee101587712fa93b4f955ed0985907a36c427e0c2", size = 11484012 },
+ { url = "https://files.pythonhosted.org/packages/a3/c8/ff8acbd33addc7e797e702cf00bfde352ab469723720c5607b964491d5cf/ruff-0.9.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:ba6eea4459dbd6b1be4e6bfc766079fb9b8dd2e5a35aff6baee4d9b1514ea519", size = 12038494 },
+ { url = "https://files.pythonhosted.org/packages/73/b1/8d9a2c0efbbabe848b55f877bc10c5001a37ab10aca13c711431673414e5/ruff-0.9.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:90230a6b8055ad47d3325e9ee8f8a9ae7e273078a66401ac66df68943ced029b", size = 12473639 },
+ { url = "https://files.pythonhosted.org/packages/cb/44/a673647105b1ba6da9824a928634fe23186ab19f9d526d7bdf278cd27bc3/ruff-0.9.3-py3-none-win32.whl", hash = "sha256:eabe5eb2c19a42f4808c03b82bd313fc84d4e395133fb3fc1b1516170a31213c", size = 9834353 },
+ { url = "https://files.pythonhosted.org/packages/c3/01/65cadb59bf8d4fbe33d1a750103e6883d9ef302f60c28b73b773092fbde5/ruff-0.9.3-py3-none-win_amd64.whl", hash = "sha256:040ceb7f20791dfa0e78b4230ee9dce23da3b64dd5848e40e3bf3ab76468dcf4", size = 10821444 },
+ { url = "https://files.pythonhosted.org/packages/69/cb/b3fe58a136a27d981911cba2f18e4b29f15010623b79f0f2510fd0d31fd3/ruff-0.9.3-py3-none-win_arm64.whl", hash = "sha256:800d773f6d4d33b0a3c60e2c6ae8f4c202ea2de056365acfa519aa48acf28e0b", size = 10038168 },
]
[[package]]
name = "six"
-version = "1.16.0"
+version = "1.17.0"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/71/39/171f1c67cd00715f190ba0b100d606d440a28c93c7714febeca8b79af85e/six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", size = 34041 }
+sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254", size = 11053 },
+ { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 },
]
[[package]]
name = "tomli"
-version = "2.0.1"
+version = "2.2.1"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/c0/3f/d7af728f075fb08564c5949a9c95e44352e23dee646869fa104a3b2060a3/tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f", size = 15164 }
+sdist = { url = "https://files.pythonhosted.org/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", size = 17175 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", size = 12757 },
+ { url = "https://files.pythonhosted.org/packages/43/ca/75707e6efa2b37c77dadb324ae7d9571cb424e61ea73fad7c56c2d14527f/tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", size = 131077 },
+ { url = "https://files.pythonhosted.org/packages/c7/16/51ae563a8615d472fdbffc43a3f3d46588c264ac4f024f63f01283becfbb/tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", size = 123429 },
+ { url = "https://files.pythonhosted.org/packages/f1/dd/4f6cd1e7b160041db83c694abc78e100473c15d54620083dbd5aae7b990e/tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", size = 226067 },
+ { url = "https://files.pythonhosted.org/packages/a9/6b/c54ede5dc70d648cc6361eaf429304b02f2871a345bbdd51e993d6cdf550/tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", size = 236030 },
+ { url = "https://files.pythonhosted.org/packages/1f/47/999514fa49cfaf7a92c805a86c3c43f4215621855d151b61c602abb38091/tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", size = 240898 },
+ { url = "https://files.pythonhosted.org/packages/73/41/0a01279a7ae09ee1573b423318e7934674ce06eb33f50936655071d81a24/tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", size = 229894 },
+ { url = "https://files.pythonhosted.org/packages/55/18/5d8bc5b0a0362311ce4d18830a5d28943667599a60d20118074ea1b01bb7/tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", size = 245319 },
+ { url = "https://files.pythonhosted.org/packages/92/a3/7ade0576d17f3cdf5ff44d61390d4b3febb8a9fc2b480c75c47ea048c646/tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", size = 238273 },
+ { url = "https://files.pythonhosted.org/packages/72/6f/fa64ef058ac1446a1e51110c375339b3ec6be245af9d14c87c4a6412dd32/tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", size = 98310 },
+ { url = "https://files.pythonhosted.org/packages/6a/1c/4a2dcde4a51b81be3530565e92eda625d94dafb46dbeb15069df4caffc34/tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", size = 108309 },
+ { url = "https://files.pythonhosted.org/packages/52/e1/f8af4c2fcde17500422858155aeb0d7e93477a0d59a98e56cbfe75070fd0/tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", size = 132762 },
+ { url = "https://files.pythonhosted.org/packages/03/b8/152c68bb84fc00396b83e7bbddd5ec0bd3dd409db4195e2a9b3e398ad2e3/tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", size = 123453 },
+ { url = "https://files.pythonhosted.org/packages/c8/d6/fc9267af9166f79ac528ff7e8c55c8181ded34eb4b0e93daa767b8841573/tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", size = 233486 },
+ { url = "https://files.pythonhosted.org/packages/5c/51/51c3f2884d7bab89af25f678447ea7d297b53b5a3b5730a7cb2ef6069f07/tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", size = 242349 },
+ { url = "https://files.pythonhosted.org/packages/ab/df/bfa89627d13a5cc22402e441e8a931ef2108403db390ff3345c05253935e/tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", size = 252159 },
+ { url = "https://files.pythonhosted.org/packages/9e/6e/fa2b916dced65763a5168c6ccb91066f7639bdc88b48adda990db10c8c0b/tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", size = 237243 },
+ { url = "https://files.pythonhosted.org/packages/b4/04/885d3b1f650e1153cbb93a6a9782c58a972b94ea4483ae4ac5cedd5e4a09/tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", size = 259645 },
+ { url = "https://files.pythonhosted.org/packages/9c/de/6b432d66e986e501586da298e28ebeefd3edc2c780f3ad73d22566034239/tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", size = 244584 },
+ { url = "https://files.pythonhosted.org/packages/1c/9a/47c0449b98e6e7d1be6cbac02f93dd79003234ddc4aaab6ba07a9a7482e2/tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", size = 98875 },
+ { url = "https://files.pythonhosted.org/packages/ef/60/9b9638f081c6f1261e2688bd487625cd1e660d0a85bd469e91d8db969734/tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", size = 109418 },
+ { url = "https://files.pythonhosted.org/packages/04/90/2ee5f2e0362cb8a0b6499dc44f4d7d48f8fff06d28ba46e6f1eaa61a1388/tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7", size = 132708 },
+ { url = "https://files.pythonhosted.org/packages/c0/ec/46b4108816de6b385141f082ba99e315501ccd0a2ea23db4a100dd3990ea/tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", size = 123582 },
+ { url = "https://files.pythonhosted.org/packages/a0/bd/b470466d0137b37b68d24556c38a0cc819e8febe392d5b199dcd7f578365/tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", size = 232543 },
+ { url = "https://files.pythonhosted.org/packages/d9/e5/82e80ff3b751373f7cead2815bcbe2d51c895b3c990686741a8e56ec42ab/tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", size = 241691 },
+ { url = "https://files.pythonhosted.org/packages/05/7e/2a110bc2713557d6a1bfb06af23dd01e7dde52b6ee7dadc589868f9abfac/tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", size = 251170 },
+ { url = "https://files.pythonhosted.org/packages/64/7b/22d713946efe00e0adbcdfd6d1aa119ae03fd0b60ebed51ebb3fa9f5a2e5/tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", size = 236530 },
+ { url = "https://files.pythonhosted.org/packages/38/31/3a76f67da4b0cf37b742ca76beaf819dca0ebef26d78fc794a576e08accf/tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", size = 258666 },
+ { url = "https://files.pythonhosted.org/packages/07/10/5af1293da642aded87e8a988753945d0cf7e00a9452d3911dd3bb354c9e2/tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", size = 243954 },
+ { url = "https://files.pythonhosted.org/packages/5b/b9/1ed31d167be802da0fc95020d04cd27b7d7065cc6fbefdd2f9186f60d7bd/tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec", size = 98724 },
+ { url = "https://files.pythonhosted.org/packages/c7/32/b0963458706accd9afcfeb867c0f9175a741bf7b19cd424230714d722198/tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69", size = 109383 },
+ { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257 },
]
[[package]]
name = "types-xmltodict"
-version = "0.13.0.3"
+version = "0.14.0.20241009"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/4f/bc/191d95f4e18ee8ffe626046574805fad7734827146e6ad39d56149fb1f62/types-xmltodict-0.13.0.3.tar.gz", hash = "sha256:8884534bab0364c4b22d5973f3c8153ff40d413a801d9e70eb893e676909f1fc", size = 2689 }
+sdist = { url = "https://files.pythonhosted.org/packages/05/28/f1c86d869d74342553c74bd88d6f615427b544fd06f30fdaa68cb4369cd1/types-xmltodict-0.14.0.20241009.tar.gz", hash = "sha256:9224c2422c5b6359cf826685b4ee50b14dc2cb9134561ab793ef6b03dd7108e1", size = 3224 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/9a/31/8046c84acfc397e60afe39ac5cdaf1ba5cf95eef11a1e995c3e951f08ba5/types_xmltodict-0.13.0.3-py3-none-any.whl", hash = "sha256:cb251c59e838986d8402b10d804225ade9fd6c9f66d01dc45cd6cfdf43640128", size = 2503 },
+ { url = "https://files.pythonhosted.org/packages/15/5e/6d81048a06f956ccec74c61fe5c30784e6a865876dc4ab02e99099e4ee0c/types_xmltodict-0.14.0.20241009-py3-none-any.whl", hash = "sha256:92812e17ffa9171416b35806cb5f4ed3f8f52b6724b2c555e4733e902ef4afd0", size = 2859 },
]
[[package]]
@@ -876,43 +1034,43 @@ wheels = [
[[package]]
name = "urllib3"
-version = "2.2.3"
+version = "2.3.0"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/ed/63/22ba4ebfe7430b76388e7cd448d5478814d3032121827c12a2cc287e2260/urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9", size = 300677 }
+sdist = { url = "https://files.pythonhosted.org/packages/aa/63/e53da845320b757bf29ef6a9062f5c669fe997973f966045cb019c3f4b66/urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d", size = 307268 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", size = 126338 },
+ { url = "https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", size = 128369 },
]
[[package]]
name = "watchdog"
-version = "5.0.2"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/cd/5e/95dcd86d8339fcf76385f7fad5e49cbfd989b6c6199127121c9587febc65/watchdog-5.0.2.tar.gz", hash = "sha256:dcebf7e475001d2cdeb020be630dc5b687e9acdd60d16fea6bb4508e7b94cf76", size = 127779 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/71/19/c5b0f64269d396dbc9f06d4b7fa8400c0282143640ebc8cbad84553ee4ee/watchdog-5.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d961f4123bb3c447d9fcdcb67e1530c366f10ab3a0c7d1c0c9943050936d4877", size = 96274 },
- { url = "https://files.pythonhosted.org/packages/5e/5e/62adbcf4d96a533d71dbd951a3c101019989c8ce8796e267d6509ba12138/watchdog-5.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72990192cb63872c47d5e5fefe230a401b87fd59d257ee577d61c9e5564c62e5", size = 88275 },
- { url = "https://files.pythonhosted.org/packages/d0/16/5b36358158b7debcae7b62fe9b6d9874c60e445b37b1e51b7c5d00c6572b/watchdog-5.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6bec703ad90b35a848e05e1b40bf0050da7ca28ead7ac4be724ae5ac2653a1a0", size = 88911 },
- { url = "https://files.pythonhosted.org/packages/80/52/51046f428e813270cd959bee9d2343f103c10adf10e957f69d6710a38ab8/watchdog-5.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:dae7a1879918f6544201d33666909b040a46421054a50e0f773e0d870ed7438d", size = 96276 },
- { url = "https://files.pythonhosted.org/packages/b3/8e/0e5671f3950fd2049bbeb8c965cb53e143bfd72869e5e4c60dda572121cd/watchdog-5.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c4a440f725f3b99133de610bfec93d570b13826f89616377715b9cd60424db6e", size = 88269 },
- { url = "https://files.pythonhosted.org/packages/b5/34/9c436ec85f7234b468e49380f57cc784b4e22f058febe17221f25ce85c4b/watchdog-5.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8b2918c19e0d48f5f20df458c84692e2a054f02d9df25e6c3c930063eca64c1", size = 88914 },
- { url = "https://files.pythonhosted.org/packages/ef/41/fe19a56aa8ea7e453311f2b4fd2bfb172d21bd72ef6ae0fd40c304c74edf/watchdog-5.0.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:aa9cd6e24126d4afb3752a3e70fce39f92d0e1a58a236ddf6ee823ff7dba28ee", size = 96365 },
- { url = "https://files.pythonhosted.org/packages/cc/02/86d631595ec1c5678e23e9359741d2dea460be0712b41a243281b37e90ba/watchdog-5.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f627c5bf5759fdd90195b0c0431f99cff4867d212a67b384442c51136a098ed7", size = 88330 },
- { url = "https://files.pythonhosted.org/packages/d8/a7/5c57f05def91ff11528f0aa0d4c23efc99fa064ec69c262fedc6c9885697/watchdog-5.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d7594a6d32cda2b49df3fd9abf9b37c8d2f3eab5df45c24056b4a671ac661619", size = 88935 },
- { url = "https://files.pythonhosted.org/packages/80/1a/a681c0093eea33b18a7348b398302628ab96647f59eaf06a5a047e8a1f39/watchdog-5.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba32efcccfe2c58f4d01115440d1672b4eb26cdd6fc5b5818f1fb41f7c3e1889", size = 96362 },
- { url = "https://files.pythonhosted.org/packages/c4/aa/0c827bd35716d91b5a4a2a6c5ca7638d936e6055dec8ce85414383ab887f/watchdog-5.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:963f7c4c91e3f51c998eeff1b3fb24a52a8a34da4f956e470f4b068bb47b78ee", size = 88336 },
- { url = "https://files.pythonhosted.org/packages/6e/ba/da13d47dacc84bfab52310e74f954eb440c5cdee11ff8786228f17343a3d/watchdog-5.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8c47150aa12f775e22efff1eee9f0f6beee542a7aa1a985c271b1997d340184f", size = 88938 },
- { url = "https://files.pythonhosted.org/packages/23/f1/dafce06a12fe2d61859aaceb81fbe3f3ed7907b81fcfa784416b1196dcfe/watchdog-5.0.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fb223456db6e5f7bd9bbd5cd969f05aae82ae21acc00643b60d81c770abd402b", size = 87795 },
- { url = "https://files.pythonhosted.org/packages/7c/63/39a71aa9cea895885b3e644b573f1d05e00e368211efe76b9a63c7623512/watchdog-5.0.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9814adb768c23727a27792c77812cf4e2fd9853cd280eafa2bcfa62a99e8bd6e", size = 88269 },
- { url = "https://files.pythonhosted.org/packages/5b/cb/c13dfc4714547c4a63f27a50d5d0bbda655ef06d93595c016822ff771032/watchdog-5.0.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:5597c051587f8757798216f2485e85eac583c3b343e9aa09127a3a6f82c65ee8", size = 78960 },
- { url = "https://files.pythonhosted.org/packages/cb/ed/78acaa8e95e193a46925f7beeed45c29569d0ee572216df622bb0908abf3/watchdog-5.0.2-py3-none-manylinux2014_armv7l.whl", hash = "sha256:53ed1bf71fcb8475dd0ef4912ab139c294c87b903724b6f4a8bd98e026862e6d", size = 78960 },
- { url = "https://files.pythonhosted.org/packages/2f/54/30bde6279d2f77e6c2838a89e9975038bba4adbfb029f9b8e01cf2813199/watchdog-5.0.2-py3-none-manylinux2014_i686.whl", hash = "sha256:29e4a2607bd407d9552c502d38b45a05ec26a8e40cc7e94db9bb48f861fa5abc", size = 78958 },
- { url = "https://files.pythonhosted.org/packages/f4/db/886241c6d02f165fbf633b633dc5ceddc6c145fec3704828606743ddb663/watchdog-5.0.2-py3-none-manylinux2014_ppc64.whl", hash = "sha256:b6dc8f1d770a8280997e4beae7b9a75a33b268c59e033e72c8a10990097e5fde", size = 78957 },
- { url = "https://files.pythonhosted.org/packages/a9/74/c255a2146280adcb2d1b5ccb7580e71114b253f356a6c4ea748b0eb7a7b5/watchdog-5.0.2-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:d2ab34adc9bf1489452965cdb16a924e97d4452fcf88a50b21859068b50b5c3b", size = 78960 },
- { url = "https://files.pythonhosted.org/packages/8a/dc/4bdc31a35ffce526280c5a29b64b939624761f47e3fcdac34808589d0845/watchdog-5.0.2-py3-none-manylinux2014_s390x.whl", hash = "sha256:7d1aa7e4bb0f0c65a1a91ba37c10e19dabf7eaaa282c5787e51371f090748f4b", size = 78959 },
- { url = "https://files.pythonhosted.org/packages/9d/53/e71b01aa5737a21664b731de5f91c5b0721ff64d237e43efc56a99254fa1/watchdog-5.0.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:726eef8f8c634ac6584f86c9c53353a010d9f311f6c15a034f3800a7a891d941", size = 78959 },
- { url = "https://files.pythonhosted.org/packages/5d/0e/c37862900200436a554a4c411645f29887fe3fb4d4e465fbedcf1e0e383a/watchdog-5.0.2-py3-none-win32.whl", hash = "sha256:bda40c57115684d0216556671875e008279dea2dc00fcd3dde126ac8e0d7a2fb", size = 78947 },
- { url = "https://files.pythonhosted.org/packages/8f/ab/f1a3791be609e18596ce6a52c00274f1b244340b87379eb78c4df15f6b2b/watchdog-5.0.2-py3-none-win_amd64.whl", hash = "sha256:d010be060c996db725fbce7e3ef14687cdcc76f4ca0e4339a68cc4532c382a73", size = 78950 },
- { url = "https://files.pythonhosted.org/packages/53/99/f5065334d157518ec8c707aa790c93d639fac582be4f7caec5db8c6fa089/watchdog-5.0.2-py3-none-win_ia64.whl", hash = "sha256:3960136b2b619510569b90f0cd96408591d6c251a75c97690f4553ca88889769", size = 78948 },
+version = "6.0.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/0c/56/90994d789c61df619bfc5ce2ecdabd5eeff564e1eb47512bd01b5e019569/watchdog-6.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1cdb490583ebd691c012b3d6dae011000fe42edb7a82ece80965b42abd61f26", size = 96390 },
+ { url = "https://files.pythonhosted.org/packages/55/46/9a67ee697342ddf3c6daa97e3a587a56d6c4052f881ed926a849fcf7371c/watchdog-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc64ab3bdb6a04d69d4023b29422170b74681784ffb9463ed4870cf2f3e66112", size = 88389 },
+ { url = "https://files.pythonhosted.org/packages/44/65/91b0985747c52064d8701e1075eb96f8c40a79df889e59a399453adfb882/watchdog-6.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c897ac1b55c5a1461e16dae288d22bb2e412ba9807df8397a635d88f671d36c3", size = 89020 },
+ { url = "https://files.pythonhosted.org/packages/e0/24/d9be5cd6642a6aa68352ded4b4b10fb0d7889cb7f45814fb92cecd35f101/watchdog-6.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6eb11feb5a0d452ee41f824e271ca311a09e250441c262ca2fd7ebcf2461a06c", size = 96393 },
+ { url = "https://files.pythonhosted.org/packages/63/7a/6013b0d8dbc56adca7fdd4f0beed381c59f6752341b12fa0886fa7afc78b/watchdog-6.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef810fbf7b781a5a593894e4f439773830bdecb885e6880d957d5b9382a960d2", size = 88392 },
+ { url = "https://files.pythonhosted.org/packages/d1/40/b75381494851556de56281e053700e46bff5b37bf4c7267e858640af5a7f/watchdog-6.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:afd0fe1b2270917c5e23c2a65ce50c2a4abb63daafb0d419fde368e272a76b7c", size = 89019 },
+ { url = "https://files.pythonhosted.org/packages/39/ea/3930d07dafc9e286ed356a679aa02d777c06e9bfd1164fa7c19c288a5483/watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948", size = 96471 },
+ { url = "https://files.pythonhosted.org/packages/12/87/48361531f70b1f87928b045df868a9fd4e253d9ae087fa4cf3f7113be363/watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860", size = 88449 },
+ { url = "https://files.pythonhosted.org/packages/5b/7e/8f322f5e600812e6f9a31b75d242631068ca8f4ef0582dd3ae6e72daecc8/watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0", size = 89054 },
+ { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480 },
+ { url = "https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451 },
+ { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057 },
+ { url = "https://files.pythonhosted.org/packages/30/ad/d17b5d42e28a8b91f8ed01cb949da092827afb9995d4559fd448d0472763/watchdog-6.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c7ac31a19f4545dd92fc25d200694098f42c9a8e391bc00bdd362c5736dbf881", size = 87902 },
+ { url = "https://files.pythonhosted.org/packages/5c/ca/c3649991d140ff6ab67bfc85ab42b165ead119c9e12211e08089d763ece5/watchdog-6.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9513f27a1a582d9808cf21a07dae516f0fab1cf2d7683a742c498b93eedabb11", size = 88380 },
+ { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079 },
+ { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078 },
+ { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076 },
+ { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077 },
+ { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078 },
+ { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077 },
+ { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078 },
+ { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065 },
+ { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070 },
+ { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067 },
]
[[package]]