mirror of
https://github.com/ChuckBuilds/LEDMatrix.git
synced 2026-08-23 11:28:14 +00:00
fix(composer): an element the template cannot draw broke generation
Reproduced from the review comment. A `group` element carrying minWidth
generated:
if width >= 64: # breakpoint: 64px+ displays only
# <nothing>
manager.py.j2 wraps each element in the breakpoint and blink blocks, but the
body comes from the per-type branches -- and a type with no branch contributes
nothing, so the wrapper opens a block with no statements. ast.parse then fails
and the caller is told only "Generated code has a syntax error: expected an
indented block ... line 49", naming a line of generated source they never see.
Two defences:
- _preprocess_elements drops types the template has no branch for, alongside
the existing `section` skip. This is the root cause: those elements should
never have reached the template.
- The branch chain ends in `{% else %}pass`, so a type added to the canvas
before its drawing branch exists degrades to a no-op rather than a plugin
that will not parse.
The review also cited dynamic_text with binding_source != 'config'. That one
does not reproduce -- the branch emits a draw_text regardless -- which is why
an earlier attempt to reproduce this found nothing.
_RENDERABLE_ELEMENT_TYPES has to stay in step with the template: a type listed
with no branch emits an empty block again, and a branch missing from the list
is silently dropped from every generated plugin. A test asserts the two sets
are equal rather than trusting them to be maintained together.
Tests: 12 new, covering group/unknown/section against breakpoint, blink and
both nested, plus the set-equality and fallback checks. 7 fail with both
defences reverted. 172 composer tests pass; full suite 3862 passed, the one
failure being test_install_lowmem (pre-existing, awaiting #492).
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01STMbQE4YctTacQXfbYqKuW
This commit is contained in:
co-authored by
Claude Opus 5
parent
d42593e7ce
commit
732c7d1a30
@@ -213,6 +213,16 @@ def _aligned_x_expr(x_base_expr: str, text_align: str, char_count: int, char_w:
|
||||
return x_base_expr
|
||||
|
||||
|
||||
#: Element types manager.py.j2 has a drawing branch for. Kept next to the
|
||||
#: preprocessor because the two must agree: a type here with no branch emits an
|
||||
#: empty block, and a type with a branch but missing here is silently dropped.
|
||||
_RENDERABLE_ELEMENT_TYPES = frozenset({
|
||||
'text', 'dynamic_text', 'clock', 'countdown', 'rectangle', 'arc',
|
||||
'ellipse', 'pixel', 'rounded_rectangle', 'pips', 'sparkline', 'gauge',
|
||||
'marquee', 'progress_bar',
|
||||
})
|
||||
|
||||
|
||||
def _preprocess_elements(elements: list) -> list:
|
||||
"""Expand raw element dicts into template-ready dicts with anchor expressions.
|
||||
|
||||
@@ -231,6 +241,16 @@ def _preprocess_elements(elements: list) -> list:
|
||||
if t == 'section':
|
||||
continue
|
||||
|
||||
# A type the template has no branch for still gets its breakpoint and
|
||||
# blink wrappers emitted, and those would open an `if` with nothing in
|
||||
# it -- ast.parse then fails and the caller is told only "Generated
|
||||
# code has a syntax error". Drop it here instead. The template also
|
||||
# emits a `pass` fallback, so a type added to the canvas before its
|
||||
# branch exists degrades to a no-op rather than a broken plugin.
|
||||
if t not in _RENDERABLE_ELEMENT_TYPES:
|
||||
logger.info("composer: skipping element type %r with no template branch", t)
|
||||
continue
|
||||
|
||||
x_anchor = el.get('xAnchor') or None
|
||||
y_anchor = el.get('yAnchor') or None
|
||||
p['min_width'] = int(el.get('minWidth', 0) or 0)
|
||||
|
||||
Reference in New Issue
Block a user