Data-bound chart components 6/8: compile probe for figure builders - #466
Conversation
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Comment |
Greptile SummaryAdds compile-time validation for
Confidence Score: 5/5This follow-up appears safe to merge. No blocking failure remains within the eligible follow-up scope.
|
| Filename | Overview |
|---|---|
| python/reflex_xy/app.py | Implements state-tree traversal, builder execution, result validation, session-dependent warning behavior, and plugin integration for compile probes. |
| python/reflex_xy/vars.py | Adds the public probe option, validates its accepted values, and records the effective probe level on each figure getter. |
| python/reflex_xy/tokens.py | Defines the function attribute used to preserve probe configuration through Reflex computed-variable copies. |
| spec/design/reflex-integration.md | Specifies compile-probe levels, asynchronous behavior, strict option validation, and the session-dependent escape valve. |
| tests/reflex_adapter/test_figure_probe.py | Covers successful probes, opt-outs, asynchronous opt-in, builder and figure failures, session warnings, invalid returns, and strict level validation. |
Reviews (3): Last reviewed commit: "fix(reflex): identity-strict probe level..." | Re-trigger Greptile
Merging this PR will not alter performance
Comparing Footnotes
|
There was a problem hiding this comment.
All reported issues were addressed across 5 files
Reply with feedback, questions, or to request a fix.
Fix all with cubic | Re-trigger cubic
1411f82 to
2641bf4
Compare
2641bf4 to
4845359
Compare
|
Review addressed in 4845359:
Spec §3.1 updated; pinned by |
4845359 to
56913c6
Compare
There was a problem hiding this comment.
Greptile has paused reviews on this repository — it used its 100 free open-source review credits for this billing period. Reviews resume automatically on September 3. To continue before then, an organization admin can keep reviews running past the free credits — those bill as normal usage.
With the data-bound tier validating structure at page evaluation, the figure var is the last place chart-building code defers to hydrate — where a typo'd mark name or a bad kwarg shows up as a blank mount and an err frame, in a browser, after a round trip. XYPlugin.post_compile now walks the state tree and runs each figure builder once against a default state instance. probe="build" (the sync default) runs the body; probe="figure" also compiles the result; probe=False opts out and is the default for async builders, because awaiting a data source at compile is exactly what the "no data ingestion at compile" constraint forbids — an async builder can still opt in. Failures raise FigureProbeError naming the state class, var, and source location, wrapping the original exception. One deliberate softening: a builder whose source reads self.router is session-dependent by declaration, and only a live session can validate it, so its probe failure degrades to a RuntimeWarning rather than failing the compile. The heuristic is source text, which is why it only ever downgrades an error — never invents one. Spec: reflex-integration.md §3.1 (compile probe).
- probe= validation no longer uses equality membership: 0/0.0 (== False) and 1/True are refused at decoration instead of silently opting the builder out of its compile probe. - The default "build" probe level now also checks the builder's return is a chart (or None): a dict or other non-chart value fails reflex run with the builder's location instead of reaching hydrate.
The armed-failure tests probed the whole state tree, coupling their outcome to every probe-enabled builder any other test module registers in the session. They now probe ProbeDemo directly (the root_cls parameter exists for exactly this); the one deliberately unscoped test keeps the production-shaped whole-tree walk covered and says so.
56913c6 to
b3ebb05
Compare
Stacked on #465. Base is
stack/5-chart-factories.Why
With the data-bound tier validating structure at page evaluation,
@reflex_xy.figureis the last place chart-building code defers to hydrate — where a typo'd mark name or a bad kwarg shows up as a blank mount and anerrframe, in a browser, after a round trip.Change
XYPlugin.post_compilewalks the state tree and runs each figure builder once against a default state instance:probe="build"(sync default) — run the body;probe="figure"— also compile the result;probe=False— opt out, and the default forasync defbuilders, because awaiting a data source at compile is exactly what the "no data ingestion at compile" constraint forbids. An async builder can still opt in explicitly.Failures raise
FigureProbeErrornaming the state class, var, and source location, wrapping the original exception.One deliberate softening
A builder whose source reads
self.routeris session-dependent by declaration, and only a live session can validate it — so its probe failure degrades to aRuntimeWarningrather than failing the compile. The heuristic is source text, which is why it can only ever downgrade an error, never invent one.Spec
reflex-integration.md§3.1 (compile probe).Test plan
uv run pytest tests/reflex_adapter tests/test_validation_timing.py— 240 passedpre-commit run --all-files,ruff check,ruff format --check,ty check— clean