From 588b5c317ccd053567469d8b5fcd909e6500847c Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Mon, 14 Jun 2021 00:02:23 -0400 Subject: [PATCH 1/2] Drop unseralizable "sec tag" for now --- piker/brokers/ib.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/piker/brokers/ib.py b/piker/brokers/ib.py index e94fd561..cecc8be0 100644 --- a/piker/brokers/ib.py +++ b/piker/brokers/ib.py @@ -282,7 +282,6 @@ class Client: pattern: str, # how many contracts to search "up to" upto: int = 3, - asdicts: bool = True, ) -> Dict[str, ContractDetails]: """Search for stocks matching provided ``str`` pattern. @@ -304,11 +303,17 @@ class Client: # XXX: if there is more then one entry in the details list details = {} for details_set in results: + # then the contract is so called "ambiguous". for d in details_set: con = d.contract unique_sym = f'{con.symbol}.{con.primaryExchange}' - details[unique_sym] = asdict(d) if asdicts else d + + as_dict = asdict(d) + # nested dataclass we probably don't need and that won't IPC serialize + as_dict.pop('secIdList') + + details[unique_sym] = as_dict if len(details) == upto: return details @@ -1086,6 +1091,9 @@ async def stream_quotes( syminfo = asdict(details) syminfo.update(syminfo['contract']) + # nested dataclass we probably don't need and that won't IPC serialize + syminfo.pop('secIdList') + # TODO: more consistent field translation atype = syminfo['asset_type'] = asset_type_map[syminfo['secType']] From 3455ebc60c62abdac4fe411e69665ec216d2d188 Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Mon, 14 Jun 2021 00:03:05 -0400 Subject: [PATCH 2/2] Cast back to tuples after msgspec strips them... --- piker/data/_sharedmem.py | 3 +-- piker/data/feed.py | 5 ++++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/piker/data/_sharedmem.py b/piker/data/_sharedmem.py index b4e6de86..aa2a5320 100644 --- a/piker/data/_sharedmem.py +++ b/piker/data/_sharedmem.py @@ -97,8 +97,7 @@ class _Token: def __post_init__(self): # np.array requires a list for dtype - self.dtype_descr = np.dtype( - list(self.dtype_descr)).descr + self.dtype_descr = np.dtype(list(map(tuple, self.dtype_descr))).descr def as_msg(self): return asdict(self) diff --git a/piker/data/feed.py b/piker/data/feed.py index 0f856627..4a41500d 100644 --- a/piker/data/feed.py +++ b/piker/data/feed.py @@ -514,7 +514,10 @@ async def open_feed( # cast shm dtype to list... can't member why we need this shm_token = data['shm_token'] - shm_token['dtype_descr'] = list(shm_token['dtype_descr']) + + # XXX: msgspec won't relay through the tuples XD + shm_token['dtype_descr'] = list(map(tuple, shm_token['dtype_descr'])) + assert shm_token == shm.token # sanity feed._max_sample_rate = max(ohlc_sample_rates)