From 96970f736c8fd330d9b590accef96776a70aeb88 Mon Sep 17 00:00:00 2001 From: Chris Berkhout Date: Thu, 27 May 2021 22:41:09 +0200 Subject: [PATCH] sources and symbols listing has a formatting helper. --- src/pricehist/cli.py | 15 ++++++++------- src/pricehist/sources/basesource.py | 2 +- src/pricehist/sources/coindesk.py | 8 ++++---- src/pricehist/sources/coinmarketcap.py | 4 +--- src/pricehist/sources/ecb.py | 3 +-- 5 files changed, 15 insertions(+), 17 deletions(-) diff --git a/src/pricehist/cli.py b/src/pricehist/cli.py index b8c88f8..589dfb9 100644 --- a/src/pricehist/cli.py +++ b/src/pricehist/cli.py @@ -41,13 +41,14 @@ def cli(args=None, output_file=sys.stdout): logging.debug(f"Finished pricehist run at {datetime.now()}.") +def _format_pairs(pairs, gap=4): + width = max([len(a) for a, b in pairs]) + lines = [a.ljust(width + gap) + b for a, b in pairs] + return "\n".join(lines) + + def cmd_sources(args): - width = max([len(identifier) for identifier in sources.by_id.keys()]) - source_lines = [ - f"{identifier.ljust(width)} {source.name()}" - for identifier, source in sources.by_id.items() - ] - return "\n".join(source_lines) + return _format_pairs([(s.id(), s.name()) for k, s in sorted(sources.by_id.items())]) def cmd_source(args): @@ -75,7 +76,7 @@ def cmd_source(args): source = sources.by_id[args.identifier] if args.symbols: - return "\n".join(source.symbols()) + return _format_pairs(source.symbols()) else: k_width = 11 total_width = shutil.get_terminal_size().columns diff --git a/src/pricehist/sources/basesource.py b/src/pricehist/sources/basesource.py index 8e04c09..67012ca 100644 --- a/src/pricehist/sources/basesource.py +++ b/src/pricehist/sources/basesource.py @@ -36,7 +36,7 @@ class BaseSource(ABC): pass @abstractmethod - def symbols(self) -> list[str]: + def symbols(self) -> list[(str, str)]: pass @abstractmethod diff --git a/src/pricehist/sources/coindesk.py b/src/pricehist/sources/coindesk.py index aa9aa02..fc0075f 100644 --- a/src/pricehist/sources/coindesk.py +++ b/src/pricehist/sources/coindesk.py @@ -39,10 +39,10 @@ class CoinDesk(BaseSource): response = self.log_curl(requests.get(url)) data = json.loads(response.content) relevant = [i for i in data if i["currency"] not in ["XBT", "BTC"]] - symbols = sorted( - [f"BTC/{i['currency']} Bitcoin against {i['country']}" for i in relevant] - ) - return symbols + return [ + (f"BTC/{i['currency']}", f"Bitcoin against {i['country']}") + for i in sorted(relevant, key=lambda i: i["currency"]) + ] def fetch(self, series): data = self._data(series) diff --git a/src/pricehist/sources/coinmarketcap.py b/src/pricehist/sources/coinmarketcap.py index 37e49a8..438a471 100644 --- a/src/pricehist/sources/coinmarketcap.py +++ b/src/pricehist/sources/coinmarketcap.py @@ -43,10 +43,8 @@ class CoinMarketCap(BaseSource): def symbols(self): data = self._symbol_data() ids = [f"id={i['id']}" for i in data] - id_width = max([len(id) for id in ids]) descriptions = [f"{i['symbol'] or i['code']} {i['name']}".strip() for i in data] - rows = [i.ljust(id_width + 4) + d for i, d in zip(ids, descriptions)] - return rows + return list(zip(ids, descriptions)) def fetch(self, series): data = self._data(series) diff --git a/src/pricehist/sources/ecb.py b/src/pricehist/sources/ecb.py index c8ed92c..e45f3dd 100644 --- a/src/pricehist/sources/ecb.py +++ b/src/pricehist/sources/ecb.py @@ -38,8 +38,7 @@ class ECB(BaseSource): nodes = root.cssselect("[currency]") currencies = sorted(set([n.attrib["currency"] for n in nodes])) iso = isocurrencies.by_code() - pairs = [f"EUR/{c} Euro against {iso[c].name}" for c in currencies] - return pairs + return [(f"EUR/{c}", f"Euro against {iso[c].name}") for c in currencies] def fetch(self, series): almost_90_days_ago = str(datetime.now().date() - timedelta(days=85))