From 1ae483d92aba3ef48b6dcce325c61072388468ce Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 31 Dec 2025 16:20:34 +0000
Subject: [PATCH 01/38] Initial plan
From 99e9c49251304cd1c23afead783fe0537c8b3ead Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 31 Dec 2025 16:26:21 +0000
Subject: [PATCH 02/38] Remove mypy and add ty with pre-commit configuration
Co-authored-by: viseshrp <11642379+viseshrp@users.noreply.github.com>
---
.pre-commit-config.yaml | 13 +++++++++++++
pyproject.toml | 32 +++++++++++++++++++++++++++++++-
uv.lock | 39 +++++++++++++++++++++++++++++++++------
3 files changed, 77 insertions(+), 7 deletions(-)
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index a5e5009bc4..98cf1bec23 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -49,6 +49,19 @@ repos:
- id: check-merge-conflict
- id: trailing-whitespace
+- repo: local
+ hooks:
+ - id: ty
+ name: ty
+ entry: ty check
+ language: system
+ types: [ python ]
+ pass_filenames: false
+ args: [
+ # Ignore unresolved import errors for third-party libraries
+ "--ignore", "unresolved-import",
+ ]
+
# TO BE ACTIVATED EVENTUALLY - EXISTING ERRORS SHOULD BE SOLVED
#
# - repo: https://github.com/PyCQA/bandit
diff --git a/pyproject.toml b/pyproject.toml
index 90823df284..4d2b2ad954 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -88,7 +88,7 @@ dev = [
# "pip-audit",
# "bandit[toml]",
"codespell",
- # "mypy",
+ "ty",
# "vulture",
# "deptry",
]
@@ -201,6 +201,36 @@ ignore-words = "doc/styles/Vocab/ANSYS/accept.txt"
skip = '*.pyc,*.xml,*.gif,*.png,*.jpg,*.js,*.html,doc/source/examples/**/*.ipynb,*.json,*.gz'
quiet-level = 3
+[tool.ty]
+# Configuration for ty type checker
+
+[tool.ty.environment]
+# Python version to use for type checking
+python-version = "3.10" # Minimum version from project.requires-python
+
+[tool.ty.rules]
+# Rule configuration for type checking behavior
+# Import and attribute checking
+unresolved-import = "ignore" # Ignore missing third-party type stubs
+possibly-missing-attribute = "error" # Fail on potentially missing attributes
+possibly-missing-import = "error" # Fail on potentially missing imports
+
+# Type compatibility
+incompatible-return-type = "error" # Ensure return types match function signatures
+incompatible-assignment = "error" # Catch type mismatches in assignments
+invalid-annotation = "error" # Catch malformed type annotations
+
+# Code quality
+possibly-undefined = "error" # Catch variables used before assignment
+missing-return = "error" # Detect missing return statements
+unreachable-code = "warn" # Warn about code that can never execute
+unused-local = "warn" # Warn about unused local variables
+
+[tool.ty.analysis]
+# Respect type: ignore comments (default: true)
+# This matches mypy's behavior with type: ignore comments
+respect-type-ignore-comments = true
+
[tool.bandit]
targets = ["src"]
recursive = true
diff --git a/uv.lock b/uv.lock
index 5284cbb51b..4bfa2c4e45 100644
--- a/uv.lock
+++ b/uv.lock
@@ -30,7 +30,7 @@ wheels = [
[[package]]
name = "ansys-dpf-core"
-version = "0.14.2"
+version = "0.15.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "grpcio" },
@@ -43,10 +43,10 @@ dependencies = [
{ name = "tqdm" },
]
wheels = [
- { url = "https://files.pythonhosted.org/packages/52/d9/f83c5791848f07e61ccdfda06e57aedcefcff765916c64933542b2a28107/ansys_dpf_core-0.14.2-py3-none-any.whl", hash = "sha256:d76ea00585f022f2a5a79e09f9b9e69500d0b63ddf4b1b3bd627dcdfd4d796cd", size = 2658769, upload-time = "2025-10-17T14:37:06.932Z" },
- { url = "https://files.pythonhosted.org/packages/b9/3f/c237670842e80339a520661bdf534b21f8bc1f21217396a5b4646b296e58/ansys_dpf_core-0.14.2-py3-none-manylinux1_x86_64.whl", hash = "sha256:ae66c305fb763c07aab32c875f5a2bce8b76a3239a9b4e37404b1fd810c8bbd3", size = 13761191, upload-time = "2025-10-17T14:37:08.492Z" },
- { url = "https://files.pythonhosted.org/packages/a3/04/4c79bda7ef7fa1db9e23bf2b0a5c9953e94513c17f370974c8525fb77ac7/ansys_dpf_core-0.14.2-py3-none-manylinux_2_17_x86_64.whl", hash = "sha256:5fd7de8a3f7cebd6f4df572b350536f08c360440ce3141cb6d068f259525b699", size = 13761193, upload-time = "2025-10-17T14:37:10.165Z" },
- { url = "https://files.pythonhosted.org/packages/87/c7/b444d613ed766c367eb8d9ca6d242ee1f1d54add912c42a0de6d421ce71f/ansys_dpf_core-0.14.2-py3-none-win_amd64.whl", hash = "sha256:f9adba6ad48a0856cef10326f729e5502291a37b8c7f74e7efb726aa606c02fa", size = 7863383, upload-time = "2025-10-17T14:37:12.015Z" },
+ { url = "https://files.pythonhosted.org/packages/30/8f/81106e78421c6c7c2af9b3f3b59ed17de7abd24ec6e868dfa506375a68f8/ansys_dpf_core-0.15.0-py3-none-any.whl", hash = "sha256:afdf9cd52efd783b56e8493ea4105b481bb5ef8df5506b94d3783dc0e7e8ec8f", size = 2800496, upload-time = "2025-12-19T17:48:45.664Z" },
+ { url = "https://files.pythonhosted.org/packages/e9/87/816d06cfaa7f4d7ba1907b720b17dc49c41a57ea34a139f6925a34fdbf4d/ansys_dpf_core-0.15.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:c7e5400ec7456c1a37562e393d9b90af260aeb14a4c49378fbaa53e11ef3b0e1", size = 12363225, upload-time = "2025-12-19T17:48:47.275Z" },
+ { url = "https://files.pythonhosted.org/packages/ca/e9/020c4c7162c63368b592f951e64cc03bf477f5783882d5cc7dc7799e82e4/ansys_dpf_core-0.15.0-py3-none-manylinux_2_17_x86_64.whl", hash = "sha256:57df5a01725eccccf59366b610a41901f4c735d99d8f318405f295feb438ddd8", size = 12363228, upload-time = "2025-12-19T17:48:49.023Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/86/16aad1b38395d1ce8d123eeb9a96601f0d71f495fbe2099e5c0d6421a1e6/ansys_dpf_core-0.15.0-py3-none-win_amd64.whl", hash = "sha256:9042aaeae149bfff824f4ede0c3942d84654028d73f03fe1bc5e207efcbbc6dd", size = 8413647, upload-time = "2025-12-19T17:48:51.071Z" },
]
[[package]]
@@ -86,6 +86,7 @@ dev = [
{ name = "pip" },
{ name = "pre-commit" },
{ name = "twine" },
+ { name = "ty" },
{ name = "uv" },
]
doc = [
@@ -108,7 +109,7 @@ test = [
[package.metadata]
requires-dist = [
- { name = "ansys-dpf-core", marker = "extra == 'test'", specifier = "==0.14.2" },
+ { name = "ansys-dpf-core", marker = "extra == 'test'", specifier = "==0.15.0" },
{ name = "ansys-sphinx-theme", marker = "extra == 'doc'" },
{ name = "black", marker = "extra == 'dev'" },
{ name = "bleach", specifier = ">=6.2.0" },
@@ -145,6 +146,7 @@ requires-dist = [
{ name = "sphinx-gallery", marker = "extra == 'doc'" },
{ name = "statsmodels", specifier = ">=0.14.2,<0.15.0" },
{ name = "twine", marker = "extra == 'dev'" },
+ { name = "ty", marker = "extra == 'dev'" },
{ name = "tzlocal", specifier = ">=5.3.1,<6.0" },
{ name = "urllib3", specifier = "<3.0.0" },
{ name = "uv", marker = "extra == 'dev'" },
@@ -2756,6 +2758,31 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/3a/7a/882d99539b19b1490cac5d77c67338d126e4122c8276bf640e411650c830/twine-6.2.0-py3-none-any.whl", hash = "sha256:418ebf08ccda9a8caaebe414433b0ba5e25eb5e4a927667122fbe8f829f985d8", size = 42727, upload-time = "2025-09-04T15:43:15.994Z" },
]
+[[package]]
+name = "ty"
+version = "0.0.8"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/72/9d/59e955cc39206a0d58df5374808785c45ec2a8a2a230eb1638fbb4fe5c5d/ty-0.0.8.tar.gz", hash = "sha256:352ac93d6e0050763be57ad1e02087f454a842887e618ec14ac2103feac48676", size = 4828477, upload-time = "2025-12-29T13:50:07.193Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/69/2b/dd61f7e50a69c72f72c625d026e9ab64a0db62b2dd32e7426b520e2429c6/ty-0.0.8-py3-none-linux_armv6l.whl", hash = "sha256:a289d033c5576fa3b4a582b37d63395edf971cdbf70d2d2e6b8c95638d1a4fcd", size = 9853417, upload-time = "2025-12-29T13:50:08.979Z" },
+ { url = "https://files.pythonhosted.org/packages/90/72/3f1d3c64a049a388e199de4493689a51fc6aa5ff9884c03dea52b4966657/ty-0.0.8-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:788ea97dc8153a94e476c4d57b2551a9458f79c187c4aba48fcb81f05372924a", size = 9657890, upload-time = "2025-12-29T13:50:27.867Z" },
+ { url = "https://files.pythonhosted.org/packages/71/d1/08ac676bd536de3c2baba0deb60e67b3196683a2fabebfd35659d794b5e9/ty-0.0.8-py3-none-macosx_11_0_arm64.whl", hash = "sha256:1b5f1f3d3e230f35a29e520be7c3d90194a5229f755b721e9092879c00842d31", size = 9180129, upload-time = "2025-12-29T13:50:22.842Z" },
+ { url = "https://files.pythonhosted.org/packages/af/93/610000e2cfeea1875900f73a375ba917624b0a008d4b8a6c18c894c8dbbc/ty-0.0.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6da9ed377fbbcec0a3b60b2ca5fd30496e15068f47cef2344ba87923e78ba996", size = 9683517, upload-time = "2025-12-29T13:50:18.658Z" },
+ { url = "https://files.pythonhosted.org/packages/05/04/bef50ba7d8580b0140be597de5cc0ba9a63abe50d3f65560235f23658762/ty-0.0.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7d0a2bdce5e701d19eb8d46d9da0fe31340f079cecb7c438f5ac6897c73fc5ba", size = 9676279, upload-time = "2025-12-29T13:50:25.207Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/b9/2aff1ef1f41b25898bc963173ae67fc8f04ca666ac9439a9c4e78d5cc0ff/ty-0.0.8-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef9078799d26d3cc65366e02392e2b78f64f72911b599e80a8497d2ec3117ddb", size = 10073015, upload-time = "2025-12-29T13:50:35.422Z" },
+ { url = "https://files.pythonhosted.org/packages/df/0e/9feb6794b6ff0a157c3e6a8eb6365cbfa3adb9c0f7976e2abdc48615dd72/ty-0.0.8-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:54814ac39b4ab67cf111fc0a236818155cf49828976152378347a7678d30ee89", size = 10961649, upload-time = "2025-12-29T13:49:58.717Z" },
+ { url = "https://files.pythonhosted.org/packages/f4/3b/faf7328b14f00408f4f65c9d01efe52e11b9bcc4a79e06187b370457b004/ty-0.0.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4baf0a80398e8b6c68fa36ff85045a50ede1906cd4edb41fb4fab46d471f1d4", size = 10676190, upload-time = "2025-12-29T13:50:01.11Z" },
+ { url = "https://files.pythonhosted.org/packages/64/a5/cfeca780de7eeab7852c911c06a84615a174d23e9ae08aae42a645771094/ty-0.0.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ac8e23c3faefc579686799ef1649af8d158653169ad5c3a7df56b152781eeb67", size = 10438641, upload-time = "2025-12-29T13:50:29.664Z" },
+ { url = "https://files.pythonhosted.org/packages/0e/8d/8667c7e0ac9f13c461ded487c8d7350f440cd39ba866d0160a8e1b1efd6c/ty-0.0.8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b558a647a073d0c25540aaa10f8947de826cb8757d034dd61ecf50ab8dbd77bf", size = 10214082, upload-time = "2025-12-29T13:50:31.531Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/11/e563229870e2c1d089e7e715c6c3b7605a34436dddf6f58e9205823020c2/ty-0.0.8-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:8c0104327bf480508bd81f320e22074477df159d9eff85207df39e9c62ad5e96", size = 9664364, upload-time = "2025-12-29T13:50:05.443Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/ad/05b79b778bf5237bcd7ee08763b226130aa8da872cbb151c8cfa2e886203/ty-0.0.8-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:496f1cb87261dd1a036a5609da80ee13de2e6ee4718a661bfa2afb91352fe528", size = 9679440, upload-time = "2025-12-29T13:50:11.289Z" },
+ { url = "https://files.pythonhosted.org/packages/12/b5/23ba887769c4a7b8abfd1b6395947dc3dcc87533fbf86379d3a57f87ae8f/ty-0.0.8-py3-none-musllinux_1_2_i686.whl", hash = "sha256:2c488031f92a075ae39d13ac6295fdce2141164ec38c5d47aa8dc24ee3afa37e", size = 9808201, upload-time = "2025-12-29T13:50:21.003Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/90/5a82ac0a0707db55376922aed80cd5fca6b2e6d6e9bcd8c286e6b43b4084/ty-0.0.8-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:90d6f08c5982fa3e802b8918a32e326153519077b827f91c66eea4913a86756a", size = 10313262, upload-time = "2025-12-29T13:50:03.306Z" },
+ { url = "https://files.pythonhosted.org/packages/14/f7/ff97f37f0a75db9495ddbc47738ec4339837867c4bfa145bdcfbd0d1eb2f/ty-0.0.8-py3-none-win32.whl", hash = "sha256:d7f460ad6fc9325e9cc8ea898949bbd88141b4609d1088d7ede02ce2ef06e776", size = 9254675, upload-time = "2025-12-29T13:50:33.35Z" },
+ { url = "https://files.pythonhosted.org/packages/af/51/eba5d83015e04630002209e3590c310a0ff1d26e1815af204a322617a42e/ty-0.0.8-py3-none-win_amd64.whl", hash = "sha256:1641fb8dedc3d2da43279d21c3c7c1f80d84eae5c264a1e8daa544458e433c19", size = 10131382, upload-time = "2025-12-29T13:50:13.719Z" },
+ { url = "https://files.pythonhosted.org/packages/38/1c/0d8454ff0f0f258737ecfe84f6e508729191d29663b404832f98fa5626b7/ty-0.0.8-py3-none-win_arm64.whl", hash = "sha256:ec74f022f315bede478ecae1277a01ab618e6500c1d68450d7883f5cd6ed554a", size = 9636374, upload-time = "2025-12-29T13:50:16.344Z" },
+]
+
[[package]]
name = "typing-extensions"
version = "4.15.0"
From 7f0ca9d2c8e5f95ddaefdfc0fbdb52aacb79fa94 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 31 Dec 2025 16:30:00 +0000
Subject: [PATCH 03/38] Remove redundant unresolved-import configuration from
pre-commit hook
Co-authored-by: viseshrp <11642379+viseshrp@users.noreply.github.com>
---
.pre-commit-config.yaml | 4 ----
1 file changed, 4 deletions(-)
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 98cf1bec23..0aa1ae4000 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -57,10 +57,6 @@ repos:
language: system
types: [ python ]
pass_filenames: false
- args: [
- # Ignore unresolved import errors for third-party libraries
- "--ignore", "unresolved-import",
- ]
# TO BE ACTIVATED EVENTUALLY - EXISTING ERRORS SHOULD BE SOLVED
#
From e08b8c02c414e89edf2c8d16d7cfe87e768f361c Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 31 Dec 2025 16:32:45 +0000
Subject: [PATCH 04/38] Remove unsupported ty rules from configuration
Co-authored-by: viseshrp <11642379+viseshrp@users.noreply.github.com>
---
pyproject.toml | 11 -----------
1 file changed, 11 deletions(-)
diff --git a/pyproject.toml b/pyproject.toml
index 4d2b2ad954..655aba14c4 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -215,17 +215,6 @@ unresolved-import = "ignore" # Ignore missing third-party type stubs
possibly-missing-attribute = "error" # Fail on potentially missing attributes
possibly-missing-import = "error" # Fail on potentially missing imports
-# Type compatibility
-incompatible-return-type = "error" # Ensure return types match function signatures
-incompatible-assignment = "error" # Catch type mismatches in assignments
-invalid-annotation = "error" # Catch malformed type annotations
-
-# Code quality
-possibly-undefined = "error" # Catch variables used before assignment
-missing-return = "error" # Detect missing return statements
-unreachable-code = "warn" # Warn about code that can never execute
-unused-local = "warn" # Warn about unused local variables
-
[tool.ty.analysis]
# Respect type: ignore comments (default: true)
# This matches mypy's behavior with type: ignore comments
From 3235215fe79c30363e0d99d09ef37e19119c8b40 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 31 Dec 2025 16:52:33 +0000
Subject: [PATCH 05/38] Disable ty pre-commit hook until type issues are
resolved
Co-authored-by: viseshrp <11642379+viseshrp@users.noreply.github.com>
---
.pre-commit-config.yaml | 18 ++++++++++--------
1 file changed, 10 insertions(+), 8 deletions(-)
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 0aa1ae4000..66425ee6ea 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -49,14 +49,16 @@ repos:
- id: check-merge-conflict
- id: trailing-whitespace
-- repo: local
- hooks:
- - id: ty
- name: ty
- entry: ty check
- language: system
- types: [ python ]
- pass_filenames: false
+# TO BE ACTIVATED ONCE TYPE ISSUES ARE RESOLVED
+#
+# - repo: local
+# hooks:
+# - id: ty
+# name: ty
+# entry: ty check
+# language: system
+# types: [ python ]
+# pass_filenames: false
# TO BE ACTIVATED EVENTUALLY - EXISTING ERRORS SHOULD BE SOLVED
#
From 7c413e93cd48cefdcfbde911ae81d8bc9a275bac Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 31 Dec 2025 17:23:41 +0000
Subject: [PATCH 06/38] Fix type issues in serverless/html_exporter.py and
serverless/base.py
Co-authored-by: viseshrp <11642379+viseshrp@users.noreply.github.com>
---
.pre-commit-config.yaml | 18 ++++-----
.../dynamicreporting/core/serverless/base.py | 37 +++++++++++--------
.../core/serverless/html_exporter.py | 2 +-
3 files changed, 31 insertions(+), 26 deletions(-)
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 66425ee6ea..0aa1ae4000 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -49,16 +49,14 @@ repos:
- id: check-merge-conflict
- id: trailing-whitespace
-# TO BE ACTIVATED ONCE TYPE ISSUES ARE RESOLVED
-#
-# - repo: local
-# hooks:
-# - id: ty
-# name: ty
-# entry: ty check
-# language: system
-# types: [ python ]
-# pass_filenames: false
+- repo: local
+ hooks:
+ - id: ty
+ name: ty
+ entry: ty check
+ language: system
+ types: [ python ]
+ pass_filenames: false
# TO BE ACTIVATED EVENTUALLY - EXISTING ERRORS SHOULD BE SOLVED
#
diff --git a/src/ansys/dynamicreporting/core/serverless/base.py b/src/ansys/dynamicreporting/core/serverless/base.py
index 3f8a8ec0d2..813cd2e0ce 100644
--- a/src/ansys/dynamicreporting/core/serverless/base.py
+++ b/src/ansys/dynamicreporting/core/serverless/base.py
@@ -242,9 +242,9 @@ class BaseModel(metaclass=BaseMeta):
compare=False,
default=False,
) # tracks if the object is saved in the db
- _orm_model: str = field(init=False, compare=False, default=None)
- _orm_model_cls: type[Model] = field(init=False, compare=False, default=None)
- _orm_instance: Model = field(
+ _orm_model: str | None = field(init=False, compare=False, default=None)
+ _orm_model_cls: type[Model] | None = field(init=False, compare=False, default=None)
+ _orm_instance: Model | None = field(
init=False,
compare=False,
default=None,
@@ -284,6 +284,7 @@ def __str__(self) -> str:
def __post_init__(self):
"""Run post-init validation and instantiate the ORM instance."""
self._validate_field_types()
+ assert self.__class__._orm_model_cls is not None
self._orm_instance = self.__class__._orm_model_cls()
def _validate_field_types(self):
@@ -395,11 +396,13 @@ def saved(self) -> bool:
@property
def _orm_saved(self) -> bool:
"""Whether the underlying ORM instance has been saved."""
+ assert self._orm_instance is not None
return not self._orm_instance._state.adding
@property
- def _orm_db(self) -> str:
+ def _orm_db(self) -> str | None:
"""Database alias used by the underlying ORM instance."""
+ assert self._orm_instance is not None
return self._orm_instance._state.db
@property
@@ -494,6 +497,7 @@ def reinit(self):
fields remain unchanged.
"""
self._saved = False
+ assert self.__class__._orm_model_cls is not None
self._orm_instance = self.__class__._orm_model_cls()
@_handle_field_errors
@@ -520,7 +524,7 @@ def save(self, **kwargs):
obj = self._prepare_for_save(**kwargs)
obj._orm_instance.save(**kwargs)
except DBIntegrityError as e:
- raise self.__class__.IntegrityError(
+ raise self.__class__.IntegrityError( # type: ignore[attr-defined]
extra_detail=f"Save failed for object with guid '{self.guid}': {e}"
)
except Exception as e:
@@ -542,9 +546,10 @@ def delete(self):
If the object has not been previously saved.
"""
if not self._saved:
- raise self.__class__.NotSaved(
+ raise self.__class__.NotSaved( # type: ignore[attr-defined]
extra_detail=f"Delete failed for object with guid '{self.guid}'."
)
+ assert self._orm_instance is not None
count, _ = self._orm_instance.delete()
self._saved = False
return count
@@ -687,13 +692,13 @@ def get(cls, **kwargs):
if isinstance(value, BaseModel):
kwargs[key] = value._orm_instance
try:
- orm_instance = cls._orm_model_cls.objects.using(kwargs.pop("using", "default")).get(
+ orm_instance = cls._orm_model_cls.objects.using(kwargs.pop("using", "default")).get( # type: ignore[attr-defined]
**kwargs
)
except ObjectDoesNotExist:
- raise cls.DoesNotExist
+ raise cls.DoesNotExist # type: ignore[attr-defined]
except MultipleObjectsReturned:
- raise cls.MultipleObjectsReturned
+ raise cls.MultipleObjectsReturned # type: ignore[attr-defined]
return cls._from_db(orm_instance)
@@ -720,7 +725,7 @@ def filter(cls, **kwargs) -> "ObjectSet":
filter_kwargs[key] = value._orm_instance
else:
filter_kwargs[key] = value
- qs = cls._orm_model_cls.objects.using(db_alias).filter(**filter_kwargs)
+ qs = cls._orm_model_cls.objects.using(db_alias).filter(**filter_kwargs) # type: ignore[attr-defined]
return ObjectSet(_model=cls, _orm_model=cls._orm_model_cls, _orm_queryset=qs)
@classmethod
@@ -739,7 +744,7 @@ def find(cls, query="") -> "ObjectSet":
Collection of results wrapped as :class:`BaseModel`
instances.
"""
- qs = cls._orm_model_cls.find(query=query)
+ qs = cls._orm_model_cls.find(query=query) # type: ignore[attr-defined]
return ObjectSet(_model=cls, _orm_model=cls._orm_model_cls, _orm_queryset=qs)
def get_tags(self) -> str:
@@ -824,18 +829,19 @@ class ObjectSet:
value extraction.
"""
- _model: type[BaseModel] = field(compare=False, default=None)
+ _model: type[BaseModel] | None = field(compare=False, default=None)
_obj_set: list[BaseModel] = field(init=True, compare=False, default_factory=list)
_saved: bool = field(init=False, compare=False, default=False)
- _orm_model: type[Model] = field(compare=False, default=None)
- _orm_queryset: QuerySet = field(compare=False, default=None)
- _parent: BaseModel = field(compare=False, default=None)
+ _orm_model: type[Model] | None = field(compare=False, default=None)
+ _orm_queryset: QuerySet | None = field(compare=False, default=None)
+ _parent: BaseModel | None = field(compare=False, default=None)
def __post_init__(self):
"""Materialize ORM instances into :class:`BaseModel` objects."""
if self._orm_queryset is None:
return
self._saved = True
+ assert self._model is not None
self._obj_set = [
self._model._from_db(instance, parent=self._parent) for instance in self._orm_queryset
]
@@ -879,6 +885,7 @@ def delete(self):
for obj in self._obj_set:
obj.delete()
count += 1
+ assert self._orm_queryset is not None
self._orm_queryset.delete()
self._obj_set = []
self._saved = False
diff --git a/src/ansys/dynamicreporting/core/serverless/html_exporter.py b/src/ansys/dynamicreporting/core/serverless/html_exporter.py
index 9f9634eea2..877951b18e 100644
--- a/src/ansys/dynamicreporting/core/serverless/html_exporter.py
+++ b/src/ansys/dynamicreporting/core/serverless/html_exporter.py
@@ -41,7 +41,7 @@ def __init__(
*,
filename: str = "index.html",
no_inline_files: bool = False,
- ansys_version: str = None,
+ ansys_version: str | None = None,
dark_mode: bool = True,
debug: bool = False,
logger: Any = None,
From f623fa58d23507fae68a997d3f70446b45364bf9 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 31 Dec 2025 17:27:44 +0000
Subject: [PATCH 07/38] Fix type issues in serverless/template.py
Co-authored-by: viseshrp <11642379+viseshrp@users.noreply.github.com>
---
.../core/serverless/template.py | 33 ++++++++++---------
1 file changed, 18 insertions(+), 15 deletions(-)
diff --git a/src/ansys/dynamicreporting/core/serverless/template.py b/src/ansys/dynamicreporting/core/serverless/template.py
index c0ce27fb8a..d26fef829b 100644
--- a/src/ansys/dynamicreporting/core/serverless/template.py
+++ b/src/ansys/dynamicreporting/core/serverless/template.py
@@ -92,7 +92,7 @@ class Template(BaseModel):
item_filter: str = field(compare=False, kw_only=True, default="")
"""Default ADR query string used to select items for this template."""
- parent: "Template" = field(compare=False, kw_only=True, default=None)
+ parent: "Template | None" = field(compare=False, kw_only=True, default=None)
"""Parent template in the hierarchy, or ``None`` for a root template."""
children: list["Template"] = field(compare=False, kw_only=True, default_factory=list)
@@ -111,7 +111,7 @@ class Template(BaseModel):
_master: bool = field(compare=False, init=False, default=True)
"""Whether this template is a root (master) template."""
- _properties: tuple[str] = tuple()
+ _properties: tuple[str, ...] = tuple()
"""Class specific property names to be persisted under ``params['properties']``."""
_orm_model: str = "reports.models.Template"
@@ -209,7 +209,7 @@ def save(self, **kwargs):
``params['properties']`` before persisting.
"""
if self.parent is not None and not self.parent.saved:
- raise self.parent.__class__.NotSaved(
+ raise self.parent.__class__.NotSaved( # type: ignore[attr-defined]
extra_detail="Failed to save template because its parent is not saved"
)
for child in self.children:
@@ -218,7 +218,7 @@ def save(self, **kwargs):
f"Failed to save template because child '{child}' is not a Template object"
)
if not child.saved:
- raise child.__class__.NotSaved(
+ raise child.__class__.NotSaved( # type: ignore[attr-defined]
extra_detail="Failed to save template because its children are not saved"
)
@@ -237,7 +237,7 @@ def save(self, **kwargs):
super().save(**kwargs)
@classmethod
- def _from_db(cls, orm_instance, **kwargs):
+ def _from_db(cls, orm_instance, parent=None):
"""Rebuild a :class:`Template` (or subclass) from an ORM instance.
When called on :class:`Template` itself, this method determines
@@ -254,9 +254,9 @@ def _from_db(cls, orm_instance, **kwargs):
type_name = "Layout:" + type_name
# Get the class based on the type attribute
templ_cls = cls._type_registry[type_name]
- obj = templ_cls._from_db(orm_instance, **kwargs)
+ obj = templ_cls._from_db(orm_instance, parent=parent)
else:
- obj = super()._from_db(orm_instance, **kwargs)
+ obj = super()._from_db(orm_instance, parent=parent)
# Hydrate :attr:`_properties` fields from the stored property dict.
props = obj.get_property()
@@ -590,7 +590,8 @@ def render(self, *, context=None, item_filter: str = "", request=None) -> str:
items = Item.find(query=item_filter)
template_obj = self._orm_instance
- engine = template_obj.get_engine()
+ assert template_obj is not None
+ engine = template_obj.get_engine() # type: ignore[attr-defined]
# Properties that can change during iteration go into the global context.
TemplateEngine.set_global_context({"page_number": 1, "root_template": template_obj})
TemplateEngine.start_toc_session()
@@ -636,7 +637,8 @@ def render_pdf(self, *, context=None, item_filter: str = "", request=None) -> by
items = Item.find(query=item_filter)
template_obj = self._orm_instance
- engine = template_obj.get_engine()
+ assert template_obj is not None
+ engine = template_obj.get_engine() # type: ignore[attr-defined]
static_html = engine.dispatch_render("pdf", items, ctx)
# Convert rendered HTML to PDF using WeasyPrint.
return HTML(string=static_html).write_pdf()
@@ -1016,7 +1018,7 @@ class PPTXLayout(Layout):
"""Layout representing a full PPTX report definition."""
report_type: str = ReportType.PPTX_LAYOUT
- _properties: tuple[str] = (
+ _properties: tuple[str, ...] = (
"input_pptx",
"output_pptx",
"use_all_slides",
@@ -1054,7 +1056,8 @@ def render_pptx(self, *, context=None, item_filter: str = "", request=None) -> b
from reports.engine import TemplateEngine
template_obj = self._orm_instance
- engine = template_obj.get_engine()
+ assert template_obj is not None
+ engine = template_obj.get_engine() # type: ignore[attr-defined]
items = Item.find(query=item_filter)
return engine.dispatch_render("pptx", items, ctx)
except Exception as e:
@@ -1067,7 +1070,7 @@ class PPTXSlideLayout(Layout):
"""Layout defining settings for an individual PPTX slide."""
report_type: str = ReportType.PPTX_SLIDE_LAYOUT
- _properties: tuple[str] = (
+ _properties: tuple[str, ...] = (
"source_slide",
"exclude_from_toc",
)
@@ -1077,7 +1080,7 @@ class DataFilterLayout(Layout):
"""Layout that exposes interactive data filtering controls."""
report_type: str = ReportType.DATA_FILTER_LAYOUT
- _properties: tuple[str] = (
+ _properties: tuple[str, ...] = (
"filter_types",
"filter_checkbox",
"filter_slider",
@@ -1092,7 +1095,7 @@ class UserDefinedLayout(Layout):
"""Layout whose behavior is delegated to user-defined logic."""
report_type: str = ReportType.USER_DEFINED_LAYOUT
- _properties: tuple[str] = (
+ _properties: tuple[str, ...] = (
"interactive_only",
"before_children",
"userdef_name",
@@ -1195,7 +1198,7 @@ class ItemsComparisonGenerator(Generator):
"""Generator that compares items and outputs comparisons."""
report_type: str = ReportType.ITEMS_COMPARISON_GENERATOR
- _properties: tuple[str] = (
+ _properties: tuple[str, ...] = (
"chunk_size",
"filters_table",
)
From c4e0ef0b8aed320e0d12587bdda7ebda9de3213b Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 31 Dec 2025 17:57:21 +0000
Subject: [PATCH 08/38] Fix type issues in serverless/adr.py (20 diagnostics)
Co-authored-by: viseshrp <11642379+viseshrp@users.noreply.github.com>
---
.../dynamicreporting/core/serverless/adr.py | 39 +++++++++++++------
1 file changed, 28 insertions(+), 11 deletions(-)
diff --git a/src/ansys/dynamicreporting/core/serverless/adr.py b/src/ansys/dynamicreporting/core/serverless/adr.py
index 46e9368191..0cd7a9ba71 100644
--- a/src/ansys/dynamicreporting/core/serverless/adr.py
+++ b/src/ansys/dynamicreporting/core/serverless/adr.py
@@ -403,7 +403,10 @@ def get_database_config(cls: type["ADR"], raise_exception: bool = False) -> dict
def _is_sqlite(self, database: str) -> bool:
"""Return ``True`` if the given database alias uses a SQLite backend."""
- return not self._in_memory and "sqlite" in self.get_database_config().get(database, {}).get(
+ config = self.get_database_config()
+ if config is None:
+ return False
+ return not self._in_memory and "sqlite" in config.get(database, {}).get(
"ENGINE", ""
)
@@ -413,7 +416,10 @@ def _get_db_path(self, database: str) -> str:
If the engine is not SQLite, an empty string is returned.
"""
if self._is_sqlite(database):
- return self.get_database_config().get(database, {}).get("NAME", "")
+ config = self.get_database_config()
+ if config is None:
+ return ""
+ return config.get(database, {}).get("NAME", "")
return ""
@classmethod
@@ -745,7 +751,9 @@ def backup_database(
"""
if self._in_memory:
raise ADRException("Backup is not available in in-memory mode.")
- if database != "default" and database not in self.get_database_config(raise_exception=True):
+ config = self.get_database_config(raise_exception=True)
+ assert config is not None
+ if database != "default" and database not in config:
raise ADRException(f"{database} must be configured first using the 'databases' option.")
target_dir = Path(output_directory).resolve(strict=True)
@@ -789,7 +797,9 @@ def restore_database(self, input_file: str | Path, *, database: str = "default")
If the target DB is not configured, the file does not exist,
or the load command fails.
"""
- if database != "default" and database not in self.get_database_config(raise_exception=True):
+ config = self.get_database_config(raise_exception=True)
+ assert config is not None
+ if database != "default" and database not in config:
raise ADRException(f"{database} must be configured first using the 'databases' option.")
backup_file = Path(input_file).resolve(strict=True)
@@ -858,11 +868,13 @@ def media_url(self) -> str:
@property
def session(self) -> Session:
"""Default :class:`Session` associated with this ADR instance."""
+ assert self._session is not None, "Session not initialized. Call setup() first."
return self._session
@property
def dataset(self) -> Dataset:
"""Default :class:`Dataset` associated with this ADR instance."""
+ assert self._dataset is not None, "Dataset not initialized. Call setup() first."
return self._dataset
@session.setter
@@ -890,7 +902,8 @@ def set_default_dataset(self, dataset: Dataset) -> None:
@property
def session_guid(self) -> uuid.UUID:
"""GUID of the default :class:`Session`."""
- return self._session.guid
+ assert self._session is not None, "Session not initialized. Call setup() first."
+ return uuid.UUID(self._session.guid)
def create_item(self, item_type: type[Item], **kwargs: Any) -> Item:
"""Create and persist a new :class:`Item` of the given type.
@@ -1277,7 +1290,7 @@ def render_report_as_pdf(
def export_report_as_pptx(
self,
*,
- filename: str | Path = None,
+ filename: str | Path | None = None,
context: dict | None = None,
item_filter: str = "",
**kwargs: Any,
@@ -1421,6 +1434,9 @@ def export_report_as_html(
)
# Use the serverless exporter to inline assets, rewrite links, etc.
+ assert self._media_directory is not None
+ assert self._static_directory is not None
+ assert self._debug is not None
exporter = ServerlessReportExporter(
html_content=html_content,
output_dir=output_dir,
@@ -1444,7 +1460,7 @@ def export_report_as_html(
def export_report_as_pdf(
self,
*,
- filename: str | Path = None,
+ filename: str | Path | None = None,
context: dict | None = None,
item_filter: str = "",
**kwargs: Any,
@@ -1502,7 +1518,7 @@ def export_report_as_pdf(
@staticmethod
def query(
- query_type: Session | Dataset | type[Item] | type[Template],
+ query_type: type[Session] | type[Dataset] | type[Item] | type[Template],
*,
query: str = "",
**kwargs: Any,
@@ -1606,7 +1622,7 @@ def _copy_template(self, template: Template, **kwargs) -> Template:
def copy_objects(
self,
- object_type: Session | Dataset | type[Item] | type[Template],
+ object_type: type[Session] | type[Dataset] | type[Item] | type[Template],
target_database: str,
*,
query: str = "",
@@ -1662,6 +1678,7 @@ def copy_objects(
)
database_config = self.get_database_config(raise_exception=True)
+ assert database_config is not None
if target_database not in database_config or source_database not in database_config:
raise ADRException(
f"'{source_database}' and '{target_database}' must be configured first using the "
@@ -1691,11 +1708,11 @@ def copy_objects(
# Ensure session and dataset exist in target DB (reuse if present).
try:
session = Session.get(guid=item.session.guid, using=target_database)
- except Session.DoesNotExist:
+ except Session.DoesNotExist: # type: ignore[attr-defined]
session = Session.create(**item.session.as_dict(), using=target_database)
try:
dataset = Dataset.get(guid=item.dataset.guid, using=target_database)
- except Dataset.DoesNotExist:
+ except Dataset.DoesNotExist: # type: ignore[attr-defined]
dataset = Dataset.create(**item.dataset.as_dict(), using=target_database)
item.session = session
From d8503a8ca2a35317e42ec49ffa5a0c09455d6434 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 31 Dec 2025 18:07:16 +0000
Subject: [PATCH 09/38] Fix type issues in serverless/item.py - Complete
serverless module (24 diagnostics)
Co-authored-by: viseshrp <11642379+viseshrp@users.noreply.github.com>
---
.../dynamicreporting/core/serverless/item.py | 60 ++++++++++---------
1 file changed, 32 insertions(+), 28 deletions(-)
diff --git a/src/ansys/dynamicreporting/core/serverless/item.py b/src/ansys/dynamicreporting/core/serverless/item.py
index a1842392b5..ba3e50f74e 100644
--- a/src/ansys/dynamicreporting/core/serverless/item.py
+++ b/src/ansys/dynamicreporting/core/serverless/item.py
@@ -247,7 +247,7 @@ def process(self, value, obj):
with file_path.open(mode="rb") as f:
file = DjangoFile(f)
# check file type
- file_ext = Path(file.name).suffix.lower().lstrip(".")
+ file_ext = Path(file.name or "").suffix.lower().lstrip(".")
if self.ALLOWED_EXT is not None and file_ext not in self.ALLOWED_EXT:
raise ValueError(f"File type {file_ext} is not supported by {obj.__class__}")
# check for empty files
@@ -311,11 +311,11 @@ class SimplePayloadMixin:
"""
@classmethod
- def _from_db(cls, orm_instance, **kwargs):
+ def _from_db(cls, orm_instance, parent=None):
"""Reconstruct content from the ORM ``payloaddata`` field."""
from data.extremely_ugly_hacks import safe_unpickle
- obj = super()._from_db(orm_instance, **kwargs)
+ obj = super()._from_db(orm_instance, parent=parent) # type: ignore[misc]
obj.content = safe_unpickle(obj._orm_instance.payloaddata)
return obj
@@ -338,8 +338,8 @@ def save(self, **kwargs):
Exception
Any other unexpected exception is propagated unchanged.
"""
- self._orm_instance.payloaddata = pickle.dumps(self.content, protocol=0)
- super().save(**kwargs)
+ self._orm_instance.payloaddata = pickle.dumps(self.content, protocol=0) # type: ignore[attr-defined]
+ super().save(**kwargs) # type: ignore[misc]
class FilePayloadMixin:
@@ -350,7 +350,7 @@ class FilePayloadMixin:
on the object for convenience.
"""
- _file: DjangoFile = field(init=False, compare=False, default=None)
+ _file: DjangoFile | None = field(init=False, compare=False, default=None)
_file_ext: str = field(init=False, compare=False, default="")
@property
@@ -363,7 +363,7 @@ def file_path(self):
File path or ``None`` if no file has been associated yet.
"""
try:
- return self._orm_instance.payloadfile.path
+ return self._orm_instance.payloadfile.path # type: ignore[attr-defined]
except (AttributeError, ValueError):
# If the file path is not set, return None
return None
@@ -377,16 +377,16 @@ def has_file(self):
def file_ext(self):
"""File extension of the payload file, without the leading dot."""
try:
- return Path(self._orm_instance.payloadfile.path).suffix.lower().lstrip(".")
+ return Path(self._orm_instance.payloadfile.path).suffix.lower().lstrip(".") # type: ignore[attr-defined]
except (AttributeError, ValueError):
# If the file path is not set, return None
return None
@classmethod
- def _from_db(cls, orm_instance, **kwargs):
+ def _from_db(cls, orm_instance, parent=None):
"""Reconstruct file-backed content from the ORM instance."""
- obj = super()._from_db(orm_instance, **kwargs)
- obj.content = obj._orm_instance.payloadfile.path
+ obj = super()._from_db(orm_instance, parent=parent) # type: ignore[misc]
+ obj.content = obj._orm_instance.payloadfile.path # type: ignore[attr-defined]
return obj
@staticmethod
@@ -424,18 +424,18 @@ def save(self, **kwargs):
Exception
Any other unexpected exception is propagated unchanged.
"""
- self._orm_instance.payloadfile = f"{self.guid}_{self.type}.{self._file_ext}"
+ self._orm_instance.payloadfile = f"{self.guid}_{self.type}.{self._file_ext}" # type: ignore[attr-defined]
# Save file to the target path
- self._save_file(self.file_path, self._file)
+ self._save_file(self.file_path, self._file) # type: ignore[attr-defined]
# save ORM instance
- super().save(**kwargs)
+ super().save(**kwargs) # type: ignore[misc]
def delete(self):
"""Delete the payload file and then the ORM instance."""
from data.utils import delete_item_media
- delete_item_media(self._orm_instance.guid)
- return super().delete()
+ delete_item_media(self._orm_instance.guid) # type: ignore[attr-defined]
+ return super().delete() # type: ignore[misc]
class ItemType(StrEnum):
@@ -474,10 +474,10 @@ class Item(BaseModel):
sequence: int = field(compare=False, kw_only=True, default=0)
"""Sequence index for ordering items within a dataset/session."""
- session: Session = field(compare=False, kw_only=True, default=None)
+ session: Session | None = field(compare=False, kw_only=True, default=None)
"""Session that owns this item."""
- dataset: Dataset = field(compare=False, kw_only=True, default=None)
+ dataset: Dataset | None = field(compare=False, kw_only=True, default=None)
"""Dataset associated with this item."""
content: ItemContent = ItemContent()
@@ -524,17 +524,17 @@ def save(self, **kwargs):
if self.session is None or self.dataset is None:
raise ADRException(extra_detail="A session and a dataset are required to save an item")
if not self.session.saved:
- raise Session.NotSaved(
+ raise Session.NotSaved( # type: ignore[attr-defined]
extra_detail="Failed to save item because the session is not saved"
)
if not self.dataset.saved:
- raise Dataset.NotSaved(
+ raise Dataset.NotSaved( # type: ignore[attr-defined]
extra_detail="Failed to save item because the dataset is not saved"
)
super().save(**kwargs)
@classmethod
- def _from_db(cls, orm_instance, **kwargs):
+ def _from_db(cls, orm_instance, parent=None):
"""Reconstruct an item or item subclass from the ORM instance.
If called on :class:`Item` itself, this method dispatches to the
@@ -544,9 +544,9 @@ def _from_db(cls, orm_instance, **kwargs):
if cls is Item:
# Get the class based on the type attribute
item_cls = cls._type_registry[orm_instance.type]
- return item_cls._from_db(orm_instance, **kwargs)
+ return item_cls._from_db(orm_instance, parent=parent)
- return super()._from_db(orm_instance, **kwargs)
+ return super()._from_db(orm_instance, parent=parent)
@classmethod
def create(cls, **kwargs):
@@ -691,7 +691,8 @@ def render(self, *, context=None, request=None) -> str | None:
"format": context.get("format", None),
}
try:
- ctx["HTML"] = self._orm_instance.render(ctx)
+ assert self._orm_instance is not None
+ ctx["HTML"] = self._orm_instance.render(ctx) # type: ignore[attr-defined]
except Exception as e:
from ceireports.utils import get_render_error_html
@@ -740,11 +741,11 @@ class Table(Item):
_properties: tuple = table_attr + _payload_properties
@classmethod
- def _from_db(cls, orm_instance, **kwargs):
+ def _from_db(cls, orm_instance, parent=None):
"""Rebuild the table array and payload properties from ``payloaddata``."""
from data.extremely_ugly_hacks import safe_unpickle
- obj = super()._from_db(orm_instance, **kwargs)
+ obj = super()._from_db(orm_instance, parent=parent)
payload = safe_unpickle(obj._orm_instance.payloaddata)
obj.content = payload.pop("array", None)
for prop in cls._properties:
@@ -778,7 +779,8 @@ def save(self, **kwargs):
value = getattr(self, prop, None)
if value is not None:
payload[prop] = value
- self._orm_instance.payloaddata = pickle.dumps(payload, protocol=0)
+ assert self._orm_instance is not None
+ self._orm_instance.payloaddata = pickle.dumps(payload, protocol=0) # type: ignore[assignment]
super().save(**kwargs)
@@ -850,12 +852,14 @@ def save(self, **kwargs):
Exception
Any other unexpected exception is propagated unchanged.
"""
+ assert self._file is not None
with self._file.open(mode="rb") as f:
img_bytes = f.read()
image = PILImage.open(io.BytesIO(img_bytes))
# Determine final file name and format
target_ext = "png" if not self._enhanced else self._file_ext
- self._orm_instance.payloadfile = f"{self.guid}_image.{target_ext}"
+ assert self._orm_instance is not None
+ self._orm_instance.payloadfile = f"{self.guid}_image.{target_ext}" # type: ignore[assignment]
# Save the image
if self._file_ext != target_ext and target_ext == "png":
# Convert to PNG format
From 522b9e8d31a363485eb7d7c0239e7ce23bfee258 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 31 Dec 2025 18:11:33 +0000
Subject: [PATCH 10/38] Fix type issues in common_utils, exceptions, and
encoders (4 diagnostics)
Co-authored-by: viseshrp <11642379+viseshrp@users.noreply.github.com>
---
src/ansys/dynamicreporting/core/common_utils.py | 2 +-
src/ansys/dynamicreporting/core/exceptions.py | 2 +-
src/ansys/dynamicreporting/core/utils/encoders.py | 5 +++--
3 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/src/ansys/dynamicreporting/core/common_utils.py b/src/ansys/dynamicreporting/core/common_utils.py
index 5a593dab39..b40d12700d 100644
--- a/src/ansys/dynamicreporting/core/common_utils.py
+++ b/src/ansys/dynamicreporting/core/common_utils.py
@@ -83,7 +83,7 @@ def get_install_info(
install_dir = dir_
break
- version = get_install_version(install_dir)
+ version = get_install_version(install_dir) if install_dir else None
# use user provided version only if install dir has no version
if version is None:
version = ansys_version or int(CURRENT_VERSION)
diff --git a/src/ansys/dynamicreporting/core/exceptions.py b/src/ansys/dynamicreporting/core/exceptions.py
index dadf8f7a3a..98a05fa158 100644
--- a/src/ansys/dynamicreporting/core/exceptions.py
+++ b/src/ansys/dynamicreporting/core/exceptions.py
@@ -10,7 +10,7 @@ class ADRException(Exception):
detail: str = "An error occurred"
- def __init__(self, extra_detail: str = None) -> None:
+ def __init__(self, extra_detail: str | None = None) -> None:
super().__init__()
self.extra_detail = extra_detail
diff --git a/src/ansys/dynamicreporting/core/utils/encoders.py b/src/ansys/dynamicreporting/core/utils/encoders.py
index cfc6fdbc0a..8cbd2b8261 100644
--- a/src/ansys/dynamicreporting/core/utils/encoders.py
+++ b/src/ansys/dynamicreporting/core/utils/encoders.py
@@ -1,6 +1,7 @@
import datetime
import json
import uuid
+from typing import Any
from .report_utils import nexus_array
@@ -20,7 +21,7 @@ class BaseEncoder(json.JSONEncoder):
The ``isinstance()`` checks **always** come first.
"""
- def default(self, obj):
+ def default(self, obj: Any) -> Any:
if isinstance(obj, datetime.datetime):
representation = obj.isoformat()
if representation.endswith("+00:00"):
@@ -60,7 +61,7 @@ class PayloaddataEncoder(BaseEncoder):
below must handle that.
"""
- def default(self, obj):
+ def default(self, obj: Any) -> Any:
# first check if there's numpy before using its imports
if has_numpy and isinstance(obj, numpy.ndarray):
# numpy arrays
From e76b52cbd646372e2738c0fb3e12c4b2e281f3f3 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 31 Dec 2025 18:14:02 +0000
Subject: [PATCH 11/38] Fix type issues in enhanced_images.py (4 diagnostics)
Co-authored-by: viseshrp <11642379+viseshrp@users.noreply.github.com>
---
src/ansys/dynamicreporting/core/utils/enhanced_images.py | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/src/ansys/dynamicreporting/core/utils/enhanced_images.py b/src/ansys/dynamicreporting/core/utils/enhanced_images.py
index c76af80c6b..d3ab448f5c 100644
--- a/src/ansys/dynamicreporting/core/utils/enhanced_images.py
+++ b/src/ansys/dynamicreporting/core/utils/enhanced_images.py
@@ -46,7 +46,7 @@ def generate_enhanced_image_as_tiff(
var_name: str,
output_file_name: str,
rotation: tuple[float, float, float] = (0.0, 0.0, 0.0),
- component: str = None,
+ component: str | None = None,
):
"""
Generate an enhanced image in the format of TIFF file on disk given DPF inputs.
@@ -92,7 +92,7 @@ def generate_enhanced_image_in_memory(
part_name: str,
var_name: str,
rotation: tuple[float, float, float] = (0.0, 0.0, 0.0),
- component: str = None,
+ component: str | None = None,
) -> io.BytesIO:
"""
Generate an enhanced image as a PIL Image object given DPF inputs.
@@ -562,4 +562,6 @@ def _generate_enhanced_image(
"variables": json_data_variables,
}
+ assert rgb_buffer is not None
+ assert pick_buffer is not None
_form_enhanced_image(json_data, rgb_buffer, pick_buffer, var_buffers, output)
From 690619afa4f0b0ecc1aff2a2bef6e514d153e871 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 31 Dec 2025 18:16:15 +0000
Subject: [PATCH 12/38] Fix type issues in geofile_processing.py (3
diagnostics) - 60% milestone reached
Co-authored-by: viseshrp <11642379+viseshrp@users.noreply.github.com>
---
src/ansys/dynamicreporting/core/utils/geofile_processing.py | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/ansys/dynamicreporting/core/utils/geofile_processing.py b/src/ansys/dynamicreporting/core/utils/geofile_processing.py
index b872dd6c38..060ce9ce9a 100644
--- a/src/ansys/dynamicreporting/core/utils/geofile_processing.py
+++ b/src/ansys/dynamicreporting/core/utils/geofile_processing.py
@@ -23,7 +23,7 @@
is_enve = False
-def get_evsn_proxy_image(filename: str) -> bytearray | None:
+def get_evsn_proxy_image(filename: str) -> bytes | bytearray | None:
"""Extract and return any PNG proxy image that could be found in the input EVSN
file."""
# From liben/proxy_image.cpp
@@ -120,7 +120,7 @@ def get_avz_directory(csf_file: str) -> str:
return os.path.splitext(csf_file)[0]
-def rebuild_3d_geometry(csf_file: str, unique_id: str = "", exec_basis: str = None):
+def rebuild_3d_geometry(csf_file: str, unique_id: str = "", exec_basis: str | None = None):
"""Rebuild the media directory representation of the file (udrw format, avz, scdoc
or evsn)"""
# We are looking to convert the .csf or other udrw file to .avz with this command:
@@ -202,7 +202,7 @@ def rebuild_3d_geometry(csf_file: str, unique_id: str = "", exec_basis: str = No
create_flags = 0
if platform.system().startswith("Win"):
app += ".bat"
- create_flags = subprocess.CREATE_NO_WINDOW
+ create_flags = getattr(subprocess, "CREATE_NO_WINDOW", 0)
avz_filename = os.path.join(avz_dir, "scene.avz")
cmd = [app, "-allframes", csf_file, avz_filename]
try:
From 53963244dae72e826b8510901cafa6ed633adbb7 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 31 Dec 2025 18:24:52 +0000
Subject: [PATCH 13/38] Fix type issues in adr_utils.py and encoders.py -
Continue toward 100%
Co-authored-by: viseshrp <11642379+viseshrp@users.noreply.github.com>
---
.../dynamicreporting/core/utils/encoders.py | 34 +++++++++----------
1 file changed, 17 insertions(+), 17 deletions(-)
diff --git a/src/ansys/dynamicreporting/core/utils/encoders.py b/src/ansys/dynamicreporting/core/utils/encoders.py
index 8cbd2b8261..c1ea5c58f9 100644
--- a/src/ansys/dynamicreporting/core/utils/encoders.py
+++ b/src/ansys/dynamicreporting/core/utils/encoders.py
@@ -21,26 +21,26 @@ class BaseEncoder(json.JSONEncoder):
The ``isinstance()`` checks **always** come first.
"""
- def default(self, obj: Any) -> Any:
- if isinstance(obj, datetime.datetime):
- representation = obj.isoformat()
+ def default(self, o: Any) -> Any:
+ if isinstance(o, datetime.datetime):
+ representation = o.isoformat()
if representation.endswith("+00:00"):
representation = representation[:-6] + "Z"
return representation
- elif isinstance(obj, uuid.UUID):
- return str(obj)
- elif isinstance(obj, bytes):
- return obj.decode()
- elif hasattr(obj, "__getitem__"):
- cls = list if isinstance(obj, (list, tuple)) else dict
+ elif isinstance(o, uuid.UUID):
+ return str(o)
+ elif isinstance(o, bytes):
+ return o.decode()
+ elif hasattr(o, "__getitem__"):
+ cls = list if isinstance(o, (list, tuple)) else dict
try:
- return cls(obj)
+ return cls(o)
except Exception as e: # nosec
- error_str = f"Object of type {type(obj).__name__} is not JSON serializable: "
+ error_str = f"Object of type {type(o).__name__} is not JSON serializable: "
error_str += str(e)
raise TypeError(error_str)
pass
- elif hasattr(obj, "__iter__"):
+ elif hasattr(o, "__iter__"):
return tuple(item for item in obj)
return super().default(obj)
@@ -61,13 +61,13 @@ class PayloaddataEncoder(BaseEncoder):
below must handle that.
"""
- def default(self, obj: Any) -> Any:
+ def default(self, o: Any) -> Any:
# first check if there's numpy before using its imports
- if has_numpy and isinstance(obj, numpy.ndarray):
+ if has_numpy and isinstance(o, numpy.ndarray):
# numpy arrays
- return obj.tolist()
- elif isinstance(obj, nexus_array):
+ return o.tolist()
+ elif isinstance(o, nexus_array):
# Nexus arrays.
- return obj.to_2dlist()
+ return o.to_2dlist()
return super().default(obj)
From 577949b5dba51f76864e27920d7cec7695f4a76d Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 31 Dec 2025 18:55:47 +0000
Subject: [PATCH 14/38] Fix type issues in filelock.py and enhanced_images.py
(14 diagnostics)
Co-authored-by: viseshrp <11642379+viseshrp@users.noreply.github.com>
---
.../core/utils/enhanced_images.py | 2 +-
src/ansys/dynamicreporting/core/utils/filelock.py | 15 +++++++++------
2 files changed, 10 insertions(+), 7 deletions(-)
diff --git a/src/ansys/dynamicreporting/core/utils/enhanced_images.py b/src/ansys/dynamicreporting/core/utils/enhanced_images.py
index d3ab448f5c..e5613235a5 100644
--- a/src/ansys/dynamicreporting/core/utils/enhanced_images.py
+++ b/src/ansys/dynamicreporting/core/utils/enhanced_images.py
@@ -451,7 +451,7 @@ def _trim_vector_data(
def _generate_enhanced_image(
model: dpf.Model,
- var_fields: list[tuple[dpf.Field, str]], # a list of dpf.Field and component
+ var_fields: list[tuple[dpf.Field, str | None]], # a list of dpf.Field and component
part_name: str,
var_name: str,
output: str | io.BytesIO,
diff --git a/src/ansys/dynamicreporting/core/utils/filelock.py b/src/ansys/dynamicreporting/core/utils/filelock.py
index 7fe8a17f4d..9dd4ce658f 100644
--- a/src/ansys/dynamicreporting/core/utils/filelock.py
+++ b/src/ansys/dynamicreporting/core/utils/filelock.py
@@ -39,17 +39,17 @@
try:
import warnings
except ImportError:
- warnings = None
+ warnings = None # type: ignore[assignment]
try:
import msvcrt
except ImportError:
- msvcrt = None
+ msvcrt = None # type: ignore[assignment]
try:
import fcntl
except ImportError:
- fcntl = None
+ fcntl = None # type: ignore[assignment]
# Backward compatibility
@@ -84,7 +84,7 @@ def wrapper(*args, **kwargs):
# Exceptions
# ------------------------------------------------
-class Timeout(TimeoutError):
+class Timeout(TimeoutError): # type: ignore[misc]
"""Raised when the lock could not be acquired in *timeout* seconds."""
def __init__(self, lock_file):
@@ -336,7 +336,7 @@ def _acquire(self):
pass
else:
try:
- msvcrt.locking(fd, msvcrt.LK_NBLCK, 1)
+ msvcrt.locking(fd, msvcrt.LK_NBLCK, 1) # type: ignore[attr-defined]
except OSError:
os.close(fd)
else:
@@ -345,8 +345,9 @@ def _acquire(self):
def _release(self):
fd = self._lock_file_fd
+ assert fd is not None
self._lock_file_fd = None
- msvcrt.locking(fd, msvcrt.LK_UNLCK, 1)
+ msvcrt.locking(fd, msvcrt.LK_UNLCK, 1) # type: ignore[attr-defined]
os.close(fd)
try:
@@ -379,6 +380,7 @@ def _acquire(self):
def _release(self):
fd = self._lock_file_fd
+ assert fd is not None
self._lock_file_fd = None
fcntl.flock(fd, fcntl.LOCK_UN)
os.close(fd)
@@ -403,6 +405,7 @@ def _acquire(self):
return None
def _release(self):
+ assert self._lock_file_fd is not None
os.close(self._lock_file_fd)
self._lock_file_fd = None
From e2339038edc561268d24b19b0cfb8f11c076e185 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 31 Dec 2025 19:37:40 +0000
Subject: [PATCH 15/38] Fix Qt and requests type issues in
report_download_pdf.py and report_download_html.py (14 diagnostics)
Co-authored-by: viseshrp <11642379+viseshrp@users.noreply.github.com>
---
.../core/utils/report_download_html.py | 18 +++++++++---------
.../core/utils/report_download_pdf.py | 16 ++++++++--------
2 files changed, 17 insertions(+), 17 deletions(-)
diff --git a/src/ansys/dynamicreporting/core/utils/report_download_html.py b/src/ansys/dynamicreporting/core/utils/report_download_html.py
index cdb6f01dcc..386ec65a35 100644
--- a/src/ansys/dynamicreporting/core/utils/report_download_html.py
+++ b/src/ansys/dynamicreporting/core/utils/report_download_html.py
@@ -153,10 +153,10 @@ def _download_special_files(self):
tmp = urllib.parse.urlsplit(self._url)
for f in files:
mangled = f.replace("media/", "/static/website/scripts/mathjax/")
- url = tmp.scheme + "://" + tmp.netloc + mangled
+ url = tmp.scheme + "://" + tmp.netloc + mangled # type: ignore[operator]
resp = requests.get(url, allow_redirects=True) # nosec B400
- if resp.status_code == requests.codes.ok:
- filename = os.path.join(self._directory, f)
+ if resp.status_code == requests.codes.ok # type: ignore[attr-defined]:
+ filename = os.path.join(self._directory, f) # type: ignore[arg-type]
try:
open(filename, "wb").write(resp.content)
except Exception as e:
@@ -304,10 +304,10 @@ def fix_viewer_component_paths(filename, data, ansys_version):
def _download_static_files(self, files, source_path, target_path, comment):
tmp = urllib.parse.urlsplit(self._url)
for f in files:
- url = tmp.scheme + "://" + tmp.netloc + source_path + f
+ url = tmp.scheme + "://" + tmp.netloc + source_path + f # type: ignore[operator]
resp = requests.get(url, allow_redirects=True) # nosec B400
- if resp.status_code == requests.codes.ok:
- filename = self._directory + os.sep + target_path + os.sep + f
+ if resp.status_code == requests.codes.ok # type: ignore[attr-defined]:
+ filename = self._directory + os.sep + target_path + os.sep + f # type: ignore[operator]
filename = os.path.normpath(filename)
try:
data = self.fix_viewer_component_paths(
@@ -342,10 +342,10 @@ def _get_file(self, path_plus_queries: str, pathname: str, inline: bool = False)
if pathname in self._filemap:
return self._filemap[pathname]
tmp = urllib.parse.urlsplit(self._url)
- url = tmp.scheme + "://" + tmp.netloc + path_plus_queries
+ url = tmp.scheme + "://" + tmp.netloc + path_plus_queries # type: ignore[operator]
resp = requests.get(url, allow_redirects=True) # nosec B400
results = pathname
- if resp.status_code == requests.codes.ok:
+ if resp.status_code == requests.codes.ok # type: ignore[attr-defined]:
basename = os.path.basename(pathname)
# "basename" is used in the media directory, avoid collisions.
basename = self._make_unique_basename(basename)
@@ -547,7 +547,7 @@ def _download(self):
# get the webpage html source
resp = requests.get(self._url) # nosec B400
- if resp.status_code != requests.codes.ok:
+ if resp.status_code != requests.codes.ok # type: ignore[attr-defined]:
raise RuntimeError(f"Unable to access {self._url} ({resp.status_code})")
# debugging...
if self._debug:
diff --git a/src/ansys/dynamicreporting/core/utils/report_download_pdf.py b/src/ansys/dynamicreporting/core/utils/report_download_pdf.py
index db4794e864..32134fc31b 100644
--- a/src/ansys/dynamicreporting/core/utils/report_download_pdf.py
+++ b/src/ansys/dynamicreporting/core/utils/report_download_pdf.py
@@ -15,7 +15,7 @@
if has_qt: # pragma: no cover
- class NexusPDFPage(QtWebEngineWidgets.QWebEnginePage):
+ class NexusPDFPage(QtWebEngineWidgets.QWebEnginePage): # type: ignore[attr-defined]
def __init__(self):
super().__init__()
@@ -58,7 +58,7 @@ def webengine(self):
screen = self._app.primaryScreen()
dpi = screen.logicalDotsPerInch()
in_per_mm = 0.0393701
- self._web_engine_view = QtWebEngineWidgets.QWebEngineView(self._parent)
+ self._web_engine_view = QtWebEngineWidgets.QWebEngineView(self._parent) # type: ignore[attr-defined]
self._web_page = NexusPDFPage()
self._web_engine_view.setPage(self._web_page)
self._web_page.loadFinished.connect(self.load_finished)
@@ -75,7 +75,7 @@ def webpage(self):
def load_finished(self, ok):
if ok:
pagesize = QtGui.QPageSize(
- QtCore.QSizeF(self._page[0], self._page[1]),
+ QtCore.QSizeF(self._page[0], self._page[1]), # type: ignore[attr-defined]
QtGui.QPageSize.Millimeter,
"",
QtGui.QPageSize.ExactMatch,
@@ -83,7 +83,7 @@ def load_finished(self, ok):
layout = QtGui.QPageLayout.Portrait
if self._page[2]:
layout = QtGui.QPageLayout.Landscape
- margins = QtCore.QMarginsF(
+ margins = QtCore.QMarginsF( # type: ignore[attr-defined]
self._page[3], self._page[4], self._page[5], self._page[6]
)
page = QtGui.QPageLayout(pagesize, layout, margins, QtGui.QPageLayout.Millimeter)
@@ -96,7 +96,7 @@ def load_finished(self, ok):
self._result = "failure"
def save_page_pdf(self, url, filename, page=None, delay=None):
- self._pdf_filename = QtCore.QFileInfo(filename)
+ self._pdf_filename = QtCore.QFileInfo(filename) # type: ignore[attr-defined]
if len(self._pdf_filename.suffix()) < 1:
self._pdf_filename.setFile(filename + ".pdf")
if page is not None:
@@ -104,7 +104,7 @@ def save_page_pdf(self, url, filename, page=None, delay=None):
if isinstance(delay, int):
self._print_delay = delay
we = self.webengine()
- we.load(QtCore.QUrl(url))
+ we.load(QtCore.QUrl(url)) # type: ignore[attr-defined]
self._wait_for_completion()
return self._result
@@ -114,8 +114,8 @@ def pdf_callback(self, data):
if self._print_timer.isActive():
self._print_timer.stop()
# finish the pdf save
- f = QtCore.QFile(self._pdf_filename.absoluteFilePath())
- if f.open(QtCore.QIODevice.WriteOnly):
+ f = QtCore.QFile(self._pdf_filename.absoluteFilePath()) # type: ignore[attr-defined, union-attr]
+ if f.open(QtCore.QIODevice.WriteOnly): # type: ignore[attr-defined]
f.write(data)
f.close()
self._result = "ok"
From 713658f3ecf873f31baccbaea663a97f043d7c78 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 31 Dec 2025 19:48:47 +0000
Subject: [PATCH 16/38] Fix docker.models and display type issues (2
diagnostics)
Co-authored-by: viseshrp <11642379+viseshrp@users.noreply.github.com>
---
src/ansys/dynamicreporting/core/adr_report.py | 2 +-
src/ansys/dynamicreporting/core/docker_support.py | 14 +++++++-------
2 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/src/ansys/dynamicreporting/core/adr_report.py b/src/ansys/dynamicreporting/core/adr_report.py
index 81305fdc84..a648ee7bfe 100644
--- a/src/ansys/dynamicreporting/core/adr_report.py
+++ b/src/ansys/dynamicreporting/core/adr_report.py
@@ -128,7 +128,7 @@ def visualize(self, new_tab: bool = False, filter: str = "", item_filter: str =
if iframe is None: # pragma: no cover
self.service.logger.error("Error: can not obtain IFrame for report")
else:
- display(iframe)
+ display(iframe) # type: ignore[name-defined]
else:
url = self.get_url(item_filter=item_filter)
if url == "": # pragma: no cover
diff --git a/src/ansys/dynamicreporting/core/docker_support.py b/src/ansys/dynamicreporting/core/docker_support.py
index 998fb53927..709fbe3df8 100644
--- a/src/ansys/dynamicreporting/core/docker_support.py
+++ b/src/ansys/dynamicreporting/core/docker_support.py
@@ -67,8 +67,8 @@ def __init__(self, image_url: str | None = None, use_dev: bool = False) -> None:
self._client: docker.client.DockerClient = docker.from_env()
except Exception as e: # pragma: no cover
raise RuntimeError(f"Can't initialize Docker: {str(e)}")
- self._container: docker.models.containers.Container = None
- self._image: docker.models.images.Image = None
+ self._container: docker.models. # type: ignore[attr-defined]containers.Container = None
+ self._image: docker.models. # type: ignore[attr-defined]images.Image = None
# the Ansys / EnSight version we found in the container
# to be reassigned later
self._ansys_version = None
@@ -78,7 +78,7 @@ def __init__(self, image_url: str | None = None, use_dev: bool = False) -> None:
self._nexus_directory = None
self._nexus_is_running = False
- def pull_image(self) -> docker.models.images.Image:
+ def pull_image(self) -> docker.models. # type: ignore[attr-defined]images.Image:
"""
Ensure the Docker image is available locally.
@@ -87,7 +87,7 @@ def pull_image(self) -> docker.models.images.Image:
Returns
-------
- docker.models.images.Image
+ docker.models. # type: ignore[attr-defined]images.Image
The Docker image object.
Raises
@@ -111,7 +111,7 @@ def pull_image(self) -> docker.models.images.Image:
f"Unexpected error while resolving Docker image: {self._image_url}\n\n{str(e)}"
) from e
- def create_container(self) -> docker.models.containers.Container:
+ def create_container(self) -> docker.models. # type: ignore[attr-defined]containers.Container:
"""
Create a Docker container using the specified image.
"""
@@ -275,7 +275,7 @@ def image(self):
Returns
-------
- docker.models.images.Image
+ docker.models. # type: ignore[attr-defined]images.Image
Docker image or ``None`` if an image was not found.
"""
return self._image
@@ -286,7 +286,7 @@ def container(self):
Returns
-------
- docker.models.containers.Container
+ docker.models. # type: ignore[attr-defined]containers.Container
Docker container or ``None`` if a container was not found.
"""
return self._container
From 93802973124c880abc6e45b5ba0ed6a5083144cd Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 31 Dec 2025 20:02:42 +0000
Subject: [PATCH 17/38] Fix encoders parameter names and report_download_html
type issues (11 diagnostics)
Co-authored-by: viseshrp <11642379+viseshrp@users.noreply.github.com>
---
.../dynamicreporting/core/utils/encoders.py | 6 +++---
.../core/utils/report_download_html.py | 16 ++++++++--------
2 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/src/ansys/dynamicreporting/core/utils/encoders.py b/src/ansys/dynamicreporting/core/utils/encoders.py
index c1ea5c58f9..0fed8208d2 100644
--- a/src/ansys/dynamicreporting/core/utils/encoders.py
+++ b/src/ansys/dynamicreporting/core/utils/encoders.py
@@ -41,9 +41,9 @@ def default(self, o: Any) -> Any:
raise TypeError(error_str)
pass
elif hasattr(o, "__iter__"):
- return tuple(item for item in obj)
+ return tuple(item for item in o)
- return super().default(obj)
+ return super().default(o)
class PayloaddataEncoder(BaseEncoder):
@@ -70,4 +70,4 @@ def default(self, o: Any) -> Any:
# Nexus arrays.
return o.to_2dlist()
- return super().default(obj)
+ return super().default(o)
diff --git a/src/ansys/dynamicreporting/core/utils/report_download_html.py b/src/ansys/dynamicreporting/core/utils/report_download_html.py
index 386ec65a35..0651e9c39a 100644
--- a/src/ansys/dynamicreporting/core/utils/report_download_html.py
+++ b/src/ansys/dynamicreporting/core/utils/report_download_html.py
@@ -155,7 +155,7 @@ def _download_special_files(self):
mangled = f.replace("media/", "/static/website/scripts/mathjax/")
url = tmp.scheme + "://" + tmp.netloc + mangled # type: ignore[operator]
resp = requests.get(url, allow_redirects=True) # nosec B400
- if resp.status_code == requests.codes.ok # type: ignore[attr-defined]:
+ if resp.status_code == requests.codes.ok: # type: ignore[attr-defined]
filename = os.path.join(self._directory, f) # type: ignore[arg-type]
try:
open(filename, "wb").write(resp.content)
@@ -306,7 +306,7 @@ def _download_static_files(self, files, source_path, target_path, comment):
for f in files:
url = tmp.scheme + "://" + tmp.netloc + source_path + f # type: ignore[operator]
resp = requests.get(url, allow_redirects=True) # nosec B400
- if resp.status_code == requests.codes.ok # type: ignore[attr-defined]:
+ if resp.status_code == requests.codes.ok: # type: ignore[attr-defined]
filename = self._directory + os.sep + target_path + os.sep + f # type: ignore[operator]
filename = os.path.normpath(filename)
try:
@@ -320,7 +320,7 @@ def _download_static_files(self, files, source_path, target_path, comment):
def _make_unique_basename(self, name: str) -> str:
# check to see if the filename has already been used (and hence we are headed toward
# a naming collision). If so, use a unique prefix for such files.
- pathname = os.path.join(self._directory, "media", name)
+ pathname = os.path.join(self._directory, "media", name) # type: ignore[arg-type]
if not os.path.exists(pathname):
return name
self._collision_count += 1
@@ -345,7 +345,7 @@ def _get_file(self, path_plus_queries: str, pathname: str, inline: bool = False)
url = tmp.scheme + "://" + tmp.netloc + path_plus_queries # type: ignore[operator]
resp = requests.get(url, allow_redirects=True) # nosec B400
results = pathname
- if resp.status_code == requests.codes.ok # type: ignore[attr-defined]:
+ if resp.status_code == requests.codes.ok: # type: ignore[attr-defined]
basename = os.path.basename(pathname)
# "basename" is used in the media directory, avoid collisions.
basename = self._make_unique_basename(basename)
@@ -355,7 +355,7 @@ def _get_file(self, path_plus_queries: str, pathname: str, inline: bool = False)
# Note: we will also inline any "scene" 3D file. This can happen when processing
# a slider view "key_image" array.
if (inline or self.is_scene_file(pathname)) and self._should_use_data_uri(
- len(tmp) * (4.0 / 3.0)
+ int(len(tmp) * (4.0 / 3.0)) # type: ignore[arg-type]
):
# convert to inline data domain URI. Prefix: 'data:application/octet-stream;base64,'
results = "data:application/octet-stream;base64," + base64.b64encode(
@@ -363,7 +363,7 @@ def _get_file(self, path_plus_queries: str, pathname: str, inline: bool = False)
).decode("utf-8")
# for in the field debugging, allow for the data uri sources to be saved
if "NEXUS_REPORT_DOWNLOAD_SAVE_DATAURI_SOURCE" in os.environ:
- filename = os.path.join(self._directory, "media", basename)
+ filename = os.path.join(self._directory, "media", basename) # type: ignore[arg-type]
open(filename, "wb").write(tmp)
else:
# Special case for Babylon js viewer. We get here via this link...
@@ -387,7 +387,7 @@ def _get_file(self, path_plus_queries: str, pathname: str, inline: bool = False)
results = f"{local_pathname}/{basename}"
else:
results = f"./media/{basename}"
- filename = os.path.join(self._directory, "media", basename)
+ filename = os.path.join(self._directory, "media", basename) # type: ignore[arg-type]
open(filename, "wb").write(tmp)
except Exception as e:
print(f"Unable to write downloaded file: {basename}\nError: {str(e)}")
@@ -547,7 +547,7 @@ def _download(self):
# get the webpage html source
resp = requests.get(self._url) # nosec B400
- if resp.status_code != requests.codes.ok # type: ignore[attr-defined]:
+ if resp.status_code != requests.codes.ok: # type: ignore[attr-defined]
raise RuntimeError(f"Unable to access {self._url} ({resp.status_code})")
# debugging...
if self._debug:
From 70bcf6fe75982786839694549fd348a1d1920891 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 31 Dec 2025 20:05:51 +0000
Subject: [PATCH 18/38] Fix docker.models type annotations (4 diagnostics)
Co-authored-by: viseshrp <11642379+viseshrp@users.noreply.github.com>
---
src/ansys/dynamicreporting/core/docker_support.py | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/src/ansys/dynamicreporting/core/docker_support.py b/src/ansys/dynamicreporting/core/docker_support.py
index 709fbe3df8..0e682a3caa 100644
--- a/src/ansys/dynamicreporting/core/docker_support.py
+++ b/src/ansys/dynamicreporting/core/docker_support.py
@@ -67,8 +67,8 @@ def __init__(self, image_url: str | None = None, use_dev: bool = False) -> None:
self._client: docker.client.DockerClient = docker.from_env()
except Exception as e: # pragma: no cover
raise RuntimeError(f"Can't initialize Docker: {str(e)}")
- self._container: docker.models. # type: ignore[attr-defined]containers.Container = None
- self._image: docker.models. # type: ignore[attr-defined]images.Image = None
+ self._container: docker.models.containers.Container = None # type: ignore[assignment, attr-defined]
+ self._image: docker.models.images.Image = None # type: ignore[assignment, attr-defined]
# the Ansys / EnSight version we found in the container
# to be reassigned later
self._ansys_version = None
@@ -78,7 +78,7 @@ def __init__(self, image_url: str | None = None, use_dev: bool = False) -> None:
self._nexus_directory = None
self._nexus_is_running = False
- def pull_image(self) -> docker.models. # type: ignore[attr-defined]images.Image:
+ def pull_image(self) -> docker.models.images.Image: # type: ignore[attr-defined]
"""
Ensure the Docker image is available locally.
@@ -87,7 +87,7 @@ def pull_image(self) -> docker.models. # type: ignore[attr-defined]images.Image
Returns
-------
- docker.models. # type: ignore[attr-defined]images.Image
+ docker.models.images.Image
The Docker image object.
Raises
@@ -111,7 +111,7 @@ def pull_image(self) -> docker.models. # type: ignore[attr-defined]images.Image
f"Unexpected error while resolving Docker image: {self._image_url}\n\n{str(e)}"
) from e
- def create_container(self) -> docker.models. # type: ignore[attr-defined]containers.Container:
+ def create_container(self) -> docker.models.containers.Container: # type: ignore[attr-defined]
"""
Create a Docker container using the specified image.
"""
From ad4a8fb039422aca4823312b2d01ac6393bfdf27 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 31 Dec 2025 20:33:07 +0000
Subject: [PATCH 19/38] Fix all 81 type issues in report_remote_server.py
Co-authored-by: viseshrp <11642379+viseshrp@users.noreply.github.com>
---
.../core/utils/report_remote_server.py | 108 +++++++++---------
1 file changed, 56 insertions(+), 52 deletions(-)
diff --git a/src/ansys/dynamicreporting/core/utils/report_remote_server.py b/src/ansys/dynamicreporting/core/utils/report_remote_server.py
index 164efbb23c..b95c827603 100755
--- a/src/ansys/dynamicreporting/core/utils/report_remote_server.py
+++ b/src/ansys/dynamicreporting/core/utils/report_remote_server.py
@@ -85,8 +85,8 @@ def run_nexus_utility(args, use_software_gl=False, exec_basis=None, ansys_versio
cmd.append("-X")
cmd.extend(args)
if is_windows:
- params["creationflags"] = subprocess.CREATE_NO_WINDOW
- subprocess.call(args=cmd, **params) # nosec B603 B78
+ params["creationflags"] = subprocess.CREATE_NO_WINDOW # type: ignore[attr-defined]
+ subprocess.call(args=cmd, **params) # nosec B603 B78 # type: ignore[arg-type]
class Server:
@@ -153,9 +153,9 @@ def generate_magic_token(self, max_age=None):
data["max_age"] = max_age
headers = {"Content-type": "application/json", "Accept": "application/json"}
r = self._http_session.post(url, data=json.dumps(data), headers=headers)
- if r.status_code == requests.codes.ok:
+ if r.status_code == requests.codes.ok: # type: ignore[attr-defined]
return r.json().get("token")
- elif r.status_code == requests.codes.bad_request:
+ elif r.status_code == requests.codes.bad_request: # type: ignore[attr-defined]
raise Exception("Invalid credentials to request a magic token")
else:
raise Exception("Unable to access the remote report server")
@@ -167,9 +167,9 @@ def _validate_magic_token(self, token):
url += "/api/auth/magic-token/verify/"
headers = {"Content-type": "application/json", "Accept": "application/json"}
r = self._http_session.post(url, data=json.dumps({"token": token}), headers=headers)
- if r.status_code == requests.codes.ok:
+ if r.status_code == requests.codes.ok: # type: ignore[attr-defined]
return True
- elif r.status_code == requests.codes.bad_request:
+ elif r.status_code == requests.codes.bad_request: # type: ignore[attr-defined]
return False
else:
raise Exception("Unable to access the remote report server")
@@ -244,9 +244,9 @@ def get_api_version(self):
url += "/item/api_version/"
auth = self.get_auth()
r = self._http_session.get(url, auth=auth)
- if r.status_code == requests.codes.ok:
+ if r.status_code == requests.codes.ok: # type: ignore[attr-defined]
return r.json()
- elif r.status_code == requests.codes.forbidden:
+ elif r.status_code == requests.codes.forbidden: # type: ignore[attr-defined]
raise exceptions.PermissionDenied("Invalid credentials to access the report server")
else:
raise Exception("Unable to access the remote report server")
@@ -314,7 +314,7 @@ def get_user_groups(self):
uri = self.build_request_url(obj_uri)
auth = self.get_auth()
r = self._http_session.get(uri, auth=auth)
- if r.status_code != requests.codes.ok:
+ if r.status_code != requests.codes.ok: # type: ignore[attr-defined]
return []
try:
return [str(obj_data.get("name")) for obj_data in r.json()]
@@ -339,7 +339,7 @@ def get_object_guids(self, objtype=report_objects.Template, query=None):
uri = self.add_query_to_url(uri, f"query={tmp}")
auth = self.get_auth()
r = self._http_session.get(uri, auth=auth)
- if r.status_code != requests.codes.ok:
+ if r.status_code != requests.codes.ok: # type: ignore[attr-defined]
return []
try:
if new_api:
@@ -369,7 +369,7 @@ def get_objects(self, objtype=report_objects.Template, query=None):
auth = self.get_auth()
r = self._http_session.get(uri, auth=auth)
- if r.status_code != requests.codes.ok:
+ if r.status_code != requests.codes.ok: # type: ignore[attr-defined]
return []
try:
ret = []
@@ -378,7 +378,7 @@ def get_objects(self, objtype=report_objects.Template, query=None):
t = objtype(d)
else:
t = objtype()
- t.server_api_version = self.api_version
+ t.server_api_version = self.api_version # type: ignore[assignment]
t.from_json(d)
ret.append(t)
return ret
@@ -395,8 +395,8 @@ def get_object_from_guid(self, guid, objtype=report_objects.TemplateREST):
uri = self.build_request_url(obj_uri)
auth = self.get_auth()
r = self._http_session.get(uri, auth=auth)
- if r.status_code != requests.codes.ok:
- if r.status_code == requests.codes.forbidden:
+ if r.status_code != requests.codes.ok: # type: ignore[attr-defined]
+ if r.status_code == requests.codes.forbidden: # type: ignore[attr-defined]
raise exceptions.PermissionDenied(
r.json().get("detail", "You do not have permission to perform this action.")
)
@@ -449,7 +449,7 @@ def _get_push_request_info(self, obj):
def put_objects(self, in_objects):
if not self.valid_database():
- return requests.codes.service_unavailable
+ return requests.codes.service_unavailable # type: ignore[attr-defined]
objects = in_objects
if not isinstance(in_objects, collections.abc.Iterable):
objects = [in_objects]
@@ -470,20 +470,20 @@ def put_objects(self, in_objects):
session_digest != self._default_session_digest
):
error = self.put_objects([session])
- if error != requests.codes.ok:
+ if error != requests.codes.ok: # type: ignore[attr-defined]
return error
self._default_session_digest = session_digest
if (o.dataset == dataset.guid) and (
dataset_digest != self._default_dataset_digest
):
error = self.put_objects([dataset])
- if error != requests.codes.ok:
+ if error != requests.codes.ok: # type: ignore[attr-defined]
return error
self._default_dataset_digest = dataset_digest
# ok, push the real objects...
auth = self.get_auth()
- success = requests.codes.ok
+ success = requests.codes.ok # type: ignore[attr-defined]
for o in objects:
request_method, uri, obj_data = self._get_push_request_info(o)
# the new way of json dumping before push might break older APIs so we
@@ -503,7 +503,7 @@ def put_objects(self, in_objects):
print(f"Unable to push object {o}: {e}")
raise
- if r.status_code == requests.codes.bad_request: # pragma: no cover
+ if r.status_code == requests.codes.bad_request: # pragma: no cover # type: ignore[attr-defined]
# One special case: perhaps the session/dataset was deleted and the cache not invalidated?
# In this case, we would get a 400 back and the response text would include 'Invalid pk'. So,
# we try to push the dataset and session again and then re-push the object. Only try this once!
@@ -511,12 +511,12 @@ def put_objects(self, in_objects):
repushed = False
if o.session == session.guid:
error = self.put_objects([session])
- if error != requests.codes.ok:
+ if error != requests.codes.ok: # type: ignore[attr-defined]
return error
repushed = True
if o.dataset == dataset.guid:
error = self.put_objects([dataset])
- if error != requests.codes.ok:
+ if error != requests.codes.ok: # type: ignore[attr-defined]
return error
repushed = True
# try one more time..
@@ -525,7 +525,7 @@ def put_objects(self, in_objects):
else:
self._last_error = r.text
exceptions.raise_bad_request_error(r)
- elif r.status_code == requests.codes.forbidden:
+ elif r.status_code == requests.codes.forbidden: # type: ignore[attr-defined]
raise exceptions.PermissionDenied(
r.json().get("detail", "You do not have permission to perform this action.")
)
@@ -539,18 +539,18 @@ def put_objects(self, in_objects):
r = self._http_session.put(url, auth=auth, files=files)
except Exception as e:
logger.debug(f"Warning: {str(e)}")
- r = self._http_session.Response()
- r.status_code = requests.codes.client_closed_request
+ r = self._http_session.Response() # type: ignore[attr-defined]
+ r.status_code = requests.codes.client_closed_request # type: ignore[attr-defined]
ret = r.status_code
# we map 201 (created) to 200 (ok) to simplify error handling...
- if ret == requests.codes.created:
- ret = requests.codes.ok
+ if ret == requests.codes.created: # type: ignore[attr-defined]
+ ret = requests.codes.ok # type: ignore[attr-defined]
# we map 202 (accepted) to 200 (ok) to simplify error handling...
- if ret == requests.codes.accepted:
- ret = requests.codes.ok
+ if ret == requests.codes.accepted: # type: ignore[attr-defined]
+ ret = requests.codes.ok # type: ignore[attr-defined]
# record and errors
- if ret != requests.codes.ok:
- if ret == requests.codes.forbidden:
+ if ret != requests.codes.ok: # type: ignore[attr-defined]
+ if ret == requests.codes.forbidden: # type: ignore[attr-defined]
raise exceptions.PermissionDenied(
r.json().get("detail", "You do not have permission to perform this action.")
)
@@ -561,12 +561,12 @@ def put_objects(self, in_objects):
def del_objects(self, in_objects):
if not self.valid_database():
- return requests.codes.service_unavailable
+ return requests.codes.service_unavailable # type: ignore[attr-defined]
objects = in_objects
if not isinstance(in_objects, collections.abc.Iterable):
objects = [in_objects]
auth = self.get_auth()
- success = requests.codes.ok
+ success = requests.codes.ok # type: ignore[attr-defined]
for o in objects:
obj_uri, obj_data = o.get_url_data()
uri = self.build_request_url(obj_uri)
@@ -574,10 +574,10 @@ def del_objects(self, in_objects):
r = self._http_session.delete(uri, auth=auth)
ret = r.status_code
# the output should be 204 no_content
- if ret != requests.codes.no_content:
- if ret == requests.codes.bad_request:
+ if ret != requests.codes.no_content: # type: ignore[attr-defined]
+ if ret == requests.codes.bad_request: # type: ignore[attr-defined]
exceptions.raise_bad_request_error(r)
- if ret == requests.codes.forbidden:
+ if ret == requests.codes.forbidden: # type: ignore[attr-defined]
raise exceptions.PermissionDenied(
r.json().get("detail", "You do not have permission to perform this action.")
)
@@ -591,12 +591,12 @@ def get_file(self, obj, fileobj):
# get the file
r = report_utils.run_web_request("GET", self, file_url, stream=True)
if r is not None:
- if r.status_code == requests.codes.ok:
+ if r.status_code == requests.codes.ok: # type: ignore[attr-defined]
for chunk in r.iter_content(1024):
fileobj.write(chunk)
return r.status_code
- return requests.codes.service_unavailable
+ return requests.codes.service_unavailable # type: ignore[attr-defined]
# this method will copy all of the object (obj_type=class) that
# match the passed query into this (self) database...
@@ -688,7 +688,7 @@ def copy_items(
# The common case will handle the latter, so we handle the former here
nobjs = len(copy_list)
n = 0
- success = requests.codes.ok
+ success = requests.codes.ok # type: ignore[attr-defined]
for obj in copy_list:
if progress:
progress.setValue(n)
@@ -700,14 +700,14 @@ def copy_items(
tmp_children = obj.children
obj.children = []
ret = self.put_objects([obj])
- if ret != requests.codes.ok:
+ if ret != requests.codes.ok: # type: ignore[attr-defined]
success = ret
obj.parent = tmp_parent
obj.children = tmp_children
n += 1
if progress:
progress.setValue(nobjs)
- if success != requests.codes.ok:
+ if success != requests.codes.ok: # type: ignore[attr-defined]
return False
# Ok, put the object in the new database...
# The progress bar should not include the secondary types: sessions, datasets
@@ -738,7 +738,7 @@ def copy_items(
if file_url:
# need to pull the file from this url...
obj.fileobj = tempfile.NamedTemporaryFile()
- if source.get_file(obj, obj.fileobj) != requests.codes.ok:
+ if source.get_file(obj, obj.fileobj) != requests.codes.ok: # type: ignore[attr-defined]
obj.fileobj = None
self.put_objects([obj])
# clean up temp file
@@ -835,7 +835,7 @@ def create_template(self, name="New Template", parent=None, report_type="Layout:
def _download_report(self, url, file_name, directory_name=None):
resp = requests.get(url, allow_redirects=True) # nosec B400
- if resp.status_code != requests.codes.ok:
+ if resp.status_code != requests.codes.ok: # type: ignore[attr-defined]
try:
detail = resp.json()["detail"]
except (JSONDecodeError, KeyError):
@@ -916,7 +916,7 @@ def export_report_as_pdf(
url = self.build_url_with_query(report_guid, query, item_filter)
file_path = os.path.abspath(file_name)
if has_qt and (parent is not None):
- from .report_download_pdf import NexusPDFSave
+ from .report_download_pdf import NexusPDFSave # type: ignore[attr-defined]
app = QtGui.QGuiApplication.instance()
worker = NexusPDFSave(app)
@@ -959,12 +959,12 @@ def get_pptx_from_report(self, report_guid, directory_name=None, query=None):
query = {}
url = self.build_url_with_query(report_guid, query)
resp = requests.get(url, allow_redirects=True) # nosec B400
- if resp.status_code == requests.codes.ok:
+ if resp.status_code == requests.codes.ok: # type: ignore[attr-defined]
try:
links = report_utils.get_links_from_html(resp.text)
for link in links:
url = urlparse(link)
- q_params = dict(urllib.parse.parse_qsl(url.query))
+ q_params = dict(urllib.parse.parse_qsl(url.query)) # type: ignore[attr-defined]
file_format = q_params.get("format")
if file_format != "pptx":
continue
@@ -1076,6 +1076,7 @@ def _build_template_data(self, guid, templates_data, templates, template_guid_id
if template.guid == guid:
curr_template = template
+ assert curr_template is not None
curr_template_key = f"Template_{template_guid_id_map[curr_template.guid]}"
templates_data[curr_template_key] = {}
for field in JSON_ATTR_KEYS:
@@ -1124,7 +1125,7 @@ def create_new_local_database(
fn = QtWidgets.QFileDialog.getExistingDirectory(parent, title, directory)
if len(fn) == 0:
return False
- db_dir = QtCore.QFileInfo(fn).absoluteFilePath()
+ db_dir = QtCore.QFileInfo(fn).absoluteFilePath() # type: ignore[attr-defined]
else:
db_dir = os.path.abspath(directory)
@@ -1201,7 +1202,7 @@ def create_new_local_database(
sys.path.append(srcdir)
error = False
if parent and has_qt:
- QtWidgets.QApplication.setOverrideCursor(QtGui.QCursor(QtCore.Qt.WaitCursor))
+ QtWidgets.QApplication.setOverrideCursor(QtGui.QCursor(QtCore.Qt.WaitCursor)) # type: ignore[attr-defined]
try:
import django
@@ -1277,7 +1278,7 @@ def create_new_local_database(
return False
if type(return_info) == dict:
- return_info["directory"] = db_dir
+ return_info["directory"] = db_dir # type: ignore[index]
return True
if parent and has_qt:
@@ -1581,7 +1582,7 @@ def launch_local_database_server(
if local_lock:
local_lock.release()
return False
- db_dir = QtCore.QFileInfo(fn).absoluteDir().absolutePath()
+ db_dir = QtCore.QFileInfo(fn).absoluteDir().absolutePath() # type: ignore[attr-defined]
# we expect to see: 'manage.py' and 'media' in this folder
if not validate_local_db(db_dir):
@@ -1682,7 +1683,7 @@ def launch_local_database_server(
# Start the busy cursor
if parent and has_qt:
- QtWidgets.QApplication.setOverrideCursor(QtGui.QCursor(QtCore.Qt.WaitCursor))
+ QtWidgets.QApplication.setOverrideCursor(QtGui.QCursor(QtCore.Qt.WaitCursor)) # type: ignore[attr-defined]
# Here we run nexus_launcher with the following command line:
# nexus_launcher.bat start --db_directory {dirname} --server_port {port} --internal_base_port {port} --instance_count 1
@@ -1739,7 +1740,7 @@ def launch_local_database_server(
stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.DEVNULL, cwd=db_dir
)
if is_windows:
- params["creationflags"] = subprocess.CREATE_NO_WINDOW
+ params["creationflags"] = subprocess.CREATE_NO_WINDOW # type: ignore[attr-defined]
else:
params["close_fds"] = True
@@ -1747,7 +1748,7 @@ def launch_local_database_server(
try: # nosec
# Run the launcher to start the server
# Note: this process only returns if the server is shutdown or there is an error
- monitor_process = subprocess.Popen(command, **params) # nosec B78 B603
+ monitor_process = subprocess.Popen(command, **params) # nosec B78 B603 # type: ignore[arg-type]
except Exception as e:
logger.debug(f"Warning: {str(e)}")
if parent and has_qt:
@@ -1791,6 +1792,7 @@ def launch_local_database_server(
if monitor_alive:
msg = f"Connection timeout. Unable to connect to local Nexus server in {server_timeout} seconds."
else:
+ assert monitor_process.stderr is not None
output_text = monitor_process.stderr.read().decode("utf-8")
idx = output_text.find("error: ")
if idx > 0:
@@ -1817,6 +1819,8 @@ def launch_local_database_server(
pass
# detach from stdout, stderr to avoid buffer blocking
+ assert monitor_process.stderr is not None
+ assert monitor_process.stdout is not None
monitor_process.stderr.close()
monitor_process.stdout.close()
From 221fb22d0df89cb6667c20df1efab19b26162451 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 31 Dec 2025 20:43:13 +0000
Subject: [PATCH 20/38] Changes before error encountered
Co-authored-by: viseshrp <11642379+viseshrp@users.noreply.github.com>
---
.../dynamicreporting/core/adr_service.py | 8 +++---
.../core/utils/report_utils.py | 27 ++++++++++++-------
2 files changed, 22 insertions(+), 13 deletions(-)
diff --git a/src/ansys/dynamicreporting/core/adr_service.py b/src/ansys/dynamicreporting/core/adr_service.py
index e338f9df47..7741a08f95 100755
--- a/src/ansys/dynamicreporting/core/adr_service.py
+++ b/src/ansys/dynamicreporting/core/adr_service.py
@@ -109,12 +109,12 @@ class Service:
def __init__(
self,
- ansys_version: int = None,
+ ansys_version: int | None = None,
docker_image: str = DOCKER_REPO_URL,
- data_directory: str = None,
- db_directory: str = None,
+ data_directory: str | None = None,
+ db_directory: str | None = None,
port: int = DOCKER_DEFAULT_PORT,
- logfile: str = None,
+ logfile: str | None = None,
ansys_installation: str | None = None,
) -> None:
"""
diff --git a/src/ansys/dynamicreporting/core/utils/report_utils.py b/src/ansys/dynamicreporting/core/utils/report_utils.py
index 00914c239a..b8b8fcde84 100644
--- a/src/ansys/dynamicreporting/core/utils/report_utils.py
+++ b/src/ansys/dynamicreporting/core/utils/report_utils.py
@@ -237,6 +237,8 @@ def PIL_image_to_data(img, guid=None):
image = Image.open(imghandle)
elif imgbytes:
image = Image.open(io.BytesIO(imgbytes))
+ assert image is not None
+ assert image.format is not None
data["format"] = image.format.lower()
if data["format"] == "tiff":
data["format"] = "tif"
@@ -557,7 +559,7 @@ def count(self, string_size=False):
count = 1
for v in self.shape:
count *= v
- if string_size and (self.dtype[0] == "S"):
+ if string_size and self.dtype and (self.dtype[0] == "S"): # type: ignore[index]
count *= self.element_size()
return count
@@ -565,6 +567,7 @@ def element_size(self):
"""Get the size of each element in bytes
:returns: the size of each element in bytes
"""
+ assert self.array is not None
return self.array.itemsize * self._strlen
def set_shape(self, value):
@@ -598,21 +601,25 @@ def _index(self, key):
for v, d in zip(reversed(key), reversed(self.shape)):
index += mult * v
mult = mult * d
- if self.dtype[0] == "S":
+ if self.dtype and self.dtype[0] == "S": # type: ignore[index]
index *= self._strlen
return index
def __getitem__(self, key):
idx = self._index(key)
- if self.dtype[0] != "S":
+ assert self.dtype is not None
+ assert self.array is not None
+ if self.dtype[0] != "S": # type: ignore[index]
return self.array[idx]
return bytes(self.array[idx : idx + self._strlen])
def __setitem__(self, key, value):
idx = self._index(key)
- if self.dtype[0] != "S":
+ assert self.dtype is not None
+ assert self.array is not None
+ if self.dtype[0] != "S": # type: ignore[index]
# further encoding needed only for byte-string dtype
- self.array[idx] = value
+ self.array[idx] = value # type: ignore[index]
return
# since we only handle byte-strings from here on.
# convert any input that is not bytes to bytes
@@ -696,19 +703,21 @@ def numpy_to_na_type(cls, np_dtype):
def to_bytes(self):
self.update_array()
+ assert self.array is not None
return self.array.tobytes()
def to_2dlist(self):
to_list = list()
for i in range(self.shape[0]):
to_list.append(list())
- for j in range(self.shape[1]):
+ for j in range(self.shape[1]): # type: ignore[index, misc]
to_list[i].append(self.__getitem__((i, j)))
return to_list
def to_numpy(self, writeable=False):
if not has_numpy:
raise ImportError
+ assert self.array is not None
a = numpy.frombuffer(self.array.tobytes(), dtype=self.dtype)
a.shape = self.shape
if writeable:
@@ -746,7 +755,7 @@ def from_2dlist(self, value):
# note: it is not possible/recommended to
# guess the dtype from the elements here
for i in range(self.shape[0]):
- for j in range(self.shape[1]):
+ for j in range(self.shape[1]): # type: ignore[index, misc]
self.__setitem__((i, j), value[i][j])
def from_numpy(self, value):
@@ -876,14 +885,14 @@ def is_user_admin() -> bool:
"""
try:
# on Windows this will throw AttributeError
- return os.geteuid()
+ return os.geteuid() # type: ignore[return-value]
except AttributeError:
try:
import ctypes
# on non-Windows systems, this can be ModuleNotFoundError
# on some Windows machines this can be AttributeError
- return ctypes.windll.shell32.IsUserAnAdmin() == 1
+ return ctypes.windll.shell32.IsUserAnAdmin() == 1 # type: ignore[attr-defined]
except (ModuleNotFoundError, AttributeError):
return False
From 5b7d3f2af9b3e971c3df7c731d80db06e771c462 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Mon, 5 Jan 2026 17:44:49 +0000
Subject: [PATCH 21/38] Fix all type issues in adr_service.py and
report_utils.py - 93% complete
Co-authored-by: viseshrp <11642379+viseshrp@users.noreply.github.com>
---
src/ansys/dynamicreporting/core/adr_service.py | 16 ++++++++++++----
1 file changed, 12 insertions(+), 4 deletions(-)
diff --git a/src/ansys/dynamicreporting/core/adr_service.py b/src/ansys/dynamicreporting/core/adr_service.py
index 7741a08f95..0272206e12 100755
--- a/src/ansys/dynamicreporting/core/adr_service.py
+++ b/src/ansys/dynamicreporting/core/adr_service.py
@@ -207,7 +207,7 @@ def __init__(
host_directory=self._data_directory,
db_directory=self._db_directory,
port=self._port,
- ansys_version=ansys_version,
+ ansys_version=ansys_version, # type: ignore[arg-type]
)
except Exception as e: # pragma: no cover
self.logger.error(f"Error starting the Docker Container.\n{str(e)}\n")
@@ -458,7 +458,7 @@ def start(
"exec_basis": self._ansys_installation,
"ansys_version": self._ansys_version,
}
- if int(self._ansys_version) >= 231:
+ if self._ansys_version and int(self._ansys_version) >= 231: # type: ignore[arg-type]
launch_kwargs.update({"allow_iframe_embedding": True})
try:
@@ -510,6 +510,7 @@ def stop(self) -> None:
v = False
try:
+ assert self.serverobj is not None
v = self.serverobj.validate()
except Exception as e:
self.logger.error(f"Error: {str(e)}")
@@ -525,6 +526,7 @@ def stop(self) -> None:
self._docker_launcher = None
else:
self.logger.info("Shutting down service.\n")
+ assert self.serverobj is not None
self.serverobj.stop_local_server()
except Exception as e:
self.logger.error(f"Problem shutting down container/service.\n{str(e)}\n")
@@ -619,6 +621,7 @@ def visualize_report(
if self.serverobj is None:
self.logger.error("No connection to any service")
raise ConnectionToServiceError
+ assert self._url is not None
url = self._url + "/reports/report_display/?"
if report_name:
all_reports = self.serverobj.get_objects(objtype=report_objects.TemplateREST)
@@ -635,7 +638,7 @@ def visualize_report(
query_str = ""
url += query_str
if in_ipynb() and not new_tab:
- display(IFrame(src=url, width=1000, height=800))
+ display(IFrame(src=url, width=1000, height=800)) # type: ignore[name-defined]
else:
webbrowser.open_new(url)
@@ -717,6 +720,7 @@ def query(
if valid is False:
self.logger.warning("Warning: item_filter string is not valid. Will be ignored.")
item_filter = ""
+ assert self.serverobj is not None
if query_type == "Item":
org_queried_items = self.serverobj.get_objects(
objtype=report_objects.ItemREST, query=item_filter
@@ -813,6 +817,7 @@ def delete(self, items: list) -> None:
)
# Finally removing from database
try:
+ assert self.serverobj is not None
_ = self.serverobj.del_objects(items_to_delete)
except Exception as e:
self.logger.warning(f"Error in deleting items: {str(e)}")
@@ -955,6 +960,7 @@ def load_templates(self, json_file_path: str) -> None:
break
# 2. Compare with the existing root template(s)
+ assert self.serverobj is not None
templates = self.serverobj.get_objects(objtype=report_objects.TemplateREST)
existing_root_names = set()
for template in templates:
@@ -1007,4 +1013,6 @@ def __checkport__(self):
self.logger.warning(
f"Warning: port {self._port} is already in use. Replace with a new port\n"
)
- self._port = report_utils.find_unused_ports(count=1, start=self._port)[0]
+ ports = report_utils.find_unused_ports(count=1, start=self._port)
+ assert ports is not None
+ self._port = ports[0]
From 86441bbe05a5facf84fa370f184bd2a70450b62f Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Mon, 5 Jan 2026 17:56:46 +0000
Subject: [PATCH 22/38] =?UTF-8?q?=F0=9F=8E=89=20Fix=20all=20remaining=20ty?=
=?UTF-8?q?pe=20issues=20-=20100%=20COMPLETE!=20All=20510=20diagnostics=20?=
=?UTF-8?q?resolved?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: viseshrp <11642379+viseshrp@users.noreply.github.com>
---
src/ansys/dynamicreporting/core/adr_report.py | 24 ++++++++-----
.../dynamicreporting/core/docker_support.py | 15 ++++++--
.../core/examples/downloads.py | 2 +-
.../core/utils/report_objects.py | 34 ++++++++++---------
4 files changed, 47 insertions(+), 28 deletions(-)
diff --git a/src/ansys/dynamicreporting/core/adr_report.py b/src/ansys/dynamicreporting/core/adr_report.py
index a648ee7bfe..372b98df31 100644
--- a/src/ansys/dynamicreporting/core/adr_report.py
+++ b/src/ansys/dynamicreporting/core/adr_report.py
@@ -70,6 +70,8 @@ def __find_report_obj__(self) -> bool:
``False`` otherwise.
"""
success = False
+ assert self.service is not None
+ assert self.service.serverobj is not None
all_reports = self.service.serverobj.get_objects(objtype=report_objects.TemplateREST)
report_objs = [x for x in all_reports if x.name == self.report_name]
if len(report_objs) > 0:
@@ -125,12 +127,14 @@ def visualize(self, new_tab: bool = False, filter: str = "", item_filter: str =
item_filter = filter
if in_ipynb() and not new_tab: # pragma: no cover
iframe = self.get_iframe()
+ assert self.service is not None
if iframe is None: # pragma: no cover
self.service.logger.error("Error: can not obtain IFrame for report")
else:
display(iframe) # type: ignore[name-defined]
else:
url = self.get_url(item_filter=item_filter)
+ assert self.service is not None
if url == "": # pragma: no cover
self.service.logger.error("Error: could not obtain url for report")
else:
@@ -220,8 +224,8 @@ def get_guid(self) -> str:
"""
guid = ""
if self.service is None: # pragma: no cover
- self.service.logger.error("No connection to any report")
return guid
+ assert self.service.logger is not None
if self.service.serverobj is None or self.service.url is None: # pragma: no cover
self.service.logger.error("No connection to any server")
return guid
@@ -649,11 +653,11 @@ def export_pdf(
"""
success = False # pragma: no cover
if self.service is None: # pragma: no cover
- self.service.logger.error("No connection to any report")
- return ""
+ return False # type: ignore[return-value]
+ assert self.service.logger is not None
if self.service.serverobj is None: # pragma: no cover
- self.service.logger.error("No connection to any server")
- return ""
+ self.service.logger.error("No connection to any service")
+ return False # type: ignore[return-value]
try: # pragma: no cover
if query_params is None:
query_params = {}
@@ -717,11 +721,11 @@ def export_html(
"""
success = False
if self.service is None: # pragma: no cover
- self.service.logger.error("No connection to any report")
- return ""
+ return False # type: ignore[return-value]
+ assert self.service.logger is not None
if self.service.serverobj is None: # pragma: no cover
self.service.logger.error("No connection to any server")
- return ""
+ return False # type: ignore[return-value]
try:
if query_params is None:
query_params = {}
@@ -764,8 +768,12 @@ def export_json(self, json_file_path: str) -> None:
report.export_json(r'C:\\tmp\\my_json_file.json')
"""
try:
+ assert self.service is not None
+ assert self.service.serverobj is not None
self.service.serverobj.store_json(self.report.guid, json_file_path)
except Exception as e:
+ assert self.service is not None
+ assert self.service.logger is not None
self.service.logger.error(
f"Exporting to JSON terminated for report: {self.report_name}\n"
f"Error details: {e}"
diff --git a/src/ansys/dynamicreporting/core/docker_support.py b/src/ansys/dynamicreporting/core/docker_support.py
index 0e682a3caa..6b23a39210 100644
--- a/src/ansys/dynamicreporting/core/docker_support.py
+++ b/src/ansys/dynamicreporting/core/docker_support.py
@@ -304,7 +304,7 @@ def container_name(self) -> str | None:
return None
return self._container.name
- def ansys_version(self) -> str:
+ def ansys_version(self) -> str | None:
"""
Get the three-digit Ansys version from the Docker container.
@@ -316,7 +316,7 @@ def ansys_version(self) -> str:
"""
return self._ansys_version
- def cei_home(self) -> str:
+ def cei_home(self) -> str | None:
"""
Get the location of the ``CEI_HOME`` directory within the Docker container.
@@ -327,7 +327,7 @@ def cei_home(self) -> str:
"""
return self._cei_home
- def nexus_directory(self) -> str:
+ def nexus_directory(self) -> str | None:
"""
Get the location of the ``nexusNNN`` directory within the Docker container.
@@ -425,6 +425,7 @@ def copy_from_cei_home_to_host_directory(
cp_cmd = "/bin/cp "
if do_recursive:
cp_cmd += "-r "
+ assert self._cei_home is not None
cp_cmd += self._cei_home + "/" + src
cp_cmd += " "
cp_cmd += "/host_directory/"
@@ -445,10 +446,12 @@ def create_nexus_db(self) -> str:
------
RuntimeError
"""
+ assert self._ansys_version is not None
if int(self._ansys_version) > 242:
launcher = "adr_launcher"
else:
launcher = "nexus_launcher"
+ assert self._cei_home is not None
nexus_cmd = self._cei_home + f"/bin/{launcher} create --db_directory /db_directory/ "
return self.run_in_container(nexus_cmd)
@@ -467,10 +470,12 @@ def save_config(self) -> str:
------
RuntimeError
"""
+ assert self._ansys_version is not None
if int(self._ansys_version) > 242:
launcher = "adr_launcher"
else:
launcher = "nexus_launcher"
+ assert self._cei_home is not None
nexus_cmd = self._cei_home + f"/bin/{launcher}"
nexus_cmd += " --db_directory /db_directory"
nexus_cmd += " save_config"
@@ -503,7 +508,9 @@ def launch_nexus_server(
------
RuntimeError
"""
+ assert self._ansys_version is not None
launcher = "adr_launcher" if int(self._ansys_version) > 242 else "nexus_launcher"
+ assert self._cei_home is not None
nexus_cmd = (
f"{self._cei_home}/bin/{launcher} start "
f"--db_directory /db_directory "
@@ -520,10 +527,12 @@ def stop(self) -> None:
"""Release any additional resources allocated during launching."""
try:
if self._nexus_is_running:
+ assert self._ansys_version is not None
if int(self._ansys_version) > 242:
launcher = "adr_launcher"
else:
launcher = "nexus_launcher"
+ assert self._cei_home is not None
stop_cmd = self._cei_home + f"/bin/{launcher} stop "
stop_cmd += " --db_directory /db_directory"
self.run_in_container(stop_cmd)
diff --git a/src/ansys/dynamicreporting/core/examples/downloads.py b/src/ansys/dynamicreporting/core/examples/downloads.py
index 800320b5f9..a524c61787 100755
--- a/src/ansys/dynamicreporting/core/examples/downloads.py
+++ b/src/ansys/dynamicreporting/core/examples/downloads.py
@@ -104,7 +104,7 @@ def _retrieve_file(
logging.debug(f'Downloading URL: "{url}"')
content = get_url_content(url)
with open(local_path, "wb") as f:
- f.write(content)
+ f.write(content) # type: ignore[arg-type]
logging.debug("Download successful.")
return local_path
diff --git a/src/ansys/dynamicreporting/core/utils/report_objects.py b/src/ansys/dynamicreporting/core/utils/report_objects.py
index 2cf14e608e..042a33eb61 100755
--- a/src/ansys/dynamicreporting/core/utils/report_objects.py
+++ b/src/ansys/dynamicreporting/core/utils/report_objects.py
@@ -283,12 +283,13 @@ def split_quoted_string_list(s, deliminator=None):
out = list()
while True:
token = tmp.get_token()
- token = token.strip()
- if (token.startswith("'") and token.endswith("'")) or (
+ if token:
+ token = token.strip()
+ if token and ((token.startswith("'") and token.endswith("'")) or (
token.startswith('"') and token.endswith('"')
- ):
+ )):
token = token[1:-1]
- if len(token) == 0:
+ if not token or len(token) == 0:
break
out.append(token)
return out
@@ -404,12 +405,12 @@ def reset_defaults(self):
def get_params(self):
try:
- return json.loads(self.params)
+ return json.loads(self.params) # type: ignore[arg-type]
except Exception as e:
logger.debug(f"Warning on get_params: {str(e)}.\n")
return {}
- def set_params(self, d: dict = None):
+ def set_params(self, d: dict | None = None):
if d is None:
d = {}
if type(d) is not dict:
@@ -1251,7 +1252,8 @@ def validate_and_clean_table(self, value):
nexus_array = report_utils.nexus_array(dtype=dtype, shape=(1, 1))
nexus_array.from_2dlist(array)
array = nexus_array
- kind = array.dtype[0]
+ assert array.dtype is not None and len(array.dtype) > 0
+ kind = array.dtype[0] # type: ignore[index]
# valid array types are bytes and float for now
if kind not in ("S", "f"):
@@ -1259,7 +1261,7 @@ def validate_and_clean_table(self, value):
if kind == "S": # Check if the array contains strings
for i in range(array.shape[0]):
- for j in range(array.shape[1]):
+ for j in range(array.shape[1]): # type: ignore[index, misc]
if isinstance(array[i, j], str):
self.validate_string(array[i, j], "Table array element", sanitize_html=True)
@@ -1296,7 +1298,7 @@ def validate_and_clean_table(self, value):
if rows and len(rows) != array.shape[0]:
raise ValueError("Number of row labels does not match number of rows in the array.")
- if columns and len(columns) != array.shape[1]:
+ if columns and len(columns) != array.shape[1]: # type: ignore[index, misc]
raise ValueError(
"Number of column labels does not match number of columns in the array."
)
@@ -1455,7 +1457,7 @@ def factory(cls, json_data):
locals(),
globals(),
) # nosec
- return tmp_cls
+ return tmp_cls # type: ignore[name-defined]
else:
return TemplateREST()
@@ -1514,7 +1516,7 @@ def get_json_keys(cls):
"children_order",
]
- def add_params(self, d: dict = None):
+ def add_params(self, d: dict | None = None):
if d is None:
d = {}
if type(d) is not dict:
@@ -1536,7 +1538,7 @@ def get_params(self):
logger.debug(f"Warning on get_params: {str(e)}.\n")
return {}
- def set_params(self, d: dict = None):
+ def set_params(self, d: dict | None = None):
if d is None:
d = {}
if type(d) is not dict:
@@ -1558,7 +1560,7 @@ def get_property(self):
else:
return {}
- def set_property(self, property: dict = None):
+ def set_property(self, property: dict | None = None):
if property is None:
property = {}
if type(property) is not dict:
@@ -1568,7 +1570,7 @@ def set_property(self, property: dict = None):
self.params = json.dumps(d)
return
- def add_property(self, property: dict = None):
+ def add_property(self, property: dict | None = None):
if property is None:
property = {}
if type(property) is not dict:
@@ -3074,7 +3076,7 @@ def get_filter_value(self):
else:
return ["bot_count", 10]
- def set_filter(self, value=None, filter_str=""):
+ def set_filter(self, value=None, filter_str=""): # type: ignore[override]
if filter_str != "":
return super().set_filter(filter_str=filter_str)
elif value is not None:
@@ -3400,7 +3402,7 @@ def get_postgre(self):
out = {"database": "", "hostname": "", "port": "", "username": "", "password": ""}
return out
- def set_postgre(self, value: dict = None):
+ def set_postgre(self, value: dict | None = None):
if value is None:
value = {
"database": "",
From 80b03b46710436a0aa136834487b6c265a2cdfaa Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Mon, 5 Jan 2026 18:25:12 +0000
Subject: [PATCH 23/38] Fix black, isort formatting and ty pre-commit hook
configuration
Co-authored-by: viseshrp <11642379+viseshrp@users.noreply.github.com>
---
.pre-commit-config.yaml | 3 ++-
src/ansys/dynamicreporting/core/serverless/adr.py | 4 +---
src/ansys/dynamicreporting/core/utils/encoders.py | 2 +-
src/ansys/dynamicreporting/core/utils/report_objects.py | 7 ++++---
.../dynamicreporting/core/utils/report_remote_server.py | 8 ++++++--
5 files changed, 14 insertions(+), 10 deletions(-)
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 0aa1ae4000..4e487fa0c6 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -54,9 +54,10 @@ repos:
- id: ty
name: ty
entry: ty check
- language: system
+ language: python
types: [ python ]
pass_filenames: false
+ additional_dependencies: [ "ty==0.0.8" ]
# TO BE ACTIVATED EVENTUALLY - EXISTING ERRORS SHOULD BE SOLVED
#
diff --git a/src/ansys/dynamicreporting/core/serverless/adr.py b/src/ansys/dynamicreporting/core/serverless/adr.py
index 0cd7a9ba71..13b20cdf2e 100644
--- a/src/ansys/dynamicreporting/core/serverless/adr.py
+++ b/src/ansys/dynamicreporting/core/serverless/adr.py
@@ -406,9 +406,7 @@ def _is_sqlite(self, database: str) -> bool:
config = self.get_database_config()
if config is None:
return False
- return not self._in_memory and "sqlite" in config.get(database, {}).get(
- "ENGINE", ""
- )
+ return not self._in_memory and "sqlite" in config.get(database, {}).get("ENGINE", "")
def _get_db_path(self, database: str) -> str:
"""Return the filesystem path to the DB file for a SQLite database.
diff --git a/src/ansys/dynamicreporting/core/utils/encoders.py b/src/ansys/dynamicreporting/core/utils/encoders.py
index 0fed8208d2..f18991d41e 100644
--- a/src/ansys/dynamicreporting/core/utils/encoders.py
+++ b/src/ansys/dynamicreporting/core/utils/encoders.py
@@ -1,7 +1,7 @@
import datetime
import json
-import uuid
from typing import Any
+import uuid
from .report_utils import nexus_array
diff --git a/src/ansys/dynamicreporting/core/utils/report_objects.py b/src/ansys/dynamicreporting/core/utils/report_objects.py
index 042a33eb61..1ff65a7a80 100755
--- a/src/ansys/dynamicreporting/core/utils/report_objects.py
+++ b/src/ansys/dynamicreporting/core/utils/report_objects.py
@@ -285,9 +285,10 @@ def split_quoted_string_list(s, deliminator=None):
token = tmp.get_token()
if token:
token = token.strip()
- if token and ((token.startswith("'") and token.endswith("'")) or (
- token.startswith('"') and token.endswith('"')
- )):
+ if token and (
+ (token.startswith("'") and token.endswith("'"))
+ or (token.startswith('"') and token.endswith('"'))
+ ):
token = token[1:-1]
if not token or len(token) == 0:
break
diff --git a/src/ansys/dynamicreporting/core/utils/report_remote_server.py b/src/ansys/dynamicreporting/core/utils/report_remote_server.py
index b95c827603..dcb7b56a87 100755
--- a/src/ansys/dynamicreporting/core/utils/report_remote_server.py
+++ b/src/ansys/dynamicreporting/core/utils/report_remote_server.py
@@ -503,7 +503,9 @@ def put_objects(self, in_objects):
print(f"Unable to push object {o}: {e}")
raise
- if r.status_code == requests.codes.bad_request: # pragma: no cover # type: ignore[attr-defined]
+ if (
+ r.status_code == requests.codes.bad_request
+ ): # pragma: no cover # type: ignore[attr-defined]
# One special case: perhaps the session/dataset was deleted and the cache not invalidated?
# In this case, we would get a 400 back and the response text would include 'Invalid pk'. So,
# we try to push the dataset and session again and then re-push the object. Only try this once!
@@ -1748,7 +1750,9 @@ def launch_local_database_server(
try: # nosec
# Run the launcher to start the server
# Note: this process only returns if the server is shutdown or there is an error
- monitor_process = subprocess.Popen(command, **params) # nosec B78 B603 # type: ignore[arg-type]
+ monitor_process = subprocess.Popen(
+ command, **params
+ ) # nosec B78 B603 # type: ignore[arg-type]
except Exception as e:
logger.debug(f"Warning: {str(e)}")
if parent and has_qt:
From 5f2c888cd81a160993ac9d91b4a0f68624b284d9 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Mon, 5 Jan 2026 18:34:34 +0000
Subject: [PATCH 24/38] Exclude doc folder from ty type checking in pre-commit
Co-authored-by: viseshrp <11642379+viseshrp@users.noreply.github.com>
---
.pre-commit-config.yaml | 1 +
1 file changed, 1 insertion(+)
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 4e487fa0c6..73c8d0955f 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -57,6 +57,7 @@ repos:
language: python
types: [ python ]
pass_filenames: false
+ exclude: ^doc/
additional_dependencies: [ "ty==0.0.8" ]
# TO BE ACTIVATED EVENTUALLY - EXISTING ERRORS SHOULD BE SOLVED
From a2f6353c91374f82bd70280cbe21a9249429e2ff Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Mon, 5 Jan 2026 18:38:49 +0000
Subject: [PATCH 25/38] Change ty hook to use language: system like workedon
repo
Co-authored-by: viseshrp <11642379+viseshrp@users.noreply.github.com>
---
.pre-commit-config.yaml | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 73c8d0955f..59bbdcc2d7 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -54,11 +54,10 @@ repos:
- id: ty
name: ty
entry: ty check
- language: python
+ language: system
types: [ python ]
pass_filenames: false
exclude: ^doc/
- additional_dependencies: [ "ty==0.0.8" ]
# TO BE ACTIVATED EVENTUALLY - EXISTING ERRORS SHOULD BE SOLVED
#
From 085a563925338ca5aa73e79806c347f6afece252 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Mon, 5 Jan 2026 19:15:06 +0000
Subject: [PATCH 26/38] Fix ty executable not found by using 'uv run ty check'
entry
Co-authored-by: viseshrp <11642379+viseshrp@users.noreply.github.com>
---
.pre-commit-config.yaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 59bbdcc2d7..7f22767802 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -53,7 +53,7 @@ repos:
hooks:
- id: ty
name: ty
- entry: ty check
+ entry: uv run ty check
language: system
types: [ python ]
pass_filenames: false
From e56979b2be8e62031d2a722ca860a9d5357d9995 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Mon, 5 Jan 2026 19:21:00 +0000
Subject: [PATCH 27/38] Fix ty pre-commit hook - remove uv run, use plain 'ty
check' like workedon
Co-authored-by: viseshrp <11642379+viseshrp@users.noreply.github.com>
---
.pre-commit-config.yaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 7f22767802..59bbdcc2d7 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -53,7 +53,7 @@ repos:
hooks:
- id: ty
name: ty
- entry: uv run ty check
+ entry: ty check
language: system
types: [ python ]
pass_filenames: false
From 69ada30ee6d54e0c4e440ad9cb2f457444fe074d Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Mon, 5 Jan 2026 19:32:38 +0000
Subject: [PATCH 28/38] Fix ty hook to work with ansys/actions/code-style - use
'bash -c uv run ty check'
Co-authored-by: viseshrp <11642379+viseshrp@users.noreply.github.com>
---
.pre-commit-config.yaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 59bbdcc2d7..dcf016beb2 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -53,7 +53,7 @@ repos:
hooks:
- id: ty
name: ty
- entry: ty check
+ entry: bash -c 'uv run ty check'
language: system
types: [ python ]
pass_filenames: false
From dce33233482f65d9b0a27c491c6ed17881160cc8 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Mon, 5 Jan 2026 20:09:55 +0000
Subject: [PATCH 29/38] Fix ty hook to use 'uv run --frozen ty check' to avoid
reinstalling packages
Co-authored-by: viseshrp <11642379+viseshrp@users.noreply.github.com>
---
.pre-commit-config.yaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index dcf016beb2..5d68da8ba2 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -53,7 +53,7 @@ repos:
hooks:
- id: ty
name: ty
- entry: bash -c 'uv run ty check'
+ entry: bash -c 'uv run --frozen ty check'
language: system
types: [ python ]
pass_filenames: false
From b8f645cf07877f5d197ad8e519bb6c53421e9188 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Mon, 5 Jan 2026 20:51:47 +0000
Subject: [PATCH 30/38] Fix ty pre-commit hook - revert to language: python
with additional_dependencies
Co-authored-by: viseshrp <11642379+viseshrp@users.noreply.github.com>
---
.pre-commit-config.yaml | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 5d68da8ba2..ceddd164c3 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -53,10 +53,11 @@ repos:
hooks:
- id: ty
name: ty
- entry: bash -c 'uv run --frozen ty check'
- language: system
+ entry: ty check
+ language: python
types: [ python ]
pass_filenames: false
+ additional_dependencies: [ "ty==0.0.8" ]
exclude: ^doc/
# TO BE ACTIVATED EVENTUALLY - EXISTING ERRORS SHOULD BE SOLVED
From d2529df625df8e8afd610de2eadc1ef51f51df38 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Tue, 6 Jan 2026 19:17:37 +0000
Subject: [PATCH 31/38] Fix ty pre-commit hook to only check src/ directory
Co-authored-by: viseshrp <11642379+viseshrp@users.noreply.github.com>
---
.pre-commit-config.yaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index ceddd164c3..69b7fe6b41 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -53,7 +53,7 @@ repos:
hooks:
- id: ty
name: ty
- entry: ty check
+ entry: ty check src/
language: python
types: [ python ]
pass_filenames: false
From 151bc8c897df1e5de0fe4fd8648ae06aa9bbf922 Mon Sep 17 00:00:00 2001
From: viseshrp <11642379+viseshrp@users.noreply.github.com>
Date: Tue, 6 Jan 2026 15:08:27 -0500
Subject: [PATCH 32/38] Update uv.lock
---
uv.lock | 847 ++++++++++++++++++++++++++++++--------------------------
1 file changed, 447 insertions(+), 400 deletions(-)
diff --git a/uv.lock b/uv.lock
index 4bfa2c4e45..47f1767d53 100644
--- a/uv.lock
+++ b/uv.lock
@@ -92,10 +92,11 @@ dev = [
doc = [
{ name = "ansys-sphinx-theme" },
{ name = "docutils", version = "0.21.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" },
- { name = "docutils", version = "0.22.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" },
+ { name = "docutils", version = "0.22.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" },
{ name = "numpydoc" },
{ name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" },
- { name = "sphinx", version = "9.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" },
+ { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" },
+ { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" },
{ name = "sphinx-copybutton" },
{ name = "sphinx-gallery" },
]
@@ -156,7 +157,7 @@ provides-extras = ["dev", "doc", "test"]
[[package]]
name = "ansys-sphinx-theme"
-version = "1.6.3"
+version = "1.6.4"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "importlib-metadata" },
@@ -165,25 +166,26 @@ dependencies = [
{ name = "pydata-sphinx-theme" },
{ name = "pyyaml" },
{ name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" },
- { name = "sphinx", version = "9.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" },
+ { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" },
+ { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/40/1b/d9db90e02cef9690ef16e9f698689cf8a2e5bfc122317df78f2426273e97/ansys_sphinx_theme-1.6.3.tar.gz", hash = "sha256:167f3d1111be45f5fd9303f257ffb1bfa6ba0afa87e22c2fa83791e41b405314", size = 1002802, upload-time = "2025-10-08T17:06:43.306Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/74/77/06c49e20f34bb9aee2f4ea9d8ec1fb80ad50972a74d7cdf9aec5c0982b27/ansys_sphinx_theme-1.6.4.tar.gz", hash = "sha256:beb49095bc0bc2dd9a3a1f79e9ee4ddd727d0ade62080ca5a8ac5e87a2f9e267", size = 1003016, upload-time = "2025-12-09T15:50:29.783Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/ed/e5/6919a8cc4178bc7fa2fe4a5c3c335e6af0880876279bf5c7c2d5ba534749/ansys_sphinx_theme-1.6.3-py3-none-any.whl", hash = "sha256:5bc501e160d824fce37ea176eb8120be460419846276ec507c36dca1a984097b", size = 1600677, upload-time = "2025-10-08T17:06:41.405Z" },
+ { url = "https://files.pythonhosted.org/packages/c0/82/07bb09842b150662bb542f2810eb537e2e4dddba70fd382ee1930699a2a1/ansys_sphinx_theme-1.6.4-py3-none-any.whl", hash = "sha256:f7f28df5e69d7093febdd561118c88ea574bafdce691a049153e372b7aabd794", size = 1601846, upload-time = "2025-12-09T15:50:26.655Z" },
]
[[package]]
name = "anyio"
-version = "4.12.0"
+version = "4.12.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "exceptiongroup", marker = "python_full_version < '3.11'" },
{ name = "idna" },
{ name = "typing-extensions" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/16/ce/8a777047513153587e5434fd752e89334ac33e379aa3497db860eeb60377/anyio-4.12.0.tar.gz", hash = "sha256:73c693b567b0c55130c104d0b43a9baf3aa6a31fc6110116509f27bf75e21ec0", size = 228266, upload-time = "2025-11-28T23:37:38.911Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/96/f0/5eb65b2bb0d09ac6776f2eb54adee6abe8228ea05b20a5ad0e4945de8aac/anyio-4.12.1.tar.gz", hash = "sha256:41cfcc3a4c85d3f05c932da7c26d0201ac36f72abd4435ba90d0464a3ffed703", size = 228685, upload-time = "2026-01-06T11:45:21.246Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/7f/9c/36c5c37947ebfb8c7f22e0eb6e4d188ee2d53aa3880f3f2744fb894f0cb1/anyio-4.12.0-py3-none-any.whl", hash = "sha256:dad2376a628f98eeca4881fc56cd06affd18f659b17a747d3ff0307ced94b1bb", size = 113362, upload-time = "2025-11-28T23:36:57.897Z" },
+ { url = "https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c", size = 113592, upload-time = "2026-01-06T11:45:19.497Z" },
]
[[package]]
@@ -227,67 +229,73 @@ wheels = [
[[package]]
name = "backports-zstd"
-version = "1.1.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/ee/76/403d81c1b9264f6ee1c25b2f2ce892ed9930d1a0a1939ef26a01a95e644d/backports_zstd-1.1.0.tar.gz", hash = "sha256:8ce84125e3094ddefbaa25306e8949965ce092b400a1fd63b5e6a5e932d2994f", size = 996020, upload-time = "2025-11-23T12:51:19.478Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/2f/bb/9f71f34b1c7ad957f36ca320bcdfef1836816af9a8f5d256debe5f12bad6/backports_zstd-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f02ab91901b637fae5d27cc26f02874db3e5f98af481afafb86d6487a4287897", size = 435750, upload-time = "2025-11-23T12:49:03.092Z" },
- { url = "https://files.pythonhosted.org/packages/ae/9a/f064362e44419625b79e049dc532c7b7606bd072f230d2729460cf4f5da8/backports_zstd-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5805a215a3b048a10ca18dd5c525c737e004e59c92c21c44baa0c13083579dc1", size = 362145, upload-time = "2025-11-23T12:49:04.823Z" },
- { url = "https://files.pythonhosted.org/packages/69/c7/e163febeb3504a00f3a7625d40a2d1a120298762393caebe618e96c48594/backports_zstd-1.1.0-cp310-cp310-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:777ff9a60664abfa7e5cbcb676ecbedf49bd567d6184e538b9dee09d4bbee292", size = 506045, upload-time = "2025-11-23T12:49:05.951Z" },
- { url = "https://files.pythonhosted.org/packages/aa/a9/d28aa8f16a9fafd8e15220f3ac32fcd000589088f45c80df7f45839503cc/backports_zstd-1.1.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:27a40d9518019a6b6ad2df5f6c2dd6ce627af9396c929556188a67607ce12d57", size = 475659, upload-time = "2025-11-23T12:49:07.463Z" },
- { url = "https://files.pythonhosted.org/packages/a3/94/9c9b2aa30d34e83f244057c6bf7b2a493c7d60df1caa999160bf83b5a525/backports_zstd-1.1.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a24e73d5d4b3c1b9c693f07081703db9e9398ce95576f1ed74892d6bd01adcb4", size = 581286, upload-time = "2025-11-23T12:49:09.095Z" },
- { url = "https://files.pythonhosted.org/packages/78/6e/09f21da99977d3b220c8a4642fa1218b2b5d854fb2f00eb22dc38b02be3e/backports_zstd-1.1.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:097ea6090dfb60f4af3c09d816c6d64175bd94ead930e5089acd00ea2e5b8de8", size = 640931, upload-time = "2025-11-23T12:49:10.341Z" },
- { url = "https://files.pythonhosted.org/packages/42/cb/d765b8f70e86e368d05632572e7eec3dd27d6bfb61c9c7867b3375b3f19e/backports_zstd-1.1.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0495547f5b727d798ff317b6cc6158655926b7149739ab9a193e184d65e4bc8f", size = 491149, upload-time = "2025-11-23T12:49:11.524Z" },
- { url = "https://files.pythonhosted.org/packages/f2/1f/6ad1c8af282dc6ad464ff58ecfb29abaeeae6f745c45e5500723f8a0c1e2/backports_zstd-1.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:544494f7f1ba88f6500a5e14219b19718cc2aa4bcc563ce78d67aef3b8e54ed5", size = 481607, upload-time = "2025-11-23T12:49:12.659Z" },
- { url = "https://files.pythonhosted.org/packages/d8/0a/6f82529599e92af47bd483bf3c318bd14c01e5a00b9a736d9bc7ab1db3b0/backports_zstd-1.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:559fe9384dbd43cdacc2b4aa7e19199f064da7aec947c6461d4a7aadfb614568", size = 509552, upload-time = "2025-11-23T12:49:14.166Z" },
- { url = "https://files.pythonhosted.org/packages/39/5a/87e4be4c18c920122949d45a9de7e253084af22ae50b3c0773e4d58aa30a/backports_zstd-1.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:6e7ffa9747051fd994f8070aefc8317af3ce485d9dbd175593c6df9d795d24ff", size = 585650, upload-time = "2025-11-23T12:49:15.379Z" },
- { url = "https://files.pythonhosted.org/packages/a4/4c/4afff28eb575631882d564b6c8b93f4d43e53f99c62ceb03f51b15400f9a/backports_zstd-1.1.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:27858ea429914fc67446112fd7797e821d18e7ce3d6cfa7b2e124547c6a4ca83", size = 631508, upload-time = "2025-11-23T12:49:16.89Z" },
- { url = "https://files.pythonhosted.org/packages/d0/8d/f2564d8fe96398bc15ccd4db605d448a8dc4d6dc4e1e3bc613c6f2306b87/backports_zstd-1.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:233f35525940b5153223909a4c9f554e27ae7f5bff5c946b9fe28b633cdd463a", size = 495209, upload-time = "2025-11-23T12:49:18.083Z" },
- { url = "https://files.pythonhosted.org/packages/36/47/9eb4a27599af4501a79d9d80d6616a18b8cdf52683b1c711d403d247f6a2/backports_zstd-1.1.0-cp310-cp310-win32.whl", hash = "sha256:be5723019ba1500cf727a6ba37a15e697a63f66314e3e7def52fd86c65249236", size = 288660, upload-time = "2025-11-23T12:49:19.553Z" },
- { url = "https://files.pythonhosted.org/packages/f1/e8/e3f70c4835338167d7039152b8cb1c4adae8c14fed7a184f2d860b0bb952/backports_zstd-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:c28905252c4273e7097baad10ca786ff8e5ab67807f428504c4fe3cbdecb135e", size = 313570, upload-time = "2025-11-23T12:49:20.706Z" },
- { url = "https://files.pythonhosted.org/packages/bc/bf/12f84454d23cd32a649adbc49983fed13ae2f60a75a6461e9db6e435d856/backports_zstd-1.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:bd2e69a69524161e20cad8245dcbacd9b825f83221c55b05bca0e506b7abddfd", size = 288773, upload-time = "2025-11-23T12:49:22.226Z" },
- { url = "https://files.pythonhosted.org/packages/73/81/47935ce4c225681a2a962c69cdc061f721bc02c6b2d9806d0ba4d29a1454/backports_zstd-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8b1f9ea3d2d3638af80fcd896dceba7ad5d902ce3e5b411a9b16e4cddd79c4ac", size = 435751, upload-time = "2025-11-23T12:49:23.738Z" },
- { url = "https://files.pythonhosted.org/packages/c1/36/85f89ea19338e7babfb91147ad3f4022c736c0bcbc1ebf83c90550f2722c/backports_zstd-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bfa36e208619fd152c20bd6c9d0febcb18ac90bdd811421c6a01e450f4b1dd6d", size = 362143, upload-time = "2025-11-23T12:49:25.245Z" },
- { url = "https://files.pythonhosted.org/packages/6c/4f/f722122cbd44331245c674c9d3dac91df135d491348de7da5010980d346d/backports_zstd-1.1.0-cp311-cp311-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:9f43275263cfbd2e9096a8b333d15c2e96deb0a2df3751b15408155a03c57fab", size = 506044, upload-time = "2025-11-23T12:49:26.423Z" },
- { url = "https://files.pythonhosted.org/packages/e6/10/41d5088c35bbbd03a07e0f315566e06f915b0371700f568e8c3b26c68b40/backports_zstd-1.1.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b1c6ae75c09f211b4f5439b0984bfb8b8d15975585e50b1dc658e9f9b94bd305", size = 475657, upload-time = "2025-11-23T12:49:28.056Z" },
- { url = "https://files.pythonhosted.org/packages/d1/14/324476e8eef484779c390d0b9c83b7906c883ae82b7de4651a86463fbb71/backports_zstd-1.1.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2d38c6df19d5b828cb3d1c1ab62a2c61dd433ad00523d577e303f4552fa002b0", size = 581283, upload-time = "2025-11-23T12:49:29.536Z" },
- { url = "https://files.pythonhosted.org/packages/bd/01/4f61e96f52dd391834dd457ee970b57d2818609677a786f94840da359f02/backports_zstd-1.1.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:64d5c359a04c26a36eaad82386a873ff1af9e12f896af4748cff1f35e2550af3", size = 640975, upload-time = "2025-11-23T12:49:30.916Z" },
- { url = "https://files.pythonhosted.org/packages/57/79/69b97eea66a26f52975ae78d7413ca79efee51d2349a33ddfef9b196302c/backports_zstd-1.1.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:773cec5a3ff8c81e03f3db0c7df1d2f7c3cf820262138ec752c46fd25b532e85", size = 491188, upload-time = "2025-11-23T12:49:32.134Z" },
- { url = "https://files.pythonhosted.org/packages/9d/4d/5d402a41c29121f387be38e3a507ba6c3d9c5304356f659beba8bcdadf80/backports_zstd-1.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:be97026835fb5cf0cb96e8c1c6ee72e53816f0ff34c368546ea6e53962476216", size = 481610, upload-time = "2025-11-23T12:49:33.331Z" },
- { url = "https://files.pythonhosted.org/packages/85/9d/25dceef8e97fb815259b3c946236ff6e696bb5f461faa8303dca5d98e4e8/backports_zstd-1.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6fb2b381a404040c9dbfd258f3bcd740595e2aca088d822fb241942440fce509", size = 509555, upload-time = "2025-11-23T12:49:34.675Z" },
- { url = "https://files.pythonhosted.org/packages/bd/74/fb0883e9dcc6333f33f3f90e1101498800b82b6437cfa110244c59d6a03e/backports_zstd-1.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:adac539e6fbcf72d70cd9f354ab5689e080b8621b4d268f2ba0f486c25dfd3f3", size = 585639, upload-time = "2025-11-23T12:49:36.033Z" },
- { url = "https://files.pythonhosted.org/packages/88/ad/6db9224a34d0ef6ce553c9605649a522b485efc0aa098b1c78b4bcdaad5a/backports_zstd-1.1.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:4298631dc91b4dafc20b6a7eb7edb028c341bc2e3b77a128c7ced5148aaa215c", size = 631550, upload-time = "2025-11-23T12:49:37.543Z" },
- { url = "https://files.pythonhosted.org/packages/87/a5/383d1d9b2281854b2809b83ec6dfe9092f3a8b9700055340176b29230b1c/backports_zstd-1.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:62451464559525ff093f7d684bf88381722d7b3759693ea842e94b41c01f306b", size = 495212, upload-time = "2025-11-23T12:49:38.814Z" },
- { url = "https://files.pythonhosted.org/packages/cd/75/305ac0bf93de4a771d33926e27da401a807294c3858b133d3611d0b6be49/backports_zstd-1.1.0-cp311-cp311-win32.whl", hash = "sha256:b20309c15d4afa2919517669366da60dd30955dbc0784924ae79acb49f158ef6", size = 288753, upload-time = "2025-11-23T12:49:39.972Z" },
- { url = "https://files.pythonhosted.org/packages/50/f3/8887a706bef88307a55719b4d0cf73600c6703e3cfb5926f97441c8ffc3b/backports_zstd-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:9e3df9c43e9f4ed970cd8f48df41736c5697fed06523e463661788762c95d454", size = 313698, upload-time = "2025-11-23T12:49:41.202Z" },
- { url = "https://files.pythonhosted.org/packages/3c/ea/78f627df9b3765ac7036da11951db7c91eb77e6014f8819dbf575dc57f8e/backports_zstd-1.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:b5c43022248bd8711f606a481547dbcf4541b617446a07a359aad28ebf77973b", size = 288897, upload-time = "2025-11-23T12:49:42.306Z" },
- { url = "https://files.pythonhosted.org/packages/48/98/1426b121772c4f05735ad7c9542dd333c18720179a549dd2e22e6be386df/backports_zstd-1.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:63e1ba127129c7c4786147f873eef63f90694a13c5459ca0e970cad1bd52cf6c", size = 436062, upload-time = "2025-11-23T12:49:43.409Z" },
- { url = "https://files.pythonhosted.org/packages/4b/01/c851ce0cbe2611ce33232ecaa21f237b9b3c52964f01c9e96cabc7f60b0f/backports_zstd-1.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:37b30c0fb5d118344706ed9e26cb2f43584c0012565254a819485bab180f1652", size = 362213, upload-time = "2025-11-23T12:49:44.886Z" },
- { url = "https://files.pythonhosted.org/packages/af/c0/99596faafe038ba03695569adf0ec1f4e3f955c3156618b0f11deb3b9905/backports_zstd-1.1.0-cp312-cp312-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:b8b77fae55a245e5b61fc599b641343da2580ebc9fcb20a77822dcca9126bddc", size = 506466, upload-time = "2025-11-23T12:49:46.085Z" },
- { url = "https://files.pythonhosted.org/packages/eb/84/b6410324c8f495bd6fd1c8ab8b3fbb70120ea2b06ee004db4549e0eb58b0/backports_zstd-1.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:34c9c425d113071c90a241f04fb12be46c83e7028a090aca4e72fe9f5fe11fb6", size = 476287, upload-time = "2025-11-23T12:49:47.327Z" },
- { url = "https://files.pythonhosted.org/packages/c1/7a/280f37869fb37dc16d2ca093734a6cac564a551d7fad8b55d0807d19f74c/backports_zstd-1.1.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:33a7c9c2bd44b5bbfba2c78411feb2e0074406654f33e6b0317e307710c7fe57", size = 581744, upload-time = "2025-11-23T12:49:48.907Z" },
- { url = "https://files.pythonhosted.org/packages/72/32/828ce97c1c18d3735ca42b65819241702df101cfd13a4b88bd77ca1f03bd/backports_zstd-1.1.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3baf8b13aa90ed5a03503063be670d8cca22d5d81aab4cc499741f013dba4351", size = 640474, upload-time = "2025-11-23T12:49:50.184Z" },
- { url = "https://files.pythonhosted.org/packages/06/ad/5ba858ffc307ed2b51693d87642f9e9dd6013579840981ac364c6e24c38c/backports_zstd-1.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fe522558c4d56d9eb2294592fec5ac94b95c82ff22cf1f91d1bf589fe567f391", size = 494260, upload-time = "2025-11-23T12:49:51.765Z" },
- { url = "https://files.pythonhosted.org/packages/fc/4c/3b2f67ae51d19716af5d9bd2c074b9a5ba03a7f6ef4c509adaee3e1f6958/backports_zstd-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4f459c3b43d382aa2ab44199b84ec86a33f79094701bd3bbf536d4b6e687e744", size = 482320, upload-time = "2025-11-23T12:49:52.943Z" },
- { url = "https://files.pythonhosted.org/packages/c9/e0/05f1d8a8552254ab4ed447ad2950c079f15bd2c74125a8a15fa9f0eb28ef/backports_zstd-1.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b53841a136c326686d49f1b2b96dc5acdffb2e8e422a5298f36b95a7d927b69a", size = 509894, upload-time = "2025-11-23T12:49:54.149Z" },
- { url = "https://files.pythonhosted.org/packages/62/0d/15dc13edf653ba14f61f9ce0a4119f79647750a9525659b410be124b5d71/backports_zstd-1.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d64a172db16fa5e3aed875776537103cae0f2dd0e614c9658fce62ebd5211847", size = 586126, upload-time = "2025-11-23T12:49:55.363Z" },
- { url = "https://files.pythonhosted.org/packages/e8/c9/9ece6a0c684223e466188d7e8db74462075391f43be244f46ef46ce1f07a/backports_zstd-1.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:de5d7cdea31085b3d21c7f670f385ec666b8595c72c107efa50e29f3cc4e72a1", size = 630934, upload-time = "2025-11-23T12:49:57.115Z" },
- { url = "https://files.pythonhosted.org/packages/d9/da/9c704e8f11cc4cb17adae9693d97903fe9dc5ea7e8182d044c00cf70fb1d/backports_zstd-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8dc11ddef5529aff9fa18565a0f2a98f9f5cff83751e4357c219ae20c160bc1f", size = 498755, upload-time = "2025-11-23T12:49:58.313Z" },
- { url = "https://files.pythonhosted.org/packages/45/ac/843bc205463fce6aff56d2d6f8733635b0c8786c22d148978ecfed97645f/backports_zstd-1.1.0-cp312-cp312-win32.whl", hash = "sha256:8e0376da95159b39f538b6d7edafc211f4b9e7f5581ad4b2476b0f3c890bb25f", size = 288892, upload-time = "2025-11-23T12:49:59.569Z" },
- { url = "https://files.pythonhosted.org/packages/43/aa/dbee1f51bf3af6017e1b48b93edf9c60f74a57c7d34940a728789365355e/backports_zstd-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:8067a95f560c503d683b9e18de44749eefe0a4ad6da318ff9eabb4afe47e79c5", size = 313910, upload-time = "2025-11-23T12:50:00.678Z" },
- { url = "https://files.pythonhosted.org/packages/66/8f/cc99ca99a2e37a9a9f3c6053cd0a7bd255c465be24d1d931fe062dca55bd/backports_zstd-1.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:f8f2a975dd25b4b3ac901ce47d04881d43dcde18037d2d1513b8a5f4fededdd8", size = 289014, upload-time = "2025-11-23T12:50:02.226Z" },
- { url = "https://files.pythonhosted.org/packages/6a/80/c08720ce3d7c446b5f91c2c894e677b673d87c4e9c7dd6f5c36303baaee8/backports_zstd-1.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:4d379e9c157e4b18df8852defe1d5da8888ba8ffb4d7d9410428b3245cf8216a", size = 409859, upload-time = "2025-11-23T12:51:04.504Z" },
- { url = "https://files.pythonhosted.org/packages/8f/f1/6220850b09a52cb07854d098307d71d9b330f4d9b49c2fda86c960c7df00/backports_zstd-1.1.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:79b29d1c66f9bd2bedb87551b303e53f96364a641d30251e9f4e15bf5d84699e", size = 339376, upload-time = "2025-11-23T12:51:05.677Z" },
- { url = "https://files.pythonhosted.org/packages/90/bf/0e6dfe1467dc228916a1715fc75421bafbb5dec4cf306c2395e45d8ef589/backports_zstd-1.1.0-pp310-pypy310_pp73-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:154870d0e0f817159671ffc8b0e39d70ca294542affe6df00d95ef135a2ceef5", size = 420422, upload-time = "2025-11-23T12:51:06.934Z" },
- { url = "https://files.pythonhosted.org/packages/68/9b/85dc1f5dc66c22f691bb60ec739e4be17c53dc670dcfabdf16ff194aec44/backports_zstd-1.1.0-pp310-pypy310_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f174d8c93bd2682932ecb736e8f03612c162ec6a182c4293a663165f8ffbf5a", size = 393966, upload-time = "2025-11-23T12:51:08.247Z" },
- { url = "https://files.pythonhosted.org/packages/b6/23/1a375ea5e1e50741b80f9882c45a13c3b1b051985ae40eae44a34aa4e9e4/backports_zstd-1.1.0-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b1bf548087476e6ce997c2697072c67193b07e5a36d4eede2b582e7bc7324c2d", size = 413928, upload-time = "2025-11-23T12:51:09.353Z" },
- { url = "https://files.pythonhosted.org/packages/3d/e0/687326aa8026b28251651add1e87931edbb0bc5bf563776cca6f81f35987/backports_zstd-1.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2a278c276e722399fbc769d1ae318a58578e20086bd09abcffe9af4b1daaf50c", size = 299788, upload-time = "2025-11-23T12:51:10.852Z" },
- { url = "https://files.pythonhosted.org/packages/f7/16/ce8d770a7129540520261694b0e83ec61684ab734f671e4eff652c040a9f/backports_zstd-1.1.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:06cef3f3b690221fd55d95cfb0316b914ce72063b99578b309205c9f73ce0bab", size = 409754, upload-time = "2025-11-23T12:51:12.084Z" },
- { url = "https://files.pythonhosted.org/packages/ef/c3/cbfdd61516d0a8448ad9194e34ffd434ac735ed1a89257f77407dbdbe0f1/backports_zstd-1.1.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:55446414f5deda38a4b8de22a0f3f93bacc1a8c4fe2205a0bace0dc55dbf9c90", size = 339289, upload-time = "2025-11-23T12:51:13.407Z" },
- { url = "https://files.pythonhosted.org/packages/97/7f/5e65b583abf56f7e3c54835a707cdd159e47b73f4b8548082debc630baae/backports_zstd-1.1.0-pp311-pypy311_pp73-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:f1524c54ec491d80068598ba4328b82c403b99a04c0db6326a5cc8f05565de87", size = 420422, upload-time = "2025-11-23T12:51:14.553Z" },
- { url = "https://files.pythonhosted.org/packages/52/76/14349136c395f94fbd2af663301c2d661da9109fdf74692fe5095808cb9d/backports_zstd-1.1.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fbcbb091fede530d096e32f3409056c59dc7b5e6cc9bf39131c7961eaaf8f475", size = 393965, upload-time = "2025-11-23T12:51:15.646Z" },
- { url = "https://files.pythonhosted.org/packages/c1/5b/fa580166cdf945be0b3ca1dbf8b23bc1370087707fa825b764d7e98b9a3c/backports_zstd-1.1.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5ac888007be1724efaa565f69ba64ce0c0c0e135d7f22830565399ff76465f1", size = 413929, upload-time = "2025-11-23T12:51:16.75Z" },
- { url = "https://files.pythonhosted.org/packages/aa/f3/650db1631d75c3f6ad46b09dfee2a761b2678b1e2e0004d90258020801c3/backports_zstd-1.1.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:08f66e228821a87ba7c74170b6b173cf249eeface98c0951c0da7db680b887d5", size = 299785, upload-time = "2025-11-23T12:51:17.969Z" },
+version = "1.3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f4/b1/36a5182ce1d8ef9ef32bff69037bd28b389bbdb66338f8069e61da7028cb/backports_zstd-1.3.0.tar.gz", hash = "sha256:e8b2d68e2812f5c9970cabc5e21da8b409b5ed04e79b4585dbffa33e9b45ebe2", size = 997138, upload-time = "2025-12-29T17:28:06.143Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/76/70/766f6ebbb9db2ed75951f0a671ee15931dc69278c84d9f09b08dd6b67c3e/backports_zstd-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a2db17a6d9bf6b4dc223b3f6414aa9db6d1afe9de9bff61d582c2934ca456a0", size = 435664, upload-time = "2025-12-29T17:25:29.201Z" },
+ { url = "https://files.pythonhosted.org/packages/55/f8/7b3fad9c6ee5ff3bcd7c941586675007330197ff4a388f01c73198ecc8bb/backports_zstd-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a7f16b98ba81780a9517ce6c493e1aea9b7d72de2b1efa08375136c270e1ecba", size = 362060, upload-time = "2025-12-29T17:25:30.94Z" },
+ { url = "https://files.pythonhosted.org/packages/68/9e/cad0f508ed7c3fbd07398f22b5bf25aa0523fcf56c84c3def642909e80ae/backports_zstd-1.3.0-cp310-cp310-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:1124a169a647671ccb4654a0ef1d0b42d6735c45ce3d0adf609df22fb1f099db", size = 505958, upload-time = "2025-12-29T17:25:32.694Z" },
+ { url = "https://files.pythonhosted.org/packages/b7/dc/96dc55c043b0d86e53ae9608b496196936244c1ecf7e95cdf66d0dbc0f23/backports_zstd-1.3.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8410fda08b36202d01ab4503f6787c763898888cb1a48c19fce94711563d3ee3", size = 475571, upload-time = "2025-12-29T17:25:33.9Z" },
+ { url = "https://files.pythonhosted.org/packages/20/48/d9c8c8c2a5ac57fc5697f1945254af31407b0c5f80335a175a7c215b4118/backports_zstd-1.3.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab139d1fc0e91a697e82fa834e6404098802f11b6035607174776173ded9a2cc", size = 581199, upload-time = "2025-12-29T17:25:35.566Z" },
+ { url = "https://files.pythonhosted.org/packages/0d/ca/7fe70d2d39ed39e26a6c6f6c1dd229f1ab889500d5c90b17527702b1a21e/backports_zstd-1.3.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6f3115d203f387f77c23b5461fb6678d282d4f276f9f39298ad242b00120afc7", size = 640846, upload-time = "2025-12-29T17:25:36.86Z" },
+ { url = "https://files.pythonhosted.org/packages/0e/d8/5b8580469e70b72402212885bf19b9d31eaf23549b602e0c294edf380e25/backports_zstd-1.3.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:116f65cce84e215dfac0414924b051faf8d29dc7188cf3944dd1e5be8dd15a32", size = 491061, upload-time = "2025-12-29T17:25:38.721Z" },
+ { url = "https://files.pythonhosted.org/packages/cc/dd/17a752263fccd1ba24184b7e89c14cd31553d512e2e5b065f38e63a0ba86/backports_zstd-1.3.0-cp310-cp310-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:04def169e4a9ae291298124da4e097c6d6545d0e93164f934b716da04d24630a", size = 565071, upload-time = "2025-12-29T17:25:40.372Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/81/df23d3fe664b2497ab2ec01dc012cb9304e7d568c67f50b1b324fb2d8cbb/backports_zstd-1.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:481b586291ef02a250f03d4c31a37c9881e5e93556568abbd20ca1ad720d443f", size = 481518, upload-time = "2025-12-29T17:25:41.925Z" },
+ { url = "https://files.pythonhosted.org/packages/ba/cd/e50dd85fde890c5d79e1ed5dc241f1c45f87b6c12571fdb60add57f2ee66/backports_zstd-1.3.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0290979eea67f7275fa42d5859cc5bea94f2c08cca6bc36396673476773d2bad", size = 509464, upload-time = "2025-12-29T17:25:43.844Z" },
+ { url = "https://files.pythonhosted.org/packages/d3/bb/e429156e4b834837fe78b4f32ed512491aea39415444420c79ccd3aa0526/backports_zstd-1.3.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:01c699d8c803dc9f9c9d6ede21b75ec99f45c3b411821011692befca538928cb", size = 585563, upload-time = "2025-12-29T17:25:45.038Z" },
+ { url = "https://files.pythonhosted.org/packages/95/c0/1a0d245325827242aefe76f4f3477ec183b996b8db5105698564f8303481/backports_zstd-1.3.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:2c662912cfc1a5ebd1d2162ac651549d58bd3c97a8096130ec13c703fca355f2", size = 562889, upload-time = "2025-12-29T17:25:46.576Z" },
+ { url = "https://files.pythonhosted.org/packages/93/42/126b2bc7540a15452c3ebdf190ebfea8a8644e29b22f4e10e2a6aa2389e4/backports_zstd-1.3.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:3180c8eb085396928e9946167e610aa625922b82c3e2263c5f17000556370168", size = 631423, upload-time = "2025-12-29T17:25:47.81Z" },
+ { url = "https://files.pythonhosted.org/packages/dc/32/018e49657411582569032b7d1bb5d62e514aad8b44952de740ec6250588d/backports_zstd-1.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5b9a8c75a294e7ffa18fc8425a763facc366435a8b442e4dffdc19fa9499a22c", size = 495122, upload-time = "2025-12-29T17:25:49.377Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/9e/cdd1d2e1d3612bb90d9cf9b23bea06f2155cdafccd8b6f28a1c4d7750004/backports_zstd-1.3.0-cp310-cp310-win32.whl", hash = "sha256:845defdb172385f17123d92a00d2e952d341e9ae310bfa2410c292bf03846034", size = 288573, upload-time = "2025-12-29T17:25:51.167Z" },
+ { url = "https://files.pythonhosted.org/packages/55/7c/2e9c80f08375bd14262cefa69297a926134f517c9955c0795eec5e1d470e/backports_zstd-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:43a9fea6299c801da85221e387b32d90a9ad7c62aa2a34edf525359ce5ad8f3a", size = 313506, upload-time = "2025-12-29T17:25:52.778Z" },
+ { url = "https://files.pythonhosted.org/packages/c5/5d/fa67e8174f54db44eb33498abb7f98bea4f2329e873b225391bda0113a5e/backports_zstd-1.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:df8473cb117e1316e6c6101f2724e025bd8f50af2dc009d0001c0aabfb5eb57c", size = 288688, upload-time = "2025-12-29T17:25:54.012Z" },
+ { url = "https://files.pythonhosted.org/packages/ac/28/ed31a0e35feb4538a996348362051b52912d50f00d25c2d388eccef9242c/backports_zstd-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:249f90b39d3741c48620021a968b35f268ca70e35f555abeea9ff95a451f35f9", size = 435660, upload-time = "2025-12-29T17:25:55.207Z" },
+ { url = "https://files.pythonhosted.org/packages/00/0d/3db362169d80442adda9dd563c4f0bb10091c8c1c9a158037f4ecd53988e/backports_zstd-1.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b0e71e83e46154a9d3ced6d4de9a2fea8207ee1e4832aeecf364dc125eda305c", size = 362056, upload-time = "2025-12-29T17:25:56.729Z" },
+ { url = "https://files.pythonhosted.org/packages/bd/00/b67ba053a7d6f6dbe2f8a704b7d3a5e01b1d2e2e8edbc9b634f2702ef73c/backports_zstd-1.3.0-cp311-cp311-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:cbc6193acd21f96760c94dd71bf32b161223e8503f5277acb0a5ab54e5598957", size = 505957, upload-time = "2025-12-29T17:25:57.941Z" },
+ { url = "https://files.pythonhosted.org/packages/6f/3e/2667c0ddb53ddf28667e330bf9fe92e8e17705a481c9b698e283120565f7/backports_zstd-1.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1df583adc0ae84a8d13d7139f42eade6d90182b1dd3e0d28f7df3c564b9fd55d", size = 475569, upload-time = "2025-12-29T17:25:59.075Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/86/4052473217bd954ccdffda5f7264a0e99e7c4ecf70c0f729845c6a45fc5a/backports_zstd-1.3.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d833fc23aa3cc2e05aeffc7cfadd87b796654ad3a7fb214555cda3f1db2d4dc2", size = 581196, upload-time = "2025-12-29T17:26:00.508Z" },
+ { url = "https://files.pythonhosted.org/packages/e5/bd/064f6fdb61db3d2c473159ebc844243e650dc032de0f8208443a00127925/backports_zstd-1.3.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:142178fe981061f1d2a57c5348f2cd31a3b6397a35593e7a17dbda817b793a7f", size = 640888, upload-time = "2025-12-29T17:26:02.134Z" },
+ { url = "https://files.pythonhosted.org/packages/d8/09/0822403f40932a165a4f1df289d41653683019e4fd7a86b63ed20e9b6177/backports_zstd-1.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5eed0a09a163f3a8125a857cb031be87ed052e4a47bc75085ed7fca786e9bb5b", size = 491100, upload-time = "2025-12-29T17:26:03.418Z" },
+ { url = "https://files.pythonhosted.org/packages/a6/a3/f5ac28d74039b7e182a780809dc66b9dbfc893186f5d5444340bba135389/backports_zstd-1.3.0-cp311-cp311-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:60aa483fef5843749e993dde01229e5eedebca8c283023d27d6bf6800d1d4ce3", size = 565071, upload-time = "2025-12-29T17:26:05.022Z" },
+ { url = "https://files.pythonhosted.org/packages/e1/ac/50209aeb92257a642ee987afa1e61d5b6731ab6bf0bff70905856e5aede6/backports_zstd-1.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ea0886c1b619773544546e243ed73f6d6c2b1ae3c00c904ccc9903a352d731e1", size = 481519, upload-time = "2025-12-29T17:26:06.255Z" },
+ { url = "https://files.pythonhosted.org/packages/08/1f/b06f64199fb4b2e9437cedbf96d0155ca08aeec35fe81d41065acd44762e/backports_zstd-1.3.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5e137657c830a5ce99be40a1d713eb1d246bae488ada28ff0666ac4387aebdd5", size = 509465, upload-time = "2025-12-29T17:26:07.602Z" },
+ { url = "https://files.pythonhosted.org/packages/f4/37/2c365196e61c8fffbbc930ffd69f1ada7aa1c7210857b3e565031c787ac6/backports_zstd-1.3.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:94048c8089755e482e4b34608029cf1142523a625873c272be2b1c9253871a72", size = 585552, upload-time = "2025-12-29T17:26:08.911Z" },
+ { url = "https://files.pythonhosted.org/packages/93/8d/c2c4f448bb6b6c9df17410eaedce415e8db0eb25b60d09a3d22a98294d09/backports_zstd-1.3.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:d339c1ec40485e97e600eb9a285fb13169dbf44c5094b945788a62f38b96e533", size = 562893, upload-time = "2025-12-29T17:26:10.566Z" },
+ { url = "https://files.pythonhosted.org/packages/74/e8/2110d4d39115130f7514cbbcec673a885f4052bb68d15e41bc96a7558856/backports_zstd-1.3.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:8aeee9210c54cf8bf83f4d263a6d0d6e7a0298aeb5a14a0a95e90487c5c3157c", size = 631462, upload-time = "2025-12-29T17:26:11.99Z" },
+ { url = "https://files.pythonhosted.org/packages/b9/a8/d64b59ae0714fdace14e43873f794eff93613e35e3e85eead33a4f44cd80/backports_zstd-1.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ba7114a3099e5ea05cbb46568bd0e08bca2ca11e12c6a7b563a24b86b2b4a67f", size = 495125, upload-time = "2025-12-29T17:26:13.218Z" },
+ { url = "https://files.pythonhosted.org/packages/ef/d8/bcff0a091fcf27172c57ae463e49d8dec6dc31e01d7e7bf1ae3aad9c3566/backports_zstd-1.3.0-cp311-cp311-win32.whl", hash = "sha256:08dfdfb85da5915383bfae680b6ac10ab5769ab22e690f9a854320720011ae8e", size = 288664, upload-time = "2025-12-29T17:26:14.791Z" },
+ { url = "https://files.pythonhosted.org/packages/28/1a/379061e2abf8c3150ad51c1baab9ac723e01cf7538860a6a74c48f8b73ee/backports_zstd-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:d8aac2e7cdcc8f310c16f98a0062b48d0a081dbb82862794f4f4f5bdafde30a4", size = 313633, upload-time = "2025-12-29T17:26:16.31Z" },
+ { url = "https://files.pythonhosted.org/packages/35/e7/eca40858883029fc716660106069b23253e2ec5fd34e86b4101c8cfe864b/backports_zstd-1.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:440ef1be06e82dc0d69dbb57177f2ce98bbd2151013ee7e551e2f2b54caa6120", size = 288814, upload-time = "2025-12-29T17:26:17.571Z" },
+ { url = "https://files.pythonhosted.org/packages/72/d4/356da49d3053f4bc50e71a8535631b57bc9ca4e8c6d2442e073e0ab41c44/backports_zstd-1.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f4a292e357f3046d18766ce06d990ccbab97411708d3acb934e63529c2ea7786", size = 435972, upload-time = "2025-12-29T17:26:18.752Z" },
+ { url = "https://files.pythonhosted.org/packages/30/8f/dbe389e60c7e47af488520f31a4aa14028d66da5bf3c60d3044b571eb906/backports_zstd-1.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fb4c386f38323698991b38edcc9c091d46d4713f5df02a3b5c80a28b40e289ea", size = 362124, upload-time = "2025-12-29T17:26:19.995Z" },
+ { url = "https://files.pythonhosted.org/packages/55/4b/173beafc99e99e7276ce008ef060b704471e75124c826bc5e2092815da37/backports_zstd-1.3.0-cp312-cp312-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:f52523d2bdada29e653261abdc9cfcecd9e5500d305708b7e37caddb24909d4e", size = 506378, upload-time = "2025-12-29T17:26:21.855Z" },
+ { url = "https://files.pythonhosted.org/packages/df/c8/3f12a411d9a99d262cdb37b521025eecc2aa7e4a93277be3f4f4889adb74/backports_zstd-1.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3321d00beaacbd647252a7f581c1e1cdbdbda2407f2addce4bfb10e8e404b7c7", size = 476201, upload-time = "2025-12-29T17:26:23.047Z" },
+ { url = "https://files.pythonhosted.org/packages/43/dc/73c090e4a2d5671422512e1b6d276ca6ea0cc0c45ec4634789106adc0d66/backports_zstd-1.3.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:88f94d238ef36c639c0ae17cf41054ce103da9c4d399c6a778ce82690d9f4919", size = 581659, upload-time = "2025-12-29T17:26:24.189Z" },
+ { url = "https://files.pythonhosted.org/packages/08/4f/11bfcef534aa2bf3f476f52130217b45337f334d8a287edb2e06744a6515/backports_zstd-1.3.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:97d8c78fe20c7442c810adccfd5e3ea6a4e6f4f1fa4c73da2bc083260ebead17", size = 640388, upload-time = "2025-12-29T17:26:25.47Z" },
+ { url = "https://files.pythonhosted.org/packages/71/17/8faea426d4f49b63238bdfd9f211a9f01c862efe0d756d3abeb84265a4e2/backports_zstd-1.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eefda80c3dbfbd924f1c317e7b0543d39304ee645583cb58bae29e19f42948ed", size = 494173, upload-time = "2025-12-29T17:26:26.736Z" },
+ { url = "https://files.pythonhosted.org/packages/ba/9d/901f19ac90f3cd999bdcfb6edb4d7b4dc383dfba537f06f533fc9ac4777b/backports_zstd-1.3.0-cp312-cp312-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:2ab5d3b5a54a674f4f6367bb9e0914063f22cd102323876135e9cc7a8f14f17e", size = 568628, upload-time = "2025-12-29T17:26:28.12Z" },
+ { url = "https://files.pythonhosted.org/packages/60/39/4d29788590c2465a570c2fae49dbff05741d1f0c8e4a0fb2c1c310f31804/backports_zstd-1.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7558fb0e8c8197c59a5f80c56bf8f56c3690c45fd62f14e9e2081661556e3e64", size = 482233, upload-time = "2025-12-29T17:26:29.399Z" },
+ { url = "https://files.pythonhosted.org/packages/d9/4b/24c7c9e8ef384b19d515a7b1644a500ceb3da3baeff6d579687da1a0f62b/backports_zstd-1.3.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:27744870e38f017159b9c0241ea51562f94c7fefcfa4c5190fb3ec4a65a7fc63", size = 509806, upload-time = "2025-12-29T17:26:30.605Z" },
+ { url = "https://files.pythonhosted.org/packages/3f/7e/7ba1aeecf0b5859f1855c0e661b4559566b64000f0627698ebd9e83f2138/backports_zstd-1.3.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b099750755bb74c280827c7d68de621da0f245189082ab48ff91bda0ec2db9df", size = 586037, upload-time = "2025-12-29T17:26:32.201Z" },
+ { url = "https://files.pythonhosted.org/packages/4a/1a/18f0402b36b9cfb0aea010b5df900cfd42c214f37493561dba3abac90c4e/backports_zstd-1.3.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:5434e86f2836d453ae3e19a2711449683b7e21e107686838d12a255ad256ca99", size = 566220, upload-time = "2025-12-29T17:26:33.5Z" },
+ { url = "https://files.pythonhosted.org/packages/dc/d9/44c098ab31b948bbfd909ec4ae08e1e44c5025a2d846f62991a62ab3ebea/backports_zstd-1.3.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:407e451f64e2f357c9218f5be4e372bb6102d7ae88582d415262a9d0a4f9b625", size = 630847, upload-time = "2025-12-29T17:26:35.273Z" },
+ { url = "https://files.pythonhosted.org/packages/30/33/e74cb2cfb162d2e9e00dad8bcdf53118ca7786cfd467925d6864732f79cc/backports_zstd-1.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:58a071f3c198c781b2df801070290b7174e3ff61875454e9df93ab7ea9ea832b", size = 498665, upload-time = "2025-12-29T17:26:37.123Z" },
+ { url = "https://files.pythonhosted.org/packages/a2/a9/67a24007c333ed22736d5cd79f1aa1d7209f09be772ff82a8fd724c1978e/backports_zstd-1.3.0-cp312-cp312-win32.whl", hash = "sha256:21a9a542ccc7958ddb51ae6e46d8ed25d585b54d0d52aaa1c8da431ea158046a", size = 288809, upload-time = "2025-12-29T17:26:38.373Z" },
+ { url = "https://files.pythonhosted.org/packages/42/24/34b816118ea913debb2ea23e71ffd0fb2e2ac738064c4ac32e3fb62c18bb/backports_zstd-1.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:89ea8281821123b071a06b30b80da8e4d8a2b40a4f57315a19850337a21297ac", size = 313815, upload-time = "2025-12-29T17:26:39.665Z" },
+ { url = "https://files.pythonhosted.org/packages/4e/2f/babd02c9fc4ca35376ada7c291193a208165c7be2455f0f98bc1e1243f31/backports_zstd-1.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:f6843ecb181480e423b02f60fe29e393cbc31a95fb532acdf0d3a2c87bd50ce3", size = 288927, upload-time = "2025-12-29T17:26:40.923Z" },
+ { url = "https://files.pythonhosted.org/packages/95/b7/e843d32122f25d9568e75d1e7a29c00eae5e5728015604f3f6d02259b3a5/backports_zstd-1.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3ab0d5632b84eff4355c42a04668cfe6466f7d390890f718978582bd1ff36949", size = 409771, upload-time = "2025-12-29T17:27:48.869Z" },
+ { url = "https://files.pythonhosted.org/packages/fa/a5/d6a897d4b91732f54b4506858f1da65d7a5b2dc0dbe36a23992a64f09f5a/backports_zstd-1.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:6b97cea95dbb1a97c02afd718155fad93f747815069722107a429804c355e206", size = 339289, upload-time = "2025-12-29T17:27:50.055Z" },
+ { url = "https://files.pythonhosted.org/packages/3f/b0/f0ce566ec221b284508eebbf574a779ba4a8932830db6ea03b6176f336a2/backports_zstd-1.3.0-pp310-pypy310_pp73-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:477895f2642f9397aeba69618df2c91d7f336e02df83d1e623ac37c5d3a5115e", size = 420335, upload-time = "2025-12-29T17:27:51.455Z" },
+ { url = "https://files.pythonhosted.org/packages/62/6d/bf55652c84c79b2565d3087265bcb097719540a313dee16359a54d83ab4e/backports_zstd-1.3.0-pp310-pypy310_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:330172aaf5fd3bfa53f49318abc6d1d4238cb043c384cf71f7b8f0fe2fb7ce31", size = 393880, upload-time = "2025-12-29T17:27:52.869Z" },
+ { url = "https://files.pythonhosted.org/packages/be/e0/d1feebb70ffeb150e2891c6f09700079f4a60085ebc67529eb1ca72fb5c2/backports_zstd-1.3.0-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:32974e71eff15897ed3f8b7766a753d9f3197ea4f1c9025d80f8de099a691b99", size = 413840, upload-time = "2025-12-29T17:27:54.527Z" },
+ { url = "https://files.pythonhosted.org/packages/36/28/3b7be27ae51e418d3a724bbc4cb7fea77b6bd38b5007e333a56b0cb165c8/backports_zstd-1.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:993e3a34eaba5928a2065545e34bf75c65b9c34ecb67e43d5ef49b16cc182077", size = 299685, upload-time = "2025-12-29T17:27:56.149Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/d9/8c9c246e5ea79a4f45d551088b11b61f2dc7efcdc5dbe6df3be84a506e0c/backports_zstd-1.3.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:968167d29f012cee7b112ad031a8925e484e97e99288e55e4d62962c3a1013e3", size = 409666, upload-time = "2025-12-29T17:27:57.37Z" },
+ { url = "https://files.pythonhosted.org/packages/a4/4f/a55b33c314ca8c9074e99daab54d04c5d212070ae7dbc435329baf1b139e/backports_zstd-1.3.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d8f6fc7d62b71083b574193dd8fb3a60e6bb34880cc0132aad242943af301f7a", size = 339199, upload-time = "2025-12-29T17:27:58.542Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/13/ce31bd048b1c88d0f65d7af60b6cf89cfbed826c7c978f0ebca9a8a71cfc/backports_zstd-1.3.0-pp311-pypy311_pp73-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:e0f2eca6aac280fdb77991ad3362487ee91a7fb064ad40043fb5a0bf5a376943", size = 420332, upload-time = "2025-12-29T17:28:00.332Z" },
+ { url = "https://files.pythonhosted.org/packages/cf/80/c0cdbc533d0037b57248588403a3afb050b2a83b8c38aa608e31b3a4d600/backports_zstd-1.3.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:676eb5e177d4ef528cf3baaeea4fffe05f664e4dd985d3ac06960ef4619c81a9", size = 393879, upload-time = "2025-12-29T17:28:01.57Z" },
+ { url = "https://files.pythonhosted.org/packages/0f/38/c97428867cac058ed196ccaeddfdf82ecd43b8a65965f2950a6e7547e77a/backports_zstd-1.3.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:199eb9bd8aca6a9d489c41a682fad22c587dffe57b613d0fe6d492d0d38ce7c5", size = 413842, upload-time = "2025-12-29T17:28:03.113Z" },
+ { url = "https://files.pythonhosted.org/packages/8d/ec/6247be6536668fe1c7dfae3eaa9c94b00b956b716957c0fc986ba78c3cc4/backports_zstd-1.3.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:2524bd6777a828d5e7ccd7bd1a57f9e7007ae654fc2bd1bc1a207f6428674e4a", size = 299684, upload-time = "2025-12-29T17:28:04.856Z" },
]
[[package]]
@@ -305,7 +313,7 @@ wheels = [
[[package]]
name = "black"
-version = "25.11.0"
+version = "25.12.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "click" },
@@ -317,21 +325,24 @@ dependencies = [
{ name = "tomli", marker = "python_full_version < '3.11'" },
{ name = "typing-extensions", marker = "python_full_version < '3.11'" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/8c/ad/33adf4708633d047950ff2dfdea2e215d84ac50ef95aff14a614e4b6e9b2/black-25.11.0.tar.gz", hash = "sha256:9a323ac32f5dc75ce7470501b887250be5005a01602e931a15e45593f70f6e08", size = 655669, upload-time = "2025-11-10T01:53:50.558Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/c4/d9/07b458a3f1c525ac392b5edc6b191ff140b596f9d77092429417a54e249d/black-25.12.0.tar.gz", hash = "sha256:8d3dd9cea14bff7ddc0eb243c811cdb1a011ebb4800a5f0335a01a68654796a7", size = 659264, upload-time = "2025-12-08T01:40:52.501Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/b3/d2/6caccbc96f9311e8ec3378c296d4f4809429c43a6cd2394e3c390e86816d/black-25.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ec311e22458eec32a807f029b2646f661e6859c3f61bc6d9ffb67958779f392e", size = 1743501, upload-time = "2025-11-10T01:59:06.202Z" },
- { url = "https://files.pythonhosted.org/packages/69/35/b986d57828b3f3dccbf922e2864223197ba32e74c5004264b1c62bc9f04d/black-25.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1032639c90208c15711334d681de2e24821af0575573db2810b0763bcd62e0f0", size = 1597308, upload-time = "2025-11-10T01:57:58.633Z" },
- { url = "https://files.pythonhosted.org/packages/39/8e/8b58ef4b37073f52b64a7b2dd8c9a96c84f45d6f47d878d0aa557e9a2d35/black-25.11.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0c0f7c461df55cf32929b002335883946a4893d759f2df343389c4396f3b6b37", size = 1656194, upload-time = "2025-11-10T01:57:10.909Z" },
- { url = "https://files.pythonhosted.org/packages/8d/30/9c2267a7955ecc545306534ab88923769a979ac20a27cf618d370091e5dd/black-25.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:f9786c24d8e9bd5f20dc7a7f0cdd742644656987f6ea6947629306f937726c03", size = 1347996, upload-time = "2025-11-10T01:57:22.391Z" },
- { url = "https://files.pythonhosted.org/packages/c4/62/d304786b75ab0c530b833a89ce7d997924579fb7484ecd9266394903e394/black-25.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:895571922a35434a9d8ca67ef926da6bc9ad464522a5fe0db99b394ef1c0675a", size = 1727891, upload-time = "2025-11-10T02:01:40.507Z" },
- { url = "https://files.pythonhosted.org/packages/82/5d/ffe8a006aa522c9e3f430e7b93568a7b2163f4b3f16e8feb6d8c3552761a/black-25.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cb4f4b65d717062191bdec8e4a442539a8ea065e6af1c4f4d36f0cdb5f71e170", size = 1581875, upload-time = "2025-11-10T01:57:51.192Z" },
- { url = "https://files.pythonhosted.org/packages/cb/c8/7c8bda3108d0bb57387ac41b4abb5c08782b26da9f9c4421ef6694dac01a/black-25.11.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d81a44cbc7e4f73a9d6ae449ec2317ad81512d1e7dce7d57f6333fd6259737bc", size = 1642716, upload-time = "2025-11-10T01:56:51.589Z" },
- { url = "https://files.pythonhosted.org/packages/34/b9/f17dea34eecb7cc2609a89627d480fb6caea7b86190708eaa7eb15ed25e7/black-25.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:7eebd4744dfe92ef1ee349dc532defbf012a88b087bb7ddd688ff59a447b080e", size = 1352904, upload-time = "2025-11-10T01:59:26.252Z" },
- { url = "https://files.pythonhosted.org/packages/7f/12/5c35e600b515f35ffd737da7febdb2ab66bb8c24d88560d5e3ef3d28c3fd/black-25.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:80e7486ad3535636657aa180ad32a7d67d7c273a80e12f1b4bfa0823d54e8fac", size = 1772831, upload-time = "2025-11-10T02:03:47Z" },
- { url = "https://files.pythonhosted.org/packages/1a/75/b3896bec5a2bb9ed2f989a970ea40e7062f8936f95425879bbe162746fe5/black-25.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6cced12b747c4c76bc09b4db057c319d8545307266f41aaee665540bc0e04e96", size = 1608520, upload-time = "2025-11-10T01:58:46.895Z" },
- { url = "https://files.pythonhosted.org/packages/f3/b5/2bfc18330eddbcfb5aab8d2d720663cd410f51b2ed01375f5be3751595b0/black-25.11.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6cb2d54a39e0ef021d6c5eef442e10fd71fcb491be6413d083a320ee768329dd", size = 1682719, upload-time = "2025-11-10T01:56:55.24Z" },
- { url = "https://files.pythonhosted.org/packages/96/fb/f7dc2793a22cdf74a72114b5ed77fe3349a2e09ef34565857a2f917abdf2/black-25.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:ae263af2f496940438e5be1a0c1020e13b09154f3af4df0835ea7f9fe7bfa409", size = 1362684, upload-time = "2025-11-10T01:57:07.639Z" },
- { url = "https://files.pythonhosted.org/packages/00/5d/aed32636ed30a6e7f9efd6ad14e2a0b0d687ae7c8c7ec4e4a557174b895c/black-25.11.0-py3-none-any.whl", hash = "sha256:e3f562da087791e96cefcd9dda058380a442ab322a02e222add53736451f604b", size = 204918, upload-time = "2025-11-10T01:53:48.917Z" },
+ { url = "https://files.pythonhosted.org/packages/37/d5/8d3145999d380e5d09bb00b0f7024bf0a8ccb5c07b5648e9295f02ec1d98/black-25.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f85ba1ad15d446756b4ab5f3044731bf68b777f8f9ac9cdabd2425b97cd9c4e8", size = 1895720, upload-time = "2025-12-08T01:46:58.197Z" },
+ { url = "https://files.pythonhosted.org/packages/06/97/7acc85c4add41098f4f076b21e3e4e383ad6ed0a3da26b2c89627241fc11/black-25.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:546eecfe9a3a6b46f9d69d8a642585a6eaf348bcbbc4d87a19635570e02d9f4a", size = 1727193, upload-time = "2025-12-08T01:52:26.674Z" },
+ { url = "https://files.pythonhosted.org/packages/24/f0/fdf0eb8ba907ddeb62255227d29d349e8256ef03558fbcadfbc26ecfe3b2/black-25.12.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:17dcc893da8d73d8f74a596f64b7c98ef5239c2cd2b053c0f25912c4494bf9ea", size = 1774506, upload-time = "2025-12-08T01:46:25.721Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/f5/9203a78efe00d13336786b133c6180a9303d46908a9aa72d1104ca214222/black-25.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:09524b0e6af8ba7a3ffabdfc7a9922fb9adef60fed008c7cd2fc01f3048e6e6f", size = 1416085, upload-time = "2025-12-08T01:46:06.073Z" },
+ { url = "https://files.pythonhosted.org/packages/ba/cc/7a6090e6b081c3316282c05c546e76affdce7bf7a3b7d2c3a2a69438bd01/black-25.12.0-cp310-cp310-win_arm64.whl", hash = "sha256:b162653ed89eb942758efeb29d5e333ca5bb90e5130216f8369857db5955a7da", size = 1226038, upload-time = "2025-12-08T01:45:29.388Z" },
+ { url = "https://files.pythonhosted.org/packages/60/ad/7ac0d0e1e0612788dbc48e62aef8a8e8feffac7eb3d787db4e43b8462fa8/black-25.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d0cfa263e85caea2cff57d8f917f9f51adae8e20b610e2b23de35b5b11ce691a", size = 1877003, upload-time = "2025-12-08T01:43:29.967Z" },
+ { url = "https://files.pythonhosted.org/packages/e8/dd/a237e9f565f3617a88b49284b59cbca2a4f56ebe68676c1aad0ce36a54a7/black-25.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1a2f578ae20c19c50a382286ba78bfbeafdf788579b053d8e4980afb079ab9be", size = 1712639, upload-time = "2025-12-08T01:52:46.756Z" },
+ { url = "https://files.pythonhosted.org/packages/12/80/e187079df1ea4c12a0c63282ddd8b81d5107db6d642f7d7b75a6bcd6fc21/black-25.12.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d3e1b65634b0e471d07ff86ec338819e2ef860689859ef4501ab7ac290431f9b", size = 1758143, upload-time = "2025-12-08T01:45:29.137Z" },
+ { url = "https://files.pythonhosted.org/packages/93/b5/3096ccee4f29dc2c3aac57274326c4d2d929a77e629f695f544e159bfae4/black-25.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:a3fa71e3b8dd9f7c6ac4d818345237dfb4175ed3bf37cd5a581dbc4c034f1ec5", size = 1420698, upload-time = "2025-12-08T01:45:53.379Z" },
+ { url = "https://files.pythonhosted.org/packages/7e/39/f81c0ffbc25ffbe61c7d0385bf277e62ffc3e52f5ee668d7369d9854fadf/black-25.12.0-cp311-cp311-win_arm64.whl", hash = "sha256:51e267458f7e650afed8445dc7edb3187143003d52a1b710c7321aef22aa9655", size = 1229317, upload-time = "2025-12-08T01:46:35.606Z" },
+ { url = "https://files.pythonhosted.org/packages/d1/bd/26083f805115db17fda9877b3c7321d08c647df39d0df4c4ca8f8450593e/black-25.12.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:31f96b7c98c1ddaeb07dc0f56c652e25bdedaac76d5b68a059d998b57c55594a", size = 1924178, upload-time = "2025-12-08T01:49:51.048Z" },
+ { url = "https://files.pythonhosted.org/packages/89/6b/ea00d6651561e2bdd9231c4177f4f2ae19cc13a0b0574f47602a7519b6ca/black-25.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:05dd459a19e218078a1f98178c13f861fe6a9a5f88fc969ca4d9b49eb1809783", size = 1742643, upload-time = "2025-12-08T01:49:59.09Z" },
+ { url = "https://files.pythonhosted.org/packages/6d/f3/360fa4182e36e9875fabcf3a9717db9d27a8d11870f21cff97725c54f35b/black-25.12.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c1f68c5eff61f226934be6b5b80296cf6939e5d2f0c2f7d543ea08b204bfaf59", size = 1800158, upload-time = "2025-12-08T01:44:27.301Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/08/2c64830cb6616278067e040acca21d4f79727b23077633953081c9445d61/black-25.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:274f940c147ddab4442d316b27f9e332ca586d39c85ecf59ebdea82cc9ee8892", size = 1426197, upload-time = "2025-12-08T01:45:51.198Z" },
+ { url = "https://files.pythonhosted.org/packages/d4/60/a93f55fd9b9816b7432cf6842f0e3000fdd5b7869492a04b9011a133ee37/black-25.12.0-cp312-cp312-win_arm64.whl", hash = "sha256:169506ba91ef21e2e0591563deda7f00030cb466e747c4b09cb0a9dae5db2f43", size = 1237266, upload-time = "2025-12-08T01:45:10.556Z" },
+ { url = "https://files.pythonhosted.org/packages/68/11/21331aed19145a952ad28fca2756a1433ee9308079bd03bd898e903a2e53/black-25.12.0-py3-none-any.whl", hash = "sha256:48ceb36c16dbc84062740049eef990bb2ce07598272e673c17d1a7720c71c828", size = 206191, upload-time = "2025-12-08T01:40:50.963Z" },
]
[[package]]
@@ -406,11 +417,11 @@ wheels = [
[[package]]
name = "certifi"
-version = "2025.11.12"
+version = "2026.1.4"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/a2/8c/58f469717fa48465e4a50c014a0400602d3c437d7c0c468e17ada824da3a/certifi-2025.11.12.tar.gz", hash = "sha256:d8ab5478f2ecd78af242878415affce761ca6bc54a22a27e026d7c25357c3316", size = 160538, upload-time = "2025-11-12T02:54:51.517Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/e0/2d/a891ca51311197f6ad14a7ef42e2399f36cf2f9bd44752b3dc4eab60fdc5/certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120", size = 154268, upload-time = "2026-01-04T02:42:41.825Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/70/7d/9bc192684cea499815ff478dfcdc13835ddf401365057044fb721ec6bddb/certifi-2025.11.12-py3-none-any.whl", hash = "sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b", size = 159438, upload-time = "2025-11-12T02:54:49.735Z" },
+ { url = "https://files.pythonhosted.org/packages/e6/ad/3cc14f097111b4de0040c83a525973216457bbeeb63739ef1ed275c1c021/certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c", size = 152900, upload-time = "2026-01-04T02:42:40.15Z" },
]
[[package]]
@@ -651,49 +662,49 @@ wheels = [
[[package]]
name = "coverage"
-version = "7.12.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/89/26/4a96807b193b011588099c3b5c89fbb05294e5b90e71018e065465f34eb6/coverage-7.12.0.tar.gz", hash = "sha256:fc11e0a4e372cb5f282f16ef90d4a585034050ccda536451901abfb19a57f40c", size = 819341, upload-time = "2025-11-18T13:34:20.766Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/26/4a/0dc3de1c172d35abe512332cfdcc43211b6ebce629e4cc42e6cd25ed8f4d/coverage-7.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:32b75c2ba3f324ee37af3ccee5b30458038c50b349ad9b88cee85096132a575b", size = 217409, upload-time = "2025-11-18T13:31:53.122Z" },
- { url = "https://files.pythonhosted.org/packages/01/c3/086198b98db0109ad4f84241e8e9ea7e5fb2db8c8ffb787162d40c26cc76/coverage-7.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cb2a1b6ab9fe833714a483a915de350abc624a37149649297624c8d57add089c", size = 217927, upload-time = "2025-11-18T13:31:54.458Z" },
- { url = "https://files.pythonhosted.org/packages/5d/5f/34614dbf5ce0420828fc6c6f915126a0fcb01e25d16cf141bf5361e6aea6/coverage-7.12.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5734b5d913c3755e72f70bf6cc37a0518d4f4745cde760c5d8e12005e62f9832", size = 244678, upload-time = "2025-11-18T13:31:55.805Z" },
- { url = "https://files.pythonhosted.org/packages/55/7b/6b26fb32e8e4a6989ac1d40c4e132b14556131493b1d06bc0f2be169c357/coverage-7.12.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b527a08cdf15753279b7afb2339a12073620b761d79b81cbe2cdebdb43d90daa", size = 246507, upload-time = "2025-11-18T13:31:57.05Z" },
- { url = "https://files.pythonhosted.org/packages/06/42/7d70e6603d3260199b90fb48b537ca29ac183d524a65cc31366b2e905fad/coverage-7.12.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9bb44c889fb68004e94cab71f6a021ec83eac9aeabdbb5a5a88821ec46e1da73", size = 248366, upload-time = "2025-11-18T13:31:58.362Z" },
- { url = "https://files.pythonhosted.org/packages/2d/4a/d86b837923878424c72458c5b25e899a3c5ca73e663082a915f5b3c4d749/coverage-7.12.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4b59b501455535e2e5dde5881739897967b272ba25988c89145c12d772810ccb", size = 245366, upload-time = "2025-11-18T13:31:59.572Z" },
- { url = "https://files.pythonhosted.org/packages/e6/c2/2adec557e0aa9721875f06ced19730fdb7fc58e31b02b5aa56f2ebe4944d/coverage-7.12.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d8842f17095b9868a05837b7b1b73495293091bed870e099521ada176aa3e00e", size = 246408, upload-time = "2025-11-18T13:32:00.784Z" },
- { url = "https://files.pythonhosted.org/packages/5a/4b/8bd1f1148260df11c618e535fdccd1e5aaf646e55b50759006a4f41d8a26/coverage-7.12.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c5a6f20bf48b8866095c6820641e7ffbe23f2ac84a2efc218d91235e404c7777", size = 244416, upload-time = "2025-11-18T13:32:01.963Z" },
- { url = "https://files.pythonhosted.org/packages/0e/13/3a248dd6a83df90414c54a4e121fd081fb20602ca43955fbe1d60e2312a9/coverage-7.12.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:5f3738279524e988d9da2893f307c2093815c623f8d05a8f79e3eff3a7a9e553", size = 244681, upload-time = "2025-11-18T13:32:03.408Z" },
- { url = "https://files.pythonhosted.org/packages/76/30/aa833827465a5e8c938935f5d91ba055f70516941078a703740aaf1aa41f/coverage-7.12.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e0d68c1f7eabbc8abe582d11fa393ea483caf4f44b0af86881174769f185c94d", size = 245300, upload-time = "2025-11-18T13:32:04.686Z" },
- { url = "https://files.pythonhosted.org/packages/38/24/f85b3843af1370fb3739fa7571819b71243daa311289b31214fe3e8c9d68/coverage-7.12.0-cp310-cp310-win32.whl", hash = "sha256:7670d860e18b1e3ee5930b17a7d55ae6287ec6e55d9799982aa103a2cc1fa2ef", size = 220008, upload-time = "2025-11-18T13:32:05.806Z" },
- { url = "https://files.pythonhosted.org/packages/3a/a2/c7da5b9566f7164db9eefa133d17761ecb2c2fde9385d754e5b5c80f710d/coverage-7.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:f999813dddeb2a56aab5841e687b68169da0d3f6fc78ccf50952fa2463746022", size = 220943, upload-time = "2025-11-18T13:32:07.166Z" },
- { url = "https://files.pythonhosted.org/packages/5a/0c/0dfe7f0487477d96432e4815537263363fb6dd7289743a796e8e51eabdf2/coverage-7.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa124a3683d2af98bd9d9c2bfa7a5076ca7e5ab09fdb96b81fa7d89376ae928f", size = 217535, upload-time = "2025-11-18T13:32:08.812Z" },
- { url = "https://files.pythonhosted.org/packages/9b/f5/f9a4a053a5bbff023d3bec259faac8f11a1e5a6479c2ccf586f910d8dac7/coverage-7.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d93fbf446c31c0140208dcd07c5d882029832e8ed7891a39d6d44bd65f2316c3", size = 218044, upload-time = "2025-11-18T13:32:10.329Z" },
- { url = "https://files.pythonhosted.org/packages/95/c5/84fc3697c1fa10cd8571919bf9693f693b7373278daaf3b73e328d502bc8/coverage-7.12.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:52ca620260bd8cd6027317bdd8b8ba929be1d741764ee765b42c4d79a408601e", size = 248440, upload-time = "2025-11-18T13:32:12.536Z" },
- { url = "https://files.pythonhosted.org/packages/f4/36/2d93fbf6a04670f3874aed397d5a5371948a076e3249244a9e84fb0e02d6/coverage-7.12.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f3433ffd541380f3a0e423cff0f4926d55b0cc8c1d160fdc3be24a4c03aa65f7", size = 250361, upload-time = "2025-11-18T13:32:13.852Z" },
- { url = "https://files.pythonhosted.org/packages/5d/49/66dc65cc456a6bfc41ea3d0758c4afeaa4068a2b2931bf83be6894cf1058/coverage-7.12.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f7bbb321d4adc9f65e402c677cd1c8e4c2d0105d3ce285b51b4d87f1d5db5245", size = 252472, upload-time = "2025-11-18T13:32:15.068Z" },
- { url = "https://files.pythonhosted.org/packages/35/1f/ebb8a18dffd406db9fcd4b3ae42254aedcaf612470e8712f12041325930f/coverage-7.12.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:22a7aade354a72dff3b59c577bfd18d6945c61f97393bc5fb7bd293a4237024b", size = 248592, upload-time = "2025-11-18T13:32:16.328Z" },
- { url = "https://files.pythonhosted.org/packages/da/a8/67f213c06e5ea3b3d4980df7dc344d7fea88240b5fe878a5dcbdfe0e2315/coverage-7.12.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3ff651dcd36d2fea66877cd4a82de478004c59b849945446acb5baf9379a1b64", size = 250167, upload-time = "2025-11-18T13:32:17.687Z" },
- { url = "https://files.pythonhosted.org/packages/f0/00/e52aef68154164ea40cc8389c120c314c747fe63a04b013a5782e989b77f/coverage-7.12.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:31b8b2e38391a56e3cea39d22a23faaa7c3fc911751756ef6d2621d2a9daf742", size = 248238, upload-time = "2025-11-18T13:32:19.2Z" },
- { url = "https://files.pythonhosted.org/packages/1f/a4/4d88750bcf9d6d66f77865e5a05a20e14db44074c25fd22519777cb69025/coverage-7.12.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:297bc2da28440f5ae51c845a47c8175a4db0553a53827886e4fb25c66633000c", size = 247964, upload-time = "2025-11-18T13:32:21.027Z" },
- { url = "https://files.pythonhosted.org/packages/a7/6b/b74693158899d5b47b0bf6238d2c6722e20ba749f86b74454fac0696bb00/coverage-7.12.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6ff7651cc01a246908eac162a6a86fc0dbab6de1ad165dfb9a1e2ec660b44984", size = 248862, upload-time = "2025-11-18T13:32:22.304Z" },
- { url = "https://files.pythonhosted.org/packages/18/de/6af6730227ce0e8ade307b1cc4a08e7f51b419a78d02083a86c04ccceb29/coverage-7.12.0-cp311-cp311-win32.whl", hash = "sha256:313672140638b6ddb2c6455ddeda41c6a0b208298034544cfca138978c6baed6", size = 220033, upload-time = "2025-11-18T13:32:23.714Z" },
- { url = "https://files.pythonhosted.org/packages/e2/a1/e7f63021a7c4fe20994359fcdeae43cbef4a4d0ca36a5a1639feeea5d9e1/coverage-7.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:a1783ed5bd0d5938d4435014626568dc7f93e3cb99bc59188cc18857c47aa3c4", size = 220966, upload-time = "2025-11-18T13:32:25.599Z" },
- { url = "https://files.pythonhosted.org/packages/77/e8/deae26453f37c20c3aa0c4433a1e32cdc169bf415cce223a693117aa3ddd/coverage-7.12.0-cp311-cp311-win_arm64.whl", hash = "sha256:4648158fd8dd9381b5847622df1c90ff314efbfc1df4550092ab6013c238a5fc", size = 219637, upload-time = "2025-11-18T13:32:27.265Z" },
- { url = "https://files.pythonhosted.org/packages/02/bf/638c0427c0f0d47638242e2438127f3c8ee3cfc06c7fdeb16778ed47f836/coverage-7.12.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:29644c928772c78512b48e14156b81255000dcfd4817574ff69def189bcb3647", size = 217704, upload-time = "2025-11-18T13:32:28.906Z" },
- { url = "https://files.pythonhosted.org/packages/08/e1/706fae6692a66c2d6b871a608bbde0da6281903fa0e9f53a39ed441da36a/coverage-7.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8638cbb002eaa5d7c8d04da667813ce1067080b9a91099801a0053086e52b736", size = 218064, upload-time = "2025-11-18T13:32:30.161Z" },
- { url = "https://files.pythonhosted.org/packages/a9/8b/eb0231d0540f8af3ffda39720ff43cb91926489d01524e68f60e961366e4/coverage-7.12.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:083631eeff5eb9992c923e14b810a179798bb598e6a0dd60586819fc23be6e60", size = 249560, upload-time = "2025-11-18T13:32:31.835Z" },
- { url = "https://files.pythonhosted.org/packages/e9/a1/67fb52af642e974d159b5b379e4d4c59d0ebe1288677fbd04bbffe665a82/coverage-7.12.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:99d5415c73ca12d558e07776bd957c4222c687b9f1d26fa0e1b57e3598bdcde8", size = 252318, upload-time = "2025-11-18T13:32:33.178Z" },
- { url = "https://files.pythonhosted.org/packages/41/e5/38228f31b2c7665ebf9bdfdddd7a184d56450755c7e43ac721c11a4b8dab/coverage-7.12.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e949ebf60c717c3df63adb4a1a366c096c8d7fd8472608cd09359e1bd48ef59f", size = 253403, upload-time = "2025-11-18T13:32:34.45Z" },
- { url = "https://files.pythonhosted.org/packages/ec/4b/df78e4c8188f9960684267c5a4897836f3f0f20a20c51606ee778a1d9749/coverage-7.12.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6d907ddccbca819afa2cd014bc69983b146cca2735a0b1e6259b2a6c10be1e70", size = 249984, upload-time = "2025-11-18T13:32:35.747Z" },
- { url = "https://files.pythonhosted.org/packages/ba/51/bb163933d195a345c6f63eab9e55743413d064c291b6220df754075c2769/coverage-7.12.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b1518ecbad4e6173f4c6e6c4a46e49555ea5679bf3feda5edb1b935c7c44e8a0", size = 251339, upload-time = "2025-11-18T13:32:37.352Z" },
- { url = "https://files.pythonhosted.org/packages/15/40/c9b29cdb8412c837cdcbc2cfa054547dd83affe6cbbd4ce4fdb92b6ba7d1/coverage-7.12.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:51777647a749abdf6f6fd8c7cffab12de68ab93aab15efc72fbbb83036c2a068", size = 249489, upload-time = "2025-11-18T13:32:39.212Z" },
- { url = "https://files.pythonhosted.org/packages/c8/da/b3131e20ba07a0de4437a50ef3b47840dfabf9293675b0cd5c2c7f66dd61/coverage-7.12.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:42435d46d6461a3b305cdfcad7cdd3248787771f53fe18305548cba474e6523b", size = 249070, upload-time = "2025-11-18T13:32:40.598Z" },
- { url = "https://files.pythonhosted.org/packages/70/81/b653329b5f6302c08d683ceff6785bc60a34be9ae92a5c7b63ee7ee7acec/coverage-7.12.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5bcead88c8423e1855e64b8057d0544e33e4080b95b240c2a355334bb7ced937", size = 250929, upload-time = "2025-11-18T13:32:42.915Z" },
- { url = "https://files.pythonhosted.org/packages/a3/00/250ac3bca9f252a5fb1338b5ad01331ebb7b40223f72bef5b1b2cb03aa64/coverage-7.12.0-cp312-cp312-win32.whl", hash = "sha256:dcbb630ab034e86d2a0f79aefd2be07e583202f41e037602d438c80044957baa", size = 220241, upload-time = "2025-11-18T13:32:44.665Z" },
- { url = "https://files.pythonhosted.org/packages/64/1c/77e79e76d37ce83302f6c21980b45e09f8aa4551965213a10e62d71ce0ab/coverage-7.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:2fd8354ed5d69775ac42986a691fbf68b4084278710cee9d7c3eaa0c28fa982a", size = 221051, upload-time = "2025-11-18T13:32:46.008Z" },
- { url = "https://files.pythonhosted.org/packages/31/f5/641b8a25baae564f9e52cac0e2667b123de961985709a004e287ee7663cc/coverage-7.12.0-cp312-cp312-win_arm64.whl", hash = "sha256:737c3814903be30695b2de20d22bcc5428fdae305c61ba44cdc8b3252984c49c", size = 219692, upload-time = "2025-11-18T13:32:47.372Z" },
- { url = "https://files.pythonhosted.org/packages/ce/a3/43b749004e3c09452e39bb56347a008f0a0668aad37324a99b5c8ca91d9e/coverage-7.12.0-py3-none-any.whl", hash = "sha256:159d50c0b12e060b15ed3d39f87ed43d4f7f7ad40b8a534f4dd331adbb51104a", size = 209503, upload-time = "2025-11-18T13:34:18.892Z" },
+version = "7.13.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/23/f9/e92df5e07f3fc8d4c7f9a0f146ef75446bf870351cd37b788cf5897f8079/coverage-7.13.1.tar.gz", hash = "sha256:b7593fe7eb5feaa3fbb461ac79aac9f9fc0387a5ca8080b0c6fe2ca27b091afd", size = 825862, upload-time = "2025-12-28T15:42:56.969Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/2d/9a/3742e58fd04b233df95c012ee9f3dfe04708a5e1d32613bd2d47d4e1be0d/coverage-7.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e1fa280b3ad78eea5be86f94f461c04943d942697e0dac889fa18fff8f5f9147", size = 218633, upload-time = "2025-12-28T15:40:10.165Z" },
+ { url = "https://files.pythonhosted.org/packages/7e/45/7e6bdc94d89cd7c8017ce735cf50478ddfe765d4fbf0c24d71d30ea33d7a/coverage-7.13.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c3d8c679607220979434f494b139dfb00131ebf70bb406553d69c1ff01a5c33d", size = 219147, upload-time = "2025-12-28T15:40:12.069Z" },
+ { url = "https://files.pythonhosted.org/packages/f7/38/0d6a258625fd7f10773fe94097dc16937a5f0e3e0cdf3adef67d3ac6baef/coverage-7.13.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:339dc63b3eba969067b00f41f15ad161bf2946613156fb131266d8debc8e44d0", size = 245894, upload-time = "2025-12-28T15:40:13.556Z" },
+ { url = "https://files.pythonhosted.org/packages/27/58/409d15ea487986994cbd4d06376e9860e9b157cfbfd402b1236770ab8dd2/coverage-7.13.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:db622b999ffe49cb891f2fff3b340cdc2f9797d01a0a202a0973ba2562501d90", size = 247721, upload-time = "2025-12-28T15:40:15.37Z" },
+ { url = "https://files.pythonhosted.org/packages/da/bf/6e8056a83fd7a96c93341f1ffe10df636dd89f26d5e7b9ca511ce3bcf0df/coverage-7.13.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1443ba9acbb593fa7c1c29e011d7c9761545fe35e7652e85ce7f51a16f7e08d", size = 249585, upload-time = "2025-12-28T15:40:17.226Z" },
+ { url = "https://files.pythonhosted.org/packages/f4/15/e1daff723f9f5959acb63cbe35b11203a9df77ee4b95b45fffd38b318390/coverage-7.13.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c832ec92c4499ac463186af72f9ed4d8daec15499b16f0a879b0d1c8e5cf4a3b", size = 246597, upload-time = "2025-12-28T15:40:19.028Z" },
+ { url = "https://files.pythonhosted.org/packages/74/a6/1efd31c5433743a6ddbc9d37ac30c196bb07c7eab3d74fbb99b924c93174/coverage-7.13.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:562ec27dfa3f311e0db1ba243ec6e5f6ab96b1edfcfc6cf86f28038bc4961ce6", size = 247626, upload-time = "2025-12-28T15:40:20.846Z" },
+ { url = "https://files.pythonhosted.org/packages/6d/9f/1609267dd3e749f57fdd66ca6752567d1c13b58a20a809dc409b263d0b5f/coverage-7.13.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:4de84e71173d4dada2897e5a0e1b7877e5eefbfe0d6a44edee6ce31d9b8ec09e", size = 245629, upload-time = "2025-12-28T15:40:22.397Z" },
+ { url = "https://files.pythonhosted.org/packages/e2/f6/6815a220d5ec2466383d7cc36131b9fa6ecbe95c50ec52a631ba733f306a/coverage-7.13.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:a5a68357f686f8c4d527a2dc04f52e669c2fc1cbde38f6f7eb6a0e58cbd17cae", size = 245901, upload-time = "2025-12-28T15:40:23.836Z" },
+ { url = "https://files.pythonhosted.org/packages/ac/58/40576554cd12e0872faf6d2c0eb3bc85f71d78427946ddd19ad65201e2c0/coverage-7.13.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:77cc258aeb29a3417062758975521eae60af6f79e930d6993555eeac6a8eac29", size = 246505, upload-time = "2025-12-28T15:40:25.421Z" },
+ { url = "https://files.pythonhosted.org/packages/3b/77/9233a90253fba576b0eee81707b5781d0e21d97478e5377b226c5b096c0f/coverage-7.13.1-cp310-cp310-win32.whl", hash = "sha256:bb4f8c3c9a9f34423dba193f241f617b08ffc63e27f67159f60ae6baf2dcfe0f", size = 221257, upload-time = "2025-12-28T15:40:27.217Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/43/e842ff30c1a0a623ec80db89befb84a3a7aad7bfe44a6ea77d5a3e61fedd/coverage-7.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:c8e2706ceb622bc63bac98ebb10ef5da80ed70fbd8a7999a5076de3afaef0fb1", size = 222191, upload-time = "2025-12-28T15:40:28.916Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/9b/77baf488516e9ced25fc215a6f75d803493fc3f6a1a1227ac35697910c2a/coverage-7.13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a55d509a1dc5a5b708b5dad3b5334e07a16ad4c2185e27b40e4dba796ab7f88", size = 218755, upload-time = "2025-12-28T15:40:30.812Z" },
+ { url = "https://files.pythonhosted.org/packages/d7/cd/7ab01154e6eb79ee2fab76bf4d89e94c6648116557307ee4ebbb85e5c1bf/coverage-7.13.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4d010d080c4888371033baab27e47c9df7d6fb28d0b7b7adf85a4a49be9298b3", size = 219257, upload-time = "2025-12-28T15:40:32.333Z" },
+ { url = "https://files.pythonhosted.org/packages/01/d5/b11ef7863ffbbdb509da0023fad1e9eda1c0eaea61a6d2ea5b17d4ac706e/coverage-7.13.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d938b4a840fb1523b9dfbbb454f652967f18e197569c32266d4d13f37244c3d9", size = 249657, upload-time = "2025-12-28T15:40:34.1Z" },
+ { url = "https://files.pythonhosted.org/packages/f7/7c/347280982982383621d29b8c544cf497ae07ac41e44b1ca4903024131f55/coverage-7.13.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:bf100a3288f9bb7f919b87eb84f87101e197535b9bd0e2c2b5b3179633324fee", size = 251581, upload-time = "2025-12-28T15:40:36.131Z" },
+ { url = "https://files.pythonhosted.org/packages/82/f6/ebcfed11036ade4c0d75fa4453a6282bdd225bc073862766eec184a4c643/coverage-7.13.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef6688db9bf91ba111ae734ba6ef1a063304a881749726e0d3575f5c10a9facf", size = 253691, upload-time = "2025-12-28T15:40:37.626Z" },
+ { url = "https://files.pythonhosted.org/packages/02/92/af8f5582787f5d1a8b130b2dcba785fa5e9a7a8e121a0bb2220a6fdbdb8a/coverage-7.13.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0b609fc9cdbd1f02e51f67f51e5aee60a841ef58a68d00d5ee2c0faf357481a3", size = 249799, upload-time = "2025-12-28T15:40:39.47Z" },
+ { url = "https://files.pythonhosted.org/packages/24/aa/0e39a2a3b16eebf7f193863323edbff38b6daba711abaaf807d4290cf61a/coverage-7.13.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c43257717611ff5e9a1d79dce8e47566235ebda63328718d9b65dd640bc832ef", size = 251389, upload-time = "2025-12-28T15:40:40.954Z" },
+ { url = "https://files.pythonhosted.org/packages/73/46/7f0c13111154dc5b978900c0ccee2e2ca239b910890e674a77f1363d483e/coverage-7.13.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e09fbecc007f7b6afdfb3b07ce5bd9f8494b6856dd4f577d26c66c391b829851", size = 249450, upload-time = "2025-12-28T15:40:42.489Z" },
+ { url = "https://files.pythonhosted.org/packages/ac/ca/e80da6769e8b669ec3695598c58eef7ad98b0e26e66333996aee6316db23/coverage-7.13.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:a03a4f3a19a189919c7055098790285cc5c5b0b3976f8d227aea39dbf9f8bfdb", size = 249170, upload-time = "2025-12-28T15:40:44.279Z" },
+ { url = "https://files.pythonhosted.org/packages/af/18/9e29baabdec1a8644157f572541079b4658199cfd372a578f84228e860de/coverage-7.13.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3820778ea1387c2b6a818caec01c63adc5b3750211af6447e8dcfb9b6f08dbba", size = 250081, upload-time = "2025-12-28T15:40:45.748Z" },
+ { url = "https://files.pythonhosted.org/packages/00/f8/c3021625a71c3b2f516464d322e41636aea381018319050a8114105872ee/coverage-7.13.1-cp311-cp311-win32.whl", hash = "sha256:ff10896fa55167371960c5908150b434b71c876dfab97b69478f22c8b445ea19", size = 221281, upload-time = "2025-12-28T15:40:47.232Z" },
+ { url = "https://files.pythonhosted.org/packages/27/56/c216625f453df6e0559ed666d246fcbaaa93f3aa99eaa5080cea1229aa3d/coverage-7.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:a998cc0aeeea4c6d5622a3754da5a493055d2d95186bad877b0a34ea6e6dbe0a", size = 222215, upload-time = "2025-12-28T15:40:49.19Z" },
+ { url = "https://files.pythonhosted.org/packages/5c/9a/be342e76f6e531cae6406dc46af0d350586f24d9b67fdfa6daee02df71af/coverage-7.13.1-cp311-cp311-win_arm64.whl", hash = "sha256:fea07c1a39a22614acb762e3fbbb4011f65eedafcb2948feeef641ac78b4ee5c", size = 220886, upload-time = "2025-12-28T15:40:51.067Z" },
+ { url = "https://files.pythonhosted.org/packages/ce/8a/87af46cccdfa78f53db747b09f5f9a21d5fc38d796834adac09b30a8ce74/coverage-7.13.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6f34591000f06e62085b1865c9bc5f7858df748834662a51edadfd2c3bfe0dd3", size = 218927, upload-time = "2025-12-28T15:40:52.814Z" },
+ { url = "https://files.pythonhosted.org/packages/82/a8/6e22fdc67242a4a5a153f9438d05944553121c8f4ba70cb072af4c41362e/coverage-7.13.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b67e47c5595b9224599016e333f5ec25392597a89d5744658f837d204e16c63e", size = 219288, upload-time = "2025-12-28T15:40:54.262Z" },
+ { url = "https://files.pythonhosted.org/packages/d0/0a/853a76e03b0f7c4375e2ca025df45c918beb367f3e20a0a8e91967f6e96c/coverage-7.13.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3e7b8bd70c48ffb28461ebe092c2345536fb18bbbf19d287c8913699735f505c", size = 250786, upload-time = "2025-12-28T15:40:56.059Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/b4/694159c15c52b9f7ec7adf49d50e5f8ee71d3e9ef38adb4445d13dd56c20/coverage-7.13.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c223d078112e90dc0e5c4e35b98b9584164bea9fbbd221c0b21c5241f6d51b62", size = 253543, upload-time = "2025-12-28T15:40:57.585Z" },
+ { url = "https://files.pythonhosted.org/packages/96/b2/7f1f0437a5c855f87e17cf5d0dc35920b6440ff2b58b1ba9788c059c26c8/coverage-7.13.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:794f7c05af0763b1bbd1b9e6eff0e52ad068be3b12cd96c87de037b01390c968", size = 254635, upload-time = "2025-12-28T15:40:59.443Z" },
+ { url = "https://files.pythonhosted.org/packages/e9/d1/73c3fdb8d7d3bddd9473c9c6a2e0682f09fc3dfbcb9c3f36412a7368bcab/coverage-7.13.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0642eae483cc8c2902e4af7298bf886d605e80f26382124cddc3967c2a3df09e", size = 251202, upload-time = "2025-12-28T15:41:01.328Z" },
+ { url = "https://files.pythonhosted.org/packages/66/3c/f0edf75dcc152f145d5598329e864bbbe04ab78660fe3e8e395f9fff010f/coverage-7.13.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9f5e772ed5fef25b3de9f2008fe67b92d46831bd2bc5bdc5dd6bfd06b83b316f", size = 252566, upload-time = "2025-12-28T15:41:03.319Z" },
+ { url = "https://files.pythonhosted.org/packages/17/b3/e64206d3c5f7dcbceafd14941345a754d3dbc78a823a6ed526e23b9cdaab/coverage-7.13.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:45980ea19277dc0a579e432aef6a504fe098ef3a9032ead15e446eb0f1191aee", size = 250711, upload-time = "2025-12-28T15:41:06.411Z" },
+ { url = "https://files.pythonhosted.org/packages/dc/ad/28a3eb970a8ef5b479ee7f0c484a19c34e277479a5b70269dc652b730733/coverage-7.13.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:e4f18eca6028ffa62adbd185a8f1e1dd242f2e68164dba5c2b74a5204850b4cf", size = 250278, upload-time = "2025-12-28T15:41:08.285Z" },
+ { url = "https://files.pythonhosted.org/packages/54/e3/c8f0f1a93133e3e1291ca76cbb63565bd4b5c5df63b141f539d747fff348/coverage-7.13.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f8dca5590fec7a89ed6826fce625595279e586ead52e9e958d3237821fbc750c", size = 252154, upload-time = "2025-12-28T15:41:09.969Z" },
+ { url = "https://files.pythonhosted.org/packages/d0/bf/9939c5d6859c380e405b19e736321f1c7d402728792f4c752ad1adcce005/coverage-7.13.1-cp312-cp312-win32.whl", hash = "sha256:ff86d4e85188bba72cfb876df3e11fa243439882c55957184af44a35bd5880b7", size = 221487, upload-time = "2025-12-28T15:41:11.468Z" },
+ { url = "https://files.pythonhosted.org/packages/fa/dc/7282856a407c621c2aad74021680a01b23010bb8ebf427cf5eacda2e876f/coverage-7.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:16cc1da46c04fb0fb128b4dc430b78fa2aba8a6c0c9f8eb391fd5103409a6ac6", size = 222299, upload-time = "2025-12-28T15:41:13.386Z" },
+ { url = "https://files.pythonhosted.org/packages/10/79/176a11203412c350b3e9578620013af35bcdb79b651eb976f4a4b32044fa/coverage-7.13.1-cp312-cp312-win_arm64.whl", hash = "sha256:8d9bc218650022a768f3775dd7fdac1886437325d8d295d923ebcfef4892ad5c", size = 220941, upload-time = "2025-12-28T15:41:14.975Z" },
+ { url = "https://files.pythonhosted.org/packages/cc/48/d9f421cb8da5afaa1a64570d9989e00fb7955e6acddc5a12979f7666ef60/coverage-7.13.1-py3-none-any.whl", hash = "sha256:2016745cb3ba554469d02819d78958b571792bb68e31302610e898f80dd3a573", size = 210722, upload-time = "2025-12-28T15:42:54.901Z" },
]
[package.optional-dependencies]
@@ -858,15 +869,15 @@ wheels = [
[[package]]
name = "docutils"
-version = "0.22.3"
+version = "0.22.4"
source = { registry = "https://pypi.org/simple" }
resolution-markers = [
"python_full_version >= '3.12'",
"python_full_version == '3.11.*'",
]
-sdist = { url = "https://files.pythonhosted.org/packages/d9/02/111134bfeb6e6c7ac4c74594e39a59f6c0195dc4846afbeac3cba60f1927/docutils-0.22.3.tar.gz", hash = "sha256:21486ae730e4ca9f622677b1412b879af1791efcfba517e4c6f60be543fc8cdd", size = 2290153, upload-time = "2025-11-06T02:35:55.655Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/ae/b6/03bb70946330e88ffec97aefd3ea75ba575cb2e762061e0e62a213befee8/docutils-0.22.4.tar.gz", hash = "sha256:4db53b1fde9abecbb74d91230d32ab626d94f6badfc575d6db9194a49df29968", size = 2291750, upload-time = "2025-12-18T19:00:26.443Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/11/a8/c6a4b901d17399c77cd81fb001ce8961e9f5e04d3daf27e8925cb012e163/docutils-0.22.3-py3-none-any.whl", hash = "sha256:bd772e4aca73aff037958d44f2be5229ded4c09927fcf8690c577b66234d6ceb", size = 633032, upload-time = "2025-11-06T02:35:52.391Z" },
+ { url = "https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl", hash = "sha256:d0013f540772d1420576855455d050a2180186c91c15779301ac2ccb3eeb68de", size = 633196, upload-time = "2025-12-18T19:00:18.077Z" },
]
[[package]]
@@ -892,44 +903,44 @@ wheels = [
[[package]]
name = "filelock"
-version = "3.20.0"
+version = "3.20.2"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/58/46/0028a82567109b5ef6e4d2a1f04a583fb513e6cf9527fcdd09afd817deeb/filelock-3.20.0.tar.gz", hash = "sha256:711e943b4ec6be42e1d4e6690b48dc175c822967466bb31c0c293f34334c13f4", size = 18922, upload-time = "2025-10-08T18:03:50.056Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/c1/e0/a75dbe4bca1e7d41307323dad5ea2efdd95408f74ab2de8bd7dba9b51a1a/filelock-3.20.2.tar.gz", hash = "sha256:a2241ff4ddde2a7cebddf78e39832509cb045d18ec1a09d7248d6bfc6bfbbe64", size = 19510, upload-time = "2026-01-02T15:33:32.582Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/76/91/7216b27286936c16f5b4d0c530087e4a54eead683e6b0b73dd0c64844af6/filelock-3.20.0-py3-none-any.whl", hash = "sha256:339b4732ffda5cd79b13f4e2711a31b0365ce445d95d243bb996273d072546a2", size = 16054, upload-time = "2025-10-08T18:03:48.35Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/30/ab407e2ec752aa541704ed8f93c11e2a5d92c168b8a755d818b74a3c5c2d/filelock-3.20.2-py3-none-any.whl", hash = "sha256:fbba7237d6ea277175a32c54bb71ef814a8546d8601269e1bfc388de333974e8", size = 16697, upload-time = "2026-01-02T15:33:31.133Z" },
]
[[package]]
name = "fonttools"
-version = "4.61.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/33/f9/0e84d593c0e12244150280a630999835a64f2852276161b62a0f98318de0/fonttools-4.61.0.tar.gz", hash = "sha256:ec520a1f0c7758d7a858a00f090c1745f6cde6a7c5e76fb70ea4044a15f712e7", size = 3561884, upload-time = "2025-11-28T17:05:49.491Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/29/f3/91bba2721fb173fc68e09d15b6ccf3ad4f83d127fbff579be7e5984888a6/fonttools-4.61.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:dc25a4a9c1225653e4431a9413d0381b1c62317b0f543bdcec24e1991f612f33", size = 2850151, upload-time = "2025-11-28T17:04:14.214Z" },
- { url = "https://files.pythonhosted.org/packages/f5/8c/a1691dec01038ac7e7bb3ab83300dcc5087b11d8f48640928c02a873eb92/fonttools-4.61.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b493c32d2555e9944ec1b911ea649ff8f01a649ad9cba6c118d6798e932b3f0", size = 2389769, upload-time = "2025-11-28T17:04:16.443Z" },
- { url = "https://files.pythonhosted.org/packages/2d/dd/5bb369a44319d92ba25612511eb8ed2a6fa75239979e0388907525626902/fonttools-4.61.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ad751319dc532a79bdf628b8439af167181b4210a0cd28a8935ca615d9fdd727", size = 4893189, upload-time = "2025-11-28T17:04:18.398Z" },
- { url = "https://files.pythonhosted.org/packages/5e/02/51373fa8846bd22bb54e5efb30a824b417b058083f775a194a432f21a45f/fonttools-4.61.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2de14557d113faa5fb519f7f29c3abe4d69c17fe6a5a2595cc8cda7338029219", size = 4854415, upload-time = "2025-11-28T17:04:20.421Z" },
- { url = "https://files.pythonhosted.org/packages/8b/64/9cdbbb804577a7e6191448851c57e6a36eb02aa4bf6a9668b528c968e44e/fonttools-4.61.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:59587bbe455dbdf75354a9dbca1697a35a8903e01fab4248d6b98a17032cee52", size = 4870927, upload-time = "2025-11-28T17:04:22.625Z" },
- { url = "https://files.pythonhosted.org/packages/92/68/e40b22919dc96dc30a70b58fec609ab85112de950bdecfadf8dd478c5a88/fonttools-4.61.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:46cb3d9279f758ac0cf671dc3482da877104b65682679f01b246515db03dbb72", size = 4988674, upload-time = "2025-11-28T17:04:24.675Z" },
- { url = "https://files.pythonhosted.org/packages/9b/5c/e857349ce8aedb2451b9448282e86544b2b7f1c8b10ea0fe49b7cb369b72/fonttools-4.61.0-cp310-cp310-win32.whl", hash = "sha256:58b4f1b78dfbfe855bb8a6801b31b8cdcca0e2847ec769ad8e0b0b692832dd3b", size = 1497663, upload-time = "2025-11-28T17:04:26.598Z" },
- { url = "https://files.pythonhosted.org/packages/f9/0c/62961d5fe6f764d6cbc387ef2c001f5f610808c7aded837409836c0b3e7c/fonttools-4.61.0-cp310-cp310-win_amd64.whl", hash = "sha256:68704a8bbe0b61976262b255e90cde593dc0fe3676542d9b4d846bad2a890a76", size = 1546143, upload-time = "2025-11-28T17:04:28.432Z" },
- { url = "https://files.pythonhosted.org/packages/fd/be/5aa89cdddf2863d8afbdc19eb8ec5d8d35d40eeeb8e6cf52c5ff1c2dbd33/fonttools-4.61.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a32a16951cbf113d38f1dd8551b277b6e06e0f6f776fece0f99f746d739e1be3", size = 2847553, upload-time = "2025-11-28T17:04:30.539Z" },
- { url = "https://files.pythonhosted.org/packages/0d/3e/6ff643b07cead1236a534f51291ae2981721cf419135af5b740c002a66dd/fonttools-4.61.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:328a9c227984bebaf69f3ac9062265f8f6acc7ddf2e4e344c63358579af0aa3d", size = 2388298, upload-time = "2025-11-28T17:04:32.161Z" },
- { url = "https://files.pythonhosted.org/packages/c3/15/fca8dfbe7b482e6f240b1aad0ed7c6e2e75e7a28efa3d3a03b570617b5e5/fonttools-4.61.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2f0bafc8a3b3749c69cc610e5aa3da832d39c2a37a68f03d18ec9a02ecaac04a", size = 5054133, upload-time = "2025-11-28T17:04:34.035Z" },
- { url = "https://files.pythonhosted.org/packages/6a/a2/821c61c691b21fd09e07528a9a499cc2b075ac83ddb644aa16c9875a64bc/fonttools-4.61.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b5ca59b7417d149cf24e4c1933c9f44b2957424fc03536f132346d5242e0ebe5", size = 5031410, upload-time = "2025-11-28T17:04:36.141Z" },
- { url = "https://files.pythonhosted.org/packages/e8/f6/8b16339e93d03c732c8a23edefe3061b17a5f9107ddc47a3215ecd054cac/fonttools-4.61.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:df8cbce85cf482eb01f4551edca978c719f099c623277bda8332e5dbe7dba09d", size = 5030005, upload-time = "2025-11-28T17:04:38.314Z" },
- { url = "https://files.pythonhosted.org/packages/ac/eb/d4e150427bdaa147755239c931bbce829a88149ade5bfd8a327afe565567/fonttools-4.61.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7fb5b84f48a6a733ca3d7f41aa9551908ccabe8669ffe79586560abcc00a9cfd", size = 5154026, upload-time = "2025-11-28T17:04:40.34Z" },
- { url = "https://files.pythonhosted.org/packages/7f/5f/3dd00ce0dba6759943c707b1830af8c0bcf6f8f1a9fe46cb82e7ac2aaa74/fonttools-4.61.0-cp311-cp311-win32.whl", hash = "sha256:787ef9dfd1ea9fe49573c272412ae5f479d78e671981819538143bec65863865", size = 2276035, upload-time = "2025-11-28T17:04:42.59Z" },
- { url = "https://files.pythonhosted.org/packages/4e/44/798c472f096ddf12955eddb98f4f7c906e7497695d04ce073ddf7161d134/fonttools-4.61.0-cp311-cp311-win_amd64.whl", hash = "sha256:14fafda386377b6131d9e448af42d0926bad47e038de0e5ba1d58c25d621f028", size = 2327290, upload-time = "2025-11-28T17:04:44.57Z" },
- { url = "https://files.pythonhosted.org/packages/00/5d/19e5939f773c7cb05480fe2e881d63870b63ee2b4bdb9a77d55b1d36c7b9/fonttools-4.61.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e24a1565c4e57111ec7f4915f8981ecbb61adf66a55f378fdc00e206059fcfef", size = 2846930, upload-time = "2025-11-28T17:04:46.639Z" },
- { url = "https://files.pythonhosted.org/packages/25/b2/0658faf66f705293bd7e739a4f038302d188d424926be9c59bdad945664b/fonttools-4.61.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e2bfacb5351303cae9f072ccf3fc6ecb437a6f359c0606bae4b1ab6715201d87", size = 2383016, upload-time = "2025-11-28T17:04:48.525Z" },
- { url = "https://files.pythonhosted.org/packages/29/a3/1fa90b95b690f0d7541f48850adc40e9019374d896c1b8148d15012b2458/fonttools-4.61.0-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0bdcf2e29d65c26299cc3d502f4612365e8b90a939f46cd92d037b6cb7bb544a", size = 4949425, upload-time = "2025-11-28T17:04:50.482Z" },
- { url = "https://files.pythonhosted.org/packages/af/00/acf18c00f6c501bd6e05ee930f926186f8a8e268265407065688820f1c94/fonttools-4.61.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e6cd0d9051b8ddaf7385f99dd82ec2a058e2b46cf1f1961e68e1ff20fcbb61af", size = 4999632, upload-time = "2025-11-28T17:04:52.508Z" },
- { url = "https://files.pythonhosted.org/packages/5f/e0/19a2b86e54109b1d2ee8743c96a1d297238ae03243897bc5345c0365f34d/fonttools-4.61.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e074bc07c31406f45c418e17c1722e83560f181d122c412fa9e815df0ff74810", size = 4939438, upload-time = "2025-11-28T17:04:54.437Z" },
- { url = "https://files.pythonhosted.org/packages/04/35/7b57a5f57d46286360355eff8d6b88c64ab6331107f37a273a71c803798d/fonttools-4.61.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5a9b78da5d5faa17e63b2404b77feeae105c1b7e75f26020ab7a27b76e02039f", size = 5088960, upload-time = "2025-11-28T17:04:56.348Z" },
- { url = "https://files.pythonhosted.org/packages/3e/0e/6c5023eb2e0fe5d1ababc7e221e44acd3ff668781489cc1937a6f83d620a/fonttools-4.61.0-cp312-cp312-win32.whl", hash = "sha256:9821ed77bb676736b88fa87a737c97b6af06e8109667e625a4f00158540ce044", size = 2264404, upload-time = "2025-11-28T17:04:58.149Z" },
- { url = "https://files.pythonhosted.org/packages/36/0b/63273128c7c5df19b1e4cd92e0a1e6ea5bb74a400c4905054c96ad60a675/fonttools-4.61.0-cp312-cp312-win_amd64.whl", hash = "sha256:0011d640afa61053bc6590f9a3394bd222de7cfde19346588beabac374e9d8ac", size = 2314427, upload-time = "2025-11-28T17:04:59.812Z" },
- { url = "https://files.pythonhosted.org/packages/0c/14/634f7daea5ffe6a5f7a0322ba8e1a0e23c9257b80aa91458107896d1dfc7/fonttools-4.61.0-py3-none-any.whl", hash = "sha256:276f14c560e6f98d24ef7f5f44438e55ff5a67f78fa85236b218462c9f5d0635", size = 1144485, upload-time = "2025-11-28T17:05:47.573Z" },
+version = "4.61.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/ec/ca/cf17b88a8df95691275a3d77dc0a5ad9907f328ae53acbe6795da1b2f5ed/fonttools-4.61.1.tar.gz", hash = "sha256:6675329885c44657f826ef01d9e4fb33b9158e9d93c537d84ad8399539bc6f69", size = 3565756, upload-time = "2025-12-12T17:31:24.246Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/5b/94/8a28707adb00bed1bf22dac16ccafe60faf2ade353dcb32c3617ee917307/fonttools-4.61.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c7db70d57e5e1089a274cbb2b1fd635c9a24de809a231b154965d415d6c6d24", size = 2854799, upload-time = "2025-12-12T17:29:27.5Z" },
+ { url = "https://files.pythonhosted.org/packages/94/93/c2e682faaa5ee92034818d8f8a8145ae73eb83619600495dcf8503fa7771/fonttools-4.61.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5fe9fd43882620017add5eabb781ebfbc6998ee49b35bd7f8f79af1f9f99a958", size = 2403032, upload-time = "2025-12-12T17:29:30.115Z" },
+ { url = "https://files.pythonhosted.org/packages/f1/62/1748f7e7e1ee41aa52279fd2e3a6d0733dc42a673b16932bad8e5d0c8b28/fonttools-4.61.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8db08051fc9e7d8bc622f2112511b8107d8f27cd89e2f64ec45e9825e8288da", size = 4897863, upload-time = "2025-12-12T17:29:32.535Z" },
+ { url = "https://files.pythonhosted.org/packages/69/69/4ca02ee367d2c98edcaeb83fc278d20972502ee071214ad9d8ca85e06080/fonttools-4.61.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a76d4cb80f41ba94a6691264be76435e5f72f2cb3cab0b092a6212855f71c2f6", size = 4859076, upload-time = "2025-12-12T17:29:34.907Z" },
+ { url = "https://files.pythonhosted.org/packages/8c/f5/660f9e3cefa078861a7f099107c6d203b568a6227eef163dd173bfc56bdc/fonttools-4.61.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a13fc8aeb24bad755eea8f7f9d409438eb94e82cf86b08fe77a03fbc8f6a96b1", size = 4875623, upload-time = "2025-12-12T17:29:37.33Z" },
+ { url = "https://files.pythonhosted.org/packages/63/d1/9d7c5091d2276ed47795c131c1bf9316c3c1ab2789c22e2f59e0572ccd38/fonttools-4.61.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b846a1fcf8beadeb9ea4f44ec5bdde393e2f1569e17d700bfc49cd69bde75881", size = 4993327, upload-time = "2025-12-12T17:29:39.781Z" },
+ { url = "https://files.pythonhosted.org/packages/6f/2d/28def73837885ae32260d07660a052b99f0aa00454867d33745dfe49dbf0/fonttools-4.61.1-cp310-cp310-win32.whl", hash = "sha256:78a7d3ab09dc47ac1a363a493e6112d8cabed7ba7caad5f54dbe2f08676d1b47", size = 1502180, upload-time = "2025-12-12T17:29:42.217Z" },
+ { url = "https://files.pythonhosted.org/packages/63/fa/bfdc98abb4dd2bd491033e85e3ba69a2313c850e759a6daa014bc9433b0f/fonttools-4.61.1-cp310-cp310-win_amd64.whl", hash = "sha256:eff1ac3cc66c2ac7cda1e64b4e2f3ffef474b7335f92fc3833fc632d595fcee6", size = 1550654, upload-time = "2025-12-12T17:29:44.564Z" },
+ { url = "https://files.pythonhosted.org/packages/69/12/bf9f4eaa2fad039356cc627587e30ed008c03f1cebd3034376b5ee8d1d44/fonttools-4.61.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c6604b735bb12fef8e0efd5578c9fb5d3d8532d5001ea13a19cddf295673ee09", size = 2852213, upload-time = "2025-12-12T17:29:46.675Z" },
+ { url = "https://files.pythonhosted.org/packages/ac/49/4138d1acb6261499bedde1c07f8c2605d1d8f9d77a151e5507fd3ef084b6/fonttools-4.61.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5ce02f38a754f207f2f06557523cd39a06438ba3aafc0639c477ac409fc64e37", size = 2401689, upload-time = "2025-12-12T17:29:48.769Z" },
+ { url = "https://files.pythonhosted.org/packages/e5/fe/e6ce0fe20a40e03aef906af60aa87668696f9e4802fa283627d0b5ed777f/fonttools-4.61.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:77efb033d8d7ff233385f30c62c7c79271c8885d5c9657d967ede124671bbdfb", size = 5058809, upload-time = "2025-12-12T17:29:51.701Z" },
+ { url = "https://files.pythonhosted.org/packages/79/61/1ca198af22f7dd22c17ab86e9024ed3c06299cfdb08170640e9996d501a0/fonttools-4.61.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:75c1a6dfac6abd407634420c93864a1e274ebc1c7531346d9254c0d8f6ca00f9", size = 5036039, upload-time = "2025-12-12T17:29:53.659Z" },
+ { url = "https://files.pythonhosted.org/packages/99/cc/fa1801e408586b5fce4da9f5455af8d770f4fc57391cd5da7256bb364d38/fonttools-4.61.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0de30bfe7745c0d1ffa2b0b7048fb7123ad0d71107e10ee090fa0b16b9452e87", size = 5034714, upload-time = "2025-12-12T17:29:55.592Z" },
+ { url = "https://files.pythonhosted.org/packages/bf/aa/b7aeafe65adb1b0a925f8f25725e09f078c635bc22754f3fecb7456955b0/fonttools-4.61.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:58b0ee0ab5b1fc9921eccfe11d1435added19d6494dde14e323f25ad2bc30c56", size = 5158648, upload-time = "2025-12-12T17:29:57.861Z" },
+ { url = "https://files.pythonhosted.org/packages/99/f9/08ea7a38663328881384c6e7777bbefc46fd7d282adfd87a7d2b84ec9d50/fonttools-4.61.1-cp311-cp311-win32.whl", hash = "sha256:f79b168428351d11e10c5aeb61a74e1851ec221081299f4cf56036a95431c43a", size = 2280681, upload-time = "2025-12-12T17:29:59.943Z" },
+ { url = "https://files.pythonhosted.org/packages/07/ad/37dd1ae5fa6e01612a1fbb954f0927681f282925a86e86198ccd7b15d515/fonttools-4.61.1-cp311-cp311-win_amd64.whl", hash = "sha256:fe2efccb324948a11dd09d22136fe2ac8a97d6c1347cf0b58a911dcd529f66b7", size = 2331951, upload-time = "2025-12-12T17:30:02.254Z" },
+ { url = "https://files.pythonhosted.org/packages/6f/16/7decaa24a1bd3a70c607b2e29f0adc6159f36a7e40eaba59846414765fd4/fonttools-4.61.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f3cb4a569029b9f291f88aafc927dd53683757e640081ca8c412781ea144565e", size = 2851593, upload-time = "2025-12-12T17:30:04.225Z" },
+ { url = "https://files.pythonhosted.org/packages/94/98/3c4cb97c64713a8cf499b3245c3bf9a2b8fd16a3e375feff2aed78f96259/fonttools-4.61.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41a7170d042e8c0024703ed13b71893519a1a6d6e18e933e3ec7507a2c26a4b2", size = 2400231, upload-time = "2025-12-12T17:30:06.47Z" },
+ { url = "https://files.pythonhosted.org/packages/b7/37/82dbef0f6342eb01f54bca073ac1498433d6ce71e50c3c3282b655733b31/fonttools-4.61.1-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10d88e55330e092940584774ee5e8a6971b01fc2f4d3466a1d6c158230880796", size = 4954103, upload-time = "2025-12-12T17:30:08.432Z" },
+ { url = "https://files.pythonhosted.org/packages/6c/44/f3aeac0fa98e7ad527f479e161aca6c3a1e47bb6996b053d45226fe37bf2/fonttools-4.61.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:15acc09befd16a0fb8a8f62bc147e1a82817542d72184acca9ce6e0aeda9fa6d", size = 5004295, upload-time = "2025-12-12T17:30:10.56Z" },
+ { url = "https://files.pythonhosted.org/packages/14/e8/7424ced75473983b964d09f6747fa09f054a6d656f60e9ac9324cf40c743/fonttools-4.61.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e6bcdf33aec38d16508ce61fd81838f24c83c90a1d1b8c68982857038673d6b8", size = 4944109, upload-time = "2025-12-12T17:30:12.874Z" },
+ { url = "https://files.pythonhosted.org/packages/c8/8b/6391b257fa3d0b553d73e778f953a2f0154292a7a7a085e2374b111e5410/fonttools-4.61.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5fade934607a523614726119164ff621e8c30e8fa1ffffbbd358662056ba69f0", size = 5093598, upload-time = "2025-12-12T17:30:15.79Z" },
+ { url = "https://files.pythonhosted.org/packages/d9/71/fd2ea96cdc512d92da5678a1c98c267ddd4d8c5130b76d0f7a80f9a9fde8/fonttools-4.61.1-cp312-cp312-win32.whl", hash = "sha256:75da8f28eff26defba42c52986de97b22106cb8f26515b7c22443ebc9c2d3261", size = 2269060, upload-time = "2025-12-12T17:30:18.058Z" },
+ { url = "https://files.pythonhosted.org/packages/80/3b/a3e81b71aed5a688e89dfe0e2694b26b78c7d7f39a5ffd8a7d75f54a12a8/fonttools-4.61.1-cp312-cp312-win_amd64.whl", hash = "sha256:497c31ce314219888c0e2fce5ad9178ca83fe5230b01a5006726cdf3ac9f24d9", size = 2319078, upload-time = "2025-12-12T17:30:22.862Z" },
+ { url = "https://files.pythonhosted.org/packages/c7/4e/ce75a57ff3aebf6fc1f4e9d508b8e5810618a33d900ad6c19eb30b290b97/fonttools-4.61.1-py3-none-any.whl", hash = "sha256:17d2bf5d541add43822bcf0c43d7d847b160c9bb01d15d5007d84e2217aaa371", size = 1148996, upload-time = "2025-12-12T17:31:21.03Z" },
]
[package.optional-dependencies]
@@ -991,7 +1002,7 @@ wheels = [
[[package]]
name = "hatch"
-version = "1.16.1"
+version = "1.16.2"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "backports-zstd" },
@@ -1012,9 +1023,9 @@ dependencies = [
{ name = "uv" },
{ name = "virtualenv" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/4f/03/7fb64d1a85c84843890007b545dd64702ec3ace972df6fc3655badc1f152/hatch-1.16.1.tar.gz", hash = "sha256:87df6a17a0f8dc6f9a8ae459b742cb32ccc844a79634f9072797a2e38af1280f", size = 5215833, upload-time = "2025-11-27T20:06:41.204Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/b9/c1/8598996a6f264d430c530799dc65fb13942fb29092e35505039a5f2fb5dc/hatch-1.16.2.tar.gz", hash = "sha256:f288938da85b4b90e47d94788e19e9976dcd6fd53b48343ea251a2a37256a980", size = 5216569, upload-time = "2025-12-06T19:18:12.596Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/b6/39/42d25fed23c4fd4eb3c4ff3f0a7f547ed0d4ad6a1efb0105da0f43768141/hatch-1.16.1-py3-none-any.whl", hash = "sha256:c7c90d122f8fca602d10c9f2176027f935cc6071710d4aec2d94490f6c5ef697", size = 140600, upload-time = "2025-11-27T20:06:39.547Z" },
+ { url = "https://files.pythonhosted.org/packages/d4/7c/bbed5611b1cd7b0b42b2dadb0721d9ccfa4fa9d03abc05e0f57c85a319c6/hatch-1.16.2-py3-none-any.whl", hash = "sha256:827eaf9813c63119f172b85975c5c27110a2306b07e5304c9d38527b0239052a", size = 140658, upload-time = "2025-12-06T19:18:10.573Z" },
]
[[package]]
@@ -1114,14 +1125,14 @@ wheels = [
[[package]]
name = "importlib-metadata"
-version = "8.7.0"
+version = "8.7.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "zipp" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/76/66/650a33bd90f786193e4de4b3ad86ea60b53c89b669a5c7be931fac31cdb0/importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000", size = 56641, upload-time = "2025-04-27T15:29:01.736Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/f3/49/3b30cad09e7771a4982d9975a8cbf64f00d4a1ececb53297f1d9a7be1b10/importlib_metadata-8.7.1.tar.gz", hash = "sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb", size = 57107, upload-time = "2025-12-21T10:00:19.278Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/20/b0/36bd937216ec521246249be3bf9855081de4c5e06a0c9b4219dbeda50373/importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd", size = 27656, upload-time = "2025-04-27T15:29:00.214Z" },
+ { url = "https://files.pythonhosted.org/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl", hash = "sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151", size = 27865, upload-time = "2025-12-21T10:00:18.329Z" },
]
[[package]]
@@ -1139,8 +1150,8 @@ version = "0.13.13"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "decorator" },
- { name = "ipython", version = "8.37.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" },
- { name = "ipython", version = "9.7.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" },
+ { name = "ipython", version = "8.38.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" },
+ { name = "ipython", version = "9.9.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" },
{ name = "tomli", marker = "python_full_version < '3.11'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/3d/1b/7e07e7b752017f7693a0f4d41c13e5ca29ce8cbcfdcc1fd6c4ad8c0a27a0/ipdb-0.13.13.tar.gz", hash = "sha256:e3ac6018ef05126d442af680aad863006ec19d02290561ac88b8b1c0b0cfc726", size = 17042, upload-time = "2023-03-09T15:40:57.487Z" }
@@ -1150,7 +1161,7 @@ wheels = [
[[package]]
name = "ipython"
-version = "8.37.0"
+version = "8.38.0"
source = { registry = "https://pypi.org/simple" }
resolution-markers = [
"python_full_version < '3.11'",
@@ -1168,14 +1179,14 @@ dependencies = [
{ name = "traitlets", marker = "python_full_version < '3.11'" },
{ name = "typing-extensions", marker = "python_full_version < '3.11'" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/85/31/10ac88f3357fc276dc8a64e8880c82e80e7459326ae1d0a211b40abf6665/ipython-8.37.0.tar.gz", hash = "sha256:ca815841e1a41a1e6b73a0b08f3038af9b2252564d01fc405356d34033012216", size = 5606088, upload-time = "2025-05-31T16:39:09.613Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/e5/61/1810830e8b93c72dcd3c0f150c80a00c3deb229562d9423807ec92c3a539/ipython-8.38.0.tar.gz", hash = "sha256:9cfea8c903ce0867cc2f23199ed8545eb741f3a69420bfcf3743ad1cec856d39", size = 5513996, upload-time = "2026-01-05T10:59:06.901Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/91/d0/274fbf7b0b12643cbbc001ce13e6a5b1607ac4929d1b11c72460152c9fc3/ipython-8.37.0-py3-none-any.whl", hash = "sha256:ed87326596b878932dbcb171e3e698845434d8c61b8d8cd474bf663041a9dcf2", size = 831864, upload-time = "2025-05-31T16:39:06.38Z" },
+ { url = "https://files.pythonhosted.org/packages/9f/df/db59624f4c71b39717c423409950ac3f2c8b2ce4b0aac843112c7fb3f721/ipython-8.38.0-py3-none-any.whl", hash = "sha256:750162629d800ac65bb3b543a14e7a74b0e88063eac9b92124d4b2aa3f6d8e86", size = 831813, upload-time = "2026-01-05T10:59:04.239Z" },
]
[[package]]
name = "ipython"
-version = "9.7.0"
+version = "9.9.0"
source = { registry = "https://pypi.org/simple" }
resolution-markers = [
"python_full_version >= '3.12'",
@@ -1194,9 +1205,9 @@ dependencies = [
{ name = "traitlets", marker = "python_full_version >= '3.11'" },
{ name = "typing-extensions", marker = "python_full_version == '3.11.*'" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/29/e6/48c74d54039241a456add616464ea28c6ebf782e4110d419411b83dae06f/ipython-9.7.0.tar.gz", hash = "sha256:5f6de88c905a566c6a9d6c400a8fed54a638e1f7543d17aae2551133216b1e4e", size = 4422115, upload-time = "2025-11-05T12:18:54.646Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/46/dd/fb08d22ec0c27e73c8bc8f71810709870d51cadaf27b7ddd3f011236c100/ipython-9.9.0.tar.gz", hash = "sha256:48fbed1b2de5e2c7177eefa144aba7fcb82dac514f09b57e2ac9da34ddb54220", size = 4425043, upload-time = "2026-01-05T12:36:46.233Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/05/aa/62893d6a591d337aa59dcc4c6f6c842f1fe20cd72c8c5c1f980255243252/ipython-9.7.0-py3-none-any.whl", hash = "sha256:bce8ac85eb9521adc94e1845b4c03d88365fd6ac2f4908ec4ed1eb1b0a065f9f", size = 618911, upload-time = "2025-11-05T12:18:52.484Z" },
+ { url = "https://files.pythonhosted.org/packages/86/92/162cfaee4ccf370465c5af1ce36a9eacec1becb552f2033bb3584e6f640a/ipython-9.9.0-py3-none-any.whl", hash = "sha256:b457fe9165df2b84e8ec909a97abcf2ed88f565970efba16b1f7229c283d252b", size = 621431, upload-time = "2026-01-05T12:36:44.669Z" },
]
[[package]]
@@ -1234,26 +1245,26 @@ wheels = [
[[package]]
name = "jaraco-context"
-version = "6.0.1"
+version = "6.0.2"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "backports-tarfile", marker = "python_full_version < '3.12'" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/df/ad/f3777b81bf0b6e7bc7514a1656d3e637b2e8e15fab2ce3235730b3e7a4e6/jaraco_context-6.0.1.tar.gz", hash = "sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3", size = 13912, upload-time = "2024-08-20T03:39:27.358Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/8d/7d/41acf8e22d791bde812cb6c2c36128bb932ed8ae066bcb5e39cb198e8253/jaraco_context-6.0.2.tar.gz", hash = "sha256:953ae8dddb57b1d791bf72ea1009b32088840a7dd19b9ba16443f62be919ee57", size = 14994, upload-time = "2025-12-24T19:21:35.784Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/ff/db/0c52c4cf5e4bd9f5d7135ec7669a3a767af21b3a308e1ed3674881e52b62/jaraco.context-6.0.1-py3-none-any.whl", hash = "sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4", size = 6825, upload-time = "2024-08-20T03:39:25.966Z" },
+ { url = "https://files.pythonhosted.org/packages/c7/0c/1e0096ced9c55f9c6c6655446798df74165780375d3f5ab5f33751e087ae/jaraco_context-6.0.2-py3-none-any.whl", hash = "sha256:55fc21af4b4f9ca94aa643b6ee7fe13b1e4c01abf3aeb98ca4ad9c80b741c786", size = 6988, upload-time = "2025-12-24T19:21:34.557Z" },
]
[[package]]
name = "jaraco-functools"
-version = "4.3.0"
+version = "4.4.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "more-itertools" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/f7/ed/1aa2d585304ec07262e1a83a9889880701079dde796ac7b1d1826f40c63d/jaraco_functools-4.3.0.tar.gz", hash = "sha256:cfd13ad0dd2c47a3600b439ef72d8615d482cedcff1632930d6f28924d92f294", size = 19755, upload-time = "2025-08-18T20:05:09.91Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/0f/27/056e0638a86749374d6f57d0b0db39f29509cce9313cf91bdc0ac4d91084/jaraco_functools-4.4.0.tar.gz", hash = "sha256:da21933b0417b89515562656547a77b4931f98176eb173644c0d35032a33d6bb", size = 19943, upload-time = "2025-12-21T09:29:43.6Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/b4/09/726f168acad366b11e420df31bf1c702a54d373a83f968d94141a8c3fde0/jaraco_functools-4.3.0-py3-none-any.whl", hash = "sha256:227ff8ed6f7b8f62c56deff101545fa7543cf2c8e7b82a7c2116e672f29c26e8", size = 10408, upload-time = "2025-08-18T20:05:08.69Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/c4/813bb09f0985cb21e959f21f2464169eca882656849adf727ac7bb7e1767/jaraco_functools-4.4.0-py3-none-any.whl", hash = "sha256:9eec1e36f45c818d9bf307c8948eb03b2b56cd44087b3cdc989abca1f20b9176", size = 10481, upload-time = "2025-12-21T09:29:42.27Z" },
]
[[package]]
@@ -1498,7 +1509,7 @@ wheels = [
[[package]]
name = "matplotlib"
-version = "3.10.7"
+version = "3.10.8"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "contourpy", version = "1.3.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" },
@@ -1512,34 +1523,34 @@ dependencies = [
{ name = "pyparsing" },
{ name = "python-dateutil" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/ae/e2/d2d5295be2f44c678ebaf3544ba32d20c1f9ef08c49fe47f496180e1db15/matplotlib-3.10.7.tar.gz", hash = "sha256:a06ba7e2a2ef9131c79c49e63dad355d2d878413a0376c1727c8b9335ff731c7", size = 34804865, upload-time = "2025-10-09T00:28:00.669Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/6c/87/3932d5778ab4c025db22710b61f49ccaed3956c5cf46ffb2ffa7492b06d9/matplotlib-3.10.7-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:7ac81eee3b7c266dd92cee1cd658407b16c57eed08c7421fa354ed68234de380", size = 8247141, upload-time = "2025-10-09T00:26:06.023Z" },
- { url = "https://files.pythonhosted.org/packages/45/a8/bfed45339160102bce21a44e38a358a1134a5f84c26166de03fb4a53208f/matplotlib-3.10.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:667ecd5d8d37813a845053d8f5bf110b534c3c9f30e69ebd25d4701385935a6d", size = 8107995, upload-time = "2025-10-09T00:26:08.669Z" },
- { url = "https://files.pythonhosted.org/packages/e2/3c/5692a2d9a5ba848fda3f48d2b607037df96460b941a59ef236404b39776b/matplotlib-3.10.7-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc1c51b846aca49a5a8b44fbba6a92d583a35c64590ad9e1e950dc88940a4297", size = 8680503, upload-time = "2025-10-09T00:26:10.607Z" },
- { url = "https://files.pythonhosted.org/packages/ab/a0/86ace53c48b05d0e6e9c127b2ace097434901f3e7b93f050791c8243201a/matplotlib-3.10.7-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a11c2e9e72e7de09b7b72e62f3df23317c888299c875e2b778abf1eda8c0a42", size = 9514982, upload-time = "2025-10-09T00:26:12.594Z" },
- { url = "https://files.pythonhosted.org/packages/a6/81/ead71e2824da8f72640a64166d10e62300df4ae4db01a0bac56c5b39fa51/matplotlib-3.10.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f19410b486fdd139885ace124e57f938c1e6a3210ea13dd29cab58f5d4bc12c7", size = 9566429, upload-time = "2025-10-09T00:26:14.758Z" },
- { url = "https://files.pythonhosted.org/packages/65/7d/954b3067120456f472cce8fdcacaf4a5fcd522478db0c37bb243c7cb59dd/matplotlib-3.10.7-cp310-cp310-win_amd64.whl", hash = "sha256:b498e9e4022f93de2d5a37615200ca01297ceebbb56fe4c833f46862a490f9e3", size = 8108174, upload-time = "2025-10-09T00:26:17.015Z" },
- { url = "https://files.pythonhosted.org/packages/fc/bc/0fb489005669127ec13f51be0c6adc074d7cf191075dab1da9fe3b7a3cfc/matplotlib-3.10.7-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:53b492410a6cd66c7a471de6c924f6ede976e963c0f3097a3b7abfadddc67d0a", size = 8257507, upload-time = "2025-10-09T00:26:19.073Z" },
- { url = "https://files.pythonhosted.org/packages/e2/6a/d42588ad895279ff6708924645b5d2ed54a7fb2dc045c8a804e955aeace1/matplotlib-3.10.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d9749313deb729f08207718d29c86246beb2ea3fdba753595b55901dee5d2fd6", size = 8119565, upload-time = "2025-10-09T00:26:21.023Z" },
- { url = "https://files.pythonhosted.org/packages/10/b7/4aa196155b4d846bd749cf82aa5a4c300cf55a8b5e0dfa5b722a63c0f8a0/matplotlib-3.10.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2222c7ba2cbde7fe63032769f6eb7e83ab3227f47d997a8453377709b7fe3a5a", size = 8692668, upload-time = "2025-10-09T00:26:22.967Z" },
- { url = "https://files.pythonhosted.org/packages/e6/e7/664d2b97016f46683a02d854d730cfcf54ff92c1dafa424beebef50f831d/matplotlib-3.10.7-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e91f61a064c92c307c5a9dc8c05dc9f8a68f0a3be199d9a002a0622e13f874a1", size = 9521051, upload-time = "2025-10-09T00:26:25.041Z" },
- { url = "https://files.pythonhosted.org/packages/a8/a3/37aef1404efa615f49b5758a5e0261c16dd88f389bc1861e722620e4a754/matplotlib-3.10.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6f1851eab59ca082c95df5a500106bad73672645625e04538b3ad0f69471ffcc", size = 9576878, upload-time = "2025-10-09T00:26:27.478Z" },
- { url = "https://files.pythonhosted.org/packages/33/cd/b145f9797126f3f809d177ca378de57c45413c5099c5990de2658760594a/matplotlib-3.10.7-cp311-cp311-win_amd64.whl", hash = "sha256:6516ce375109c60ceec579e699524e9d504cd7578506f01150f7a6bc174a775e", size = 8115142, upload-time = "2025-10-09T00:26:29.774Z" },
- { url = "https://files.pythonhosted.org/packages/2e/39/63bca9d2b78455ed497fcf51a9c71df200a11048f48249038f06447fa947/matplotlib-3.10.7-cp311-cp311-win_arm64.whl", hash = "sha256:b172db79759f5f9bc13ef1c3ef8b9ee7b37b0247f987fbbbdaa15e4f87fd46a9", size = 7992439, upload-time = "2025-10-09T00:26:40.32Z" },
- { url = "https://files.pythonhosted.org/packages/be/b3/09eb0f7796932826ec20c25b517d568627754f6c6462fca19e12c02f2e12/matplotlib-3.10.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7a0edb7209e21840e8361e91ea84ea676658aa93edd5f8762793dec77a4a6748", size = 8272389, upload-time = "2025-10-09T00:26:42.474Z" },
- { url = "https://files.pythonhosted.org/packages/11/0b/1ae80ddafb8652fd8046cb5c8460ecc8d4afccb89e2c6d6bec61e04e1eaf/matplotlib-3.10.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c380371d3c23e0eadf8ebff114445b9f970aff2010198d498d4ab4c3b41eea4f", size = 8128247, upload-time = "2025-10-09T00:26:44.77Z" },
- { url = "https://files.pythonhosted.org/packages/7d/18/95ae2e242d4a5c98bd6e90e36e128d71cf1c7e39b0874feaed3ef782e789/matplotlib-3.10.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d5f256d49fea31f40f166a5e3131235a5d2f4b7f44520b1cf0baf1ce568ccff0", size = 8696996, upload-time = "2025-10-09T00:26:46.792Z" },
- { url = "https://files.pythonhosted.org/packages/7e/3d/5b559efc800bd05cb2033aa85f7e13af51958136a48327f7c261801ff90a/matplotlib-3.10.7-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11ae579ac83cdf3fb72573bb89f70e0534de05266728740d478f0f818983c695", size = 9530153, upload-time = "2025-10-09T00:26:49.07Z" },
- { url = "https://files.pythonhosted.org/packages/88/57/eab4a719fd110312d3c220595d63a3c85ec2a39723f0f4e7fa7e6e3f74ba/matplotlib-3.10.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4c14b6acd16cddc3569a2d515cfdd81c7a68ac5639b76548cfc1a9e48b20eb65", size = 9593093, upload-time = "2025-10-09T00:26:51.067Z" },
- { url = "https://files.pythonhosted.org/packages/31/3c/80816f027b3a4a28cd2a0a6ef7f89a2db22310e945cd886ec25bfb399221/matplotlib-3.10.7-cp312-cp312-win_amd64.whl", hash = "sha256:0d8c32b7ea6fb80b1aeff5a2ceb3fb9778e2759e899d9beff75584714afcc5ee", size = 8122771, upload-time = "2025-10-09T00:26:53.296Z" },
- { url = "https://files.pythonhosted.org/packages/de/77/ef1fc78bfe99999b2675435cc52120887191c566b25017d78beaabef7f2d/matplotlib-3.10.7-cp312-cp312-win_arm64.whl", hash = "sha256:5f3f6d315dcc176ba7ca6e74c7768fb7e4cf566c49cb143f6bc257b62e634ed8", size = 7992812, upload-time = "2025-10-09T00:26:54.882Z" },
- { url = "https://files.pythonhosted.org/packages/1e/6c/a9bcf03e9afb2a873e0a5855f79bce476d1023f26f8212969f2b7504756c/matplotlib-3.10.7-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5c09cf8f2793f81368f49f118b6f9f937456362bee282eac575cca7f84cda537", size = 8241204, upload-time = "2025-10-09T00:27:48.806Z" },
- { url = "https://files.pythonhosted.org/packages/5b/fd/0e6f5aa762ed689d9fa8750b08f1932628ffa7ed30e76423c399d19407d2/matplotlib-3.10.7-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:de66744b2bb88d5cd27e80dfc2ec9f0517d0a46d204ff98fe9e5f2864eb67657", size = 8104607, upload-time = "2025-10-09T00:27:50.876Z" },
- { url = "https://files.pythonhosted.org/packages/b9/a9/21c9439d698fac5f0de8fc68b2405b738ed1f00e1279c76f2d9aa5521ead/matplotlib-3.10.7-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:53cc80662dd197ece414dd5b66e07370201515a3eaf52e7c518c68c16814773b", size = 8682257, upload-time = "2025-10-09T00:27:52.597Z" },
- { url = "https://files.pythonhosted.org/packages/58/8f/76d5dc21ac64a49e5498d7f0472c0781dae442dd266a67458baec38288ec/matplotlib-3.10.7-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:15112bcbaef211bd663fa935ec33313b948e214454d949b723998a43357b17b0", size = 8252283, upload-time = "2025-10-09T00:27:54.739Z" },
- { url = "https://files.pythonhosted.org/packages/27/0d/9c5d4c2317feb31d819e38c9f947c942f42ebd4eb935fc6fd3518a11eaa7/matplotlib-3.10.7-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d2a959c640cdeecdd2ec3136e8ea0441da59bcaf58d67e9c590740addba2cb68", size = 8116733, upload-time = "2025-10-09T00:27:56.406Z" },
- { url = "https://files.pythonhosted.org/packages/9a/cc/3fe688ff1355010937713164caacf9ed443675ac48a997bab6ed23b3f7c0/matplotlib-3.10.7-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3886e47f64611046bc1db523a09dd0a0a6bed6081e6f90e13806dd1d1d1b5e91", size = 8693919, upload-time = "2025-10-09T00:27:58.41Z" },
+sdist = { url = "https://files.pythonhosted.org/packages/8a/76/d3c6e3a13fe484ebe7718d14e269c9569c4eb0020a968a327acb3b9a8fe6/matplotlib-3.10.8.tar.gz", hash = "sha256:2299372c19d56bcd35cf05a2738308758d32b9eaed2371898d8f5bd33f084aa3", size = 34806269, upload-time = "2025-12-10T22:56:51.155Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/58/be/a30bd917018ad220c400169fba298f2bb7003c8ccbc0c3e24ae2aacad1e8/matplotlib-3.10.8-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:00270d217d6b20d14b584c521f810d60c5c78406dc289859776550df837dcda7", size = 8239828, upload-time = "2025-12-10T22:55:02.313Z" },
+ { url = "https://files.pythonhosted.org/packages/58/27/ca01e043c4841078e82cf6e80a6993dfecd315c3d79f5f3153afbb8e1ec6/matplotlib-3.10.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37b3c1cc42aa184b3f738cfa18c1c1d72fd496d85467a6cf7b807936d39aa656", size = 8128050, upload-time = "2025-12-10T22:55:04.997Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/aa/7ab67f2b729ae6a91bcf9dcac0affb95fb8c56f7fd2b2af894ae0b0cf6fa/matplotlib-3.10.8-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ee40c27c795bda6a5292e9cff9890189d32f7e3a0bf04e0e3c9430c4a00c37df", size = 8700452, upload-time = "2025-12-10T22:55:07.47Z" },
+ { url = "https://files.pythonhosted.org/packages/73/ae/2d5817b0acee3c49b7e7ccfbf5b273f284957cc8e270adf36375db353190/matplotlib-3.10.8-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a48f2b74020919552ea25d222d5cc6af9ca3f4eb43a93e14d068457f545c2a17", size = 9534928, upload-time = "2025-12-10T22:55:10.566Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/5b/8e66653e9f7c39cb2e5cab25fce4810daffa2bff02cbf5f3077cea9e942c/matplotlib-3.10.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f254d118d14a7f99d616271d6c3c27922c092dac11112670b157798b89bf4933", size = 9586377, upload-time = "2025-12-10T22:55:12.362Z" },
+ { url = "https://files.pythonhosted.org/packages/e2/e2/fd0bbadf837f81edb0d208ba8f8cb552874c3b16e27cb91a31977d90875d/matplotlib-3.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:f9b587c9c7274c1613a30afabf65a272114cd6cdbe67b3406f818c79d7ab2e2a", size = 8128127, upload-time = "2025-12-10T22:55:14.436Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/86/de7e3a1cdcfc941483af70609edc06b83e7c8a0e0dc9ac325200a3f4d220/matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6be43b667360fef5c754dda5d25a32e6307a03c204f3c0fc5468b78fa87b4160", size = 8251215, upload-time = "2025-12-10T22:55:16.175Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/14/baad3222f424b19ce6ad243c71de1ad9ec6b2e4eb1e458a48fdc6d120401/matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a2b336e2d91a3d7006864e0990c83b216fcdca64b5a6484912902cef87313d78", size = 8139625, upload-time = "2025-12-10T22:55:17.712Z" },
+ { url = "https://files.pythonhosted.org/packages/8f/a0/7024215e95d456de5883e6732e708d8187d9753a21d32f8ddb3befc0c445/matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:efb30e3baaea72ce5928e32bab719ab4770099079d66726a62b11b1ef7273be4", size = 8712614, upload-time = "2025-12-10T22:55:20.8Z" },
+ { url = "https://files.pythonhosted.org/packages/5a/f4/b8347351da9a5b3f41e26cf547252d861f685c6867d179a7c9d60ad50189/matplotlib-3.10.8-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d56a1efd5bfd61486c8bc968fa18734464556f0fb8e51690f4ac25d85cbbbbc2", size = 9540997, upload-time = "2025-12-10T22:55:23.258Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/c0/c7b914e297efe0bc36917bf216b2acb91044b91e930e878ae12981e461e5/matplotlib-3.10.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:238b7ce5717600615c895050239ec955d91f321c209dd110db988500558e70d6", size = 9596825, upload-time = "2025-12-10T22:55:25.217Z" },
+ { url = "https://files.pythonhosted.org/packages/6f/d3/a4bbc01c237ab710a1f22b4da72f4ff6d77eb4c7735ea9811a94ae239067/matplotlib-3.10.8-cp311-cp311-win_amd64.whl", hash = "sha256:18821ace09c763ec93aef5eeff087ee493a24051936d7b9ebcad9662f66501f9", size = 8135090, upload-time = "2025-12-10T22:55:27.162Z" },
+ { url = "https://files.pythonhosted.org/packages/89/dd/a0b6588f102beab33ca6f5218b31725216577b2a24172f327eaf6417d5c9/matplotlib-3.10.8-cp311-cp311-win_arm64.whl", hash = "sha256:bab485bcf8b1c7d2060b4fcb6fc368a9e6f4cd754c9c2fea281f4be21df394a2", size = 8012377, upload-time = "2025-12-10T22:55:29.185Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/67/f997cdcbb514012eb0d10cd2b4b332667997fb5ebe26b8d41d04962fa0e6/matplotlib-3.10.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:64fcc24778ca0404ce0cb7b6b77ae1f4c7231cdd60e6778f999ee05cbd581b9a", size = 8260453, upload-time = "2025-12-10T22:55:30.709Z" },
+ { url = "https://files.pythonhosted.org/packages/7e/65/07d5f5c7f7c994f12c768708bd2e17a4f01a2b0f44a1c9eccad872433e2e/matplotlib-3.10.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b9a5ca4ac220a0cdd1ba6bcba3608547117d30468fefce49bb26f55c1a3d5c58", size = 8148321, upload-time = "2025-12-10T22:55:33.265Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/f3/c5195b1ae57ef85339fd7285dfb603b22c8b4e79114bae5f4f0fcf688677/matplotlib-3.10.8-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3ab4aabc72de4ff77b3ec33a6d78a68227bf1123465887f9905ba79184a1cc04", size = 8716944, upload-time = "2025-12-10T22:55:34.922Z" },
+ { url = "https://files.pythonhosted.org/packages/00/f9/7638f5cc82ec8a7aa005de48622eecc3ed7c9854b96ba15bd76b7fd27574/matplotlib-3.10.8-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:24d50994d8c5816ddc35411e50a86ab05f575e2530c02752e02538122613371f", size = 9550099, upload-time = "2025-12-10T22:55:36.789Z" },
+ { url = "https://files.pythonhosted.org/packages/57/61/78cd5920d35b29fd2a0fe894de8adf672ff52939d2e9b43cb83cd5ce1bc7/matplotlib-3.10.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:99eefd13c0dc3b3c1b4d561c1169e65fe47aab7b8158754d7c084088e2329466", size = 9613040, upload-time = "2025-12-10T22:55:38.715Z" },
+ { url = "https://files.pythonhosted.org/packages/30/4e/c10f171b6e2f44d9e3a2b96efa38b1677439d79c99357600a62cc1e9594e/matplotlib-3.10.8-cp312-cp312-win_amd64.whl", hash = "sha256:dd80ecb295460a5d9d260df63c43f4afbdd832d725a531f008dad1664f458adf", size = 8142717, upload-time = "2025-12-10T22:55:41.103Z" },
+ { url = "https://files.pythonhosted.org/packages/f1/76/934db220026b5fef85f45d51a738b91dea7d70207581063cd9bd8fafcf74/matplotlib-3.10.8-cp312-cp312-win_arm64.whl", hash = "sha256:3c624e43ed56313651bc18a47f838b60d7b8032ed348911c54906b130b20071b", size = 8012751, upload-time = "2025-12-10T22:55:42.684Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/43/31d59500bb950b0d188e149a2e552040528c13d6e3d6e84d0cccac593dcd/matplotlib-3.10.8-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f97aeb209c3d2511443f8797e3e5a569aebb040d4f8bc79aa3ee78a8fb9e3dd8", size = 8237252, upload-time = "2025-12-10T22:56:39.529Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/2c/615c09984f3c5f907f51c886538ad785cf72e0e11a3225de2c0f9442aecc/matplotlib-3.10.8-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fb061f596dad3a0f52b60dc6a5dec4a0c300dec41e058a7efe09256188d170b7", size = 8124693, upload-time = "2025-12-10T22:56:41.758Z" },
+ { url = "https://files.pythonhosted.org/packages/91/e1/2757277a1c56041e1fc104b51a0f7b9a4afc8eb737865d63cababe30bc61/matplotlib-3.10.8-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:12d90df9183093fcd479f4172ac26b322b1248b15729cb57f42f71f24c7e37a3", size = 8702205, upload-time = "2025-12-10T22:56:43.415Z" },
+ { url = "https://files.pythonhosted.org/packages/04/30/3afaa31c757f34b7725ab9d2ba8b48b5e89c2019c003e7d0ead143aabc5a/matplotlib-3.10.8-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6da7c2ce169267d0d066adcf63758f0604aa6c3eebf67458930f9d9b79ad1db1", size = 8249198, upload-time = "2025-12-10T22:56:45.584Z" },
+ { url = "https://files.pythonhosted.org/packages/48/2f/6334aec331f57485a642a7c8be03cb286f29111ae71c46c38b363230063c/matplotlib-3.10.8-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9153c3292705be9f9c64498a8872118540c3f4123d1a1c840172edf262c8be4a", size = 8136817, upload-time = "2025-12-10T22:56:47.339Z" },
+ { url = "https://files.pythonhosted.org/packages/73/e4/6d6f14b2a759c622f191b2d67e9075a3f56aaccb3be4bb9bb6890030d0a0/matplotlib-3.10.8-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ae029229a57cd1e8fe542485f27e7ca7b23aa9e8944ddb4985d0bc444f1eca2", size = 8713867, upload-time = "2025-12-10T22:56:48.954Z" },
]
[[package]]
@@ -1606,11 +1617,11 @@ wheels = [
[[package]]
name = "nodeenv"
-version = "1.9.1"
+version = "1.10.0"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437, upload-time = "2024-06-04T18:44:11.171Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/24/bf/d1bda4f6168e0b2e9e5958945e01910052158313224ada5ce1fb2e1113b8/nodeenv-1.10.0.tar.gz", hash = "sha256:996c191ad80897d076bdfba80a41994c2b47c68e224c542b48feba42ba00f8bb", size = 55611, upload-time = "2025-12-20T14:08:54.006Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314, upload-time = "2024-06-04T18:44:08.352Z" },
+ { url = "https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl", hash = "sha256:5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827", size = 23438, upload-time = "2025-12-20T14:08:52.782Z" },
]
[[package]]
@@ -1651,7 +1662,8 @@ version = "1.10.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" },
- { name = "sphinx", version = "9.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" },
+ { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" },
+ { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" },
{ name = "tomli", marker = "python_full_version < '3.11'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/e9/3c/dfccc9e7dee357fb2aa13c3890d952a370dd0ed071e0f7ed62ed0df567c1/numpydoc-1.10.0.tar.gz", hash = "sha256:3f7970f6eee30912260a6b31ac72bba2432830cd6722569ec17ee8d3ef5ffa01", size = 94027, upload-time = "2025-12-02T16:39:12.937Z" }
@@ -1714,11 +1726,11 @@ wheels = [
[[package]]
name = "pathspec"
-version = "0.12.1"
+version = "1.0.1"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043, upload-time = "2023-12-10T22:30:45Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/28/2e/83722ece0f6ee24387d6cb830dd562ddbcd6ce0b9d76072c6849670c31b4/pathspec-1.0.1.tar.gz", hash = "sha256:e2769b508d0dd47b09af6ee2c75b2744a2cb1f474ae4b1494fd6a1b7a841613c", size = 129791, upload-time = "2026-01-06T13:02:55.15Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload-time = "2023-12-10T22:30:43.14Z" },
+ { url = "https://files.pythonhosted.org/packages/d2/fe/2257c71721aeab6a6e8aa1f00d01f2a20f58547d249a6c8fef5791f559fc/pathspec-1.0.1-py3-none-any.whl", hash = "sha256:8870061f22c58e6d83463cfce9a7dd6eca0512c772c1001fb09ac64091816721", size = 54584, upload-time = "2026-01-06T13:02:53.601Z" },
]
[[package]]
@@ -1759,50 +1771,50 @@ wheels = [
[[package]]
name = "pillow"
-version = "12.0.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/cace85a1b0c9775a9f8f5d5423c8261c858760e2466c79b2dd184638b056/pillow-12.0.0.tar.gz", hash = "sha256:87d4f8125c9988bfbed67af47dd7a953e2fc7b0cc1e7800ec6d2080d490bb353", size = 47008828, upload-time = "2025-10-15T18:24:14.008Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/5d/08/26e68b6b5da219c2a2cb7b563af008b53bb8e6b6fcb3fa40715fcdb2523a/pillow-12.0.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:3adfb466bbc544b926d50fe8f4a4e6abd8c6bffd28a26177594e6e9b2b76572b", size = 5289809, upload-time = "2025-10-15T18:21:27.791Z" },
- { url = "https://files.pythonhosted.org/packages/cb/e9/4e58fb097fb74c7b4758a680aacd558810a417d1edaa7000142976ef9d2f/pillow-12.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1ac11e8ea4f611c3c0147424eae514028b5e9077dd99ab91e1bd7bc33ff145e1", size = 4650606, upload-time = "2025-10-15T18:21:29.823Z" },
- { url = "https://files.pythonhosted.org/packages/4b/e0/1fa492aa9f77b3bc6d471c468e62bfea1823056bf7e5e4f1914d7ab2565e/pillow-12.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d49e2314c373f4c2b39446fb1a45ed333c850e09d0c59ac79b72eb3b95397363", size = 6221023, upload-time = "2025-10-15T18:21:31.415Z" },
- { url = "https://files.pythonhosted.org/packages/c1/09/4de7cd03e33734ccd0c876f0251401f1314e819cbfd89a0fcb6e77927cc6/pillow-12.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c7b2a63fd6d5246349f3d3f37b14430d73ee7e8173154461785e43036ffa96ca", size = 8024937, upload-time = "2025-10-15T18:21:33.453Z" },
- { url = "https://files.pythonhosted.org/packages/2e/69/0688e7c1390666592876d9d474f5e135abb4acb39dcb583c4dc5490f1aff/pillow-12.0.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d64317d2587c70324b79861babb9c09f71fbb780bad212018874b2c013d8600e", size = 6334139, upload-time = "2025-10-15T18:21:35.395Z" },
- { url = "https://files.pythonhosted.org/packages/ed/1c/880921e98f525b9b44ce747ad1ea8f73fd7e992bafe3ca5e5644bf433dea/pillow-12.0.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d77153e14b709fd8b8af6f66a3afbb9ed6e9fc5ccf0b6b7e1ced7b036a228782", size = 7026074, upload-time = "2025-10-15T18:21:37.219Z" },
- { url = "https://files.pythonhosted.org/packages/28/03/96f718331b19b355610ef4ebdbbde3557c726513030665071fd025745671/pillow-12.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:32ed80ea8a90ee3e6fa08c21e2e091bba6eda8eccc83dbc34c95169507a91f10", size = 6448852, upload-time = "2025-10-15T18:21:39.168Z" },
- { url = "https://files.pythonhosted.org/packages/3a/a0/6a193b3f0cc9437b122978d2c5cbce59510ccf9a5b48825096ed7472da2f/pillow-12.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c828a1ae702fc712978bda0320ba1b9893d99be0badf2647f693cc01cf0f04fa", size = 7117058, upload-time = "2025-10-15T18:21:40.997Z" },
- { url = "https://files.pythonhosted.org/packages/a7/c4/043192375eaa4463254e8e61f0e2ec9a846b983929a8d0a7122e0a6d6fff/pillow-12.0.0-cp310-cp310-win32.whl", hash = "sha256:bd87e140e45399c818fac4247880b9ce719e4783d767e030a883a970be632275", size = 6295431, upload-time = "2025-10-15T18:21:42.518Z" },
- { url = "https://files.pythonhosted.org/packages/92/c6/c2f2fc7e56301c21827e689bb8b0b465f1b52878b57471a070678c0c33cd/pillow-12.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:455247ac8a4cfb7b9bc45b7e432d10421aea9fc2e74d285ba4072688a74c2e9d", size = 7000412, upload-time = "2025-10-15T18:21:44.404Z" },
- { url = "https://files.pythonhosted.org/packages/b2/d2/5f675067ba82da7a1c238a73b32e3fd78d67f9d9f80fbadd33a40b9c0481/pillow-12.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:6ace95230bfb7cd79ef66caa064bbe2f2a1e63d93471c3a2e1f1348d9f22d6b7", size = 2435903, upload-time = "2025-10-15T18:21:46.29Z" },
- { url = "https://files.pythonhosted.org/packages/0e/5a/a2f6773b64edb921a756eb0729068acad9fc5208a53f4a349396e9436721/pillow-12.0.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0fd00cac9c03256c8b2ff58f162ebcd2587ad3e1f2e397eab718c47e24d231cc", size = 5289798, upload-time = "2025-10-15T18:21:47.763Z" },
- { url = "https://files.pythonhosted.org/packages/2e/05/069b1f8a2e4b5a37493da6c5868531c3f77b85e716ad7a590ef87d58730d/pillow-12.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3475b96f5908b3b16c47533daaa87380c491357d197564e0ba34ae75c0f3257", size = 4650589, upload-time = "2025-10-15T18:21:49.515Z" },
- { url = "https://files.pythonhosted.org/packages/61/e3/2c820d6e9a36432503ead175ae294f96861b07600a7156154a086ba7111a/pillow-12.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:110486b79f2d112cf6add83b28b627e369219388f64ef2f960fef9ebaf54c642", size = 6230472, upload-time = "2025-10-15T18:21:51.052Z" },
- { url = "https://files.pythonhosted.org/packages/4f/89/63427f51c64209c5e23d4d52071c8d0f21024d3a8a487737caaf614a5795/pillow-12.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5269cc1caeedb67e6f7269a42014f381f45e2e7cd42d834ede3c703a1d915fe3", size = 8033887, upload-time = "2025-10-15T18:21:52.604Z" },
- { url = "https://files.pythonhosted.org/packages/f6/1b/c9711318d4901093c15840f268ad649459cd81984c9ec9887756cca049a5/pillow-12.0.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa5129de4e174daccbc59d0a3b6d20eaf24417d59851c07ebb37aeb02947987c", size = 6343964, upload-time = "2025-10-15T18:21:54.619Z" },
- { url = "https://files.pythonhosted.org/packages/41/1e/db9470f2d030b4995083044cd8738cdd1bf773106819f6d8ba12597d5352/pillow-12.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bee2a6db3a7242ea309aa7ee8e2780726fed67ff4e5b40169f2c940e7eb09227", size = 7034756, upload-time = "2025-10-15T18:21:56.151Z" },
- { url = "https://files.pythonhosted.org/packages/cc/b0/6177a8bdd5ee4ed87cba2de5a3cc1db55ffbbec6176784ce5bb75aa96798/pillow-12.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:90387104ee8400a7b4598253b4c406f8958f59fcf983a6cea2b50d59f7d63d0b", size = 6458075, upload-time = "2025-10-15T18:21:57.759Z" },
- { url = "https://files.pythonhosted.org/packages/bc/5e/61537aa6fa977922c6a03253a0e727e6e4a72381a80d63ad8eec350684f2/pillow-12.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bc91a56697869546d1b8f0a3ff35224557ae7f881050e99f615e0119bf934b4e", size = 7125955, upload-time = "2025-10-15T18:21:59.372Z" },
- { url = "https://files.pythonhosted.org/packages/1f/3d/d5033539344ee3cbd9a4d69e12e63ca3a44a739eb2d4c8da350a3d38edd7/pillow-12.0.0-cp311-cp311-win32.whl", hash = "sha256:27f95b12453d165099c84f8a8bfdfd46b9e4bda9e0e4b65f0635430027f55739", size = 6298440, upload-time = "2025-10-15T18:22:00.982Z" },
- { url = "https://files.pythonhosted.org/packages/4d/42/aaca386de5cc8bd8a0254516957c1f265e3521c91515b16e286c662854c4/pillow-12.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:b583dc9070312190192631373c6c8ed277254aa6e6084b74bdd0a6d3b221608e", size = 6999256, upload-time = "2025-10-15T18:22:02.617Z" },
- { url = "https://files.pythonhosted.org/packages/ba/f1/9197c9c2d5708b785f631a6dfbfa8eb3fb9672837cb92ae9af812c13b4ed/pillow-12.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:759de84a33be3b178a64c8ba28ad5c135900359e85fb662bc6e403ad4407791d", size = 2436025, upload-time = "2025-10-15T18:22:04.598Z" },
- { url = "https://files.pythonhosted.org/packages/2c/90/4fcce2c22caf044e660a198d740e7fbc14395619e3cb1abad12192c0826c/pillow-12.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:53561a4ddc36facb432fae7a9d8afbfaf94795414f5cdc5fc52f28c1dca90371", size = 5249377, upload-time = "2025-10-15T18:22:05.993Z" },
- { url = "https://files.pythonhosted.org/packages/fd/e0/ed960067543d080691d47d6938ebccbf3976a931c9567ab2fbfab983a5dd/pillow-12.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:71db6b4c1653045dacc1585c1b0d184004f0d7e694c7b34ac165ca70c0838082", size = 4650343, upload-time = "2025-10-15T18:22:07.718Z" },
- { url = "https://files.pythonhosted.org/packages/e7/a1/f81fdeddcb99c044bf7d6faa47e12850f13cee0849537a7d27eeab5534d4/pillow-12.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2fa5f0b6716fc88f11380b88b31fe591a06c6315e955c096c35715788b339e3f", size = 6232981, upload-time = "2025-10-15T18:22:09.287Z" },
- { url = "https://files.pythonhosted.org/packages/88/e1/9098d3ce341a8750b55b0e00c03f1630d6178f38ac191c81c97a3b047b44/pillow-12.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:82240051c6ca513c616f7f9da06e871f61bfd7805f566275841af15015b8f98d", size = 8041399, upload-time = "2025-10-15T18:22:10.872Z" },
- { url = "https://files.pythonhosted.org/packages/a7/62/a22e8d3b602ae8cc01446d0c57a54e982737f44b6f2e1e019a925143771d/pillow-12.0.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:55f818bd74fe2f11d4d7cbc65880a843c4075e0ac7226bc1a23261dbea531953", size = 6347740, upload-time = "2025-10-15T18:22:12.769Z" },
- { url = "https://files.pythonhosted.org/packages/4f/87/424511bdcd02c8d7acf9f65caa09f291a519b16bd83c3fb3374b3d4ae951/pillow-12.0.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b87843e225e74576437fd5b6a4c2205d422754f84a06942cfaf1dc32243e45a8", size = 7040201, upload-time = "2025-10-15T18:22:14.813Z" },
- { url = "https://files.pythonhosted.org/packages/dc/4d/435c8ac688c54d11755aedfdd9f29c9eeddf68d150fe42d1d3dbd2365149/pillow-12.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c607c90ba67533e1b2355b821fef6764d1dd2cbe26b8c1005ae84f7aea25ff79", size = 6462334, upload-time = "2025-10-15T18:22:16.375Z" },
- { url = "https://files.pythonhosted.org/packages/2b/f2/ad34167a8059a59b8ad10bc5c72d4d9b35acc6b7c0877af8ac885b5f2044/pillow-12.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:21f241bdd5080a15bc86d3466a9f6074a9c2c2b314100dd896ac81ee6db2f1ba", size = 7134162, upload-time = "2025-10-15T18:22:17.996Z" },
- { url = "https://files.pythonhosted.org/packages/0c/b1/a7391df6adacf0a5c2cf6ac1cf1fcc1369e7d439d28f637a847f8803beb3/pillow-12.0.0-cp312-cp312-win32.whl", hash = "sha256:dd333073e0cacdc3089525c7df7d39b211bcdf31fc2824e49d01c6b6187b07d0", size = 6298769, upload-time = "2025-10-15T18:22:19.923Z" },
- { url = "https://files.pythonhosted.org/packages/a2/0b/d87733741526541c909bbf159e338dcace4f982daac6e5a8d6be225ca32d/pillow-12.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:9fe611163f6303d1619bbcb653540a4d60f9e55e622d60a3108be0d5b441017a", size = 7001107, upload-time = "2025-10-15T18:22:21.644Z" },
- { url = "https://files.pythonhosted.org/packages/bc/96/aaa61ce33cc98421fb6088af2a03be4157b1e7e0e87087c888e2370a7f45/pillow-12.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:7dfb439562f234f7d57b1ac6bc8fe7f838a4bd49c79230e0f6a1da93e82f1fad", size = 2436012, upload-time = "2025-10-15T18:22:23.621Z" },
- { url = "https://files.pythonhosted.org/packages/1d/b3/582327e6c9f86d037b63beebe981425d6811104cb443e8193824ef1a2f27/pillow-12.0.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b22bd8c974942477156be55a768f7aa37c46904c175be4e158b6a86e3a6b7ca8", size = 5215068, upload-time = "2025-10-15T18:23:59.594Z" },
- { url = "https://files.pythonhosted.org/packages/fd/d6/67748211d119f3b6540baf90f92fae73ae51d5217b171b0e8b5f7e5d558f/pillow-12.0.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:805ebf596939e48dbb2e4922a1d3852cfc25c38160751ce02da93058b48d252a", size = 4614994, upload-time = "2025-10-15T18:24:01.669Z" },
- { url = "https://files.pythonhosted.org/packages/2d/e1/f8281e5d844c41872b273b9f2c34a4bf64ca08905668c8ae730eedc7c9fa/pillow-12.0.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cae81479f77420d217def5f54b5b9d279804d17e982e0f2fa19b1d1e14ab5197", size = 5246639, upload-time = "2025-10-15T18:24:03.403Z" },
- { url = "https://files.pythonhosted.org/packages/94/5a/0d8ab8ffe8a102ff5df60d0de5af309015163bf710c7bb3e8311dd3b3ad0/pillow-12.0.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aeaefa96c768fc66818730b952a862235d68825c178f1b3ffd4efd7ad2edcb7c", size = 6986839, upload-time = "2025-10-15T18:24:05.344Z" },
- { url = "https://files.pythonhosted.org/packages/20/2e/3434380e8110b76cd9eb00a363c484b050f949b4bbe84ba770bb8508a02c/pillow-12.0.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:09f2d0abef9e4e2f349305a4f8cc784a8a6c2f58a8c4892eea13b10a943bd26e", size = 5313505, upload-time = "2025-10-15T18:24:07.137Z" },
- { url = "https://files.pythonhosted.org/packages/57/ca/5a9d38900d9d74785141d6580950fe705de68af735ff6e727cb911b64740/pillow-12.0.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bdee52571a343d721fb2eb3b090a82d959ff37fc631e3f70422e0c2e029f3e76", size = 5963654, upload-time = "2025-10-15T18:24:09.579Z" },
- { url = "https://files.pythonhosted.org/packages/95/7e/f896623c3c635a90537ac093c6a618ebe1a90d87206e42309cb5d98a1b9e/pillow-12.0.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:b290fd8aa38422444d4b50d579de197557f182ef1068b75f5aa8558638b8d0a5", size = 6997850, upload-time = "2025-10-15T18:24:11.495Z" },
+version = "12.1.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d0/02/d52c733a2452ef1ffcc123b68e6606d07276b0e358db70eabad7e40042b7/pillow-12.1.0.tar.gz", hash = "sha256:5c5ae0a06e9ea030ab786b0251b32c7e4ce10e58d983c0d5c56029455180b5b9", size = 46977283, upload-time = "2026-01-02T09:13:29.892Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/fe/41/f73d92b6b883a579e79600d391f2e21cb0df767b2714ecbd2952315dfeef/pillow-12.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:fb125d860738a09d363a88daa0f59c4533529a90e564785e20fe875b200b6dbd", size = 5304089, upload-time = "2026-01-02T09:10:24.953Z" },
+ { url = "https://files.pythonhosted.org/packages/94/55/7aca2891560188656e4a91ed9adba305e914a4496800da6b5c0a15f09edf/pillow-12.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cad302dc10fac357d3467a74a9561c90609768a6f73a1923b0fd851b6486f8b0", size = 4657815, upload-time = "2026-01-02T09:10:27.063Z" },
+ { url = "https://files.pythonhosted.org/packages/e9/d2/b28221abaa7b4c40b7dba948f0f6a708bd7342c4d47ce342f0ea39643974/pillow-12.1.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a40905599d8079e09f25027423aed94f2823adaf2868940de991e53a449e14a8", size = 6222593, upload-time = "2026-01-02T09:10:29.115Z" },
+ { url = "https://files.pythonhosted.org/packages/71/b8/7a61fb234df6a9b0b479f69e66901209d89ff72a435b49933f9122f94cac/pillow-12.1.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:92a7fe4225365c5e3a8e598982269c6d6698d3e783b3b1ae979e7819f9cd55c1", size = 8027579, upload-time = "2026-01-02T09:10:31.182Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/51/55c751a57cc524a15a0e3db20e5cde517582359508d62305a627e77fd295/pillow-12.1.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f10c98f49227ed8383d28174ee95155a675c4ed7f85e2e573b04414f7e371bda", size = 6335760, upload-time = "2026-01-02T09:10:33.02Z" },
+ { url = "https://files.pythonhosted.org/packages/dc/7c/60e3e6f5e5891a1a06b4c910f742ac862377a6fe842f7184df4a274ce7bf/pillow-12.1.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8637e29d13f478bc4f153d8daa9ffb16455f0a6cb287da1b432fdad2bfbd66c7", size = 7027127, upload-time = "2026-01-02T09:10:35.009Z" },
+ { url = "https://files.pythonhosted.org/packages/06/37/49d47266ba50b00c27ba63a7c898f1bb41a29627ced8c09e25f19ebec0ff/pillow-12.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:21e686a21078b0f9cb8c8a961d99e6a4ddb88e0fc5ea6e130172ddddc2e5221a", size = 6449896, upload-time = "2026-01-02T09:10:36.793Z" },
+ { url = "https://files.pythonhosted.org/packages/f9/e5/67fd87d2913902462cd9b79c6211c25bfe95fcf5783d06e1367d6d9a741f/pillow-12.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2415373395a831f53933c23ce051021e79c8cd7979822d8cc478547a3f4da8ef", size = 7151345, upload-time = "2026-01-02T09:10:39.064Z" },
+ { url = "https://files.pythonhosted.org/packages/bd/15/f8c7abf82af68b29f50d77c227e7a1f87ce02fdc66ded9bf603bc3b41180/pillow-12.1.0-cp310-cp310-win32.whl", hash = "sha256:e75d3dba8fc1ddfec0cd752108f93b83b4f8d6ab40e524a95d35f016b9683b09", size = 6325568, upload-time = "2026-01-02T09:10:41.035Z" },
+ { url = "https://files.pythonhosted.org/packages/d4/24/7d1c0e160b6b5ac2605ef7d8be537e28753c0db5363d035948073f5513d7/pillow-12.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:64efdf00c09e31efd754448a383ea241f55a994fd079866b92d2bbff598aad91", size = 7032367, upload-time = "2026-01-02T09:10:43.09Z" },
+ { url = "https://files.pythonhosted.org/packages/f4/03/41c038f0d7a06099254c60f618d0ec7be11e79620fc23b8e85e5b31d9a44/pillow-12.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:f188028b5af6b8fb2e9a76ac0f841a575bd1bd396e46ef0840d9b88a48fdbcea", size = 2452345, upload-time = "2026-01-02T09:10:44.795Z" },
+ { url = "https://files.pythonhosted.org/packages/43/c4/bf8328039de6cc22182c3ef007a2abfbbdab153661c0a9aa78af8d706391/pillow-12.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:a83e0850cb8f5ac975291ebfc4170ba481f41a28065277f7f735c202cd8e0af3", size = 5304057, upload-time = "2026-01-02T09:10:46.627Z" },
+ { url = "https://files.pythonhosted.org/packages/43/06/7264c0597e676104cc22ca73ee48f752767cd4b1fe084662620b17e10120/pillow-12.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b6e53e82ec2db0717eabb276aa56cf4e500c9a7cec2c2e189b55c24f65a3e8c0", size = 4657811, upload-time = "2026-01-02T09:10:49.548Z" },
+ { url = "https://files.pythonhosted.org/packages/72/64/f9189e44474610daf83da31145fa56710b627b5c4c0b9c235e34058f6b31/pillow-12.1.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:40a8e3b9e8773876d6e30daed22f016509e3987bab61b3b7fe309d7019a87451", size = 6232243, upload-time = "2026-01-02T09:10:51.62Z" },
+ { url = "https://files.pythonhosted.org/packages/ef/30/0df458009be6a4caca4ca2c52975e6275c387d4e5c95544e34138b41dc86/pillow-12.1.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:800429ac32c9b72909c671aaf17ecd13110f823ddb7db4dfef412a5587c2c24e", size = 8037872, upload-time = "2026-01-02T09:10:53.446Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/86/95845d4eda4f4f9557e25381d70876aa213560243ac1a6d619c46caaedd9/pillow-12.1.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b022eaaf709541b391ee069f0022ee5b36c709df71986e3f7be312e46f42c84", size = 6345398, upload-time = "2026-01-02T09:10:55.426Z" },
+ { url = "https://files.pythonhosted.org/packages/5c/1f/8e66ab9be3aaf1435bc03edd1ebdf58ffcd17f7349c1d970cafe87af27d9/pillow-12.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f345e7bc9d7f368887c712aa5054558bad44d2a301ddf9248599f4161abc7c0", size = 7034667, upload-time = "2026-01-02T09:10:57.11Z" },
+ { url = "https://files.pythonhosted.org/packages/f9/f6/683b83cb9b1db1fb52b87951b1c0b99bdcfceaa75febf11406c19f82cb5e/pillow-12.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d70347c8a5b7ccd803ec0c85c8709f036e6348f1e6a5bf048ecd9c64d3550b8b", size = 6458743, upload-time = "2026-01-02T09:10:59.331Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/7d/de833d63622538c1d58ce5395e7c6cb7e7dce80decdd8bde4a484e095d9f/pillow-12.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1fcc52d86ce7a34fd17cb04e87cfdb164648a3662a6f20565910a99653d66c18", size = 7159342, upload-time = "2026-01-02T09:11:01.82Z" },
+ { url = "https://files.pythonhosted.org/packages/8c/40/50d86571c9e5868c42b81fe7da0c76ca26373f3b95a8dd675425f4a92ec1/pillow-12.1.0-cp311-cp311-win32.whl", hash = "sha256:3ffaa2f0659e2f740473bcf03c702c39a8d4b2b7ffc629052028764324842c64", size = 6328655, upload-time = "2026-01-02T09:11:04.556Z" },
+ { url = "https://files.pythonhosted.org/packages/6c/af/b1d7e301c4cd26cd45d4af884d9ee9b6fab893b0ad2450d4746d74a6968c/pillow-12.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:806f3987ffe10e867bab0ddad45df1148a2b98221798457fa097ad85d6e8bc75", size = 7031469, upload-time = "2026-01-02T09:11:06.538Z" },
+ { url = "https://files.pythonhosted.org/packages/48/36/d5716586d887fb2a810a4a61518a327a1e21c8b7134c89283af272efe84b/pillow-12.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:9f5fefaca968e700ad1a4a9de98bf0869a94e397fe3524c4c9450c1445252304", size = 2452515, upload-time = "2026-01-02T09:11:08.226Z" },
+ { url = "https://files.pythonhosted.org/packages/20/31/dc53fe21a2f2996e1b7d92bf671cdb157079385183ef7c1ae08b485db510/pillow-12.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a332ac4ccb84b6dde65dbace8431f3af08874bf9770719d32a635c4ef411b18b", size = 5262642, upload-time = "2026-01-02T09:11:10.138Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/c1/10e45ac9cc79419cedf5121b42dcca5a50ad2b601fa080f58c22fb27626e/pillow-12.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:907bfa8a9cb790748a9aa4513e37c88c59660da3bcfffbd24a7d9e6abf224551", size = 4657464, upload-time = "2026-01-02T09:11:12.319Z" },
+ { url = "https://files.pythonhosted.org/packages/ad/26/7b82c0ab7ef40ebede7a97c72d473bda5950f609f8e0c77b04af574a0ddb/pillow-12.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:efdc140e7b63b8f739d09a99033aa430accce485ff78e6d311973a67b6bf3208", size = 6234878, upload-time = "2026-01-02T09:11:14.096Z" },
+ { url = "https://files.pythonhosted.org/packages/76/25/27abc9792615b5e886ca9411ba6637b675f1b77af3104710ac7353fe5605/pillow-12.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bef9768cab184e7ae6e559c032e95ba8d07b3023c289f79a2bd36e8bf85605a5", size = 8044868, upload-time = "2026-01-02T09:11:15.903Z" },
+ { url = "https://files.pythonhosted.org/packages/0a/ea/f200a4c36d836100e7bc738fc48cd963d3ba6372ebc8298a889e0cfc3359/pillow-12.1.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:742aea052cf5ab5034a53c3846165bc3ce88d7c38e954120db0ab867ca242661", size = 6349468, upload-time = "2026-01-02T09:11:17.631Z" },
+ { url = "https://files.pythonhosted.org/packages/11/8f/48d0b77ab2200374c66d344459b8958c86693be99526450e7aee714e03e4/pillow-12.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a6dfc2af5b082b635af6e08e0d1f9f1c4e04d17d4e2ca0ef96131e85eda6eb17", size = 7041518, upload-time = "2026-01-02T09:11:19.389Z" },
+ { url = "https://files.pythonhosted.org/packages/1d/23/c281182eb986b5d31f0a76d2a2c8cd41722d6fb8ed07521e802f9bba52de/pillow-12.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:609e89d9f90b581c8d16358c9087df76024cf058fa693dd3e1e1620823f39670", size = 6462829, upload-time = "2026-01-02T09:11:21.28Z" },
+ { url = "https://files.pythonhosted.org/packages/25/ef/7018273e0faac099d7b00982abdcc39142ae6f3bd9ceb06de09779c4a9d6/pillow-12.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:43b4899cfd091a9693a1278c4982f3e50f7fb7cff5153b05174b4afc9593b616", size = 7166756, upload-time = "2026-01-02T09:11:23.559Z" },
+ { url = "https://files.pythonhosted.org/packages/8f/c8/993d4b7ab2e341fe02ceef9576afcf5830cdec640be2ac5bee1820d693d4/pillow-12.1.0-cp312-cp312-win32.whl", hash = "sha256:aa0c9cc0b82b14766a99fbe6084409972266e82f459821cd26997a488a7261a7", size = 6328770, upload-time = "2026-01-02T09:11:25.661Z" },
+ { url = "https://files.pythonhosted.org/packages/a7/87/90b358775a3f02765d87655237229ba64a997b87efa8ccaca7dd3e36e7a7/pillow-12.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:d70534cea9e7966169ad29a903b99fc507e932069a881d0965a1a84bb57f6c6d", size = 7033406, upload-time = "2026-01-02T09:11:27.474Z" },
+ { url = "https://files.pythonhosted.org/packages/5d/cf/881b457eccacac9e5b2ddd97d5071fb6d668307c57cbf4e3b5278e06e536/pillow-12.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:65b80c1ee7e14a87d6a068dd3b0aea268ffcabfe0498d38661b00c5b4b22e74c", size = 2452612, upload-time = "2026-01-02T09:11:29.309Z" },
+ { url = "https://files.pythonhosted.org/packages/8b/bc/224b1d98cffd7164b14707c91aac83c07b047fbd8f58eba4066a3e53746a/pillow-12.1.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ca94b6aac0d7af2a10ba08c0f888b3d5114439b6b3ef39968378723622fed377", size = 5228605, upload-time = "2026-01-02T09:13:14.084Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/ca/49ca7769c4550107de049ed85208240ba0f330b3f2e316f24534795702ce/pillow-12.1.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:351889afef0f485b84078ea40fe33727a0492b9af3904661b0abbafee0355b72", size = 4622245, upload-time = "2026-01-02T09:13:15.964Z" },
+ { url = "https://files.pythonhosted.org/packages/73/48/fac807ce82e5955bcc2718642b94b1bd22a82a6d452aea31cbb678cddf12/pillow-12.1.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bb0984b30e973f7e2884362b7d23d0a348c7143ee559f38ef3eaab640144204c", size = 5247593, upload-time = "2026-01-02T09:13:17.913Z" },
+ { url = "https://files.pythonhosted.org/packages/d2/95/3e0742fe358c4664aed4fd05d5f5373dcdad0b27af52aa0972568541e3f4/pillow-12.1.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:84cabc7095dd535ca934d57e9ce2a72ffd216e435a84acb06b2277b1de2689bd", size = 6989008, upload-time = "2026-01-02T09:13:20.083Z" },
+ { url = "https://files.pythonhosted.org/packages/5a/74/fe2ac378e4e202e56d50540d92e1ef4ff34ed687f3c60f6a121bcf99437e/pillow-12.1.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53d8b764726d3af1a138dd353116f774e3862ec7e3794e0c8781e30db0f35dfc", size = 5313824, upload-time = "2026-01-02T09:13:22.405Z" },
+ { url = "https://files.pythonhosted.org/packages/f3/77/2a60dee1adee4e2655ac328dd05c02a955c1cd683b9f1b82ec3feb44727c/pillow-12.1.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5da841d81b1a05ef940a8567da92decaa15bc4d7dedb540a8c219ad83d91808a", size = 5963278, upload-time = "2026-01-02T09:13:24.706Z" },
+ { url = "https://files.pythonhosted.org/packages/2d/71/64e9b1c7f04ae0027f788a248e6297d7fcc29571371fe7d45495a78172c0/pillow-12.1.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:75af0b4c229ac519b155028fa1be632d812a519abba9b46b20e50c6caa184f19", size = 7029809, upload-time = "2026-01-02T09:13:26.541Z" },
]
[[package]]
@@ -1816,11 +1828,11 @@ wheels = [
[[package]]
name = "platformdirs"
-version = "4.5.0"
+version = "4.5.1"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/61/33/9611380c2bdb1225fdef633e2a9610622310fed35ab11dac9620972ee088/platformdirs-4.5.0.tar.gz", hash = "sha256:70ddccdd7c99fc5942e9fc25636a8b34d04c24b335100223152c2803e4063312", size = 21632, upload-time = "2025-10-08T17:44:48.791Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/cf/86/0248f086a84f01b37aaec0fa567b397df1a119f73c16f6c7a9aac73ea309/platformdirs-4.5.1.tar.gz", hash = "sha256:61d5cdcc6065745cdd94f0f878977f8de9437be93de97c1c12f853c9c0cdcbda", size = 21715, upload-time = "2025-12-05T13:52:58.638Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/73/cb/ac7874b3e5d58441674fb70742e6c374b28b0c7cb988d37d991cde47166c/platformdirs-4.5.0-py3-none-any.whl", hash = "sha256:e578a81bb873cbb89a41fcc904c7ef523cc18284b7e3b3ccf06aca1403b7ebd3", size = 18651, upload-time = "2025-10-08T17:44:47.223Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl", hash = "sha256:d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31", size = 18731, upload-time = "2025-12-05T13:52:56.823Z" },
]
[[package]]
@@ -1848,7 +1860,7 @@ wheels = [
[[package]]
name = "pre-commit"
-version = "4.5.0"
+version = "4.5.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "cfgv" },
@@ -1857,9 +1869,9 @@ dependencies = [
{ name = "pyyaml" },
{ name = "virtualenv" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/f4/9b/6a4ffb4ed980519da959e1cf3122fc6cb41211daa58dbae1c73c0e519a37/pre_commit-4.5.0.tar.gz", hash = "sha256:dc5a065e932b19fc1d4c653c6939068fe54325af8e741e74e88db4d28a4dd66b", size = 198428, upload-time = "2025-11-22T21:02:42.304Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/40/f1/6d86a29246dfd2e9b6237f0b5823717f60cad94d47ddc26afa916d21f525/pre_commit-4.5.1.tar.gz", hash = "sha256:eb545fcff725875197837263e977ea257a402056661f09dae08e4b149b030a61", size = 198232, upload-time = "2025-12-16T21:14:33.552Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/5d/c4/b2d28e9d2edf4f1713eb3c29307f1a63f3d67cf09bdda29715a36a68921a/pre_commit-4.5.0-py2.py3-none-any.whl", hash = "sha256:25e2ce09595174d9c97860a95609f9f852c0614ba602de3561e267547f2335e1", size = 226429, upload-time = "2025-11-22T21:02:40.836Z" },
+ { url = "https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl", hash = "sha256:3b3afd891e97337708c1674210f8eba659b52a38ea5f822ff142d10786221f77", size = 226437, upload-time = "2025-12-16T21:14:32.409Z" },
]
[[package]]
@@ -1876,31 +1888,33 @@ wheels = [
[[package]]
name = "protobuf"
-version = "6.33.1"
+version = "6.33.2"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/0a/03/a1440979a3f74f16cab3b75b0da1a1a7f922d56a8ddea96092391998edc0/protobuf-6.33.1.tar.gz", hash = "sha256:97f65757e8d09870de6fd973aeddb92f85435607235d20b2dfed93405d00c85b", size = 443432, upload-time = "2025-11-13T16:44:18.895Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/34/44/e49ecff446afeec9d1a66d6bbf9adc21e3c7cea7803a920ca3773379d4f6/protobuf-6.33.2.tar.gz", hash = "sha256:56dc370c91fbb8ac85bc13582c9e373569668a290aa2e66a590c2a0d35ddb9e4", size = 444296, upload-time = "2025-12-06T00:17:53.311Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/06/f1/446a9bbd2c60772ca36556bac8bfde40eceb28d9cc7838755bc41e001d8f/protobuf-6.33.1-cp310-abi3-win32.whl", hash = "sha256:f8d3fdbc966aaab1d05046d0240dd94d40f2a8c62856d41eaa141ff64a79de6b", size = 425593, upload-time = "2025-11-13T16:44:06.275Z" },
- { url = "https://files.pythonhosted.org/packages/a6/79/8780a378c650e3df849b73de8b13cf5412f521ca2ff9b78a45c247029440/protobuf-6.33.1-cp310-abi3-win_amd64.whl", hash = "sha256:923aa6d27a92bf44394f6abf7ea0500f38769d4b07f4be41cb52bd8b1123b9ed", size = 436883, upload-time = "2025-11-13T16:44:09.222Z" },
- { url = "https://files.pythonhosted.org/packages/cd/93/26213ff72b103ae55bb0d73e7fb91ea570ef407c3ab4fd2f1f27cac16044/protobuf-6.33.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:fe34575f2bdde76ac429ec7b570235bf0c788883e70aee90068e9981806f2490", size = 427522, upload-time = "2025-11-13T16:44:10.475Z" },
- { url = "https://files.pythonhosted.org/packages/c2/32/df4a35247923393aa6b887c3b3244a8c941c32a25681775f96e2b418f90e/protobuf-6.33.1-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:f8adba2e44cde2d7618996b3fc02341f03f5bc3f2748be72dc7b063319276178", size = 324445, upload-time = "2025-11-13T16:44:11.869Z" },
- { url = "https://files.pythonhosted.org/packages/8e/d0/d796e419e2ec93d2f3fa44888861c3f88f722cde02b7c3488fcc6a166820/protobuf-6.33.1-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:0f4cf01222c0d959c2b399142deb526de420be8236f22c71356e2a544e153c53", size = 339161, upload-time = "2025-11-13T16:44:12.778Z" },
- { url = "https://files.pythonhosted.org/packages/1d/2a/3c5f05a4af06649547027d288747f68525755de692a26a7720dced3652c0/protobuf-6.33.1-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:8fd7d5e0eb08cd5b87fd3df49bc193f5cfd778701f47e11d127d0afc6c39f1d1", size = 323171, upload-time = "2025-11-13T16:44:14.035Z" },
- { url = "https://files.pythonhosted.org/packages/08/b4/46310463b4f6ceef310f8348786f3cff181cea671578e3d9743ba61a459e/protobuf-6.33.1-py3-none-any.whl", hash = "sha256:d595a9fd694fdeb061a62fbe10eb039cc1e444df81ec9bb70c7fc59ebcb1eafa", size = 170477, upload-time = "2025-11-13T16:44:17.633Z" },
+ { url = "https://files.pythonhosted.org/packages/bc/91/1e3a34881a88697a7354ffd177e8746e97a722e5e8db101544b47e84afb1/protobuf-6.33.2-cp310-abi3-win32.whl", hash = "sha256:87eb388bd2d0f78febd8f4c8779c79247b26a5befad525008e49a6955787ff3d", size = 425603, upload-time = "2025-12-06T00:17:41.114Z" },
+ { url = "https://files.pythonhosted.org/packages/64/20/4d50191997e917ae13ad0a235c8b42d8c1ab9c3e6fd455ca16d416944355/protobuf-6.33.2-cp310-abi3-win_amd64.whl", hash = "sha256:fc2a0e8b05b180e5fc0dd1559fe8ebdae21a27e81ac77728fb6c42b12c7419b4", size = 436930, upload-time = "2025-12-06T00:17:43.278Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/ca/7e485da88ba45c920fb3f50ae78de29ab925d9e54ef0de678306abfbb497/protobuf-6.33.2-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d9b19771ca75935b3a4422957bc518b0cecb978b31d1dd12037b088f6bcc0e43", size = 427621, upload-time = "2025-12-06T00:17:44.445Z" },
+ { url = "https://files.pythonhosted.org/packages/7d/4f/f743761e41d3b2b2566748eb76bbff2b43e14d5fcab694f494a16458b05f/protobuf-6.33.2-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:b5d3b5625192214066d99b2b605f5783483575656784de223f00a8d00754fc0e", size = 324460, upload-time = "2025-12-06T00:17:45.678Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/fa/26468d00a92824020f6f2090d827078c09c9c587e34cbfd2d0c7911221f8/protobuf-6.33.2-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:8cd7640aee0b7828b6d03ae518b5b4806fdfc1afe8de82f79c3454f8aef29872", size = 339168, upload-time = "2025-12-06T00:17:46.813Z" },
+ { url = "https://files.pythonhosted.org/packages/56/13/333b8f421738f149d4fe5e49553bc2a2ab75235486259f689b4b91f96cec/protobuf-6.33.2-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:1f8017c48c07ec5859106533b682260ba3d7c5567b1ca1f24297ce03384d1b4f", size = 323270, upload-time = "2025-12-06T00:17:48.253Z" },
+ { url = "https://files.pythonhosted.org/packages/0e/15/4f02896cc3df04fc465010a4c6a0cd89810f54617a32a70ef531ed75d61c/protobuf-6.33.2-py3-none-any.whl", hash = "sha256:7636aad9bb01768870266de5dc009de2d1b936771b38a793f73cbbf279c91c5c", size = 170501, upload-time = "2025-12-06T00:17:52.211Z" },
]
[[package]]
name = "psutil"
-version = "7.1.3"
+version = "7.2.1"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/e1/88/bdd0a41e5857d5d703287598cbf08dad90aed56774ea52ae071bae9071b6/psutil-7.1.3.tar.gz", hash = "sha256:6c86281738d77335af7aec228328e944b30930899ea760ecf33a4dba66be5e74", size = 489059, upload-time = "2025-11-02T12:25:54.619Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/73/cb/09e5184fb5fc0358d110fc3ca7f6b1d033800734d34cac10f4136cfac10e/psutil-7.2.1.tar.gz", hash = "sha256:f7583aec590485b43ca601dd9cea0dcd65bd7bb21d30ef4ddbf4ea6b5ed1bdd3", size = 490253, upload-time = "2025-12-29T08:26:00.169Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/ef/94/46b9154a800253e7ecff5aaacdf8ebf43db99de4a2dfa18575b02548654e/psutil-7.1.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2bdbcd0e58ca14996a42adf3621a6244f1bb2e2e528886959c72cf1e326677ab", size = 238359, upload-time = "2025-11-02T12:26:25.284Z" },
- { url = "https://files.pythonhosted.org/packages/68/3a/9f93cff5c025029a36d9a92fef47220ab4692ee7f2be0fba9f92813d0cb8/psutil-7.1.3-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:bc31fa00f1fbc3c3802141eede66f3a2d51d89716a194bf2cd6fc68310a19880", size = 239171, upload-time = "2025-11-02T12:26:27.23Z" },
- { url = "https://files.pythonhosted.org/packages/ce/b1/5f49af514f76431ba4eea935b8ad3725cdeb397e9245ab919dbc1d1dc20f/psutil-7.1.3-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3bb428f9f05c1225a558f53e30ccbad9930b11c3fc206836242de1091d3e7dd3", size = 263261, upload-time = "2025-11-02T12:26:29.48Z" },
- { url = "https://files.pythonhosted.org/packages/e0/95/992c8816a74016eb095e73585d747e0a8ea21a061ed3689474fabb29a395/psutil-7.1.3-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:56d974e02ca2c8eb4812c3f76c30e28836fffc311d55d979f1465c1feeb2b68b", size = 264635, upload-time = "2025-11-02T12:26:31.74Z" },
- { url = "https://files.pythonhosted.org/packages/55/4c/c3ed1a622b6ae2fd3c945a366e64eb35247a31e4db16cf5095e269e8eb3c/psutil-7.1.3-cp37-abi3-win_amd64.whl", hash = "sha256:f39c2c19fe824b47484b96f9692932248a54c43799a84282cfe58d05a6449efd", size = 247633, upload-time = "2025-11-02T12:26:33.887Z" },
- { url = "https://files.pythonhosted.org/packages/c9/ad/33b2ccec09bf96c2b2ef3f9a6f66baac8253d7565d8839e024a6b905d45d/psutil-7.1.3-cp37-abi3-win_arm64.whl", hash = "sha256:bd0d69cee829226a761e92f28140bec9a5ee9d5b4fb4b0cc589068dbfff559b1", size = 244608, upload-time = "2025-11-02T12:26:36.136Z" },
+ { url = "https://files.pythonhosted.org/packages/c5/cf/5180eb8c8bdf6a503c6919f1da28328bd1e6b3b1b5b9d5b01ae64f019616/psutil-7.2.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b2e953fcfaedcfbc952b44744f22d16575d3aa78eb4f51ae74165b4e96e55f42", size = 128137, upload-time = "2025-12-29T08:26:27.759Z" },
+ { url = "https://files.pythonhosted.org/packages/c5/2c/78e4a789306a92ade5000da4f5de3255202c534acdadc3aac7b5458fadef/psutil-7.2.1-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:05cc68dbb8c174828624062e73078e7e35406f4ca2d0866c272c2410d8ef06d1", size = 128947, upload-time = "2025-12-29T08:26:29.548Z" },
+ { url = "https://files.pythonhosted.org/packages/29/f8/40e01c350ad9a2b3cb4e6adbcc8a83b17ee50dd5792102b6142385937db5/psutil-7.2.1-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e38404ca2bb30ed7267a46c02f06ff842e92da3bb8c5bfdadbd35a5722314d8", size = 154694, upload-time = "2025-12-29T08:26:32.147Z" },
+ { url = "https://files.pythonhosted.org/packages/06/e4/b751cdf839c011a9714a783f120e6a86b7494eb70044d7d81a25a5cd295f/psutil-7.2.1-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ab2b98c9fc19f13f59628d94df5cc4cc4844bc572467d113a8b517d634e362c6", size = 156136, upload-time = "2025-12-29T08:26:34.079Z" },
+ { url = "https://files.pythonhosted.org/packages/44/ad/bbf6595a8134ee1e94a4487af3f132cef7fce43aef4a93b49912a48c3af7/psutil-7.2.1-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:f78baafb38436d5a128f837fab2d92c276dfb48af01a240b861ae02b2413ada8", size = 148108, upload-time = "2025-12-29T08:26:36.225Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/15/dd6fd869753ce82ff64dcbc18356093471a5a5adf4f77ed1f805d473d859/psutil-7.2.1-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:99a4cd17a5fdd1f3d014396502daa70b5ec21bf4ffe38393e152f8e449757d67", size = 147402, upload-time = "2025-12-29T08:26:39.21Z" },
+ { url = "https://files.pythonhosted.org/packages/34/68/d9317542e3f2b180c4306e3f45d3c922d7e86d8ce39f941bb9e2e9d8599e/psutil-7.2.1-cp37-abi3-win_amd64.whl", hash = "sha256:b1b0671619343aa71c20ff9767eced0483e4fc9e1f489d50923738caf6a03c17", size = 136938, upload-time = "2025-12-29T08:26:41.036Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/73/2ce007f4198c80fcf2cb24c169884f833fe93fbc03d55d302627b094ee91/psutil-7.2.1-cp37-abi3-win_arm64.whl", hash = "sha256:0d67c1822c355aa6f7314d92018fb4268a76668a536f133599b91edd48759442", size = 133836, upload-time = "2025-12-29T08:26:43.086Z" },
]
[[package]]
@@ -1991,10 +2005,11 @@ dependencies = [
{ name = "babel" },
{ name = "beautifulsoup4" },
{ name = "docutils", version = "0.21.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" },
- { name = "docutils", version = "0.22.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" },
+ { name = "docutils", version = "0.22.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" },
{ name = "pygments" },
{ name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" },
- { name = "sphinx", version = "9.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" },
+ { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" },
+ { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" },
{ name = "typing-extensions" },
]
sdist = { url = "https://files.pythonhosted.org/packages/00/20/bb50f9de3a6de69e6abd6b087b52fa2418a0418b19597601605f855ad044/pydata_sphinx_theme-0.16.1.tar.gz", hash = "sha256:a08b7f0b7f70387219dc659bff0893a7554d5eb39b59d3b8ef37b8401b7642d7", size = 2412693, upload-time = "2024-12-17T10:53:39.537Z" }
@@ -2022,11 +2037,11 @@ wheels = [
[[package]]
name = "pyparsing"
-version = "3.2.5"
+version = "3.3.1"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/f2/a5/181488fc2b9d093e3972d2a472855aae8a03f000592dbfce716a512b3359/pyparsing-3.2.5.tar.gz", hash = "sha256:2df8d5b7b2802ef88e8d016a2eb9c7aeaa923529cd251ed0fe4608275d4105b6", size = 1099274, upload-time = "2025-09-21T04:11:06.277Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/33/c1/1d9de9aeaa1b89b0186e5fe23294ff6517fce1bc69149185577cd31016b2/pyparsing-3.3.1.tar.gz", hash = "sha256:47fad0f17ac1e2cad3de3b458570fbc9b03560aa029ed5e16ee5554da9a2251c", size = 1550512, upload-time = "2025-12-23T03:14:04.391Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/10/5e/1aa9a93198c6b64513c9d7752de7422c06402de6600a8767da1524f9570b/pyparsing-3.2.5-py3-none-any.whl", hash = "sha256:e38a4f02064cf41fe6593d328d0512495ad1f3d8a91c4f73fc401b3079a59a5e", size = 113890, upload-time = "2025-09-21T04:11:04.117Z" },
+ { url = "https://files.pythonhosted.org/packages/8b/40/2614036cdd416452f5bf98ec037f38a1afb17f327cb8e6b652d4729e0af8/pyparsing-3.3.1-py3-none-any.whl", hash = "sha256:023b5e7e5520ad96642e2c6db4cb683d3970bd640cdf7115049a6e9c3682df82", size = 121793, upload-time = "2025-12-23T03:14:02.103Z" },
]
[[package]]
@@ -2058,7 +2073,7 @@ wheels = [
[[package]]
name = "pytest"
-version = "9.0.1"
+version = "9.0.2"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "colorama", marker = "sys_platform == 'win32'" },
@@ -2069,9 +2084,9 @@ dependencies = [
{ name = "pygments" },
{ name = "tomli", marker = "python_full_version < '3.11'" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/07/56/f013048ac4bc4c1d9be45afd4ab209ea62822fb1598f40687e6bf45dcea4/pytest-9.0.1.tar.gz", hash = "sha256:3e9c069ea73583e255c3b21cf46b8d3c56f6e3a1a8f6da94ccb0fcf57b9d73c8", size = 1564125, upload-time = "2025-11-12T13:05:09.333Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/d1/db/7ef3487e0fb0049ddb5ce41d3a49c235bf9ad299b6a25d5780a89f19230f/pytest-9.0.2.tar.gz", hash = "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11", size = 1568901, upload-time = "2025-12-06T21:30:51.014Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/0b/8b/6300fb80f858cda1c51ffa17075df5d846757081d11ab4aa35cef9e6258b/pytest-9.0.1-py3-none-any.whl", hash = "sha256:67be0030d194df2dfa7b556f2e56fb3c3315bd5c8822c6951162b92b32ce7dad", size = 373668, upload-time = "2025-11-12T13:05:07.379Z" },
+ { url = "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b", size = 374801, upload-time = "2025-12-06T21:30:49.154Z" },
]
[[package]]
@@ -2230,7 +2245,7 @@ version = "44.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "docutils", version = "0.21.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" },
- { name = "docutils", version = "0.22.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" },
+ { name = "docutils", version = "0.22.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" },
{ name = "nh3" },
{ name = "pygments" },
]
@@ -2290,11 +2305,11 @@ wheels = [
[[package]]
name = "roman-numerals"
-version = "3.1.0"
+version = "4.1.0"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/57/5b/1bcda2c6a8acec5b310dd70f732400827b96f05d815834f0f112b91b3539/roman_numerals-3.1.0.tar.gz", hash = "sha256:384e36fc1e8d4bd361bdb3672841faae7a345b3f708aae9895d074c878332551", size = 9069, upload-time = "2025-03-12T00:41:08.837Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/ae/f9/41dc953bbeb056c17d5f7a519f50fdf010bd0553be2d630bc69d1e022703/roman_numerals-4.1.0.tar.gz", hash = "sha256:1af8b147eb1405d5839e78aeb93131690495fe9da5c91856cb33ad55a7f1e5b2", size = 9077, upload-time = "2025-12-17T18:25:34.381Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/82/1d/7356f115a0e5faf8dc59894a3e9fc8b1821ab949163458b0072db0a12a68/roman_numerals-3.1.0-py3-none-any.whl", hash = "sha256:842ae5fd12912d62720c9aad8cab706e8c692556d01a38443e051ee6cc158d90", size = 7709, upload-time = "2025-03-12T00:41:07.626Z" },
+ { url = "https://files.pythonhosted.org/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl", hash = "sha256:647ba99caddc2cc1e55a51e4360689115551bf4476d90e8162cf8c345fe233c7", size = 7676, upload-time = "2025-12-17T18:25:33.098Z" },
]
[[package]]
@@ -2433,11 +2448,11 @@ wheels = [
[[package]]
name = "soupsieve"
-version = "2.8"
+version = "2.8.1"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/6d/e6/21ccce3262dd4889aa3332e5a119a3491a95e8f60939870a3a035aabac0d/soupsieve-2.8.tar.gz", hash = "sha256:e2dd4a40a628cb5f28f6d4b0db8800b8f581b65bb380b97de22ba5ca8d72572f", size = 103472, upload-time = "2025-08-27T15:39:51.78Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/89/23/adf3796d740536d63a6fbda113d07e60c734b6ed5d3058d1e47fc0495e47/soupsieve-2.8.1.tar.gz", hash = "sha256:4cf733bc50fa805f5df4b8ef4740fc0e0fa6218cf3006269afd3f9d6d80fd350", size = 117856, upload-time = "2025-12-18T13:50:34.655Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl", hash = "sha256:0cc76456a30e20f5d7f2e14a98a4ae2ee4e5abdc7c5ea0aafe795f344bc7984c", size = 36679, upload-time = "2025-08-27T15:39:50.179Z" },
+ { url = "https://files.pythonhosted.org/packages/48/f3/b67d6ea49ca9154453b6d70b34ea22f3996b9fa55da105a79d8732227adc/soupsieve-2.8.1-py3-none-any.whl", hash = "sha256:a11fe2a6f3d76ab3cf2de04eb339c1be5b506a8a47f2ceb6d139803177f85434", size = 36710, upload-time = "2025-12-18T13:50:33.267Z" },
]
[[package]]
@@ -2473,34 +2488,64 @@ wheels = [
[[package]]
name = "sphinx"
-version = "9.0.1"
+version = "9.0.4"
source = { registry = "https://pypi.org/simple" }
resolution-markers = [
- "python_full_version >= '3.12'",
"python_full_version == '3.11.*'",
]
dependencies = [
- { name = "alabaster", marker = "python_full_version >= '3.11'" },
- { name = "babel", marker = "python_full_version >= '3.11'" },
- { name = "colorama", marker = "python_full_version >= '3.11' and sys_platform == 'win32'" },
- { name = "docutils", version = "0.22.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" },
- { name = "imagesize", marker = "python_full_version >= '3.11'" },
- { name = "jinja2", marker = "python_full_version >= '3.11'" },
- { name = "packaging", marker = "python_full_version >= '3.11'" },
- { name = "pygments", marker = "python_full_version >= '3.11'" },
- { name = "requests", marker = "python_full_version >= '3.11'" },
- { name = "roman-numerals", marker = "python_full_version >= '3.11'" },
- { name = "snowballstemmer", marker = "python_full_version >= '3.11'" },
- { name = "sphinxcontrib-applehelp", marker = "python_full_version >= '3.11'" },
- { name = "sphinxcontrib-devhelp", marker = "python_full_version >= '3.11'" },
- { name = "sphinxcontrib-htmlhelp", marker = "python_full_version >= '3.11'" },
- { name = "sphinxcontrib-jsmath", marker = "python_full_version >= '3.11'" },
- { name = "sphinxcontrib-qthelp", marker = "python_full_version >= '3.11'" },
- { name = "sphinxcontrib-serializinghtml", marker = "python_full_version >= '3.11'" },
+ { name = "alabaster", marker = "python_full_version == '3.11.*'" },
+ { name = "babel", marker = "python_full_version == '3.11.*'" },
+ { name = "colorama", marker = "python_full_version == '3.11.*' and sys_platform == 'win32'" },
+ { name = "docutils", version = "0.22.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" },
+ { name = "imagesize", marker = "python_full_version == '3.11.*'" },
+ { name = "jinja2", marker = "python_full_version == '3.11.*'" },
+ { name = "packaging", marker = "python_full_version == '3.11.*'" },
+ { name = "pygments", marker = "python_full_version == '3.11.*'" },
+ { name = "requests", marker = "python_full_version == '3.11.*'" },
+ { name = "roman-numerals", marker = "python_full_version == '3.11.*'" },
+ { name = "snowballstemmer", marker = "python_full_version == '3.11.*'" },
+ { name = "sphinxcontrib-applehelp", marker = "python_full_version == '3.11.*'" },
+ { name = "sphinxcontrib-devhelp", marker = "python_full_version == '3.11.*'" },
+ { name = "sphinxcontrib-htmlhelp", marker = "python_full_version == '3.11.*'" },
+ { name = "sphinxcontrib-jsmath", marker = "python_full_version == '3.11.*'" },
+ { name = "sphinxcontrib-qthelp", marker = "python_full_version == '3.11.*'" },
+ { name = "sphinxcontrib-serializinghtml", marker = "python_full_version == '3.11.*'" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/bb/f5/7aedfbc7833b7e40c9c921c4f813e22c0abc1d8ee5f778c479c102001d7f/sphinx-9.0.1.tar.gz", hash = "sha256:c820d856657ce7cd41ce2c097f478ac3d7ddad9779ad83de4f0136a81ff388fd", size = 8708618, upload-time = "2025-12-01T16:43:36.878Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/42/50/a8c6ccc36d5eacdfd7913ddccd15a9cee03ecafc5ee2bc40e1f168d85022/sphinx-9.0.4.tar.gz", hash = "sha256:594ef59d042972abbc581d8baa577404abe4e6c3b04ef61bd7fc2acbd51f3fa3", size = 8710502, upload-time = "2025-12-04T07:45:27.343Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/f3/12/1b79cd17cca23962a4a973b04afbe7008d6bec51a9b39db1b563e63f427e/sphinx-9.0.1-py3-none-any.whl", hash = "sha256:5a9506b709d6bd3d4c3f142b5b58801c202837b54875727e3adcba98d4839735", size = 3916414, upload-time = "2025-12-01T16:43:34.706Z" },
+ { url = "https://files.pythonhosted.org/packages/c6/3f/4bbd76424c393caead2e1eb89777f575dee5c8653e2d4b6afd7a564f5974/sphinx-9.0.4-py3-none-any.whl", hash = "sha256:5bebc595a5e943ea248b99c13814c1c5e10b3ece718976824ffa7959ff95fffb", size = 3917713, upload-time = "2025-12-04T07:45:24.944Z" },
+]
+
+[[package]]
+name = "sphinx"
+version = "9.1.0"
+source = { registry = "https://pypi.org/simple" }
+resolution-markers = [
+ "python_full_version >= '3.12'",
+]
+dependencies = [
+ { name = "alabaster", marker = "python_full_version >= '3.12'" },
+ { name = "babel", marker = "python_full_version >= '3.12'" },
+ { name = "colorama", marker = "python_full_version >= '3.12' and sys_platform == 'win32'" },
+ { name = "docutils", version = "0.22.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" },
+ { name = "imagesize", marker = "python_full_version >= '3.12'" },
+ { name = "jinja2", marker = "python_full_version >= '3.12'" },
+ { name = "packaging", marker = "python_full_version >= '3.12'" },
+ { name = "pygments", marker = "python_full_version >= '3.12'" },
+ { name = "requests", marker = "python_full_version >= '3.12'" },
+ { name = "roman-numerals", marker = "python_full_version >= '3.12'" },
+ { name = "snowballstemmer", marker = "python_full_version >= '3.12'" },
+ { name = "sphinxcontrib-applehelp", marker = "python_full_version >= '3.12'" },
+ { name = "sphinxcontrib-devhelp", marker = "python_full_version >= '3.12'" },
+ { name = "sphinxcontrib-htmlhelp", marker = "python_full_version >= '3.12'" },
+ { name = "sphinxcontrib-jsmath", marker = "python_full_version >= '3.12'" },
+ { name = "sphinxcontrib-qthelp", marker = "python_full_version >= '3.12'" },
+ { name = "sphinxcontrib-serializinghtml", marker = "python_full_version >= '3.12'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/cd/bd/f08eb0f4eed5c83f1ba2a3bd18f7745a2b1525fad70660a1c00224ec468a/sphinx-9.1.0.tar.gz", hash = "sha256:7741722357dd75f8190766926071fed3bdc211c74dd2d7d4df5404da95930ddb", size = 8718324, upload-time = "2025-12-31T15:09:27.646Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/73/f7/b1884cb3188ab181fc81fa00c266699dab600f927a964df02ec3d5d1916a/sphinx-9.1.0-py3-none-any.whl", hash = "sha256:c84fdd4e782504495fe4f2c0b3413d6c2bf388589bb352d439b2a3bb99991978", size = 3921742, upload-time = "2025-12-31T15:09:25.561Z" },
]
[[package]]
@@ -2509,7 +2554,8 @@ version = "0.5.2"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" },
- { name = "sphinx", version = "9.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" },
+ { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" },
+ { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/fc/2b/a964715e7f5295f77509e59309959f4125122d648f86b4fe7d70ca1d882c/sphinx-copybutton-0.5.2.tar.gz", hash = "sha256:4cf17c82fb9646d1bc9ca92ac280813a3b605d8c421225fd9913154103ee1fbd", size = 23039, upload-time = "2023-04-14T08:10:22.998Z" }
wheels = [
@@ -2523,7 +2569,8 @@ source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "pillow" },
{ name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" },
- { name = "sphinx", version = "9.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" },
+ { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" },
+ { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/5f/14/9238ac61932299b38c20c7c37dbfe60348c0348ea4d400f9ef25875b3bf7/sphinx_gallery-0.20.0.tar.gz", hash = "sha256:70281510c6183d812d3595957005ccf555c5a793f207410f6cd16a25bf08d735", size = 473502, upload-time = "2025-12-02T15:51:37.277Z" }
wheels = [
@@ -2586,11 +2633,11 @@ wheels = [
[[package]]
name = "sqlparse"
-version = "0.5.4"
+version = "0.5.5"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/18/67/701f86b28d63b2086de47c942eccf8ca2208b3be69715a1119a4e384415a/sqlparse-0.5.4.tar.gz", hash = "sha256:4396a7d3cf1cd679c1be976cf3dc6e0a51d0111e87787e7a8d780e7d5a998f9e", size = 120112, upload-time = "2025-11-28T07:10:18.377Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/90/76/437d71068094df0726366574cf3432a4ed754217b436eb7429415cf2d480/sqlparse-0.5.5.tar.gz", hash = "sha256:e20d4a9b0b8585fdf63b10d30066c7c94c5d7a7ec47c889a2d83a3caa93ff28e", size = 120815, upload-time = "2025-12-19T07:17:45.073Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/25/70/001ee337f7aa888fb2e3f5fd7592a6afc5283adb1ed44ce8df5764070f22/sqlparse-0.5.4-py3-none-any.whl", hash = "sha256:99a9f0314977b76d776a0fcb8554de91b9bb8a18560631d6bc48721d07023dcb", size = 45933, upload-time = "2025-11-28T07:10:19.73Z" },
+ { url = "https://files.pythonhosted.org/packages/49/4b/359f28a903c13438ef59ebeee215fb25da53066db67b305c125f1c6d2a25/sqlparse-0.5.5-py3-none-any.whl", hash = "sha256:12a08b3bf3eec877c519589833aed092e2444e68240a3577e8e26148acc7b1ba", size = 46138, upload-time = "2025-12-19T07:17:46.573Z" },
]
[[package]]
@@ -2609,7 +2656,7 @@ wheels = [
[[package]]
name = "statsmodels"
-version = "0.14.5"
+version = "0.14.6"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "numpy" },
@@ -2619,26 +2666,26 @@ dependencies = [
{ name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" },
{ name = "scipy", version = "1.16.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/64/cc/8c1bf59bf8203dea1bf2ea811cfe667d7bcc6909c83d8afb02b08e30f50b/statsmodels-0.14.5.tar.gz", hash = "sha256:de260e58cccfd2ceddf835b55a357233d6ca853a1aa4f90f7553a52cc71c6ddf", size = 20525016, upload-time = "2025-07-07T12:14:23.195Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/3a/2c/55b2a5d10c1a211ecab3f792021d2581bbe1c5ca0a1059f6715dddc6899d/statsmodels-0.14.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9fc2b5cdc0c95cba894849651fec1fa1511d365e3eb72b0cc75caac44077cd48", size = 10058241, upload-time = "2025-07-07T12:13:16.286Z" },
- { url = "https://files.pythonhosted.org/packages/66/d9/6967475805de06691e951072d05e40e3f1c71b6221bb92401193ee19bd2a/statsmodels-0.14.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b8d96b0bbaeabd3a557c35cc7249baa9cfbc6dd305c32a9f2cbdd7f46c037e7f", size = 9734017, upload-time = "2025-07-07T12:05:08.498Z" },
- { url = "https://files.pythonhosted.org/packages/df/a8/803c280419a7312e2472969fe72cf461c1210a27770a662cbe3b5cd7c6fe/statsmodels-0.14.5-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:145bc39b2cb201efb6c83cc3f2163c269e63b0d4809801853dec6f440bd3bc37", size = 10459677, upload-time = "2025-07-07T14:21:51.809Z" },
- { url = "https://files.pythonhosted.org/packages/a1/25/edf20acbd670934b02cd9344e29c9a03ce040122324b3491bb075ae76b2d/statsmodels-0.14.5-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d7c14fb2617bb819fb2532e1424e1da2b98a3419a80e95f33365a72d437d474e", size = 10678631, upload-time = "2025-07-07T14:22:05.496Z" },
- { url = "https://files.pythonhosted.org/packages/64/22/8b1e38310272e766abd6093607000a81827420a3348f09eff08a9e54cbaf/statsmodels-0.14.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1e9742d8a5ac38a3bfc4b7f4b0681903920f20cbbf466d72b1fd642033846108", size = 10699273, upload-time = "2025-07-07T14:22:19.487Z" },
- { url = "https://files.pythonhosted.org/packages/d1/6f/6de51f1077b7cef34611f1d6721392ea170153251b4d977efcf6d100f779/statsmodels-0.14.5-cp310-cp310-win_amd64.whl", hash = "sha256:1cab9e6fce97caf4239cdb2df375806937da5d0b7ba2699b13af33a07f438464", size = 9644785, upload-time = "2025-07-07T12:05:20.927Z" },
- { url = "https://files.pythonhosted.org/packages/14/30/fd49902b30416b828de763e161c0d6e2cc04d119ae4fbdd3f3b43dc8f1be/statsmodels-0.14.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4b7091a8442076c708c926de3603653a160955e80a2b6d931475b7bb8ddc02e5", size = 10053330, upload-time = "2025-07-07T12:07:39.689Z" },
- { url = "https://files.pythonhosted.org/packages/ca/c1/2654541ff6f5790d01d1e5ba36405fde873f4a854f473e90b4fe56b37333/statsmodels-0.14.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:128872be8f3208f4446d91ea9e4261823902fc7997fee7e1a983eb62fd3b7c6e", size = 9735555, upload-time = "2025-07-07T12:13:28.935Z" },
- { url = "https://files.pythonhosted.org/packages/ce/da/6ebb64d0db4e86c0d2d9cde89e03247702da0ab191789f7813d4f9a348da/statsmodels-0.14.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f2ad5aee04ae7196c429df2174df232c057e478c5fa63193d01c8ec9aae04d31", size = 10307522, upload-time = "2025-07-07T14:22:32.853Z" },
- { url = "https://files.pythonhosted.org/packages/67/49/ac803ca093ec3845184a752a91cd84511245e1f97103b15cfe32794a3bb0/statsmodels-0.14.5-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f402fc793458dd6d96e099acb44cd1de1428565bf7ef3030878a8daff091f08a", size = 10474665, upload-time = "2025-07-07T14:22:46.011Z" },
- { url = "https://files.pythonhosted.org/packages/f0/c8/ae82feb00582f4814fac5d2cb3ec32f93866b413cf5878b2fe93688ec63c/statsmodels-0.14.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:26c028832730aebfbfd4e7501694e1f9ad31ec8536e776716673f4e7afd4059a", size = 10713120, upload-time = "2025-07-07T14:23:00.067Z" },
- { url = "https://files.pythonhosted.org/packages/05/ac/4276459ea71aa46e2967ea283fc88ee5631c11f29a06787e16cf4aece1b8/statsmodels-0.14.5-cp311-cp311-win_amd64.whl", hash = "sha256:ec56f771d9529cdc17ed2fb2a950d100b6e83a7c5372aae8ac5bb065c474b856", size = 9640980, upload-time = "2025-07-07T12:05:33.085Z" },
- { url = "https://files.pythonhosted.org/packages/5f/a5/fcc4f5f16355660ce7a1742e28a43e3a9391b492fc4ff29fdd6893e81c05/statsmodels-0.14.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:37e7364a39f9aa3b51d15a208c2868b90aadb8412f868530f5cba9197cb00eaa", size = 10042891, upload-time = "2025-07-07T12:13:41.671Z" },
- { url = "https://files.pythonhosted.org/packages/1c/6f/db0cf5efa48277ac6218d9b981c8fd5e63c4c43e0d9d65015fdc38eed0ef/statsmodels-0.14.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4263d7f4d0f1d5ac6eb4db22e1ee34264a14d634b9332c975c9d9109b6b46e12", size = 9698912, upload-time = "2025-07-07T12:07:54.674Z" },
- { url = "https://files.pythonhosted.org/packages/4a/93/4ddc3bc4a59c51e6a57c49df1b889882c40d9e141e855b3517f6a8de3232/statsmodels-0.14.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:86224f6e36f38486e471e75759d241fe2912d8bc25ab157d54ee074c6aedbf45", size = 10237801, upload-time = "2025-07-07T14:23:12.593Z" },
- { url = "https://files.pythonhosted.org/packages/66/de/dc6bf2f6e8c8eb4c5815560ebdbdf2d69a767bc0f65fde34bc086cf5b36d/statsmodels-0.14.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c3dd760a6fa80cd5e0371685c697bb9c2c0e6e1f394d975e596a1e6d0bbb9372", size = 10424154, upload-time = "2025-07-07T14:23:25.365Z" },
- { url = "https://files.pythonhosted.org/packages/16/4f/2d5a8d14bebdf2b03b3ea89b8c6a2c837bb406ba5b7a41add8bd303bce29/statsmodels-0.14.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6264fb00e02f858b86bd01ef2dc05055a71d4a0cc7551b9976b07b0f0e6cf24f", size = 10652915, upload-time = "2025-07-07T14:23:39.337Z" },
- { url = "https://files.pythonhosted.org/packages/df/4c/2feda3a9f0e17444a84ba5398ada6a4d2e1b8f832760048f04e2b8ea0c41/statsmodels-0.14.5-cp312-cp312-win_amd64.whl", hash = "sha256:b2ed065bfbaf8bb214c7201656df840457c2c8c65e1689e3eb09dc7440f9c61c", size = 9611236, upload-time = "2025-07-07T12:08:06.794Z" },
+sdist = { url = "https://files.pythonhosted.org/packages/0d/81/e8d74b34f85285f7335d30c5e3c2d7c0346997af9f3debf9a0a9a63de184/statsmodels-0.14.6.tar.gz", hash = "sha256:4d17873d3e607d398b85126cd4ed7aad89e4e9d89fc744cdab1af3189a996c2a", size = 20689085, upload-time = "2025-12-05T23:08:39.522Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b5/6d/9ec309a175956f88eb8420ac564297f37cf9b1f73f89db74da861052dc29/statsmodels-0.14.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f4ff0649a2df674c7ffb6fa1a06bffdb82a6adf09a48e90e000a15a6aaa734b0", size = 10142419, upload-time = "2025-12-05T19:27:35.625Z" },
+ { url = "https://files.pythonhosted.org/packages/86/8f/338c5568315ec5bf3ac7cd4b71e34b98cb3b0f834919c0c04a0762f878a1/statsmodels-0.14.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:109012088b3e370080846ab053c76d125268631410142daad2f8c10770e8e8d9", size = 10022819, upload-time = "2025-12-05T19:27:49.385Z" },
+ { url = "https://files.pythonhosted.org/packages/b0/77/5fc4cbc2d608f9b483b0675f82704a8bcd672962c379fe4d82100d388dbf/statsmodels-0.14.6-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e93bd5d220f3cb6fc5fc1bffd5b094966cab8ee99f6c57c02e95710513d6ac3f", size = 10118927, upload-time = "2025-12-05T23:07:51.256Z" },
+ { url = "https://files.pythonhosted.org/packages/94/55/b86c861c32186403fe121d9ab27bc16d05839b170d92a978beb33abb995e/statsmodels-0.14.6-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:06eec42d682fdb09fe5d70a05930857efb141754ec5a5056a03304c1b5e32fd9", size = 10413015, upload-time = "2025-12-05T23:08:53.95Z" },
+ { url = "https://files.pythonhosted.org/packages/f9/be/daf0dba729ccdc4176605f4a0fd5cfe71cdda671749dca10e74a732b8b1c/statsmodels-0.14.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0444e88557df735eda7db330806fe09d51c9f888bb1f5906cb3a61fb1a3ed4a8", size = 10441248, upload-time = "2025-12-05T23:09:09.353Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/1c/2e10b7c7cc44fa418272996bf0427b8016718fd62f995d9c1f7ab37adf35/statsmodels-0.14.6-cp310-cp310-win_amd64.whl", hash = "sha256:e83a9abe653835da3b37fb6ae04b45480c1de11b3134bd40b09717192a1456ea", size = 9583410, upload-time = "2025-12-05T19:28:02.086Z" },
+ { url = "https://files.pythonhosted.org/packages/a9/4d/df4dd089b406accfc3bb5ee53ba29bb3bdf5ae61643f86f8f604baa57656/statsmodels-0.14.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6ad5c2810fc6c684254a7792bf1cbaf1606cdee2a253f8bd259c43135d87cfb4", size = 10121514, upload-time = "2025-12-05T19:28:16.521Z" },
+ { url = "https://files.pythonhosted.org/packages/82/af/ec48daa7f861f993b91a0dcc791d66e1cf56510a235c5cbd2ab991a31d5c/statsmodels-0.14.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:341fa68a7403e10a95c7b6e41134b0da3a7b835ecff1eb266294408535a06eb6", size = 10003346, upload-time = "2025-12-05T19:28:29.568Z" },
+ { url = "https://files.pythonhosted.org/packages/a9/2c/c8f7aa24cd729970728f3f98822fb45149adc216f445a9301e441f7ac760/statsmodels-0.14.6-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bdf1dfe2a3ca56f5529118baf33a13efed2783c528f4a36409b46bbd2d9d48eb", size = 10129872, upload-time = "2025-12-05T23:09:25.724Z" },
+ { url = "https://files.pythonhosted.org/packages/40/c6/9ae8e9b0721e9b6eb5f340c3a0ce8cd7cce4f66e03dd81f80d60f111987f/statsmodels-0.14.6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3764ba8195c9baf0925a96da0743ff218067a269f01d155ca3558deed2658ca", size = 10381964, upload-time = "2025-12-05T23:09:41.326Z" },
+ { url = "https://files.pythonhosted.org/packages/28/8c/cf3d30c8c2da78e2ad1f50ade8b7fabec3ff4cdfc56fbc02e097c4577f90/statsmodels-0.14.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9e8d2e519852adb1b420e018f5ac6e6684b2b877478adf7fda2cfdb58f5acb5d", size = 10409611, upload-time = "2025-12-05T23:09:57.131Z" },
+ { url = "https://files.pythonhosted.org/packages/bf/cc/018f14ecb58c6cb89de9d52695740b7d1f5a982aa9ea312483ea3c3d5f77/statsmodels-0.14.6-cp311-cp311-win_amd64.whl", hash = "sha256:2738a00fca51196f5a7d44b06970ace6b8b30289839e4808d656f8a98e35faa7", size = 9580385, upload-time = "2025-12-05T19:28:42.778Z" },
+ { url = "https://files.pythonhosted.org/packages/25/ce/308e5e5da57515dd7cab3ec37ea2d5b8ff50bef1fcc8e6d31456f9fae08e/statsmodels-0.14.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fe76140ae7adc5ff0e60a3f0d56f4fffef484efa803c3efebf2fcd734d72ecb5", size = 10091932, upload-time = "2025-12-05T19:28:55.446Z" },
+ { url = "https://files.pythonhosted.org/packages/05/30/affbabf3c27fb501ec7b5808230c619d4d1a4525c07301074eb4bda92fa9/statsmodels-0.14.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:26d4f0ed3b31f3c86f83a92f5c1f5cbe63fc992cd8915daf28ca49be14463a1c", size = 9997345, upload-time = "2025-12-05T19:29:10.278Z" },
+ { url = "https://files.pythonhosted.org/packages/48/f5/3a73b51e6450c31652c53a8e12e24eac64e3824be816c0c2316e7dbdcb7d/statsmodels-0.14.6-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8c00a42863e4f4733ac9d078bbfad816249c01451740e6f5053ecc7db6d6368", size = 10058649, upload-time = "2025-12-05T23:10:12.775Z" },
+ { url = "https://files.pythonhosted.org/packages/81/68/dddd76117df2ef14c943c6bbb6618be5c9401280046f4ddfc9fb4596a1b8/statsmodels-0.14.6-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:19b58cf7474aa9e7e3b0771a66537148b2df9b5884fbf156096c0e6c1ff0469d", size = 10339446, upload-time = "2025-12-05T23:10:28.503Z" },
+ { url = "https://files.pythonhosted.org/packages/56/4a/dce451c74c4050535fac1ec0c14b80706d8fc134c9da22db3c8a0ec62c33/statsmodels-0.14.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:81e7dcc5e9587f2567e52deaff5220b175bf2f648951549eae5fc9383b62bc37", size = 10368705, upload-time = "2025-12-05T23:10:44.339Z" },
+ { url = "https://files.pythonhosted.org/packages/60/15/3daba2df40be8b8a9a027d7f54c8dedf24f0d81b96e54b52293f5f7e3418/statsmodels-0.14.6-cp312-cp312-win_amd64.whl", hash = "sha256:b5eb07acd115aa6208b4058211138393a7e6c2cf12b6f213ede10f658f6a714f", size = 9543991, upload-time = "2025-12-05T23:10:58.536Z" },
]
[[package]]
@@ -2760,27 +2807,27 @@ wheels = [
[[package]]
name = "ty"
-version = "0.0.8"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/72/9d/59e955cc39206a0d58df5374808785c45ec2a8a2a230eb1638fbb4fe5c5d/ty-0.0.8.tar.gz", hash = "sha256:352ac93d6e0050763be57ad1e02087f454a842887e618ec14ac2103feac48676", size = 4828477, upload-time = "2025-12-29T13:50:07.193Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/69/2b/dd61f7e50a69c72f72c625d026e9ab64a0db62b2dd32e7426b520e2429c6/ty-0.0.8-py3-none-linux_armv6l.whl", hash = "sha256:a289d033c5576fa3b4a582b37d63395edf971cdbf70d2d2e6b8c95638d1a4fcd", size = 9853417, upload-time = "2025-12-29T13:50:08.979Z" },
- { url = "https://files.pythonhosted.org/packages/90/72/3f1d3c64a049a388e199de4493689a51fc6aa5ff9884c03dea52b4966657/ty-0.0.8-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:788ea97dc8153a94e476c4d57b2551a9458f79c187c4aba48fcb81f05372924a", size = 9657890, upload-time = "2025-12-29T13:50:27.867Z" },
- { url = "https://files.pythonhosted.org/packages/71/d1/08ac676bd536de3c2baba0deb60e67b3196683a2fabebfd35659d794b5e9/ty-0.0.8-py3-none-macosx_11_0_arm64.whl", hash = "sha256:1b5f1f3d3e230f35a29e520be7c3d90194a5229f755b721e9092879c00842d31", size = 9180129, upload-time = "2025-12-29T13:50:22.842Z" },
- { url = "https://files.pythonhosted.org/packages/af/93/610000e2cfeea1875900f73a375ba917624b0a008d4b8a6c18c894c8dbbc/ty-0.0.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6da9ed377fbbcec0a3b60b2ca5fd30496e15068f47cef2344ba87923e78ba996", size = 9683517, upload-time = "2025-12-29T13:50:18.658Z" },
- { url = "https://files.pythonhosted.org/packages/05/04/bef50ba7d8580b0140be597de5cc0ba9a63abe50d3f65560235f23658762/ty-0.0.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7d0a2bdce5e701d19eb8d46d9da0fe31340f079cecb7c438f5ac6897c73fc5ba", size = 9676279, upload-time = "2025-12-29T13:50:25.207Z" },
- { url = "https://files.pythonhosted.org/packages/aa/b9/2aff1ef1f41b25898bc963173ae67fc8f04ca666ac9439a9c4e78d5cc0ff/ty-0.0.8-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef9078799d26d3cc65366e02392e2b78f64f72911b599e80a8497d2ec3117ddb", size = 10073015, upload-time = "2025-12-29T13:50:35.422Z" },
- { url = "https://files.pythonhosted.org/packages/df/0e/9feb6794b6ff0a157c3e6a8eb6365cbfa3adb9c0f7976e2abdc48615dd72/ty-0.0.8-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:54814ac39b4ab67cf111fc0a236818155cf49828976152378347a7678d30ee89", size = 10961649, upload-time = "2025-12-29T13:49:58.717Z" },
- { url = "https://files.pythonhosted.org/packages/f4/3b/faf7328b14f00408f4f65c9d01efe52e11b9bcc4a79e06187b370457b004/ty-0.0.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4baf0a80398e8b6c68fa36ff85045a50ede1906cd4edb41fb4fab46d471f1d4", size = 10676190, upload-time = "2025-12-29T13:50:01.11Z" },
- { url = "https://files.pythonhosted.org/packages/64/a5/cfeca780de7eeab7852c911c06a84615a174d23e9ae08aae42a645771094/ty-0.0.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ac8e23c3faefc579686799ef1649af8d158653169ad5c3a7df56b152781eeb67", size = 10438641, upload-time = "2025-12-29T13:50:29.664Z" },
- { url = "https://files.pythonhosted.org/packages/0e/8d/8667c7e0ac9f13c461ded487c8d7350f440cd39ba866d0160a8e1b1efd6c/ty-0.0.8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b558a647a073d0c25540aaa10f8947de826cb8757d034dd61ecf50ab8dbd77bf", size = 10214082, upload-time = "2025-12-29T13:50:31.531Z" },
- { url = "https://files.pythonhosted.org/packages/f8/11/e563229870e2c1d089e7e715c6c3b7605a34436dddf6f58e9205823020c2/ty-0.0.8-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:8c0104327bf480508bd81f320e22074477df159d9eff85207df39e9c62ad5e96", size = 9664364, upload-time = "2025-12-29T13:50:05.443Z" },
- { url = "https://files.pythonhosted.org/packages/b1/ad/05b79b778bf5237bcd7ee08763b226130aa8da872cbb151c8cfa2e886203/ty-0.0.8-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:496f1cb87261dd1a036a5609da80ee13de2e6ee4718a661bfa2afb91352fe528", size = 9679440, upload-time = "2025-12-29T13:50:11.289Z" },
- { url = "https://files.pythonhosted.org/packages/12/b5/23ba887769c4a7b8abfd1b6395947dc3dcc87533fbf86379d3a57f87ae8f/ty-0.0.8-py3-none-musllinux_1_2_i686.whl", hash = "sha256:2c488031f92a075ae39d13ac6295fdce2141164ec38c5d47aa8dc24ee3afa37e", size = 9808201, upload-time = "2025-12-29T13:50:21.003Z" },
- { url = "https://files.pythonhosted.org/packages/f8/90/5a82ac0a0707db55376922aed80cd5fca6b2e6d6e9bcd8c286e6b43b4084/ty-0.0.8-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:90d6f08c5982fa3e802b8918a32e326153519077b827f91c66eea4913a86756a", size = 10313262, upload-time = "2025-12-29T13:50:03.306Z" },
- { url = "https://files.pythonhosted.org/packages/14/f7/ff97f37f0a75db9495ddbc47738ec4339837867c4bfa145bdcfbd0d1eb2f/ty-0.0.8-py3-none-win32.whl", hash = "sha256:d7f460ad6fc9325e9cc8ea898949bbd88141b4609d1088d7ede02ce2ef06e776", size = 9254675, upload-time = "2025-12-29T13:50:33.35Z" },
- { url = "https://files.pythonhosted.org/packages/af/51/eba5d83015e04630002209e3590c310a0ff1d26e1815af204a322617a42e/ty-0.0.8-py3-none-win_amd64.whl", hash = "sha256:1641fb8dedc3d2da43279d21c3c7c1f80d84eae5c264a1e8daa544458e433c19", size = 10131382, upload-time = "2025-12-29T13:50:13.719Z" },
- { url = "https://files.pythonhosted.org/packages/38/1c/0d8454ff0f0f258737ecfe84f6e508729191d29663b404832f98fa5626b7/ty-0.0.8-py3-none-win_arm64.whl", hash = "sha256:ec74f022f315bede478ecae1277a01ab618e6500c1d68450d7883f5cd6ed554a", size = 9636374, upload-time = "2025-12-29T13:50:16.344Z" },
+version = "0.0.9"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/19/7b/4f677c622d58563c593c32081f8a8572afd90e43dc15b0dedd27b4305038/ty-0.0.9.tar.gz", hash = "sha256:83f980c46df17586953ab3060542915827b43c4748a59eea04190c59162957fe", size = 4858642, upload-time = "2026-01-05T12:24:56.528Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/3f/3f/c1ee119738b401a8081ff84341781122296b66982e5982e6f162d946a1ff/ty-0.0.9-py3-none-linux_armv6l.whl", hash = "sha256:dd270d4dd6ebeb0abb37aee96cbf9618610723677f500fec1ba58f35bfa8337d", size = 9763596, upload-time = "2026-01-05T12:24:37.43Z" },
+ { url = "https://files.pythonhosted.org/packages/63/41/6b0669ef4cd806d4bd5c30263e6b732a362278abac1bc3a363a316cde896/ty-0.0.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:debfb2ba418b00e86ffd5403cb666b3f04e16853f070439517dd1eaaeeff9255", size = 9591514, upload-time = "2026-01-05T12:24:26.891Z" },
+ { url = "https://files.pythonhosted.org/packages/02/a1/874aa756aee5118e690340a771fb9ded0d0c2168c0b7cc7d9561c2a750b0/ty-0.0.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:107c76ebb05a13cdb669172956421f7ffd289ad98f36d42a44a465588d434d58", size = 9097773, upload-time = "2026-01-05T12:24:14.442Z" },
+ { url = "https://files.pythonhosted.org/packages/32/62/cb9a460cf03baab77b3361d13106b93b40c98e274d07c55f333ce3c716f6/ty-0.0.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6868ca5c87ca0caa1b3cb84603c767356242b0659b88307eda69b2fb0bfa416b", size = 9581824, upload-time = "2026-01-05T12:24:35.074Z" },
+ { url = "https://files.pythonhosted.org/packages/5a/97/633ecb348c75c954f09f8913669de8c440b13b43ea7d214503f3f1c4bb60/ty-0.0.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d14a4aa0eb5c1d3591c2adbdda4e44429a6bb5d2e298a704398bb2a7ccdafdfe", size = 9591050, upload-time = "2026-01-05T12:24:08.804Z" },
+ { url = "https://files.pythonhosted.org/packages/6f/e6/4b0c6a7a8a234e2113f88c80cc7aaa9af5868de7a693859f3c49da981934/ty-0.0.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01bd4466504cefa36b465c6608e9af4504415fa67f6affc01c7d6ce36663c7f4", size = 10018262, upload-time = "2026-01-05T12:24:53.791Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/97/076d72a028f6b31e0b87287aa27c5b71a2f9927ee525260ea9f2f56828b8/ty-0.0.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:76c8253d1b30bc2c3eaa1b1411a1c34423decde0f4de0277aa6a5ceacfea93d9", size = 10911642, upload-time = "2026-01-05T12:24:48.264Z" },
+ { url = "https://files.pythonhosted.org/packages/3f/5a/705d6a5ed07ea36b1f23592c3f0dbc8fc7649267bfbb3bf06464cdc9a98a/ty-0.0.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8992fa4a9c6a5434eae4159fdd4842ec8726259bfd860e143ab95d078de6f8e3", size = 10632468, upload-time = "2026-01-05T12:24:24.118Z" },
+ { url = "https://files.pythonhosted.org/packages/44/78/4339a254537488d62bf392a936b3ec047702c0cc33d6ce3a5d613f275cd0/ty-0.0.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c79d503d151acb4a145a3d98702d07cb641c47292f63e5ffa0151e4020a5d33", size = 10273422, upload-time = "2026-01-05T12:24:45.8Z" },
+ { url = "https://files.pythonhosted.org/packages/90/40/e7f386e87c9abd3670dcee8311674d7e551baa23b2e4754e2405976e6c92/ty-0.0.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7a7ebf89ed276b564baa1f0dd9cd708e7b5aa89f19ce1b2f7d7132075abf93e", size = 10120289, upload-time = "2026-01-05T12:24:17.424Z" },
+ { url = "https://files.pythonhosted.org/packages/f7/46/1027442596e725c50d0d1ab5179e9fa78a398ab412994b3006d0ee0899c7/ty-0.0.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:ae3866e50109d2400a886bb11d9ef607f23afc020b226af773615cf82ae61141", size = 9566657, upload-time = "2026-01-05T12:24:51.048Z" },
+ { url = "https://files.pythonhosted.org/packages/56/be/df921cf1967226aa01690152002b370a7135c6cced81e86c12b86552cdc4/ty-0.0.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:185244a5eacfcd8f5e2d85b95e4276316772f1e586520a6cb24aa072ec1bac26", size = 9610334, upload-time = "2026-01-05T12:24:20.334Z" },
+ { url = "https://files.pythonhosted.org/packages/ac/e8/f085268860232cc92ebe95415e5c8640f7f1797ac3a49ddd137c6222924d/ty-0.0.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:f834ff27d940edb24b2e86bbb3fb45ab9e07cf59ca8c5ac615095b2542786408", size = 9726701, upload-time = "2026-01-05T12:24:29.785Z" },
+ { url = "https://files.pythonhosted.org/packages/42/b4/9394210c66041cd221442e38f68a596945103d9446ece505889ffa9b3da9/ty-0.0.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:773f4b3ba046de952d7c1ad3a2c09b24f3ed4bc8342ae3cbff62ebc14aa6d48c", size = 10227082, upload-time = "2026-01-05T12:24:40.132Z" },
+ { url = "https://files.pythonhosted.org/packages/dc/9f/75951eb573b473d35dd9570546fc1319f7ca2d5b5c50a5825ba6ea6cb33a/ty-0.0.9-py3-none-win32.whl", hash = "sha256:1f20f67e373038ff20f36d5449e787c0430a072b92d5933c5b6e6fc79d3de4c8", size = 9176458, upload-time = "2026-01-05T12:24:32.559Z" },
+ { url = "https://files.pythonhosted.org/packages/9b/80/b1cdf71ac874e72678161e25e2326a7d30bc3489cd3699561355a168e54f/ty-0.0.9-py3-none-win_amd64.whl", hash = "sha256:2c415f3bbb730f8de2e6e0b3c42eb3a91f1b5fbbcaaead2e113056c3b361c53c", size = 10040479, upload-time = "2026-01-05T12:24:42.697Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/8f/abc75c4bb774b12698629f02d0d12501b0a7dff9c31dc3bd6b6c6467e90a/ty-0.0.9-py3-none-win_arm64.whl", hash = "sha256:48e339d794542afeed710ea4f846ead865cc38cecc335a9c781804d02eaa2722", size = 9543127, upload-time = "2026-01-05T12:24:11.731Z" },
]
[[package]]
@@ -2794,11 +2841,11 @@ wheels = [
[[package]]
name = "tzdata"
-version = "2025.2"
+version = "2025.3"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload-time = "2025-03-23T13:54:43.652Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/5e/a7/c202b344c5ca7daf398f3b8a477eeb205cf3b6f32e7ec3a6bac0629ca975/tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7", size = 196772, upload-time = "2025-12-13T17:45:35.667Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" },
+ { url = "https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1", size = 348521, upload-time = "2025-12-13T17:45:33.889Z" },
]
[[package]]
@@ -2815,11 +2862,11 @@ wheels = [
[[package]]
name = "urllib3"
-version = "2.5.0"
+version = "2.6.2"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/1e/24/a2a2ed9addd907787d7aa0355ba36a6cadf1768b934c652ea78acbd59dcd/urllib3-2.6.2.tar.gz", hash = "sha256:016f9c98bb7e98085cb2b4b17b87d2c702975664e4f060c6532e64d1c1a5e797", size = 432930, upload-time = "2025-12-11T15:56:40.252Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" },
+ { url = "https://files.pythonhosted.org/packages/6d/b9/4095b668ea3678bf6a0af005527f39de12fb026516fb3df17495a733b7f8/urllib3-2.6.2-py3-none-any.whl", hash = "sha256:ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd", size = 131182, upload-time = "2025-12-11T15:56:38.584Z" },
]
[[package]]
@@ -2836,28 +2883,28 @@ wheels = [
[[package]]
name = "uv"
-version = "0.9.14"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/93/77/36977111f1a7a6625ba432959958d284124d5cda678b703b77f1e1c8e8b8/uv-0.9.14.tar.gz", hash = "sha256:e62ae030bb607abe9c2d6d2569c696804fa668a3b176d7cce20cfa1c66012855", size = 3766833, upload-time = "2025-12-01T17:22:51.155Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/1e/f8/05876ea28ef1edd4a4dbcd5c9e44daa7d056bad25b0f114305a49457baa7/uv-0.9.14-py3-none-linux_armv6l.whl", hash = "sha256:876d0cf2a92113e1237ef71a7dc21e2cc82ab0664f98004d61abeb05c944ffd2", size = 20844416, upload-time = "2025-12-01T17:22:42.25Z" },
- { url = "https://files.pythonhosted.org/packages/67/c0/c88a40306b2d437704e25f19890da1f6f9b42cbe1695de0373e3ca1258d8/uv-0.9.14-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:e14853fb7781251f75cbb200fa2a81f2ac087a7f0647ee8699689198d6496f05", size = 19981109, upload-time = "2025-12-01T17:22:07.422Z" },
- { url = "https://files.pythonhosted.org/packages/f0/65/6ba20daba11fc88d41cb03fe903d8440618f6033fba511f34c7bd9df02ad/uv-0.9.14-py3-none-macosx_11_0_arm64.whl", hash = "sha256:dd90bc5e364a2fdc89499de9c1cffe9036b0318e54644b5664a9c395bb21bb29", size = 18469837, upload-time = "2025-12-01T17:22:19.014Z" },
- { url = "https://files.pythonhosted.org/packages/e9/a1/245dfacce0e2755b82b00dc5fbaea4a690e3fb7046a779c1fd719896f04b/uv-0.9.14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:c086218fe1f3f88281d2f881bbeb5ada062eb4ea5d28292f352e45de38aa125a", size = 20347846, upload-time = "2025-12-01T17:22:35.144Z" },
- { url = "https://files.pythonhosted.org/packages/03/0d/9314fd85e8ab574c9433b014d49fe233cd8e0ae38274cc5716a9f8291f5e/uv-0.9.14-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6dc4d37a593e2843df96a32be4cdab682e7abb15552c967277ac29fe8e556cdb", size = 20441070, upload-time = "2025-12-01T17:22:46.793Z" },
- { url = "https://files.pythonhosted.org/packages/b2/e9/1eab4b0e3b7eb6823a927a86bf34e3e0086c6321d794da4fafc1e168373c/uv-0.9.14-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7770890958273fe5f6222857be0981e06808f531a2d28cc8da5907b3036fa7dd", size = 21636744, upload-time = "2025-12-01T17:22:28.272Z" },
- { url = "https://files.pythonhosted.org/packages/4f/ca/3a25e8bce4402d410bdbe5dc327eb9cf1e441f29cde73a7838816b23a14b/uv-0.9.14-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:2a1724160ab2429317ab7d340f95d34c93a4830fef7f2d952795754837fb2e2c", size = 23033527, upload-time = "2025-12-01T17:22:30.643Z" },
- { url = "https://files.pythonhosted.org/packages/39/44/c3e3ac7e80de643aa34fc70661f668a121fb48cc515e0a263daaf24e92cb/uv-0.9.14-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:180496428c669244e6af4b4b05f3c450d7976367b4907312d609890a2ee03be5", size = 22666761, upload-time = "2025-12-01T17:22:13.771Z" },
- { url = "https://files.pythonhosted.org/packages/b9/c7/14eddd397d6333673b1dc15f4f13548afae191b3dbf5a40d25bbf12c2789/uv-0.9.14-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:144bad91b4c4efd7104e219beab4a238ccf560a87323128f0d6471b85c08915e", size = 21653308, upload-time = "2025-12-01T17:22:21.358Z" },
- { url = "https://files.pythonhosted.org/packages/38/9e/0ddb21e94fc7fd67547e74aa0cbb042d57f52fe283f3d517d1a8c9e5df66/uv-0.9.14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b5a27f528af437d9cd7bd85905095f166d0c37bdf3404a8a900948068e03d6b", size = 21690920, upload-time = "2025-12-01T17:22:32.777Z" },
- { url = "https://files.pythonhosted.org/packages/17/35/44a7aeafc1cc9b1ec55ab433bed0211c34ca77f230853735c6c8d8683783/uv-0.9.14-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:cbf18113f0e07898af804f6f4a9ef521eb181865a94b7d162431dcae5b55f8fa", size = 20467749, upload-time = "2025-12-01T17:22:11.23Z" },
- { url = "https://files.pythonhosted.org/packages/dd/f8/6b087904c897f2e96c69c9386fdefbd6c5fdeecab6624c5e972a0e31dd91/uv-0.9.14-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:18231f386e3f153e9560f535bd224b618f4990c4f417504f915fe95fc5513448", size = 21513786, upload-time = "2025-12-01T17:22:25.953Z" },
- { url = "https://files.pythonhosted.org/packages/a1/4b/1959897d40affc078eca5812db6bdef0a331e594e8907d336db2e90d0252/uv-0.9.14-py3-none-musllinux_1_1_armv7l.whl", hash = "sha256:e2cd3e885e4c30048f9c2c526bd340f6e082ca5fb6bf4516c90671a114746fc3", size = 20406081, upload-time = "2025-12-01T17:22:23.66Z" },
- { url = "https://files.pythonhosted.org/packages/c7/ce/e7e27f7891e38c98f5c83b3c8068c6265f5dc96c12924f2a0fc31b4eb7ac/uv-0.9.14-py3-none-musllinux_1_1_i686.whl", hash = "sha256:da227183ab9860832533e7f152a83d0d749f8d0156348b68f48773d42f690ff1", size = 20965537, upload-time = "2025-12-01T17:22:16.582Z" },
- { url = "https://files.pythonhosted.org/packages/71/44/b9cdb4137338b33a419ff4aff70ac00df4a5a68e1b9bd21a59f96caf6c6f/uv-0.9.14-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:70a55f189b2d9ec035194c927f2c0b4f746b251e329a5dc8391ab6a41fe14e1a", size = 21919764, upload-time = "2025-12-01T17:22:37.369Z" },
- { url = "https://files.pythonhosted.org/packages/66/57/2e294c6d758b48883434ad979e089cfe5ec87584ec7ffee005be359f6035/uv-0.9.14-py3-none-win32.whl", hash = "sha256:06923d5ee88b50dabb364c4fcc2a0de84e079b6a2fb6cc6ca318e74e979affed", size = 19742562, upload-time = "2025-12-01T17:22:49.106Z" },
- { url = "https://files.pythonhosted.org/packages/f0/2f/81d551db61228adb062ff29dec7634d82091e38f579d56ed27db40bd300e/uv-0.9.14-py3-none-win_amd64.whl", hash = "sha256:c0f18fd246726cdc194357aca50fd13153d719daecd765049f0ff4c2262143d3", size = 21655524, upload-time = "2025-12-01T17:22:39.643Z" },
- { url = "https://files.pythonhosted.org/packages/ef/91/deb722a8ddb076018aee02ab3bffcdda6f10b7ca96f72aeca06b5efaccec/uv-0.9.14-py3-none-win_arm64.whl", hash = "sha256:d974fcbec84aa7eb4ee1cc7e650a5b8973895a03f6d6f0c61b488e1d1b8179ea", size = 20121260, upload-time = "2025-12-01T17:22:44.502Z" },
+version = "0.9.22"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/a4/e1/298ce517fa2dbe54e0ec8e126c22fe66adedc3aaaba3e5d3c056d62a4d64/uv-0.9.22.tar.gz", hash = "sha256:41c73a4938818ede30e601cd0be87953e5c6a83dc4762e04e626f2eb9b240ebe", size = 3835119, upload-time = "2026-01-06T10:49:35.192Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/53/09/37811eeabacd13c7fe9b6604d967e417124794d42b45d8469d2f421edc10/uv-0.9.22-py3-none-linux_armv6l.whl", hash = "sha256:1f979c9d313b4616d9865859ef520bea5df0d4f15c57214589f5676fafa440c1", size = 21319484, upload-time = "2026-01-06T10:49:42.435Z" },
+ { url = "https://files.pythonhosted.org/packages/5e/68/bb76c97c284ce7fb8efa868994c2510588faa7075e60d8865d1373e54b7b/uv-0.9.22-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b78f2605d65c4925631d891dec99b677b05f50c774dedc6ef8968039a5bcfdb0", size = 20446647, upload-time = "2026-01-06T10:49:13.942Z" },
+ { url = "https://files.pythonhosted.org/packages/af/49/7230b1d56aeaee0eefd346a70f582463f11fb7036d2d020bcf68053bd994/uv-0.9.22-py3-none-macosx_11_0_arm64.whl", hash = "sha256:2a4155cf7d0231d0adae94257ee10d70c57c2f592207536ddd55d924590a8c15", size = 18967861, upload-time = "2026-01-06T10:49:26.026Z" },
+ { url = "https://files.pythonhosted.org/packages/70/cf/7b33e791c0cb63587bb1f03f067764fc681c0d1693a6b9a2670ef2f8a4e9/uv-0.9.22-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:0d8f007616cac5962620252b56a1d8224e9b2de566e78558efe04cc18526d507", size = 20807382, upload-time = "2026-01-06T10:49:28.37Z" },
+ { url = "https://files.pythonhosted.org/packages/e3/72/5486eab5344a30257544b42dd15e85d5de2ff7fab952a7a6e21cc946efae/uv-0.9.22-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3b2bcce464186f8fafa3bf2aa5d82db4e3229366345399cc3f5bcafd616b8fe0", size = 20914561, upload-time = "2026-01-06T10:49:08.996Z" },
+ { url = "https://files.pythonhosted.org/packages/90/67/974adc8fd1baace83efaa2409dd19e60accfbca25c473ed9af8e8188484d/uv-0.9.22-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3422b093b8e6e8de31261133b420c34dbef81f3fd1d82f787ac771b00b54adf8", size = 21996463, upload-time = "2026-01-06T10:49:16.587Z" },
+ { url = "https://files.pythonhosted.org/packages/99/7a/ef06158af9141e3b526bcb84ecd84fd1eed7eabf64bc830f302796af8646/uv-0.9.22-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:b807bafe6b65fc1fe9c65ffd0d4228db894872de96e7200c44943f24beb68931", size = 23547447, upload-time = "2026-01-06T10:49:44.84Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/d7/b7f389311777403ea5230eb816b2aca159980cb8a3de5b9adb53cf19aa2e/uv-0.9.22-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:369b55341c6236f42d8fc335876308e5c57c921850975b3019cc9f7ebbe31567", size = 23159198, upload-time = "2026-01-06T10:49:39.938Z" },
+ { url = "https://files.pythonhosted.org/packages/e5/cc/64514ba1102f24cbcb6eed39b22fe6fd04297ce1068552ae3c5fae63725b/uv-0.9.22-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0cdc653fb601aa7f273242823fa93024f5fd319c66cdf22f36d784858493564c", size = 22147053, upload-time = "2026-01-06T10:49:19.094Z" },
+ { url = "https://files.pythonhosted.org/packages/40/15/63fb7a6908db2f03716c4a50aea7e27a7440fe6a09854282c401139afaf7/uv-0.9.22-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f45e1e0f26dd47fa01eb421c54cfd39de10fd52ac0a9d7ae45b92fce7d92b0b", size = 22225812, upload-time = "2026-01-06T10:49:48.109Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/fe/def406c118ac215f4c392b077fb75303d125310cf178774a728e5759d9eb/uv-0.9.22-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:8f73043ade8ff6335e19fe1f4e7425d5e28aec9cafd72d13d5b40bb1cbb85690", size = 20933749, upload-time = "2026-01-06T10:49:23.817Z" },
+ { url = "https://files.pythonhosted.org/packages/7f/45/27464cf8697f31858084c9c3f716b3c39d3f9a2a8e30c8a58dbd1a519e24/uv-0.9.22-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:59c4f6b3659a68c26c50865432a7134386f607432160aad51e2247f862902697", size = 22080639, upload-time = "2026-01-06T10:49:21.521Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/9a/7008f6aad89442ef00735b4f4c8d86eaaeaa7392f4dec814469d212eb462/uv-0.9.22-py3-none-musllinux_1_1_armv7l.whl", hash = "sha256:77ec4c101d41d7738226466191a7d62f9fa4de06ea580e0801da2f5cd5fa08aa", size = 20894483, upload-time = "2026-01-06T10:49:37.201Z" },
+ { url = "https://files.pythonhosted.org/packages/fe/97/74b4c782d410e5f891446d1d27107b0312fae0e83c7be2edf6867c408f81/uv-0.9.22-py3-none-musllinux_1_1_i686.whl", hash = "sha256:b1985559b38663642658069e8d09fa6c30ed1c67654b7e5765240d9e4e9cdd57", size = 21453244, upload-time = "2026-01-06T10:49:52.878Z" },
+ { url = "https://files.pythonhosted.org/packages/01/17/b3055b9f82f87a727ed5f745aadda9c363d2e2dd180f99350431e98c0ad4/uv-0.9.22-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:e4b61a9c8b8dcbf64e642d2052342d36a46886b8bc3ccc407282962b970101af", size = 22446527, upload-time = "2026-01-06T10:49:50.59Z" },
+ { url = "https://files.pythonhosted.org/packages/2d/39/03ed466a5afb8bfc104096bb577b26ed7e413177fee699c756916ab35ef5/uv-0.9.22-py3-none-win32.whl", hash = "sha256:d9d4be990bb92a68781f7c98d2321b528667b61d565c02ba978488c0210aa768", size = 20088632, upload-time = "2026-01-06T10:49:11.725Z" },
+ { url = "https://files.pythonhosted.org/packages/32/49/9e3e19ba756c4a5e6acb4ea74336d3035f7959254fbb05f5eb77bff067ed/uv-0.9.22-py3-none-win_amd64.whl", hash = "sha256:9c238525272506845fe07c0b9088c5e33fcd738e1f49ef49dc3c8112096d2e3a", size = 22160389, upload-time = "2026-01-06T10:49:32.826Z" },
+ { url = "https://files.pythonhosted.org/packages/79/78/4a10b718290eb6b9ab436286420c430f9ad7afa0c1b03c43692d6289fe2f/uv-0.9.22-py3-none-win_arm64.whl", hash = "sha256:012bdc5285a9cdb091ac514b7eb8a707e3b649af5355fe4afb4920bfe1958c00", size = 20556116, upload-time = "2026-01-06T10:49:30.493Z" },
]
[[package]]
From 8e07d7e11d22338e9131995c4c906fe83c2d437b Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Tue, 6 Jan 2026 20:08:51 +0000
Subject: [PATCH 33/38] Expand ty type checking to include both src/ and tests/
directories
Co-authored-by: viseshrp <11642379+viseshrp@users.noreply.github.com>
---
.pre-commit-config.yaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 69b7fe6b41..46b3136a05 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -53,7 +53,7 @@ repos:
hooks:
- id: ty
name: ty
- entry: ty check src/
+ entry: ty check src/ tests/
language: python
types: [ python ]
pass_filenames: false
From 405016340069c5b9b75c7916977a51f7cdb14325 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Tue, 6 Jan 2026 20:36:27 +0000
Subject: [PATCH 34/38] Fix initial type errors in tests/ - conftest.py
Generator types and Path conversions (7/114 fixed)
Co-authored-by: viseshrp <11642379+viseshrp@users.noreply.github.com>
---
tests/conftest.py | 8 +++++---
tests/serverless/conftest.py | 8 ++++----
2 files changed, 9 insertions(+), 7 deletions(-)
diff --git a/tests/conftest.py b/tests/conftest.py
index b0fd1ac33b..13eee242e9 100755
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -1,5 +1,6 @@
"""Global fixtures go here."""
+from collections.abc import Generator
from pathlib import Path
from random import randint
from uuid import uuid4
@@ -23,7 +24,7 @@ def get_exec(pytestconfig: pytest.Config) -> str:
@pytest.fixture(scope="module")
-def adr_service_create(pytestconfig: pytest.Config) -> Service:
+def adr_service_create(pytestconfig: pytest.Config) -> Generator[Service, None, None]:
use_local = pytestconfig.getoption("use_local_launcher")
# Paths setup
@@ -55,7 +56,7 @@ def adr_service_create(pytestconfig: pytest.Config) -> Service:
@pytest.fixture(scope="module")
-def adr_service_query(pytestconfig: pytest.Config) -> Service:
+def adr_service_query(pytestconfig: pytest.Config) -> Generator[Service, None, None]:
use_local = pytestconfig.getoption("use_local_launcher")
# Paths setup
@@ -77,7 +78,8 @@ def adr_service_query(pytestconfig: pytest.Config) -> Service:
data_directory=str(tmp_docker_dir),
port=8000 + randint(0, 3999),
)
- adr_service._docker_launcher.save_config()
+ assert adr_service._docker_launcher is not None # type: ignore[attr-defined]
+ adr_service._docker_launcher.save_config() # type: ignore[attr-defined]
adr_service.start(create_db=False, exit_on_close=True, delete_db=False)
diff --git a/tests/serverless/conftest.py b/tests/serverless/conftest.py
index 1f18e80696..125ad3ec17 100644
--- a/tests/serverless/conftest.py
+++ b/tests/serverless/conftest.py
@@ -21,8 +21,8 @@ def adr_init(pytestconfig: pytest.Config) -> ADR:
media_dir.mkdir(exist_ok=True)
adr = ADR(
ansys_installation=pytestconfig.getoption("install_path"),
- db_directory=local_db,
- static_directory=static_dir,
+ db_directory=str(local_db),
+ static_directory=str(static_dir),
media_url="/media/",
static_url="/static/",
)
@@ -52,8 +52,8 @@ def adr_init(pytestconfig: pytest.Config) -> ADR:
ansys_installation="docker",
docker_image=DOCKER_DEV_REPO_URL,
databases=database_config,
- media_directory=source_db / "media",
- static_directory=static_dir,
+ media_directory=str(source_db / "media"),
+ static_directory=str(static_dir),
media_url="/media/",
static_url="/static/",
)
From 91347c19480127e719cd40b5a535c3482179b43f Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Tue, 6 Jan 2026 20:53:00 +0000
Subject: [PATCH 35/38] Fix all type errors in 4 test files:
test_report_remote_server.py (29), test_service.py (16),
serverless/test_item.py (16), test_encoders.py (12) - 73/114 fixed
Co-authored-by: viseshrp <11642379+viseshrp@users.noreply.github.com>
---
tests/serverless/test_item.py | 32 +++++++--------
tests/test_encoders.py | 12 +++---
tests/test_report_remote_server.py | 62 +++++++++++++++++-------------
tests/test_service.py | 34 ++++++++--------
4 files changed, 74 insertions(+), 66 deletions(-)
diff --git a/tests/serverless/test_item.py b/tests/serverless/test_item.py
index 738f3c67d3..b61c9e6b53 100644
--- a/tests/serverless/test_item.py
+++ b/tests/serverless/test_item.py
@@ -366,7 +366,7 @@ def test_integrity_error(adr_serverless):
session=adr_serverless.session,
dataset=adr_serverless.dataset,
)
- with pytest.raises(HTML.IntegrityError):
+ with pytest.raises(HTML.IntegrityError): # type: ignore[attr-defined]
HTML.create(
guid=intro_html.guid,
name="test_integrity_error",
@@ -386,7 +386,7 @@ def test_delete_not_saved(adr_serverless):
session=adr_serverless.session,
dataset=adr_serverless.dataset,
)
- with pytest.raises(HTML.NotSaved):
+ with pytest.raises(HTML.NotSaved): # type: ignore[attr-defined]
intro_html.delete()
@@ -441,7 +441,7 @@ def test_save_item_session_unsaved(adr_serverless):
session=session,
dataset=adr_serverless.dataset,
)
- with pytest.raises(Session.NotSaved):
+ with pytest.raises(Session.NotSaved): # type: ignore[attr-defined]
intro_html.save()
@@ -456,7 +456,7 @@ def test_save_item_dataset_unsaved(adr_serverless):
session=adr_serverless.session,
dataset=dataset,
)
- with pytest.raises(Dataset.NotSaved):
+ with pytest.raises(Dataset.NotSaved): # type: ignore[attr-defined]
intro_html.save()
@@ -508,7 +508,7 @@ def test_item_delete(adr_serverless):
dataset=adr_serverless.dataset,
)
intro_html.delete()
- with pytest.raises(HTML.DoesNotExist):
+ with pytest.raises(HTML.DoesNotExist): # type: ignore[attr-defined]
HTML.get(guid=intro_html.guid)
@@ -516,7 +516,7 @@ def test_item_delete(adr_serverless):
def test_get_item_does_not_exist(adr_serverless):
from ansys.dynamicreporting.core.serverless import HTML
- with pytest.raises(HTML.DoesNotExist):
+ with pytest.raises(HTML.DoesNotExist): # type: ignore[attr-defined]
HTML.get(guid=str(uuid4()))
@@ -536,7 +536,7 @@ def test_get_item_multiple(adr_serverless):
session=adr_serverless.session,
dataset=adr_serverless.dataset,
).save()
- with pytest.raises(HTML.MultipleObjectsReturned):
+ with pytest.raises(HTML.MultipleObjectsReturned): # type: ignore[attr-defined]
HTML.get(name="test_get_item_multiple")
@@ -586,7 +586,7 @@ def test_item_objectset_delete(adr_serverless):
)
objs = adr_serverless.query(query_type=HTML, query="A|i_name|cont|test_item_objectset_delete;")
objs.delete()
- with pytest.raises(HTML.DoesNotExist):
+ with pytest.raises(HTML.DoesNotExist): # type: ignore[attr-defined]
HTML.get(guid=intro_html.guid)
@@ -783,15 +783,15 @@ def test_table_item_properties(adr_serverless):
)
# Set real properties
- table_item.labels_row = ["X", "Sin", "Cos"]
+ table_item.labels_row = ["X", "Sin", "Cos"] # type: ignore[attr-defined]
table_item.set_tags("dp=dp227 section=data")
- table_item.plot = "line"
- table_item.xaxis = "X"
- table_item.yaxis = ["Sin", "Cos"]
- table_item.xaxis_format = "floatdot0"
- table_item.yaxis_format = "floatdot1"
- table_item.ytitle = "Values"
- table_item.xtitle = "X"
+ table_item.plot = "line" # type: ignore[attr-defined]
+ table_item.xaxis = "X" # type: ignore[attr-defined]
+ table_item.yaxis = ["Sin", "Cos"] # type: ignore[attr-defined]
+ table_item.xaxis_format = "floatdot0" # type: ignore[attr-defined]
+ table_item.yaxis_format = "floatdot1" # type: ignore[attr-defined]
+ table_item.ytitle = "Values" # type: ignore[attr-defined]
+ table_item.xtitle = "X" # type: ignore[attr-defined]
table_item.save()
diff --git a/tests/test_encoders.py b/tests/test_encoders.py
index b02884960f..1ce148fd3f 100755
--- a/tests/test_encoders.py
+++ b/tests/test_encoders.py
@@ -11,37 +11,37 @@
@pytest.mark.ado_test
def test_payload() -> None:
b = en.PayloaddataEncoder()
- res = b.default(obj=ru.nexus_array())
+ res = b.default(ru.nexus_array())
assert res == [[0.0]]
@pytest.mark.ado_test
def test_base_datetime() -> None:
a = en.BaseEncoder()
- assert a.default(obj=datetime.datetime(year=2023, month=4, day=10)) == "2023-04-10T00:00:00"
+ assert a.default(datetime.datetime(year=2023, month=4, day=10)) == "2023-04-10T00:00:00"
@pytest.mark.ado_test
def test_uuid() -> None:
a = en.PayloaddataEncoder()
- assert type(a.default(obj=uuid.uuid1())) is str
+ assert type(a.default(uuid.uuid1())) is str
@pytest.mark.ado_test
def test_bytes() -> None:
a = en.BaseEncoder()
mystr = "aa"
- assert a.default(obj=mystr.encode()) == mystr
+ assert a.default(mystr.encode()) == mystr
@pytest.mark.ado_test
def test_dict() -> None:
a = en.BaseEncoder()
mydict = {"a": 1}
- assert a.default(obj=mydict) == mydict
+ assert a.default(mydict) == mydict
@pytest.mark.ado_test
def test_nparray() -> None:
a = en.PayloaddataEncoder()
- assert isinstance(a.default(obj=np.ndarray(shape=(1, 1))), list)
+ assert isinstance(a.default(np.ndarray(shape=(1, 1))), list)
diff --git a/tests/test_report_remote_server.py b/tests/test_report_remote_server.py
index bc90906c18..15469a201f 100755
--- a/tests/test_report_remote_server.py
+++ b/tests/test_report_remote_server.py
@@ -37,7 +37,8 @@ def test_copy_item(adr_service_query, tmp_path, get_exec) -> None:
tmp_adr.start(create_db=True, exit_on_close=True, delete_db=True)
try:
s = tmp_adr.serverobj
- success = s.copy_items(
+ assert s is not None
+ success = s.copy_items( # type: ignore[attr-defined]
source=adr_service_query.serverobj,
obj_type="item",
progress=False,
@@ -276,11 +277,14 @@ def test_export_pdf(adr_service_query, get_exec) -> None:
s = adr_service_query.serverobj
if exec_basis:
if environ.get("ANSYS_REL_INT_I"):
- ansys_version = int(environ.get("ANSYS_REL_INT_I"))
+ ansys_rel = environ.get("ANSYS_REL_INT_I")
+ assert ansys_rel is not None
+ ansys_version = int(ansys_rel)
else:
import re
matches = re.search(r".*v([0-9]{3}).*", exec_basis)
+ assert matches is not None
ansys_version = int(matches.group(1))
s.export_report_as_pdf(
report_guid=my_report.report.guid,
@@ -310,11 +314,14 @@ def test_export_pdf_with_filter(adr_service_query, get_exec) -> None:
s = adr_service_query.serverobj
if exec_basis:
if environ.get("ANSYS_REL_INT_I"):
- ansys_version = int(environ.get("ANSYS_REL_INT_I"))
+ ansys_rel = environ.get("ANSYS_REL_INT_I")
+ assert ansys_rel is not None
+ ansys_version = int(ansys_rel)
else:
import re
matches = re.search(r".*v([0-9]{3}).*", exec_basis)
+ assert matches is not None
ansys_version = int(matches.group(1))
s.export_report_as_pdf(
report_guid=my_report.report.guid,
@@ -380,7 +387,8 @@ def test_copy_template(adr_service_query, tmp_path, get_exec) -> None:
)
tmp_adr.start(create_db=True, exit_on_close=True, delete_db=True)
s = tmp_adr.serverobj
- succ = s.copy_items(
+ assert s is not None
+ succ = s.copy_items( # type: ignore[attr-defined]
source=adr_service_query.serverobj, obj_type="template", progress=False, progress_qt=False
)
tmp_adr.stop()
@@ -432,7 +440,7 @@ def test_acls_start(tmp_path, get_exec) -> None:
@pytest.mark.ado_test
-def test_get_templates_as_dict(adr_service_create) -> bool:
+def test_get_templates_as_dict(adr_service_create) -> None:
server = adr_service_create.serverobj
# Level 0
@@ -501,7 +509,7 @@ def test_load_templates_from_file(adr_service_create) -> None:
@pytest.mark.ado_test
-def test_load_templates(adr_service_create) -> bool:
+def test_load_templates(adr_service_create) -> None:
server = adr_service_create.serverobj
templates_json = {
"Template_0": {
@@ -573,7 +581,7 @@ def test_load_templates(adr_service_create) -> bool:
@pytest.mark.ado_test
-def test_check_templates_id_name(adr_service_create) -> bool:
+def test_check_templates_id_name(adr_service_create) -> None:
server = adr_service_create.serverobj
templates_json = {
"WRONG_NAME": { # Error
@@ -626,7 +634,7 @@ def test_check_templates_id_name(adr_service_create) -> bool:
@pytest.mark.ado_test
-def test_check_templates_parent_name(adr_service_create) -> bool:
+def test_check_templates_parent_name(adr_service_create) -> None:
server = adr_service_create.serverobj
templates_json = {
"Template_0": {
@@ -684,7 +692,7 @@ def test_check_templates_parent_name(adr_service_create) -> bool:
@pytest.mark.ado_test
-def test_check_templates_children_name(adr_service_create) -> bool:
+def test_check_templates_children_name(adr_service_create) -> None:
server = adr_service_create.serverobj
templates_json = {
"Template_0": {
@@ -740,7 +748,7 @@ def test_check_templates_children_name(adr_service_create) -> bool:
@pytest.mark.ado_test
-def test_check_templates_missing_necessary_key(adr_service_create) -> bool:
+def test_check_templates_missing_necessary_key(adr_service_create) -> None:
server = adr_service_create.serverobj
templates_json = {
"Template_0": {
@@ -810,7 +818,7 @@ def get_recent_warnings(self):
@pytest.mark.ado_test
-def test_check_templates_extra_keys_with_logger(adr_service_create) -> bool:
+def test_check_templates_extra_keys_with_logger(adr_service_create) -> None:
server = adr_service_create.serverobj
templates_json = {
"Template_0": {
@@ -872,7 +880,7 @@ def test_check_templates_extra_keys_with_logger(adr_service_create) -> bool:
@pytest.mark.ado_test
-def test_check_templates_report_type(adr_service_create) -> bool:
+def test_check_templates_report_type(adr_service_create) -> None:
server = adr_service_create.serverobj
templates_json = {
"Template_0": {
@@ -924,7 +932,7 @@ def test_check_templates_report_type(adr_service_create) -> bool:
@pytest.mark.ado_test
-def test_check_templates_item_filter_parts(adr_service_create) -> bool:
+def test_check_templates_item_filter_parts(adr_service_create) -> None:
server = adr_service_create.serverobj
templates_json = {
"Template_0": {
@@ -979,7 +987,7 @@ def test_check_templates_item_filter_parts(adr_service_create) -> bool:
@pytest.mark.ado_test
-def test_check_templates_item_filter_part0(adr_service_create) -> bool:
+def test_check_templates_item_filter_part0(adr_service_create) -> None:
server = adr_service_create.serverobj
templates_json = {
"Template_0": {
@@ -1034,7 +1042,7 @@ def test_check_templates_item_filter_part0(adr_service_create) -> bool:
@pytest.mark.ado_test
-def test_check_templates_item_filter_part1(adr_service_create) -> bool:
+def test_check_templates_item_filter_part1(adr_service_create) -> None:
server = adr_service_create.serverobj
templates_json = {
"Template_0": {
@@ -1089,7 +1097,7 @@ def test_check_templates_item_filter_part1(adr_service_create) -> bool:
@pytest.mark.ado_test
-def test_put_objects_bad_request_tmp_name(adr_service_create) -> bool:
+def test_put_objects_bad_request_tmp_name(adr_service_create) -> None:
server = adr_service_create.serverobj
test_template = server.create_template(name="testing" * 255, report_type="Layout:box")
with pytest.raises(
@@ -1099,7 +1107,7 @@ def test_put_objects_bad_request_tmp_name(adr_service_create) -> bool:
@pytest.mark.ado_test
-def test_put_objects_bad_request_tmp_tags(adr_service_create) -> bool:
+def test_put_objects_bad_request_tmp_tags(adr_service_create) -> None:
server = adr_service_create.serverobj
test_template = server.create_template(name="testing", report_type="Layout:box")
test_template.tags = "testing" * 256
@@ -1110,7 +1118,7 @@ def test_put_objects_bad_request_tmp_tags(adr_service_create) -> bool:
@pytest.mark.ado_test
-def test_put_objects_bad_request_tmp_item_filter(adr_service_create) -> bool:
+def test_put_objects_bad_request_tmp_item_filter(adr_service_create) -> None:
server = adr_service_create.serverobj
test_template = server.create_template(name="testing", report_type="Layout:box")
test_template.item_filter = "testing" * 1024
@@ -1121,7 +1129,7 @@ def test_put_objects_bad_request_tmp_item_filter(adr_service_create) -> bool:
@pytest.mark.ado_test
-def test_put_objects_bad_request_itm_name(adr_service_create) -> bool:
+def test_put_objects_bad_request_itm_name(adr_service_create) -> None:
server = adr_service_create.serverobj
test_item = server.create_item(name="testing" * 255)
with pytest.raises(
@@ -1131,7 +1139,7 @@ def test_put_objects_bad_request_itm_name(adr_service_create) -> bool:
@pytest.mark.ado_test
-def test_put_objects_bad_request_itm_source(adr_service_create) -> bool:
+def test_put_objects_bad_request_itm_source(adr_service_create) -> None:
server = adr_service_create.serverobj
test_item = server.create_item(name="testing")
test_item.source = "testing" * 80
@@ -1142,7 +1150,7 @@ def test_put_objects_bad_request_itm_source(adr_service_create) -> bool:
@pytest.mark.ado_test
-def test_put_objects_bad_request_itm_type(adr_service_create) -> bool:
+def test_put_objects_bad_request_itm_type(adr_service_create) -> None:
server = adr_service_create.serverobj
test_item = server.create_item(name="testing")
test_item.type = "testing" * 16
@@ -1153,7 +1161,7 @@ def test_put_objects_bad_request_itm_type(adr_service_create) -> bool:
@pytest.mark.ado_test
-def test_put_objects_bad_request_ds_filename(adr_service_create) -> bool:
+def test_put_objects_bad_request_ds_filename(adr_service_create) -> None:
server = adr_service_create.serverobj
test_dataset = server.get_default_dataset()
test_dataset.filename = "testing" * 256
@@ -1164,7 +1172,7 @@ def test_put_objects_bad_request_ds_filename(adr_service_create) -> bool:
@pytest.mark.ado_test
-def test_put_objects_bad_request_ds_dirname(adr_service_create) -> bool:
+def test_put_objects_bad_request_ds_dirname(adr_service_create) -> None:
server = adr_service_create.serverobj
test_dataset = server.get_default_dataset()
test_dataset.dirname = "testing" * 256
@@ -1175,7 +1183,7 @@ def test_put_objects_bad_request_ds_dirname(adr_service_create) -> bool:
@pytest.mark.ado_test
-def test_put_objects_bad_request_ds_format(adr_service_create) -> bool:
+def test_put_objects_bad_request_ds_format(adr_service_create) -> None:
server = adr_service_create.serverobj
test_dataset = server.get_default_dataset()
test_dataset.format = "testing" * 50
@@ -1186,7 +1194,7 @@ def test_put_objects_bad_request_ds_format(adr_service_create) -> bool:
@pytest.mark.ado_test
-def test_put_objects_bad_request_se_hostname(adr_service_create) -> bool:
+def test_put_objects_bad_request_se_hostname(adr_service_create) -> None:
server = adr_service_create.serverobj
test_session = server.get_default_session()
test_session.hostname = "testing" * 50
@@ -1197,7 +1205,7 @@ def test_put_objects_bad_request_se_hostname(adr_service_create) -> bool:
@pytest.mark.ado_test
-def test_put_objects_bad_request_se_platform(adr_service_create) -> bool:
+def test_put_objects_bad_request_se_platform(adr_service_create) -> None:
server = adr_service_create.serverobj
test_session = server.get_default_session()
test_session.platform = "testing" * 50
@@ -1208,7 +1216,7 @@ def test_put_objects_bad_request_se_platform(adr_service_create) -> bool:
@pytest.mark.ado_test
-def test_put_objects_bad_request_se_application(adr_service_create) -> bool:
+def test_put_objects_bad_request_se_application(adr_service_create) -> None:
server = adr_service_create.serverobj
test_session = server.get_default_session()
test_session.application = "testing" * 40
diff --git a/tests/test_service.py b/tests/test_service.py
index 27b6b7aed0..6261b2e2b8 100755
--- a/tests/test_service.py
+++ b/tests/test_service.py
@@ -36,7 +36,7 @@ def test_unit_nexus() -> None:
@pytest.mark.ado_test
def test_unit_nexus_nosession() -> None:
logfile = Path(__file__).parent / "outfile7.txt"
- a = Service(logfile=logfile)
+ a = Service(logfile=str(logfile))
success = False
try:
_ = a.session_guid
@@ -48,7 +48,7 @@ def test_unit_nexus_nosession() -> None:
@pytest.mark.ado_test
def test_unit_nodbpath() -> None:
logfile = Path(__file__).parent / "outfile8.txt"
- a = Service(logfile=logfile, db_directory="aaa")
+ a = Service(logfile=str(logfile), db_directory="aaa")
success = False
try:
_ = a.start(create_db=True)
@@ -60,7 +60,7 @@ def test_unit_nodbpath() -> None:
@pytest.mark.ado_test
def test_unit_nexus_stop() -> None:
logfile = Path(__file__).parent / "outfile.txt"
- a = Service(logfile=logfile)
+ a = Service(logfile=str(logfile))
a.stop()
f = open(logfile)
assert "Error validating the connected service" in f.read()
@@ -69,7 +69,7 @@ def test_unit_nexus_stop() -> None:
@pytest.mark.ado_test
def test_unit_nexus_connect() -> None:
logfile = Path(__file__).parent / "outfile_2.txt"
- a = Service(logfile=logfile)
+ a = Service(logfile=str(logfile))
success = False
try:
a.connect(url=f"http://localhost:{8000 + randint(0, 3999)}")
@@ -101,11 +101,11 @@ def test_unit_query() -> None:
@pytest.mark.ado_test
def test_unit_delete_invalid() -> None:
logfile = Path(__file__).parent / "outfile_4.txt"
- a = Service(logfile=logfile)
+ a = Service(logfile=str(logfile))
a.serverobj = report_remote_server.Server()
success = False
try:
- a.delete("aa")
+ a.delete(["aa"])
except TypeError:
success = True
assert success
@@ -122,7 +122,7 @@ def test_unit_delete() -> None:
@pytest.mark.ado_test
def test_unit_get_report() -> None:
logfile = Path(__file__).parent / "outfile_5.txt"
- a = Service(logfile=logfile)
+ a = Service(logfile=str(logfile))
success = False
try:
_ = a.get_report(report_name="Abc")
@@ -134,7 +134,7 @@ def test_unit_get_report() -> None:
@pytest.mark.ado_test
def test_unit_get_listreport() -> None:
logfile = Path(__file__).parent / "outfile_9.txt"
- a = Service(logfile=logfile)
+ a = Service(logfile=str(logfile))
success = False
try:
_ = a.get_list_reports()
@@ -187,10 +187,10 @@ def test_connect_to_connected(adr_service_create) -> None:
def test_create_on_existing(get_exec) -> None:
db_dir = Path(__file__).parent / "test_data" / "query_db"
if get_exec != "":
- tmp_adr = Service(ansys_installation=get_exec, db_directory=db_dir)
+ tmp_adr = Service(ansys_installation=get_exec, db_directory=str(db_dir))
else:
tmp_adr = Service(
- ansys_installation="docker", docker_image=DOCKER_DEV_REPO_URL, db_directory=db_dir
+ ansys_installation="docker", docker_image=DOCKER_DEV_REPO_URL, db_directory=str(db_dir)
)
success = False
try:
@@ -206,13 +206,13 @@ def test_stop_before_starting(get_exec) -> None:
if get_exec != "":
tmp_adr = Service(
ansys_installation=get_exec,
- db_directory=db_dir,
+ db_directory=str(db_dir),
)
else:
tmp_adr = Service(
ansys_installation="docker",
docker_image=DOCKER_DEV_REPO_URL,
- db_directory=db_dir,
+ db_directory=str(db_dir),
)
success = tmp_adr.stop()
assert success is None
@@ -316,13 +316,13 @@ def test_vis_not_running(get_exec) -> None:
if get_exec != "":
tmp_adr = Service(
ansys_installation=get_exec,
- db_directory=db_dir,
+ db_directory=str(db_dir),
)
else:
tmp_adr = Service(
ansys_installation="docker",
docker_image=DOCKER_DEV_REPO_URL,
- db_directory=db_dir,
+ db_directory=str(db_dir),
)
tmp_adr.visualize_report()
except ConnectionToServiceError:
@@ -347,13 +347,13 @@ def test_connect_to_running(adr_service_query, get_exec) -> None:
if get_exec != "":
tmp_adr = Service(
ansys_installation=get_exec,
- db_directory=db_dir,
+ db_directory=str(db_dir),
)
else:
tmp_adr = Service(
ansys_installation="docker",
docker_image=DOCKER_DEV_REPO_URL,
- db_directory=db_dir,
+ db_directory=str(db_dir),
)
tmp_adr.connect(url=adr_service_query.url, session=adr_service_query.session_guid)
all_items_second = tmp_adr.query(query_type="Item")
@@ -391,7 +391,7 @@ def test_same_port(tmp_path, get_exec) -> None:
db_dir = tmp_path / "sameport"
db_dir_again = tmp_path / "sameport_again"
if get_exec != "":
- a = Service(ansys_installation=get_exec, logfile=logfile, db_directory=db_dir)
+ a = Service(ansys_installation=get_exec, logfile=logfile, db_directory=str(db_dir))
b = Service(
ansys_installation=get_exec, logfile=logfile, db_directory=db_dir_again, port=a._port
)
From df4849f4ce623e8eedf03a2cccde44b65779cbbf Mon Sep 17 00:00:00 2001
From: Copilot <198982749+Copilot@users.noreply.github.com>
Date: Wed, 7 Jan 2026 11:22:16 -0500
Subject: [PATCH 36/38] Fix type errors in test files for ty type checker
(#471)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Resolved 33 type errors across 6 test files preventing clean ty type
checker runs.
## Changes by file
**tests/serverless/test_template.py** (10 errors)
- Added `# type: ignore[attr-defined]` for dynamic properties
(`input_pptx`, `output_pptx`, `use_all_slides`) accessed via
`_properties` tuple pattern
- Added `# type: ignore[attr-defined]` for dynamically injected
exception classes (`NotSaved`, `DoesNotExist`,
`MultipleObjectsReturned`)
- Added `# type: ignore[arg-type]` for test intentionally passing wrong
type to trigger TypeError
**tests/test_enhanced_images.py** (8 errors)
- Added `# type: ignore[possibly-missing-attr]` for functions
conditionally defined behind `if HAS_VTK and HAS_DPF` guard
**tests/test_report_objects.py** (7 errors)
- Added `# type: ignore[arg-type]` for tests validating error handling
with intentionally incorrect argument types
**tests/test_report_utils.py** (5 errors)
- Converted `range()` to `list()` for `avoid` parameter type compliance
- Added None-checks before `len()` calls on functions returning
`list[int] | None`
**tests/test_filelock.py** (2 errors)
- Added `# type: ignore[assignment]` for platform-specific module
imports fallback to None
**tests/test_item.py** (1 error)
- Corrected return type annotation from `-> bool` to `-> None`
Example pattern used:
```python
# Before
with pytest.raises(PanelLayout.DoesNotExist):
PanelLayout.get(guid=str(uuid4()))
# After
with pytest.raises(PanelLayout.DoesNotExist): # type: ignore[attr-defined]
PanelLayout.get(guid=str(uuid4()))
```
Original prompt
> fix type errors in these files now after running pre-commit and
checking the output:
>
> serverless/test_template.py (10 errors)
> test_enhanced_images.py (8 errors)
> test_report_objects.py (7 errors)
> test_report_utils.py (5 errors)
> test_filelock.py (2 errors)
> test_item.py (1 error)