mirror of
https://github.com/TauricResearch/TradingAgents.git
synced 2026-09-27 15:02:39 +03:00
refactor(dataflows): name the shared modules by what they hold
- interface -> router; symbol_utils -> symbols, which also takes safe_ticker_component - utils is split: get_current_date to date_window, the HTTP helpers to net - dataflows imports are absolute; the NoMarketDataError re-export from symbols is gone
This commit is contained in:
@@ -13,9 +13,9 @@ import pytest
|
||||
|
||||
import tradingagents.dataflows.config as config_module
|
||||
import tradingagents.default_config as default_config
|
||||
from tradingagents.dataflows import interface
|
||||
from tradingagents.dataflows import router
|
||||
from tradingagents.dataflows.config import set_config
|
||||
from tradingagents.dataflows.symbol_utils import NoMarketDataError
|
||||
from tradingagents.dataflows.errors import NoMarketDataError
|
||||
|
||||
|
||||
def _reset_config():
|
||||
@@ -50,7 +50,7 @@ class VendorRoutingTests(unittest.TestCase):
|
||||
|
||||
def _route(self, vendors_for_get_stock_data):
|
||||
return mock.patch.dict(
|
||||
interface.VENDOR_METHODS,
|
||||
router.VENDOR_METHODS,
|
||||
{"get_stock_data": vendors_for_get_stock_data},
|
||||
clear=False,
|
||||
)
|
||||
@@ -60,7 +60,7 @@ class VendorRoutingTests(unittest.TestCase):
|
||||
set_config({"data_vendors": {"core_stock_apis": "yfinance"}})
|
||||
av = mock.Mock(side_effect=_returns("AV_DATA"))
|
||||
with self._route({"yfinance": _no_data, "alpha_vantage": av}):
|
||||
result = interface.route_to_vendor("get_stock_data", "FAKE", "2026-01-01", "2026-01-10")
|
||||
result = router.route_to_vendor("get_stock_data", "FAKE", "2026-01-01", "2026-01-10")
|
||||
self.assertIn("NO_DATA_AVAILABLE", result)
|
||||
av.assert_not_called() # the unchosen vendor was never tried
|
||||
|
||||
@@ -68,7 +68,7 @@ class VendorRoutingTests(unittest.TestCase):
|
||||
# Listing both vendors opts in to ordered fallback.
|
||||
set_config({"data_vendors": {"core_stock_apis": "yfinance,alpha_vantage"}})
|
||||
with self._route({"yfinance": _no_data, "alpha_vantage": _returns("AV_DATA")}):
|
||||
result = interface.route_to_vendor("get_stock_data", "AAPL", "2026-01-01", "2026-01-10")
|
||||
result = router.route_to_vendor("get_stock_data", "AAPL", "2026-01-01", "2026-01-10")
|
||||
self.assertEqual(result, "AV_DATA")
|
||||
|
||||
def test_primary_error_is_logged_not_masked(self):
|
||||
@@ -76,8 +76,8 @@ class VendorRoutingTests(unittest.TestCase):
|
||||
# must be visible in logs (broken primary not hidden).
|
||||
set_config({"data_vendors": {"core_stock_apis": "yfinance,alpha_vantage"}})
|
||||
with self._route({"yfinance": _raises(ValueError("boom")), "alpha_vantage": _no_data}), \
|
||||
self.assertLogs("tradingagents.dataflows.interface", level="WARNING") as cm:
|
||||
result = interface.route_to_vendor("get_stock_data", "AAPL", "2026-01-01", "2026-01-10")
|
||||
self.assertLogs("tradingagents.dataflows.router", level="WARNING") as cm:
|
||||
result = router.route_to_vendor("get_stock_data", "AAPL", "2026-01-01", "2026-01-10")
|
||||
self.assertIn("NO_DATA_AVAILABLE", result)
|
||||
joined = "\n".join(cm.output)
|
||||
self.assertIn("boom", joined) # the real error surfaced in logs
|
||||
@@ -86,18 +86,18 @@ class VendorRoutingTests(unittest.TestCase):
|
||||
def test_unknown_configured_vendor_raises(self):
|
||||
set_config({"data_vendors": {"core_stock_apis": "bogus_vendor"}})
|
||||
with self.assertRaises(ValueError) as ctx:
|
||||
interface.route_to_vendor("get_stock_data", "AAPL", "2026-01-01", "2026-01-10")
|
||||
router.route_to_vendor("get_stock_data", "AAPL", "2026-01-01", "2026-01-10")
|
||||
self.assertIn("bogus_vendor", str(ctx.exception))
|
||||
|
||||
def test_default_sentinel_uses_all_vendors(self):
|
||||
# No explicit choice ("default") keeps the resilient full-chain behavior.
|
||||
set_config({"data_vendors": {"core_stock_apis": "default"}})
|
||||
with self._route({"yfinance": _no_data, "alpha_vantage": _returns("AV_DATA")}):
|
||||
result = interface.route_to_vendor("get_stock_data", "AAPL", "2026-01-01", "2026-01-10")
|
||||
result = router.route_to_vendor("get_stock_data", "AAPL", "2026-01-01", "2026-01-10")
|
||||
self.assertEqual(result, "AV_DATA")
|
||||
|
||||
def _route_method(self, method, vendors):
|
||||
return mock.patch.dict(interface.VENDOR_METHODS, {method: vendors}, clear=False)
|
||||
return mock.patch.dict(router.VENDOR_METHODS, {method: vendors}, clear=False)
|
||||
|
||||
def test_optional_category_degrades_instead_of_raising(self):
|
||||
# An optional enrichment vendor (FRED macro) that raises must NOT abort
|
||||
@@ -106,7 +106,7 @@ class VendorRoutingTests(unittest.TestCase):
|
||||
with self._route_method(
|
||||
"get_macro_indicators", {"fred": _raises(ValueError("FRED 400: bad series"))}
|
||||
):
|
||||
result = interface.route_to_vendor("get_macro_indicators", "cpi", "2026-01-01")
|
||||
result = router.route_to_vendor("get_macro_indicators", "cpi", "2026-01-01")
|
||||
self.assertIn("DATA_UNAVAILABLE", result)
|
||||
self.assertIn("macro_data", result)
|
||||
|
||||
@@ -116,7 +116,7 @@ class VendorRoutingTests(unittest.TestCase):
|
||||
set_config({"data_vendors": {"core_stock_apis": "yfinance"}})
|
||||
with self._route({"yfinance": _raises(ValueError("boom"))}), \
|
||||
self.assertRaises(ValueError):
|
||||
interface.route_to_vendor("get_stock_data", "AAPL", "2026-01-01", "2026-01-10")
|
||||
router.route_to_vendor("get_stock_data", "AAPL", "2026-01-01", "2026-01-10")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
Reference in New Issue
Block a user