metaobjects 0.9.0__tar.gz → 0.11.0__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 (389) hide show
  1. {metaobjects-0.9.0 → metaobjects-0.11.0}/PKG-INFO +1 -1
  2. {metaobjects-0.9.0 → metaobjects-0.11.0}/pyproject.toml +16 -1
  3. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/skills/metaobjects-authoring/SKILL.md +87 -9
  4. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/skills/metaobjects-codegen/references/typescript.md +30 -0
  5. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/skills/metaobjects-prompts/SKILL.md +41 -0
  6. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/skills/metaobjects-verify/references/migration.md +34 -1
  7. metaobjects-0.11.0/src/metaobjects/apidocs/__init__.py +91 -0
  8. metaobjects-0.11.0/src/metaobjects/apidocs/api_model.py +111 -0
  9. metaobjects-0.11.0/src/metaobjects/apidocs/builder.py +389 -0
  10. metaobjects-0.11.0/src/metaobjects/apidocs/naming.py +123 -0
  11. metaobjects-0.11.0/src/metaobjects/apidocs/paths.py +75 -0
  12. metaobjects-0.11.0/src/metaobjects/apidocs/renderer.py +185 -0
  13. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/cli.py +106 -0
  14. metaobjects-0.11.0/src/metaobjects/codegen/config.py +19 -0
  15. metaobjects-0.11.0/src/metaobjects/codegen/constants.py +28 -0
  16. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/extract_delegate_emitter.py +1 -1
  17. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/extract_schema_emitter.py +1 -1
  18. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/format.py +12 -1
  19. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/fr010_field_mapping.py +4 -4
  20. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/generators/entity_model.py +99 -27
  21. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/generators/extractor_generator.py +1 -10
  22. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/generators/filter_allowlist_generator.py +5 -19
  23. metaobjects-0.11.0/src/metaobjects/codegen/generators/fr019_shared_enum.py +135 -0
  24. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/generators/m2m_codegen.py +1 -1
  25. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/generators/output_parser_generator.py +1 -12
  26. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/generators/output_prompt_generator.py +1 -11
  27. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/generators/payload_vo_generator.py +44 -26
  28. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/generators/render_helper_generator.py +7 -14
  29. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/generators/router_generator.py +6 -30
  30. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/output_format_spec_emitter.py +2 -2
  31. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/runner.py +20 -0
  32. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/type_map.py +6 -3
  33. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/core_types.py +140 -221
  34. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/documentation/doc_constants.py +2 -0
  35. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/documentation/doc_schema.py +2 -0
  36. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/errors.py +57 -0
  37. metaobjects-0.11.0/src/metaobjects/loader/registered_validation.py +95 -0
  38. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/loader/validate_discriminator.py +1 -1
  39. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/loader/validate_source_parameter_ref.py +6 -1
  40. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/loader/validation_passes.py +161 -7
  41. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/field/field_constants.py +6 -0
  42. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/object/object_constants.py +8 -1
  43. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/validator/validator_constants.py +13 -0
  44. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/persistence/db/db_constants.py +18 -0
  45. metaobjects-0.11.0/src/metaobjects/meta/persistence/db/db_provider.py +141 -0
  46. metaobjects-0.11.0/src/metaobjects/meta/presentation/ui/ui_provider.py +53 -0
  47. metaobjects-0.11.0/src/metaobjects/meta/provider_extends.py +80 -0
  48. metaobjects-0.11.0/src/metaobjects/meta/template/prompt_provider.py +63 -0
  49. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/template/template_constants.py +1 -1
  50. metaobjects-0.11.0/src/metaobjects/naming_refs.py +141 -0
  51. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/parser.py +50 -0
  52. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/provider.py +12 -1
  53. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/registry.py +54 -1
  54. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/registry_manifest.py +122 -13
  55. metaobjects-0.11.0/src/metaobjects/spec_metamodel/__init__.py +595 -0
  56. metaobjects-0.11.0/src/metaobjects/spec_metamodel/attr.json +59 -0
  57. metaobjects-0.11.0/src/metaobjects/spec_metamodel/db.json +60 -0
  58. metaobjects-0.11.0/src/metaobjects/spec_metamodel/documentation.json +78 -0
  59. metaobjects-0.11.0/src/metaobjects/spec_metamodel/field.json +139 -0
  60. metaobjects-0.11.0/src/metaobjects/spec_metamodel/identity.json +35 -0
  61. metaobjects-0.11.0/src/metaobjects/spec_metamodel/layout.json +15 -0
  62. metaobjects-0.11.0/src/metaobjects/spec_metamodel/object.json +47 -0
  63. metaobjects-0.11.0/src/metaobjects/spec_metamodel/origin.json +38 -0
  64. metaobjects-0.11.0/src/metaobjects/spec_metamodel/prompt.json +76 -0
  65. metaobjects-0.11.0/src/metaobjects/spec_metamodel/relationship.json +65 -0
  66. metaobjects-0.11.0/src/metaobjects/spec_metamodel/source.json +16 -0
  67. metaobjects-0.11.0/src/metaobjects/spec_metamodel/template.json +29 -0
  68. metaobjects-0.11.0/src/metaobjects/spec_metamodel/ui.json +33 -0
  69. metaobjects-0.11.0/src/metaobjects/spec_metamodel/validator.json +98 -0
  70. metaobjects-0.11.0/src/metaobjects/spec_metamodel/view.json +75 -0
  71. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/super_resolve.py +70 -2
  72. metaobjects-0.11.0/src/metaobjects/validation_types.py +39 -0
  73. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/yaml_desugar.py +77 -9
  74. metaobjects-0.11.0/tests/codegen/test_api_docs_builder.py +88 -0
  75. metaobjects-0.11.0/tests/codegen/test_api_docs_paths.py +59 -0
  76. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_entity_model.py +49 -0
  77. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_enum_conformance.py +11 -7
  78. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_format.py +11 -0
  79. metaobjects-0.11.0/tests/codegen/test_fr019_shared_provided_conformance.py +99 -0
  80. metaobjects-0.11.0/tests/codegen/test_inherit_without_restate_gate.py +54 -0
  81. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_payload_vo_generator.py +29 -0
  82. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_render_helper_generator.py +22 -0
  83. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_runner.py +48 -2
  84. metaobjects-0.11.0/tests/conformance/conformance-expected-failures.json +25 -0
  85. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/conformance/conformance_adapter.py +14 -3
  86. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/conformance/fixture_discovery.py +16 -3
  87. metaobjects-0.11.0/tests/conformance/test_api_docs_cross_port_conformance.py +98 -0
  88. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/conformance/test_extract_conformance.py +1 -1
  89. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/conformance/test_fr010_loader_attrs.py +5 -2
  90. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/conformance/test_fr011_attrs.py +5 -2
  91. metaobjects-0.11.0/tests/conformance/test_spec_metamodel_embed.py +59 -0
  92. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/render/test_output_prompt_conformance.py +1 -1
  93. metaobjects-0.11.0/tests/test_api_docs_accuracy.py +234 -0
  94. metaobjects-0.11.0/tests/unit/__init__.py +0 -0
  95. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_common_attrs.py +5 -4
  96. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_loader.py +3 -1
  97. metaobjects-0.11.0/tests/unit/test_strict_child_placement.py +73 -0
  98. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_template_toolcall.py +5 -3
  99. metaobjects-0.11.0/tests/unit/test_template_wrong_subtype_attrs.py +84 -0
  100. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_validation_attr_schema.py +5 -2
  101. {metaobjects-0.9.0 → metaobjects-0.11.0}/uv.lock +8 -2
  102. metaobjects-0.9.0/src/metaobjects/codegen/config.py +0 -11
  103. metaobjects-0.9.0/src/metaobjects/codegen/constants.py +0 -13
  104. metaobjects-0.9.0/src/metaobjects/meta/persistence/db/db_provider.py +0 -60
  105. metaobjects-0.9.0/src/metaobjects/meta/template/template_provider.py +0 -43
  106. metaobjects-0.9.0/tests/conformance/conformance-expected-failures.json +0 -5
  107. {metaobjects-0.9.0 → metaobjects-0.11.0}/.gitignore +0 -0
  108. {metaobjects-0.9.0 → metaobjects-0.11.0}/LICENSE +0 -0
  109. {metaobjects-0.9.0 → metaobjects-0.11.0}/README.md +0 -0
  110. {metaobjects-0.9.0 → metaobjects-0.11.0}/hatch_build.py +0 -0
  111. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/__init__.py +0 -0
  112. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/__init__.py +0 -0
  113. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/README.md +0 -0
  114. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/servers/csharp.meta.json +0 -0
  115. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/servers/java.meta.json +0 -0
  116. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/servers/kotlin.meta.json +0 -0
  117. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/servers/python.meta.json +0 -0
  118. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/servers/typescript.meta.json +0 -0
  119. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/skills/metaobjects-codegen/SKILL.md +0 -0
  120. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/skills/metaobjects-codegen/references/csharp.md +0 -0
  121. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/skills/metaobjects-codegen/references/java.md +0 -0
  122. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/skills/metaobjects-codegen/references/kotlin.md +0 -0
  123. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/skills/metaobjects-prompts/references/csharp.md +0 -0
  124. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/skills/metaobjects-prompts/references/java.md +0 -0
  125. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/skills/metaobjects-prompts/references/kotlin.md +0 -0
  126. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/skills/metaobjects-prompts/references/python.md +0 -0
  127. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/skills/metaobjects-prompts/references/typescript.md +0 -0
  128. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/skills/metaobjects-runtime-ui/SKILL.md +0 -0
  129. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/skills/metaobjects-runtime-ui/references/java.md +0 -0
  130. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/skills/metaobjects-runtime-ui/references/kotlin.md +0 -0
  131. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/skills/metaobjects-runtime-ui/references/react.md +0 -0
  132. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/skills/metaobjects-runtime-ui/references/tanstack.md +0 -0
  133. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/skills/metaobjects-runtime-ui/references/typescript.md +0 -0
  134. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/skills/metaobjects-verify/SKILL.md +0 -0
  135. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/templates/always-on.md.mustache +0 -0
  136. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/assemble.py +0 -0
  137. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/content_root.py +0 -0
  138. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/scaffold.py +0 -0
  139. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/types.py +0 -0
  140. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/attr_class_map.py +0 -0
  141. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/KNOWN_GAPS.md +0 -0
  142. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/__init__.py +0 -0
  143. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/generator.py +0 -0
  144. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/generator_registry.py +0 -0
  145. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/generators/__init__.py +0 -0
  146. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/generators/template_generator.py +0 -0
  147. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/generators/tph_plan.py +0 -0
  148. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/generators/trace_helper_generator.py +0 -0
  149. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/instance_artifacts.py +0 -0
  150. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/overwrite_policy.py +0 -0
  151. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/runtime/__init__.py +0 -0
  152. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/runtime/filter_parser.py +0 -0
  153. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/datatype.py +0 -0
  154. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/documentation/__init__.py +0 -0
  155. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/documentation/doc_provider.py +0 -0
  156. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/loader/__init__.py +0 -0
  157. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/loader/merge.py +0 -0
  158. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/loader/meta_data_loader.py +0 -0
  159. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/loader/sources/__init__.py +0 -0
  160. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/loader/sources/directory_source.py +0 -0
  161. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/loader/sources/file_source.py +0 -0
  162. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/loader/sources/meta_data_source.py +0 -0
  163. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/loader/sources/uri_source.py +0 -0
  164. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/loader/validate_field_readonly.py +0 -0
  165. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/loader/validate_source_physical_names.py +0 -0
  166. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/__init__.py +0 -0
  167. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/__init__.py +0 -0
  168. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/attr/__init__.py +0 -0
  169. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/attr/attr_constants.py +0 -0
  170. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/attr/meta_attr.py +0 -0
  171. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/field/__init__.py +0 -0
  172. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/field/meta_field.py +0 -0
  173. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/identity/__init__.py +0 -0
  174. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/identity/identity_constants.py +0 -0
  175. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/identity/meta_identity.py +0 -0
  176. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/object/__init__.py +0 -0
  177. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/object/meta_object.py +0 -0
  178. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/object/meta_object_aware.py +0 -0
  179. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/object/object_class_registry.py +0 -0
  180. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/object/object_extract.py +0 -0
  181. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/object/value_object.py +0 -0
  182. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/relationship/__init__.py +0 -0
  183. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/relationship/derive_m2m_fields.py +0 -0
  184. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/relationship/meta_relationship.py +0 -0
  185. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/relationship/relationship_constants.py +0 -0
  186. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/validator/__init__.py +0 -0
  187. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/meta_data.py +0 -0
  188. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/meta_root.py +0 -0
  189. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/persistence/__init__.py +0 -0
  190. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/persistence/db/__init__.py +0 -0
  191. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/persistence/origin/__init__.py +0 -0
  192. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/persistence/origin/meta_origin.py +0 -0
  193. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/persistence/origin/origin_constants.py +0 -0
  194. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/persistence/source/__init__.py +0 -0
  195. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/persistence/source/meta_source.py +0 -0
  196. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/persistence/source/source_constants.py +0 -0
  197. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/presentation/__init__.py +0 -0
  198. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/presentation/layout/__init__.py +0 -0
  199. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/presentation/layout/layout_constants.py +0 -0
  200. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/presentation/layout/meta_layout.py +0 -0
  201. {metaobjects-0.9.0/src/metaobjects/meta/presentation/view → metaobjects-0.11.0/src/metaobjects/meta/presentation/ui}/__init__.py +0 -0
  202. {metaobjects-0.9.0/src/metaobjects/meta/template → metaobjects-0.11.0/src/metaobjects/meta/presentation/view}/__init__.py +0 -0
  203. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/presentation/view/meta_view.py +0 -0
  204. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/presentation/view/view_constants.py +0 -0
  205. {metaobjects-0.9.0/src/metaobjects/shared → metaobjects-0.11.0/src/metaobjects/meta/template}/__init__.py +0 -0
  206. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/template/meta_template.py +0 -0
  207. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/parser_yaml.py +0 -0
  208. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/py.typed +0 -0
  209. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/__init__.py +0 -0
  210. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/email_document.py +0 -0
  211. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/escapers.py +0 -0
  212. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/extract/KNOWN_GAPS.md +0 -0
  213. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/extract/__init__.py +0 -0
  214. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/extract/coerce.py +0 -0
  215. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/extract/extract.py +0 -0
  216. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/extract/extract_map.py +0 -0
  217. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/extract/json_forgiving_reader.py +0 -0
  218. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/extract/locate.py +0 -0
  219. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/extract/normalize.py +0 -0
  220. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/extract/strip.py +0 -0
  221. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/extract/types.py +0 -0
  222. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/extract/xml_forgiving_reader.py +0 -0
  223. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/filesystem_provider.py +0 -0
  224. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/prompt/__init__.py +0 -0
  225. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/prompt/output_format_renderer.py +0 -0
  226. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/prompt/output_format_spec.py +0 -0
  227. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/prompt/prompt_field.py +0 -0
  228. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/prompt/prompt_overrides.py +0 -0
  229. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/prompt/prompt_style.py +0 -0
  230. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/renderer.py +0 -0
  231. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/verify.py +0 -0
  232. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/runtime/__init__.py +0 -0
  233. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/runtime/llm_recorder.py +0 -0
  234. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/runtime/n2m_resolver.py +0 -0
  235. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/runtime/object_manager.py +0 -0
  236. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/runtime/tph.py +0 -0
  237. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/serializer_json.py +0 -0
  238. {metaobjects-0.9.0/tests → metaobjects-0.11.0/src/metaobjects/shared}/__init__.py +0 -0
  239. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/shared/base_types.py +0 -0
  240. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/shared/separators.py +0 -0
  241. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/shared/structural.py +0 -0
  242. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/source/__init__.py +0 -0
  243. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/source/error_source.py +0 -0
  244. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/source/json_path.py +0 -0
  245. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/source/semantic_diff.py +0 -0
  246. {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/source/yaml_positions.py +0 -0
  247. {metaobjects-0.9.0/tests/codegen → metaobjects-0.11.0/tests}/__init__.py +0 -0
  248. {metaobjects-0.9.0/tests/conformance → metaobjects-0.11.0/tests/codegen}/__init__.py +0 -0
  249. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/golden/extends/expected/BaseEntity.py +0 -0
  250. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/golden/extends/expected/Program.py +0 -0
  251. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/golden/extends/meta.json +0 -0
  252. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/golden/nested-array/expected/AuthorBrief.py +0 -0
  253. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/golden/nested-array/expected/PostBrief.py +0 -0
  254. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/golden/nested-array/meta.json +0 -0
  255. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/golden/scalars/expected/Metric.py +0 -0
  256. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/golden/scalars/expected/Report.py +0 -0
  257. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/golden/scalars/meta.json +0 -0
  258. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/golden/vanilla/expected/Subscriber.py +0 -0
  259. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/golden/vanilla/meta.json +0 -0
  260. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_abstract_conformance.py +0 -0
  261. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_cli.py +0 -0
  262. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_cli_registry.py +0 -0
  263. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_cli_staleness_nudge.py +0 -0
  264. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_cli_verify_subverbs.py +0 -0
  265. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_constants_config.py +0 -0
  266. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_extractor_generator.py +0 -0
  267. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_filter_allowlist_generator.py +0 -0
  268. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_fr010_output_codegen.py +0 -0
  269. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_generator.py +0 -0
  270. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_generator_extension_seams.py +0 -0
  271. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_golden.py +0 -0
  272. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_inheritance_conformance.py +0 -0
  273. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_instance_artifacts.py +0 -0
  274. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_m2m_codegen.py +0 -0
  275. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_output_parser_generator.py +0 -0
  276. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_overwrite_policy.py +0 -0
  277. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_render_helper_conformance.py +0 -0
  278. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_router_generator.py +0 -0
  279. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_template_generator.py +0 -0
  280. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_tph_codegen.py +0 -0
  281. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_trace_helper_generator.py +0 -0
  282. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_type_map.py +0 -0
  283. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_validation_conformance.py +0 -0
  284. {metaobjects-0.9.0/tests/integration → metaobjects-0.11.0/tests/conformance}/__init__.py +0 -0
  285. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/conformance/capabilities.py +0 -0
  286. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/conformance/corpus.py +0 -0
  287. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/conformance/expected_failures.py +0 -0
  288. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/conformance/navigator.py +0 -0
  289. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/conformance/test_agent_context_conformance.py +0 -0
  290. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/conformance/test_conformance.py +0 -0
  291. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/conformance/test_extract_object_verdict.py +0 -0
  292. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/conformance/test_generator_registry_conformance.py +0 -0
  293. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/conformance/test_object_model_conformance.py +0 -0
  294. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/conformance/test_registry_conformance.py +0 -0
  295. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/conformance/test_runner_hardfail.py +0 -0
  296. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/conformance/test_strict_attr_load.py +0 -0
  297. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/conformance/test_template_generator_conformance.py +0 -0
  298. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/conformance/test_yaml_conformance.py +0 -0
  299. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/conformance/yaml-conformance-expected-failures.json +0 -0
  300. {metaobjects-0.9.0/tests/render → metaobjects-0.11.0/tests/integration}/__init__.py +0 -0
  301. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/integration/api_contract_assertions.py +0 -0
  302. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/integration/api_contract_m2m_server.py +0 -0
  303. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/integration/api_contract_server.py +0 -0
  304. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/integration/generated_m2m_app.py +0 -0
  305. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/integration/generated_router_app.py +0 -0
  306. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/integration/generated_tph_app.py +0 -0
  307. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/integration/meta_ai_trace.yaml +0 -0
  308. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/integration/normalization.py +0 -0
  309. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/integration/postgres_container.py +0 -0
  310. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/integration/query_runner.py +0 -0
  311. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/integration/scenarios.py +0 -0
  312. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/integration/test_api_contract.py +0 -0
  313. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/integration/test_api_contract_generated.py +0 -0
  314. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/integration/test_api_contract_m2m.py +0 -0
  315. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/integration/test_api_contract_m2m_generated.py +0 -0
  316. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/integration/test_api_contract_tph_generated.py +0 -0
  317. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/integration/test_llm_call_trace.py +0 -0
  318. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/integration/test_normalization.py +0 -0
  319. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/integration/test_query_scenarios.py +0 -0
  320. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/integration/test_runtime_return_types.py +0 -0
  321. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/open_closed_proof_test.py +0 -0
  322. {metaobjects-0.9.0/tests/render/extract → metaobjects-0.11.0/tests/render}/__init__.py +0 -0
  323. {metaobjects-0.9.0/tests/render/prompt → metaobjects-0.11.0/tests/render/extract}/__init__.py +0 -0
  324. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/render/extract/test_coerce.py +0 -0
  325. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/render/extract/test_extract.py +0 -0
  326. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/render/extract/test_extract_map.py +0 -0
  327. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/render/extract/test_json_forgiving_reader.py +0 -0
  328. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/render/extract/test_locate.py +0 -0
  329. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/render/extract/test_model.py +0 -0
  330. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/render/extract/test_normalize.py +0 -0
  331. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/render/extract/test_strip.py +0 -0
  332. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/render/extract/test_xml_forgiving_reader.py +0 -0
  333. {metaobjects-0.9.0/tests/source → metaobjects-0.11.0/tests/render/prompt}/__init__.py +0 -0
  334. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/render/prompt/test_output_format_renderer.py +0 -0
  335. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/render/test_email_document.py +0 -0
  336. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/render/test_filesystem_provider.py +0 -0
  337. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/render/test_output_format_renderer_nested.py +0 -0
  338. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/render/test_render_conformance.py +0 -0
  339. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/render/test_render_max_chars.py +0 -0
  340. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/render/test_verify.py +0 -0
  341. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/render/test_verify_conformance.py +0 -0
  342. {metaobjects-0.9.0/tests/unit → metaobjects-0.11.0/tests/source}/__init__.py +0 -0
  343. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/source/test_fr5c_merge_attribution.py +0 -0
  344. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/source/test_fr5d_reference_resolution.py +0 -0
  345. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/source/test_fr5e_database_source_shape.py +0 -0
  346. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/source/test_json_path.py +0 -0
  347. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/source/test_semantic_diff.py +0 -0
  348. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/source/test_source_on_node.py +0 -0
  349. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/source/test_yaml_positions.py +0 -0
  350. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_agent_context_staleness.py +0 -0
  351. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_capabilities.py +0 -0
  352. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_core_types.py +0 -0
  353. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_effective_package.py +0 -0
  354. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_errors.py +0 -0
  355. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_field_enum.py +0 -0
  356. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_field_uuid_dbcolumntype.py +0 -0
  357. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_fr016_source_name_and_kind_aliases.py +0 -0
  358. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_llm_recorder.py +0 -0
  359. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_loader_bom.py +0 -0
  360. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_loader_class.py +0 -0
  361. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_merge.py +0 -0
  362. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_meta_attr.py +0 -0
  363. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_meta_data.py +0 -0
  364. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_meta_source.py +0 -0
  365. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_module_shortcuts.py +0 -0
  366. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_n2m_resolver.py +0 -0
  367. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_object_manager_uuid_coercion.py +0 -0
  368. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_one_primary_source.py +0 -0
  369. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_parser.py +0 -0
  370. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_parser_yaml.py +0 -0
  371. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_provider.py +0 -0
  372. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_provider_extension.py +0 -0
  373. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_registry.py +0 -0
  374. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_registry_completeness.py +0 -0
  375. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_registry_extend.py +0 -0
  376. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_registry_sealed.py +0 -0
  377. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_relationship_referential_actions.py +0 -0
  378. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_resolution_key.py +0 -0
  379. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_runtime_resolution_key_binding.py +0 -0
  380. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_serializer.py +0 -0
  381. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_shared_constants.py +0 -0
  382. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_smoke.py +0 -0
  383. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_sources.py +0 -0
  384. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_super_resolve.py +0 -0
  385. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_validation_filter_values.py +0 -0
  386. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_validation_origin_paths.py +0 -0
  387. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_validation_sort_field.py +0 -0
  388. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_validation_warnings.py +0 -0
  389. {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_yaml_desugar.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: metaobjects
3
- Version: 0.9.0
3
+ Version: 0.11.0
4
4
  Summary: Cross-language metadata standard: declare typed entities once, generate idiomatic drift-checked code across languages — Python port.
5
5
  Project-URL: Homepage, https://metaobjects.dev
6
6
  Project-URL: Repository, https://github.com/metaobjectsdev/metaobjects
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "metaobjects"
3
- version = "0.9.0"
3
+ version = "0.11.0"
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"
@@ -75,6 +75,12 @@ exclude = ["**/KNOWN_GAPS.md"]
75
75
  # falls back to walking up to the monorepo agent-context/.
76
76
  [tool.hatch.build.hooks.custom]
77
77
 
78
+ # FR-033 — the 15 shared spec/metamodel/*.json files are COMMITTED copies under
79
+ # src/metaobjects/spec_metamodel/ (not build-time-generated), so hatchling's default
80
+ # package inclusion ships them in both the sdist and the wheel (read via
81
+ # importlib.resources, AOT-safe). A byte-identity gate
82
+ # (tests/conformance/test_spec_metamodel_embed.py) keeps the copies from drifting
83
+ # from the repo-root spec/metamodel/ source.
78
84
  [tool.hatch.build]
79
85
  artifacts = ["src/metaobjects/agent_context/_content/**"]
80
86
 
@@ -93,4 +99,13 @@ exclude = ["tests/codegen/golden/"]
93
99
  [dependency-groups]
94
100
  dev = [
95
101
  "pytest>=9.0.3",
102
+ # `uv run` installs THIS group (PEP 735), not [project.optional-dependencies].
103
+ # The validator-parity corpus (tests/codegen/test_validation_conformance.py)
104
+ # imports pydantic to exercise the generated Pydantic models, so it must be here
105
+ # or the CI `uv run pytest` collection fails with ModuleNotFoundError.
106
+ "pydantic>=2",
107
+ # ruff is the Python codegen format pass (src/metaobjects/codegen/format.py); the
108
+ # cli-registry corpus runs codegen, so without ruff in the group `uv run pytest`
109
+ # fails at format time with "No module named ruff".
110
+ "ruff>=0.6",
96
111
  ]
@@ -34,7 +34,7 @@ subtype — there is **no** separate `subType` body key.
34
34
  { "object.entity": { "name": "User" } }
35
35
  { "field.string": { "name": "email", "@required": true } }
36
36
  { "field.enum": { "name": "status", "@values": ["OPEN", "CLOSED"] } }
37
- { "identity.primary": { "@fields": ["id"] } }
37
+ { "identity.primary": { "name": "id", "@fields": ["id"] } }
38
38
  ```
39
39
 
40
40
  A complete entity in canonical JSON:
@@ -52,7 +52,7 @@ A complete entity in canonical JSON:
52
52
  { "field.long": { "name": "id" } },
53
53
  { "field.string": { "name": "name", "@required": true, "@maxLength": 200 } },
54
54
  { "field.string": { "name": "bio", "@maxLength": 2000 } },
55
- { "identity.primary": { "@fields": ["id"], "@generation": "increment" } }
55
+ { "identity.primary": { "name": "id", "@fields": ["id"], "@generation": "increment" } }
56
56
  ]
57
57
  }
58
58
  }
@@ -74,7 +74,7 @@ metadata:
74
74
  - field.long: { name: id }
75
75
  - field.string: { name: name, required: true, maxLength: 200 }
76
76
  - field.string: { name: bio, maxLength: 2000 }
77
- - identity.primary: { fields: id, generation: increment }
77
+ - identity.primary: { name: id, fields: id, generation: increment }
78
78
  ```
79
79
 
80
80
  ## Reserved structural keys vs. attributes
@@ -165,6 +165,26 @@ Reuse a constraint set across entities with an abstract `field.enum` + `extends`
165
165
  { "field.object": { "name": "address", "@objectRef": "Address", "@storage": "flattened" } }
166
166
  ```
167
167
 
168
+ **Arrays of value objects** — set `isArray: true` with `@storage: jsonb`. The whole
169
+ array lives in **one** jsonb column (a JSON array), never a native `jsonb[]`. The
170
+ generated Postgres column is typed `.$type<VO[]>()` and the Zod schema is
171
+ `z.array(<VO>InsertSchema)`:
172
+
173
+ ```json
174
+ { "field.object": { "name": "triples", "@objectRef": "Triple",
175
+ "@storage": "jsonb", "isArray": true } }
176
+ ```
177
+
178
+ **Opaque jsonb (no value object)** — when the payload has no fixed shape (freeform
179
+ config, passthrough metadata, an open-keyed map), do NOT use `field.object` (it
180
+ requires `@objectRef`, and a partial VO would let the generated Zod strip unknown
181
+ keys → data loss). Model it as a `field.string` with the physical-type override
182
+ `@dbColumnType: jsonb` — the logical type stays string-bound, the column is jsonb:
183
+
184
+ ```json
185
+ { "field.string": { "name": "metadata", "@dbColumnType": "jsonb" } }
186
+ ```
187
+
168
188
  ## YAML sigil-free authoring + the coercion footgun
169
189
 
170
190
  In YAML, write the fused `type.subType` key with a **map body**, bare reserved
@@ -194,7 +214,7 @@ The `[]` key-suffix declares an array field: `field.long[]: weekIds` lowers to
194
214
  | Subtype | Purpose | Key attrs |
195
215
  |---|---|---|
196
216
  | `identity.primary` | the PK field(s) | `@fields`, `@generation` |
197
- | `identity.secondary` | a unique secondary index | `@fields` |
217
+ | `identity.secondary` | a unique secondary index | `@fields` (or `@expr` for a functional index) |
198
218
  | `identity.reference` | an inbound FK from this entity to another | `@fields`, `@references`, `@enforce` |
199
219
 
200
220
  `@generation` on a primary controls value generation (e.g. `increment`).
@@ -205,9 +225,27 @@ reference for navigation/typing/codegen only. Referential actions
205
225
  (`@onDelete`/`@onUpdate`) are NOT on `identity.reference` — they live on the
206
226
  `relationship.*` node (see Relationships below).
207
227
 
228
+ `@references` resolves cross-package by **fully-qualified name**
229
+ (`@references: "shared::billing::Account"`), the same rule as `extends`; a bare
230
+ name resolves within the current package. The FK target must be an entity with a
231
+ single-column primary key (the FK points at that PK); a target with a composite
232
+ PK needs the explicit dotted form `@references: "pkg::Target.fieldA,fieldB"`.
233
+
234
+ **A dangling reference fails the load (0.11.0+).** An unresolved
235
+ `identity.reference.@references` raises `ERR_INVALID_REFERENCE` and an unresolved
236
+ `relationship.@objectRef` raises `ERR_INVALID_RELATIONSHIP` — the target entity must
237
+ exist (previously such references loaded silently). So every `@references` /
238
+ `@objectRef` you author must name a real entity.
239
+
240
+ A `identity.secondary` can index an **expression** instead of plain columns: use
241
+ `@expr` (e.g. `"lower(email)"`) in place of `@fields`, optionally with `@using` (the
242
+ index method — `gin` / `gist` / `hash`; default `btree`) and `@where` (a partial-index
243
+ predicate).
244
+
208
245
  ```json
209
- { "identity.primary": { "@fields": ["id"], "@generation": "increment" } }
210
- { "identity.secondary": { "@fields": ["email"] } }
246
+ { "identity.primary": { "name": "id", "@fields": ["id"], "@generation": "increment" } }
247
+ { "identity.secondary": { "name": "byEmail", "@fields": ["email"] } }
248
+ { "identity.secondary": { "name": "byEmailCI", "@expr": "lower(email)" } }
211
249
  { "identity.reference": { "name": "fkAuthor", "@fields": ["authorId"], "@references": "Author", "@enforce": true } }
212
250
  ```
213
251
 
@@ -229,6 +267,39 @@ the two halves of one FK.
229
267
  "@cardinality": "many", "@onDelete": "cascade" } }
230
268
  ```
231
269
 
270
+ **Adoption footgun — pin BOTH actions.** `@onDelete` and `@onUpdate` each default to
271
+ `cascade` when omitted, but a plain SQL foreign key is `NO ACTION` on both. If you're
272
+ adopting an existing database (matching metadata to a live schema), omitting these
273
+ makes the metadata declare `CASCADE` where the DB has `NO ACTION` — a perpetual
274
+ `verify --db` drift. Pin **both** explicitly to the DB's real behavior:
275
+
276
+ ```json
277
+ { "relationship.composition": { "name": "author", "@objectRef": "User",
278
+ "@cardinality": "one", "@onDelete": "no-action", "@onUpdate": "no-action" } }
279
+ ```
280
+
281
+ ## Validators — cross-field rules
282
+
283
+ Entity-scoped `validator.*` children declare invariants that reference sibling fields
284
+ **by name** (the same name-reference pattern as `identity.*`). The backend derives the
285
+ enforcement (a CHECK constraint / cross-field assertion) — no raw expression is stored.
286
+
287
+ | Subtype | Rule | Key attrs |
288
+ |---|---|---|
289
+ | `validator.comparison` | two fields stand in a relational order (`@left @op @right`) | `@left`, `@op` (`gt`/`gte`/`lt`/`lte`/`ne`/`eq`), `@right` |
290
+ | `validator.requiredWhen` | `@field` is required when `@when` equals `@equals` | `@field`, `@when`, `@equals` |
291
+ | `validator.presentIff` | `@field` is present **iff** `@when` equals `@equals` (biconditional) | `@field`, `@when`, `@equals` |
292
+ | `validator.atLeastOne` | at least one of `@fields` (2+) is present | `@fields` |
293
+
294
+ ```json
295
+ { "validator.comparison": { "name": "hpInRange", "@left": "currentHp", "@op": "lte", "@right": "maxHp" } }
296
+ { "validator.requiredWhen": { "name": "reasonIfRejected", "@field": "rejectReason", "@when": "status", "@equals": "rejected" } }
297
+ { "validator.presentIff": { "name": "usedAtWhenUsed", "@field": "usedAt", "@when": "isUsed", "@equals": "true" } }
298
+ { "validator.atLeastOne": { "name": "emailOrPhone", "@fields": ["email", "phone"] } }
299
+ ```
300
+
301
+ These are children of `object.entity`, alongside its fields and identities.
302
+
232
303
  ## Sources — `source.rdb` + `@kind`
233
304
 
234
305
  `source.rdb` declares where an entity's data lives. Read-only-ness derives from
@@ -251,8 +322,15 @@ each with a `@role`, exactly one `primary`.
251
322
  { "source.rdb": { "@kind": "view", "@table": "v_author", "@schema": "blog" } }
252
323
  ```
253
324
 
254
- A `view`-kind entity's fields carry `origin.*` children (`passthrough` /
255
- `aggregate` / `collection`) declaring where each value comes from.
325
+ **An entity's PRIMARY source must be writable** (`table`) — read-only kinds are
326
+ legal only in non-primary roles (e.g. table `primary` + view `replica` for
327
+ read-through). A derived read model over a view/proc is an **`object.projection`**
328
+ (FR-024): its fields `extends` entity fields (`extends: "Author.id"` — dotted
329
+ child traversal, package only on the root segment) and/or carry `origin.*`
330
+ children (`passthrough` / `aggregate` / `collection`) declaring assembly; its
331
+ identity passes through via `extends` (`identity.primary: { name: id, extends:
332
+ "Author.id" }`); it is read-only by construction and the declared field set IS
333
+ the exposure (fail-closed).
256
334
 
257
335
  ## Abstracts + `extends` (deferred resolution) + `overlay`
258
336
 
@@ -275,7 +353,7 @@ change.
275
353
  children:
276
354
  - source.rdb: { table: authors }
277
355
  - field.string: { name: name, required: true }
278
- - identity.primary: { fields: id }
356
+ - identity.primary: { name: id, fields: id }
279
357
  ```
280
358
 
281
359
  Resolution facts:
@@ -41,6 +41,11 @@ export default defineConfig({
41
41
  dialect: "postgres", // "postgres" | "sqlite" | "d1" (D1 is TS-only)
42
42
  apiPrefix: "/api", // flows to routes AND client fetch URLs
43
43
  columnNamingStrategy: "snake_case", // "snake_case" (default) | "literal" | "kebab-case"
44
+ timestampMode: "string", // "string" (default, ISO-8601 wire contract) | "date" (Drizzle native Date)
45
+ pluralizeCollections: true, // default; table VARS auto-pluralize (AgentConfig → agentConfigs)
46
+ collectionNameOverrides: { // per-entity escape hatch for names the rule gets wrong
47
+ AuditLog: "auditLog", LlmTierConfig: "llmTierConfig",
48
+ },
44
49
  generators: [
45
50
  entityFile(), queriesFile(), routesFile(), barrel(),
46
51
  formFile(), tanstackQuery(), tanstackGrid(),
@@ -48,6 +53,13 @@ export default defineConfig({
48
53
  });
49
54
  ```
50
55
 
56
+ Naming + timestamp knobs are **codegen config**, not metadata attributes — a
57
+ collection variable name and a Drizzle column mode are per-port rendering choices
58
+ with no meaning to the other language ports, so they carry no cross-port
59
+ conformance cost. `collectionNameOverrides` wins over `pluralizeCollections` and is
60
+ applied consistently to the table declaration, every FK reference, the `relations()`
61
+ block, and the inferred types.
62
+
51
63
  A second file, `.metaobjects/config.json`, holds static project state parseable by
52
64
  non-TS tooling; `meta init` scaffolds both plus the `metaobjects/` source dir.
53
65
 
@@ -133,3 +145,21 @@ Deterministic per dialect: `field.string` + `@maxLength` → `varchar(N)`,
133
145
  (Postgres) + `gen_random_uuid()`, `field.enum` → `varchar` + `CHECK`. Override a
134
146
  field's physical column name with `@column` on the field; the DB schema name lives
135
147
  on `source.rdb` via `@schema`.
148
+
149
+ ### Value-object jsonb columns
150
+
151
+ A `field.object` with `@storage: jsonb` (or the default `subdocument`) becomes a
152
+ single typed jsonb column — the referenced value-object's TS type is carried onto
153
+ the Drizzle column via `.$type<>()`, and its Zod schema is the VO's `InsertSchema`:
154
+
155
+ ```ts
156
+ // field.object @objectRef=LlmConfig @storage=jsonb
157
+ llmConfigJson: jsonb("llm_config_json").$type<LlmConfig>(),
158
+ // field.object @objectRef=Triple @storage=jsonb isArray=true
159
+ triples: jsonb("triples").$type<Triple[]>(), // one jsonb column, NOT a native jsonb[]
160
+ ```
161
+
162
+ The VO type, its Zod `InsertSchema`, and this `.$type<>()` all import the VO from
163
+ the same module (layout/package/`extStyle`-aware resolution). An opaque jsonb column
164
+ (`field.string @dbColumnType: jsonb`) gets no `.$type<>()` — it stays `unknown`,
165
+ which is the correct shape for freeform payloads with no fixed VO.
@@ -123,6 +123,47 @@ For the `xml`-format example above with payload `{ displayName: "Ada", postCount
123
123
  bytes. You render the prompt, call your LLM client (provider-agnostic — codegen
124
124
  emits no provider-side schema), then parse the response.
125
125
 
126
+ ## Conditional content: data and flags, never branched prose
127
+
128
+ When a prompt's wording varies along some dimension — audience, tier, mode,
129
+ locale, entitlement, a domain variant — do NOT branch the prose in code and
130
+ concatenate strings. Branching prompt text in a service is the anti-pattern this
131
+ pillar exists to remove: it scatters the same distinction across call sites, each
132
+ re-encoded and free to drift, and none of it snapshot-tested. The variation
133
+ belongs in exactly two places, with a third for the rare genuine divergence:
134
+
135
+ - **Vocabulary as payload data.** The words and values that differ become typed
136
+ payload fields, pre-computed once from the varying dimension — a noun, a label,
137
+ a set of verbs (a list), an example. The template stays single and references
138
+ `{{term}}` / `{{#items}}…{{/items}}`. The prose *structure* is identical across
139
+ variants; only the data differs, so there is nothing to branch.
140
+ - **Presence as boolean flags.** When a whole block exists-or-not for a variant,
141
+ gate it with a section flag the payload sets: `{{#showBlock}}…{{/showBlock}}`.
142
+ Reserve flags for entire blocks — never mid-sentence word swaps, which are
143
+ vocabulary.
144
+ - **Variant text only when prose truly diverges.** If a section's wording — not
145
+ just its vocabulary — genuinely differs, select a per-variant text through the
146
+ provider seam (a `@textRef` variant, or an included partial) so the shared
147
+ prose still lives in one place. Expect to need this rarely.
148
+
149
+ A single resolver maps the varying dimension to that payload (the flags + the
150
+ vocabulary), so the distinction is defined ONCE and every template that depends
151
+ on it stays consistent.
152
+
153
+ ```
154
+ // WRONG — prose branched and concatenated in a service:
155
+ if (tier.isPremium()) sb.append("Your plan includes priority support.");
156
+ else sb.append("Upgrade any time for priority support.");
157
+ ```
158
+ ```mustache
159
+ {{! RIGHT — text in the template; the variant is data + a flag }}
160
+ {{supportLine}}
161
+ {{#isPremium}}(Priority queue enabled.){{/isPremium}}
162
+ ```
163
+
164
+ This stays deterministic and golden-testable per variant: render the template
165
+ against each value of the dimension and snapshot every variant.
166
+
126
167
  ## `verify` fails the build on prompt-drift
127
168
 
128
169
  For every template, the verify step resolves the text, parses each `{{...}}`
@@ -66,7 +66,40 @@ A clean run is silent; a failure names the drifted table/column. Bias toward
66
66
  trusting the tool — a drift failure almost always means the metadata changed and the
67
67
  DB didn't follow.
68
68
 
69
+ ## Index modeling (Postgres)
70
+
71
+ Secondary indexes carry physical-shape attributes contributed by the db provider
72
+ (they live on `identity.secondary`, not core):
73
+
74
+ - `@orders` — per-key sort direction, positional to `@fields` (`["asc", "desc"]`).
75
+ Omit for all-ascending; drives `DESC`-ordered index keys (e.g. a recency index).
76
+ - `@where` — a partial-index predicate (raw SQL, e.g. `"delivered_at IS NULL"`),
77
+ emitted as `WHERE (<pred>)`. The index then covers only matching rows.
78
+
79
+ ```json
80
+ { "identity.secondary": { "@fields": ["userId", "createdAt"],
81
+ "@orders": ["asc", "desc"], "@where": "archived_at IS NULL" } }
82
+ ```
83
+
84
+ ## Adopting an existing database (non-destructive)
85
+
86
+ `meta verify --db` / `meta migrate` can reach **zero drift** against a hand-built
87
+ schema without a rewrite:
88
+
89
+ - **`meta migrate --from-db`** reverse-engineers a baseline from the live DB so the
90
+ first diff is empty.
91
+ - **Auto schema-scope** — the diff manages only the schemas the metadata *declares*
92
+ (via `source.rdb @schema`); tables in undeclared schemas belong to another owner
93
+ and are left untouched. This is what lets several apps share one database, each
94
+ owning its own schema, with a clean per-owner `verify --db` and no manual ignore
95
+ lists. A downstream app that extends the toolkit's DB declares its own `@schema`,
96
+ models only its tables, and runs its own migrate/verify against that scope.
97
+ - **`identity.reference @constraintName`** pins a foreign-key constraint name so the
98
+ metadata can match an existing DB's naming convention without a destructive
99
+ rename.
100
+
69
101
  ## Not yet shipped
70
102
 
71
- Triggers, generated columns, partial/exclusion/check constraints, MySQL, and data
103
+ Triggers, generated columns, exclusion + CHECK constraints, MySQL, and data
72
104
  migrations (column-type changes needing data transformation error out with a hint).
105
+ (Partial + descending **indexes** *are* supported — see Index modeling above.)
@@ -0,0 +1,91 @@
1
+ """Python native SDK / API-reference docs (the ``api/python`` surface).
2
+
3
+ Tier-1, idiomatic per-language reference for the generated Python SDK (Pydantic
4
+ model / FastAPI routes / repository ``Protocol`` data-access / validation /
5
+ extractor / render helper / payload / output-format prompt / output parser /
6
+ filter allowlist). Accurate-by-construction: every documented symbol name comes
7
+ from the :mod:`metaobjects.apidocs.naming` seam — the SAME seam the real
8
+ generators delegate to — so docs can never claim a name the generators do not
9
+ emit. Distinct from the model docs (Tier-2, neutral, TS-owned). See
10
+ ``docs/superpowers/specs/2026-06-13-cross-port-sdk-docs-conformance-design.md``.
11
+
12
+ The builder / renderer symbols are exposed lazily (via :pep:`562` module
13
+ ``__getattr__``) so that a generator importing the lightweight
14
+ :mod:`metaobjects.apidocs.naming` seam does NOT pull in the builder (which imports
15
+ those same generators) — that would be a circular import at module-init time.
16
+ """
17
+ from __future__ import annotations
18
+
19
+ from typing import TYPE_CHECKING, Any
20
+
21
+ # Path math is leaf-level (no generator imports) — safe to expose eagerly.
22
+ from metaobjects.apidocs.paths import (
23
+ Layout,
24
+ doc_page_output_path,
25
+ model_cross_href,
26
+ package_to_path,
27
+ surface_cross_href,
28
+ )
29
+
30
+ if TYPE_CHECKING: # pragma: no cover - import-time only for type checkers
31
+ from metaobjects.apidocs.api_model import (
32
+ ApiModel,
33
+ ApiSymbol,
34
+ ApiSymbolKind,
35
+ ApiUnit,
36
+ FieldShape,
37
+ UnitExample,
38
+ )
39
+ from metaobjects.apidocs.builder import PythonApiModelBuilder, build_api_model
40
+ from metaobjects.apidocs.renderer import (
41
+ PythonApiDocsRenderer,
42
+ render_agent_api,
43
+ render_index,
44
+ render_unit_page,
45
+ )
46
+
47
+ # Lazily-resolved exports → their defining submodule.
48
+ _LAZY: dict[str, str] = {
49
+ "ApiModel": "api_model",
50
+ "ApiSymbol": "api_model",
51
+ "ApiSymbolKind": "api_model",
52
+ "ApiUnit": "api_model",
53
+ "FieldShape": "api_model",
54
+ "UnitExample": "api_model",
55
+ "PythonApiModelBuilder": "builder",
56
+ "build_api_model": "builder",
57
+ "PythonApiDocsRenderer": "renderer",
58
+ "render_unit_page": "renderer",
59
+ "render_index": "renderer",
60
+ "render_agent_api": "renderer",
61
+ }
62
+
63
+ __all__ = [
64
+ "ApiModel",
65
+ "ApiSymbol",
66
+ "ApiSymbolKind",
67
+ "ApiUnit",
68
+ "FieldShape",
69
+ "UnitExample",
70
+ "PythonApiModelBuilder",
71
+ "build_api_model",
72
+ "PythonApiDocsRenderer",
73
+ "render_unit_page",
74
+ "render_index",
75
+ "render_agent_api",
76
+ "Layout",
77
+ "doc_page_output_path",
78
+ "model_cross_href",
79
+ "package_to_path",
80
+ "surface_cross_href",
81
+ ]
82
+
83
+
84
+ def __getattr__(name: str) -> Any:
85
+ submodule = _LAZY.get(name)
86
+ if submodule is None:
87
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
88
+ import importlib
89
+
90
+ mod = importlib.import_module(f"{__name__}.{submodule}")
91
+ return getattr(mod, name)
@@ -0,0 +1,111 @@
1
+ """The Python native SDK api-surface IR (intermediate representation).
2
+
3
+ Mirrors the Java ``JavaApiModel`` IR (server/java/.../apidocs), the C#
4
+ ``CSharpApiModel``, and the TS ``api-model.ts``, idiomatic to the Python
5
+ (Pydantic / FastAPI / ObjectManager) generated surface: Pydantic model /
6
+ ``ObjectManager`` data-access / FastAPI routes / validation / extractor /
7
+ render helper / payload model / output-format prompt / output parser / filter
8
+ allowlist.
9
+
10
+ NAMES on every symbol come from the :mod:`metaobjects.apidocs.naming` seam (never
11
+ re-concatenated in the builder), so what this model documents == what the real
12
+ generators emit.
13
+ """
14
+ from __future__ import annotations
15
+
16
+ from dataclasses import dataclass, field
17
+ from enum import Enum
18
+
19
+
20
+ class ApiSymbolKind(str, Enum):
21
+ """The generated-category axis a documented symbol belongs to (Python /
22
+ Pydantic + FastAPI flavored)."""
23
+
24
+ #: The Pydantic v2 model class (entity) or value-object model.
25
+ MODEL = "model"
26
+ #: Data access — the consumer-implemented repository ``Protocol`` seam.
27
+ DATA_ACCESS = "data_access"
28
+ #: A FastAPI route (named ``"VERB path"``).
29
+ REST = "rest"
30
+ #: Pydantic field validation on the create/update shape.
31
+ VALIDATION = "validation"
32
+ #: The tolerant + strict extractor for a template payload.
33
+ EXTRACTOR = "extractor"
34
+ #: The typed render helper wrapping the render engine.
35
+ RENDER = "render"
36
+ #: The typed payload model bound to a template.
37
+ PAYLOAD = "payload"
38
+ #: The output-format prompt fragment.
39
+ PROMPT = "prompt"
40
+ #: The output parser (``parse_*``) back into the typed payload.
41
+ OUTPUT_PARSER = "output_parser"
42
+ #: The per-entity sort/filter allowlist.
43
+ FILTER = "filter"
44
+
45
+
46
+ @dataclass(frozen=True)
47
+ class FieldShape:
48
+ """A documented field: name + Python type + optionality + an optional note
49
+ (e.g. enum values)."""
50
+
51
+ name: str
52
+ type: str
53
+ optional: bool
54
+ note: str | None = None
55
+
56
+
57
+ @dataclass(frozen=True)
58
+ class UnitExample:
59
+ """A worked example for a unit (reserved for later phases; carried for
60
+ cross-port IR parity)."""
61
+
62
+ title: str
63
+ code: str
64
+
65
+
66
+ @dataclass(frozen=True)
67
+ class ApiSymbol:
68
+ """One documented symbol of the generated Python SDK surface.
69
+
70
+ :param name: the emitted Python identifier (or ``"VERB path"`` for a REST route).
71
+ :param kind: which generated category this symbol belongs to.
72
+ :param module: the import line / module path the symbol lives in.
73
+ :param signature: a human-readable Python signature line.
74
+ :param usage: a one-line "what you use this for".
75
+ :param returns: the symbol's return surface, or ``None``.
76
+ :param fields: per-field shapes for model/validation/payload symbols (may be empty).
77
+ """
78
+
79
+ name: str
80
+ kind: ApiSymbolKind
81
+ module: str
82
+ signature: str
83
+ usage: str
84
+ returns: str | None = None
85
+ fields: list[FieldShape] = field(default_factory=list)
86
+
87
+
88
+ @dataclass(frozen=True)
89
+ class ApiUnit:
90
+ """One documented unit (an entity / value object, or a template) + its symbols.
91
+
92
+ :param node: the unit's short name (the doc-page basename).
93
+ :param package: the unit's metadata package (e.g. ``acme::shop``).
94
+ :param kind: ``"entity"`` | ``"value"`` | ``"template"``.
95
+ :param symbols: the documented symbols, in canonical IR order.
96
+ :param example: an optional unit-level worked example (reserved).
97
+ """
98
+
99
+ node: str
100
+ package: str
101
+ kind: str
102
+ symbols: list[ApiSymbol]
103
+ example: UnitExample | None = None
104
+
105
+
106
+ @dataclass(frozen=True)
107
+ class ApiModel:
108
+ """The full per-project Python SDK api surface IR."""
109
+
110
+ project: str
111
+ units: list[ApiUnit]