metaobjects 1.0.9rc2__tar.gz → 1.0.9rc4__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 (472) hide show
  1. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/PKG-INFO +1 -1
  2. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/pyproject.toml +1 -1
  3. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/codegen/generators/extractor_generator.py +14 -7
  4. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/codegen/generators/trace_helper_generator.py +11 -6
  5. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/core/object/object_extract.py +25 -10
  6. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/render/extract/extract.py +16 -6
  7. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/render/extract/types.py +18 -0
  8. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/render/prompt/output_format_renderer.py +4 -1
  9. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_extractor_generator.py +29 -1
  10. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_trace_helper_generator.py +3 -1
  11. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/conformance/test_extract_conformance.py +6 -1
  12. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/render/test_output_prompt_conformance.py +1 -1
  13. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/.gitignore +0 -0
  14. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/LICENSE +0 -0
  15. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/README.md +0 -0
  16. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/hatch_build.py +0 -0
  17. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/scripts/generate_embedded_library.py +0 -0
  18. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/__init__.py +0 -0
  19. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/agent_context/__init__.py +0 -0
  20. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/agent_context/scaffold.py +0 -0
  21. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/apidocs/__init__.py +0 -0
  22. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/apidocs/api_model.py +0 -0
  23. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/apidocs/builder.py +0 -0
  24. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/apidocs/naming.py +0 -0
  25. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/apidocs/paths.py +0 -0
  26. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/apidocs/renderer.py +0 -0
  27. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/attr_class_map.py +0 -0
  28. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/cli.py +0 -0
  29. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/codegen/KNOWN_GAPS.md +0 -0
  30. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/codegen/__init__.py +0 -0
  31. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/codegen/collision_names.py +0 -0
  32. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/codegen/config.py +0 -0
  33. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/codegen/constants.py +0 -0
  34. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/codegen/eject.py +0 -0
  35. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/codegen/extract_delegate_emitter.py +0 -0
  36. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/codegen/extract_schema_emitter.py +0 -0
  37. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/codegen/format.py +0 -0
  38. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/codegen/fr010_field_mapping.py +0 -0
  39. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/codegen/generator.py +0 -0
  40. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/codegen/generator_registry.py +0 -0
  41. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/codegen/generators/__init__.py +0 -0
  42. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/codegen/generators/entity_model.py +0 -0
  43. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/codegen/generators/filter_allowlist_generator.py +0 -0
  44. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/codegen/generators/find_inbound.py +0 -0
  45. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/codegen/generators/fr019_shared_enum.py +0 -0
  46. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/codegen/generators/m2m_codegen.py +0 -0
  47. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/codegen/generators/names_generator.py +0 -0
  48. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/codegen/generators/output_parser_generator.py +0 -0
  49. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/codegen/generators/output_prompt_generator.py +0 -0
  50. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/codegen/generators/render_helper_generator.py +0 -0
  51. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/codegen/generators/router_generator.py +0 -0
  52. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/codegen/generators/template_generator.py +0 -0
  53. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/codegen/generators/tph_plan.py +0 -0
  54. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/codegen/instance_artifacts.py +0 -0
  55. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/codegen/metaobjects-config.schema.json +0 -0
  56. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/codegen/output_format_spec_emitter.py +0 -0
  57. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/codegen/overwrite_policy.py +0 -0
  58. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/codegen/project_config.py +0 -0
  59. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/codegen/runner.py +0 -0
  60. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/codegen/runtime/__init__.py +0 -0
  61. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/codegen/runtime/constraint_errors.py +0 -0
  62. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/codegen/runtime/filter_parser.py +0 -0
  63. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/codegen/template_codegen/__init__.py +0 -0
  64. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/codegen/template_codegen/output_pattern.py +0 -0
  65. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/codegen/template_codegen/template_data.py +0 -0
  66. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/codegen/template_codegen/template_spec.py +0 -0
  67. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/codegen/type_map.py +0 -0
  68. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/codegen/value_objects.py +0 -0
  69. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/config/__init__.py +0 -0
  70. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/config/dependencies.py +0 -0
  71. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/config/neutral_config.py +0 -0
  72. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/config/source_resolver.py +0 -0
  73. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/core_types.py +0 -0
  74. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/datatype.py +0 -0
  75. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/documentation/__init__.py +0 -0
  76. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/documentation/doc_constants.py +0 -0
  77. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/documentation/doc_provider.py +0 -0
  78. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/documentation/doc_schema.py +0 -0
  79. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/errors.py +0 -0
  80. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/library/__init__.py +0 -0
  81. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/library/embedded_library.py +0 -0
  82. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/library/library_sources.py +0 -0
  83. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/loader/__init__.py +0 -0
  84. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/loader/merge.py +0 -0
  85. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/loader/meta_data_loader.py +0 -0
  86. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/loader/registered_validation.py +0 -0
  87. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/loader/sources/__init__.py +0 -0
  88. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/loader/sources/directory_source.py +0 -0
  89. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/loader/sources/file_source.py +0 -0
  90. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/loader/sources/meta_data_source.py +0 -0
  91. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/loader/sources/uri_source.py +0 -0
  92. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/loader/validate_discriminator.py +0 -0
  93. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/loader/validate_enum_normalize_ambiguity.py +0 -0
  94. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/loader/validate_field_mutability.py +0 -0
  95. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/loader/validate_source_escapes.py +0 -0
  96. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/loader/validate_source_parameter_ref.py +0 -0
  97. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/loader/validate_source_physical_names.py +0 -0
  98. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/loader/validation_passes.py +0 -0
  99. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/__init__.py +0 -0
  100. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/core/__init__.py +0 -0
  101. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/core/attr/__init__.py +0 -0
  102. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/core/attr/attr_constants.py +0 -0
  103. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/core/attr/meta_attr.py +0 -0
  104. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/core/field/__init__.py +0 -0
  105. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/core/field/field_constants.py +0 -0
  106. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/core/field/meta_field.py +0 -0
  107. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/core/identity/__init__.py +0 -0
  108. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/core/identity/identity_constants.py +0 -0
  109. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/core/identity/meta_identity.py +0 -0
  110. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/core/index/__init__.py +0 -0
  111. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/core/index/index_constants.py +0 -0
  112. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/core/index/meta_index.py +0 -0
  113. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/core/object/__init__.py +0 -0
  114. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/core/object/meta_object.py +0 -0
  115. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/core/object/meta_object_aware.py +0 -0
  116. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/core/object/object_class_registry.py +0 -0
  117. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/core/object/object_constants.py +0 -0
  118. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/core/object/value_object.py +0 -0
  119. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/core/relationship/__init__.py +0 -0
  120. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/core/relationship/derive_m2m_fields.py +0 -0
  121. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/core/relationship/meta_relationship.py +0 -0
  122. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/core/relationship/relationship_constants.py +0 -0
  123. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/core/relationship/relationship_references.py +0 -0
  124. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/core/requirement/__init__.py +0 -0
  125. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/core/requirement/meta_requirement.py +0 -0
  126. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/core/requirement/requirement_constants.py +0 -0
  127. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/core/validator/__init__.py +0 -0
  128. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/core/validator/validator_constants.py +0 -0
  129. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/meta_data.py +0 -0
  130. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/meta_root.py +0 -0
  131. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/persistence/__init__.py +0 -0
  132. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/persistence/db/__init__.py +0 -0
  133. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/persistence/db/db_constants.py +0 -0
  134. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/persistence/db/db_provider.py +0 -0
  135. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/persistence/origin/__init__.py +0 -0
  136. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/persistence/origin/meta_origin.py +0 -0
  137. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/persistence/origin/origin_constants.py +0 -0
  138. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/persistence/source/__init__.py +0 -0
  139. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/persistence/source/meta_source.py +0 -0
  140. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/persistence/source/source_constants.py +0 -0
  141. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/presentation/__init__.py +0 -0
  142. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/presentation/layout/__init__.py +0 -0
  143. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/presentation/layout/layout_constants.py +0 -0
  144. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/presentation/layout/meta_layout.py +0 -0
  145. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/presentation/ui/__init__.py +0 -0
  146. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/presentation/ui/ui_provider.py +0 -0
  147. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/presentation/view/__init__.py +0 -0
  148. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/presentation/view/meta_view.py +0 -0
  149. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/presentation/view/view_constants.py +0 -0
  150. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/provider_extends.py +0 -0
  151. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/template/__init__.py +0 -0
  152. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/template/meta_template.py +0 -0
  153. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/template/prompt_provider.py +0 -0
  154. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta/template/template_constants.py +0 -0
  155. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/meta_endpoint.py +0 -0
  156. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/naming.py +0 -0
  157. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/naming_refs.py +0 -0
  158. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/parser.py +0 -0
  159. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/parser_yaml.py +0 -0
  160. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/provider.py +0 -0
  161. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/py.typed +0 -0
  162. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/registry.py +0 -0
  163. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/registry_manifest.py +0 -0
  164. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/render/__init__.py +0 -0
  165. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/render/email_document.py +0 -0
  166. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/render/escapers.py +0 -0
  167. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/render/extract/KNOWN_GAPS.md +0 -0
  168. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/render/extract/__init__.py +0 -0
  169. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/render/extract/coerce.py +0 -0
  170. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/render/extract/extract_map.py +0 -0
  171. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/render/extract/json_forgiving_reader.py +0 -0
  172. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/render/extract/locate.py +0 -0
  173. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/render/extract/normalize.py +0 -0
  174. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/render/extract/strip.py +0 -0
  175. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/render/extract/xml_forgiving_reader.py +0 -0
  176. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/render/filesystem_provider.py +0 -0
  177. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/render/payload_accessors.py +0 -0
  178. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/render/prompt/__init__.py +0 -0
  179. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/render/prompt/output_format_spec.py +0 -0
  180. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/render/prompt/prompt_field.py +0 -0
  181. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/render/prompt/prompt_overrides.py +0 -0
  182. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/render/prompt/prompt_style.py +0 -0
  183. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/render/renderer.py +0 -0
  184. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/render/verify.py +0 -0
  185. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/runtime/__init__.py +0 -0
  186. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/runtime/llm_recorder.py +0 -0
  187. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/runtime/n2m_resolver.py +0 -0
  188. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/runtime/object_manager.py +0 -0
  189. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/runtime/tph.py +0 -0
  190. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/scope.py +0 -0
  191. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/serializer_json.py +0 -0
  192. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/shared/__init__.py +0 -0
  193. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/shared/base_types.py +0 -0
  194. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/shared/separators.py +0 -0
  195. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/shared/structural.py +0 -0
  196. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/source/__init__.py +0 -0
  197. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/source/error_source.py +0 -0
  198. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/source/json_path.py +0 -0
  199. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/source/semantic_diff.py +0 -0
  200. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/source/yaml_positions.py +0 -0
  201. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/source_resolution.py +0 -0
  202. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/spec_metamodel/__init__.py +0 -0
  203. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/spec_metamodel/attr.json +0 -0
  204. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/spec_metamodel/db.json +0 -0
  205. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/spec_metamodel/documentation.json +0 -0
  206. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/spec_metamodel/field.json +0 -0
  207. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/spec_metamodel/identity.json +0 -0
  208. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/spec_metamodel/index.json +0 -0
  209. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/spec_metamodel/layout.json +0 -0
  210. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/spec_metamodel/object.json +0 -0
  211. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/spec_metamodel/origin.json +0 -0
  212. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/spec_metamodel/prompt.json +0 -0
  213. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/spec_metamodel/relationship.json +0 -0
  214. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/spec_metamodel/requirement.json +0 -0
  215. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/spec_metamodel/source.json +0 -0
  216. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/spec_metamodel/template.json +0 -0
  217. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/spec_metamodel/ui-web.json +0 -0
  218. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/spec_metamodel/ui.json +0 -0
  219. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/spec_metamodel/validator.json +0 -0
  220. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/spec_metamodel/view.json +0 -0
  221. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/super_resolve.py +0 -0
  222. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/validation_types.py +0 -0
  223. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/src/metaobjects/yaml_desugar.py +0 -0
  224. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/__init__.py +0 -0
  225. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/__init__.py +0 -0
  226. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/gen_suite.py +0 -0
  227. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/golden/extends/expected/BaseEntity.py +0 -0
  228. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/golden/extends/expected/Program.py +0 -0
  229. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/golden/extends/meta.json +0 -0
  230. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/golden/nested-array/expected/AuthorBrief.py +0 -0
  231. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/golden/nested-array/expected/PostBrief.py +0 -0
  232. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/golden/nested-array/meta.json +0 -0
  233. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/golden/scalars/expected/Metric.py +0 -0
  234. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/golden/scalars/expected/Report.py +0 -0
  235. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/golden/scalars/meta.json +0 -0
  236. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/golden/vanilla/expected/Subscriber.py +0 -0
  237. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/golden/vanilla/meta.json +0 -0
  238. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_abstract_conformance.py +0 -0
  239. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_api_docs_builder.py +0 -0
  240. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_api_docs_paths.py +0 -0
  241. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_cli.py +0 -0
  242. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_cli_config_gen.py +0 -0
  243. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_cli_config_verify.py +0 -0
  244. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_cli_dependencies.py +0 -0
  245. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_cli_providers.py +0 -0
  246. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_cli_registry.py +0 -0
  247. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_cli_render_helper_template_root.py +0 -0
  248. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_cli_staleness_nudge.py +0 -0
  249. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_cli_verify_strict.py +0 -0
  250. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_cli_verify_subverbs.py +0 -0
  251. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_codegen_compile_conformance.py +0 -0
  252. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_constants_config.py +0 -0
  253. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_eject.py +0 -0
  254. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_entity_model.py +0 -0
  255. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_enum_conformance.py +0 -0
  256. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_extends_abstract_field_inheritance.py +0 -0
  257. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_extract_tier_collision.py +0 -0
  258. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_filter_allowlist_generator.py +0 -0
  259. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_format.py +0 -0
  260. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_fr010_nested_object_prompt.py +0 -0
  261. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_fr010_output_codegen.py +0 -0
  262. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_fr019_shared_provided_conformance.py +0 -0
  263. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_gen_state_keying.py +0 -0
  264. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_generator.py +0 -0
  265. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_generator_extension_seams.py +0 -0
  266. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_golden.py +0 -0
  267. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_inherit_without_restate_gate.py +0 -0
  268. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_inheritance_conformance.py +0 -0
  269. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_instance_artifacts.py +0 -0
  270. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_m2m_codegen.py +0 -0
  271. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_names_extends_chain.py +0 -0
  272. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_names_generator.py +0 -0
  273. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_no_magic_physical_names.py +0 -0
  274. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_origin_nullability.py +0 -0
  275. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_output_parser_generator.py +0 -0
  276. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_overwrite_policy.py +0 -0
  277. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_overwrite_policy_hash.py +0 -0
  278. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_project_config.py +0 -0
  279. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_projection_compile.py +0 -0
  280. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_render_helper_conformance.py +0 -0
  281. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_render_helper_generator.py +0 -0
  282. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_reverse_finders.py +0 -0
  283. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_route_path_naming.py +0 -0
  284. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_router_autoset.py +0 -0
  285. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_router_generator.py +0 -0
  286. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_router_generator_m2m_target_tph.py +0 -0
  287. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_router_generator_tph_m2m.py +0 -0
  288. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_router_generator_tph_m2m_shadowed.py +0 -0
  289. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_runner.py +0 -0
  290. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_source_resolution.py +0 -0
  291. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_sourceless_projection.py +0 -0
  292. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_template_data.py +0 -0
  293. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_template_generator.py +0 -0
  294. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_template_output_pattern.py +0 -0
  295. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_template_scope_helpers.py +0 -0
  296. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_template_scope_walk.py +0 -0
  297. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_template_spec.py +0 -0
  298. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_tph_codegen.py +0 -0
  299. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_type_map.py +0 -0
  300. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_validation_conformance.py +0 -0
  301. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_value_objects.py +0 -0
  302. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/codegen/test_write_through.py +0 -0
  303. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/config/__init__.py +0 -0
  304. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/config/test_dependencies.py +0 -0
  305. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/config/test_library_package_guard.py +0 -0
  306. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/config/test_neutral_config.py +0 -0
  307. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/config/test_source_resolver.py +0 -0
  308. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/conformance/__init__.py +0 -0
  309. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/conformance/capabilities.py +0 -0
  310. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/conformance/conformance-expected-failures.json +0 -0
  311. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/conformance/conformance_adapter.py +0 -0
  312. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/conformance/corpus.py +0 -0
  313. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/conformance/expected_failures.py +0 -0
  314. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/conformance/fixture_discovery.py +0 -0
  315. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/conformance/navigator.py +0 -0
  316. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/conformance/test_api_docs_cross_port_conformance.py +0 -0
  317. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/conformance/test_conformance.py +0 -0
  318. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/conformance/test_dependency_conformance.py +0 -0
  319. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/conformance/test_extract_object_verdict.py +0 -0
  320. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/conformance/test_fr010_loader_attrs.py +0 -0
  321. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/conformance/test_fr011_attrs.py +0 -0
  322. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/conformance/test_generator_registry_conformance.py +0 -0
  323. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/conformance/test_object_model_conformance.py +0 -0
  324. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/conformance/test_provider_composition_conformance.py +0 -0
  325. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/conformance/test_registry_conformance.py +0 -0
  326. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/conformance/test_runner_hardfail.py +0 -0
  327. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/conformance/test_scope_conformance.py +0 -0
  328. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/conformance/test_source_resolution_conformance.py +0 -0
  329. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/conformance/test_spec_metamodel_embed.py +0 -0
  330. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/conformance/test_strict_attr_load.py +0 -0
  331. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/conformance/test_template_codegen_conformance.py +0 -0
  332. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/conformance/test_template_generator_conformance.py +0 -0
  333. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/conformance/test_yaml_conformance.py +0 -0
  334. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/conformance/yaml-conformance-expected-failures.json +0 -0
  335. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/integration/__init__.py +0 -0
  336. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/integration/api_contract_assertions.py +0 -0
  337. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/integration/api_contract_jsonb_server.py +0 -0
  338. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/integration/api_contract_m2m_server.py +0 -0
  339. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/integration/api_contract_server.py +0 -0
  340. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/integration/generated_jsonb_app.py +0 -0
  341. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/integration/generated_m2m_app.py +0 -0
  342. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/integration/generated_projection_app.py +0 -0
  343. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/integration/generated_router_app.py +0 -0
  344. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/integration/generated_tph_app.py +0 -0
  345. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/integration/meta_ai_trace.yaml +0 -0
  346. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/integration/normalization.py +0 -0
  347. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/integration/postgres_container.py +0 -0
  348. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/integration/query_runner.py +0 -0
  349. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/integration/scenarios.py +0 -0
  350. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/integration/test_api_contract.py +0 -0
  351. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/integration/test_api_contract_generated.py +0 -0
  352. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/integration/test_api_contract_jsonb.py +0 -0
  353. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/integration/test_api_contract_m2m.py +0 -0
  354. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/integration/test_api_contract_m2m_generated.py +0 -0
  355. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/integration/test_api_contract_projection.py +0 -0
  356. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/integration/test_api_contract_tph_generated.py +0 -0
  357. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/integration/test_generated_router_uuid_pk.py +0 -0
  358. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/integration/test_llm_call_trace.py +0 -0
  359. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/integration/test_m2m_target_tph_generated.py +0 -0
  360. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/integration/test_normalization.py +0 -0
  361. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/integration/test_query_scenarios.py +0 -0
  362. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/integration/test_runtime_return_types.py +0 -0
  363. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/integration/test_tph_m2m_generated.py +0 -0
  364. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/integration/test_tph_m2m_shadowed_generated.py +0 -0
  365. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/loader/__init__.py +0 -0
  366. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/loader/test_abstract_subtype_authored.py +0 -0
  367. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/loader/test_child_wrapper_body_shape.py +0 -0
  368. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/loader/test_enum_extends_values_conflict.py +0 -0
  369. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/loader/test_field_mutability_order.py +0 -0
  370. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/loader/test_shipped_library_ai.py +0 -0
  371. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/loader/test_template_payload_target_210.py +0 -0
  372. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/open_closed_proof_test.py +0 -0
  373. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/render/__init__.py +0 -0
  374. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/render/extract/__init__.py +0 -0
  375. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/render/extract/test_coerce.py +0 -0
  376. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/render/extract/test_extract.py +0 -0
  377. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/render/extract/test_extract_map.py +0 -0
  378. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/render/extract/test_json_forgiving_reader.py +0 -0
  379. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/render/extract/test_locate.py +0 -0
  380. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/render/extract/test_model.py +0 -0
  381. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/render/extract/test_normalize.py +0 -0
  382. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/render/extract/test_strip.py +0 -0
  383. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/render/extract/test_xml_forgiving_reader.py +0 -0
  384. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/render/prompt/__init__.py +0 -0
  385. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/render/prompt/test_output_format_renderer.py +0 -0
  386. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/render/test_email_document.py +0 -0
  387. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/render/test_filesystem_provider.py +0 -0
  388. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/render/test_output_format_renderer_nested.py +0 -0
  389. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/render/test_render_conformance.py +0 -0
  390. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/render/test_render_max_chars.py +0 -0
  391. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/render/test_render_model_payload.py +0 -0
  392. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/render/test_verify.py +0 -0
  393. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/render/test_verify_conformance.py +0 -0
  394. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/runtime/test_constraint_errors.py +0 -0
  395. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/runtime/test_object_manager_currency_read.py +0 -0
  396. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/runtime/test_object_manager_enum_intvaluemap.py +0 -0
  397. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/runtime/test_object_manager_table_name.py +0 -0
  398. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/source/__init__.py +0 -0
  399. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/source/test_fr5c_merge_attribution.py +0 -0
  400. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/source/test_fr5d_reference_resolution.py +0 -0
  401. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/source/test_fr5e_database_source_shape.py +0 -0
  402. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/source/test_json_path.py +0 -0
  403. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/source/test_semantic_diff.py +0 -0
  404. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/source/test_source_on_node.py +0 -0
  405. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/source/test_yaml_positions.py +0 -0
  406. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/test_api_docs_accuracy.py +0 -0
  407. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/test_meta_endpoint.py +0 -0
  408. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/__init__.py +0 -0
  409. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_agent_context_staleness.py +0 -0
  410. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_capabilities.py +0 -0
  411. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_column_naming_strategy.py +0 -0
  412. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_common_attrs.py +0 -0
  413. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_core_types.py +0 -0
  414. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_derive_m2m_declaring_entity.py +0 -0
  415. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_effective_children_sibling_shadowing.py +0 -0
  416. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_effective_package.py +0 -0
  417. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_errors.py +0 -0
  418. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_field_enum.py +0 -0
  419. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_field_enum_intvaluemap.py +0 -0
  420. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_field_map_validation.py +0 -0
  421. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_field_uuid_dbcolumntype.py +0 -0
  422. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_file_source_id.py +0 -0
  423. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_fr016_source_name_and_kind_aliases.py +0 -0
  424. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_index_lookup.py +0 -0
  425. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_llm_recorder.py +0 -0
  426. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_loader.py +0 -0
  427. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_loader_bom.py +0 -0
  428. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_loader_class.py +0 -0
  429. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_merge.py +0 -0
  430. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_meta_attr.py +0 -0
  431. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_meta_data.py +0 -0
  432. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_meta_source.py +0 -0
  433. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_module_shortcuts.py +0 -0
  434. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_n2m_resolver.py +0 -0
  435. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_n2m_resolver_inherited.py +0 -0
  436. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_no_dead_config_fields.py +0 -0
  437. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_object_manager_autoset_stamping.py +0 -0
  438. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_object_manager_uuid_coercion.py +0 -0
  439. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_object_manager_write_through.py +0 -0
  440. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_one_primary_source.py +0 -0
  441. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_parser.py +0 -0
  442. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_parser_yaml.py +0 -0
  443. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_provider.py +0 -0
  444. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_provider_extension.py +0 -0
  445. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_registry.py +0 -0
  446. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_registry_completeness.py +0 -0
  447. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_registry_extend.py +0 -0
  448. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_registry_sealed.py +0 -0
  449. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_relationship_m2m_validation.py +0 -0
  450. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_relationship_references.py +0 -0
  451. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_relationship_referential_actions.py +0 -0
  452. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_resolution_key.py +0 -0
  453. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_runtime_resolution_key_binding.py +0 -0
  454. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_serializer.py +0 -0
  455. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_serializer_shared_document.py +0 -0
  456. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_shared_constants.py +0 -0
  457. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_smoke.py +0 -0
  458. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_source_escapes.py +0 -0
  459. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_sources.py +0 -0
  460. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_strict_child_placement.py +0 -0
  461. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_super_resolve.py +0 -0
  462. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_template_toolcall.py +0 -0
  463. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_template_wrong_subtype_attrs.py +0 -0
  464. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_validation_attr_schema.py +0 -0
  465. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_validation_filter_values.py +0 -0
  466. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_validation_origin_195.py +0 -0
  467. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_validation_origin_paths.py +0 -0
  468. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_validation_sort_field.py +0 -0
  469. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_validation_warnings.py +0 -0
  470. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_write_coercion_arrays.py +0 -0
  471. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/tests/unit/test_yaml_desugar.py +0 -0
  472. {metaobjects-1.0.9rc2 → metaobjects-1.0.9rc4}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: metaobjects
3
- Version: 1.0.9rc2
3
+ Version: 1.0.9rc4
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 = "1.0.9rc2"
3
+ version = "1.0.9rc4"
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"
@@ -9,7 +9,7 @@ arrays-of-objects populated) in ONE call:
9
9
 
10
10
  extract_<snake>(root, text, opts=None) -> <Vo>
11
11
  r = extract_lenient_<snake>_with_loader(root, text, opts) # nested-capable extract
12
- if r.report.has_lost_required(): raise ValueError(...)
12
+ if r.report.has_lost_required() or r.report.has_malformed_required(): raise ValueError(...)
13
13
  return _to_strict_<vo>(r.data) # mirror -> strict mapper
14
14
 
15
15
  Why the loaded ``root``: the SELF-CONTAINED ``extract_<snake>(text)`` leaves nested
@@ -173,16 +173,23 @@ def render_extractor(
173
173
  lines.append(" value-object). Runs the tolerant nested-capable extract, then maps the")
174
174
  lines.append(" extracted mirror graph onto the strict Pydantic payload graph.")
175
175
  lines.append("")
176
- lines.append(" :raises ValueError: iff a ``@required`` field was lost (the strict gate).")
176
+ lines.append(" :raises ValueError: iff a ``@required`` field was lost, or present but")
177
+ lines.append(" unusable (MALFORMED: an undeclared enum member, text for a number).")
177
178
  lines.append(' """')
178
179
  lines.append(f" r = {extract_lenient_with_fn}(root, text, opts)")
179
- lines.append(" if r.report.has_lost_required():")
180
- lines.append(" raise ValueError(")
180
+ lines.append(" if r.report.has_lost_required() or r.report.has_malformed_required():")
181
+ lines.append(" unusable = []")
182
+ lines.append(" if r.report.has_lost_required():")
181
183
  lines.append(
182
- f' "{extract_fn}: lost required field(s): "'
184
+ ' unusable.append("lost required field(s): "'
185
+ ' + ", ".join(r.report.lost_required()))'
183
186
  )
184
- lines.append(' + ", ".join(r.report.lost_required())')
185
- lines.append(" )")
187
+ lines.append(" if r.report.has_malformed_required():")
188
+ lines.append(
189
+ ' unusable.append("malformed required field(s): "'
190
+ ' + ", ".join(r.report.malformed_required()))'
191
+ )
192
+ lines.append(f' raise ValueError("{extract_fn}: " + "; ".join(unusable))')
186
193
  lines.append(f" return {root_mapper}(r.data)")
187
194
  lines.append("")
188
195
  lines.append("")
@@ -282,13 +282,18 @@ def render_trace_helper(entity: MetaObject, root: MetaData) -> str | None:
282
282
  " :param redact: optional row redaction applied before the single record.",
283
283
  ' """',
284
284
  " outcome = extract(input.llm_response_text, _RESPONSE_SCHEMA)",
285
- " failed = outcome.report.has_lost_required()",
285
+ " # A required field lost OR malformed (present but unusable) has no value,",
286
+ " # so either fails the call.",
287
+ " unusable = []",
288
+ " if outcome.report.has_lost_required():",
289
+ ' unusable.append("lost required: " + ", ".join(outcome.report.lost_required()))',
290
+ " if outcome.report.has_malformed_required():",
291
+ " unusable.append(",
292
+ ' "malformed required: " + ", ".join(outcome.report.malformed_required())',
293
+ " )",
294
+ " failed = bool(unusable)",
286
295
  " status = STATUS_ERROR if failed else STATUS_OK",
287
- " error_detail = (",
288
- ' "lost required: " + ", ".join(outcome.report.lost_required())',
289
- " if failed",
290
- " else None",
291
- " )",
296
+ ' error_detail = "; ".join(unusable) if failed else None',
292
297
  " # Extraction owns the derived status/error_detail — fold them into the input",
293
298
  " # before building the base row (dataclasses.replace, leaving the original",
294
299
  " # input untouched).",
@@ -65,22 +65,37 @@ MAX_NEST_DEPTH = 8
65
65
 
66
66
 
67
67
  class ExtractError(Exception):
68
- """Raised by :func:`or_throw` when a extraction lost one or more ``@required``
69
- fields. ``lost_required`` lists the field paths that were absent/uncoercible."""
68
+ """Raised by :func:`or_throw` when an extraction lost, or could not use, one or more
69
+ ``@required`` fields. ``lost_required`` lists the absent paths, ``malformed_required``
70
+ the paths present in the reply but unusable (MALFORMED)."""
70
71
 
71
- def __init__(self, lost_required: list[str]) -> None:
72
+ def __init__(
73
+ self, lost_required: list[str], malformed_required: list[str] | None = None
74
+ ) -> None:
72
75
  self.lost_required = list(lost_required)
73
- joined = ", ".join(self.lost_required)
74
- super().__init__(f"extract lost required field(s): {joined}")
76
+ self.malformed_required = list(malformed_required or [])
77
+ parts: list[str] = []
78
+ if self.lost_required:
79
+ parts.append("extract lost required field(s): " + ", ".join(self.lost_required))
80
+ if self.malformed_required:
81
+ prefix = (
82
+ "malformed required field(s): "
83
+ if parts
84
+ else "extract got malformed required field(s): "
85
+ )
86
+ parts.append(prefix + ", ".join(self.malformed_required))
87
+ super().__init__("; ".join(parts))
75
88
 
76
89
 
77
90
  def or_throw(result: ExtractionResult[object]) -> object:
78
91
  """Opt into strictness: return ``result.data`` iff no ``@required`` field was
79
- lost, else raise :class:`ExtractError`. Mirrors the cross-port ``ExtractionResult.
80
- orThrow()`` / TS free ``orThrow``. Extract itself NEVER raises — this is the
81
- explicit gate a caller reaches for when a lost-required field should fail."""
82
- if result.report.has_lost_required():
83
- raise ExtractError(result.report.lost_required())
92
+ lost or malformed, else raise :class:`ExtractError`. Mirrors the cross-port
93
+ ``ExtractionResult.orThrow()`` / TS free ``orThrow``. Extract itself NEVER raises —
94
+ this is the explicit gate a caller reaches for when an unusable required field should
95
+ fail."""
96
+ report = result.report
97
+ if report.has_lost_required() or report.has_malformed_required():
98
+ raise ExtractError(report.lost_required(), report.malformed_required())
84
99
  return result.data
85
100
 
86
101
 
@@ -105,7 +105,7 @@ def _extract(
105
105
  )
106
106
  continue
107
107
  if present is TRUNCATED: # present-but-garbled (empty/cut-off value)
108
- report.set(path, FieldExtraction.MALFORMED)
108
+ _mark_malformed(report, path, f)
109
109
  continue
110
110
  if present is NULL_LITERAL:
111
111
  # The JSON null literal is the caller's explicit "no value": leave the field null
@@ -144,16 +144,17 @@ def _extract(
144
144
  # elements into data (partial extraction), UNLIKE a MALFORMED scalar which is
145
145
  # absent from data.
146
146
  data[f.name] = out
147
- report.set(
148
- path, FieldExtraction.MALFORMED if any_malformed else FieldExtraction.EXTRACTED
149
- )
147
+ if any_malformed:
148
+ _mark_malformed(report, path, f)
149
+ else:
150
+ report.set(path, FieldExtraction.EXTRACTED)
150
151
  continue
151
152
  if isinstance(present, list): # a list where a singular value was expected
152
- report.set(path, FieldExtraction.MALFORMED)
153
+ _mark_malformed(report, path, f)
153
154
  continue
154
155
  v = _extract_value(f, present, path, report, o, ci)
155
156
  if v is MALFORMED:
156
- report.set(path, FieldExtraction.MALFORMED)
157
+ _mark_malformed(report, path, f)
157
158
  else:
158
159
  data[f.name] = v
159
160
  # FR-011: a value reached via @coerceDefault (or @default) is DEFAULTED,
@@ -161,6 +162,15 @@ def _extract(
161
162
  report.set(path, _classify_coerced(path, report))
162
163
 
163
164
 
165
+ def _mark_malformed(report: ExtractionReport, path: str, f: FieldSpec) -> None:
166
+ """Classify a present-but-unusable field MALFORMED. A ``@required`` one is also recorded
167
+ in ``malformed_required()`` — its value is missing from data just as a lost field's is, so
168
+ the strict gate must fail on it (the extract-conformance corpus pins the set in every port)."""
169
+ report.set(path, FieldExtraction.MALFORMED)
170
+ if f.required:
171
+ report.mark_malformed_required(path)
172
+
173
+
164
174
  def _classify_coerced(path: str, report: ExtractionReport) -> FieldExtraction:
165
175
  """FR-011: classify a successfully-coerced field. DEFAULTED when its terminal
166
176
  (last-logged) coercion for this path is a default-class fallback
@@ -300,6 +300,7 @@ class ExtractionReport:
300
300
  self._states: dict[str, FieldExtraction] = {}
301
301
  self._coercions: list[Coercion] = []
302
302
  self._defaulted_required: list[str] = []
303
+ self._malformed_required: list[str] = []
303
304
  self._empty: bool = False
304
305
 
305
306
  def set(self, field_path: str, state: FieldExtraction) -> None:
@@ -329,6 +330,23 @@ class ExtractionReport:
329
330
  def has_lost_required(self) -> bool:
330
331
  return len(self.lost_required()) > 0
331
332
 
333
+ def malformed_required(self) -> list[str]:
334
+ """The ``@required`` fields the document DID answer, but with a value that could not be
335
+ used (an undeclared enum member, text where a number belongs, a truncated value, a
336
+ malformed array element) — classified MALFORMED, so they are NOT in
337
+ :meth:`lost_required`. Their value is absent from ``data`` exactly as a lost field's is,
338
+ so the strict gate (the generated extractor, :func:`or_throw`) fails on these too.
339
+ """
340
+ return list(self._malformed_required)
341
+
342
+ def has_malformed_required(self) -> bool:
343
+ return len(self._malformed_required) > 0
344
+
345
+ def mark_malformed_required(self, field_path: str) -> None:
346
+ """Called by extract when a **required** field is classified MALFORMED."""
347
+ if field_path not in self._malformed_required:
348
+ self._malformed_required.append(field_path)
349
+
332
350
  def mark_defaulted_required(self, field_path: str) -> None:
333
351
  """Called by extract when an absent **required** field is filled from its ``@default``."""
334
352
  if field_path not in self._defaulted_required:
@@ -324,13 +324,16 @@ def _example_value_if_declared(field: PromptField, overrides: PromptOverrides) -
324
324
 
325
325
 
326
326
  def _example_value(field: PromptField, overrides: PromptOverrides) -> str:
327
+ # An enum with no declared example shows its allowed MEMBERS ("low | medium | high",
328
+ # the inline style's spelling), never one pre-filled member: a model shown a filled-in
329
+ # value copies it. Declaring @example is how an author asks for a concrete value.
327
330
  from_override = overrides.examples.get(field.name)
328
331
  if from_override is not None:
329
332
  return from_override
330
333
  if field.example is not None:
331
334
  return field.example
332
335
  if field.kind is FieldKind.ENUM and field.enum_values:
333
- return field.enum_values[0]
336
+ return " | ".join(field.enum_values)
334
337
  return "{" + field.name + "}"
335
338
 
336
339
 
@@ -208,7 +208,7 @@ def test_render_emits_extract_and_extract_and_mappers() -> None:
208
208
  # extract.
209
209
  assert "def extract_order_prompt(root, text, opts=None) -> Order:" in out
210
210
  assert "extract_lenient_order_prompt_with_loader(root, text, opts)" in out
211
- assert "if r.report.has_lost_required():" in out
211
+ assert "if r.report.has_lost_required() or r.report.has_malformed_required():" in out
212
212
  # re-exposed extract under the public name, delegating to the nested-capable path.
213
213
  assert "def extract_lenient_order_prompt(root, text, opts=None):" in out
214
214
  # imports the strict response graph + the with-loader extract.
@@ -419,6 +419,34 @@ def test_extract_raises_on_lost_required(tmp_path, monkeypatch) -> None:
419
419
  ex.extract_order_prompt(root, '{ "lines": [] }')
420
420
 
421
421
 
422
+ def test_extract_raises_on_malformed_required(tmp_path, monkeypatch) -> None:
423
+ """A required field PRESENT but unusable (an undeclared enum member) is MALFORMED, not
424
+ lost — the strict extractor must raise rather than build the payload with it missing."""
425
+ from importlib import import_module
426
+
427
+ root = _order_root()
428
+ pkg_dir = _materialize_package(_all_files(root), tmp_path)
429
+ _import_package(pkg_dir, monkeypatch)
430
+ ex = import_module("_gen_pkg.order_prompt_extractor")
431
+
432
+ reply = json.dumps(
433
+ {
434
+ "customer": {"name": "Ada"},
435
+ "lines": [{"sku": "A", "qty": 2}],
436
+ "tags": ["x"],
437
+ "scores": [3],
438
+ "priority": "MAYBE",
439
+ "labels": ["A"],
440
+ }
441
+ )
442
+ with pytest.raises(ValueError, match=r"malformed required field\(s\): priority"):
443
+ ex.extract_order_prompt(root, reply)
444
+ # the lenient tier never raises; its report names the unusable required field
445
+ r = ex.extract_lenient_order_prompt(root, reply)
446
+ assert r.data.priority is None
447
+ assert r.report.malformed_required() == ["priority"]
448
+
449
+
422
450
  def test_extract_reexposed_never_raises_and_no_lost_required(tmp_path, monkeypatch) -> None:
423
451
  from importlib import import_module
424
452
 
@@ -168,8 +168,10 @@ def test_render_emits_record_fn_and_schema_and_persist() -> None:
168
168
  assert "persist_llm_call_row(recorder, row, redact)" in out
169
169
  assert 'row["voResponse"] = outcome.data' in out
170
170
  assert 'row["voRequest"] = input.llm_request' in out
171
- # lost-required gate drives status/error_detail.
171
+ # the unusable-required gate (lost OR malformed) drives status/error_detail.
172
172
  assert "outcome.report.has_lost_required()" in out
173
+ assert "outcome.report.has_malformed_required()" in out
174
+ assert "failed = bool(unusable)" in out
173
175
 
174
176
 
175
177
  # ---------------------------------------------------------------------------
@@ -60,7 +60,7 @@ def _cases() -> list[str]:
60
60
  def test_discovers_all_extract_conformance_cases() -> None:
61
61
  """FR-011: lock the corpus size so a deleted fixture fails CI rather than
62
62
  silently reducing coverage. Mirrors the TS / Java / C# count guards."""
63
- assert len(_cases()) == 41
63
+ assert len(_cases()) == 42
64
64
 
65
65
 
66
66
  _NORMALIZE_MODES = {"none", "collapse", "strip"}
@@ -178,6 +178,11 @@ def test_classification_and_canonical_value_match(case_name: str) -> None:
178
178
  expected_states = {str(k): str(v) for k, v in expected["states"].items()}
179
179
  assert actual_states == expected_states, f"{case_name}: states mismatch"
180
180
 
181
+ # the required MALFORMED subset — the strict gate's second half (absent key = none)
182
+ assert sorted(outcome.report.malformed_required()) == sorted(
183
+ expected.get("malformedRequired", [])
184
+ ), f"{case_name}: malformedRequired mismatch"
185
+
181
186
  # Data is compared as a flat DOTTED-LEAF map (mirroring states): nested objects and arrays
182
187
  # are flattened to leaf paths (meta.score, items[0].label, tags[0], …) and every leaf VALUE
183
188
  # is asserted — including scalar-array elements and nested-object leaves.
@@ -51,7 +51,7 @@ def _find_corpus() -> Path:
51
51
  _CORPUS = _find_corpus()
52
52
 
53
53
  # Count guard: a port silently skipping cases must fail. Bump when adding cases.
54
- EXPECTED_CASE_COUNT = 15
54
+ EXPECTED_CASE_COUNT = 17
55
55
 
56
56
  _FORMATS = {"json": Format.JSON, "xml": Format.XML}
57
57
  _KINDS = {
File without changes
File without changes