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.
- {metaobjects-0.9.0 → metaobjects-0.11.0}/PKG-INFO +1 -1
- {metaobjects-0.9.0 → metaobjects-0.11.0}/pyproject.toml +16 -1
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/skills/metaobjects-authoring/SKILL.md +87 -9
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/skills/metaobjects-codegen/references/typescript.md +30 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/skills/metaobjects-prompts/SKILL.md +41 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/skills/metaobjects-verify/references/migration.md +34 -1
- metaobjects-0.11.0/src/metaobjects/apidocs/__init__.py +91 -0
- metaobjects-0.11.0/src/metaobjects/apidocs/api_model.py +111 -0
- metaobjects-0.11.0/src/metaobjects/apidocs/builder.py +389 -0
- metaobjects-0.11.0/src/metaobjects/apidocs/naming.py +123 -0
- metaobjects-0.11.0/src/metaobjects/apidocs/paths.py +75 -0
- metaobjects-0.11.0/src/metaobjects/apidocs/renderer.py +185 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/cli.py +106 -0
- metaobjects-0.11.0/src/metaobjects/codegen/config.py +19 -0
- metaobjects-0.11.0/src/metaobjects/codegen/constants.py +28 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/extract_delegate_emitter.py +1 -1
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/extract_schema_emitter.py +1 -1
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/format.py +12 -1
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/fr010_field_mapping.py +4 -4
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/generators/entity_model.py +99 -27
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/generators/extractor_generator.py +1 -10
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/generators/filter_allowlist_generator.py +5 -19
- metaobjects-0.11.0/src/metaobjects/codegen/generators/fr019_shared_enum.py +135 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/generators/m2m_codegen.py +1 -1
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/generators/output_parser_generator.py +1 -12
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/generators/output_prompt_generator.py +1 -11
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/generators/payload_vo_generator.py +44 -26
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/generators/render_helper_generator.py +7 -14
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/generators/router_generator.py +6 -30
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/output_format_spec_emitter.py +2 -2
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/runner.py +20 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/type_map.py +6 -3
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/core_types.py +140 -221
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/documentation/doc_constants.py +2 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/documentation/doc_schema.py +2 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/errors.py +57 -0
- metaobjects-0.11.0/src/metaobjects/loader/registered_validation.py +95 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/loader/validate_discriminator.py +1 -1
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/loader/validate_source_parameter_ref.py +6 -1
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/loader/validation_passes.py +161 -7
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/field/field_constants.py +6 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/object/object_constants.py +8 -1
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/validator/validator_constants.py +13 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/persistence/db/db_constants.py +18 -0
- metaobjects-0.11.0/src/metaobjects/meta/persistence/db/db_provider.py +141 -0
- metaobjects-0.11.0/src/metaobjects/meta/presentation/ui/ui_provider.py +53 -0
- metaobjects-0.11.0/src/metaobjects/meta/provider_extends.py +80 -0
- metaobjects-0.11.0/src/metaobjects/meta/template/prompt_provider.py +63 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/template/template_constants.py +1 -1
- metaobjects-0.11.0/src/metaobjects/naming_refs.py +141 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/parser.py +50 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/provider.py +12 -1
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/registry.py +54 -1
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/registry_manifest.py +122 -13
- metaobjects-0.11.0/src/metaobjects/spec_metamodel/__init__.py +595 -0
- metaobjects-0.11.0/src/metaobjects/spec_metamodel/attr.json +59 -0
- metaobjects-0.11.0/src/metaobjects/spec_metamodel/db.json +60 -0
- metaobjects-0.11.0/src/metaobjects/spec_metamodel/documentation.json +78 -0
- metaobjects-0.11.0/src/metaobjects/spec_metamodel/field.json +139 -0
- metaobjects-0.11.0/src/metaobjects/spec_metamodel/identity.json +35 -0
- metaobjects-0.11.0/src/metaobjects/spec_metamodel/layout.json +15 -0
- metaobjects-0.11.0/src/metaobjects/spec_metamodel/object.json +47 -0
- metaobjects-0.11.0/src/metaobjects/spec_metamodel/origin.json +38 -0
- metaobjects-0.11.0/src/metaobjects/spec_metamodel/prompt.json +76 -0
- metaobjects-0.11.0/src/metaobjects/spec_metamodel/relationship.json +65 -0
- metaobjects-0.11.0/src/metaobjects/spec_metamodel/source.json +16 -0
- metaobjects-0.11.0/src/metaobjects/spec_metamodel/template.json +29 -0
- metaobjects-0.11.0/src/metaobjects/spec_metamodel/ui.json +33 -0
- metaobjects-0.11.0/src/metaobjects/spec_metamodel/validator.json +98 -0
- metaobjects-0.11.0/src/metaobjects/spec_metamodel/view.json +75 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/super_resolve.py +70 -2
- metaobjects-0.11.0/src/metaobjects/validation_types.py +39 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/yaml_desugar.py +77 -9
- metaobjects-0.11.0/tests/codegen/test_api_docs_builder.py +88 -0
- metaobjects-0.11.0/tests/codegen/test_api_docs_paths.py +59 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_entity_model.py +49 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_enum_conformance.py +11 -7
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_format.py +11 -0
- metaobjects-0.11.0/tests/codegen/test_fr019_shared_provided_conformance.py +99 -0
- metaobjects-0.11.0/tests/codegen/test_inherit_without_restate_gate.py +54 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_payload_vo_generator.py +29 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_render_helper_generator.py +22 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_runner.py +48 -2
- metaobjects-0.11.0/tests/conformance/conformance-expected-failures.json +25 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/conformance/conformance_adapter.py +14 -3
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/conformance/fixture_discovery.py +16 -3
- metaobjects-0.11.0/tests/conformance/test_api_docs_cross_port_conformance.py +98 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/conformance/test_extract_conformance.py +1 -1
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/conformance/test_fr010_loader_attrs.py +5 -2
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/conformance/test_fr011_attrs.py +5 -2
- metaobjects-0.11.0/tests/conformance/test_spec_metamodel_embed.py +59 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/render/test_output_prompt_conformance.py +1 -1
- metaobjects-0.11.0/tests/test_api_docs_accuracy.py +234 -0
- metaobjects-0.11.0/tests/unit/__init__.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_common_attrs.py +5 -4
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_loader.py +3 -1
- metaobjects-0.11.0/tests/unit/test_strict_child_placement.py +73 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_template_toolcall.py +5 -3
- metaobjects-0.11.0/tests/unit/test_template_wrong_subtype_attrs.py +84 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_validation_attr_schema.py +5 -2
- {metaobjects-0.9.0 → metaobjects-0.11.0}/uv.lock +8 -2
- metaobjects-0.9.0/src/metaobjects/codegen/config.py +0 -11
- metaobjects-0.9.0/src/metaobjects/codegen/constants.py +0 -13
- metaobjects-0.9.0/src/metaobjects/meta/persistence/db/db_provider.py +0 -60
- metaobjects-0.9.0/src/metaobjects/meta/template/template_provider.py +0 -43
- metaobjects-0.9.0/tests/conformance/conformance-expected-failures.json +0 -5
- {metaobjects-0.9.0 → metaobjects-0.11.0}/.gitignore +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/LICENSE +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/README.md +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/hatch_build.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/__init__.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/__init__.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/README.md +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/servers/csharp.meta.json +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/servers/java.meta.json +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/servers/kotlin.meta.json +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/servers/python.meta.json +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/servers/typescript.meta.json +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/skills/metaobjects-codegen/SKILL.md +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/skills/metaobjects-codegen/references/csharp.md +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/skills/metaobjects-codegen/references/java.md +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/skills/metaobjects-codegen/references/kotlin.md +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/skills/metaobjects-prompts/references/csharp.md +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/skills/metaobjects-prompts/references/java.md +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/skills/metaobjects-prompts/references/kotlin.md +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/skills/metaobjects-prompts/references/python.md +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/skills/metaobjects-prompts/references/typescript.md +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/skills/metaobjects-runtime-ui/SKILL.md +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/skills/metaobjects-runtime-ui/references/java.md +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/skills/metaobjects-runtime-ui/references/kotlin.md +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/skills/metaobjects-runtime-ui/references/react.md +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/skills/metaobjects-runtime-ui/references/tanstack.md +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/skills/metaobjects-runtime-ui/references/typescript.md +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/skills/metaobjects-verify/SKILL.md +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/_content/templates/always-on.md.mustache +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/assemble.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/content_root.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/scaffold.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/agent_context/types.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/attr_class_map.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/KNOWN_GAPS.md +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/__init__.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/generator.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/generator_registry.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/generators/__init__.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/generators/template_generator.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/generators/tph_plan.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/generators/trace_helper_generator.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/instance_artifacts.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/overwrite_policy.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/runtime/__init__.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/codegen/runtime/filter_parser.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/datatype.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/documentation/__init__.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/documentation/doc_provider.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/loader/__init__.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/loader/merge.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/loader/meta_data_loader.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/loader/sources/__init__.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/loader/sources/directory_source.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/loader/sources/file_source.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/loader/sources/meta_data_source.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/loader/sources/uri_source.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/loader/validate_field_readonly.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/loader/validate_source_physical_names.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/__init__.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/__init__.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/attr/__init__.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/attr/attr_constants.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/attr/meta_attr.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/field/__init__.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/field/meta_field.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/identity/__init__.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/identity/identity_constants.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/identity/meta_identity.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/object/__init__.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/object/meta_object.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/object/meta_object_aware.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/object/object_class_registry.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/object/object_extract.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/object/value_object.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/relationship/__init__.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/relationship/derive_m2m_fields.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/relationship/meta_relationship.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/relationship/relationship_constants.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/core/validator/__init__.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/meta_data.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/meta_root.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/persistence/__init__.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/persistence/db/__init__.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/persistence/origin/__init__.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/persistence/origin/meta_origin.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/persistence/origin/origin_constants.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/persistence/source/__init__.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/persistence/source/meta_source.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/persistence/source/source_constants.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/presentation/__init__.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/presentation/layout/__init__.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/presentation/layout/layout_constants.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/presentation/layout/meta_layout.py +0 -0
- {metaobjects-0.9.0/src/metaobjects/meta/presentation/view → metaobjects-0.11.0/src/metaobjects/meta/presentation/ui}/__init__.py +0 -0
- {metaobjects-0.9.0/src/metaobjects/meta/template → metaobjects-0.11.0/src/metaobjects/meta/presentation/view}/__init__.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/presentation/view/meta_view.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/presentation/view/view_constants.py +0 -0
- {metaobjects-0.9.0/src/metaobjects/shared → metaobjects-0.11.0/src/metaobjects/meta/template}/__init__.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/meta/template/meta_template.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/parser_yaml.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/py.typed +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/__init__.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/email_document.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/escapers.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/extract/KNOWN_GAPS.md +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/extract/__init__.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/extract/coerce.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/extract/extract.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/extract/extract_map.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/extract/json_forgiving_reader.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/extract/locate.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/extract/normalize.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/extract/strip.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/extract/types.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/extract/xml_forgiving_reader.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/filesystem_provider.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/prompt/__init__.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/prompt/output_format_renderer.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/prompt/output_format_spec.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/prompt/prompt_field.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/prompt/prompt_overrides.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/prompt/prompt_style.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/renderer.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/render/verify.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/runtime/__init__.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/runtime/llm_recorder.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/runtime/n2m_resolver.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/runtime/object_manager.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/runtime/tph.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/serializer_json.py +0 -0
- {metaobjects-0.9.0/tests → metaobjects-0.11.0/src/metaobjects/shared}/__init__.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/shared/base_types.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/shared/separators.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/shared/structural.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/source/__init__.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/source/error_source.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/source/json_path.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/source/semantic_diff.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/src/metaobjects/source/yaml_positions.py +0 -0
- {metaobjects-0.9.0/tests/codegen → metaobjects-0.11.0/tests}/__init__.py +0 -0
- {metaobjects-0.9.0/tests/conformance → metaobjects-0.11.0/tests/codegen}/__init__.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/golden/extends/expected/BaseEntity.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/golden/extends/expected/Program.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/golden/extends/meta.json +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/golden/nested-array/expected/AuthorBrief.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/golden/nested-array/expected/PostBrief.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/golden/nested-array/meta.json +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/golden/scalars/expected/Metric.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/golden/scalars/expected/Report.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/golden/scalars/meta.json +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/golden/vanilla/expected/Subscriber.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/golden/vanilla/meta.json +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_abstract_conformance.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_cli.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_cli_registry.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_cli_staleness_nudge.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_cli_verify_subverbs.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_constants_config.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_extractor_generator.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_filter_allowlist_generator.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_fr010_output_codegen.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_generator.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_generator_extension_seams.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_golden.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_inheritance_conformance.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_instance_artifacts.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_m2m_codegen.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_output_parser_generator.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_overwrite_policy.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_render_helper_conformance.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_router_generator.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_template_generator.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_tph_codegen.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_trace_helper_generator.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_type_map.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/codegen/test_validation_conformance.py +0 -0
- {metaobjects-0.9.0/tests/integration → metaobjects-0.11.0/tests/conformance}/__init__.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/conformance/capabilities.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/conformance/corpus.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/conformance/expected_failures.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/conformance/navigator.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/conformance/test_agent_context_conformance.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/conformance/test_conformance.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/conformance/test_extract_object_verdict.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/conformance/test_generator_registry_conformance.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/conformance/test_object_model_conformance.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/conformance/test_registry_conformance.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/conformance/test_runner_hardfail.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/conformance/test_strict_attr_load.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/conformance/test_template_generator_conformance.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/conformance/test_yaml_conformance.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/conformance/yaml-conformance-expected-failures.json +0 -0
- {metaobjects-0.9.0/tests/render → metaobjects-0.11.0/tests/integration}/__init__.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/integration/api_contract_assertions.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/integration/api_contract_m2m_server.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/integration/api_contract_server.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/integration/generated_m2m_app.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/integration/generated_router_app.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/integration/generated_tph_app.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/integration/meta_ai_trace.yaml +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/integration/normalization.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/integration/postgres_container.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/integration/query_runner.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/integration/scenarios.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/integration/test_api_contract.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/integration/test_api_contract_generated.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/integration/test_api_contract_m2m.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/integration/test_api_contract_m2m_generated.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/integration/test_api_contract_tph_generated.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/integration/test_llm_call_trace.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/integration/test_normalization.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/integration/test_query_scenarios.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/integration/test_runtime_return_types.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/open_closed_proof_test.py +0 -0
- {metaobjects-0.9.0/tests/render/extract → metaobjects-0.11.0/tests/render}/__init__.py +0 -0
- {metaobjects-0.9.0/tests/render/prompt → metaobjects-0.11.0/tests/render/extract}/__init__.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/render/extract/test_coerce.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/render/extract/test_extract.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/render/extract/test_extract_map.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/render/extract/test_json_forgiving_reader.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/render/extract/test_locate.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/render/extract/test_model.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/render/extract/test_normalize.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/render/extract/test_strip.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/render/extract/test_xml_forgiving_reader.py +0 -0
- {metaobjects-0.9.0/tests/source → metaobjects-0.11.0/tests/render/prompt}/__init__.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/render/prompt/test_output_format_renderer.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/render/test_email_document.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/render/test_filesystem_provider.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/render/test_output_format_renderer_nested.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/render/test_render_conformance.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/render/test_render_max_chars.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/render/test_verify.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/render/test_verify_conformance.py +0 -0
- {metaobjects-0.9.0/tests/unit → metaobjects-0.11.0/tests/source}/__init__.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/source/test_fr5c_merge_attribution.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/source/test_fr5d_reference_resolution.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/source/test_fr5e_database_source_shape.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/source/test_json_path.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/source/test_semantic_diff.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/source/test_source_on_node.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/source/test_yaml_positions.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_agent_context_staleness.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_capabilities.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_core_types.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_effective_package.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_errors.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_field_enum.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_field_uuid_dbcolumntype.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_fr016_source_name_and_kind_aliases.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_llm_recorder.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_loader_bom.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_loader_class.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_merge.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_meta_attr.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_meta_data.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_meta_source.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_module_shortcuts.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_n2m_resolver.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_object_manager_uuid_coercion.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_one_primary_source.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_parser.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_parser_yaml.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_provider.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_provider_extension.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_registry.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_registry_completeness.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_registry_extend.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_registry_sealed.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_relationship_referential_actions.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_resolution_key.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_runtime_resolution_key_binding.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_serializer.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_shared_constants.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_smoke.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_sources.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_super_resolve.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_validation_filter_values.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_validation_origin_paths.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_validation_sort_field.py +0 -0
- {metaobjects-0.9.0 → metaobjects-0.11.0}/tests/unit/test_validation_warnings.py +0 -0
- {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.
|
|
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.
|
|
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
|
-
|
|
255
|
-
|
|
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,
|
|
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]
|