metaobjects 0.15.0__tar.gz → 0.15.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.15.0 → metaobjects-0.15.1}/PKG-INFO +1 -1
- {metaobjects-0.15.0 → metaobjects-0.15.1}/pyproject.toml +1 -1
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/core_types.py +24 -4
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/errors.py +1 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/loader/validation_passes.py +66 -9
- metaobjects-0.15.1/src/metaobjects/meta/core/index/index_constants.py +5 -0
- metaobjects-0.15.1/src/metaobjects/meta/core/index/meta_index.py +15 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/persistence/db/db_provider.py +8 -1
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/shared/base_types.py +1 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/spec_metamodel/__init__.py +1 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/spec_metamodel/db.json +10 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/spec_metamodel/identity.json +3 -4
- metaobjects-0.15.1/src/metaobjects/spec_metamodel/index.json +14 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/spec_metamodel/object.json +2 -1
- metaobjects-0.15.1/tests/unit/__init__.py +0 -0
- metaobjects-0.15.1/tests/unit/test_index_lookup.py +141 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/uv.lock +1 -1
- {metaobjects-0.15.0 → metaobjects-0.15.1}/.gitignore +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/LICENSE +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/README.md +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/hatch_build.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/__init__.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/agent_context/__init__.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/agent_context/scaffold.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/apidocs/__init__.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/apidocs/api_model.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/apidocs/builder.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/apidocs/naming.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/apidocs/paths.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/apidocs/renderer.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/attr_class_map.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/cli.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/KNOWN_GAPS.md +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/__init__.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/config.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/constants.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/extract_delegate_emitter.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/extract_schema_emitter.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/format.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/fr010_field_mapping.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/generator.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/generator_registry.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/generators/__init__.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/generators/entity_model.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/generators/extractor_generator.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/generators/filter_allowlist_generator.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/generators/fr019_shared_enum.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/generators/m2m_codegen.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/generators/output_parser_generator.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/generators/output_prompt_generator.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/generators/payload_vo_generator.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/generators/render_helper_generator.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/generators/router_generator.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/generators/template_generator.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/generators/tph_plan.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/generators/trace_helper_generator.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/instance_artifacts.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/output_format_spec_emitter.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/overwrite_policy.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/runner.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/runtime/__init__.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/runtime/filter_parser.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/template_codegen/__init__.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/template_codegen/output_pattern.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/template_codegen/template_data.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/template_codegen/template_spec.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/type_map.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/datatype.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/documentation/__init__.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/documentation/doc_constants.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/documentation/doc_provider.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/documentation/doc_schema.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/loader/__init__.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/loader/merge.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/loader/meta_data_loader.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/loader/registered_validation.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/loader/sources/__init__.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/loader/sources/directory_source.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/loader/sources/file_source.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/loader/sources/meta_data_source.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/loader/sources/uri_source.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/loader/validate_discriminator.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/loader/validate_field_readonly.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/loader/validate_source_parameter_ref.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/loader/validate_source_physical_names.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/__init__.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/core/__init__.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/core/attr/__init__.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/core/attr/attr_constants.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/core/attr/meta_attr.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/core/field/__init__.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/core/field/field_constants.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/core/field/meta_field.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/core/identity/__init__.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/core/identity/identity_constants.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/core/identity/meta_identity.py +0 -0
- {metaobjects-0.15.0/src/metaobjects/meta/core/object → metaobjects-0.15.1/src/metaobjects/meta/core/index}/__init__.py +0 -0
- {metaobjects-0.15.0/src/metaobjects/meta/core/relationship → metaobjects-0.15.1/src/metaobjects/meta/core/object}/__init__.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/core/object/meta_object.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/core/object/meta_object_aware.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/core/object/object_class_registry.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/core/object/object_constants.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/core/object/object_extract.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/core/object/value_object.py +0 -0
- {metaobjects-0.15.0/src/metaobjects/meta/core/validator → metaobjects-0.15.1/src/metaobjects/meta/core/relationship}/__init__.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/core/relationship/derive_m2m_fields.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/core/relationship/meta_relationship.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/core/relationship/relationship_constants.py +0 -0
- {metaobjects-0.15.0/src/metaobjects/meta/persistence → metaobjects-0.15.1/src/metaobjects/meta/core/validator}/__init__.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/core/validator/validator_constants.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/meta_data.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/meta_root.py +0 -0
- {metaobjects-0.15.0/src/metaobjects/meta/persistence/origin → metaobjects-0.15.1/src/metaobjects/meta/persistence}/__init__.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/persistence/db/__init__.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/persistence/db/db_constants.py +0 -0
- {metaobjects-0.15.0/src/metaobjects/meta/persistence/source → metaobjects-0.15.1/src/metaobjects/meta/persistence/origin}/__init__.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/persistence/origin/meta_origin.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/persistence/origin/origin_constants.py +0 -0
- {metaobjects-0.15.0/src/metaobjects/meta/presentation → metaobjects-0.15.1/src/metaobjects/meta/persistence/source}/__init__.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/persistence/source/meta_source.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/persistence/source/source_constants.py +0 -0
- {metaobjects-0.15.0/src/metaobjects/meta/presentation/layout → metaobjects-0.15.1/src/metaobjects/meta/presentation}/__init__.py +0 -0
- {metaobjects-0.15.0/src/metaobjects/meta/presentation/ui → metaobjects-0.15.1/src/metaobjects/meta/presentation/layout}/__init__.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/presentation/layout/layout_constants.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/presentation/layout/meta_layout.py +0 -0
- {metaobjects-0.15.0/src/metaobjects/meta/presentation/view → metaobjects-0.15.1/src/metaobjects/meta/presentation/ui}/__init__.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/presentation/ui/ui_provider.py +0 -0
- {metaobjects-0.15.0/src/metaobjects/meta/template → metaobjects-0.15.1/src/metaobjects/meta/presentation/view}/__init__.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/presentation/view/meta_view.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/presentation/view/view_constants.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/provider_extends.py +0 -0
- {metaobjects-0.15.0/src/metaobjects/shared → metaobjects-0.15.1/src/metaobjects/meta/template}/__init__.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/template/meta_template.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/template/prompt_provider.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/template/template_constants.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/naming_refs.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/parser.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/parser_yaml.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/provider.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/py.typed +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/registry.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/registry_manifest.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/__init__.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/email_document.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/escapers.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/extract/KNOWN_GAPS.md +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/extract/__init__.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/extract/coerce.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/extract/extract.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/extract/extract_map.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/extract/json_forgiving_reader.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/extract/locate.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/extract/normalize.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/extract/strip.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/extract/types.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/extract/xml_forgiving_reader.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/filesystem_provider.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/prompt/__init__.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/prompt/output_format_renderer.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/prompt/output_format_spec.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/prompt/prompt_field.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/prompt/prompt_overrides.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/prompt/prompt_style.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/renderer.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/render/verify.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/runtime/__init__.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/runtime/llm_recorder.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/runtime/n2m_resolver.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/runtime/object_manager.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/runtime/tph.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/serializer_json.py +0 -0
- {metaobjects-0.15.0/tests → metaobjects-0.15.1/src/metaobjects/shared}/__init__.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/shared/separators.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/shared/structural.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/source/__init__.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/source/error_source.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/source/json_path.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/source/semantic_diff.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/source/yaml_positions.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/spec_metamodel/attr.json +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/spec_metamodel/documentation.json +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/spec_metamodel/field.json +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/spec_metamodel/layout.json +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/spec_metamodel/origin.json +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/spec_metamodel/prompt.json +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/spec_metamodel/relationship.json +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/spec_metamodel/source.json +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/spec_metamodel/template.json +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/spec_metamodel/ui.json +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/spec_metamodel/validator.json +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/spec_metamodel/view.json +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/super_resolve.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/validation_types.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/yaml_desugar.py +0 -0
- {metaobjects-0.15.0/tests/codegen → metaobjects-0.15.1/tests}/__init__.py +0 -0
- {metaobjects-0.15.0/tests/conformance → metaobjects-0.15.1/tests/codegen}/__init__.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/golden/extends/expected/BaseEntity.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/golden/extends/expected/Program.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/golden/extends/meta.json +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/golden/nested-array/expected/AuthorBrief.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/golden/nested-array/expected/PostBrief.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/golden/nested-array/meta.json +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/golden/scalars/expected/Metric.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/golden/scalars/expected/Report.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/golden/scalars/meta.json +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/golden/vanilla/expected/Subscriber.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/golden/vanilla/meta.json +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_abstract_conformance.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_api_docs_builder.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_api_docs_paths.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_cli.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_cli_registry.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_cli_staleness_nudge.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_cli_verify_strict.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_cli_verify_subverbs.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_constants_config.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_entity_model.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_enum_conformance.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_extends_abstract_field_inheritance.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_extractor_generator.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_filter_allowlist_generator.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_format.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_fr010_output_codegen.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_fr019_shared_provided_conformance.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_generator.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_generator_extension_seams.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_golden.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_inherit_without_restate_gate.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_inheritance_conformance.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_instance_artifacts.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_m2m_codegen.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_output_parser_generator.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_overwrite_policy.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_payload_vo_generator.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_projection_compile.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_render_helper_conformance.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_render_helper_generator.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_reverse_finders.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_router_generator.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_runner.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_template_data.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_template_generator.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_template_output_pattern.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_template_scope_helpers.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_template_scope_walk.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_template_spec.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_tph_codegen.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_trace_helper_generator.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_type_map.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/codegen/test_validation_conformance.py +0 -0
- {metaobjects-0.15.0/tests/integration → metaobjects-0.15.1/tests/conformance}/__init__.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/capabilities.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/conformance-expected-failures.json +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/conformance_adapter.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/corpus.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/expected_failures.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/fixture_discovery.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/navigator.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/test_api_docs_cross_port_conformance.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/test_conformance.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/test_extract_conformance.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/test_extract_object_verdict.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/test_fr010_loader_attrs.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/test_fr011_attrs.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/test_generator_registry_conformance.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/test_object_model_conformance.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/test_registry_conformance.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/test_runner_hardfail.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/test_spec_metamodel_embed.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/test_strict_attr_load.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/test_template_codegen_conformance.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/test_template_generator_conformance.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/test_yaml_conformance.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/conformance/yaml-conformance-expected-failures.json +0 -0
- {metaobjects-0.15.0/tests/render → metaobjects-0.15.1/tests/integration}/__init__.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/api_contract_assertions.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/api_contract_jsonb_server.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/api_contract_m2m_server.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/api_contract_server.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/generated_jsonb_app.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/generated_m2m_app.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/generated_router_app.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/generated_tph_app.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/meta_ai_trace.yaml +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/normalization.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/postgres_container.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/query_runner.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/scenarios.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/test_api_contract.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/test_api_contract_generated.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/test_api_contract_jsonb.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/test_api_contract_m2m.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/test_api_contract_m2m_generated.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/test_api_contract_tph_generated.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/test_llm_call_trace.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/test_normalization.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/test_query_scenarios.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/integration/test_runtime_return_types.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/open_closed_proof_test.py +0 -0
- {metaobjects-0.15.0/tests/render/extract → metaobjects-0.15.1/tests/render}/__init__.py +0 -0
- {metaobjects-0.15.0/tests/render/prompt → metaobjects-0.15.1/tests/render/extract}/__init__.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/render/extract/test_coerce.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/render/extract/test_extract.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/render/extract/test_extract_map.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/render/extract/test_json_forgiving_reader.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/render/extract/test_locate.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/render/extract/test_model.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/render/extract/test_normalize.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/render/extract/test_strip.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/render/extract/test_xml_forgiving_reader.py +0 -0
- {metaobjects-0.15.0/tests/source → metaobjects-0.15.1/tests/render/prompt}/__init__.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/render/prompt/test_output_format_renderer.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/render/test_email_document.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/render/test_filesystem_provider.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/render/test_output_format_renderer_nested.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/render/test_output_prompt_conformance.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/render/test_render_conformance.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/render/test_render_max_chars.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/render/test_verify.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/render/test_verify_conformance.py +0 -0
- {metaobjects-0.15.0/tests/unit → metaobjects-0.15.1/tests/source}/__init__.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/source/test_fr5c_merge_attribution.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/source/test_fr5d_reference_resolution.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/source/test_fr5e_database_source_shape.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/source/test_json_path.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/source/test_semantic_diff.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/source/test_source_on_node.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/source/test_yaml_positions.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/test_api_docs_accuracy.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_agent_context_staleness.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_capabilities.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_common_attrs.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_core_types.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_effective_package.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_errors.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_field_enum.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_field_map_validation.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_field_uuid_dbcolumntype.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_fr016_source_name_and_kind_aliases.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_llm_recorder.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_loader.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_loader_bom.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_loader_class.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_merge.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_meta_attr.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_meta_data.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_meta_source.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_module_shortcuts.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_n2m_resolver.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_n2m_resolver_inherited.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_object_manager_uuid_coercion.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_one_primary_source.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_parser.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_parser_yaml.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_provider.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_provider_extension.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_registry.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_registry_completeness.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_registry_extend.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_registry_sealed.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_relationship_referential_actions.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_resolution_key.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_runtime_resolution_key_binding.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_serializer.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_shared_constants.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_smoke.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_sources.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_strict_child_placement.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_super_resolve.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_template_toolcall.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_template_wrong_subtype_attrs.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_validation_attr_schema.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_validation_filter_values.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_validation_origin_paths.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_validation_sort_field.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_validation_warnings.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.1}/tests/unit/test_write_coercion_arrays.py +0 -0
- {metaobjects-0.15.0 → metaobjects-0.15.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.15.
|
|
3
|
+
Version: 0.15.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
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "metaobjects"
|
|
3
|
-
version = "0.15.
|
|
3
|
+
version = "0.15.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"
|
|
@@ -42,7 +42,6 @@ from .meta.core.identity.identity_constants import (
|
|
|
42
42
|
GENERATION_VALUES,
|
|
43
43
|
IDENTITY_ATTR_FIELDS,
|
|
44
44
|
IDENTITY_ATTR_GENERATION,
|
|
45
|
-
IDENTITY_ATTR_UNIQUE,
|
|
46
45
|
IDENTITY_REFERENCE_ATTR_ENFORCE,
|
|
47
46
|
IDENTITY_REFERENCE_ATTR_REFERENCES,
|
|
48
47
|
IDENTITY_SUBTYPE_PRIMARY,
|
|
@@ -50,6 +49,8 @@ from .meta.core.identity.identity_constants import (
|
|
|
50
49
|
IDENTITY_SUBTYPE_SECONDARY,
|
|
51
50
|
)
|
|
52
51
|
from .meta.core.identity.meta_identity import MetaIdentity
|
|
52
|
+
from .meta.core.index.index_constants import INDEX_ATTR_FIELDS, INDEX_SUBTYPE_LOOKUP, INDEX_SUBTYPES
|
|
53
|
+
from .meta.core.index.meta_index import MetaIndex
|
|
53
54
|
from .meta.core.object.meta_object import MetaObject
|
|
54
55
|
from .meta.core.object.object_constants import (
|
|
55
56
|
OBJECT_ATTR_DISCRIMINATOR,
|
|
@@ -117,6 +118,7 @@ from .shared.base_types import (
|
|
|
117
118
|
TYPE_ATTR,
|
|
118
119
|
TYPE_FIELD,
|
|
119
120
|
TYPE_IDENTITY,
|
|
121
|
+
TYPE_INDEX,
|
|
120
122
|
TYPE_LAYOUT,
|
|
121
123
|
TYPE_METADATA,
|
|
122
124
|
TYPE_OBJECT,
|
|
@@ -195,10 +197,12 @@ core_provider.add(
|
|
|
195
197
|
)
|
|
196
198
|
)
|
|
197
199
|
|
|
200
|
+
|
|
198
201
|
# object.* (entity, value, projection)
|
|
199
202
|
_OBJECT_CHILD_RULES = [
|
|
200
203
|
ChildRule(TYPE_FIELD, "*"),
|
|
201
204
|
ChildRule(TYPE_IDENTITY, "*"),
|
|
205
|
+
ChildRule(TYPE_INDEX, "*"),
|
|
202
206
|
ChildRule(TYPE_ATTR, "*"),
|
|
203
207
|
ChildRule(TYPE_SOURCE, "*"),
|
|
204
208
|
ChildRule(TYPE_RELATIONSHIP, "*"),
|
|
@@ -436,8 +440,9 @@ core_provider.add(
|
|
|
436
440
|
)
|
|
437
441
|
)
|
|
438
442
|
|
|
439
|
-
# identity.secondary — @fields required stringArray
|
|
440
|
-
#
|
|
443
|
+
# identity.secondary — @fields required stringArray. Always enforces uniqueness;
|
|
444
|
+
# use index.lookup for non-unique indexes. @unique is no longer a core attr
|
|
445
|
+
# (removed — the secondary index is always unique by definition).
|
|
441
446
|
core_provider.add(
|
|
442
447
|
TypeDefinition(
|
|
443
448
|
type=TYPE_IDENTITY,
|
|
@@ -445,7 +450,6 @@ core_provider.add(
|
|
|
445
450
|
factory=MetaIdentity,
|
|
446
451
|
attrs=[
|
|
447
452
|
AttrSchema(name=IDENTITY_ATTR_FIELDS, value_type=ATTR_SUBTYPE_STRING, required=True, is_array=True),
|
|
448
|
-
AttrSchema(name=IDENTITY_ATTR_UNIQUE, value_type=ATTR_SUBTYPE_BOOLEAN, required=False),
|
|
449
453
|
],
|
|
450
454
|
child_rules=[ChildRule(TYPE_ATTR, "*")],
|
|
451
455
|
)
|
|
@@ -470,6 +474,22 @@ core_provider.add(
|
|
|
470
474
|
)
|
|
471
475
|
)
|
|
472
476
|
|
|
477
|
+
# index.lookup — non-unique lookup index on one or more fields.
|
|
478
|
+
# Distinct from identity.secondary (which always enforces uniqueness).
|
|
479
|
+
# Physical attrs (@orders/@expr/@where/@using) are contributed by the db provider.
|
|
480
|
+
for _idx_sub in INDEX_SUBTYPES:
|
|
481
|
+
core_provider.add(
|
|
482
|
+
TypeDefinition(
|
|
483
|
+
type=TYPE_INDEX,
|
|
484
|
+
sub_type=_idx_sub,
|
|
485
|
+
factory=MetaIndex,
|
|
486
|
+
attrs=[
|
|
487
|
+
AttrSchema(name=INDEX_ATTR_FIELDS, value_type=ATTR_SUBTYPE_STRING, required=True, is_array=True),
|
|
488
|
+
],
|
|
489
|
+
child_rules=[ChildRule(TYPE_ATTR, "*")],
|
|
490
|
+
)
|
|
491
|
+
)
|
|
492
|
+
|
|
473
493
|
# relationship.* (base, association, aggregation, composition).
|
|
474
494
|
# @onDelete / @onUpdate are validated against REFERENTIAL_ACTIONS — kebab-case
|
|
475
495
|
# values (cascade / set-null / restrict / no-action). Defaults derive from the
|
|
@@ -77,6 +77,7 @@ class ErrorCode(str, Enum):
|
|
|
77
77
|
# FR-017 — M:N relationship slim-vocabulary validation (junction-missing-two-
|
|
78
78
|
# references / sourceRefField-not-matching / M:N-attr-on-1:N). The symmetric-
|
|
79
79
|
# on-hetero + symmetric+sourceRefField rules emit ERR_BAD_ATTR_VALUE instead.
|
|
80
|
+
ERR_INVALID_INDEX = "ERR_INVALID_INDEX"
|
|
80
81
|
ERR_INVALID_RELATIONSHIP = "ERR_INVALID_RELATIONSHIP"
|
|
81
82
|
# identity.reference @references names an FK target object that does not resolve
|
|
82
83
|
# to any object in the loaded tree (a dangling cross-reference between metadata).
|
|
@@ -63,6 +63,7 @@ from ..registry import AttrSchema, ChildRule, TypeRegistry
|
|
|
63
63
|
from ..shared.base_types import (
|
|
64
64
|
TYPE_FIELD,
|
|
65
65
|
TYPE_IDENTITY,
|
|
66
|
+
TYPE_INDEX,
|
|
66
67
|
TYPE_LAYOUT,
|
|
67
68
|
TYPE_OBJECT,
|
|
68
69
|
TYPE_ORIGIN,
|
|
@@ -104,6 +105,7 @@ from ..meta.core.object.object_constants import (
|
|
|
104
105
|
OBJECT_SUBTYPE_VALUE,
|
|
105
106
|
)
|
|
106
107
|
from ..meta.core.identity.identity_constants import IDENTITY_ATTR_FIELDS
|
|
108
|
+
from ..meta.core.index.index_constants import INDEX_ATTR_FIELDS, INDEX_SUBTYPE_LOOKUP
|
|
107
109
|
from ..source import resolved_source
|
|
108
110
|
|
|
109
111
|
# A subtype-specific template attr is valid ONLY on the subtype it is registered
|
|
@@ -184,6 +186,7 @@ def run_validations(
|
|
|
184
186
|
_validate_filterable_has_index(root, warnings)
|
|
185
187
|
# SP-H Unit9 — @filterable on a subtype with no operator band → error.
|
|
186
188
|
_validate_filterable_has_supported_ops(root, errors)
|
|
189
|
+
_validate_index_lookup_fields(root, errors)
|
|
187
190
|
|
|
188
191
|
|
|
189
192
|
# ---------------------------------------------------------------------------
|
|
@@ -459,21 +462,29 @@ def _validate_attr_schema(
|
|
|
459
462
|
# ERR_BAD_ATTR_VALUE for both an unrecognized value and an illegal
|
|
460
463
|
# pairing. Running the flat membership check too would double-report
|
|
461
464
|
# (tests assert exactly one error). Mirrors the TS reference.
|
|
465
|
+
#
|
|
466
|
+
# For array-valued attrs (is_array=True) the raw_value is a list;
|
|
467
|
+
# check each element individually against allowed_values (e.g.
|
|
468
|
+
# @orders: ["asc","desc"] — each element must be in {"asc","desc"}).
|
|
462
469
|
if (
|
|
463
470
|
attr_node.name != FIELD_ATTR_DB_COLUMN_TYPE
|
|
464
471
|
and schema.allowed_values is not None
|
|
465
472
|
and len(schema.allowed_values) > 0
|
|
466
473
|
):
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
474
|
+
allowed_str = ", ".join(str(v) for v in schema.allowed_values)
|
|
475
|
+
values_to_check: list = (
|
|
476
|
+
list(raw_value) if isinstance(raw_value, list) else [raw_value]
|
|
477
|
+
)
|
|
478
|
+
for elem in values_to_check:
|
|
479
|
+
if elem not in schema.allowed_values:
|
|
480
|
+
errors.append(
|
|
481
|
+
MetaError(
|
|
482
|
+
f"{_node_label(node)} attribute '@{attr_node.name}' has value "
|
|
483
|
+
f"'{elem}' which is not one of the allowed values: {allowed_str}",
|
|
484
|
+
ErrorCode.ERR_BAD_ATTR_VALUE,
|
|
485
|
+
envelope=node.source,
|
|
486
|
+
)
|
|
475
487
|
)
|
|
476
|
-
)
|
|
477
488
|
|
|
478
489
|
|
|
479
490
|
# ---------------------------------------------------------------------------
|
|
@@ -2448,3 +2459,49 @@ def _parse_string_list(raw: object) -> tuple[str, ...]:
|
|
|
2448
2459
|
if isinstance(raw, (list, tuple)):
|
|
2449
2460
|
return tuple(str(x) for x in raw)
|
|
2450
2461
|
return ()
|
|
2462
|
+
|
|
2463
|
+
|
|
2464
|
+
# ---------------------------------------------------------------------------
|
|
2465
|
+
# Pass: index.lookup @fields resolution
|
|
2466
|
+
#
|
|
2467
|
+
# Every index.lookup on an entity must name at least one field, and every
|
|
2468
|
+
# named field must exist in the entity's EFFECTIVE (resolved) field set.
|
|
2469
|
+
# ADR-0039: use children() / MetaIndex.fields() — never own* — so that a
|
|
2470
|
+
# field inherited via extends still resolves correctly.
|
|
2471
|
+
# ---------------------------------------------------------------------------
|
|
2472
|
+
|
|
2473
|
+
def _validate_index_lookup_fields(root: MetaData, errors: list[MetaError]) -> None:
|
|
2474
|
+
from ..meta.core.index.meta_index import MetaIndex
|
|
2475
|
+
for obj in (c for c in root.children() if c.type == TYPE_OBJECT):
|
|
2476
|
+
# Effective (resolved) field names — includes inherited fields via extends.
|
|
2477
|
+
effective_field_names = {
|
|
2478
|
+
f.name for f in obj.children() if f.type == TYPE_FIELD
|
|
2479
|
+
}
|
|
2480
|
+
for node in obj.children():
|
|
2481
|
+
if node.type != TYPE_INDEX or node.sub_type != INDEX_SUBTYPE_LOOKUP:
|
|
2482
|
+
continue
|
|
2483
|
+
if not isinstance(node, MetaIndex):
|
|
2484
|
+
continue
|
|
2485
|
+
fields = node.fields()
|
|
2486
|
+
|
|
2487
|
+
if len(fields) == 0:
|
|
2488
|
+
errors.append(MetaError(
|
|
2489
|
+
code=ErrorCode.ERR_INVALID_INDEX,
|
|
2490
|
+
message=(
|
|
2491
|
+
f'index.lookup "{node.name}" on "{obj.name}" has no '
|
|
2492
|
+
f"@{INDEX_ATTR_FIELDS}; at least one field is required"
|
|
2493
|
+
),
|
|
2494
|
+
))
|
|
2495
|
+
continue
|
|
2496
|
+
|
|
2497
|
+
for field_name in fields:
|
|
2498
|
+
if field_name not in effective_field_names:
|
|
2499
|
+
errors.append(MetaError(
|
|
2500
|
+
code=ErrorCode.ERR_INVALID_INDEX,
|
|
2501
|
+
message=(
|
|
2502
|
+
f'index.lookup "{node.name}" on "{obj.name}" references '
|
|
2503
|
+
f'field "{field_name}" which does not exist on "{obj.name}". '
|
|
2504
|
+
f"Available fields: "
|
|
2505
|
+
f"{', '.join(sorted(effective_field_names)) or '(none)'}"
|
|
2506
|
+
),
|
|
2507
|
+
))
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"""MetaIndex — concrete node class for type=index nodes."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
from ...meta_data import MetaData
|
|
5
|
+
from .index_constants import INDEX_ATTR_FIELDS, INDEX_SUBTYPE_LOOKUP
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class MetaIndex(MetaData):
|
|
9
|
+
def fields(self) -> list[str]:
|
|
10
|
+
"""ADR-0039: resolving — @fields may be inherited via extends."""
|
|
11
|
+
f = self.get_meta_attr(INDEX_ATTR_FIELDS)
|
|
12
|
+
return list(f) if isinstance(f, list) else []
|
|
13
|
+
|
|
14
|
+
def is_lookup(self) -> bool:
|
|
15
|
+
return self.sub_type == INDEX_SUBTYPE_LOOKUP
|
{metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/meta/persistence/db/db_provider.py
RENAMED
|
@@ -22,9 +22,10 @@ from ...core.identity.identity_constants import (
|
|
|
22
22
|
IDENTITY_SUBTYPE_REFERENCE,
|
|
23
23
|
IDENTITY_SUBTYPE_SECONDARY,
|
|
24
24
|
)
|
|
25
|
+
from ...core.index.index_constants import INDEX_SUBTYPE_LOOKUP
|
|
25
26
|
from ....provider import Provider
|
|
26
27
|
from ....registry import AttrSchema, TypeRegistry
|
|
27
|
-
from ....shared.base_types import TYPE_FIELD, TYPE_IDENTITY
|
|
28
|
+
from ....shared.base_types import TYPE_FIELD, TYPE_IDENTITY, TYPE_INDEX
|
|
28
29
|
from .db_constants import (
|
|
29
30
|
FIELD_ATTR_DB_COLUMN_TYPE,
|
|
30
31
|
FIELD_ATTR_LOCAL_TIME,
|
|
@@ -156,6 +157,12 @@ def _register(registry: TypeRegistry) -> None:
|
|
|
156
157
|
IDENTITY_SUBTYPE_REFERENCE,
|
|
157
158
|
attributes=[_CONSTRAINT_NAME_SCHEMA],
|
|
158
159
|
)
|
|
160
|
+
# index.lookup: same RDB physical attrs as identity.secondary (@orders/@where/@expr/@using).
|
|
161
|
+
registry.extend(
|
|
162
|
+
TYPE_INDEX,
|
|
163
|
+
INDEX_SUBTYPE_LOOKUP,
|
|
164
|
+
attributes=[_ORDERS_SCHEMA, _WHERE_SCHEMA, _EXPR_SCHEMA, _USING_SCHEMA],
|
|
165
|
+
)
|
|
159
166
|
|
|
160
167
|
|
|
161
168
|
def _make_db_provider() -> Provider:
|
|
@@ -62,6 +62,16 @@
|
|
|
62
62
|
"children": [
|
|
63
63
|
{ "type": "attr", "subType": "string", "name": "constraintName", "min": 0, "max": 1, "description": "Physical foreign-key constraint name override. Absent → the backend's auto-derived default (e.g. `<table>_<firstFkColumn>_fk`). Lets a model adopt an existing database whose FK constraints follow a different naming convention without a destructive rename. RDB-physical — contributed by the db provider." }
|
|
64
64
|
]
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"type": "index",
|
|
68
|
+
"subType": "lookup",
|
|
69
|
+
"children": [
|
|
70
|
+
{ "type": "attr", "subType": "string", "name": "orders", "isArray": true, "min": 0, "max": 1, "allowedValues": ["asc", "desc"], "description": "Physical index-key sort direction, positional to @fields ('asc' | 'desc'). Omit for all-ascending (the default); a shorter array leaves trailing keys ascending. Drives DESC-ordered index keys (e.g. a recency index on a timestamp). RDB-physical — contributed by the db provider." },
|
|
71
|
+
{ "type": "attr", "subType": "string", "name": "where", "min": 0, "max": 1, "description": "Partial-index predicate (raw SQL, e.g. \"delivered_at IS NULL\"). When set, the index covers only rows matching the predicate — smaller and cheaper for queries that always filter on it. Absent = a full index over every row. RDB-physical — contributed by the db provider." },
|
|
72
|
+
{ "type": "attr", "subType": "string", "name": "expr", "min": 0, "max": 1, "description": "Raw key EXPRESSION for a functional/expression index (e.g. \"lower(email)\"). Used INSTEAD of @fields — the index key is the expression rather than plain columns. RDB-physical — contributed by the db provider." },
|
|
73
|
+
{ "type": "attr", "subType": "string", "name": "using", "min": 0, "max": 1, "description": "Index access method (e.g. \"gin\", \"gist\", \"hash\"); default \"btree\" (not rendered). Pair with @expr for e.g. a GIN index over an array/jsonb expression. RDB-physical — contributed by the db provider." }
|
|
74
|
+
]
|
|
65
75
|
}
|
|
66
76
|
]
|
|
67
77
|
}
|
|
@@ -16,11 +16,10 @@
|
|
|
16
16
|
{
|
|
17
17
|
"type": "identity",
|
|
18
18
|
"subType": "secondary",
|
|
19
|
-
"description": "A secondary index
|
|
20
|
-
"whenToUse": "A column or set must be unique
|
|
19
|
+
"description": "A secondary unique index on one or more fields. Always enforces uniqueness — use index.lookup for non-unique query-performance indexes.",
|
|
20
|
+
"whenToUse": "A column or set of columns must be unique (e.g. email, slug, composite business key). For a plain non-unique index, use index.lookup instead.",
|
|
21
21
|
"children": [
|
|
22
|
-
{ "type": "attr", "subType": "string", "name": "fields", "isArray": true, "min": 1, "max": 1, "description": "The field name(s) composing this identity. Single-element for a simple
|
|
23
|
-
{ "type": "attr", "subType": "boolean", "name": "unique", "min": 0, "max": 1, "description": "When true (default), the secondary identity is a UNIQUE index; false makes it a plain (non-unique) index." }
|
|
22
|
+
{ "type": "attr", "subType": "string", "name": "fields", "isArray": true, "min": 1, "max": 1, "description": "The field name(s) composing this identity. Single-element for a simple unique index, multiple for a composite unique constraint." }
|
|
24
23
|
]
|
|
25
24
|
},
|
|
26
25
|
{
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"provider": "metaobjects-core-types",
|
|
3
|
+
"types": [
|
|
4
|
+
{
|
|
5
|
+
"type": "index",
|
|
6
|
+
"subType": "lookup",
|
|
7
|
+
"description": "A non-unique lookup index on one or more fields. Use for query-performance indexes that do NOT enforce uniqueness — declare identity.secondary for unique constraints instead.",
|
|
8
|
+
"whenToUse": "You need a DB index for query performance (fast lookups/sorts) but NOT uniqueness enforcement. @fields names the indexed columns; the db provider adds @orders / @expr / @where / @using for physical tuning.",
|
|
9
|
+
"children": [
|
|
10
|
+
{ "type": "attr", "subType": "string", "name": "fields", "isArray": true, "min": 1, "max": 1, "description": "The field name(s) this index covers (at least one). When @expr is present, it is the key expression derived from these fields." }
|
|
11
|
+
]
|
|
12
|
+
}
|
|
13
|
+
]
|
|
14
|
+
}
|
|
@@ -10,7 +10,8 @@
|
|
|
10
10
|
{ "type": "identity", "subType": "*", "name": "*", "min": 0, "max": null },
|
|
11
11
|
{ "type": "validator", "subType": "*", "name": "*", "min": 0, "max": null },
|
|
12
12
|
{ "type": "layout", "subType": "*", "name": "*", "min": 0, "max": null },
|
|
13
|
-
{ "type": "source", "subType": "*", "name": "*", "min": 0, "max": null }
|
|
13
|
+
{ "type": "source", "subType": "*", "name": "*", "min": 0, "max": null },
|
|
14
|
+
{ "type": "index", "subType": "*", "name": "*", "min": 0, "max": null }
|
|
14
15
|
]
|
|
15
16
|
},
|
|
16
17
|
{
|
|
File without changes
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"""Unit tests for index.lookup — load, validation, @unique rejection."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import json
|
|
5
|
+
|
|
6
|
+
from metaobjects import MetaDataLoader
|
|
7
|
+
from metaobjects.core_types import core_providers
|
|
8
|
+
from metaobjects.errors import ErrorCode
|
|
9
|
+
from metaobjects.meta.core.index.meta_index import MetaIndex
|
|
10
|
+
from metaobjects.shared.base_types import TYPE_INDEX
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def _load(fixture: dict):
|
|
14
|
+
content = json.dumps(fixture)
|
|
15
|
+
return MetaDataLoader.from_string(content, providers=list(core_providers), strict=True)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def _simple_entity_with_index(index_body: dict) -> dict:
|
|
19
|
+
return {
|
|
20
|
+
"metadata.root": {
|
|
21
|
+
"package": "test::pkg",
|
|
22
|
+
"children": [
|
|
23
|
+
{
|
|
24
|
+
"object.entity": {
|
|
25
|
+
"name": "Thing",
|
|
26
|
+
"children": [
|
|
27
|
+
{"field.string": {"name": "name"}},
|
|
28
|
+
{"field.long": {"name": "ownerId"}},
|
|
29
|
+
{"identity.primary": {"name": "pk", "@fields": ["name"], "@generation": "assigned"}},
|
|
30
|
+
{"index.lookup": index_body},
|
|
31
|
+
],
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
],
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
# ---------------------------------------------------------------------------
|
|
40
|
+
# Basic load test
|
|
41
|
+
# ---------------------------------------------------------------------------
|
|
42
|
+
|
|
43
|
+
def test_index_lookup_loads_successfully():
|
|
44
|
+
fixture = _simple_entity_with_index({
|
|
45
|
+
"name": "idx_thing_owner",
|
|
46
|
+
"@fields": ["ownerId"],
|
|
47
|
+
})
|
|
48
|
+
result = _load(fixture)
|
|
49
|
+
assert not result.errors, f"Unexpected errors: {[e.code for e in result.errors]}"
|
|
50
|
+
entity = next(c for c in result.root.children() if c.name == "Thing")
|
|
51
|
+
indexes = [c for c in entity.children() if c.type == TYPE_INDEX]
|
|
52
|
+
assert len(indexes) == 1
|
|
53
|
+
idx = indexes[0]
|
|
54
|
+
assert isinstance(idx, MetaIndex)
|
|
55
|
+
assert idx.sub_type == "lookup"
|
|
56
|
+
assert idx.fields() == ["ownerId"]
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def test_index_lookup_with_orders():
|
|
60
|
+
fixture = _simple_entity_with_index({
|
|
61
|
+
"name": "idx_thing_owner_desc",
|
|
62
|
+
"@fields": ["ownerId"],
|
|
63
|
+
"@orders": ["desc"],
|
|
64
|
+
})
|
|
65
|
+
result = _load(fixture)
|
|
66
|
+
assert not result.errors, f"Unexpected errors: {[e.code for e in result.errors]}"
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
# ---------------------------------------------------------------------------
|
|
70
|
+
# @unique rejected on identity.secondary (ERR_UNKNOWN_ATTR)
|
|
71
|
+
# ---------------------------------------------------------------------------
|
|
72
|
+
|
|
73
|
+
def test_unique_rejected_on_identity_secondary():
|
|
74
|
+
fixture = {
|
|
75
|
+
"metadata.root": {
|
|
76
|
+
"package": "test::pkg",
|
|
77
|
+
"children": [
|
|
78
|
+
{
|
|
79
|
+
"object.entity": {
|
|
80
|
+
"name": "Thing",
|
|
81
|
+
"children": [
|
|
82
|
+
{"field.string": {"name": "email"}},
|
|
83
|
+
{"identity.primary": {"name": "pk", "@fields": ["email"], "@generation": "assigned"}},
|
|
84
|
+
{
|
|
85
|
+
"identity.secondary": {
|
|
86
|
+
"name": "uq_email",
|
|
87
|
+
"@fields": ["email"],
|
|
88
|
+
"@unique": True,
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
],
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
],
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
result = _load(fixture)
|
|
98
|
+
codes = [e.code for e in result.errors]
|
|
99
|
+
assert ErrorCode.ERR_UNKNOWN_ATTR in codes, f"Expected ERR_UNKNOWN_ATTR, got: {codes}"
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
# ---------------------------------------------------------------------------
|
|
103
|
+
# @unique rejected on index.lookup (ERR_UNKNOWN_ATTR)
|
|
104
|
+
# ---------------------------------------------------------------------------
|
|
105
|
+
|
|
106
|
+
def test_unique_rejected_on_index_lookup():
|
|
107
|
+
fixture = _simple_entity_with_index({
|
|
108
|
+
"name": "idx_thing_owner",
|
|
109
|
+
"@fields": ["ownerId"],
|
|
110
|
+
"@unique": True,
|
|
111
|
+
})
|
|
112
|
+
result = _load(fixture)
|
|
113
|
+
codes = [e.code for e in result.errors]
|
|
114
|
+
assert ErrorCode.ERR_UNKNOWN_ATTR in codes, f"Expected ERR_UNKNOWN_ATTR, got: {codes}"
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
# ---------------------------------------------------------------------------
|
|
118
|
+
# ERR_INVALID_INDEX: missing @fields
|
|
119
|
+
# ---------------------------------------------------------------------------
|
|
120
|
+
|
|
121
|
+
def test_index_lookup_missing_fields_emits_err_invalid_index():
|
|
122
|
+
fixture = _simple_entity_with_index({
|
|
123
|
+
"name": "idx_bad",
|
|
124
|
+
})
|
|
125
|
+
result = _load(fixture)
|
|
126
|
+
codes = [e.code for e in result.errors]
|
|
127
|
+
assert ErrorCode.ERR_INVALID_INDEX in codes, f"Expected ERR_INVALID_INDEX, got: {codes}"
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
# ---------------------------------------------------------------------------
|
|
131
|
+
# ERR_INVALID_INDEX: field does not exist on entity
|
|
132
|
+
# ---------------------------------------------------------------------------
|
|
133
|
+
|
|
134
|
+
def test_index_lookup_unknown_field_emits_err_invalid_index():
|
|
135
|
+
fixture = _simple_entity_with_index({
|
|
136
|
+
"name": "idx_bad",
|
|
137
|
+
"@fields": ["nonExistentField"],
|
|
138
|
+
})
|
|
139
|
+
result = _load(fixture)
|
|
140
|
+
codes = [e.code for e in result.errors]
|
|
141
|
+
assert ErrorCode.ERR_INVALID_INDEX in codes, f"Expected ERR_INVALID_INDEX, got: {codes}"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/extract_delegate_emitter.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/generators/entity_model.py
RENAMED
|
File without changes
|
{metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/generators/extractor_generator.py
RENAMED
|
File without changes
|
|
File without changes
|
{metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/generators/fr019_shared_enum.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/generators/payload_vo_generator.py
RENAMED
|
File without changes
|
|
File without changes
|
{metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/generators/router_generator.py
RENAMED
|
File without changes
|
{metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/generators/template_generator.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/output_format_spec_emitter.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/template_codegen/__init__.py
RENAMED
|
File without changes
|
{metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/template_codegen/output_pattern.py
RENAMED
|
File without changes
|
{metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/template_codegen/template_data.py
RENAMED
|
File without changes
|
{metaobjects-0.15.0 → metaobjects-0.15.1}/src/metaobjects/codegen/template_codegen/template_spec.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|