Load StyleConfig from YAML, deep-merged with bundled defaults.
If style_path is None, returns the bundled defaults only.
If style_path is provided, user overrides are merged on top of defaults.
Source code in excel_model/config.py
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78 | def load_style(style_path: str | None) -> StyleConfig:
"""Load StyleConfig from YAML, deep-merged with bundled defaults.
If style_path is None, returns the bundled defaults only.
If style_path is provided, user overrides are merged on top of defaults.
"""
defaults = _load_default_style_yaml()
if style_path is not None:
p = Path(style_path)
if not p.exists():
raise StyleConfigError(f"Style config not found: {style_path}")
with p.open() as f:
user_data = yaml.safe_load(f) or {}
merged = _deep_merge(defaults, user_data)
else:
merged = defaults
required = [
"header_fill_hex",
"header_font_color",
"subtotal_fill_hex",
"total_fill_hex",
"history_col_fill_hex",
"section_header_fill_hex",
"font_name",
"font_size",
"number_format_currency",
"number_format_percent",
"number_format_integer",
"number_format_number",
]
missing = [k for k in required if k not in merged]
if missing:
raise StyleConfigError(f"Style config missing required keys: {missing}")
return StyleConfig(
header_fill_hex=merged["header_fill_hex"],
header_font_color=merged["header_font_color"],
subtotal_fill_hex=merged["subtotal_fill_hex"],
total_fill_hex=merged["total_fill_hex"],
history_col_fill_hex=merged["history_col_fill_hex"],
section_header_fill_hex=merged["section_header_fill_hex"],
font_name=merged["font_name"],
font_size=int(merged["font_size"]),
number_format_currency=merged["number_format_currency"],
number_format_percent=merged["number_format_percent"],
number_format_integer=merged["number_format_integer"],
number_format_number=merged["number_format_number"],
)
|