Split adapter.py monolith into focused modules; restore Ruff complexity defaults (issue #12)
CI / Gateway plugin tests (pull_request) Successful in 4m59s
CI / Kotlin tests (android host + desktop) (pull_request) Successful in 7m5s

adapter.py was a 3,493-line monolith. Split it into focused modules with
clear separation of responsibilities, bringing it down to ~857 lines:

- Module-level helpers: hooks, classify, pickers, commands, setup,
  defaults, secrets
- Frame-handler mixins: inbound, tool_frames, push_frames, media_frames,
  picker_frames, channel_frames, query_frames
- mixin_base: IrisAdapterBase (declaration-only base for shared attrs)
- adapter.py now holds only IrisAdapter (the composition of the 7 mixins
  + BasePlatformAdapter), register(), and test-facing re-exports

The mixins come before BasePlatformAdapter in the MRO so their methods
override the base; super() calls (e.g. send_image) still resolve to
BasePlatformAdapter. No circular imports; dispatch.py and http_server.py
(instance-method callers) are unaffected.

Ruff complexity ceilings (PLR0911/0912/0913/0915) restored to Ruff's
built-in defaults (12/50/6/5) instead of "just above the current maxima",
which ratchets the bar down as code grows. The existing genuinely-complex
functions (frame builders mirroring the wire schema, the QR matrix builder,
the dispatch table) carry an explicit `# noqa: PLR09xx` marking them as
reviewed, frozen exceptions; new code is held to the default ceilings.

All 125 tests green (94 test_android + 31 test_android_http); no new ruff
errors introduced.
This commit is contained in:
ARIA committed 2026-08-24 20:55:00 +02:00
1 parent 7faaf2aa1c
commit b8e756c3dd
26 files changed
+3101 -2775

No files matched your search

+5 -5
View File
@@ -63,7 +63,7 @@ class PushBackend:
"""True when the backend has credentials to send with."""
raise NotImplementedError
async def send(
async def send( # noqa: PLR0913
self,
*,
device_id: str,
@@ -126,7 +126,7 @@ class FcmBackend(PushBackend):
self._sa_failed = True
return None
async def _authorization(self, client: httpx.AsyncClient) -> str | None:
async def _authorization(self, client: httpx.AsyncClient) -> str | None: # noqa: PLR0911
"""Bearer token: the legacy server key, or a cached service-account
OAuth2 access token (JWT-bearer grant, minted with PyJWT)."""
if self._server_key:
@@ -187,7 +187,7 @@ class FcmBackend(PushBackend):
self._token_expiry = now + 3600.0
return token
async def send(
async def send( # noqa: PLR0913
self,
*,
device_id: str,
@@ -277,7 +277,7 @@ class NtfyBackend(PushBackend):
def configured(self) -> bool:
return bool(self._topic)
async def send(
async def send( # noqa: PLR0913
self,
*,
device_id: str,
@@ -315,7 +315,7 @@ class NtfyBackend(PushBackend):
return True
def build_push_backend(
def build_push_backend( # noqa: PLR0913
name: str | None,
*,
fcm_service_account: str | None = None,