metaobjects 1.0.9rc6__tar.gz → 1.0.10__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.9rc6 → metaobjects-1.0.10}/PKG-INFO +1 -1
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/pyproject.toml +1 -1
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/generators/filter_allowlist_generator.py +10 -2
- metaobjects-1.0.10/src/metaobjects/codegen/instance_artifacts.py +43 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/core/object/object_extract.py +25 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/render/extract/extract.py +15 -1
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/render/extract/types.py +13 -0
- metaobjects-1.0.10/tests/codegen/test_sourceless_entity_surface.py +74 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/conformance/test_extract_conformance.py +16 -1
- metaobjects-1.0.10/tests/conformance/test_extract_object_array_bounds.py +58 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/uv.lock +1 -1
- metaobjects-1.0.9rc6/src/metaobjects/codegen/instance_artifacts.py +0 -18
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/.gitignore +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/LICENSE +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/README.md +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/hatch_build.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/scripts/generate_embedded_library.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/agent_context/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/agent_context/scaffold.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/apidocs/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/apidocs/api_model.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/apidocs/builder.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/apidocs/naming.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/apidocs/paths.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/apidocs/renderer.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/attr_class_map.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/cli.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/KNOWN_GAPS.md +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/collision_names.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/config.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/constants.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/eject.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/extract_delegate_emitter.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/extract_schema_emitter.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/format.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/fr010_field_mapping.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/generator.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/generator_registry.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/generators/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/generators/entity_model.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/generators/extractor_generator.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/generators/find_inbound.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/generators/fr019_shared_enum.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/generators/m2m_codegen.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/generators/names_generator.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/generators/output_parser_generator.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/generators/output_prompt_generator.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/generators/render_helper_generator.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/generators/router_generator.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/generators/template_generator.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/generators/tph_plan.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/generators/trace_helper_generator.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/metaobjects-config.schema.json +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/model_walk.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/output_format_spec_emitter.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/overwrite_policy.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/project_config.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/runner.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/runtime/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/runtime/constraint_errors.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/runtime/filter_parser.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/template_codegen/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/template_codegen/output_pattern.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/template_codegen/template_data.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/template_codegen/template_spec.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/type_map.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/value_objects.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/config/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/config/dependencies.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/config/neutral_config.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/config/source_resolver.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/core_types.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/datatype.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/documentation/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/documentation/doc_constants.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/documentation/doc_provider.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/documentation/doc_schema.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/errors.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/library/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/library/embedded_library.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/library/library_sources.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/loader/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/loader/merge.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/loader/meta_data_loader.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/loader/registered_validation.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/loader/sources/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/loader/sources/directory_source.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/loader/sources/file_source.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/loader/sources/meta_data_source.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/loader/sources/uri_source.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/loader/validate_discriminator.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/loader/validate_enum_normalize_ambiguity.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/loader/validate_field_mutability.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/loader/validate_source_escapes.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/loader/validate_source_parameter_ref.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/loader/validate_source_physical_names.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/loader/validation_passes.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/core/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/core/attr/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/core/attr/attr_constants.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/core/attr/meta_attr.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/core/field/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/core/field/field_constants.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/core/field/meta_field.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/core/identity/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/core/identity/identity_constants.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/core/identity/meta_identity.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/core/index/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/core/index/index_constants.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/core/index/meta_index.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/core/object/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/core/object/meta_object.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/core/object/meta_object_aware.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/core/object/object_class_registry.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/core/object/object_constants.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/core/object/value_object.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/core/relationship/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/core/relationship/derive_m2m_fields.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/core/relationship/meta_relationship.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/core/relationship/relationship_constants.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/core/relationship/relationship_references.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/core/requirement/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/core/requirement/meta_requirement.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/core/requirement/requirement_constants.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/core/validator/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/core/validator/validator_constants.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/meta_data.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/meta_root.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/persistence/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/persistence/db/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/persistence/db/db_constants.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/persistence/db/db_provider.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/persistence/origin/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/persistence/origin/meta_origin.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/persistence/origin/origin_constants.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/persistence/source/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/persistence/source/meta_source.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/persistence/source/source_constants.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/presentation/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/presentation/layout/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/presentation/layout/layout_constants.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/presentation/layout/meta_layout.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/presentation/ui/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/presentation/ui/ui_provider.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/presentation/view/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/presentation/view/meta_view.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/presentation/view/view_constants.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/provider_extends.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/template/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/template/meta_template.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/template/prompt_provider.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/template/template_constants.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta_endpoint.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/naming.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/naming_refs.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/parser.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/parser_yaml.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/provider.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/py.typed +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/registry.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/registry_manifest.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/render/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/render/email_document.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/render/escapers.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/render/extract/KNOWN_GAPS.md +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/render/extract/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/render/extract/coerce.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/render/extract/extract_map.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/render/extract/json_forgiving_reader.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/render/extract/locate.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/render/extract/normalize.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/render/extract/strip.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/render/extract/xml_forgiving_reader.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/render/filesystem_provider.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/render/payload_accessors.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/render/prompt/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/render/prompt/output_format_renderer.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/render/prompt/output_format_spec.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/render/prompt/prompt_field.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/render/prompt/prompt_overrides.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/render/prompt/prompt_style.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/render/renderer.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/render/verify.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/runtime/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/runtime/llm_recorder.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/runtime/n2m_resolver.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/runtime/object_manager.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/runtime/tph.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/scope.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/serializer_json.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/shared/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/shared/base_types.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/shared/separators.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/shared/structural.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/source/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/source/error_source.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/source/json_path.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/source/semantic_diff.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/source/yaml_positions.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/source_resolution.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/spec_metamodel/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/spec_metamodel/attr.json +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/spec_metamodel/db.json +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/spec_metamodel/documentation.json +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/spec_metamodel/field.json +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/spec_metamodel/identity.json +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/spec_metamodel/index.json +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/spec_metamodel/layout.json +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/spec_metamodel/object.json +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/spec_metamodel/origin.json +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/spec_metamodel/prompt.json +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/spec_metamodel/relationship.json +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/spec_metamodel/requirement.json +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/spec_metamodel/source.json +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/spec_metamodel/template.json +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/spec_metamodel/ui-web.json +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/spec_metamodel/ui.json +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/spec_metamodel/validator.json +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/spec_metamodel/view.json +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/super_resolve.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/validation_types.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/yaml_desugar.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/gen_suite.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/golden/extends/expected/BaseEntity.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/golden/extends/expected/Program.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/golden/extends/meta.json +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/golden/nested-array/expected/AuthorBrief.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/golden/nested-array/expected/PostBrief.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/golden/nested-array/meta.json +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/golden/scalars/expected/Metric.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/golden/scalars/expected/Report.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/golden/scalars/meta.json +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/golden/vanilla/expected/Subscriber.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/golden/vanilla/meta.json +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_abstract_conformance.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_api_docs_builder.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_api_docs_paths.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_cli.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_cli_config_gen.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_cli_config_verify.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_cli_dependencies.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_cli_gen_unknown_attr.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_cli_providers.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_cli_registry.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_cli_render_helper_template_root.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_cli_staleness_nudge.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_cli_verify_strict.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_cli_verify_subverbs.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_codegen_compile_conformance.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_constants_config.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_eject.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_eject_runtime.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_entity_model.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_enum_conformance.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_extends_abstract_field_inheritance.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_extract_tier_collision.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_extractor_generator.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_filter_allowlist_generator.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_format.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_fr010_nested_object_prompt.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_fr010_output_codegen.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_fr019_shared_provided_conformance.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_gen_state_keying.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_generator.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_generator_extension_seams.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_golden.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_inherit_without_restate_gate.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_inheritance_conformance.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_instance_artifacts.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_m2m_codegen.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_names_extends_chain.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_names_generator.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_no_magic_physical_names.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_origin_nullability.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_output_parser_generator.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_overwrite_policy.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_overwrite_policy_hash.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_project_config.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_projection_compile.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_recipe_generators.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_render_helper_conformance.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_render_helper_generator.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_reverse_finders.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_route_path_naming.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_router_autoset.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_router_generator.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_router_generator_m2m_target_tph.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_router_generator_tph_m2m.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_router_generator_tph_m2m_shadowed.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_runner.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_source_resolution.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_sourceless_projection.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_template_data.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_template_generator.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_template_output_pattern.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_template_scope_helpers.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_template_scope_walk.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_template_spec.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_tph_codegen.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_trace_helper_generator.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_type_map.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_validation_conformance.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_value_objects.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/codegen/test_write_through.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/config/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/config/test_dependencies.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/config/test_library_package_guard.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/config/test_neutral_config.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/config/test_source_resolver.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/conformance/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/conformance/capabilities.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/conformance/conformance-expected-failures.json +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/conformance/conformance_adapter.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/conformance/corpus.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/conformance/expected_failures.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/conformance/fixture_discovery.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/conformance/navigator.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/conformance/test_api_docs_cross_port_conformance.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/conformance/test_conformance.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/conformance/test_dependency_conformance.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/conformance/test_extract_object_verdict.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/conformance/test_fr010_loader_attrs.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/conformance/test_fr011_attrs.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/conformance/test_generator_registry_conformance.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/conformance/test_object_model_conformance.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/conformance/test_provider_composition_conformance.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/conformance/test_registry_conformance.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/conformance/test_runner_hardfail.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/conformance/test_scope_conformance.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/conformance/test_source_resolution_conformance.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/conformance/test_spec_metamodel_embed.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/conformance/test_strict_attr_load.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/conformance/test_template_codegen_conformance.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/conformance/test_template_generator_conformance.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/conformance/test_yaml_conformance.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/conformance/yaml-conformance-expected-failures.json +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/integration/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/integration/api_contract_assertions.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/integration/api_contract_jsonb_server.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/integration/api_contract_m2m_server.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/integration/api_contract_server.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/integration/generated_jsonb_app.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/integration/generated_m2m_app.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/integration/generated_projection_app.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/integration/generated_router_app.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/integration/generated_tph_app.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/integration/meta_ai_trace.yaml +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/integration/normalization.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/integration/postgres_container.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/integration/query_runner.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/integration/scenarios.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/integration/test_api_contract.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/integration/test_api_contract_generated.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/integration/test_api_contract_jsonb.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/integration/test_api_contract_m2m.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/integration/test_api_contract_m2m_generated.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/integration/test_api_contract_projection.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/integration/test_api_contract_tph_generated.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/integration/test_generated_router_uuid_pk.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/integration/test_llm_call_trace.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/integration/test_m2m_target_tph_generated.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/integration/test_normalization.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/integration/test_query_scenarios.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/integration/test_runtime_return_types.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/integration/test_tph_m2m_generated.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/integration/test_tph_m2m_shadowed_generated.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/loader/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/loader/test_abstract_subtype_authored.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/loader/test_child_wrapper_body_shape.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/loader/test_enum_extends_values_conflict.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/loader/test_field_mutability_order.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/loader/test_shipped_library_ai.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/loader/test_template_payload_target_210.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/open_closed_proof_test.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/render/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/render/extract/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/render/extract/test_coerce.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/render/extract/test_extract.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/render/extract/test_extract_map.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/render/extract/test_json_forgiving_reader.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/render/extract/test_locate.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/render/extract/test_model.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/render/extract/test_normalize.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/render/extract/test_strip.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/render/extract/test_xml_forgiving_reader.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/render/prompt/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/render/prompt/test_output_format_renderer.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/render/test_email_document.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/render/test_filesystem_provider.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/render/test_output_format_renderer_nested.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/render/test_output_prompt_conformance.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/render/test_render_conformance.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/render/test_render_max_chars.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/render/test_render_model_payload.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/render/test_verify.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/render/test_verify_conformance.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/runtime/test_constraint_errors.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/runtime/test_object_manager_currency_read.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/runtime/test_object_manager_enum_intvaluemap.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/runtime/test_object_manager_table_name.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/source/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/source/test_fr5c_merge_attribution.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/source/test_fr5d_reference_resolution.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/source/test_fr5e_database_source_shape.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/source/test_json_path.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/source/test_semantic_diff.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/source/test_source_on_node.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/source/test_yaml_positions.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/test_api_docs_accuracy.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/test_meta_endpoint.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/__init__.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_agent_context_staleness.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_capabilities.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_column_naming_strategy.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_common_attrs.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_core_types.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_derive_m2m_declaring_entity.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_effective_children_sibling_shadowing.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_effective_package.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_errors.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_field_enum.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_field_enum_intvaluemap.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_field_map_validation.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_field_uuid_dbcolumntype.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_file_source_id.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_fr016_source_name_and_kind_aliases.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_index_lookup.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_llm_recorder.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_loader.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_loader_bom.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_loader_class.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_merge.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_meta_attr.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_meta_data.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_meta_source.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_module_shortcuts.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_n2m_resolver.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_n2m_resolver_inherited.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_no_dead_config_fields.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_object_manager_autoset_stamping.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_object_manager_uuid_coercion.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_object_manager_write_through.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_one_primary_source.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_parser.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_parser_yaml.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_provider.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_provider_extension.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_registry.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_registry_completeness.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_registry_extend.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_registry_sealed.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_relationship_m2m_validation.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_relationship_references.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_relationship_referential_actions.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_resolution_key.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_runtime_resolution_key_binding.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_serializer.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_serializer_shared_document.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_shared_constants.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_smoke.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_source_escapes.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_sources.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_strict_child_placement.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_super_resolve.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_template_toolcall.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_template_wrong_subtype_attrs.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_validation_attr_schema.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_validation_filter_values.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_validation_origin_195.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_validation_origin_paths.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_validation_sort_field.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_validation_warnings.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/tests/unit/test_write_coercion_arrays.py +0 -0
- {metaobjects-1.0.9rc6 → metaobjects-1.0.10}/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.10
|
|
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.10"
|
|
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"
|
|
@@ -39,6 +39,7 @@ from metaobjects.codegen.generator import EmittedFile, GenContext, Generator, pe
|
|
|
39
39
|
from metaobjects.codegen.generators.m2m_codegen import build_object_index
|
|
40
40
|
from metaobjects.codegen.generators.router_generator import emits_router
|
|
41
41
|
from metaobjects.codegen.generators.tph_plan import tph_plan_for
|
|
42
|
+
from metaobjects.codegen.instance_artifacts import is_sourceless_entity
|
|
42
43
|
from metaobjects.meta.core.field import field_constants as fc
|
|
43
44
|
from metaobjects.meta.core.field.meta_field import MetaField
|
|
44
45
|
from metaobjects.meta.core.object.meta_object import MetaObject
|
|
@@ -179,7 +180,9 @@ class FilterAllowlistGenerator:
|
|
|
179
180
|
|
|
180
181
|
Skips entities without a ``source.rdb`` child and read-only kinds
|
|
181
182
|
(view / materializedView / storedProc / tableFunction) — same gate as
|
|
182
|
-
``RouterGenerator``, so the two generators emit in lock-step.
|
|
183
|
+
``RouterGenerator``, so the two generators emit in lock-step. The exception is a
|
|
184
|
+
sourceless entity (``is_sourceless_entity``): no router, but an allowlist for the
|
|
185
|
+
adopter's own endpoint.
|
|
183
186
|
"""
|
|
184
187
|
|
|
185
188
|
name = "filter-allowlist-generator"
|
|
@@ -271,7 +274,12 @@ class FilterAllowlistGenerator:
|
|
|
271
274
|
# again at F22 when the router learned to serve view-only projections and
|
|
272
275
|
# this module did not — the emitted router imported an allowlist nothing
|
|
273
276
|
# had generated.
|
|
274
|
-
|
|
277
|
+
#
|
|
278
|
+
# The one addition: a sourceless entity (identity, no source — a record in a store
|
|
279
|
+
# MetaObjects does not manage) gets no router but does get the allowlist, for the
|
|
280
|
+
# list endpoint its adopter writes. Nothing generated imports it, so the lock-step
|
|
281
|
+
# rule above is not at stake.
|
|
282
|
+
if not emits_router(entity) and not is_sourceless_entity(entity):
|
|
275
283
|
return None
|
|
276
284
|
|
|
277
285
|
short_name = entity.name
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"""Guard for the abstract concept (mirrors the TS instance-artifacts module).
|
|
2
|
+
|
|
3
|
+
An abstract entity must never produce instance/write artifacts (routers, filter
|
|
4
|
+
allowlists, CREATE TABLE DDL). The Pydantic base *model* is a separate concern: this
|
|
5
|
+
port ALWAYS emits it (concretes subclass it). It was described here as "a configurable
|
|
6
|
+
shape concern (emit_abstract_shapes, default on) handled in entity_model" — that config
|
|
7
|
+
field was read by nothing and entity_model never consulted it, so `GenConfig` now
|
|
8
|
+
refuses to accept a value it cannot honour.
|
|
9
|
+
"""
|
|
10
|
+
from metaobjects.meta.core.object.meta_object import MetaObject
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def is_abstract(entity: MetaObject) -> bool:
|
|
14
|
+
return entity.is_abstract is True
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def emits_instance_artifacts(entity: MetaObject) -> bool:
|
|
18
|
+
return not is_abstract(entity)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def is_sourceless_entity(entity: MetaObject) -> bool:
|
|
22
|
+
"""A record whose store MetaObjects does not manage: a concrete object with a primary
|
|
23
|
+
identity and no ``source.*`` at all, declared or inherited (a MongoDB collection, a
|
|
24
|
+
Cassandra table, a Neo4j node, a remote API). #248 gives it no router, table or
|
|
25
|
+
migration; the adopter owns the data access.
|
|
26
|
+
|
|
27
|
+
It still has a wire contract, because the identity makes it addressable: a client can
|
|
28
|
+
create, fetch and PATCH it. So it gets the filter allowlist its own list endpoint needs
|
|
29
|
+
(the Create/Patch models come from the entity generator already).
|
|
30
|
+
|
|
31
|
+
Keyed on the identity, not the object subtype (#248): ADR-0028 forbids a value object
|
|
32
|
+
any identity. The projection exclusion is ADR-0028's own rule — a projection is
|
|
33
|
+
read-only because of its subtype. Mirrors the TypeScript ``isSourcelessEntity``.
|
|
34
|
+
"""
|
|
35
|
+
from metaobjects.meta.core.object.object_constants import OBJECT_SUBTYPE_PROJECTION
|
|
36
|
+
from metaobjects.meta.persistence.source.meta_source import MetaSource
|
|
37
|
+
|
|
38
|
+
if is_abstract(entity) or entity.sub_type == OBJECT_SUBTYPE_PROJECTION:
|
|
39
|
+
return False
|
|
40
|
+
if entity.primary_identity() is None:
|
|
41
|
+
return False
|
|
42
|
+
# ADR-0039: children() resolves — an inherited source makes the object persistable.
|
|
43
|
+
return not any(isinstance(c, MetaSource) for c in entity.children())
|
{metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/meta/core/object/object_extract.py
RENAMED
|
@@ -158,6 +158,31 @@ def _field_spec_for(
|
|
|
158
158
|
format: Format,
|
|
159
159
|
visited: set[int],
|
|
160
160
|
depth: int,
|
|
161
|
+
) -> FieldSpec:
|
|
162
|
+
spec = _field_shape_for(field, owner, format, visited, depth)
|
|
163
|
+
if not _is_array(field):
|
|
164
|
+
return spec
|
|
165
|
+
# Element-count bounds: the field's array validator (@min/@max) is the single source of
|
|
166
|
+
# truth, as the numeric validator is for a scalar's range.
|
|
167
|
+
for c in field.children():
|
|
168
|
+
if c.type == TYPE_VALIDATOR and c.sub_type == vc.VALIDATOR_SUBTYPE_ARRAY:
|
|
169
|
+
# ADR-0039 sanctioned own: a validator's @min/@max are its own declared bounds,
|
|
170
|
+
# read exactly as _numeric_bound reads the numeric validator's.
|
|
171
|
+
lo = c.attr(vc.VALIDATOR_ATTR_MIN)
|
|
172
|
+
hi = c.attr(vc.VALIDATOR_ATTR_MAX)
|
|
173
|
+
return spec.with_item_bounds(
|
|
174
|
+
lo if isinstance(lo, int) and not isinstance(lo, bool) else None,
|
|
175
|
+
hi if isinstance(hi, int) and not isinstance(hi, bool) else None,
|
|
176
|
+
)
|
|
177
|
+
return spec
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
def _field_shape_for(
|
|
181
|
+
field: MetaField,
|
|
182
|
+
owner: MetaObject,
|
|
183
|
+
format: Format,
|
|
184
|
+
visited: set[int],
|
|
185
|
+
depth: int,
|
|
161
186
|
) -> FieldSpec:
|
|
162
187
|
name = field.name
|
|
163
188
|
required = _is_required(field)
|
|
@@ -143,8 +143,22 @@ def _extract(
|
|
|
143
143
|
# Cross-port contract: a MALFORMED array still places its successfully-coerced
|
|
144
144
|
# elements into data (partial extraction), UNLIKE a MALFORMED scalar which is
|
|
145
145
|
# absent from data.
|
|
146
|
+
# validator.array bounds. Too many: NORMAL/LOOSE keep the first max_items (a
|
|
147
|
+
# "truncate" coercion, like a numeric clamp); STRICT rejects. Too few: nothing can
|
|
148
|
+
# repair it, so it is MALFORMED under every tolerance.
|
|
149
|
+
out_of_bounds = False
|
|
150
|
+
if not any_malformed and f.max_items is not None and len(out) > f.max_items:
|
|
151
|
+
if o.tolerance == Tolerance.STRICT:
|
|
152
|
+
out_of_bounds = True
|
|
153
|
+
else:
|
|
154
|
+
report.add_coercion(
|
|
155
|
+
Coercion(path, str(len(out)), str(f.max_items), "truncate")
|
|
156
|
+
)
|
|
157
|
+
out = out[: f.max_items]
|
|
158
|
+
if not any_malformed and f.min_items is not None and len(out) < f.min_items:
|
|
159
|
+
out_of_bounds = True
|
|
146
160
|
data[f.name] = out
|
|
147
|
-
if any_malformed:
|
|
161
|
+
if any_malformed or out_of_bounds:
|
|
148
162
|
_mark_malformed(report, path, f)
|
|
149
163
|
else:
|
|
150
164
|
report.set(path, FieldExtraction.EXTRACTED)
|
|
@@ -11,6 +11,8 @@ runner maps the schema-json tokens onto these enums.
|
|
|
11
11
|
"""
|
|
12
12
|
from __future__ import annotations
|
|
13
13
|
|
|
14
|
+
import dataclasses
|
|
15
|
+
|
|
14
16
|
from dataclasses import dataclass, field
|
|
15
17
|
from enum import Enum
|
|
16
18
|
from typing import Callable, Generic, TypeVar
|
|
@@ -115,6 +117,17 @@ class FieldSpec:
|
|
|
115
117
|
# reads it from the ``#text`` sentinel the lenient XML reader carries when an element has
|
|
116
118
|
# both attributes and a text body, instead of a same-named child. False for normal/JSON.
|
|
117
119
|
text_content: bool = False
|
|
120
|
+
# Element-count bounds for an ARRAY field, from its ``validator.array`` (``@min``/``@max``).
|
|
121
|
+
# None = unbounded. Under NORMAL/LOOSE tolerance a list longer than ``max_items`` keeps its
|
|
122
|
+
# first ``max_items`` elements (a "truncate" coercion, the array analogue of a numeric
|
|
123
|
+
# clamp); under STRICT it is MALFORMED. A list shorter than ``min_items`` is MALFORMED under
|
|
124
|
+
# every tolerance: there is nothing to repair it with.
|
|
125
|
+
min_items: int | None = None
|
|
126
|
+
max_items: int | None = None
|
|
127
|
+
|
|
128
|
+
def with_item_bounds(self, min_items: int | None, max_items: int | None) -> "FieldSpec":
|
|
129
|
+
"""This field with ``validator.array`` element-count bounds (None = unbounded)."""
|
|
130
|
+
return dataclasses.replace(self, min_items=min_items, max_items=max_items)
|
|
118
131
|
|
|
119
132
|
@staticmethod
|
|
120
133
|
def scalar(
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"""A SOURCELESS entity — ``object.entity`` with an ``identity.primary`` and no ``source.*`` —
|
|
2
|
+
is a record in a store MetaObjects does not manage (a MongoDB collection, a Cassandra table, a
|
|
3
|
+
Neo4j node, a remote API). It gets no router and no table (#248); the adopter owns the data
|
|
4
|
+
access. What it still needs is the wire contract: the ``<E>Create`` / ``<E>Patch`` models (the
|
|
5
|
+
entity generator already emits them for every entity) and the filter allowlist its own list
|
|
6
|
+
endpoint validates a query against. Value objects are unchanged: ADR-0028 forbids them an
|
|
7
|
+
identity.
|
|
8
|
+
|
|
9
|
+
Mirror of the TypeScript ``sourceless-entity-surface.test.ts``.
|
|
10
|
+
"""
|
|
11
|
+
import json
|
|
12
|
+
|
|
13
|
+
from metaobjects import InMemoryStringSource, MetaDataFormat, MetaDataLoader
|
|
14
|
+
from metaobjects.codegen.generators.entity_model import EntityModelGenerator
|
|
15
|
+
from metaobjects.codegen.generators.filter_allowlist_generator import render_filter_allowlist
|
|
16
|
+
from metaobjects.codegen.generators.router_generator import render_router
|
|
17
|
+
from metaobjects.codegen.generator import GenContext
|
|
18
|
+
from metaobjects.codegen.config import GenConfig
|
|
19
|
+
from metaobjects.codegen.instance_artifacts import is_sourceless_entity
|
|
20
|
+
from metaobjects.meta.core.object.meta_object import MetaObject
|
|
21
|
+
|
|
22
|
+
MODEL = {"metadata.root": {"package": "shop", "children": [
|
|
23
|
+
{"object.value": {"name": "LineItem", "children": [
|
|
24
|
+
{"field.string": {"name": "sku", "@required": True}},
|
|
25
|
+
]}},
|
|
26
|
+
{"object.entity": {"name": "Order", "children": [
|
|
27
|
+
{"field.string": {"name": "id"}},
|
|
28
|
+
{"field.string": {"name": "customerEmail", "@required": True, "@filterable": True}},
|
|
29
|
+
{"field.enum": {"name": "status", "@values": ["NEW", "SHIPPED"], "@filterable": True}},
|
|
30
|
+
{"identity.primary": {"name": "id", "@fields": "id"}},
|
|
31
|
+
]}},
|
|
32
|
+
{"object.entity": {"name": "Note", "children": [
|
|
33
|
+
{"field.string": {"name": "text"}},
|
|
34
|
+
]}},
|
|
35
|
+
]}}
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def _objects() -> dict[str, MetaObject]:
|
|
39
|
+
result = MetaDataLoader().load(
|
|
40
|
+
[InMemoryStringSource(json.dumps(MODEL), id="m.json", format=MetaDataFormat.JSON)]
|
|
41
|
+
)
|
|
42
|
+
assert not result.errors, result.errors
|
|
43
|
+
return {o.name: o for o in result.root.own_children() if isinstance(o, MetaObject)}
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def test_is_sourceless_entity_needs_an_identity_and_no_source() -> None:
|
|
47
|
+
objs = _objects()
|
|
48
|
+
assert is_sourceless_entity(objs["Order"]) is True
|
|
49
|
+
assert is_sourceless_entity(objs["LineItem"]) is False # a value: no identity, ever
|
|
50
|
+
assert is_sourceless_entity(objs["Note"]) is False # no identity: nothing to address
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def test_sourceless_entity_gets_a_filter_allowlist_but_no_router() -> None:
|
|
54
|
+
order = _objects()["Order"]
|
|
55
|
+
assert render_router(order) is None
|
|
56
|
+
out = render_filter_allowlist(order)
|
|
57
|
+
assert out is not None
|
|
58
|
+
assert '"customerEmail"' in out
|
|
59
|
+
assert '"status"' in out
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def test_value_object_gets_no_filter_allowlist() -> None:
|
|
63
|
+
assert render_filter_allowlist(_objects()["LineItem"]) is None
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def test_sourceless_entity_gets_create_and_patch_models() -> None:
|
|
67
|
+
objs = _objects()
|
|
68
|
+
root_objs = list(objs.values())
|
|
69
|
+
ctx = GenContext(entities=root_objs, loaded_root=root_objs[0].parent, matches=lambda _e: True,
|
|
70
|
+
config=GenConfig(out_dir=""), warn=lambda _m: None)
|
|
71
|
+
files = {f.path: f.content for f in EntityModelGenerator().generate(ctx)}
|
|
72
|
+
order = next(c for p, c in files.items() if p.endswith("Order.py"))
|
|
73
|
+
assert "class OrderCreate(BaseModel)" in order
|
|
74
|
+
assert "class OrderPatch(BaseModel)" in order
|
|
@@ -23,6 +23,7 @@ from metaobjects.render.extract import (
|
|
|
23
23
|
FieldSpec,
|
|
24
24
|
Format,
|
|
25
25
|
ExtractSchema,
|
|
26
|
+
Tolerance,
|
|
26
27
|
extract,
|
|
27
28
|
)
|
|
28
29
|
|
|
@@ -60,7 +61,7 @@ def _cases() -> list[str]:
|
|
|
60
61
|
def test_discovers_all_extract_conformance_cases() -> None:
|
|
61
62
|
"""FR-011: lock the corpus size so a deleted fixture fails CI rather than
|
|
62
63
|
silently reducing coverage. Mirrors the TS / Java / C# count guards."""
|
|
63
|
-
assert len(_cases()) ==
|
|
64
|
+
assert len(_cases()) == 48
|
|
64
65
|
|
|
65
66
|
|
|
66
67
|
_NORMALIZE_MODES = {"none", "collapse", "strip"}
|
|
@@ -76,6 +77,13 @@ def _parse_normalize(s: object) -> str:
|
|
|
76
77
|
|
|
77
78
|
|
|
78
79
|
def _parse_field(f: dict[str, object]) -> FieldSpec:
|
|
80
|
+
# validator.array element-count bounds (array fields only).
|
|
81
|
+
min_items = int(f["minItems"]) if "minItems" in f else None # type: ignore[arg-type]
|
|
82
|
+
max_items = int(f["maxItems"]) if "maxItems" in f else None # type: ignore[arg-type]
|
|
83
|
+
return _parse_field_shape(f).with_item_bounds(min_items, max_items)
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def _parse_field_shape(f: dict[str, object]) -> FieldSpec:
|
|
79
87
|
name = str(f["name"])
|
|
80
88
|
kind = _KINDS[str(f["kind"])]
|
|
81
89
|
required = bool(f.get("required", False))
|
|
@@ -116,6 +124,10 @@ def _parse_field(f: dict[str, object]) -> FieldSpec:
|
|
|
116
124
|
max_v = float(f["max"]) if "max" in f else None # type: ignore[arg-type]
|
|
117
125
|
return FieldSpec.range_(name, kind, required, min_v, max_v)
|
|
118
126
|
|
|
127
|
+
# A scalar array (`tags: ["a", "b"]`): each element coerced to kind.
|
|
128
|
+
if bool(f.get("array", False)):
|
|
129
|
+
return FieldSpec.scalar_array(name, kind, required)
|
|
130
|
+
|
|
119
131
|
# @xmlText: a scalar field that receives its element's text content (the #text sentinel).
|
|
120
132
|
if bool(f.get("textContent", False)):
|
|
121
133
|
return FieldSpec.text_content_field(name, kind, required)
|
|
@@ -165,6 +177,9 @@ def test_classification_and_canonical_value_match(case_name: str) -> None:
|
|
|
165
177
|
opts = ExtractOptions.defaults()
|
|
166
178
|
if bool(schema_node.get("rootless", False)):
|
|
167
179
|
opts = opts.with_rootless(True)
|
|
180
|
+
# Optional per-fixture tolerance (default NORMAL).
|
|
181
|
+
if "tolerance" in schema_node:
|
|
182
|
+
opts = opts.with_tolerance(Tolerance[str(schema_node["tolerance"])])
|
|
168
183
|
|
|
169
184
|
outcome = extract(text, schema, opts)
|
|
170
185
|
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"""validator.array (@min/@max) on an array field reaches the extract engine.
|
|
2
|
+
|
|
3
|
+
A reply with too many elements keeps the first @max; one with too few is MALFORMED and
|
|
4
|
+
counted in malformed_required, so the strict gate fails. Mirrors the TypeScript
|
|
5
|
+
extract-object-array-bounds test and the Java MetaObjectExtractorArrayBoundsTest.
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import json
|
|
10
|
+
|
|
11
|
+
import pytest
|
|
12
|
+
|
|
13
|
+
from metaobjects import ExtractError, extract_object, extract_schema_for, load_string, or_throw
|
|
14
|
+
from metaobjects.meta.core.object.meta_object import MetaObject
|
|
15
|
+
from metaobjects.render.extract import FieldExtraction, Format
|
|
16
|
+
|
|
17
|
+
META = {
|
|
18
|
+
"metadata.root": {
|
|
19
|
+
"package": "app",
|
|
20
|
+
"children": [
|
|
21
|
+
{"object.value": {"name": "Suggestion", "children": [
|
|
22
|
+
{"field.string": {"name": "tags", "@required": True, "isArray": True, "children": [
|
|
23
|
+
{"validator.array": {"name": "threeTags", "@min": 3, "@max": 3}},
|
|
24
|
+
]}},
|
|
25
|
+
]}},
|
|
26
|
+
],
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def _suggestion() -> MetaObject:
|
|
32
|
+
result = load_string(json.dumps(META))
|
|
33
|
+
assert result.errors == [], f"load errors: {result.errors}"
|
|
34
|
+
mo = next(c for c in result.root.children() if isinstance(c, MetaObject) and c.name == "Suggestion")
|
|
35
|
+
return mo
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def test_schema_carries_the_bounds() -> None:
|
|
39
|
+
tags = extract_schema_for(_suggestion()).fields[0]
|
|
40
|
+
assert tags.min_items == 3
|
|
41
|
+
assert tags.max_items == 3
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def test_too_many_keeps_the_first_max() -> None:
|
|
45
|
+
mo = _suggestion()
|
|
46
|
+
result = extract_object(mo, '{"tags":["a","b","c","d","e"]}', Format.JSON)
|
|
47
|
+
assert result.report.states()["tags"] == FieldExtraction.EXTRACTED
|
|
48
|
+
field = mo.get_meta_field("tags")
|
|
49
|
+
assert field is not None
|
|
50
|
+
assert field.get_value(or_throw(result)) == ["a", "b", "c"]
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def test_too_few_is_malformed_required() -> None:
|
|
54
|
+
result = extract_object(_suggestion(), '{"tags":["a","b"]}', Format.JSON)
|
|
55
|
+
assert result.report.states()["tags"] == FieldExtraction.MALFORMED
|
|
56
|
+
assert list(result.report.malformed_required()) == ["tags"]
|
|
57
|
+
with pytest.raises(ExtractError):
|
|
58
|
+
or_throw(result)
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
"""Guard for the abstract concept (mirrors the TS instance-artifacts module).
|
|
2
|
-
|
|
3
|
-
An abstract entity must never produce instance/write artifacts (routers, filter
|
|
4
|
-
allowlists, CREATE TABLE DDL). The Pydantic base *model* is a separate concern: this
|
|
5
|
-
port ALWAYS emits it (concretes subclass it). It was described here as "a configurable
|
|
6
|
-
shape concern (emit_abstract_shapes, default on) handled in entity_model" — that config
|
|
7
|
-
field was read by nothing and entity_model never consulted it, so `GenConfig` now
|
|
8
|
-
refuses to accept a value it cannot honour.
|
|
9
|
-
"""
|
|
10
|
-
from metaobjects.meta.core.object.meta_object import MetaObject
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
def is_abstract(entity: MetaObject) -> bool:
|
|
14
|
-
return entity.is_abstract is True
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
def emits_instance_artifacts(entity: MetaObject) -> bool:
|
|
18
|
-
return not is_abstract(entity)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/extract_delegate_emitter.py
RENAMED
|
File without changes
|
{metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/extract_schema_emitter.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/generators/entity_model.py
RENAMED
|
File without changes
|
|
File without changes
|
{metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/generators/find_inbound.py
RENAMED
|
File without changes
|
{metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/generators/fr019_shared_enum.py
RENAMED
|
File without changes
|
{metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/generators/m2m_codegen.py
RENAMED
|
File without changes
|
{metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/generators/names_generator.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/generators/router_generator.py
RENAMED
|
File without changes
|
{metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/generators/template_generator.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/metaobjects-config.schema.json
RENAMED
|
File without changes
|
|
File without changes
|
{metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/output_format_spec_emitter.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/runtime/constraint_errors.py
RENAMED
|
File without changes
|
{metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/runtime/filter_parser.py
RENAMED
|
File without changes
|
{metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/codegen/template_codegen/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/loader/sources/directory_source.py
RENAMED
|
File without changes
|
|
File without changes
|
{metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/loader/sources/meta_data_source.py
RENAMED
|
File without changes
|
|
File without changes
|
{metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/loader/validate_discriminator.py
RENAMED
|
File without changes
|
|
File without changes
|
{metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/loader/validate_field_mutability.py
RENAMED
|
File without changes
|
{metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/loader/validate_source_escapes.py
RENAMED
|
File without changes
|
{metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/loader/validate_source_parameter_ref.py
RENAMED
|
File without changes
|
{metaobjects-1.0.9rc6 → metaobjects-1.0.10}/src/metaobjects/loader/validate_source_physical_names.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|