From 92cc45c896fb3c7f278a0565456e91a3f48f84e9 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 3 May 2026 20:04:08 +0000 Subject: [PATCH] =?UTF-8?q?refactor(V2):=20IBKR=20settings=20=E2=80=94=20T?= =?UTF-8?q?ypedDict=20return=20+=20docstrings?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Code review polish: - credentials() returns IBKRCredentials TypedDict (was bare dict) - Method docstring matching Deribit pattern - Inline comment explaining account_id env-only design Co-Authored-By: Claude Opus 4.7 (1M context) --- src/cerbero_mcp/settings.py | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/cerbero_mcp/settings.py b/src/cerbero_mcp/settings.py index 3274bf3..d3ea7e7 100644 --- a/src/cerbero_mcp/settings.py +++ b/src/cerbero_mcp/settings.py @@ -1,10 +1,22 @@ """Pydantic Settings: legge .env e variabili d'ambiente.""" from __future__ import annotations +from typing import TypedDict + from pydantic import Field, SecretStr from pydantic_settings import BaseSettings, SettingsConfigDict +class IBKRCredentials(TypedDict): + consumer_key: str + access_token: str + access_token_secret: str + signature_key_path: str + encryption_key_path: str + account_id: str + dh_prime: str + + class _Sub(BaseSettings): """Base per sub-settings, condivide model_config con env_file.""" model_config = SettingsConfigDict( @@ -111,6 +123,7 @@ class IBKRSettings(_Sub): access_token_secret_testnet: SecretStr | None = None signature_key_path_testnet: str | None = None encryption_key_path_testnet: str | None = None + # account_id has no base variant: paper and live accounts are always distinct account_id_testnet: str | None = None consumer_key_live: str | None = None @@ -128,7 +141,12 @@ class IBKRSettings(_Sub): ws_max_subscriptions: int = 80 ws_idle_timeout_s: int = 300 - def credentials(self, env: str) -> dict: + def credentials(self, env: str) -> IBKRCredentials: + """Return credential dict for given env. + Prefers env-specific (_TESTNET / _LIVE) values; falls back to base + (IBKR_CONSUMER_KEY etc.) for legacy single-pair setups. + ValueError if any required field missing. + """ if env == "testnet": ck = self.consumer_key_testnet or self.consumer_key at = self.access_token_testnet or self.access_token