feat(console): add formatting utils and VIN API client
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
86
console/utils/formatting.py
Normal file
86
console/utils/formatting.py
Normal file
@@ -0,0 +1,86 @@
|
||||
"""
|
||||
Display formatting utilities for the AUTOPARTES console application.
|
||||
|
||||
Functions for currency, numbers, text truncation, table layout, and
|
||||
quality-tier visual bars.
|
||||
"""
|
||||
|
||||
|
||||
def format_currency(value) -> str:
|
||||
"""Format a numeric value as USD currency.
|
||||
|
||||
None -> '──'
|
||||
0 -> '$0.00'
|
||||
45.99 -> '$45.99'
|
||||
"""
|
||||
if value is None:
|
||||
return "──"
|
||||
return f"${value:,.2f}"
|
||||
|
||||
|
||||
def format_number(value) -> str:
|
||||
"""Format an integer with thousands separators.
|
||||
|
||||
None -> '0'
|
||||
13685 -> '13,685'
|
||||
"""
|
||||
if value is None:
|
||||
return "0"
|
||||
return f"{value:,}"
|
||||
|
||||
|
||||
def truncate(text, max_len) -> str:
|
||||
"""Truncate text to *max_len* characters, appending '...' if trimmed.
|
||||
|
||||
None -> ''
|
||||
fits -> text unchanged
|
||||
too long -> text[:max_len-3] + '...'
|
||||
"""
|
||||
if text is None:
|
||||
return ""
|
||||
if len(text) <= max_len:
|
||||
return text
|
||||
return text[: max_len - 3] + "..."
|
||||
|
||||
|
||||
def pad_right(text, width) -> str:
|
||||
"""Pad *text* to *width* with spaces on the right, or truncate if longer.
|
||||
|
||||
None -> ''
|
||||
fits -> ljust(width)
|
||||
too long -> text[:width]
|
||||
"""
|
||||
if text is None:
|
||||
return ""
|
||||
if len(text) > width:
|
||||
return text[:width]
|
||||
return text.ljust(width)
|
||||
|
||||
|
||||
def format_table_row(values, widths, separator=" │ ") -> str:
|
||||
"""Join *values* padded to corresponding *widths* with *separator*.
|
||||
|
||||
Each value is passed through :func:`pad_right` to ensure uniform column
|
||||
widths, then all columns are joined by the separator string.
|
||||
"""
|
||||
cells = [pad_right(str(v), w) for v, w in zip(values, widths)]
|
||||
return separator.join(cells)
|
||||
|
||||
|
||||
# ── Quality-tier bars ──────────────────────────────────────────────────
|
||||
|
||||
_QUALITY_BARS = {
|
||||
"oem": "███████████",
|
||||
"premium": "██████████░",
|
||||
"standard": "███████░░░░",
|
||||
"economy": "█████░░░░░░",
|
||||
}
|
||||
|
||||
|
||||
def quality_bar(tier) -> str:
|
||||
"""Return a Unicode block-bar representing a quality tier.
|
||||
|
||||
Recognised tiers: oem, premium, standard, economy.
|
||||
Unknown tiers fall back to a minimal bar.
|
||||
"""
|
||||
return _QUALITY_BARS.get(tier, "░░░░░░░░░░░")
|
||||
Reference in New Issue
Block a user