metaobjects 0.15.0__tar.gz → 0.15.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 (378) hide show
  1. {metaobjects-0.15.0 → metaobjects-0.15.1}/PKG-INFO +1 -1
  2. {metaobjects-0.15.0 → metaobjects-0.15.1}/pyproject.toml +1 -1
  3. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/core_types.py +24 -4
  4. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/errors.py +1 -0
  5. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/loader/validation_passes.py +66 -9
  6. metaobjects-0.15.1/src/metaobjects/meta/core/index/index_constants.py +5 -0
  7. metaobjects-0.15.1/src/metaobjects/meta/core/index/meta_index.py +15 -0
  8. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/persistence/db/db_provider.py +8 -1
  9. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/shared/base_types.py +1 -0
  10. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/spec_metamodel/__init__.py +1 -0
  11. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/spec_metamodel/db.json +10 -0
  12. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/spec_metamodel/identity.json +3 -4
  13. metaobjects-0.15.1/src/metaobjects/spec_metamodel/index.json +14 -0
  14. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/spec_metamodel/object.json +2 -1
  15. metaobjects-0.15.1/tests/unit/__init__.py +0 -0
  16. metaobjects-0.15.1/tests/unit/test_index_lookup.py +141 -0
  17. {metaobjects-0.15.0 → metaobjects-0.15.1}/uv.lock +1 -1
  18. {metaobjects-0.15.0 → metaobjects-0.15.1}/.gitignore +0 -0
  19. {metaobjects-0.15.0 → metaobjects-0.15.1}/LICENSE +0 -0
  20. {metaobjects-0.15.0 → metaobjects-0.15.1}/README.md +0 -0
  21. {metaobjects-0.15.0 → metaobjects-0.15.1}/hatch_build.py +0 -0
  22. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/__init__.py +0 -0
  23. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/agent_context/__init__.py +0 -0
  24. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/agent_context/scaffold.py +0 -0
  25. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/apidocs/__init__.py +0 -0
  26. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/apidocs/api_model.py +0 -0
  27. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/apidocs/builder.py +0 -0
  28. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/apidocs/naming.py +0 -0
  29. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/apidocs/paths.py +0 -0
  30. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/apidocs/renderer.py +0 -0
  31. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/attr_class_map.py +0 -0
  32. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/cli.py +0 -0
  33. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/KNOWN_GAPS.md +0 -0
  34. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/__init__.py +0 -0
  35. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/config.py +0 -0
  36. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/constants.py +0 -0
  37. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/extract_delegate_emitter.py +0 -0
  38. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/extract_schema_emitter.py +0 -0
  39. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/format.py +0 -0
  40. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/fr010_field_mapping.py +0 -0
  41. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/generator.py +0 -0
  42. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/generator_registry.py +0 -0
  43. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/generators/__init__.py +0 -0
  44. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/generators/entity_model.py +0 -0
  45. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/generators/extractor_generator.py +0 -0
  46. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/generators/filter_allowlist_generator.py +0 -0
  47. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/generators/fr019_shared_enum.py +0 -0
  48. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/generators/m2m_codegen.py +0 -0
  49. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/generators/output_parser_generator.py +0 -0
  50. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/generators/output_prompt_generator.py +0 -0
  51. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/generators/payload_vo_generator.py +0 -0
  52. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/generators/render_helper_generator.py +0 -0
  53. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/generators/router_generator.py +0 -0
  54. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/generators/template_generator.py +0 -0
  55. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/generators/tph_plan.py +0 -0
  56. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/generators/trace_helper_generator.py +0 -0
  57. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/instance_artifacts.py +0 -0
  58. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/output_format_spec_emitter.py +0 -0
  59. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/overwrite_policy.py +0 -0
  60. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/runner.py +0 -0
  61. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/runtime/__init__.py +0 -0
  62. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/runtime/filter_parser.py +0 -0
  63. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/template_codegen/__init__.py +0 -0
  64. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/template_codegen/output_pattern.py +0 -0
  65. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/template_codegen/template_data.py +0 -0
  66. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/template_codegen/template_spec.py +0 -0
  67. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/type_map.py +0 -0
  68. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/datatype.py +0 -0
  69. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/documentation/__init__.py +0 -0
  70. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/documentation/doc_constants.py +0 -0
  71. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/documentation/doc_provider.py +0 -0
  72. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/documentation/doc_schema.py +0 -0
  73. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/loader/__init__.py +0 -0
  74. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/loader/merge.py +0 -0
  75. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/loader/meta_data_loader.py +0 -0
  76. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/loader/registered_validation.py +0 -0
  77. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/loader/sources/__init__.py +0 -0
  78. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/loader/sources/directory_source.py +0 -0
  79. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/loader/sources/file_source.py +0 -0
  80. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/loader/sources/meta_data_source.py +0 -0
  81. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/loader/sources/uri_source.py +0 -0
  82. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/loader/validate_discriminator.py +0 -0
  83. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/loader/validate_field_readonly.py +0 -0
  84. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/loader/validate_source_parameter_ref.py +0 -0
  85. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/loader/validate_source_physical_names.py +0 -0
  86. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/__init__.py +0 -0
  87. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/core/__init__.py +0 -0
  88. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/core/attr/__init__.py +0 -0
  89. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/core/attr/attr_constants.py +0 -0
  90. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/core/attr/meta_attr.py +0 -0
  91. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/core/field/__init__.py +0 -0
  92. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/core/field/field_constants.py +0 -0
  93. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/core/field/meta_field.py +0 -0
  94. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/core/identity/__init__.py +0 -0
  95. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/core/identity/identity_constants.py +0 -0
  96. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/core/identity/meta_identity.py +0 -0
  97. {metaobjects-0.15.0/src/metaobjects/meta/core/object → metaobjects-0.15.1/src/metaobjects/meta/core/index}/__init__.py +0 -0
  98. {metaobjects-0.15.0/src/metaobjects/meta/core/relationship → metaobjects-0.15.1/src/metaobjects/meta/core/object}/__init__.py +0 -0
  99. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/core/object/meta_object.py +0 -0
  100. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/core/object/meta_object_aware.py +0 -0
  101. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/core/object/object_class_registry.py +0 -0
  102. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/core/object/object_constants.py +0 -0
  103. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/core/object/object_extract.py +0 -0
  104. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/core/object/value_object.py +0 -0
  105. {metaobjects-0.15.0/src/metaobjects/meta/core/validator → metaobjects-0.15.1/src/metaobjects/meta/core/relationship}/__init__.py +0 -0
  106. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/core/relationship/derive_m2m_fields.py +0 -0
  107. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/core/relationship/meta_relationship.py +0 -0
  108. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/core/relationship/relationship_constants.py +0 -0
  109. {metaobjects-0.15.0/src/metaobjects/meta/persistence → metaobjects-0.15.1/src/metaobjects/meta/core/validator}/__init__.py +0 -0
  110. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/core/validator/validator_constants.py +0 -0
  111. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/meta_data.py +0 -0
  112. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/meta_root.py +0 -0
  113. {metaobjects-0.15.0/src/metaobjects/meta/persistence/origin → metaobjects-0.15.1/src/metaobjects/meta/persistence}/__init__.py +0 -0
  114. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/persistence/db/__init__.py +0 -0
  115. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/persistence/db/db_constants.py +0 -0
  116. {metaobjects-0.15.0/src/metaobjects/meta/persistence/source → metaobjects-0.15.1/src/metaobjects/meta/persistence/origin}/__init__.py +0 -0
  117. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/persistence/origin/meta_origin.py +0 -0
  118. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/persistence/origin/origin_constants.py +0 -0
  119. {metaobjects-0.15.0/src/metaobjects/meta/presentation → metaobjects-0.15.1/src/metaobjects/meta/persistence/source}/__init__.py +0 -0
  120. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/persistence/source/meta_source.py +0 -0
  121. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/persistence/source/source_constants.py +0 -0
  122. {metaobjects-0.15.0/src/metaobjects/meta/presentation/layout → metaobjects-0.15.1/src/metaobjects/meta/presentation}/__init__.py +0 -0
  123. {metaobjects-0.15.0/src/metaobjects/meta/presentation/ui → metaobjects-0.15.1/src/metaobjects/meta/presentation/layout}/__init__.py +0 -0
  124. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/presentation/layout/layout_constants.py +0 -0
  125. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/presentation/layout/meta_layout.py +0 -0
  126. {metaobjects-0.15.0/src/metaobjects/meta/presentation/view → metaobjects-0.15.1/src/metaobjects/meta/presentation/ui}/__init__.py +0 -0
  127. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/presentation/ui/ui_provider.py +0 -0
  128. {metaobjects-0.15.0/src/metaobjects/meta/template → metaobjects-0.15.1/src/metaobjects/meta/presentation/view}/__init__.py +0 -0
  129. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/presentation/view/meta_view.py +0 -0
  130. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/presentation/view/view_constants.py +0 -0
  131. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/provider_extends.py +0 -0
  132. {metaobjects-0.15.0/src/metaobjects/shared → metaobjects-0.15.1/src/metaobjects/meta/template}/__init__.py +0 -0
  133. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/template/meta_template.py +0 -0
  134. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/template/prompt_provider.py +0 -0
  135. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/template/template_constants.py +0 -0
  136. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/naming_refs.py +0 -0
  137. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/parser.py +0 -0
  138. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/parser_yaml.py +0 -0
  139. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/provider.py +0 -0
  140. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/py.typed +0 -0
  141. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/registry.py +0 -0
  142. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/registry_manifest.py +0 -0
  143. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/__init__.py +0 -0
  144. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/email_document.py +0 -0
  145. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/escapers.py +0 -0
  146. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/extract/KNOWN_GAPS.md +0 -0
  147. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/extract/__init__.py +0 -0
  148. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/extract/coerce.py +0 -0
  149. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/extract/extract.py +0 -0
  150. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/extract/extract_map.py +0 -0
  151. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/extract/json_forgiving_reader.py +0 -0
  152. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/extract/locate.py +0 -0
  153. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/extract/normalize.py +0 -0
  154. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/extract/strip.py +0 -0
  155. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/extract/types.py +0 -0
  156. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/extract/xml_forgiving_reader.py +0 -0
  157. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/filesystem_provider.py +0 -0
  158. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/prompt/__init__.py +0 -0
  159. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/prompt/output_format_renderer.py +0 -0
  160. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/prompt/output_format_spec.py +0 -0
  161. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/prompt/prompt_field.py +0 -0
  162. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/prompt/prompt_overrides.py +0 -0
  163. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/prompt/prompt_style.py +0 -0
  164. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/renderer.py +0 -0
  165. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/verify.py +0 -0
  166. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/runtime/__init__.py +0 -0
  167. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/runtime/llm_recorder.py +0 -0
  168. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/runtime/n2m_resolver.py +0 -0
  169. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/runtime/object_manager.py +0 -0
  170. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/runtime/tph.py +0 -0
  171. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/serializer_json.py +0 -0
  172. {metaobjects-0.15.0/tests → metaobjects-0.15.1/src/metaobjects/shared}/__init__.py +0 -0
  173. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/shared/separators.py +0 -0
  174. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/shared/structural.py +0 -0
  175. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/source/__init__.py +0 -0
  176. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/source/error_source.py +0 -0
  177. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/source/json_path.py +0 -0
  178. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/source/semantic_diff.py +0 -0
  179. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/source/yaml_positions.py +0 -0
  180. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/spec_metamodel/attr.json +0 -0
  181. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/spec_metamodel/documentation.json +0 -0
  182. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/spec_metamodel/field.json +0 -0
  183. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/spec_metamodel/layout.json +0 -0
  184. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/spec_metamodel/origin.json +0 -0
  185. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/spec_metamodel/prompt.json +0 -0
  186. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/spec_metamodel/relationship.json +0 -0
  187. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/spec_metamodel/source.json +0 -0
  188. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/spec_metamodel/template.json +0 -0
  189. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/spec_metamodel/ui.json +0 -0
  190. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/spec_metamodel/validator.json +0 -0
  191. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/spec_metamodel/view.json +0 -0
  192. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/super_resolve.py +0 -0
  193. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/validation_types.py +0 -0
  194. {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/yaml_desugar.py +0 -0
  195. {metaobjects-0.15.0/tests/codegen → metaobjects-0.15.1/tests}/__init__.py +0 -0
  196. {metaobjects-0.15.0/tests/conformance → metaobjects-0.15.1/tests/codegen}/__init__.py +0 -0
  197. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/golden/extends/expected/BaseEntity.py +0 -0
  198. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/golden/extends/expected/Program.py +0 -0
  199. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/golden/extends/meta.json +0 -0
  200. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/golden/nested-array/expected/AuthorBrief.py +0 -0
  201. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/golden/nested-array/expected/PostBrief.py +0 -0
  202. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/golden/nested-array/meta.json +0 -0
  203. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/golden/scalars/expected/Metric.py +0 -0
  204. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/golden/scalars/expected/Report.py +0 -0
  205. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/golden/scalars/meta.json +0 -0
  206. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/golden/vanilla/expected/Subscriber.py +0 -0
  207. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/golden/vanilla/meta.json +0 -0
  208. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_abstract_conformance.py +0 -0
  209. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_api_docs_builder.py +0 -0
  210. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_api_docs_paths.py +0 -0
  211. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_cli.py +0 -0
  212. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_cli_registry.py +0 -0
  213. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_cli_staleness_nudge.py +0 -0
  214. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_cli_verify_strict.py +0 -0
  215. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_cli_verify_subverbs.py +0 -0
  216. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_constants_config.py +0 -0
  217. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_entity_model.py +0 -0
  218. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_enum_conformance.py +0 -0
  219. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_extends_abstract_field_inheritance.py +0 -0
  220. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_extractor_generator.py +0 -0
  221. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_filter_allowlist_generator.py +0 -0
  222. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_format.py +0 -0
  223. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_fr010_output_codegen.py +0 -0
  224. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_fr019_shared_provided_conformance.py +0 -0
  225. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_generator.py +0 -0
  226. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_generator_extension_seams.py +0 -0
  227. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_golden.py +0 -0
  228. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_inherit_without_restate_gate.py +0 -0
  229. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_inheritance_conformance.py +0 -0
  230. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_instance_artifacts.py +0 -0
  231. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_m2m_codegen.py +0 -0
  232. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_output_parser_generator.py +0 -0
  233. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_overwrite_policy.py +0 -0
  234. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_payload_vo_generator.py +0 -0
  235. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_projection_compile.py +0 -0
  236. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_render_helper_conformance.py +0 -0
  237. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_render_helper_generator.py +0 -0
  238. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_reverse_finders.py +0 -0
  239. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_router_generator.py +0 -0
  240. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_runner.py +0 -0
  241. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_template_data.py +0 -0
  242. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_template_generator.py +0 -0
  243. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_template_output_pattern.py +0 -0
  244. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_template_scope_helpers.py +0 -0
  245. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_template_scope_walk.py +0 -0
  246. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_template_spec.py +0 -0
  247. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_tph_codegen.py +0 -0
  248. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_trace_helper_generator.py +0 -0
  249. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_type_map.py +0 -0
  250. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_validation_conformance.py +0 -0
  251. {metaobjects-0.15.0/tests/integration → metaobjects-0.15.1/tests/conformance}/__init__.py +0 -0
  252. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/capabilities.py +0 -0
  253. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/conformance-expected-failures.json +0 -0
  254. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/conformance_adapter.py +0 -0
  255. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/corpus.py +0 -0
  256. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/expected_failures.py +0 -0
  257. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/fixture_discovery.py +0 -0
  258. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/navigator.py +0 -0
  259. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/test_api_docs_cross_port_conformance.py +0 -0
  260. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/test_conformance.py +0 -0
  261. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/test_extract_conformance.py +0 -0
  262. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/test_extract_object_verdict.py +0 -0
  263. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/test_fr010_loader_attrs.py +0 -0
  264. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/test_fr011_attrs.py +0 -0
  265. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/test_generator_registry_conformance.py +0 -0
  266. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/test_object_model_conformance.py +0 -0
  267. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/test_registry_conformance.py +0 -0
  268. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/test_runner_hardfail.py +0 -0
  269. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/test_spec_metamodel_embed.py +0 -0
  270. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/test_strict_attr_load.py +0 -0
  271. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/test_template_codegen_conformance.py +0 -0
  272. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/test_template_generator_conformance.py +0 -0
  273. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/test_yaml_conformance.py +0 -0
  274. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/yaml-conformance-expected-failures.json +0 -0
  275. {metaobjects-0.15.0/tests/render → metaobjects-0.15.1/tests/integration}/__init__.py +0 -0
  276. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/api_contract_assertions.py +0 -0
  277. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/api_contract_jsonb_server.py +0 -0
  278. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/api_contract_m2m_server.py +0 -0
  279. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/api_contract_server.py +0 -0
  280. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/generated_jsonb_app.py +0 -0
  281. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/generated_m2m_app.py +0 -0
  282. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/generated_router_app.py +0 -0
  283. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/generated_tph_app.py +0 -0
  284. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/meta_ai_trace.yaml +0 -0
  285. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/normalization.py +0 -0
  286. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/postgres_container.py +0 -0
  287. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/query_runner.py +0 -0
  288. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/scenarios.py +0 -0
  289. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/test_api_contract.py +0 -0
  290. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/test_api_contract_generated.py +0 -0
  291. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/test_api_contract_jsonb.py +0 -0
  292. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/test_api_contract_m2m.py +0 -0
  293. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/test_api_contract_m2m_generated.py +0 -0
  294. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/test_api_contract_tph_generated.py +0 -0
  295. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/test_llm_call_trace.py +0 -0
  296. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/test_normalization.py +0 -0
  297. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/test_query_scenarios.py +0 -0
  298. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/test_runtime_return_types.py +0 -0
  299. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/open_closed_proof_test.py +0 -0
  300. {metaobjects-0.15.0/tests/render/extract → metaobjects-0.15.1/tests/render}/__init__.py +0 -0
  301. {metaobjects-0.15.0/tests/render/prompt → metaobjects-0.15.1/tests/render/extract}/__init__.py +0 -0
  302. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/render/extract/test_coerce.py +0 -0
  303. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/render/extract/test_extract.py +0 -0
  304. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/render/extract/test_extract_map.py +0 -0
  305. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/render/extract/test_json_forgiving_reader.py +0 -0
  306. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/render/extract/test_locate.py +0 -0
  307. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/render/extract/test_model.py +0 -0
  308. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/render/extract/test_normalize.py +0 -0
  309. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/render/extract/test_strip.py +0 -0
  310. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/render/extract/test_xml_forgiving_reader.py +0 -0
  311. {metaobjects-0.15.0/tests/source → metaobjects-0.15.1/tests/render/prompt}/__init__.py +0 -0
  312. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/render/prompt/test_output_format_renderer.py +0 -0
  313. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/render/test_email_document.py +0 -0
  314. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/render/test_filesystem_provider.py +0 -0
  315. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/render/test_output_format_renderer_nested.py +0 -0
  316. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/render/test_output_prompt_conformance.py +0 -0
  317. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/render/test_render_conformance.py +0 -0
  318. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/render/test_render_max_chars.py +0 -0
  319. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/render/test_verify.py +0 -0
  320. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/render/test_verify_conformance.py +0 -0
  321. {metaobjects-0.15.0/tests/unit → metaobjects-0.15.1/tests/source}/__init__.py +0 -0
  322. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/source/test_fr5c_merge_attribution.py +0 -0
  323. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/source/test_fr5d_reference_resolution.py +0 -0
  324. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/source/test_fr5e_database_source_shape.py +0 -0
  325. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/source/test_json_path.py +0 -0
  326. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/source/test_semantic_diff.py +0 -0
  327. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/source/test_source_on_node.py +0 -0
  328. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/source/test_yaml_positions.py +0 -0
  329. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/test_api_docs_accuracy.py +0 -0
  330. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_agent_context_staleness.py +0 -0
  331. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_capabilities.py +0 -0
  332. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_common_attrs.py +0 -0
  333. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_core_types.py +0 -0
  334. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_effective_package.py +0 -0
  335. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_errors.py +0 -0
  336. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_field_enum.py +0 -0
  337. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_field_map_validation.py +0 -0
  338. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_field_uuid_dbcolumntype.py +0 -0
  339. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_fr016_source_name_and_kind_aliases.py +0 -0
  340. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_llm_recorder.py +0 -0
  341. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_loader.py +0 -0
  342. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_loader_bom.py +0 -0
  343. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_loader_class.py +0 -0
  344. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_merge.py +0 -0
  345. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_meta_attr.py +0 -0
  346. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_meta_data.py +0 -0
  347. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_meta_source.py +0 -0
  348. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_module_shortcuts.py +0 -0
  349. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_n2m_resolver.py +0 -0
  350. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_n2m_resolver_inherited.py +0 -0
  351. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_object_manager_uuid_coercion.py +0 -0
  352. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_one_primary_source.py +0 -0
  353. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_parser.py +0 -0
  354. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_parser_yaml.py +0 -0
  355. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_provider.py +0 -0
  356. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_provider_extension.py +0 -0
  357. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_registry.py +0 -0
  358. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_registry_completeness.py +0 -0
  359. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_registry_extend.py +0 -0
  360. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_registry_sealed.py +0 -0
  361. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_relationship_referential_actions.py +0 -0
  362. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_resolution_key.py +0 -0
  363. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_runtime_resolution_key_binding.py +0 -0
  364. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_serializer.py +0 -0
  365. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_shared_constants.py +0 -0
  366. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_smoke.py +0 -0
  367. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_sources.py +0 -0
  368. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_strict_child_placement.py +0 -0
  369. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_super_resolve.py +0 -0
  370. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_template_toolcall.py +0 -0
  371. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_template_wrong_subtype_attrs.py +0 -0
  372. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_validation_attr_schema.py +0 -0
  373. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_validation_filter_values.py +0 -0
  374. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_validation_origin_paths.py +0 -0
  375. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_validation_sort_field.py +0 -0
  376. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_validation_warnings.py +0 -0
  377. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_write_coercion_arrays.py +0 -0
  378. {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_yaml_desugar.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: metaobjects
3
- Version: 0.15.0
3
+ Version: 0.15.1
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.0"
3
+ version = "0.15.1"
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"
@@ -42,7 +42,6 @@ from .meta.core.identity.identity_constants import (
42
42
  GENERATION_VALUES,
43
43
  IDENTITY_ATTR_FIELDS,
44
44
  IDENTITY_ATTR_GENERATION,
45
- IDENTITY_ATTR_UNIQUE,
46
45
  IDENTITY_REFERENCE_ATTR_ENFORCE,
47
46
  IDENTITY_REFERENCE_ATTR_REFERENCES,
48
47
  IDENTITY_SUBTYPE_PRIMARY,
@@ -50,6 +49,8 @@ from .meta.core.identity.identity_constants import (
50
49
  IDENTITY_SUBTYPE_SECONDARY,
51
50
  )
52
51
  from .meta.core.identity.meta_identity import MetaIdentity
52
+ from .meta.core.index.index_constants import INDEX_ATTR_FIELDS, INDEX_SUBTYPE_LOOKUP, INDEX_SUBTYPES
53
+ from .meta.core.index.meta_index import MetaIndex
53
54
  from .meta.core.object.meta_object import MetaObject
54
55
  from .meta.core.object.object_constants import (
55
56
  OBJECT_ATTR_DISCRIMINATOR,
@@ -117,6 +118,7 @@ from .shared.base_types import (
117
118
  TYPE_ATTR,
118
119
  TYPE_FIELD,
119
120
  TYPE_IDENTITY,
121
+ TYPE_INDEX,
120
122
  TYPE_LAYOUT,
121
123
  TYPE_METADATA,
122
124
  TYPE_OBJECT,
@@ -195,10 +197,12 @@ core_provider.add(
195
197
  )
196
198
  )
197
199
 
200
+
198
201
  # object.* (entity, value, projection)
199
202
  _OBJECT_CHILD_RULES = [
200
203
  ChildRule(TYPE_FIELD, "*"),
201
204
  ChildRule(TYPE_IDENTITY, "*"),
205
+ ChildRule(TYPE_INDEX, "*"),
202
206
  ChildRule(TYPE_ATTR, "*"),
203
207
  ChildRule(TYPE_SOURCE, "*"),
204
208
  ChildRule(TYPE_RELATIONSHIP, "*"),
@@ -436,8 +440,9 @@ core_provider.add(
436
440
  )
437
441
  )
438
442
 
439
- # identity.secondary — @fields required stringArray; @unique optional boolean
440
- # (true UNIQUE index, false plain index). Cross-port; mirrors TS secondaryIdentityAttrs.
443
+ # identity.secondary — @fields required stringArray. Always enforces uniqueness;
444
+ # use index.lookup for non-unique indexes. @unique is no longer a core attr
445
+ # (removed — the secondary index is always unique by definition).
441
446
  core_provider.add(
442
447
  TypeDefinition(
443
448
  type=TYPE_IDENTITY,
@@ -445,7 +450,6 @@ core_provider.add(
445
450
  factory=MetaIdentity,
446
451
  attrs=[
447
452
  AttrSchema(name=IDENTITY_ATTR_FIELDS, value_type=ATTR_SUBTYPE_STRING, required=True, is_array=True),
448
- AttrSchema(name=IDENTITY_ATTR_UNIQUE, value_type=ATTR_SUBTYPE_BOOLEAN, required=False),
449
453
  ],
450
454
  child_rules=[ChildRule(TYPE_ATTR, "*")],
451
455
  )
@@ -470,6 +474,22 @@ core_provider.add(
470
474
  )
471
475
  )
472
476
 
477
+ # index.lookup — non-unique lookup index on one or more fields.
478
+ # Distinct from identity.secondary (which always enforces uniqueness).
479
+ # Physical attrs (@orders/@expr/@where/@using) are contributed by the db provider.
480
+ for _idx_sub in INDEX_SUBTYPES:
481
+ core_provider.add(
482
+ TypeDefinition(
483
+ type=TYPE_INDEX,
484
+ sub_type=_idx_sub,
485
+ factory=MetaIndex,
486
+ attrs=[
487
+ AttrSchema(name=INDEX_ATTR_FIELDS, value_type=ATTR_SUBTYPE_STRING, required=True, is_array=True),
488
+ ],
489
+ child_rules=[ChildRule(TYPE_ATTR, "*")],
490
+ )
491
+ )
492
+
473
493
  # relationship.* (base, association, aggregation, composition).
474
494
  # @onDelete / @onUpdate are validated against REFERENTIAL_ACTIONS — kebab-case
475
495
  # values (cascade / set-null / restrict / no-action). Defaults derive from the
@@ -77,6 +77,7 @@ class ErrorCode(str, Enum):
77
77
  # FR-017 — M:N relationship slim-vocabulary validation (junction-missing-two-
78
78
  # references / sourceRefField-not-matching / M:N-attr-on-1:N). The symmetric-
79
79
  # on-hetero + symmetric+sourceRefField rules emit ERR_BAD_ATTR_VALUE instead.
80
+ ERR_INVALID_INDEX = "ERR_INVALID_INDEX"
80
81
  ERR_INVALID_RELATIONSHIP = "ERR_INVALID_RELATIONSHIP"
81
82
  # identity.reference @references names an FK target object that does not resolve
82
83
  # to any object in the loaded tree (a dangling cross-reference between metadata).
@@ -63,6 +63,7 @@ from ..registry import AttrSchema, ChildRule, TypeRegistry
63
63
  from ..shared.base_types import (
64
64
  TYPE_FIELD,
65
65
  TYPE_IDENTITY,
66
+ TYPE_INDEX,
66
67
  TYPE_LAYOUT,
67
68
  TYPE_OBJECT,
68
69
  TYPE_ORIGIN,
@@ -104,6 +105,7 @@ from ..meta.core.object.object_constants import (
104
105
  OBJECT_SUBTYPE_VALUE,
105
106
  )
106
107
  from ..meta.core.identity.identity_constants import IDENTITY_ATTR_FIELDS
108
+ from ..meta.core.index.index_constants import INDEX_ATTR_FIELDS, INDEX_SUBTYPE_LOOKUP
107
109
  from ..source import resolved_source
108
110
 
109
111
  # A subtype-specific template attr is valid ONLY on the subtype it is registered
@@ -184,6 +186,7 @@ def run_validations(
184
186
  _validate_filterable_has_index(root, warnings)
185
187
  # SP-H Unit9 — @filterable on a subtype with no operator band → error.
186
188
  _validate_filterable_has_supported_ops(root, errors)
189
+ _validate_index_lookup_fields(root, errors)
187
190
 
188
191
 
189
192
  # ---------------------------------------------------------------------------
@@ -459,21 +462,29 @@ def _validate_attr_schema(
459
462
  # ERR_BAD_ATTR_VALUE for both an unrecognized value and an illegal
460
463
  # pairing. Running the flat membership check too would double-report
461
464
  # (tests assert exactly one error). Mirrors the TS reference.
465
+ #
466
+ # For array-valued attrs (is_array=True) the raw_value is a list;
467
+ # check each element individually against allowed_values (e.g.
468
+ # @orders: ["asc","desc"] — each element must be in {"asc","desc"}).
462
469
  if (
463
470
  attr_node.name != FIELD_ATTR_DB_COLUMN_TYPE
464
471
  and schema.allowed_values is not None
465
472
  and len(schema.allowed_values) > 0
466
473
  ):
467
- if raw_value not in schema.allowed_values:
468
- allowed_str = ", ".join(str(v) for v in schema.allowed_values)
469
- errors.append(
470
- MetaError(
471
- f"{_node_label(node)} attribute '@{attr_node.name}' has value "
472
- f"'{raw_value}' which is not one of the allowed values: {allowed_str}",
473
- ErrorCode.ERR_BAD_ATTR_VALUE,
474
- envelope=node.source,
474
+ allowed_str = ", ".join(str(v) for v in schema.allowed_values)
475
+ values_to_check: list = (
476
+ list(raw_value) if isinstance(raw_value, list) else [raw_value]
477
+ )
478
+ for elem in values_to_check:
479
+ if elem not in schema.allowed_values:
480
+ errors.append(
481
+ MetaError(
482
+ f"{_node_label(node)} attribute '@{attr_node.name}' has value "
483
+ f"'{elem}' which is not one of the allowed values: {allowed_str}",
484
+ ErrorCode.ERR_BAD_ATTR_VALUE,
485
+ envelope=node.source,
486
+ )
475
487
  )
476
- )
477
488
 
478
489
 
479
490
  # ---------------------------------------------------------------------------
@@ -2448,3 +2459,49 @@ def _parse_string_list(raw: object) -> tuple[str, ...]:
2448
2459
  if isinstance(raw, (list, tuple)):
2449
2460
  return tuple(str(x) for x in raw)
2450
2461
  return ()
2462
+
2463
+
2464
+ # ---------------------------------------------------------------------------
2465
+ # Pass: index.lookup @fields resolution
2466
+ #
2467
+ # Every index.lookup on an entity must name at least one field, and every
2468
+ # named field must exist in the entity's EFFECTIVE (resolved) field set.
2469
+ # ADR-0039: use children() / MetaIndex.fields() — never own* — so that a
2470
+ # field inherited via extends still resolves correctly.
2471
+ # ---------------------------------------------------------------------------
2472
+
2473
+ def _validate_index_lookup_fields(root: MetaData, errors: list[MetaError]) -> None:
2474
+ from ..meta.core.index.meta_index import MetaIndex
2475
+ for obj in (c for c in root.children() if c.type == TYPE_OBJECT):
2476
+ # Effective (resolved) field names — includes inherited fields via extends.
2477
+ effective_field_names = {
2478
+ f.name for f in obj.children() if f.type == TYPE_FIELD
2479
+ }
2480
+ for node in obj.children():
2481
+ if node.type != TYPE_INDEX or node.sub_type != INDEX_SUBTYPE_LOOKUP:
2482
+ continue
2483
+ if not isinstance(node, MetaIndex):
2484
+ continue
2485
+ fields = node.fields()
2486
+
2487
+ if len(fields) == 0:
2488
+ errors.append(MetaError(
2489
+ code=ErrorCode.ERR_INVALID_INDEX,
2490
+ message=(
2491
+ f'index.lookup "{node.name}" on "{obj.name}" has no '
2492
+ f"@{INDEX_ATTR_FIELDS}; at least one field is required"
2493
+ ),
2494
+ ))
2495
+ continue
2496
+
2497
+ for field_name in fields:
2498
+ if field_name not in effective_field_names:
2499
+ errors.append(MetaError(
2500
+ code=ErrorCode.ERR_INVALID_INDEX,
2501
+ message=(
2502
+ f'index.lookup "{node.name}" on "{obj.name}" references '
2503
+ f'field "{field_name}" which does not exist on "{obj.name}". '
2504
+ f"Available fields: "
2505
+ f"{', '.join(sorted(effective_field_names)) or '(none)'}"
2506
+ ),
2507
+ ))
@@ -0,0 +1,5 @@
1
+ """Index subtype + attr vocabulary."""
2
+ INDEX_SUBTYPE_LOOKUP = "lookup"
3
+ INDEX_SUBTYPES = (INDEX_SUBTYPE_LOOKUP,)
4
+
5
+ INDEX_ATTR_FIELDS = "fields"
@@ -0,0 +1,15 @@
1
+ """MetaIndex — concrete node class for type=index nodes."""
2
+ from __future__ import annotations
3
+
4
+ from ...meta_data import MetaData
5
+ from .index_constants import INDEX_ATTR_FIELDS, INDEX_SUBTYPE_LOOKUP
6
+
7
+
8
+ class MetaIndex(MetaData):
9
+ def fields(self) -> list[str]:
10
+ """ADR-0039: resolving — @fields may be inherited via extends."""
11
+ f = self.get_meta_attr(INDEX_ATTR_FIELDS)
12
+ return list(f) if isinstance(f, list) else []
13
+
14
+ def is_lookup(self) -> bool:
15
+ return self.sub_type == INDEX_SUBTYPE_LOOKUP
@@ -22,9 +22,10 @@ from ...core.identity.identity_constants import (
22
22
  IDENTITY_SUBTYPE_REFERENCE,
23
23
  IDENTITY_SUBTYPE_SECONDARY,
24
24
  )
25
+ from ...core.index.index_constants import INDEX_SUBTYPE_LOOKUP
25
26
  from ....provider import Provider
26
27
  from ....registry import AttrSchema, TypeRegistry
27
- from ....shared.base_types import TYPE_FIELD, TYPE_IDENTITY
28
+ from ....shared.base_types import TYPE_FIELD, TYPE_IDENTITY, TYPE_INDEX
28
29
  from .db_constants import (
29
30
  FIELD_ATTR_DB_COLUMN_TYPE,
30
31
  FIELD_ATTR_LOCAL_TIME,
@@ -156,6 +157,12 @@ def _register(registry: TypeRegistry) -> None:
156
157
  IDENTITY_SUBTYPE_REFERENCE,
157
158
  attributes=[_CONSTRAINT_NAME_SCHEMA],
158
159
  )
160
+ # index.lookup: same RDB physical attrs as identity.secondary (@orders/@where/@expr/@using).
161
+ registry.extend(
162
+ TYPE_INDEX,
163
+ INDEX_SUBTYPE_LOOKUP,
164
+ attributes=[_ORDERS_SCHEMA, _WHERE_SCHEMA, _EXPR_SCHEMA, _USING_SCHEMA],
165
+ )
159
166
 
160
167
 
161
168
  def _make_db_provider() -> Provider:
@@ -5,6 +5,7 @@ TYPE_FIELD = "field"
5
5
  TYPE_ATTR = "attr"
6
6
  TYPE_VALIDATOR = "validator"
7
7
  TYPE_IDENTITY = "identity"
8
+ TYPE_INDEX = "index"
8
9
  TYPE_RELATIONSHIP = "relationship"
9
10
  TYPE_VIEW = "view"
10
11
  TYPE_LAYOUT = "layout"
@@ -46,6 +46,7 @@ SPEC_FILES: tuple[str, ...] = (
46
46
  "documentation.json",
47
47
  "field.json",
48
48
  "identity.json",
49
+ "index.json",
49
50
  "layout.json",
50
51
  "object.json",
51
52
  "origin.json",
@@ -62,6 +62,16 @@
62
62
  "children": [
63
63
  { "type": "attr", "subType": "string", "name": "constraintName", "min": 0, "max": 1, "description": "Physical foreign-key constraint name override. Absent → the backend's auto-derived default (e.g. `<table>_<firstFkColumn>_fk`). Lets a model adopt an existing database whose FK constraints follow a different naming convention without a destructive rename. RDB-physical — contributed by the db provider." }
64
64
  ]
65
+ },
66
+ {
67
+ "type": "index",
68
+ "subType": "lookup",
69
+ "children": [
70
+ { "type": "attr", "subType": "string", "name": "orders", "isArray": true, "min": 0, "max": 1, "allowedValues": ["asc", "desc"], "description": "Physical index-key sort direction, positional to @fields ('asc' | 'desc'). Omit for all-ascending (the default); a shorter array leaves trailing keys ascending. Drives DESC-ordered index keys (e.g. a recency index on a timestamp). RDB-physical — contributed by the db provider." },
71
+ { "type": "attr", "subType": "string", "name": "where", "min": 0, "max": 1, "description": "Partial-index predicate (raw SQL, e.g. \"delivered_at IS NULL\"). When set, the index covers only rows matching the predicate — smaller and cheaper for queries that always filter on it. Absent = a full index over every row. RDB-physical — contributed by the db provider." },
72
+ { "type": "attr", "subType": "string", "name": "expr", "min": 0, "max": 1, "description": "Raw key EXPRESSION for a functional/expression index (e.g. \"lower(email)\"). Used INSTEAD of @fields — the index key is the expression rather than plain columns. RDB-physical — contributed by the db provider." },
73
+ { "type": "attr", "subType": "string", "name": "using", "min": 0, "max": 1, "description": "Index access method (e.g. \"gin\", \"gist\", \"hash\"); default \"btree\" (not rendered). Pair with @expr for e.g. a GIN index over an array/jsonb expression. RDB-physical — contributed by the db provider." }
74
+ ]
65
75
  }
66
76
  ]
67
77
  }
@@ -16,11 +16,10 @@
16
16
  {
17
17
  "type": "identity",
18
18
  "subType": "secondary",
19
- "description": "A secondary index (unique by default via @unique).",
20
- "whenToUse": "A column or set must be unique, or you want an index for lookups/sorting. Declare it instead of a hand-written UNIQUE constraint or CREATE INDEX.",
19
+ "description": "A secondary unique index on one or more fields. Always enforces uniqueness — use index.lookup for non-unique query-performance indexes.",
20
+ "whenToUse": "A column or set of columns must be unique (e.g. email, slug, composite business key). For a plain non-unique index, use index.lookup instead.",
21
21
  "children": [
22
- { "type": "attr", "subType": "string", "name": "fields", "isArray": true, "min": 1, "max": 1, "description": "The field name(s) composing this identity. Single-element for a simple PK/index, multiple for a composite." },
23
- { "type": "attr", "subType": "boolean", "name": "unique", "min": 0, "max": 1, "description": "When true (default), the secondary identity is a UNIQUE index; false makes it a plain (non-unique) index." }
22
+ { "type": "attr", "subType": "string", "name": "fields", "isArray": true, "min": 1, "max": 1, "description": "The field name(s) composing this identity. Single-element for a simple unique index, multiple for a composite unique constraint." }
24
23
  ]
25
24
  },
26
25
  {
@@ -0,0 +1,14 @@
1
+ {
2
+ "provider": "metaobjects-core-types",
3
+ "types": [
4
+ {
5
+ "type": "index",
6
+ "subType": "lookup",
7
+ "description": "A non-unique lookup index on one or more fields. Use for query-performance indexes that do NOT enforce uniqueness — declare identity.secondary for unique constraints instead.",
8
+ "whenToUse": "You need a DB index for query performance (fast lookups/sorts) but NOT uniqueness enforcement. @fields names the indexed columns; the db provider adds @orders / @expr / @where / @using for physical tuning.",
9
+ "children": [
10
+ { "type": "attr", "subType": "string", "name": "fields", "isArray": true, "min": 1, "max": 1, "description": "The field name(s) this index covers (at least one). When @expr is present, it is the key expression derived from these fields." }
11
+ ]
12
+ }
13
+ ]
14
+ }
@@ -10,7 +10,8 @@
10
10
  { "type": "identity", "subType": "*", "name": "*", "min": 0, "max": null },
11
11
  { "type": "validator", "subType": "*", "name": "*", "min": 0, "max": null },
12
12
  { "type": "layout", "subType": "*", "name": "*", "min": 0, "max": null },
13
- { "type": "source", "subType": "*", "name": "*", "min": 0, "max": null }
13
+ { "type": "source", "subType": "*", "name": "*", "min": 0, "max": null },
14
+ { "type": "index", "subType": "*", "name": "*", "min": 0, "max": null }
14
15
  ]
15
16
  },
16
17
  {
File without changes
@@ -0,0 +1,141 @@
1
+ """Unit tests for index.lookup — load, validation, @unique rejection."""
2
+ from __future__ import annotations
3
+
4
+ import json
5
+
6
+ from metaobjects import MetaDataLoader
7
+ from metaobjects.core_types import core_providers
8
+ from metaobjects.errors import ErrorCode
9
+ from metaobjects.meta.core.index.meta_index import MetaIndex
10
+ from metaobjects.shared.base_types import TYPE_INDEX
11
+
12
+
13
+ def _load(fixture: dict):
14
+ content = json.dumps(fixture)
15
+ return MetaDataLoader.from_string(content, providers=list(core_providers), strict=True)
16
+
17
+
18
+ def _simple_entity_with_index(index_body: dict) -> dict:
19
+ return {
20
+ "metadata.root": {
21
+ "package": "test::pkg",
22
+ "children": [
23
+ {
24
+ "object.entity": {
25
+ "name": "Thing",
26
+ "children": [
27
+ {"field.string": {"name": "name"}},
28
+ {"field.long": {"name": "ownerId"}},
29
+ {"identity.primary": {"name": "pk", "@fields": ["name"], "@generation": "assigned"}},
30
+ {"index.lookup": index_body},
31
+ ],
32
+ }
33
+ }
34
+ ],
35
+ }
36
+ }
37
+
38
+
39
+ # ---------------------------------------------------------------------------
40
+ # Basic load test
41
+ # ---------------------------------------------------------------------------
42
+
43
+ def test_index_lookup_loads_successfully():
44
+ fixture = _simple_entity_with_index({
45
+ "name": "idx_thing_owner",
46
+ "@fields": ["ownerId"],
47
+ })
48
+ result = _load(fixture)
49
+ assert not result.errors, f"Unexpected errors: {[e.code for e in result.errors]}"
50
+ entity = next(c for c in result.root.children() if c.name == "Thing")
51
+ indexes = [c for c in entity.children() if c.type == TYPE_INDEX]
52
+ assert len(indexes) == 1
53
+ idx = indexes[0]
54
+ assert isinstance(idx, MetaIndex)
55
+ assert idx.sub_type == "lookup"
56
+ assert idx.fields() == ["ownerId"]
57
+
58
+
59
+ def test_index_lookup_with_orders():
60
+ fixture = _simple_entity_with_index({
61
+ "name": "idx_thing_owner_desc",
62
+ "@fields": ["ownerId"],
63
+ "@orders": ["desc"],
64
+ })
65
+ result = _load(fixture)
66
+ assert not result.errors, f"Unexpected errors: {[e.code for e in result.errors]}"
67
+
68
+
69
+ # ---------------------------------------------------------------------------
70
+ # @unique rejected on identity.secondary (ERR_UNKNOWN_ATTR)
71
+ # ---------------------------------------------------------------------------
72
+
73
+ def test_unique_rejected_on_identity_secondary():
74
+ fixture = {
75
+ "metadata.root": {
76
+ "package": "test::pkg",
77
+ "children": [
78
+ {
79
+ "object.entity": {
80
+ "name": "Thing",
81
+ "children": [
82
+ {"field.string": {"name": "email"}},
83
+ {"identity.primary": {"name": "pk", "@fields": ["email"], "@generation": "assigned"}},
84
+ {
85
+ "identity.secondary": {
86
+ "name": "uq_email",
87
+ "@fields": ["email"],
88
+ "@unique": True,
89
+ }
90
+ },
91
+ ],
92
+ }
93
+ }
94
+ ],
95
+ }
96
+ }
97
+ result = _load(fixture)
98
+ codes = [e.code for e in result.errors]
99
+ assert ErrorCode.ERR_UNKNOWN_ATTR in codes, f"Expected ERR_UNKNOWN_ATTR, got: {codes}"
100
+
101
+
102
+ # ---------------------------------------------------------------------------
103
+ # @unique rejected on index.lookup (ERR_UNKNOWN_ATTR)
104
+ # ---------------------------------------------------------------------------
105
+
106
+ def test_unique_rejected_on_index_lookup():
107
+ fixture = _simple_entity_with_index({
108
+ "name": "idx_thing_owner",
109
+ "@fields": ["ownerId"],
110
+ "@unique": True,
111
+ })
112
+ result = _load(fixture)
113
+ codes = [e.code for e in result.errors]
114
+ assert ErrorCode.ERR_UNKNOWN_ATTR in codes, f"Expected ERR_UNKNOWN_ATTR, got: {codes}"
115
+
116
+
117
+ # ---------------------------------------------------------------------------
118
+ # ERR_INVALID_INDEX: missing @fields
119
+ # ---------------------------------------------------------------------------
120
+
121
+ def test_index_lookup_missing_fields_emits_err_invalid_index():
122
+ fixture = _simple_entity_with_index({
123
+ "name": "idx_bad",
124
+ })
125
+ result = _load(fixture)
126
+ codes = [e.code for e in result.errors]
127
+ assert ErrorCode.ERR_INVALID_INDEX in codes, f"Expected ERR_INVALID_INDEX, got: {codes}"
128
+
129
+
130
+ # ---------------------------------------------------------------------------
131
+ # ERR_INVALID_INDEX: field does not exist on entity
132
+ # ---------------------------------------------------------------------------
133
+
134
+ def test_index_lookup_unknown_field_emits_err_invalid_index():
135
+ fixture = _simple_entity_with_index({
136
+ "name": "idx_bad",
137
+ "@fields": ["nonExistentField"],
138
+ })
139
+ result = _load(fixture)
140
+ codes = [e.code for e in result.errors]
141
+ assert ErrorCode.ERR_INVALID_INDEX in codes, f"Expected ERR_INVALID_INDEX, got: {codes}"
@@ -250,7 +250,7 @@ wheels = [
250
250
 
251
251
  [[package]]
252
252
  name = "metaobjects"
253
- version = "0.14.0"
253
+ version = "0.15.0"
254
254
  source = { editable = "." }
255
255
  dependencies = [
256
256
  { name = "pyyaml" },
File without changes
File without changes
File without changes