diff --git a/src/kalshi_csv/cli.py b/src/kalshi_csv/cli.py index 63ad204..78b8f8b 100644 --- a/src/kalshi_csv/cli.py +++ b/src/kalshi_csv/cli.py @@ -7,6 +7,8 @@ from .formatter import ( color_yellow, color_cyan, format_currency_color, + format_currency_color_padded, + truncate_ticker, ) @@ -38,11 +40,12 @@ def main(): print("-" * 90) for trade in kalshi.trades: - pnl_str = format_currency_color(trade["pnl_no_fees"], no_color) + pnl_str = format_currency_color_padded(trade["pnl_no_fees"], 14, no_color) fees = trade["open_fees"] + trade["close_fees"] + ticker_display = truncate_ticker(trade["ticker"]) print( - f"{trade['ticker']:<32} | {trade['side']:<4} | {trade['qty']:<6.2f} | " - f"${trade['entry']:<5.2f} | ${trade['exit']:<5.2f} | {pnl_str:<14} | ${fees:<5.2f}" + f"{ticker_display:<32} | {trade['side']:<4} | {trade['qty']:<6.2f} | " + f"${trade['entry']:<5.2f} | ${trade['exit']:<5.2f} | {pnl_str} | ${fees:<5.2f}" ) print("-" * 90) diff --git a/src/kalshi_csv/formatter.py b/src/kalshi_csv/formatter.py index 73769a0..9b6449f 100644 --- a/src/kalshi_csv/formatter.py +++ b/src/kalshi_csv/formatter.py @@ -37,3 +37,17 @@ def format_currency_color(value, no_color=False): """Returns a signed, colorized string based on profit or loss status.""" val_str = f"${value:+.2f}" return color_green(val_str, no_color) if value >= 0 else color_red(val_str, no_color) + + +def format_currency_color_padded(value, width, no_color=False): + """Returns a signed, colorized string padded to specified width before coloring.""" + val_str = f"${value:+.2f}" + padded_str = f"{val_str:<{width}}" + return color_green(padded_str, no_color) if value >= 0 else color_red(padded_str, no_color) + + +def truncate_ticker(ticker, max_len=32): + """Truncates ticker to max_len, using ellipsis if longer than 29 chars.""" + if len(ticker) > 29: + return ticker[:29] + "..." + return ticker diff --git a/tests/test_cli.py b/tests/test_cli.py index a552c2b..7b34915 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -66,3 +66,22 @@ def test_cli_missing_file(): ) assert result.returncode != 0 assert "not found" in result.stderr.lower() or "error" in result.stderr.lower() + + +def test_cli_ticker_truncation(tmp_path): + csv_file = tmp_path / "long_ticker.csv" + csv_file.write_text( + "type,quantity_fp,market_ticker,side,entry_price_dollars,exit_price_dollars," + "open_fees_dollars,close_fees_dollars,realized_pnl_without_fees_dollars," + "realized_pnl_with_fees_dollars,close_timestamp,open_timestamp\n" + "trade,1.00,VERYLONGTICKERNAME-THAT-EXCEEDS-THIRTY-CHARS,yes,0.50,1.00," + "0.01,0.02,0.50,0.47,2026-07-07T12:19:57-04:00,2026-07-07T09:48:19-04:00\n" + ) + result = subprocess.run( + [sys.executable, "-m", "kalshi_csv.cli", str(csv_file), "--no-color"], + capture_output=True, + text=True, + ) + assert result.returncode == 0 + assert "VERYLONGTICKERNAME-THAT-EXCEE..." in result.stdout + assert "VERYLONGTICKERNAME-THAT-EXCEEDS-THIRTY-CHARS" not in result.stdout