From 68eb7b073c7a9486d4ca27610788ee00c14dc7db Mon Sep 17 00:00:00 2001 From: gahusb Date: Sat, 16 May 2026 05:06:40 +0900 Subject: [PATCH] feat(signal_v2-phase3a): config + state extensions for KIS data - config.py: KIS_APP_KEY/SECRET/ACCOUNT/IS_VIRTUAL + V1_TOKEN_PATH env - state.py: PollState extended with minute_bars (deque) and asking_price - requirements.txt: websockets>=12 19 existing tests still pass. Co-Authored-By: Claude Opus 4.7 (1M context) --- requirements.txt | 1 + signal_v2/config.py | 15 +++++++++++++-- signal_v2/state.py | 5 ++++- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/requirements.txt b/requirements.txt index 1af5998..5185c72 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,3 +6,4 @@ python-dotenv>=1.0 pytest>=8.0 pytest-asyncio>=0.23 respx>=0.21 +websockets>=12 diff --git a/signal_v2/config.py b/signal_v2/config.py index 617b46a..b0b3fbf 100644 --- a/signal_v2/config.py +++ b/signal_v2/config.py @@ -5,7 +5,6 @@ from pathlib import Path from dotenv import load_dotenv -# web-ai/.env 명시 로드 (signal_v2/config.py 의 parent.parent = web-ai/) load_dotenv(Path(__file__).parent.parent / ".env") @@ -21,8 +20,20 @@ class Settings: db_path: Path = field( default_factory=lambda: Path(__file__).parent / "data" / "signal_v2.db" ) + # Phase 3a additions + kis_app_key: str = field(default_factory=lambda: os.getenv("KIS_APP_KEY", "").strip()) + kis_app_secret: str = field(default_factory=lambda: os.getenv("KIS_APP_SECRET", "").strip()) + kis_account: str = field(default_factory=lambda: os.getenv("KIS_ACCOUNT", "").strip()) + kis_is_virtual: bool = field( + default_factory=lambda: os.getenv("KIS_IS_VIRTUAL", "true").lower() == "true" + ) + v1_token_path: Path = field( + default_factory=lambda: Path( + os.getenv("V1_TOKEN_PATH", + str(Path(__file__).parent.parent / "signal_v1" / "data" / "kis_token.json")) + ) + ) def get_settings() -> Settings: - """매 호출 시 신선한 Settings (테스트 monkeypatch 호환).""" return Settings() diff --git a/signal_v2/state.py b/signal_v2/state.py index d290b96..669953f 100644 --- a/signal_v2/state.py +++ b/signal_v2/state.py @@ -1,4 +1,5 @@ """PollState — process-wide singleton.""" +from collections import deque from dataclasses import dataclass, field @@ -7,9 +8,11 @@ class PollState: portfolio: dict | None = None news_sentiment: dict | None = None screener_preview: dict | None = None + # Phase 3a additions + minute_bars: dict[str, deque] = field(default_factory=dict) + asking_price: dict[str, dict] = field(default_factory=dict) last_updated: dict[str, str] = field(default_factory=dict) fetch_errors: dict[str, int] = field(default_factory=dict) -# Process-wide singleton. Phase 3 imports: from signal_v2.state import state state = PollState()