objectstate 3.0.0__tar.gz → 3.0.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. {objectstate-3.0.0 → objectstate-3.0.1}/PKG-INFO +1 -1
  2. {objectstate-3.0.0 → objectstate-3.0.1}/src/objectstate/__init__.py +1 -1
  3. {objectstate-3.0.0 → objectstate-3.0.1}/src/objectstate/lazy_factory.py +16 -9
  4. {objectstate-3.0.0 → objectstate-3.0.1}/src/objectstate/ui_visibility.py +8 -1
  5. {objectstate-3.0.0 → objectstate-3.0.1}/.github/badges/coverage.svg +0 -0
  6. {objectstate-3.0.0 → objectstate-3.0.1}/.github/workflows/ci.yml +0 -0
  7. {objectstate-3.0.0 → objectstate-3.0.1}/.github/workflows/coverage-pages.yml +0 -0
  8. {objectstate-3.0.0 → objectstate-3.0.1}/.github/workflows/publish.yml +0 -0
  9. {objectstate-3.0.0 → objectstate-3.0.1}/.gitignore +0 -0
  10. {objectstate-3.0.0 → objectstate-3.0.1}/.readthedocs.yaml +0 -0
  11. {objectstate-3.0.0 → objectstate-3.0.1}/BADGE_SETUP.md +0 -0
  12. {objectstate-3.0.0 → objectstate-3.0.1}/LICENSE +0 -0
  13. {objectstate-3.0.0 → objectstate-3.0.1}/README.md +0 -0
  14. {objectstate-3.0.0 → objectstate-3.0.1}/docs/.gitignore +0 -0
  15. {objectstate-3.0.0 → objectstate-3.0.1}/docs/Makefile +0 -0
  16. {objectstate-3.0.0 → objectstate-3.0.1}/docs/api/modules.rst +0 -0
  17. {objectstate-3.0.0 → objectstate-3.0.1}/docs/architectural_fixes.rst +0 -0
  18. {objectstate-3.0.0 → objectstate-3.0.1}/docs/architecture.rst +0 -0
  19. {objectstate-3.0.0 → objectstate-3.0.1}/docs/archive/DOCUMENTATION_AUDIT.md +0 -0
  20. {objectstate-3.0.0 → objectstate-3.0.1}/docs/archive/DOCUMENTATION_FIXES.md +0 -0
  21. {objectstate-3.0.0 → objectstate-3.0.1}/docs/archive/README.md +0 -0
  22. {objectstate-3.0.0 → objectstate-3.0.1}/docs/conf.py +0 -0
  23. {objectstate-3.0.0 → objectstate-3.0.1}/docs/examples/atomic_operations.rst +0 -0
  24. {objectstate-3.0.0 → objectstate-3.0.1}/docs/examples/basic.rst +0 -0
  25. {objectstate-3.0.0 → objectstate-3.0.1}/docs/examples/dual_axis.rst +0 -0
  26. {objectstate-3.0.0 → objectstate-3.0.1}/docs/examples/index.rst +0 -0
  27. {objectstate-3.0.0 → objectstate-3.0.1}/docs/examples/ui.rst +0 -0
  28. {objectstate-3.0.0 → objectstate-3.0.1}/docs/index.rst +0 -0
  29. {objectstate-3.0.0 → objectstate-3.0.1}/docs/make.bat +0 -0
  30. {objectstate-3.0.0 → objectstate-3.0.1}/docs/performance/canonical-context-type-resolution-20261005.json +0 -0
  31. {objectstate-3.0.0 → objectstate-3.0.1}/docs/provenance.rst +0 -0
  32. {objectstate-3.0.0 → objectstate-3.0.1}/docs/quickstart.rst +0 -0
  33. {objectstate-3.0.0 → objectstate-3.0.1}/docs/state_management.rst +0 -0
  34. {objectstate-3.0.0 → objectstate-3.0.1}/docs/state_propagation.rst +0 -0
  35. {objectstate-3.0.0 → objectstate-3.0.1}/docs/undo_redo.rst +0 -0
  36. {objectstate-3.0.0 → objectstate-3.0.1}/paper.bib +0 -0
  37. {objectstate-3.0.0 → objectstate-3.0.1}/paper.md +0 -0
  38. {objectstate-3.0.0 → objectstate-3.0.1}/plans/n_dimensional_inheritance.md +0 -0
  39. {objectstate-3.0.0 → objectstate-3.0.1}/pyproject.toml +0 -0
  40. {objectstate-3.0.0 → objectstate-3.0.1}/scripts/check_ruff_added_lines.py +0 -0
  41. {objectstate-3.0.0 → objectstate-3.0.1}/scripts/release.py +0 -0
  42. {objectstate-3.0.0 → objectstate-3.0.1}/scripts/update_and_release.py +0 -0
  43. {objectstate-3.0.0 → objectstate-3.0.1}/scripts/update_version.py +0 -0
  44. {objectstate-3.0.0 → objectstate-3.0.1}/scripts/verify_release_ready.py +0 -0
  45. {objectstate-3.0.0 → objectstate-3.0.1}/src/objectstate/codegen.py +0 -0
  46. {objectstate-3.0.0 → objectstate-3.0.1}/src/objectstate/collection_containers.py +0 -0
  47. {objectstate-3.0.0 → objectstate-3.0.1}/src/objectstate/config.py +0 -0
  48. {objectstate-3.0.0 → objectstate-3.0.1}/src/objectstate/construction_binding.py +0 -0
  49. {objectstate-3.0.0 → objectstate-3.0.1}/src/objectstate/context_manager.py +0 -0
  50. {objectstate-3.0.0 → objectstate-3.0.1}/src/objectstate/docs/configuration_framework.rst +0 -0
  51. {objectstate-3.0.0 → objectstate-3.0.1}/src/objectstate/docs/context_system.rst +0 -0
  52. {objectstate-3.0.0 → objectstate-3.0.1}/src/objectstate/docs/object_state_lifecycle.rst +0 -0
  53. {objectstate-3.0.0 → objectstate-3.0.1}/src/objectstate/dual_axis_resolver.py +0 -0
  54. {objectstate-3.0.0 → objectstate-3.0.1}/src/objectstate/edit_session.py +0 -0
  55. {objectstate-3.0.0 → objectstate-3.0.1}/src/objectstate/field_access.py +0 -0
  56. {objectstate-3.0.0 → objectstate-3.0.1}/src/objectstate/global_config.py +0 -0
  57. {objectstate-3.0.0 → objectstate-3.0.1}/src/objectstate/inspection.py +0 -0
  58. {objectstate-3.0.0 → objectstate-3.0.1}/src/objectstate/live_context_resolver.py +0 -0
  59. {objectstate-3.0.0 → objectstate-3.0.1}/src/objectstate/object_state.py +0 -0
  60. {objectstate-3.0.0 → objectstate-3.0.1}/src/objectstate/object_state_metadata.py +0 -0
  61. {objectstate-3.0.0 → objectstate-3.0.1}/src/objectstate/object_state_registry.py +0 -0
  62. {objectstate-3.0.0 → objectstate-3.0.1}/src/objectstate/parameter_owner.py +0 -0
  63. {objectstate-3.0.0 → objectstate-3.0.1}/src/objectstate/parameter_structure.py +0 -0
  64. {objectstate-3.0.0 → objectstate-3.0.1}/src/objectstate/parametric_axes.py +0 -0
  65. {objectstate-3.0.0 → objectstate-3.0.1}/src/objectstate/placeholder.py +0 -0
  66. {objectstate-3.0.0 → objectstate-3.0.1}/src/objectstate/reified_generics.py +0 -0
  67. {objectstate-3.0.0 → objectstate-3.0.1}/src/objectstate/scope_key.py +0 -0
  68. {objectstate-3.0.0 → objectstate-3.0.1}/src/objectstate/snapshot_model.py +0 -0
  69. {objectstate-3.0.0 → objectstate-3.0.1}/src/objectstate/subfield_semantics.py +0 -0
  70. {objectstate-3.0.0 → objectstate-3.0.1}/src/objectstate/time_travel_profile.py +0 -0
  71. {objectstate-3.0.0 → objectstate-3.0.1}/src/objectstate/token_cache.py +0 -0
  72. {objectstate-3.0.0 → objectstate-3.0.1}/src/objectstate/transaction_checkpoint.py +0 -0
  73. {objectstate-3.0.0 → objectstate-3.0.1}/src/objectstate/value_semantics.py +0 -0
  74. {objectstate-3.0.0 → objectstate-3.0.1}/tests/__init__.py +0 -0
  75. {objectstate-3.0.0 → objectstate-3.0.1}/tests/conftest.py +0 -0
  76. {objectstate-3.0.0 → objectstate-3.0.1}/tests/test_atomic_block_context.py +0 -0
  77. {objectstate-3.0.0 → objectstate-3.0.1}/tests/test_authored_paths.py +0 -0
  78. {objectstate-3.0.0 → objectstate-3.0.1}/tests/test_callable_baseline.py +0 -0
  79. {objectstate-3.0.0 → objectstate-3.0.1}/tests/test_codegen.py +0 -0
  80. {objectstate-3.0.0 → objectstate-3.0.1}/tests/test_config.py +0 -0
  81. {objectstate-3.0.0 → objectstate-3.0.1}/tests/test_construction_history.py +0 -0
  82. {objectstate-3.0.0 → objectstate-3.0.1}/tests/test_context_failures_surface.py +0 -0
  83. {objectstate-3.0.0 → objectstate-3.0.1}/tests/test_context_manager.py +0 -0
  84. {objectstate-3.0.0 → objectstate-3.0.1}/tests/test_field_access.py +0 -0
  85. {objectstate-3.0.0 → objectstate-3.0.1}/tests/test_global_config.py +0 -0
  86. {objectstate-3.0.0 → objectstate-3.0.1}/tests/test_history_persistence.py +0 -0
  87. {objectstate-3.0.0 → objectstate-3.0.1}/tests/test_inspection.py +0 -0
  88. {objectstate-3.0.0 → objectstate-3.0.1}/tests/test_integration.py +0 -0
  89. {objectstate-3.0.0 → objectstate-3.0.1}/tests/test_lazy_counterpart_registry.py +0 -0
  90. {objectstate-3.0.0 → objectstate-3.0.1}/tests/test_lazy_factory.py +0 -0
  91. {objectstate-3.0.0 → objectstate-3.0.1}/tests/test_live_context_resolver_answers.py +0 -0
  92. {objectstate-3.0.0 → objectstate-3.0.1}/tests/test_object_state_metadata_contracts.py +0 -0
  93. {objectstate-3.0.0 → objectstate-3.0.1}/tests/test_object_state_restore.py +0 -0
  94. {objectstate-3.0.0 → objectstate-3.0.1}/tests/test_object_state_update_instance.py +0 -0
  95. {objectstate-3.0.0 → objectstate-3.0.1}/tests/test_one_field_resolution.py +0 -0
  96. {objectstate-3.0.0 → objectstate-3.0.1}/tests/test_parameter_owner.py +0 -0
  97. {objectstate-3.0.0 → objectstate-3.0.1}/tests/test_parametric_axes.py +0 -0
  98. {objectstate-3.0.0 → objectstate-3.0.1}/tests/test_placeholder.py +0 -0
  99. {objectstate-3.0.0 → objectstate-3.0.1}/tests/test_registry_subscription.py +0 -0
  100. {objectstate-3.0.0 → objectstate-3.0.1}/tests/test_reified_generics.py +0 -0
  101. {objectstate-3.0.0 → objectstate-3.0.1}/tests/test_release_readiness.py +0 -0
  102. {objectstate-3.0.0 → objectstate-3.0.1}/tests/test_resolved_change_notifications.py +0 -0
  103. {objectstate-3.0.0 → objectstate-3.0.1}/tests/test_scope_key.py +0 -0
  104. {objectstate-3.0.0 → objectstate-3.0.1}/tests/test_scopeless_state_resolution.py +0 -0
  105. {objectstate-3.0.0 → objectstate-3.0.1}/tests/test_subfield_semantics.py +0 -0
  106. {objectstate-3.0.0 → objectstate-3.0.1}/tests/test_timeline_projection.py +0 -0
  107. {objectstate-3.0.0 → objectstate-3.0.1}/tests/test_transaction_checkpoint.py +0 -0
  108. {objectstate-3.0.0 → objectstate-3.0.1}/tests/test_ui_visible_field_projection.py +0 -0
  109. {objectstate-3.0.0 → objectstate-3.0.1}/tests/test_undo_redo_cascade.py +0 -0
  110. {objectstate-3.0.0 → objectstate-3.0.1}/tests/test_value_semantics.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: objectstate
3
- Version: 3.0.0
3
+ Version: 3.0.1
4
4
  Summary: Generic lazy dataclass configuration framework with dual-axis inheritance and contextvars-based resolution
5
5
  Project-URL: Homepage, https://github.com/OpenHCSDev/objectstate
6
6
  Project-URL: Documentation, https://objectstate.readthedocs.io
@@ -210,7 +210,7 @@ __all__ = [
210
210
  'ObjectStateEditSession',
211
211
  ]
212
212
 
213
- __version__ = "3.0.0"
213
+ __version__ = "3.0.1"
214
214
  __author__ = 'OpenHCS Team'
215
215
  __description__ = 'Generic configuration framework for lazy dataclass resolution'
216
216
 
@@ -46,9 +46,17 @@ def _recreated_dataclass_namespace(
46
46
  declared_type: type,
47
47
  recreated_name: str,
48
48
  ) -> dict[str, object]:
49
- """Return declaration-owned metadata for a recreated dataclass."""
49
+ """Return declaration-owned metadata for a recreated dataclass.
50
50
 
51
- namespace: dict[str, object] = {"__doc__": declared_type.__doc__}
51
+ The module and qualified name are in the namespace so the class has them
52
+ while it is being created: a metaclass that registers classes then sees the
53
+ declaration the class was rebuilt from, not ``abc`` or this module.
54
+ """
55
+
56
+ namespace: dict[str, object] = {
57
+ "__doc__": declared_type.__doc__,
58
+ "__module__": declared_type.__module__,
59
+ }
52
60
  if recreated_name == declared_type.__name__:
53
61
  namespace["__qualname__"] = declared_type.__qualname__
54
62
  return namespace
@@ -203,16 +211,15 @@ def rebuild_with_none_defaults(
203
211
  frozen=is_frozen,
204
212
  )
205
213
 
206
- # Preserve original metaclass if it's not just type
207
- # This is critical for AutoRegisterMeta and other custom metaclasses
208
- if orig_metaclass is not type:
209
- # Re-create the class with the original metaclass
210
- # We need to do this because make_dataclass doesn't accept metaclass parameter
211
- # But we must NOT re-apply @dataclass since make_dataclass already did that
214
+ # make_dataclass takes no metaclass parameter: it derives one from the
215
+ # bases. When the declared class names a metaclass its bases do not carry,
216
+ # create the class once more with that metaclass. @dataclass is NOT
217
+ # re-applied, since make_dataclass already did that.
218
+ if type(new_cls) is not orig_metaclass:
212
219
  new_cls = orig_metaclass(
213
220
  new_cls.__name__,
214
221
  new_cls.__bases__,
215
- dict(new_cls.__dict__),
222
+ {**new_cls.__dict__, **_recreated_dataclass_namespace(cls, recreated_name)},
216
223
  )
217
224
 
218
225
  return _restore_recreated_dataclass_metadata(new_cls, cls)
@@ -40,7 +40,14 @@ class UISpecialFieldRegistry:
40
40
  def register(cls, owner_type: T, field_names: tuple[str, ...]) -> T:
41
41
  if not field_names:
42
42
  raise ValueError("UI special field registration requires at least one field")
43
- cls._fields_by_owner[owner_type] = frozenset(field_names)
43
+ declared = frozenset(field_names)
44
+ registered = cls._fields_by_owner.get(owner_type)
45
+ if registered is not None and registered != declared:
46
+ raise ValueError(
47
+ f"{owner_type.__qualname__} already declares UI special fields "
48
+ f"{sorted(registered)!r}; it cannot also declare {sorted(declared)!r}."
49
+ )
50
+ cls._fields_by_owner[owner_type] = declared
44
51
  return owner_type
45
52
 
46
53
  @classmethod
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes