fix(cli): preserve exchange suffixes in ticker prompt

The typer.prompt-based input could lose .SH/.SZ/.SS/.HK suffixes on
some shells, so exchange-qualified tickers like 000404.SH arrived
truncated to 000404 and failed downstream lookups. Switch to
questionary.text which reads the raw line; keep SPY-on-empty
behavior and validate the allowed character set (alnum, ._-^) up
to 32 chars.

#770
This commit is contained in:
Yijia-Xiao
2026-05-10 19:29:41 +00:00
parent c405867bde
commit e2c850eb17

View File

@@ -1,6 +1,7 @@
from typing import Optional from typing import Optional
import datetime import datetime
import typer import typer
import questionary
from pathlib import Path from pathlib import Path
from functools import wraps from functools import wraps
from rich.console import Console from rich.console import Console
@@ -615,8 +616,26 @@ def get_user_selections():
def get_ticker(): def get_ticker():
"""Get ticker symbol from user input.""" """Get ticker symbol from user input, preserving exchange suffixes."""
return typer.prompt("", default="SPY") # typer.prompt strips trailing dot-suffixes on some shells (e.g. 000404.SH
# collapses to 000404). questionary.text reads the raw line.
ticker = questionary.text(
"",
validate=lambda value: (
not value.strip()
or (
all(ch.isalnum() or ch in "._-^" for ch in value.strip())
and len(value.strip()) <= 32
)
)
or "Please enter a valid ticker symbol, e.g. AAPL, 000404.SZ, 0700.HK.",
).ask()
if ticker is None:
console.print("\n[red]No ticker symbol provided. Exiting...[/red]")
raise typer.Exit(1)
return (ticker.strip() or "SPY").upper()
def get_analysis_date(): def get_analysis_date():