metaobjects 0.19.6__tar.gz → 0.19.8__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 (391) hide show
  1. {metaobjects-0.19.6 → metaobjects-0.19.8}/PKG-INFO +1 -1
  2. {metaobjects-0.19.6 → metaobjects-0.19.8}/pyproject.toml +1 -1
  3. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/codegen/type_map.py +8 -0
  4. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/core_types.py +9 -0
  5. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/loader/validation_passes.py +33 -26
  6. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/core/field/field_constants.py +5 -0
  7. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/spec_metamodel/field.json +9 -3
  8. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/spec_metamodel/prompt.json +2 -1
  9. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_validation_conformance.py +19 -3
  10. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_template_toolcall.py +2 -0
  11. {metaobjects-0.19.6 → metaobjects-0.19.8}/.gitignore +0 -0
  12. {metaobjects-0.19.6 → metaobjects-0.19.8}/LICENSE +0 -0
  13. {metaobjects-0.19.6 → metaobjects-0.19.8}/README.md +0 -0
  14. {metaobjects-0.19.6 → metaobjects-0.19.8}/hatch_build.py +0 -0
  15. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/__init__.py +0 -0
  16. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/agent_context/__init__.py +0 -0
  17. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/agent_context/scaffold.py +0 -0
  18. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/apidocs/__init__.py +0 -0
  19. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/apidocs/api_model.py +0 -0
  20. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/apidocs/builder.py +0 -0
  21. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/apidocs/naming.py +0 -0
  22. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/apidocs/paths.py +0 -0
  23. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/apidocs/renderer.py +0 -0
  24. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/attr_class_map.py +0 -0
  25. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/cli.py +0 -0
  26. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/codegen/KNOWN_GAPS.md +0 -0
  27. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/codegen/__init__.py +0 -0
  28. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/codegen/config.py +0 -0
  29. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/codegen/constants.py +0 -0
  30. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/codegen/extract_delegate_emitter.py +0 -0
  31. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/codegen/extract_schema_emitter.py +0 -0
  32. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/codegen/format.py +0 -0
  33. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/codegen/fr010_field_mapping.py +0 -0
  34. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/codegen/generator.py +0 -0
  35. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/codegen/generator_registry.py +0 -0
  36. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/codegen/generators/__init__.py +0 -0
  37. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/codegen/generators/entity_model.py +0 -0
  38. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/codegen/generators/extractor_generator.py +0 -0
  39. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/codegen/generators/filter_allowlist_generator.py +0 -0
  40. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/codegen/generators/fr019_shared_enum.py +0 -0
  41. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/codegen/generators/m2m_codegen.py +0 -0
  42. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/codegen/generators/output_parser_generator.py +0 -0
  43. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/codegen/generators/output_prompt_generator.py +0 -0
  44. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/codegen/generators/payload_vo_generator.py +0 -0
  45. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/codegen/generators/render_helper_generator.py +0 -0
  46. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/codegen/generators/router_generator.py +0 -0
  47. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/codegen/generators/template_generator.py +0 -0
  48. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/codegen/generators/tph_plan.py +0 -0
  49. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/codegen/generators/trace_helper_generator.py +0 -0
  50. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/codegen/instance_artifacts.py +0 -0
  51. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/codegen/output_format_spec_emitter.py +0 -0
  52. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/codegen/overwrite_policy.py +0 -0
  53. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/codegen/runner.py +0 -0
  54. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/codegen/runtime/__init__.py +0 -0
  55. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/codegen/runtime/filter_parser.py +0 -0
  56. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/codegen/template_codegen/__init__.py +0 -0
  57. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/codegen/template_codegen/output_pattern.py +0 -0
  58. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/codegen/template_codegen/template_data.py +0 -0
  59. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/codegen/template_codegen/template_spec.py +0 -0
  60. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/datatype.py +0 -0
  61. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/documentation/__init__.py +0 -0
  62. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/documentation/doc_constants.py +0 -0
  63. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/documentation/doc_provider.py +0 -0
  64. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/documentation/doc_schema.py +0 -0
  65. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/errors.py +0 -0
  66. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/loader/__init__.py +0 -0
  67. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/loader/merge.py +0 -0
  68. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/loader/meta_data_loader.py +0 -0
  69. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/loader/registered_validation.py +0 -0
  70. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/loader/sources/__init__.py +0 -0
  71. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/loader/sources/directory_source.py +0 -0
  72. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/loader/sources/file_source.py +0 -0
  73. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/loader/sources/meta_data_source.py +0 -0
  74. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/loader/sources/uri_source.py +0 -0
  75. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/loader/validate_discriminator.py +0 -0
  76. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/loader/validate_field_readonly.py +0 -0
  77. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/loader/validate_source_escapes.py +0 -0
  78. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/loader/validate_source_parameter_ref.py +0 -0
  79. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/loader/validate_source_physical_names.py +0 -0
  80. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/__init__.py +0 -0
  81. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/core/__init__.py +0 -0
  82. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/core/attr/__init__.py +0 -0
  83. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/core/attr/attr_constants.py +0 -0
  84. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/core/attr/meta_attr.py +0 -0
  85. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/core/field/__init__.py +0 -0
  86. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/core/field/meta_field.py +0 -0
  87. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/core/identity/__init__.py +0 -0
  88. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/core/identity/identity_constants.py +0 -0
  89. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/core/identity/meta_identity.py +0 -0
  90. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/core/index/__init__.py +0 -0
  91. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/core/index/index_constants.py +0 -0
  92. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/core/index/meta_index.py +0 -0
  93. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/core/object/__init__.py +0 -0
  94. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/core/object/meta_object.py +0 -0
  95. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/core/object/meta_object_aware.py +0 -0
  96. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/core/object/object_class_registry.py +0 -0
  97. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/core/object/object_constants.py +0 -0
  98. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/core/object/object_extract.py +0 -0
  99. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/core/object/value_object.py +0 -0
  100. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/core/relationship/__init__.py +0 -0
  101. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/core/relationship/derive_m2m_fields.py +0 -0
  102. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/core/relationship/meta_relationship.py +0 -0
  103. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/core/relationship/relationship_constants.py +0 -0
  104. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/core/validator/__init__.py +0 -0
  105. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/core/validator/validator_constants.py +0 -0
  106. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/meta_data.py +0 -0
  107. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/meta_root.py +0 -0
  108. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/persistence/__init__.py +0 -0
  109. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/persistence/db/__init__.py +0 -0
  110. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/persistence/db/db_constants.py +0 -0
  111. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/persistence/db/db_provider.py +0 -0
  112. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/persistence/origin/__init__.py +0 -0
  113. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/persistence/origin/meta_origin.py +0 -0
  114. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/persistence/origin/origin_constants.py +0 -0
  115. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/persistence/source/__init__.py +0 -0
  116. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/persistence/source/meta_source.py +0 -0
  117. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/persistence/source/source_constants.py +0 -0
  118. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/presentation/__init__.py +0 -0
  119. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/presentation/layout/__init__.py +0 -0
  120. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/presentation/layout/layout_constants.py +0 -0
  121. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/presentation/layout/meta_layout.py +0 -0
  122. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/presentation/ui/__init__.py +0 -0
  123. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/presentation/ui/ui_provider.py +0 -0
  124. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/presentation/view/__init__.py +0 -0
  125. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/presentation/view/meta_view.py +0 -0
  126. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/presentation/view/view_constants.py +0 -0
  127. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/provider_extends.py +0 -0
  128. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/template/__init__.py +0 -0
  129. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/template/meta_template.py +0 -0
  130. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/template/prompt_provider.py +0 -0
  131. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/meta/template/template_constants.py +0 -0
  132. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/naming_refs.py +0 -0
  133. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/parser.py +0 -0
  134. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/parser_yaml.py +0 -0
  135. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/provider.py +0 -0
  136. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/py.typed +0 -0
  137. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/registry.py +0 -0
  138. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/registry_manifest.py +0 -0
  139. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/render/__init__.py +0 -0
  140. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/render/email_document.py +0 -0
  141. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/render/escapers.py +0 -0
  142. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/render/extract/KNOWN_GAPS.md +0 -0
  143. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/render/extract/__init__.py +0 -0
  144. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/render/extract/coerce.py +0 -0
  145. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/render/extract/extract.py +0 -0
  146. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/render/extract/extract_map.py +0 -0
  147. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/render/extract/json_forgiving_reader.py +0 -0
  148. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/render/extract/locate.py +0 -0
  149. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/render/extract/normalize.py +0 -0
  150. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/render/extract/strip.py +0 -0
  151. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/render/extract/types.py +0 -0
  152. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/render/extract/xml_forgiving_reader.py +0 -0
  153. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/render/filesystem_provider.py +0 -0
  154. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/render/prompt/__init__.py +0 -0
  155. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/render/prompt/output_format_renderer.py +0 -0
  156. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/render/prompt/output_format_spec.py +0 -0
  157. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/render/prompt/prompt_field.py +0 -0
  158. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/render/prompt/prompt_overrides.py +0 -0
  159. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/render/prompt/prompt_style.py +0 -0
  160. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/render/renderer.py +0 -0
  161. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/render/verify.py +0 -0
  162. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/runtime/__init__.py +0 -0
  163. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/runtime/llm_recorder.py +0 -0
  164. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/runtime/n2m_resolver.py +0 -0
  165. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/runtime/object_manager.py +0 -0
  166. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/runtime/tph.py +0 -0
  167. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/serializer_json.py +0 -0
  168. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/shared/__init__.py +0 -0
  169. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/shared/base_types.py +0 -0
  170. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/shared/separators.py +0 -0
  171. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/shared/structural.py +0 -0
  172. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/source/__init__.py +0 -0
  173. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/source/error_source.py +0 -0
  174. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/source/json_path.py +0 -0
  175. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/source/semantic_diff.py +0 -0
  176. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/source/yaml_positions.py +0 -0
  177. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/spec_metamodel/__init__.py +0 -0
  178. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/spec_metamodel/attr.json +0 -0
  179. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/spec_metamodel/db.json +0 -0
  180. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/spec_metamodel/documentation.json +0 -0
  181. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/spec_metamodel/identity.json +0 -0
  182. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/spec_metamodel/index.json +0 -0
  183. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/spec_metamodel/layout.json +0 -0
  184. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/spec_metamodel/object.json +0 -0
  185. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/spec_metamodel/origin.json +0 -0
  186. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/spec_metamodel/relationship.json +0 -0
  187. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/spec_metamodel/source.json +0 -0
  188. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/spec_metamodel/template.json +0 -0
  189. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/spec_metamodel/ui-web.json +0 -0
  190. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/spec_metamodel/ui.json +0 -0
  191. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/spec_metamodel/validator.json +0 -0
  192. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/spec_metamodel/view.json +0 -0
  193. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/super_resolve.py +0 -0
  194. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/validation_types.py +0 -0
  195. {metaobjects-0.19.6 → metaobjects-0.19.8}/src/metaobjects/yaml_desugar.py +0 -0
  196. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/__init__.py +0 -0
  197. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/__init__.py +0 -0
  198. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/golden/extends/expected/BaseEntity.py +0 -0
  199. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/golden/extends/expected/Program.py +0 -0
  200. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/golden/extends/meta.json +0 -0
  201. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/golden/nested-array/expected/AuthorBrief.py +0 -0
  202. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/golden/nested-array/expected/PostBrief.py +0 -0
  203. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/golden/nested-array/meta.json +0 -0
  204. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/golden/scalars/expected/Metric.py +0 -0
  205. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/golden/scalars/expected/Report.py +0 -0
  206. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/golden/scalars/meta.json +0 -0
  207. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/golden/vanilla/expected/Subscriber.py +0 -0
  208. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/golden/vanilla/meta.json +0 -0
  209. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_abstract_conformance.py +0 -0
  210. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_api_docs_builder.py +0 -0
  211. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_api_docs_paths.py +0 -0
  212. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_cli.py +0 -0
  213. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_cli_providers.py +0 -0
  214. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_cli_registry.py +0 -0
  215. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_cli_staleness_nudge.py +0 -0
  216. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_cli_verify_strict.py +0 -0
  217. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_cli_verify_subverbs.py +0 -0
  218. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_constants_config.py +0 -0
  219. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_entity_model.py +0 -0
  220. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_enum_conformance.py +0 -0
  221. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_extends_abstract_field_inheritance.py +0 -0
  222. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_extractor_generator.py +0 -0
  223. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_filter_allowlist_generator.py +0 -0
  224. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_format.py +0 -0
  225. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_fr010_nested_object_prompt.py +0 -0
  226. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_fr010_output_codegen.py +0 -0
  227. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_fr019_shared_provided_conformance.py +0 -0
  228. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_generator.py +0 -0
  229. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_generator_extension_seams.py +0 -0
  230. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_golden.py +0 -0
  231. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_inherit_without_restate_gate.py +0 -0
  232. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_inheritance_conformance.py +0 -0
  233. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_instance_artifacts.py +0 -0
  234. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_m2m_codegen.py +0 -0
  235. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_origin_nullability.py +0 -0
  236. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_output_parser_generator.py +0 -0
  237. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_overwrite_policy.py +0 -0
  238. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_payload_vo_generator.py +0 -0
  239. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_projection_compile.py +0 -0
  240. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_render_helper_conformance.py +0 -0
  241. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_render_helper_generator.py +0 -0
  242. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_reverse_finders.py +0 -0
  243. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_router_autoset.py +0 -0
  244. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_router_generator.py +0 -0
  245. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_runner.py +0 -0
  246. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_template_data.py +0 -0
  247. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_template_generator.py +0 -0
  248. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_template_output_pattern.py +0 -0
  249. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_template_scope_helpers.py +0 -0
  250. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_template_scope_walk.py +0 -0
  251. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_template_spec.py +0 -0
  252. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_tph_codegen.py +0 -0
  253. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_trace_helper_generator.py +0 -0
  254. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_type_map.py +0 -0
  255. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/codegen/test_write_through.py +0 -0
  256. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/conformance/__init__.py +0 -0
  257. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/conformance/capabilities.py +0 -0
  258. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/conformance/conformance-expected-failures.json +0 -0
  259. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/conformance/conformance_adapter.py +0 -0
  260. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/conformance/corpus.py +0 -0
  261. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/conformance/expected_failures.py +0 -0
  262. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/conformance/fixture_discovery.py +0 -0
  263. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/conformance/navigator.py +0 -0
  264. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/conformance/test_api_docs_cross_port_conformance.py +0 -0
  265. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/conformance/test_conformance.py +0 -0
  266. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/conformance/test_extract_conformance.py +0 -0
  267. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/conformance/test_extract_object_verdict.py +0 -0
  268. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/conformance/test_fr010_loader_attrs.py +0 -0
  269. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/conformance/test_fr011_attrs.py +0 -0
  270. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/conformance/test_generator_registry_conformance.py +0 -0
  271. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/conformance/test_object_model_conformance.py +0 -0
  272. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/conformance/test_provider_composition_conformance.py +0 -0
  273. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/conformance/test_registry_conformance.py +0 -0
  274. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/conformance/test_runner_hardfail.py +0 -0
  275. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/conformance/test_spec_metamodel_embed.py +0 -0
  276. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/conformance/test_strict_attr_load.py +0 -0
  277. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/conformance/test_template_codegen_conformance.py +0 -0
  278. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/conformance/test_template_generator_conformance.py +0 -0
  279. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/conformance/test_yaml_conformance.py +0 -0
  280. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/conformance/yaml-conformance-expected-failures.json +0 -0
  281. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/integration/__init__.py +0 -0
  282. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/integration/api_contract_assertions.py +0 -0
  283. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/integration/api_contract_jsonb_server.py +0 -0
  284. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/integration/api_contract_m2m_server.py +0 -0
  285. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/integration/api_contract_server.py +0 -0
  286. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/integration/generated_jsonb_app.py +0 -0
  287. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/integration/generated_m2m_app.py +0 -0
  288. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/integration/generated_router_app.py +0 -0
  289. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/integration/generated_tph_app.py +0 -0
  290. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/integration/meta_ai_trace.yaml +0 -0
  291. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/integration/normalization.py +0 -0
  292. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/integration/postgres_container.py +0 -0
  293. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/integration/query_runner.py +0 -0
  294. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/integration/scenarios.py +0 -0
  295. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/integration/test_api_contract.py +0 -0
  296. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/integration/test_api_contract_generated.py +0 -0
  297. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/integration/test_api_contract_jsonb.py +0 -0
  298. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/integration/test_api_contract_m2m.py +0 -0
  299. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/integration/test_api_contract_m2m_generated.py +0 -0
  300. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/integration/test_api_contract_tph_generated.py +0 -0
  301. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/integration/test_generated_router_uuid_pk.py +0 -0
  302. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/integration/test_llm_call_trace.py +0 -0
  303. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/integration/test_normalization.py +0 -0
  304. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/integration/test_query_scenarios.py +0 -0
  305. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/integration/test_runtime_return_types.py +0 -0
  306. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/open_closed_proof_test.py +0 -0
  307. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/render/__init__.py +0 -0
  308. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/render/extract/__init__.py +0 -0
  309. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/render/extract/test_coerce.py +0 -0
  310. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/render/extract/test_extract.py +0 -0
  311. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/render/extract/test_extract_map.py +0 -0
  312. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/render/extract/test_json_forgiving_reader.py +0 -0
  313. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/render/extract/test_locate.py +0 -0
  314. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/render/extract/test_model.py +0 -0
  315. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/render/extract/test_normalize.py +0 -0
  316. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/render/extract/test_strip.py +0 -0
  317. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/render/extract/test_xml_forgiving_reader.py +0 -0
  318. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/render/prompt/__init__.py +0 -0
  319. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/render/prompt/test_output_format_renderer.py +0 -0
  320. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/render/test_email_document.py +0 -0
  321. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/render/test_filesystem_provider.py +0 -0
  322. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/render/test_output_format_renderer_nested.py +0 -0
  323. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/render/test_output_prompt_conformance.py +0 -0
  324. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/render/test_render_conformance.py +0 -0
  325. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/render/test_render_max_chars.py +0 -0
  326. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/render/test_verify.py +0 -0
  327. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/render/test_verify_conformance.py +0 -0
  328. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/source/__init__.py +0 -0
  329. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/source/test_fr5c_merge_attribution.py +0 -0
  330. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/source/test_fr5d_reference_resolution.py +0 -0
  331. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/source/test_fr5e_database_source_shape.py +0 -0
  332. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/source/test_json_path.py +0 -0
  333. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/source/test_semantic_diff.py +0 -0
  334. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/source/test_source_on_node.py +0 -0
  335. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/source/test_yaml_positions.py +0 -0
  336. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/test_api_docs_accuracy.py +0 -0
  337. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/__init__.py +0 -0
  338. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_agent_context_staleness.py +0 -0
  339. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_capabilities.py +0 -0
  340. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_common_attrs.py +0 -0
  341. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_core_types.py +0 -0
  342. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_effective_package.py +0 -0
  343. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_errors.py +0 -0
  344. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_field_enum.py +0 -0
  345. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_field_map_validation.py +0 -0
  346. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_field_uuid_dbcolumntype.py +0 -0
  347. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_fr016_source_name_and_kind_aliases.py +0 -0
  348. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_index_lookup.py +0 -0
  349. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_llm_recorder.py +0 -0
  350. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_loader.py +0 -0
  351. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_loader_bom.py +0 -0
  352. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_loader_class.py +0 -0
  353. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_merge.py +0 -0
  354. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_meta_attr.py +0 -0
  355. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_meta_data.py +0 -0
  356. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_meta_source.py +0 -0
  357. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_module_shortcuts.py +0 -0
  358. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_n2m_resolver.py +0 -0
  359. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_n2m_resolver_inherited.py +0 -0
  360. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_object_manager_autoset_stamping.py +0 -0
  361. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_object_manager_uuid_coercion.py +0 -0
  362. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_object_manager_write_through.py +0 -0
  363. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_one_primary_source.py +0 -0
  364. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_parser.py +0 -0
  365. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_parser_yaml.py +0 -0
  366. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_provider.py +0 -0
  367. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_provider_extension.py +0 -0
  368. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_registry.py +0 -0
  369. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_registry_completeness.py +0 -0
  370. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_registry_extend.py +0 -0
  371. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_registry_sealed.py +0 -0
  372. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_relationship_referential_actions.py +0 -0
  373. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_resolution_key.py +0 -0
  374. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_runtime_resolution_key_binding.py +0 -0
  375. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_serializer.py +0 -0
  376. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_shared_constants.py +0 -0
  377. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_smoke.py +0 -0
  378. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_source_escapes.py +0 -0
  379. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_sources.py +0 -0
  380. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_strict_child_placement.py +0 -0
  381. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_super_resolve.py +0 -0
  382. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_template_wrong_subtype_attrs.py +0 -0
  383. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_validation_attr_schema.py +0 -0
  384. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_validation_filter_values.py +0 -0
  385. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_validation_origin_195.py +0 -0
  386. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_validation_origin_paths.py +0 -0
  387. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_validation_sort_field.py +0 -0
  388. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_validation_warnings.py +0 -0
  389. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_write_coercion_arrays.py +0 -0
  390. {metaobjects-0.19.6 → metaobjects-0.19.8}/tests/unit/test_yaml_desugar.py +0 -0
  391. {metaobjects-0.19.6 → metaobjects-0.19.8}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: metaobjects
3
- Version: 0.19.6
3
+ Version: 0.19.8
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.19.6"
3
+ version = "0.19.8"
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"
@@ -116,6 +116,14 @@ def py_type_for(field: MetaField) -> PyType:
116
116
  # z.unknown() (#97) — since jsonb can hold any JSON value. (Other ports whose
117
117
  # drivers return jsonb as raw text correctly keep their string type.)
118
118
  base = PyType("Any", ("from typing import Any",))
119
+ elif (
120
+ field.sub_type in (fc.FIELD_SUBTYPE_URI, fc.FIELD_SUBTYPE_INET)
121
+ and field.attrs().get(fc.FIELD_ATTR_LENIENT) is True
122
+ ):
123
+ # #234 — @lenient opts a field.uri / field.inet out of strict well-formedness:
124
+ # bind a plain ``str`` (not Pydantic AnyUrl / IPvAnyAddress, whose construction
125
+ # IS the validator) so a not-strictly-valid value round-trips unchanged.
126
+ base = PyType("str")
119
127
  else:
120
128
  base = _SCALAR.get(field.sub_type, PyType("str"))
121
129
  if field_is_array(field):
@@ -391,6 +391,15 @@ for _def in core_provider._defs: # noqa: SLF001 (provider build-time enrichment
391
391
  )
392
392
  break
393
393
 
394
+ # #234 — field.uri / field.inet carry the @lenient attr (opt out of strict URI / IP-literal
395
+ # well-formedness; codegen binds a plain string, and field.inet a text column) IN ADDITION to the
396
+ # common field attrs. Mirrors the @stringFormat enrichment above (and TS/Java/C#).
397
+ for _def in core_provider._defs: # noqa: SLF001 (provider build-time enrichment)
398
+ if _def.type == TYPE_FIELD and _def.sub_type in (fc.FIELD_SUBTYPE_URI, fc.FIELD_SUBTYPE_INET):
399
+ _def.attrs.append(
400
+ AttrSchema(name=fc.FIELD_ATTR_LENIENT, value_type=ATTR_SUBTYPE_BOOLEAN, required=False)
401
+ )
402
+
394
403
  # field.map carries the @valueType attr (scalar value subtype) IN ADDITION to the
395
404
  # common field attrs (@objectRef is already common). The bulk loop registered
396
405
  # field.map with the common attrs; append @valueType to that definition (mirrors
@@ -124,21 +124,23 @@ from ..meta.core.index.index_constants import INDEX_ATTR_FIELDS, INDEX_SUBTYPE_L
124
124
  from ..source import resolved_source
125
125
  from ..naming_refs import did_you_mean_hint, resolve_object_ref
126
126
 
127
- # A subtype-specific template attr is valid ONLY on the subtype it is registered
127
+ # A subtype-specific template attr is valid ONLY on the subtype(s) it is registered
128
128
  # for. The metamodel registers these per-subtype (see the core_types template block),
129
129
  # but the lenient loader does not reject a misplaced one — _validate_templates does.
130
130
  # Mirrors the per-subtype TEMPLATE_ATTRS_MAP split across the other ports.
131
- _TEMPLATE_SUBTYPE_ONLY_ATTRS: dict[str, str] = {
132
- tc.TEMPLATE_ATTR_MAX_TOKENS: tc.TEMPLATE_SUBTYPE_PROMPT,
133
- tc.TEMPLATE_ATTR_REQUIRED_SLOTS: tc.TEMPLATE_SUBTYPE_PROMPT,
134
- tc.TEMPLATE_ATTR_MODEL: tc.TEMPLATE_SUBTYPE_PROMPT,
135
- tc.TEMPLATE_ATTR_RESPONSE_REF: tc.TEMPLATE_SUBTYPE_PROMPT,
136
- tc.TEMPLATE_ATTR_PROMPT_STYLE: tc.TEMPLATE_SUBTYPE_OUTPUT,
137
- tc.TEMPLATE_ATTR_KIND: tc.TEMPLATE_SUBTYPE_OUTPUT,
138
- tc.TEMPLATE_ATTR_SUBJECT_REF: tc.TEMPLATE_SUBTYPE_OUTPUT,
139
- tc.TEMPLATE_ATTR_HTML_BODY_REF: tc.TEMPLATE_SUBTYPE_OUTPUT,
140
- tc.TEMPLATE_ATTR_TEXT_BODY_REF: tc.TEMPLATE_SUBTYPE_OUTPUT,
141
- tc.TEMPLATE_ATTR_TOOL_NAME: tc.TEMPLATE_SUBTYPE_TOOLCALL,
131
+ # #237: @maxTokens is registered on BOTH prompt AND toolcall (a vendor-agnostic token
132
+ # budget), so the value is a SET of allowed subtypes, not a single one.
133
+ _TEMPLATE_SUBTYPE_ONLY_ATTRS: dict[str, frozenset[str]] = {
134
+ tc.TEMPLATE_ATTR_MAX_TOKENS: frozenset({tc.TEMPLATE_SUBTYPE_PROMPT, tc.TEMPLATE_SUBTYPE_TOOLCALL}),
135
+ tc.TEMPLATE_ATTR_REQUIRED_SLOTS: frozenset({tc.TEMPLATE_SUBTYPE_PROMPT}),
136
+ tc.TEMPLATE_ATTR_MODEL: frozenset({tc.TEMPLATE_SUBTYPE_PROMPT}),
137
+ tc.TEMPLATE_ATTR_RESPONSE_REF: frozenset({tc.TEMPLATE_SUBTYPE_PROMPT}),
138
+ tc.TEMPLATE_ATTR_PROMPT_STYLE: frozenset({tc.TEMPLATE_SUBTYPE_OUTPUT}),
139
+ tc.TEMPLATE_ATTR_KIND: frozenset({tc.TEMPLATE_SUBTYPE_OUTPUT}),
140
+ tc.TEMPLATE_ATTR_SUBJECT_REF: frozenset({tc.TEMPLATE_SUBTYPE_OUTPUT}),
141
+ tc.TEMPLATE_ATTR_HTML_BODY_REF: frozenset({tc.TEMPLATE_SUBTYPE_OUTPUT}),
142
+ tc.TEMPLATE_ATTR_TEXT_BODY_REF: frozenset({tc.TEMPLATE_SUBTYPE_OUTPUT}),
143
+ tc.TEMPLATE_ATTR_TOOL_NAME: frozenset({tc.TEMPLATE_SUBTYPE_TOOLCALL}),
142
144
  }
143
145
 
144
146
  # ---------------------------------------------------------------------------
@@ -437,18 +439,22 @@ def _validate_attr_schema(
437
439
 
438
440
  # --- Check 1: required attrs must be present (uses node.attrs() = effective,
439
441
  # so an inherited attr from the super chain satisfies the requirement) ---
440
- present_attrs = node.attrs()
441
- for schema in schemas:
442
- if not schema.required:
443
- continue
444
- if schema.name not in present_attrs:
445
- errors.append(
446
- MetaError(
447
- f"{_node_label(node)} is missing required attribute '@{schema.name}'",
448
- ErrorCode.ERR_MISSING_REQUIRED_ATTR,
449
- envelope=node.source,
442
+ # #236: an ABSTRACT node is a template, not instantiated — it may omit a required
443
+ # attr for concrete subtypes / `extends` to supply. Enforcement stays at the
444
+ # concrete level (a concrete's resolving attrs() must satisfy it). ADR-0039.
445
+ if not node.is_abstract:
446
+ present_attrs = node.attrs()
447
+ for schema in schemas:
448
+ if not schema.required:
449
+ continue
450
+ if schema.name not in present_attrs:
451
+ errors.append(
452
+ MetaError(
453
+ f"{_node_label(node)} is missing required attribute '@{schema.name}'",
454
+ ErrorCode.ERR_MISSING_REQUIRED_ATTR,
455
+ envelope=node.source,
456
+ )
450
457
  )
451
- )
452
458
 
453
459
  # --- Checks 2 + 3: own attrs only (inherited attrs were already checked on
454
460
  # the node that declared them; re-checking would double-report) ---
@@ -3002,13 +3008,14 @@ def _validate_templates(root: MetaData, errors: list[MetaError]) -> None:
3002
3008
  # e.g. @maxTokens (prompt-only) on a template.output, or @promptStyle
3003
3009
  # (output-only) on a template.prompt. ADR-0039: resolving — a subtype-only
3004
3010
  # attr may be inherited via extends, so read the effective value.
3005
- for attr_name, allowed_sub in _TEMPLATE_SUBTYPE_ONLY_ATTRS.items():
3006
- if tpl.get_meta_attr(attr_name) is not None and tpl.sub_type != allowed_sub:
3011
+ for attr_name, allowed_subs in _TEMPLATE_SUBTYPE_ONLY_ATTRS.items():
3012
+ if tpl.get_meta_attr(attr_name) is not None and tpl.sub_type not in allowed_subs:
3013
+ valid_on = " / ".join(f"template.{s}" for s in sorted(allowed_subs))
3007
3014
  errors.append(MetaError(
3008
3015
  code=ErrorCode.ERR_INVALID_TEMPLATE,
3009
3016
  message=(
3010
3017
  f'template.{tpl.sub_type} "{tpl.name}" carries @{attr_name}, '
3011
- f"which is only valid on template.{allowed_sub}"
3018
+ f"which is only valid on {valid_on}"
3012
3019
  ),
3013
3020
  envelope=tpl.source,
3014
3021
  ))
@@ -132,6 +132,11 @@ STRING_FORMAT_EMAIL = "email"
132
132
  STRING_FORMAT_HOSTNAME = "hostname"
133
133
  STRING_FORMAT_VALUES = (STRING_FORMAT_EMAIL, STRING_FORMAT_HOSTNAME)
134
134
 
135
+ # #234: opt a field.uri / field.inet OUT of strict well-formedness enforcement (optional boolean;
136
+ # default strict). When true, codegen binds a plain string (no URL/IP validator, no native type;
137
+ # field.inet uses a text column). Only on field.uri / field.inet. Mirrors TS FIELD_ATTR_LENIENT.
138
+ FIELD_ATTR_LENIENT = "lenient"
139
+
135
140
  # @autoSet allowed values (cross-port).
136
141
  AUTO_SET_ON_CREATE = "onCreate"
137
142
  AUTO_SET_ON_UPDATE = "onUpdate"
@@ -167,15 +167,21 @@
167
167
  "dataType": "string",
168
168
  "extendsBase": true,
169
169
  "description": "A URI/URL string (ADR-0036/0037 — a concept with a native type + behavior, so a subtype not a @stringFormat). Binds to TS string (TS has no native URI type, same as field.uuid); other ports bind to their native URI type (Java java.net.URI, C# System.Uri, Python urllib.parse, Kotlin java.net.URI) and parse scheme/authority/path. DB column is text (Postgres has no uri type). Codegen emits a URL/URI validator (TS Zod z.string().url()). v1 ships WITHOUT @kind — the native type subsumes url/urn; @kind is reserved for a later url|urn value-constraint.",
170
- "whenToUse": "A field holds a URL or URI. Use it for a typed URI column + URL validation instead of a plain string."
170
+ "whenToUse": "A field holds a URL or URI. Use it for a typed URI column + URL validation instead of a plain string.",
171
+ "children": [
172
+ { "type": "attr", "subType": "boolean", "name": "lenient", "min": 0, "max": 1, "description": "#234: opt this field out of strict well-formedness enforcement. When true, codegen binds a plain string (no URL/IP validator, no native URI/InetAddress type; field.inet uses a text column, not the native inet type) so a not-strictly-valid value round-trips unchanged. Default (absent/false) is strict: an absolute-scheme URI / an IPv4-or-IPv6 literal." }
173
+ ]
171
174
  },
172
175
  {
173
176
  "type": "field",
174
177
  "subType": "inet",
175
178
  "dataType": "string",
176
179
  "extendsBase": true,
177
- "description": "An IP-address string (IPv4 or IPv6) (ADR-0036/0037 — a concept with a native type + behavior, so a subtype not a @stringFormat). Binds to TS string (TS has no native IP type, same as field.uuid); other ports bind to their native IP type (Java java.net.InetAddress, C# System.Net.IPAddress, Python ipaddress, Kotlin java.net.InetAddress). DB column is the Postgres-native inet type. Codegen emits an IP validator accepting both v4 and v6 (TS Zod z.string().ip()). v1 ships WITHOUT @kind — the native type subsumes ipv4/ipv6; @kind is reserved for a later ipv4|ipv6 value-constraint.",
178
- "whenToUse": "A field holds an IPv4 or IPv6 address. Use it for a native Postgres inet column + IP validation instead of a plain string."
180
+ "description": "An IP-address string (IPv4 or IPv6) (ADR-0036/0037 — a concept with a native type + behavior, so a subtype not a @stringFormat). Binds to TS string (TS has no native IP type, same as field.uuid); other ports bind to their native IP type (Java java.net.InetAddress, C# System.Net.IPAddress, Python ipaddress, Kotlin java.net.InetAddress). DB column is the Postgres-native inet type. Codegen emits an IPv4-or-IPv6 literal validator (a Zod regex union in TS z.string().ip() was removed in Zod 4 — native IP-type parsing in the other ports); add @lenient to bind a plain string with no validator. v1 ships WITHOUT @kind — the native type subsumes ipv4/ipv6; @kind is reserved for a later ipv4|ipv6 value-constraint.",
181
+ "whenToUse": "A field holds an IPv4 or IPv6 address. Use it for a native Postgres inet column + IP validation instead of a plain string.",
182
+ "children": [
183
+ { "type": "attr", "subType": "boolean", "name": "lenient", "min": 0, "max": 1, "description": "#234: opt this field out of strict well-formedness enforcement. When true, codegen binds a plain string (no URL/IP validator, no native URI/InetAddress type; field.inet uses a text column, not the native inet type) so a not-strictly-valid value round-trips unchanged. Default (absent/false) is strict: an absolute-scheme URI / an IPv4-or-IPv6 literal." }
184
+ ]
179
185
  }
180
186
  ]
181
187
  }
@@ -69,7 +69,8 @@
69
69
  { "type": "attr", "subType": "string", "name": "toolName", "min": 1, "max": 1, "description": "Wire tool name surfaced to the LLM (vendor-specific format)." },
70
70
  { "type": "attr", "subType": "string", "name": "payloadRef", "min": 1, "max": 1, "description": "Output value-object the tool produces (resolved against the metamodel)." },
71
71
  { "type": "attr", "subType": "string", "name": "owner", "min": 0, "max": 1, "description": "Governance: the owner of this toolcall." },
72
- { "type": "attr", "subType": "string", "name": "since", "min": 0, "max": 1, "description": "Governance: the version this toolcall was introduced in." }
72
+ { "type": "attr", "subType": "string", "name": "since", "min": 0, "max": 1, "description": "Governance: the version this toolcall was introduced in." },
73
+ { "type": "attr", "subType": "int", "name": "maxTokens", "min": 0, "max": 1, "description": "Per-call token budget for the tool-call's structured response (LLM-specific). Vendor-agnostic config; peer of @maxTokens on template.prompt (#237)." }
73
74
  ]
74
75
  }
75
76
  ]
@@ -15,7 +15,10 @@ model, so asserting against the read model would no longer exercise Pin 1 at all
15
15
  """
16
16
  from __future__ import annotations
17
17
 
18
+ import importlib.util
18
19
  import json
20
+ import sys
21
+ import tempfile
19
22
  from pathlib import Path
20
23
 
21
24
  import pytest
@@ -52,9 +55,22 @@ def _build_generated_model() -> type[BaseModel]:
52
55
  artifact), not the plain ``Account`` read model: FR-036 Pin 1 lives on the wire
53
56
  tier only."""
54
57
  source = render_entity_model(_load_account_entity())
55
- namespace: dict[str, object] = {}
56
- exec(compile(source, "<generated Account.py>", "exec"), namespace) # noqa: S102
57
- model = namespace["AccountCreate"]
58
+ # Import the generated source as a REAL module rather than exec'ing it into a
59
+ # bare dict: under ``from __future__ import annotations`` Pydantic resolves
60
+ # type annotations lazily via the class's module globals, so a non-builtin
61
+ # import (e.g. ``AnyUrl``/``IPvAnyAddress`` for field.uri/field.inet) only
62
+ # resolves when ``__name__`` and the module's imports are in scope. A bare
63
+ # exec namespace has no ``__name__`` (forward refs fall back to builtins and
64
+ # fail — #234); a proper module import mirrors the TS runner's temp-module.
65
+ tmp_dir = tempfile.mkdtemp()
66
+ mod_path = Path(tmp_dir) / "generated_account.py"
67
+ mod_path.write_text(source)
68
+ spec = importlib.util.spec_from_file_location("generated_account", mod_path)
69
+ assert spec and spec.loader
70
+ module = importlib.util.module_from_spec(spec)
71
+ sys.modules["generated_account"] = module
72
+ spec.loader.exec_module(module)
73
+ model = module.AccountCreate
58
74
  assert isinstance(model, type) and issubclass(model, BaseModel)
59
75
  return model
60
76
 
@@ -51,6 +51,7 @@ def test_template_toolcall_attr_schema_does_not_inherit_generic_attrs() -> None:
51
51
  tc.TEMPLATE_ATTR_PAYLOAD_REF,
52
52
  tc.TEMPLATE_ATTR_OWNER,
53
53
  tc.TEMPLATE_ATTR_SINCE,
54
+ tc.TEMPLATE_ATTR_MAX_TOKENS, # #237 — vendor-agnostic per-call token budget
54
55
  }
55
56
  assert tc.TEMPLATE_ATTR_TEXT_REF not in attrs, "toolcall must NOT carry @textRef"
56
57
  assert tc.TEMPLATE_ATTR_FORMAT not in attrs, "toolcall must NOT carry @format"
@@ -59,6 +60,7 @@ def test_template_toolcall_attr_schema_does_not_inherit_generic_attrs() -> None:
59
60
  assert attrs[tc.TEMPLATE_ATTR_PAYLOAD_REF].required is True
60
61
  assert attrs[tc.TEMPLATE_ATTR_OWNER].required is False
61
62
  assert attrs[tc.TEMPLATE_ATTR_SINCE].required is False
63
+ assert attrs[tc.TEMPLATE_ATTR_MAX_TOKENS].required is False
62
64
 
63
65
 
64
66
  # ---------------------------------------------------------------------------
File without changes
File without changes
File without changes