def get_financial_data(symbol, timeframe, report_type): """ Returns financial data in an iterator of csv rows (tuples). First row will be the headers. symbol: e.g. "C6L.SI" timeframe: "annual" or "quarter" report_type: any string in FINANCIAL_REPORT_TYPES """ logger.info("getting {0} {1} data of {2}".format(timeframe, report_type, symbol)) url = _get_report_url(symbol, timeframe, report_type) html = strict_get(url, _test_for_not_found) try: raw_data = _scrape_html(html) except (IndexError, AttributeError, KeyError) as e: msg = "failed to scrape raw data out from the html content of {0} {1} {2}".format(symbol, timeframe, report_type) logger.exception(e) logger.error(msg) raise ScrapingError(msg) from e try: # exception can only be triggered in transpose_items because preprocess returns a generator items = preprocess(raw_data, symbol, timeframe, report_type) return transpose_items(items) except (AssertionError, ValueError) as e: msg = "failed to preprocess the raw data of {0} {1} {2}".format(symbol, timeframe, report_type) logger.exception(e) logger.error(msg) raise PreprocessingError(msg) from e
def test_transpose_items(self): transposed = fa_util.transpose_items((("foo", [1, 2, 3]), ("bar", [4, 5, 6]))) self.assertEqual(list(transposed), [("foo", "bar"), (1, 4), (2, 5), (3, 6)])