- Fix _load_font_sized double-wrapping the (font, size) tuple on the
missing-font path, which handed callers a tuple instead of a font.
- Fix _set_nested_value skipping an explicit None when the key already
existed, which silently kept stale overrides when a user cleared a
nullable per-mode field or blanked all channels of an indexed color.
- Preserve BDF scalable/native_size metadata through fetchFontCatalog's
catalog-format mapping so maxFixedSize filtering actually applies.
- Stop caching an empty array on a failed font-catalog fetch so a later
call can retry instead of being stuck with the failed result.
- Keep a saved font selected in the style editor even when it no longer
fits a newly declared maxFixedSize, instead of silently deselecting it.
- Don't drop in-progress user edits to fallback fields when a plugin
widget finishes loading asynchronously and takes over the form.
- Tighten the removed font-override endpoint test to assert 405, not
just != 200.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The bdf-native-size lookup in get_fonts_catalog() caught any exception
and silently discarded it. Every other guarded read added in this PR
(the manifest parse in _declared_widget_script, the SchemaManager
fallback in _load_plugin_config_partial) logs before falling through
to the same degraded behavior. This one didn't, which is the shape a
silent-exception-swallow lint rule flags. Behavior is unchanged --
native_size still comes back None -- but a corrupt or unreadable BDF
file now leaves a trace.
Verified: font-related tests (140) and the full suite still pass,
with only the 2 pre-existing Europe/Kiev/Asia/Calcutta tzdata-alias
failures already present on origin/main.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>