metaobjects 0.11.1__tar.gz → 0.12.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- metaobjects-0.12.1/.gitignore +6 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/PKG-INFO +13 -1
- {metaobjects-0.11.1 → metaobjects-0.12.1}/README.md +12 -0
- metaobjects-0.12.1/hatch_build.py +15 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/pyproject.toml +1 -1
- metaobjects-0.12.1/src/metaobjects/agent_context/__init__.py +24 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/agent_context/scaffold.py +10 -99
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/cli.py +46 -132
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/codegen/generators/entity_model.py +34 -2
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/loader/validation_passes.py +641 -59
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/persistence/db/db_constants.py +6 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/spec_metamodel/db.json +1 -1
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/spec_metamodel/field.json +20 -7
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/spec_metamodel/identity.json +3 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/spec_metamodel/object.json +3 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/spec_metamodel/origin.json +3 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/spec_metamodel/relationship.json +3 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/spec_metamodel/source.json +1 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/spec_metamodel/template.json +2 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/spec_metamodel/validator.json +10 -1
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/test_cli.py +24 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/test_entity_model.py +54 -0
- metaobjects-0.12.1/tests/codegen/test_projection_compile.py +55 -0
- metaobjects-0.12.1/tests/conformance/conformance-expected-failures.json +6 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_agent_context_staleness.py +8 -21
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_fr016_source_name_and_kind_aliases.py +22 -14
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_validation_origin_paths.py +15 -6
- {metaobjects-0.11.1 → metaobjects-0.12.1}/uv.lock +1 -1
- metaobjects-0.11.1/.gitignore +0 -8
- metaobjects-0.11.1/hatch_build.py +0 -39
- metaobjects-0.11.1/src/metaobjects/agent_context/__init__.py +0 -55
- metaobjects-0.11.1/src/metaobjects/agent_context/_content/README.md +0 -14
- metaobjects-0.11.1/src/metaobjects/agent_context/_content/servers/csharp.meta.json +0 -5
- metaobjects-0.11.1/src/metaobjects/agent_context/_content/servers/java.meta.json +0 -5
- metaobjects-0.11.1/src/metaobjects/agent_context/_content/servers/kotlin.meta.json +0 -5
- metaobjects-0.11.1/src/metaobjects/agent_context/_content/servers/python.meta.json +0 -5
- metaobjects-0.11.1/src/metaobjects/agent_context/_content/servers/typescript.meta.json +0 -5
- metaobjects-0.11.1/src/metaobjects/agent_context/_content/skills/metaobjects-authoring/SKILL.md +0 -379
- metaobjects-0.11.1/src/metaobjects/agent_context/_content/skills/metaobjects-codegen/SKILL.md +0 -99
- metaobjects-0.11.1/src/metaobjects/agent_context/_content/skills/metaobjects-codegen/references/csharp.md +0 -87
- metaobjects-0.11.1/src/metaobjects/agent_context/_content/skills/metaobjects-codegen/references/java.md +0 -94
- metaobjects-0.11.1/src/metaobjects/agent_context/_content/skills/metaobjects-codegen/references/kotlin.md +0 -110
- metaobjects-0.11.1/src/metaobjects/agent_context/_content/skills/metaobjects-codegen/references/typescript.md +0 -165
- metaobjects-0.11.1/src/metaobjects/agent_context/_content/skills/metaobjects-prompts/SKILL.md +0 -189
- metaobjects-0.11.1/src/metaobjects/agent_context/_content/skills/metaobjects-prompts/references/csharp.md +0 -110
- metaobjects-0.11.1/src/metaobjects/agent_context/_content/skills/metaobjects-prompts/references/java.md +0 -108
- metaobjects-0.11.1/src/metaobjects/agent_context/_content/skills/metaobjects-prompts/references/kotlin.md +0 -130
- metaobjects-0.11.1/src/metaobjects/agent_context/_content/skills/metaobjects-prompts/references/python.md +0 -116
- metaobjects-0.11.1/src/metaobjects/agent_context/_content/skills/metaobjects-prompts/references/typescript.md +0 -150
- metaobjects-0.11.1/src/metaobjects/agent_context/_content/skills/metaobjects-runtime-ui/SKILL.md +0 -130
- metaobjects-0.11.1/src/metaobjects/agent_context/_content/skills/metaobjects-runtime-ui/references/java.md +0 -96
- metaobjects-0.11.1/src/metaobjects/agent_context/_content/skills/metaobjects-runtime-ui/references/kotlin.md +0 -99
- metaobjects-0.11.1/src/metaobjects/agent_context/_content/skills/metaobjects-runtime-ui/references/react.md +0 -86
- metaobjects-0.11.1/src/metaobjects/agent_context/_content/skills/metaobjects-runtime-ui/references/tanstack.md +0 -119
- metaobjects-0.11.1/src/metaobjects/agent_context/_content/skills/metaobjects-runtime-ui/references/typescript.md +0 -92
- metaobjects-0.11.1/src/metaobjects/agent_context/_content/skills/metaobjects-verify/SKILL.md +0 -107
- metaobjects-0.11.1/src/metaobjects/agent_context/_content/skills/metaobjects-verify/references/migration.md +0 -105
- metaobjects-0.11.1/src/metaobjects/agent_context/_content/templates/always-on.md.mustache +0 -27
- metaobjects-0.11.1/src/metaobjects/agent_context/assemble.py +0 -133
- metaobjects-0.11.1/src/metaobjects/agent_context/content_root.py +0 -54
- metaobjects-0.11.1/src/metaobjects/agent_context/types.py +0 -44
- metaobjects-0.11.1/tests/conformance/conformance-expected-failures.json +0 -25
- metaobjects-0.11.1/tests/conformance/test_agent_context_conformance.py +0 -79
- {metaobjects-0.11.1 → metaobjects-0.12.1}/LICENSE +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/__init__.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/apidocs/__init__.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/apidocs/api_model.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/apidocs/builder.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/apidocs/naming.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/apidocs/paths.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/apidocs/renderer.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/attr_class_map.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/codegen/KNOWN_GAPS.md +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/codegen/__init__.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/codegen/config.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/codegen/constants.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/codegen/extract_delegate_emitter.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/codegen/extract_schema_emitter.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/codegen/format.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/codegen/fr010_field_mapping.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/codegen/generator.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/codegen/generator_registry.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/codegen/generators/__init__.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/codegen/generators/extractor_generator.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/codegen/generators/filter_allowlist_generator.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/codegen/generators/fr019_shared_enum.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/codegen/generators/m2m_codegen.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/codegen/generators/output_parser_generator.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/codegen/generators/output_prompt_generator.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/codegen/generators/payload_vo_generator.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/codegen/generators/render_helper_generator.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/codegen/generators/router_generator.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/codegen/generators/template_generator.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/codegen/generators/tph_plan.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/codegen/generators/trace_helper_generator.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/codegen/instance_artifacts.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/codegen/output_format_spec_emitter.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/codegen/overwrite_policy.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/codegen/runner.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/codegen/runtime/__init__.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/codegen/runtime/filter_parser.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/codegen/type_map.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/core_types.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/datatype.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/documentation/__init__.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/documentation/doc_constants.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/documentation/doc_provider.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/documentation/doc_schema.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/errors.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/loader/__init__.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/loader/merge.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/loader/meta_data_loader.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/loader/registered_validation.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/loader/sources/__init__.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/loader/sources/directory_source.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/loader/sources/file_source.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/loader/sources/meta_data_source.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/loader/sources/uri_source.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/loader/validate_discriminator.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/loader/validate_field_readonly.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/loader/validate_source_parameter_ref.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/loader/validate_source_physical_names.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/__init__.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/core/__init__.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/core/attr/__init__.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/core/attr/attr_constants.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/core/attr/meta_attr.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/core/field/__init__.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/core/field/field_constants.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/core/field/meta_field.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/core/identity/__init__.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/core/identity/identity_constants.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/core/identity/meta_identity.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/core/object/__init__.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/core/object/meta_object.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/core/object/meta_object_aware.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/core/object/object_class_registry.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/core/object/object_constants.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/core/object/object_extract.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/core/object/value_object.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/core/relationship/__init__.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/core/relationship/derive_m2m_fields.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/core/relationship/meta_relationship.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/core/relationship/relationship_constants.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/core/validator/__init__.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/core/validator/validator_constants.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/meta_data.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/meta_root.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/persistence/__init__.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/persistence/db/__init__.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/persistence/db/db_provider.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/persistence/origin/__init__.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/persistence/origin/meta_origin.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/persistence/origin/origin_constants.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/persistence/source/__init__.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/persistence/source/meta_source.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/persistence/source/source_constants.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/presentation/__init__.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/presentation/layout/__init__.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/presentation/layout/layout_constants.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/presentation/layout/meta_layout.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/presentation/ui/__init__.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/presentation/ui/ui_provider.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/presentation/view/__init__.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/presentation/view/meta_view.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/presentation/view/view_constants.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/provider_extends.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/template/__init__.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/template/meta_template.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/template/prompt_provider.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/meta/template/template_constants.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/naming_refs.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/parser.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/parser_yaml.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/provider.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/py.typed +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/registry.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/registry_manifest.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/render/__init__.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/render/email_document.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/render/escapers.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/render/extract/KNOWN_GAPS.md +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/render/extract/__init__.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/render/extract/coerce.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/render/extract/extract.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/render/extract/extract_map.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/render/extract/json_forgiving_reader.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/render/extract/locate.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/render/extract/normalize.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/render/extract/strip.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/render/extract/types.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/render/extract/xml_forgiving_reader.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/render/filesystem_provider.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/render/prompt/__init__.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/render/prompt/output_format_renderer.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/render/prompt/output_format_spec.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/render/prompt/prompt_field.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/render/prompt/prompt_overrides.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/render/prompt/prompt_style.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/render/renderer.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/render/verify.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/runtime/__init__.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/runtime/llm_recorder.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/runtime/n2m_resolver.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/runtime/object_manager.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/runtime/tph.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/serializer_json.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/shared/__init__.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/shared/base_types.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/shared/separators.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/shared/structural.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/source/__init__.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/source/error_source.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/source/json_path.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/source/semantic_diff.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/source/yaml_positions.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/spec_metamodel/__init__.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/spec_metamodel/attr.json +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/spec_metamodel/documentation.json +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/spec_metamodel/layout.json +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/spec_metamodel/prompt.json +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/spec_metamodel/ui.json +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/spec_metamodel/view.json +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/super_resolve.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/validation_types.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/yaml_desugar.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/__init__.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/__init__.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/golden/extends/expected/BaseEntity.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/golden/extends/expected/Program.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/golden/extends/meta.json +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/golden/nested-array/expected/AuthorBrief.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/golden/nested-array/expected/PostBrief.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/golden/nested-array/meta.json +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/golden/scalars/expected/Metric.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/golden/scalars/expected/Report.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/golden/scalars/meta.json +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/golden/vanilla/expected/Subscriber.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/golden/vanilla/meta.json +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/test_abstract_conformance.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/test_api_docs_builder.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/test_api_docs_paths.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/test_cli_registry.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/test_cli_staleness_nudge.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/test_cli_verify_subverbs.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/test_constants_config.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/test_enum_conformance.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/test_extractor_generator.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/test_filter_allowlist_generator.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/test_format.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/test_fr010_output_codegen.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/test_fr019_shared_provided_conformance.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/test_generator.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/test_generator_extension_seams.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/test_golden.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/test_inherit_without_restate_gate.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/test_inheritance_conformance.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/test_instance_artifacts.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/test_m2m_codegen.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/test_output_parser_generator.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/test_overwrite_policy.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/test_payload_vo_generator.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/test_render_helper_conformance.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/test_render_helper_generator.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/test_router_generator.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/test_runner.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/test_template_generator.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/test_tph_codegen.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/test_trace_helper_generator.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/test_type_map.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/codegen/test_validation_conformance.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/conformance/__init__.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/conformance/capabilities.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/conformance/conformance_adapter.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/conformance/corpus.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/conformance/expected_failures.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/conformance/fixture_discovery.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/conformance/navigator.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/conformance/test_api_docs_cross_port_conformance.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/conformance/test_conformance.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/conformance/test_extract_conformance.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/conformance/test_extract_object_verdict.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/conformance/test_fr010_loader_attrs.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/conformance/test_fr011_attrs.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/conformance/test_generator_registry_conformance.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/conformance/test_object_model_conformance.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/conformance/test_registry_conformance.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/conformance/test_runner_hardfail.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/conformance/test_spec_metamodel_embed.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/conformance/test_strict_attr_load.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/conformance/test_template_generator_conformance.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/conformance/test_yaml_conformance.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/conformance/yaml-conformance-expected-failures.json +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/integration/__init__.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/integration/api_contract_assertions.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/integration/api_contract_m2m_server.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/integration/api_contract_server.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/integration/generated_m2m_app.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/integration/generated_router_app.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/integration/generated_tph_app.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/integration/meta_ai_trace.yaml +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/integration/normalization.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/integration/postgres_container.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/integration/query_runner.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/integration/scenarios.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/integration/test_api_contract.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/integration/test_api_contract_generated.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/integration/test_api_contract_m2m.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/integration/test_api_contract_m2m_generated.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/integration/test_api_contract_tph_generated.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/integration/test_llm_call_trace.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/integration/test_normalization.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/integration/test_query_scenarios.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/integration/test_runtime_return_types.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/open_closed_proof_test.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/render/__init__.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/render/extract/__init__.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/render/extract/test_coerce.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/render/extract/test_extract.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/render/extract/test_extract_map.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/render/extract/test_json_forgiving_reader.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/render/extract/test_locate.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/render/extract/test_model.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/render/extract/test_normalize.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/render/extract/test_strip.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/render/extract/test_xml_forgiving_reader.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/render/prompt/__init__.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/render/prompt/test_output_format_renderer.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/render/test_email_document.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/render/test_filesystem_provider.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/render/test_output_format_renderer_nested.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/render/test_output_prompt_conformance.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/render/test_render_conformance.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/render/test_render_max_chars.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/render/test_verify.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/render/test_verify_conformance.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/source/__init__.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/source/test_fr5c_merge_attribution.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/source/test_fr5d_reference_resolution.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/source/test_fr5e_database_source_shape.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/source/test_json_path.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/source/test_semantic_diff.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/source/test_source_on_node.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/source/test_yaml_positions.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/test_api_docs_accuracy.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/__init__.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_capabilities.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_common_attrs.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_core_types.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_effective_package.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_errors.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_field_enum.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_field_map_validation.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_field_uuid_dbcolumntype.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_llm_recorder.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_loader.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_loader_bom.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_loader_class.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_merge.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_meta_attr.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_meta_data.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_meta_source.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_module_shortcuts.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_n2m_resolver.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_object_manager_uuid_coercion.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_one_primary_source.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_parser.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_parser_yaml.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_provider.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_provider_extension.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_registry.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_registry_completeness.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_registry_extend.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_registry_sealed.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_relationship_referential_actions.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_resolution_key.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_runtime_resolution_key_binding.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_serializer.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_shared_constants.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_smoke.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_sources.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_strict_child_placement.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_super_resolve.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_template_toolcall.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_template_wrong_subtype_attrs.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_validation_attr_schema.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_validation_filter_values.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_validation_sort_field.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/tests/unit/test_validation_warnings.py +0 -0
- {metaobjects-0.11.1 → metaobjects-0.12.1}/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.12.1
|
|
4
4
|
Summary: Cross-language metadata standard: declare typed entities once, generate idiomatic drift-checked code across languages — Python port.
|
|
5
5
|
Project-URL: Homepage, https://metaobjects.dev
|
|
6
6
|
Project-URL: Repository, https://github.com/metaobjectsdev/metaobjects
|
|
@@ -86,6 +86,18 @@ verify), `runtime` (SQLAlchemy-Core object manager), and `migrate`.
|
|
|
86
86
|
([ADR-0006](https://github.com/metaobjectsdev/metaobjects/blob/main/spec/decisions/ADR-0006-ai-first-yaml-authoring.md)).
|
|
87
87
|
Desugared to canonical JSON at load time. A directory may mix both freely.
|
|
88
88
|
|
|
89
|
+
## AI assistant context
|
|
90
|
+
|
|
91
|
+
To scaffold MetaObjects context files (`.metaobjects/AGENTS.md`, `.metaobjects/CLAUDE.md`, and
|
|
92
|
+
`.claude/skills/metaobjects-*/`) into your project so your AI assistant understands how to
|
|
93
|
+
author metadata and run codegen, use the Node `meta` CLI:
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
npx meta agent-docs --server python
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
(Running `metaobjects agent-docs` in the Python CLI prints this redirect and exits.)
|
|
100
|
+
|
|
89
101
|
## Links
|
|
90
102
|
|
|
91
103
|
- Standard, docs, and the other four ports: <https://metaobjects.dev>
|
|
@@ -51,6 +51,18 @@ verify), `runtime` (SQLAlchemy-Core object manager), and `migrate`.
|
|
|
51
51
|
([ADR-0006](https://github.com/metaobjectsdev/metaobjects/blob/main/spec/decisions/ADR-0006-ai-first-yaml-authoring.md)).
|
|
52
52
|
Desugared to canonical JSON at load time. A directory may mix both freely.
|
|
53
53
|
|
|
54
|
+
## AI assistant context
|
|
55
|
+
|
|
56
|
+
To scaffold MetaObjects context files (`.metaobjects/AGENTS.md`, `.metaobjects/CLAUDE.md`, and
|
|
57
|
+
`.claude/skills/metaobjects-*/`) into your project so your AI assistant understands how to
|
|
58
|
+
author metadata and run codegen, use the Node `meta` CLI:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
npx meta agent-docs --server python
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
(Running `metaobjects agent-docs` in the Python CLI prints this redirect and exits.)
|
|
65
|
+
|
|
54
66
|
## Links
|
|
55
67
|
|
|
56
68
|
- Standard, docs, and the other four ports: <https://metaobjects.dev>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"""Build hook — no-op.
|
|
2
|
+
|
|
3
|
+
The ``agent-context/`` content tree vendoring into ``_content/`` has been removed:
|
|
4
|
+
agent-context scaffolding is now owned by the Node ``meta agent-docs`` CLI. This
|
|
5
|
+
file is kept as a no-op to avoid breaking any build tooling that references it.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from hatchling.builders.hooks.plugin.interface import BuildHookInterface
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class CustomBuildHook(BuildHookInterface):
|
|
14
|
+
def initialize(self, version: str, build_data: dict) -> None:
|
|
15
|
+
pass # Nothing to vendor — scaffolding moved to the Node meta CLI.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "metaobjects"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.12.1"
|
|
4
4
|
description = "Cross-language metadata standard: declare typed entities once, generate idiomatic drift-checked code across languages — Python port."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.11"
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"""Agent-context staleness nudge — manifest reader for gen/verify.
|
|
2
|
+
|
|
3
|
+
The assembly path has moved to the Node ``meta agent-docs`` CLI. This package
|
|
4
|
+
now only exposes the staleness-nudge symbols (``agent_context_staleness``,
|
|
5
|
+
``Manifest``, ``AGENT_CONTEXT_MANIFEST_PATH``, ``installed_metaobjects_version``)
|
|
6
|
+
used by ``gen``/``verify`` to detect when the copied-in agent context predates
|
|
7
|
+
the installed MetaObjects version.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
from .scaffold import (
|
|
13
|
+
AGENT_CONTEXT_MANIFEST_PATH,
|
|
14
|
+
Manifest,
|
|
15
|
+
agent_context_staleness,
|
|
16
|
+
installed_metaobjects_version,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
__all__ = [
|
|
20
|
+
"AGENT_CONTEXT_MANIFEST_PATH",
|
|
21
|
+
"Manifest",
|
|
22
|
+
"agent_context_staleness",
|
|
23
|
+
"installed_metaobjects_version",
|
|
24
|
+
]
|
|
@@ -1,24 +1,18 @@
|
|
|
1
|
-
"""
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
hand-edited file is preserved — the fresh contents go to ``<path>.new`` instead.
|
|
1
|
+
"""Sidecar manifest + staleness nudge for the agent-context scaffolder.
|
|
2
|
+
|
|
3
|
+
The assembly path (assemble / plan_scaffold / ScaffoldDecision) has been removed —
|
|
4
|
+
that work is now owned by the Node ``meta agent-docs`` CLI. This module retains
|
|
5
|
+
only the staleness-nudge machinery (``agent_context_staleness``, ``Manifest``,
|
|
6
|
+
``AGENT_CONTEXT_MANIFEST_PATH``, ``installed_metaobjects_version``) which is used
|
|
7
|
+
by ``gen``/``verify`` to detect when the scaffolded agent context predates the
|
|
8
|
+
installed MetaObjects version.
|
|
10
9
|
"""
|
|
11
10
|
|
|
12
11
|
from __future__ import annotations
|
|
13
12
|
|
|
14
|
-
import
|
|
15
|
-
from collections.abc import Callable
|
|
16
|
-
from dataclasses import dataclass, field
|
|
13
|
+
from dataclasses import dataclass
|
|
17
14
|
from importlib.metadata import PackageNotFoundError, version as _pkg_version
|
|
18
15
|
|
|
19
|
-
from .assemble import AssembledFile
|
|
20
|
-
from .types import Stack
|
|
21
|
-
|
|
22
16
|
#: Consumer-relative path of the sidecar manifest that tracks scaffolded files.
|
|
23
17
|
AGENT_CONTEXT_MANIFEST_PATH = ".metaobjects/.agent-context.json"
|
|
24
18
|
|
|
@@ -82,89 +76,6 @@ class Manifest:
|
|
|
82
76
|
)
|
|
83
77
|
|
|
84
78
|
|
|
85
|
-
@dataclass
|
|
86
|
-
class _Write:
|
|
87
|
-
path: str
|
|
88
|
-
contents: str
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
@dataclass
|
|
92
|
-
class _Conflict:
|
|
93
|
-
path: str
|
|
94
|
-
new_path: str
|
|
95
|
-
contents: str
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
@dataclass
|
|
99
|
-
class ScaffoldDecision:
|
|
100
|
-
"""The outcome of planning a (re-)scaffold."""
|
|
101
|
-
|
|
102
|
-
#: files to (over)write at their own path: new, or unmodified-since-last-scaffold.
|
|
103
|
-
writes: list[_Write] = field(default_factory=list)
|
|
104
|
-
#: hand-edited files: write the fresh contents to ``<path>.new``, leave the original.
|
|
105
|
-
conflicts: list[_Conflict] = field(default_factory=list)
|
|
106
|
-
#: the manifest to persist after writing.
|
|
107
|
-
manifest: Manifest | None = None
|
|
108
|
-
#: paths the prior manifest tracked that are no longer assembled — reported, never deleted.
|
|
109
|
-
removed: list[str] = field(default_factory=list)
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
def hash_contents(s: str) -> str:
|
|
113
|
-
"""sha256 hex of the UTF-8 bytes of ``s`` (matches the TS digest)."""
|
|
114
|
-
return hashlib.sha256(s.encode("utf-8")).hexdigest()
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
def plan_scaffold(
|
|
118
|
-
stack: Stack,
|
|
119
|
-
assembled: list[AssembledFile],
|
|
120
|
-
prior: Manifest | None,
|
|
121
|
-
read_current: Callable[[str], str | None],
|
|
122
|
-
generated_by: str | None = None,
|
|
123
|
-
) -> ScaffoldDecision:
|
|
124
|
-
"""Decide what to write for a (re-)scaffold (pure; FS via ``read_current``).
|
|
125
|
-
|
|
126
|
-
``generated_by`` is the MetaObjects version doing the scaffold — stamped into
|
|
127
|
-
the persisted manifest so a later ``gen``/``verify`` can detect staleness.
|
|
128
|
-
"""
|
|
129
|
-
writes: list[_Write] = []
|
|
130
|
-
conflicts: list[_Conflict] = []
|
|
131
|
-
files: dict[str, str] = {}
|
|
132
|
-
|
|
133
|
-
for f in assembled:
|
|
134
|
-
files[f.path] = hash_contents(f.contents)
|
|
135
|
-
current = read_current(f.path)
|
|
136
|
-
if current is None:
|
|
137
|
-
writes.append(_Write(path=f.path, contents=f.contents))
|
|
138
|
-
continue
|
|
139
|
-
prior_hash = prior.files.get(f.path) if prior else None
|
|
140
|
-
if prior_hash is not None and hash_contents(current) == prior_hash:
|
|
141
|
-
writes.append(_Write(path=f.path, contents=f.contents)) # refresh
|
|
142
|
-
else:
|
|
143
|
-
conflicts.append(
|
|
144
|
-
_Conflict(
|
|
145
|
-
path=f.path, new_path=f"{f.path}.new", contents=f.contents
|
|
146
|
-
)
|
|
147
|
-
)
|
|
148
|
-
|
|
149
|
-
assembled_paths = {f.path for f in assembled}
|
|
150
|
-
removed = (
|
|
151
|
-
[p for p in prior.files if p not in assembled_paths] if prior else []
|
|
152
|
-
)
|
|
153
|
-
|
|
154
|
-
return ScaffoldDecision(
|
|
155
|
-
writes=writes,
|
|
156
|
-
conflicts=conflicts,
|
|
157
|
-
manifest=Manifest(
|
|
158
|
-
version=1,
|
|
159
|
-
servers=list(stack.servers),
|
|
160
|
-
clients=list(stack.clients),
|
|
161
|
-
files=files,
|
|
162
|
-
generated_by=generated_by,
|
|
163
|
-
),
|
|
164
|
-
removed=removed,
|
|
165
|
-
)
|
|
166
|
-
|
|
167
|
-
|
|
168
79
|
def agent_context_staleness(
|
|
169
80
|
manifest: dict[str, object] | None, current_version: str
|
|
170
81
|
) -> str | None:
|
|
@@ -186,6 +97,6 @@ def agent_context_staleness(
|
|
|
186
97
|
frm = generated_by if generated_by else "an older MetaObjects"
|
|
187
98
|
return (
|
|
188
99
|
f"MetaObjects agent context was generated by {frm}; "
|
|
189
|
-
f"you're on {current_version}.
|
|
100
|
+
f"you're on {current_version}. Run 'npx meta agent-docs --server python' to "
|
|
190
101
|
f"refresh the .claude/skills docs."
|
|
191
102
|
)
|
|
@@ -43,13 +43,8 @@ from pathlib import Path
|
|
|
43
43
|
from metaobjects import MetaDataLoader
|
|
44
44
|
from metaobjects.agent_context import (
|
|
45
45
|
AGENT_CONTEXT_MANIFEST_PATH,
|
|
46
|
-
Manifest,
|
|
47
46
|
agent_context_staleness,
|
|
48
|
-
assemble,
|
|
49
47
|
installed_metaobjects_version,
|
|
50
|
-
make_stack,
|
|
51
|
-
plan_scaffold,
|
|
52
|
-
resolve_agent_context_root,
|
|
53
48
|
)
|
|
54
49
|
from metaobjects.meta.meta_data import MetaData
|
|
55
50
|
from metaobjects.codegen.config import GenConfig
|
|
@@ -134,21 +129,37 @@ def _resolve_generators(names: str) -> tuple[list[Generator], list[str]]:
|
|
|
134
129
|
return gens, errors
|
|
135
130
|
|
|
136
131
|
|
|
132
|
+
def _parse_entities(value: str | None) -> list[str] | None:
|
|
133
|
+
"""Parse a comma-separated ``--entities`` value into a name list (``None`` =
|
|
134
|
+
no filter = generate every entity). Blank names are dropped."""
|
|
135
|
+
if not value:
|
|
136
|
+
return None
|
|
137
|
+
names = [n.strip() for n in value.split(",") if n.strip()]
|
|
138
|
+
return names or None
|
|
139
|
+
|
|
140
|
+
|
|
137
141
|
def _generate(
|
|
138
|
-
metadata_dir: str,
|
|
142
|
+
metadata_dir: str,
|
|
143
|
+
out_dir: str,
|
|
144
|
+
generators: list[Generator] | None = None,
|
|
145
|
+
entity_filter: list[str] | None = None,
|
|
139
146
|
) -> tuple[list[str], list[str]]:
|
|
140
147
|
"""Run the generator suite into ``out_dir``.
|
|
141
148
|
|
|
142
149
|
``generators`` defaults to the zero-config default suite; pass a registry-
|
|
143
|
-
resolved subset for ``--generators``.
|
|
144
|
-
|
|
150
|
+
resolved subset for ``--generators``. ``entity_filter`` (the ``--entities``
|
|
151
|
+
allowlist) restricts which entities are EMITTED while the WHOLE model is still
|
|
152
|
+
loaded, so cross-entity references (``extends`` bases, ``@objectRef`` VOs)
|
|
153
|
+
resolve — emit a subset without splitting the metadata. Returns
|
|
154
|
+
``(written_paths, errors)``. On a load error, ``errors`` is non-empty and no
|
|
155
|
+
files are written.
|
|
145
156
|
"""
|
|
146
157
|
root, errors = _load_root(metadata_dir)
|
|
147
158
|
if root is None:
|
|
148
159
|
return [], errors
|
|
149
160
|
config = GenConfig(out_dir=out_dir)
|
|
150
161
|
suite = generators if generators is not None else _default_generators()
|
|
151
|
-
result = run_gen(config, root, generators=suite)
|
|
162
|
+
result = run_gen(config, root, generators=suite, entity_filter=entity_filter)
|
|
152
163
|
written = [path for path, status in result.files if status != "refused"]
|
|
153
164
|
return written, []
|
|
154
165
|
|
|
@@ -282,7 +293,8 @@ def _cmd_gen(args: argparse.Namespace) -> int:
|
|
|
282
293
|
print(f" {msg}", file=sys.stderr)
|
|
283
294
|
return 1
|
|
284
295
|
|
|
285
|
-
|
|
296
|
+
entities = _parse_entities(getattr(args, "entities", None))
|
|
297
|
+
written, errors = _generate(args.metadata_dir, args.out, generators, entities)
|
|
286
298
|
if errors:
|
|
287
299
|
print("error: failed to load metadata:", file=sys.stderr)
|
|
288
300
|
for msg in errors:
|
|
@@ -322,9 +334,12 @@ def _verify_codegen(args: argparse.Namespace) -> int:
|
|
|
322
334
|
)
|
|
323
335
|
return 2
|
|
324
336
|
|
|
325
|
-
# Reuse the exact gen code path — regenerate into a throwaway temp dir.
|
|
337
|
+
# Reuse the exact gen code path — regenerate into a throwaway temp dir. The
|
|
338
|
+
# --entities filter must match the `gen` that produced --out, or the diff
|
|
339
|
+
# reports the un-emitted entities as spurious drift.
|
|
326
340
|
with tempfile.TemporaryDirectory() as tmp:
|
|
327
|
-
|
|
341
|
+
entities = _parse_entities(getattr(args, "entities", None))
|
|
342
|
+
written, errors = _generate(args.metadata_dir, tmp, None, entities)
|
|
328
343
|
if errors:
|
|
329
344
|
print("error: failed to load metadata:", file=sys.stderr)
|
|
330
345
|
for msg in errors:
|
|
@@ -521,129 +536,14 @@ def _cmd_verify(args: argparse.Namespace) -> int:
|
|
|
521
536
|
return exit_code
|
|
522
537
|
|
|
523
538
|
|
|
524
|
-
#: The root-doc filenames we look for / create, and the line we append so a
|
|
525
|
-
#: Claude Code agent always picks up the slim always-on context.
|
|
526
|
-
_ROOT_DOC_CANDIDATES = ("CLAUDE.md", "AGENTS.md")
|
|
527
|
-
_ROOT_DOC_IMPORT_LINE = "@.metaobjects/AGENTS.md"
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
def _detect_python_server(out_dir: Path) -> bool:
|
|
531
|
-
"""Simple stack detection: a ``pyproject.toml`` in --out marks a Python project."""
|
|
532
|
-
return (out_dir / "pyproject.toml").is_file()
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
def _wire_root_doc(out_dir: Path) -> str | None:
|
|
536
|
-
"""Append ``@.metaobjects/AGENTS.md`` to the root CLAUDE.md/AGENTS.md.
|
|
537
|
-
|
|
538
|
-
Idempotent — if the import line is already present in either doc, do nothing.
|
|
539
|
-
If neither doc exists, create ``CLAUDE.md`` with the import line. Returns the
|
|
540
|
-
doc filename that was created/updated, or ``None`` if it was already wired.
|
|
541
|
-
"""
|
|
542
|
-
existing = [name for name in _ROOT_DOC_CANDIDATES if (out_dir / name).is_file()]
|
|
543
|
-
# Already wired in any existing doc → idempotent no-op.
|
|
544
|
-
for name in existing:
|
|
545
|
-
text = (out_dir / name).read_text(encoding="utf-8")
|
|
546
|
-
if _ROOT_DOC_IMPORT_LINE in text:
|
|
547
|
-
return None
|
|
548
|
-
|
|
549
|
-
if existing:
|
|
550
|
-
target = out_dir / existing[0]
|
|
551
|
-
text = target.read_text(encoding="utf-8")
|
|
552
|
-
sep = "" if text.endswith("\n") or text == "" else "\n"
|
|
553
|
-
target.write_text(f"{text}{sep}{_ROOT_DOC_IMPORT_LINE}\n", encoding="utf-8")
|
|
554
|
-
return existing[0]
|
|
555
|
-
|
|
556
|
-
target = out_dir / "CLAUDE.md"
|
|
557
|
-
target.write_text(f"{_ROOT_DOC_IMPORT_LINE}\n", encoding="utf-8")
|
|
558
|
-
return "CLAUDE.md"
|
|
559
|
-
|
|
560
|
-
|
|
561
539
|
def _cmd_agent_docs(args: argparse.Namespace) -> int:
|
|
562
|
-
"""``agent-docs`` —
|
|
563
|
-
|
|
564
|
-
Resolve the stack from ``--server`` / ``--client`` (repeatable). With neither,
|
|
565
|
-
detect ``pyproject.toml`` → a python server. Assemble against the bundled
|
|
566
|
-
content tree, then write the files into ``--out`` (default cwd): each new or
|
|
567
|
-
manifest-unmodified file is written at its path; a hand-edited file's fresh
|
|
568
|
-
contents go to ``<path>.new``. Append the always-on import to a root
|
|
569
|
-
CLAUDE.md/AGENTS.md (idempotent), and persist the sidecar manifest.
|
|
570
|
-
"""
|
|
571
|
-
out_dir = Path(args.out).resolve() if args.out else Path.cwd()
|
|
572
|
-
|
|
573
|
-
servers = list(args.server or [])
|
|
574
|
-
clients = list(args.client or [])
|
|
575
|
-
if not servers and not clients:
|
|
576
|
-
if _detect_python_server(out_dir):
|
|
577
|
-
servers = ["python"]
|
|
578
|
-
else:
|
|
579
|
-
print(
|
|
580
|
-
"error: no --server/--client given and no pyproject.toml found to "
|
|
581
|
-
"detect a stack. Pass at least one --server or --client.",
|
|
582
|
-
file=sys.stderr,
|
|
583
|
-
)
|
|
584
|
-
return 2
|
|
585
|
-
|
|
586
|
-
try:
|
|
587
|
-
content_root = resolve_agent_context_root()
|
|
588
|
-
except FileNotFoundError as e:
|
|
589
|
-
print(f"error: {e}", file=sys.stderr)
|
|
590
|
-
return 1
|
|
591
|
-
|
|
592
|
-
stack = make_stack(servers, clients)
|
|
593
|
-
assembled = assemble(content_root, stack)
|
|
594
|
-
|
|
595
|
-
# Load the prior manifest, if any, so hand-edits are preserved on re-run.
|
|
596
|
-
manifest_path = out_dir / AGENT_CONTEXT_MANIFEST_PATH
|
|
597
|
-
prior: Manifest | None = None
|
|
598
|
-
if manifest_path.is_file():
|
|
599
|
-
try:
|
|
600
|
-
prior = Manifest.from_json(
|
|
601
|
-
json.loads(manifest_path.read_text(encoding="utf-8"))
|
|
602
|
-
)
|
|
603
|
-
except (json.JSONDecodeError, ValueError, KeyError):
|
|
604
|
-
prior = None # corrupt sidecar → treat as a fresh scaffold
|
|
605
|
-
|
|
606
|
-
def _read_current(rel: str) -> str | None:
|
|
607
|
-
p = out_dir / rel
|
|
608
|
-
return p.read_bytes().decode("utf-8") if p.is_file() else None
|
|
609
|
-
|
|
610
|
-
decision = plan_scaffold(
|
|
611
|
-
stack,
|
|
612
|
-
assembled,
|
|
613
|
-
prior,
|
|
614
|
-
_read_current,
|
|
615
|
-
generated_by=installed_metaobjects_version(),
|
|
616
|
-
)
|
|
617
|
-
|
|
618
|
-
for w in decision.writes:
|
|
619
|
-
dest = out_dir / w.path
|
|
620
|
-
dest.parent.mkdir(parents=True, exist_ok=True)
|
|
621
|
-
dest.write_bytes(w.contents.encode("utf-8"))
|
|
622
|
-
print(f"wrote {w.path}")
|
|
623
|
-
for c in decision.conflicts:
|
|
624
|
-
dest = out_dir / c.new_path
|
|
625
|
-
dest.parent.mkdir(parents=True, exist_ok=True)
|
|
626
|
-
dest.write_bytes(c.contents.encode("utf-8"))
|
|
627
|
-
print(f"hand-edited; wrote fresh copy to {c.new_path} (kept your {c.path})")
|
|
628
|
-
for rel in decision.removed:
|
|
629
|
-
print(f"note: {rel} no longer applies to this stack (not deleted)")
|
|
630
|
-
|
|
631
|
-
# Persist the manifest.
|
|
632
|
-
assert decision.manifest is not None
|
|
633
|
-
manifest_path.parent.mkdir(parents=True, exist_ok=True)
|
|
634
|
-
manifest_path.write_text(
|
|
635
|
-
json.dumps(decision.manifest.to_json(), indent=2) + "\n", encoding="utf-8"
|
|
636
|
-
)
|
|
637
|
-
|
|
638
|
-
wired = _wire_root_doc(out_dir)
|
|
639
|
-
if wired is not None:
|
|
640
|
-
print(f"wired {_ROOT_DOC_IMPORT_LINE} into {wired}")
|
|
641
|
-
|
|
540
|
+
"""``agent-docs`` — redirect to the canonical Node meta CLI scaffolder."""
|
|
642
541
|
print(
|
|
643
|
-
|
|
644
|
-
|
|
542
|
+
"agent-context scaffolding moved to the meta CLI — run: "
|
|
543
|
+
"npx meta agent-docs --server python [--client <fw>] [--out <dir>]",
|
|
544
|
+
file=sys.stderr,
|
|
645
545
|
)
|
|
646
|
-
return
|
|
546
|
+
return 1
|
|
647
547
|
|
|
648
548
|
|
|
649
549
|
def _build_parser() -> argparse.ArgumentParser:
|
|
@@ -686,6 +586,15 @@ def _build_parser() -> argparse.ArgumentParser:
|
|
|
686
586
|
default=None,
|
|
687
587
|
help="(reserved) package hint; Python derives package from metadata",
|
|
688
588
|
)
|
|
589
|
+
gen.add_argument(
|
|
590
|
+
"--entities",
|
|
591
|
+
default=None,
|
|
592
|
+
help=(
|
|
593
|
+
"comma-separated entity NAMES to emit (allowlist). The whole model is "
|
|
594
|
+
"still loaded so `extends` bases and @objectRef VOs resolve; only the "
|
|
595
|
+
"named entities are written. Omit to emit every entity."
|
|
596
|
+
),
|
|
597
|
+
)
|
|
689
598
|
gen.set_defaults(func=_cmd_gen)
|
|
690
599
|
|
|
691
600
|
docs = sub.add_parser(
|
|
@@ -758,6 +667,11 @@ def _build_parser() -> argparse.ArgumentParser:
|
|
|
758
667
|
default=None,
|
|
759
668
|
help="on-disk template/prompt dir the --templates gate resolves refs against",
|
|
760
669
|
)
|
|
670
|
+
verify.add_argument(
|
|
671
|
+
"--entities",
|
|
672
|
+
default=None,
|
|
673
|
+
help="comma-separated entity allowlist for --codegen drift (match `gen --entities`)",
|
|
674
|
+
)
|
|
761
675
|
verify.set_defaults(func=_cmd_verify)
|
|
762
676
|
|
|
763
677
|
agent_docs = sub.add_parser(
|
{metaobjects-0.11.1 → metaobjects-0.12.1}/src/metaobjects/codegen/generators/entity_model.py
RENAMED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"""object.* → Pydantic v2 model module (sub-project A)."""
|
|
2
2
|
from __future__ import annotations
|
|
3
3
|
|
|
4
|
+
import re
|
|
5
|
+
|
|
4
6
|
from metaobjects.meta.core.field.meta_field import MetaField
|
|
5
7
|
from metaobjects.meta.core.object.meta_object import MetaObject
|
|
6
8
|
from metaobjects.meta.core.field import field_constants as fc
|
|
@@ -25,6 +27,27 @@ def _is_int(value: object) -> bool:
|
|
|
25
27
|
return isinstance(value, int) and not isinstance(value, bool)
|
|
26
28
|
|
|
27
29
|
|
|
30
|
+
# SQL expression defaults: anything matching is a SERVER-side default (the DB fills
|
|
31
|
+
# it), NOT a Python literal default — so `@default: gen_random_uuid()` must not emit
|
|
32
|
+
# `id: uuid.UUID = "gen_random_uuid()"`. Mirrors the TS column-mapper's
|
|
33
|
+
# SQL_EXPR_PATTERNS (and migrate-ts EXPR_DEFAULT_PATTERNS) so every port agrees on
|
|
34
|
+
# what counts as an expression.
|
|
35
|
+
_SQL_EXPR_DEFAULT_PATTERNS = (
|
|
36
|
+
re.compile(r"^now$", re.I),
|
|
37
|
+
re.compile(r"^now\(\)$", re.I),
|
|
38
|
+
re.compile(r"^current_timestamp$", re.I),
|
|
39
|
+
re.compile(r"^current_date$", re.I),
|
|
40
|
+
re.compile(r"^current_time$", re.I),
|
|
41
|
+
re.compile(r"\(\)$"), # anything function-like, e.g. gen_random_uuid()
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def _is_sql_expr_default(value: object) -> bool:
|
|
46
|
+
"""True iff *value* is a server-side SQL expression default (DB-filled), not a
|
|
47
|
+
Python literal. Only string defaults can be expressions."""
|
|
48
|
+
return isinstance(value, str) and any(p.search(value) for p in _SQL_EXPR_DEFAULT_PATTERNS)
|
|
49
|
+
|
|
50
|
+
|
|
28
51
|
def _validators(field: MetaField, sub_type: str) -> list[MetaField]:
|
|
29
52
|
"""The field's own ``validator.<sub_type>`` children (effective, supers included)."""
|
|
30
53
|
return [
|
|
@@ -121,7 +144,10 @@ def _field_line(field: MetaField, imports: set[str], config: GenConfig) -> tuple
|
|
|
121
144
|
imports.add(f"from .{ref_name} import {ref_name}")
|
|
122
145
|
required = field.attrs().get(fc.FIELD_ATTR_REQUIRED) is True
|
|
123
146
|
default_raw = field.attrs().get(fc.FIELD_ATTR_DEFAULT)
|
|
124
|
-
|
|
147
|
+
# A server-side expression default (now(), gen_random_uuid(), CURRENT_TIMESTAMP)
|
|
148
|
+
# is filled by the DB — the Python model carries no default for it (the field keeps
|
|
149
|
+
# its required/optional shape). Only literal defaults become Pydantic defaults.
|
|
150
|
+
has_default = default_raw is not None and not _is_sql_expr_default(default_raw)
|
|
125
151
|
enum_type_name = type_name if shared is not None else None
|
|
126
152
|
|
|
127
153
|
constraints = _validator_constraints(field)
|
|
@@ -154,7 +180,13 @@ def _field_line(field: MetaField, imports: set[str], config: GenConfig) -> tuple
|
|
|
154
180
|
else:
|
|
155
181
|
assignment = " = None"
|
|
156
182
|
|
|
157
|
-
|
|
183
|
+
# Pydantic field name = @column when present, else field.name. A cross-port
|
|
184
|
+
# entity carries the camelCase field.name (the TS property) AND the snake_case
|
|
185
|
+
# @column (the physical DB column); the Python model field IS the column, so it
|
|
186
|
+
# binds straight to the row. Backward-compatible: snake-authored models with no
|
|
187
|
+
# @column emit field.name unchanged.
|
|
188
|
+
py_name = field.attrs().get(fc.FIELD_ATTR_COLUMN) or field.name
|
|
189
|
+
return f" {py_name}: {annotation}{assignment}", uses_field
|
|
158
190
|
|
|
159
191
|
|
|
160
192
|
def _effective_fqn(entity: MetaObject) -> str:
|