metaobjects 0.21.6__tar.gz → 0.22.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {metaobjects-0.21.6 → metaobjects-0.22.0}/PKG-INFO +2 -2
- {metaobjects-0.21.6 → metaobjects-0.22.0}/pyproject.toml +1 -1
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/core_types.py +176 -19
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/errors.py +8 -0
- metaobjects-0.22.0/src/metaobjects/meta/core/requirement/meta_requirement.py +71 -0
- metaobjects-0.22.0/src/metaobjects/meta/core/requirement/requirement_constants.py +72 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/template/prompt_provider.py +28 -17
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/registry.py +42 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/shared/base_types.py +1 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/spec_metamodel/__init__.py +1 -0
- metaobjects-0.22.0/src/metaobjects/spec_metamodel/prompt.json +99 -0
- metaobjects-0.22.0/src/metaobjects/spec_metamodel/requirement.json +140 -0
- metaobjects-0.22.0/src/metaobjects/spec_metamodel/template.json +295 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/conformance_adapter.py +4 -3
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/fixture_discovery.py +9 -7
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/test_fr010_loader_attrs.py +5 -3
- metaobjects-0.22.0/tests/unit/__init__.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_common_attrs.py +18 -2
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_registry_extend.py +62 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_template_toolcall.py +5 -3
- {metaobjects-0.21.6 → metaobjects-0.22.0}/uv.lock +1 -1
- metaobjects-0.21.6/src/metaobjects/spec_metamodel/prompt.json +0 -77
- metaobjects-0.21.6/src/metaobjects/spec_metamodel/template.json +0 -31
- {metaobjects-0.21.6 → metaobjects-0.22.0}/.gitignore +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/LICENSE +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/README.md +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/hatch_build.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/__init__.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/agent_context/__init__.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/agent_context/scaffold.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/apidocs/__init__.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/apidocs/api_model.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/apidocs/builder.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/apidocs/naming.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/apidocs/paths.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/apidocs/renderer.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/attr_class_map.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/cli.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/KNOWN_GAPS.md +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/__init__.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/collision_names.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/config.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/constants.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/extract_delegate_emitter.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/extract_schema_emitter.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/format.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/fr010_field_mapping.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/generator.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/generator_registry.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/generators/__init__.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/generators/entity_model.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/generators/extractor_generator.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/generators/filter_allowlist_generator.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/generators/fr019_shared_enum.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/generators/m2m_codegen.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/generators/output_parser_generator.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/generators/output_prompt_generator.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/generators/payload_vo_generator.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/generators/render_helper_generator.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/generators/router_generator.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/generators/template_generator.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/generators/tph_plan.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/generators/trace_helper_generator.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/instance_artifacts.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/metaobjects-config.schema.json +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/output_format_spec_emitter.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/overwrite_policy.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/project_config.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/runner.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/runtime/__init__.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/runtime/filter_parser.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/template_codegen/__init__.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/template_codegen/output_pattern.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/template_codegen/template_data.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/template_codegen/template_spec.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/codegen/type_map.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/datatype.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/documentation/__init__.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/documentation/doc_constants.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/documentation/doc_provider.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/documentation/doc_schema.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/loader/__init__.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/loader/merge.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/loader/meta_data_loader.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/loader/registered_validation.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/loader/sources/__init__.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/loader/sources/directory_source.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/loader/sources/file_source.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/loader/sources/meta_data_source.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/loader/sources/uri_source.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/loader/validate_discriminator.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/loader/validate_enum_normalize_ambiguity.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/loader/validate_field_readonly.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/loader/validate_source_escapes.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/loader/validate_source_parameter_ref.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/loader/validate_source_physical_names.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/loader/validation_passes.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/__init__.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/__init__.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/attr/__init__.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/attr/attr_constants.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/attr/meta_attr.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/field/__init__.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/field/field_constants.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/field/meta_field.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/identity/__init__.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/identity/identity_constants.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/identity/meta_identity.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/index/__init__.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/index/index_constants.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/index/meta_index.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/object/__init__.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/object/meta_object.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/object/meta_object_aware.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/object/object_class_registry.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/object/object_constants.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/object/object_extract.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/object/value_object.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/relationship/__init__.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/relationship/derive_m2m_fields.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/relationship/meta_relationship.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/relationship/relationship_constants.py +0 -0
- {metaobjects-0.21.6/src/metaobjects/meta/core/validator → metaobjects-0.22.0/src/metaobjects/meta/core/requirement}/__init__.py +0 -0
- {metaobjects-0.21.6/src/metaobjects/meta/persistence → metaobjects-0.22.0/src/metaobjects/meta/core/validator}/__init__.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/core/validator/validator_constants.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/meta_data.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/meta_root.py +0 -0
- {metaobjects-0.21.6/src/metaobjects/meta/persistence/origin → metaobjects-0.22.0/src/metaobjects/meta/persistence}/__init__.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/persistence/db/__init__.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/persistence/db/db_constants.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/persistence/db/db_provider.py +0 -0
- {metaobjects-0.21.6/src/metaobjects/meta/persistence/source → metaobjects-0.22.0/src/metaobjects/meta/persistence/origin}/__init__.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/persistence/origin/meta_origin.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/persistence/origin/origin_constants.py +0 -0
- {metaobjects-0.21.6/src/metaobjects/meta/presentation → metaobjects-0.22.0/src/metaobjects/meta/persistence/source}/__init__.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/persistence/source/meta_source.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/persistence/source/source_constants.py +0 -0
- {metaobjects-0.21.6/src/metaobjects/meta/presentation/layout → metaobjects-0.22.0/src/metaobjects/meta/presentation}/__init__.py +0 -0
- {metaobjects-0.21.6/src/metaobjects/meta/presentation/ui → metaobjects-0.22.0/src/metaobjects/meta/presentation/layout}/__init__.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/presentation/layout/layout_constants.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/presentation/layout/meta_layout.py +0 -0
- {metaobjects-0.21.6/src/metaobjects/meta/presentation/view → metaobjects-0.22.0/src/metaobjects/meta/presentation/ui}/__init__.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/presentation/ui/ui_provider.py +0 -0
- {metaobjects-0.21.6/src/metaobjects/meta/template → metaobjects-0.22.0/src/metaobjects/meta/presentation/view}/__init__.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/presentation/view/meta_view.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/presentation/view/view_constants.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/provider_extends.py +0 -0
- {metaobjects-0.21.6/src/metaobjects/shared → metaobjects-0.22.0/src/metaobjects/meta/template}/__init__.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/template/meta_template.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/meta/template/template_constants.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/naming_refs.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/parser.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/parser_yaml.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/provider.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/py.typed +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/registry_manifest.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/__init__.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/email_document.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/escapers.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/extract/KNOWN_GAPS.md +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/extract/__init__.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/extract/coerce.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/extract/extract.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/extract/extract_map.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/extract/json_forgiving_reader.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/extract/locate.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/extract/normalize.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/extract/strip.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/extract/types.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/extract/xml_forgiving_reader.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/filesystem_provider.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/prompt/__init__.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/prompt/output_format_renderer.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/prompt/output_format_spec.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/prompt/prompt_field.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/prompt/prompt_overrides.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/prompt/prompt_style.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/renderer.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/render/verify.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/runtime/__init__.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/runtime/llm_recorder.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/runtime/n2m_resolver.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/runtime/object_manager.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/runtime/tph.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/serializer_json.py +0 -0
- {metaobjects-0.21.6/tests → metaobjects-0.22.0/src/metaobjects/shared}/__init__.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/shared/separators.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/shared/structural.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/source/__init__.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/source/error_source.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/source/json_path.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/source/semantic_diff.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/source/yaml_positions.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/spec_metamodel/attr.json +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/spec_metamodel/db.json +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/spec_metamodel/documentation.json +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/spec_metamodel/field.json +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/spec_metamodel/identity.json +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/spec_metamodel/index.json +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/spec_metamodel/layout.json +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/spec_metamodel/object.json +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/spec_metamodel/origin.json +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/spec_metamodel/relationship.json +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/spec_metamodel/source.json +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/spec_metamodel/ui-web.json +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/spec_metamodel/ui.json +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/spec_metamodel/validator.json +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/spec_metamodel/view.json +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/super_resolve.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/validation_types.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/src/metaobjects/yaml_desugar.py +0 -0
- {metaobjects-0.21.6/tests/codegen → metaobjects-0.22.0/tests}/__init__.py +0 -0
- {metaobjects-0.21.6/tests/conformance → metaobjects-0.22.0/tests/codegen}/__init__.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/golden/extends/expected/BaseEntity.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/golden/extends/expected/Program.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/golden/extends/meta.json +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/golden/nested-array/expected/AuthorBrief.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/golden/nested-array/expected/PostBrief.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/golden/nested-array/meta.json +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/golden/scalars/expected/Metric.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/golden/scalars/expected/Report.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/golden/scalars/meta.json +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/golden/vanilla/expected/Subscriber.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/golden/vanilla/meta.json +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_abstract_conformance.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_api_docs_builder.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_api_docs_paths.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_cli.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_cli_config_gen.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_cli_config_verify.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_cli_providers.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_cli_registry.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_cli_staleness_nudge.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_cli_verify_strict.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_cli_verify_subverbs.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_constants_config.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_entity_model.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_enum_conformance.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_extends_abstract_field_inheritance.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_extract_tier_collision.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_extractor_generator.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_filter_allowlist_generator.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_format.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_fr010_nested_object_prompt.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_fr010_output_codegen.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_fr019_shared_provided_conformance.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_generator.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_generator_extension_seams.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_golden.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_inherit_without_restate_gate.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_inheritance_conformance.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_instance_artifacts.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_m2m_codegen.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_origin_nullability.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_output_parser_generator.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_overwrite_policy.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_payload_vo_generator.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_project_config.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_projection_compile.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_render_helper_conformance.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_render_helper_generator.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_reverse_finders.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_router_autoset.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_router_generator.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_runner.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_sourceless_projection.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_template_data.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_template_generator.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_template_output_pattern.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_template_scope_helpers.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_template_scope_walk.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_template_spec.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_tph_codegen.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_trace_helper_generator.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_type_map.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_validation_conformance.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/codegen/test_write_through.py +0 -0
- {metaobjects-0.21.6/tests/integration → metaobjects-0.22.0/tests/conformance}/__init__.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/capabilities.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/conformance-expected-failures.json +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/corpus.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/expected_failures.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/navigator.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/test_api_docs_cross_port_conformance.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/test_conformance.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/test_extract_conformance.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/test_extract_object_verdict.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/test_fr011_attrs.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/test_generator_registry_conformance.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/test_object_model_conformance.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/test_provider_composition_conformance.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/test_registry_conformance.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/test_runner_hardfail.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/test_spec_metamodel_embed.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/test_strict_attr_load.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/test_template_codegen_conformance.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/test_template_generator_conformance.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/test_yaml_conformance.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/conformance/yaml-conformance-expected-failures.json +0 -0
- {metaobjects-0.21.6/tests/loader → metaobjects-0.22.0/tests/integration}/__init__.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/api_contract_assertions.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/api_contract_jsonb_server.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/api_contract_m2m_server.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/api_contract_server.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/generated_jsonb_app.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/generated_m2m_app.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/generated_router_app.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/generated_tph_app.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/meta_ai_trace.yaml +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/normalization.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/postgres_container.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/query_runner.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/scenarios.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/test_api_contract.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/test_api_contract_generated.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/test_api_contract_jsonb.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/test_api_contract_m2m.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/test_api_contract_m2m_generated.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/test_api_contract_tph_generated.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/test_generated_router_uuid_pk.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/test_llm_call_trace.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/test_normalization.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/test_query_scenarios.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/integration/test_runtime_return_types.py +0 -0
- {metaobjects-0.21.6/tests/render → metaobjects-0.22.0/tests/loader}/__init__.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/loader/test_enum_extends_values_conflict.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/loader/test_template_payload_target_210.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/open_closed_proof_test.py +0 -0
- {metaobjects-0.21.6/tests/render/extract → metaobjects-0.22.0/tests/render}/__init__.py +0 -0
- {metaobjects-0.21.6/tests/render/prompt → metaobjects-0.22.0/tests/render/extract}/__init__.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/render/extract/test_coerce.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/render/extract/test_extract.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/render/extract/test_extract_map.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/render/extract/test_json_forgiving_reader.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/render/extract/test_locate.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/render/extract/test_model.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/render/extract/test_normalize.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/render/extract/test_strip.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/render/extract/test_xml_forgiving_reader.py +0 -0
- {metaobjects-0.21.6/tests/source → metaobjects-0.22.0/tests/render/prompt}/__init__.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/render/prompt/test_output_format_renderer.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/render/test_email_document.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/render/test_filesystem_provider.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/render/test_output_format_renderer_nested.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/render/test_output_prompt_conformance.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/render/test_render_conformance.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/render/test_render_max_chars.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/render/test_verify.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/render/test_verify_conformance.py +0 -0
- {metaobjects-0.21.6/tests/unit → metaobjects-0.22.0/tests/source}/__init__.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/source/test_fr5c_merge_attribution.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/source/test_fr5d_reference_resolution.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/source/test_fr5e_database_source_shape.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/source/test_json_path.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/source/test_semantic_diff.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/source/test_source_on_node.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/source/test_yaml_positions.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/test_api_docs_accuracy.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_agent_context_staleness.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_capabilities.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_core_types.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_effective_package.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_errors.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_field_enum.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_field_map_validation.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_field_uuid_dbcolumntype.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_fr016_source_name_and_kind_aliases.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_index_lookup.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_llm_recorder.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_loader.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_loader_bom.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_loader_class.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_merge.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_meta_attr.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_meta_data.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_meta_source.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_module_shortcuts.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_n2m_resolver.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_n2m_resolver_inherited.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_object_manager_autoset_stamping.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_object_manager_uuid_coercion.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_object_manager_write_through.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_one_primary_source.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_parser.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_parser_yaml.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_provider.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_provider_extension.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_registry.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_registry_completeness.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_registry_sealed.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_relationship_referential_actions.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_resolution_key.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_runtime_resolution_key_binding.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_serializer.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_shared_constants.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_smoke.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_source_escapes.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_sources.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_strict_child_placement.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_super_resolve.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_template_wrong_subtype_attrs.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_validation_attr_schema.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_validation_filter_values.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_validation_origin_195.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_validation_origin_paths.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_validation_sort_field.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_validation_warnings.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_write_coercion_arrays.py +0 -0
- {metaobjects-0.21.6 → metaobjects-0.22.0}/tests/unit/test_yaml_desugar.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: metaobjects
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.22.0
|
|
4
4
|
Summary: Cross-language metadata standard: declare typed entities once, generate idiomatic drift-checked code across languages — Python port.
|
|
5
5
|
Project-URL: Homepage, https://metaobjects.dev
|
|
6
6
|
Project-URL: Repository, https://github.com/metaobjectsdev/metaobjects
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "metaobjects"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.22.0"
|
|
4
4
|
description = "Cross-language metadata standard: declare typed entities once, generate idiomatic drift-checked code across languages — Python port."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.11"
|
|
@@ -62,6 +62,19 @@ from .meta.core.object.object_constants import (
|
|
|
62
62
|
OBJECT_SUBTYPES,
|
|
63
63
|
)
|
|
64
64
|
from .meta.core.relationship.meta_relationship import MetaRelationship
|
|
65
|
+
from .meta.core.requirement.meta_requirement import MetaRequirement
|
|
66
|
+
from .meta.core.requirement.requirement_constants import (
|
|
67
|
+
REQUIREMENT_ATTR_IMPLEMENTED_BY,
|
|
68
|
+
REQUIREMENT_ATTR_LEVEL,
|
|
69
|
+
REQUIREMENT_ATTR_STATEMENT,
|
|
70
|
+
REQUIREMENT_ATTR_STATUS,
|
|
71
|
+
REQUIREMENT_ATTR_SUPERSEDED_BY,
|
|
72
|
+
REQUIREMENT_ATTR_VERIFIED_BY,
|
|
73
|
+
REQUIREMENT_ATTR_VIOLATION,
|
|
74
|
+
REQUIREMENT_STATUSES,
|
|
75
|
+
REQUIREMENT_SUBTYPE_ARCHITECTURAL,
|
|
76
|
+
REQUIREMENT_SUBTYPE_FUNCTIONAL,
|
|
77
|
+
)
|
|
65
78
|
from .meta.core.relationship.relationship_constants import (
|
|
66
79
|
REFERENTIAL_ACTIONS,
|
|
67
80
|
RELATIONSHIP_ATTR_CARDINALITY,
|
|
@@ -134,6 +147,7 @@ from .shared.base_types import (
|
|
|
134
147
|
TYPE_OBJECT,
|
|
135
148
|
TYPE_ORIGIN,
|
|
136
149
|
TYPE_RELATIONSHIP,
|
|
150
|
+
TYPE_REQUIREMENT,
|
|
137
151
|
TYPE_SOURCE,
|
|
138
152
|
TYPE_TEMPLATE,
|
|
139
153
|
TYPE_VALIDATOR,
|
|
@@ -186,8 +200,9 @@ def _register_subtypes(
|
|
|
186
200
|
# NOT declared in any spec/metamodel/*.json provider file; both this port and the TS
|
|
187
201
|
# reference HAND-CODE the root (the single documented hand-coded exception to the
|
|
188
202
|
# JSON-sourced model). Its STRUCTURAL children must byte-match the cross-port golden:
|
|
189
|
-
# description "Root metadata document" and EXACTLY the
|
|
190
|
-
# wildcards a document root legitimately holds — field / object /
|
|
203
|
+
# description "Root metadata document" and EXACTLY the five genuinely-open structural
|
|
204
|
+
# wildcards a document root legitimately holds — field / object / requirement /
|
|
205
|
+
# template / validator
|
|
191
206
|
# (mirrors the TS core-types.ts root def and the Java MetaRoot registration). Because
|
|
192
207
|
# it is undeclared in the JSON, the strict-children pass leaves it untouched, so the
|
|
193
208
|
# children registered HERE are emitted verbatim. The any-attr wildcard is intentionally
|
|
@@ -201,6 +216,8 @@ core_provider.add(
|
|
|
201
216
|
child_rules=[
|
|
202
217
|
ChildRule(TYPE_FIELD, "*"),
|
|
203
218
|
ChildRule(TYPE_OBJECT, "*"),
|
|
219
|
+
# Capability requirements are declared beside the entities they describe.
|
|
220
|
+
ChildRule(TYPE_REQUIREMENT, "*"),
|
|
204
221
|
ChildRule(TYPE_TEMPLATE, "*"),
|
|
205
222
|
ChildRule(TYPE_VALIDATOR, "*"),
|
|
206
223
|
],
|
|
@@ -545,6 +562,75 @@ for _idx_sub in INDEX_SUBTYPES:
|
|
|
545
562
|
)
|
|
546
563
|
)
|
|
547
564
|
|
|
565
|
+
# requirement.* (functional, architectural) — the capability ledger IS a metadata
|
|
566
|
+
# model (requirements-as-metadata ruling, amendment 3), so it is registered
|
|
567
|
+
# vocabulary rather than a hand-parsed side file: @status is an allowedValues enum
|
|
568
|
+
# the LOADER refuses a typo on. The axis is CHECK POLARITY, a genuine behaviour
|
|
569
|
+
# difference (ADR-0037 §2): `functional` is checked by EXISTENCE (nothing
|
|
570
|
+
# implements it -> fail), `architectural` by UNIVERSALITY (something violates it
|
|
571
|
+
# -> fail). Architectural carries no @level and no @verifiedBy — levels come from
|
|
572
|
+
# object-in-focus decomposition and an architectural requirement is
|
|
573
|
+
# object-independent by definition.
|
|
574
|
+
#
|
|
575
|
+
# Hierarchy is NESTING, not a parent attr: requirement.functional admits nested
|
|
576
|
+
# requirement children (the strict graph in spec/metamodel/requirement.json, which
|
|
577
|
+
# _apply_strict_structural_children re-derives onto this registration).
|
|
578
|
+
#
|
|
579
|
+
# @implementedBy is deliberately NOT declared as a loader `references` descriptor.
|
|
580
|
+
# That pass always ERRORS on an unresolved target, and a requirement with status
|
|
581
|
+
# `abandoned`/`superseded` exists precisely to name nodes that are GONE — declaring
|
|
582
|
+
# it here would make those entries fail to load. The loader owns what is
|
|
583
|
+
# unconditional; `verify` owns @implementedBy resolution, whose severity depends on
|
|
584
|
+
# @status.
|
|
585
|
+
_REQUIREMENT_COMMON_ATTRS = [
|
|
586
|
+
AttrSchema(
|
|
587
|
+
name=REQUIREMENT_ATTR_STATUS,
|
|
588
|
+
value_type=ATTR_SUBTYPE_STRING,
|
|
589
|
+
required=True,
|
|
590
|
+
allowed_values=REQUIREMENT_STATUSES,
|
|
591
|
+
),
|
|
592
|
+
AttrSchema(name=REQUIREMENT_ATTR_STATEMENT, value_type=ATTR_SUBTYPE_STRING, required=True),
|
|
593
|
+
AttrSchema(name=REQUIREMENT_ATTR_VIOLATION, value_type=ATTR_SUBTYPE_STRING, required=True),
|
|
594
|
+
AttrSchema(
|
|
595
|
+
name=REQUIREMENT_ATTR_IMPLEMENTED_BY,
|
|
596
|
+
value_type=ATTR_SUBTYPE_STRING,
|
|
597
|
+
required=False,
|
|
598
|
+
is_array=True,
|
|
599
|
+
),
|
|
600
|
+
AttrSchema(name=REQUIREMENT_ATTR_SUPERSEDED_BY, value_type=ATTR_SUBTYPE_STRING, required=False),
|
|
601
|
+
]
|
|
602
|
+
core_provider.add(
|
|
603
|
+
TypeDefinition(
|
|
604
|
+
type=TYPE_REQUIREMENT,
|
|
605
|
+
sub_type=REQUIREMENT_SUBTYPE_FUNCTIONAL,
|
|
606
|
+
factory=MetaRequirement,
|
|
607
|
+
attrs=[
|
|
608
|
+
AttrSchema(name=REQUIREMENT_ATTR_LEVEL, value_type=ATTR_SUBTYPE_INT, required=True),
|
|
609
|
+
*_REQUIREMENT_COMMON_ATTRS,
|
|
610
|
+
AttrSchema(
|
|
611
|
+
name=REQUIREMENT_ATTR_VERIFIED_BY,
|
|
612
|
+
value_type=ATTR_SUBTYPE_STRING,
|
|
613
|
+
required=False,
|
|
614
|
+
is_array=True,
|
|
615
|
+
),
|
|
616
|
+
],
|
|
617
|
+
child_rules=[
|
|
618
|
+
ChildRule(TYPE_ATTR, "*"),
|
|
619
|
+
# Hierarchy IS nesting — an L1 solution contains its L2 segments.
|
|
620
|
+
ChildRule(TYPE_REQUIREMENT, "*"),
|
|
621
|
+
],
|
|
622
|
+
)
|
|
623
|
+
)
|
|
624
|
+
core_provider.add(
|
|
625
|
+
TypeDefinition(
|
|
626
|
+
type=TYPE_REQUIREMENT,
|
|
627
|
+
sub_type=REQUIREMENT_SUBTYPE_ARCHITECTURAL,
|
|
628
|
+
factory=MetaRequirement,
|
|
629
|
+
attrs=list(_REQUIREMENT_COMMON_ATTRS),
|
|
630
|
+
child_rules=[ChildRule(TYPE_ATTR, "*")],
|
|
631
|
+
)
|
|
632
|
+
)
|
|
633
|
+
|
|
548
634
|
# relationship.* (base, association, aggregation, composition).
|
|
549
635
|
# @onDelete / @onUpdate are validated against REFERENTIAL_ACTIONS — kebab-case
|
|
550
636
|
# values (cascade / set-null / restrict / no-action). Defaults derive from the
|
|
@@ -825,26 +911,94 @@ for _sub, _attrs in _VALIDATOR_ATTRS_BY_SUBTYPE.items():
|
|
|
825
911
|
)
|
|
826
912
|
)
|
|
827
913
|
|
|
828
|
-
# template.* (FR-004) — base + prompt + output + toolcall.
|
|
829
|
-
#
|
|
830
|
-
#
|
|
831
|
-
#
|
|
832
|
-
#
|
|
833
|
-
#
|
|
834
|
-
#
|
|
835
|
-
# core
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
)
|
|
914
|
+
# template.* (FR-004) — base + prompt + output + toolcall. A single MetaTemplate
|
|
915
|
+
# node class backs every subtype (validation lives in validation_passes.py); the
|
|
916
|
+
# per-subtype attr vocabulary is registered HERE, WITH the type, in core — not in
|
|
917
|
+
# the prompt domain provider (`prompt_provider`, metaobjects-prompt).
|
|
918
|
+
#
|
|
919
|
+
# Supersedes the prior FR-033 S2 homing, which put every template.* attr —
|
|
920
|
+
# including the REQUIRED @payloadRef / @toolName — in prompt_provider. That made a
|
|
921
|
+
# core type's validity depend on an OPTIONAL provider: compose coreProviders
|
|
922
|
+
# without metaobjects-prompt and template.prompt stayed "registered" with zero
|
|
923
|
+
# attrs, so the required-attr rule silently stopped firing (invalid metadata —
|
|
924
|
+
# e.g. a template.prompt with no @payloadRef — loaded clean instead of erroring).
|
|
925
|
+
#
|
|
926
|
+
# THE RULE this corrects (ADR-0011 / FR-004): an attr the type is invalid or not
|
|
927
|
+
# meaningfully itself without ("own") registers WITH the type, in a provider that
|
|
928
|
+
# is always composed, never optional. An attr PROJECTING a different concern onto
|
|
929
|
+
# a type that is complete without it ("projected") registers in the concern
|
|
930
|
+
# provider and MUST stay optional — e.g. prompt.json's @xmlText/@example on every
|
|
931
|
+
# field, @enumAlias on field.enum, @normalize on object.value; see
|
|
932
|
+
# prompt_provider.py. template.base carries no attrs of its own (matches Java and
|
|
933
|
+
# the cross-port canonical); the concrete subtypes below add their reference +
|
|
934
|
+
# governance attrs exactly per spec/metamodel/template.json's "types" blocks.
|
|
935
|
+
_TEMPLATE_GOVERNANCE_ATTRS = [
|
|
936
|
+
AttrSchema(name=tc.TEMPLATE_ATTR_OWNER, value_type=ATTR_SUBTYPE_STRING),
|
|
937
|
+
AttrSchema(name=tc.TEMPLATE_ATTR_SINCE, value_type=ATTR_SUBTYPE_STRING),
|
|
938
|
+
]
|
|
939
|
+
_TEMPLATE_ATTRS_BY_SUBTYPE: dict[str, list[AttrSchema]] = {
|
|
940
|
+
SUBTYPE_BASE: [],
|
|
941
|
+
tc.TEMPLATE_SUBTYPE_PROMPT: [
|
|
942
|
+
AttrSchema(name=tc.TEMPLATE_ATTR_PAYLOAD_REF, value_type=ATTR_SUBTYPE_STRING, required=True),
|
|
943
|
+
AttrSchema(name=tc.TEMPLATE_ATTR_TEXT_REF, value_type=ATTR_SUBTYPE_STRING),
|
|
944
|
+
AttrSchema(
|
|
945
|
+
name=tc.TEMPLATE_ATTR_FORMAT,
|
|
946
|
+
value_type=ATTR_SUBTYPE_STRING,
|
|
947
|
+
default=tc.TEMPLATE_FORMAT_DEFAULT,
|
|
948
|
+
allowed_values=tc.ALLOWED_FORMATS,
|
|
949
|
+
),
|
|
950
|
+
AttrSchema(name=tc.TEMPLATE_ATTR_MAX_CHARS, value_type=ATTR_SUBTYPE_INT),
|
|
951
|
+
*_TEMPLATE_GOVERNANCE_ATTRS,
|
|
952
|
+
AttrSchema(name=tc.TEMPLATE_ATTR_REQUIRED_TAGS, value_type=ATTR_SUBTYPE_STRING, is_array=True),
|
|
953
|
+
AttrSchema(name=tc.TEMPLATE_ATTR_MAX_TOKENS, value_type=ATTR_SUBTYPE_INT),
|
|
954
|
+
AttrSchema(name=tc.TEMPLATE_ATTR_REQUIRED_SLOTS, value_type=ATTR_SUBTYPE_STRING, is_array=True),
|
|
955
|
+
AttrSchema(name=tc.TEMPLATE_ATTR_MODEL, value_type=ATTR_SUBTYPE_STRING),
|
|
956
|
+
AttrSchema(name=tc.TEMPLATE_ATTR_RESPONSE_REF, value_type=ATTR_SUBTYPE_STRING),
|
|
957
|
+
],
|
|
958
|
+
tc.TEMPLATE_SUBTYPE_OUTPUT: [
|
|
959
|
+
AttrSchema(name=tc.TEMPLATE_ATTR_PAYLOAD_REF, value_type=ATTR_SUBTYPE_STRING, required=True),
|
|
960
|
+
AttrSchema(name=tc.TEMPLATE_ATTR_TEXT_REF, value_type=ATTR_SUBTYPE_STRING),
|
|
961
|
+
AttrSchema(
|
|
962
|
+
name=tc.TEMPLATE_ATTR_FORMAT,
|
|
963
|
+
value_type=ATTR_SUBTYPE_STRING,
|
|
964
|
+
default=tc.TEMPLATE_FORMAT_DEFAULT,
|
|
965
|
+
allowed_values=tc.ALLOWED_FORMATS,
|
|
966
|
+
),
|
|
967
|
+
AttrSchema(name=tc.TEMPLATE_ATTR_MAX_CHARS, value_type=ATTR_SUBTYPE_INT),
|
|
968
|
+
*_TEMPLATE_GOVERNANCE_ATTRS,
|
|
969
|
+
AttrSchema(name=tc.TEMPLATE_ATTR_REQUIRED_TAGS, value_type=ATTR_SUBTYPE_STRING, is_array=True),
|
|
970
|
+
AttrSchema(
|
|
971
|
+
name=tc.TEMPLATE_ATTR_PROMPT_STYLE,
|
|
972
|
+
value_type=ATTR_SUBTYPE_STRING,
|
|
973
|
+
default=tc.PROMPT_STYLE_DEFAULT,
|
|
974
|
+
allowed_values=tc.PROMPT_STYLES,
|
|
975
|
+
),
|
|
976
|
+
AttrSchema(
|
|
977
|
+
name=tc.TEMPLATE_ATTR_KIND,
|
|
978
|
+
value_type=ATTR_SUBTYPE_STRING,
|
|
979
|
+
default=tc.TEMPLATE_KIND_DEFAULT,
|
|
980
|
+
allowed_values=tc.ALLOWED_KINDS,
|
|
981
|
+
),
|
|
982
|
+
AttrSchema(name=tc.TEMPLATE_ATTR_SUBJECT_REF, value_type=ATTR_SUBTYPE_STRING),
|
|
983
|
+
AttrSchema(name=tc.TEMPLATE_ATTR_HTML_BODY_REF, value_type=ATTR_SUBTYPE_STRING),
|
|
984
|
+
AttrSchema(name=tc.TEMPLATE_ATTR_TEXT_BODY_REF, value_type=ATTR_SUBTYPE_STRING),
|
|
985
|
+
],
|
|
986
|
+
tc.TEMPLATE_SUBTYPE_TOOLCALL: [
|
|
987
|
+
# Does NOT inherit the generic prompt/output reference attrs — its own
|
|
988
|
+
# minimal set (ADR-0011): no renderable text body, so no @textRef/@format.
|
|
989
|
+
AttrSchema(name=tc.TEMPLATE_ATTR_TOOL_NAME, value_type=ATTR_SUBTYPE_STRING, required=True),
|
|
990
|
+
AttrSchema(name=tc.TEMPLATE_ATTR_PAYLOAD_REF, value_type=ATTR_SUBTYPE_STRING, required=True),
|
|
991
|
+
*_TEMPLATE_GOVERNANCE_ATTRS,
|
|
992
|
+
AttrSchema(name=tc.TEMPLATE_ATTR_MAX_TOKENS, value_type=ATTR_SUBTYPE_INT),
|
|
993
|
+
],
|
|
994
|
+
}
|
|
995
|
+
for _tmpl_sub, _tmpl_attrs in _TEMPLATE_ATTRS_BY_SUBTYPE.items():
|
|
842
996
|
core_provider.add(
|
|
843
997
|
TypeDefinition(
|
|
844
998
|
type=TYPE_TEMPLATE,
|
|
845
999
|
sub_type=_tmpl_sub,
|
|
846
1000
|
factory=MetaTemplate,
|
|
847
|
-
attrs=
|
|
1001
|
+
attrs=list(_tmpl_attrs),
|
|
848
1002
|
child_rules=[ChildRule(TYPE_ATTR, "*")],
|
|
849
1003
|
)
|
|
850
1004
|
)
|
|
@@ -859,8 +1013,11 @@ for _tmpl_sub in (
|
|
|
859
1013
|
# domain (`prompt_provider`) and UI / query-surface domain (`ui_provider`) then
|
|
860
1014
|
# EXTEND the core types via TypeRegistry.extend, and the documentation provider adds
|
|
861
1015
|
# the common doc attrs. FR-033 re-homed the field's filter/sort/teaching/extract +
|
|
862
|
-
# view/layout
|
|
863
|
-
#
|
|
1016
|
+
# view/layout attrs out of core into ui/prompt (all OPTIONAL vocabulary on types
|
|
1017
|
+
# that stay complete without them); template.* attrs are OWN and stay registered
|
|
1018
|
+
# with the type in core (see the template.* block above) — dropping a concern
|
|
1019
|
+
# provider must never invalidate a type another provider registers. The composed
|
|
1020
|
+
# set is unchanged. Spread to add more: `[*core_providers, my_provider]`.
|
|
864
1021
|
# ---------------------------------------------------------------------------
|
|
865
1022
|
from .meta.persistence.db.db_provider import db_provider # noqa: E402
|
|
866
1023
|
from .meta.template.prompt_provider import prompt_provider # noqa: E402
|
|
@@ -41,6 +41,14 @@ class ErrorCode(str, Enum):
|
|
|
41
41
|
ERR_PROVIDER_DUPLICATE_ID = "ERR_PROVIDER_DUPLICATE_ID"
|
|
42
42
|
ERR_PROVIDER_MISSING_DEPENDENCY = "ERR_PROVIDER_MISSING_DEPENDENCY"
|
|
43
43
|
ERR_PROVIDER_ATTR_CONFLICT = "ERR_PROVIDER_ATTR_CONFLICT"
|
|
44
|
+
# ADR-0050: a provider tried to PROJECT a REQUIRED attribute onto a type it does
|
|
45
|
+
# not own (via TypeRegistry.extend). Projection is optional-only — a required
|
|
46
|
+
# attr registered this way disappears silently whenever that provider is
|
|
47
|
+
# composed out, taking its required-attr validation rule with it. This is
|
|
48
|
+
# exactly how FR-033 broke template.*'s @payloadRef/@toolName in all five
|
|
49
|
+
# ports. If an attr is genuinely required it is OWN: declare it with the type,
|
|
50
|
+
# in the type's own provider.
|
|
51
|
+
ERR_EXTEND_REQUIRED_ATTR = "ERR_EXTEND_REQUIRED_ATTR"
|
|
44
52
|
ERR_SUBTYPE_RULE_VIOLATION = "ERR_SUBTYPE_RULE_VIOLATION"
|
|
45
53
|
ERR_OVERLAY_NO_TARGET = "ERR_OVERLAY_NO_TARGET"
|
|
46
54
|
# FR5c — two contributing files set the same @attr to different non-empty
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"""MetaRequirement — concrete node class for type=requirement nodes.
|
|
2
|
+
|
|
3
|
+
Extends MetaData directly: no model wrapper, no indirection. Accessors are
|
|
4
|
+
RESOLVING (ADR-0039) so a requirement that ``extends`` an abstract parent
|
|
5
|
+
inherits its properties — note the Python naming inversion: ``attr()`` is
|
|
6
|
+
OWN-ONLY here, so every read below goes through ``get_meta_attr()``.
|
|
7
|
+
"""
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from ...meta_data import MetaData
|
|
11
|
+
from .requirement_constants import (
|
|
12
|
+
REQUIREMENT_ATTR_IMPLEMENTED_BY,
|
|
13
|
+
REQUIREMENT_ATTR_LEVEL,
|
|
14
|
+
REQUIREMENT_ATTR_STATUS,
|
|
15
|
+
REQUIREMENT_ATTR_VERIFIED_BY,
|
|
16
|
+
REQUIREMENT_LINK_FLOOR_LEVEL,
|
|
17
|
+
REQUIREMENT_STATUSES_REQUIRING_LIVE_NODES,
|
|
18
|
+
REQUIREMENT_SUBTYPE_ARCHITECTURAL,
|
|
19
|
+
REQUIREMENT_SUBTYPE_FUNCTIONAL,
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class MetaRequirement(MetaData):
|
|
24
|
+
def is_functional(self) -> bool:
|
|
25
|
+
"""What the product does for a user — checked by EXISTENCE."""
|
|
26
|
+
return self.sub_type == REQUIREMENT_SUBTYPE_FUNCTIONAL
|
|
27
|
+
|
|
28
|
+
def is_architectural(self) -> bool:
|
|
29
|
+
"""How the system is built — checked by UNIVERSALITY (the opposite polarity)."""
|
|
30
|
+
return self.sub_type == REQUIREMENT_SUBTYPE_ARCHITECTURAL
|
|
31
|
+
|
|
32
|
+
def level(self) -> int | None:
|
|
33
|
+
"""ADR-0039: resolving. 1 solution · 2 segment · 3 service · 4 object ·
|
|
34
|
+
5 member. Architectural requirements carry none — they are
|
|
35
|
+
object-independent by definition."""
|
|
36
|
+
v = self.get_meta_attr(REQUIREMENT_ATTR_LEVEL)
|
|
37
|
+
return v if isinstance(v, int) and not isinstance(v, bool) else None
|
|
38
|
+
|
|
39
|
+
def status(self) -> str | None:
|
|
40
|
+
"""ADR-0039: resolving. One of REQUIREMENT_STATUSES (a closed enum the
|
|
41
|
+
registry enforces via allowed_values)."""
|
|
42
|
+
v = self.get_meta_attr(REQUIREMENT_ATTR_STATUS)
|
|
43
|
+
return v if isinstance(v, str) else None
|
|
44
|
+
|
|
45
|
+
def implemented_by(self) -> list[str]:
|
|
46
|
+
"""ADR-0039: resolving. FQN references to the model nodes realising this
|
|
47
|
+
requirement (many-to-many by construction)."""
|
|
48
|
+
v = self.get_meta_attr(REQUIREMENT_ATTR_IMPLEMENTED_BY)
|
|
49
|
+
return [str(x) for x in v] if isinstance(v, list) else []
|
|
50
|
+
|
|
51
|
+
def verified_by(self) -> list[str]:
|
|
52
|
+
"""ADR-0039: resolving. Names of the tests proving the behaviour."""
|
|
53
|
+
v = self.get_meta_attr(REQUIREMENT_ATTR_VERIFIED_BY)
|
|
54
|
+
return [str(x) for x in v] if isinstance(v, list) else []
|
|
55
|
+
|
|
56
|
+
def may_reference_model(self) -> bool:
|
|
57
|
+
"""True when this requirement is permitted to reference the model at all.
|
|
58
|
+
Architectural requirements always may (their claim set is the point);
|
|
59
|
+
functional ones only at or below the link floor, so the organisational
|
|
60
|
+
tiers stay organisational."""
|
|
61
|
+
if self.is_architectural():
|
|
62
|
+
return True
|
|
63
|
+
lvl = self.level()
|
|
64
|
+
return lvl is not None and lvl >= REQUIREMENT_LINK_FLOOR_LEVEL
|
|
65
|
+
|
|
66
|
+
def requires_live_nodes(self) -> bool:
|
|
67
|
+
"""True when a dangling ``@implementedBy`` is an ERROR rather than
|
|
68
|
+
expected. An abandoned or superseded requirement's nodes are supposed to
|
|
69
|
+
be gone."""
|
|
70
|
+
s = self.status()
|
|
71
|
+
return s is not None and s in REQUIREMENT_STATUSES_REQUIRING_LIVE_NODES
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"""Requirement subtype + attr vocabulary.
|
|
2
|
+
|
|
3
|
+
``requirement.*`` is REGISTERED metamodel vocabulary (requirements-as-metadata
|
|
4
|
+
ruling, amendment 3): the capability ledger IS a metadata model, so it is
|
|
5
|
+
declared in ``metaobjects/`` beside the entities it describes and validated by
|
|
6
|
+
the loader like everything else — never hand-parsed from a side file.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
# ---------------------------------------------------------------------------
|
|
10
|
+
# Subtypes — the axis is the CHECK POLARITY, a genuine behaviour difference and
|
|
11
|
+
# therefore a subtype under ADR-0037 §2:
|
|
12
|
+
# functional -> EXISTENCE: fails when nothing implements it
|
|
13
|
+
# architectural -> UNIVERSALITY: fails when something violates it
|
|
14
|
+
# ---------------------------------------------------------------------------
|
|
15
|
+
REQUIREMENT_SUBTYPE_FUNCTIONAL = "functional"
|
|
16
|
+
REQUIREMENT_SUBTYPE_ARCHITECTURAL = "architectural"
|
|
17
|
+
|
|
18
|
+
REQUIREMENT_SUBTYPES = (
|
|
19
|
+
REQUIREMENT_SUBTYPE_FUNCTIONAL,
|
|
20
|
+
REQUIREMENT_SUBTYPE_ARCHITECTURAL,
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
# ---------------------------------------------------------------------------
|
|
24
|
+
# Attrs
|
|
25
|
+
# ---------------------------------------------------------------------------
|
|
26
|
+
#: 1 solution · 2 segment (app/library) · 3 service · 4 object · 5 member.
|
|
27
|
+
REQUIREMENT_ATTR_LEVEL = "level"
|
|
28
|
+
REQUIREMENT_ATTR_STATUS = "status"
|
|
29
|
+
REQUIREMENT_ATTR_STATEMENT = "statement"
|
|
30
|
+
REQUIREMENT_ATTR_VIOLATION = "violation"
|
|
31
|
+
REQUIREMENT_ATTR_IMPLEMENTED_BY = "implementedBy"
|
|
32
|
+
REQUIREMENT_ATTR_VERIFIED_BY = "verifiedBy"
|
|
33
|
+
REQUIREMENT_ATTR_SUPERSEDED_BY = "supersededBy"
|
|
34
|
+
|
|
35
|
+
# ---------------------------------------------------------------------------
|
|
36
|
+
# Status — a closed enum, enforced by the registry via allowed_values.
|
|
37
|
+
# ---------------------------------------------------------------------------
|
|
38
|
+
REQUIREMENT_STATUS_LIVE = "live"
|
|
39
|
+
REQUIREMENT_STATUS_PARTIAL = "partial"
|
|
40
|
+
REQUIREMENT_STATUS_ABANDONED = "abandoned"
|
|
41
|
+
REQUIREMENT_STATUS_SUPERSEDED = "superseded"
|
|
42
|
+
|
|
43
|
+
REQUIREMENT_STATUSES = (
|
|
44
|
+
REQUIREMENT_STATUS_LIVE,
|
|
45
|
+
REQUIREMENT_STATUS_PARTIAL,
|
|
46
|
+
REQUIREMENT_STATUS_ABANDONED,
|
|
47
|
+
REQUIREMENT_STATUS_SUPERSEDED,
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
#: Statuses whose implementing nodes are supposed to still exist. A dangling
|
|
51
|
+
#: ``@implementedBy`` on one of these means the model moved and the requirement
|
|
52
|
+
#: is stale; on the other two the nodes are supposed to be GONE, which is the
|
|
53
|
+
#: whole point of the entry. The asymmetry inverts as a pair.
|
|
54
|
+
REQUIREMENT_STATUSES_REQUIRING_LIVE_NODES = (
|
|
55
|
+
REQUIREMENT_STATUS_LIVE,
|
|
56
|
+
REQUIREMENT_STATUS_PARTIAL,
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
# ---------------------------------------------------------------------------
|
|
60
|
+
# Levels — organisational above the link floor, model-referencing at or below.
|
|
61
|
+
# ---------------------------------------------------------------------------
|
|
62
|
+
REQUIREMENT_LEVEL_SOLUTION = 1
|
|
63
|
+
REQUIREMENT_LEVEL_SEGMENT = 2
|
|
64
|
+
REQUIREMENT_LEVEL_SERVICE = 3
|
|
65
|
+
REQUIREMENT_LEVEL_OBJECT = 4
|
|
66
|
+
REQUIREMENT_LEVEL_MEMBER = 5
|
|
67
|
+
|
|
68
|
+
#: The lowest level that may reference the model. L1-L3 are organisational and
|
|
69
|
+
#: carrying ``@implementedBy`` there is an error.
|
|
70
|
+
REQUIREMENT_LINK_FLOOR_LEVEL = REQUIREMENT_LEVEL_OBJECT
|
|
71
|
+
REQUIREMENT_MIN_LEVEL = REQUIREMENT_LEVEL_SOLUTION
|
|
72
|
+
REQUIREMENT_MAX_LEVEL = REQUIREMENT_LEVEL_MEMBER
|
|
@@ -2,23 +2,33 @@
|
|
|
2
2
|
(cross-port ``metaobjects-prompt``; FR-004 / FR-006 / FR-010 / FR-011).
|
|
3
3
|
|
|
4
4
|
EXTENDS the core-registered types with the prompt / AI-domain markers that are
|
|
5
|
-
NOT core properties
|
|
5
|
+
NOT core properties — every one of them PROJECTED and OPTIONAL, onto a type that
|
|
6
|
+
stays complete without it:
|
|
6
7
|
- every field subtype: ``@xmlText`` (XML text-content extract), ``@example``,
|
|
7
8
|
``@instruction`` (FR-010 field-teaching prompt fragment);
|
|
8
9
|
- ``field.enum`` only: ``@enumAlias`` / ``@enumDoc`` / ``@coerceDefault`` /
|
|
9
10
|
``@normalize`` (FR-010 / FR-011 tolerant-extract overlays);
|
|
10
11
|
- ``object.value`` only: ``@normalize`` (the object-level default normalization
|
|
11
|
-
mode for its enum fields' tolerant extract)
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
12
|
+
mode for its enum fields' tolerant extract).
|
|
13
|
+
|
|
14
|
+
The ``template.prompt`` / ``template.output`` / ``template.toolcall`` attr
|
|
15
|
+
vocabulary (``@payloadRef`` / ``@textRef`` / ``@format`` / ``@toolName`` / …) does
|
|
16
|
+
**NOT** live here. FR-033 originally re-homed it to this provider, including the
|
|
17
|
+
REQUIRED ``@payloadRef`` / ``@toolName`` — that made a core type's validity depend
|
|
18
|
+
on an optional provider: compose ``core_providers`` without ``metaobjects-prompt``
|
|
19
|
+
and ``template.prompt`` stayed "registered" with zero attrs, so the required-attr
|
|
20
|
+
rule silently stopped firing. Those attrs are OWN (the type is invalid without
|
|
21
|
+
them) and now register WITH the type in ``core_types.py``, always — see the
|
|
22
|
+
``template.*`` block there. Only genuinely OPTIONAL projections belong in a
|
|
23
|
+
concern provider; this module's remaining attrs (above) all satisfy that.
|
|
24
|
+
|
|
25
|
+
``@xmlText`` was previously registered in ``template_provider``; the rest of this
|
|
26
|
+
module's attrs were previously registered in ``core_types`` (the field / object
|
|
27
|
+
attrs). FR-033 re-homed them here to match the TS provider split (``promptProvider``
|
|
28
|
+
renamed from ``templateProvider``), the C# ``PromptMetaDataProvider``, and Java's
|
|
29
|
+
prompt concern provider. The attrs + their value-types / required-ness /
|
|
30
|
+
allowed-values / defaults are DATA — read from the embedded
|
|
31
|
+
``spec/metamodel/prompt.json`` (single-sourced, never hand-copied) via
|
|
22
32
|
:func:`load_provider_extends`. The composed registry is UNCHANGED (the manifest is
|
|
23
33
|
provider-agnostic) — this only moves WHICH provider registers each attr.
|
|
24
34
|
|
|
@@ -35,11 +45,12 @@ from ...shared.base_types import TYPE_FIELD
|
|
|
35
45
|
from ..core.field import field_constants as fc
|
|
36
46
|
|
|
37
47
|
# The prompt.json ``extends`` directives apply to ``field.*`` (every field subtype),
|
|
38
|
-
# ``field.enum
|
|
39
|
-
#
|
|
40
|
-
#
|
|
41
|
-
# ``field.enum``), mirroring
|
|
42
|
-
# field-teaching + serialization markers reach every field
|
|
48
|
+
# ``field.enum`` and ``object.value`` — the template.* attrs are OWN (registered in
|
|
49
|
+
# core_types.py, not here; see this module's docstring). register_extends()
|
|
50
|
+
# expands the ``"*"`` field subtype to every concrete field subtype (the shared
|
|
51
|
+
# FIELD_SUBTYPES tuple — which excludes ``enum`` — PLUS ``field.enum``), mirroring
|
|
52
|
+
# db_provider, so the field-teaching + serialization markers reach every field
|
|
53
|
+
# including enum.
|
|
43
54
|
_FIELD_SUBTYPES: tuple[str, ...] = (*fc.FIELD_SUBTYPES, fc.FIELD_SUBTYPE_ENUM)
|
|
44
55
|
|
|
45
56
|
#: The embedded shared provider-definition file this provider sources its attrs from.
|
|
@@ -216,6 +216,20 @@ class TypeRegistry:
|
|
|
216
216
|
"""
|
|
217
217
|
self._check_not_sealed("register_common_attrs")
|
|
218
218
|
for attr in attrs:
|
|
219
|
+
# ADR-0050, the second door. A common attr is projected onto EVERY registered
|
|
220
|
+
# type, so a required one is the same defect as a required extend() -- with the
|
|
221
|
+
# widest possible blast radius: drop the provider and every type silently loses
|
|
222
|
+
# a required-attr rule. Java is immune by construction (its
|
|
223
|
+
# registerCommonAttribute takes no required parameter); AttrSchema carries
|
|
224
|
+
# `required`, so this port needs the explicit guard.
|
|
225
|
+
if attr.required:
|
|
226
|
+
raise ParseError(
|
|
227
|
+
f'TypeRegistry.register_common_attrs: attribute "{attr.name}" is '
|
|
228
|
+
"REQUIRED. A common attr is projected onto every registered type, so a "
|
|
229
|
+
"required one would vanish from all of them whenever its provider is "
|
|
230
|
+
"composed out. Common attrs must be optional (ADR-0050).",
|
|
231
|
+
ErrorCode.ERR_EXTEND_REQUIRED_ATTR,
|
|
232
|
+
)
|
|
219
233
|
if any(existing.name == attr.name for existing in self._common_attrs):
|
|
220
234
|
continue # first registration wins
|
|
221
235
|
self._common_attrs.append(attr)
|
|
@@ -261,6 +275,17 @@ class TypeRegistry:
|
|
|
261
275
|
:raises ParseError: ``ERR_PROVIDER_ATTR_CONFLICT`` if an attribute
|
|
262
276
|
name already exists on the type (own-only check — common-attr
|
|
263
277
|
collisions are still surfaced separately at validation time).
|
|
278
|
+
:raises ParseError: ``ERR_EXTEND_REQUIRED_ATTR`` if an attribute being
|
|
279
|
+
added is ``required`` (ADR-0050). ``extend`` is how a concern
|
|
280
|
+
provider PROJECTS an attr onto a type it does not own, and a
|
|
281
|
+
concern can be composed out of a registry composition. A required
|
|
282
|
+
attr arriving this way makes the target type's validity depend on
|
|
283
|
+
an optional provider — the failure is silent: drop the provider
|
|
284
|
+
and the type stays registered while its required-attr rule stops
|
|
285
|
+
firing, so invalid metadata begins loading clean. A genuinely
|
|
286
|
+
required attr is OWN and belongs with its type, in the type's own
|
|
287
|
+
provider — never via ``extend``. Fails CLOSED: the offending attr
|
|
288
|
+
is not appended before the raise.
|
|
264
289
|
|
|
265
290
|
Note: providers calling ``extend`` MUST declare a dependency on the
|
|
266
291
|
provider that originally registered the ``(type_, sub_type)`` so
|
|
@@ -289,6 +314,23 @@ class TypeRegistry:
|
|
|
289
314
|
f'on "{type_}.{sub_type}"',
|
|
290
315
|
ErrorCode.ERR_PROVIDER_ATTR_CONFLICT,
|
|
291
316
|
)
|
|
317
|
+
# ADR-0050: a REQUIRED attr may never be PROJECTED onto someone else's
|
|
318
|
+
# type. A provider may only project OPTIONAL attributes onto a type it
|
|
319
|
+
# does not own — a required attr registered this way disappears,
|
|
320
|
+
# silently, whenever that provider is composed out. If the attr is
|
|
321
|
+
# genuinely required, it is OWN: declare it with the type instead, in
|
|
322
|
+
# the type's own provider. Checked (and raised) before the attr is
|
|
323
|
+
# appended, so the offending attr is never half-applied.
|
|
324
|
+
if attr.required:
|
|
325
|
+
raise ParseError(
|
|
326
|
+
f'TypeRegistry.extend: attribute "{attr.name}" being added to '
|
|
327
|
+
f'"{type_}.{sub_type}" is REQUIRED. A provider may only project '
|
|
328
|
+
f"OPTIONAL attributes onto a type it does not own — a required "
|
|
329
|
+
f"attr registered this way disappears, silently, whenever that "
|
|
330
|
+
f"provider is composed out. Declare it with the type instead "
|
|
331
|
+
f"(ADR-0050).",
|
|
332
|
+
ErrorCode.ERR_EXTEND_REQUIRED_ATTR,
|
|
333
|
+
)
|
|
292
334
|
definition.attrs.append(attr)
|
|
293
335
|
# #265 — stamp the extending provider as this attr's origin.
|
|
294
336
|
self._attr_provenance[(type_, sub_type, attr.name)] = origin
|