metaobjects 1.0.1__tar.gz → 1.0.3__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-1.0.1 → metaobjects-1.0.3}/PKG-INFO +1 -1
- {metaobjects-1.0.1 → metaobjects-1.0.3}/pyproject.toml +11 -17
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/cli.py +189 -47
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/runner.py +22 -5
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/config/__init__.py +14 -0
- metaobjects-1.0.3/src/metaobjects/config/dependencies.py +583 -0
- metaobjects-1.0.3/src/metaobjects/config/neutral_config.py +234 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/config/source_resolver.py +115 -6
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/errors.py +21 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/loader/merge.py +167 -44
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/loader/sources/file_source.py +10 -2
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/naming.py +8 -0
- metaobjects-1.0.3/src/metaobjects/scope.py +104 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/serializer_json.py +35 -1
- metaobjects-1.0.3/tests/codegen/test_cli_dependencies.py +175 -0
- metaobjects-1.0.3/tests/config/test_dependencies.py +374 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/config/test_neutral_config.py +38 -0
- metaobjects-1.0.3/tests/conformance/test_dependency_conformance.py +150 -0
- metaobjects-1.0.3/tests/conformance/test_scope_conformance.py +75 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/test_source_resolution_conformance.py +9 -5
- metaobjects-1.0.3/tests/unit/test_file_source_id.py +23 -0
- metaobjects-1.0.3/tests/unit/test_merge.py +244 -0
- metaobjects-1.0.3/tests/unit/test_serializer_shared_document.py +51 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/uv.lock +1 -1
- metaobjects-1.0.1/src/metaobjects/config/neutral_config.py +0 -87
- metaobjects-1.0.1/tests/unit/test_merge.py +0 -128
- {metaobjects-1.0.1 → metaobjects-1.0.3}/.gitignore +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/LICENSE +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/README.md +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/hatch_build.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/scripts/generate_embedded_library.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/agent_context/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/agent_context/scaffold.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/apidocs/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/apidocs/api_model.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/apidocs/builder.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/apidocs/naming.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/apidocs/paths.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/apidocs/renderer.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/attr_class_map.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/KNOWN_GAPS.md +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/collision_names.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/config.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/constants.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/extract_delegate_emitter.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/extract_schema_emitter.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/format.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/fr010_field_mapping.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/generator.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/generator_registry.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/generators/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/generators/entity_model.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/generators/extractor_generator.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/generators/filter_allowlist_generator.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/generators/find_inbound.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/generators/fr019_shared_enum.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/generators/m2m_codegen.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/generators/names_generator.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/generators/output_parser_generator.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/generators/output_prompt_generator.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/generators/payload_vo_generator.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/generators/render_helper_generator.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/generators/router_generator.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/generators/template_generator.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/generators/tph_plan.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/generators/trace_helper_generator.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/instance_artifacts.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/metaobjects-config.schema.json +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/output_format_spec_emitter.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/overwrite_policy.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/project_config.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/runtime/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/runtime/filter_parser.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/template_codegen/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/template_codegen/output_pattern.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/template_codegen/template_data.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/template_codegen/template_spec.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/codegen/type_map.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/core_types.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/datatype.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/documentation/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/documentation/doc_constants.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/documentation/doc_provider.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/documentation/doc_schema.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/library/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/library/embedded_library.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/library/library_sources.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/loader/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/loader/meta_data_loader.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/loader/registered_validation.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/loader/sources/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/loader/sources/directory_source.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/loader/sources/meta_data_source.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/loader/sources/uri_source.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/loader/validate_discriminator.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/loader/validate_enum_normalize_ambiguity.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/loader/validate_field_mutability.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/loader/validate_source_escapes.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/loader/validate_source_parameter_ref.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/loader/validate_source_physical_names.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/loader/validation_passes.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/attr/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/attr/attr_constants.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/attr/meta_attr.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/field/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/field/field_constants.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/field/meta_field.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/identity/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/identity/identity_constants.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/identity/meta_identity.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/index/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/index/index_constants.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/index/meta_index.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/object/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/object/meta_object.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/object/meta_object_aware.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/object/object_class_registry.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/object/object_constants.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/object/object_extract.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/object/value_object.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/relationship/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/relationship/derive_m2m_fields.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/relationship/meta_relationship.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/relationship/relationship_constants.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/requirement/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/requirement/meta_requirement.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/requirement/requirement_constants.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/validator/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/core/validator/validator_constants.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/meta_data.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/meta_root.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/persistence/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/persistence/db/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/persistence/db/db_constants.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/persistence/db/db_provider.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/persistence/origin/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/persistence/origin/meta_origin.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/persistence/origin/origin_constants.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/persistence/source/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/persistence/source/meta_source.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/persistence/source/source_constants.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/presentation/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/presentation/layout/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/presentation/layout/layout_constants.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/presentation/layout/meta_layout.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/presentation/ui/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/presentation/ui/ui_provider.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/presentation/view/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/presentation/view/meta_view.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/presentation/view/view_constants.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/provider_extends.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/template/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/template/meta_template.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/template/prompt_provider.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/meta/template/template_constants.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/naming_refs.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/parser.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/parser_yaml.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/provider.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/py.typed +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/registry.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/registry_manifest.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/email_document.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/escapers.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/extract/KNOWN_GAPS.md +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/extract/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/extract/coerce.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/extract/extract.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/extract/extract_map.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/extract/json_forgiving_reader.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/extract/locate.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/extract/normalize.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/extract/strip.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/extract/types.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/extract/xml_forgiving_reader.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/filesystem_provider.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/payload_accessors.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/prompt/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/prompt/output_format_renderer.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/prompt/output_format_spec.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/prompt/prompt_field.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/prompt/prompt_overrides.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/prompt/prompt_style.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/renderer.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/render/verify.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/runtime/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/runtime/llm_recorder.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/runtime/n2m_resolver.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/runtime/object_manager.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/runtime/tph.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/shared/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/shared/base_types.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/shared/separators.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/shared/structural.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/source/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/source/error_source.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/source/json_path.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/source/semantic_diff.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/source/yaml_positions.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/source_resolution.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/spec_metamodel/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/spec_metamodel/attr.json +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/spec_metamodel/db.json +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/spec_metamodel/documentation.json +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/spec_metamodel/field.json +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/spec_metamodel/identity.json +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/spec_metamodel/index.json +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/spec_metamodel/layout.json +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/spec_metamodel/object.json +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/spec_metamodel/origin.json +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/spec_metamodel/prompt.json +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/spec_metamodel/relationship.json +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/spec_metamodel/requirement.json +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/spec_metamodel/source.json +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/spec_metamodel/template.json +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/spec_metamodel/ui-web.json +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/spec_metamodel/ui.json +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/spec_metamodel/validator.json +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/spec_metamodel/view.json +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/super_resolve.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/validation_types.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/src/metaobjects/yaml_desugar.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/golden/extends/expected/BaseEntity.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/golden/extends/expected/Program.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/golden/extends/meta.json +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/golden/nested-array/expected/AuthorBrief.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/golden/nested-array/expected/PostBrief.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/golden/nested-array/meta.json +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/golden/scalars/expected/Metric.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/golden/scalars/expected/Report.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/golden/scalars/meta.json +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/golden/vanilla/expected/Subscriber.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/golden/vanilla/meta.json +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_abstract_conformance.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_api_docs_builder.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_api_docs_paths.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_cli.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_cli_config_gen.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_cli_config_verify.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_cli_providers.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_cli_registry.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_cli_staleness_nudge.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_cli_verify_strict.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_cli_verify_subverbs.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_constants_config.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_entity_model.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_enum_conformance.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_extends_abstract_field_inheritance.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_extract_tier_collision.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_extractor_generator.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_filter_allowlist_generator.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_format.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_fr010_nested_object_prompt.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_fr010_output_codegen.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_fr019_shared_provided_conformance.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_gen_state_keying.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_generator.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_generator_extension_seams.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_golden.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_inherit_without_restate_gate.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_inheritance_conformance.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_instance_artifacts.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_m2m_codegen.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_names_extends_chain.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_names_generator.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_no_magic_physical_names.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_origin_nullability.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_output_parser_generator.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_overwrite_policy.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_overwrite_policy_hash.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_payload_vo_generator.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_project_config.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_projection_compile.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_render_helper_conformance.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_render_helper_generator.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_reverse_finders.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_router_autoset.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_router_generator.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_runner.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_source_resolution.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_sourceless_projection.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_template_data.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_template_generator.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_template_output_pattern.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_template_scope_helpers.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_template_scope_walk.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_template_spec.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_tph_codegen.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_trace_helper_generator.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_type_map.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_validation_conformance.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/codegen/test_write_through.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/config/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/config/test_source_resolver.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/capabilities.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/conformance-expected-failures.json +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/conformance_adapter.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/corpus.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/expected_failures.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/fixture_discovery.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/navigator.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/test_api_docs_cross_port_conformance.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/test_conformance.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/test_extract_conformance.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/test_extract_object_verdict.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/test_fr010_loader_attrs.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/test_fr011_attrs.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/test_generator_registry_conformance.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/test_object_model_conformance.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/test_provider_composition_conformance.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/test_registry_conformance.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/test_runner_hardfail.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/test_spec_metamodel_embed.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/test_strict_attr_load.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/test_template_codegen_conformance.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/test_template_generator_conformance.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/test_yaml_conformance.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/conformance/yaml-conformance-expected-failures.json +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/api_contract_assertions.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/api_contract_jsonb_server.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/api_contract_m2m_server.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/api_contract_server.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/generated_jsonb_app.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/generated_m2m_app.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/generated_router_app.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/generated_tph_app.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/meta_ai_trace.yaml +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/normalization.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/postgres_container.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/query_runner.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/scenarios.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/test_api_contract.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/test_api_contract_generated.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/test_api_contract_jsonb.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/test_api_contract_m2m.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/test_api_contract_m2m_generated.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/test_api_contract_tph_generated.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/test_generated_router_uuid_pk.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/test_llm_call_trace.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/test_normalization.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/test_query_scenarios.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/integration/test_runtime_return_types.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/loader/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/loader/test_abstract_subtype_authored.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/loader/test_enum_extends_values_conflict.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/loader/test_field_mutability_order.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/loader/test_shipped_library_ai.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/loader/test_template_payload_target_210.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/open_closed_proof_test.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/render/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/render/extract/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/render/extract/test_coerce.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/render/extract/test_extract.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/render/extract/test_extract_map.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/render/extract/test_json_forgiving_reader.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/render/extract/test_locate.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/render/extract/test_model.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/render/extract/test_normalize.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/render/extract/test_strip.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/render/extract/test_xml_forgiving_reader.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/render/prompt/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/render/prompt/test_output_format_renderer.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/render/test_email_document.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/render/test_filesystem_provider.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/render/test_output_format_renderer_nested.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/render/test_output_prompt_conformance.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/render/test_render_conformance.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/render/test_render_max_chars.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/render/test_verify.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/render/test_verify_conformance.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/runtime/test_object_manager_enum_intvaluemap.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/runtime/test_object_manager_table_name.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/source/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/source/test_fr5c_merge_attribution.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/source/test_fr5d_reference_resolution.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/source/test_fr5e_database_source_shape.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/source/test_json_path.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/source/test_semantic_diff.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/source/test_source_on_node.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/source/test_yaml_positions.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/test_api_docs_accuracy.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/__init__.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_agent_context_staleness.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_capabilities.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_column_naming_strategy.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_common_attrs.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_core_types.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_effective_children_sibling_shadowing.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_effective_package.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_errors.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_field_enum.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_field_enum_intvaluemap.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_field_map_validation.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_field_uuid_dbcolumntype.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_fr016_source_name_and_kind_aliases.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_index_lookup.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_llm_recorder.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_loader.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_loader_bom.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_loader_class.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_meta_attr.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_meta_data.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_meta_source.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_module_shortcuts.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_n2m_resolver.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_n2m_resolver_inherited.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_no_dead_config_fields.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_object_manager_autoset_stamping.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_object_manager_uuid_coercion.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_object_manager_write_through.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_one_primary_source.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_parser.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_parser_yaml.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_provider.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_provider_extension.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_registry.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_registry_completeness.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_registry_extend.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_registry_sealed.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_relationship_referential_actions.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_resolution_key.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_runtime_resolution_key_binding.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_serializer.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_shared_constants.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_smoke.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_source_escapes.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_sources.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_strict_child_placement.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_super_resolve.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_template_toolcall.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_template_wrong_subtype_attrs.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_validation_attr_schema.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_validation_filter_values.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_validation_origin_195.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_validation_origin_paths.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_validation_sort_field.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_validation_warnings.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_write_coercion_arrays.py +0 -0
- {metaobjects-1.0.1 → metaobjects-1.0.3}/tests/unit/test_yaml_desugar.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: metaobjects
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.3
|
|
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 = "1.0.
|
|
3
|
+
version = "1.0.3"
|
|
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,27 +62,21 @@ integration = ["pg8000>=1.31", "fastapi>=0.110", "httpx>=0.27"]
|
|
|
62
62
|
requires = ["hatchling"]
|
|
63
63
|
build-backend = "hatchling.build"
|
|
64
64
|
|
|
65
|
-
|
|
66
|
-
packages = ["src/metaobjects"]
|
|
67
|
-
exclude = ["**/KNOWN_GAPS.md"]
|
|
68
|
-
|
|
69
|
-
# Bundle the repo-root agent-context/ content tree into the package so the installed
|
|
70
|
-
# `metaobjects agent-docs` command can resolve it offline (no Node, no monorepo).
|
|
71
|
-
# A custom build hook (hatch_build.py) copies ../../agent-context into
|
|
72
|
-
# src/metaobjects/agent_context/_content at build time, and `artifacts` below forces
|
|
73
|
-
# that (gitignored) tree into BOTH the sdist and the wheel — so `uv build`
|
|
74
|
-
# (sdist -> wheel) works, not just a direct wheel build. In dev/test the resolver
|
|
75
|
-
# falls back to walking up to the monorepo agent-context/.
|
|
76
|
-
[tool.hatch.build.hooks.custom]
|
|
77
|
-
|
|
78
|
-
# FR-033 — the 15 shared spec/metamodel/*.json files are COMMITTED copies under
|
|
65
|
+
# FR-033 — the shared spec/metamodel/*.json files are COMMITTED copies under
|
|
79
66
|
# src/metaobjects/spec_metamodel/ (not build-time-generated), so hatchling's default
|
|
80
67
|
# package inclusion ships them in both the sdist and the wheel (read via
|
|
81
68
|
# importlib.resources, AOT-safe). A byte-identity gate
|
|
82
69
|
# (tests/conformance/test_spec_metamodel_embed.py) keeps the copies from drifting
|
|
83
70
|
# from the repo-root spec/metamodel/ source.
|
|
84
|
-
[tool.hatch.build]
|
|
85
|
-
|
|
71
|
+
[tool.hatch.build.targets.wheel]
|
|
72
|
+
packages = ["src/metaobjects"]
|
|
73
|
+
exclude = ["**/KNOWN_GAPS.md"]
|
|
74
|
+
|
|
75
|
+
# No agent-context ships in this package. `metaobjects agent-docs` redirects to the Node
|
|
76
|
+
# scaffolder (`npx meta agent-docs --server python`), which owns that content, so the wheel
|
|
77
|
+
# and sdist carry none of it and an agent-context/ edit never makes PyPI publish.
|
|
78
|
+
# hatch_build.py is a deliberate no-op, kept only so tooling that names the hook does not break.
|
|
79
|
+
[tool.hatch.build.hooks.custom]
|
|
86
80
|
|
|
87
81
|
[tool.pytest.ini_options]
|
|
88
82
|
testpaths = ["tests"]
|
|
@@ -49,9 +49,14 @@ import re
|
|
|
49
49
|
import sys
|
|
50
50
|
import tempfile
|
|
51
51
|
from pathlib import Path
|
|
52
|
+
from typing import Callable
|
|
52
53
|
|
|
53
54
|
from metaobjects import MetaDataLoader
|
|
54
55
|
from metaobjects.errors import ParseError
|
|
56
|
+
from metaobjects.config.dependencies import Collection, imported_from, refuse_unowned_packages
|
|
57
|
+
from metaobjects.loader.meta_data_loader import LoadResult
|
|
58
|
+
from metaobjects.loader.sources import FileSource
|
|
59
|
+
from metaobjects.meta.core.object.meta_object import MetaObject
|
|
55
60
|
from metaobjects.agent_context import (
|
|
56
61
|
AGENT_CONTEXT_MANIFEST_PATH,
|
|
57
62
|
agent_context_staleness,
|
|
@@ -93,14 +98,14 @@ from metaobjects.codegen.generators.render_helper_generator import (
|
|
|
93
98
|
_resolve_payload_vo,
|
|
94
99
|
)
|
|
95
100
|
from metaobjects.meta.template import template_constants as tc
|
|
96
|
-
from metaobjects.naming import COLUMN_NAMING_STRATEGIES, DEFAULT_COLUMN_NAMING
|
|
101
|
+
from metaobjects.naming import COLUMN_NAMING_STRATEGIES, DEFAULT_COLUMN_NAMING, package_of_resolution_key
|
|
97
102
|
from metaobjects.render.filesystem_provider import FilesystemProvider
|
|
98
103
|
from metaobjects.render.verify import (
|
|
99
104
|
ERR_REQUIRED_SLOT_UNUSED,
|
|
100
105
|
PayloadField,
|
|
101
106
|
verify as render_verify,
|
|
102
107
|
)
|
|
103
|
-
from metaobjects.shared.base_types import TYPE_TEMPLATE
|
|
108
|
+
from metaobjects.shared.base_types import TYPE_OBJECT, TYPE_TEMPLATE
|
|
104
109
|
from metaobjects.shared.separators import PACKAGE_SEP
|
|
105
110
|
|
|
106
111
|
|
|
@@ -296,33 +301,64 @@ def _load_root(
|
|
|
296
301
|
return result.root, []
|
|
297
302
|
|
|
298
303
|
|
|
299
|
-
def
|
|
300
|
-
|
|
304
|
+
def _load_collection_result(
|
|
305
|
+
collection: Collection,
|
|
301
306
|
strict: bool = False,
|
|
302
307
|
providers: list[object] | None = None,
|
|
303
308
|
libraries: list[str] | None = None,
|
|
304
|
-
) ->
|
|
305
|
-
"""Load
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
309
|
+
) -> LoadResult:
|
|
310
|
+
"""Load a resolved `Collection`'s files — its dependency artifacts leading,
|
|
311
|
+
each under its `dep:<name>/<artifact>` source id (FR-023) — then run the
|
|
312
|
+
post-load ownership refusal (`ERR_DEPENDENCY_PACKAGE_NOT_OWNED`, DESIGN
|
|
313
|
+
§11.5). Mirrors the TS `loadMemory` (`sdk/src/memory.ts`).
|
|
314
|
+
|
|
315
|
+
Lower-level than :func:`_load_root_from_collection`: this returns the raw
|
|
316
|
+
`LoadResult` (structured `MetaError`s, a code + provenance on each) rather
|
|
317
|
+
than the CLI's flattened `(root, message-strings)` contract, so a caller
|
|
318
|
+
that needs the CODE or the offending FILE — the dependency corpus runner —
|
|
319
|
+
can read them. ``refuse_unowned_packages`` runs AFTER the loader's own
|
|
320
|
+
errors, never before: an unflagged overlay whose target the upstream
|
|
321
|
+
removed fails first, with its own coded error.
|
|
313
322
|
"""
|
|
314
|
-
|
|
323
|
+
lib_sources: list[object] = []
|
|
324
|
+
if libraries:
|
|
325
|
+
from metaobjects.library import library_sources
|
|
326
|
+
|
|
327
|
+
lib_sources = library_sources(libraries)
|
|
328
|
+
|
|
329
|
+
sources = [FileSource(p, id=collection.file_ids.get(p)) for p in collection.files]
|
|
330
|
+
|
|
315
331
|
if providers:
|
|
316
332
|
from metaobjects.core_types import core_providers
|
|
317
333
|
|
|
318
|
-
|
|
319
|
-
uris,
|
|
320
|
-
providers=[*core_providers, *providers],
|
|
321
|
-
strict=strict,
|
|
322
|
-
libraries=libraries,
|
|
323
|
-
)
|
|
334
|
+
loader = MetaDataLoader(providers=[*core_providers, *providers], strict=strict)
|
|
324
335
|
else:
|
|
325
|
-
|
|
336
|
+
loader = MetaDataLoader(strict=strict)
|
|
337
|
+
|
|
338
|
+
result = loader.load([*lib_sources, *sources])
|
|
339
|
+
if not result.errors:
|
|
340
|
+
refuse_unowned_packages(result.root, collection.imported_packages, collection.imported_nodes)
|
|
341
|
+
return result
|
|
342
|
+
|
|
343
|
+
|
|
344
|
+
def _load_root_from_collection(
|
|
345
|
+
collection: Collection,
|
|
346
|
+
strict: bool = False,
|
|
347
|
+
providers: list[object] | None = None,
|
|
348
|
+
libraries: list[str] | None = None,
|
|
349
|
+
) -> tuple[MetaData | None, list[str]]:
|
|
350
|
+
"""Load a resolved `Collection` — the source-resolution ladder's
|
|
351
|
+
``.metaobjects/config.json`` rung (:func:`resolve_metadata_location`), which
|
|
352
|
+
can resolve to several directories, individual files, AND a dependency's
|
|
353
|
+
snapshot artifact, none of which a single ``from_directory`` call can
|
|
354
|
+
express. Mirrors :func:`_load_root`'s ``strict``/``providers``/``libraries``
|
|
355
|
+
contract exactly (CLI-facing: flattened error messages, never a raised
|
|
356
|
+
exception for a plain loader error).
|
|
357
|
+
"""
|
|
358
|
+
try:
|
|
359
|
+
result = _load_collection_result(collection, strict=strict, providers=providers, libraries=libraries)
|
|
360
|
+
except ParseError as exc:
|
|
361
|
+
return None, [f"{exc.code}: {exc}"]
|
|
326
362
|
if result.errors:
|
|
327
363
|
msgs = [f"{e.code}: {e.message}" for e in result.errors]
|
|
328
364
|
return None, msgs
|
|
@@ -369,6 +405,51 @@ def _parse_entities(value: str | None) -> list[str] | None:
|
|
|
369
405
|
return names or None
|
|
370
406
|
|
|
371
407
|
|
|
408
|
+
def _refuse_imported_entities(
|
|
409
|
+
entity_names: list[str] | None,
|
|
410
|
+
root: MetaData,
|
|
411
|
+
collection: Collection,
|
|
412
|
+
) -> str | None:
|
|
413
|
+
"""FR-023 §11.1 item 2 — the error message for a target's ``entities:`` (or
|
|
414
|
+
``--entities``) naming ONLY objects imported from a dependency and excluded
|
|
415
|
+
from output (imported metadata is load-only by default; only the project's
|
|
416
|
+
own `scope.include` naming the package literally opts it in). Returns
|
|
417
|
+
`None` for every other case, INCLUDING a name matching nothing at all —
|
|
418
|
+
that stays the runner's own "no entities matched" warning, unchanged.
|
|
419
|
+
Mirrors the TS `refuseImportedPositional` (`cli/src/commands/gen.ts`).
|
|
420
|
+
|
|
421
|
+
A named entity is a bare NAME, not a fully-qualified one, so two packages
|
|
422
|
+
declaring the same short name are both candidates; the refusal fires only
|
|
423
|
+
when NONE of them would generate.
|
|
424
|
+
"""
|
|
425
|
+
if not entity_names:
|
|
426
|
+
return None
|
|
427
|
+
# ADR-0039 sanctioned own: top-level object scan on the loader ROOT
|
|
428
|
+
# (metadata.root is never extended, so own == effective) — mirrors
|
|
429
|
+
# `codegen.runner._objects`.
|
|
430
|
+
all_objects = [
|
|
431
|
+
c for c in root.own_children() if c.type == TYPE_OBJECT and isinstance(c, MetaObject)
|
|
432
|
+
]
|
|
433
|
+
for name in entity_names:
|
|
434
|
+
matches = [o for o in all_objects if o.name == name]
|
|
435
|
+
if not matches:
|
|
436
|
+
continue # nothing loaded by this name — the runner's own warning covers it
|
|
437
|
+
all_excluded = all(
|
|
438
|
+
collection.imported(o.resolution_key()) and not collection.in_scope(o.resolution_key())
|
|
439
|
+
for o in matches
|
|
440
|
+
)
|
|
441
|
+
if not all_excluded:
|
|
442
|
+
continue
|
|
443
|
+
fqn = matches[0].resolution_key()
|
|
444
|
+
pkg = package_of_resolution_key(fqn)
|
|
445
|
+
dep_name = imported_from(pkg, collection.dependencies) or pkg
|
|
446
|
+
return (
|
|
447
|
+
f"error: '{name}' ({fqn}) is imported from dependency '{dep_name}' and is not "
|
|
448
|
+
"generated here — add its package to scope.include in .metaobjects/config.json"
|
|
449
|
+
)
|
|
450
|
+
return None
|
|
451
|
+
|
|
452
|
+
|
|
372
453
|
def _run_suite(
|
|
373
454
|
root: MetaData,
|
|
374
455
|
out_dir: str,
|
|
@@ -380,6 +461,7 @@ def _run_suite(
|
|
|
380
461
|
project_root: str | None = None,
|
|
381
462
|
baseline: str = "default",
|
|
382
463
|
refused_out: list[str] | None = None,
|
|
464
|
+
select: Callable[[str], bool] | None = None,
|
|
383
465
|
) -> list[str]:
|
|
384
466
|
"""Run a generator suite against an ALREADY-LOADED ``root`` into ``out_dir``.
|
|
385
467
|
|
|
@@ -388,6 +470,12 @@ def _run_suite(
|
|
|
388
470
|
the ``--template-spec`` pass). See :func:`_generate` for the parameter
|
|
389
471
|
semantics. Returns the written paths.
|
|
390
472
|
|
|
473
|
+
``select`` (FR-023 §11.1 item 2) — normally a resolved `Collection`'s
|
|
474
|
+
`in_scope`: the output filter that excludes an imported dependency's
|
|
475
|
+
objects from codegen unless the project's own `scope.include` names their
|
|
476
|
+
package. `None` (the default) admits everything, byte-identical to a
|
|
477
|
+
project with no dependencies.
|
|
478
|
+
|
|
391
479
|
NOTE: ``run_gen``'s output-path collision guard is per-pass — a
|
|
392
480
|
``--template-spec`` ``outputPattern`` that collides with a default-suite path
|
|
393
481
|
is not flagged across the two passes (it would overwrite, since default files
|
|
@@ -420,7 +508,7 @@ def _run_suite(
|
|
|
420
508
|
baseline=baseline,
|
|
421
509
|
)
|
|
422
510
|
suite = generators if generators is not None else _default_generators()
|
|
423
|
-
result = run_gen(config, root, generators=suite, entity_filter=entity_filter)
|
|
511
|
+
result = run_gen(config, root, generators=suite, entity_filter=entity_filter, select=select)
|
|
424
512
|
for warning in result.warnings:
|
|
425
513
|
print(f"warning: {warning}")
|
|
426
514
|
# A refusal is a FAILED gate, and the return value carries only what was WRITTEN — so
|
|
@@ -557,8 +645,11 @@ def template_spec_generators(
|
|
|
557
645
|
def resolve_metadata_location(
|
|
558
646
|
config: ProjectConfig | None,
|
|
559
647
|
root: Path,
|
|
560
|
-
) ->
|
|
648
|
+
) -> Collection:
|
|
561
649
|
"""The precedence ladder for where metadata lives, rungs 2-4. First match wins.
|
|
650
|
+
Returns the full FR-023-aware `Collection` at EVERY rung — `dependencies` (and
|
|
651
|
+
`scope`/`migrate.scope`) are read from `root`'s neutral `.metaobjects/config.json`
|
|
652
|
+
regardless of which rung supplied the OWN files (DESIGN §2.3).
|
|
562
653
|
|
|
563
654
|
2. This port's native surface — ``metadata`` in ``metaobjects.config.yaml``.
|
|
564
655
|
3. ``sources`` in the port-neutral ``.metaobjects/config.json``.
|
|
@@ -583,23 +674,27 @@ def resolve_metadata_location(
|
|
|
583
674
|
through to the next rung. See
|
|
584
675
|
`docs/superpowers/specs/2026-08-19-cross-port-metadata-sources-design.md` §5.
|
|
585
676
|
"""
|
|
586
|
-
from metaobjects.config.source_resolver import
|
|
677
|
+
from metaobjects.config.source_resolver import (
|
|
678
|
+
build_collection,
|
|
679
|
+
resolve_collection_full,
|
|
680
|
+
resolve_sources,
|
|
681
|
+
)
|
|
587
682
|
|
|
588
683
|
if config is not None:
|
|
589
684
|
# `config.metadata_dir()` is already resolved to an absolute path
|
|
590
685
|
# (`ProjectConfig._resolve_under`), so the base passed here is
|
|
591
|
-
# likewise irrelevant
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
686
|
+
# likewise irrelevant to resolving OWN files — but `root` is still
|
|
687
|
+
# where `.metaobjects/config.json` (dependencies/scope) is read from.
|
|
688
|
+
own_files = resolve_sources(root, [{"path": config.metadata_dir()}])
|
|
689
|
+
return build_collection(root, own_files)
|
|
595
690
|
|
|
596
|
-
# Rungs 3 and 4 both live in `
|
|
597
|
-
return
|
|
691
|
+
# Rungs 3 and 4 both live in `resolve_collection_full`.
|
|
692
|
+
return resolve_collection_full(root)
|
|
598
693
|
|
|
599
694
|
|
|
600
695
|
def _resolve_metadata_location_or_print_error(
|
|
601
696
|
config: ProjectConfig | None, root: Path
|
|
602
|
-
) ->
|
|
697
|
+
) -> Collection | None:
|
|
603
698
|
"""``resolve_metadata_location`` for the no-explicit-``metadata_dir`` CLI
|
|
604
699
|
paths (``docs``, and the ``gen``/``verify --codegen`` neutral fallbacks),
|
|
605
700
|
translating a raised ``ParseError`` into this CLI's print-and-return-1
|
|
@@ -657,8 +752,8 @@ def _cmd_docs(args: argparse.Namespace) -> int:
|
|
|
657
752
|
except ConfigError as exc:
|
|
658
753
|
print(f"error: {exc}", file=sys.stderr)
|
|
659
754
|
return 1
|
|
660
|
-
|
|
661
|
-
if
|
|
755
|
+
collection = _resolve_metadata_location_or_print_error(config, root_dir)
|
|
756
|
+
if collection is None:
|
|
662
757
|
return 1
|
|
663
758
|
docs_libraries: list[str] | None = None
|
|
664
759
|
if config is not None:
|
|
@@ -673,8 +768,8 @@ def _cmd_docs(args: argparse.Namespace) -> int:
|
|
|
673
768
|
return 1
|
|
674
769
|
providers = [*providers, *config_providers]
|
|
675
770
|
docs_libraries = config.libraries
|
|
676
|
-
root, errors =
|
|
677
|
-
|
|
771
|
+
root, errors = _load_root_from_collection(
|
|
772
|
+
collection, providers=providers, libraries=docs_libraries
|
|
678
773
|
)
|
|
679
774
|
project_default = root_dir.name
|
|
680
775
|
else:
|
|
@@ -873,6 +968,7 @@ def _run_gen_targets(
|
|
|
873
968
|
project_root: str | None = None,
|
|
874
969
|
baseline: str = "default",
|
|
875
970
|
refused_out: list[str] | None = None,
|
|
971
|
+
select: Callable[[str], bool] | None = None,
|
|
876
972
|
) -> tuple[list[str], list[str]]:
|
|
877
973
|
"""Run each target's suite into its ``outDir``. Returns (all_written, errors).
|
|
878
974
|
|
|
@@ -887,6 +983,9 @@ def _run_gen_targets(
|
|
|
887
983
|
path across targets and record an error when two targets emit the same one.
|
|
888
984
|
(Detection is post-write — the colliding file may already be on disk — but the
|
|
889
985
|
command still fails, so a misconfigured gate is caught in CI.)
|
|
986
|
+
|
|
987
|
+
``select`` (FR-023 §11.1 item 2) — see :func:`_run_suite`; the SAME predicate
|
|
988
|
+
applies to every target, since a `Collection`'s scope is project-wide.
|
|
890
989
|
"""
|
|
891
990
|
all_written: list[str] = []
|
|
892
991
|
seen: dict[str, str] = {} # full path -> target name
|
|
@@ -903,6 +1002,7 @@ def _run_gen_targets(
|
|
|
903
1002
|
written = _run_suite(
|
|
904
1003
|
root, out_dir, gens, t.entities, gen_state_dir=gen_state_dir,
|
|
905
1004
|
project_root=project_root, baseline=baseline, refused_out=refused_out,
|
|
1005
|
+
select=select,
|
|
906
1006
|
)
|
|
907
1007
|
except ValueError as exc: # intra-target run_gen collision → clean error
|
|
908
1008
|
errors.append(f"target '{t.name}': {exc}")
|
|
@@ -942,8 +1042,8 @@ def _cmd_gen_neutral_fallback(args: argparse.Namespace) -> int:
|
|
|
942
1042
|
return 2
|
|
943
1043
|
|
|
944
1044
|
root_dir = Path.cwd()
|
|
945
|
-
|
|
946
|
-
if
|
|
1045
|
+
collection = _resolve_metadata_location_or_print_error(None, root_dir)
|
|
1046
|
+
if collection is None:
|
|
947
1047
|
return 1
|
|
948
1048
|
|
|
949
1049
|
generators: list[Generator] | None = None
|
|
@@ -960,19 +1060,25 @@ def _cmd_gen_neutral_fallback(args: argparse.Namespace) -> int:
|
|
|
960
1060
|
if not providers_ok:
|
|
961
1061
|
return 1
|
|
962
1062
|
|
|
963
|
-
root, load_errors =
|
|
1063
|
+
root, load_errors = _load_root_from_collection(collection, providers=providers)
|
|
964
1064
|
if root is None:
|
|
965
1065
|
print("error: failed to load metadata:", file=sys.stderr)
|
|
966
1066
|
for msg in load_errors:
|
|
967
1067
|
print(f" {msg}", file=sys.stderr)
|
|
968
1068
|
return 1
|
|
969
1069
|
|
|
1070
|
+
imported_refusal = _refuse_imported_entities(entities, root, collection)
|
|
1071
|
+
if imported_refusal is not None:
|
|
1072
|
+
print(imported_refusal, file=sys.stderr)
|
|
1073
|
+
return 2
|
|
1074
|
+
|
|
970
1075
|
gen_state = str(root_dir.resolve() / ".metaobjects" / ".gen-state")
|
|
971
1076
|
column_naming = getattr(args, "column_naming", None) or DEFAULT_COLUMN_NAMING
|
|
972
1077
|
refused: list[str] = []
|
|
973
1078
|
written = _run_suite(
|
|
974
1079
|
root, args.out, generators, entities,
|
|
975
1080
|
gen_state_dir=gen_state, column_naming=column_naming,
|
|
1081
|
+
select=collection.in_scope,
|
|
976
1082
|
project_root=str(root_dir.resolve()),
|
|
977
1083
|
baseline=getattr(args, "baseline", None) or "default",
|
|
978
1084
|
refused_out=refused,
|
|
@@ -1038,8 +1144,17 @@ def _cmd_gen_config(args: argparse.Namespace) -> int:
|
|
|
1038
1144
|
if not providers_ok:
|
|
1039
1145
|
return 1
|
|
1040
1146
|
|
|
1041
|
-
|
|
1042
|
-
|
|
1147
|
+
# FR-023: rung 2 (this native `metaobjects.config.yaml` surface) still reads
|
|
1148
|
+
# `dependencies`/`scope`/`migrate.scope` from the project's neutral
|
|
1149
|
+
# `.metaobjects/config.json` (DESIGN §2.3 — dependencies apply at EVERY rung).
|
|
1150
|
+
collection = _resolve_metadata_location_or_print_error(
|
|
1151
|
+
config, project_root_for(config.metadata_dir())
|
|
1152
|
+
)
|
|
1153
|
+
if collection is None:
|
|
1154
|
+
return 1
|
|
1155
|
+
|
|
1156
|
+
root, load_errors = _load_root_from_collection(
|
|
1157
|
+
collection, providers=providers, libraries=config.libraries
|
|
1043
1158
|
)
|
|
1044
1159
|
if root is None:
|
|
1045
1160
|
print("error: failed to load metadata:", file=sys.stderr)
|
|
@@ -1047,6 +1162,12 @@ def _cmd_gen_config(args: argparse.Namespace) -> int:
|
|
|
1047
1162
|
print(f" {msg}", file=sys.stderr)
|
|
1048
1163
|
return 1
|
|
1049
1164
|
|
|
1165
|
+
for t in targets:
|
|
1166
|
+
imported_refusal = _refuse_imported_entities(t.entities, root, collection)
|
|
1167
|
+
if imported_refusal is not None:
|
|
1168
|
+
print(imported_refusal, file=sys.stderr)
|
|
1169
|
+
return 2
|
|
1170
|
+
|
|
1050
1171
|
refused: list[str] = []
|
|
1051
1172
|
written, errors = _run_gen_targets(
|
|
1052
1173
|
config, targets, root,
|
|
@@ -1054,6 +1175,7 @@ def _cmd_gen_config(args: argparse.Namespace) -> int:
|
|
|
1054
1175
|
project_root=str(project_root_for(config.metadata_dir())),
|
|
1055
1176
|
baseline=getattr(args, "baseline", None) or "default",
|
|
1056
1177
|
refused_out=refused,
|
|
1178
|
+
select=collection.in_scope,
|
|
1057
1179
|
)
|
|
1058
1180
|
if errors:
|
|
1059
1181
|
for msg in errors:
|
|
@@ -1323,8 +1445,8 @@ def _verify_codegen_neutral_fallback(args: argparse.Namespace) -> int:
|
|
|
1323
1445
|
return 2
|
|
1324
1446
|
|
|
1325
1447
|
root_dir = Path.cwd()
|
|
1326
|
-
|
|
1327
|
-
if
|
|
1448
|
+
collection = _resolve_metadata_location_or_print_error(None, root_dir)
|
|
1449
|
+
if collection is None:
|
|
1328
1450
|
return 1
|
|
1329
1451
|
|
|
1330
1452
|
strict = not getattr(args, "lax", False)
|
|
@@ -1338,7 +1460,7 @@ def _verify_codegen_neutral_fallback(args: argparse.Namespace) -> int:
|
|
|
1338
1460
|
|
|
1339
1461
|
with tempfile.TemporaryDirectory() as tmp:
|
|
1340
1462
|
entities = _parse_entities(getattr(args, "entities", None))
|
|
1341
|
-
root, load_errors =
|
|
1463
|
+
root, load_errors = _load_root_from_collection(collection, strict=strict, providers=providers)
|
|
1342
1464
|
if root is None:
|
|
1343
1465
|
print("error: failed to load metadata:", file=sys.stderr)
|
|
1344
1466
|
for msg in load_errors:
|
|
@@ -1347,8 +1469,14 @@ def _verify_codegen_neutral_fallback(args: argparse.Namespace) -> int:
|
|
|
1347
1469
|
print(_strict_load_hint(), file=sys.stderr)
|
|
1348
1470
|
return 1
|
|
1349
1471
|
|
|
1472
|
+
imported_refusal = _refuse_imported_entities(entities, root, collection)
|
|
1473
|
+
if imported_refusal is not None:
|
|
1474
|
+
print(imported_refusal, file=sys.stderr)
|
|
1475
|
+
return 2
|
|
1476
|
+
|
|
1350
1477
|
_run_suite(
|
|
1351
|
-
root, tmp, None, entities, gen_state_dir=None, column_naming=column_naming
|
|
1478
|
+
root, tmp, None, entities, gen_state_dir=None, column_naming=column_naming,
|
|
1479
|
+
select=collection.in_scope,
|
|
1352
1480
|
)
|
|
1353
1481
|
expected = _relative_set(Path(tmp))
|
|
1354
1482
|
committed = _relative_set(Path(args.out))
|
|
@@ -1429,8 +1557,16 @@ def _verify_codegen_config(args: argparse.Namespace) -> int:
|
|
|
1429
1557
|
if not providers_ok:
|
|
1430
1558
|
return 1
|
|
1431
1559
|
|
|
1432
|
-
|
|
1433
|
-
|
|
1560
|
+
# FR-023: see the matching comment in `_cmd_gen_config` — dependencies apply
|
|
1561
|
+
# at this rung too.
|
|
1562
|
+
collection = _resolve_metadata_location_or_print_error(
|
|
1563
|
+
config, project_root_for(config.metadata_dir())
|
|
1564
|
+
)
|
|
1565
|
+
if collection is None:
|
|
1566
|
+
return 1
|
|
1567
|
+
|
|
1568
|
+
root, load_errors = _load_root_from_collection(
|
|
1569
|
+
collection, strict=strict, providers=providers, libraries=config.libraries
|
|
1434
1570
|
)
|
|
1435
1571
|
if root is None:
|
|
1436
1572
|
print("error: failed to load metadata:", file=sys.stderr)
|
|
@@ -1440,6 +1576,12 @@ def _verify_codegen_config(args: argparse.Namespace) -> int:
|
|
|
1440
1576
|
print(_strict_load_hint(), file=sys.stderr)
|
|
1441
1577
|
return 1
|
|
1442
1578
|
|
|
1579
|
+
for t in closure:
|
|
1580
|
+
imported_refusal = _refuse_imported_entities(t.entities, root, collection)
|
|
1581
|
+
if imported_refusal is not None:
|
|
1582
|
+
print(imported_refusal, file=sys.stderr)
|
|
1583
|
+
return 2
|
|
1584
|
+
|
|
1443
1585
|
with tempfile.TemporaryDirectory() as temp_root:
|
|
1444
1586
|
# Map each unique real outDir to ONE temp slot (shared real dir => shared slot).
|
|
1445
1587
|
temp_for: dict[str, str] = {}
|
|
@@ -1456,7 +1598,7 @@ def _verify_codegen_config(args: argparse.Namespace) -> int:
|
|
|
1456
1598
|
# gen_state_dir stays None: this regenerates into a temp tree purely to
|
|
1457
1599
|
# diff, so recording a manifest would mutate the user's project from a
|
|
1458
1600
|
# read-only drift check, keyed to a directory deleted seconds later.
|
|
1459
|
-
_written, errors = _run_gen_targets(config, remapped, root)
|
|
1601
|
+
_written, errors = _run_gen_targets(config, remapped, root, select=collection.in_scope)
|
|
1460
1602
|
if errors:
|
|
1461
1603
|
for msg in errors:
|
|
1462
1604
|
print(f"error: {msg}", file=sys.stderr)
|
|
@@ -60,8 +60,22 @@ def run_gen(
|
|
|
60
60
|
*,
|
|
61
61
|
generators: list[Generator],
|
|
62
62
|
entity_filter: list[str] | None = None,
|
|
63
|
+
select: Callable[[str], bool] | None = None,
|
|
63
64
|
merge_strategy: str = "overwrite",
|
|
64
65
|
) -> RunGenResult:
|
|
66
|
+
"""Mirrors ``codegen-ts``'s ``runner.ts``.
|
|
67
|
+
|
|
68
|
+
``select`` (FR-023 §11.1 item 2) — applied AFTER ``entity_filter``, over each
|
|
69
|
+
object's ``resolution_key()`` (never the bare name — two packages may declare
|
|
70
|
+
the same short name). Normally a resolved ``Collection``'s ``in_scope``: the
|
|
71
|
+
output filter that excludes an imported dependency's objects from codegen
|
|
72
|
+
unless the project's own ``scope.include`` names their package. ``None`` (the
|
|
73
|
+
default) admits everything, byte-identical to a project with no dependencies.
|
|
74
|
+
A generator that renders once over the WHOLE selected set (the shared-enums
|
|
75
|
+
module, so far the only one) reads it off ``ctx.entities`` like any other
|
|
76
|
+
generator — no separate wiring needed, since that list is already the
|
|
77
|
+
post-``select`` set (parity with the TS ``codegen-ts`` runner's ``select``).
|
|
78
|
+
"""
|
|
65
79
|
result = RunGenResult()
|
|
66
80
|
if not isinstance(metadata, MetaRoot):
|
|
67
81
|
raise ValueError("run_gen: metadata must be a loaded MetaRoot.")
|
|
@@ -69,13 +83,16 @@ def run_gen(
|
|
|
69
83
|
objs = _objects(metadata)
|
|
70
84
|
if entity_filter is not None:
|
|
71
85
|
objs = [o for o in objs if o.name in entity_filter]
|
|
86
|
+
if select is not None:
|
|
87
|
+
objs = [o for o in objs if select(o.resolution_key())]
|
|
72
88
|
|
|
73
89
|
if not objs:
|
|
74
|
-
|
|
75
|
-
"no object children match the provided entity_filter"
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
90
|
+
if entity_filter is not None:
|
|
91
|
+
reason = "no object children match the provided entity_filter"
|
|
92
|
+
elif select is not None:
|
|
93
|
+
reason = "no object children survived the collection's scope"
|
|
94
|
+
else:
|
|
95
|
+
reason = "root has no object children"
|
|
79
96
|
result.warnings.append(f"No entities to generate — {reason}.")
|
|
80
97
|
return result
|
|
81
98
|
|
|
@@ -5,11 +5,25 @@ carries TypeScript-owned keys; those are ignored rather than modeled, so a new
|
|
|
5
5
|
TS-only key never becomes a four-port change. See
|
|
6
6
|
`docs/superpowers/specs/2026-08-19-cross-port-metadata-sources-design.md` §4.
|
|
7
7
|
"""
|
|
8
|
+
from .dependencies import (
|
|
9
|
+
ARTIFACT_SUFFIX,
|
|
10
|
+
DEPENDENCY_SOURCE_ID_PREFIX,
|
|
11
|
+
DEPS_DIR,
|
|
12
|
+
INTEGRITY_PREFIX,
|
|
13
|
+
LOCK_FILE,
|
|
14
|
+
MANIFEST_FILE,
|
|
15
|
+
)
|
|
8
16
|
from .neutral_config import DEFAULT_METADATA_DIR, NeutralConfig, read_neutral_config
|
|
9
17
|
from .source_resolver import resolve_collection, resolve_sources
|
|
10
18
|
|
|
11
19
|
__all__ = [
|
|
20
|
+
"ARTIFACT_SUFFIX",
|
|
12
21
|
"DEFAULT_METADATA_DIR",
|
|
22
|
+
"DEPENDENCY_SOURCE_ID_PREFIX",
|
|
23
|
+
"DEPS_DIR",
|
|
24
|
+
"INTEGRITY_PREFIX",
|
|
25
|
+
"LOCK_FILE",
|
|
26
|
+
"MANIFEST_FILE",
|
|
13
27
|
"NeutralConfig",
|
|
14
28
|
"read_neutral_config",
|
|
15
29
|
"resolve_collection",
|