metaobjects 0.15.10__tar.gz → 0.15.12__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.15.10 → metaobjects-0.15.12}/LICENSE +82 -69
- {metaobjects-0.15.10 → metaobjects-0.15.12}/PKG-INFO +1 -1
- {metaobjects-0.15.10 → metaobjects-0.15.12}/pyproject.toml +1 -1
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/codegen/generators/payload_vo_generator.py +19 -3
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/codegen/generators/render_helper_generator.py +43 -29
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/core_types.py +19 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/errors.py +7 -11
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/loader/registered_validation.py +36 -12
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/loader/validate_source_parameter_ref.py +7 -20
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/loader/validation_passes.py +67 -128
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/persistence/origin/origin_constants.py +4 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/naming_refs.py +79 -52
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/spec_metamodel/origin.json +2 -1
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_payload_vo_generator.py +58 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/uv.lock +1 -1
- {metaobjects-0.15.10 → metaobjects-0.15.12}/.gitignore +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/README.md +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/hatch_build.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/agent_context/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/agent_context/scaffold.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/apidocs/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/apidocs/api_model.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/apidocs/builder.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/apidocs/naming.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/apidocs/paths.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/apidocs/renderer.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/attr_class_map.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/cli.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/codegen/KNOWN_GAPS.md +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/codegen/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/codegen/config.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/codegen/constants.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/codegen/extract_delegate_emitter.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/codegen/extract_schema_emitter.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/codegen/format.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/codegen/fr010_field_mapping.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/codegen/generator.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/codegen/generator_registry.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/codegen/generators/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/codegen/generators/entity_model.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/codegen/generators/extractor_generator.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/codegen/generators/filter_allowlist_generator.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/codegen/generators/fr019_shared_enum.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/codegen/generators/m2m_codegen.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/codegen/generators/output_parser_generator.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/codegen/generators/output_prompt_generator.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/codegen/generators/router_generator.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/codegen/generators/template_generator.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/codegen/generators/tph_plan.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/codegen/generators/trace_helper_generator.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/codegen/instance_artifacts.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/codegen/output_format_spec_emitter.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/codegen/overwrite_policy.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/codegen/runner.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/codegen/runtime/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/codegen/runtime/filter_parser.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/codegen/template_codegen/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/codegen/template_codegen/output_pattern.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/codegen/template_codegen/template_data.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/codegen/template_codegen/template_spec.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/codegen/type_map.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/datatype.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/documentation/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/documentation/doc_constants.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/documentation/doc_provider.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/documentation/doc_schema.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/loader/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/loader/merge.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/loader/meta_data_loader.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/loader/sources/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/loader/sources/directory_source.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/loader/sources/file_source.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/loader/sources/meta_data_source.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/loader/sources/uri_source.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/loader/validate_discriminator.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/loader/validate_field_readonly.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/loader/validate_source_physical_names.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/core/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/core/attr/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/core/attr/attr_constants.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/core/attr/meta_attr.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/core/field/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/core/field/field_constants.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/core/field/meta_field.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/core/identity/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/core/identity/identity_constants.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/core/identity/meta_identity.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/core/index/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/core/index/index_constants.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/core/index/meta_index.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/core/object/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/core/object/meta_object.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/core/object/meta_object_aware.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/core/object/object_class_registry.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/core/object/object_constants.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/core/object/object_extract.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/core/object/value_object.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/core/relationship/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/core/relationship/derive_m2m_fields.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/core/relationship/meta_relationship.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/core/relationship/relationship_constants.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/core/validator/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/core/validator/validator_constants.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/meta_data.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/meta_root.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/persistence/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/persistence/db/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/persistence/db/db_constants.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/persistence/db/db_provider.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/persistence/origin/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/persistence/origin/meta_origin.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/persistence/source/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/persistence/source/meta_source.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/persistence/source/source_constants.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/presentation/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/presentation/layout/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/presentation/layout/layout_constants.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/presentation/layout/meta_layout.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/presentation/ui/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/presentation/ui/ui_provider.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/presentation/view/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/presentation/view/meta_view.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/presentation/view/view_constants.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/provider_extends.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/template/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/template/meta_template.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/template/prompt_provider.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/meta/template/template_constants.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/parser.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/parser_yaml.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/provider.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/py.typed +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/registry.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/registry_manifest.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/render/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/render/email_document.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/render/escapers.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/render/extract/KNOWN_GAPS.md +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/render/extract/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/render/extract/coerce.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/render/extract/extract.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/render/extract/extract_map.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/render/extract/json_forgiving_reader.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/render/extract/locate.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/render/extract/normalize.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/render/extract/strip.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/render/extract/types.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/render/extract/xml_forgiving_reader.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/render/filesystem_provider.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/render/prompt/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/render/prompt/output_format_renderer.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/render/prompt/output_format_spec.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/render/prompt/prompt_field.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/render/prompt/prompt_overrides.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/render/prompt/prompt_style.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/render/renderer.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/render/verify.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/runtime/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/runtime/llm_recorder.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/runtime/n2m_resolver.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/runtime/object_manager.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/runtime/tph.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/serializer_json.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/shared/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/shared/base_types.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/shared/separators.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/shared/structural.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/source/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/source/error_source.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/source/json_path.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/source/semantic_diff.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/source/yaml_positions.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/spec_metamodel/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/spec_metamodel/attr.json +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/spec_metamodel/db.json +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/spec_metamodel/documentation.json +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/spec_metamodel/field.json +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/spec_metamodel/identity.json +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/spec_metamodel/index.json +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/spec_metamodel/layout.json +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/spec_metamodel/object.json +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/spec_metamodel/prompt.json +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/spec_metamodel/relationship.json +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/spec_metamodel/source.json +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/spec_metamodel/template.json +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/spec_metamodel/ui.json +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/spec_metamodel/validator.json +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/spec_metamodel/view.json +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/super_resolve.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/validation_types.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/yaml_desugar.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/golden/extends/expected/BaseEntity.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/golden/extends/expected/Program.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/golden/extends/meta.json +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/golden/nested-array/expected/AuthorBrief.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/golden/nested-array/expected/PostBrief.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/golden/nested-array/meta.json +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/golden/scalars/expected/Metric.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/golden/scalars/expected/Report.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/golden/scalars/meta.json +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/golden/vanilla/expected/Subscriber.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/golden/vanilla/meta.json +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_abstract_conformance.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_api_docs_builder.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_api_docs_paths.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_cli.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_cli_providers.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_cli_registry.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_cli_staleness_nudge.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_cli_verify_strict.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_cli_verify_subverbs.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_constants_config.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_entity_model.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_enum_conformance.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_extends_abstract_field_inheritance.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_extractor_generator.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_filter_allowlist_generator.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_format.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_fr010_nested_object_prompt.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_fr010_output_codegen.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_fr019_shared_provided_conformance.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_generator.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_generator_extension_seams.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_golden.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_inherit_without_restate_gate.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_inheritance_conformance.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_instance_artifacts.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_m2m_codegen.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_output_parser_generator.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_overwrite_policy.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_projection_compile.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_render_helper_conformance.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_render_helper_generator.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_reverse_finders.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_router_generator.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_runner.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_template_data.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_template_generator.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_template_output_pattern.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_template_scope_helpers.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_template_scope_walk.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_template_spec.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_tph_codegen.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_trace_helper_generator.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_type_map.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/codegen/test_validation_conformance.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/conformance/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/conformance/capabilities.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/conformance/conformance-expected-failures.json +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/conformance/conformance_adapter.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/conformance/corpus.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/conformance/expected_failures.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/conformance/fixture_discovery.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/conformance/navigator.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/conformance/test_api_docs_cross_port_conformance.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/conformance/test_conformance.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/conformance/test_extract_conformance.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/conformance/test_extract_object_verdict.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/conformance/test_fr010_loader_attrs.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/conformance/test_fr011_attrs.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/conformance/test_generator_registry_conformance.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/conformance/test_object_model_conformance.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/conformance/test_provider_composition_conformance.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/conformance/test_registry_conformance.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/conformance/test_runner_hardfail.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/conformance/test_spec_metamodel_embed.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/conformance/test_strict_attr_load.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/conformance/test_template_codegen_conformance.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/conformance/test_template_generator_conformance.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/conformance/test_yaml_conformance.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/conformance/yaml-conformance-expected-failures.json +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/integration/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/integration/api_contract_assertions.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/integration/api_contract_jsonb_server.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/integration/api_contract_m2m_server.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/integration/api_contract_server.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/integration/generated_jsonb_app.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/integration/generated_m2m_app.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/integration/generated_router_app.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/integration/generated_tph_app.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/integration/meta_ai_trace.yaml +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/integration/normalization.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/integration/postgres_container.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/integration/query_runner.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/integration/scenarios.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/integration/test_api_contract.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/integration/test_api_contract_generated.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/integration/test_api_contract_jsonb.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/integration/test_api_contract_m2m.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/integration/test_api_contract_m2m_generated.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/integration/test_api_contract_tph_generated.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/integration/test_llm_call_trace.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/integration/test_normalization.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/integration/test_query_scenarios.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/integration/test_runtime_return_types.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/open_closed_proof_test.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/render/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/render/extract/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/render/extract/test_coerce.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/render/extract/test_extract.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/render/extract/test_extract_map.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/render/extract/test_json_forgiving_reader.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/render/extract/test_locate.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/render/extract/test_model.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/render/extract/test_normalize.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/render/extract/test_strip.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/render/extract/test_xml_forgiving_reader.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/render/prompt/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/render/prompt/test_output_format_renderer.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/render/test_email_document.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/render/test_filesystem_provider.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/render/test_output_format_renderer_nested.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/render/test_output_prompt_conformance.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/render/test_render_conformance.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/render/test_render_max_chars.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/render/test_verify.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/render/test_verify_conformance.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/source/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/source/test_fr5c_merge_attribution.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/source/test_fr5d_reference_resolution.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/source/test_fr5e_database_source_shape.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/source/test_json_path.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/source/test_semantic_diff.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/source/test_source_on_node.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/source/test_yaml_positions.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/test_api_docs_accuracy.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/__init__.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_agent_context_staleness.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_capabilities.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_common_attrs.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_core_types.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_effective_package.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_errors.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_field_enum.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_field_map_validation.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_field_uuid_dbcolumntype.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_fr016_source_name_and_kind_aliases.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_index_lookup.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_llm_recorder.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_loader.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_loader_bom.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_loader_class.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_merge.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_meta_attr.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_meta_data.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_meta_source.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_module_shortcuts.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_n2m_resolver.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_n2m_resolver_inherited.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_object_manager_uuid_coercion.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_one_primary_source.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_parser.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_parser_yaml.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_provider.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_provider_extension.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_registry.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_registry_completeness.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_registry_extend.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_registry_sealed.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_relationship_referential_actions.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_resolution_key.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_runtime_resolution_key_binding.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_serializer.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_shared_constants.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_smoke.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_sources.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_strict_child_placement.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_super_resolve.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_template_toolcall.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_template_wrong_subtype_attrs.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_validation_attr_schema.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_validation_filter_values.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_validation_origin_paths.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_validation_sort_field.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_validation_warnings.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_write_coercion_arrays.py +0 -0
- {metaobjects-0.15.10 → metaobjects-0.15.12}/tests/unit/test_yaml_desugar.py +0 -0
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
|
|
1
2
|
Apache License
|
|
2
3
|
Version 2.0, January 2004
|
|
3
4
|
http://www.apache.org/licenses/
|
|
@@ -32,33 +33,36 @@
|
|
|
32
33
|
not limited to compiled object code, generated documentation,
|
|
33
34
|
and conversions to other media types.
|
|
34
35
|
|
|
35
|
-
"Work" shall mean the work of authorship
|
|
36
|
-
the License, as indicated by a
|
|
37
|
-
|
|
36
|
+
"Work" shall mean the work of authorship, whether in Source or
|
|
37
|
+
Object form, made available under the License, as indicated by a
|
|
38
|
+
copyright notice that is included in or attached to the work
|
|
39
|
+
(an example is provided in the Appendix below).
|
|
38
40
|
|
|
39
41
|
"Derivative Works" shall mean any work, whether in Source or Object
|
|
40
42
|
form, that is based on (or derived from) the Work and for which the
|
|
41
|
-
editorial revisions, annotations, elaborations, or other
|
|
43
|
+
editorial revisions, annotations, elaborations, or other modifications
|
|
42
44
|
represent, as a whole, an original work of authorship. For the purposes
|
|
43
45
|
of this License, Derivative Works shall not include works that remain
|
|
44
46
|
separable from, or merely link (or bind by name) to the interfaces of,
|
|
45
47
|
the Work and Derivative Works thereof.
|
|
46
48
|
|
|
47
|
-
"Contribution" shall mean
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
or
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
49
|
+
"Contribution" shall mean any work of authorship, including
|
|
50
|
+
the original version of the Work and any modifications or additions
|
|
51
|
+
to that Work or Derivative Works thereof, that is intentionally
|
|
52
|
+
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
53
|
+
or by an individual or Legal Entity authorized to submit on behalf of
|
|
54
|
+
the copyright owner. For the purposes of this definition, "submitted"
|
|
55
|
+
means any form of electronic, verbal, or written communication sent
|
|
56
|
+
to the Licensor or its representatives, including but not limited to
|
|
57
|
+
communication on electronic mailing lists, source code control systems,
|
|
58
|
+
and issue tracking systems that are managed by, or on behalf of, the
|
|
59
|
+
Licensor for the purpose of discussing and improving the Work, but
|
|
60
|
+
excluding communication that is conspicuously marked or otherwise
|
|
61
|
+
designated in writing by the copyright owner as "Not a Contribution."
|
|
62
|
+
|
|
63
|
+
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
64
|
+
on behalf of whom a Contribution has been received by Licensor and
|
|
65
|
+
subsequently incorporated within the Work.
|
|
62
66
|
|
|
63
67
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
64
68
|
this License, each Contributor hereby grants to You a perpetual,
|
|
@@ -74,22 +78,22 @@
|
|
|
74
78
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
75
79
|
where such license applies only to those patent claims licensable
|
|
76
80
|
by such Contributor that are necessarily infringed by their
|
|
77
|
-
Contribution(s) alone or by
|
|
81
|
+
Contribution(s) alone or by combination of their Contribution(s)
|
|
78
82
|
with the Work to which such Contribution(s) was submitted. If You
|
|
79
|
-
institute patent litigation against any entity (including a
|
|
80
|
-
or counterclaim in a lawsuit) alleging that the Work
|
|
81
|
-
Contribution
|
|
82
|
-
patent infringement, then any patent licenses
|
|
83
|
-
this License for that Work shall terminate
|
|
84
|
-
litigation is filed.
|
|
83
|
+
institute patent litigation against any entity (including a
|
|
84
|
+
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
85
|
+
or a Contribution incorporated within the Work constitutes direct
|
|
86
|
+
or contributory patent infringement, then any patent licenses
|
|
87
|
+
granted to You under this License for that Work shall terminate
|
|
88
|
+
as of the date such litigation is filed.
|
|
85
89
|
|
|
86
90
|
4. Redistribution. You may reproduce and distribute copies of the
|
|
87
91
|
Work or Derivative Works thereof in any medium, with or without
|
|
88
92
|
modifications, and in Source or Object form, provided that You
|
|
89
93
|
meet the following conditions:
|
|
90
94
|
|
|
91
|
-
(a) You must give any other recipients of the Work or
|
|
92
|
-
Works a copy of this License; and
|
|
95
|
+
(a) You must give any other recipients of the Work or
|
|
96
|
+
Derivative Works a copy of this License; and
|
|
93
97
|
|
|
94
98
|
(b) You must cause any modified files to carry prominent notices
|
|
95
99
|
stating that You changed the files; and
|
|
@@ -101,24 +105,28 @@
|
|
|
101
105
|
the Derivative Works; and
|
|
102
106
|
|
|
103
107
|
(d) If the Work includes a "NOTICE" text file as part of its
|
|
104
|
-
distribution,
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
the
|
|
109
|
-
Derivative Works;
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
108
|
+
distribution, then any Derivative Works that You distribute must
|
|
109
|
+
include a readable copy of the attribution notices contained
|
|
110
|
+
within such NOTICE file, excluding those notices that do not
|
|
111
|
+
pertain to any part of the Derivative Works, in at least one
|
|
112
|
+
of the following places: within a NOTICE text file distributed
|
|
113
|
+
as part of the Derivative Works; within the Source form or
|
|
114
|
+
documentation, if provided along with the Derivative Works; or,
|
|
115
|
+
within a display generated by the Derivative Works, if and
|
|
116
|
+
wherever such third-party notices normally appear. The contents
|
|
117
|
+
of the NOTICE file are for informational purposes only and
|
|
118
|
+
do not modify the License. You may add Your own attribution
|
|
119
|
+
notices within Derivative Works that You distribute, alongside
|
|
120
|
+
or as an addendum to the NOTICE text from the Work, provided
|
|
121
|
+
that such additional attribution notices cannot be construed
|
|
122
|
+
as modifying the License.
|
|
123
|
+
|
|
124
|
+
You may add Your own copyright statement to Your modifications and
|
|
125
|
+
may provide additional or different license terms and conditions
|
|
126
|
+
for use, reproduction, or distribution of Your modifications, or
|
|
127
|
+
for any such Derivative Works as a whole, provided Your use,
|
|
128
|
+
reproduction, and distribution of the Work otherwise complies with
|
|
129
|
+
the conditions stated in this License.
|
|
122
130
|
|
|
123
131
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
124
132
|
any Contribution intentionally submitted for inclusion in the Work
|
|
@@ -137,10 +145,10 @@
|
|
|
137
145
|
agreed to in writing, Licensor provides the Work (and each
|
|
138
146
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
139
147
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
140
|
-
implied, including, without limitation, any
|
|
141
|
-
NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
142
|
-
PURPOSE. You are solely responsible for determining the
|
|
143
|
-
appropriateness of using or
|
|
148
|
+
implied, including, without limitation, any warranties or conditions
|
|
149
|
+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
150
|
+
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
151
|
+
appropriateness of using or redistributing the Work and assume any
|
|
144
152
|
risks associated with Your exercise of permissions under this License.
|
|
145
153
|
|
|
146
154
|
8. Limitation of Liability. In no event and under no legal theory,
|
|
@@ -148,20 +156,23 @@
|
|
|
148
156
|
unless required by applicable law (such as deliberate and grossly
|
|
149
157
|
negligent acts) or agreed to in writing, shall any Contributor be
|
|
150
158
|
liable to You for damages, including any direct, indirect, special,
|
|
151
|
-
incidental, or
|
|
159
|
+
incidental, or consequential damages of any character arising as a
|
|
152
160
|
result of this License or out of the use or inability to use the
|
|
153
161
|
Work (including but not limited to damages for loss of goodwill,
|
|
154
|
-
work stoppage, computer failure or malfunction, or all
|
|
155
|
-
commercial damages or losses), even if such Contributor
|
|
156
|
-
advised of the possibility of such damages.
|
|
162
|
+
work stoppage, computer failure or malfunction, or any and all
|
|
163
|
+
other commercial damages or losses), even if such Contributor
|
|
164
|
+
has been advised of the possibility of such damages.
|
|
157
165
|
|
|
158
166
|
9. Accepting Warranty or Additional Liability. While redistributing
|
|
159
167
|
the Work or Derivative Works thereof, You may choose to offer,
|
|
160
168
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
161
169
|
or other liability obligations and/or rights consistent with this
|
|
162
|
-
License. However, in accepting such obligations, You may
|
|
163
|
-
|
|
164
|
-
|
|
170
|
+
License. However, in accepting such obligations, You may act only
|
|
171
|
+
on Your own behalf and on Your sole responsibility, not on behalf
|
|
172
|
+
of any other Contributor, and only if You agree to indemnify,
|
|
173
|
+
defend, and hold each Contributor harmless for any liability
|
|
174
|
+
incurred by, or claims asserted against, such Contributor by reason
|
|
175
|
+
of your accepting any such warranty or additional liability.
|
|
165
176
|
|
|
166
177
|
END OF TERMS AND CONDITIONS
|
|
167
178
|
|
|
@@ -171,19 +182,21 @@
|
|
|
171
182
|
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
172
183
|
replaced with your own identifying information. (Don't include
|
|
173
184
|
the brackets!) The text should be enclosed in the appropriate
|
|
174
|
-
comment syntax for the file format
|
|
175
|
-
|
|
185
|
+
comment syntax for the file format. We also recommend that a
|
|
186
|
+
file or class name and description of purpose be included on the
|
|
187
|
+
same "printed page" as the copyright notice for easier
|
|
188
|
+
identification within third-party archives.
|
|
176
189
|
|
|
177
|
-
|
|
190
|
+
Copyright 2026 MetaObjects Contributors
|
|
178
191
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
192
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
193
|
+
you may not use this file except in compliance with the License.
|
|
194
|
+
You may obtain a copy of the License at
|
|
182
195
|
|
|
183
|
-
|
|
196
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
184
197
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
198
|
+
Unless required by applicable law or agreed to in writing, software
|
|
199
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
200
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
201
|
+
See the License for the specific language governing permissions and
|
|
202
|
+
limitations under the License.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: metaobjects
|
|
3
|
-
Version: 0.15.
|
|
3
|
+
Version: 0.15.12
|
|
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.15.
|
|
3
|
+
version = "0.15.12"
|
|
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"
|
|
@@ -63,6 +63,7 @@ from metaobjects.meta.persistence.origin.origin_constants import (
|
|
|
63
63
|
)
|
|
64
64
|
from metaobjects.meta.template import template_constants as tc
|
|
65
65
|
from metaobjects.meta.template.meta_template import MetaTemplate
|
|
66
|
+
from metaobjects.naming_refs import resolve_object_ref
|
|
66
67
|
from metaobjects.shared.base_types import TYPE_OBJECT, TYPE_TEMPLATE
|
|
67
68
|
from metaobjects.shared.separators import PACKAGE_SEP
|
|
68
69
|
|
|
@@ -104,6 +105,16 @@ def payload_module_name(template_name: str) -> str:
|
|
|
104
105
|
# ---------------------------------------------------------------------------
|
|
105
106
|
|
|
106
107
|
|
|
108
|
+
def _pkg_of(node: MetaData) -> str:
|
|
109
|
+
"""The effective package of an object — its ``resolution_key()`` minus the
|
|
110
|
+
trailing ``::<name>`` ("" for a root-level object). Derived from the resolution
|
|
111
|
+
key so it is correct for BOTH loaded trees (file_default_package) and
|
|
112
|
+
programmatically-built trees (package only on the root)."""
|
|
113
|
+
key = node.resolution_key()
|
|
114
|
+
i = key.rfind(PACKAGE_SEP)
|
|
115
|
+
return "" if i == -1 else key[:i]
|
|
116
|
+
|
|
117
|
+
|
|
107
118
|
def _resolve_object_by_short_or_fqn(root: MetaData, ref: str) -> MetaObject | None:
|
|
108
119
|
"""Find a ``MetaObject`` child satisfying an (already-expanded) object ref.
|
|
109
120
|
|
|
@@ -192,9 +203,14 @@ def _resolve_object_field_type(
|
|
|
192
203
|
ref = field.attrs().get(fc.FIELD_ATTR_OBJECT_REF)
|
|
193
204
|
if not isinstance(ref, str) or not ref:
|
|
194
205
|
return _fallback_type(field)
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
206
|
+
# ADR-0042 — a nested @objectRef resolves in the DECLARING field's package
|
|
207
|
+
# (correct for a field.object inherited via extends across packages); an FQN
|
|
208
|
+
# resolves exactly. NO bare-tail short-name fallback that would bind a same-named
|
|
209
|
+
# VO in the wrong package on a cross-package collision (#191). The declaring
|
|
210
|
+
# package is taken from the parent object's resolution key so it is correct for
|
|
211
|
+
# both loaded trees (file_default_package) and programmatic trees (root package).
|
|
212
|
+
referrer_pkg = _pkg_of(field.parent) if field.parent is not None else ""
|
|
213
|
+
target = resolve_object_ref(root, ref, referrer_pkg)
|
|
198
214
|
if target is None:
|
|
199
215
|
return _fallback_type(field)
|
|
200
216
|
nested_class = payload_class_name(target.name)
|
|
@@ -62,7 +62,8 @@ from metaobjects.render.verify import (
|
|
|
62
62
|
PayloadField,
|
|
63
63
|
verify,
|
|
64
64
|
)
|
|
65
|
-
from metaobjects.
|
|
65
|
+
from metaobjects.naming_refs import resolve_object_ref
|
|
66
|
+
from metaobjects.shared.base_types import TYPE_FIELD, TYPE_TEMPLATE
|
|
66
67
|
from metaobjects.shared.separators import PACKAGE_SEP
|
|
67
68
|
|
|
68
69
|
_GENERATOR_NAME = "render-helper-generator"
|
|
@@ -81,30 +82,34 @@ def _py_str(s: str) -> str:
|
|
|
81
82
|
# ---------------------------------------------------------------------------
|
|
82
83
|
|
|
83
84
|
|
|
84
|
-
def
|
|
85
|
+
def _pkg_of(node: MetaData) -> str:
|
|
86
|
+
"""The effective package of an object — its ``resolution_key()`` minus the
|
|
87
|
+
trailing ``::<name>`` ("" for a root-level object). Derived from the resolution
|
|
88
|
+
key so it is correct for BOTH loaded trees (file_default_package) and
|
|
89
|
+
programmatically-built trees (package only on the root, folded via the ancestor
|
|
90
|
+
walk in ``resolution_key()``)."""
|
|
91
|
+
key = node.resolution_key()
|
|
92
|
+
i = key.rfind(PACKAGE_SEP)
|
|
93
|
+
return "" if i == -1 else key[:i]
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def _resolve_nested_object_ref(
|
|
97
|
+
root: MetaData, reference: str, referrer_pkg: str
|
|
98
|
+
) -> MetaObject | None:
|
|
85
99
|
"""Resolve a ``field.object``'s ``@objectRef`` to its target ``object.value``.
|
|
86
100
|
|
|
87
|
-
ADR-
|
|
88
|
-
package-qualified name
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
(
|
|
92
|
-
``
|
|
101
|
+
ADR-0042: package-local — an FQN ref (contains ``::``) resolves EXACTLY on the
|
|
102
|
+
package-qualified name; a bare ref resolves in the referrer's package FIRST
|
|
103
|
+
(else a root-level object), never a same-named ``object.value`` in another
|
|
104
|
+
package via a bare-tail fallback. *referrer_pkg* is the DECLARING field's
|
|
105
|
+
package (which differs from the VO's when the field is inherited via extends
|
|
106
|
+
from an abstract VO in another package). Shares the single ``resolve_object_ref``
|
|
107
|
+
matcher. Mirrors the TS ``findObject`` in payload-field-tree.ts."""
|
|
93
108
|
if not reference:
|
|
94
109
|
return None
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
for child in root.own_children():
|
|
99
|
-
if child.type != TYPE_OBJECT or not isinstance(child, MetaObject):
|
|
100
|
-
continue
|
|
101
|
-
if child.sub_type != OBJECT_SUBTYPE_VALUE:
|
|
102
|
-
continue
|
|
103
|
-
if fqn:
|
|
104
|
-
if child.resolution_key() == reference or child.fqn() == reference:
|
|
105
|
-
return child
|
|
106
|
-
elif child.name.rsplit(PACKAGE_SEP, 1)[-1] == ref_short:
|
|
107
|
-
return child
|
|
110
|
+
target = resolve_object_ref(root, reference, referrer_pkg)
|
|
111
|
+
if target is not None and target.sub_type == OBJECT_SUBTYPE_VALUE:
|
|
112
|
+
return target # type: ignore[return-value]
|
|
108
113
|
return None
|
|
109
114
|
|
|
110
115
|
|
|
@@ -118,6 +123,10 @@ def _derive_payload_field_tree(
|
|
|
118
123
|
if vo is None or vo.resolution_key() in seen:
|
|
119
124
|
return []
|
|
120
125
|
next_seen = seen | {vo.resolution_key()}
|
|
126
|
+
# A nested @objectRef resolves in the FIELD's own declaring package (below),
|
|
127
|
+
# which differs from this VO's when the field is inherited via extends from an
|
|
128
|
+
# abstract VO in another package (the bare ref was authored there).
|
|
129
|
+
vo_pkg = _pkg_of(vo)
|
|
121
130
|
fields: list[PayloadField] = []
|
|
122
131
|
for f in vo.children():
|
|
123
132
|
if f.type != TYPE_FIELD or not isinstance(f, MetaField):
|
|
@@ -125,7 +134,8 @@ def _derive_payload_field_tree(
|
|
|
125
134
|
if f.sub_type == fc.FIELD_SUBTYPE_OBJECT:
|
|
126
135
|
ref = f.attrs().get(fc.FIELD_ATTR_OBJECT_REF)
|
|
127
136
|
if isinstance(ref, str) and ref:
|
|
128
|
-
|
|
137
|
+
field_pkg = _pkg_of(f.parent) if f.parent is not None else vo_pkg
|
|
138
|
+
target = _resolve_nested_object_ref(root, ref, field_pkg)
|
|
129
139
|
if target is not None and target.sub_type == OBJECT_SUBTYPE_VALUE:
|
|
130
140
|
children = _derive_payload_field_tree(root, target, next_seen)
|
|
131
141
|
fields.append(PayloadField(f.name, children))
|
|
@@ -152,16 +162,20 @@ def _field_tree_literal(fields: list[PayloadField]) -> str:
|
|
|
152
162
|
|
|
153
163
|
|
|
154
164
|
def _resolve_payload_vo(root: MetaData, payload_ref: str) -> MetaObject | None:
|
|
155
|
-
"""``@payloadRef`` must resolve to an ``object.value
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
165
|
+
"""``@payloadRef`` must resolve to an ``object.value``. Package-local (ADR-0042):
|
|
166
|
+
the referrer's own package first (else a root-level object), FQN exact. The
|
|
167
|
+
referrer package is derived from the resolved match's own resolution key, so this
|
|
168
|
+
keeps the same behavior for the single-package + FQN codegen fixtures while never
|
|
169
|
+
binding a same-named VO in the wrong package (the nested @objectRef path is the
|
|
170
|
+
one #191 named — see _resolve_nested_object_ref). Matches a value-object child by
|
|
171
|
+
the package-folded resolution key OR the bare short name (FR-026 expands refs to
|
|
172
|
+
FQN, while the child node still carries the short ``name``)."""
|
|
173
|
+
ref_short = payload_ref.rsplit(PACKAGE_SEP, 1)[-1]
|
|
160
174
|
# ADR-0039 sanctioned own: top-level scan on the loader ROOT (never extended, own == effective)
|
|
161
175
|
for child in root.own_children():
|
|
162
|
-
if
|
|
176
|
+
if not isinstance(child, MetaObject) or child.sub_type != OBJECT_SUBTYPE_VALUE:
|
|
163
177
|
continue
|
|
164
|
-
if child.
|
|
178
|
+
if child.resolution_key() == payload_ref or child.name == ref_short:
|
|
165
179
|
return child
|
|
166
180
|
return None
|
|
167
181
|
|
|
@@ -6,6 +6,7 @@ from .attr_class_map import attr_class_for
|
|
|
6
6
|
from .meta.core.attr import meta_attr as _attr # noqa: F401
|
|
7
7
|
from .meta.core.attr.attr_constants import (
|
|
8
8
|
ATTR_SUBTYPE_BOOLEAN,
|
|
9
|
+
ATTR_SUBTYPE_FILTER,
|
|
9
10
|
ATTR_SUBTYPE_INT,
|
|
10
11
|
ATTR_SUBTYPE_STRING,
|
|
11
12
|
ATTR_SUBTYPES,
|
|
@@ -76,6 +77,7 @@ from .meta.persistence.origin.meta_origin import MetaOrigin
|
|
|
76
77
|
from .meta.persistence.origin.origin_constants import (
|
|
77
78
|
ORIGIN_ATTR_AGG,
|
|
78
79
|
ORIGIN_ATTR_CONVERT,
|
|
80
|
+
ORIGIN_ATTR_FILTER,
|
|
79
81
|
ORIGIN_ATTR_FROM,
|
|
80
82
|
ORIGIN_ATTR_OF,
|
|
81
83
|
ORIGIN_ATTR_VIA,
|
|
@@ -372,6 +374,22 @@ for _def in core_provider._defs: # noqa: SLF001 (provider build-time enrichment
|
|
|
372
374
|
)
|
|
373
375
|
break
|
|
374
376
|
|
|
377
|
+
# ADR-0042 — a field.object / field.map @objectRef must RESOLVE (a dangling target
|
|
378
|
+
# fails the load, closing the gap #191 surfaced as a misleading downstream error).
|
|
379
|
+
# The required-attr pass owns absence (ERR_OBJECT_FIELD_WITHOUT_OBJECT_REF); this
|
|
380
|
+
# reference descriptor fires only when @objectRef is present but resolves to nothing
|
|
381
|
+
# → ERR_UNRESOLVED_OBJECT_REF. Mirrors the TS core-types.ts registerCoreTypeDefs.
|
|
382
|
+
for _def in core_provider._defs: # noqa: SLF001 (provider build-time enrichment)
|
|
383
|
+
if _def.type == TYPE_FIELD and _def.sub_type in (
|
|
384
|
+
fc.FIELD_SUBTYPE_OBJECT,
|
|
385
|
+
fc.FIELD_SUBTYPE_MAP,
|
|
386
|
+
):
|
|
387
|
+
_def.references.append(
|
|
388
|
+
ReferenceDescriptor(
|
|
389
|
+
FIELD_ATTR_OBJECT_REF, TYPE_OBJECT, None, False, "ERR_UNRESOLVED_OBJECT_REF"
|
|
390
|
+
)
|
|
391
|
+
)
|
|
392
|
+
|
|
375
393
|
# field.enum — dedicated registration with required @values attr.
|
|
376
394
|
# Inherits every common field attr (column / required / unique / default /
|
|
377
395
|
# maxLength / filterable / sortable / etc.) so the D2 type-coercion guard
|
|
@@ -631,6 +649,7 @@ core_provider.add(
|
|
|
631
649
|
),
|
|
632
650
|
AttrSchema(name=ORIGIN_ATTR_OF, value_type=ATTR_SUBTYPE_STRING, required=True),
|
|
633
651
|
AttrSchema(name=ORIGIN_ATTR_VIA, value_type=ATTR_SUBTYPE_STRING, required=False),
|
|
652
|
+
AttrSchema(name=ORIGIN_ATTR_FILTER, value_type=ATTR_SUBTYPE_FILTER, required=False),
|
|
634
653
|
],
|
|
635
654
|
child_rules=[ChildRule(TYPE_ATTR, "*")],
|
|
636
655
|
)
|
|
@@ -138,17 +138,13 @@ class ErrorCode(str, Enum):
|
|
|
138
138
|
# emit this yet (the T6 guard is deferred — like TS, it belongs in the parser);
|
|
139
139
|
# the enum tracks the shared corpus code so resolution/desugar stay aligned.
|
|
140
140
|
ERR_RELATIVE_REF_IN_CANONICAL = "ERR_RELATIVE_REF_IN_CANONICAL"
|
|
141
|
-
# ADR-
|
|
142
|
-
#
|
|
143
|
-
#
|
|
144
|
-
#
|
|
145
|
-
#
|
|
146
|
-
#
|
|
147
|
-
|
|
148
|
-
# package anywhere, resolves fine. ``extends`` is intentionally NOT covered
|
|
149
|
-
# (its same-package/root-strict super-resolver yields ERR_UNRESOLVED_SUPER on a
|
|
150
|
-
# bare cross-package miss, not ambiguity).
|
|
151
|
-
ERR_AMBIGUOUS_REF = "ERR_AMBIGUOUS_REF"
|
|
141
|
+
# ADR-0042 — a field.object / field.map @objectRef does not resolve to any
|
|
142
|
+
# object in the loaded tree (a dangling target). Bare refs resolve
|
|
143
|
+
# package-locally (referrer's package, else root-level); FQN refs resolve
|
|
144
|
+
# exactly — a bare cross-package ref no longer binds elsewhere. Supersedes the
|
|
145
|
+
# retired ADR-0041 ERR_AMBIGUOUS_REF (bare = package-local ⇒ ambiguity is
|
|
146
|
+
# unreachable, so every unresolved ref fails closed with its per-attr code).
|
|
147
|
+
ERR_UNRESOLVED_OBJECT_REF = "ERR_UNRESOLVED_OBJECT_REF"
|
|
152
148
|
# FR-033 — strict structural-placement vocabulary. ERR_CHILD_NOT_ALLOWED: a
|
|
153
149
|
# structural child (field/identity/source/validator/… — not an attr) is placed
|
|
154
150
|
# under a parent whose registered childRules do not admit it (the structural
|
|
@@ -12,8 +12,10 @@ from ..errors import ErrorCode, MetaError
|
|
|
12
12
|
from ..meta.core.object.meta_object import MetaObject
|
|
13
13
|
from ..meta.meta_data import MetaData
|
|
14
14
|
from ..meta.meta_root import MetaRoot
|
|
15
|
+
from ..naming_refs import did_you_mean_hint
|
|
15
16
|
from ..registry import TypeRegistry
|
|
16
17
|
from ..shared.base_types import TYPE_OBJECT
|
|
18
|
+
from ..shared.separators import PACKAGE_SEP
|
|
17
19
|
|
|
18
20
|
|
|
19
21
|
class SymbolTable:
|
|
@@ -29,19 +31,29 @@ class SymbolTable:
|
|
|
29
31
|
# extended, own == effective) — mirrors the TS validation-registry.
|
|
30
32
|
for child in root.own_children():
|
|
31
33
|
if child.type == TYPE_OBJECT and isinstance(child, MetaObject):
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
34
|
+
# ADR-0042: key by the canonical resolution key ONLY (the FQN, or
|
|
35
|
+
# the bare name for a root-level/empty-package object) — NO bare-name
|
|
36
|
+
# fallback, so a bare ref never binds a same-named object in another
|
|
37
|
+
# package. Mirrors the TS validation-registry symbol table.
|
|
35
38
|
t._index[child.resolution_key()] = child
|
|
36
39
|
return t
|
|
37
40
|
|
|
38
|
-
def resolve_object(self, reference: str) -> MetaData | None:
|
|
39
|
-
|
|
41
|
+
def resolve_object(self, reference: str, referrer_pkg: str) -> MetaData | None:
|
|
42
|
+
"""ADR-0042 package-local resolution: FQN → exact resolution-key match;
|
|
43
|
+
bare → the referrer's own package (``<referrer_pkg>::<ref>``), else a
|
|
44
|
+
root-level object. Mirrors the TS ``resolveObject``."""
|
|
45
|
+
if PACKAGE_SEP in reference:
|
|
46
|
+
return self._index.get(reference)
|
|
47
|
+
local_key = (
|
|
48
|
+
f"{referrer_pkg}{PACKAGE_SEP}{reference}" if referrer_pkg else reference
|
|
49
|
+
)
|
|
50
|
+
return self._index.get(local_key) or self._index.get(reference)
|
|
40
51
|
|
|
41
52
|
|
|
42
53
|
class ValidationContext:
|
|
43
|
-
def __init__(self, symbols: SymbolTable) -> None:
|
|
54
|
+
def __init__(self, symbols: SymbolTable, root: MetaData) -> None:
|
|
44
55
|
self.symbols = symbols
|
|
56
|
+
self.root = root
|
|
45
57
|
self.errors: list[MetaError] = []
|
|
46
58
|
|
|
47
59
|
def error(self, code: str, node: MetaData, message: str) -> None:
|
|
@@ -55,12 +67,23 @@ class ValidationContext:
|
|
|
55
67
|
|
|
56
68
|
|
|
57
69
|
def run(root: MetaRoot, registry: TypeRegistry) -> list[MetaError]:
|
|
58
|
-
ctx = ValidationContext(SymbolTable.build(root))
|
|
59
|
-
_walk(root, registry, ctx)
|
|
70
|
+
ctx = ValidationContext(SymbolTable.build(root), root)
|
|
71
|
+
_walk(root, registry, ctx, "")
|
|
60
72
|
return ctx.errors
|
|
61
73
|
|
|
62
74
|
|
|
63
|
-
def _walk(
|
|
75
|
+
def _walk(
|
|
76
|
+
node: MetaData, registry: TypeRegistry, ctx: ValidationContext, referrer_pkg: str
|
|
77
|
+
) -> None:
|
|
78
|
+
# ADR-0042: a top-level object establishes the package context for its subtree;
|
|
79
|
+
# nested ref-bearing nodes (relationship/field.object/identity.reference) resolve
|
|
80
|
+
# BARE refs against it. Nested nodes carry no `package`, so they inherit the
|
|
81
|
+
# enclosing object's (via file_default_package, else the threaded context).
|
|
82
|
+
pkg = (
|
|
83
|
+
(node.package or node.file_default_package or referrer_pkg)
|
|
84
|
+
if node.type == TYPE_OBJECT
|
|
85
|
+
else referrer_pkg
|
|
86
|
+
)
|
|
64
87
|
type_def = registry.find(node.type, node.sub_type)
|
|
65
88
|
if type_def is not None:
|
|
66
89
|
for desc in type_def.references:
|
|
@@ -72,7 +95,8 @@ def _walk(node: MetaData, registry: TypeRegistry, ctx: ValidationContext) -> Non
|
|
|
72
95
|
if not isinstance(raw, str) or raw == "":
|
|
73
96
|
continue # absence is the required-attr pass's job
|
|
74
97
|
entity_ref = raw.split(".", 1)[0] if desc.dotted_field_path else raw
|
|
75
|
-
|
|
98
|
+
# ADR-0042: bare refs resolve package-local against the enclosing object.
|
|
99
|
+
target = ctx.symbols.resolve_object(entity_ref, pkg)
|
|
76
100
|
# Qualify the node name with its owning entity (e.g. "Order.items") so the error
|
|
77
101
|
# is locatable from the message alone, not just the source envelope.
|
|
78
102
|
qname = f"{node.parent.name}.{node.name}" if node.parent and node.parent.name else node.name
|
|
@@ -80,7 +104,7 @@ def _walk(node: MetaData, registry: TypeRegistry, ctx: ValidationContext) -> Non
|
|
|
80
104
|
ctx.error(
|
|
81
105
|
desc.error_code, node,
|
|
82
106
|
f'{node.type}.{node.sub_type} "{qname}" @{desc.attr} "{raw}" '
|
|
83
|
-
f"does not resolve to an object.",
|
|
107
|
+
f"does not resolve to an object.{did_you_mean_hint(ctx.root, entity_ref)}",
|
|
84
108
|
)
|
|
85
109
|
elif target.type != desc.target_type or (
|
|
86
110
|
desc.target_sub_type is not None and target.sub_type != desc.target_sub_type
|
|
@@ -101,4 +125,4 @@ def _walk(node: MetaData, registry: TypeRegistry, ctx: ValidationContext) -> Non
|
|
|
101
125
|
# node once at its declaration site (own children); inherited nodes are
|
|
102
126
|
# validated where they are declared. Mirrors the TS ``node.ownChildren()`` walk.
|
|
103
127
|
for child in node.own_children():
|
|
104
|
-
_walk(child, registry, ctx)
|
|
128
|
+
_walk(child, registry, ctx, pkg)
|
{metaobjects-0.15.10 → metaobjects-0.15.12}/src/metaobjects/loader/validate_source_parameter_ref.py
RENAMED
|
@@ -34,40 +34,27 @@ from ..meta.core.object.object_constants import (
|
|
|
34
34
|
OBJECT_SUBTYPE_ENTITY,
|
|
35
35
|
OBJECT_SUBTYPE_VALUE,
|
|
36
36
|
)
|
|
37
|
+
from ..naming_refs import resolve_object_ref
|
|
37
38
|
from ..shared.base_types import TYPE_OBJECT, TYPE_SOURCE
|
|
38
|
-
from ..shared.separators import PACKAGE_SEP
|
|
39
39
|
|
|
40
40
|
_CALLABLE_KINDS = frozenset({SOURCE_KIND_STORED_PROC, SOURCE_KIND_TABLE_FUNCTION})
|
|
41
41
|
|
|
42
42
|
|
|
43
43
|
def validate_source_parameter_ref(root: MetaData, errors: list[MetaError]) -> None:
|
|
44
|
-
# Pre-index every object by name, fqn AND resolution key so resolution costs
|
|
45
|
-
# O(1) per source. FR-032 (ADR-0032): @parameterRef is FULLY QUALIFIED after
|
|
46
|
-
# the desugar/sweep (e.g. ``acme::ParamVO``), which is the package-folded
|
|
47
|
-
# resolution_key() (objects keep a bare fqn() per FR5d), so the index must
|
|
48
|
-
# carry that key too. Mirrors the C# @parameterRef ResolutionKey() index.
|
|
49
44
|
# ADR-0039 (mirrors the TS validate-source-parameter-ref): resolving is the
|
|
50
45
|
# default. Root has no super, so children()==own_children() here, but the
|
|
51
46
|
# inheritable reads below RESOLVE — @parameterRef on the source, the parameter
|
|
52
47
|
# value-object's fields, and the referenced entity's field can all be inherited
|
|
53
48
|
# via extends. The SOURCE iteration stays own (a source is validated on the
|
|
54
49
|
# entity that declares it), as does origin.* (never inherits; ADR-0029).
|
|
55
|
-
object_index: dict[str, MetaData] = {}
|
|
56
|
-
for obj in root.children():
|
|
57
|
-
if obj.type != TYPE_OBJECT:
|
|
58
|
-
continue
|
|
59
|
-
object_index[obj.name] = obj
|
|
60
|
-
fqn = (
|
|
61
|
-
f"{obj.package}{PACKAGE_SEP}{obj.name}"
|
|
62
|
-
if obj.package
|
|
63
|
-
else obj.name
|
|
64
|
-
)
|
|
65
|
-
object_index[fqn] = obj
|
|
66
|
-
object_index[obj.resolution_key()] = obj
|
|
67
|
-
|
|
68
50
|
for obj in root.children():
|
|
69
51
|
if obj.type != TYPE_OBJECT:
|
|
70
52
|
continue
|
|
53
|
+
# ADR-0042 — a bare @parameterRef resolves package-local (this object's
|
|
54
|
+
# package, else root-level); an FQN resolves exactly. Shares the single
|
|
55
|
+
# resolve_object_ref matcher — NO bare-name-anywhere fallback (which would
|
|
56
|
+
# silently bind a same-named value-object in another package).
|
|
57
|
+
referrer_pkg = obj.package or obj.file_default_package or ""
|
|
71
58
|
for source in obj.own_children():
|
|
72
59
|
if source.type != TYPE_SOURCE or source.sub_type != SOURCE_SUBTYPE_RDB:
|
|
73
60
|
continue
|
|
@@ -93,7 +80,7 @@ def validate_source_parameter_ref(root: MetaData, errors: list[MetaError]) -> No
|
|
|
93
80
|
)
|
|
94
81
|
continue
|
|
95
82
|
|
|
96
|
-
target =
|
|
83
|
+
target = resolve_object_ref(root, ref, referrer_pkg)
|
|
97
84
|
if target is None:
|
|
98
85
|
errors.append(
|
|
99
86
|
MetaError(
|