v0.9.16: ruff baseline cleanup (routes.py, test_wfigs.py)

Mechanical lint fixes only — ruff 31 -> 0 across the two files.

- E402 module-import-not-at-top: 15 -> 0 (relocated module-level
  `logger = logging.getLogger(...)` from mid-import to below the import
  block in routes.py; imports now contiguous at top of file)
- F811 redefined-while-unused: 10 -> 0 (removed 10 redundant function-local
  `from central.gui.csrf import reuse_or_generate_pre_auth_csrf` re-imports;
  the module-level import at line 26 is now load-bearing)
- F401 unused-import: 4 -> 0 (routes.py: fastapi.Depends, and
  central.gui.csrf.reuse_or_generate_pre_auth_csrf resolved by the F811 fix;
  test_wfigs.py: sqlite3, central.config_models.RegionConfig)
- E702 multiple-statements-on-one-line-semicolon: 2 -> 0 (split the two
  semicolon-joined statements in _fused_bbox, indentation preserved)

Deliberate function-local wizard imports (circular-import workaround) left
untouched. pytest: 890 passed / 1 skipped, unchanged across 3 runs.

no behavior change; ruff mechanical fixes only.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Matt Johnson 2026-05-27 04:51:58 +00:00
commit c379e3688e
2 changed files with 9 additions and 18 deletions

View file

@ -16,10 +16,7 @@ from central.config_store import ConfigStore
from central.tomtom_flow_parse import decode_flow_tile from central.tomtom_flow_parse import decode_flow_tile
from central.gui.nats import get_js from central.gui.nats import get_js
logger = logging.getLogger("central.gui.routes") from fastapi import APIRouter, Form, Request
from fastapi import APIRouter, Depends, Form, Request
from fastapi.responses import HTMLResponse, JSONResponse, RedirectResponse, Response from fastapi.responses import HTMLResponse, JSONResponse, RedirectResponse, Response
from central.bootstrap_config import get_settings from central.bootstrap_config import get_settings
from central.gui.csrf import ( from central.gui.csrf import (
@ -65,6 +62,9 @@ from central.adapter_discovery import discover_adapters
from central.streams import STREAMS as STREAM_REGISTRY from central.streams import STREAMS as STREAM_REGISTRY
from pydantic import ValidationError from pydantic import ValidationError
logger = logging.getLogger("central.gui.routes")
@cache @cache
def _adapter_classes() -> dict: def _adapter_classes() -> dict:
"""Cached adapter class discovery. """Cached adapter class discovery.
@ -308,7 +308,6 @@ async def dashboard_polls(request: Request) -> HTMLResponse:
async def setup_operator_form(request: Request) -> HTMLResponse: async def setup_operator_form(request: Request) -> HTMLResponse:
"""Render the setup operator form (step 1).""" """Render the setup operator form (step 1)."""
from central.gui.wizard import get_wizard_state from central.gui.wizard import get_wizard_state
from central.gui.csrf import reuse_or_generate_pre_auth_csrf
templates = _get_templates() templates = _get_templates()
settings = get_settings() settings = get_settings()
@ -346,7 +345,6 @@ async def setup_operator_submit(
) -> Response: ) -> Response:
"""Process the setup operator form (step 1).""" """Process the setup operator form (step 1)."""
from central.gui.wizard import get_wizard_state, set_wizard_cookie, WizardState from central.gui.wizard import get_wizard_state, set_wizard_cookie, WizardState
from central.gui.csrf import reuse_or_generate_pre_auth_csrf
templates = _get_templates() templates = _get_templates()
settings = get_settings() settings = get_settings()
@ -401,7 +399,6 @@ async def setup_operator_submit(
async def setup_system_form(request: Request) -> HTMLResponse: async def setup_system_form(request: Request) -> HTMLResponse:
"""Render the system settings form (step 2).""" """Render the system settings form (step 2)."""
from central.gui.wizard import get_wizard_state from central.gui.wizard import get_wizard_state
from central.gui.csrf import reuse_or_generate_pre_auth_csrf
settings = get_settings() settings = get_settings()
@ -447,7 +444,6 @@ async def setup_system_form(request: Request) -> HTMLResponse:
async def setup_system_submit(request: Request) -> Response: async def setup_system_submit(request: Request) -> Response:
"""Process the system settings form (step 2).""" """Process the system settings form (step 2)."""
from central.gui.wizard import get_wizard_state, set_wizard_cookie from central.gui.wizard import get_wizard_state, set_wizard_cookie
from central.gui.csrf import reuse_or_generate_pre_auth_csrf
templates = _get_templates() templates = _get_templates()
settings = get_settings() settings = get_settings()
@ -514,7 +510,6 @@ async def setup_system_submit(request: Request) -> Response:
async def setup_keys_form(request: Request) -> HTMLResponse: async def setup_keys_form(request: Request) -> HTMLResponse:
"""Render the API keys form (step 3).""" """Render the API keys form (step 3)."""
from central.gui.wizard import get_wizard_state from central.gui.wizard import get_wizard_state
from central.gui.csrf import reuse_or_generate_pre_auth_csrf
settings = get_settings() settings = get_settings()
@ -549,7 +544,6 @@ async def setup_keys_form(request: Request) -> HTMLResponse:
async def setup_keys_submit(request: Request) -> Response: async def setup_keys_submit(request: Request) -> Response:
"""Process the API keys form (step 3).""" """Process the API keys form (step 3)."""
from central.gui.wizard import get_wizard_state, set_wizard_cookie from central.gui.wizard import get_wizard_state, set_wizard_cookie
from central.gui.csrf import reuse_or_generate_pre_auth_csrf
from central.crypto import encrypt from central.crypto import encrypt
templates = _get_templates() templates = _get_templates()
@ -647,7 +641,6 @@ async def setup_keys_submit(request: Request) -> Response:
async def setup_adapters_form(request: Request) -> HTMLResponse: async def setup_adapters_form(request: Request) -> HTMLResponse:
"""Render the adapters configuration form (step 4).""" """Render the adapters configuration form (step 4)."""
from central.gui.wizard import get_wizard_state from central.gui.wizard import get_wizard_state
from central.gui.csrf import reuse_or_generate_pre_auth_csrf
settings = get_settings() settings = get_settings()
@ -765,7 +758,6 @@ async def setup_adapters_form(request: Request) -> HTMLResponse:
async def setup_adapters_submit(request: Request) -> Response: async def setup_adapters_submit(request: Request) -> Response:
"""Process the adapters configuration form (step 4).""" """Process the adapters configuration form (step 4)."""
from central.gui.wizard import get_wizard_state, set_wizard_cookie from central.gui.wizard import get_wizard_state, set_wizard_cookie
from central.gui.csrf import reuse_or_generate_pre_auth_csrf
templates = _get_templates() templates = _get_templates()
pool = get_pool() pool = get_pool()
@ -985,7 +977,6 @@ async def setup_adapters_submit(request: Request) -> Response:
async def setup_finish_form(request: Request) -> HTMLResponse: async def setup_finish_form(request: Request) -> HTMLResponse:
"""Render the finish setup page (step 5).""" """Render the finish setup page (step 5)."""
from central.gui.wizard import get_wizard_state from central.gui.wizard import get_wizard_state
from central.gui.csrf import reuse_or_generate_pre_auth_csrf
settings = get_settings() settings = get_settings()
@ -1038,7 +1029,6 @@ async def setup_finish_form(request: Request) -> HTMLResponse:
async def setup_finish_submit(request: Request) -> Response: async def setup_finish_submit(request: Request) -> Response:
"""Complete the setup wizard - atomic commit of all wizard state.""" """Complete the setup wizard - atomic commit of all wizard state."""
from central.gui.wizard import get_wizard_state, clear_wizard_cookie from central.gui.wizard import get_wizard_state, clear_wizard_cookie
from central.gui.csrf import reuse_or_generate_pre_auth_csrf
from asyncpg.exceptions import UniqueViolationError from asyncpg.exceptions import UniqueViolationError
templates = _get_templates() templates = _get_templates()
@ -3471,8 +3461,10 @@ def _fused_bbox(params: dict) -> tuple[float, float, float, float] | None:
"""Parse optional north/south/east/west into (west, south, east, north), or """Parse optional north/south/east/west into (west, south, east, north), or
None if absent/degenerate/out-of-range (mirrors _parse_events_params).""" None if absent/degenerate/out-of-range (mirrors _parse_events_params)."""
try: try:
n = float(params["north"]); so = float(params["south"]) n = float(params["north"])
e = float(params["east"]); w = float(params["west"]) so = float(params["south"])
e = float(params["east"])
w = float(params["west"])
except (KeyError, TypeError, ValueError): except (KeyError, TypeError, ValueError):
return None return None
if -90 <= so < n <= 90 and -180 <= w < e <= 180: if -90 <= so < n <= 90 and -180 <= w < e <= 180:

View file

@ -1,13 +1,12 @@
"""Tests for WFIGS adapters.""" """Tests for WFIGS adapters."""
import sqlite3
from datetime import datetime, timezone from datetime import datetime, timezone
from pathlib import Path from pathlib import Path
from unittest.mock import AsyncMock, MagicMock, patch from unittest.mock import AsyncMock, MagicMock, patch
import pytest import pytest
from central.config_models import AdapterConfig, RegionConfig from central.config_models import AdapterConfig
from central.models import Event, Geo from central.models import Event, Geo