metaobjects 1.0.4__tar.gz → 1.0.5__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 (477) hide show
  1. {metaobjects-1.0.4 → metaobjects-1.0.5}/PKG-INFO +1 -1
  2. {metaobjects-1.0.4 → metaobjects-1.0.5}/pyproject.toml +1 -1
  3. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/__init__.py +6 -0
  4. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/apidocs/builder.py +28 -45
  5. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/apidocs/naming.py +66 -33
  6. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/cli.py +247 -41
  7. metaobjects-1.0.5/src/metaobjects/codegen/collision_names.py +33 -0
  8. metaobjects-1.0.5/src/metaobjects/codegen/eject.py +168 -0
  9. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/extract_delegate_emitter.py +43 -107
  10. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/generator_registry.py +112 -29
  11. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/generators/entity_model.py +108 -18
  12. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/generators/extractor_generator.py +72 -142
  13. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/generators/filter_allowlist_generator.py +13 -19
  14. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/generators/find_inbound.py +2 -2
  15. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/generators/m2m_codegen.py +25 -9
  16. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/generators/output_parser_generator.py +29 -62
  17. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/generators/output_prompt_generator.py +9 -20
  18. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/generators/render_helper_generator.py +52 -53
  19. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/generators/router_generator.py +526 -90
  20. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/generators/trace_helper_generator.py +2 -15
  21. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/runner.py +15 -1
  22. metaobjects-1.0.5/src/metaobjects/codegen/runtime/constraint_errors.py +151 -0
  23. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/runtime/filter_parser.py +10 -6
  24. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/type_map.py +13 -11
  25. metaobjects-1.0.5/src/metaobjects/codegen/value_objects.py +220 -0
  26. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/config/dependencies.py +7 -0
  27. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/config/neutral_config.py +45 -0
  28. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/config/source_resolver.py +7 -4
  29. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/errors.py +5 -0
  30. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/library/embedded_library.py +1 -1
  31. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/loader/validation_passes.py +155 -0
  32. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/relationship/derive_m2m_fields.py +74 -55
  33. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/requirement/requirement_constants.py +4 -2
  34. metaobjects-1.0.5/src/metaobjects/meta_endpoint.py +30 -0
  35. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/parser.py +85 -4
  36. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/payload_accessors.py +10 -0
  37. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/runtime/object_manager.py +13 -4
  38. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/spec_metamodel/requirement.json +2 -2
  39. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/gen_suite.py +6 -4
  40. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_cli_registry.py +31 -2
  41. metaobjects-1.0.5/tests/codegen/test_cli_render_helper_template_root.py +228 -0
  42. metaobjects-1.0.5/tests/codegen/test_codegen_compile_conformance.py +192 -0
  43. metaobjects-1.0.5/tests/codegen/test_eject.py +145 -0
  44. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_extract_tier_collision.py +51 -58
  45. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_extractor_generator.py +100 -60
  46. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_filter_allowlist_generator.py +29 -5
  47. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_fr010_output_codegen.py +8 -26
  48. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_gen_state_keying.py +34 -0
  49. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_m2m_codegen.py +35 -17
  50. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_no_magic_physical_names.py +2 -2
  51. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_output_parser_generator.py +22 -19
  52. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_projection_compile.py +33 -4
  53. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_render_helper_conformance.py +48 -40
  54. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_render_helper_generator.py +35 -13
  55. metaobjects-1.0.5/tests/codegen/test_route_path_naming.py +67 -0
  56. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_router_generator.py +126 -5
  57. metaobjects-1.0.5/tests/codegen/test_router_generator_m2m_target_tph.py +156 -0
  58. metaobjects-1.0.5/tests/codegen/test_router_generator_tph_m2m.py +378 -0
  59. metaobjects-1.0.5/tests/codegen/test_router_generator_tph_m2m_shadowed.py +205 -0
  60. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_tph_codegen.py +12 -0
  61. metaobjects-1.0.5/tests/codegen/test_value_objects.py +104 -0
  62. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/config/test_dependencies.py +1 -1
  63. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/config/test_neutral_config.py +38 -0
  64. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/test_generator_registry_conformance.py +5 -3
  65. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/api_contract_assertions.py +11 -1
  66. metaobjects-1.0.5/tests/integration/api_contract_m2m_server.py +424 -0
  67. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/api_contract_server.py +18 -11
  68. metaobjects-1.0.5/tests/integration/generated_m2m_app.py +562 -0
  69. metaobjects-1.0.5/tests/integration/generated_projection_app.py +194 -0
  70. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/generated_router_app.py +36 -25
  71. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/generated_tph_app.py +4 -2
  72. metaobjects-1.0.5/tests/integration/test_api_contract_projection.py +115 -0
  73. metaobjects-1.0.5/tests/integration/test_m2m_target_tph_generated.py +291 -0
  74. metaobjects-1.0.5/tests/integration/test_tph_m2m_generated.py +420 -0
  75. metaobjects-1.0.5/tests/integration/test_tph_m2m_shadowed_generated.py +358 -0
  76. metaobjects-1.0.5/tests/loader/test_child_wrapper_body_shape.py +117 -0
  77. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/loader/test_shipped_library_ai.py +64 -0
  78. metaobjects-1.0.5/tests/render/test_render_model_payload.py +53 -0
  79. metaobjects-1.0.5/tests/runtime/test_constraint_errors.py +107 -0
  80. metaobjects-1.0.5/tests/runtime/test_object_manager_currency_read.py +63 -0
  81. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/test_api_docs_accuracy.py +5 -5
  82. metaobjects-1.0.5/tests/test_meta_endpoint.py +69 -0
  83. {metaobjects-1.0.4 → metaobjects-1.0.5}/uv.lock +1 -1
  84. metaobjects-1.0.4/src/metaobjects/codegen/collision_names.py +0 -110
  85. metaobjects-1.0.4/src/metaobjects/codegen/generators/payload_vo_generator.py +0 -798
  86. metaobjects-1.0.4/tests/codegen/test_payload_vo_generator.py +0 -810
  87. metaobjects-1.0.4/tests/integration/api_contract_m2m_server.py +0 -220
  88. metaobjects-1.0.4/tests/integration/generated_m2m_app.py +0 -220
  89. {metaobjects-1.0.4 → metaobjects-1.0.5}/.gitignore +0 -0
  90. {metaobjects-1.0.4 → metaobjects-1.0.5}/LICENSE +0 -0
  91. {metaobjects-1.0.4 → metaobjects-1.0.5}/README.md +0 -0
  92. {metaobjects-1.0.4 → metaobjects-1.0.5}/hatch_build.py +0 -0
  93. {metaobjects-1.0.4 → metaobjects-1.0.5}/scripts/generate_embedded_library.py +0 -0
  94. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/agent_context/__init__.py +0 -0
  95. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/agent_context/scaffold.py +0 -0
  96. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/apidocs/__init__.py +0 -0
  97. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/apidocs/api_model.py +0 -0
  98. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/apidocs/paths.py +0 -0
  99. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/apidocs/renderer.py +0 -0
  100. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/attr_class_map.py +0 -0
  101. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/KNOWN_GAPS.md +0 -0
  102. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/__init__.py +0 -0
  103. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/config.py +0 -0
  104. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/constants.py +0 -0
  105. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/extract_schema_emitter.py +0 -0
  106. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/format.py +0 -0
  107. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/fr010_field_mapping.py +0 -0
  108. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/generator.py +0 -0
  109. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/generators/__init__.py +0 -0
  110. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/generators/fr019_shared_enum.py +0 -0
  111. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/generators/names_generator.py +0 -0
  112. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/generators/template_generator.py +0 -0
  113. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/generators/tph_plan.py +0 -0
  114. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/instance_artifacts.py +0 -0
  115. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/metaobjects-config.schema.json +0 -0
  116. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/output_format_spec_emitter.py +0 -0
  117. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/overwrite_policy.py +0 -0
  118. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/project_config.py +0 -0
  119. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/runtime/__init__.py +0 -0
  120. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/template_codegen/__init__.py +0 -0
  121. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/template_codegen/output_pattern.py +0 -0
  122. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/template_codegen/template_data.py +0 -0
  123. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/template_codegen/template_spec.py +0 -0
  124. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/config/__init__.py +0 -0
  125. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/core_types.py +0 -0
  126. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/datatype.py +0 -0
  127. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/documentation/__init__.py +0 -0
  128. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/documentation/doc_constants.py +0 -0
  129. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/documentation/doc_provider.py +0 -0
  130. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/documentation/doc_schema.py +0 -0
  131. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/library/__init__.py +0 -0
  132. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/library/library_sources.py +0 -0
  133. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/loader/__init__.py +0 -0
  134. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/loader/merge.py +0 -0
  135. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/loader/meta_data_loader.py +0 -0
  136. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/loader/registered_validation.py +0 -0
  137. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/loader/sources/__init__.py +0 -0
  138. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/loader/sources/directory_source.py +0 -0
  139. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/loader/sources/file_source.py +0 -0
  140. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/loader/sources/meta_data_source.py +0 -0
  141. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/loader/sources/uri_source.py +0 -0
  142. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/loader/validate_discriminator.py +0 -0
  143. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/loader/validate_enum_normalize_ambiguity.py +0 -0
  144. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/loader/validate_field_mutability.py +0 -0
  145. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/loader/validate_source_escapes.py +0 -0
  146. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/loader/validate_source_parameter_ref.py +0 -0
  147. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/loader/validate_source_physical_names.py +0 -0
  148. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/__init__.py +0 -0
  149. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/__init__.py +0 -0
  150. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/attr/__init__.py +0 -0
  151. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/attr/attr_constants.py +0 -0
  152. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/attr/meta_attr.py +0 -0
  153. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/field/__init__.py +0 -0
  154. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/field/field_constants.py +0 -0
  155. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/field/meta_field.py +0 -0
  156. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/identity/__init__.py +0 -0
  157. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/identity/identity_constants.py +0 -0
  158. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/identity/meta_identity.py +0 -0
  159. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/index/__init__.py +0 -0
  160. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/index/index_constants.py +0 -0
  161. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/index/meta_index.py +0 -0
  162. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/object/__init__.py +0 -0
  163. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/object/meta_object.py +0 -0
  164. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/object/meta_object_aware.py +0 -0
  165. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/object/object_class_registry.py +0 -0
  166. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/object/object_constants.py +0 -0
  167. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/object/object_extract.py +0 -0
  168. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/object/value_object.py +0 -0
  169. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/relationship/__init__.py +0 -0
  170. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/relationship/meta_relationship.py +0 -0
  171. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/relationship/relationship_constants.py +0 -0
  172. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/relationship/relationship_references.py +0 -0
  173. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/requirement/__init__.py +0 -0
  174. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/requirement/meta_requirement.py +0 -0
  175. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/validator/__init__.py +0 -0
  176. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/validator/validator_constants.py +0 -0
  177. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/meta_data.py +0 -0
  178. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/meta_root.py +0 -0
  179. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/persistence/__init__.py +0 -0
  180. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/persistence/db/__init__.py +0 -0
  181. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/persistence/db/db_constants.py +0 -0
  182. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/persistence/db/db_provider.py +0 -0
  183. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/persistence/origin/__init__.py +0 -0
  184. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/persistence/origin/meta_origin.py +0 -0
  185. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/persistence/origin/origin_constants.py +0 -0
  186. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/persistence/source/__init__.py +0 -0
  187. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/persistence/source/meta_source.py +0 -0
  188. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/persistence/source/source_constants.py +0 -0
  189. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/presentation/__init__.py +0 -0
  190. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/presentation/layout/__init__.py +0 -0
  191. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/presentation/layout/layout_constants.py +0 -0
  192. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/presentation/layout/meta_layout.py +0 -0
  193. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/presentation/ui/__init__.py +0 -0
  194. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/presentation/ui/ui_provider.py +0 -0
  195. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/presentation/view/__init__.py +0 -0
  196. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/presentation/view/meta_view.py +0 -0
  197. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/presentation/view/view_constants.py +0 -0
  198. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/provider_extends.py +0 -0
  199. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/template/__init__.py +0 -0
  200. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/template/meta_template.py +0 -0
  201. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/template/prompt_provider.py +0 -0
  202. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/template/template_constants.py +0 -0
  203. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/naming.py +0 -0
  204. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/naming_refs.py +0 -0
  205. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/parser_yaml.py +0 -0
  206. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/provider.py +0 -0
  207. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/py.typed +0 -0
  208. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/registry.py +0 -0
  209. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/registry_manifest.py +0 -0
  210. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/__init__.py +0 -0
  211. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/email_document.py +0 -0
  212. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/escapers.py +0 -0
  213. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/extract/KNOWN_GAPS.md +0 -0
  214. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/extract/__init__.py +0 -0
  215. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/extract/coerce.py +0 -0
  216. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/extract/extract.py +0 -0
  217. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/extract/extract_map.py +0 -0
  218. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/extract/json_forgiving_reader.py +0 -0
  219. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/extract/locate.py +0 -0
  220. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/extract/normalize.py +0 -0
  221. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/extract/strip.py +0 -0
  222. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/extract/types.py +0 -0
  223. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/extract/xml_forgiving_reader.py +0 -0
  224. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/filesystem_provider.py +0 -0
  225. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/prompt/__init__.py +0 -0
  226. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/prompt/output_format_renderer.py +0 -0
  227. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/prompt/output_format_spec.py +0 -0
  228. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/prompt/prompt_field.py +0 -0
  229. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/prompt/prompt_overrides.py +0 -0
  230. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/prompt/prompt_style.py +0 -0
  231. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/renderer.py +0 -0
  232. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/verify.py +0 -0
  233. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/runtime/__init__.py +0 -0
  234. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/runtime/llm_recorder.py +0 -0
  235. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/runtime/n2m_resolver.py +0 -0
  236. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/runtime/tph.py +0 -0
  237. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/scope.py +0 -0
  238. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/serializer_json.py +0 -0
  239. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/shared/__init__.py +0 -0
  240. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/shared/base_types.py +0 -0
  241. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/shared/separators.py +0 -0
  242. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/shared/structural.py +0 -0
  243. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/source/__init__.py +0 -0
  244. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/source/error_source.py +0 -0
  245. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/source/json_path.py +0 -0
  246. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/source/semantic_diff.py +0 -0
  247. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/source/yaml_positions.py +0 -0
  248. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/source_resolution.py +0 -0
  249. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/spec_metamodel/__init__.py +0 -0
  250. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/spec_metamodel/attr.json +0 -0
  251. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/spec_metamodel/db.json +0 -0
  252. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/spec_metamodel/documentation.json +0 -0
  253. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/spec_metamodel/field.json +0 -0
  254. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/spec_metamodel/identity.json +0 -0
  255. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/spec_metamodel/index.json +0 -0
  256. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/spec_metamodel/layout.json +0 -0
  257. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/spec_metamodel/object.json +0 -0
  258. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/spec_metamodel/origin.json +0 -0
  259. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/spec_metamodel/prompt.json +0 -0
  260. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/spec_metamodel/relationship.json +0 -0
  261. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/spec_metamodel/source.json +0 -0
  262. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/spec_metamodel/template.json +0 -0
  263. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/spec_metamodel/ui-web.json +0 -0
  264. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/spec_metamodel/ui.json +0 -0
  265. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/spec_metamodel/validator.json +0 -0
  266. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/spec_metamodel/view.json +0 -0
  267. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/super_resolve.py +0 -0
  268. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/validation_types.py +0 -0
  269. {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/yaml_desugar.py +0 -0
  270. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/__init__.py +0 -0
  271. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/__init__.py +0 -0
  272. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/golden/extends/expected/BaseEntity.py +0 -0
  273. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/golden/extends/expected/Program.py +0 -0
  274. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/golden/extends/meta.json +0 -0
  275. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/golden/nested-array/expected/AuthorBrief.py +0 -0
  276. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/golden/nested-array/expected/PostBrief.py +0 -0
  277. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/golden/nested-array/meta.json +0 -0
  278. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/golden/scalars/expected/Metric.py +0 -0
  279. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/golden/scalars/expected/Report.py +0 -0
  280. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/golden/scalars/meta.json +0 -0
  281. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/golden/vanilla/expected/Subscriber.py +0 -0
  282. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/golden/vanilla/meta.json +0 -0
  283. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_abstract_conformance.py +0 -0
  284. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_api_docs_builder.py +0 -0
  285. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_api_docs_paths.py +0 -0
  286. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_cli.py +0 -0
  287. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_cli_config_gen.py +0 -0
  288. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_cli_config_verify.py +0 -0
  289. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_cli_dependencies.py +0 -0
  290. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_cli_providers.py +0 -0
  291. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_cli_staleness_nudge.py +0 -0
  292. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_cli_verify_strict.py +0 -0
  293. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_cli_verify_subverbs.py +0 -0
  294. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_constants_config.py +0 -0
  295. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_entity_model.py +0 -0
  296. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_enum_conformance.py +0 -0
  297. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_extends_abstract_field_inheritance.py +0 -0
  298. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_format.py +0 -0
  299. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_fr010_nested_object_prompt.py +0 -0
  300. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_fr019_shared_provided_conformance.py +0 -0
  301. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_generator.py +0 -0
  302. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_generator_extension_seams.py +0 -0
  303. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_golden.py +0 -0
  304. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_inherit_without_restate_gate.py +0 -0
  305. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_inheritance_conformance.py +0 -0
  306. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_instance_artifacts.py +0 -0
  307. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_names_extends_chain.py +0 -0
  308. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_names_generator.py +0 -0
  309. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_origin_nullability.py +0 -0
  310. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_overwrite_policy.py +0 -0
  311. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_overwrite_policy_hash.py +0 -0
  312. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_project_config.py +0 -0
  313. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_reverse_finders.py +0 -0
  314. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_router_autoset.py +0 -0
  315. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_runner.py +0 -0
  316. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_source_resolution.py +0 -0
  317. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_sourceless_projection.py +0 -0
  318. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_template_data.py +0 -0
  319. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_template_generator.py +0 -0
  320. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_template_output_pattern.py +0 -0
  321. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_template_scope_helpers.py +0 -0
  322. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_template_scope_walk.py +0 -0
  323. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_template_spec.py +0 -0
  324. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_trace_helper_generator.py +0 -0
  325. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_type_map.py +0 -0
  326. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_validation_conformance.py +0 -0
  327. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_write_through.py +0 -0
  328. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/config/__init__.py +0 -0
  329. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/config/test_library_package_guard.py +0 -0
  330. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/config/test_source_resolver.py +0 -0
  331. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/__init__.py +0 -0
  332. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/capabilities.py +0 -0
  333. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/conformance-expected-failures.json +0 -0
  334. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/conformance_adapter.py +0 -0
  335. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/corpus.py +0 -0
  336. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/expected_failures.py +0 -0
  337. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/fixture_discovery.py +0 -0
  338. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/navigator.py +0 -0
  339. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/test_api_docs_cross_port_conformance.py +0 -0
  340. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/test_conformance.py +0 -0
  341. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/test_dependency_conformance.py +0 -0
  342. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/test_extract_conformance.py +0 -0
  343. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/test_extract_object_verdict.py +0 -0
  344. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/test_fr010_loader_attrs.py +0 -0
  345. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/test_fr011_attrs.py +0 -0
  346. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/test_object_model_conformance.py +0 -0
  347. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/test_provider_composition_conformance.py +0 -0
  348. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/test_registry_conformance.py +0 -0
  349. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/test_runner_hardfail.py +0 -0
  350. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/test_scope_conformance.py +0 -0
  351. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/test_source_resolution_conformance.py +0 -0
  352. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/test_spec_metamodel_embed.py +0 -0
  353. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/test_strict_attr_load.py +0 -0
  354. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/test_template_codegen_conformance.py +0 -0
  355. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/test_template_generator_conformance.py +0 -0
  356. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/test_yaml_conformance.py +0 -0
  357. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/yaml-conformance-expected-failures.json +0 -0
  358. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/__init__.py +0 -0
  359. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/api_contract_jsonb_server.py +0 -0
  360. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/generated_jsonb_app.py +0 -0
  361. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/meta_ai_trace.yaml +0 -0
  362. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/normalization.py +0 -0
  363. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/postgres_container.py +0 -0
  364. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/query_runner.py +0 -0
  365. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/scenarios.py +0 -0
  366. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/test_api_contract.py +0 -0
  367. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/test_api_contract_generated.py +0 -0
  368. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/test_api_contract_jsonb.py +0 -0
  369. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/test_api_contract_m2m.py +0 -0
  370. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/test_api_contract_m2m_generated.py +0 -0
  371. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/test_api_contract_tph_generated.py +0 -0
  372. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/test_generated_router_uuid_pk.py +0 -0
  373. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/test_llm_call_trace.py +0 -0
  374. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/test_normalization.py +0 -0
  375. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/test_query_scenarios.py +0 -0
  376. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/test_runtime_return_types.py +0 -0
  377. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/loader/__init__.py +0 -0
  378. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/loader/test_abstract_subtype_authored.py +0 -0
  379. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/loader/test_enum_extends_values_conflict.py +0 -0
  380. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/loader/test_field_mutability_order.py +0 -0
  381. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/loader/test_template_payload_target_210.py +0 -0
  382. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/open_closed_proof_test.py +0 -0
  383. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/render/__init__.py +0 -0
  384. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/render/extract/__init__.py +0 -0
  385. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/render/extract/test_coerce.py +0 -0
  386. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/render/extract/test_extract.py +0 -0
  387. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/render/extract/test_extract_map.py +0 -0
  388. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/render/extract/test_json_forgiving_reader.py +0 -0
  389. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/render/extract/test_locate.py +0 -0
  390. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/render/extract/test_model.py +0 -0
  391. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/render/extract/test_normalize.py +0 -0
  392. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/render/extract/test_strip.py +0 -0
  393. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/render/extract/test_xml_forgiving_reader.py +0 -0
  394. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/render/prompt/__init__.py +0 -0
  395. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/render/prompt/test_output_format_renderer.py +0 -0
  396. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/render/test_email_document.py +0 -0
  397. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/render/test_filesystem_provider.py +0 -0
  398. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/render/test_output_format_renderer_nested.py +0 -0
  399. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/render/test_output_prompt_conformance.py +0 -0
  400. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/render/test_render_conformance.py +0 -0
  401. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/render/test_render_max_chars.py +0 -0
  402. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/render/test_verify.py +0 -0
  403. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/render/test_verify_conformance.py +0 -0
  404. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/runtime/test_object_manager_enum_intvaluemap.py +0 -0
  405. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/runtime/test_object_manager_table_name.py +0 -0
  406. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/source/__init__.py +0 -0
  407. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/source/test_fr5c_merge_attribution.py +0 -0
  408. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/source/test_fr5d_reference_resolution.py +0 -0
  409. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/source/test_fr5e_database_source_shape.py +0 -0
  410. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/source/test_json_path.py +0 -0
  411. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/source/test_semantic_diff.py +0 -0
  412. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/source/test_source_on_node.py +0 -0
  413. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/source/test_yaml_positions.py +0 -0
  414. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/__init__.py +0 -0
  415. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_agent_context_staleness.py +0 -0
  416. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_capabilities.py +0 -0
  417. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_column_naming_strategy.py +0 -0
  418. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_common_attrs.py +0 -0
  419. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_core_types.py +0 -0
  420. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_derive_m2m_declaring_entity.py +0 -0
  421. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_effective_children_sibling_shadowing.py +0 -0
  422. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_effective_package.py +0 -0
  423. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_errors.py +0 -0
  424. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_field_enum.py +0 -0
  425. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_field_enum_intvaluemap.py +0 -0
  426. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_field_map_validation.py +0 -0
  427. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_field_uuid_dbcolumntype.py +0 -0
  428. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_file_source_id.py +0 -0
  429. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_fr016_source_name_and_kind_aliases.py +0 -0
  430. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_index_lookup.py +0 -0
  431. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_llm_recorder.py +0 -0
  432. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_loader.py +0 -0
  433. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_loader_bom.py +0 -0
  434. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_loader_class.py +0 -0
  435. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_merge.py +0 -0
  436. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_meta_attr.py +0 -0
  437. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_meta_data.py +0 -0
  438. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_meta_source.py +0 -0
  439. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_module_shortcuts.py +0 -0
  440. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_n2m_resolver.py +0 -0
  441. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_n2m_resolver_inherited.py +0 -0
  442. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_no_dead_config_fields.py +0 -0
  443. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_object_manager_autoset_stamping.py +0 -0
  444. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_object_manager_uuid_coercion.py +0 -0
  445. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_object_manager_write_through.py +0 -0
  446. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_one_primary_source.py +0 -0
  447. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_parser.py +0 -0
  448. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_parser_yaml.py +0 -0
  449. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_provider.py +0 -0
  450. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_provider_extension.py +0 -0
  451. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_registry.py +0 -0
  452. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_registry_completeness.py +0 -0
  453. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_registry_extend.py +0 -0
  454. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_registry_sealed.py +0 -0
  455. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_relationship_m2m_validation.py +0 -0
  456. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_relationship_references.py +0 -0
  457. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_relationship_referential_actions.py +0 -0
  458. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_resolution_key.py +0 -0
  459. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_runtime_resolution_key_binding.py +0 -0
  460. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_serializer.py +0 -0
  461. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_serializer_shared_document.py +0 -0
  462. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_shared_constants.py +0 -0
  463. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_smoke.py +0 -0
  464. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_source_escapes.py +0 -0
  465. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_sources.py +0 -0
  466. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_strict_child_placement.py +0 -0
  467. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_super_resolve.py +0 -0
  468. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_template_toolcall.py +0 -0
  469. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_template_wrong_subtype_attrs.py +0 -0
  470. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_validation_attr_schema.py +0 -0
  471. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_validation_filter_values.py +0 -0
  472. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_validation_origin_195.py +0 -0
  473. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_validation_origin_paths.py +0 -0
  474. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_validation_sort_field.py +0 -0
  475. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_validation_warnings.py +0 -0
  476. {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_write_coercion_arrays.py +0 -0
  477. {metaobjects-1.0.4 → metaobjects-1.0.5}/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.0.4
3
+ Version: 1.0.5
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.4"
3
+ version = "1.0.5"
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"
@@ -35,7 +35,9 @@ from .meta.core.object.object_extract import (
35
35
  extract_schema_for,
36
36
  )
37
37
  from .meta.core.object.value_object import ValueObject
38
+ from .meta_endpoint import META_ROUTE_PATH, meta_json
38
39
  from .naming import resolve_column_name
40
+ from .serializer_json import canonical_serialize_effective
39
41
 
40
42
  # Module-level shortcuts: the 99% case for callers who don't need a
41
43
  # long-lived loader. Signatures + docstrings come straight from the
@@ -60,6 +62,10 @@ __all__ = [
60
62
  "load_uris",
61
63
  "load_string",
62
64
  "resolve_column_name",
65
+ # UI-1 — the metadata API contract (GET /_meta)
66
+ "META_ROUTE_PATH",
67
+ "meta_json",
68
+ "canonical_serialize_effective",
63
69
  # Runtime object model (Phase A)
64
70
  "ValueObject",
65
71
  "MetaObjectAware",
@@ -43,10 +43,7 @@ from metaobjects.codegen.generators.m2m_codegen import (
43
43
  resolve_m2m_descriptors,
44
44
  )
45
45
  from metaobjects.codegen.generators.find_inbound import is_xml, response_shape
46
- from metaobjects.codegen.generators.payload_vo_generator import (
47
- is_field_required,
48
- resolve_payload_vo,
49
- )
46
+ from metaobjects.codegen.value_objects import is_field_required, pkg_of, resolve_payload_vo
50
47
  from metaobjects.codegen.generators.tph_plan import is_tph_subtype
51
48
  from metaobjects.codegen.instance_artifacts import emits_instance_artifacts, is_abstract
52
49
  from metaobjects.source_resolution import primary_rdb_source
@@ -58,19 +55,6 @@ from metaobjects.meta.meta_data import MetaData
58
55
  from metaobjects.meta.persistence.source.source_constants import SOURCE_KIND_TABLE
59
56
  from metaobjects.meta.template import template_constants as tc
60
57
  from metaobjects.shared.base_types import TYPE_OBJECT, TYPE_TEMPLATE
61
- from metaobjects.shared.separators import PACKAGE_SEP
62
-
63
-
64
- def _pkg_of(node: MetaData) -> str:
65
- """The effective package of a node — its ``resolution_key()`` minus the
66
- trailing ``::<name>`` ("" for a root-level node). Duplicated (not imported) to
67
- match the existing per-generator convention. Used to derive a template's
68
- referrer package for ``resolve_payload_vo`` (#228) — see that function's
69
- docstring for why this ancestor-walk-aware form is used instead of the
70
- loader's bare ``tpl.package or tpl.file_default_package or ""``."""
71
- key = node.resolution_key()
72
- i = key.rfind(PACKAGE_SEP)
73
- return "" if i == -1 else key[:i]
74
58
 
75
59
 
76
60
  # ---------------------------------------------------------------------------
@@ -105,7 +89,7 @@ def _payload_resolves(tmpl: MetaData, root: MetaData) -> MetaObject | None:
105
89
  return None
106
90
  # ADR-0042 (#228): the referrer is THIS template — a bare @payloadRef resolves
107
91
  # in ITS OWN package first.
108
- return resolve_payload_vo(root, payload_ref, _pkg_of(tmpl))
92
+ return resolve_payload_vo(root, payload_ref, pkg_of(tmpl))
109
93
 
110
94
 
111
95
  def _is_email_kind(tmpl: MetaData) -> bool:
@@ -160,12 +144,12 @@ class PythonApiModelBuilder:
160
144
  # MODEL — only for concrete objects (an abstract object cannot be
161
145
  # instantiated → documented ⊆ generated). A value object → MODEL only.
162
146
  if not is_abstract(obj):
163
- model = naming.model_class_name(obj.name)
147
+ model = naming.model_class_name(obj)
164
148
  symbols.append(
165
149
  ApiSymbol(
166
150
  name=model,
167
151
  kind=ApiSymbolKind.MODEL,
168
- module=f"from .{module} import {model}",
152
+ module=naming.model_import(obj),
169
153
  signature=f"class {model}(BaseModel)",
170
154
  usage=(
171
155
  "the Pydantic v2 entity model"
@@ -178,12 +162,12 @@ class PythonApiModelBuilder:
178
162
  if entity and _is_writable_table_entity(obj, object_index):
179
163
  # VALIDATION — the Pydantic field constraints carried on the model
180
164
  # (required / max-length / range / pattern). Names the model class.
181
- model = naming.model_class_name(obj.name)
165
+ model = naming.model_class_name(obj)
182
166
  symbols.append(
183
167
  ApiSymbol(
184
168
  name=model,
185
169
  kind=ApiSymbolKind.VALIDATION,
186
- module=f"from .{module} import {model}",
170
+ module=naming.model_import(obj),
187
171
  signature=f"class {model}(BaseModel)",
188
172
  usage="Pydantic field validation on the create/update shape",
189
173
  fields=self._model_fields(obj),
@@ -285,15 +269,14 @@ class PythonApiModelBuilder:
285
269
  payload_vo = _payload_resolves(tmpl, root)
286
270
 
287
271
  if payload_vo is not None:
288
- # PAYLOAD — the typed Pydantic record for the shape this template RENDERS.
289
- payload_class = naming.payload_class_name(name)
272
+ # PAYLOAD — the shape this template RENDERS. ADR-0056: it IS the @payloadRef
273
+ # value object's own model, emitted by the entity generator.
274
+ payload_class = naming.model_class_name(payload_vo)
290
275
  symbols.append(
291
276
  ApiSymbol(
292
277
  name=payload_class,
293
278
  kind=ApiSymbolKind.PAYLOAD,
294
- module=(
295
- f"from .{naming.payload_module_name(name)} import {payload_class}"
296
- ),
279
+ module=naming.model_import(payload_vo),
297
280
  signature=f"class {payload_class}(BaseModel)",
298
281
  usage="the typed payload projection bound to the template",
299
282
  fields=self._payload_fields(payload_vo),
@@ -310,7 +293,7 @@ class PythonApiModelBuilder:
310
293
  name=render_fn,
311
294
  kind=ApiSymbolKind.RENDER,
312
295
  module=f"from .{module}_render_helper import {render_fn}",
313
- signature=f"def {render_fn}(payload, provider)",
296
+ signature=f"def {render_fn}(payload: {payload_class}, provider)",
314
297
  usage="renders the output template against a typed payload",
315
298
  returns="EmailDocument" if _is_email_kind(tmpl) else "str",
316
299
  )
@@ -320,23 +303,23 @@ class PythonApiModelBuilder:
320
303
  # to an output, and the gate is @responseRef PRESENCE rather than a format
321
304
  # value. Shares `response_shape` with the generators, so the docs can never
322
305
  # claim a symbol codegen suppressed.
323
- inbound = response_shape(root, tmpl, _pkg_of(tmpl))
306
+ inbound = response_shape(root, tmpl, pkg_of(tmpl))
324
307
  if inbound is not None:
325
- # The RESPONSE record the parser actually returns — not the @payloadRef
326
- # request record documented above, which types what this prompt renders out.
327
- response_class = naming.response_class_name(name)
328
- symbols.append(
329
- ApiSymbol(
330
- name=response_class,
331
- kind=ApiSymbolKind.PAYLOAD,
332
- module=(
333
- f"from .{naming.response_module_name(name)} import {response_class}"
334
- ),
335
- signature=f"class {response_class}(BaseModel)",
336
- usage="the typed response shape a model reply is parsed into",
337
- fields=self._payload_fields(inbound.vo),
308
+ # The RESPONSE shape the parser actually returns — the @responseRef value
309
+ # object's own model (ADR-0056). Documented once: when the prompt renders and
310
+ # parses the SAME value object, the model above already is it.
311
+ response_class = naming.model_class_name(inbound.vo)
312
+ if payload_vo is None or inbound.vo.resolution_key() != payload_vo.resolution_key():
313
+ symbols.append(
314
+ ApiSymbol(
315
+ name=response_class,
316
+ kind=ApiSymbolKind.PAYLOAD,
317
+ module=naming.model_import(inbound.vo),
318
+ signature=f"class {response_class}(BaseModel)",
319
+ usage="the typed response shape a model reply is parsed into",
320
+ fields=self._payload_fields(inbound.vo),
321
+ )
338
322
  )
339
- )
340
323
 
341
324
  # OUTPUT_PARSER — the strict ``parse_*``. ADR-0053: JSON-only, so an XML
342
325
  # reply gets no strict tier and documenting one would name a missing fn.
@@ -403,8 +386,8 @@ class PythonApiModelBuilder:
403
386
 
404
387
  def _payload_fields(self, vo: MetaObject) -> list[FieldShape]:
405
388
  """The payload model's documented field shapes — one row per field of the
406
- ``@payloadRef`` value object, with optionality from ``is_field_required``
407
- (shared with the payload-VO generator, so there is no skew)."""
389
+ value object, with optionality from ``is_field_required`` (the boundary the
390
+ value object's model draws between ``T`` and ``T | None``)."""
408
391
  rows: list[FieldShape] = []
409
392
  for f in vo.fields():
410
393
  if not isinstance(f, MetaField):
@@ -7,26 +7,25 @@ generators delegate their name computation here, and the
7
7
  calling the SAME functions. So the documented name can never drift from the
8
8
  emitted name — they are computed once, in one place.
9
9
 
10
- Behaviour-preserving: each function reproduces exactly what the corresponding
11
- generator used to compute inline (``_snake_case`` / ``_plural_lowercase`` /
10
+ Behaviour-preserving with ONE deliberate exception: :func:`route_path` no longer
11
+ reproduces the old inline ``name.lower() + "s"``, because that spelling diverged
12
+ from the other ports (see its docstring). Every other function reproduces exactly
13
+ what the corresponding generator used to compute inline (``_snake_case`` /
12
14
  ``<Name>Repository`` / ``<ENTITY>_FILTER_FIELDS`` / ``parse_<snake>`` /
13
- ``render_<snake>`` / ``render_<snake>_format`` / ``extract_<snake>`` …). The
14
- payload-class / payload-module names already lived in
15
- ``payload_vo_generator`` (``payload_class_name`` / ``payload_module_name``); this
16
- seam re-exports them so the builder has one import surface.
15
+ ``render_<snake>`` / ``render_<snake>_format`` / ``extract_<snake>`` …). A model's
16
+ class name — which, the generated package being flat, is also its module name comes
17
+ from :mod:`metaobjects.codegen.value_objects`, the module the entity generator itself
18
+ asks (ADR-0056: a template's payload and response types ARE its value objects' models).
17
19
  """
18
20
  from __future__ import annotations
19
21
 
20
- from metaobjects.codegen.generators.payload_vo_generator import (
21
- payload_class_name,
22
- payload_module_name,
23
- response_class_name,
24
- response_module_name,
25
- )
22
+ from metaobjects.codegen import value_objects
23
+ from metaobjects.meta.meta_data import MetaData
24
+ from metaobjects.naming import to_snake_case
26
25
 
27
26
  __all__ = [
28
27
  "snake_case",
29
- "plural_lowercase",
28
+ "pluralize",
30
29
  "model_class_name",
31
30
  "router_module_name",
32
31
  "repository_class_name",
@@ -35,10 +34,7 @@ __all__ = [
35
34
  "filter_ops_const",
36
35
  "route_path",
37
36
  "pk_param",
38
- "payload_class_name",
39
- "payload_module_name",
40
- "response_class_name",
41
- "response_module_name",
37
+ "model_import",
42
38
  "render_helper_fn",
43
39
  "output_prompt_fn",
44
40
  "output_parser_fn",
@@ -64,14 +60,47 @@ def snake_case(name: str) -> str:
64
60
  return "".join(out)
65
61
 
66
62
 
67
- def plural_lowercase(name: str) -> str:
68
- """``Author`` → ``authors``. Cross-port-aligned trivial pluralization."""
69
- return name.lower() + "s"
63
+ def _route_snake_case(name: str) -> str:
64
+ """``PostCategory`` → ``post_category``; ``HTTPServer`` ``http_server``.
70
65
 
66
+ ACRONYM-AWARE, and deliberately NOT :func:`snake_case`. The trivial variant
67
+ above inserts a separator before every capital, which is right for a module
68
+ name but would emit ``h_t_t_p_server`` in a URL. Delegates to
69
+ :func:`metaobjects.naming.to_snake_case` — the port's acronym-aware loop,
70
+ documented there as byte-for-byte the other ports' rule (separate when the
71
+ previous character is lower or a digit, or when it is upper and the NEXT one
72
+ is lower, so a run of capitals stays together until the final one that
73
+ begins a word)."""
74
+ return to_snake_case(name)
71
75
 
72
- def model_class_name(obj_name: str) -> str:
73
- """The emitted Pydantic model class name the object's own short name."""
74
- return obj_name
76
+
77
+ def pluralize(name: str) -> str:
78
+ """``post_category`` → ``post_categories``; ``address`` → ``addresses``.
79
+
80
+ The cross-port pluralization contract, byte-identical in every port: a word
81
+ ending ``s``/``x``/``z``/``ch``/``sh`` takes ``es``; a consonant followed by
82
+ ``y`` becomes ``ies``; anything else takes ``s``. The cross-port
83
+ byte-identity covers the already-lowercased word :func:`route_path` feeds
84
+ in — suffix tests here run on a lowercased copy, unlike the JVM port's
85
+ case-sensitive ones, so mixed-case input may diverge."""
86
+ lowered = name.lower()
87
+ if lowered.endswith(("s", "x", "z", "ch", "sh")):
88
+ return name + "es"
89
+ if len(name) >= 2 and lowered[-1] == "y" and lowered[-2] not in "aeiou":
90
+ return name[:-1] + "ies"
91
+ return name + "s"
92
+
93
+
94
+ def model_class_name(obj: MetaData) -> str:
95
+ """The emitted Pydantic model class name — the object's own short name, or a value
96
+ object's collision-qualified one (ADR-0044/0056)."""
97
+ return value_objects.model_class_name(obj)
98
+
99
+
100
+ def model_import(obj: MetaData) -> str:
101
+ """``from .<Name> import <Name>`` — the import of *obj*'s generated model (the entity
102
+ generator writes ``<Name>.py``, so the module IS the class name)."""
103
+ return value_objects.model_import(obj)
75
104
 
76
105
 
77
106
  def router_module_name(obj_name: str) -> str:
@@ -100,9 +129,14 @@ def filter_ops_const(obj_name: str) -> str:
100
129
 
101
130
 
102
131
  def route_path(obj_name: str) -> str:
103
- """The default REST base segment — the entity name pluralized + lowercased
104
- (cross-port grammar; e.g. ``Author`` → ``authors``)."""
105
- return plural_lowercase(obj_name)
132
+ """The default REST collection segment — the ENTITY NAME ``snake_case``d and
133
+ then pluralized (``Author`` → ``authors``, ``PostCategory`` →
134
+ ``post_categories``). Never the physical ``@table``.
135
+
136
+ One rule, identical in all five ports. It used to be ``name.lower() + "s"``
137
+ here, which served ``PostCategory`` at ``/postcategorys``; see
138
+ ``fixtures/api-contract-conformance/m2m/`` for the scenario that gates it."""
139
+ return pluralize(_route_snake_case(obj_name))
106
140
 
107
141
 
108
142
  def pk_param(obj_name: str) -> str:
@@ -168,15 +202,14 @@ def extractor_fn(template_name: str) -> str:
168
202
  def _pluralize(name: str) -> str:
169
203
  """Trivial cross-port pluralization (matches the TS ``pluralize`` /
170
204
  ``MetaSource._pluralize``), applied to a PascalCase entity name BEFORE
171
- snake-casing (``GameSession`` → ``GameSessions``)."""
205
+ snake-casing (``GameSession`` → ``GameSessions``).
206
+
207
+ Delegates to :func:`pluralize` so this file states the cross-port inflector
208
+ contract once, not twice; the empty-string guard stays here because it is
209
+ this finder-naming helper's own contract, not ``pluralize``'s."""
172
210
  if not name:
173
211
  return name
174
- lower = name.lower()
175
- if lower.endswith(("s", "x", "z", "ch", "sh")):
176
- return name + "es"
177
- if len(name) >= 2 and lower[-1] == "y" and lower[-2] not in "aeiou":
178
- return name[:-1] + "ies"
179
- return name + "s"
212
+ return pluralize(name)
180
213
 
181
214
 
182
215
  def reverse_finder_fk_segment(fk_field_name: str) -> str: