Skip to content

[Do Not Merge] V3#283

Draft
timkpaine wants to merge 12 commits into
mainfrom
v3
Draft

[Do Not Merge] V3#283
timkpaine wants to merge 12 commits into
mainfrom
v3

Conversation

@timkpaine

Copy link
Copy Markdown
Member
  • State rework
  • Stage
  • UI framework

timkpaine added 11 commits May 22, 2026 11:56
… and UI APIs

Signed-off-by: Tim Paine <3105306+timkpaine@users.noreply.github.com>
Signed-off-by: Tim Paine <3105306+timkpaine@users.noreply.github.com>
Signed-off-by: Tim Paine <3105306+timkpaine@users.noreply.github.com>
Signed-off-by: Tim Paine <3105306+timkpaine@users.noreply.github.com>

# Conflicts:
#	csp_gateway/server/gateway/csp/channels.py
#	csp_gateway/server/web/app.py
#	csp_gateway/server/web/routes/state.py
- Resolve dotted attribute paths in DefaultState/DuckDBState insert so keyby can reference nested struct members (e.g. keyby='sub.id')

- Make --junitxml explicit in Makefile and switch upload-artifact/publish paths to 'junit.xml' so CI test results are reported (previously '**/junit.xml' produced 0 tests in the PR comment)

Signed-off-by: Tim Paine <3105306+timkpaine@users.noreply.github.com>
…_channels

- channels.py: docstring referenced old set_state(edge, alias, keyby, indexer) signature; correct it to set_state(field_or_edge, keyby, indexer=None)

- module.py: drop dynamic_state_channels() — no longer consumed by Gateway after the state rework. State on dynamic channels is now wired via channels.set_state() inside Module.connect, which is exercised by test_dynamic_channels

- test_gateway.py: drop the matching dynamic_state_channels override; suite still passes (482 server tests)

Signed-off-by: Tim Paine <3105306+timkpaine@users.noreply.github.com>
…pendent

The prior commit (fbf0d46) wrongly removed Module.dynamic_state_channels() under the assumption it was dead code. It actually serves a real purpose: it lets a module declare which of its dynamic_channels will have state, so that *other* modules' connect() may call get_state() on that name regardless of the order in which modules are connected.

This commit restores the API and fixes the underlying order dependence using the same DelayedEdge pattern already used for channel data:

- module.py: re-add dynamic_state_channels() -> Optional[Set[str]] on the Module ABC, with docstring describing the order-independence guarantee.

- channels.py:

  * Add _pending_state_element_types: Dict[str, type] and _delayed_state_edges: Dict[(field, indexer), DelayedEdge] private attrs.

  * Add _declare_dynamic_state(field, element_type) to pre-register a state name with its element type.

  * get_state: if the field is pre-declared but not yet wired, return a DelayedEdge of ts[State[T]] (lazily created and cached).

  * _wire_state_edge: if a DelayedEdge was previously handed out for (field, indexer), bind it to the freshly-built state node so consumers' edges resolve transparently.

  * set_state: clear the pending entry once the owning module wires the state for real.

- factory.py: in ChannelsFactory.build(), before invoking each module's connect(), walk all enabled modules and call channels._declare_dynamic_state(name, T) for every name returned by Module.dynamic_state_channels() (T is unwrapped from List[T] when applicable). This guarantees ordering independence between get_state and set_state across modules.

- test_gateway.py:

  * Re-add the dynamic_state_channels() override on MySetModuleDynamicChannels.

  * Add parametrized test_dynamic_channels_state_module_order_independence covering both [setter, getter] and [getter, setter] module orderings; both pass via DelayedEdge binding.

Server suite: 484 passed, 7 skipped, 1 xfailed (was 482; +2 for the new order test).

Signed-off-by: Tim Paine <3105306+timkpaine@users.noreply.github.com>
rework state to remove annoyances and inconsistensies, prep for Stage and UI APIs
Signed-off-by: Tim Paine <3105306+timkpaine@users.noreply.github.com>
@github-actions

github-actions Bot commented Jun 1, 2026

Copy link
Copy Markdown
Contributor

Test Results

668 tests  +668   660 ✅ +660   7m 37s ⏱️ + 7m 37s
  1 suites +  1     8 💤 +  8 
  1 files   +  1     0 ❌ ±  0 

Results for commit 914ef02. ± Comparison against base commit c7df3e4.

♻️ This comment has been updated with latest results.

@codecov

codecov Bot commented Jun 1, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 84.05923% with 183 lines in your changes missing coverage. Please review.
✅ Project coverage is 87.12%. Comparing base (c7df3e4) to head (914ef02).

Files with missing lines Patch % Lines
csp_gateway/client/client.py 24.13% 88 Missing ⚠️
csp_gateway/server/gateway/csp/channels.py 79.69% 40 Missing ⚠️
csp_gateway/server/web/routes/stage.py 79.06% 18 Missing ⚠️
csp_gateway/server/gateway/csp/stage.py 91.21% 13 Missing ⚠️
csp_gateway/tests/server/gateway/csp/test_stage.py 97.36% 9 Missing ⚠️
csp_gateway/server/web/app.py 66.66% 8 Missing ⚠️
csp_gateway/server/web/routes/state.py 50.00% 3 Missing ⚠️
csp_gateway/server/gateway/csp/state.py 93.75% 2 Missing ⚠️
csp_gateway/server/gateway/csp/factory.py 91.66% 1 Missing ⚠️
csp_gateway/server/modules/web/mount.py 92.85% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main     #283      +/-   ##
==========================================
- Coverage   87.38%   87.12%   -0.27%     
==========================================
  Files         142      146       +4     
  Lines       14635    15625     +990     
==========================================
+ Hits        12789    13613     +824     
- Misses       1846     2012     +166     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant