metaobjects 1.1.4__tar.gz → 1.2.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (599) hide show
  1. {metaobjects-1.1.4 → metaobjects-1.2.1}/PKG-INFO +6 -4
  2. {metaobjects-1.1.4 → metaobjects-1.2.1}/README.md +2 -2
  3. {metaobjects-1.1.4 → metaobjects-1.2.1}/pyproject.toml +14 -3
  4. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/cli.py +162 -46
  5. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/KNOWN_GAPS.md +3 -3
  6. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/collection_name_collision.py +33 -1
  7. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/config.py +8 -0
  8. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/eject.py +109 -12
  9. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/generator.py +3 -0
  10. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/generator_registry.py +15 -1
  11. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/generators/api_docs_generator.py +7 -3
  12. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/generators/entity_model.py +63 -3
  13. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/generators/render_helper_generator.py +54 -14
  14. metaobjects-1.2.1/src/metaobjects/codegen/generators/report_export_generator.py +242 -0
  15. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/generators/router_generator.py +341 -59
  16. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/metaobjects-config.schema.json +5 -0
  17. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/project_config.py +21 -2
  18. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/runner.py +1 -0
  19. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/runtime/api_docs_builder.py +7 -2
  20. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/runtime/decimal_wire.py +21 -0
  21. metaobjects-1.2.1/src/metaobjects/codegen/runtime/report_export.py +69 -0
  22. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/errors.py +11 -0
  23. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/loader/validate_discriminator.py +9 -3
  24. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/loader/validate_enum_normalize_ambiguity.py +51 -0
  25. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/loader/validation_passes.py +47 -1
  26. metaobjects-1.2.1/src/metaobjects/meta/core/field/credential.py +16 -0
  27. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/core/field/field_constants.py +3 -0
  28. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/core/reporting/report_read_model.py +12 -2
  29. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/render/__init__.py +24 -1
  30. metaobjects-1.2.1/src/metaobjects/render/engine.py +79 -0
  31. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/render/escapers.py +6 -1
  32. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/render/extract/coerce.py +3 -2
  33. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/render/extract/json_forgiving_reader.py +35 -16
  34. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/render/extract/locate.py +19 -6
  35. metaobjects-1.2.1/src/metaobjects/render/extract/strip.py +94 -0
  36. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/render/extract/xml_forgiving_reader.py +121 -13
  37. metaobjects-1.2.1/src/metaobjects/render/filesystem_provider.py +70 -0
  38. metaobjects-1.2.1/src/metaobjects/render/jinja_render.py +133 -0
  39. metaobjects-1.2.1/src/metaobjects/render/jinja_verify.py +506 -0
  40. metaobjects-1.2.1/src/metaobjects/render/mustache_tags.py +128 -0
  41. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/render/renderer.py +74 -18
  42. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/render/verify.py +132 -62
  43. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/runtime/validator_runner.py +4 -2
  44. metaobjects-1.2.1/src/metaobjects/source/yaml_core_schema.py +122 -0
  45. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/source/yaml_positions.py +12 -9
  46. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/spec_metamodel/ui.json +1 -1
  47. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_api_docs_builder.py +22 -0
  48. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_cli_config_verify.py +7 -8
  49. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_cli_gen_unknown_attr.py +27 -0
  50. metaobjects-1.2.1/tests/codegen/test_cli_init.py +69 -0
  51. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_cli_registry.py +1 -1
  52. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_cli_surface.py +32 -0
  53. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_cli_verify_requirements.py +6 -3
  54. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_cli_verify_subverbs.py +54 -2
  55. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_collection_name_collision.py +9 -0
  56. metaobjects-1.2.1/tests/codegen/test_eject_undo.py +176 -0
  57. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_fr019_shared_provided_conformance.py +9 -0
  58. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_m2m_codegen.py +2 -2
  59. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_names_extends_chain.py +1 -1
  60. metaobjects-1.2.1/tests/codegen/test_pattern_ascii.py +99 -0
  61. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_render_helper_generator.py +117 -4
  62. metaobjects-1.2.1/tests/codegen/test_report_credential.py +143 -0
  63. metaobjects-1.2.1/tests/codegen/test_report_export.py +172 -0
  64. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_reverse_finders.py +4 -4
  65. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_router_generator.py +30 -2
  66. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_router_generator_m2m_target_tph.py +3 -3
  67. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_router_generator_tph_m2m.py +7 -7
  68. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_router_generator_tph_m2m_shadowed.py +5 -5
  69. metaobjects-1.2.1/tests/codegen/test_router_mypy_strict.py +81 -0
  70. metaobjects-1.2.1/tests/codegen/test_router_secret_fields.py +120 -0
  71. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/conformance/test_api_docs_cross_port_conformance.py +20 -13
  72. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/conformance/test_dependency_conformance.py +3 -1
  73. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/conformance/test_extract_conformance.py +1 -1
  74. metaobjects-1.2.1/tests/conformance/test_shared_model_conformance.py +57 -0
  75. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/integration/generated_report_app.py +12 -1
  76. metaobjects-1.2.1/tests/integration/generated_secret_fields_app.py +87 -0
  77. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/integration/test_api_contract_report.py +34 -2
  78. metaobjects-1.2.1/tests/integration/test_api_contract_secret_fields.py +91 -0
  79. metaobjects-1.2.1/tests/integration/test_generated_router_validated_input.py +272 -0
  80. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/integration/test_m2m_target_tph_generated.py +17 -1
  81. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/render/extract/test_coerce.py +6 -0
  82. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/render/extract/test_json_forgiving_reader.py +5 -0
  83. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/render/extract/test_strip.py +18 -0
  84. metaobjects-1.2.1/tests/render/test_jinja_conformance.py +135 -0
  85. metaobjects-1.2.1/tests/render/test_jinja_engine.py +200 -0
  86. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/render/test_verify_conformance.py +7 -4
  87. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/runtime/test_validator_runner.py +6 -0
  88. metaobjects-1.2.1/tests/source/test_yaml_core_schema.py +56 -0
  89. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/test_api_docs_packages.py +4 -3
  90. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/test_reporting_inert.py +7 -3
  91. metaobjects-1.2.1/tests/unit/test_relative_set_newlines.py +11 -0
  92. {metaobjects-1.1.4 → metaobjects-1.2.1}/uv.lock +152 -4
  93. metaobjects-1.1.4/src/metaobjects/render/extract/strip.py +0 -28
  94. metaobjects-1.1.4/src/metaobjects/render/filesystem_provider.py +0 -51
  95. {metaobjects-1.1.4 → metaobjects-1.2.1}/.gitignore +0 -0
  96. {metaobjects-1.1.4 → metaobjects-1.2.1}/LICENSE +0 -0
  97. {metaobjects-1.1.4 → metaobjects-1.2.1}/hatch_build.py +0 -0
  98. {metaobjects-1.1.4 → metaobjects-1.2.1}/scripts/generate_embedded_library.py +0 -0
  99. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/__init__.py +0 -0
  100. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/agent_context/__init__.py +0 -0
  101. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/agent_context/scaffold.py +0 -0
  102. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/apidocs/__init__.py +0 -0
  103. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/apidocs/api_model.py +0 -0
  104. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/apidocs/builder.py +0 -0
  105. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/apidocs/naming.py +0 -0
  106. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/apidocs/paths.py +0 -0
  107. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/apidocs/renderer.py +0 -0
  108. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/attr_class_map.py +0 -0
  109. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/__init__.py +0 -0
  110. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/_moved.py +0 -0
  111. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/collision_names.py +0 -0
  112. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/constants.py +0 -0
  113. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/extract_delegate_emitter.py +0 -0
  114. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/extract_schema_emitter.py +0 -0
  115. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/format.py +0 -0
  116. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/fr010_field_mapping.py +0 -0
  117. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/generators/__init__.py +0 -0
  118. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/generators/extractor_generator.py +0 -0
  119. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/generators/filter_allowlist_generator.py +0 -0
  120. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/generators/find_inbound.py +0 -0
  121. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/generators/fr019_shared_enum.py +0 -0
  122. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/generators/m2m_codegen.py +0 -0
  123. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/generators/names_generator.py +0 -0
  124. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/generators/output_parser_generator.py +0 -0
  125. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/generators/output_prompt_generator.py +0 -0
  126. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/generators/requirement_tests_generator.py +0 -0
  127. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/generators/template_generator.py +0 -0
  128. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/generators/tph_plan.py +0 -0
  129. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/generators/trace_helper_generator.py +0 -0
  130. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/instance_artifacts.py +0 -0
  131. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/model_walk.py +0 -0
  132. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/orphan_sweep.py +0 -0
  133. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/output_format_spec_emitter.py +0 -0
  134. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/overwrite_policy.py +0 -0
  135. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/project_import.py +0 -0
  136. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/requirement_hooks.py +0 -0
  137. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/requirement_walk.py +0 -0
  138. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/runtime/__init__.py +0 -0
  139. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/runtime/api_docs_model.py +0 -0
  140. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/runtime/api_docs_paths.py +0 -0
  141. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/runtime/api_docs_renderer.py +0 -0
  142. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/runtime/constraint_errors.py +0 -0
  143. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/runtime/extract_delegate_emitter.py +0 -0
  144. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/runtime/extract_schema_emitter.py +0 -0
  145. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/runtime/filter_parser.py +0 -0
  146. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/runtime/fr010_field_mapping.py +0 -0
  147. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/runtime/fr019_shared_enum.py +0 -0
  148. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/runtime/m2m_codegen.py +0 -0
  149. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/runtime/output_format_spec_emitter.py +0 -0
  150. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/runtime/shared_predicates.py +0 -0
  151. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/template_codegen/__init__.py +0 -0
  152. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/template_codegen/output_pattern.py +0 -0
  153. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/template_codegen/template_data.py +0 -0
  154. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/template_codegen/template_spec.py +0 -0
  155. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/type_map.py +0 -0
  156. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/codegen/value_objects.py +0 -0
  157. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/config/__init__.py +0 -0
  158. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/config/dependencies.py +0 -0
  159. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/config/neutral_config.py +0 -0
  160. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/config/source_resolver.py +0 -0
  161. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/core_types.py +0 -0
  162. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/datatype.py +0 -0
  163. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/documentation/__init__.py +0 -0
  164. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/documentation/doc_constants.py +0 -0
  165. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/documentation/doc_provider.py +0 -0
  166. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/documentation/doc_schema.py +0 -0
  167. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/field_lint.py +0 -0
  168. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/fmt.py +0 -0
  169. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/library/__init__.py +0 -0
  170. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/library/embedded_library.py +0 -0
  171. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/library/library_sources.py +0 -0
  172. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/loader/__init__.py +0 -0
  173. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/loader/merge.py +0 -0
  174. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/loader/meta_data_loader.py +0 -0
  175. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/loader/registered_validation.py +0 -0
  176. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/loader/resolve_references.py +0 -0
  177. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/loader/sources/__init__.py +0 -0
  178. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/loader/sources/directory_source.py +0 -0
  179. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/loader/sources/file_source.py +0 -0
  180. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/loader/sources/meta_data_source.py +0 -0
  181. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/loader/sources/uri_source.py +0 -0
  182. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/loader/validate_field_mutability.py +0 -0
  183. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/loader/validate_reporting.py +0 -0
  184. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/loader/validate_source_escapes.py +0 -0
  185. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/loader/validate_source_parameter_ref.py +0 -0
  186. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/loader/validate_source_physical_names.py +0 -0
  187. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/__init__.py +0 -0
  188. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/core/__init__.py +0 -0
  189. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/core/attr/__init__.py +0 -0
  190. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/core/attr/attr_constants.py +0 -0
  191. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/core/attr/meta_attr.py +0 -0
  192. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/core/field/__init__.py +0 -0
  193. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/core/field/meta_field.py +0 -0
  194. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/core/identity/__init__.py +0 -0
  195. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/core/identity/identity_constants.py +0 -0
  196. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/core/identity/meta_identity.py +0 -0
  197. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/core/index/__init__.py +0 -0
  198. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/core/index/index_constants.py +0 -0
  199. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/core/index/meta_index.py +0 -0
  200. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/core/object/__init__.py +0 -0
  201. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/core/object/meta_object.py +0 -0
  202. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/core/object/meta_object_aware.py +0 -0
  203. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/core/object/object_class_registry.py +0 -0
  204. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/core/object/object_constants.py +0 -0
  205. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/core/object/object_extract.py +0 -0
  206. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/core/object/value_object.py +0 -0
  207. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/core/relationship/__init__.py +0 -0
  208. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/core/relationship/derive_m2m_fields.py +0 -0
  209. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/core/relationship/meta_relationship.py +0 -0
  210. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/core/relationship/relationship_constants.py +0 -0
  211. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/core/relationship/relationship_references.py +0 -0
  212. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/core/reporting/__init__.py +0 -0
  213. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/core/reporting/meta_dimension.py +0 -0
  214. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/core/reporting/meta_measure.py +0 -0
  215. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/core/reporting/meta_segment.py +0 -0
  216. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/core/reporting/report_accessors.py +0 -0
  217. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/core/reporting/report_shape.py +0 -0
  218. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/core/reporting/reporting_constants.py +0 -0
  219. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/core/requirement/__init__.py +0 -0
  220. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/core/requirement/meta_requirement.py +0 -0
  221. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/core/requirement/requirement_constants.py +0 -0
  222. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/core/requirement/resolve_claim.py +0 -0
  223. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/core/validator/__init__.py +0 -0
  224. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/core/validator/validator_constants.py +0 -0
  225. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/meta_data.py +0 -0
  226. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/meta_root.py +0 -0
  227. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/persistence/__init__.py +0 -0
  228. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/persistence/db/__init__.py +0 -0
  229. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/persistence/db/db_constants.py +0 -0
  230. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/persistence/db/db_provider.py +0 -0
  231. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/persistence/origin/__init__.py +0 -0
  232. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/persistence/origin/meta_origin.py +0 -0
  233. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/persistence/origin/origin_constants.py +0 -0
  234. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/persistence/source/__init__.py +0 -0
  235. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/persistence/source/meta_source.py +0 -0
  236. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/persistence/source/source_constants.py +0 -0
  237. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/presentation/__init__.py +0 -0
  238. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/presentation/layout/__init__.py +0 -0
  239. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/presentation/layout/layout_constants.py +0 -0
  240. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/presentation/layout/meta_layout.py +0 -0
  241. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/presentation/ui/__init__.py +0 -0
  242. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/presentation/ui/ui_provider.py +0 -0
  243. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/presentation/view/__init__.py +0 -0
  244. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/presentation/view/meta_view.py +0 -0
  245. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/presentation/view/view_constants.py +0 -0
  246. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/provider_extends.py +0 -0
  247. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/template/__init__.py +0 -0
  248. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/template/meta_template.py +0 -0
  249. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/template/prompt_provider.py +0 -0
  250. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta/template/template_constants.py +0 -0
  251. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/meta_endpoint.py +0 -0
  252. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/naming.py +0 -0
  253. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/naming_refs.py +0 -0
  254. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/parser.py +0 -0
  255. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/parser_yaml.py +0 -0
  256. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/provider.py +0 -0
  257. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/py.typed +0 -0
  258. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/registry.py +0 -0
  259. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/registry_manifest.py +0 -0
  260. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/render/email_document.py +0 -0
  261. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/render/extract/KNOWN_GAPS.md +0 -0
  262. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/render/extract/__init__.py +0 -0
  263. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/render/extract/extract.py +0 -0
  264. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/render/extract/extract_map.py +0 -0
  265. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/render/extract/normalize.py +0 -0
  266. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/render/extract/types.py +0 -0
  267. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/render/payload_accessors.py +0 -0
  268. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/render/prompt/__init__.py +0 -0
  269. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/render/prompt/output_format_renderer.py +0 -0
  270. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/render/prompt/output_format_spec.py +0 -0
  271. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/render/prompt/prompt_field.py +0 -0
  272. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/render/prompt/prompt_overrides.py +0 -0
  273. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/render/prompt/prompt_style.py +0 -0
  274. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/requirement_check.py +0 -0
  275. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/runtime/__init__.py +0 -0
  276. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/runtime/dialect.py +0 -0
  277. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/runtime/drivers.py +0 -0
  278. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/runtime/llm_recorder.py +0 -0
  279. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/runtime/n2m_resolver.py +0 -0
  280. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/runtime/object_manager.py +0 -0
  281. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/runtime/tph.py +0 -0
  282. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/scope.py +0 -0
  283. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/serializer_json.py +0 -0
  284. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/shared/__init__.py +0 -0
  285. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/shared/base_types.py +0 -0
  286. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/shared/separators.py +0 -0
  287. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/shared/structural.py +0 -0
  288. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/source/__init__.py +0 -0
  289. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/source/error_source.py +0 -0
  290. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/source/json_path.py +0 -0
  291. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/source/semantic_diff.py +0 -0
  292. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/source_resolution.py +0 -0
  293. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/spec_metamodel/__init__.py +0 -0
  294. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/spec_metamodel/attr.json +0 -0
  295. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/spec_metamodel/db.json +0 -0
  296. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/spec_metamodel/documentation.json +0 -0
  297. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/spec_metamodel/field.json +0 -0
  298. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/spec_metamodel/identity.json +0 -0
  299. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/spec_metamodel/index.json +0 -0
  300. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/spec_metamodel/layout.json +0 -0
  301. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/spec_metamodel/object.json +0 -0
  302. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/spec_metamodel/origin.json +0 -0
  303. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/spec_metamodel/prompt.json +0 -0
  304. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/spec_metamodel/relationship.json +0 -0
  305. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/spec_metamodel/reporting.json +0 -0
  306. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/spec_metamodel/requirement.json +0 -0
  307. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/spec_metamodel/source.json +0 -0
  308. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/spec_metamodel/template.json +0 -0
  309. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/spec_metamodel/ui-web.json +0 -0
  310. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/spec_metamodel/validator.json +0 -0
  311. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/spec_metamodel/view.json +0 -0
  312. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/super_resolve.py +0 -0
  313. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/validation_types.py +0 -0
  314. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/wire.py +0 -0
  315. {metaobjects-1.1.4 → metaobjects-1.2.1}/src/metaobjects/yaml_desugar.py +0 -0
  316. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/__init__.py +0 -0
  317. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/__init__.py +0 -0
  318. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/config_helpers.py +0 -0
  319. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/gen_suite.py +0 -0
  320. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/golden/extends/expected/BaseEntity.py +0 -0
  321. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/golden/extends/expected/Program.py +0 -0
  322. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/golden/extends/meta.json +0 -0
  323. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/golden/nested-array/expected/AuthorBrief.py +0 -0
  324. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/golden/nested-array/expected/PostBrief.py +0 -0
  325. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/golden/nested-array/meta.json +0 -0
  326. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/golden/scalars/expected/Metric.py +0 -0
  327. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/golden/scalars/expected/Report.py +0 -0
  328. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/golden/scalars/meta.json +0 -0
  329. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/golden/vanilla/expected/Subscriber.py +0 -0
  330. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/golden/vanilla/meta.json +0 -0
  331. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_abstract_conformance.py +0 -0
  332. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_api_docs_paths.py +0 -0
  333. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_cli.py +0 -0
  334. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_cli_config_gen.py +0 -0
  335. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_cli_dependencies.py +0 -0
  336. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_cli_fmt.py +0 -0
  337. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_cli_help_removed_flags.py +0 -0
  338. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_cli_providers.py +0 -0
  339. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_cli_render_helper_template_root.py +0 -0
  340. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_cli_staleness_nudge.py +0 -0
  341. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_cli_verify_field_lint.py +0 -0
  342. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_cli_verify_strict.py +0 -0
  343. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_codegen_compile_conformance.py +0 -0
  344. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_config_run_settings.py +0 -0
  345. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_constants_config.py +0 -0
  346. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_cross_package_binding_conformance.py +0 -0
  347. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_docs_generators.py +0 -0
  348. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_eject.py +0 -0
  349. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_eject_alone.py +0 -0
  350. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_eject_independence.py +0 -0
  351. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_eject_runtime.py +0 -0
  352. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_entity_model.py +0 -0
  353. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_enum_conformance.py +0 -0
  354. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_extends_abstract_field_inheritance.py +0 -0
  355. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_extract_tier_collision.py +0 -0
  356. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_extractor_generator.py +0 -0
  357. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_filter_allowlist_generator.py +0 -0
  358. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_fmt_format_file.py +0 -0
  359. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_format.py +0 -0
  360. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_fr010_nested_object_prompt.py +0 -0
  361. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_fr010_output_codegen.py +0 -0
  362. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_gen_state_keying.py +0 -0
  363. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_generator.py +0 -0
  364. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_generator_extension_seams.py +0 -0
  365. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_golden.py +0 -0
  366. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_hand_edits.py +0 -0
  367. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_inherit_without_restate_gate.py +0 -0
  368. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_inheritance_conformance.py +0 -0
  369. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_instance_artifacts.py +0 -0
  370. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_moved_modules.py +0 -0
  371. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_names_generator.py +0 -0
  372. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_no_magic_physical_names.py +0 -0
  373. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_one_generator_list.py +0 -0
  374. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_origin_nullability.py +0 -0
  375. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_orphan_sweep.py +0 -0
  376. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_output_parser_generator.py +0 -0
  377. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_overwrite_policy.py +0 -0
  378. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_overwrite_policy_hash.py +0 -0
  379. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_project_config.py +0 -0
  380. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_project_import.py +0 -0
  381. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_projection_compile.py +0 -0
  382. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_projection_docs_routes.py +0 -0
  383. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_recipe_generators.py +0 -0
  384. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_render_helper_conformance.py +0 -0
  385. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_report_router.py +0 -0
  386. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_requirement_tests_generator.py +0 -0
  387. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_route_path_naming.py +0 -0
  388. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_router_autoset.py +0 -0
  389. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_runner.py +0 -0
  390. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_source_resolution.py +0 -0
  391. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_sourceless_entity_surface.py +0 -0
  392. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_sourceless_projection.py +0 -0
  393. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_template_data.py +0 -0
  394. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_template_generator.py +0 -0
  395. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_template_output_pattern.py +0 -0
  396. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_template_scope_helpers.py +0 -0
  397. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_template_scope_walk.py +0 -0
  398. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_template_spec.py +0 -0
  399. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_tph_codegen.py +0 -0
  400. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_trace_helper_generator.py +0 -0
  401. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_type_map.py +0 -0
  402. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_validation_conformance.py +0 -0
  403. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_value_objects.py +0 -0
  404. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/codegen/test_write_through.py +0 -0
  405. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/config/__init__.py +0 -0
  406. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/config/test_dependencies.py +0 -0
  407. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/config/test_library_package_guard.py +0 -0
  408. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/config/test_neutral_config.py +0 -0
  409. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/config/test_neutral_config_unknown_key.py +0 -0
  410. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/config/test_source_resolver.py +0 -0
  411. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/conformance/__init__.py +0 -0
  412. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/conformance/capabilities.py +0 -0
  413. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/conformance/conformance-expected-failures.json +0 -0
  414. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/conformance/conformance_adapter.py +0 -0
  415. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/conformance/corpus.py +0 -0
  416. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/conformance/eject_contract.py +0 -0
  417. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/conformance/expected_failures.py +0 -0
  418. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/conformance/fixture_discovery.py +0 -0
  419. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/conformance/navigator.py +0 -0
  420. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/conformance/test_conformance.py +0 -0
  421. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/conformance/test_conformance_twin_roundtrip.py +0 -0
  422. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/conformance/test_eject_contract.py +0 -0
  423. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/conformance/test_extract_object_array_bounds.py +0 -0
  424. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/conformance/test_extract_object_verdict.py +0 -0
  425. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/conformance/test_field_lint_conformance.py +0 -0
  426. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/conformance/test_fmt_conformance.py +0 -0
  427. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/conformance/test_fr010_loader_attrs.py +0 -0
  428. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/conformance/test_fr011_attrs.py +0 -0
  429. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/conformance/test_generator_registry_conformance.py +0 -0
  430. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/conformance/test_naming_conformance.py +0 -0
  431. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/conformance/test_object_model_conformance.py +0 -0
  432. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/conformance/test_provider_composition_conformance.py +0 -0
  433. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/conformance/test_registry_conformance.py +0 -0
  434. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/conformance/test_requirement_check_conformance.py +0 -0
  435. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/conformance/test_requirement_test_identity_conformance.py +0 -0
  436. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/conformance/test_runner_hardfail.py +0 -0
  437. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/conformance/test_scope_conformance.py +0 -0
  438. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/conformance/test_source_resolution_conformance.py +0 -0
  439. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/conformance/test_spec_metamodel_embed.py +0 -0
  440. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/conformance/test_strict_attr_load.py +0 -0
  441. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/conformance/test_template_codegen_conformance.py +0 -0
  442. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/conformance/test_template_generator_conformance.py +0 -0
  443. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/conformance/test_wire_conformance.py +0 -0
  444. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/conformance/test_yaml_conformance.py +0 -0
  445. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/conformance/yaml-conformance-expected-failures.json +0 -0
  446. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/integration/__init__.py +0 -0
  447. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/integration/api_contract_assertions.py +0 -0
  448. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/integration/api_contract_jsonb_server.py +0 -0
  449. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/integration/api_contract_m2m_server.py +0 -0
  450. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/integration/api_contract_server.py +0 -0
  451. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/integration/conftest.py +0 -0
  452. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/integration/corpus_config.py +0 -0
  453. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/integration/engines.py +0 -0
  454. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/integration/generated_jsonb_app.py +0 -0
  455. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/integration/generated_m2m_app.py +0 -0
  456. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/integration/generated_projection_app.py +0 -0
  457. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/integration/generated_router_app.py +0 -0
  458. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/integration/generated_tph_app.py +0 -0
  459. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/integration/meta_ai_trace.yaml +0 -0
  460. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/integration/mysql_container.py +0 -0
  461. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/integration/normalization.py +0 -0
  462. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/integration/postgres_container.py +0 -0
  463. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/integration/query_runner.py +0 -0
  464. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/integration/report_lane.py +0 -0
  465. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/integration/scenarios.py +0 -0
  466. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/integration/test_api_contract.py +0 -0
  467. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/integration/test_api_contract_decimal.py +0 -0
  468. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/integration/test_api_contract_generated.py +0 -0
  469. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/integration/test_api_contract_jsonb.py +0 -0
  470. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/integration/test_api_contract_m2m.py +0 -0
  471. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/integration/test_api_contract_m2m_generated.py +0 -0
  472. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/integration/test_api_contract_projection.py +0 -0
  473. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/integration/test_api_contract_tph_generated.py +0 -0
  474. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/integration/test_generated_decimal_wire.py +0 -0
  475. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/integration/test_generated_router_uuid_pk.py +0 -0
  476. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/integration/test_llm_call_trace.py +0 -0
  477. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/integration/test_normalization.py +0 -0
  478. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/integration/test_query_scenarios.py +0 -0
  479. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/integration/test_runtime_return_types.py +0 -0
  480. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/integration/test_tph_m2m_generated.py +0 -0
  481. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/integration/test_tph_m2m_shadowed_generated.py +0 -0
  482. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/loader/__init__.py +0 -0
  483. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/loader/test_abstract_subtype_authored.py +0 -0
  484. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/loader/test_child_wrapper_body_shape.py +0 -0
  485. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/loader/test_enum_extends_values_conflict.py +0 -0
  486. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/loader/test_field_mutability_order.py +0 -0
  487. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/loader/test_library_packages.py +0 -0
  488. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/loader/test_naming_discovery.py +0 -0
  489. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/loader/test_relative_package_multi_root.py +0 -0
  490. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/loader/test_shipped_library_ai.py +0 -0
  491. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/loader/test_template_payload_target_210.py +0 -0
  492. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/open_closed_proof_test.py +0 -0
  493. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/render/__init__.py +0 -0
  494. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/render/extract/__init__.py +0 -0
  495. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/render/extract/test_extract.py +0 -0
  496. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/render/extract/test_extract_map.py +0 -0
  497. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/render/extract/test_locate.py +0 -0
  498. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/render/extract/test_model.py +0 -0
  499. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/render/extract/test_normalize.py +0 -0
  500. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/render/extract/test_xml_forgiving_reader.py +0 -0
  501. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/render/prompt/__init__.py +0 -0
  502. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/render/prompt/test_output_format_renderer.py +0 -0
  503. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/render/test_email_document.py +0 -0
  504. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/render/test_filesystem_provider.py +0 -0
  505. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/render/test_output_format_renderer_nested.py +0 -0
  506. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/render/test_output_prompt_conformance.py +0 -0
  507. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/render/test_render_conformance.py +0 -0
  508. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/render/test_render_max_chars.py +0 -0
  509. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/render/test_render_model_payload.py +0 -0
  510. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/render/test_verify.py +0 -0
  511. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/runtime/test_constraint_errors.py +0 -0
  512. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/runtime/test_decimal_wire.py +0 -0
  513. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/runtime/test_literal_naming_sqlite.py +0 -0
  514. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/runtime/test_object_manager_currency_read.py +0 -0
  515. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/runtime/test_object_manager_dialects.py +0 -0
  516. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/runtime/test_object_manager_enum_intvaluemap.py +0 -0
  517. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/runtime/test_object_manager_report.py +0 -0
  518. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/runtime/test_object_manager_table_name.py +0 -0
  519. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/runtime/test_validation_conformance_runtime.py +0 -0
  520. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/source/__init__.py +0 -0
  521. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/source/test_fr5c_merge_attribution.py +0 -0
  522. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/source/test_fr5d_reference_resolution.py +0 -0
  523. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/source/test_fr5e_database_source_shape.py +0 -0
  524. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/source/test_json_path.py +0 -0
  525. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/source/test_semantic_diff.py +0 -0
  526. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/source/test_source_on_node.py +0 -0
  527. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/source/test_yaml_positions.py +0 -0
  528. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/test_api_docs_accuracy.py +0 -0
  529. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/test_meta_endpoint.py +0 -0
  530. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/test_report_read_model.py +0 -0
  531. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/test_report_shape.py +0 -0
  532. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/__init__.py +0 -0
  533. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_agent_context_staleness.py +0 -0
  534. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_capabilities.py +0 -0
  535. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_column_naming_strategy.py +0 -0
  536. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_common_attrs.py +0 -0
  537. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_core_types.py +0 -0
  538. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_derive_m2m_declaring_entity.py +0 -0
  539. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_effective_children_sibling_shadowing.py +0 -0
  540. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_effective_package.py +0 -0
  541. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_errors.py +0 -0
  542. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_field_enum.py +0 -0
  543. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_field_enum_intvaluemap.py +0 -0
  544. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_field_map_validation.py +0 -0
  545. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_field_uuid_dbcolumntype.py +0 -0
  546. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_file_source_id.py +0 -0
  547. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_fr016_source_name_and_kind_aliases.py +0 -0
  548. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_index_lookup.py +0 -0
  549. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_inherited_reference_binding.py +0 -0
  550. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_llm_recorder.py +0 -0
  551. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_loader.py +0 -0
  552. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_loader_bom.py +0 -0
  553. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_loader_class.py +0 -0
  554. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_merge.py +0 -0
  555. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_meta_attr.py +0 -0
  556. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_meta_data.py +0 -0
  557. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_meta_source.py +0 -0
  558. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_module_shortcuts.py +0 -0
  559. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_n2m_resolver.py +0 -0
  560. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_n2m_resolver_inherited.py +0 -0
  561. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_no_dead_config_fields.py +0 -0
  562. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_object_manager_autoset_stamping.py +0 -0
  563. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_object_manager_uuid_coercion.py +0 -0
  564. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_object_manager_write_through.py +0 -0
  565. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_one_primary_source.py +0 -0
  566. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_parser.py +0 -0
  567. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_parser_yaml.py +0 -0
  568. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_provider.py +0 -0
  569. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_provider_extension.py +0 -0
  570. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_registry.py +0 -0
  571. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_registry_completeness.py +0 -0
  572. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_registry_extend.py +0 -0
  573. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_registry_sealed.py +0 -0
  574. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_relationship_m2m_validation.py +0 -0
  575. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_relationship_references.py +0 -0
  576. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_relationship_referential_actions.py +0 -0
  577. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_reporting_accessors.py +0 -0
  578. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_reporting_validation_spine_default.py +0 -0
  579. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_resolution_key.py +0 -0
  580. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_resolve_claim.py +0 -0
  581. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_runtime_resolution_key_binding.py +0 -0
  582. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_serializer.py +0 -0
  583. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_serializer_shared_document.py +0 -0
  584. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_shared_constants.py +0 -0
  585. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_smoke.py +0 -0
  586. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_source_escapes.py +0 -0
  587. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_sources.py +0 -0
  588. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_strict_child_placement.py +0 -0
  589. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_super_resolve.py +0 -0
  590. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_template_toolcall.py +0 -0
  591. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_template_wrong_subtype_attrs.py +0 -0
  592. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_validation_attr_schema.py +0 -0
  593. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_validation_filter_values.py +0 -0
  594. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_validation_origin_195.py +0 -0
  595. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_validation_origin_paths.py +0 -0
  596. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_validation_sort_field.py +0 -0
  597. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_validation_warnings.py +0 -0
  598. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_write_coercion_arrays.py +0 -0
  599. {metaobjects-1.1.4 → metaobjects-1.2.1}/tests/unit/test_yaml_desugar.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: metaobjects
3
- Version: 1.1.4
3
+ Version: 1.2.1
4
4
  Summary: Cross-language metadata standard: declare typed entities once, generate idiomatic drift-checked code across languages — Python port.
5
5
  Project-URL: Homepage, https://metaobjects.dev
6
6
  Project-URL: Repository, https://github.com/metaobjectsdev/metaobjects
@@ -25,7 +25,7 @@ Requires-Python: >=3.11
25
25
  Requires-Dist: pyyaml>=6.0
26
26
  Provides-Extra: dev
27
27
  Requires-Dist: mypy>=1.10; extra == 'dev'
28
- Requires-Dist: pydantic>=2; extra == 'dev'
28
+ Requires-Dist: pydantic>=2.8; extra == 'dev'
29
29
  Requires-Dist: pytest-xdist>=3.6; extra == 'dev'
30
30
  Requires-Dist: pytest>=8; extra == 'dev'
31
31
  Requires-Dist: ruff>=0.6; extra == 'dev'
@@ -34,6 +34,8 @@ Requires-Dist: fastapi>=0.110; extra == 'integration'
34
34
  Requires-Dist: httpx>=0.27; extra == 'integration'
35
35
  Requires-Dist: pg8000>=1.31; extra == 'integration'
36
36
  Requires-Dist: pymysql>=1.1; extra == 'integration'
37
+ Provides-Extra: jinja
38
+ Requires-Dist: jinja2>=3.1; extra == 'jinja'
37
39
  Provides-Extra: mysql
38
40
  Requires-Dist: pymysql>=1.1; extra == 'mysql'
39
41
  Description-Content-Type: text/markdown
@@ -84,8 +86,8 @@ The primary public API is the **loader** (`load_directory` / `load_uris` /
84
86
  `load_string`, `MetaDataLoader`, `LoadResult`, `ErrorCode`, `MetaError`). The
85
87
  distribution also ships the Python implementations of the other pillars used by the CLI
86
88
  and tooling: `codegen` (Pydantic + FastAPI emit — reference generators you own:
87
- `metaobjects eject <name>` copies one into your repo), `render` (Mustache + payload-VO +
88
- verify), and `runtime` (a DB-API 2 `ObjectManager` — pg8000 / psycopg on Postgres, the standard library's `sqlite3` on SQLite, PyMySQL on MySQL 8 (`pip install metaobjects[mysql]`) — no SQLAlchemy).
89
+ `metaobjects eject <name>` copies one into your repo), `render` (Mustache, or Jinja with
90
+ `pip install metaobjects[jinja]` — ADR-0061 — + payload-VO + verify), and `runtime` (a DB-API 2 `ObjectManager` — pg8000 / psycopg on Postgres, the standard library's `sqlite3` on SQLite, PyMySQL on MySQL 8 (`pip install metaobjects[mysql]`) — no SQLAlchemy).
89
91
  Schema migrations are owned by the TypeScript `meta` CLI (ADR-0015); there is
90
92
  **no `migrate` module** in this distribution.
91
93
 
@@ -44,8 +44,8 @@ The primary public API is the **loader** (`load_directory` / `load_uris` /
44
44
  `load_string`, `MetaDataLoader`, `LoadResult`, `ErrorCode`, `MetaError`). The
45
45
  distribution also ships the Python implementations of the other pillars used by the CLI
46
46
  and tooling: `codegen` (Pydantic + FastAPI emit — reference generators you own:
47
- `metaobjects eject <name>` copies one into your repo), `render` (Mustache + payload-VO +
48
- verify), and `runtime` (a DB-API 2 `ObjectManager` — pg8000 / psycopg on Postgres, the standard library's `sqlite3` on SQLite, PyMySQL on MySQL 8 (`pip install metaobjects[mysql]`) — no SQLAlchemy).
47
+ `metaobjects eject <name>` copies one into your repo), `render` (Mustache, or Jinja with
48
+ `pip install metaobjects[jinja]` — ADR-0061 — + payload-VO + verify), and `runtime` (a DB-API 2 `ObjectManager` — pg8000 / psycopg on Postgres, the standard library's `sqlite3` on SQLite, PyMySQL on MySQL 8 (`pip install metaobjects[mysql]`) — no SQLAlchemy).
49
49
  Schema migrations are owned by the TypeScript `meta` CLI (ADR-0015); there is
50
50
  **no `migrate` module** in this distribution.
51
51
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "metaobjects"
3
- version = "1.1.4"
3
+ version = "1.2.1"
4
4
  description = "Cross-language metadata standard: declare typed entities once, generate idiomatic drift-checked code across languages — Python port."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -50,7 +50,7 @@ Issues = "https://github.com/metaobjectsdev/metaobjects/issues"
50
50
  Changelog = "https://github.com/metaobjectsdev/metaobjects/blob/main/CHANGELOG.md"
51
51
 
52
52
  [project.optional-dependencies]
53
- dev = ["pytest>=8", "pytest-xdist>=3.6", "mypy>=1.10", "ruff>=0.6", "pydantic>=2"]
53
+ dev = ["pytest>=8", "pytest-xdist>=3.6", "mypy>=1.10", "ruff>=0.6", "pydantic>=2.8"]
54
54
  # On-demand cross-language conformance suites — persistence + api-contract.
55
55
  # pg8000 is pure-python so this extra installs cleanly without native deps;
56
56
  # the persistence harness shells out to the docker CLI directly (matches the
@@ -62,6 +62,10 @@ integration = ["pg8000>=1.31", "PyMySQL>=1.1", "fastapi>=0.110", "httpx>=0.27"]
62
62
  # so like pg8000 it installs without native build dependencies. SQLite needs nothing: the
63
63
  # driver wraps the standard library's `sqlite3`.
64
64
  mysql = ["PyMySQL>=1.1"]
65
+ # Jinja templates (ADR-0061): the second template engine beside Mustache. Imported only when a
66
+ # `.jinja` / `.j2` / `.jinja2` template is rendered or checked, so a Mustache-only project
67
+ # installs nothing extra.
68
+ jinja = ["jinja2>=3.1"]
65
69
 
66
70
  [[tool.mypy.overrides]]
67
71
  # PyMySQL ships no type information.
@@ -110,9 +114,16 @@ dev = [
110
114
  # The validator-parity corpus (tests/codegen/test_validation_conformance.py)
111
115
  # imports pydantic to exercise the generated Pydantic models, so it must be here
112
116
  # or the CI `uv run pytest` collection fails with ModuleNotFoundError.
113
- "pydantic>=2",
117
+ "pydantic>=2.8",
114
118
  # ruff is the Python codegen format pass (src/metaobjects/codegen/format.py); the
115
119
  # cli-registry corpus runs codegen, so without ruff in the group `uv run pytest`
116
120
  # fails at format time with "No module named ruff".
117
121
  "ruff>=0.6",
122
+ # The generated-router mypy gate (tests/codegen/test_router_mypy_strict.py) type-checks
123
+ # the emitted FastAPI routers under `mypy --strict`. The framework those routers import
124
+ # comes from `--extra integration`, which the python lane always passes.
125
+ "mypy>=1.10",
126
+ # The Jinja engine and its conformance corpora (fixtures/jinja-*-conformance/) run in the
127
+ # default suite, so the optional `jinja` extra's dependency is in the dev group too.
128
+ "jinja2>=3.1",
118
129
  ]
@@ -21,7 +21,7 @@ Two subcommands:
21
21
  across ports):
22
22
 
23
23
  --codegen regenerate into a temp dir + diff against the committed
24
- ``--out`` tree (Python's historical default behavior).
24
+ ``--out`` tree.
25
25
  The column naming comes from ``naming.columns`` in
26
26
  ``.metaobjects/config.json`` (ADR-0058), the same setting
27
27
  ``gen`` reads, so the ``names`` generator's constants match
@@ -38,9 +38,9 @@ Two subcommands:
38
38
  migrate engine (ADR-0015), not this CLI.
39
39
 
40
40
  Combining flags runs each requested mode and aggregates the exit code
41
- (non-zero if ANY mode drifts). A bare ``verify`` keeps the historical
42
- default = ``--codegen`` (back-compat) and prints a one-line note that the
43
- explicit subverbs exist.
41
+ (non-zero if ANY mode drifts). A bare ``verify`` runs ``--codegen`` and
42
+ ``--templates`` (the cross-port default gate set) and prints a one-line
43
+ note that the explicit subverbs exist.
44
44
 
45
45
  Named ``metaobjects``, NOT ``meta``: ``meta`` is the Node schema CLI. This CLI
46
46
  intentionally has NO ``migrate`` subcommand — schema is owned by the Node
@@ -89,7 +89,7 @@ from metaobjects.requirement_check import (
89
89
  scan_requirements,
90
90
  summarise_requirements,
91
91
  )
92
- from metaobjects.codegen.config import GenConfig
92
+ from metaobjects.codegen.config import DEFAULT_API_PREFIX, GenConfig
93
93
  from metaobjects.codegen.overwrite_policy import (
94
94
  has_hash_manifest,
95
95
  is_pristine_generated,
@@ -141,6 +141,7 @@ from metaobjects.naming import (
141
141
  package_of_resolution_key,
142
142
  removed_naming_source_message,
143
143
  )
144
+ from metaobjects.render.engine import template_engine_of
144
145
  from metaobjects.render.filesystem_provider import FilesystemProvider
145
146
  from metaobjects.render.verify import (
146
147
  ERR_REQUIRED_SLOT_UNUSED,
@@ -608,12 +609,13 @@ def _load_root_from_collection(
608
609
  return result.root, []
609
610
 
610
611
 
611
- #: Trailing advice after ``gen``'s unknown-attribute warnings. ``gen`` has no strict
612
- #: flag of its own; ``verify`` is the strict door (ADR-0023), so that is what it names.
612
+ #: Trailing advice after ``gen``'s unknown-attribute warnings. ``gen`` loads leniently
613
+ #: unless ``--strict``; ``verify`` is strict by default (ADR-0023), so the line names both.
613
614
  UNKNOWN_ATTR_GEN_ADVICE = (
614
615
  "metaobjects gen loads leniently and generated anyway, but `metaobjects verify` "
615
616
  "rejects this metadata (ADR-0023): fix or remove the attribute - a typo'd one "
616
- "(`isAbstrakt`, `requird`) silently changes what is generated."
617
+ "(`isAbstrakt`, `requird`) silently changes what is generated. "
618
+ "Pass `--strict` to make `gen` refuse it too."
617
619
  )
618
620
 
619
621
 
@@ -647,13 +649,35 @@ def _print_unknown_attr_warnings(findings: list[str]) -> None:
647
649
  print(f"warning: {UNKNOWN_ATTR_GEN_ADVICE}", file=sys.stderr)
648
650
 
649
651
 
650
- def _strict_load_hint() -> str:
651
- """Actionable next-steps when strict verify rejects an undeclared @attr."""
652
+ def _print_identical_owned_notice(root: Path) -> None:
653
+ """ONE advisory line when owned generator copies are identical to the shipped ones: an
654
+ owned copy that was never edited only costs the adopter upgrades. Advisory: the exit
655
+ code is unchanged, and a project with no owned copies reads no file."""
656
+ try:
657
+ names = [e.name for e in owned.identical_owned(root)]
658
+ except Exception: # noqa: BLE001 — advisory; a packaged module that cannot be read says nothing
659
+ return
660
+ if names:
661
+ print(
662
+ f"note: owned generator copy identical to the shipped one: {', '.join(names)}. "
663
+ "Run `metaobjects eject --undo` to drop the copies and track the shipped "
664
+ "generators again.",
665
+ file=sys.stderr,
666
+ )
667
+
668
+
669
+ def _strict_load_hint(strict_flag: str = "verify") -> str:
670
+ """Actionable next-steps when a strict load rejects an undeclared @attr."""
671
+ opt_out = (
672
+ "OR drop `--strict` to keep the lenient load"
673
+ if strict_flag == "--strict"
674
+ else "OR re-run with `--lax` to keep the legacy open-attr load"
675
+ )
676
+ who = "gen --strict" if strict_flag == "--strict" else "verify"
652
677
  return (
653
- "verify is strict (ADR-0023): every authored @attr must be declared. Fix: "
678
+ f"{who} is strict (ADR-0023): every authored @attr must be declared. Fix: "
654
679
  "register the attr on a metadata provider, OR move arbitrary author-supplied "
655
- "properties into an `attr.properties` bag, OR re-run with `--lax` to keep the "
656
- "legacy open-attr load."
680
+ f"properties into an `attr.properties` bag, {opt_out}."
657
681
  )
658
682
 
659
683
 
@@ -875,6 +899,7 @@ def _run_suite(
875
899
  baseline: str = "default",
876
900
  refused_out: list[str] | None = None,
877
901
  select: Callable[[str], bool] | None = None,
902
+ api_prefix: str = DEFAULT_API_PREFIX,
878
903
  overwrite_hand_edits: frozenset[str] = frozenset(),
879
904
  overwrite_paths_out: set[str] | None = None,
880
905
  ) -> list[str]:
@@ -917,6 +942,7 @@ def _run_suite(
917
942
  emit_package_init=emit_package_init,
918
943
  gen_state_dir=gen_state_dir,
919
944
  column_naming=column_naming,
945
+ api_prefix=api_prefix,
920
946
  # Manifest keys are relative to the PROJECT, which is what the manifest is
921
947
  # anchored on — not to ``--out``, which varies per run while the manifest does
922
948
  # not. Passed alongside gen_state_dir because the two are one decision: state
@@ -1248,9 +1274,17 @@ def _cmd_fmt(args: argparse.Namespace) -> int:
1248
1274
 
1249
1275
 
1250
1276
  def _cmd_eject(args: argparse.Namespace) -> int:
1251
- """Copy reference generators into ``codegen/generators/`` to own (ADR-0034 Am. 3)."""
1277
+ """Copy reference generators into ``codegen/generators/`` to own (ADR-0034 Am. 3), or
1278
+ with ``--undo`` drop the copies that are identical to the shipped ones."""
1252
1279
  root = Path(args.root) if args.root else Path.cwd()
1253
- result = owned.eject(args.names, root, force=args.force)
1280
+ if args.undo:
1281
+ result = owned.undo(args.names, root, force=args.force)
1282
+ elif not args.names:
1283
+ print("error: name at least one generator to eject (`metaobjects gen --list` shows "
1284
+ "them), or pass --undo", file=sys.stderr)
1285
+ return 2
1286
+ else:
1287
+ result = owned.eject(args.names, root, force=args.force)
1254
1288
  for line in result.out:
1255
1289
  print(line)
1256
1290
  for line in result.err:
@@ -1258,6 +1292,57 @@ def _cmd_eject(args: argparse.Namespace) -> int:
1258
1292
  return result.code
1259
1293
 
1260
1294
 
1295
+ #: The metadata a fresh ``init`` writes: a loadable, empty model to author into.
1296
+ _INIT_METADATA = "metadata:\n package: app\n children: []\n"
1297
+
1298
+ _INIT_CONFIG = """\
1299
+ # What `metaobjects gen` generates: each target names its outDir and its generators.
1300
+ # `metaobjects gen --list` shows the catalog.
1301
+ metadata: metaobjects
1302
+ targets:
1303
+ app:
1304
+ outDir: generated
1305
+ generators: []
1306
+ """
1307
+
1308
+ _INIT_DOCS_CONFIG = """\
1309
+ docs:
1310
+ outDir: docs
1311
+ generators: [api-docs]
1312
+ """
1313
+
1314
+
1315
+ def _cmd_init(args: argparse.Namespace) -> int:
1316
+ """Scaffold ``metaobjects.config.yaml`` and the ``metaobjects/`` metadata directory.
1317
+
1318
+ Never overwrites: a file that exists is reported and left alone. ``--with-docs`` adds a
1319
+ ``docs`` target running ``api-docs``; without it no documentation generator is wired.
1320
+ """
1321
+ root = Path(args.root) if args.root else Path.cwd()
1322
+ config = _INIT_CONFIG + (_INIT_DOCS_CONFIG if args.with_docs else "")
1323
+ wrote: list[str] = []
1324
+ kept: list[str] = []
1325
+ for rel, text in (
1326
+ (_CONFIG_NAME, config),
1327
+ ("metaobjects/meta.app.yaml", _INIT_METADATA),
1328
+ ):
1329
+ path = root / rel
1330
+ if path.exists():
1331
+ kept.append(rel)
1332
+ continue
1333
+ path.parent.mkdir(parents=True, exist_ok=True)
1334
+ path.write_text(text, encoding="utf-8")
1335
+ wrote.append(rel)
1336
+ for rel in wrote:
1337
+ print(f"wrote {rel}")
1338
+ for rel in kept:
1339
+ print(f"kept {rel} (already exists)")
1340
+ if args.with_docs and _CONFIG_NAME in kept:
1341
+ print("note: add the docs target yourself: `docs: {outDir: docs, generators: [api-docs]}`")
1342
+ print("next: describe your entities in metaobjects/, then run `metaobjects gen`.")
1343
+ return 0
1344
+
1345
+
1261
1346
  def _warn_if_agent_context_stale() -> None:
1262
1347
  """Print ONE advisory line to stderr if the scaffolded agent context is stale.
1263
1348
 
@@ -1534,7 +1619,7 @@ def _run_gen_targets(
1534
1619
  written = _run_suite(
1535
1620
  root, out_dir, gens, t.entities, gen_state_dir=gen_state_dir,
1536
1621
  column_naming=column_naming, project_root=project_root, baseline=baseline,
1537
- refused_out=refused_out, select=select,
1622
+ refused_out=refused_out, select=select, api_prefix=config.api_prefix,
1538
1623
  overwrite_hand_edits=overwrite, overwrite_paths_out=overwrite_paths_out,
1539
1624
  )
1540
1625
  if spec_gens:
@@ -1542,7 +1627,7 @@ def _run_gen_targets(
1542
1627
  root, out_dir, spec_gens, t.entities, emit_package_init=False,
1543
1628
  gen_state_dir=gen_state_dir, column_naming=column_naming,
1544
1629
  project_root=project_root, baseline=baseline, refused_out=refused_out,
1545
- select=select,
1630
+ select=select, api_prefix=config.api_prefix,
1546
1631
  )
1547
1632
  except ValueError as exc: # intra-target run_gen collision → clean error
1548
1633
  errors.append(f"target '{t.name}': {exc}")
@@ -1608,17 +1693,23 @@ def _cmd_gen_config(args: argparse.Namespace) -> int:
1608
1693
  if collection is None:
1609
1694
  return 1
1610
1695
 
1696
+ # `--strict` is the load `verify` uses (ADR-0023): an unknown attribute is an error and
1697
+ # nothing is written. Without it `gen` loads leniently and only warns.
1698
+ strict = bool(getattr(args, "strict", False))
1611
1699
  unknown_attrs: list[str] = []
1612
1700
  root, load_errors = _load_root_from_collection(
1613
- collection, providers=providers, libraries=config.libraries,
1701
+ collection, strict=strict, providers=providers, libraries=config.libraries,
1614
1702
  unknown_attr_out=unknown_attrs,
1615
1703
  )
1616
1704
  if root is None:
1617
1705
  print("error: failed to load metadata:", file=sys.stderr)
1618
1706
  for msg in load_errors:
1619
1707
  print(f" {msg}", file=sys.stderr)
1708
+ if strict and any("ERR_UNKNOWN_ATTR" in m for m in load_errors):
1709
+ print(_strict_load_hint(strict_flag="--strict"), file=sys.stderr)
1620
1710
  return 1
1621
1711
  _print_unknown_attr_warnings(unknown_attrs)
1712
+ _print_identical_owned_notice(config.config_dir)
1622
1713
 
1623
1714
  template_root, templates_refusal = _template_root_for_config(args, config)
1624
1715
  if templates_refusal is not None:
@@ -1786,7 +1877,9 @@ def _relative_set(root: Path, nested: list[Path] | None = None) -> dict[str, str
1786
1877
  if p.suffix in _UNCOMPARED_SUFFIXES:
1787
1878
  continue
1788
1879
  try:
1789
- files[str(rel)] = p.read_text(encoding="utf-8")
1880
+ # Bytes, not read_text(): text mode translates \r\n and lone \r to \n, so a
1881
+ # committed CRLF file would compare equal to the LF the generator wrote.
1882
+ files[str(rel)] = p.read_bytes().decode("utf-8")
1790
1883
  except (UnicodeDecodeError, OSError):
1791
1884
  continue
1792
1885
  return files
@@ -2401,6 +2494,7 @@ def _verify_templates(args: argparse.Namespace) -> int:
2401
2494
  for e in render_verify(
2402
2495
  text, fields, provider=provider,
2403
2496
  required_slots=req_slots, required_tags=req_tags,
2497
+ engine=template_engine_of(provider, ref),
2404
2498
  ):
2405
2499
  if e.code == ERR_REQUIRED_SLOT_UNUSED:
2406
2500
  continue # an unused required slot is a warning, not drift
@@ -2668,8 +2762,11 @@ def _verify_requirements(args: argparse.Namespace, model: "_VerifyModel | None")
2668
2762
 
2669
2763
  def _cmd_verify(args: argparse.Namespace) -> int:
2670
2764
  """Subverb dispatch (ADR-0021 D2). Run each requested mode; aggregate exit =
2671
- max (non-zero if ANY mode drifts). Bare ``verify`` (no subverb) keeps the
2672
- historical default = ``--codegen`` + a one-line note advertising the subverbs.
2765
+ max (non-zero if ANY mode drifts). Bare ``verify`` (no subverb) runs the
2766
+ cross-port default gate set, ``--codegen`` + ``--templates`` (the requirement
2767
+ ledger runs on every verify) + a one-line note advertising the subverbs.
2768
+ ``--templates`` is skipped with a note when the run names no config and no
2769
+ ``--prompts`` root, since there is then no template directory to resolve.
2673
2770
  """
2674
2771
  naming_refusal = _refuse_column_naming_flag(args)
2675
2772
  if naming_refusal is not None:
@@ -2684,12 +2781,24 @@ def _cmd_verify(args: argparse.Namespace) -> int:
2684
2781
 
2685
2782
  if not any_explicit:
2686
2783
  print(
2687
- "metaobjects verify — running --codegen (default). Explicit "
2784
+ "metaobjects verify — running --codegen --templates (default). Explicit "
2688
2785
  "subverbs: --codegen (codegen drift), --templates (template/prompt "
2689
2786
  "drift), --db (schema drift — not supported in Python).",
2690
2787
  file=sys.stderr,
2691
2788
  )
2692
2789
  run_codegen = True
2790
+ if args.metadata_dir is None:
2791
+ has_template_root = _find_config(args) is not None
2792
+ else:
2793
+ has_template_root = bool(getattr(args, "templates_root", None))
2794
+ if not has_template_root:
2795
+ print(
2796
+ "metaobjects verify — template gate skipped: no metaobjects.config.yaml "
2797
+ "and no --prompts directory, so there is no template root to resolve against.",
2798
+ file=sys.stderr,
2799
+ )
2800
+ else:
2801
+ run_templates = True
2693
2802
 
2694
2803
  exit_code = 0
2695
2804
  gates_stderr = _RecordedStderr(sys.stderr)
@@ -2798,6 +2907,14 @@ def _build_parser() -> argparse.ArgumentParser:
2798
2907
  "as `templateSpec: <path>` in metaobjects.config.yaml"
2799
2908
  ),
2800
2909
  )
2910
+ gen.add_argument(
2911
+ "--strict",
2912
+ action="store_true",
2913
+ help=(
2914
+ "strict-attr load, the one `verify` uses (ADR-0023): an undeclared attribute is "
2915
+ "an error and nothing is written. Without it gen loads leniently and warns."
2916
+ ),
2917
+ )
2801
2918
  gen.add_argument(
2802
2919
  "--templates",
2803
2920
  default=None,
@@ -2850,7 +2967,7 @@ def _build_parser() -> argparse.ArgumentParser:
2850
2967
  "verify",
2851
2968
  help=(
2852
2969
  "drift gate — explicit subverbs --codegen / --templates / --db "
2853
- "(ADR-0021 D2); bare verify defaults to --codegen"
2970
+ "(ADR-0021 D2); bare verify runs --codegen and --templates"
2854
2971
  ),
2855
2972
  )
2856
2973
  verify.add_argument(
@@ -3008,38 +3125,37 @@ def _build_parser() -> argparse.ArgumentParser:
3008
3125
  "eject",
3009
3126
  help="copy reference generators into codegen/generators/ to own and edit",
3010
3127
  )
3011
- eject_p.add_argument("names", nargs="+", metavar="NAME", help="stable generator names")
3128
+ eject_p.add_argument("names", nargs="*", metavar="NAME", help="stable generator names")
3012
3129
  eject_p.add_argument("--force", action="store_true",
3013
- help="replace an existing owned copy with the reference")
3130
+ help="replace an existing owned copy with the reference "
3131
+ "(with --undo: remove a copy that differs from it)")
3132
+ eject_p.add_argument(
3133
+ "--undo", action="store_true",
3134
+ help="drop owned copies identical to the shipped generator (all of them, or the "
3135
+ "names given); a copy that differs is refused unless --force; prints the "
3136
+ "config edit, never makes it",
3137
+ )
3014
3138
  eject_p.add_argument("--root", default=None, help="project root (default: cwd)")
3015
3139
  eject_p.set_defaults(func=_cmd_eject)
3016
3140
 
3141
+ init_p = sub.add_parser(
3142
+ "init",
3143
+ help="scaffold metaobjects.config.yaml and metaobjects/ (never overwrites a file)",
3144
+ )
3145
+ init_p.add_argument("--with-docs", action="store_true",
3146
+ help="also wire the api-docs generator (a `docs` target)")
3147
+ init_p.add_argument("--root", default=None, help="project root (default: cwd)")
3148
+ init_p.set_defaults(func=_cmd_init)
3149
+
3017
3150
  agent_docs = sub.add_parser(
3018
3151
  "agent-docs",
3019
3152
  help=(
3020
- "scaffold the slim MetaObjects Claude Code agent context "
3021
- "(.metaobjects/AGENTS.md + CLAUDE.md + the metaobjects-* skills)"
3153
+ "moved to the Node CLI: run `npx meta agent-docs --server python` "
3154
+ "(this command scaffolds nothing and exits 1)"
3022
3155
  ),
3023
3156
  )
3024
- agent_docs.add_argument(
3025
- "--server",
3026
- action="append",
3027
- default=None,
3028
- metavar="LANG",
3029
- help="server language (repeatable): typescript|java|kotlin|csharp|python",
3030
- )
3031
- agent_docs.add_argument(
3032
- "--client",
3033
- action="append",
3034
- default=None,
3035
- metavar="FRAMEWORK",
3036
- help="client framework (repeatable): react|tanstack|angular",
3037
- )
3038
- agent_docs.add_argument(
3039
- "--out",
3040
- default=None,
3041
- help="output project root (default: cwd)",
3042
- )
3157
+ for ignored_flag in ("--server", "--client", "--out"):
3158
+ agent_docs.add_argument(ignored_flag, help=argparse.SUPPRESS)
3043
3159
  agent_docs.set_defaults(func=_cmd_agent_docs)
3044
3160
 
3045
3161
  return parser
@@ -36,9 +36,9 @@ The generated router takes `dto: dict[str, Any]` for `POST` / `PATCH` /
36
36
  (`from .<Entity> import <Entity>, <Entity>Patch`) and constructs them to enforce
37
37
  field constraints over HTTP — POST validates `<Entity>(**dto)`, PATCH validates
38
38
  the all-optional `<Entity>Patch(**dto)` (present values only) → `400 {"error":"validation"}`.
39
- The repository seam still receives the original `dict` (preserving the FR-035
40
- present-key tristate + wire values), so the strong-typing simplification below
41
- remains for the repo/response types; only the validation import was added.
39
+ The repository seam receives only the keys the input model validated, as a `dict`
40
+ (the FR-035 present-key tristate + wire values are kept), so the strong-typing
41
+ simplification below remains for the repo/response types.
42
42
 
43
43
  This keeps the router module decoupled from sibling generated files
44
44
  (the entity-model generator emits one `@dataclass`/Pydantic model per
@@ -16,10 +16,14 @@ entities and the colliding name.
16
16
  """
17
17
  from __future__ import annotations
18
18
 
19
- from metaobjects.apidocs.naming import pluralize
19
+ from metaobjects.apidocs.naming import pluralize, route_path
20
20
  from metaobjects.errors import ErrorCode
21
21
  from metaobjects.meta.core.object.meta_object import MetaObject
22
22
  from metaobjects.meta.core.object.object_constants import OBJECT_SUBTYPE_VALUE
23
+ from metaobjects.meta.persistence.source.meta_source import MetaSource
24
+ from metaobjects.runtime.tph import tph_subtype_of
25
+
26
+ from .instance_artifacts import is_abstract
23
27
 
24
28
  ERR_COLLECTION_NAME_COLLISION = ErrorCode.ERR_COLLECTION_NAME_COLLISION.value
25
29
 
@@ -56,3 +60,31 @@ def assert_no_collection_name_collisions(entities: list[MetaObject]) -> None:
56
60
  )
57
61
  else:
58
62
  owner_of_plural[plural] = obj
63
+ _assert_no_route_segment_collisions(entities)
64
+
65
+
66
+ def _assert_no_route_segment_collisions(entities: list[MetaObject]) -> None:
67
+ """The route half. The REST segment is the entity NAME snake_cased and then
68
+ pluralized (:func:`route_path`), so ``ApiKey`` and ``APIKey`` both serve
69
+ ``/api_keys`` while their pluralized names differ and pass the check above.
70
+ Counts only objects that actually get a route: not a value object, not abstract,
71
+ not sourceless, not a TPH subtype (folded into its base and served under it)."""
72
+ owner_of_segment: dict[str, MetaObject] = {}
73
+ for obj in entities:
74
+ if obj.sub_type == OBJECT_SUBTYPE_VALUE or is_abstract(obj):
75
+ continue
76
+ # ADR-0039: children() resolves — an inherited source still gets a route.
77
+ if not any(isinstance(c, MetaSource) for c in obj.children()):
78
+ continue
79
+ if tph_subtype_of(obj) is not None:
80
+ continue
81
+ segment = route_path(obj.name)
82
+ existing = owner_of_segment.get(segment)
83
+ if existing is None:
84
+ owner_of_segment[segment] = obj
85
+ elif existing.resolution_key() != obj.resolution_key():
86
+ raise ValueError(
87
+ f'{ERR_COLLECTION_NAME_COLLISION}: "{existing.name}" and "{obj.name}" both resolve '
88
+ f'to the REST collection segment "{segment}" — rename one entity so its '
89
+ "snake_cased, pluralized route segment is distinct."
90
+ )
@@ -5,6 +5,9 @@ from dataclasses import dataclass, field
5
5
 
6
6
  from metaobjects.naming import DEFAULT_COLUMN_NAMING
7
7
 
8
+ #: What generated routers mount under when no ``apiPrefix`` is configured.
9
+ DEFAULT_API_PREFIX = "/api"
10
+
8
11
 
9
12
  @dataclass
10
13
  class GenConfig:
@@ -54,6 +57,11 @@ class GenConfig:
54
57
  # constant this generator emits names a different column than the one a row
55
58
  # actually lands in.
56
59
  column_naming: str = DEFAULT_COLUMN_NAMING
60
+ # The path the generated routers mount under (and the api docs name): ``/api/authors``
61
+ # by default, ``/v1/authors`` for ``/v1``, ``/authors`` for ``""``. The CLI fills it from
62
+ # ``apiPrefix`` in ``metaobjects.config.yaml``, the Python spelling of the TypeScript
63
+ # config's key of the same name.
64
+ api_prefix: str = DEFAULT_API_PREFIX
57
65
  # First-time-on-existing-file behaviour. "default" refuses a file that cannot be
58
66
  # proved to be generated output; "adopt" records what is on disk as the baseline and
59
67
  # writes nothing — the one run a project with no committed manifest can perform (the