config.py had no Schwab fields at all, so the keys listed in .env.example were being silently dropped by extra="ignore". They exist now, blank, and nothing reads them while live_source is yahoo. The token path moves under data/, which is the Coolify persistent volume. Left at the repository root it would vanish on every rebuild, and re-authenticating is an interactive browser flow, not something a deploy can do for itself. scripts/check_schwab.py answers empirically what the app is entitled to rather than inferring it from documentation: whether the credentials authenticate, whether /ES quotes return (futures market data is a separate entitlement from equities), and whether the streamer bootstrap responds. That last one is the decision. StreamClient.login() reads /trader/v1/userPreference for its socket URL and credentials, and that path belongs to the Accounts and Trading product — so an app registered for Market Data Production alone cannot stream, and CHART_FUTURES is unreachable until the app adds it. The script reports which of the two paths is open instead of leaving it to be discovered halfway through an implementation. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
6 lines
162 B
Text
6 lines
162 B
Text
pytest
|
|
pytest-asyncio
|
|
|
|
# Only used by scripts/check_schwab.py until the Schwab source lands;
|
|
# the app itself never imports it while LIVE_SOURCE=yahoo.
|
|
schwab-py
|