omnibase_infra 0.2.6__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/adapters/adapter_onex_tool_execution.py +451 -0
- omnibase_infra/capabilities/__init__.py +15 -0
- omnibase_infra/capabilities/capability_inference_rules.py +211 -0
- omnibase_infra/capabilities/contract_capability_extractor.py +221 -0
- omnibase_infra/capabilities/intent_type_extractor.py +160 -0
- omnibase_infra/cli/__init__.py +1 -0
- omnibase_infra/cli/commands.py +216 -0
- omnibase_infra/clients/__init__.py +0 -0
- omnibase_infra/configs/widget_mapping.yaml +176 -0
- omnibase_infra/constants_topic_patterns.py +26 -0
- omnibase_infra/contracts/handlers/filesystem/handler_contract.yaml +264 -0
- omnibase_infra/contracts/handlers/mcp/handler_contract.yaml +141 -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 +132 -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_consumer_group_purpose.py +92 -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 +111 -0
- omnibase_infra/enums/enum_handler_loader_error.py +178 -0
- omnibase_infra/enums/enum_handler_source_mode.py +86 -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_kafka_acks.py +99 -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 +160 -0
- omnibase_infra/errors/error_architecture_violation.py +152 -0
- omnibase_infra/errors/error_binding_resolution.py +128 -0
- omnibase_infra/errors/error_chain_propagation.py +188 -0
- omnibase_infra/errors/error_compute_registry.py +95 -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 +105 -0
- omnibase_infra/errors/error_infra.py +610 -0
- omnibase_infra/errors/error_message_type_registry.py +101 -0
- omnibase_infra/errors/error_policy_registry.py +115 -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 +84 -0
- omnibase_infra/event_bus/event_bus_inmemory.py +797 -0
- omnibase_infra/event_bus/event_bus_kafka.py +1716 -0
- omnibase_infra/event_bus/mixin_kafka_broadcast.py +180 -0
- omnibase_infra/event_bus/mixin_kafka_dlq.py +771 -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 +693 -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/testing/__init__.py +26 -0
- omnibase_infra/event_bus/testing/adapter_protocol_event_publisher_inmemory.py +418 -0
- omnibase_infra/event_bus/testing/model_publisher_metrics.py +64 -0
- omnibase_infra/event_bus/topic_constants.py +376 -0
- omnibase_infra/handlers/__init__.py +82 -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 +795 -0
- omnibase_infra/handlers/handler_db.py +1046 -0
- omnibase_infra/handlers/handler_filesystem.py +1478 -0
- omnibase_infra/handlers/handler_graph.py +2015 -0
- omnibase_infra/handlers/handler_http.py +926 -0
- omnibase_infra/handlers/handler_intent.py +387 -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 +1430 -0
- omnibase_infra/handlers/handler_qdrant.py +1076 -0
- omnibase_infra/handlers/handler_vault.py +428 -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 +47 -0
- omnibase_infra/handlers/mixins/mixin_consul_initialization.py +349 -0
- omnibase_infra/handlers/mixins/mixin_consul_kv.py +338 -0
- omnibase_infra/handlers/mixins/mixin_consul_service.py +542 -0
- omnibase_infra/handlers/mixins/mixin_consul_topic_index.py +585 -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 +922 -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 +1051 -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 +109 -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/migrations/001_create_event_ledger.sql +166 -0
- omnibase_infra/migrations/001_drop_event_ledger.sql +18 -0
- omnibase_infra/mixins/__init__.py +71 -0
- omnibase_infra/mixins/mixin_async_circuit_breaker.py +656 -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 +2670 -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 +144 -0
- omnibase_infra/models/bindings/__init__.py +59 -0
- omnibase_infra/models/bindings/constants.py +144 -0
- omnibase_infra/models/bindings/model_binding_resolution_result.py +103 -0
- omnibase_infra/models/bindings/model_operation_binding.py +44 -0
- omnibase_infra/models/bindings/model_operation_bindings_subcontract.py +152 -0
- omnibase_infra/models/bindings/model_parsed_binding.py +52 -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 +330 -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 +155 -0
- omnibase_infra/models/dispatch/model_debug_trace_snapshot.py +114 -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_materialized_dispatch.py +141 -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 +80 -0
- omnibase_infra/models/handlers/model_bootstrap_handler_descriptor.py +162 -0
- omnibase_infra/models/handlers/model_contract_discovery_result.py +82 -0
- omnibase_infra/models/handlers/model_handler_descriptor.py +200 -0
- omnibase_infra/models/handlers/model_handler_identifier.py +215 -0
- omnibase_infra/models/handlers/model_handler_source_config.py +220 -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/mcp/__init__.py +15 -0
- omnibase_infra/models/mcp/model_mcp_contract_config.py +80 -0
- omnibase_infra/models/mcp/model_mcp_server_config.py +67 -0
- omnibase_infra/models/mcp/model_mcp_tool_definition.py +73 -0
- omnibase_infra/models/mcp/model_mcp_tool_parameter.py +35 -0
- omnibase_infra/models/model_node_identity.py +126 -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 +591 -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 +68 -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_event_bus_topic_entry.py +59 -0
- omnibase_infra/models/registration/model_introspection_metrics.py +253 -0
- omnibase_infra/models/registration/model_node_capabilities.py +190 -0
- omnibase_infra/models/registration/model_node_event_bus_config.py +99 -0
- omnibase_infra/models/registration/model_node_heartbeat_event.py +126 -0
- omnibase_infra/models/registration/model_node_introspection_event.py +195 -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 +49 -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 +296 -0
- omnibase_infra/models/runtime/model_loaded_handler.py +129 -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 +57 -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 +203 -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 +106 -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/contract_registry_reducer/__init__.py +29 -0
- omnibase_infra/nodes/contract_registry_reducer/contract.yaml +255 -0
- omnibase_infra/nodes/contract_registry_reducer/models/__init__.py +38 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_contract_registry_state.py +266 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_cleanup_topic_references.py +55 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_deactivate_contract.py +58 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_mark_stale.py +49 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_update_heartbeat.py +71 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_update_topic.py +66 -0
- omnibase_infra/nodes/contract_registry_reducer/models/model_payload_upsert_contract.py +92 -0
- omnibase_infra/nodes/contract_registry_reducer/node.py +121 -0
- omnibase_infra/nodes/contract_registry_reducer/reducer.py +784 -0
- omnibase_infra/nodes/contract_registry_reducer/registry/__init__.py +9 -0
- omnibase_infra/nodes/contract_registry_reducer/registry/registry_infra_contract_registry_reducer.py +101 -0
- omnibase_infra/nodes/effects/README.md +358 -0
- omnibase_infra/nodes/effects/__init__.py +26 -0
- omnibase_infra/nodes/effects/contract.yaml +167 -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/handlers/consul/contract.yaml +85 -0
- omnibase_infra/nodes/handlers/db/contract.yaml +72 -0
- omnibase_infra/nodes/handlers/graph/contract.yaml +127 -0
- omnibase_infra/nodes/handlers/http/contract.yaml +74 -0
- omnibase_infra/nodes/handlers/intent/contract.yaml +66 -0
- omnibase_infra/nodes/handlers/mcp/contract.yaml +69 -0
- omnibase_infra/nodes/handlers/vault/contract.yaml +91 -0
- omnibase_infra/nodes/node_intent_storage_effect/__init__.py +50 -0
- omnibase_infra/nodes/node_intent_storage_effect/contract.yaml +194 -0
- omnibase_infra/nodes/node_intent_storage_effect/models/__init__.py +24 -0
- omnibase_infra/nodes/node_intent_storage_effect/models/model_intent_storage_input.py +141 -0
- omnibase_infra/nodes/node_intent_storage_effect/models/model_intent_storage_output.py +130 -0
- omnibase_infra/nodes/node_intent_storage_effect/node.py +94 -0
- omnibase_infra/nodes/node_intent_storage_effect/registry/__init__.py +35 -0
- omnibase_infra/nodes/node_intent_storage_effect/registry/registry_infra_intent_storage.py +294 -0
- omnibase_infra/nodes/node_ledger_projection_compute/__init__.py +50 -0
- omnibase_infra/nodes/node_ledger_projection_compute/contract.yaml +104 -0
- omnibase_infra/nodes/node_ledger_projection_compute/node.py +284 -0
- omnibase_infra/nodes/node_ledger_projection_compute/registry/__init__.py +29 -0
- omnibase_infra/nodes/node_ledger_projection_compute/registry/registry_infra_ledger_projection.py +118 -0
- omnibase_infra/nodes/node_ledger_write_effect/__init__.py +82 -0
- omnibase_infra/nodes/node_ledger_write_effect/contract.yaml +200 -0
- omnibase_infra/nodes/node_ledger_write_effect/handlers/__init__.py +22 -0
- omnibase_infra/nodes/node_ledger_write_effect/handlers/handler_ledger_append.py +372 -0
- omnibase_infra/nodes/node_ledger_write_effect/handlers/handler_ledger_query.py +597 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/__init__.py +31 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_append_result.py +54 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_entry.py +92 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_query.py +53 -0
- omnibase_infra/nodes/node_ledger_write_effect/models/model_ledger_query_result.py +41 -0
- omnibase_infra/nodes/node_ledger_write_effect/node.py +89 -0
- omnibase_infra/nodes/node_ledger_write_effect/protocols/__init__.py +13 -0
- omnibase_infra/nodes/node_ledger_write_effect/protocols/protocol_ledger_persistence.py +127 -0
- omnibase_infra/nodes/node_ledger_write_effect/registry/__init__.py +9 -0
- omnibase_infra/nodes/node_ledger_write_effect/registry/registry_infra_ledger_write.py +121 -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 +482 -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 +694 -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 +528 -0
- omnibase_infra/nodes/node_registration_orchestrator/timeout_coordinator.py +393 -0
- omnibase_infra/nodes/node_registration_orchestrator/wiring.py +743 -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 +220 -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 +112 -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 +215 -0
- omnibase_infra/nodes/node_registry_effect/__init__.py +85 -0
- omnibase_infra/nodes/node_registry_effect/contract.yaml +677 -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 +417 -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 +222 -0
- omnibase_infra/nodes/reducers/__init__.py +30 -0
- omnibase_infra/nodes/reducers/models/__init__.py +37 -0
- omnibase_infra/nodes/reducers/models/model_payload_consul_register.py +87 -0
- omnibase_infra/nodes/reducers/models/model_payload_ledger_append.py +133 -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 +1138 -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 +449 -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 +104 -0
- omnibase_infra/protocols/protocol_capability_projection.py +253 -0
- omnibase_infra/protocols/protocol_capability_query.py +251 -0
- omnibase_infra/protocols/protocol_container_aware.py +200 -0
- omnibase_infra/protocols/protocol_dispatch_engine.py +152 -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 +445 -0
- omnibase_infra/runtime/binding_config_resolver.py +2771 -0
- omnibase_infra/runtime/binding_resolver.py +753 -0
- omnibase_infra/runtime/chain_aware_dispatch.py +467 -0
- omnibase_infra/runtime/constants_notification.py +75 -0
- omnibase_infra/runtime/constants_security.py +70 -0
- omnibase_infra/runtime/contract_handler_discovery.py +587 -0
- omnibase_infra/runtime/contract_loaders/__init__.py +51 -0
- omnibase_infra/runtime/contract_loaders/handler_routing_loader.py +464 -0
- omnibase_infra/runtime/contract_loaders/operation_bindings_loader.py +789 -0
- omnibase_infra/runtime/dispatch_context_enforcer.py +427 -0
- omnibase_infra/runtime/emit_daemon/__init__.py +97 -0
- omnibase_infra/runtime/emit_daemon/cli.py +844 -0
- omnibase_infra/runtime/emit_daemon/client.py +811 -0
- omnibase_infra/runtime/emit_daemon/config.py +535 -0
- omnibase_infra/runtime/emit_daemon/daemon.py +812 -0
- omnibase_infra/runtime/emit_daemon/event_registry.py +477 -0
- omnibase_infra/runtime/emit_daemon/model_daemon_request.py +139 -0
- omnibase_infra/runtime/emit_daemon/model_daemon_response.py +191 -0
- omnibase_infra/runtime/emit_daemon/queue.py +618 -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/event_bus_subcontract_wiring.py +466 -0
- omnibase_infra/runtime/handler_bootstrap_source.py +507 -0
- omnibase_infra/runtime/handler_contract_config_loader.py +603 -0
- omnibase_infra/runtime/handler_contract_source.py +750 -0
- omnibase_infra/runtime/handler_identity.py +81 -0
- omnibase_infra/runtime/handler_plugin_loader.py +2046 -0
- omnibase_infra/runtime/handler_registry.py +329 -0
- omnibase_infra/runtime/handler_source_resolver.py +367 -0
- omnibase_infra/runtime/invocation_security_enforcer.py +427 -0
- omnibase_infra/runtime/kafka_contract_source.py +984 -0
- omnibase_infra/runtime/kernel.py +40 -0
- omnibase_infra/runtime/mixin_policy_validation.py +522 -0
- omnibase_infra/runtime/mixin_semver_cache.py +402 -0
- omnibase_infra/runtime/mixins/__init__.py +24 -0
- omnibase_infra/runtime/mixins/mixin_projector_notification_publishing.py +566 -0
- omnibase_infra/runtime/mixins/mixin_projector_sql_operations.py +778 -0
- omnibase_infra/runtime/models/__init__.py +229 -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_contract_load_result.py +224 -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 +229 -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_notification_config.py +171 -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_contract_config.py +268 -0
- omnibase_infra/runtime/models/model_runtime_scheduler_config.py +625 -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_security_config.py +109 -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/models/model_transition_notification_outbox_config.py +112 -0
- omnibase_infra/runtime/models/model_transition_notification_outbox_metrics.py +140 -0
- omnibase_infra/runtime/models/model_transition_notification_publisher_metrics.py +357 -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 +1330 -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 +37 -0
- omnibase_infra/runtime/protocols/protocol_runtime_scheduler.py +468 -0
- omnibase_infra/runtime/publisher_topic_scoped.py +294 -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 +445 -0
- omnibase_infra/runtime/registry_compute.py +1143 -0
- omnibase_infra/runtime/registry_contract_source.py +693 -0
- omnibase_infra/runtime/registry_dispatcher.py +678 -0
- omnibase_infra/runtime/registry_policy.py +1185 -0
- omnibase_infra/runtime/runtime_contract_config_loader.py +406 -0
- omnibase_infra/runtime/runtime_scheduler.py +1070 -0
- omnibase_infra/runtime/secret_resolver.py +2112 -0
- omnibase_infra/runtime/security_metadata_validator.py +776 -0
- omnibase_infra/runtime/service_kernel.py +1651 -0
- omnibase_infra/runtime/service_message_dispatch_engine.py +2350 -0
- omnibase_infra/runtime/service_runtime_host_process.py +3493 -0
- omnibase_infra/runtime/transition_notification_outbox.py +1190 -0
- omnibase_infra/runtime/transition_notification_publisher.py +765 -0
- omnibase_infra/runtime/util_container_wiring.py +1124 -0
- omnibase_infra/runtime/util_validation.py +314 -0
- omnibase_infra/runtime/util_version.py +98 -0
- omnibase_infra/runtime/util_wiring.py +723 -0
- omnibase_infra/schemas/schema_registration_projection.sql +320 -0
- omnibase_infra/schemas/schema_transition_notification_outbox.sql +245 -0
- omnibase_infra/services/__init__.py +89 -0
- omnibase_infra/services/corpus_capture.py +684 -0
- omnibase_infra/services/mcp/__init__.py +31 -0
- omnibase_infra/services/mcp/mcp_server_lifecycle.py +449 -0
- omnibase_infra/services/mcp/service_mcp_tool_discovery.py +411 -0
- omnibase_infra/services/mcp/service_mcp_tool_registry.py +329 -0
- omnibase_infra/services/mcp/service_mcp_tool_sync.py +565 -0
- omnibase_infra/services/registry_api/__init__.py +40 -0
- omnibase_infra/services/registry_api/main.py +261 -0
- omnibase_infra/services/registry_api/models/__init__.py +66 -0
- omnibase_infra/services/registry_api/models/model_capability_widget_mapping.py +38 -0
- omnibase_infra/services/registry_api/models/model_pagination_info.py +48 -0
- omnibase_infra/services/registry_api/models/model_registry_discovery_response.py +73 -0
- omnibase_infra/services/registry_api/models/model_registry_health_response.py +49 -0
- omnibase_infra/services/registry_api/models/model_registry_instance_view.py +88 -0
- omnibase_infra/services/registry_api/models/model_registry_node_view.py +88 -0
- omnibase_infra/services/registry_api/models/model_registry_summary.py +60 -0
- omnibase_infra/services/registry_api/models/model_response_list_instances.py +43 -0
- omnibase_infra/services/registry_api/models/model_response_list_nodes.py +51 -0
- omnibase_infra/services/registry_api/models/model_warning.py +49 -0
- omnibase_infra/services/registry_api/models/model_widget_defaults.py +28 -0
- omnibase_infra/services/registry_api/models/model_widget_mapping.py +51 -0
- omnibase_infra/services/registry_api/routes.py +371 -0
- omnibase_infra/services/registry_api/service.py +837 -0
- omnibase_infra/services/service_capability_query.py +945 -0
- omnibase_infra/services/service_health.py +898 -0
- omnibase_infra/services/service_node_selector.py +530 -0
- omnibase_infra/services/service_timeout_emitter.py +699 -0
- omnibase_infra/services/service_timeout_scanner.py +394 -0
- omnibase_infra/services/session/__init__.py +56 -0
- omnibase_infra/services/session/config_consumer.py +137 -0
- omnibase_infra/services/session/config_store.py +139 -0
- omnibase_infra/services/session/consumer.py +1007 -0
- omnibase_infra/services/session/protocol_session_aggregator.py +117 -0
- omnibase_infra/services/session/store.py +997 -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/topics/__init__.py +45 -0
- omnibase_infra/topics/platform_topic_suffixes.py +140 -0
- omnibase_infra/topics/util_topic_composition.py +95 -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 +29 -0
- omnibase_infra/types/typed_dict/typed_dict_envelope_build_params.py +115 -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 +117 -0
- omnibase_infra/utils/correlation.py +208 -0
- omnibase_infra/utils/util_atomic_file.py +261 -0
- omnibase_infra/utils/util_consumer_group.py +232 -0
- omnibase_infra/utils/util_datetime.py +372 -0
- omnibase_infra/utils/util_db_transaction.py +239 -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_retry_optimistic.py +281 -0
- omnibase_infra/utils/util_semver.py +233 -0
- omnibase_infra/validation/__init__.py +307 -0
- omnibase_infra/validation/contracts/security.validation.yaml +114 -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 +1514 -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 +2033 -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 +513 -0
- omnibase_infra/validation/validator_topic_category.py +1152 -0
- omnibase_infra-0.2.6.dist-info/METADATA +197 -0
- omnibase_infra-0.2.6.dist-info/RECORD +833 -0
- omnibase_infra-0.2.6.dist-info/WHEEL +4 -0
- omnibase_infra-0.2.6.dist-info/entry_points.txt +5 -0
- omnibase_infra-0.2.6.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,715 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""AST-based Any Type Validator for ONEX Strong Typing Policy.
|
|
4
|
+
|
|
5
|
+
This module provides static analysis validation to detect improper Any type usage
|
|
6
|
+
following the ONEX ADR policy:
|
|
7
|
+
|
|
8
|
+
- Any is BLOCKED in function signatures (parameters, return types)
|
|
9
|
+
- Any is ALLOWED only in Pydantic Field() definitions WITH required NOTE comment
|
|
10
|
+
- All other Any usage is BLOCKED
|
|
11
|
+
|
|
12
|
+
The validator uses Python AST to detect forbidden patterns without runtime execution.
|
|
13
|
+
|
|
14
|
+
Exemption Mechanisms:
|
|
15
|
+
1. ``@allow_any`` decorator on function/class
|
|
16
|
+
2. ``ONEX_EXCLUDE: any_type`` comment (applies to that line and the next 5 lines)
|
|
17
|
+
3. ``NOTE:`` comment within 5 lines before Any usage (for Field() only)
|
|
18
|
+
|
|
19
|
+
Limitations:
|
|
20
|
+
This validator uses AST-based static analysis with inherent limitations:
|
|
21
|
+
|
|
22
|
+
**Detection Capabilities**:
|
|
23
|
+
- Direct Any type annotations in function parameters and return types
|
|
24
|
+
- Any in Pydantic Field() definitions with or without NOTE comments
|
|
25
|
+
- Any in variable annotations and type aliases
|
|
26
|
+
- Any as generic type argument (e.g., list[Any], dict[str, Any])
|
|
27
|
+
|
|
28
|
+
**Known Limitations**:
|
|
29
|
+
- Cannot detect dynamically constructed types or factory patterns
|
|
30
|
+
- Cannot follow imports to resolve types from other modules
|
|
31
|
+
- Cannot detect Any usage via type aliases from external modules
|
|
32
|
+
- String annotations (e.g., ``"Any"``) are not detected
|
|
33
|
+
|
|
34
|
+
Usage:
|
|
35
|
+
>>> from omnibase_infra.validation.validator_any_type import (
|
|
36
|
+
... validate_any_types,
|
|
37
|
+
... validate_any_types_ci,
|
|
38
|
+
... )
|
|
39
|
+
>>> violations = validate_any_types(Path("src/handlers"))
|
|
40
|
+
>>> result = validate_any_types_ci(Path("src/handlers"))
|
|
41
|
+
>>> if not result.passed:
|
|
42
|
+
... print(f"Found {result.blocking_count} blocking violations")
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
from __future__ import annotations
|
|
46
|
+
|
|
47
|
+
import ast
|
|
48
|
+
import logging
|
|
49
|
+
from pathlib import Path
|
|
50
|
+
|
|
51
|
+
from omnibase_infra.enums import EnumAnyTypeViolation, EnumValidationSeverity
|
|
52
|
+
from omnibase_infra.models.validation.model_any_type_validation_result import (
|
|
53
|
+
ModelAnyTypeValidationResult,
|
|
54
|
+
)
|
|
55
|
+
from omnibase_infra.models.validation.model_any_type_violation import (
|
|
56
|
+
ModelAnyTypeViolation,
|
|
57
|
+
)
|
|
58
|
+
from omnibase_infra.types import ASTFunctionDef
|
|
59
|
+
from omnibase_infra.validation.mixin_any_type_classification import (
|
|
60
|
+
MixinAnyTypeClassification,
|
|
61
|
+
)
|
|
62
|
+
from omnibase_infra.validation.mixin_any_type_exemption import MixinAnyTypeExemption
|
|
63
|
+
from omnibase_infra.validation.mixin_any_type_reporting import MixinAnyTypeReporting
|
|
64
|
+
|
|
65
|
+
logger = logging.getLogger(__name__)
|
|
66
|
+
|
|
67
|
+
# Comment patterns for exemptions
|
|
68
|
+
_ONEX_EXCLUDE_PATTERN = "ONEX_EXCLUDE:"
|
|
69
|
+
_ONEX_EXCLUDE_ANY_TYPE = "any_type"
|
|
70
|
+
|
|
71
|
+
# Maximum file size to process (in bytes).
|
|
72
|
+
# Files larger than this are skipped to prevent hangs on auto-generated
|
|
73
|
+
# or minified code. 1MB is sufficient for any reasonable hand-written Python.
|
|
74
|
+
_MAX_FILE_SIZE_BYTES: int = 1_000_000 # 1MB
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
class AnyTypeDetector(
|
|
78
|
+
MixinAnyTypeClassification,
|
|
79
|
+
MixinAnyTypeExemption,
|
|
80
|
+
MixinAnyTypeReporting,
|
|
81
|
+
ast.NodeVisitor,
|
|
82
|
+
):
|
|
83
|
+
"""AST visitor to detect Any type usage violations.
|
|
84
|
+
|
|
85
|
+
This visitor walks the AST and identifies Any type annotations that
|
|
86
|
+
violate the ONEX strong typing policy. It supports exemption via
|
|
87
|
+
decorators and comments.
|
|
88
|
+
|
|
89
|
+
The class is composed of mixins to keep method count manageable:
|
|
90
|
+
- MixinAnyTypeClassification: Type classification helpers
|
|
91
|
+
- MixinAnyTypeExemption: Exemption management (decorators, NOTE comments)
|
|
92
|
+
- MixinAnyTypeReporting: Violation reporting
|
|
93
|
+
|
|
94
|
+
Attributes:
|
|
95
|
+
filepath: Path to the file being analyzed.
|
|
96
|
+
source_lines: List of source code lines for extracting snippets.
|
|
97
|
+
violations: List of detected violations.
|
|
98
|
+
allowed_lines: Set of line numbers exempted via decorator or comment.
|
|
99
|
+
in_field_context: Flag indicating we're inside a Field() call.
|
|
100
|
+
current_function: Name of the current function being visited.
|
|
101
|
+
current_class: Name of the current class being visited.
|
|
102
|
+
has_file_level_note: Whether file has NOTE comment near Any import.
|
|
103
|
+
"""
|
|
104
|
+
|
|
105
|
+
def __init__(self, filepath: str, source_lines: list[str]) -> None:
|
|
106
|
+
"""Initialize the detector.
|
|
107
|
+
|
|
108
|
+
Args:
|
|
109
|
+
filepath: Path to the file being analyzed.
|
|
110
|
+
source_lines: List of source code lines for snippet extraction.
|
|
111
|
+
"""
|
|
112
|
+
self.filepath = filepath
|
|
113
|
+
self.source_lines = source_lines
|
|
114
|
+
self.violations: list[ModelAnyTypeViolation] = []
|
|
115
|
+
self.allowed_lines: set[int] = set()
|
|
116
|
+
self.in_field_context: bool = False
|
|
117
|
+
self.current_function: str = ""
|
|
118
|
+
self.current_class: str = ""
|
|
119
|
+
self.has_file_level_note: bool = self._check_file_level_note()
|
|
120
|
+
|
|
121
|
+
def visit_ClassDef(self, node: ast.ClassDef) -> None:
|
|
122
|
+
"""Visit a class definition.
|
|
123
|
+
|
|
124
|
+
Checks for @allow_any decorator and processes class body.
|
|
125
|
+
"""
|
|
126
|
+
if self._has_allow_decorator(node.decorator_list):
|
|
127
|
+
self._allow_all_lines_in_node(node)
|
|
128
|
+
|
|
129
|
+
old_class = self.current_class
|
|
130
|
+
self.current_class = node.name
|
|
131
|
+
self.generic_visit(node)
|
|
132
|
+
self.current_class = old_class
|
|
133
|
+
|
|
134
|
+
def visit_FunctionDef(self, node: ast.FunctionDef) -> None:
|
|
135
|
+
"""Visit a function definition."""
|
|
136
|
+
self._check_function_def(node)
|
|
137
|
+
|
|
138
|
+
def visit_AsyncFunctionDef(self, node: ast.AsyncFunctionDef) -> None:
|
|
139
|
+
"""Visit an async function definition."""
|
|
140
|
+
self._check_function_def(node)
|
|
141
|
+
|
|
142
|
+
def _check_function_def(self, node: ASTFunctionDef) -> None:
|
|
143
|
+
"""Check a function definition for Any type violations.
|
|
144
|
+
|
|
145
|
+
Checks:
|
|
146
|
+
- @allow_any decorator
|
|
147
|
+
- Parameter type annotations
|
|
148
|
+
- Return type annotation
|
|
149
|
+
|
|
150
|
+
Args:
|
|
151
|
+
node: The function definition AST node.
|
|
152
|
+
"""
|
|
153
|
+
if self._has_allow_decorator(node.decorator_list):
|
|
154
|
+
self._allow_all_lines_in_node(node)
|
|
155
|
+
self.generic_visit(node)
|
|
156
|
+
return
|
|
157
|
+
|
|
158
|
+
old_function = self.current_function
|
|
159
|
+
self.current_function = node.name
|
|
160
|
+
|
|
161
|
+
# Check parameter annotations
|
|
162
|
+
for arg in node.args.args + node.args.posonlyargs + node.args.kwonlyargs:
|
|
163
|
+
if arg.annotation is not None:
|
|
164
|
+
self._check_annotation_for_any(
|
|
165
|
+
arg.annotation,
|
|
166
|
+
EnumAnyTypeViolation.FUNCTION_PARAMETER,
|
|
167
|
+
context_name=f"{self.current_function}({arg.arg})",
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
# Check *args and **kwargs
|
|
171
|
+
if node.args.vararg and node.args.vararg.annotation:
|
|
172
|
+
self._check_annotation_for_any(
|
|
173
|
+
node.args.vararg.annotation,
|
|
174
|
+
EnumAnyTypeViolation.FUNCTION_PARAMETER,
|
|
175
|
+
context_name=f"{self.current_function}(*{node.args.vararg.arg})",
|
|
176
|
+
)
|
|
177
|
+
if node.args.kwarg and node.args.kwarg.annotation:
|
|
178
|
+
self._check_annotation_for_any(
|
|
179
|
+
node.args.kwarg.annotation,
|
|
180
|
+
EnumAnyTypeViolation.FUNCTION_PARAMETER,
|
|
181
|
+
context_name=f"{self.current_function}(**{node.args.kwarg.arg})",
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
# Check return type annotation
|
|
185
|
+
if node.returns is not None:
|
|
186
|
+
self._check_annotation_for_any(
|
|
187
|
+
node.returns,
|
|
188
|
+
EnumAnyTypeViolation.RETURN_TYPE,
|
|
189
|
+
context_name=self.current_function,
|
|
190
|
+
)
|
|
191
|
+
|
|
192
|
+
self.generic_visit(node)
|
|
193
|
+
self.current_function = old_function
|
|
194
|
+
|
|
195
|
+
def visit_AnnAssign(self, node: ast.AnnAssign) -> None:
|
|
196
|
+
"""Visit an annotated assignment (type annotation).
|
|
197
|
+
|
|
198
|
+
Handles:
|
|
199
|
+
- Variable annotations: ``x: Any = value``
|
|
200
|
+
- Class attributes: ``attr: Any``
|
|
201
|
+
- Type aliases: ``TypeAlias = Any`` (via TypeAlias annotation)
|
|
202
|
+
- Pydantic Field() with Any (requires NOTE comment)
|
|
203
|
+
"""
|
|
204
|
+
if node.lineno in self.allowed_lines:
|
|
205
|
+
self.generic_visit(node)
|
|
206
|
+
return
|
|
207
|
+
|
|
208
|
+
# Determine context name
|
|
209
|
+
context_name = ""
|
|
210
|
+
if isinstance(node.target, ast.Name):
|
|
211
|
+
context_name = node.target.id
|
|
212
|
+
|
|
213
|
+
# Check if this is a Pydantic Field() with potential NOTE comment
|
|
214
|
+
is_field_with_note = self._is_field_with_note(node)
|
|
215
|
+
|
|
216
|
+
if is_field_with_note:
|
|
217
|
+
# Field() with NOTE comment is allowed - skip
|
|
218
|
+
self.generic_visit(node)
|
|
219
|
+
return
|
|
220
|
+
|
|
221
|
+
# Check if this is a Field() call without proper NOTE
|
|
222
|
+
# This is a special case - report FIELD_MISSING_NOTE instead of other types
|
|
223
|
+
is_field_without_note = (
|
|
224
|
+
node.value is not None
|
|
225
|
+
and self._is_field_call(node.value)
|
|
226
|
+
and self._contains_any(node.annotation)
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
if is_field_without_note:
|
|
230
|
+
# Find accurate column for Any token, fall back to node start
|
|
231
|
+
any_col = self._find_any_col(node.annotation)
|
|
232
|
+
self._add_violation(
|
|
233
|
+
node.lineno,
|
|
234
|
+
any_col if any_col is not None else node.col_offset,
|
|
235
|
+
EnumAnyTypeViolation.FIELD_MISSING_NOTE,
|
|
236
|
+
context_name=context_name,
|
|
237
|
+
)
|
|
238
|
+
self.generic_visit(node)
|
|
239
|
+
return
|
|
240
|
+
|
|
241
|
+
# Check if this is a type alias
|
|
242
|
+
is_type_alias = self._is_type_alias_annotation(node)
|
|
243
|
+
|
|
244
|
+
# For type aliases, check the VALUE for Any (e.g., ConfigType: TypeAlias = dict[str, Any])
|
|
245
|
+
if is_type_alias and node.value is not None:
|
|
246
|
+
if self._contains_any(node.value):
|
|
247
|
+
# Find accurate column for Any token, fall back to node start
|
|
248
|
+
any_col = self._find_any_col(node.value)
|
|
249
|
+
self._add_violation(
|
|
250
|
+
node.lineno,
|
|
251
|
+
any_col if any_col is not None else node.col_offset,
|
|
252
|
+
EnumAnyTypeViolation.TYPE_ALIAS,
|
|
253
|
+
context_name=context_name,
|
|
254
|
+
)
|
|
255
|
+
self.generic_visit(node)
|
|
256
|
+
return
|
|
257
|
+
|
|
258
|
+
# Determine violation type for non-type-alias cases
|
|
259
|
+
if self.current_class and not self.current_function:
|
|
260
|
+
# Class attribute (not in a method)
|
|
261
|
+
violation_type = EnumAnyTypeViolation.CLASS_ATTRIBUTE
|
|
262
|
+
else:
|
|
263
|
+
violation_type = EnumAnyTypeViolation.VARIABLE_ANNOTATION
|
|
264
|
+
|
|
265
|
+
# Check the annotation
|
|
266
|
+
self._check_annotation_for_any(
|
|
267
|
+
node.annotation,
|
|
268
|
+
violation_type,
|
|
269
|
+
context_name=context_name,
|
|
270
|
+
)
|
|
271
|
+
|
|
272
|
+
self.generic_visit(node)
|
|
273
|
+
|
|
274
|
+
def visit_Assign(self, node: ast.Assign) -> None:
|
|
275
|
+
"""Visit a regular assignment to detect type alias patterns.
|
|
276
|
+
|
|
277
|
+
Handles patterns like: ``JsonType = dict[str, Any]``
|
|
278
|
+
"""
|
|
279
|
+
if node.lineno in self.allowed_lines:
|
|
280
|
+
self.generic_visit(node)
|
|
281
|
+
return
|
|
282
|
+
|
|
283
|
+
# Check if this looks like a type alias (PascalCase name or ends with Type)
|
|
284
|
+
for target in node.targets:
|
|
285
|
+
if isinstance(target, ast.Name):
|
|
286
|
+
name = target.id
|
|
287
|
+
# Type aliases typically use PascalCase or end with "Type"
|
|
288
|
+
if self._is_likely_type_alias_name(name):
|
|
289
|
+
# Check if the value contains Any
|
|
290
|
+
if self._contains_any(node.value):
|
|
291
|
+
# Find accurate column for Any token, fall back to node start
|
|
292
|
+
any_col = self._find_any_col(node.value)
|
|
293
|
+
self._add_violation(
|
|
294
|
+
node.lineno,
|
|
295
|
+
any_col if any_col is not None else node.col_offset,
|
|
296
|
+
EnumAnyTypeViolation.TYPE_ALIAS,
|
|
297
|
+
context_name=name,
|
|
298
|
+
)
|
|
299
|
+
|
|
300
|
+
self.generic_visit(node)
|
|
301
|
+
|
|
302
|
+
def visit_Subscript(self, node: ast.Subscript) -> None:
|
|
303
|
+
"""Visit a subscript expression to detect Any in generic arguments.
|
|
304
|
+
|
|
305
|
+
Handles patterns like: list[Any], dict[str, Any], Optional[Any]
|
|
306
|
+
"""
|
|
307
|
+
# This is handled within _check_annotation_for_any via recursion
|
|
308
|
+
self.generic_visit(node)
|
|
309
|
+
|
|
310
|
+
def _check_annotation_for_any(
|
|
311
|
+
self,
|
|
312
|
+
annotation: ast.expr,
|
|
313
|
+
violation_type: EnumAnyTypeViolation,
|
|
314
|
+
context_name: str = "",
|
|
315
|
+
) -> None:
|
|
316
|
+
"""Check an annotation expression for Any usage.
|
|
317
|
+
|
|
318
|
+
Recursively checks the annotation for Any type references,
|
|
319
|
+
including in generic type arguments.
|
|
320
|
+
|
|
321
|
+
Args:
|
|
322
|
+
annotation: The AST expression representing the annotation.
|
|
323
|
+
violation_type: The type of violation to report if Any is found.
|
|
324
|
+
context_name: Context identifier (function/variable name).
|
|
325
|
+
"""
|
|
326
|
+
if annotation.lineno in self.allowed_lines:
|
|
327
|
+
return
|
|
328
|
+
|
|
329
|
+
# Direct Any reference
|
|
330
|
+
if isinstance(annotation, ast.Name) and annotation.id == "Any":
|
|
331
|
+
self._add_violation(
|
|
332
|
+
annotation.lineno,
|
|
333
|
+
annotation.col_offset,
|
|
334
|
+
violation_type,
|
|
335
|
+
context_name=context_name,
|
|
336
|
+
)
|
|
337
|
+
return
|
|
338
|
+
|
|
339
|
+
# Attribute access (typing.Any)
|
|
340
|
+
if isinstance(annotation, ast.Attribute) and annotation.attr == "Any":
|
|
341
|
+
self._add_violation(
|
|
342
|
+
annotation.lineno,
|
|
343
|
+
annotation.col_offset,
|
|
344
|
+
violation_type,
|
|
345
|
+
context_name=context_name,
|
|
346
|
+
)
|
|
347
|
+
return
|
|
348
|
+
|
|
349
|
+
# Generic subscript (list[Any], dict[str, Any], Optional[Any], Union[..., Any])
|
|
350
|
+
if isinstance(annotation, ast.Subscript):
|
|
351
|
+
self._check_subscript_for_any(annotation, context_name)
|
|
352
|
+
return
|
|
353
|
+
|
|
354
|
+
# BinOp for union syntax (X | Any)
|
|
355
|
+
if isinstance(annotation, ast.BinOp):
|
|
356
|
+
self._check_annotation_for_any(
|
|
357
|
+
annotation.left,
|
|
358
|
+
EnumAnyTypeViolation.GENERIC_ARGUMENT,
|
|
359
|
+
context_name=context_name,
|
|
360
|
+
)
|
|
361
|
+
self._check_annotation_for_any(
|
|
362
|
+
annotation.right,
|
|
363
|
+
EnumAnyTypeViolation.GENERIC_ARGUMENT,
|
|
364
|
+
context_name=context_name,
|
|
365
|
+
)
|
|
366
|
+
|
|
367
|
+
def _check_subscript_for_any(
|
|
368
|
+
self,
|
|
369
|
+
node: ast.Subscript,
|
|
370
|
+
context_name: str,
|
|
371
|
+
) -> None:
|
|
372
|
+
"""Check a subscript expression for Any in type arguments.
|
|
373
|
+
|
|
374
|
+
Args:
|
|
375
|
+
node: The subscript AST node.
|
|
376
|
+
context_name: Context identifier (function/variable name).
|
|
377
|
+
"""
|
|
378
|
+
# Check the slice (type arguments)
|
|
379
|
+
slice_node = node.slice
|
|
380
|
+
|
|
381
|
+
if isinstance(slice_node, ast.Tuple):
|
|
382
|
+
# Multiple type arguments: dict[str, Any]
|
|
383
|
+
for elt in slice_node.elts:
|
|
384
|
+
self._check_annotation_for_any(
|
|
385
|
+
elt,
|
|
386
|
+
EnumAnyTypeViolation.GENERIC_ARGUMENT,
|
|
387
|
+
context_name=context_name,
|
|
388
|
+
)
|
|
389
|
+
else:
|
|
390
|
+
# Single type argument: list[Any], Optional[Any]
|
|
391
|
+
self._check_annotation_for_any(
|
|
392
|
+
slice_node,
|
|
393
|
+
EnumAnyTypeViolation.GENERIC_ARGUMENT,
|
|
394
|
+
context_name=context_name,
|
|
395
|
+
)
|
|
396
|
+
|
|
397
|
+
def _contains_any(self, node: ast.expr) -> bool:
|
|
398
|
+
"""Check if an annotation contains Any type.
|
|
399
|
+
|
|
400
|
+
Args:
|
|
401
|
+
node: The AST expression to check.
|
|
402
|
+
|
|
403
|
+
Returns:
|
|
404
|
+
True if Any is found anywhere in the annotation.
|
|
405
|
+
"""
|
|
406
|
+
if isinstance(node, ast.Name) and node.id == "Any":
|
|
407
|
+
return True
|
|
408
|
+
if isinstance(node, ast.Attribute) and node.attr == "Any":
|
|
409
|
+
return True
|
|
410
|
+
if isinstance(node, ast.Subscript):
|
|
411
|
+
slice_node = node.slice
|
|
412
|
+
if isinstance(slice_node, ast.Tuple):
|
|
413
|
+
return any(self._contains_any(elt) for elt in slice_node.elts)
|
|
414
|
+
return self._contains_any(slice_node)
|
|
415
|
+
if isinstance(node, ast.BinOp):
|
|
416
|
+
return self._contains_any(node.left) or self._contains_any(node.right)
|
|
417
|
+
return False
|
|
418
|
+
|
|
419
|
+
def _find_any_col(self, node: ast.expr) -> int | None:
|
|
420
|
+
"""Find the column offset of the first Any token in an expression.
|
|
421
|
+
|
|
422
|
+
Walks the annotation/value AST recursively to find an ast.Name node
|
|
423
|
+
with id == "Any" and returns its col_offset. This provides accurate
|
|
424
|
+
column reporting for CI annotations.
|
|
425
|
+
|
|
426
|
+
Args:
|
|
427
|
+
node: The AST expression to search.
|
|
428
|
+
|
|
429
|
+
Returns:
|
|
430
|
+
The column offset of the Any token, or None if not found.
|
|
431
|
+
"""
|
|
432
|
+
if isinstance(node, ast.Name) and node.id == "Any":
|
|
433
|
+
return node.col_offset
|
|
434
|
+
if isinstance(node, ast.Attribute) and node.attr == "Any":
|
|
435
|
+
return node.col_offset
|
|
436
|
+
if isinstance(node, ast.Subscript):
|
|
437
|
+
slice_node = node.slice
|
|
438
|
+
if isinstance(slice_node, ast.Tuple):
|
|
439
|
+
for elt in slice_node.elts:
|
|
440
|
+
result = self._find_any_col(elt)
|
|
441
|
+
if result is not None:
|
|
442
|
+
return result
|
|
443
|
+
else:
|
|
444
|
+
return self._find_any_col(slice_node)
|
|
445
|
+
if isinstance(node, ast.BinOp):
|
|
446
|
+
left_result = self._find_any_col(node.left)
|
|
447
|
+
if left_result is not None:
|
|
448
|
+
return left_result
|
|
449
|
+
return self._find_any_col(node.right)
|
|
450
|
+
return None
|
|
451
|
+
|
|
452
|
+
|
|
453
|
+
def _find_onex_exclude_lines(content: str) -> set[int]:
|
|
454
|
+
"""Find lines exempted via ONEX_EXCLUDE: any_type comments.
|
|
455
|
+
|
|
456
|
+
The exemption applies to the comment line and the next 5 lines (to cover
|
|
457
|
+
multi-line signatures such as function definitions that span multiple lines).
|
|
458
|
+
|
|
459
|
+
Args:
|
|
460
|
+
content: Source file content.
|
|
461
|
+
|
|
462
|
+
Returns:
|
|
463
|
+
Set of line numbers that are exempted.
|
|
464
|
+
"""
|
|
465
|
+
excluded_lines: set[int] = set()
|
|
466
|
+
lines = content.split("\n")
|
|
467
|
+
|
|
468
|
+
for i, line in enumerate(lines, start=1):
|
|
469
|
+
if _ONEX_EXCLUDE_PATTERN in line and _ONEX_EXCLUDE_ANY_TYPE in line:
|
|
470
|
+
# Exclude this line and the next 5 lines
|
|
471
|
+
for offset in range(6):
|
|
472
|
+
excluded_lines.add(i + offset)
|
|
473
|
+
|
|
474
|
+
return excluded_lines
|
|
475
|
+
|
|
476
|
+
|
|
477
|
+
def validate_any_types_in_file(filepath: Path) -> list[ModelAnyTypeViolation]:
|
|
478
|
+
"""Validate a single Python file for Any type violations.
|
|
479
|
+
|
|
480
|
+
Args:
|
|
481
|
+
filepath: Path to the Python file to validate.
|
|
482
|
+
|
|
483
|
+
Returns:
|
|
484
|
+
List of detected violations. Empty list if no violations found.
|
|
485
|
+
For syntax errors, returns a single SYNTAX_ERROR violation.
|
|
486
|
+
"""
|
|
487
|
+
try:
|
|
488
|
+
content = filepath.read_text(encoding="utf-8")
|
|
489
|
+
except OSError as e:
|
|
490
|
+
logger.warning(
|
|
491
|
+
"Failed to read file",
|
|
492
|
+
extra={"file": str(filepath), "error": str(e)},
|
|
493
|
+
)
|
|
494
|
+
return []
|
|
495
|
+
|
|
496
|
+
# Find lines excluded via ONEX_EXCLUDE comments
|
|
497
|
+
excluded_lines = _find_onex_exclude_lines(content)
|
|
498
|
+
|
|
499
|
+
try:
|
|
500
|
+
tree = ast.parse(content, filename=str(filepath))
|
|
501
|
+
except SyntaxError as e:
|
|
502
|
+
logger.warning(
|
|
503
|
+
"Syntax error in file",
|
|
504
|
+
extra={"file": str(filepath), "error": str(e)},
|
|
505
|
+
)
|
|
506
|
+
return [
|
|
507
|
+
ModelAnyTypeViolation(
|
|
508
|
+
file_path=filepath,
|
|
509
|
+
line_number=e.lineno or 1,
|
|
510
|
+
column=0 if e.offset is None else e.offset,
|
|
511
|
+
violation_type=EnumAnyTypeViolation.SYNTAX_ERROR,
|
|
512
|
+
code_snippet=f"Syntax error: {e.msg}",
|
|
513
|
+
suggestion=EnumAnyTypeViolation.SYNTAX_ERROR.suggestion,
|
|
514
|
+
severity=EnumValidationSeverity.ERROR,
|
|
515
|
+
context_name="",
|
|
516
|
+
)
|
|
517
|
+
]
|
|
518
|
+
|
|
519
|
+
source_lines = content.split("\n")
|
|
520
|
+
detector = AnyTypeDetector(str(filepath.resolve()), source_lines)
|
|
521
|
+
detector.allowed_lines.update(excluded_lines)
|
|
522
|
+
detector.visit(tree)
|
|
523
|
+
|
|
524
|
+
return detector.violations
|
|
525
|
+
|
|
526
|
+
|
|
527
|
+
# Directories to skip for Any type validation (exact name matching).
|
|
528
|
+
# Uses frozenset for O(1) lookup performance.
|
|
529
|
+
# NOTE: "tests" is included because test files are allowed to use Any types.
|
|
530
|
+
# This differs from the general skip directories in infra_validators.py.
|
|
531
|
+
_ANY_TYPE_SKIP_DIRECTORIES: frozenset[str] = frozenset(
|
|
532
|
+
{
|
|
533
|
+
"tests", # Test files are allowed to use Any types
|
|
534
|
+
"archive", # Historical code not subject to validation
|
|
535
|
+
"archived", # Alternative naming for archived code
|
|
536
|
+
"__pycache__", # Python bytecode cache
|
|
537
|
+
}
|
|
538
|
+
)
|
|
539
|
+
|
|
540
|
+
|
|
541
|
+
def _should_skip_file(filepath: Path) -> bool:
|
|
542
|
+
"""Check if a file should be skipped based on exact directory name matching.
|
|
543
|
+
|
|
544
|
+
Uses exact parent directory matching (not substring) to prevent false positives.
|
|
545
|
+
For example, '/my_tests/foo.py' is NOT skipped because 'my_tests' != 'tests'.
|
|
546
|
+
|
|
547
|
+
Matching behavior:
|
|
548
|
+
- Only parent directories are checked (filenames are NOT checked against skip list)
|
|
549
|
+
- Matching is case-sensitive (Linux standard)
|
|
550
|
+
- A path is skipped if ANY parent directory matches exactly
|
|
551
|
+
|
|
552
|
+
Args:
|
|
553
|
+
filepath: Path to check.
|
|
554
|
+
|
|
555
|
+
Returns:
|
|
556
|
+
True if the file should be skipped.
|
|
557
|
+
|
|
558
|
+
Examples:
|
|
559
|
+
Paths that ARE skipped (exact directory match):
|
|
560
|
+
>>> _should_skip_file(Path("src/tests/foo.py"))
|
|
561
|
+
True
|
|
562
|
+
>>> _should_skip_file(Path("src/archive/foo.py"))
|
|
563
|
+
True
|
|
564
|
+
|
|
565
|
+
Paths that are NOT skipped (no false positives):
|
|
566
|
+
>>> _should_skip_file(Path("src/my_tests/foo.py"))
|
|
567
|
+
False
|
|
568
|
+
>>> _should_skip_file(Path("src/testing_utils/foo.py"))
|
|
569
|
+
False
|
|
570
|
+
"""
|
|
571
|
+
parts = filepath.parts
|
|
572
|
+
|
|
573
|
+
# Check parent directories for exact matches (exclude filename at parts[-1])
|
|
574
|
+
for part in parts[:-1]:
|
|
575
|
+
if part in _ANY_TYPE_SKIP_DIRECTORIES:
|
|
576
|
+
return True
|
|
577
|
+
|
|
578
|
+
# Special case: skip files in scripts/validation/ nested path.
|
|
579
|
+
# This specifically targets validation test scripts, not the validation module itself.
|
|
580
|
+
# Checks for exact sequence: "scripts" followed immediately by "validation".
|
|
581
|
+
for i, part in enumerate(parts[:-1]):
|
|
582
|
+
if (
|
|
583
|
+
part == "scripts"
|
|
584
|
+
and i + 1 < len(parts) - 1
|
|
585
|
+
and parts[i + 1] == "validation"
|
|
586
|
+
):
|
|
587
|
+
return True
|
|
588
|
+
|
|
589
|
+
# Skip files starting with underscore (test fixtures, private modules)
|
|
590
|
+
if filepath.name.startswith("_"):
|
|
591
|
+
return True
|
|
592
|
+
|
|
593
|
+
return False
|
|
594
|
+
|
|
595
|
+
|
|
596
|
+
def validate_any_types(
|
|
597
|
+
directory: Path, recursive: bool = True
|
|
598
|
+
) -> list[ModelAnyTypeViolation]:
|
|
599
|
+
"""Validate all Python files in a directory for Any type violations.
|
|
600
|
+
|
|
601
|
+
This is the main entry point for batch validation.
|
|
602
|
+
|
|
603
|
+
Args:
|
|
604
|
+
directory: Path to the directory to validate.
|
|
605
|
+
recursive: If True, recursively validate subdirectories.
|
|
606
|
+
|
|
607
|
+
Returns:
|
|
608
|
+
List of all detected violations across all files.
|
|
609
|
+
|
|
610
|
+
Example:
|
|
611
|
+
>>> violations = validate_any_types(Path("src/handlers"))
|
|
612
|
+
>>> for v in violations:
|
|
613
|
+
... print(v.format_human_readable())
|
|
614
|
+
"""
|
|
615
|
+
violations: list[ModelAnyTypeViolation] = []
|
|
616
|
+
pattern = "**/*.py" if recursive else "*.py"
|
|
617
|
+
|
|
618
|
+
for filepath in directory.glob(pattern):
|
|
619
|
+
if filepath.is_file() and not _should_skip_file(filepath):
|
|
620
|
+
# Skip very large files to prevent hangs on auto-generated code
|
|
621
|
+
try:
|
|
622
|
+
file_size = filepath.stat().st_size
|
|
623
|
+
if file_size > _MAX_FILE_SIZE_BYTES:
|
|
624
|
+
logger.debug(
|
|
625
|
+
"Skipping large file",
|
|
626
|
+
extra={"file": str(filepath), "size_bytes": file_size},
|
|
627
|
+
)
|
|
628
|
+
continue
|
|
629
|
+
except OSError as e:
|
|
630
|
+
logger.warning(
|
|
631
|
+
"Failed to stat file",
|
|
632
|
+
extra={"file": str(filepath), "error": str(e)},
|
|
633
|
+
)
|
|
634
|
+
continue
|
|
635
|
+
|
|
636
|
+
try:
|
|
637
|
+
file_violations = validate_any_types_in_file(filepath)
|
|
638
|
+
violations.extend(file_violations)
|
|
639
|
+
except Exception as e: # catch-all-ok: validation continues on file errors
|
|
640
|
+
logger.warning(
|
|
641
|
+
"Failed to validate file",
|
|
642
|
+
extra={
|
|
643
|
+
"file": str(filepath),
|
|
644
|
+
"error_type": type(e).__name__,
|
|
645
|
+
"error": str(e),
|
|
646
|
+
},
|
|
647
|
+
)
|
|
648
|
+
continue
|
|
649
|
+
|
|
650
|
+
return violations
|
|
651
|
+
|
|
652
|
+
|
|
653
|
+
def validate_any_types_ci(
|
|
654
|
+
directory: Path,
|
|
655
|
+
recursive: bool = True,
|
|
656
|
+
) -> ModelAnyTypeValidationResult:
|
|
657
|
+
"""CI gate for Any type validation.
|
|
658
|
+
|
|
659
|
+
This function is designed for CI pipeline integration. It returns a
|
|
660
|
+
structured result model containing the pass/fail status and all violations
|
|
661
|
+
for reporting.
|
|
662
|
+
|
|
663
|
+
Args:
|
|
664
|
+
directory: Path to the directory to validate.
|
|
665
|
+
recursive: If True, recursively validate subdirectories.
|
|
666
|
+
|
|
667
|
+
Returns:
|
|
668
|
+
ModelAnyTypeValidationResult containing pass/fail status and violations.
|
|
669
|
+
|
|
670
|
+
Example:
|
|
671
|
+
>>> result = validate_any_types_ci(Path("src/handlers"))
|
|
672
|
+
>>> if not result.passed:
|
|
673
|
+
... for line in result.format_for_ci():
|
|
674
|
+
... print(line)
|
|
675
|
+
... sys.exit(1)
|
|
676
|
+
"""
|
|
677
|
+
# Count files (excluding skipped patterns and large files)
|
|
678
|
+
pattern = "**/*.py" if recursive else "*.py"
|
|
679
|
+
files_checked = sum(
|
|
680
|
+
1
|
|
681
|
+
for f in directory.glob(pattern)
|
|
682
|
+
if f.is_file()
|
|
683
|
+
and not _should_skip_file(f)
|
|
684
|
+
and f.stat().st_size <= _MAX_FILE_SIZE_BYTES
|
|
685
|
+
)
|
|
686
|
+
|
|
687
|
+
violations = validate_any_types(directory, recursive=recursive)
|
|
688
|
+
return ModelAnyTypeValidationResult.from_violations(violations, files_checked)
|
|
689
|
+
|
|
690
|
+
|
|
691
|
+
def _print_fix_instructions() -> None:
|
|
692
|
+
"""Print instructions for fixing Any type violations."""
|
|
693
|
+
print("\nHow to fix Any type violations:")
|
|
694
|
+
print(" 1. Replace Any with specific types (object, Union, Protocol)")
|
|
695
|
+
print(" 2. For Pydantic models with JSON data, add NOTE comment:")
|
|
696
|
+
print(" field: Any = Field(...) # NOTE: Using Any for JSON payload")
|
|
697
|
+
print(" 3. Use @allow_any decorator if exemption is truly needed")
|
|
698
|
+
print(" 4. Add ONEX_EXCLUDE: any_type comment for legacy code")
|
|
699
|
+
print("\n Example fixes:")
|
|
700
|
+
print(" BAD: def process(data: Any) -> Any:")
|
|
701
|
+
print(" GOOD: def process(data: object) -> ModelResult:")
|
|
702
|
+
print(" GOOD: def process(data: JsonType) -> ModelResult:")
|
|
703
|
+
|
|
704
|
+
|
|
705
|
+
# Module-level singleton validator is not needed for this validator
|
|
706
|
+
# since validation is stateless (each file is parsed independently)
|
|
707
|
+
|
|
708
|
+
__all__ = [
|
|
709
|
+
"AnyTypeDetector",
|
|
710
|
+
"ModelAnyTypeValidationResult",
|
|
711
|
+
"ModelAnyTypeViolation",
|
|
712
|
+
"validate_any_types",
|
|
713
|
+
"validate_any_types_ci",
|
|
714
|
+
"validate_any_types_in_file",
|
|
715
|
+
]
|