Skip to content

Commit 4fd6618

Browse files
fix(mypy): resolve all mypy errors failing ruff+mypy CI
- pyproject.toml: add [tool.mypy] overrides to suppress import-untyped for shapely and rtree (no bundled stubs) - suspension/merge.py: narrow resolution_reason annotation from str to Literal["suspended_holiday","suspended_emergency"] to match the ScheduleFound/ASPActiveNow field type - signs/client.py: inline exc.response.status_code into logger call (removes loop-scope variable that conflicted with post-loop status_code: int | None = None declaration) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 768b9e5 commit 4fd6618

5 files changed

Lines changed: 14 additions & 8 deletions

File tree

custom_components/asp_parking/gps2asp/signs/client.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -123,13 +123,12 @@ async def _fetch_page_with_retry(
123123
return response.json()
124124
except httpx.HTTPStatusError as exc:
125125
last_error = exc
126-
status_code = exc.response.status_code
127126
delay = self.BASE_DELAY * (2**attempt)
128127
logger.warning(
129128
"SODA API attempt %d/%d failed: HTTP %d (retry in %.1fs)",
130129
attempt + 1,
131130
self.MAX_RETRIES,
132-
status_code,
131+
exc.response.status_code,
133132
delay,
134133
)
135134
if attempt < self.MAX_RETRIES - 1:
@@ -158,7 +157,7 @@ async def _fetch_page_with_retry(
158157
)
159158

160159
# First page failed -- raise SODA API error
161-
status_code = None
160+
status_code: int | None = None
162161
if isinstance(last_error, httpx.HTTPStatusError):
163162
status_code = last_error.response.status_code
164163
raise SODAAPIError(status_code=status_code, detail=str(last_error))

custom_components/asp_parking/gps2asp/suspension/merge.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from __future__ import annotations
99

1010
import dataclasses
11+
from typing import Literal
1112

1213
from ..schedule.models import ASPActiveNow, ScheduleFound, ScheduleResult
1314
from . import SuspensionInfo
@@ -39,7 +40,7 @@ def apply_suspension(
3940
if not isinstance(schedule, (ScheduleFound, ASPActiveNow)):
4041
return schedule
4142

42-
resolution_reason: str
43+
resolution_reason: Literal["suspended_holiday", "suspended_emergency"]
4344
if info.source == "holiday":
4445
resolution_reason = "suspended_holiday"
4546
elif info.source in ("emergency", "ha_nyc311"):

pyproject.toml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,12 @@ dev = [
3333
[tool.hatch.build.targets.wheel]
3434
packages = ["src/gps2asp"]
3535

36+
[tool.mypy]
37+
38+
[[tool.mypy.overrides]]
39+
module = ["shapely", "shapely.*", "rtree", "rtree.*"]
40+
ignore_missing_imports = true
41+
3642
[tool.pytest.ini_options]
3743
asyncio_mode = "auto"
3844
markers = [

src/gps2asp/signs/client.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -123,13 +123,12 @@ async def _fetch_page_with_retry(
123123
return response.json()
124124
except httpx.HTTPStatusError as exc:
125125
last_error = exc
126-
status_code = exc.response.status_code
127126
delay = self.BASE_DELAY * (2**attempt)
128127
logger.warning(
129128
"SODA API attempt %d/%d failed: HTTP %d (retry in %.1fs)",
130129
attempt + 1,
131130
self.MAX_RETRIES,
132-
status_code,
131+
exc.response.status_code,
133132
delay,
134133
)
135134
if attempt < self.MAX_RETRIES - 1:
@@ -161,7 +160,7 @@ async def _fetch_page_with_retry(
161160
)
162161

163162
# First page failed -- raise SODA API error
164-
status_code = None
163+
status_code: int | None = None
165164
if isinstance(last_error, httpx.HTTPStatusError):
166165
status_code = last_error.response.status_code
167166
raise SODAAPIError(status_code=status_code, detail=str(last_error))

src/gps2asp/suspension/merge.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from __future__ import annotations
99

1010
import dataclasses
11+
from typing import Literal
1112

1213
from ..schedule.models import ASPActiveNow, ScheduleFound, ScheduleResult
1314
from . import SuspensionInfo
@@ -39,7 +40,7 @@ def apply_suspension(
3940
if not isinstance(schedule, (ScheduleFound, ASPActiveNow)):
4041
return schedule
4142

42-
resolution_reason: str
43+
resolution_reason: Literal["suspended_holiday", "suspended_emergency"]
4344
if info.source == "holiday":
4445
resolution_reason = "suspended_holiday"
4546
elif info.source in ("emergency", "ha_nyc311"):

0 commit comments

Comments
 (0)