chore(lint): make the repository ruff-clean under the strict select

Clear the deferred full-repo lint backlog so the whole tree passes the strict
ruff select (E,W,F,I,B,UP,C4,SIM). Mechanical fixes dominate: import sorting,
pep585/604 annotations, dropped dead imports, and whitespace. The few semantic
changes are behavior-preserving: declare __all__ on the agent_utils and
alpha_vantage re-export hubs; expand 'from x import *' to explicit names; use
immutable tuple defaults instead of mutable list defaults; contextlib.suppress
for try/except/pass; and narrow an over-broad assertRaises.
This commit is contained in:
Yijia-Xiao committed 2026-06-14 16:38:36 +00:00
1 parent cbc5f67d42
commit e3bc872982
59 files changed
+315 -293

No files matched your search

+2 -1
View File
@@ -1,6 +1,7 @@
from typing import Annotated
from typing_extensions import TypedDict
from langgraph.graph import MessagesState
from typing_extensions import TypedDict
# Researcher team state
+36 -23
View File
@@ -1,37 +1,50 @@
import functools
import logging
from typing import Any, Mapping, Optional
from collections.abc import Mapping
from typing import Any
import yfinance as yf
from langchain_core.messages import HumanMessage, RemoveMessage
# Import tools from separate utility files
from tradingagents.agents.utils.core_stock_tools import (
get_stock_data
)
from tradingagents.agents.utils.technical_indicators_tools import (
get_indicators
)
from tradingagents.agents.utils.core_stock_tools import get_stock_data
from tradingagents.agents.utils.fundamental_data_tools import (
get_fundamentals,
get_balance_sheet,
get_cashflow,
get_income_statement
get_fundamentals,
get_income_statement,
)
from tradingagents.agents.utils.macro_data_tools import get_macro_indicators
from tradingagents.agents.utils.market_data_validation_tools import get_verified_market_snapshot
from tradingagents.agents.utils.news_data_tools import (
get_news,
get_global_news,
get_insider_transactions,
get_global_news
)
from tradingagents.agents.utils.macro_data_tools import (
get_macro_indicators
)
from tradingagents.agents.utils.prediction_markets_tools import (
get_prediction_markets
)
from tradingagents.agents.utils.market_data_validation_tools import (
get_verified_market_snapshot
get_news,
)
from tradingagents.agents.utils.prediction_markets_tools import get_prediction_markets
from tradingagents.agents.utils.technical_indicators_tools import get_indicators
# Public surface: the data tools are imported here so agents and the graph
# import them from one place, plus the instrument/language helpers defined below.
__all__ = [
"get_stock_data",
"get_indicators",
"get_fundamentals",
"get_balance_sheet",
"get_cashflow",
"get_income_statement",
"get_news",
"get_global_news",
"get_insider_transactions",
"get_macro_indicators",
"get_prediction_markets",
"get_verified_market_snapshot",
"build_instrument_context",
"resolve_instrument_identity",
"get_instrument_context_from_state",
"get_language_instruction",
"create_msg_delete",
]
logger = logging.getLogger(__name__)
@@ -52,7 +65,7 @@ def get_language_instruction() -> str:
return f" Write your entire response in {lang}."
def _clean_identity_value(value: Any) -> Optional[str]:
def _clean_identity_value(value: Any) -> str | None:
"""Return a trimmed string, or None for empty / placeholder-ish values."""
if not isinstance(value, str):
return None
@@ -109,7 +122,7 @@ def resolve_instrument_identity(ticker: str) -> dict:
def build_instrument_context(
ticker: str,
asset_type: str = "stock",
identity: Optional[Mapping[str, str]] = None,
identity: Mapping[str, str] | None = None,
) -> str:
"""Describe the exact instrument so agents preserve identity and ticker.
@@ -201,4 +214,4 @@ def create_msg_delete():
return delete_messages
@@ -1,5 +1,7 @@
from langchain_core.tools import tool
from typing import Annotated
from langchain_core.tools import tool
from tradingagents.dataflows.interface import route_to_vendor
@@ -1,5 +1,7 @@
from langchain_core.tools import tool
from typing import Annotated
from langchain_core.tools import tool
from tradingagents.dataflows.interface import route_to_vendor
@@ -74,4 +76,4 @@ def get_income_statement(
Returns:
str: A formatted report containing income statement data
"""
return route_to_vendor("get_income_statement", ticker, freq, curr_date)
return route_to_vendor("get_income_statement", ticker, freq, curr_date)
+7 -8
View File
@@ -1,8 +1,7 @@
"""Append-only markdown decision log for TradingAgents."""
from typing import List, Optional
from pathlib import Path
import re
from pathlib import Path
from tradingagents.agents.utils.rating import parse_rating
@@ -51,7 +50,7 @@ class TradingMemoryLog:
# --- Read path (Phase A) ---
def load_entries(self) -> List[dict]:
def load_entries(self) -> list[dict]:
"""Parse all entries from log. Returns list of dicts."""
if not self._log_path or not self._log_path.exists():
return []
@@ -64,7 +63,7 @@ class TradingMemoryLog:
entries.append(parsed)
return entries
def get_pending_entries(self) -> List[dict]:
def get_pending_entries(self) -> list[dict]:
"""Return entries with outcome:pending (for Phase B)."""
return [e for e in self.load_entries() if e.get("pending")]
@@ -162,7 +161,7 @@ class TradingMemoryLog:
tmp_path.write_text(new_text, encoding="utf-8")
tmp_path.replace(self._log_path)
def batch_update_with_outcomes(self, updates: List[dict]) -> None:
def batch_update_with_outcomes(self, updates: list[dict]) -> None:
"""Apply multiple outcome updates in a single read + atomic write.
Each element of updates must have keys: ticker, trade_date,
@@ -218,7 +217,7 @@ class TradingMemoryLog:
# --- Helpers ---
def _apply_rotation(self, blocks: List[str]) -> List[str]:
def _apply_rotation(self, blocks: list[str]) -> list[str]:
"""Drop oldest resolved blocks when their count exceeds max_entries.
Pending blocks are always kept (they represent unprocessed work).
@@ -247,7 +246,7 @@ class TradingMemoryLog:
return blocks
to_drop = resolved_count - self._max_entries
kept: List[str] = []
kept: list[str] = []
for block, is_resolved in decisions:
if is_resolved and to_drop > 0:
to_drop -= 1
@@ -255,7 +254,7 @@ class TradingMemoryLog:
kept.append(block)
return kept
def _parse_entry(self, raw: str) -> Optional[dict]:
def _parse_entry(self, raw: str) -> dict | None:
lines = raw.strip().splitlines()
if not lines:
return None
@@ -1,7 +1,10 @@
from typing import Annotated
from langchain_core.tools import tool
from typing import Annotated, Optional
from tradingagents.dataflows.interface import route_to_vendor
@tool
def get_news(
ticker: Annotated[str, "Ticker symbol"],
@@ -23,8 +26,8 @@ def get_news(
@tool
def get_global_news(
curr_date: Annotated[str, "Current date in yyyy-mm-dd format"],
look_back_days: Annotated[Optional[int], "Days to look back; omit to use the configured default"] = None,
limit: Annotated[Optional[int], "Max articles to return; omit to use the configured default"] = None,
look_back_days: Annotated[int | None, "Days to look back; omit to use the configured default"] = None,
limit: Annotated[int | None, "Max articles to return; omit to use the configured default"] = None,
) -> str:
"""
Retrieve global news data.
+1 -3
View File
@@ -12,11 +12,9 @@ Centralising it here avoids drift between those call sites.
from __future__ import annotations
import re
from typing import Tuple
# Canonical, ordered 5-tier scale (most bullish to most bearish).
RATINGS_5_TIER: Tuple[str, ...] = (
RATINGS_5_TIER: tuple[str, ...] = (
"Buy", "Overweight", "Hold", "Underweight", "Sell",
)
+4 -3
View File
@@ -19,7 +19,8 @@ all three agents log the same warnings when fallback fires.
from __future__ import annotations
import logging
from typing import Any, Callable, Optional, TypeVar
from collections.abc import Callable
from typing import Any, TypeVar
from pydantic import BaseModel
@@ -28,7 +29,7 @@ logger = logging.getLogger(__name__)
T = TypeVar("T", bound=BaseModel)
def bind_structured(llm: Any, schema: type[T], agent_name: str) -> Optional[Any]:
def bind_structured(llm: Any, schema: type[T], agent_name: str) -> Any | None:
"""Return ``llm.with_structured_output(schema)`` or ``None`` if unsupported.
Logs a warning when the binding fails so the user understands the agent
@@ -46,7 +47,7 @@ def bind_structured(llm: Any, schema: type[T], agent_name: str) -> Optional[Any]
def invoke_structured_or_freetext(
structured_llm: Optional[Any],
structured_llm: Any | None,
plain_llm: Any,
prompt: Any,
render: Callable[[T], str],
@@ -1,7 +1,10 @@
from langchain_core.tools import tool
from typing import Annotated
from langchain_core.tools import tool
from tradingagents.dataflows.interface import route_to_vendor
@tool
def get_indicators(
symbol: Annotated[str, "ticker symbol of the company"],
@@ -29,4 +32,4 @@ def get_indicators(
results.append(route_to_vendor("get_indicators", symbol, ind, curr_date, look_back_days))
except ValueError as e:
results.append(str(e))
return "\n\n".join(results)
return "\n\n".join(results)