metaobjects 1.0.4__tar.gz → 1.0.5__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.4 → metaobjects-1.0.5}/PKG-INFO +1 -1
- {metaobjects-1.0.4 → metaobjects-1.0.5}/pyproject.toml +1 -1
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/__init__.py +6 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/apidocs/builder.py +28 -45
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/apidocs/naming.py +66 -33
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/cli.py +247 -41
- metaobjects-1.0.5/src/metaobjects/codegen/collision_names.py +33 -0
- metaobjects-1.0.5/src/metaobjects/codegen/eject.py +168 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/extract_delegate_emitter.py +43 -107
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/generator_registry.py +112 -29
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/generators/entity_model.py +108 -18
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/generators/extractor_generator.py +72 -142
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/generators/filter_allowlist_generator.py +13 -19
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/generators/find_inbound.py +2 -2
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/generators/m2m_codegen.py +25 -9
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/generators/output_parser_generator.py +29 -62
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/generators/output_prompt_generator.py +9 -20
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/generators/render_helper_generator.py +52 -53
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/generators/router_generator.py +526 -90
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/generators/trace_helper_generator.py +2 -15
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/runner.py +15 -1
- metaobjects-1.0.5/src/metaobjects/codegen/runtime/constraint_errors.py +151 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/runtime/filter_parser.py +10 -6
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/type_map.py +13 -11
- metaobjects-1.0.5/src/metaobjects/codegen/value_objects.py +220 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/config/dependencies.py +7 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/config/neutral_config.py +45 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/config/source_resolver.py +7 -4
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/errors.py +5 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/library/embedded_library.py +1 -1
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/loader/validation_passes.py +155 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/relationship/derive_m2m_fields.py +74 -55
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/requirement/requirement_constants.py +4 -2
- metaobjects-1.0.5/src/metaobjects/meta_endpoint.py +30 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/parser.py +85 -4
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/payload_accessors.py +10 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/runtime/object_manager.py +13 -4
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/spec_metamodel/requirement.json +2 -2
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/gen_suite.py +6 -4
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_cli_registry.py +31 -2
- metaobjects-1.0.5/tests/codegen/test_cli_render_helper_template_root.py +228 -0
- metaobjects-1.0.5/tests/codegen/test_codegen_compile_conformance.py +192 -0
- metaobjects-1.0.5/tests/codegen/test_eject.py +145 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_extract_tier_collision.py +51 -58
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_extractor_generator.py +100 -60
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_filter_allowlist_generator.py +29 -5
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_fr010_output_codegen.py +8 -26
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_gen_state_keying.py +34 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_m2m_codegen.py +35 -17
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_no_magic_physical_names.py +2 -2
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_output_parser_generator.py +22 -19
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_projection_compile.py +33 -4
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_render_helper_conformance.py +48 -40
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_render_helper_generator.py +35 -13
- metaobjects-1.0.5/tests/codegen/test_route_path_naming.py +67 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_router_generator.py +126 -5
- metaobjects-1.0.5/tests/codegen/test_router_generator_m2m_target_tph.py +156 -0
- metaobjects-1.0.5/tests/codegen/test_router_generator_tph_m2m.py +378 -0
- metaobjects-1.0.5/tests/codegen/test_router_generator_tph_m2m_shadowed.py +205 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_tph_codegen.py +12 -0
- metaobjects-1.0.5/tests/codegen/test_value_objects.py +104 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/config/test_dependencies.py +1 -1
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/config/test_neutral_config.py +38 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/test_generator_registry_conformance.py +5 -3
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/api_contract_assertions.py +11 -1
- metaobjects-1.0.5/tests/integration/api_contract_m2m_server.py +424 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/api_contract_server.py +18 -11
- metaobjects-1.0.5/tests/integration/generated_m2m_app.py +562 -0
- metaobjects-1.0.5/tests/integration/generated_projection_app.py +194 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/generated_router_app.py +36 -25
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/generated_tph_app.py +4 -2
- metaobjects-1.0.5/tests/integration/test_api_contract_projection.py +115 -0
- metaobjects-1.0.5/tests/integration/test_m2m_target_tph_generated.py +291 -0
- metaobjects-1.0.5/tests/integration/test_tph_m2m_generated.py +420 -0
- metaobjects-1.0.5/tests/integration/test_tph_m2m_shadowed_generated.py +358 -0
- metaobjects-1.0.5/tests/loader/test_child_wrapper_body_shape.py +117 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/loader/test_shipped_library_ai.py +64 -0
- metaobjects-1.0.5/tests/render/test_render_model_payload.py +53 -0
- metaobjects-1.0.5/tests/runtime/test_constraint_errors.py +107 -0
- metaobjects-1.0.5/tests/runtime/test_object_manager_currency_read.py +63 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/test_api_docs_accuracy.py +5 -5
- metaobjects-1.0.5/tests/test_meta_endpoint.py +69 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/uv.lock +1 -1
- metaobjects-1.0.4/src/metaobjects/codegen/collision_names.py +0 -110
- metaobjects-1.0.4/src/metaobjects/codegen/generators/payload_vo_generator.py +0 -798
- metaobjects-1.0.4/tests/codegen/test_payload_vo_generator.py +0 -810
- metaobjects-1.0.4/tests/integration/api_contract_m2m_server.py +0 -220
- metaobjects-1.0.4/tests/integration/generated_m2m_app.py +0 -220
- {metaobjects-1.0.4 → metaobjects-1.0.5}/.gitignore +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/LICENSE +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/README.md +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/hatch_build.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/scripts/generate_embedded_library.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/agent_context/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/agent_context/scaffold.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/apidocs/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/apidocs/api_model.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/apidocs/paths.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/apidocs/renderer.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/attr_class_map.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/KNOWN_GAPS.md +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/config.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/constants.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/extract_schema_emitter.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/format.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/fr010_field_mapping.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/generator.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/generators/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/generators/fr019_shared_enum.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/generators/names_generator.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/generators/template_generator.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/generators/tph_plan.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/instance_artifacts.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/metaobjects-config.schema.json +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/output_format_spec_emitter.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/overwrite_policy.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/project_config.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/runtime/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/template_codegen/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/template_codegen/output_pattern.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/template_codegen/template_data.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/codegen/template_codegen/template_spec.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/config/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/core_types.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/datatype.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/documentation/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/documentation/doc_constants.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/documentation/doc_provider.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/documentation/doc_schema.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/library/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/library/library_sources.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/loader/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/loader/merge.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/loader/meta_data_loader.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/loader/registered_validation.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/loader/sources/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/loader/sources/directory_source.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/loader/sources/file_source.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/loader/sources/meta_data_source.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/loader/sources/uri_source.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/loader/validate_discriminator.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/loader/validate_enum_normalize_ambiguity.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/loader/validate_field_mutability.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/loader/validate_source_escapes.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/loader/validate_source_parameter_ref.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/loader/validate_source_physical_names.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/attr/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/attr/attr_constants.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/attr/meta_attr.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/field/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/field/field_constants.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/field/meta_field.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/identity/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/identity/identity_constants.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/identity/meta_identity.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/index/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/index/index_constants.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/index/meta_index.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/object/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/object/meta_object.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/object/meta_object_aware.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/object/object_class_registry.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/object/object_constants.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/object/object_extract.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/object/value_object.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/relationship/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/relationship/meta_relationship.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/relationship/relationship_constants.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/relationship/relationship_references.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/requirement/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/requirement/meta_requirement.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/validator/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/core/validator/validator_constants.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/meta_data.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/meta_root.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/persistence/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/persistence/db/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/persistence/db/db_constants.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/persistence/db/db_provider.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/persistence/origin/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/persistence/origin/meta_origin.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/persistence/origin/origin_constants.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/persistence/source/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/persistence/source/meta_source.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/persistence/source/source_constants.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/presentation/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/presentation/layout/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/presentation/layout/layout_constants.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/presentation/layout/meta_layout.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/presentation/ui/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/presentation/ui/ui_provider.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/presentation/view/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/presentation/view/meta_view.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/presentation/view/view_constants.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/provider_extends.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/template/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/template/meta_template.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/template/prompt_provider.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/meta/template/template_constants.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/naming.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/naming_refs.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/parser_yaml.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/provider.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/py.typed +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/registry.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/registry_manifest.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/email_document.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/escapers.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/extract/KNOWN_GAPS.md +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/extract/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/extract/coerce.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/extract/extract.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/extract/extract_map.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/extract/json_forgiving_reader.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/extract/locate.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/extract/normalize.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/extract/strip.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/extract/types.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/extract/xml_forgiving_reader.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/filesystem_provider.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/prompt/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/prompt/output_format_renderer.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/prompt/output_format_spec.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/prompt/prompt_field.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/prompt/prompt_overrides.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/prompt/prompt_style.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/renderer.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/render/verify.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/runtime/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/runtime/llm_recorder.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/runtime/n2m_resolver.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/runtime/tph.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/scope.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/serializer_json.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/shared/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/shared/base_types.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/shared/separators.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/shared/structural.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/source/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/source/error_source.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/source/json_path.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/source/semantic_diff.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/source/yaml_positions.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/source_resolution.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/spec_metamodel/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/spec_metamodel/attr.json +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/spec_metamodel/db.json +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/spec_metamodel/documentation.json +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/spec_metamodel/field.json +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/spec_metamodel/identity.json +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/spec_metamodel/index.json +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/spec_metamodel/layout.json +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/spec_metamodel/object.json +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/spec_metamodel/origin.json +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/spec_metamodel/prompt.json +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/spec_metamodel/relationship.json +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/spec_metamodel/source.json +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/spec_metamodel/template.json +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/spec_metamodel/ui-web.json +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/spec_metamodel/ui.json +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/spec_metamodel/validator.json +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/spec_metamodel/view.json +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/super_resolve.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/validation_types.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/src/metaobjects/yaml_desugar.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/golden/extends/expected/BaseEntity.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/golden/extends/expected/Program.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/golden/extends/meta.json +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/golden/nested-array/expected/AuthorBrief.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/golden/nested-array/expected/PostBrief.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/golden/nested-array/meta.json +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/golden/scalars/expected/Metric.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/golden/scalars/expected/Report.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/golden/scalars/meta.json +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/golden/vanilla/expected/Subscriber.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/golden/vanilla/meta.json +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_abstract_conformance.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_api_docs_builder.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_api_docs_paths.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_cli.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_cli_config_gen.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_cli_config_verify.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_cli_dependencies.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_cli_providers.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_cli_staleness_nudge.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_cli_verify_strict.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_cli_verify_subverbs.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_constants_config.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_entity_model.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_enum_conformance.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_extends_abstract_field_inheritance.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_format.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_fr010_nested_object_prompt.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_fr019_shared_provided_conformance.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_generator.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_generator_extension_seams.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_golden.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_inherit_without_restate_gate.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_inheritance_conformance.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_instance_artifacts.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_names_extends_chain.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_names_generator.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_origin_nullability.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_overwrite_policy.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_overwrite_policy_hash.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_project_config.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_reverse_finders.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_router_autoset.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_runner.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_source_resolution.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_sourceless_projection.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_template_data.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_template_generator.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_template_output_pattern.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_template_scope_helpers.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_template_scope_walk.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_template_spec.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_trace_helper_generator.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_type_map.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_validation_conformance.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/codegen/test_write_through.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/config/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/config/test_library_package_guard.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/config/test_source_resolver.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/capabilities.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/conformance-expected-failures.json +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/conformance_adapter.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/corpus.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/expected_failures.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/fixture_discovery.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/navigator.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/test_api_docs_cross_port_conformance.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/test_conformance.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/test_dependency_conformance.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/test_extract_conformance.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/test_extract_object_verdict.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/test_fr010_loader_attrs.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/test_fr011_attrs.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/test_object_model_conformance.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/test_provider_composition_conformance.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/test_registry_conformance.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/test_runner_hardfail.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/test_scope_conformance.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/test_source_resolution_conformance.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/test_spec_metamodel_embed.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/test_strict_attr_load.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/test_template_codegen_conformance.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/test_template_generator_conformance.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/test_yaml_conformance.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/conformance/yaml-conformance-expected-failures.json +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/api_contract_jsonb_server.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/generated_jsonb_app.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/meta_ai_trace.yaml +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/normalization.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/postgres_container.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/query_runner.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/scenarios.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/test_api_contract.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/test_api_contract_generated.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/test_api_contract_jsonb.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/test_api_contract_m2m.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/test_api_contract_m2m_generated.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/test_api_contract_tph_generated.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/test_generated_router_uuid_pk.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/test_llm_call_trace.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/test_normalization.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/test_query_scenarios.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/integration/test_runtime_return_types.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/loader/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/loader/test_abstract_subtype_authored.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/loader/test_enum_extends_values_conflict.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/loader/test_field_mutability_order.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/loader/test_template_payload_target_210.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/open_closed_proof_test.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/render/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/render/extract/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/render/extract/test_coerce.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/render/extract/test_extract.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/render/extract/test_extract_map.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/render/extract/test_json_forgiving_reader.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/render/extract/test_locate.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/render/extract/test_model.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/render/extract/test_normalize.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/render/extract/test_strip.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/render/extract/test_xml_forgiving_reader.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/render/prompt/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/render/prompt/test_output_format_renderer.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/render/test_email_document.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/render/test_filesystem_provider.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/render/test_output_format_renderer_nested.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/render/test_output_prompt_conformance.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/render/test_render_conformance.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/render/test_render_max_chars.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/render/test_verify.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/render/test_verify_conformance.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/runtime/test_object_manager_enum_intvaluemap.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/runtime/test_object_manager_table_name.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/source/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/source/test_fr5c_merge_attribution.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/source/test_fr5d_reference_resolution.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/source/test_fr5e_database_source_shape.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/source/test_json_path.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/source/test_semantic_diff.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/source/test_source_on_node.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/source/test_yaml_positions.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/__init__.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_agent_context_staleness.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_capabilities.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_column_naming_strategy.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_common_attrs.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_core_types.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_derive_m2m_declaring_entity.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_effective_children_sibling_shadowing.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_effective_package.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_errors.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_field_enum.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_field_enum_intvaluemap.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_field_map_validation.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_field_uuid_dbcolumntype.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_file_source_id.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_fr016_source_name_and_kind_aliases.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_index_lookup.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_llm_recorder.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_loader.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_loader_bom.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_loader_class.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_merge.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_meta_attr.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_meta_data.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_meta_source.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_module_shortcuts.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_n2m_resolver.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_n2m_resolver_inherited.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_no_dead_config_fields.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_object_manager_autoset_stamping.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_object_manager_uuid_coercion.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_object_manager_write_through.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_one_primary_source.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_parser.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_parser_yaml.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_provider.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_provider_extension.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_registry.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_registry_completeness.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_registry_extend.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_registry_sealed.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_relationship_m2m_validation.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_relationship_references.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_relationship_referential_actions.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_resolution_key.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_runtime_resolution_key_binding.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_serializer.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_serializer_shared_document.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_shared_constants.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_smoke.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_source_escapes.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_sources.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_strict_child_placement.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_super_resolve.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_template_toolcall.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_template_wrong_subtype_attrs.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_validation_attr_schema.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_validation_filter_values.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_validation_origin_195.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_validation_origin_paths.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_validation_sort_field.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_validation_warnings.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/tests/unit/test_write_coercion_arrays.py +0 -0
- {metaobjects-1.0.4 → metaobjects-1.0.5}/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.5
|
|
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.5"
|
|
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"
|
|
@@ -35,7 +35,9 @@ from .meta.core.object.object_extract import (
|
|
|
35
35
|
extract_schema_for,
|
|
36
36
|
)
|
|
37
37
|
from .meta.core.object.value_object import ValueObject
|
|
38
|
+
from .meta_endpoint import META_ROUTE_PATH, meta_json
|
|
38
39
|
from .naming import resolve_column_name
|
|
40
|
+
from .serializer_json import canonical_serialize_effective
|
|
39
41
|
|
|
40
42
|
# Module-level shortcuts: the 99% case for callers who don't need a
|
|
41
43
|
# long-lived loader. Signatures + docstrings come straight from the
|
|
@@ -60,6 +62,10 @@ __all__ = [
|
|
|
60
62
|
"load_uris",
|
|
61
63
|
"load_string",
|
|
62
64
|
"resolve_column_name",
|
|
65
|
+
# UI-1 — the metadata API contract (GET /_meta)
|
|
66
|
+
"META_ROUTE_PATH",
|
|
67
|
+
"meta_json",
|
|
68
|
+
"canonical_serialize_effective",
|
|
63
69
|
# Runtime object model (Phase A)
|
|
64
70
|
"ValueObject",
|
|
65
71
|
"MetaObjectAware",
|
|
@@ -43,10 +43,7 @@ from metaobjects.codegen.generators.m2m_codegen import (
|
|
|
43
43
|
resolve_m2m_descriptors,
|
|
44
44
|
)
|
|
45
45
|
from metaobjects.codegen.generators.find_inbound import is_xml, response_shape
|
|
46
|
-
from metaobjects.codegen.
|
|
47
|
-
is_field_required,
|
|
48
|
-
resolve_payload_vo,
|
|
49
|
-
)
|
|
46
|
+
from metaobjects.codegen.value_objects import is_field_required, pkg_of, resolve_payload_vo
|
|
50
47
|
from metaobjects.codegen.generators.tph_plan import is_tph_subtype
|
|
51
48
|
from metaobjects.codegen.instance_artifacts import emits_instance_artifacts, is_abstract
|
|
52
49
|
from metaobjects.source_resolution import primary_rdb_source
|
|
@@ -58,19 +55,6 @@ from metaobjects.meta.meta_data import MetaData
|
|
|
58
55
|
from metaobjects.meta.persistence.source.source_constants import SOURCE_KIND_TABLE
|
|
59
56
|
from metaobjects.meta.template import template_constants as tc
|
|
60
57
|
from metaobjects.shared.base_types import TYPE_OBJECT, TYPE_TEMPLATE
|
|
61
|
-
from metaobjects.shared.separators import PACKAGE_SEP
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
def _pkg_of(node: MetaData) -> str:
|
|
65
|
-
"""The effective package of a node — its ``resolution_key()`` minus the
|
|
66
|
-
trailing ``::<name>`` ("" for a root-level node). Duplicated (not imported) to
|
|
67
|
-
match the existing per-generator convention. Used to derive a template's
|
|
68
|
-
referrer package for ``resolve_payload_vo`` (#228) — see that function's
|
|
69
|
-
docstring for why this ancestor-walk-aware form is used instead of the
|
|
70
|
-
loader's bare ``tpl.package or tpl.file_default_package or ""``."""
|
|
71
|
-
key = node.resolution_key()
|
|
72
|
-
i = key.rfind(PACKAGE_SEP)
|
|
73
|
-
return "" if i == -1 else key[:i]
|
|
74
58
|
|
|
75
59
|
|
|
76
60
|
# ---------------------------------------------------------------------------
|
|
@@ -105,7 +89,7 @@ def _payload_resolves(tmpl: MetaData, root: MetaData) -> MetaObject | None:
|
|
|
105
89
|
return None
|
|
106
90
|
# ADR-0042 (#228): the referrer is THIS template — a bare @payloadRef resolves
|
|
107
91
|
# in ITS OWN package first.
|
|
108
|
-
return resolve_payload_vo(root, payload_ref,
|
|
92
|
+
return resolve_payload_vo(root, payload_ref, pkg_of(tmpl))
|
|
109
93
|
|
|
110
94
|
|
|
111
95
|
def _is_email_kind(tmpl: MetaData) -> bool:
|
|
@@ -160,12 +144,12 @@ class PythonApiModelBuilder:
|
|
|
160
144
|
# MODEL — only for concrete objects (an abstract object cannot be
|
|
161
145
|
# instantiated → documented ⊆ generated). A value object → MODEL only.
|
|
162
146
|
if not is_abstract(obj):
|
|
163
|
-
model = naming.model_class_name(obj
|
|
147
|
+
model = naming.model_class_name(obj)
|
|
164
148
|
symbols.append(
|
|
165
149
|
ApiSymbol(
|
|
166
150
|
name=model,
|
|
167
151
|
kind=ApiSymbolKind.MODEL,
|
|
168
|
-
module=
|
|
152
|
+
module=naming.model_import(obj),
|
|
169
153
|
signature=f"class {model}(BaseModel)",
|
|
170
154
|
usage=(
|
|
171
155
|
"the Pydantic v2 entity model"
|
|
@@ -178,12 +162,12 @@ class PythonApiModelBuilder:
|
|
|
178
162
|
if entity and _is_writable_table_entity(obj, object_index):
|
|
179
163
|
# VALIDATION — the Pydantic field constraints carried on the model
|
|
180
164
|
# (required / max-length / range / pattern). Names the model class.
|
|
181
|
-
model = naming.model_class_name(obj
|
|
165
|
+
model = naming.model_class_name(obj)
|
|
182
166
|
symbols.append(
|
|
183
167
|
ApiSymbol(
|
|
184
168
|
name=model,
|
|
185
169
|
kind=ApiSymbolKind.VALIDATION,
|
|
186
|
-
module=
|
|
170
|
+
module=naming.model_import(obj),
|
|
187
171
|
signature=f"class {model}(BaseModel)",
|
|
188
172
|
usage="Pydantic field validation on the create/update shape",
|
|
189
173
|
fields=self._model_fields(obj),
|
|
@@ -285,15 +269,14 @@ class PythonApiModelBuilder:
|
|
|
285
269
|
payload_vo = _payload_resolves(tmpl, root)
|
|
286
270
|
|
|
287
271
|
if payload_vo is not None:
|
|
288
|
-
# PAYLOAD — the
|
|
289
|
-
|
|
272
|
+
# PAYLOAD — the shape this template RENDERS. ADR-0056: it IS the @payloadRef
|
|
273
|
+
# value object's own model, emitted by the entity generator.
|
|
274
|
+
payload_class = naming.model_class_name(payload_vo)
|
|
290
275
|
symbols.append(
|
|
291
276
|
ApiSymbol(
|
|
292
277
|
name=payload_class,
|
|
293
278
|
kind=ApiSymbolKind.PAYLOAD,
|
|
294
|
-
module=(
|
|
295
|
-
f"from .{naming.payload_module_name(name)} import {payload_class}"
|
|
296
|
-
),
|
|
279
|
+
module=naming.model_import(payload_vo),
|
|
297
280
|
signature=f"class {payload_class}(BaseModel)",
|
|
298
281
|
usage="the typed payload projection bound to the template",
|
|
299
282
|
fields=self._payload_fields(payload_vo),
|
|
@@ -310,7 +293,7 @@ class PythonApiModelBuilder:
|
|
|
310
293
|
name=render_fn,
|
|
311
294
|
kind=ApiSymbolKind.RENDER,
|
|
312
295
|
module=f"from .{module}_render_helper import {render_fn}",
|
|
313
|
-
signature=f"def {render_fn}(payload, provider)",
|
|
296
|
+
signature=f"def {render_fn}(payload: {payload_class}, provider)",
|
|
314
297
|
usage="renders the output template against a typed payload",
|
|
315
298
|
returns="EmailDocument" if _is_email_kind(tmpl) else "str",
|
|
316
299
|
)
|
|
@@ -320,23 +303,23 @@ class PythonApiModelBuilder:
|
|
|
320
303
|
# to an output, and the gate is @responseRef PRESENCE rather than a format
|
|
321
304
|
# value. Shares `response_shape` with the generators, so the docs can never
|
|
322
305
|
# claim a symbol codegen suppressed.
|
|
323
|
-
inbound = response_shape(root, tmpl,
|
|
306
|
+
inbound = response_shape(root, tmpl, pkg_of(tmpl))
|
|
324
307
|
if inbound is not None:
|
|
325
|
-
# The RESPONSE
|
|
326
|
-
#
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
308
|
+
# The RESPONSE shape the parser actually returns — the @responseRef value
|
|
309
|
+
# object's own model (ADR-0056). Documented once: when the prompt renders and
|
|
310
|
+
# parses the SAME value object, the model above already is it.
|
|
311
|
+
response_class = naming.model_class_name(inbound.vo)
|
|
312
|
+
if payload_vo is None or inbound.vo.resolution_key() != payload_vo.resolution_key():
|
|
313
|
+
symbols.append(
|
|
314
|
+
ApiSymbol(
|
|
315
|
+
name=response_class,
|
|
316
|
+
kind=ApiSymbolKind.PAYLOAD,
|
|
317
|
+
module=naming.model_import(inbound.vo),
|
|
318
|
+
signature=f"class {response_class}(BaseModel)",
|
|
319
|
+
usage="the typed response shape a model reply is parsed into",
|
|
320
|
+
fields=self._payload_fields(inbound.vo),
|
|
321
|
+
)
|
|
338
322
|
)
|
|
339
|
-
)
|
|
340
323
|
|
|
341
324
|
# OUTPUT_PARSER — the strict ``parse_*``. ADR-0053: JSON-only, so an XML
|
|
342
325
|
# reply gets no strict tier and documenting one would name a missing fn.
|
|
@@ -403,8 +386,8 @@ class PythonApiModelBuilder:
|
|
|
403
386
|
|
|
404
387
|
def _payload_fields(self, vo: MetaObject) -> list[FieldShape]:
|
|
405
388
|
"""The payload model's documented field shapes — one row per field of the
|
|
406
|
-
|
|
407
|
-
|
|
389
|
+
value object, with optionality from ``is_field_required`` (the boundary the
|
|
390
|
+
value object's model draws between ``T`` and ``T | None``)."""
|
|
408
391
|
rows: list[FieldShape] = []
|
|
409
392
|
for f in vo.fields():
|
|
410
393
|
if not isinstance(f, MetaField):
|
|
@@ -7,26 +7,25 @@ generators delegate their name computation here, and the
|
|
|
7
7
|
calling the SAME functions. So the documented name can never drift from the
|
|
8
8
|
emitted name — they are computed once, in one place.
|
|
9
9
|
|
|
10
|
-
Behaviour-preserving
|
|
11
|
-
|
|
10
|
+
Behaviour-preserving with ONE deliberate exception: :func:`route_path` no longer
|
|
11
|
+
reproduces the old inline ``name.lower() + "s"``, because that spelling diverged
|
|
12
|
+
from the other ports (see its docstring). Every other function reproduces exactly
|
|
13
|
+
what the corresponding generator used to compute inline (``_snake_case`` /
|
|
12
14
|
``<Name>Repository`` / ``<ENTITY>_FILTER_FIELDS`` / ``parse_<snake>`` /
|
|
13
|
-
``render_<snake>`` / ``render_<snake>_format`` / ``extract_<snake>`` …).
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
``render_<snake>`` / ``render_<snake>_format`` / ``extract_<snake>`` …). A model's
|
|
16
|
+
class name — which, the generated package being flat, is also its module name — comes
|
|
17
|
+
from :mod:`metaobjects.codegen.value_objects`, the module the entity generator itself
|
|
18
|
+
asks (ADR-0056: a template's payload and response types ARE its value objects' models).
|
|
17
19
|
"""
|
|
18
20
|
from __future__ import annotations
|
|
19
21
|
|
|
20
|
-
from metaobjects.codegen
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
response_class_name,
|
|
24
|
-
response_module_name,
|
|
25
|
-
)
|
|
22
|
+
from metaobjects.codegen import value_objects
|
|
23
|
+
from metaobjects.meta.meta_data import MetaData
|
|
24
|
+
from metaobjects.naming import to_snake_case
|
|
26
25
|
|
|
27
26
|
__all__ = [
|
|
28
27
|
"snake_case",
|
|
29
|
-
"
|
|
28
|
+
"pluralize",
|
|
30
29
|
"model_class_name",
|
|
31
30
|
"router_module_name",
|
|
32
31
|
"repository_class_name",
|
|
@@ -35,10 +34,7 @@ __all__ = [
|
|
|
35
34
|
"filter_ops_const",
|
|
36
35
|
"route_path",
|
|
37
36
|
"pk_param",
|
|
38
|
-
"
|
|
39
|
-
"payload_module_name",
|
|
40
|
-
"response_class_name",
|
|
41
|
-
"response_module_name",
|
|
37
|
+
"model_import",
|
|
42
38
|
"render_helper_fn",
|
|
43
39
|
"output_prompt_fn",
|
|
44
40
|
"output_parser_fn",
|
|
@@ -64,14 +60,47 @@ def snake_case(name: str) -> str:
|
|
|
64
60
|
return "".join(out)
|
|
65
61
|
|
|
66
62
|
|
|
67
|
-
def
|
|
68
|
-
"""``
|
|
69
|
-
return name.lower() + "s"
|
|
63
|
+
def _route_snake_case(name: str) -> str:
|
|
64
|
+
"""``PostCategory`` → ``post_category``; ``HTTPServer`` → ``http_server``.
|
|
70
65
|
|
|
66
|
+
ACRONYM-AWARE, and deliberately NOT :func:`snake_case`. The trivial variant
|
|
67
|
+
above inserts a separator before every capital, which is right for a module
|
|
68
|
+
name but would emit ``h_t_t_p_server`` in a URL. Delegates to
|
|
69
|
+
:func:`metaobjects.naming.to_snake_case` — the port's acronym-aware loop,
|
|
70
|
+
documented there as byte-for-byte the other ports' rule (separate when the
|
|
71
|
+
previous character is lower or a digit, or when it is upper and the NEXT one
|
|
72
|
+
is lower, so a run of capitals stays together until the final one that
|
|
73
|
+
begins a word)."""
|
|
74
|
+
return to_snake_case(name)
|
|
71
75
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
76
|
+
|
|
77
|
+
def pluralize(name: str) -> str:
|
|
78
|
+
"""``post_category`` → ``post_categories``; ``address`` → ``addresses``.
|
|
79
|
+
|
|
80
|
+
The cross-port pluralization contract, byte-identical in every port: a word
|
|
81
|
+
ending ``s``/``x``/``z``/``ch``/``sh`` takes ``es``; a consonant followed by
|
|
82
|
+
``y`` becomes ``ies``; anything else takes ``s``. The cross-port
|
|
83
|
+
byte-identity covers the already-lowercased word :func:`route_path` feeds
|
|
84
|
+
in — suffix tests here run on a lowercased copy, unlike the JVM port's
|
|
85
|
+
case-sensitive ones, so mixed-case input may diverge."""
|
|
86
|
+
lowered = name.lower()
|
|
87
|
+
if lowered.endswith(("s", "x", "z", "ch", "sh")):
|
|
88
|
+
return name + "es"
|
|
89
|
+
if len(name) >= 2 and lowered[-1] == "y" and lowered[-2] not in "aeiou":
|
|
90
|
+
return name[:-1] + "ies"
|
|
91
|
+
return name + "s"
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def model_class_name(obj: MetaData) -> str:
|
|
95
|
+
"""The emitted Pydantic model class name — the object's own short name, or a value
|
|
96
|
+
object's collision-qualified one (ADR-0044/0056)."""
|
|
97
|
+
return value_objects.model_class_name(obj)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def model_import(obj: MetaData) -> str:
|
|
101
|
+
"""``from .<Name> import <Name>`` — the import of *obj*'s generated model (the entity
|
|
102
|
+
generator writes ``<Name>.py``, so the module IS the class name)."""
|
|
103
|
+
return value_objects.model_import(obj)
|
|
75
104
|
|
|
76
105
|
|
|
77
106
|
def router_module_name(obj_name: str) -> str:
|
|
@@ -100,9 +129,14 @@ def filter_ops_const(obj_name: str) -> str:
|
|
|
100
129
|
|
|
101
130
|
|
|
102
131
|
def route_path(obj_name: str) -> str:
|
|
103
|
-
"""The default REST
|
|
104
|
-
|
|
105
|
-
|
|
132
|
+
"""The default REST collection segment — the ENTITY NAME ``snake_case``d and
|
|
133
|
+
then pluralized (``Author`` → ``authors``, ``PostCategory`` →
|
|
134
|
+
``post_categories``). Never the physical ``@table``.
|
|
135
|
+
|
|
136
|
+
One rule, identical in all five ports. It used to be ``name.lower() + "s"``
|
|
137
|
+
here, which served ``PostCategory`` at ``/postcategorys``; see
|
|
138
|
+
``fixtures/api-contract-conformance/m2m/`` for the scenario that gates it."""
|
|
139
|
+
return pluralize(_route_snake_case(obj_name))
|
|
106
140
|
|
|
107
141
|
|
|
108
142
|
def pk_param(obj_name: str) -> str:
|
|
@@ -168,15 +202,14 @@ def extractor_fn(template_name: str) -> str:
|
|
|
168
202
|
def _pluralize(name: str) -> str:
|
|
169
203
|
"""Trivial cross-port pluralization (matches the TS ``pluralize`` /
|
|
170
204
|
``MetaSource._pluralize``), applied to a PascalCase entity name BEFORE
|
|
171
|
-
snake-casing (``GameSession`` → ``GameSessions``).
|
|
205
|
+
snake-casing (``GameSession`` → ``GameSessions``).
|
|
206
|
+
|
|
207
|
+
Delegates to :func:`pluralize` so this file states the cross-port inflector
|
|
208
|
+
contract once, not twice; the empty-string guard stays here because it is
|
|
209
|
+
this finder-naming helper's own contract, not ``pluralize``'s."""
|
|
172
210
|
if not name:
|
|
173
211
|
return name
|
|
174
|
-
|
|
175
|
-
if lower.endswith(("s", "x", "z", "ch", "sh")):
|
|
176
|
-
return name + "es"
|
|
177
|
-
if len(name) >= 2 and lower[-1] == "y" and lower[-2] not in "aeiou":
|
|
178
|
-
return name[:-1] + "ies"
|
|
179
|
-
return name + "s"
|
|
212
|
+
return pluralize(name)
|
|
180
213
|
|
|
181
214
|
|
|
182
215
|
def reverse_finder_fk_segment(fk_field_name: str) -> str:
|