From c379e3688e63a54043cfdae34b11d5e287345044 Mon Sep 17 00:00:00 2001 From: Matt Johnson Date: Wed, 27 May 2026 04:51:58 +0000 Subject: [PATCH] v0.9.16: ruff baseline cleanup (routes.py, test_wfigs.py) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- src/central/gui/routes.py | 24 ++++++++---------------- tests/test_wfigs.py | 3 +-- 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/src/central/gui/routes.py b/src/central/gui/routes.py index 028c71b..ec75563 100644 --- a/src/central/gui/routes.py +++ b/src/central/gui/routes.py @@ -16,10 +16,7 @@ from central.config_store import ConfigStore from central.tomtom_flow_parse import decode_flow_tile from central.gui.nats import get_js -logger = logging.getLogger("central.gui.routes") - - -from fastapi import APIRouter, Depends, Form, Request +from fastapi import APIRouter, Form, Request from fastapi.responses import HTMLResponse, JSONResponse, RedirectResponse, Response from central.bootstrap_config import get_settings 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 pydantic import ValidationError +logger = logging.getLogger("central.gui.routes") + + @cache def _adapter_classes() -> dict: """Cached adapter class discovery. @@ -308,7 +308,6 @@ async def dashboard_polls(request: Request) -> HTMLResponse: async def setup_operator_form(request: Request) -> HTMLResponse: """Render the setup operator form (step 1).""" from central.gui.wizard import get_wizard_state - from central.gui.csrf import reuse_or_generate_pre_auth_csrf templates = _get_templates() settings = get_settings() @@ -346,7 +345,6 @@ async def setup_operator_submit( ) -> Response: """Process the setup operator form (step 1).""" 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() settings = get_settings() @@ -401,7 +399,6 @@ async def setup_operator_submit( async def setup_system_form(request: Request) -> HTMLResponse: """Render the system settings form (step 2).""" from central.gui.wizard import get_wizard_state - from central.gui.csrf import reuse_or_generate_pre_auth_csrf settings = get_settings() @@ -447,7 +444,6 @@ async def setup_system_form(request: Request) -> HTMLResponse: async def setup_system_submit(request: Request) -> Response: """Process the system settings form (step 2).""" 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() settings = get_settings() @@ -514,7 +510,6 @@ async def setup_system_submit(request: Request) -> Response: async def setup_keys_form(request: Request) -> HTMLResponse: """Render the API keys form (step 3).""" from central.gui.wizard import get_wizard_state - from central.gui.csrf import reuse_or_generate_pre_auth_csrf settings = get_settings() @@ -549,7 +544,6 @@ async def setup_keys_form(request: Request) -> HTMLResponse: async def setup_keys_submit(request: Request) -> Response: """Process the API keys form (step 3).""" 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 templates = _get_templates() @@ -647,7 +641,6 @@ async def setup_keys_submit(request: Request) -> Response: async def setup_adapters_form(request: Request) -> HTMLResponse: """Render the adapters configuration form (step 4).""" from central.gui.wizard import get_wizard_state - from central.gui.csrf import reuse_or_generate_pre_auth_csrf settings = get_settings() @@ -765,7 +758,6 @@ async def setup_adapters_form(request: Request) -> HTMLResponse: async def setup_adapters_submit(request: Request) -> Response: """Process the adapters configuration form (step 4).""" 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() pool = get_pool() @@ -985,7 +977,6 @@ async def setup_adapters_submit(request: Request) -> Response: async def setup_finish_form(request: Request) -> HTMLResponse: """Render the finish setup page (step 5).""" from central.gui.wizard import get_wizard_state - from central.gui.csrf import reuse_or_generate_pre_auth_csrf settings = get_settings() @@ -1038,7 +1029,6 @@ async def setup_finish_form(request: Request) -> HTMLResponse: async def setup_finish_submit(request: Request) -> Response: """Complete the setup wizard - atomic commit of all wizard state.""" 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 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 None if absent/degenerate/out-of-range (mirrors _parse_events_params).""" try: - n = float(params["north"]); so = float(params["south"]) - e = float(params["east"]); w = float(params["west"]) + n = float(params["north"]) + so = float(params["south"]) + e = float(params["east"]) + w = float(params["west"]) except (KeyError, TypeError, ValueError): return None if -90 <= so < n <= 90 and -180 <= w < e <= 180: diff --git a/tests/test_wfigs.py b/tests/test_wfigs.py index a45746c..fa8fbe6 100644 --- a/tests/test_wfigs.py +++ b/tests/test_wfigs.py @@ -1,13 +1,12 @@ """Tests for WFIGS adapters.""" -import sqlite3 from datetime import datetime, timezone from pathlib import Path from unittest.mock import AsyncMock, MagicMock, patch import pytest -from central.config_models import AdapterConfig, RegionConfig +from central.config_models import AdapterConfig from central.models import Event, Geo