This is an automated email from the ASF dual-hosted git repository.

sbp pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tooling-atr-experiments.git

commit 0e7b26ae6603fad59465ce2233f6475d9e72be48
Author: Sean B. Palmer <s...@miscoranda.com>
AuthorDate: Wed Feb 12 19:43:51 2025 +0200

    Add and satisfy mypy checks
---
 .pre-commit-config.yaml       | 73 ++++++++++++++++++++++++-------------------
 atr/routes.py                 |  3 ++
 atr/server.py                 |  2 ++
 migrations/env.py             | 10 +++---
 poetry.lock                   | 67 ++++++++++++++++++++++++++++++++++++++-
 pyproject.toml                | 24 +++++++++++++-
 scripts/generate-certificates |  2 +-
 scripts/poetry/sync           |  1 +
 scripts/poetry/sync-dev       |  1 +
 typestubs/asfquart/utils.pyi  |  4 +--
 uv.lock                       | 52 +++++++++++++-----------------
 11 files changed, 165 insertions(+), 74 deletions(-)

diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 5d9b086..02e2036 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1,35 +1,42 @@
 exclude: '^(asfquart)'
 repos:
-  - repo: https://github.com/pre-commit/pre-commit-hooks
-    rev: v5.0.0
-    hooks:
-      - id: check-toml
-      - id: check-yaml
-      - id: end-of-file-fixer
-      - id: mixed-line-ending
-      - id: trailing-whitespace
-  - repo: https://github.com/Lucas-C/pre-commit-hooks
-    rev: v1.5.5
-    hooks:
-      - id: insert-license
-        name: Add license for all Python files
-        files: ^atr/.*\.py$|^atr/.*\.pyi$
-        args:
-          - --comment-style
-          - "|#|"
-          - --license-filepath
-          - LICENSE-template.txt
-          - --fuzzy-match-generates-todo
-  - repo: https://github.com/astral-sh/ruff-pre-commit
-    rev: v0.9.6
-    hooks:
-      - id: ruff
-        args: [--fix]
-      - id: ruff-format
-  - repo: local
-    hooks:
-      - id: pyright
-        name: Pyright Type Check
-        entry: pyright
-        language: system
-        types: [python]
+- repo: https://github.com/pre-commit/pre-commit-hooks
+  rev: v5.0.0
+  hooks:
+    - id: check-toml
+    - id: check-yaml
+    - id: end-of-file-fixer
+    - id: mixed-line-ending
+    - id: trailing-whitespace
+- repo: https://github.com/Lucas-C/pre-commit-hooks
+  rev: v1.5.5
+  hooks:
+    - id: insert-license
+      name: Add license for all Python files
+      files: ^atr/.*\.py$|^atr/.*\.pyi$
+      args:
+        - --comment-style
+        - "|#|"
+        - --license-filepath
+        - LICENSE-template.txt
+        - --fuzzy-match-generates-todo
+- repo: https://github.com/astral-sh/ruff-pre-commit
+  rev: v0.9.6
+  hooks:
+    - id: ruff
+      args: [--fix]
+    - id: ruff-format
+- repo: local
+  hooks:
+    - id: mypy
+      name: Mypy Type Check
+      entry: mypy
+      language: system
+      types: [python]
+      args:
+        - --config-file=pyproject.toml
+    - id: pyright
+      name: Pyright Type Check
+      entry: pyright
+      language: system
+      types: [python]
diff --git a/atr/routes.py b/atr/routes.py
index 306ca88..d4bf0e3 100644
--- a/atr/routes.py
+++ b/atr/routes.py
@@ -27,6 +27,9 @@ from sqlalchemy.exc import IntegrityError
 from asfquart import APP
 from .models import PMC
 
+if APP is ...:
+    raise ValueError("APP is not set")
+
 
 @APP.route("/")
 async def root() -> str:
diff --git a/atr/server.py b/atr/server.py
index 7c492e8..79d98e4 100644
--- a/atr/server.py
+++ b/atr/server.py
@@ -37,6 +37,8 @@ def register_routes() -> str:
 
 
 def create_app() -> QuartApp:
+    if asfquart.construct is ...:
+        raise ValueError("asfquart.construct is not set")
     app = asfquart.construct(__name__)
 
     @app.before_serving
diff --git a/migrations/env.py b/migrations/env.py
index 50fbe3e..ecabd18 100644
--- a/migrations/env.py
+++ b/migrations/env.py
@@ -66,11 +66,11 @@ def run_migrations_online() -> None:
     # Cast to the correct type for type checker
     configuration = cast(Dict[str, Any], configuration)
 
-    # Add SQLite-specific connect args
-    configuration["sqlalchemy.connect_args"] = {
-        "check_same_thread": False,
-        "timeout": 30,
-    }
+    # # Add SQLite-specific connect args
+    # configuration["sqlalchemy.connect_args"] = {
+    #     "check_same_thread": False,
+    #     "timeout": 30,
+    # }
 
     connectable = engine_from_config(
         configuration,
diff --git a/poetry.lock b/poetry.lock
index 3528862..eff2582 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1259,6 +1259,71 @@ files = [
     {file = "multidict-6.1.0.tar.gz", hash = 
"sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a"},
 ]
 
+[[package]]
+name = "mypy"
+version = "1.15.0"
+description = "Optional static typing for Python"
+optional = false
+python-versions = ">=3.9"
+groups = ["dev"]
+files = [
+    {file = "mypy-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = 
"sha256:979e4e1a006511dacf628e36fadfecbcc0160a8af6ca7dad2f5025529e082c13"},
+    {file = "mypy-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = 
"sha256:c4bb0e1bd29f7d34efcccd71cf733580191e9a264a2202b0239da95984c5b559"},
+    {file = 
"mypy-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl",
 hash = 
"sha256:be68172e9fd9ad8fb876c6389f16d1c1b5f100ffa779f77b1fb2176fcc9ab95b"},
+    {file = 
"mypy-1.15.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl",
 hash = 
"sha256:c7be1e46525adfa0d97681432ee9fcd61a3964c2446795714699a998d193f1a3"},
+    {file = "mypy-1.15.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = 
"sha256:2e2c2e6d3593f6451b18588848e66260ff62ccca522dd231cd4dd59b0160668b"},
+    {file = "mypy-1.15.0-cp310-cp310-win_amd64.whl", hash = 
"sha256:6983aae8b2f653e098edb77f893f7b6aca69f6cffb19b2cc7443f23cce5f4828"},
+    {file = "mypy-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = 
"sha256:2922d42e16d6de288022e5ca321cd0618b238cfc5570e0263e5ba0a77dbef56f"},
+    {file = "mypy-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = 
"sha256:2ee2d57e01a7c35de00f4634ba1bbf015185b219e4dc5909e281016df43f5ee5"},
+    {file = 
"mypy-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl",
 hash = 
"sha256:973500e0774b85d9689715feeffcc980193086551110fd678ebe1f4342fb7c5e"},
+    {file = 
"mypy-1.15.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl",
 hash = 
"sha256:5a95fb17c13e29d2d5195869262f8125dfdb5c134dc8d9a9d0aecf7525b10c2c"},
+    {file = "mypy-1.15.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = 
"sha256:1905f494bfd7d85a23a88c5d97840888a7bd516545fc5aaedff0267e0bb54e2f"},
+    {file = "mypy-1.15.0-cp311-cp311-win_amd64.whl", hash = 
"sha256:c9817fa23833ff189db061e6d2eff49b2f3b6ed9856b4a0a73046e41932d744f"},
+    {file = "mypy-1.15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = 
"sha256:aea39e0583d05124836ea645f412e88a5c7d0fd77a6d694b60d9b6b2d9f184fd"},
+    {file = "mypy-1.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = 
"sha256:2f2147ab812b75e5b5499b01ade1f4a81489a147c01585cda36019102538615f"},
+    {file = 
"mypy-1.15.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl",
 hash = 
"sha256:ce436f4c6d218a070048ed6a44c0bbb10cd2cc5e272b29e7845f6a2f57ee4464"},
+    {file = 
"mypy-1.15.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl",
 hash = 
"sha256:8023ff13985661b50a5928fc7a5ca15f3d1affb41e5f0a9952cb68ef090b31ee"},
+    {file = "mypy-1.15.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = 
"sha256:1124a18bc11a6a62887e3e137f37f53fbae476dc36c185d549d4f837a2a6a14e"},
+    {file = "mypy-1.15.0-cp312-cp312-win_amd64.whl", hash = 
"sha256:171a9ca9a40cd1843abeca0e405bc1940cd9b305eaeea2dda769ba096932bb22"},
+    {file = "mypy-1.15.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = 
"sha256:93faf3fdb04768d44bf28693293f3904bbb555d076b781ad2530214ee53e3445"},
+    {file = "mypy-1.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = 
"sha256:811aeccadfb730024c5d3e326b2fbe9249bb7413553f15499a4050f7c30e801d"},
+    {file = 
"mypy-1.15.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl",
 hash = 
"sha256:98b7b9b9aedb65fe628c62a6dc57f6d5088ef2dfca37903a7d9ee374d03acca5"},
+    {file = 
"mypy-1.15.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl",
 hash = 
"sha256:c43a7682e24b4f576d93072216bf56eeff70d9140241f9edec0c104d0c515036"},
+    {file = "mypy-1.15.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = 
"sha256:baefc32840a9f00babd83251560e0ae1573e2f9d1b067719479bfb0e987c6357"},
+    {file = "mypy-1.15.0-cp313-cp313-win_amd64.whl", hash = 
"sha256:b9378e2c00146c44793c98b8d5a61039a048e31f429fb0eb546d93f4b000bedf"},
+    {file = "mypy-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = 
"sha256:e601a7fa172c2131bff456bb3ee08a88360760d0d2f8cbd7a75a65497e2df078"},
+    {file = "mypy-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = 
"sha256:712e962a6357634fef20412699a3655c610110e01cdaa6180acec7fc9f8513ba"},
+    {file = 
"mypy-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl",
 hash = 
"sha256:f95579473af29ab73a10bada2f9722856792a36ec5af5399b653aa28360290a5"},
+    {file = 
"mypy-1.15.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl",
 hash = 
"sha256:8f8722560a14cde92fdb1e31597760dc35f9f5524cce17836c0d22841830fd5b"},
+    {file = "mypy-1.15.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = 
"sha256:1fbb8da62dc352133d7d7ca90ed2fb0e9d42bb1a32724c287d3c76c58cbaa9c2"},
+    {file = "mypy-1.15.0-cp39-cp39-win_amd64.whl", hash = 
"sha256:d10d994b41fb3497719bbf866f227b3489048ea4bbbb5015357db306249f7980"},
+    {file = "mypy-1.15.0-py3-none-any.whl", hash = 
"sha256:5469affef548bd1895d86d3bf10ce2b44e33d86923c29e4d675b3e323437ea3e"},
+    {file = "mypy-1.15.0.tar.gz", hash = 
"sha256:404534629d51d3efea5c800ee7c42b72a6554d6c400e6a79eafe15d11341fd43"},
+]
+
+[package.dependencies]
+mypy_extensions = ">=1.0.0"
+typing_extensions = ">=4.6.0"
+
+[package.extras]
+dmypy = ["psutil (>=4.0)"]
+faster-cache = ["orjson"]
+install-types = ["pip"]
+mypyc = ["setuptools (>=50)"]
+reports = ["lxml"]
+
+[[package]]
+name = "mypy-extensions"
+version = "1.0.0"
+description = "Type system extensions for programs checked with the mypy type 
checker."
+optional = false
+python-versions = ">=3.5"
+groups = ["dev"]
+files = [
+    {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = 
"sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"},
+    {file = "mypy_extensions-1.0.0.tar.gz", hash = 
"sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"},
+]
+
 [[package]]
 name = "nodeenv"
 version = "1.9.1"
@@ -2228,4 +2293,4 @@ propcache = ">=0.2.0"
 [metadata]
 lock-version = "2.1"
 python-versions = "~=3.13"
-content-hash = 
"8803ad19e1c904a2febb6798ee32748142d1a22f836ec7e4553f4bc3709952ff"
+content-hash = 
"0f091d55acfd7f3269b025aa80eadad13ff6b281f8c72c7cdd229d207f0b609d"
diff --git a/pyproject.toml b/pyproject.toml
index 01f8e75..82b1887 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -18,9 +18,10 @@ dependencies = [
 
 [dependency-groups]
 dev = [
+  "mypy>=1.15.0",
   "pre-commit>=2.20.0",
   "pyright>=1.1.393",
-  "ruff>=0.9.4"
+  "ruff>=0.9.4",
 ]
 
 # Other configuration
@@ -32,6 +33,7 @@ package-mode = false
 pre-commit = ">=2.20.0"
 pyright = ">=1.1.393"
 ruff = ">=0.9.4"
+mypy = "^1.15.0"
 
 [tool.poetry.group.main.dependencies]
 alembic = "~=1.14"
@@ -61,3 +63,23 @@ exclude = ["asfquart"]
 
 [tool.uv.sources]
 asfquart = { path = "./asfquart", editable = true }
+
+[tool.mypy]
+python_version = "3.13"
+exclude = ["asfquart"]
+mypy_path = "typestubs"
+check_untyped_defs = true
+disallow_incomplete_defs = true
+disallow_untyped_decorators = true
+disallow_untyped_defs = true
+ignore_missing_imports = true
+no_implicit_optional = true
+strict_optional = true
+warn_redundant_casts = true
+warn_return_any = true
+# warn_unreachable = true
+warn_unused_ignores = true
+
+[[tool.mypy.overrides]]
+module = "asfquart.*"
+ignore_errors = true
diff --git a/scripts/generate-certificates b/scripts/generate-certificates
index 6a6cf71..951c646 100755
--- a/scripts/generate-certificates
+++ b/scripts/generate-certificates
@@ -14,7 +14,7 @@ CERT_PATH = os.path.join(STATE_DIR, "cert.pem")
 KEY_PATH = os.path.join(STATE_DIR, "key.pem")
 
 
-def generate_self_signed_cert():
+def generate_self_signed_cert() -> None:
     # Ensure the state directory exists
     os.makedirs(STATE_DIR, exist_ok=True)
 
diff --git a/scripts/poetry/sync b/scripts/poetry/sync
index d369982..44f31ba 100755
--- a/scripts/poetry/sync
+++ b/scripts/poetry/sync
@@ -2,4 +2,5 @@
 set -eu
 _python="$(which python3)"
 poetry env use "${1:-$_python}"
+poetry lock
 poetry sync --only main
diff --git a/scripts/poetry/sync-dev b/scripts/poetry/sync-dev
index e775baf..876f894 100755
--- a/scripts/poetry/sync-dev
+++ b/scripts/poetry/sync-dev
@@ -2,6 +2,7 @@
 set -eu
 _python="$(which python3)"
 poetry env use "${1:-$_python}"
+poetry lock
 poetry sync
 cat <<EOF > .vscode/settings.json
 {
diff --git a/typestubs/asfquart/utils.pyi b/typestubs/asfquart/utils.pyi
index fa76e04..28e53e7 100644
--- a/typestubs/asfquart/utils.pyi
+++ b/typestubs/asfquart/utils.pyi
@@ -16,8 +16,8 @@ class FilenameConverter(werkzeug.routing.BaseConverter):
     """Simple converter that splits a filename into a basename and an 
extension. Only deals with filenames, not
     full paths. Thus, <filename> will match foo.txt, but not /foo/bar.baz"""
 
-    regex = ...
-    part_isolating = ...
+    regex: str = ...
+    part_isolating: bool = ...
     def to_python(self, filename):  # -> tuple[Any, Any]:
         ...
 
diff --git a/uv.lock b/uv.lock
index 36f3397..597cff8 100644
--- a/uv.lock
+++ b/uv.lock
@@ -167,26 +167,6 @@ wheels = [
     { url = 
"https://files.pythonhosted.org/packages/fc/30/d4986a882011f9df997a55e6becd864812ccfcd821d64aac8570ee39f719/attrs-25.1.0-py3-none-any.whl";,
 hash = 
"sha256:c75a69e28a550a7e93789579c22aa26b0f5b83b75dc4e08fe092980051e1090a", size 
= 63152 },
 ]
 
-[[package]]
-name = "black"
-version = "25.1.0"
-source = { registry = "https://pypi.org/simple"; }
-dependencies = [
-    { name = "click" },
-    { name = "mypy-extensions" },
-    { name = "packaging" },
-    { name = "pathspec" },
-    { name = "platformdirs" },
-]
-sdist = { url = 
"https://files.pythonhosted.org/packages/94/49/26a7b0f3f35da4b5a65f081943b7bcd22d7002f5f0fb8098ec1ff21cb6ef/black-25.1.0.tar.gz";,
 hash = 
"sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666", size 
= 649449 }
-wheels = [
-    { url = 
"https://files.pythonhosted.org/packages/98/87/0edf98916640efa5d0696e1abb0a8357b52e69e82322628f25bf14d263d1/black-25.1.0-cp313-cp313-macosx_10_13_x86_64.whl";,
 hash = 
"sha256:8f0b18a02996a836cc9c9c78e5babec10930862827b1b724ddfe98ccf2f2fe4f", size 
= 1650673 },
-    { url = 
"https://files.pythonhosted.org/packages/52/e5/f7bf17207cf87fa6e9b676576749c6b6ed0d70f179a3d812c997870291c3/black-25.1.0-cp313-cp313-macosx_11_0_arm64.whl";,
 hash = 
"sha256:afebb7098bfbc70037a053b91ae8437c3857482d3a690fefc03e9ff7aa9a5fd3", size 
= 1453190 },
-    { url = 
"https://files.pythonhosted.org/packages/e3/ee/adda3d46d4a9120772fae6de454c8495603c37c4c3b9c60f25b1ab6401fe/black-25.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl";,
 hash = 
"sha256:030b9759066a4ee5e5aca28c3c77f9c64789cdd4de8ac1df642c40b708be6171", size 
= 1782926 },
-    { url = 
"https://files.pythonhosted.org/packages/cc/64/94eb5f45dcb997d2082f097a3944cfc7fe87e071907f677e80788a2d7b7a/black-25.1.0-cp313-cp313-win_amd64.whl";,
 hash = 
"sha256:a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18", size 
= 1442613 },
-    { url = 
"https://files.pythonhosted.org/packages/09/71/54e999902aed72baf26bca0d50781b01838251a462612966e9fc4891eadd/black-25.1.0-py3-none-any.whl";,
 hash = 
"sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717", size 
= 207646 },
-]
-
 [[package]]
 name = "blinker"
 version = "1.9.0"
@@ -607,6 +587,25 @@ wheels = [
     { url = 
"https://files.pythonhosted.org/packages/99/b7/b9e70fde2c0f0c9af4cc5277782a89b66d35948ea3369ec9f598358c3ac5/multidict-6.1.0-py3-none-any.whl";,
 hash = 
"sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506", size 
= 10051 },
 ]
 
+[[package]]
+name = "mypy"
+version = "1.15.0"
+source = { registry = "https://pypi.org/simple"; }
+dependencies = [
+    { name = "mypy-extensions" },
+    { name = "typing-extensions" },
+]
+sdist = { url = 
"https://files.pythonhosted.org/packages/ce/43/d5e49a86afa64bd3839ea0d5b9c7103487007d728e1293f52525d6d5486a/mypy-1.15.0.tar.gz";,
 hash = 
"sha256:404534629d51d3efea5c800ee7c42b72a6554d6c400e6a79eafe15d11341fd43", size 
= 3239717 }
+wheels = [
+    { url = 
"https://files.pythonhosted.org/packages/6a/9b/fd2e05d6ffff24d912f150b87db9e364fa8282045c875654ce7e32fffa66/mypy-1.15.0-cp313-cp313-macosx_10_13_x86_64.whl";,
 hash = 
"sha256:93faf3fdb04768d44bf28693293f3904bbb555d076b781ad2530214ee53e3445", size 
= 10788592 },
+    { url = 
"https://files.pythonhosted.org/packages/74/37/b246d711c28a03ead1fd906bbc7106659aed7c089d55fe40dd58db812628/mypy-1.15.0-cp313-cp313-macosx_11_0_arm64.whl";,
 hash = 
"sha256:811aeccadfb730024c5d3e326b2fbe9249bb7413553f15499a4050f7c30e801d", size 
= 9753611 },
+    { url = 
"https://files.pythonhosted.org/packages/a6/ac/395808a92e10cfdac8003c3de9a2ab6dc7cde6c0d2a4df3df1b815ffd067/mypy-1.15.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl";,
 hash = 
"sha256:98b7b9b9aedb65fe628c62a6dc57f6d5088ef2dfca37903a7d9ee374d03acca5", size 
= 11438443 },
+    { url = 
"https://files.pythonhosted.org/packages/d2/8b/801aa06445d2de3895f59e476f38f3f8d610ef5d6908245f07d002676cbf/mypy-1.15.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl";,
 hash = 
"sha256:c43a7682e24b4f576d93072216bf56eeff70d9140241f9edec0c104d0c515036", size 
= 12402541 },
+    { url = 
"https://files.pythonhosted.org/packages/c7/67/5a4268782eb77344cc613a4cf23540928e41f018a9a1ec4c6882baf20ab8/mypy-1.15.0-cp313-cp313-musllinux_1_2_x86_64.whl";,
 hash = 
"sha256:baefc32840a9f00babd83251560e0ae1573e2f9d1b067719479bfb0e987c6357", size 
= 12494348 },
+    { url = 
"https://files.pythonhosted.org/packages/83/3e/57bb447f7bbbfaabf1712d96f9df142624a386d98fb026a761532526057e/mypy-1.15.0-cp313-cp313-win_amd64.whl";,
 hash = 
"sha256:b9378e2c00146c44793c98b8d5a61039a048e31f429fb0eb546d93f4b000bedf", size 
= 9373648 },
+    { url = 
"https://files.pythonhosted.org/packages/09/4e/a7d65c7322c510de2c409ff3828b03354a7c43f5a8ed458a7a131b41c7b9/mypy-1.15.0-py3-none-any.whl";,
 hash = 
"sha256:5469affef548bd1895d86d3bf10ce2b44e33d86923c29e4d675b3e323437ea3e", size 
= 2221777 },
+]
+
 [[package]]
 name = "mypy-extensions"
 version = "1.0.0"
@@ -634,15 +633,6 @@ wheels = [
     { url = 
"https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl";,
 hash = 
"sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size 
= 65451 },
 ]
 
-[[package]]
-name = "pathspec"
-version = "0.12.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 }
-wheels = [
-    { url = 
"https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl";,
 hash = 
"sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size 
= 31191 },
-]
-
 [[package]]
 name = "platformdirs"
 version = "4.3.6"
@@ -959,7 +949,7 @@ dependencies = [
 
 [package.dev-dependencies]
 dev = [
-    { name = "black" },
+    { name = "mypy" },
     { name = "pre-commit" },
     { name = "pyright" },
     { name = "ruff" },
@@ -976,7 +966,7 @@ requires-dist = [
 
 [package.metadata.requires-dev]
 dev = [
-    { name = "black", specifier = ">=25.1.0" },
+    { name = "mypy", specifier = ">=1.15.0" },
     { name = "pre-commit", specifier = ">=2.20.0" },
     { name = "pyright", specifier = ">=1.1.393" },
     { name = "ruff", specifier = ">=0.9.4" },


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tooling.apache.org
For additional commands, e-mail: dev-h...@tooling.apache.org

Reply via email to