Split adapter.py monolith into focused modules; restore Ruff complexity defaults #15

Merged
Pakobbix merged 1 commits from refactor/adapter-split into master 2026-08-24 19:03:16 +00:00
Owner

Closes #12

gateway-plugin/adapter.py was a 3,493-line monolith. This splits it into focused modules with clear separation of responsibilities, bringing it down to ~857 lines.

Module split

  • 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 attributes)
  • 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 thresholds

Restored PLR0911/0912/0913/0915 to Ruff's built-in defaults (12/50/6/5) instead of "just above the current maxima" — which ratchets the bar down every time code grows (LLM maintenance adds functions, it doesn't refactor them). The existing genuinely-complex functions (frame builders mirroring the wire schema, the QR matrix builder, the dispatch table) now carry an explicit # noqa: PLR09xx marking them as reviewed, frozen exceptions. New code is held to the default ceilings.

Verification

  • All 125 tests green (94 test_android + 31 test_android_http), 0 failures
  • No new ruff errors introduced (plugin-proper has only pre-existing out-of-scope PLR2004/PLW2901)
  • protocol.py (850 lines) reviewed: cohesive wire-protocol layer, no split needed
  • Live-verified against the demo device (gateway running, pairing + messaging OK)
Closes #12 `gateway-plugin/adapter.py` was a 3,493-line monolith. This splits it into focused modules with clear separation of responsibilities, bringing it down to ~857 lines. ## Module split - **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 attributes) - **`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 thresholds Restored `PLR0911/0912/0913/0915` to Ruff's built-in defaults (12/50/6/5) instead of "just above the current maxima" — which ratchets the bar down every time code grows (LLM maintenance adds functions, it doesn't refactor them). The existing genuinely-complex functions (frame builders mirroring the wire schema, the QR matrix builder, the dispatch table) now carry an explicit `# noqa: PLR09xx` marking them as reviewed, frozen exceptions. New code is held to the default ceilings. ## Verification - All 125 tests green (94 `test_android` + 31 `test_android_http`), 0 failures - No new ruff errors introduced (plugin-proper has only pre-existing out-of-scope `PLR2004`/`PLW2901`) - `protocol.py` (850 lines) reviewed: cohesive wire-protocol layer, no split needed - Live-verified against the demo device (gateway running, pairing + messaging OK)
ARIA added 1 commit 2026-08-24 18:55:10 +00:00
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
b8e756c3dd
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.
Collaborator

✅ No issues found — changes look consistent with the stated intent. Ready to be merged.

✅ No issues found — changes look consistent with the stated intent. Ready to be merged.
Pakobbix merged commit 330e63e941 into master 2026-08-24 19:03:16 +00:00
Pakobbix deleted branch refactor/adapter-split 2026-08-24 19:03:17 +00:00
Sign in to join this conversation.