diff --git a/piker/brokers/core.py b/piker/brokers/core.py index 6111d307..c1aa88ac 100644 --- a/piker/brokers/core.py +++ b/piker/brokers/core.py @@ -22,7 +22,9 @@ routines should be primitive data types where possible. """ import inspect from types import ModuleType -from typing import List, Dict, Any, Optional +from typing import ( + Any, +) import trio @@ -34,8 +36,10 @@ from ..accounting import MktPair async def api(brokername: str, methname: str, **kwargs) -> dict: - """Make (proxy through) a broker API call by name and return its result. - """ + ''' + Make (proxy through) a broker API call by name and return its result. + + ''' brokermod = get_brokermod(brokername) async with brokermod.get_client() as client: meth = getattr(client, methname, None) @@ -62,10 +66,14 @@ async def api(brokername: str, methname: str, **kwargs) -> dict: async def stocks_quote( brokermod: ModuleType, - tickers: List[str] -) -> Dict[str, Dict[str, Any]]: - """Return quotes dict for ``tickers``. - """ + tickers: list[str] + +) -> dict[str, dict[str, Any]]: + ''' + Return a `dict` of snapshot quotes for the provided input + `tickers`: a `list` of fqmes. + + ''' async with brokermod.get_client() as client: return await client.quote(tickers) @@ -74,13 +82,15 @@ async def stocks_quote( async def option_chain( brokermod: ModuleType, symbol: str, - date: Optional[str] = None, -) -> Dict[str, Dict[str, Dict[str, Any]]]: - """Return option chain for ``symbol`` for ``date``. + date: str|None = None, +) -> dict[str, dict[str, dict[str, Any]]]: + ''' + Return option chain for ``symbol`` for ``date``. By default all expiries are returned. If ``date`` is provided then contract quotes for that single expiry are returned. - """ + + ''' async with brokermod.get_client() as client: if date: id = int((await client.tickers2ids([symbol]))[symbol]) @@ -98,7 +108,7 @@ async def option_chain( # async def contracts( # brokermod: ModuleType, # symbol: str, -# ) -> Dict[str, Dict[str, Dict[str, Any]]]: +# ) -> dict[str, dict[str, dict[str, Any]]]: # """Return option contracts (all expiries) for ``symbol``. # """ # async with brokermod.get_client() as client: @@ -110,15 +120,24 @@ async def bars( brokermod: ModuleType, symbol: str, **kwargs, -) -> Dict[str, Dict[str, Dict[str, Any]]]: - """Return option contracts (all expiries) for ``symbol``. - """ +) -> dict[str, dict[str, dict[str, Any]]]: + ''' + Return option contracts (all expiries) for ``symbol``. + + ''' async with brokermod.get_client() as client: return await client.bars(symbol, **kwargs) -async def search_w_brokerd(name: str, pattern: str) -> dict: +async def search_w_brokerd( + name: str, + pattern: str, +) -> dict: + # TODO: WHY NOT WORK!?! + # when we `step` through the next block? + # import tractor + # await tractor.pause() async with open_cached_client(name) as client: # TODO: support multiple asset type concurrent searches. @@ -130,12 +149,12 @@ async def symbol_search( pattern: str, **kwargs, -) -> Dict[str, Dict[str, Dict[str, Any]]]: +) -> dict[str, dict[str, dict[str, Any]]]: ''' Return symbol info from broker. ''' - results = [] + results: list[str] = [] async def search_backend( brokermod: ModuleType @@ -143,6 +162,13 @@ async def symbol_search( brokername: str = mod.name + # TODO: figure this the FUCK OUT + # -> ok so obvi in the root actor any async task that's + # spawned outside the main tractor-root-actor task needs to + # call this.. + # await tractor.devx._debug.maybe_init_greenback() + # tractor.pause_from_sync() + async with maybe_spawn_brokerd( mod.name, infect_asyncio=getattr( @@ -162,7 +188,6 @@ async def symbol_search( )) async with trio.open_nursery() as n: - for mod in brokermods: n.start_soon(search_backend, mod.name) @@ -172,11 +197,13 @@ async def symbol_search( async def mkt_info( brokermod: ModuleType, fqme: str, + **kwargs, ) -> MktPair: ''' - Return MktPair info from broker including src and dst assets. + Return the `piker.accounting.MktPair` info struct from a given + backend broker tradable src/dst asset pair. ''' async with open_cached_client(brokermod.name) as client: