omnibase_infra 0.2.1__py3-none-any.whl
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.
- omnibase_infra/__init__.py +101 -0
- omnibase_infra/cli/__init__.py +1 -0
- omnibase_infra/cli/commands.py +216 -0
- omnibase_infra/clients/__init__.py +0 -0
- omnibase_infra/contracts/handlers/filesystem/handler_contract.yaml +261 -0
- omnibase_infra/contracts/handlers/mcp/handler_contract.yaml +138 -0
- omnibase_infra/decorators/__init__.py +29 -0
- omnibase_infra/decorators/allow_any.py +109 -0
- omnibase_infra/dlq/__init__.py +90 -0
- omnibase_infra/dlq/constants_dlq.py +57 -0
- omnibase_infra/dlq/models/__init__.py +26 -0
- omnibase_infra/dlq/models/enum_replay_status.py +37 -0
- omnibase_infra/dlq/models/model_dlq_replay_record.py +135 -0
- omnibase_infra/dlq/models/model_dlq_tracking_config.py +184 -0
- omnibase_infra/dlq/service_dlq_tracking.py +611 -0
- omnibase_infra/enums/__init__.py +123 -0
- omnibase_infra/enums/enum_any_type_violation.py +104 -0
- omnibase_infra/enums/enum_backend_type.py +27 -0
- omnibase_infra/enums/enum_capture_outcome.py +42 -0
- omnibase_infra/enums/enum_capture_state.py +88 -0
- omnibase_infra/enums/enum_chain_violation_type.py +119 -0
- omnibase_infra/enums/enum_circuit_state.py +51 -0
- omnibase_infra/enums/enum_confirmation_event_type.py +27 -0
- omnibase_infra/enums/enum_contract_type.py +84 -0
- omnibase_infra/enums/enum_dedupe_strategy.py +46 -0
- omnibase_infra/enums/enum_dispatch_status.py +191 -0
- omnibase_infra/enums/enum_environment.py +46 -0
- omnibase_infra/enums/enum_execution_shape_violation.py +103 -0
- omnibase_infra/enums/enum_handler_error_type.py +101 -0
- omnibase_infra/enums/enum_handler_loader_error.py +178 -0
- omnibase_infra/enums/enum_handler_source_type.py +87 -0
- omnibase_infra/enums/enum_handler_type.py +77 -0
- omnibase_infra/enums/enum_handler_type_category.py +61 -0
- omnibase_infra/enums/enum_infra_transport_type.py +73 -0
- omnibase_infra/enums/enum_introspection_reason.py +154 -0
- omnibase_infra/enums/enum_message_category.py +213 -0
- omnibase_infra/enums/enum_node_archetype.py +74 -0
- omnibase_infra/enums/enum_node_output_type.py +185 -0
- omnibase_infra/enums/enum_non_retryable_error_category.py +224 -0
- omnibase_infra/enums/enum_policy_type.py +32 -0
- omnibase_infra/enums/enum_registration_state.py +261 -0
- omnibase_infra/enums/enum_registration_status.py +33 -0
- omnibase_infra/enums/enum_registry_response_status.py +28 -0
- omnibase_infra/enums/enum_response_status.py +26 -0
- omnibase_infra/enums/enum_retry_error_category.py +98 -0
- omnibase_infra/enums/enum_security_rule_id.py +103 -0
- omnibase_infra/enums/enum_selection_strategy.py +91 -0
- omnibase_infra/enums/enum_topic_standard.py +42 -0
- omnibase_infra/enums/enum_validation_severity.py +78 -0
- omnibase_infra/errors/__init__.py +156 -0
- omnibase_infra/errors/error_architecture_violation.py +152 -0
- omnibase_infra/errors/error_chain_propagation.py +188 -0
- omnibase_infra/errors/error_compute_registry.py +92 -0
- omnibase_infra/errors/error_consul.py +132 -0
- omnibase_infra/errors/error_container_wiring.py +243 -0
- omnibase_infra/errors/error_event_bus_registry.py +102 -0
- omnibase_infra/errors/error_infra.py +608 -0
- omnibase_infra/errors/error_message_type_registry.py +101 -0
- omnibase_infra/errors/error_policy_registry.py +112 -0
- omnibase_infra/errors/error_vault.py +123 -0
- omnibase_infra/event_bus/__init__.py +72 -0
- omnibase_infra/event_bus/configs/kafka_event_bus_config.yaml +86 -0
- omnibase_infra/event_bus/event_bus_inmemory.py +743 -0
- omnibase_infra/event_bus/event_bus_kafka.py +1658 -0
- omnibase_infra/event_bus/mixin_kafka_broadcast.py +184 -0
- omnibase_infra/event_bus/mixin_kafka_dlq.py +765 -0
- omnibase_infra/event_bus/models/__init__.py +29 -0
- omnibase_infra/event_bus/models/config/__init__.py +20 -0
- omnibase_infra/event_bus/models/config/model_kafka_event_bus_config.py +725 -0
- omnibase_infra/event_bus/models/model_dlq_event.py +206 -0
- omnibase_infra/event_bus/models/model_dlq_metrics.py +304 -0
- omnibase_infra/event_bus/models/model_event_headers.py +115 -0
- omnibase_infra/event_bus/models/model_event_message.py +60 -0
- omnibase_infra/event_bus/topic_constants.py +376 -0
- omnibase_infra/handlers/__init__.py +75 -0
- omnibase_infra/handlers/filesystem/__init__.py +48 -0
- omnibase_infra/handlers/filesystem/enum_file_system_operation.py +35 -0
- omnibase_infra/handlers/filesystem/model_file_system_request.py +298 -0
- omnibase_infra/handlers/filesystem/model_file_system_result.py +166 -0
- omnibase_infra/handlers/handler_consul.py +787 -0
- omnibase_infra/handlers/handler_db.py +1039 -0
- omnibase_infra/handlers/handler_filesystem.py +1478 -0
- omnibase_infra/handlers/handler_graph.py +1154 -0
- omnibase_infra/handlers/handler_http.py +920 -0
- omnibase_infra/handlers/handler_manifest_persistence.contract.yaml +184 -0
- omnibase_infra/handlers/handler_manifest_persistence.py +1539 -0
- omnibase_infra/handlers/handler_mcp.py +748 -0
- omnibase_infra/handlers/handler_qdrant.py +1076 -0
- omnibase_infra/handlers/handler_vault.py +422 -0
- omnibase_infra/handlers/mcp/__init__.py +19 -0
- omnibase_infra/handlers/mcp/adapter_onex_to_mcp.py +446 -0
- omnibase_infra/handlers/mcp/protocols.py +178 -0
- omnibase_infra/handlers/mcp/transport_streamable_http.py +352 -0
- omnibase_infra/handlers/mixins/__init__.py +42 -0
- omnibase_infra/handlers/mixins/mixin_consul_initialization.py +349 -0
- omnibase_infra/handlers/mixins/mixin_consul_kv.py +337 -0
- omnibase_infra/handlers/mixins/mixin_consul_service.py +277 -0
- omnibase_infra/handlers/mixins/mixin_vault_initialization.py +338 -0
- omnibase_infra/handlers/mixins/mixin_vault_retry.py +412 -0
- omnibase_infra/handlers/mixins/mixin_vault_secrets.py +450 -0
- omnibase_infra/handlers/mixins/mixin_vault_token.py +365 -0
- omnibase_infra/handlers/models/__init__.py +286 -0
- omnibase_infra/handlers/models/consul/__init__.py +81 -0
- omnibase_infra/handlers/models/consul/enum_consul_operation_type.py +57 -0
- omnibase_infra/handlers/models/consul/model_consul_deregister_payload.py +51 -0
- omnibase_infra/handlers/models/consul/model_consul_handler_config.py +153 -0
- omnibase_infra/handlers/models/consul/model_consul_handler_payload.py +89 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_get_found_payload.py +55 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_get_not_found_payload.py +49 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_get_recurse_payload.py +50 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_item.py +33 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_put_payload.py +41 -0
- omnibase_infra/handlers/models/consul/model_consul_register_payload.py +53 -0
- omnibase_infra/handlers/models/consul/model_consul_retry_config.py +66 -0
- omnibase_infra/handlers/models/consul/model_payload_consul.py +66 -0
- omnibase_infra/handlers/models/consul/registry_payload_consul.py +214 -0
- omnibase_infra/handlers/models/graph/__init__.py +35 -0
- omnibase_infra/handlers/models/graph/enum_graph_operation_type.py +20 -0
- omnibase_infra/handlers/models/graph/model_graph_execute_payload.py +38 -0
- omnibase_infra/handlers/models/graph/model_graph_handler_config.py +54 -0
- omnibase_infra/handlers/models/graph/model_graph_handler_payload.py +44 -0
- omnibase_infra/handlers/models/graph/model_graph_query_payload.py +40 -0
- omnibase_infra/handlers/models/graph/model_graph_record.py +22 -0
- omnibase_infra/handlers/models/http/__init__.py +50 -0
- omnibase_infra/handlers/models/http/enum_http_operation_type.py +29 -0
- omnibase_infra/handlers/models/http/model_http_body_content.py +45 -0
- omnibase_infra/handlers/models/http/model_http_get_payload.py +88 -0
- omnibase_infra/handlers/models/http/model_http_handler_payload.py +90 -0
- omnibase_infra/handlers/models/http/model_http_post_payload.py +88 -0
- omnibase_infra/handlers/models/http/model_payload_http.py +66 -0
- omnibase_infra/handlers/models/http/registry_payload_http.py +212 -0
- omnibase_infra/handlers/models/mcp/__init__.py +23 -0
- omnibase_infra/handlers/models/mcp/enum_mcp_operation_type.py +24 -0
- omnibase_infra/handlers/models/mcp/model_mcp_handler_config.py +40 -0
- omnibase_infra/handlers/models/mcp/model_mcp_tool_call.py +32 -0
- omnibase_infra/handlers/models/mcp/model_mcp_tool_result.py +45 -0
- omnibase_infra/handlers/models/model_consul_handler_response.py +96 -0
- omnibase_infra/handlers/models/model_db_describe_response.py +83 -0
- omnibase_infra/handlers/models/model_db_query_payload.py +95 -0
- omnibase_infra/handlers/models/model_db_query_response.py +60 -0
- omnibase_infra/handlers/models/model_filesystem_config.py +98 -0
- omnibase_infra/handlers/models/model_filesystem_delete_payload.py +54 -0
- omnibase_infra/handlers/models/model_filesystem_delete_result.py +77 -0
- omnibase_infra/handlers/models/model_filesystem_directory_entry.py +75 -0
- omnibase_infra/handlers/models/model_filesystem_ensure_directory_payload.py +54 -0
- omnibase_infra/handlers/models/model_filesystem_ensure_directory_result.py +60 -0
- omnibase_infra/handlers/models/model_filesystem_list_directory_payload.py +60 -0
- omnibase_infra/handlers/models/model_filesystem_list_directory_result.py +68 -0
- omnibase_infra/handlers/models/model_filesystem_read_payload.py +62 -0
- omnibase_infra/handlers/models/model_filesystem_read_result.py +61 -0
- omnibase_infra/handlers/models/model_filesystem_write_payload.py +70 -0
- omnibase_infra/handlers/models/model_filesystem_write_result.py +55 -0
- omnibase_infra/handlers/models/model_graph_handler_response.py +98 -0
- omnibase_infra/handlers/models/model_handler_response.py +103 -0
- omnibase_infra/handlers/models/model_http_handler_response.py +101 -0
- omnibase_infra/handlers/models/model_manifest_metadata.py +75 -0
- omnibase_infra/handlers/models/model_manifest_persistence_config.py +62 -0
- omnibase_infra/handlers/models/model_manifest_query_payload.py +90 -0
- omnibase_infra/handlers/models/model_manifest_query_result.py +97 -0
- omnibase_infra/handlers/models/model_manifest_retrieve_payload.py +44 -0
- omnibase_infra/handlers/models/model_manifest_retrieve_result.py +98 -0
- omnibase_infra/handlers/models/model_manifest_store_payload.py +47 -0
- omnibase_infra/handlers/models/model_manifest_store_result.py +67 -0
- omnibase_infra/handlers/models/model_operation_context.py +187 -0
- omnibase_infra/handlers/models/model_qdrant_handler_response.py +98 -0
- omnibase_infra/handlers/models/model_retry_state.py +162 -0
- omnibase_infra/handlers/models/model_vault_handler_response.py +98 -0
- omnibase_infra/handlers/models/qdrant/__init__.py +44 -0
- omnibase_infra/handlers/models/qdrant/enum_qdrant_operation_type.py +26 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_collection_payload.py +42 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_delete_payload.py +36 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_handler_config.py +42 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_handler_payload.py +54 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_search_payload.py +42 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_search_result.py +30 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_upsert_payload.py +36 -0
- omnibase_infra/handlers/models/vault/__init__.py +69 -0
- omnibase_infra/handlers/models/vault/enum_vault_operation_type.py +35 -0
- omnibase_infra/handlers/models/vault/model_payload_vault.py +66 -0
- omnibase_infra/handlers/models/vault/model_vault_delete_payload.py +57 -0
- omnibase_infra/handlers/models/vault/model_vault_handler_config.py +148 -0
- omnibase_infra/handlers/models/vault/model_vault_handler_payload.py +101 -0
- omnibase_infra/handlers/models/vault/model_vault_list_payload.py +58 -0
- omnibase_infra/handlers/models/vault/model_vault_renew_token_payload.py +67 -0
- omnibase_infra/handlers/models/vault/model_vault_retry_config.py +66 -0
- omnibase_infra/handlers/models/vault/model_vault_secret_payload.py +106 -0
- omnibase_infra/handlers/models/vault/model_vault_write_payload.py +66 -0
- omnibase_infra/handlers/models/vault/registry_payload_vault.py +213 -0
- omnibase_infra/handlers/registration_storage/__init__.py +43 -0
- omnibase_infra/handlers/registration_storage/handler_registration_storage_mock.py +392 -0
- omnibase_infra/handlers/registration_storage/handler_registration_storage_postgres.py +915 -0
- omnibase_infra/handlers/registration_storage/models/__init__.py +23 -0
- omnibase_infra/handlers/registration_storage/models/model_delete_registration_request.py +58 -0
- omnibase_infra/handlers/registration_storage/models/model_update_registration_request.py +73 -0
- omnibase_infra/handlers/registration_storage/protocol_registration_persistence.py +191 -0
- omnibase_infra/handlers/service_discovery/__init__.py +43 -0
- omnibase_infra/handlers/service_discovery/handler_service_discovery_consul.py +747 -0
- omnibase_infra/handlers/service_discovery/handler_service_discovery_mock.py +258 -0
- omnibase_infra/handlers/service_discovery/models/__init__.py +22 -0
- omnibase_infra/handlers/service_discovery/models/model_discovery_result.py +64 -0
- omnibase_infra/handlers/service_discovery/models/model_registration_result.py +138 -0
- omnibase_infra/handlers/service_discovery/models/model_service_info.py +99 -0
- omnibase_infra/handlers/service_discovery/protocol_discovery_operations.py +170 -0
- omnibase_infra/idempotency/__init__.py +94 -0
- omnibase_infra/idempotency/models/__init__.py +43 -0
- omnibase_infra/idempotency/models/model_idempotency_check_result.py +85 -0
- omnibase_infra/idempotency/models/model_idempotency_guard_config.py +130 -0
- omnibase_infra/idempotency/models/model_idempotency_record.py +86 -0
- omnibase_infra/idempotency/models/model_idempotency_store_health_check_result.py +81 -0
- omnibase_infra/idempotency/models/model_idempotency_store_metrics.py +140 -0
- omnibase_infra/idempotency/models/model_postgres_idempotency_store_config.py +299 -0
- omnibase_infra/idempotency/protocol_idempotency_store.py +184 -0
- omnibase_infra/idempotency/store_inmemory.py +265 -0
- omnibase_infra/idempotency/store_postgres.py +923 -0
- omnibase_infra/infrastructure/__init__.py +0 -0
- omnibase_infra/mixins/__init__.py +71 -0
- omnibase_infra/mixins/mixin_async_circuit_breaker.py +655 -0
- omnibase_infra/mixins/mixin_dict_like_accessors.py +146 -0
- omnibase_infra/mixins/mixin_envelope_extraction.py +119 -0
- omnibase_infra/mixins/mixin_node_introspection.py +2465 -0
- omnibase_infra/mixins/mixin_retry_execution.py +386 -0
- omnibase_infra/mixins/protocol_circuit_breaker_aware.py +133 -0
- omnibase_infra/models/__init__.py +136 -0
- omnibase_infra/models/corpus/__init__.py +17 -0
- omnibase_infra/models/corpus/model_capture_config.py +133 -0
- omnibase_infra/models/corpus/model_capture_result.py +86 -0
- omnibase_infra/models/discovery/__init__.py +42 -0
- omnibase_infra/models/discovery/model_dependency_spec.py +319 -0
- omnibase_infra/models/discovery/model_discovered_capabilities.py +50 -0
- omnibase_infra/models/discovery/model_introspection_config.py +311 -0
- omnibase_infra/models/discovery/model_introspection_performance_metrics.py +169 -0
- omnibase_infra/models/discovery/model_introspection_task_config.py +116 -0
- omnibase_infra/models/dispatch/__init__.py +147 -0
- omnibase_infra/models/dispatch/model_dispatch_context.py +439 -0
- omnibase_infra/models/dispatch/model_dispatch_error.py +336 -0
- omnibase_infra/models/dispatch/model_dispatch_log_context.py +400 -0
- omnibase_infra/models/dispatch/model_dispatch_metadata.py +228 -0
- omnibase_infra/models/dispatch/model_dispatch_metrics.py +496 -0
- omnibase_infra/models/dispatch/model_dispatch_outcome.py +317 -0
- omnibase_infra/models/dispatch/model_dispatch_outputs.py +231 -0
- omnibase_infra/models/dispatch/model_dispatch_result.py +436 -0
- omnibase_infra/models/dispatch/model_dispatch_route.py +279 -0
- omnibase_infra/models/dispatch/model_dispatcher_metrics.py +275 -0
- omnibase_infra/models/dispatch/model_dispatcher_registration.py +352 -0
- omnibase_infra/models/dispatch/model_parsed_topic.py +135 -0
- omnibase_infra/models/dispatch/model_topic_parser.py +725 -0
- omnibase_infra/models/dispatch/model_tracing_context.py +285 -0
- omnibase_infra/models/errors/__init__.py +45 -0
- omnibase_infra/models/errors/model_handler_validation_error.py +594 -0
- omnibase_infra/models/errors/model_infra_error_context.py +99 -0
- omnibase_infra/models/errors/model_message_type_registry_error_context.py +71 -0
- omnibase_infra/models/errors/model_timeout_error_context.py +110 -0
- omnibase_infra/models/handlers/__init__.py +37 -0
- omnibase_infra/models/handlers/model_contract_discovery_result.py +80 -0
- omnibase_infra/models/handlers/model_handler_descriptor.py +185 -0
- omnibase_infra/models/handlers/model_handler_identifier.py +215 -0
- omnibase_infra/models/health/__init__.py +9 -0
- omnibase_infra/models/health/model_health_check_result.py +40 -0
- omnibase_infra/models/lifecycle/__init__.py +39 -0
- omnibase_infra/models/logging/__init__.py +51 -0
- omnibase_infra/models/logging/model_log_context.py +756 -0
- omnibase_infra/models/model_retry_error_classification.py +78 -0
- omnibase_infra/models/projection/__init__.py +43 -0
- omnibase_infra/models/projection/model_capability_fields.py +112 -0
- omnibase_infra/models/projection/model_registration_projection.py +434 -0
- omnibase_infra/models/projection/model_registration_snapshot.py +322 -0
- omnibase_infra/models/projection/model_sequence_info.py +182 -0
- omnibase_infra/models/projection/model_snapshot_topic_config.py +590 -0
- omnibase_infra/models/projectors/__init__.py +41 -0
- omnibase_infra/models/projectors/model_projector_column.py +289 -0
- omnibase_infra/models/projectors/model_projector_discovery_result.py +65 -0
- omnibase_infra/models/projectors/model_projector_index.py +270 -0
- omnibase_infra/models/projectors/model_projector_schema.py +415 -0
- omnibase_infra/models/projectors/model_projector_validation_error.py +63 -0
- omnibase_infra/models/projectors/util_sql_identifiers.py +115 -0
- omnibase_infra/models/registration/__init__.py +59 -0
- omnibase_infra/models/registration/commands/__init__.py +15 -0
- omnibase_infra/models/registration/commands/model_node_registration_acked.py +108 -0
- omnibase_infra/models/registration/events/__init__.py +56 -0
- omnibase_infra/models/registration/events/model_node_became_active.py +103 -0
- omnibase_infra/models/registration/events/model_node_liveness_expired.py +103 -0
- omnibase_infra/models/registration/events/model_node_registration_accepted.py +98 -0
- omnibase_infra/models/registration/events/model_node_registration_ack_received.py +98 -0
- omnibase_infra/models/registration/events/model_node_registration_ack_timed_out.py +112 -0
- omnibase_infra/models/registration/events/model_node_registration_initiated.py +107 -0
- omnibase_infra/models/registration/events/model_node_registration_rejected.py +104 -0
- omnibase_infra/models/registration/model_introspection_metrics.py +253 -0
- omnibase_infra/models/registration/model_node_capabilities.py +179 -0
- omnibase_infra/models/registration/model_node_heartbeat_event.py +126 -0
- omnibase_infra/models/registration/model_node_introspection_event.py +175 -0
- omnibase_infra/models/registration/model_node_metadata.py +79 -0
- omnibase_infra/models/registration/model_node_registration.py +162 -0
- omnibase_infra/models/registration/model_node_registration_record.py +162 -0
- omnibase_infra/models/registry/__init__.py +29 -0
- omnibase_infra/models/registry/model_domain_constraint.py +202 -0
- omnibase_infra/models/registry/model_message_type_entry.py +271 -0
- omnibase_infra/models/resilience/__init__.py +9 -0
- omnibase_infra/models/resilience/model_circuit_breaker_config.py +227 -0
- omnibase_infra/models/routing/__init__.py +25 -0
- omnibase_infra/models/routing/model_routing_entry.py +52 -0
- omnibase_infra/models/routing/model_routing_subcontract.py +70 -0
- omnibase_infra/models/runtime/__init__.py +40 -0
- omnibase_infra/models/runtime/model_contract_security_config.py +41 -0
- omnibase_infra/models/runtime/model_discovery_error.py +81 -0
- omnibase_infra/models/runtime/model_discovery_result.py +162 -0
- omnibase_infra/models/runtime/model_discovery_warning.py +74 -0
- omnibase_infra/models/runtime/model_failed_plugin_load.py +63 -0
- omnibase_infra/models/runtime/model_handler_contract.py +280 -0
- omnibase_infra/models/runtime/model_loaded_handler.py +120 -0
- omnibase_infra/models/runtime/model_plugin_load_context.py +93 -0
- omnibase_infra/models/runtime/model_plugin_load_summary.py +124 -0
- omnibase_infra/models/security/__init__.py +50 -0
- omnibase_infra/models/security/classification_levels.py +99 -0
- omnibase_infra/models/security/model_environment_policy.py +145 -0
- omnibase_infra/models/security/model_handler_security_policy.py +107 -0
- omnibase_infra/models/security/model_security_error.py +81 -0
- omnibase_infra/models/security/model_security_validation_result.py +328 -0
- omnibase_infra/models/security/model_security_warning.py +67 -0
- omnibase_infra/models/snapshot/__init__.py +27 -0
- omnibase_infra/models/snapshot/model_field_change.py +65 -0
- omnibase_infra/models/snapshot/model_snapshot.py +270 -0
- omnibase_infra/models/snapshot/model_snapshot_diff.py +203 -0
- omnibase_infra/models/snapshot/model_subject_ref.py +81 -0
- omnibase_infra/models/types/__init__.py +71 -0
- omnibase_infra/models/validation/__init__.py +89 -0
- omnibase_infra/models/validation/model_any_type_validation_result.py +118 -0
- omnibase_infra/models/validation/model_any_type_violation.py +141 -0
- omnibase_infra/models/validation/model_category_match_result.py +345 -0
- omnibase_infra/models/validation/model_chain_violation.py +166 -0
- omnibase_infra/models/validation/model_coverage_metrics.py +316 -0
- omnibase_infra/models/validation/model_execution_shape_rule.py +159 -0
- omnibase_infra/models/validation/model_execution_shape_validation.py +208 -0
- omnibase_infra/models/validation/model_execution_shape_validation_result.py +294 -0
- omnibase_infra/models/validation/model_execution_shape_violation.py +122 -0
- omnibase_infra/models/validation/model_localhandler_validation_result.py +139 -0
- omnibase_infra/models/validation/model_localhandler_violation.py +100 -0
- omnibase_infra/models/validation/model_output_validation_params.py +74 -0
- omnibase_infra/models/validation/model_validate_and_raise_params.py +84 -0
- omnibase_infra/models/validation/model_validation_error_params.py +84 -0
- omnibase_infra/models/validation/model_validation_outcome.py +287 -0
- omnibase_infra/nodes/__init__.py +48 -0
- omnibase_infra/nodes/architecture_validator/__init__.py +79 -0
- omnibase_infra/nodes/architecture_validator/contract.yaml +252 -0
- omnibase_infra/nodes/architecture_validator/contract_architecture_validator.yaml +208 -0
- omnibase_infra/nodes/architecture_validator/mixins/__init__.py +16 -0
- omnibase_infra/nodes/architecture_validator/mixins/mixin_file_path_rule.py +92 -0
- omnibase_infra/nodes/architecture_validator/models/__init__.py +36 -0
- omnibase_infra/nodes/architecture_validator/models/model_architecture_validation_request.py +56 -0
- omnibase_infra/nodes/architecture_validator/models/model_architecture_validation_result.py +311 -0
- omnibase_infra/nodes/architecture_validator/models/model_architecture_violation.py +163 -0
- omnibase_infra/nodes/architecture_validator/models/model_rule_check_result.py +265 -0
- omnibase_infra/nodes/architecture_validator/models/model_validation_request.py +105 -0
- omnibase_infra/nodes/architecture_validator/models/model_validation_result.py +314 -0
- omnibase_infra/nodes/architecture_validator/node.py +262 -0
- omnibase_infra/nodes/architecture_validator/node_architecture_validator.py +383 -0
- omnibase_infra/nodes/architecture_validator/protocols/__init__.py +9 -0
- omnibase_infra/nodes/architecture_validator/protocols/protocol_architecture_rule.py +225 -0
- omnibase_infra/nodes/architecture_validator/registry/__init__.py +28 -0
- omnibase_infra/nodes/architecture_validator/registry/registry_infra_architecture_validator.py +99 -0
- omnibase_infra/nodes/architecture_validator/validators/__init__.py +104 -0
- omnibase_infra/nodes/architecture_validator/validators/validator_no_direct_dispatch.py +422 -0
- omnibase_infra/nodes/architecture_validator/validators/validator_no_handler_publishing.py +481 -0
- omnibase_infra/nodes/architecture_validator/validators/validator_no_orchestrator_fsm.py +491 -0
- omnibase_infra/nodes/effects/README.md +358 -0
- omnibase_infra/nodes/effects/__init__.py +26 -0
- omnibase_infra/nodes/effects/contract.yaml +172 -0
- omnibase_infra/nodes/effects/models/__init__.py +32 -0
- omnibase_infra/nodes/effects/models/model_backend_result.py +190 -0
- omnibase_infra/nodes/effects/models/model_effect_idempotency_config.py +92 -0
- omnibase_infra/nodes/effects/models/model_registry_request.py +132 -0
- omnibase_infra/nodes/effects/models/model_registry_response.py +263 -0
- omnibase_infra/nodes/effects/protocol_consul_client.py +89 -0
- omnibase_infra/nodes/effects/protocol_effect_idempotency_store.py +143 -0
- omnibase_infra/nodes/effects/protocol_postgres_adapter.py +96 -0
- omnibase_infra/nodes/effects/registry_effect.py +525 -0
- omnibase_infra/nodes/effects/store_effect_idempotency_inmemory.py +425 -0
- omnibase_infra/nodes/node_registration_orchestrator/README.md +542 -0
- omnibase_infra/nodes/node_registration_orchestrator/__init__.py +120 -0
- omnibase_infra/nodes/node_registration_orchestrator/contract.yaml +475 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/__init__.py +53 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_node_introspected.py +376 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_node_registration_acked.py +376 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_runtime_tick.py +373 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/__init__.py +62 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_heartbeat.py +376 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_introspected.py +609 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_registration_acked.py +458 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_runtime_tick.py +364 -0
- omnibase_infra/nodes/node_registration_orchestrator/introspection_event_router.py +544 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/__init__.py +75 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_consul_intent_payload.py +194 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_consul_registration_intent.py +67 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_intent_execution_result.py +50 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_node_liveness_expired.py +107 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_config.py +67 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_input.py +41 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_output.py +166 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_postgres_intent_payload.py +235 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_postgres_upsert_intent.py +68 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_reducer_execution_result.py +384 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_reducer_state.py +60 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_registration_intent.py +177 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_registry_intent.py +247 -0
- omnibase_infra/nodes/node_registration_orchestrator/node.py +195 -0
- omnibase_infra/nodes/node_registration_orchestrator/plugin.py +909 -0
- omnibase_infra/nodes/node_registration_orchestrator/protocols.py +439 -0
- omnibase_infra/nodes/node_registration_orchestrator/registry/__init__.py +41 -0
- omnibase_infra/nodes/node_registration_orchestrator/registry/registry_infra_node_registration_orchestrator.py +525 -0
- omnibase_infra/nodes/node_registration_orchestrator/timeout_coordinator.py +392 -0
- omnibase_infra/nodes/node_registration_orchestrator/wiring.py +742 -0
- omnibase_infra/nodes/node_registration_reducer/__init__.py +15 -0
- omnibase_infra/nodes/node_registration_reducer/contract.yaml +301 -0
- omnibase_infra/nodes/node_registration_reducer/models/__init__.py +38 -0
- omnibase_infra/nodes/node_registration_reducer/models/model_validation_result.py +113 -0
- omnibase_infra/nodes/node_registration_reducer/node.py +139 -0
- omnibase_infra/nodes/node_registration_reducer/registry/__init__.py +9 -0
- omnibase_infra/nodes/node_registration_reducer/registry/registry_infra_node_registration_reducer.py +79 -0
- omnibase_infra/nodes/node_registration_storage_effect/__init__.py +41 -0
- omnibase_infra/nodes/node_registration_storage_effect/contract.yaml +225 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/__init__.py +44 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_delete_result.py +132 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_registration_record.py +199 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_registration_update.py +155 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_health_check_details.py +123 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_health_check_result.py +117 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_query.py +100 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_result.py +136 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_upsert_result.py +127 -0
- omnibase_infra/nodes/node_registration_storage_effect/node.py +109 -0
- omnibase_infra/nodes/node_registration_storage_effect/protocols/__init__.py +22 -0
- omnibase_infra/nodes/node_registration_storage_effect/protocols/protocol_registration_persistence.py +333 -0
- omnibase_infra/nodes/node_registration_storage_effect/registry/__init__.py +23 -0
- omnibase_infra/nodes/node_registration_storage_effect/registry/registry_infra_registration_storage.py +194 -0
- omnibase_infra/nodes/node_registry_effect/__init__.py +85 -0
- omnibase_infra/nodes/node_registry_effect/contract.yaml +682 -0
- omnibase_infra/nodes/node_registry_effect/handlers/__init__.py +70 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_consul_deregister.py +211 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_consul_register.py +212 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_partial_retry.py +416 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_postgres_deactivate.py +215 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_postgres_upsert.py +208 -0
- omnibase_infra/nodes/node_registry_effect/models/__init__.py +43 -0
- omnibase_infra/nodes/node_registry_effect/models/model_partial_retry_request.py +92 -0
- omnibase_infra/nodes/node_registry_effect/node.py +165 -0
- omnibase_infra/nodes/node_registry_effect/registry/__init__.py +27 -0
- omnibase_infra/nodes/node_registry_effect/registry/registry_infra_registry_effect.py +196 -0
- omnibase_infra/nodes/node_service_discovery_effect/__init__.py +111 -0
- omnibase_infra/nodes/node_service_discovery_effect/contract.yaml +246 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/__init__.py +67 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/enum_health_status.py +72 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/enum_service_discovery_operation.py +58 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_discovery_query.py +99 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_discovery_result.py +98 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_health_check_config.py +121 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_query_metadata.py +63 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_registration_result.py +130 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_discovery_health_check_details.py +111 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_discovery_health_check_result.py +119 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_info.py +106 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_registration.py +121 -0
- omnibase_infra/nodes/node_service_discovery_effect/node.py +111 -0
- omnibase_infra/nodes/node_service_discovery_effect/protocols/__init__.py +14 -0
- omnibase_infra/nodes/node_service_discovery_effect/protocols/protocol_discovery_operations.py +279 -0
- omnibase_infra/nodes/node_service_discovery_effect/registry/__init__.py +13 -0
- omnibase_infra/nodes/node_service_discovery_effect/registry/registry_infra_service_discovery.py +214 -0
- omnibase_infra/nodes/reducers/__init__.py +30 -0
- omnibase_infra/nodes/reducers/models/__init__.py +32 -0
- omnibase_infra/nodes/reducers/models/model_payload_consul_register.py +76 -0
- omnibase_infra/nodes/reducers/models/model_payload_postgres_upsert_registration.py +60 -0
- omnibase_infra/nodes/reducers/models/model_registration_confirmation.py +166 -0
- omnibase_infra/nodes/reducers/models/model_registration_state.py +433 -0
- omnibase_infra/nodes/reducers/registration_reducer.py +1137 -0
- omnibase_infra/observability/__init__.py +143 -0
- omnibase_infra/observability/constants_metrics.py +91 -0
- omnibase_infra/observability/factory_observability_sink.py +525 -0
- omnibase_infra/observability/handlers/__init__.py +118 -0
- omnibase_infra/observability/handlers/handler_logging_structured.py +967 -0
- omnibase_infra/observability/handlers/handler_metrics_prometheus.py +1120 -0
- omnibase_infra/observability/handlers/model_logging_handler_config.py +71 -0
- omnibase_infra/observability/handlers/model_logging_handler_response.py +77 -0
- omnibase_infra/observability/handlers/model_metrics_handler_config.py +172 -0
- omnibase_infra/observability/handlers/model_metrics_handler_payload.py +135 -0
- omnibase_infra/observability/handlers/model_metrics_handler_response.py +101 -0
- omnibase_infra/observability/hooks/__init__.py +74 -0
- omnibase_infra/observability/hooks/hook_observability.py +1223 -0
- omnibase_infra/observability/models/__init__.py +30 -0
- omnibase_infra/observability/models/enum_required_log_context_key.py +77 -0
- omnibase_infra/observability/models/model_buffered_log_entry.py +117 -0
- omnibase_infra/observability/models/model_logging_sink_config.py +73 -0
- omnibase_infra/observability/models/model_metrics_sink_config.py +156 -0
- omnibase_infra/observability/sinks/__init__.py +69 -0
- omnibase_infra/observability/sinks/sink_logging_structured.py +809 -0
- omnibase_infra/observability/sinks/sink_metrics_prometheus.py +710 -0
- omnibase_infra/plugins/__init__.py +27 -0
- omnibase_infra/plugins/examples/__init__.py +28 -0
- omnibase_infra/plugins/examples/plugin_json_normalizer.py +271 -0
- omnibase_infra/plugins/examples/plugin_json_normalizer_error_handling.py +210 -0
- omnibase_infra/plugins/models/__init__.py +21 -0
- omnibase_infra/plugins/models/model_plugin_context.py +76 -0
- omnibase_infra/plugins/models/model_plugin_input_data.py +58 -0
- omnibase_infra/plugins/models/model_plugin_output_data.py +62 -0
- omnibase_infra/plugins/plugin_compute_base.py +435 -0
- omnibase_infra/projectors/__init__.py +30 -0
- omnibase_infra/projectors/contracts/__init__.py +63 -0
- omnibase_infra/projectors/contracts/registration_projector.yaml +370 -0
- omnibase_infra/projectors/projection_reader_registration.py +1559 -0
- omnibase_infra/projectors/snapshot_publisher_registration.py +1329 -0
- omnibase_infra/protocols/__init__.py +99 -0
- omnibase_infra/protocols/protocol_capability_projection.py +253 -0
- omnibase_infra/protocols/protocol_capability_query.py +251 -0
- omnibase_infra/protocols/protocol_event_bus_like.py +127 -0
- omnibase_infra/protocols/protocol_event_projector.py +96 -0
- omnibase_infra/protocols/protocol_idempotency_store.py +142 -0
- omnibase_infra/protocols/protocol_message_dispatcher.py +247 -0
- omnibase_infra/protocols/protocol_message_type_registry.py +306 -0
- omnibase_infra/protocols/protocol_plugin_compute.py +368 -0
- omnibase_infra/protocols/protocol_projector_schema_validator.py +82 -0
- omnibase_infra/protocols/protocol_registry_metrics.py +215 -0
- omnibase_infra/protocols/protocol_snapshot_publisher.py +396 -0
- omnibase_infra/protocols/protocol_snapshot_store.py +567 -0
- omnibase_infra/runtime/__init__.py +296 -0
- omnibase_infra/runtime/binding_config_resolver.py +2706 -0
- omnibase_infra/runtime/chain_aware_dispatch.py +467 -0
- omnibase_infra/runtime/contract_handler_discovery.py +582 -0
- omnibase_infra/runtime/contract_loaders/__init__.py +42 -0
- omnibase_infra/runtime/contract_loaders/handler_routing_loader.py +464 -0
- omnibase_infra/runtime/dispatch_context_enforcer.py +427 -0
- omnibase_infra/runtime/enums/__init__.py +18 -0
- omnibase_infra/runtime/enums/enum_config_ref_scheme.py +33 -0
- omnibase_infra/runtime/enums/enum_scheduler_status.py +170 -0
- omnibase_infra/runtime/envelope_validator.py +179 -0
- omnibase_infra/runtime/handler_contract_source.py +669 -0
- omnibase_infra/runtime/handler_plugin_loader.py +2029 -0
- omnibase_infra/runtime/handler_registry.py +321 -0
- omnibase_infra/runtime/invocation_security_enforcer.py +427 -0
- omnibase_infra/runtime/kernel.py +40 -0
- omnibase_infra/runtime/mixin_policy_validation.py +522 -0
- omnibase_infra/runtime/mixin_semver_cache.py +378 -0
- omnibase_infra/runtime/mixins/__init__.py +17 -0
- omnibase_infra/runtime/mixins/mixin_projector_sql_operations.py +757 -0
- omnibase_infra/runtime/models/__init__.py +192 -0
- omnibase_infra/runtime/models/model_batch_lifecycle_result.py +217 -0
- omnibase_infra/runtime/models/model_binding_config.py +168 -0
- omnibase_infra/runtime/models/model_binding_config_cache_stats.py +135 -0
- omnibase_infra/runtime/models/model_binding_config_resolver_config.py +329 -0
- omnibase_infra/runtime/models/model_cached_secret.py +138 -0
- omnibase_infra/runtime/models/model_compute_key.py +138 -0
- omnibase_infra/runtime/models/model_compute_registration.py +97 -0
- omnibase_infra/runtime/models/model_config_cache_entry.py +61 -0
- omnibase_infra/runtime/models/model_config_ref.py +331 -0
- omnibase_infra/runtime/models/model_config_ref_parse_result.py +125 -0
- omnibase_infra/runtime/models/model_domain_plugin_config.py +92 -0
- omnibase_infra/runtime/models/model_domain_plugin_result.py +270 -0
- omnibase_infra/runtime/models/model_duplicate_response.py +54 -0
- omnibase_infra/runtime/models/model_enabled_protocols_config.py +61 -0
- omnibase_infra/runtime/models/model_event_bus_config.py +54 -0
- omnibase_infra/runtime/models/model_failed_component.py +55 -0
- omnibase_infra/runtime/models/model_health_check_response.py +168 -0
- omnibase_infra/runtime/models/model_health_check_result.py +228 -0
- omnibase_infra/runtime/models/model_lifecycle_result.py +245 -0
- omnibase_infra/runtime/models/model_logging_config.py +42 -0
- omnibase_infra/runtime/models/model_optional_correlation_id.py +167 -0
- omnibase_infra/runtime/models/model_optional_string.py +94 -0
- omnibase_infra/runtime/models/model_optional_uuid.py +110 -0
- omnibase_infra/runtime/models/model_policy_context.py +100 -0
- omnibase_infra/runtime/models/model_policy_key.py +138 -0
- omnibase_infra/runtime/models/model_policy_registration.py +139 -0
- omnibase_infra/runtime/models/model_policy_result.py +103 -0
- omnibase_infra/runtime/models/model_policy_type_filter.py +157 -0
- omnibase_infra/runtime/models/model_projector_plugin_loader_config.py +47 -0
- omnibase_infra/runtime/models/model_protocol_registration_config.py +65 -0
- omnibase_infra/runtime/models/model_retry_policy.py +105 -0
- omnibase_infra/runtime/models/model_runtime_config.py +150 -0
- omnibase_infra/runtime/models/model_runtime_scheduler_config.py +624 -0
- omnibase_infra/runtime/models/model_runtime_scheduler_metrics.py +233 -0
- omnibase_infra/runtime/models/model_runtime_tick.py +193 -0
- omnibase_infra/runtime/models/model_secret_cache_stats.py +82 -0
- omnibase_infra/runtime/models/model_secret_mapping.py +63 -0
- omnibase_infra/runtime/models/model_secret_resolver_config.py +107 -0
- omnibase_infra/runtime/models/model_secret_resolver_metrics.py +111 -0
- omnibase_infra/runtime/models/model_secret_source_info.py +72 -0
- omnibase_infra/runtime/models/model_secret_source_spec.py +66 -0
- omnibase_infra/runtime/models/model_shutdown_batch_result.py +75 -0
- omnibase_infra/runtime/models/model_shutdown_config.py +94 -0
- omnibase_infra/runtime/projector_plugin_loader.py +1462 -0
- omnibase_infra/runtime/projector_schema_manager.py +565 -0
- omnibase_infra/runtime/projector_shell.py +1102 -0
- omnibase_infra/runtime/protocol_contract_descriptor.py +92 -0
- omnibase_infra/runtime/protocol_contract_source.py +92 -0
- omnibase_infra/runtime/protocol_domain_plugin.py +474 -0
- omnibase_infra/runtime/protocol_handler_discovery.py +221 -0
- omnibase_infra/runtime/protocol_handler_plugin_loader.py +327 -0
- omnibase_infra/runtime/protocol_lifecycle_executor.py +435 -0
- omnibase_infra/runtime/protocol_policy.py +366 -0
- omnibase_infra/runtime/protocols/__init__.py +27 -0
- omnibase_infra/runtime/protocols/protocol_runtime_scheduler.py +468 -0
- omnibase_infra/runtime/registry/__init__.py +93 -0
- omnibase_infra/runtime/registry/mixin_message_type_query.py +326 -0
- omnibase_infra/runtime/registry/mixin_message_type_registration.py +354 -0
- omnibase_infra/runtime/registry/registry_event_bus_binding.py +268 -0
- omnibase_infra/runtime/registry/registry_message_type.py +542 -0
- omnibase_infra/runtime/registry/registry_protocol_binding.py +444 -0
- omnibase_infra/runtime/registry_compute.py +1143 -0
- omnibase_infra/runtime/registry_dispatcher.py +678 -0
- omnibase_infra/runtime/registry_policy.py +1502 -0
- omnibase_infra/runtime/runtime_scheduler.py +1070 -0
- omnibase_infra/runtime/secret_resolver.py +2110 -0
- omnibase_infra/runtime/security_metadata_validator.py +776 -0
- omnibase_infra/runtime/service_kernel.py +1573 -0
- omnibase_infra/runtime/service_message_dispatch_engine.py +1805 -0
- omnibase_infra/runtime/service_runtime_host_process.py +2260 -0
- omnibase_infra/runtime/util_container_wiring.py +1123 -0
- omnibase_infra/runtime/util_validation.py +314 -0
- omnibase_infra/runtime/util_version.py +98 -0
- omnibase_infra/runtime/util_wiring.py +566 -0
- omnibase_infra/schemas/schema_registration_projection.sql +320 -0
- omnibase_infra/services/__init__.py +68 -0
- omnibase_infra/services/corpus_capture.py +678 -0
- omnibase_infra/services/service_capability_query.py +945 -0
- omnibase_infra/services/service_health.py +897 -0
- omnibase_infra/services/service_node_selector.py +530 -0
- omnibase_infra/services/service_timeout_emitter.py +682 -0
- omnibase_infra/services/service_timeout_scanner.py +390 -0
- omnibase_infra/services/snapshot/__init__.py +31 -0
- omnibase_infra/services/snapshot/service_snapshot.py +647 -0
- omnibase_infra/services/snapshot/store_inmemory.py +637 -0
- omnibase_infra/services/snapshot/store_postgres.py +1279 -0
- omnibase_infra/shared/__init__.py +8 -0
- omnibase_infra/testing/__init__.py +10 -0
- omnibase_infra/testing/utils.py +23 -0
- omnibase_infra/types/__init__.py +48 -0
- omnibase_infra/types/type_cache_info.py +49 -0
- omnibase_infra/types/type_dsn.py +173 -0
- omnibase_infra/types/type_infra_aliases.py +60 -0
- omnibase_infra/types/typed_dict/__init__.py +21 -0
- omnibase_infra/types/typed_dict/typed_dict_introspection_cache.py +128 -0
- omnibase_infra/types/typed_dict/typed_dict_performance_metrics_cache.py +140 -0
- omnibase_infra/types/typed_dict_capabilities.py +64 -0
- omnibase_infra/utils/__init__.py +89 -0
- omnibase_infra/utils/correlation.py +208 -0
- omnibase_infra/utils/util_datetime.py +372 -0
- omnibase_infra/utils/util_dsn_validation.py +333 -0
- omnibase_infra/utils/util_env_parsing.py +264 -0
- omnibase_infra/utils/util_error_sanitization.py +457 -0
- omnibase_infra/utils/util_pydantic_validators.py +477 -0
- omnibase_infra/utils/util_semver.py +233 -0
- omnibase_infra/validation/__init__.py +307 -0
- omnibase_infra/validation/enums/__init__.py +11 -0
- omnibase_infra/validation/enums/enum_contract_violation_severity.py +13 -0
- omnibase_infra/validation/infra_validators.py +1486 -0
- omnibase_infra/validation/linter_contract.py +907 -0
- omnibase_infra/validation/mixin_any_type_classification.py +120 -0
- omnibase_infra/validation/mixin_any_type_exemption.py +580 -0
- omnibase_infra/validation/mixin_any_type_reporting.py +106 -0
- omnibase_infra/validation/mixin_execution_shape_violation_checks.py +596 -0
- omnibase_infra/validation/mixin_node_archetype_detection.py +254 -0
- omnibase_infra/validation/models/__init__.py +15 -0
- omnibase_infra/validation/models/model_contract_lint_result.py +101 -0
- omnibase_infra/validation/models/model_contract_violation.py +41 -0
- omnibase_infra/validation/service_validation_aggregator.py +395 -0
- omnibase_infra/validation/validation_exemptions.yaml +1710 -0
- omnibase_infra/validation/validator_any_type.py +715 -0
- omnibase_infra/validation/validator_chain_propagation.py +839 -0
- omnibase_infra/validation/validator_execution_shape.py +465 -0
- omnibase_infra/validation/validator_localhandler.py +261 -0
- omnibase_infra/validation/validator_registration_security.py +410 -0
- omnibase_infra/validation/validator_routing_coverage.py +1020 -0
- omnibase_infra/validation/validator_runtime_shape.py +915 -0
- omnibase_infra/validation/validator_security.py +410 -0
- omnibase_infra/validation/validator_topic_category.py +1152 -0
- omnibase_infra-0.2.1.dist-info/METADATA +197 -0
- omnibase_infra-0.2.1.dist-info/RECORD +675 -0
- omnibase_infra-0.2.1.dist-info/WHEEL +4 -0
- omnibase_infra-0.2.1.dist-info/entry_points.txt +4 -0
- omnibase_infra-0.2.1.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,477 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Shared Pydantic field validator utilities.
|
|
4
|
+
|
|
5
|
+
This module provides reusable validation functions that can be called from
|
|
6
|
+
Pydantic field validators. These utilities consolidate duplicate validation
|
|
7
|
+
logic that was previously scattered across multiple model files.
|
|
8
|
+
|
|
9
|
+
Usage Pattern:
|
|
10
|
+
Pydantic validators must be methods of the model class, but they can
|
|
11
|
+
delegate to shared utility functions for the actual validation logic.
|
|
12
|
+
|
|
13
|
+
Example:
|
|
14
|
+
from pydantic import field_validator
|
|
15
|
+
from omnibase_infra.utils import validate_timezone_aware_datetime
|
|
16
|
+
|
|
17
|
+
class MyModel(BaseModel):
|
|
18
|
+
timestamp: datetime
|
|
19
|
+
|
|
20
|
+
@field_validator("timestamp")
|
|
21
|
+
@classmethod
|
|
22
|
+
def validate_timestamp_timezone_aware(cls, v: datetime) -> datetime:
|
|
23
|
+
return validate_timezone_aware_datetime(v)
|
|
24
|
+
|
|
25
|
+
Related Tickets:
|
|
26
|
+
- OMN-1181: Replace RuntimeError with structured errors
|
|
27
|
+
- PR #158: Validation function consolidation
|
|
28
|
+
|
|
29
|
+
.. versionadded:: 0.9.1
|
|
30
|
+
Created to consolidate duplicate validation functions.
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
from __future__ import annotations
|
|
34
|
+
|
|
35
|
+
import re
|
|
36
|
+
from datetime import datetime
|
|
37
|
+
from typing import TYPE_CHECKING, Literal, overload
|
|
38
|
+
from urllib.parse import ParseResult, urlparse
|
|
39
|
+
|
|
40
|
+
from omnibase_infra.utils.util_datetime import is_timezone_aware
|
|
41
|
+
|
|
42
|
+
if TYPE_CHECKING:
|
|
43
|
+
from omnibase_infra.enums import EnumPolicyType
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
@overload
|
|
47
|
+
def validate_timezone_aware_datetime(
|
|
48
|
+
dt: datetime,
|
|
49
|
+
*,
|
|
50
|
+
allow_none: Literal[False] = ...,
|
|
51
|
+
) -> datetime: ...
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
@overload
|
|
55
|
+
def validate_timezone_aware_datetime(
|
|
56
|
+
dt: datetime | None,
|
|
57
|
+
*,
|
|
58
|
+
allow_none: Literal[True],
|
|
59
|
+
) -> datetime | None: ...
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def validate_timezone_aware_datetime(
|
|
63
|
+
dt: datetime | None,
|
|
64
|
+
*,
|
|
65
|
+
allow_none: bool = False,
|
|
66
|
+
) -> datetime | None:
|
|
67
|
+
"""Validate that a datetime is timezone-aware.
|
|
68
|
+
|
|
69
|
+
This is the SINGLE SOURCE OF TRUTH for timezone-aware datetime validation
|
|
70
|
+
in Pydantic field validators. Use this instead of duplicating the validation
|
|
71
|
+
logic in each model.
|
|
72
|
+
|
|
73
|
+
For optional datetime fields, use ``allow_none=True`` parameter.
|
|
74
|
+
|
|
75
|
+
Args:
|
|
76
|
+
dt: The datetime value to validate (or None if allow_none=True).
|
|
77
|
+
allow_none: If True, None is a valid value. If False (default), None
|
|
78
|
+
raises ValueError.
|
|
79
|
+
|
|
80
|
+
Returns:
|
|
81
|
+
The validated datetime (unchanged if valid), or None if allow_none=True
|
|
82
|
+
and dt is None.
|
|
83
|
+
|
|
84
|
+
Raises:
|
|
85
|
+
ValueError: If datetime is naive (no timezone info), or if dt is None
|
|
86
|
+
and allow_none=False.
|
|
87
|
+
|
|
88
|
+
Example:
|
|
89
|
+
>>> from datetime import datetime, UTC
|
|
90
|
+
>>> from omnibase_infra.utils import validate_timezone_aware_datetime
|
|
91
|
+
>>>
|
|
92
|
+
>>> # Valid: timezone-aware datetime
|
|
93
|
+
>>> aware = datetime.now(UTC)
|
|
94
|
+
>>> validate_timezone_aware_datetime(aware) == aware
|
|
95
|
+
True
|
|
96
|
+
>>>
|
|
97
|
+
>>> # Invalid: naive datetime
|
|
98
|
+
>>> naive = datetime.now()
|
|
99
|
+
>>> validate_timezone_aware_datetime(naive) # doctest: +ELLIPSIS
|
|
100
|
+
Traceback (most recent call last):
|
|
101
|
+
...
|
|
102
|
+
ValueError: timestamp must be timezone-aware...
|
|
103
|
+
>>>
|
|
104
|
+
>>> # Optional datetime with allow_none=True
|
|
105
|
+
>>> validate_timezone_aware_datetime(None, allow_none=True) is None
|
|
106
|
+
True
|
|
107
|
+
|
|
108
|
+
Usage in Pydantic model:
|
|
109
|
+
@field_validator("timestamp")
|
|
110
|
+
@classmethod
|
|
111
|
+
def validate_timestamp_timezone_aware(cls, v: datetime) -> datetime:
|
|
112
|
+
return validate_timezone_aware_datetime(v)
|
|
113
|
+
|
|
114
|
+
@field_validator("created_at", "updated_at")
|
|
115
|
+
@classmethod
|
|
116
|
+
def validate_optional_timestamps(
|
|
117
|
+
cls, v: datetime | None
|
|
118
|
+
) -> datetime | None:
|
|
119
|
+
return validate_timezone_aware_datetime(v, allow_none=True)
|
|
120
|
+
"""
|
|
121
|
+
if dt is None:
|
|
122
|
+
if not allow_none:
|
|
123
|
+
raise ValueError(
|
|
124
|
+
"timestamp is required and cannot be None. "
|
|
125
|
+
"Use allow_none=True if None is a valid value."
|
|
126
|
+
)
|
|
127
|
+
return None
|
|
128
|
+
|
|
129
|
+
if not is_timezone_aware(dt):
|
|
130
|
+
raise ValueError(
|
|
131
|
+
"timestamp must be timezone-aware. Use datetime.now(UTC) or "
|
|
132
|
+
"datetime(..., tzinfo=timezone.utc) instead of naive datetime."
|
|
133
|
+
)
|
|
134
|
+
return dt
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def validate_timezone_aware_datetime_optional(
|
|
138
|
+
dt: datetime | None,
|
|
139
|
+
) -> datetime | None:
|
|
140
|
+
"""Validate that an optional datetime is timezone-aware when provided.
|
|
141
|
+
|
|
142
|
+
Convenience wrapper around validate_timezone_aware_datetime for optional
|
|
143
|
+
datetime fields. Equivalent to ``validate_timezone_aware_datetime(dt, allow_none=True)``.
|
|
144
|
+
|
|
145
|
+
Args:
|
|
146
|
+
dt: The datetime value to validate (or None).
|
|
147
|
+
|
|
148
|
+
Returns:
|
|
149
|
+
The validated datetime or None.
|
|
150
|
+
|
|
151
|
+
Raises:
|
|
152
|
+
ValueError: If datetime is naive (no timezone info).
|
|
153
|
+
|
|
154
|
+
Example:
|
|
155
|
+
>>> from datetime import datetime, UTC
|
|
156
|
+
>>> from omnibase_infra.utils import validate_timezone_aware_datetime_optional
|
|
157
|
+
>>>
|
|
158
|
+
>>> # None passes through
|
|
159
|
+
>>> validate_timezone_aware_datetime_optional(None) is None
|
|
160
|
+
True
|
|
161
|
+
>>>
|
|
162
|
+
>>> # Valid: timezone-aware datetime
|
|
163
|
+
>>> aware = datetime.now(UTC)
|
|
164
|
+
>>> validate_timezone_aware_datetime_optional(aware) == aware
|
|
165
|
+
True
|
|
166
|
+
|
|
167
|
+
Usage in Pydantic model:
|
|
168
|
+
@field_validator("created_at", "updated_at")
|
|
169
|
+
@classmethod
|
|
170
|
+
def validate_timestamps(cls, v: datetime | None) -> datetime | None:
|
|
171
|
+
return validate_timezone_aware_datetime_optional(v)
|
|
172
|
+
"""
|
|
173
|
+
return validate_timezone_aware_datetime(dt, allow_none=True)
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def _sanitize_url_for_logging(url: str, parsed: ParseResult | None = None) -> str:
|
|
177
|
+
"""Redact password from URL for safe logging.
|
|
178
|
+
|
|
179
|
+
This prevents credential exposure in error messages and logs.
|
|
180
|
+
Handles both well-formed URLs (http://user:pass@host) and malformed
|
|
181
|
+
URLs (user:pass@host) that may contain credentials.
|
|
182
|
+
|
|
183
|
+
Args:
|
|
184
|
+
url: The URL to sanitize.
|
|
185
|
+
parsed: Optional pre-parsed URL result to avoid re-parsing.
|
|
186
|
+
|
|
187
|
+
Returns:
|
|
188
|
+
URL with password redacted (if present), or original URL if no password.
|
|
189
|
+
|
|
190
|
+
Example:
|
|
191
|
+
>>> _sanitize_url_for_logging("http://user:secret@localhost:8080/path")
|
|
192
|
+
'http://user:****@localhost:8080/path'
|
|
193
|
+
>>> _sanitize_url_for_logging("http://localhost:8080/path")
|
|
194
|
+
'http://localhost:8080/path'
|
|
195
|
+
>>> _sanitize_url_for_logging("user:secret@localhost:5432")
|
|
196
|
+
'user:****@localhost:5432'
|
|
197
|
+
"""
|
|
198
|
+
if parsed is None:
|
|
199
|
+
parsed = urlparse(url)
|
|
200
|
+
|
|
201
|
+
# If urlparse detected a password, use structured reconstruction
|
|
202
|
+
if parsed.password:
|
|
203
|
+
# Reconstruct URL with redacted password
|
|
204
|
+
# netloc format: [user[:password]@]host[:port]
|
|
205
|
+
user_part = parsed.username or ""
|
|
206
|
+
user_part += ":****@"
|
|
207
|
+
|
|
208
|
+
# Extract host:port from netloc (everything after @)
|
|
209
|
+
host_port = (
|
|
210
|
+
parsed.netloc.split("@")[-1] if "@" in parsed.netloc else parsed.netloc
|
|
211
|
+
)
|
|
212
|
+
|
|
213
|
+
# Reconstruct the sanitized URL
|
|
214
|
+
sanitized = f"{parsed.scheme}://{user_part}{host_port}"
|
|
215
|
+
if parsed.path:
|
|
216
|
+
sanitized += parsed.path
|
|
217
|
+
if parsed.query:
|
|
218
|
+
sanitized += f"?{parsed.query}"
|
|
219
|
+
if parsed.fragment:
|
|
220
|
+
sanitized += f"#{parsed.fragment}"
|
|
221
|
+
|
|
222
|
+
return sanitized
|
|
223
|
+
|
|
224
|
+
# Fallback: handle malformed URLs where urlparse doesn't detect credentials
|
|
225
|
+
# Pattern matches: anything:something@host (credential-like patterns)
|
|
226
|
+
# This catches cases like "user:password@host" without a scheme
|
|
227
|
+
if "@" in url:
|
|
228
|
+
# Look for pattern: word:word@ at the START of the string (likely credentials)
|
|
229
|
+
# Exclude URLs with schemes (scheme://...) by requiring no "/" before the ":"
|
|
230
|
+
# Pattern: starts with non-slash chars, then colon, then non-@/slash chars, then @
|
|
231
|
+
credential_pattern = re.compile(r"^([^/:]+):([^@/]+)@")
|
|
232
|
+
match = credential_pattern.match(url)
|
|
233
|
+
if match:
|
|
234
|
+
# Redact the password part (group 2)
|
|
235
|
+
return url[: match.start(2)] + "****" + url[match.end(2) :]
|
|
236
|
+
|
|
237
|
+
return url
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
def validate_endpoint_urls_dict(endpoints: dict[str, str]) -> dict[str, str]:
|
|
241
|
+
"""Validate that all endpoint values are valid URLs.
|
|
242
|
+
|
|
243
|
+
This is the SINGLE SOURCE OF TRUTH for endpoint URL validation in
|
|
244
|
+
Pydantic field validators.
|
|
245
|
+
|
|
246
|
+
Args:
|
|
247
|
+
endpoints: Dictionary of endpoint names to URL strings.
|
|
248
|
+
|
|
249
|
+
Returns:
|
|
250
|
+
The validated endpoints dictionary (unchanged if valid).
|
|
251
|
+
|
|
252
|
+
Raises:
|
|
253
|
+
ValueError: If any endpoint URL is invalid (missing scheme or netloc).
|
|
254
|
+
|
|
255
|
+
Example:
|
|
256
|
+
>>> from omnibase_infra.utils import validate_endpoint_urls_dict
|
|
257
|
+
>>>
|
|
258
|
+
>>> # Valid endpoints
|
|
259
|
+
>>> endpoints = {"api": "http://localhost:8080", "grpc": "grpc://localhost:9090"}
|
|
260
|
+
>>> validate_endpoint_urls_dict(endpoints) == endpoints
|
|
261
|
+
True
|
|
262
|
+
>>>
|
|
263
|
+
>>> # Invalid: missing scheme
|
|
264
|
+
>>> validate_endpoint_urls_dict({"api": "localhost:8080"}) # doctest: +ELLIPSIS
|
|
265
|
+
Traceback (most recent call last):
|
|
266
|
+
...
|
|
267
|
+
ValueError: Invalid URL for endpoint 'api': localhost:8080
|
|
268
|
+
|
|
269
|
+
Usage in Pydantic model:
|
|
270
|
+
@field_validator("endpoints")
|
|
271
|
+
@classmethod
|
|
272
|
+
def validate_endpoint_urls(cls, v: dict[str, str]) -> dict[str, str]:
|
|
273
|
+
return validate_endpoint_urls_dict(v)
|
|
274
|
+
"""
|
|
275
|
+
for name, url in endpoints.items():
|
|
276
|
+
parsed = urlparse(url)
|
|
277
|
+
if not parsed.scheme or not parsed.netloc:
|
|
278
|
+
# Sanitize URL to prevent credential exposure in error messages
|
|
279
|
+
safe_url = _sanitize_url_for_logging(url, parsed)
|
|
280
|
+
raise ValueError(f"Invalid URL for endpoint '{name}': {safe_url}")
|
|
281
|
+
return endpoints
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
def validate_pool_sizes_constraint(
|
|
285
|
+
pool_max_size: int,
|
|
286
|
+
pool_min_size: int,
|
|
287
|
+
*,
|
|
288
|
+
target_name: str = "connection_pool",
|
|
289
|
+
) -> int:
|
|
290
|
+
"""Validate that pool_max_size >= pool_min_size.
|
|
291
|
+
|
|
292
|
+
This is the SINGLE SOURCE OF TRUTH for connection pool size validation
|
|
293
|
+
in Pydantic field validators.
|
|
294
|
+
|
|
295
|
+
Args:
|
|
296
|
+
pool_max_size: The maximum pool size to validate.
|
|
297
|
+
pool_min_size: The minimum pool size for comparison.
|
|
298
|
+
target_name: Service/component name for error context.
|
|
299
|
+
|
|
300
|
+
Returns:
|
|
301
|
+
The validated pool_max_size (unchanged if valid).
|
|
302
|
+
|
|
303
|
+
Raises:
|
|
304
|
+
ProtocolConfigurationError: If pool_max_size < pool_min_size.
|
|
305
|
+
|
|
306
|
+
Example:
|
|
307
|
+
>>> from omnibase_infra.utils import validate_pool_sizes_constraint
|
|
308
|
+
>>>
|
|
309
|
+
>>> # Valid: max >= min
|
|
310
|
+
>>> validate_pool_sizes_constraint(10, 5)
|
|
311
|
+
10
|
|
312
|
+
>>>
|
|
313
|
+
>>> # Invalid: max < min
|
|
314
|
+
>>> validate_pool_sizes_constraint(5, 10) # doctest: +ELLIPSIS
|
|
315
|
+
Traceback (most recent call last):
|
|
316
|
+
...
|
|
317
|
+
omnibase_infra.errors...ProtocolConfigurationError: ...pool_max_size (5) must be >= pool_min_size (10)
|
|
318
|
+
|
|
319
|
+
Usage in Pydantic model:
|
|
320
|
+
@field_validator("pool_max_size", mode="after")
|
|
321
|
+
@classmethod
|
|
322
|
+
def validate_pool_sizes(cls, v: int, info: ValidationInfo) -> int:
|
|
323
|
+
if info.data:
|
|
324
|
+
pool_min_size = info.data.get("pool_min_size", 1)
|
|
325
|
+
return validate_pool_sizes_constraint(
|
|
326
|
+
v, pool_min_size, target_name="my_service"
|
|
327
|
+
)
|
|
328
|
+
return v
|
|
329
|
+
"""
|
|
330
|
+
if pool_max_size < pool_min_size:
|
|
331
|
+
# Lazy imports to avoid circular dependency
|
|
332
|
+
from omnibase_infra.enums import EnumInfraTransportType
|
|
333
|
+
from omnibase_infra.errors import (
|
|
334
|
+
ModelInfraErrorContext,
|
|
335
|
+
ProtocolConfigurationError,
|
|
336
|
+
)
|
|
337
|
+
|
|
338
|
+
context = ModelInfraErrorContext.with_correlation(
|
|
339
|
+
transport_type=EnumInfraTransportType.DATABASE,
|
|
340
|
+
operation="validate_config",
|
|
341
|
+
target_name=target_name,
|
|
342
|
+
)
|
|
343
|
+
raise ProtocolConfigurationError(
|
|
344
|
+
f"pool_max_size ({pool_max_size}) must be >= pool_min_size ({pool_min_size})",
|
|
345
|
+
context=context,
|
|
346
|
+
parameter="pool_max_size",
|
|
347
|
+
)
|
|
348
|
+
return pool_max_size
|
|
349
|
+
|
|
350
|
+
|
|
351
|
+
def validate_policy_type_value(
|
|
352
|
+
value: str | EnumPolicyType,
|
|
353
|
+
) -> EnumPolicyType:
|
|
354
|
+
"""Validate and coerce a value to EnumPolicyType.
|
|
355
|
+
|
|
356
|
+
This is the SINGLE SOURCE OF TRUTH for policy type validation in
|
|
357
|
+
Pydantic field validators. String values are COERCED to the enum type,
|
|
358
|
+
ensuring type-safe access after validation.
|
|
359
|
+
|
|
360
|
+
Args:
|
|
361
|
+
value: The policy_type value to validate (string or enum).
|
|
362
|
+
|
|
363
|
+
Returns:
|
|
364
|
+
The validated policy_type as EnumPolicyType (strings are coerced).
|
|
365
|
+
|
|
366
|
+
Raises:
|
|
367
|
+
ValueError: If value is not a valid EnumPolicyType value.
|
|
368
|
+
|
|
369
|
+
Example:
|
|
370
|
+
>>> from omnibase_infra.utils import validate_policy_type_value
|
|
371
|
+
>>> from omnibase_infra.enums import EnumPolicyType
|
|
372
|
+
>>>
|
|
373
|
+
>>> # Valid: enum value returns as-is
|
|
374
|
+
>>> validate_policy_type_value(EnumPolicyType.ORCHESTRATOR)
|
|
375
|
+
<EnumPolicyType.ORCHESTRATOR: 'orchestrator'>
|
|
376
|
+
>>>
|
|
377
|
+
>>> # Valid: string value COERCED to enum
|
|
378
|
+
>>> validate_policy_type_value("reducer")
|
|
379
|
+
<EnumPolicyType.REDUCER: 'reducer'>
|
|
380
|
+
>>>
|
|
381
|
+
>>> # Invalid: unknown value
|
|
382
|
+
>>> validate_policy_type_value("invalid") # doctest: +ELLIPSIS
|
|
383
|
+
Traceback (most recent call last):
|
|
384
|
+
...
|
|
385
|
+
ValueError: policy_type must be one of ...
|
|
386
|
+
|
|
387
|
+
Usage in Pydantic model:
|
|
388
|
+
@field_validator("policy_type")
|
|
389
|
+
@classmethod
|
|
390
|
+
def validate_policy_type(cls, v: PolicyTypeInput) -> EnumPolicyType:
|
|
391
|
+
return validate_policy_type_value(v)
|
|
392
|
+
"""
|
|
393
|
+
from omnibase_infra.enums import EnumPolicyType
|
|
394
|
+
|
|
395
|
+
if isinstance(value, EnumPolicyType):
|
|
396
|
+
return value
|
|
397
|
+
# If it's a string, validate it's a valid EnumPolicyType value and coerce
|
|
398
|
+
valid_values = {e.value for e in EnumPolicyType}
|
|
399
|
+
if value not in valid_values:
|
|
400
|
+
raise ValueError(f"policy_type must be one of {valid_values}, got '{value}'")
|
|
401
|
+
return EnumPolicyType(value)
|
|
402
|
+
|
|
403
|
+
|
|
404
|
+
def validate_contract_type_value(
|
|
405
|
+
value: str | None,
|
|
406
|
+
) -> str | None:
|
|
407
|
+
"""Validate that a value is a valid contract type.
|
|
408
|
+
|
|
409
|
+
This is the SINGLE SOURCE OF TRUTH for contract type validation in
|
|
410
|
+
Pydantic field validators.
|
|
411
|
+
|
|
412
|
+
The special value 'unknown' is accepted for backfill scenarios but will
|
|
413
|
+
be rejected at persistence time unless explicitly permitted via the
|
|
414
|
+
`allow_unknown_backfill` flag.
|
|
415
|
+
|
|
416
|
+
Args:
|
|
417
|
+
value: The contract_type value to validate (or None).
|
|
418
|
+
|
|
419
|
+
Returns:
|
|
420
|
+
The validated value (unchanged if valid).
|
|
421
|
+
|
|
422
|
+
Raises:
|
|
423
|
+
ValueError: If value is not None and not a valid contract type or 'unknown'.
|
|
424
|
+
|
|
425
|
+
Example:
|
|
426
|
+
>>> from omnibase_infra.utils import validate_contract_type_value
|
|
427
|
+
>>>
|
|
428
|
+
>>> # Valid: standard contract types
|
|
429
|
+
>>> validate_contract_type_value("effect")
|
|
430
|
+
'effect'
|
|
431
|
+
>>> validate_contract_type_value("compute")
|
|
432
|
+
'compute'
|
|
433
|
+
>>>
|
|
434
|
+
>>> # Valid: None
|
|
435
|
+
>>> validate_contract_type_value(None) is None
|
|
436
|
+
True
|
|
437
|
+
>>>
|
|
438
|
+
>>> # Valid: 'unknown' for backfill
|
|
439
|
+
>>> validate_contract_type_value("unknown")
|
|
440
|
+
'unknown'
|
|
441
|
+
>>>
|
|
442
|
+
>>> # Invalid: unknown value
|
|
443
|
+
>>> validate_contract_type_value("invalid") # doctest: +ELLIPSIS
|
|
444
|
+
Traceback (most recent call last):
|
|
445
|
+
...
|
|
446
|
+
ValueError: contract_type must be one of ...
|
|
447
|
+
|
|
448
|
+
Usage in Pydantic model:
|
|
449
|
+
@field_validator("contract_type", mode="before")
|
|
450
|
+
@classmethod
|
|
451
|
+
def validate_contract_type(cls, v: str | None) -> str | None:
|
|
452
|
+
return validate_contract_type_value(v)
|
|
453
|
+
"""
|
|
454
|
+
if value is None:
|
|
455
|
+
return value
|
|
456
|
+
|
|
457
|
+
from omnibase_infra.enums import EnumContractType
|
|
458
|
+
|
|
459
|
+
# Allow 'unknown' for backfill scenarios (validated at persistence layer)
|
|
460
|
+
if value == EnumContractType.UNKNOWN.value:
|
|
461
|
+
return value
|
|
462
|
+
if value not in EnumContractType.valid_type_values():
|
|
463
|
+
raise ValueError(
|
|
464
|
+
f"contract_type must be one of {EnumContractType.valid_type_values()}, "
|
|
465
|
+
f"got: {value!r}"
|
|
466
|
+
)
|
|
467
|
+
return value
|
|
468
|
+
|
|
469
|
+
|
|
470
|
+
__all__: list[str] = [
|
|
471
|
+
"validate_contract_type_value",
|
|
472
|
+
"validate_endpoint_urls_dict",
|
|
473
|
+
"validate_policy_type_value",
|
|
474
|
+
"validate_pool_sizes_constraint",
|
|
475
|
+
"validate_timezone_aware_datetime",
|
|
476
|
+
"validate_timezone_aware_datetime_optional",
|
|
477
|
+
]
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""Semantic versioning validation utilities.
|
|
4
|
+
|
|
5
|
+
Provides reusable semver pattern and validators for ONEX models.
|
|
6
|
+
|
|
7
|
+
This module provides two validation approaches:
|
|
8
|
+
- validate_semver: Strict validation requiring full MAJOR.MINOR.PATCH format
|
|
9
|
+
- validate_version_lenient: Lenient validation accepting partial versions (1, 1.0, 1.0.0)
|
|
10
|
+
|
|
11
|
+
IMPORTANT: normalize_version() and normalize_version_cached() have been REMOVED.
|
|
12
|
+
Use ModelSemVer directly for all version handling:
|
|
13
|
+
|
|
14
|
+
from omnibase_core.models import ModelSemVer
|
|
15
|
+
|
|
16
|
+
# For structured creation:
|
|
17
|
+
version = ModelSemVer(major=1, minor=0, patch=0)
|
|
18
|
+
version_str = version.to_string() # "1.0.0"
|
|
19
|
+
|
|
20
|
+
# For parsing external input:
|
|
21
|
+
version = ModelSemVer.parse("1.0.0")
|
|
22
|
+
version_str = version.to_string()
|
|
23
|
+
|
|
24
|
+
Database Persistence (asyncpg):
|
|
25
|
+
When storing ModelSemVer values in databases (PostgreSQL via asyncpg), convert
|
|
26
|
+
to string using the built-in str() function or the to_string() method:
|
|
27
|
+
|
|
28
|
+
from omnibase_core.models import ModelSemVer
|
|
29
|
+
|
|
30
|
+
# Both of these produce "1.2.3":
|
|
31
|
+
version = ModelSemVer(major=1, minor=2, patch=3)
|
|
32
|
+
db_value = str(version) # Using str()
|
|
33
|
+
db_value = version.to_string() # Using method
|
|
34
|
+
|
|
35
|
+
# For asyncpg parameterized queries:
|
|
36
|
+
await conn.execute(
|
|
37
|
+
"INSERT INTO nodes (version) VALUES ($1)",
|
|
38
|
+
str(node_version), # Explicit string conversion required
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
# When reading back from database:
|
|
42
|
+
version = ModelSemVer.parse(row["version"])
|
|
43
|
+
|
|
44
|
+
Note: asyncpg requires explicit string conversion for custom types like
|
|
45
|
+
ModelSemVer. Always use str() when passing ModelSemVer to database queries.
|
|
46
|
+
See ProjectorRegistration.persist() and ProjectionReaderRegistration for
|
|
47
|
+
the canonical write/read patterns.
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
from __future__ import annotations
|
|
51
|
+
|
|
52
|
+
import re
|
|
53
|
+
|
|
54
|
+
# Semantic versioning pattern: MAJOR.MINOR.PATCH[-prerelease][+build]
|
|
55
|
+
# See: https://semver.org/
|
|
56
|
+
SEMVER_PATTERN = re.compile(r"^\d+\.\d+\.\d+(-[a-zA-Z0-9.-]+)?(\+[a-zA-Z0-9.-]+)?$")
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def validate_semver(v: str, field_name: str = "version") -> str:
|
|
60
|
+
"""Validate that a string follows strict semantic versioning format.
|
|
61
|
+
|
|
62
|
+
Requires full MAJOR.MINOR.PATCH format with optional prerelease and build metadata.
|
|
63
|
+
|
|
64
|
+
Args:
|
|
65
|
+
v: The version string to validate.
|
|
66
|
+
field_name: Name of the field for error messages (default: "version").
|
|
67
|
+
|
|
68
|
+
Returns:
|
|
69
|
+
The validated version string.
|
|
70
|
+
|
|
71
|
+
Raises:
|
|
72
|
+
ValueError: If the version string is not valid semver format.
|
|
73
|
+
|
|
74
|
+
Example:
|
|
75
|
+
>>> validate_semver("1.0.0")
|
|
76
|
+
'1.0.0'
|
|
77
|
+
>>> validate_semver("1.2.3-alpha")
|
|
78
|
+
'1.2.3-alpha'
|
|
79
|
+
>>> validate_semver("1.0") # Raises ValueError - too few components
|
|
80
|
+
"""
|
|
81
|
+
if not SEMVER_PATTERN.match(v):
|
|
82
|
+
raise ValueError(
|
|
83
|
+
f"Invalid semantic version '{v}'. "
|
|
84
|
+
"Expected format: MAJOR.MINOR.PATCH[-prerelease][+build]"
|
|
85
|
+
)
|
|
86
|
+
return v
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def validate_version_lenient(v: str) -> str:
|
|
90
|
+
"""Validate version format with lenient parsing.
|
|
91
|
+
|
|
92
|
+
Accepts flexible version formats including partial versions.
|
|
93
|
+
|
|
94
|
+
Accepted formats:
|
|
95
|
+
- "1" (major only)
|
|
96
|
+
- "1.0" (major.minor)
|
|
97
|
+
- "1.0.0" (major.minor.patch)
|
|
98
|
+
- "1.2.3-alpha" (with prerelease suffix)
|
|
99
|
+
- "1.2.3-beta.1" (with prerelease segments)
|
|
100
|
+
|
|
101
|
+
Args:
|
|
102
|
+
v: The version string to validate.
|
|
103
|
+
|
|
104
|
+
Returns:
|
|
105
|
+
The validated and stripped version string.
|
|
106
|
+
|
|
107
|
+
Raises:
|
|
108
|
+
ValueError: If version format is invalid:
|
|
109
|
+
- Empty or whitespace-only string
|
|
110
|
+
- Empty prerelease suffix after '-'
|
|
111
|
+
- More than 3 numeric components
|
|
112
|
+
- Empty component between dots
|
|
113
|
+
- Non-integer component
|
|
114
|
+
- Negative component value
|
|
115
|
+
|
|
116
|
+
Example:
|
|
117
|
+
>>> validate_version_lenient("1.0.0")
|
|
118
|
+
'1.0.0'
|
|
119
|
+
>>> validate_version_lenient("1.0")
|
|
120
|
+
'1.0'
|
|
121
|
+
>>> validate_version_lenient("1")
|
|
122
|
+
'1'
|
|
123
|
+
>>> validate_version_lenient("2.1.0-beta")
|
|
124
|
+
'2.1.0-beta'
|
|
125
|
+
>>> validate_version_lenient("") # Raises ValueError
|
|
126
|
+
>>> validate_version_lenient("1.2.3.4") # Raises ValueError - too many components
|
|
127
|
+
"""
|
|
128
|
+
if not v or not v.strip():
|
|
129
|
+
raise ValueError("Version cannot be empty")
|
|
130
|
+
|
|
131
|
+
v = v.strip()
|
|
132
|
+
|
|
133
|
+
# Split off prerelease suffix (e.g., "1.2.3-alpha" -> "1.2.3", "alpha")
|
|
134
|
+
version_part = v
|
|
135
|
+
if "-" in v:
|
|
136
|
+
version_part, prerelease = v.split("-", 1)
|
|
137
|
+
if not prerelease:
|
|
138
|
+
raise ValueError(
|
|
139
|
+
f"Invalid version '{v}': prerelease cannot be empty after '-'"
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
# Parse major.minor.patch components
|
|
143
|
+
parts = version_part.split(".")
|
|
144
|
+
if len(parts) < 1 or len(parts) > 3:
|
|
145
|
+
raise ValueError(f"Invalid version '{v}': expected format 'major.minor.patch'")
|
|
146
|
+
|
|
147
|
+
for part in parts:
|
|
148
|
+
if not part:
|
|
149
|
+
raise ValueError(f"Invalid version '{v}': empty component")
|
|
150
|
+
try:
|
|
151
|
+
num = int(part)
|
|
152
|
+
if num < 0:
|
|
153
|
+
raise ValueError(f"Invalid version '{v}': negative component")
|
|
154
|
+
except ValueError as e:
|
|
155
|
+
if "negative component" in str(e):
|
|
156
|
+
raise
|
|
157
|
+
raise ValueError(
|
|
158
|
+
f"Invalid version '{v}': non-integer component '{part}'"
|
|
159
|
+
) from None
|
|
160
|
+
|
|
161
|
+
return v
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def normalize_version(version: str, *, _emit_warning: bool = True) -> str:
|
|
165
|
+
"""REMOVED: String version normalization is no longer supported.
|
|
166
|
+
|
|
167
|
+
This function has been removed. Use ModelSemVer directly for all version handling.
|
|
168
|
+
|
|
169
|
+
Migration:
|
|
170
|
+
# Instead of:
|
|
171
|
+
version_str = normalize_version("1.0.0")
|
|
172
|
+
|
|
173
|
+
# Use ModelSemVer directly:
|
|
174
|
+
from omnibase_core.models import ModelSemVer
|
|
175
|
+
version = ModelSemVer(major=1, minor=0, patch=0)
|
|
176
|
+
version_str = version.to_string() # "1.0.0"
|
|
177
|
+
|
|
178
|
+
# Or for parsing external input:
|
|
179
|
+
version = ModelSemVer.parse("1.0.0")
|
|
180
|
+
version_str = version.to_string()
|
|
181
|
+
|
|
182
|
+
Args:
|
|
183
|
+
version: Not used - will raise TypeError immediately.
|
|
184
|
+
_emit_warning: Not used - will raise TypeError immediately.
|
|
185
|
+
|
|
186
|
+
Raises:
|
|
187
|
+
TypeError: Always raised. String version input is not allowed.
|
|
188
|
+
"""
|
|
189
|
+
raise TypeError(
|
|
190
|
+
"String version input is not allowed. "
|
|
191
|
+
"Use ModelSemVer(major=X, minor=Y, patch=Z) for structured version handling, "
|
|
192
|
+
"or ModelSemVer.parse() for external input."
|
|
193
|
+
)
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
def normalize_version_cached(version: str) -> str:
|
|
197
|
+
"""REMOVED: String version normalization is no longer supported.
|
|
198
|
+
|
|
199
|
+
This function has been removed. Use ModelSemVer directly for all version handling.
|
|
200
|
+
|
|
201
|
+
Migration:
|
|
202
|
+
# Instead of:
|
|
203
|
+
version_str = normalize_version_cached("1.0.0")
|
|
204
|
+
|
|
205
|
+
# Use ModelSemVer directly:
|
|
206
|
+
from omnibase_core.models import ModelSemVer
|
|
207
|
+
version = ModelSemVer(major=1, minor=0, patch=0)
|
|
208
|
+
version_str = version.to_string() # "1.0.0"
|
|
209
|
+
|
|
210
|
+
# Or for parsing external input:
|
|
211
|
+
version = ModelSemVer.parse("1.0.0")
|
|
212
|
+
version_str = version.to_string()
|
|
213
|
+
|
|
214
|
+
Args:
|
|
215
|
+
version: Not used - will raise TypeError immediately.
|
|
216
|
+
|
|
217
|
+
Raises:
|
|
218
|
+
TypeError: Always raised. String version input is not allowed.
|
|
219
|
+
"""
|
|
220
|
+
raise TypeError(
|
|
221
|
+
"String version input is not allowed. "
|
|
222
|
+
"Use ModelSemVer(major=X, minor=Y, patch=Z) for structured version handling, "
|
|
223
|
+
"or ModelSemVer.parse() for external input."
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
__all__: list[str] = [
|
|
228
|
+
"SEMVER_PATTERN",
|
|
229
|
+
"normalize_version",
|
|
230
|
+
"normalize_version_cached",
|
|
231
|
+
"validate_semver",
|
|
232
|
+
"validate_version_lenient",
|
|
233
|
+
]
|