From e2fef86ee0d5d358cb57da17f4b5146c1b280a0b Mon Sep 17 00:00:00 2001 From: Mariusz Banach Date: Wed, 18 Feb 2026 00:20:19 +0100 Subject: [PATCH] MAESTRO: fix ruff lint --- ...er-analyzer-Phase-02-Engine-Refactoring.md | 2 +- backend/app/engine/analyzer.py | 21 +++++++++++++------ backend/app/engine/logger.py | 3 ++- backend/app/engine/parser.py | 2 +- backend/app/engine/scanner_registry.py | 14 +++++++------ .../app/engine/scanners/_legacy_adapter.py | 15 ++++++++----- backend/app/engine/scanners/barracuda.py | 1 - .../app/engine/scanners/forefront_antispam.py | 1 - backend/app/engine/scanners/general.py | 1 - backend/app/engine/scanners/ironport.py | 1 - .../app/engine/scanners/microsoft_general.py | 1 - backend/app/engine/scanners/mimecast.py | 1 - backend/app/engine/scanners/proofpoint.py | 1 - .../app/engine/scanners/received_headers.py | 1 - backend/app/engine/scanners/spamassassin.py | 1 - backend/app/engine/scanners/trendmicro.py | 1 - backend/tests/engine/test_analyzer.py | 1 - backend/tests/engine/test_cli_parity.py | 1 - backend/tests/engine/test_parser.py | 1 - 19 files changed, 37 insertions(+), 33 deletions(-) diff --git a/Auto Run Docs/SpecKit-web-header-analyzer-Phase-02-Engine-Refactoring.md b/Auto Run Docs/SpecKit-web-header-analyzer-Phase-02-Engine-Refactoring.md index ca72159..ca607db 100644 --- a/Auto Run Docs/SpecKit-web-header-analyzer-Phase-02-Engine-Refactoring.md +++ b/Auto Run Docs/SpecKit-web-header-analyzer-Phase-02-Engine-Refactoring.md @@ -71,5 +71,5 @@ backend/app/engine/ - [x] All 106+ tests are registered in the scanner registry (`ScannerRegistry.get_all()` returns 106+ scanners) - Verified `ScannerRegistry.get_all()` returns 106 scanners (IDs 1-106, none missing). - [x] Analysis of `backend/tests/fixtures/sample_headers.txt` produces results matching original CLI output -- [ ] `ruff check backend/` passes with zero errors +- [x] `ruff check backend/` passes with zero errors - [ ] Run `/speckit.analyze` to verify consistency diff --git a/backend/app/engine/analyzer.py b/backend/app/engine/analyzer.py index 8c3742a..5b25b19 100644 --- a/backend/app/engine/analyzer.py +++ b/backend/app/engine/analyzer.py @@ -1,16 +1,23 @@ from __future__ import annotations -from concurrent.futures import ThreadPoolExecutor, TimeoutError as FutureTimeoutError +from concurrent.futures import ThreadPoolExecutor +from concurrent.futures import TimeoutError as FutureTimeoutError from time import perf_counter from typing import Callable -from .models import AnalysisRequest, AnalysisResult, ReportMetadata, Severity, TestResult, TestStatus +from .models import ( + AnalysisRequest, + AnalysisResult, + ReportMetadata, + Severity, + TestResult, + TestStatus, +) from .parser import HeaderParser, ParsedHeader from .scanner_base import BaseScanner from .scanner_registry import ScannerRegistry from .scanners._legacy_adapter import configure_legacy - ProgressCallback = Callable[[int, int, str], None] DEFAULT_PER_TEST_TIMEOUT_SECONDS = 3.0 @@ -111,9 +118,11 @@ class HeaderAnalyzer: return future.result(timeout=self._per_test_timeout_seconds) except FutureTimeoutError as exc: future.cancel() - raise TimeoutError( - f"Test {scanner.id} timed out after {self._per_test_timeout_seconds:.2f}s" - ) from exc + message = ( + f"Test {scanner.id} timed out after " + f"{self._per_test_timeout_seconds:.2f}s" + ) + raise TimeoutError(message) from exc finally: executor.shutdown(wait=False, cancel_futures=True) diff --git a/backend/app/engine/logger.py b/backend/app/engine/logger.py index 79924ae..25de3c8 100644 --- a/backend/app/engine/logger.py +++ b/backend/app/engine/logger.py @@ -93,7 +93,8 @@ class Logger: if pos1 == -1: raise ValueError( - "Output colors mismatch - could not find pos of end of color number!" + "Output colors mismatch - could not find pos of end of " + "color number!" ) c = int(s[pos : pos + pos1]) diff --git a/backend/app/engine/parser.py b/backend/app/engine/parser.py index 511d7e1..3e4a6ac 100644 --- a/backend/app/engine/parser.py +++ b/backend/app/engine/parser.py @@ -1,7 +1,7 @@ from __future__ import annotations -from dataclasses import dataclass import re +from dataclasses import dataclass @dataclass diff --git a/backend/app/engine/scanner_registry.py b/backend/app/engine/scanner_registry.py index 5d929ab..3fba394 100644 --- a/backend/app/engine/scanner_registry.py +++ b/backend/app/engine/scanner_registry.py @@ -1,10 +1,10 @@ from __future__ import annotations -from dataclasses import dataclass -from importlib import import_module import inspect import pkgutil import re +from dataclasses import dataclass +from importlib import import_module from pathlib import Path from typing import TYPE_CHECKING, Iterable @@ -44,7 +44,9 @@ class ScannerRegistry: discovered = _discover_scanners() if discovered: self._scanners = _dedupe_scanners(discovered) - self._category_map = _build_category_map(scanner.id for scanner in self._scanners) + self._category_map = _build_category_map( + scanner.id for scanner in self._scanners + ) else: tests = _load_tests_from_monolith() self._category_map = _build_category_map(test_id for test_id, _ in tests) @@ -99,11 +101,11 @@ def _discover_scanners() -> list[BaseScanner]: def _extract_scanners(module: object) -> list[BaseScanner]: scanners: list[BaseScanner] = [] if hasattr(module, "SCANNERS"): - declared = getattr(module, "SCANNERS") + declared = module.SCANNERS if isinstance(declared, list | tuple): scanners.extend(declared) - if hasattr(module, "get_scanners") and callable(getattr(module, "get_scanners")): - declared = getattr(module, "get_scanners")() + if hasattr(module, "get_scanners") and callable(module.get_scanners): + declared = module.get_scanners() if isinstance(declared, list | tuple): scanners.extend(declared) diff --git a/backend/app/engine/scanners/_legacy_adapter.py b/backend/app/engine/scanners/_legacy_adapter.py index bc32023..ca98fbe 100644 --- a/backend/app/engine/scanners/_legacy_adapter.py +++ b/backend/app/engine/scanners/_legacy_adapter.py @@ -1,7 +1,7 @@ from __future__ import annotations -from dataclasses import dataclass import importlib.util +from dataclasses import dataclass from pathlib import Path from typing import Iterable @@ -9,7 +9,6 @@ from app.engine.logger import Logger as EngineLogger from app.engine.models import Severity, TestResult, TestStatus from app.engine.parser import ParsedHeader - _LEGACY_MODULE = None _TEST_CATALOG: dict[int, tuple[str, str]] | None = None _ARRAY_TESTS: set[int] | None = None @@ -189,7 +188,9 @@ def _normalize_payload(payload: object) -> tuple[str, str, str, str] | None: return None -def _combine_payloads(payloads: list[tuple[str, str, str, str]]) -> tuple[str, str, str, str]: +def _combine_payloads( + payloads: list[tuple[str, str, str, str]] +) -> tuple[str, str, str, str]: headers: list[str] = [] values: list[str] = [] analyses: list[str] = [] @@ -284,7 +285,9 @@ class LegacyScanner: ) -def build_scanners(test_ids: Iterable[int], category: str | None = None) -> list[LegacyScanner]: +def build_scanners( + test_ids: Iterable[int], category: str | None = None +) -> list[LegacyScanner]: catalog, _array_ids = _load_test_catalog() scanners: list[LegacyScanner] = [] for test_id in test_ids: @@ -292,6 +295,8 @@ def build_scanners(test_ids: Iterable[int], category: str | None = None) -> list raise ValueError(f"Unknown test id: {test_id}") name, method_name = catalog[test_id] scanners.append( - LegacyScanner(id=test_id, name=name, method_name=method_name, category=category) + LegacyScanner( + id=test_id, name=name, method_name=method_name, category=category + ) ) return scanners diff --git a/backend/app/engine/scanners/barracuda.py b/backend/app/engine/scanners/barracuda.py index cca810b..b581698 100644 --- a/backend/app/engine/scanners/barracuda.py +++ b/backend/app/engine/scanners/barracuda.py @@ -2,5 +2,4 @@ from __future__ import annotations from ._legacy_adapter import build_scanners - SCANNERS = build_scanners([69, 70, 71, 72, 73], category="Barracuda") diff --git a/backend/app/engine/scanners/forefront_antispam.py b/backend/app/engine/scanners/forefront_antispam.py index 6c671f7..1f9d8e0 100644 --- a/backend/app/engine/scanners/forefront_antispam.py +++ b/backend/app/engine/scanners/forefront_antispam.py @@ -2,7 +2,6 @@ from __future__ import annotations from ._legacy_adapter import build_scanners - SCANNERS = build_scanners( [12, 13, 14, 15, 16, 63, 64], category="Forefront Antispam", diff --git a/backend/app/engine/scanners/general.py b/backend/app/engine/scanners/general.py index 9d9c104..17ef214 100644 --- a/backend/app/engine/scanners/general.py +++ b/backend/app/engine/scanners/general.py @@ -2,7 +2,6 @@ from __future__ import annotations from ._legacy_adapter import build_scanners - SCANNERS = build_scanners( [ 4, diff --git a/backend/app/engine/scanners/ironport.py b/backend/app/engine/scanners/ironport.py index 4fff947..a3690d5 100644 --- a/backend/app/engine/scanners/ironport.py +++ b/backend/app/engine/scanners/ironport.py @@ -2,7 +2,6 @@ from __future__ import annotations from ._legacy_adapter import build_scanners - SCANNERS = build_scanners( [27, 28, 29, 38, 39, 40, 41, 42, 43, 88, 89], category="IronPort", diff --git a/backend/app/engine/scanners/microsoft_general.py b/backend/app/engine/scanners/microsoft_general.py index 788c6be..af46386 100644 --- a/backend/app/engine/scanners/microsoft_general.py +++ b/backend/app/engine/scanners/microsoft_general.py @@ -2,7 +2,6 @@ from __future__ import annotations from ._legacy_adapter import build_scanners - SCANNERS = build_scanners( [31, 32, 33, 34, 35, 80, 83, 84, 85, 99, 100, 101, 102], category="Microsoft", diff --git a/backend/app/engine/scanners/mimecast.py b/backend/app/engine/scanners/mimecast.py index a7bc1e2..46b466b 100644 --- a/backend/app/engine/scanners/mimecast.py +++ b/backend/app/engine/scanners/mimecast.py @@ -2,5 +2,4 @@ from __future__ import annotations from ._legacy_adapter import build_scanners - SCANNERS = build_scanners([30, 61, 62, 65], category="Mimecast") diff --git a/backend/app/engine/scanners/proofpoint.py b/backend/app/engine/scanners/proofpoint.py index 41e39c1..ac41193 100644 --- a/backend/app/engine/scanners/proofpoint.py +++ b/backend/app/engine/scanners/proofpoint.py @@ -2,5 +2,4 @@ from __future__ import annotations from ._legacy_adapter import build_scanners - SCANNERS = build_scanners([66, 67], category="Proofpoint") diff --git a/backend/app/engine/scanners/received_headers.py b/backend/app/engine/scanners/received_headers.py index ffbd80a..abf1160 100644 --- a/backend/app/engine/scanners/received_headers.py +++ b/backend/app/engine/scanners/received_headers.py @@ -2,5 +2,4 @@ from __future__ import annotations from ._legacy_adapter import build_scanners - SCANNERS = build_scanners([1, 2, 3], category="Received Headers") diff --git a/backend/app/engine/scanners/spamassassin.py b/backend/app/engine/scanners/spamassassin.py index 85987df..0c923bf 100644 --- a/backend/app/engine/scanners/spamassassin.py +++ b/backend/app/engine/scanners/spamassassin.py @@ -2,5 +2,4 @@ from __future__ import annotations from ._legacy_adapter import build_scanners - SCANNERS = build_scanners([18, 19, 20, 21, 74], category="SpamAssassin") diff --git a/backend/app/engine/scanners/trendmicro.py b/backend/app/engine/scanners/trendmicro.py index 1d9e7c3..bff89f3 100644 --- a/backend/app/engine/scanners/trendmicro.py +++ b/backend/app/engine/scanners/trendmicro.py @@ -2,5 +2,4 @@ from __future__ import annotations from ._legacy_adapter import build_scanners - SCANNERS = build_scanners(list(range(47, 60)) + [97], category="Trend Micro") diff --git a/backend/tests/engine/test_analyzer.py b/backend/tests/engine/test_analyzer.py index 24956a9..019a5eb 100644 --- a/backend/tests/engine/test_analyzer.py +++ b/backend/tests/engine/test_analyzer.py @@ -5,7 +5,6 @@ from pathlib import Path from app.engine.analyzer import HeaderAnalyzer from app.engine.models import AnalysisRequest, AnalysisResult, TestResult - FIXTURES_DIR = Path(__file__).resolve().parents[1] / "fixtures" diff --git a/backend/tests/engine/test_cli_parity.py b/backend/tests/engine/test_cli_parity.py index 8b6b7f3..44f72f7 100644 --- a/backend/tests/engine/test_cli_parity.py +++ b/backend/tests/engine/test_cli_parity.py @@ -7,7 +7,6 @@ from app.engine.analyzer import HeaderAnalyzer from app.engine.logger import Logger as EngineLogger from app.engine.models import AnalysisRequest, TestStatus - FIXTURES_DIR = Path(__file__).resolve().parents[1] / "fixtures" diff --git a/backend/tests/engine/test_parser.py b/backend/tests/engine/test_parser.py index aa8d2d6..d9f001e 100644 --- a/backend/tests/engine/test_parser.py +++ b/backend/tests/engine/test_parser.py @@ -6,7 +6,6 @@ import pytest from app.engine.parser import HeaderParser - FIXTURES_DIR = Path(__file__).resolve().parents[1] / "fixtures"