diff --git a/app/frontend_bundle_analysis.py b/app/frontend_bundle_analysis.py
index 1339fd9..928d169 100644
--- a/app/frontend_bundle_analysis.py
+++ b/app/frontend_bundle_analysis.py
@@ -264,7 +264,7 @@ def render_bundle_treemap(title: str, bundle_data: list | None) -> None:
color_continuous_scale="Blues",
hover_data={"Size (Human)": True},
)
- fig.update_traces(hovertemplate="%{label}
Size: %{customdata[0]}") # noqa: RUF027
+ fig.update_traces(hovertemplate="%{label}
Size: %{customdata[0]}") # ruff:ignore[missing-f-string-syntax]
st.markdown(f"**{title}**")
st.plotly_chart(fig, width="stretch")
diff --git a/app/github_stats.py b/app/github_stats.py
index bb9fa8f..254f6cf 100644
--- a/app/github_stats.py
+++ b/app/github_stats.py
@@ -1,6 +1,6 @@
import operator
import re
-import subprocess # noqa: S404
+import subprocess # ruff:ignore[suspicious-subprocess-import]
import tempfile
from datetime import date
@@ -32,8 +32,8 @@ def get_git_fame_stats() -> dict:
# Use a temporary directory
with tempfile.TemporaryDirectory() as temp_dir:
# Clone the repository
- subprocess.run( # noqa: S603
- ["git", "clone", "https://github.com/" + GITHUB_REPO, temp_dir], # noqa: S607
+ subprocess.run( # ruff:ignore[subprocess-without-shell-equals-true]
+ ["git", "clone", "https://github.com/" + GITHUB_REPO, temp_dir], # ruff:ignore[start-process-with-partial-path]
check=True,
capture_output=True,
)
diff --git a/app/issue_explorer.py b/app/issue_explorer.py
index e8b3f2e..2b34af8 100644
--- a/app/issue_explorer.py
+++ b/app/issue_explorer.py
@@ -184,4 +184,4 @@ def issue_sort_key(issue_name: str) -> tuple[int, int, str]:
script_content = pathlib.Path(selected_issue_folder_path.joinpath(DEFAULT_SCRIPT_NAME)).read_text(
encoding="utf-8"
)
- exec(script_content) # noqa: S102
+ exec(script_content) # ruff:ignore[exec-builtin]
diff --git a/app/load_testing.py b/app/load_testing.py
index 092afe6..d553366 100644
--- a/app/load_testing.py
+++ b/app/load_testing.py
@@ -92,7 +92,7 @@ def _parse_load_test_payload(content: bytes) -> dict[str, Any] | None:
if name.endswith(".json"):
with zip_file.open(name) as f:
return json.load(f)
- except Exception: # noqa: S110
+ except Exception: # ruff:ignore[try-except-pass]
pass
return None
diff --git a/app/perf/utils/artifacts.py b/app/perf/utils/artifacts.py
index 073b8fe..122a1c7 100644
--- a/app/perf/utils/artifacts.py
+++ b/app/perf/utils/artifacts.py
@@ -69,7 +69,7 @@ def _extract_lighthouse_scores(zip_bytes: bytes) -> dict[str, float]:
continue
try:
score = payload["categories"]["performance"]["score"]
- except Exception: # noqa: S112
+ except Exception: # ruff:ignore[try-except-continue]
continue
# Keep the same (slightly odd) key derivation behavior as the prior disk-based parser.
diff --git a/app/perf/utils/perf_github_artifacts.py b/app/perf/utils/perf_github_artifacts.py
index bfda412..c97c234 100644
--- a/app/perf/utils/perf_github_artifacts.py
+++ b/app/perf/utils/perf_github_artifacts.py
@@ -38,7 +38,7 @@ def process_artifact(
continue
try:
score = payload["categories"]["performance"]["score"]
- except Exception: # noqa: S112
+ except Exception: # ruff:ignore[try-except-continue]
continue
parts = member_name.split("_-_")
diff --git a/app/utils/agent_wiki.py b/app/utils/agent_wiki.py
index 338041f..e168303 100644
--- a/app/utils/agent_wiki.py
+++ b/app/utils/agent_wiki.py
@@ -4,7 +4,7 @@
import posixpath
import re
import shutil
-import subprocess # noqa: S404
+import subprocess # ruff:ignore[suspicious-subprocess-import]
import tempfile
from pathlib import Path
from typing import TypedDict
@@ -56,8 +56,8 @@ def _run_git_command(
cwd: Path | None = None,
) -> tuple[str | None, str | None]:
try:
- completed_process = subprocess.run( # noqa: S603
- ["git", *args], # noqa: S607
+ completed_process = subprocess.run( # ruff:ignore[subprocess-without-shell-equals-true]
+ ["git", *args], # ruff:ignore[start-process-with-partial-path]
cwd=cwd,
check=False,
capture_output=True,
diff --git a/app/utils/smokeshow.py b/app/utils/smokeshow.py
index 69b1701..cb556e2 100644
--- a/app/utils/smokeshow.py
+++ b/app/utils/smokeshow.py
@@ -68,7 +68,7 @@ async def upload_to_smokeshow(directory_path: Path) -> str:
upload_root: str = obj["url"]
# Create a list of files to upload
- files_to_upload = [(p, p.relative_to(directory_path)) for p in directory_path.glob("**/*") if p.is_file()] # noqa: ASYNC240
+ files_to_upload = [(p, p.relative_to(directory_path)) for p in directory_path.glob("**/*") if p.is_file()] # ruff:ignore[blocking-path-method-in-async-function]
# Create a semaphore to limit concurrent uploads to 60
semaphore = asyncio.Semaphore(SMOKESHOW_MAX_CONCURRENT_UPLOADS)
@@ -105,7 +105,7 @@ async def _upload_file(
upload_root: str,
file_path: Path,
rel_path: Path,
- timeout: int, # noqa: ASYNC109
+ timeout: int, # ruff:ignore[async-function-with-timeout]
) -> None:
"""Upload a single file to smokeshow."""
url_path = str(rel_path)
@@ -119,7 +119,7 @@ async def _upload_file(
try:
response = await client.post(
upload_root + url_path,
- content=file_path.read_bytes(), # noqa: ASYNC240
+ content=file_path.read_bytes(), # ruff:ignore[blocking-path-method-in-async-function]
headers=headers,
timeout=timeout,
)
diff --git a/pyproject.toml b/pyproject.toml
index 94a6a3a..4795c11 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -47,7 +47,7 @@ default-groups = ["dev"]
[dependency-groups]
dev = [
"pytest>=9.0.2",
- "ruff==0.15.21",
+ "ruff==0.15.22",
"ty==0.0.62",
"mypy==2.3.0",
"watchdog",
@@ -81,40 +81,40 @@ ignore = [
"DOC", # Checks for correct docstring format.
"FBT", # Checks for Boolean-typed positional argument in function definition.
# Ignored rules (sorted alphabetically):
- "ANN401", # Allow Any type in annotations.
- "COM812", # Trailing comma missing. Not recommended with formatter.
- "COM819", # Trailing comma prohibited. Not recommended with formatter.
- "D100", # Missing docstring in public module.
- "D101", # Missing docstring in public class.
- "D103", # Missing docstring in public function.
- "D104", # Missing docstring in public package.
- "D107", # Missing docstring in __init__.
- "E501", # Line too long. Ignored for user-facing strings and help text.
- "ERA001", # Commented out code.
- "FIX002", # Disallow TODO comments.
- "FURB152", # Math constants should use math module.
- "PLC0415", # Imports not at top-level.
- "PLC2701", # Import of private name.
- "PLR0904", # Too many public methods.
- "PLR0911", # Too many return statements.
- "PLR0912", # Too many branches.
- "PLR0913", # Too many arguments.
- "PLR0914", # Too many local variables.
- "PLR0915", # Too many statements.
- "PLR0916", # Too many boolean expressions.
- "PLR0917", # Too many positional arguments.
- "PLR1702", # Too many nested blocks.
- "PLR2004", # Magic value used in comparison.
- "PLR6301", # Method could be function (no self usage).
- "PLW0717", # Too many statements in try clause.
- "RET504", # Unnecessary assignment before return.
- "RUF052", # Dummy variable accessed.
- "RUF067", # Non-empty __init__ module.
- "SIM117", # Multiple with statements should be combined.
- "T201", # Print statement found.
- "TD002", # Missing author in TODO.
- "TD003", # Missing issue link in TODO.
- "TRY300", # Consider else block instead of return in try.
+ "any-type", # Allow Any type in annotations.
+ "missing-trailing-comma", # Trailing comma missing. Not recommended with formatter.
+ "prohibited-trailing-comma", # Trailing comma prohibited. Not recommended with formatter.
+ "undocumented-public-module", # Missing docstring in public module.
+ "undocumented-public-class", # Missing docstring in public class.
+ "undocumented-public-function", # Missing docstring in public function.
+ "undocumented-public-package", # Missing docstring in public package.
+ "undocumented-public-init", # Missing docstring in __init__.
+ "line-too-long", # Line too long. Ignored for user-facing strings and help text.
+ "commented-out-code", # Commented out code.
+ "line-contains-todo", # Disallow TODO comments.
+ "math-constant", # Math constants should use math module.
+ "import-outside-top-level", # Imports not at top-level.
+ "import-private-name", # Import of private name.
+ "too-many-public-methods", # Too many public methods.
+ "too-many-return-statements", # Too many return statements.
+ "too-many-branches", # Too many branches.
+ "too-many-arguments", # Too many arguments.
+ "too-many-locals", # Too many local variables.
+ "too-many-statements", # Too many statements.
+ "too-many-boolean-expressions", # Too many boolean expressions.
+ "too-many-positional-arguments", # Too many positional arguments.
+ "too-many-nested-blocks", # Too many nested blocks.
+ "magic-value-comparison", # Magic value used in comparison.
+ "no-self-use", # Method could be function (no self usage).
+ "too-many-statements-in-try-clause", # Too many statements in try clause.
+ "unnecessary-assign", # Unnecessary assignment before return.
+ "used-dummy-variable", # Dummy variable accessed.
+ "non-empty-init-module", # Non-empty __init__ module.
+ "multiple-with-statements", # Multiple with statements should be combined.
+ "print", # Print statement found.
+ "missing-todo-author", # Missing author in TODO.
+ "missing-todo-link", # Missing issue link in TODO.
+ "try-consider-else", # Consider else block instead of return in try.
]
[tool.ruff.lint.per-file-ignores]
@@ -128,7 +128,7 @@ ignore = [
"S", # Ignore bandit security rules (test code doesn't need security hardening).
"TRY", # Ignore tryceratops rules (simpler exception handling in tests).
]
-extend-safe-fixes = ["TC002", "TC003"]
+extend-safe-fixes = ["typing-only-third-party-import", "typing-only-standard-library-import"]
[tool.ruff.lint.isort]
known-first-party = ["app"]
diff --git a/uv.lock b/uv.lock
index ae1bb5c..12bdc37 100644
--- a/uv.lock
+++ b/uv.lock
@@ -1468,27 +1468,27 @@ wheels = [
[[package]]
name = "ruff"
-version = "0.15.21"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/0f/36/6f65aa9989acdec45d417192d8f4e7921931d8a6cf87ac74bce3eed98a8e/ruff-0.15.21.tar.gz", hash = "sha256:d0cfc841c572283c36548f82664a54ce6565567f1b0d5b4cf2caac693d8b7500", size = 4769401, upload-time = "2026-07-09T20:01:34.005Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/d0/c6/ede15cac6839f3dbce52565c8f5164a8210e669c7bc4decb03e5bdf47d0d/ruff-0.15.21-py3-none-linux_armv6l.whl", hash = "sha256:63ea0e965e5d73c90e95b2434beeafc70820536717f561b32ab6e777cb9bdf5d", size = 10854342, upload-time = "2026-07-09T20:00:53.998Z" },
- { url = "https://files.pythonhosted.org/packages/28/9d/d825b07ee7ea9e2d61df92a860033c94e06e7300d50a1c2653aac27d24fe/ruff-0.15.21-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0f212c5d7d54c01bbfe6dcab02b724a39300f3e34ed7acbe995ccb320a2c58bd", size = 11139539, upload-time = "2026-07-09T20:00:57.809Z" },
- { url = "https://files.pythonhosted.org/packages/f5/de/3b107712e642f063c7a9e0887c427b22cb44097de5aab36c05f2e280670c/ruff-0.15.21-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e6312e41bc96791299614995ea3a977c5857c3b5662b1ecef6755b02b87cb646", size = 10595437, upload-time = "2026-07-09T20:01:00.006Z" },
- { url = "https://files.pythonhosted.org/packages/9a/6f/b4523cc90ba239ede441447a19d0c968846a3012e5a0b0c5b62831a3d5e3/ruff-0.15.21-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01d65b4831c6b2a4ba8ee6faa84049d44d982b7a706e622c4094c509e51673be", size = 10990053, upload-time = "2026-07-09T20:01:02.187Z" },
- { url = "https://files.pythonhosted.org/packages/92/cc/c6a9872a5375f0628875481cf2f66b13d7d865bf3ca2e57f91c7e762d976/ruff-0.15.21-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2c5a913a589120ce67933d5d05fd6ddbcc2481c6a054980ee767f7414c72b4fd", size = 10666096, upload-time = "2026-07-09T20:01:04.299Z" },
- { url = "https://files.pythonhosted.org/packages/ab/97/c621f7a17e097f1790fa3af6374138823b330b2d03fc38337945daca212c/ruff-0.15.21-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef04b681d02ad4dc9620f00f83ac5c22f652d0e9a9cfe431d219b16ad5ccc41", size = 11537011, upload-time = "2026-07-09T20:01:06.771Z" },
- { url = "https://files.pythonhosted.org/packages/ea/51/d928727e476e25ccc57c6f449ffd80241a651a973ad949d39cfb2a771d28/ruff-0.15.21-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16d090c0740916594157e75b80d666eab8e78083b39b3b0e1d698f4670a17b86", size = 12347101, upload-time = "2026-07-09T20:01:08.859Z" },
- { url = "https://files.pythonhosted.org/packages/1e/88/8cd62026802b16018ad06931d87997cf795ba2a6239ab659606c87d96bf0/ruff-0.15.21-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a10e74757dd65004d779b73e2f3c5210156d9980b41224d50d2ebcf1db51e67", size = 11572001, upload-time = "2026-07-09T20:01:11.092Z" },
- { url = "https://files.pythonhosted.org/packages/b2/97/f63084cf55444fc110e8cb985ebfcc592af47f597d44453d778cb81bc156/ruff-0.15.21-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bab0905d2f29e0d9fbc3c373ed23db0095edaa3f71f1f4f519ec15134d9e85c8", size = 11549239, upload-time = "2026-07-09T20:01:13.27Z" },
- { url = "https://files.pythonhosted.org/packages/9d/77/f107da4a2874b7715914b03f09ba9c54424de3ff8a1cc5d015d3ee2ce0ac/ruff-0.15.21-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:00eca240af5789fec6fe7df74c088cc1f9644ed83027113468efba7c92b94075", size = 11535340, upload-time = "2026-07-09T20:01:15.206Z" },
- { url = "https://files.pythonhosted.org/packages/d5/e9/601deb322d3303a7bf212b0100ead6f2ee3f6a044d89c30f2f92bf83c731/ruff-0.15.21-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:262ab31557a75141325e32d3357f3597645a7f084e732b6b054dde428ecd9341", size = 10964048, upload-time = "2026-07-09T20:01:17.723Z" },
- { url = "https://files.pythonhosted.org/packages/ea/2e/0f2176d1e99c15192caea19c8c3a0a955246b4cb4de795042eeb616345cd/ruff-0.15.21-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:659c4e7a4212f83306045ec7c5e5a356d16d9a6ef4ae0c7a4d872914fc655d9d", size = 10667055, upload-time = "2026-07-09T20:01:19.73Z" },
- { url = "https://files.pythonhosted.org/packages/48/60/abd74a02e0c4214f12a68becfd30af7165cfdcb0e661ecdc60bbb949c09a/ruff-0.15.21-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9e866eab611a5f959d36df2d10e446973a3610bc42b0c15b31dc27977d59c233", size = 11242043, upload-time = "2026-07-09T20:01:21.947Z" },
- { url = "https://files.pythonhosted.org/packages/b2/c6/583075d8ccabb4b229345edcaf1545eb3d8d6be90f686a479d7e94088bbf/ruff-0.15.21-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e89bc93c0d3803ba870b55c29671bad9dc6d94bb1eb181b056b52eb05b52854f", size = 11648064, upload-time = "2026-07-09T20:01:24.023Z" },
- { url = "https://files.pythonhosted.org/packages/3a/3c/37d0ecb729a7cc2d393ea7dce316fc585680f35d93b8d62139d7d0a3700c/ruff-0.15.21-py3-none-win32.whl", hash = "sha256:01f8d5be84823c172b389e123174f781f9daf86d6c58719d603f941932195cdd", size = 10896555, upload-time = "2026-07-09T20:01:26.941Z" },
- { url = "https://files.pythonhosted.org/packages/c0/b8/e43466b2a6067ce91e669068f6e28d6c719a920f014b070d5c8731725de3/ruff-0.15.21-py3-none-win_amd64.whl", hash = "sha256:d4b8d9a2f0f12b816b50447f6eccb9f4bb01a6b82c86b50fb3b5354b458dc6d3", size = 12038772, upload-time = "2026-07-09T20:01:29.497Z" },
- { url = "https://files.pythonhosted.org/packages/dd/75/e90ab9aeece218a9fc5a5bc3ec97d0ee6bb3c4ff95869463c1de58e29a1c/ruff-0.15.21-py3-none-win_arm64.whl", hash = "sha256:6e83115d4b9377c1cbc13abf0e051f069fab0ef815ea0504a8a008cee24dd0a8", size = 11375265, upload-time = "2026-07-09T20:01:31.772Z" },
+version = "0.15.22"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/3a/06/ae069393fc66e8ff33036d4b368003833bf6e88ccf182e17e7a2f1c754fd/ruff-0.15.22.tar.gz", hash = "sha256:3f15175b1fb580126f58285a5dae6b2ea89000136d980c64499211f116b54809", size = 4785063, upload-time = "2026-07-16T15:14:13.244Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/23/18/ee54b7ae1e121be7a28ea6da4b67564ebb0530e183a54415ab7e3bcd2c4e/ruff-0.15.22-py3-none-linux_armv6l.whl", hash = "sha256:44423e73493737f5e7c5b41d475483898ff37afcdae38bc3da5085e29af1c2d8", size = 10781258, upload-time = "2026-07-16T15:13:19.452Z" },
+ { url = "https://files.pythonhosted.org/packages/2f/d2/2520cb14761ddbeaf57642a76942fc36adcbdbe53b4532241995f6fc485c/ruff-0.15.22-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b82c6482946e9eda7ff2e091d25b8bad3f718684e1916d41bd56873cee05b697", size = 10999477, upload-time = "2026-07-16T15:13:23.318Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/10/74e53572aa758dfaa678c2a2646b5c5515d884b7ca56be4d2ce03ca4b560/ruff-0.15.22-py3-none-macosx_11_0_arm64.whl", hash = "sha256:11c1c715af53a09f714e011106bffc419751ec8232fcb5da42173284ea3fec6f", size = 10466716, upload-time = "2026-07-16T15:13:26.162Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/cc/44eaaf0844e028182f2d0a8f2190d0f359159aed0a9e5ab861d892f1ae2a/ruff-0.15.22-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:742a29cf29bddb7c8327895d6a10e0e6c5b38a96dd407af9b5d0857f809c0576", size = 10892644, upload-time = "2026-07-16T15:13:29.229Z" },
+ { url = "https://files.pythonhosted.org/packages/9f/21/8edf559014d2b0f82beea19cfb713993ad802ccda16868769979c6090a84/ruff-0.15.22-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72af58b951b0ae395935ae79763dc349bc0eb706319d28f7a33ad2cfb3cfc178", size = 10576719, upload-time = "2026-07-16T15:13:32.35Z" },
+ { url = "https://files.pythonhosted.org/packages/bf/1e/3a13abd392a3b50b62e5938a831f9ab6e588358cacad5c18545b716d2182/ruff-0.15.22-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62d425005c1835eb24e2ee4161cb90e8db263415f4a71c8c72c33abaa6c0c224", size = 11376494, upload-time = "2026-07-16T15:13:35.958Z" },
+ { url = "https://files.pythonhosted.org/packages/bf/3e/422d3d95bcf04dd78e1aeac22184d4f9a8fb2c01865d39d44618484a0317/ruff-0.15.22-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e8b9b3f8779a4f08c969defc3c8c35abffaa757e601ed5ae66d6d1db6519969a", size = 12208370, upload-time = "2026-07-16T15:13:39.185Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/91/5d065a0e0a02bf4813f5119ad278462eed081d2b832eb7c021ade0ec9e65/ruff-0.15.22-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e0dd1b2e4d3d585f897a0d137cbf4eaf6223bef4e8ce34d6bb12556c5f9249e", size = 11581098, upload-time = "2026-07-16T15:13:42.132Z" },
+ { url = "https://files.pythonhosted.org/packages/f6/f9/a0d4871d12fae702eb1f41b686caf05f1f8b124dc6db6f784f53d74918fa/ruff-0.15.22-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:365523eb91d9224e1bcb03b022fbf0facb8f9e23792a2c53d9d4b3924bdbdebb", size = 11399422, upload-time = "2026-07-16T15:13:45.2Z" },
+ { url = "https://files.pythonhosted.org/packages/18/80/c843a5176cddbceb0b7e8dd41cf9993490796c1c469348d384f5a5c13c56/ruff-0.15.22-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:fabfd168afdf29fee5be98b831efa9683c94d7c5a3b58b9ce5a2e38444589a74", size = 11381683, upload-time = "2026-07-16T15:13:48.46Z" },
+ { url = "https://files.pythonhosted.org/packages/d4/00/8485de0ae92239438a36cfc51350db9b9e85c9ebdfaea91b18e422706662/ruff-0.15.22-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:225dbf095a87f1d9f90f5fd7924d2613ee452a75a4308c63a8f50f761787aa7c", size = 10850295, upload-time = "2026-07-16T15:13:51.655Z" },
+ { url = "https://files.pythonhosted.org/packages/fa/91/24977ec2ec72eaf15e4394ace2959fdff2dd1e14f03e005e838023407169/ruff-0.15.22-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:1877d63b9d24ed278744f1523fd11b85540566d54641f97c566d7d9dc5ca5296", size = 10579640, upload-time = "2026-07-16T15:13:54.79Z" },
+ { url = "https://files.pythonhosted.org/packages/9c/47/9b51216951974df1f263ac19da550d34252e0ed7218c25f10c5ef9ed7517/ruff-0.15.22-py3-none-musllinux_1_2_i686.whl", hash = "sha256:a1606c510bd7215680d32efab38965f7cdec3ef69f5170a3f4791404ffdd5262", size = 11105077, upload-time = "2026-07-16T15:13:57.915Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/47/20e9d4a3b8016778acea5fc32bb50d35d207500a17ddb529ffa6996feef8/ruff-0.15.22-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:630479b18625f5ffc373f77603a22a9f8ac0acd7ff0501178b5db28ec71e9c64", size = 11490980, upload-time = "2026-07-16T15:14:01.032Z" },
+ { url = "https://files.pythonhosted.org/packages/4d/76/3f72d8fc38c1cb77b38c56a70da9d0c17700cc1cc50f9649c9d3c8f5ba71/ruff-0.15.22-py3-none-win32.whl", hash = "sha256:e5ba0e4a13fd14abbed2a77b517a3911290c6c6c59ef67784328d1668fab76cf", size = 10789165, upload-time = "2026-07-16T15:14:04.16Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/46/4965251734c2b6fcdca1b1b187d20bcac3af0ee5b083b89c910bb961ce3a/ruff-0.15.22-py3-none-win_amd64.whl", hash = "sha256:9be63ba1eb936acd2d1342fb8337c356353706fce233b2a15a09a97037e6acde", size = 11938297, upload-time = "2026-07-16T15:14:07.316Z" },
+ { url = "https://files.pythonhosted.org/packages/57/c9/e69b1ff4c8b69093ef08b8919ab767af0569666865b39c30a8795d88d3c6/ruff-0.15.22-py3-none-win_arm64.whl", hash = "sha256:e1168075b72158510839f250027659cdd78476f40507dd517892304c41318661", size = 11298172, upload-time = "2026-07-16T15:14:10.51Z" },
]
[[package]]
@@ -1634,7 +1634,7 @@ dev = [
{ name = "pandas-stubs" },
{ name = "pre-commit", specifier = ">=4.5.1" },
{ name = "pytest", specifier = ">=9.0.2" },
- { name = "ruff", specifier = "==0.15.21" },
+ { name = "ruff", specifier = "==0.15.22" },
{ name = "ty", specifier = "==0.0.62" },
{ name = "watchdog" },
]