#!/usr/bin/env python3
+import logging
from typing import Dict, List, Optional, Tuple
+
import yfinance as yf # type: ignore
import file_writer
import renderer
-class stock_quote_renderer(renderer.debuggable_abstaining_renderer):
+logger = logging.getLogger(__file__)
+
+
+class stock_quote_renderer(renderer.abstaining_renderer):
"""Render the stock prices page."""
def __init__(
symbols: List[str],
display_subs: Dict[str, str] = None,
) -> None:
- super(stock_quote_renderer, self).__init__(name_to_timeout_dict, False)
+ super().__init__(name_to_timeout_dict)
self.symbols = symbols
self.display_subs = display_subs
- def debug_prefix(self) -> str:
- return "stock"
-
@staticmethod
def get_ticker_name(ticker: yf.ticker.Ticker) -> str:
"""Get friendly name of a ticker."""
info = ticker.get_info()
- return info["shortName"]
+ if "shortName" in info:
+ return info["shortName"]
+ return ticker
@staticmethod
def get_price(ticker: yf.ticker.Ticker) -> Optional[float]:
symbols_finished = 0
for symbol in self.symbols:
ticker = yf.Ticker(symbol)
- print(type(ticker))
# print(ticker.get_info())
if ticker is None:
- self.debug_print(f"Unknown symbol {symbol} -- ignored.")
+ logger.debug(f"Unknown symbol {symbol} -- ignored.")
continue
name = stock_quote_renderer.get_ticker_name(ticker)
price = stock_quote_renderer.get_price(ticker)
if price is None:
- self.debug_print(f"No price information for {symbol} -- skipped.")
+ logger.debug(f"No price information for {symbol} -- skipped.")
continue
(percent_change, delta) = stock_quote_renderer.get_change_and_delta(
ticker, price
return True
# Test
-#x = stock_quote_renderer({}, ["MSFT", "GOOG", "BTC-USD", "OPTAX", "GC=F", "VNQ"], { "BTC-USD": "BTC", "GC=F": "GOLD" })
+#x = stock_quote_renderer({}, ["MSFT", "GOOG", "BTC-USD", "ABHYX", "GC=F", "VNQ"], { "BTC-USD": "BTC", "GC=F": "GOLD" })
#x.periodic_render(None)