diff --git a/mmgen_node_tools/Ticker.py b/mmgen_node_tools/Ticker.py index bf3398b..7122e44 100755 --- a/mmgen_node_tools/Ticker.py +++ b/mmgen_node_tools/Ticker.py @@ -607,12 +607,10 @@ def make_cfg(gcfg_arg): def parse_asset_id(s, require_label=False): return src_cls['fi' if re.match(fi_pat, s) else 'cc'].parse_asset_id(s, require_label) - def get_rows_from_cfg(add_data=None): + def get_rows_from_cfg(): def gen(): - for n, (k, v) in enumerate(cfg_in.cfg['assets'].items()): + for k, v in cfg_in.cfg['assets'].items(): yield k - if add_data and k in add_data: - v += tuple(add_data[k]) for e in v: yield parse_asset_id(e, require_label=True) return tuple(gen()) @@ -650,7 +648,7 @@ def make_cfg(gcfg_arg): source = parsed_id.source) cl_opt = getattr(gcfg, key) - if (cl_opt or '').lower() in ('', 'none'): + if cl_opt is None or cl_opt.lower() in ('none', ''): return () cf_opt = cfg_in.cfg.get(key,[]) if use_cf_file else [] return tuple(parse_parm(s) for s in (cl_opt.split(',') if cl_opt else cf_opt)) @@ -702,15 +700,16 @@ def make_cfg(gcfg_arg): def get_usr_assets(): return ( - 'user_added', - usr_rows + - (tuple(asset for asset in query if asset) if query else ()) + - usr_columns) + usr_rows + + (tuple(asset for asset in query if asset) if query else ()) + + usr_columns) - def get_portfolio_assets(ret=()): + def get_portfolio_assets(): if cfg_in.portfolio and gcfg.portfolio: ret = (parse_asset_id(e, require_label=True) for e in cfg_in.portfolio) - return ('portfolio', tuple(e for e in ret if (not gcfg.btc) or e.symbol == 'BTC')) + return tuple(e for e in ret if (not gcfg.btc) or e.symbol == 'BTC') + else: + return () def get_portfolio(): return {k: Decimal(v) for k, v in cfg_in.portfolio.items() @@ -730,14 +729,12 @@ def make_cfg(gcfg_arg): rows = ( ('trade_pair',) + query if (query and query.to_asset) else ('bitcoin', parse_asset_id('btc-bitcoin')) if gcfg.btc else - get_rows_from_cfg(add_data={'fiat':['usd-us-dollar']} if gcfg.add_columns else None)) - + get_rows_from_cfg()) for hdr, data in ( - (get_usr_assets(),) if query else - (get_usr_assets(), get_portfolio_assets())): + ('user_uniq', get_usr_assets()), + ('portfolio_uniq', get_portfolio_assets())): if data: - uniq_data = tuple(gen_uniq(data, 'symbol', preload=rows)) - if uniq_data: + if uniq_data := tuple(gen_uniq(data, 'symbol', preload=rows)): rows += (hdr,) + uniq_data return rows @@ -787,11 +784,6 @@ def make_cfg(gcfg_arg): cfg_in = get_cfg_in() - if gcfg.test_suite: # required for testing with overlay - from . import Ticker as this_mod - this_mod.src_cls = src_cls - this_mod.cfg_in = cfg_in - if cmd_args := gcfg._args: if len(cmd_args) > 1: die(1, 'Only one command-line argument is allowed') @@ -808,6 +800,13 @@ def make_cfg(gcfg_arg): proxy = None if proxy == 'none' else proxy proxy2 = get_proxy('proxy2') + portfolio = ( + get_portfolio() if cfg_in.portfolio and get_cfg_var('portfolio') and not query + else None) + + if portfolio and asset_range: + die(1, '--portfolio not supported in market cap view') + cfg = cfg_tuple( rows = create_rows(), usr_rows = usr_rows, @@ -821,9 +820,7 @@ def make_cfg(gcfg_arg): cachedir = get_cfg_var('cachedir') or dfl_cachedir, proxy = proxy, proxy2 = None if proxy2 == 'none' else '' if proxy2 == '' else (proxy2 or proxy), - portfolio = - get_portfolio() if cfg_in.portfolio and get_cfg_var('portfolio') and not query - else None, + portfolio = portfolio, percent_cols = parse_percent_cols(get_cfg_var('percent_cols')), asset_limit = get_cfg_var('asset_limit'), cached_data = get_cfg_var('cached_data'), @@ -835,6 +832,8 @@ def make_cfg(gcfg_arg): quiet = get_cfg_var('quiet'), verbose = get_cfg_var('verbose')) + return (src_cls, cfg_in) + def get_cfg_in(): ret = namedtuple('cfg_in_data', ['cfg', 'portfolio', 'cfg_file', 'portfolio_file']) cfg_file, portfolio_file = ( @@ -871,7 +870,7 @@ class Ticker: self.col1_wid = max(len('TOTAL'), ( max(len(self.create_label(d['id'])) for d in data.values()) if cfg.name_labels else - max(len(d['symbol']) for d in data.values()))) + 1 + max(len(d['symbol']) for d in data.values()))) self.rows = [row._replace(id=self.get_id(row)) if isinstance(row, tuple) else row for row in cfg.rows] @@ -881,7 +880,7 @@ class Ticker: for row in self.rows if isinstance(row, tuple) and row.id in data} self.prices['usd-us-dollar'] = self.get_row_prices('usd-us-dollar') - def format_last_update_col(self, cross_assets=()): + def format_last_updated_col(self, cross_assets=()): if cfg.elapsed: from mmgen.util2 import format_elapsed_hr @@ -899,19 +898,20 @@ class Ticker: min_t = None for row in self.rows: - if isinstance(row, tuple): - try: - t = int(d[row.id]['last_updated']) - except TypeError as e: - d[row.id]['last_updated_fmt'] = gray('--' if 'NoneType' in str(e) else str(e)) - except KeyError as e: - msg(str(e)) - pass - else: - t_fmt = d[row.id]['last_updated_fmt'] = fmt_func( - (min(t, min_t) if min_t else t), - now = now) - max_w = max(len(t_fmt), max_w) + if not isinstance(row, tuple): + continue + try: + t = int(d[row.id]['last_updated']) + except TypeError as e: + d[row.id]['last_updated_fmt'] = gray('--' if 'NoneType' in str(e) else str(e)) + except KeyError as e: + msg(str(e)) + pass + else: + t_fmt = d[row.id]['last_updated_fmt'] = fmt_func( + (min(t, min_t) if min_t else t), + now = now) + max_w = max(len(t_fmt), max_w) self.upd_w = max_w @@ -924,8 +924,9 @@ class Ticker: if asset.id: return asset.id else: + m = asset.symbol for d in self.data.values(): - if d['symbol'] == asset.symbol: + if m == d['symbol']: return d['id'] def create_label(self, id): @@ -961,16 +962,26 @@ class Ticker: if self.table_hdr: yield self.table_hdr - for n, row in enumerate(self.rows, cfg.asset_range[0] if cfg.asset_range else 1): - if isinstance(row, str): - if cfg.asset_range: - return - yield ('-' * self.hl_wid) - else: + if cfg.asset_range: + yield '-' * self.hl_wid + for n, row in enumerate(self.rows, cfg.asset_range[0]): + if isinstance(row, str): + break try: yield self.fmt_row(self.data[row.id], idx=n) except KeyError: yield gray(f'(no data for {row.id})') + else: + for row in self.rows: + if isinstance(row, str): + if cfg.asset_range: + return + yield ('-' * self.hl_wid) + else: + try: + yield self.fmt_row(self.data[row.id]) + except KeyError: + yield gray(f'(no data for {row.id})') yield '-' * self.hl_wid @@ -1003,7 +1014,7 @@ class Ticker: super().__init__(data) - self.format_last_update_col() + self.format_last_updated_col() if cfg.portfolio: self.prices['total'] = {col_id: sum(self.prices[row.id][col_id] * cfg.portfolio[row.id] @@ -1072,9 +1083,9 @@ class Ticker: ) for k in self.col_ids} cols = ( - ['label', 'usd-us-dollar'] + - [asset.id for asset in self.usr_col_assets] + - [a for a, b in ( + ['label', 'usd-us-dollar'] + + [asset.id for asset in self.usr_col_assets] + + [a for a, b in ( ('btc-bitcoin', not cfg.btc_only), ('pct1y', 'y' in cfg.percent_cols), ('pct1m', 'm' in cfg.percent_cols), @@ -1082,6 +1093,17 @@ class Ticker: ('pct1d', 'd' in cfg.percent_cols), ('update_time', cfg.update_time)) if b]) + + if cfg.asset_range: + def get_num_w(): + for n, r in enumerate(cfg.rows): + if isinstance(r, str): + return len(str(n)) + num_w = get_num_w() + col_fs_data.update({ + 'idx': fd(' ' * (num_w + 2), f'{{idx:{num_w}}}) ', num_w + 2)}) + cols = ['idx'] + cols + cols2 = list(cols) if cfg.update_time: cols2.pop() @@ -1095,15 +1117,6 @@ class Ticker: self.fs_num2 = ''.join(col_fs_data[c].fs_num for c in cols2) self.hl_wid2 = sum(col_fs_data[c].wid for c in cols2) - if cfg.asset_range: - def get_col1_w(): - for n, r in enumerate(cfg.rows): - if isinstance(r, str): - return len(str(n)) - col1_w = get_col1_w() - self.fs_str = ' ' * (col1_w + 2) + self.fs_str - self.fs_num = f'{{idx:{col1_w}}}) ' + self.fs_num - @property def table_hdr(self): return self.fs_str.format( @@ -1152,7 +1165,7 @@ class Ticker: for a in self.usr_col_assets: self.prices[a.id]['usd-us-dollar'] = data[a.id]['price_usd'] - self.format_last_update_col(cross_assets=self.usr_col_assets) + self.format_last_updated_col(cross_assets=self.usr_col_assets) self.init_prec() self.init_fs() diff --git a/mmgen_node_tools/main_ticker.py b/mmgen_node_tools/main_ticker.py index 8efb97a..c6b41b3 100755 --- a/mmgen_node_tools/main_ticker.py +++ b/mmgen_node_tools/main_ticker.py @@ -244,9 +244,9 @@ from . import Ticker gcfg = Config(opts_data=opts_data, caller_post_init=True) -Ticker.make_cfg(gcfg) +src_cls, cfg_in = Ticker.make_cfg(gcfg) -from .Ticker import dfl_cachedir, homedir, DataSource, assets_list_gen, cfg_in, src_cls +from .Ticker import dfl_cachedir, homedir, DataSource, assets_list_gen gcfg._post_init() diff --git a/test/cmdtest_d/misc.py b/test/cmdtest_d/misc.py index c2dceff..b64e33c 100755 --- a/test/cmdtest_d/misc.py +++ b/test/cmdtest_d/misc.py @@ -338,8 +338,10 @@ class CmdTestScripts(CmdTestBase): ['1-5'], [ 'USD EURUSD=X BTC ' + '--------------------------------------------- ' r'1\) BTC 23250.77 21848.7527 1.00000000', - r'5\) ADA 0.51 0.4764 0.00002180', + r'5\) ADA 0.51 0.4764 0.00002180' + ' ---------------------------------------------' ], add_opts = ['--add-columns=eurusd=x']) @@ -348,6 +350,7 @@ class CmdTestScripts(CmdTestBase): ['2-5'], [ 'USD EURUSD=X BTC ' + '--------------------------------------------- ' r'2\) ETH 1659.66 1559.5846 0.07138094', r'5\) ADA 0.51 0.4764 0.00002180', ], @@ -358,6 +361,7 @@ class CmdTestScripts(CmdTestBase): ['5-5'], [ 'USD EURUSD=X BTC ' + '--------------------------------------------- ' r'5\) ADA 0.51 0.4764 0.00002180', ], add_opts = ['--add-columns=eurusd=x'])