diff options
| author | Tyler Hoang <tyler@tylerhoang.xyz> | 2026-05-18 00:43:00 -0700 |
|---|---|---|
| committer | Tyler Hoang <tyler@tylerhoang.xyz> | 2026-05-18 00:43:00 -0700 |
| commit | 1e349b8904c6fa52c6f0925453513354c1a4e392 (patch) | |
| tree | 0a70d0aec366bc06cf31c61c31a904139b171963 | |
| parent | 7cb2492c748556af99f2b155a434b92f19461095 (diff) | |
fix: give each statement fetcher its own cache to prevent key collisions
| -rw-r--r-- | backend/app/services/data_service.py | 9 | ||||
| -rw-r--r-- | backend/tests/test_api.py | 18 |
2 files changed, 24 insertions, 3 deletions
diff --git a/backend/app/services/data_service.py b/backend/app/services/data_service.py index bf75bc7..9da9557 100644 --- a/backend/app/services/data_service.py +++ b/backend/app/services/data_service.py @@ -19,6 +19,9 @@ HISTORY_CACHE = TTLCache(maxsize=256, ttl=300) INTRADAY_CACHE = TTLCache(maxsize=128, ttl=60) MARKET_CACHE = TTLCache(maxsize=8, ttl=300) STATEMENT_CACHE = TTLCache(maxsize=256, ttl=3600) +INCOME_CACHE = TTLCache(maxsize=256, ttl=3600) +BALANCE_CACHE = TTLCache(maxsize=256, ttl=3600) +CF_CACHE = TTLCache(maxsize=256, ttl=3600) SHARES_CACHE = TTLCache(maxsize=256, ttl=3600) RATIO_CACHE = TTLCache(maxsize=256, ttl=3600) BETA_CACHE = TTLCache(maxsize=256, ttl=3600) @@ -445,7 +448,7 @@ def get_intraday_history(symbol: str, period: str, interval: str) -> list[dict[s return [] -@cached(STATEMENT_CACHE) +@cached(INCOME_CACHE) def get_income_statement(symbol: str, quarterly: bool = False) -> pd.DataFrame: try: ticker = yf.Ticker(normalize_symbol(symbol)) @@ -455,7 +458,7 @@ def get_income_statement(symbol: str, quarterly: bool = False) -> pd.DataFrame: return pd.DataFrame() -@cached(STATEMENT_CACHE) +@cached(BALANCE_CACHE) def get_balance_sheet(symbol: str, quarterly: bool = False) -> pd.DataFrame: try: ticker = yf.Ticker(normalize_symbol(symbol)) @@ -465,7 +468,7 @@ def get_balance_sheet(symbol: str, quarterly: bool = False) -> pd.DataFrame: return pd.DataFrame() -@cached(STATEMENT_CACHE) +@cached(CF_CACHE) def get_cash_flow(symbol: str, quarterly: bool = False) -> pd.DataFrame: try: ticker = yf.Ticker(normalize_symbol(symbol)) diff --git a/backend/tests/test_api.py b/backend/tests/test_api.py index e5dcead..0054c49 100644 --- a/backend/tests/test_api.py +++ b/backend/tests/test_api.py @@ -12,6 +12,9 @@ def clear_service_caches() -> None: data_service.PRICE_CACHE.clear() data_service.HISTORY_CACHE.clear() data_service.STATEMENT_CACHE.clear() + data_service.INCOME_CACHE.clear() + data_service.BALANCE_CACHE.clear() + data_service.CF_CACHE.clear() data_service.SHARES_CACHE.clear() data_service.RATIO_CACHE.clear() data_service.FINANCIALS_CACHE.clear() @@ -413,6 +416,9 @@ def test_overview_uses_computed_sources_and_ratios(monkeypatch) -> None: def test_build_income_annual_columns_and_ttm(monkeypatch) -> None: data_service.STATEMENT_CACHE.clear() + data_service.INCOME_CACHE.clear() + data_service.BALANCE_CACHE.clear() + data_service.CF_CACHE.clear() data_service.FINANCIALS_CACHE.clear() inc_annual = annual_frame({ @@ -447,6 +453,9 @@ def test_build_income_annual_columns_and_ttm(monkeypatch) -> None: def test_build_income_quarterly_eight_columns(monkeypatch) -> None: data_service.STATEMENT_CACHE.clear() + data_service.INCOME_CACHE.clear() + data_service.BALANCE_CACHE.clear() + data_service.CF_CACHE.clear() data_service.FINANCIALS_CACHE.clear() cols = pd.to_datetime([ @@ -474,6 +483,9 @@ def test_build_income_quarterly_eight_columns(monkeypatch) -> None: def test_build_balance_mrq_column(monkeypatch) -> None: data_service.STATEMENT_CACHE.clear() + data_service.INCOME_CACHE.clear() + data_service.BALANCE_CACHE.clear() + data_service.CF_CACHE.clear() data_service.FINANCIALS_CACHE.clear() bal_annual = annual_frame({"Total Assets": [364_900.0, 335_000.0, 352_800.0, 351_000.0]}) @@ -495,6 +507,9 @@ def test_build_balance_mrq_column(monkeypatch) -> None: def test_build_cash_flow_fcf(monkeypatch) -> None: data_service.STATEMENT_CACHE.clear() + data_service.INCOME_CACHE.clear() + data_service.BALANCE_CACHE.clear() + data_service.CF_CACHE.clear() data_service.FINANCIALS_CACHE.clear() cf_annual = annual_frame({ @@ -532,6 +547,9 @@ def test_build_cash_flow_fcf(monkeypatch) -> None: def test_get_financials_empty_statements(monkeypatch) -> None: data_service.STATEMENT_CACHE.clear() + data_service.INCOME_CACHE.clear() + data_service.BALANCE_CACHE.clear() + data_service.CF_CACHE.clear() data_service.FINANCIALS_CACHE.clear() monkeypatch.setattr(data_service, "get_income_statement", lambda sym, quarterly=False: pd.DataFrame()) |
