From 8dcdf7c9a9cf47d166e83aebb42d31ae5bbc6811 Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Thu, 13 Feb 2025 10:59:25 -0500 Subject: [PATCH] Invert `getattr()` check for `get_mkt_pairs()` ep Such that we `return` early when not defined by the provider backend to reduce an indent level in `SymbologyCache.load()`. --- piker/data/_symcache.py | 108 ++++++++++++++++++++++------------------ 1 file changed, 60 insertions(+), 48 deletions(-) diff --git a/piker/data/_symcache.py b/piker/data/_symcache.py index fc1057a0..bcaa5844 100644 --- a/piker/data/_symcache.py +++ b/piker/data/_symcache.py @@ -31,6 +31,7 @@ from pathlib import Path from pprint import pformat from typing import ( Any, + Callable, Sequence, Hashable, TYPE_CHECKING, @@ -56,7 +57,7 @@ from piker.brokers import ( ) if TYPE_CHECKING: - from ..accounting import ( + from piker.accounting import ( Asset, MktPair, ) @@ -149,57 +150,68 @@ class SymbologyCache(Struct): 'Implement `Client.get_assets()`!' ) - if get_mkt_pairs := getattr(client, 'get_mkt_pairs', None): - - pairs: dict[str, Struct] = await get_mkt_pairs() - for bs_fqme, pair in pairs.items(): - - # NOTE: every backend defined pair should - # declare it's ns path for roundtrip - # serialization lookup. - if not getattr(pair, 'ns_path', None): - raise TypeError( - f'Pair-struct for {self.mod.name} MUST define a ' - '`.ns_path: str`!\n' - f'{pair}' - ) - - entry = await self.mod.get_mkt_info(pair.bs_fqme) - if not entry: - continue - - mkt: MktPair - pair: Struct - mkt, _pair = entry - assert _pair is pair, ( - f'`{self.mod.name}` backend probably has a ' - 'keying-symmetry problem between the pair-`Struct` ' - 'returned from `Client.get_mkt_pairs()`and the ' - 'module level endpoint: `.get_mkt_info()`\n\n' - "Here's the struct diff:\n" - f'{_pair - pair}' - ) - # NOTE XXX: this means backends MUST implement - # a `Struct.bs_mktid: str` field to provide - # a native-keyed map to their own symbol - # set(s). - self.pairs[pair.bs_mktid] = pair - - # NOTE: `MktPair`s are keyed here using piker's - # internal FQME schema so that search, - # accounting and feed init can be accomplished - # a sane, uniform, normalized basis. - self.mktmaps[mkt.fqme] = mkt - - self.pair_ns_path: str = tractor.msg.NamespacePath.from_ref( - pair, - ) - - else: + get_mkt_pairs: Callable|None = getattr( + client, + 'get_mkt_pairs', + None, + ) + if not get_mkt_pairs: log.warning( 'No symbology cache `Pair` support for `{provider}`..\n' 'Implement `Client.get_mkt_pairs()`!' ) + return self + + pairs: dict[str, Struct] = await get_mkt_pairs() + if not pairs: + log.warning( + 'No pairs from intial {provider!r} sym-cache request?\n\n' + '`Client.get_mkt_pairs()` -> {pairs!r} ?' + ) + return self + + for bs_fqme, pair in pairs.items(): + if not getattr(pair, 'ns_path', None): + # XXX: every backend defined pair must declare + # a `.ns_path: tractor.NamespacePath` to enable + # roundtrip serialization lookup from a local + # cache file. + raise TypeError( + f'Pair-struct for {self.mod.name} MUST define a ' + '`.ns_path: str`!\n\n' + f'{pair!r}' + ) + + entry = await self.mod.get_mkt_info(pair.bs_fqme) + if not entry: + continue + + mkt: MktPair + pair: Struct + mkt, _pair = entry + assert _pair is pair, ( + f'`{self.mod.name}` backend probably has a ' + 'keying-symmetry problem between the pair-`Struct` ' + 'returned from `Client.get_mkt_pairs()`and the ' + 'module level endpoint: `.get_mkt_info()`\n\n' + "Here's the struct diff:\n" + f'{_pair - pair}' + ) + # NOTE XXX: this means backends MUST implement + # a `Struct.bs_mktid: str` field to provide + # a native-keyed map to their own symbol + # set(s). + self.pairs[pair.bs_mktid] = pair + + # NOTE: `MktPair`s are keyed here using piker's + # internal FQME schema so that search, + # accounting and feed init can be accomplished + # a sane, uniform, normalized basis. + self.mktmaps[mkt.fqme] = mkt + + self.pair_ns_path: str = tractor.msg.NamespacePath.from_ref( + pair, + ) return self