metaobjects 0.15.7__tar.gz → 0.15.9__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 (381) hide show
  1. {metaobjects-0.15.7 → metaobjects-0.15.9}/PKG-INFO +1 -1
  2. {metaobjects-0.15.7 → metaobjects-0.15.9}/pyproject.toml +1 -1
  3. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/codegen/generators/render_helper_generator.py +22 -14
  4. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/errors.py +11 -0
  5. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/loader/validation_passes.py +65 -0
  6. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/naming_refs.py +67 -0
  7. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_render_helper_conformance.py +39 -1
  8. {metaobjects-0.15.7 → metaobjects-0.15.9}/.gitignore +0 -0
  9. {metaobjects-0.15.7 → metaobjects-0.15.9}/LICENSE +0 -0
  10. {metaobjects-0.15.7 → metaobjects-0.15.9}/README.md +0 -0
  11. {metaobjects-0.15.7 → metaobjects-0.15.9}/hatch_build.py +0 -0
  12. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/__init__.py +0 -0
  13. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/agent_context/__init__.py +0 -0
  14. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/agent_context/scaffold.py +0 -0
  15. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/apidocs/__init__.py +0 -0
  16. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/apidocs/api_model.py +0 -0
  17. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/apidocs/builder.py +0 -0
  18. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/apidocs/naming.py +0 -0
  19. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/apidocs/paths.py +0 -0
  20. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/apidocs/renderer.py +0 -0
  21. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/attr_class_map.py +0 -0
  22. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/cli.py +0 -0
  23. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/codegen/KNOWN_GAPS.md +0 -0
  24. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/codegen/__init__.py +0 -0
  25. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/codegen/config.py +0 -0
  26. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/codegen/constants.py +0 -0
  27. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/codegen/extract_delegate_emitter.py +0 -0
  28. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/codegen/extract_schema_emitter.py +0 -0
  29. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/codegen/format.py +0 -0
  30. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/codegen/fr010_field_mapping.py +0 -0
  31. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/codegen/generator.py +0 -0
  32. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/codegen/generator_registry.py +0 -0
  33. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/codegen/generators/__init__.py +0 -0
  34. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/codegen/generators/entity_model.py +0 -0
  35. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/codegen/generators/extractor_generator.py +0 -0
  36. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/codegen/generators/filter_allowlist_generator.py +0 -0
  37. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/codegen/generators/fr019_shared_enum.py +0 -0
  38. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/codegen/generators/m2m_codegen.py +0 -0
  39. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/codegen/generators/output_parser_generator.py +0 -0
  40. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/codegen/generators/output_prompt_generator.py +0 -0
  41. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/codegen/generators/payload_vo_generator.py +0 -0
  42. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/codegen/generators/router_generator.py +0 -0
  43. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/codegen/generators/template_generator.py +0 -0
  44. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/codegen/generators/tph_plan.py +0 -0
  45. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/codegen/generators/trace_helper_generator.py +0 -0
  46. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/codegen/instance_artifacts.py +0 -0
  47. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/codegen/output_format_spec_emitter.py +0 -0
  48. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/codegen/overwrite_policy.py +0 -0
  49. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/codegen/runner.py +0 -0
  50. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/codegen/runtime/__init__.py +0 -0
  51. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/codegen/runtime/filter_parser.py +0 -0
  52. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/codegen/template_codegen/__init__.py +0 -0
  53. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/codegen/template_codegen/output_pattern.py +0 -0
  54. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/codegen/template_codegen/template_data.py +0 -0
  55. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/codegen/template_codegen/template_spec.py +0 -0
  56. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/codegen/type_map.py +0 -0
  57. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/core_types.py +0 -0
  58. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/datatype.py +0 -0
  59. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/documentation/__init__.py +0 -0
  60. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/documentation/doc_constants.py +0 -0
  61. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/documentation/doc_provider.py +0 -0
  62. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/documentation/doc_schema.py +0 -0
  63. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/loader/__init__.py +0 -0
  64. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/loader/merge.py +0 -0
  65. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/loader/meta_data_loader.py +0 -0
  66. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/loader/registered_validation.py +0 -0
  67. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/loader/sources/__init__.py +0 -0
  68. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/loader/sources/directory_source.py +0 -0
  69. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/loader/sources/file_source.py +0 -0
  70. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/loader/sources/meta_data_source.py +0 -0
  71. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/loader/sources/uri_source.py +0 -0
  72. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/loader/validate_discriminator.py +0 -0
  73. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/loader/validate_field_readonly.py +0 -0
  74. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/loader/validate_source_parameter_ref.py +0 -0
  75. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/loader/validate_source_physical_names.py +0 -0
  76. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/__init__.py +0 -0
  77. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/core/__init__.py +0 -0
  78. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/core/attr/__init__.py +0 -0
  79. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/core/attr/attr_constants.py +0 -0
  80. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/core/attr/meta_attr.py +0 -0
  81. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/core/field/__init__.py +0 -0
  82. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/core/field/field_constants.py +0 -0
  83. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/core/field/meta_field.py +0 -0
  84. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/core/identity/__init__.py +0 -0
  85. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/core/identity/identity_constants.py +0 -0
  86. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/core/identity/meta_identity.py +0 -0
  87. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/core/index/__init__.py +0 -0
  88. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/core/index/index_constants.py +0 -0
  89. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/core/index/meta_index.py +0 -0
  90. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/core/object/__init__.py +0 -0
  91. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/core/object/meta_object.py +0 -0
  92. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/core/object/meta_object_aware.py +0 -0
  93. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/core/object/object_class_registry.py +0 -0
  94. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/core/object/object_constants.py +0 -0
  95. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/core/object/object_extract.py +0 -0
  96. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/core/object/value_object.py +0 -0
  97. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/core/relationship/__init__.py +0 -0
  98. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/core/relationship/derive_m2m_fields.py +0 -0
  99. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/core/relationship/meta_relationship.py +0 -0
  100. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/core/relationship/relationship_constants.py +0 -0
  101. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/core/validator/__init__.py +0 -0
  102. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/core/validator/validator_constants.py +0 -0
  103. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/meta_data.py +0 -0
  104. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/meta_root.py +0 -0
  105. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/persistence/__init__.py +0 -0
  106. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/persistence/db/__init__.py +0 -0
  107. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/persistence/db/db_constants.py +0 -0
  108. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/persistence/db/db_provider.py +0 -0
  109. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/persistence/origin/__init__.py +0 -0
  110. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/persistence/origin/meta_origin.py +0 -0
  111. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/persistence/origin/origin_constants.py +0 -0
  112. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/persistence/source/__init__.py +0 -0
  113. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/persistence/source/meta_source.py +0 -0
  114. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/persistence/source/source_constants.py +0 -0
  115. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/presentation/__init__.py +0 -0
  116. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/presentation/layout/__init__.py +0 -0
  117. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/presentation/layout/layout_constants.py +0 -0
  118. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/presentation/layout/meta_layout.py +0 -0
  119. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/presentation/ui/__init__.py +0 -0
  120. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/presentation/ui/ui_provider.py +0 -0
  121. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/presentation/view/__init__.py +0 -0
  122. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/presentation/view/meta_view.py +0 -0
  123. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/presentation/view/view_constants.py +0 -0
  124. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/provider_extends.py +0 -0
  125. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/template/__init__.py +0 -0
  126. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/template/meta_template.py +0 -0
  127. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/template/prompt_provider.py +0 -0
  128. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/meta/template/template_constants.py +0 -0
  129. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/parser.py +0 -0
  130. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/parser_yaml.py +0 -0
  131. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/provider.py +0 -0
  132. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/py.typed +0 -0
  133. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/registry.py +0 -0
  134. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/registry_manifest.py +0 -0
  135. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/render/__init__.py +0 -0
  136. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/render/email_document.py +0 -0
  137. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/render/escapers.py +0 -0
  138. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/render/extract/KNOWN_GAPS.md +0 -0
  139. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/render/extract/__init__.py +0 -0
  140. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/render/extract/coerce.py +0 -0
  141. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/render/extract/extract.py +0 -0
  142. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/render/extract/extract_map.py +0 -0
  143. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/render/extract/json_forgiving_reader.py +0 -0
  144. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/render/extract/locate.py +0 -0
  145. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/render/extract/normalize.py +0 -0
  146. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/render/extract/strip.py +0 -0
  147. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/render/extract/types.py +0 -0
  148. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/render/extract/xml_forgiving_reader.py +0 -0
  149. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/render/filesystem_provider.py +0 -0
  150. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/render/prompt/__init__.py +0 -0
  151. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/render/prompt/output_format_renderer.py +0 -0
  152. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/render/prompt/output_format_spec.py +0 -0
  153. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/render/prompt/prompt_field.py +0 -0
  154. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/render/prompt/prompt_overrides.py +0 -0
  155. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/render/prompt/prompt_style.py +0 -0
  156. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/render/renderer.py +0 -0
  157. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/render/verify.py +0 -0
  158. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/runtime/__init__.py +0 -0
  159. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/runtime/llm_recorder.py +0 -0
  160. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/runtime/n2m_resolver.py +0 -0
  161. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/runtime/object_manager.py +0 -0
  162. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/runtime/tph.py +0 -0
  163. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/serializer_json.py +0 -0
  164. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/shared/__init__.py +0 -0
  165. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/shared/base_types.py +0 -0
  166. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/shared/separators.py +0 -0
  167. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/shared/structural.py +0 -0
  168. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/source/__init__.py +0 -0
  169. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/source/error_source.py +0 -0
  170. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/source/json_path.py +0 -0
  171. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/source/semantic_diff.py +0 -0
  172. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/source/yaml_positions.py +0 -0
  173. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/spec_metamodel/__init__.py +0 -0
  174. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/spec_metamodel/attr.json +0 -0
  175. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/spec_metamodel/db.json +0 -0
  176. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/spec_metamodel/documentation.json +0 -0
  177. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/spec_metamodel/field.json +0 -0
  178. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/spec_metamodel/identity.json +0 -0
  179. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/spec_metamodel/index.json +0 -0
  180. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/spec_metamodel/layout.json +0 -0
  181. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/spec_metamodel/object.json +0 -0
  182. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/spec_metamodel/origin.json +0 -0
  183. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/spec_metamodel/prompt.json +0 -0
  184. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/spec_metamodel/relationship.json +0 -0
  185. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/spec_metamodel/source.json +0 -0
  186. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/spec_metamodel/template.json +0 -0
  187. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/spec_metamodel/ui.json +0 -0
  188. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/spec_metamodel/validator.json +0 -0
  189. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/spec_metamodel/view.json +0 -0
  190. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/super_resolve.py +0 -0
  191. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/validation_types.py +0 -0
  192. {metaobjects-0.15.7 → metaobjects-0.15.9}/src/metaobjects/yaml_desugar.py +0 -0
  193. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/__init__.py +0 -0
  194. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/__init__.py +0 -0
  195. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/golden/extends/expected/BaseEntity.py +0 -0
  196. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/golden/extends/expected/Program.py +0 -0
  197. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/golden/extends/meta.json +0 -0
  198. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/golden/nested-array/expected/AuthorBrief.py +0 -0
  199. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/golden/nested-array/expected/PostBrief.py +0 -0
  200. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/golden/nested-array/meta.json +0 -0
  201. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/golden/scalars/expected/Metric.py +0 -0
  202. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/golden/scalars/expected/Report.py +0 -0
  203. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/golden/scalars/meta.json +0 -0
  204. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/golden/vanilla/expected/Subscriber.py +0 -0
  205. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/golden/vanilla/meta.json +0 -0
  206. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_abstract_conformance.py +0 -0
  207. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_api_docs_builder.py +0 -0
  208. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_api_docs_paths.py +0 -0
  209. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_cli.py +0 -0
  210. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_cli_providers.py +0 -0
  211. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_cli_registry.py +0 -0
  212. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_cli_staleness_nudge.py +0 -0
  213. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_cli_verify_strict.py +0 -0
  214. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_cli_verify_subverbs.py +0 -0
  215. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_constants_config.py +0 -0
  216. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_entity_model.py +0 -0
  217. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_enum_conformance.py +0 -0
  218. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_extends_abstract_field_inheritance.py +0 -0
  219. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_extractor_generator.py +0 -0
  220. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_filter_allowlist_generator.py +0 -0
  221. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_format.py +0 -0
  222. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_fr010_nested_object_prompt.py +0 -0
  223. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_fr010_output_codegen.py +0 -0
  224. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_fr019_shared_provided_conformance.py +0 -0
  225. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_generator.py +0 -0
  226. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_generator_extension_seams.py +0 -0
  227. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_golden.py +0 -0
  228. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_inherit_without_restate_gate.py +0 -0
  229. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_inheritance_conformance.py +0 -0
  230. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_instance_artifacts.py +0 -0
  231. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_m2m_codegen.py +0 -0
  232. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_output_parser_generator.py +0 -0
  233. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_overwrite_policy.py +0 -0
  234. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_payload_vo_generator.py +0 -0
  235. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_projection_compile.py +0 -0
  236. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_render_helper_generator.py +0 -0
  237. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_reverse_finders.py +0 -0
  238. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_router_generator.py +0 -0
  239. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_runner.py +0 -0
  240. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_template_data.py +0 -0
  241. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_template_generator.py +0 -0
  242. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_template_output_pattern.py +0 -0
  243. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_template_scope_helpers.py +0 -0
  244. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_template_scope_walk.py +0 -0
  245. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_template_spec.py +0 -0
  246. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_tph_codegen.py +0 -0
  247. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_trace_helper_generator.py +0 -0
  248. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_type_map.py +0 -0
  249. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/codegen/test_validation_conformance.py +0 -0
  250. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/conformance/__init__.py +0 -0
  251. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/conformance/capabilities.py +0 -0
  252. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/conformance/conformance-expected-failures.json +0 -0
  253. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/conformance/conformance_adapter.py +0 -0
  254. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/conformance/corpus.py +0 -0
  255. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/conformance/expected_failures.py +0 -0
  256. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/conformance/fixture_discovery.py +0 -0
  257. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/conformance/navigator.py +0 -0
  258. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/conformance/test_api_docs_cross_port_conformance.py +0 -0
  259. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/conformance/test_conformance.py +0 -0
  260. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/conformance/test_extract_conformance.py +0 -0
  261. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/conformance/test_extract_object_verdict.py +0 -0
  262. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/conformance/test_fr010_loader_attrs.py +0 -0
  263. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/conformance/test_fr011_attrs.py +0 -0
  264. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/conformance/test_generator_registry_conformance.py +0 -0
  265. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/conformance/test_object_model_conformance.py +0 -0
  266. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/conformance/test_provider_composition_conformance.py +0 -0
  267. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/conformance/test_registry_conformance.py +0 -0
  268. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/conformance/test_runner_hardfail.py +0 -0
  269. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/conformance/test_spec_metamodel_embed.py +0 -0
  270. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/conformance/test_strict_attr_load.py +0 -0
  271. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/conformance/test_template_codegen_conformance.py +0 -0
  272. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/conformance/test_template_generator_conformance.py +0 -0
  273. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/conformance/test_yaml_conformance.py +0 -0
  274. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/conformance/yaml-conformance-expected-failures.json +0 -0
  275. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/integration/__init__.py +0 -0
  276. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/integration/api_contract_assertions.py +0 -0
  277. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/integration/api_contract_jsonb_server.py +0 -0
  278. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/integration/api_contract_m2m_server.py +0 -0
  279. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/integration/api_contract_server.py +0 -0
  280. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/integration/generated_jsonb_app.py +0 -0
  281. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/integration/generated_m2m_app.py +0 -0
  282. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/integration/generated_router_app.py +0 -0
  283. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/integration/generated_tph_app.py +0 -0
  284. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/integration/meta_ai_trace.yaml +0 -0
  285. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/integration/normalization.py +0 -0
  286. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/integration/postgres_container.py +0 -0
  287. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/integration/query_runner.py +0 -0
  288. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/integration/scenarios.py +0 -0
  289. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/integration/test_api_contract.py +0 -0
  290. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/integration/test_api_contract_generated.py +0 -0
  291. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/integration/test_api_contract_jsonb.py +0 -0
  292. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/integration/test_api_contract_m2m.py +0 -0
  293. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/integration/test_api_contract_m2m_generated.py +0 -0
  294. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/integration/test_api_contract_tph_generated.py +0 -0
  295. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/integration/test_llm_call_trace.py +0 -0
  296. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/integration/test_normalization.py +0 -0
  297. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/integration/test_query_scenarios.py +0 -0
  298. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/integration/test_runtime_return_types.py +0 -0
  299. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/open_closed_proof_test.py +0 -0
  300. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/render/__init__.py +0 -0
  301. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/render/extract/__init__.py +0 -0
  302. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/render/extract/test_coerce.py +0 -0
  303. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/render/extract/test_extract.py +0 -0
  304. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/render/extract/test_extract_map.py +0 -0
  305. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/render/extract/test_json_forgiving_reader.py +0 -0
  306. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/render/extract/test_locate.py +0 -0
  307. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/render/extract/test_model.py +0 -0
  308. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/render/extract/test_normalize.py +0 -0
  309. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/render/extract/test_strip.py +0 -0
  310. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/render/extract/test_xml_forgiving_reader.py +0 -0
  311. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/render/prompt/__init__.py +0 -0
  312. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/render/prompt/test_output_format_renderer.py +0 -0
  313. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/render/test_email_document.py +0 -0
  314. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/render/test_filesystem_provider.py +0 -0
  315. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/render/test_output_format_renderer_nested.py +0 -0
  316. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/render/test_output_prompt_conformance.py +0 -0
  317. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/render/test_render_conformance.py +0 -0
  318. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/render/test_render_max_chars.py +0 -0
  319. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/render/test_verify.py +0 -0
  320. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/render/test_verify_conformance.py +0 -0
  321. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/source/__init__.py +0 -0
  322. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/source/test_fr5c_merge_attribution.py +0 -0
  323. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/source/test_fr5d_reference_resolution.py +0 -0
  324. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/source/test_fr5e_database_source_shape.py +0 -0
  325. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/source/test_json_path.py +0 -0
  326. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/source/test_semantic_diff.py +0 -0
  327. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/source/test_source_on_node.py +0 -0
  328. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/source/test_yaml_positions.py +0 -0
  329. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/test_api_docs_accuracy.py +0 -0
  330. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/__init__.py +0 -0
  331. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_agent_context_staleness.py +0 -0
  332. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_capabilities.py +0 -0
  333. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_common_attrs.py +0 -0
  334. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_core_types.py +0 -0
  335. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_effective_package.py +0 -0
  336. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_errors.py +0 -0
  337. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_field_enum.py +0 -0
  338. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_field_map_validation.py +0 -0
  339. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_field_uuid_dbcolumntype.py +0 -0
  340. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_fr016_source_name_and_kind_aliases.py +0 -0
  341. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_index_lookup.py +0 -0
  342. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_llm_recorder.py +0 -0
  343. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_loader.py +0 -0
  344. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_loader_bom.py +0 -0
  345. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_loader_class.py +0 -0
  346. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_merge.py +0 -0
  347. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_meta_attr.py +0 -0
  348. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_meta_data.py +0 -0
  349. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_meta_source.py +0 -0
  350. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_module_shortcuts.py +0 -0
  351. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_n2m_resolver.py +0 -0
  352. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_n2m_resolver_inherited.py +0 -0
  353. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_object_manager_uuid_coercion.py +0 -0
  354. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_one_primary_source.py +0 -0
  355. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_parser.py +0 -0
  356. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_parser_yaml.py +0 -0
  357. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_provider.py +0 -0
  358. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_provider_extension.py +0 -0
  359. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_registry.py +0 -0
  360. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_registry_completeness.py +0 -0
  361. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_registry_extend.py +0 -0
  362. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_registry_sealed.py +0 -0
  363. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_relationship_referential_actions.py +0 -0
  364. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_resolution_key.py +0 -0
  365. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_runtime_resolution_key_binding.py +0 -0
  366. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_serializer.py +0 -0
  367. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_shared_constants.py +0 -0
  368. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_smoke.py +0 -0
  369. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_sources.py +0 -0
  370. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_strict_child_placement.py +0 -0
  371. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_super_resolve.py +0 -0
  372. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_template_toolcall.py +0 -0
  373. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_template_wrong_subtype_attrs.py +0 -0
  374. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_validation_attr_schema.py +0 -0
  375. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_validation_filter_values.py +0 -0
  376. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_validation_origin_paths.py +0 -0
  377. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_validation_sort_field.py +0 -0
  378. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_validation_warnings.py +0 -0
  379. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_write_coercion_arrays.py +0 -0
  380. {metaobjects-0.15.7 → metaobjects-0.15.9}/tests/unit/test_yaml_desugar.py +0 -0
  381. {metaobjects-0.15.7 → metaobjects-0.15.9}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: metaobjects
3
- Version: 0.15.7
3
+ Version: 0.15.9
4
4
  Summary: Cross-language metadata standard: declare typed entities once, generate idiomatic drift-checked code across languages — Python port.
5
5
  Project-URL: Homepage, https://metaobjects.dev
6
6
  Project-URL: Repository, https://github.com/metaobjectsdev/metaobjects
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "metaobjects"
3
- version = "0.15.7"
3
+ version = "0.15.9"
4
4
  description = "Cross-language metadata standard: declare typed entities once, generate idiomatic drift-checked code across languages — Python port."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -26,10 +26,10 @@ build fail when a mustache references a field the payload VO doesn't declare.
26
26
  Reuse, not reimplementation: ``render`` (the emitted runtime call), ``verify`` (the
27
27
  build-time gate), ``FilesystemProvider`` (build-time ref resolution), and
28
28
  ``EmailDocument`` (email return type). The payload field tree is walked from the VO
29
- the same way the other generators walk it — but a nested ``field.object``'s
30
- ``@objectRef`` is resolved by BARE short-name (cross-port render-helper consensus:
31
- TS ``findObject`` / Java ``resolveNestedObjectRef`` / C# ``ResolveNestedObjectRef``),
32
- only recursing into ``object.value`` targets, cycle-guarded.
29
+ the same way the other generators walk it — a nested ``field.object``'s ``@objectRef``
30
+ is resolved FQN-exact when fully-qualified (ADR-0041) else by short name (cross-port
31
+ render-helper consensus: TS ``refMatchesObject`` / Java+Kotlin ``resolveNestedObjectRef``
32
+ / C# ``ResolveNestedObjectRef``), only recursing into ``object.value`` targets, cycle-guarded.
33
33
 
34
34
  Python divergence vs TS / Java / C#: Python's ``RenderRequest`` has NO ``verify``
35
35
  field — the Python render engine does not run a runtime drift pass — so the emitted
@@ -75,19 +75,24 @@ def _py_str(s: str) -> str:
75
75
 
76
76
 
77
77
  # ---------------------------------------------------------------------------
78
- # Payload field-tree walk — nested @objectRef resolved by BARE short-name
79
- # (cross-port render-helper consensus). Object-ref fields recurse into their
80
- # target object.value (SUBTYPE_VALUE only); a `seen` set guards reference cycles.
78
+ # Payload field-tree walk — nested @objectRef resolved FQN-exact (ADR-0041).
79
+ # Object-ref fields recurse into their target object.value (SUBTYPE_VALUE only);
80
+ # a `seen` set guards reference cycles.
81
81
  # ---------------------------------------------------------------------------
82
82
 
83
83
 
84
84
  def _resolve_nested_object_ref(root: MetaData, reference: str) -> MetaObject | None:
85
- """Resolve a ``field.object``'s ``@objectRef`` to its target ``object.value`` by BARE
86
- short-name — mirroring the C# ``ResolveNestedObjectRef`` / TS ``findObject`` / Java
87
- ``resolveNestedObjectRef``. If the ref carries a package, only the segment after the
88
- last ``::`` is compared, against each ``object.value``'s own short name."""
85
+ """Resolve a ``field.object``'s ``@objectRef`` to its target ``object.value``.
86
+
87
+ ADR-0041: a FULLY-QUALIFIED ref (contains ``::``) resolves EXACTLY on the
88
+ package-qualified name (``resolution_key()``/``fqn()``) never a bare-tail
89
+ fallback that would bind a same-named ``object.value`` in the WRONG package on a
90
+ cross-package short-name collision. A bare ref still matches by short name
91
+ (first-wins). Mirrors the Java/Kotlin ``resolveNestedObjectRef`` + TS
92
+ ``refMatchesObject``."""
89
93
  if not reference:
90
94
  return None
95
+ fqn = PACKAGE_SEP in reference
91
96
  ref_short = reference.rsplit(PACKAGE_SEP, 1)[-1]
92
97
  # ADR-0039 sanctioned own: top-level scan on the loader ROOT (never extended, own == effective)
93
98
  for child in root.own_children():
@@ -95,7 +100,10 @@ def _resolve_nested_object_ref(root: MetaData, reference: str) -> MetaObject | N
95
100
  continue
96
101
  if child.sub_type != OBJECT_SUBTYPE_VALUE:
97
102
  continue
98
- if child.name.rsplit(PACKAGE_SEP, 1)[-1] == ref_short:
103
+ if fqn:
104
+ if child.resolution_key() == reference or child.fqn() == reference:
105
+ return child
106
+ elif child.name.rsplit(PACKAGE_SEP, 1)[-1] == ref_short:
99
107
  return child
100
108
  return None
101
109
 
@@ -107,9 +115,9 @@ def _derive_payload_field_tree(
107
115
  resolvable ``@objectRef`` to an ``object.value`` becomes a context-pushing node whose
108
116
  children are the target VO's tree (recursed, cycle-guarded). Every other field is a
109
117
  leaf."""
110
- if vo is None or vo.name in seen:
118
+ if vo is None or vo.resolution_key() in seen:
111
119
  return []
112
- next_seen = seen | {vo.name}
120
+ next_seen = seen | {vo.resolution_key()}
113
121
  fields: list[PayloadField] = []
114
122
  for f in vo.children():
115
123
  if f.type != TYPE_FIELD or not isinstance(f, MetaField):
@@ -132,6 +132,17 @@ class ErrorCode(str, Enum):
132
132
  # emit this yet (the T6 guard is deferred — like TS, it belongs in the parser);
133
133
  # the enum tracks the shared corpus code so resolution/desugar stay aligned.
134
134
  ERR_RELATIVE_REF_IN_CANONICAL = "ERR_RELATIVE_REF_IN_CANONICAL"
135
+ # ADR-0041 — cross-package reference resolution contract. A BARE object
136
+ # reference (no ``::``) that names an object present in MORE THAN ONE package,
137
+ # with NO match in the referrer's own package, is ambiguous — the author must
138
+ # qualify it with the package (FQN). Applies to every object-ref-bearing attr
139
+ # (@objectRef / @references / @from / @of / @via heads / @parameterRef /
140
+ # @payloadRef / @responseRef). An FQN ref resolves exactly and is never
141
+ # ambiguous; a bare ref that matches the referrer's own package, or exactly one
142
+ # package anywhere, resolves fine. ``extends`` is intentionally NOT covered
143
+ # (its same-package/root-strict super-resolver yields ERR_UNRESOLVED_SUPER on a
144
+ # bare cross-package miss, not ambiguity).
145
+ ERR_AMBIGUOUS_REF = "ERR_AMBIGUOUS_REF"
135
146
  # FR-033 — strict structural-placement vocabulary. ERR_CHILD_NOT_ALLOWED: a
136
147
  # structural child (field/identity/source/validator/… — not an attr) is placed
137
148
  # under a parent whose registered childRules do not admit it (the structural
@@ -107,6 +107,7 @@ from ..meta.core.object.object_constants import (
107
107
  from ..meta.core.identity.identity_constants import IDENTITY_ATTR_FIELDS
108
108
  from ..meta.core.index.index_constants import INDEX_ATTR_FIELDS, INDEX_SUBTYPE_LOOKUP
109
109
  from ..source import resolved_source
110
+ from ..naming_refs import CHILD_REF_SEP, REF_BEARING_ATTR_NAMES, resolve_object_ref
110
111
 
111
112
  # A subtype-specific template attr is valid ONLY on the subtype it is registered
112
113
  # for. The metamodel registers these per-subtype (see the core_types template block),
@@ -179,6 +180,8 @@ def run_validations(
179
180
  # @valueType (when set) must name a known scalar subtype.
180
181
  _validate_field_map(root, errors)
181
182
  _validate_templates(root, errors)
183
+ # ADR-0041 — cross-package bare-reference ambiguity (the object-ref contract).
184
+ _validate_cross_package_refs(root, errors)
182
185
  _validate_subtype_rules(root, errors, warnings)
183
186
  # FR-024 B3 — projection identity pass-through + key correspondence.
184
187
  _validate_identity_passthrough(root, errors)
@@ -208,6 +211,68 @@ def _walk(root: MetaData) -> list[MetaData]:
208
211
  return result
209
212
 
210
213
 
214
+ # ---------------------------------------------------------------------------
215
+ # Pass: cross-package reference ambiguity (the object-ref contract, ADR-0041)
216
+ # ---------------------------------------------------------------------------
217
+
218
+
219
+ def _validate_cross_package_refs(root: MetaData, errors: list[MetaError]) -> None:
220
+ """ADR-0041 — a BARE object reference (no ``::``) that names an object present
221
+ in MORE THAN ONE package, with NO match in the referrer's own package, is
222
+ ambiguous → ERR_AMBIGUOUS_REF (the author must qualify it with the package).
223
+
224
+ An FQN ref is exact (never ambiguous); a bare ref matching the referrer's own
225
+ package, or exactly one package anywhere, resolves fine. Covers every
226
+ object-ref-bearing attr in ``REF_BEARING_ATTR_NAMES`` (@objectRef / @references
227
+ / @from / @of / @via / @parameterRef / @payloadRef / @responseRef) — the dotted
228
+ ``.child`` tail of the origin heads is stripped to the entity OWNER. ``extends``
229
+ is intentionally NOT covered: its same-package/root-strict super-resolver never
230
+ matches a packaged object by bare name, so a bare cross-package ``extends`` is
231
+ unresolved (ERR_UNRESOLVED_SUPER), not ambiguous. Mirrors the TS reference
232
+ ``validateCrossPackageRefs``.
233
+ """
234
+
235
+ def _visit(node: MetaData, obj: MetaData, referrer_pkg: str) -> None:
236
+ for attr_name in REF_BEARING_ATTR_NAMES:
237
+ # ADR-0039 sanctioned own: judge the ref AUTHORED on THIS node; an
238
+ # inherited ref was judged on its declaring node. Mirrors the TS
239
+ # `node.ownAttr(attrName)`.
240
+ raw = node.attr(attr_name)
241
+ if not isinstance(raw, str):
242
+ continue
243
+ # Owner = the object part; strip any FR-024 dotted `.child` tail. An FQN
244
+ # owner (has `::`) is resolved exactly and can never be ambiguous.
245
+ dot = raw.find(CHILD_REF_SEP)
246
+ owner = raw if dot == -1 else raw[:dot]
247
+ if PACKAGE_SEP in owner or owner == "":
248
+ continue
249
+ if not resolve_object_ref(root, owner, referrer_pkg).ambiguous:
250
+ continue
251
+ pkgs = [
252
+ c.resolution_key()
253
+ for c in root.children()
254
+ if c.type == TYPE_OBJECT and c.name == owner
255
+ ]
256
+ errors.append(
257
+ MetaError(
258
+ f'@{attr_name} "{raw}" on {obj.fqn()}: bare reference "{owner}" '
259
+ f"is ambiguous — it names an object in multiple packages "
260
+ f"({', '.join(pkgs)}) and none is in the referrer's package "
261
+ f'"{referrer_pkg}". Qualify it with the package (FQN).',
262
+ ErrorCode.ERR_AMBIGUOUS_REF,
263
+ envelope=resolved_source(node.source, obj.fqn(), owner),
264
+ )
265
+ )
266
+ for c in node.own_children():
267
+ _visit(c, obj, referrer_pkg)
268
+
269
+ for obj in root.children():
270
+ if obj.type != TYPE_OBJECT:
271
+ continue
272
+ referrer_pkg = obj.package or obj.file_default_package or ""
273
+ _visit(obj, obj, referrer_pkg)
274
+
275
+
211
276
  # ---------------------------------------------------------------------------
212
277
  # Pass: attr-schema validation
213
278
  # ---------------------------------------------------------------------------
@@ -29,6 +29,8 @@ NEVER expanded — it is the node's identity.
29
29
  """
30
30
  from __future__ import annotations
31
31
 
32
+ from typing import TYPE_CHECKING, NamedTuple, Optional
33
+
32
34
  from .meta.core.field.field_constants import FIELD_ATTR_OBJECT_REF
33
35
  from .meta.core.identity.identity_constants import IDENTITY_REFERENCE_ATTR_REFERENCES
34
36
  from .meta.core.relationship.relationship_constants import RELATIONSHIP_ATTR_OBJECT_REF
@@ -42,8 +44,12 @@ from .meta.template.template_constants import (
42
44
  TEMPLATE_ATTR_PAYLOAD_REF,
43
45
  TEMPLATE_ATTR_RESPONSE_REF,
44
46
  )
47
+ from .shared.base_types import TYPE_OBJECT
45
48
  from .shared.separators import PACKAGE_SEP
46
49
 
50
+ if TYPE_CHECKING:
51
+ from .meta.meta_data import MetaData
52
+
47
53
  # Structural separator literals (Python has no PACKAGE_PARENT / CHILD_REF_SEPARATOR
48
54
  # constant module; the TS values are "::" / "." / ".." — PACKAGE_SEP already
49
55
  # carries "::"). Defined here to mirror TS naming-refs.ts.
@@ -139,3 +145,64 @@ def expand_ref(raw: str, package_context: str) -> str:
139
145
  """
140
146
  owner, tail = _split_child_tail(raw)
141
147
  return _expand_owner(owner, package_context) + tail
148
+
149
+
150
+ # ---------------------------------------------------------------------------
151
+ # ADR-0041 — cross-package OBJECT reference resolution contract
152
+ # ---------------------------------------------------------------------------
153
+ # The SINGLE resolver every object-ref site shares so the same-package-preference
154
+ # contract is uniform. Mirrors the TS reference ``resolveObjectRef`` /
155
+ # ``objectPackage`` in naming-refs.ts.
156
+
157
+
158
+ class ObjectRefResolution(NamedTuple):
159
+ """Result of :func:`resolve_object_ref` — mirrors the TS ``{ node?, ambiguous? }``.
160
+
161
+ * ``node`` — the uniquely-resolved object (``None`` when nothing matched, or
162
+ when a bare ref is cross-package-ambiguous).
163
+ * ``ambiguous`` — True ONLY for a BARE ref that names an object in more than
164
+ one OTHER package with none in the referrer's own package.
165
+ """
166
+
167
+ node: Optional["MetaData"]
168
+ ambiguous: bool
169
+
170
+
171
+ def _object_package(node: "MetaData") -> str:
172
+ """The effective package of a root-level object — its ``resolution_key()`` minus
173
+ the trailing ``::<name>`` ("" for a root-level/empty-package object). Mirrors
174
+ the TS ``objectPackage``.
175
+ """
176
+ key = node.resolution_key()
177
+ i = key.rfind(PACKAGE_SEP)
178
+ return "" if i == -1 else key[:i]
179
+
180
+
181
+ def resolve_object_ref(
182
+ root: "MetaData", ref: str, referrer_pkg: str
183
+ ) -> ObjectRefResolution:
184
+ """Resolve a metadata OBJECT reference under the ADR-0041 cross-package contract.
185
+
186
+ * **FQN** (``ref`` contains ``::``) → EXACT match on ``resolution_key()``/
187
+ ``fqn()``. Never a bare-tail fallback, so an FQN pointing at one package never
188
+ binds a same-named object in another (the cross-port bug ADR-0041 closes).
189
+ * **bare** (no ``::``) → prefer an object of that name in the REFERRER's own
190
+ package; else a UNIQUE object of that name across all packages; else (>1
191
+ across OTHER packages, none in the referrer's) → ``ambiguous``.
192
+
193
+ *referrer_pkg* is the effective package of the node carrying the ref. Returns an
194
+ :class:`ObjectRefResolution`. Mirrors the TS ``resolveObjectRef``.
195
+ """
196
+ objects = [c for c in root.children() if c.type == TYPE_OBJECT]
197
+ if PACKAGE_SEP in ref:
198
+ for c in objects:
199
+ if c.resolution_key() == ref or c.fqn() == ref:
200
+ return ObjectRefResolution(c, False)
201
+ return ObjectRefResolution(None, False)
202
+ matches = [c for c in objects if c.name == ref]
203
+ if len(matches) <= 1:
204
+ return ObjectRefResolution(matches[0] if matches else None, False)
205
+ for c in matches:
206
+ if _object_package(c) == referrer_pkg:
207
+ return ObjectRefResolution(c, False)
208
+ return ObjectRefResolution(None, True)
@@ -27,7 +27,7 @@ from pathlib import Path
27
27
  import pytest
28
28
 
29
29
  import metaobjects.core_types # noqa: F401 — side-effect: registers attr classes
30
- from metaobjects import MetaDataLoader
30
+ from metaobjects import InMemoryStringSource, MetaDataLoader
31
31
  from metaobjects.codegen.config import GenConfig
32
32
  from metaobjects.codegen.generator import GenContext
33
33
  from metaobjects.codegen.generators.render_helper_generator import RenderHelperGenerator
@@ -45,6 +45,15 @@ def _load_root(meta_json: Path):
45
45
  return res.root
46
46
 
47
47
 
48
+ def _load_root_from_files(*meta_jsons: Path):
49
+ # Multi-file (multi-package) load — one InMemoryStringSource per file, merged into a
50
+ # single root (mirrors fixtures/conformance/loader-same-name-distinct-packages).
51
+ sources = [InMemoryStringSource(p.read_text()) for p in meta_jsons]
52
+ res = MetaDataLoader().load(sources)
53
+ assert res.errors == [], res.errors
54
+ return res.root
55
+
56
+
48
57
  def _ctx(root) -> GenContext:
49
58
  return GenContext(
50
59
  entities=[],
@@ -156,6 +165,35 @@ def test_email_order_email_renders_nested_array_loop_and_partial(tmp_path) -> No
156
165
  assert "<hr/>Sent by Acme" in doc.html_body
157
166
 
158
167
 
168
+ # ---------------------------------------------------------------------------
169
+ # xpkg-collision/ — cross-package short-name collision (ADR-0041). Two packages
170
+ # each declare an object.value `Note` (alpha: alphaText, beta: betaText); the
171
+ # payload `Digest` references BOTH by FULLY-QUALIFIED @objectRef. A bare-tail
172
+ # resolver binds both refs to whichever Note loads first → one field lands on the
173
+ # wrong element type → the drift gate raises. FQN-exact resolution renders both.
174
+ # ---------------------------------------------------------------------------
175
+
176
+
177
+ def test_document_digest_doc_resolves_fqn_nested_object_ref_across_collision(tmp_path) -> None:
178
+ dir_root = CORPUS / "xpkg-collision"
179
+ root = _load_root_from_files(
180
+ dir_root / "meta.alpha.json",
181
+ dir_root / "meta.beta.json",
182
+ dir_root / "meta.app.json",
183
+ )
184
+ templates = str(CORPUS / "templates")
185
+ # Must NOT raise: the FQN refs resolve to their own package's Note.
186
+ files = [f for f in RenderHelperGenerator(templates).generate(_ctx(root))
187
+ if f.path == "digest_doc_render_helper.py"]
188
+ assert len(files) == 1
189
+ _materialize_and_import(files, tmp_path)
190
+ helper = import_module("_rh_conf_pkg.digest_doc_render_helper")
191
+
192
+ payload = {"fromAlpha": {"alphaText": "AA"}, "fromBeta": {"betaText": "BB"}}
193
+ out = helper.render_digest_doc(payload, FilesystemProvider(templates))
194
+ assert out == "Alpha=AA Beta=BB"
195
+
196
+
159
197
  # ---------------------------------------------------------------------------
160
198
  # drift/ → codegen FAILS (ValueError) with ERR_VAR_NOT_ON_PAYLOAD.
161
199
  # ---------------------------------------------------------------------------
File without changes
File without changes
File without changes