metaobjects 1.1.4__tar.gz → 1.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {metaobjects-1.1.4 → metaobjects-1.2.0}/PKG-INFO +6 -4
- {metaobjects-1.1.4 → metaobjects-1.2.0}/README.md +2 -2
- {metaobjects-1.1.4 → metaobjects-1.2.0}/pyproject.toml +14 -3
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/cli.py +162 -46
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/collection_name_collision.py +33 -1
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/config.py +8 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/eject.py +109 -12
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/generator.py +3 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/generator_registry.py +15 -1
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/generators/api_docs_generator.py +7 -3
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/generators/entity_model.py +63 -3
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/generators/render_helper_generator.py +54 -14
- metaobjects-1.2.0/src/metaobjects/codegen/generators/report_export_generator.py +242 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/generators/router_generator.py +271 -31
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/metaobjects-config.schema.json +5 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/project_config.py +21 -2
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/runner.py +1 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/runtime/api_docs_builder.py +7 -2
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/runtime/decimal_wire.py +21 -0
- metaobjects-1.2.0/src/metaobjects/codegen/runtime/report_export.py +69 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/errors.py +11 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/loader/validate_discriminator.py +9 -3
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/loader/validate_enum_normalize_ambiguity.py +51 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/loader/validation_passes.py +47 -1
- metaobjects-1.2.0/src/metaobjects/meta/core/field/credential.py +16 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/core/field/field_constants.py +3 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/core/reporting/report_read_model.py +12 -2
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/render/__init__.py +24 -1
- metaobjects-1.2.0/src/metaobjects/render/engine.py +79 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/render/escapers.py +6 -1
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/render/extract/coerce.py +3 -2
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/render/extract/json_forgiving_reader.py +35 -16
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/render/extract/locate.py +19 -6
- metaobjects-1.2.0/src/metaobjects/render/extract/strip.py +94 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/render/extract/xml_forgiving_reader.py +121 -13
- metaobjects-1.2.0/src/metaobjects/render/filesystem_provider.py +70 -0
- metaobjects-1.2.0/src/metaobjects/render/jinja_render.py +133 -0
- metaobjects-1.2.0/src/metaobjects/render/jinja_verify.py +506 -0
- metaobjects-1.2.0/src/metaobjects/render/mustache_tags.py +128 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/render/renderer.py +74 -18
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/render/verify.py +132 -62
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/runtime/validator_runner.py +4 -2
- metaobjects-1.2.0/src/metaobjects/source/yaml_core_schema.py +122 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/source/yaml_positions.py +12 -9
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/spec_metamodel/ui.json +1 -1
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_api_docs_builder.py +22 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_cli_config_verify.py +7 -8
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_cli_gen_unknown_attr.py +27 -0
- metaobjects-1.2.0/tests/codegen/test_cli_init.py +69 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_cli_registry.py +1 -1
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_cli_surface.py +32 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_cli_verify_requirements.py +6 -3
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_cli_verify_subverbs.py +54 -2
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_collection_name_collision.py +9 -0
- metaobjects-1.2.0/tests/codegen/test_eject_undo.py +176 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_fr019_shared_provided_conformance.py +9 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_m2m_codegen.py +2 -2
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_names_extends_chain.py +1 -1
- metaobjects-1.2.0/tests/codegen/test_pattern_ascii.py +99 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_render_helper_generator.py +117 -4
- metaobjects-1.2.0/tests/codegen/test_report_credential.py +143 -0
- metaobjects-1.2.0/tests/codegen/test_report_export.py +172 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_reverse_finders.py +4 -4
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_router_generator.py +30 -2
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_router_generator_m2m_target_tph.py +3 -3
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_router_generator_tph_m2m.py +7 -7
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_router_generator_tph_m2m_shadowed.py +5 -5
- metaobjects-1.2.0/tests/codegen/test_router_mypy_strict.py +81 -0
- metaobjects-1.2.0/tests/codegen/test_router_secret_fields.py +120 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/conformance/test_api_docs_cross_port_conformance.py +20 -13
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/conformance/test_dependency_conformance.py +3 -1
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/conformance/test_extract_conformance.py +1 -1
- metaobjects-1.2.0/tests/conformance/test_shared_model_conformance.py +57 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/integration/generated_report_app.py +12 -1
- metaobjects-1.2.0/tests/integration/generated_secret_fields_app.py +87 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/integration/test_api_contract_report.py +34 -2
- metaobjects-1.2.0/tests/integration/test_api_contract_secret_fields.py +91 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/integration/test_m2m_target_tph_generated.py +17 -1
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/render/extract/test_coerce.py +6 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/render/extract/test_json_forgiving_reader.py +5 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/render/extract/test_strip.py +18 -0
- metaobjects-1.2.0/tests/render/test_jinja_conformance.py +135 -0
- metaobjects-1.2.0/tests/render/test_jinja_engine.py +200 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/render/test_verify_conformance.py +7 -4
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/runtime/test_validator_runner.py +6 -0
- metaobjects-1.2.0/tests/source/test_yaml_core_schema.py +56 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/test_api_docs_packages.py +4 -3
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/test_reporting_inert.py +7 -3
- metaobjects-1.2.0/tests/unit/test_relative_set_newlines.py +11 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/uv.lock +152 -4
- metaobjects-1.1.4/src/metaobjects/render/extract/strip.py +0 -28
- metaobjects-1.1.4/src/metaobjects/render/filesystem_provider.py +0 -51
- {metaobjects-1.1.4 → metaobjects-1.2.0}/.gitignore +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/LICENSE +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/hatch_build.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/scripts/generate_embedded_library.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/agent_context/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/agent_context/scaffold.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/apidocs/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/apidocs/api_model.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/apidocs/builder.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/apidocs/naming.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/apidocs/paths.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/apidocs/renderer.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/attr_class_map.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/KNOWN_GAPS.md +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/_moved.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/collision_names.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/constants.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/extract_delegate_emitter.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/extract_schema_emitter.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/format.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/fr010_field_mapping.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/generators/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/generators/extractor_generator.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/generators/filter_allowlist_generator.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/generators/find_inbound.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/generators/fr019_shared_enum.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/generators/m2m_codegen.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/generators/names_generator.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/generators/output_parser_generator.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/generators/output_prompt_generator.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/generators/requirement_tests_generator.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/generators/template_generator.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/generators/tph_plan.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/generators/trace_helper_generator.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/instance_artifacts.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/model_walk.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/orphan_sweep.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/output_format_spec_emitter.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/overwrite_policy.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/project_import.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/requirement_hooks.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/requirement_walk.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/runtime/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/runtime/api_docs_model.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/runtime/api_docs_paths.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/runtime/api_docs_renderer.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/runtime/constraint_errors.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/runtime/extract_delegate_emitter.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/runtime/extract_schema_emitter.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/runtime/filter_parser.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/runtime/fr010_field_mapping.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/runtime/fr019_shared_enum.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/runtime/m2m_codegen.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/runtime/output_format_spec_emitter.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/runtime/shared_predicates.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/template_codegen/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/template_codegen/output_pattern.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/template_codegen/template_data.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/template_codegen/template_spec.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/type_map.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/value_objects.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/config/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/config/dependencies.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/config/neutral_config.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/config/source_resolver.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/core_types.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/datatype.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/documentation/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/documentation/doc_constants.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/documentation/doc_provider.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/documentation/doc_schema.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/field_lint.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/fmt.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/library/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/library/embedded_library.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/library/library_sources.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/loader/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/loader/merge.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/loader/meta_data_loader.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/loader/registered_validation.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/loader/resolve_references.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/loader/sources/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/loader/sources/directory_source.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/loader/sources/file_source.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/loader/sources/meta_data_source.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/loader/sources/uri_source.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/loader/validate_field_mutability.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/loader/validate_reporting.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/loader/validate_source_escapes.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/loader/validate_source_parameter_ref.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/loader/validate_source_physical_names.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/core/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/core/attr/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/core/attr/attr_constants.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/core/attr/meta_attr.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/core/field/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/core/field/meta_field.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/core/identity/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/core/identity/identity_constants.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/core/identity/meta_identity.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/core/index/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/core/index/index_constants.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/core/index/meta_index.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/core/object/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/core/object/meta_object.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/core/object/meta_object_aware.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/core/object/object_class_registry.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/core/object/object_constants.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/core/object/object_extract.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/core/object/value_object.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/core/relationship/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/core/relationship/derive_m2m_fields.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/core/relationship/meta_relationship.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/core/relationship/relationship_constants.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/core/relationship/relationship_references.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/core/reporting/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/core/reporting/meta_dimension.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/core/reporting/meta_measure.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/core/reporting/meta_segment.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/core/reporting/report_accessors.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/core/reporting/report_shape.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/core/reporting/reporting_constants.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/core/requirement/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/core/requirement/meta_requirement.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/core/requirement/requirement_constants.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/core/requirement/resolve_claim.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/core/validator/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/core/validator/validator_constants.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/meta_data.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/meta_root.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/persistence/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/persistence/db/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/persistence/db/db_constants.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/persistence/db/db_provider.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/persistence/origin/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/persistence/origin/meta_origin.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/persistence/origin/origin_constants.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/persistence/source/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/persistence/source/meta_source.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/persistence/source/source_constants.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/presentation/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/presentation/layout/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/presentation/layout/layout_constants.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/presentation/layout/meta_layout.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/presentation/ui/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/presentation/ui/ui_provider.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/presentation/view/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/presentation/view/meta_view.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/presentation/view/view_constants.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/provider_extends.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/template/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/template/meta_template.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/template/prompt_provider.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta/template/template_constants.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/meta_endpoint.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/naming.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/naming_refs.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/parser.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/parser_yaml.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/provider.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/py.typed +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/registry.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/registry_manifest.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/render/email_document.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/render/extract/KNOWN_GAPS.md +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/render/extract/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/render/extract/extract.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/render/extract/extract_map.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/render/extract/normalize.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/render/extract/types.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/render/payload_accessors.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/render/prompt/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/render/prompt/output_format_renderer.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/render/prompt/output_format_spec.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/render/prompt/prompt_field.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/render/prompt/prompt_overrides.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/render/prompt/prompt_style.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/requirement_check.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/runtime/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/runtime/dialect.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/runtime/drivers.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/runtime/llm_recorder.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/runtime/n2m_resolver.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/runtime/object_manager.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/runtime/tph.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/scope.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/serializer_json.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/shared/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/shared/base_types.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/shared/separators.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/shared/structural.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/source/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/source/error_source.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/source/json_path.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/source/semantic_diff.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/source_resolution.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/spec_metamodel/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/spec_metamodel/attr.json +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/spec_metamodel/db.json +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/spec_metamodel/documentation.json +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/spec_metamodel/field.json +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/spec_metamodel/identity.json +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/spec_metamodel/index.json +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/spec_metamodel/layout.json +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/spec_metamodel/object.json +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/spec_metamodel/origin.json +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/spec_metamodel/prompt.json +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/spec_metamodel/relationship.json +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/spec_metamodel/reporting.json +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/spec_metamodel/requirement.json +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/spec_metamodel/source.json +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/spec_metamodel/template.json +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/spec_metamodel/ui-web.json +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/spec_metamodel/validator.json +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/spec_metamodel/view.json +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/super_resolve.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/validation_types.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/wire.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/yaml_desugar.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/config_helpers.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/gen_suite.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/golden/extends/expected/BaseEntity.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/golden/extends/expected/Program.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/golden/extends/meta.json +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/golden/nested-array/expected/AuthorBrief.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/golden/nested-array/expected/PostBrief.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/golden/nested-array/meta.json +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/golden/scalars/expected/Metric.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/golden/scalars/expected/Report.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/golden/scalars/meta.json +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/golden/vanilla/expected/Subscriber.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/golden/vanilla/meta.json +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_abstract_conformance.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_api_docs_paths.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_cli.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_cli_config_gen.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_cli_dependencies.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_cli_fmt.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_cli_help_removed_flags.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_cli_providers.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_cli_render_helper_template_root.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_cli_staleness_nudge.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_cli_verify_field_lint.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_cli_verify_strict.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_codegen_compile_conformance.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_config_run_settings.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_constants_config.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_cross_package_binding_conformance.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_docs_generators.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_eject.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_eject_alone.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_eject_independence.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_eject_runtime.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_entity_model.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_enum_conformance.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_extends_abstract_field_inheritance.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_extract_tier_collision.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_extractor_generator.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_filter_allowlist_generator.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_fmt_format_file.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_format.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_fr010_nested_object_prompt.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_fr010_output_codegen.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_gen_state_keying.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_generator.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_generator_extension_seams.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_golden.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_hand_edits.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_inherit_without_restate_gate.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_inheritance_conformance.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_instance_artifacts.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_moved_modules.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_names_generator.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_no_magic_physical_names.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_one_generator_list.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_origin_nullability.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_orphan_sweep.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_output_parser_generator.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_overwrite_policy.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_overwrite_policy_hash.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_project_config.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_project_import.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_projection_compile.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_projection_docs_routes.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_recipe_generators.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_render_helper_conformance.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_report_router.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_requirement_tests_generator.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_route_path_naming.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_router_autoset.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_runner.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_source_resolution.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_sourceless_entity_surface.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_sourceless_projection.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_template_data.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_template_generator.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_template_output_pattern.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_template_scope_helpers.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_template_scope_walk.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_template_spec.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_tph_codegen.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_trace_helper_generator.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_type_map.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_validation_conformance.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_value_objects.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/codegen/test_write_through.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/config/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/config/test_dependencies.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/config/test_library_package_guard.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/config/test_neutral_config.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/config/test_neutral_config_unknown_key.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/config/test_source_resolver.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/conformance/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/conformance/capabilities.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/conformance/conformance-expected-failures.json +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/conformance/conformance_adapter.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/conformance/corpus.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/conformance/eject_contract.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/conformance/expected_failures.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/conformance/fixture_discovery.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/conformance/navigator.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/conformance/test_conformance.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/conformance/test_conformance_twin_roundtrip.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/conformance/test_eject_contract.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/conformance/test_extract_object_array_bounds.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/conformance/test_extract_object_verdict.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/conformance/test_field_lint_conformance.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/conformance/test_fmt_conformance.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/conformance/test_fr010_loader_attrs.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/conformance/test_fr011_attrs.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/conformance/test_generator_registry_conformance.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/conformance/test_naming_conformance.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/conformance/test_object_model_conformance.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/conformance/test_provider_composition_conformance.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/conformance/test_registry_conformance.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/conformance/test_requirement_check_conformance.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/conformance/test_requirement_test_identity_conformance.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/conformance/test_runner_hardfail.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/conformance/test_scope_conformance.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/conformance/test_source_resolution_conformance.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/conformance/test_spec_metamodel_embed.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/conformance/test_strict_attr_load.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/conformance/test_template_codegen_conformance.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/conformance/test_template_generator_conformance.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/conformance/test_wire_conformance.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/conformance/test_yaml_conformance.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/conformance/yaml-conformance-expected-failures.json +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/integration/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/integration/api_contract_assertions.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/integration/api_contract_jsonb_server.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/integration/api_contract_m2m_server.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/integration/api_contract_server.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/integration/conftest.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/integration/corpus_config.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/integration/engines.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/integration/generated_jsonb_app.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/integration/generated_m2m_app.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/integration/generated_projection_app.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/integration/generated_router_app.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/integration/generated_tph_app.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/integration/meta_ai_trace.yaml +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/integration/mysql_container.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/integration/normalization.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/integration/postgres_container.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/integration/query_runner.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/integration/report_lane.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/integration/scenarios.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/integration/test_api_contract.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/integration/test_api_contract_decimal.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/integration/test_api_contract_generated.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/integration/test_api_contract_jsonb.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/integration/test_api_contract_m2m.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/integration/test_api_contract_m2m_generated.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/integration/test_api_contract_projection.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/integration/test_api_contract_tph_generated.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/integration/test_generated_decimal_wire.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/integration/test_generated_router_uuid_pk.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/integration/test_llm_call_trace.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/integration/test_normalization.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/integration/test_query_scenarios.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/integration/test_runtime_return_types.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/integration/test_tph_m2m_generated.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/integration/test_tph_m2m_shadowed_generated.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/loader/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/loader/test_abstract_subtype_authored.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/loader/test_child_wrapper_body_shape.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/loader/test_enum_extends_values_conflict.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/loader/test_field_mutability_order.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/loader/test_library_packages.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/loader/test_naming_discovery.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/loader/test_relative_package_multi_root.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/loader/test_shipped_library_ai.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/loader/test_template_payload_target_210.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/open_closed_proof_test.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/render/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/render/extract/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/render/extract/test_extract.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/render/extract/test_extract_map.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/render/extract/test_locate.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/render/extract/test_model.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/render/extract/test_normalize.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/render/extract/test_xml_forgiving_reader.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/render/prompt/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/render/prompt/test_output_format_renderer.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/render/test_email_document.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/render/test_filesystem_provider.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/render/test_output_format_renderer_nested.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/render/test_output_prompt_conformance.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/render/test_render_conformance.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/render/test_render_max_chars.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/render/test_render_model_payload.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/render/test_verify.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/runtime/test_constraint_errors.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/runtime/test_decimal_wire.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/runtime/test_literal_naming_sqlite.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/runtime/test_object_manager_currency_read.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/runtime/test_object_manager_dialects.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/runtime/test_object_manager_enum_intvaluemap.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/runtime/test_object_manager_report.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/runtime/test_object_manager_table_name.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/runtime/test_validation_conformance_runtime.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/source/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/source/test_fr5c_merge_attribution.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/source/test_fr5d_reference_resolution.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/source/test_fr5e_database_source_shape.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/source/test_json_path.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/source/test_semantic_diff.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/source/test_source_on_node.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/source/test_yaml_positions.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/test_api_docs_accuracy.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/test_meta_endpoint.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/test_report_read_model.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/test_report_shape.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/__init__.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_agent_context_staleness.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_capabilities.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_column_naming_strategy.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_common_attrs.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_core_types.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_derive_m2m_declaring_entity.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_effective_children_sibling_shadowing.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_effective_package.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_errors.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_field_enum.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_field_enum_intvaluemap.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_field_map_validation.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_field_uuid_dbcolumntype.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_file_source_id.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_fr016_source_name_and_kind_aliases.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_index_lookup.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_inherited_reference_binding.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_llm_recorder.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_loader.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_loader_bom.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_loader_class.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_merge.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_meta_attr.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_meta_data.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_meta_source.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_module_shortcuts.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_n2m_resolver.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_n2m_resolver_inherited.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_no_dead_config_fields.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_object_manager_autoset_stamping.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_object_manager_uuid_coercion.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_object_manager_write_through.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_one_primary_source.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_parser.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_parser_yaml.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_provider.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_provider_extension.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_registry.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_registry_completeness.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_registry_extend.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_registry_sealed.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_relationship_m2m_validation.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_relationship_references.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_relationship_referential_actions.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_reporting_accessors.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_reporting_validation_spine_default.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_resolution_key.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_resolve_claim.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_runtime_resolution_key_binding.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_serializer.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_serializer_shared_document.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_shared_constants.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_smoke.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_source_escapes.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_sources.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_strict_child_placement.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_super_resolve.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_template_toolcall.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_template_wrong_subtype_attrs.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_validation_attr_schema.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_validation_filter_values.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_validation_origin_195.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_validation_origin_paths.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_validation_sort_field.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_validation_warnings.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/tests/unit/test_write_coercion_arrays.py +0 -0
- {metaobjects-1.1.4 → metaobjects-1.2.0}/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.
|
|
3
|
+
Version: 1.2.0
|
|
4
4
|
Summary: Cross-language metadata standard: declare typed entities once, generate idiomatic drift-checked code across languages — Python port.
|
|
5
5
|
Project-URL: Homepage, https://metaobjects.dev
|
|
6
6
|
Project-URL: Repository, https://github.com/metaobjectsdev/metaobjects
|
|
@@ -25,7 +25,7 @@ Requires-Python: >=3.11
|
|
|
25
25
|
Requires-Dist: pyyaml>=6.0
|
|
26
26
|
Provides-Extra: dev
|
|
27
27
|
Requires-Dist: mypy>=1.10; extra == 'dev'
|
|
28
|
-
Requires-Dist: pydantic>=2; extra == 'dev'
|
|
28
|
+
Requires-Dist: pydantic>=2.8; extra == 'dev'
|
|
29
29
|
Requires-Dist: pytest-xdist>=3.6; extra == 'dev'
|
|
30
30
|
Requires-Dist: pytest>=8; extra == 'dev'
|
|
31
31
|
Requires-Dist: ruff>=0.6; extra == 'dev'
|
|
@@ -34,6 +34,8 @@ Requires-Dist: fastapi>=0.110; extra == 'integration'
|
|
|
34
34
|
Requires-Dist: httpx>=0.27; extra == 'integration'
|
|
35
35
|
Requires-Dist: pg8000>=1.31; extra == 'integration'
|
|
36
36
|
Requires-Dist: pymysql>=1.1; extra == 'integration'
|
|
37
|
+
Provides-Extra: jinja
|
|
38
|
+
Requires-Dist: jinja2>=3.1; extra == 'jinja'
|
|
37
39
|
Provides-Extra: mysql
|
|
38
40
|
Requires-Dist: pymysql>=1.1; extra == 'mysql'
|
|
39
41
|
Description-Content-Type: text/markdown
|
|
@@ -84,8 +86,8 @@ The primary public API is the **loader** (`load_directory` / `load_uris` /
|
|
|
84
86
|
`load_string`, `MetaDataLoader`, `LoadResult`, `ErrorCode`, `MetaError`). The
|
|
85
87
|
distribution also ships the Python implementations of the other pillars used by the CLI
|
|
86
88
|
and tooling: `codegen` (Pydantic + FastAPI emit — reference generators you own:
|
|
87
|
-
`metaobjects eject <name>` copies one into your repo), `render` (Mustache
|
|
88
|
-
verify), and `runtime` (a DB-API 2 `ObjectManager` — pg8000 / psycopg on Postgres, the standard library's `sqlite3` on SQLite, PyMySQL on MySQL 8 (`pip install metaobjects[mysql]`) — no SQLAlchemy).
|
|
89
|
+
`metaobjects eject <name>` copies one into your repo), `render` (Mustache, or Jinja with
|
|
90
|
+
`pip install metaobjects[jinja]` — ADR-0061 — + payload-VO + verify), and `runtime` (a DB-API 2 `ObjectManager` — pg8000 / psycopg on Postgres, the standard library's `sqlite3` on SQLite, PyMySQL on MySQL 8 (`pip install metaobjects[mysql]`) — no SQLAlchemy).
|
|
89
91
|
Schema migrations are owned by the TypeScript `meta` CLI (ADR-0015); there is
|
|
90
92
|
**no `migrate` module** in this distribution.
|
|
91
93
|
|
|
@@ -44,8 +44,8 @@ The primary public API is the **loader** (`load_directory` / `load_uris` /
|
|
|
44
44
|
`load_string`, `MetaDataLoader`, `LoadResult`, `ErrorCode`, `MetaError`). The
|
|
45
45
|
distribution also ships the Python implementations of the other pillars used by the CLI
|
|
46
46
|
and tooling: `codegen` (Pydantic + FastAPI emit — reference generators you own:
|
|
47
|
-
`metaobjects eject <name>` copies one into your repo), `render` (Mustache
|
|
48
|
-
verify), and `runtime` (a DB-API 2 `ObjectManager` — pg8000 / psycopg on Postgres, the standard library's `sqlite3` on SQLite, PyMySQL on MySQL 8 (`pip install metaobjects[mysql]`) — no SQLAlchemy).
|
|
47
|
+
`metaobjects eject <name>` copies one into your repo), `render` (Mustache, or Jinja with
|
|
48
|
+
`pip install metaobjects[jinja]` — ADR-0061 — + payload-VO + verify), and `runtime` (a DB-API 2 `ObjectManager` — pg8000 / psycopg on Postgres, the standard library's `sqlite3` on SQLite, PyMySQL on MySQL 8 (`pip install metaobjects[mysql]`) — no SQLAlchemy).
|
|
49
49
|
Schema migrations are owned by the TypeScript `meta` CLI (ADR-0015); there is
|
|
50
50
|
**no `migrate` module** in this distribution.
|
|
51
51
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "metaobjects"
|
|
3
|
-
version = "1.
|
|
3
|
+
version = "1.2.0"
|
|
4
4
|
description = "Cross-language metadata standard: declare typed entities once, generate idiomatic drift-checked code across languages — Python port."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.11"
|
|
@@ -50,7 +50,7 @@ Issues = "https://github.com/metaobjectsdev/metaobjects/issues"
|
|
|
50
50
|
Changelog = "https://github.com/metaobjectsdev/metaobjects/blob/main/CHANGELOG.md"
|
|
51
51
|
|
|
52
52
|
[project.optional-dependencies]
|
|
53
|
-
dev = ["pytest>=8", "pytest-xdist>=3.6", "mypy>=1.10", "ruff>=0.6", "pydantic>=2"]
|
|
53
|
+
dev = ["pytest>=8", "pytest-xdist>=3.6", "mypy>=1.10", "ruff>=0.6", "pydantic>=2.8"]
|
|
54
54
|
# On-demand cross-language conformance suites — persistence + api-contract.
|
|
55
55
|
# pg8000 is pure-python so this extra installs cleanly without native deps;
|
|
56
56
|
# the persistence harness shells out to the docker CLI directly (matches the
|
|
@@ -62,6 +62,10 @@ integration = ["pg8000>=1.31", "PyMySQL>=1.1", "fastapi>=0.110", "httpx>=0.27"]
|
|
|
62
62
|
# so like pg8000 it installs without native build dependencies. SQLite needs nothing: the
|
|
63
63
|
# driver wraps the standard library's `sqlite3`.
|
|
64
64
|
mysql = ["PyMySQL>=1.1"]
|
|
65
|
+
# Jinja templates (ADR-0061): the second template engine beside Mustache. Imported only when a
|
|
66
|
+
# `.jinja` / `.j2` / `.jinja2` template is rendered or checked, so a Mustache-only project
|
|
67
|
+
# installs nothing extra.
|
|
68
|
+
jinja = ["jinja2>=3.1"]
|
|
65
69
|
|
|
66
70
|
[[tool.mypy.overrides]]
|
|
67
71
|
# PyMySQL ships no type information.
|
|
@@ -110,9 +114,16 @@ dev = [
|
|
|
110
114
|
# The validator-parity corpus (tests/codegen/test_validation_conformance.py)
|
|
111
115
|
# imports pydantic to exercise the generated Pydantic models, so it must be here
|
|
112
116
|
# or the CI `uv run pytest` collection fails with ModuleNotFoundError.
|
|
113
|
-
"pydantic>=2",
|
|
117
|
+
"pydantic>=2.8",
|
|
114
118
|
# ruff is the Python codegen format pass (src/metaobjects/codegen/format.py); the
|
|
115
119
|
# cli-registry corpus runs codegen, so without ruff in the group `uv run pytest`
|
|
116
120
|
# fails at format time with "No module named ruff".
|
|
117
121
|
"ruff>=0.6",
|
|
122
|
+
# The generated-router mypy gate (tests/codegen/test_router_mypy_strict.py) type-checks
|
|
123
|
+
# the emitted FastAPI routers under `mypy --strict`. The framework those routers import
|
|
124
|
+
# comes from `--extra integration`, which the python lane always passes.
|
|
125
|
+
"mypy>=1.10",
|
|
126
|
+
# The Jinja engine and its conformance corpora (fixtures/jinja-*-conformance/) run in the
|
|
127
|
+
# default suite, so the optional `jinja` extra's dependency is in the dev group too.
|
|
128
|
+
"jinja2>=3.1",
|
|
118
129
|
]
|
|
@@ -21,7 +21,7 @@ Two subcommands:
|
|
|
21
21
|
across ports):
|
|
22
22
|
|
|
23
23
|
--codegen regenerate into a temp dir + diff against the committed
|
|
24
|
-
``--out`` tree
|
|
24
|
+
``--out`` tree.
|
|
25
25
|
The column naming comes from ``naming.columns`` in
|
|
26
26
|
``.metaobjects/config.json`` (ADR-0058), the same setting
|
|
27
27
|
``gen`` reads, so the ``names`` generator's constants match
|
|
@@ -38,9 +38,9 @@ Two subcommands:
|
|
|
38
38
|
migrate engine (ADR-0015), not this CLI.
|
|
39
39
|
|
|
40
40
|
Combining flags runs each requested mode and aggregates the exit code
|
|
41
|
-
(non-zero if ANY mode drifts). A bare ``verify``
|
|
42
|
-
|
|
43
|
-
explicit subverbs exist.
|
|
41
|
+
(non-zero if ANY mode drifts). A bare ``verify`` runs ``--codegen`` and
|
|
42
|
+
``--templates`` (the cross-port default gate set) and prints a one-line
|
|
43
|
+
note that the explicit subverbs exist.
|
|
44
44
|
|
|
45
45
|
Named ``metaobjects``, NOT ``meta``: ``meta`` is the Node schema CLI. This CLI
|
|
46
46
|
intentionally has NO ``migrate`` subcommand — schema is owned by the Node
|
|
@@ -89,7 +89,7 @@ from metaobjects.requirement_check import (
|
|
|
89
89
|
scan_requirements,
|
|
90
90
|
summarise_requirements,
|
|
91
91
|
)
|
|
92
|
-
from metaobjects.codegen.config import GenConfig
|
|
92
|
+
from metaobjects.codegen.config import DEFAULT_API_PREFIX, GenConfig
|
|
93
93
|
from metaobjects.codegen.overwrite_policy import (
|
|
94
94
|
has_hash_manifest,
|
|
95
95
|
is_pristine_generated,
|
|
@@ -141,6 +141,7 @@ from metaobjects.naming import (
|
|
|
141
141
|
package_of_resolution_key,
|
|
142
142
|
removed_naming_source_message,
|
|
143
143
|
)
|
|
144
|
+
from metaobjects.render.engine import template_engine_of
|
|
144
145
|
from metaobjects.render.filesystem_provider import FilesystemProvider
|
|
145
146
|
from metaobjects.render.verify import (
|
|
146
147
|
ERR_REQUIRED_SLOT_UNUSED,
|
|
@@ -608,12 +609,13 @@ def _load_root_from_collection(
|
|
|
608
609
|
return result.root, []
|
|
609
610
|
|
|
610
611
|
|
|
611
|
-
#: Trailing advice after ``gen``'s unknown-attribute warnings. ``gen``
|
|
612
|
-
#:
|
|
612
|
+
#: Trailing advice after ``gen``'s unknown-attribute warnings. ``gen`` loads leniently
|
|
613
|
+
#: unless ``--strict``; ``verify`` is strict by default (ADR-0023), so the line names both.
|
|
613
614
|
UNKNOWN_ATTR_GEN_ADVICE = (
|
|
614
615
|
"metaobjects gen loads leniently and generated anyway, but `metaobjects verify` "
|
|
615
616
|
"rejects this metadata (ADR-0023): fix or remove the attribute - a typo'd one "
|
|
616
|
-
"(`isAbstrakt`, `requird`) silently changes what is generated."
|
|
617
|
+
"(`isAbstrakt`, `requird`) silently changes what is generated. "
|
|
618
|
+
"Pass `--strict` to make `gen` refuse it too."
|
|
617
619
|
)
|
|
618
620
|
|
|
619
621
|
|
|
@@ -647,13 +649,35 @@ def _print_unknown_attr_warnings(findings: list[str]) -> None:
|
|
|
647
649
|
print(f"warning: {UNKNOWN_ATTR_GEN_ADVICE}", file=sys.stderr)
|
|
648
650
|
|
|
649
651
|
|
|
650
|
-
def
|
|
651
|
-
"""
|
|
652
|
+
def _print_identical_owned_notice(root: Path) -> None:
|
|
653
|
+
"""ONE advisory line when owned generator copies are identical to the shipped ones: an
|
|
654
|
+
owned copy that was never edited only costs the adopter upgrades. Advisory: the exit
|
|
655
|
+
code is unchanged, and a project with no owned copies reads no file."""
|
|
656
|
+
try:
|
|
657
|
+
names = [e.name for e in owned.identical_owned(root)]
|
|
658
|
+
except Exception: # noqa: BLE001 — advisory; a packaged module that cannot be read says nothing
|
|
659
|
+
return
|
|
660
|
+
if names:
|
|
661
|
+
print(
|
|
662
|
+
f"note: owned generator copy identical to the shipped one: {', '.join(names)}. "
|
|
663
|
+
"Run `metaobjects eject --undo` to drop the copies and track the shipped "
|
|
664
|
+
"generators again.",
|
|
665
|
+
file=sys.stderr,
|
|
666
|
+
)
|
|
667
|
+
|
|
668
|
+
|
|
669
|
+
def _strict_load_hint(strict_flag: str = "verify") -> str:
|
|
670
|
+
"""Actionable next-steps when a strict load rejects an undeclared @attr."""
|
|
671
|
+
opt_out = (
|
|
672
|
+
"OR drop `--strict` to keep the lenient load"
|
|
673
|
+
if strict_flag == "--strict"
|
|
674
|
+
else "OR re-run with `--lax` to keep the legacy open-attr load"
|
|
675
|
+
)
|
|
676
|
+
who = "gen --strict" if strict_flag == "--strict" else "verify"
|
|
652
677
|
return (
|
|
653
|
-
"
|
|
678
|
+
f"{who} is strict (ADR-0023): every authored @attr must be declared. Fix: "
|
|
654
679
|
"register the attr on a metadata provider, OR move arbitrary author-supplied "
|
|
655
|
-
"properties into an `attr.properties` bag,
|
|
656
|
-
"legacy open-attr load."
|
|
680
|
+
f"properties into an `attr.properties` bag, {opt_out}."
|
|
657
681
|
)
|
|
658
682
|
|
|
659
683
|
|
|
@@ -875,6 +899,7 @@ def _run_suite(
|
|
|
875
899
|
baseline: str = "default",
|
|
876
900
|
refused_out: list[str] | None = None,
|
|
877
901
|
select: Callable[[str], bool] | None = None,
|
|
902
|
+
api_prefix: str = DEFAULT_API_PREFIX,
|
|
878
903
|
overwrite_hand_edits: frozenset[str] = frozenset(),
|
|
879
904
|
overwrite_paths_out: set[str] | None = None,
|
|
880
905
|
) -> list[str]:
|
|
@@ -917,6 +942,7 @@ def _run_suite(
|
|
|
917
942
|
emit_package_init=emit_package_init,
|
|
918
943
|
gen_state_dir=gen_state_dir,
|
|
919
944
|
column_naming=column_naming,
|
|
945
|
+
api_prefix=api_prefix,
|
|
920
946
|
# Manifest keys are relative to the PROJECT, which is what the manifest is
|
|
921
947
|
# anchored on — not to ``--out``, which varies per run while the manifest does
|
|
922
948
|
# not. Passed alongside gen_state_dir because the two are one decision: state
|
|
@@ -1248,9 +1274,17 @@ def _cmd_fmt(args: argparse.Namespace) -> int:
|
|
|
1248
1274
|
|
|
1249
1275
|
|
|
1250
1276
|
def _cmd_eject(args: argparse.Namespace) -> int:
|
|
1251
|
-
"""Copy reference generators into ``codegen/generators/`` to own (ADR-0034 Am. 3)
|
|
1277
|
+
"""Copy reference generators into ``codegen/generators/`` to own (ADR-0034 Am. 3), or
|
|
1278
|
+
with ``--undo`` drop the copies that are identical to the shipped ones."""
|
|
1252
1279
|
root = Path(args.root) if args.root else Path.cwd()
|
|
1253
|
-
|
|
1280
|
+
if args.undo:
|
|
1281
|
+
result = owned.undo(args.names, root, force=args.force)
|
|
1282
|
+
elif not args.names:
|
|
1283
|
+
print("error: name at least one generator to eject (`metaobjects gen --list` shows "
|
|
1284
|
+
"them), or pass --undo", file=sys.stderr)
|
|
1285
|
+
return 2
|
|
1286
|
+
else:
|
|
1287
|
+
result = owned.eject(args.names, root, force=args.force)
|
|
1254
1288
|
for line in result.out:
|
|
1255
1289
|
print(line)
|
|
1256
1290
|
for line in result.err:
|
|
@@ -1258,6 +1292,57 @@ def _cmd_eject(args: argparse.Namespace) -> int:
|
|
|
1258
1292
|
return result.code
|
|
1259
1293
|
|
|
1260
1294
|
|
|
1295
|
+
#: The metadata a fresh ``init`` writes: a loadable, empty model to author into.
|
|
1296
|
+
_INIT_METADATA = "metadata:\n package: app\n children: []\n"
|
|
1297
|
+
|
|
1298
|
+
_INIT_CONFIG = """\
|
|
1299
|
+
# What `metaobjects gen` generates: each target names its outDir and its generators.
|
|
1300
|
+
# `metaobjects gen --list` shows the catalog.
|
|
1301
|
+
metadata: metaobjects
|
|
1302
|
+
targets:
|
|
1303
|
+
app:
|
|
1304
|
+
outDir: generated
|
|
1305
|
+
generators: []
|
|
1306
|
+
"""
|
|
1307
|
+
|
|
1308
|
+
_INIT_DOCS_CONFIG = """\
|
|
1309
|
+
docs:
|
|
1310
|
+
outDir: docs
|
|
1311
|
+
generators: [api-docs]
|
|
1312
|
+
"""
|
|
1313
|
+
|
|
1314
|
+
|
|
1315
|
+
def _cmd_init(args: argparse.Namespace) -> int:
|
|
1316
|
+
"""Scaffold ``metaobjects.config.yaml`` and the ``metaobjects/`` metadata directory.
|
|
1317
|
+
|
|
1318
|
+
Never overwrites: a file that exists is reported and left alone. ``--with-docs`` adds a
|
|
1319
|
+
``docs`` target running ``api-docs``; without it no documentation generator is wired.
|
|
1320
|
+
"""
|
|
1321
|
+
root = Path(args.root) if args.root else Path.cwd()
|
|
1322
|
+
config = _INIT_CONFIG + (_INIT_DOCS_CONFIG if args.with_docs else "")
|
|
1323
|
+
wrote: list[str] = []
|
|
1324
|
+
kept: list[str] = []
|
|
1325
|
+
for rel, text in (
|
|
1326
|
+
(_CONFIG_NAME, config),
|
|
1327
|
+
("metaobjects/meta.app.yaml", _INIT_METADATA),
|
|
1328
|
+
):
|
|
1329
|
+
path = root / rel
|
|
1330
|
+
if path.exists():
|
|
1331
|
+
kept.append(rel)
|
|
1332
|
+
continue
|
|
1333
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
1334
|
+
path.write_text(text, encoding="utf-8")
|
|
1335
|
+
wrote.append(rel)
|
|
1336
|
+
for rel in wrote:
|
|
1337
|
+
print(f"wrote {rel}")
|
|
1338
|
+
for rel in kept:
|
|
1339
|
+
print(f"kept {rel} (already exists)")
|
|
1340
|
+
if args.with_docs and _CONFIG_NAME in kept:
|
|
1341
|
+
print("note: add the docs target yourself: `docs: {outDir: docs, generators: [api-docs]}`")
|
|
1342
|
+
print("next: describe your entities in metaobjects/, then run `metaobjects gen`.")
|
|
1343
|
+
return 0
|
|
1344
|
+
|
|
1345
|
+
|
|
1261
1346
|
def _warn_if_agent_context_stale() -> None:
|
|
1262
1347
|
"""Print ONE advisory line to stderr if the scaffolded agent context is stale.
|
|
1263
1348
|
|
|
@@ -1534,7 +1619,7 @@ def _run_gen_targets(
|
|
|
1534
1619
|
written = _run_suite(
|
|
1535
1620
|
root, out_dir, gens, t.entities, gen_state_dir=gen_state_dir,
|
|
1536
1621
|
column_naming=column_naming, project_root=project_root, baseline=baseline,
|
|
1537
|
-
refused_out=refused_out, select=select,
|
|
1622
|
+
refused_out=refused_out, select=select, api_prefix=config.api_prefix,
|
|
1538
1623
|
overwrite_hand_edits=overwrite, overwrite_paths_out=overwrite_paths_out,
|
|
1539
1624
|
)
|
|
1540
1625
|
if spec_gens:
|
|
@@ -1542,7 +1627,7 @@ def _run_gen_targets(
|
|
|
1542
1627
|
root, out_dir, spec_gens, t.entities, emit_package_init=False,
|
|
1543
1628
|
gen_state_dir=gen_state_dir, column_naming=column_naming,
|
|
1544
1629
|
project_root=project_root, baseline=baseline, refused_out=refused_out,
|
|
1545
|
-
select=select,
|
|
1630
|
+
select=select, api_prefix=config.api_prefix,
|
|
1546
1631
|
)
|
|
1547
1632
|
except ValueError as exc: # intra-target run_gen collision → clean error
|
|
1548
1633
|
errors.append(f"target '{t.name}': {exc}")
|
|
@@ -1608,17 +1693,23 @@ def _cmd_gen_config(args: argparse.Namespace) -> int:
|
|
|
1608
1693
|
if collection is None:
|
|
1609
1694
|
return 1
|
|
1610
1695
|
|
|
1696
|
+
# `--strict` is the load `verify` uses (ADR-0023): an unknown attribute is an error and
|
|
1697
|
+
# nothing is written. Without it `gen` loads leniently and only warns.
|
|
1698
|
+
strict = bool(getattr(args, "strict", False))
|
|
1611
1699
|
unknown_attrs: list[str] = []
|
|
1612
1700
|
root, load_errors = _load_root_from_collection(
|
|
1613
|
-
collection, providers=providers, libraries=config.libraries,
|
|
1701
|
+
collection, strict=strict, providers=providers, libraries=config.libraries,
|
|
1614
1702
|
unknown_attr_out=unknown_attrs,
|
|
1615
1703
|
)
|
|
1616
1704
|
if root is None:
|
|
1617
1705
|
print("error: failed to load metadata:", file=sys.stderr)
|
|
1618
1706
|
for msg in load_errors:
|
|
1619
1707
|
print(f" {msg}", file=sys.stderr)
|
|
1708
|
+
if strict and any("ERR_UNKNOWN_ATTR" in m for m in load_errors):
|
|
1709
|
+
print(_strict_load_hint(strict_flag="--strict"), file=sys.stderr)
|
|
1620
1710
|
return 1
|
|
1621
1711
|
_print_unknown_attr_warnings(unknown_attrs)
|
|
1712
|
+
_print_identical_owned_notice(config.config_dir)
|
|
1622
1713
|
|
|
1623
1714
|
template_root, templates_refusal = _template_root_for_config(args, config)
|
|
1624
1715
|
if templates_refusal is not None:
|
|
@@ -1786,7 +1877,9 @@ def _relative_set(root: Path, nested: list[Path] | None = None) -> dict[str, str
|
|
|
1786
1877
|
if p.suffix in _UNCOMPARED_SUFFIXES:
|
|
1787
1878
|
continue
|
|
1788
1879
|
try:
|
|
1789
|
-
|
|
1880
|
+
# Bytes, not read_text(): text mode translates \r\n and lone \r to \n, so a
|
|
1881
|
+
# committed CRLF file would compare equal to the LF the generator wrote.
|
|
1882
|
+
files[str(rel)] = p.read_bytes().decode("utf-8")
|
|
1790
1883
|
except (UnicodeDecodeError, OSError):
|
|
1791
1884
|
continue
|
|
1792
1885
|
return files
|
|
@@ -2401,6 +2494,7 @@ def _verify_templates(args: argparse.Namespace) -> int:
|
|
|
2401
2494
|
for e in render_verify(
|
|
2402
2495
|
text, fields, provider=provider,
|
|
2403
2496
|
required_slots=req_slots, required_tags=req_tags,
|
|
2497
|
+
engine=template_engine_of(provider, ref),
|
|
2404
2498
|
):
|
|
2405
2499
|
if e.code == ERR_REQUIRED_SLOT_UNUSED:
|
|
2406
2500
|
continue # an unused required slot is a warning, not drift
|
|
@@ -2668,8 +2762,11 @@ def _verify_requirements(args: argparse.Namespace, model: "_VerifyModel | None")
|
|
|
2668
2762
|
|
|
2669
2763
|
def _cmd_verify(args: argparse.Namespace) -> int:
|
|
2670
2764
|
"""Subverb dispatch (ADR-0021 D2). Run each requested mode; aggregate exit =
|
|
2671
|
-
max (non-zero if ANY mode drifts). Bare ``verify`` (no subverb)
|
|
2672
|
-
|
|
2765
|
+
max (non-zero if ANY mode drifts). Bare ``verify`` (no subverb) runs the
|
|
2766
|
+
cross-port default gate set, ``--codegen`` + ``--templates`` (the requirement
|
|
2767
|
+
ledger runs on every verify) + a one-line note advertising the subverbs.
|
|
2768
|
+
``--templates`` is skipped with a note when the run names no config and no
|
|
2769
|
+
``--prompts`` root, since there is then no template directory to resolve.
|
|
2673
2770
|
"""
|
|
2674
2771
|
naming_refusal = _refuse_column_naming_flag(args)
|
|
2675
2772
|
if naming_refusal is not None:
|
|
@@ -2684,12 +2781,24 @@ def _cmd_verify(args: argparse.Namespace) -> int:
|
|
|
2684
2781
|
|
|
2685
2782
|
if not any_explicit:
|
|
2686
2783
|
print(
|
|
2687
|
-
"metaobjects verify — running --codegen (default). Explicit "
|
|
2784
|
+
"metaobjects verify — running --codegen --templates (default). Explicit "
|
|
2688
2785
|
"subverbs: --codegen (codegen drift), --templates (template/prompt "
|
|
2689
2786
|
"drift), --db (schema drift — not supported in Python).",
|
|
2690
2787
|
file=sys.stderr,
|
|
2691
2788
|
)
|
|
2692
2789
|
run_codegen = True
|
|
2790
|
+
if args.metadata_dir is None:
|
|
2791
|
+
has_template_root = _find_config(args) is not None
|
|
2792
|
+
else:
|
|
2793
|
+
has_template_root = bool(getattr(args, "templates_root", None))
|
|
2794
|
+
if not has_template_root:
|
|
2795
|
+
print(
|
|
2796
|
+
"metaobjects verify — template gate skipped: no metaobjects.config.yaml "
|
|
2797
|
+
"and no --prompts directory, so there is no template root to resolve against.",
|
|
2798
|
+
file=sys.stderr,
|
|
2799
|
+
)
|
|
2800
|
+
else:
|
|
2801
|
+
run_templates = True
|
|
2693
2802
|
|
|
2694
2803
|
exit_code = 0
|
|
2695
2804
|
gates_stderr = _RecordedStderr(sys.stderr)
|
|
@@ -2798,6 +2907,14 @@ def _build_parser() -> argparse.ArgumentParser:
|
|
|
2798
2907
|
"as `templateSpec: <path>` in metaobjects.config.yaml"
|
|
2799
2908
|
),
|
|
2800
2909
|
)
|
|
2910
|
+
gen.add_argument(
|
|
2911
|
+
"--strict",
|
|
2912
|
+
action="store_true",
|
|
2913
|
+
help=(
|
|
2914
|
+
"strict-attr load, the one `verify` uses (ADR-0023): an undeclared attribute is "
|
|
2915
|
+
"an error and nothing is written. Without it gen loads leniently and warns."
|
|
2916
|
+
),
|
|
2917
|
+
)
|
|
2801
2918
|
gen.add_argument(
|
|
2802
2919
|
"--templates",
|
|
2803
2920
|
default=None,
|
|
@@ -2850,7 +2967,7 @@ def _build_parser() -> argparse.ArgumentParser:
|
|
|
2850
2967
|
"verify",
|
|
2851
2968
|
help=(
|
|
2852
2969
|
"drift gate — explicit subverbs --codegen / --templates / --db "
|
|
2853
|
-
"(ADR-0021 D2); bare verify
|
|
2970
|
+
"(ADR-0021 D2); bare verify runs --codegen and --templates"
|
|
2854
2971
|
),
|
|
2855
2972
|
)
|
|
2856
2973
|
verify.add_argument(
|
|
@@ -3008,38 +3125,37 @@ def _build_parser() -> argparse.ArgumentParser:
|
|
|
3008
3125
|
"eject",
|
|
3009
3126
|
help="copy reference generators into codegen/generators/ to own and edit",
|
|
3010
3127
|
)
|
|
3011
|
-
eject_p.add_argument("names", nargs="
|
|
3128
|
+
eject_p.add_argument("names", nargs="*", metavar="NAME", help="stable generator names")
|
|
3012
3129
|
eject_p.add_argument("--force", action="store_true",
|
|
3013
|
-
help="replace an existing owned copy with the reference"
|
|
3130
|
+
help="replace an existing owned copy with the reference "
|
|
3131
|
+
"(with --undo: remove a copy that differs from it)")
|
|
3132
|
+
eject_p.add_argument(
|
|
3133
|
+
"--undo", action="store_true",
|
|
3134
|
+
help="drop owned copies identical to the shipped generator (all of them, or the "
|
|
3135
|
+
"names given); a copy that differs is refused unless --force; prints the "
|
|
3136
|
+
"config edit, never makes it",
|
|
3137
|
+
)
|
|
3014
3138
|
eject_p.add_argument("--root", default=None, help="project root (default: cwd)")
|
|
3015
3139
|
eject_p.set_defaults(func=_cmd_eject)
|
|
3016
3140
|
|
|
3141
|
+
init_p = sub.add_parser(
|
|
3142
|
+
"init",
|
|
3143
|
+
help="scaffold metaobjects.config.yaml and metaobjects/ (never overwrites a file)",
|
|
3144
|
+
)
|
|
3145
|
+
init_p.add_argument("--with-docs", action="store_true",
|
|
3146
|
+
help="also wire the api-docs generator (a `docs` target)")
|
|
3147
|
+
init_p.add_argument("--root", default=None, help="project root (default: cwd)")
|
|
3148
|
+
init_p.set_defaults(func=_cmd_init)
|
|
3149
|
+
|
|
3017
3150
|
agent_docs = sub.add_parser(
|
|
3018
3151
|
"agent-docs",
|
|
3019
3152
|
help=(
|
|
3020
|
-
"
|
|
3021
|
-
"(
|
|
3153
|
+
"moved to the Node CLI: run `npx meta agent-docs --server python` "
|
|
3154
|
+
"(this command scaffolds nothing and exits 1)"
|
|
3022
3155
|
),
|
|
3023
3156
|
)
|
|
3024
|
-
|
|
3025
|
-
|
|
3026
|
-
action="append",
|
|
3027
|
-
default=None,
|
|
3028
|
-
metavar="LANG",
|
|
3029
|
-
help="server language (repeatable): typescript|java|kotlin|csharp|python",
|
|
3030
|
-
)
|
|
3031
|
-
agent_docs.add_argument(
|
|
3032
|
-
"--client",
|
|
3033
|
-
action="append",
|
|
3034
|
-
default=None,
|
|
3035
|
-
metavar="FRAMEWORK",
|
|
3036
|
-
help="client framework (repeatable): react|tanstack|angular",
|
|
3037
|
-
)
|
|
3038
|
-
agent_docs.add_argument(
|
|
3039
|
-
"--out",
|
|
3040
|
-
default=None,
|
|
3041
|
-
help="output project root (default: cwd)",
|
|
3042
|
-
)
|
|
3157
|
+
for ignored_flag in ("--server", "--client", "--out"):
|
|
3158
|
+
agent_docs.add_argument(ignored_flag, help=argparse.SUPPRESS)
|
|
3043
3159
|
agent_docs.set_defaults(func=_cmd_agent_docs)
|
|
3044
3160
|
|
|
3045
3161
|
return parser
|
{metaobjects-1.1.4 → metaobjects-1.2.0}/src/metaobjects/codegen/collection_name_collision.py
RENAMED
|
@@ -16,10 +16,14 @@ entities and the colliding name.
|
|
|
16
16
|
"""
|
|
17
17
|
from __future__ import annotations
|
|
18
18
|
|
|
19
|
-
from metaobjects.apidocs.naming import pluralize
|
|
19
|
+
from metaobjects.apidocs.naming import pluralize, route_path
|
|
20
20
|
from metaobjects.errors import ErrorCode
|
|
21
21
|
from metaobjects.meta.core.object.meta_object import MetaObject
|
|
22
22
|
from metaobjects.meta.core.object.object_constants import OBJECT_SUBTYPE_VALUE
|
|
23
|
+
from metaobjects.meta.persistence.source.meta_source import MetaSource
|
|
24
|
+
from metaobjects.runtime.tph import tph_subtype_of
|
|
25
|
+
|
|
26
|
+
from .instance_artifacts import is_abstract
|
|
23
27
|
|
|
24
28
|
ERR_COLLECTION_NAME_COLLISION = ErrorCode.ERR_COLLECTION_NAME_COLLISION.value
|
|
25
29
|
|
|
@@ -56,3 +60,31 @@ def assert_no_collection_name_collisions(entities: list[MetaObject]) -> None:
|
|
|
56
60
|
)
|
|
57
61
|
else:
|
|
58
62
|
owner_of_plural[plural] = obj
|
|
63
|
+
_assert_no_route_segment_collisions(entities)
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def _assert_no_route_segment_collisions(entities: list[MetaObject]) -> None:
|
|
67
|
+
"""The route half. The REST segment is the entity NAME snake_cased and then
|
|
68
|
+
pluralized (:func:`route_path`), so ``ApiKey`` and ``APIKey`` both serve
|
|
69
|
+
``/api_keys`` while their pluralized names differ and pass the check above.
|
|
70
|
+
Counts only objects that actually get a route: not a value object, not abstract,
|
|
71
|
+
not sourceless, not a TPH subtype (folded into its base and served under it)."""
|
|
72
|
+
owner_of_segment: dict[str, MetaObject] = {}
|
|
73
|
+
for obj in entities:
|
|
74
|
+
if obj.sub_type == OBJECT_SUBTYPE_VALUE or is_abstract(obj):
|
|
75
|
+
continue
|
|
76
|
+
# ADR-0039: children() resolves — an inherited source still gets a route.
|
|
77
|
+
if not any(isinstance(c, MetaSource) for c in obj.children()):
|
|
78
|
+
continue
|
|
79
|
+
if tph_subtype_of(obj) is not None:
|
|
80
|
+
continue
|
|
81
|
+
segment = route_path(obj.name)
|
|
82
|
+
existing = owner_of_segment.get(segment)
|
|
83
|
+
if existing is None:
|
|
84
|
+
owner_of_segment[segment] = obj
|
|
85
|
+
elif existing.resolution_key() != obj.resolution_key():
|
|
86
|
+
raise ValueError(
|
|
87
|
+
f'{ERR_COLLECTION_NAME_COLLISION}: "{existing.name}" and "{obj.name}" both resolve '
|
|
88
|
+
f'to the REST collection segment "{segment}" — rename one entity so its '
|
|
89
|
+
"snake_cased, pluralized route segment is distinct."
|
|
90
|
+
)
|
|
@@ -5,6 +5,9 @@ from dataclasses import dataclass, field
|
|
|
5
5
|
|
|
6
6
|
from metaobjects.naming import DEFAULT_COLUMN_NAMING
|
|
7
7
|
|
|
8
|
+
#: What generated routers mount under when no ``apiPrefix`` is configured.
|
|
9
|
+
DEFAULT_API_PREFIX = "/api"
|
|
10
|
+
|
|
8
11
|
|
|
9
12
|
@dataclass
|
|
10
13
|
class GenConfig:
|
|
@@ -54,6 +57,11 @@ class GenConfig:
|
|
|
54
57
|
# constant this generator emits names a different column than the one a row
|
|
55
58
|
# actually lands in.
|
|
56
59
|
column_naming: str = DEFAULT_COLUMN_NAMING
|
|
60
|
+
# The path the generated routers mount under (and the api docs name): ``/api/authors``
|
|
61
|
+
# by default, ``/v1/authors`` for ``/v1``, ``/authors`` for ``""``. The CLI fills it from
|
|
62
|
+
# ``apiPrefix`` in ``metaobjects.config.yaml``, the Python spelling of the TypeScript
|
|
63
|
+
# config's key of the same name.
|
|
64
|
+
api_prefix: str = DEFAULT_API_PREFIX
|
|
57
65
|
# First-time-on-existing-file behaviour. "default" refuses a file that cannot be
|
|
58
66
|
# proved to be generated output; "adopt" records what is on disk as the baseline and
|
|
59
67
|
# writes nothing — the one run a project with no committed manifest can perform (the
|