From 66957ffdb0876fdbff6fd48e882008fbd80334b1 Mon Sep 17 00:00:00 2001 From: goodboy Date: Tue, 9 Jun 2026 17:21:26 -0400 Subject: [PATCH] Declare per-daemon-kind backend mod groups Prep for the `brokerd` -> (`datad` + `brokerd`) actor split by having each (split-style) backend declare which of its submods host which daemon-kind's eps, exactly per the `piker.data.validate._eps` groupings; `ib` already had `_brokerd_mods`/`_datad_mods` so extend the convention to `kraken`, `binance` and `deribit` (and add `'api'` to ib's datad set since both kinds need the `Client` layer). `__enable_modules__` stays as the (deduped) union so this is a ZERO behavior change; flat backends (`kucoin` etc.) just don't declare the split yet. Also, - add `validate.get_eps()` returning a backend's defined eps per daemon-kind for spawn-time introspection. - import `NoBsWs`/`open_autorecon_ws` from `piker.data._web_bs` directly in `.kraken.broker` (they were only re-exported via `.kraken.feed`) so the trading mod doesn't depend on the feed mod for ws primitives. (this patch was generated in some part by [`claude-code`][claude-code-gh]) [claude-code-gh]: https://github.com/anthropics/claude-code Co-Authored-By: Claude Fable 5 --- piker/brokers/binance/__init__.py | 22 +++++++++++++++++++--- piker/brokers/deribit/__init__.py | 18 +++++++++++++++--- piker/brokers/ib/__init__.py | 5 +++-- piker/brokers/kraken/__init__.py | 18 ++++++++++++++++-- piker/brokers/kraken/broker.py | 6 ++++-- piker/data/validate.py | 18 ++++++++++++++++++ 6 files changed, 75 insertions(+), 12 deletions(-) diff --git a/piker/brokers/binance/__init__.py b/piker/brokers/binance/__init__.py index 830b1acf..75c50916 100644 --- a/piker/brokers/binance/__init__.py +++ b/piker/brokers/binance/__init__.py @@ -52,9 +52,25 @@ __all__ = [ ] -# `brokerd` modules -__enable_modules__: list[str] = [ +# per-daemon-kind (sub)mod groups: declares which of our +# submods host the eps run by each daemon-actor kind as +# defined by `piker.data.validate._eps`. +# NOTE: `get_mkt_info` and `open_symbol_search` both live +# in `.feed` for this backend (no `symbols.py`). +_brokerd_mods: list[str] = [ 'api', - 'feed', 'broker', ] + +_datad_mods: list[str] = [ + 'api', + 'feed', +] + + +# tractor RPC enable arg +__enable_modules__: list[str] = list(dict.fromkeys( + _brokerd_mods + + + _datad_mods +)) diff --git a/piker/brokers/deribit/__init__.py b/piker/brokers/deribit/__init__.py index 4c0c1850..6e1a4c80 100644 --- a/piker/brokers/deribit/__init__.py +++ b/piker/brokers/deribit/__init__.py @@ -47,13 +47,25 @@ __all__ = [ ] -# tractor RPC enable arg -__enable_modules__: list[str] = [ +# per-daemon-kind (sub)mod groups: declares which of our +# submods host the eps run by each daemon-actor kind as +# defined by `piker.data.validate._eps`. +# NOTE: datad-only backend (no `broker.py` yet)! +_brokerd_mods: list[str] = [] + +_datad_mods: list[str] = [ 'api', 'feed', -# 'broker', ] + +# tractor RPC enable arg +__enable_modules__: list[str] = list(dict.fromkeys( + _brokerd_mods + + + _datad_mods +)) + # passed to ``tractor.ActorNursery.start_actor()`` _spawn_kwargs = { 'infect_asyncio': True, diff --git a/piker/brokers/ib/__init__.py b/piker/brokers/ib/__init__.py index e07ad482..e9f73b70 100644 --- a/piker/brokers/ib/__init__.py +++ b/piker/brokers/ib/__init__.py @@ -65,17 +65,18 @@ _brokerd_mods: list[str] = [ ] _datad_mods: list[str] = [ + 'api', 'feed', 'symbols', ] # tractor RPC enable arg -__enable_modules__: list[str] = ( +__enable_modules__: list[str] = list(dict.fromkeys( _brokerd_mods + _datad_mods -) +)) # passed to ``tractor.ActorNursery.start_actor()`` _spawn_kwargs = { diff --git a/piker/brokers/kraken/__init__.py b/piker/brokers/kraken/__init__.py index 1f5bc876..7254958a 100644 --- a/piker/brokers/kraken/__init__.py +++ b/piker/brokers/kraken/__init__.py @@ -66,10 +66,24 @@ __all__ = [ ] -# tractor RPC enable arg -__enable_modules__: list[str] = [ +# per-daemon-kind (sub)mod groups: declares which of our +# submods host the eps run by each daemon-actor kind as +# defined by `piker.data.validate._eps`. +_brokerd_mods: list[str] = [ 'api', 'broker', +] + +_datad_mods: list[str] = [ + 'api', 'feed', 'symbols', ] + + +# tractor RPC enable arg +__enable_modules__: list[str] = list(dict.fromkeys( + _brokerd_mods + + + _datad_mods +)) diff --git a/piker/brokers/kraken/broker.py b/piker/brokers/kraken/broker.py index 521dbdc6..92709d78 100644 --- a/piker/brokers/kraken/broker.py +++ b/piker/brokers/kraken/broker.py @@ -73,10 +73,12 @@ from piker.log import ( get_logger, ) from piker.data import open_symcache -from . import api -from .feed import ( +from piker.data._web_bs import ( open_autorecon_ws, NoBsWs, +) +from . import api +from .feed import ( stream_messages, ) from .ledger import ( diff --git a/piker/data/validate.py b/piker/data/validate.py index 38bd4086..f460bd71 100644 --- a/piker/data/validate.py +++ b/piker/data/validate.py @@ -91,6 +91,24 @@ _eps: dict[str, list[str]] = { } +def get_eps( + mod: ModuleType, + kind: str, # 'middleware' | 'datad' | 'brokerd' + +) -> dict[str, Callable]: + ''' + Return the daemon-kind's ep funcs defined by the backend + `mod`, keyed by ep name; any eps from `_eps[kind]` not + implemented by the backend are excluded. + + ''' + return { + name: ep + for name in _eps[kind] + if (ep := getattr(mod, name, None)) + } + + def validate_backend( mod: ModuleType, syms: list[str],