Skip to content

0.7.1: require ObjectState 3 - #28

Merged
trissim merged 2 commits into
mainfrom
fix/objectstate-3
Oct 12, 2026
Merged

trissim merged 2 commits into
mainfrom
fix/objectstate-3

Conversation

@trissim

@trissim trissim commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

Caller update for ObjectState 3.0.0 (OpenHCSDev/ObjectState#50), with formbridge 0.1.2 (OpenHCSDev/formbridge#9). Not tagged or released.

Version: 0.7.1

No public name of pyqt-reactive is removed, so this is a patch release. What goes away is private: AbstractManagerWidget._live_context_resolver (never called), the positional shape of ProvenanceNavigationMixin._compute_target_path, and the inline code of WidgetService._apply_context_behavior.

Sites changed (the 10 in the 3.0.0 caller ledger, plus the two it marked for review)

Each read of a config value now names which read it is: raw (what was set on the object), resolved (after inheritance), or preview (the resolved value with its source, while the field's own value stays unset).

  • services/widget_service.py: build_context_stack(..., ancestor_objects=...) raises TypeError in ObjectState 3. The site did not need a context stack at all. It was a second resolver for a preview: it rebuilt the stack by hand, asked for placeholder text, then read the attribute again for the value, and used the default prefix instead of the form's. It now shows state.get_resolved_value(path) through one method, WidgetService.show_resolved_value_as_placeholder, and the two refresh paths in ParameterOpsService (which each repeated resolve-and-format) call the same method.
  • widgets/shared/clickable_help_components.py (ledger: review): get_provenance can return (None, source_type) for a state without a scope id. The ledger expected the same-window branch to handle it; it did not, because the target path was computed first from ObjectStateRegistry.get_by_scope(None), which is the global state. The source state is now the widget's own state whenever the source scope is the state's own scope. The source is read once per action (_provenance_source), without re-checking the tuple's shape.
  • widgets/shared/abstract_manager_widget.py (ledger: review): the unused LiveContextResolver instance is deleted.
  • pyproject.toml: objectstate>=3.0,<4, formbridge>=0.1.2,<0.2.
  • requirements-ci.txt: ObjectState at abe763c and formbridge at 1e73e6c until both are on PyPI.
  • tests/test_preview_formatters.py: declares abbreviations with @abbreviation instead of writing to the removed GROUP_ABBREVIATIONS_REGISTRY. The line that gave a lazy class a different abbreviation is gone: that state cannot exist in ObjectState 3.
  • tests/test_function_list_editor_tokens.py: no longer assigns the removed _atomic_* attributes.
  • New tests/test_provenance_navigation.py: a value supplied by a sibling config scrolls the same window to the sibling field, with and without a scope id.

No hits in this repo for the other removed names (cache-clear functions, resolve_field_inheritance, legacy_entries, the tuple-shaped layer stack); checked again with one grep over src, tests, docs, examples and scripts.

Left as found, for the owner: formbridge.forms.parameter_form_service.ParameterFormService.get_placeholder_text has no caller after this change.

Checks run locally (CPython 3.12, ObjectState abe763c, formbridge 1e73e6c)

  • pytest tests -n 2: 593 passed, 1 failed. The failure is test_release_dependency_declarations.py::test_published_runtime_is_not_overridden_by_a_source_candidate, which compares the installed zmqruntime with the declared bound; it fails the same way at 0.7.0 with ObjectState 2.1.1 in this environment (run there too).
  • ruff check src/ --select E9,F63,F7,F822,F823: clean.
  • scripts/check_ruff_added_lines.py --base origin/main --head HEAD: no diagnostics on added lines.
  • Docs build, black and mypy (non-blocking in CI): not run.

Release order

ObjectState 3.0.0, formbridge 0.1.2, then this (empty requirements-ci.txt first), then OpenHCS.

🤖 Generated with Claude Code

…ource

ObjectState 3.0.0 removes build_context_stack(ancestor_objects=...). The
value-update path no longer builds its own context stack: an unset field's
placeholder is the state's resolved read of the field
(WidgetService.show_resolved_value_as_placeholder), shared with the two
refresh paths in ParameterOpsService.

Provenance navigation reads get_provenance once per action. A value supplied
by another config of the same object is found in the widget's own state, so
it also works for a state without a scope id, which ObjectState 3 reports as
(None, source_type).

AbstractManagerWidget no longer builds an unused LiveContextResolver.
Tests declare group abbreviations with @abbreviation and no longer assign
the removed atomic-block attributes.

CI installs ObjectState and formbridge at their branch heads until
objectstate 3.0.0 and formbridge 0.1.2 are on PyPI.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Copilot AI balanced review requested due to automatic review settings October 12, 2026 07:28

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@trissim
trissim merged commit a408a22 into main Oct 12, 2026
12 checks passed
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.

2 participants