tasker-engine 1.0.0
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.
- checksums.yaml +7 -0
- data/LICENSE +22 -0
- data/README.md +443 -0
- data/Rakefile +10 -0
- data/app/controllers/tasker/analytics_controller.rb +179 -0
- data/app/controllers/tasker/application_controller.rb +45 -0
- data/app/controllers/tasker/graphql_controller.rb +193 -0
- data/app/controllers/tasker/handlers_controller.rb +217 -0
- data/app/controllers/tasker/health_controller.rb +229 -0
- data/app/controllers/tasker/metrics_controller.rb +111 -0
- data/app/controllers/tasker/page_sort.rb +97 -0
- data/app/controllers/tasker/task_diagrams_controller.rb +30 -0
- data/app/controllers/tasker/tasks_controller.rb +123 -0
- data/app/controllers/tasker/workflow_steps_controller.rb +69 -0
- data/app/graphql/examples/all_tasks.graphql +22 -0
- data/app/graphql/examples/pending_tasks.graphql +23 -0
- data/app/graphql/tasker/graph_ql_types/annotation_type.rb +14 -0
- data/app/graphql/tasker/graph_ql_types/base_argument.rb +9 -0
- data/app/graphql/tasker/graph_ql_types/base_connection.rb +11 -0
- data/app/graphql/tasker/graph_ql_types/base_edge.rb +10 -0
- data/app/graphql/tasker/graph_ql_types/base_enum.rb +9 -0
- data/app/graphql/tasker/graph_ql_types/base_field.rb +10 -0
- data/app/graphql/tasker/graph_ql_types/base_input_object.rb +10 -0
- data/app/graphql/tasker/graph_ql_types/base_interface.rb +14 -0
- data/app/graphql/tasker/graph_ql_types/base_object.rb +10 -0
- data/app/graphql/tasker/graph_ql_types/base_scalar.rb +9 -0
- data/app/graphql/tasker/graph_ql_types/base_union.rb +11 -0
- data/app/graphql/tasker/graph_ql_types/dependent_system_object_map_type.rb +18 -0
- data/app/graphql/tasker/graph_ql_types/dependent_system_type.rb +13 -0
- data/app/graphql/tasker/graph_ql_types/mutation_type.rb +16 -0
- data/app/graphql/tasker/graph_ql_types/named_step_type.rb +16 -0
- data/app/graphql/tasker/graph_ql_types/named_task_type.rb +14 -0
- data/app/graphql/tasker/graph_ql_types/named_tasks_named_step_type.rb +19 -0
- data/app/graphql/tasker/graph_ql_types/node_type.rb +12 -0
- data/app/graphql/tasker/graph_ql_types/query_type.rb +20 -0
- data/app/graphql/tasker/graph_ql_types/task_annotation_type.rb +17 -0
- data/app/graphql/tasker/graph_ql_types/task_interface.rb +17 -0
- data/app/graphql/tasker/graph_ql_types/task_type.rb +26 -0
- data/app/graphql/tasker/graph_ql_types/workflow_step_type.rb +154 -0
- data/app/graphql/tasker/graph_ql_types.rb +42 -0
- data/app/graphql/tasker/mutations/base_mutation.rb +13 -0
- data/app/graphql/tasker/mutations/cancel_step.rb +29 -0
- data/app/graphql/tasker/mutations/cancel_task.rb +29 -0
- data/app/graphql/tasker/mutations/create_task.rb +52 -0
- data/app/graphql/tasker/mutations/update_step.rb +36 -0
- data/app/graphql/tasker/mutations/update_task.rb +41 -0
- data/app/graphql/tasker/queries/all_annotation_types.rb +17 -0
- data/app/graphql/tasker/queries/all_tasks.rb +23 -0
- data/app/graphql/tasker/queries/base_query.rb +9 -0
- data/app/graphql/tasker/queries/helpers.rb +16 -0
- data/app/graphql/tasker/queries/one_step.rb +24 -0
- data/app/graphql/tasker/queries/one_task.rb +18 -0
- data/app/graphql/tasker/queries/tasks_by_annotation.rb +31 -0
- data/app/graphql/tasker/queries/tasks_by_status.rb +30 -0
- data/app/graphql/tasker/tasker_rails_schema.rb +52 -0
- data/app/jobs/tasker/application_job.rb +8 -0
- data/app/jobs/tasker/metrics_export_job.rb +252 -0
- data/app/jobs/tasker/task_runner_job.rb +224 -0
- data/app/models/tasker/annotation_type.rb +26 -0
- data/app/models/tasker/application_record.rb +70 -0
- data/app/models/tasker/dependent_system.rb +26 -0
- data/app/models/tasker/dependent_system_object_map.rb +64 -0
- data/app/models/tasker/diagram/edge.rb +106 -0
- data/app/models/tasker/diagram/flowchart.rb +137 -0
- data/app/models/tasker/diagram/node.rb +99 -0
- data/app/models/tasker/named_step.rb +41 -0
- data/app/models/tasker/named_task.rb +121 -0
- data/app/models/tasker/named_tasks_named_step.rb +82 -0
- data/app/models/tasker/step_dag_relationship.rb +65 -0
- data/app/models/tasker/step_readiness_status.rb +59 -0
- data/app/models/tasker/task.rb +424 -0
- data/app/models/tasker/task_annotation.rb +36 -0
- data/app/models/tasker/task_diagram.rb +332 -0
- data/app/models/tasker/task_execution_context.rb +29 -0
- data/app/models/tasker/task_namespace.rb +41 -0
- data/app/models/tasker/task_transition.rb +235 -0
- data/app/models/tasker/workflow_step.rb +461 -0
- data/app/models/tasker/workflow_step_edge.rb +94 -0
- data/app/models/tasker/workflow_step_transition.rb +434 -0
- data/app/serializers/tasker/annotation_type_serializer.rb +8 -0
- data/app/serializers/tasker/handler_serializer.rb +109 -0
- data/app/serializers/tasker/task_annotation_serializer.rb +32 -0
- data/app/serializers/tasker/task_serializer.rb +168 -0
- data/app/serializers/tasker/workflow_step_serializer.rb +27 -0
- data/app/services/tasker/analytics_service.rb +409 -0
- data/app/views/tasker/task/_diagram.html.erb +32 -0
- data/config/initializers/dry_struct.rb +11 -0
- data/config/initializers/statesman.rb +6 -0
- data/config/initializers/tasker_orchestration.rb +17 -0
- data/config/initializers/time_formats.rb +4 -0
- data/config/routes.rb +34 -0
- data/config/tasker/subscriptions/example_integrations.yml +67 -0
- data/config/tasker/system_events.yml +305 -0
- data/db/functions/calculate_dependency_levels_v01.sql +45 -0
- data/db/functions/get_analytics_metrics_v01.sql +137 -0
- data/db/functions/get_slowest_steps_v01.sql +82 -0
- data/db/functions/get_slowest_tasks_v01.sql +96 -0
- data/db/functions/get_step_readiness_status_batch_v01.sql +140 -0
- data/db/functions/get_step_readiness_status_v01.sql +139 -0
- data/db/functions/get_system_health_counts_v01.sql +108 -0
- data/db/functions/get_task_execution_context_v01.sql +108 -0
- data/db/functions/get_task_execution_contexts_batch_v01.sql +104 -0
- data/db/init/schema.sql +2277 -0
- data/db/migrate/20250701165431_initial_tasker_schema.rb +116 -0
- data/db/views/tasker_step_dag_relationships_v01.sql +69 -0
- data/docs/APPLICATION_GENERATOR.md +384 -0
- data/docs/AUTH.md +1780 -0
- data/docs/CIRCUIT_BREAKER.md +224 -0
- data/docs/DEVELOPER_GUIDE.md +2665 -0
- data/docs/EVENT_SYSTEM.md +637 -0
- data/docs/EXECUTION_CONFIGURATION.md +341 -0
- data/docs/FLOW_CHART.md +149 -0
- data/docs/HEALTH.md +542 -0
- data/docs/METRICS.md +731 -0
- data/docs/OPTIMIZATION_PLAN.md +1479 -0
- data/docs/OVERVIEW.md +552 -0
- data/docs/QUICK_START.md +270 -0
- data/docs/REGISTRY_SYSTEMS.md +373 -0
- data/docs/REST_API.md +632 -0
- data/docs/ROADMAP.md +221 -0
- data/docs/SQL_FUNCTIONS.md +1408 -0
- data/docs/TASK_DIAGRAM.md +252 -0
- data/docs/TASK_EXECUTION_CONTROL_FLOW.md +237 -0
- data/docs/TELEMETRY.md +795 -0
- data/docs/TROUBLESHOOTING.md +756 -0
- data/docs/TaskHandlerGenerator.html +255 -0
- data/docs/Tasker/Analysis/RuntimeGraphAnalyzer.html +907 -0
- data/docs/Tasker/Analysis/TemplateGraphAnalyzer.html +1236 -0
- data/docs/Tasker/Analysis.html +117 -0
- data/docs/Tasker/AnalyticsController.html +450 -0
- data/docs/Tasker/AnalyticsService/BottleneckAnalytics.html +816 -0
- data/docs/Tasker/AnalyticsService/PerformanceAnalytics.html +586 -0
- data/docs/Tasker/AnalyticsService.html +2221 -0
- data/docs/Tasker/AnnotationType.html +137 -0
- data/docs/Tasker/AnnotationTypeSerializer.html +124 -0
- data/docs/Tasker/ApplicationController.html +147 -0
- data/docs/Tasker/ApplicationJob.html +128 -0
- data/docs/Tasker/ApplicationRecord.html +378 -0
- data/docs/Tasker/Authentication/AuthenticationError.html +124 -0
- data/docs/Tasker/Authentication/ConfigurationError.html +124 -0
- data/docs/Tasker/Authentication/Coordinator.html +242 -0
- data/docs/Tasker/Authentication/Interface.html +560 -0
- data/docs/Tasker/Authentication/InterfaceError.html +124 -0
- data/docs/Tasker/Authentication/NoneAuthenticator.html +338 -0
- data/docs/Tasker/Authentication.html +119 -0
- data/docs/Tasker/Authorization/AuthorizationError.html +139 -0
- data/docs/Tasker/Authorization/BaseCoordinator.html +927 -0
- data/docs/Tasker/Authorization/ConfigurationError.html +153 -0
- data/docs/Tasker/Authorization/ResourceConstants/ACTIONS.html +428 -0
- data/docs/Tasker/Authorization/ResourceConstants/RESOURCES.html +365 -0
- data/docs/Tasker/Authorization/ResourceConstants.html +146 -0
- data/docs/Tasker/Authorization/ResourceRegistry.html +882 -0
- data/docs/Tasker/Authorization/UnauthorizedError.html +153 -0
- data/docs/Tasker/Authorization.html +582 -0
- data/docs/Tasker/CacheCapabilities.html +167 -0
- data/docs/Tasker/CacheStrategy.html +1297 -0
- data/docs/Tasker/Concerns/Authenticatable.html +116 -0
- data/docs/Tasker/Concerns/Authorizable/AdminStatusChecker.html +256 -0
- data/docs/Tasker/Concerns/Authorizable.html +816 -0
- data/docs/Tasker/Concerns/ControllerAuthorizable.html +157 -0
- data/docs/Tasker/Concerns/EventPublisher.html +4023 -0
- data/docs/Tasker/Concerns/IdempotentStateTransitions.html +806 -0
- data/docs/Tasker/Concerns/LifecycleEventHelpers.html +129 -0
- data/docs/Tasker/Concerns/OrchestrationPublisher.html +129 -0
- data/docs/Tasker/Concerns/StateMachineBase/ClassMethods.html +1075 -0
- data/docs/Tasker/Concerns/StateMachineBase/StateMachineBase/ClassMethods.html +191 -0
- data/docs/Tasker/Concerns/StateMachineBase/StateMachineBase.html +126 -0
- data/docs/Tasker/Concerns/StateMachineBase.html +153 -0
- data/docs/Tasker/Concerns/StructuredLogging.html +1413 -0
- data/docs/Tasker/Concerns.html +117 -0
- data/docs/Tasker/Configuration/AuthConfiguration.html +1023 -0
- data/docs/Tasker/Configuration/ConfigurationProxy.html +581 -0
- data/docs/Tasker/Configuration/DatabaseConfiguration.html +475 -0
- data/docs/Tasker/Configuration/EngineConfiguration.html +1265 -0
- data/docs/Tasker/Configuration/HealthConfiguration.html +791 -0
- data/docs/Tasker/Configuration/TelemetryConfiguration.html +1308 -0
- data/docs/Tasker/Configuration/TelemetryConfigurationProxy.html +388 -0
- data/docs/Tasker/Configuration.html +1669 -0
- data/docs/Tasker/ConfigurationError.html +143 -0
- data/docs/Tasker/ConfiguredTask.html +514 -0
- data/docs/Tasker/Constants/EventDefinitions.html +590 -0
- data/docs/Tasker/Constants/LifecycleEvents.html +137 -0
- data/docs/Tasker/Constants/ObservabilityEvents/Step.html +152 -0
- data/docs/Tasker/Constants/ObservabilityEvents/Task.html +142 -0
- data/docs/Tasker/Constants/ObservabilityEvents.html +126 -0
- data/docs/Tasker/Constants/RegistryEvents.html +285 -0
- data/docs/Tasker/Constants/StepEvents.html +177 -0
- data/docs/Tasker/Constants/TaskEvents.html +167 -0
- data/docs/Tasker/Constants/TaskExecution/ExecutionStatus.html +207 -0
- data/docs/Tasker/Constants/TaskExecution/HealthStatus.html +191 -0
- data/docs/Tasker/Constants/TaskExecution/RecommendedAction.html +207 -0
- data/docs/Tasker/Constants/TaskExecution.html +126 -0
- data/docs/Tasker/Constants/TaskFinalization/ErrorMessages.html +132 -0
- data/docs/Tasker/Constants/TaskFinalization/PendingReasons.html +207 -0
- data/docs/Tasker/Constants/TaskFinalization/ReenqueueReasons.html +239 -0
- data/docs/Tasker/Constants/TaskFinalization.html +126 -0
- data/docs/Tasker/Constants/TaskStatuses.html +223 -0
- data/docs/Tasker/Constants/TestEvents.html +163 -0
- data/docs/Tasker/Constants/WorkflowEvents.html +222 -0
- data/docs/Tasker/Constants/WorkflowStepStatuses.html +223 -0
- data/docs/Tasker/Constants.html +561 -0
- data/docs/Tasker/DependentSystem.html +137 -0
- data/docs/Tasker/DependentSystemObjectMap.html +250 -0
- data/docs/Tasker/DetectorRegistry.html +598 -0
- data/docs/Tasker/Diagram/Edge.html +1191 -0
- data/docs/Tasker/Diagram/Flowchart.html +1539 -0
- data/docs/Tasker/Diagram/Node.html +1165 -0
- data/docs/Tasker/Diagram.html +117 -0
- data/docs/Tasker/Engine.html +215 -0
- data/docs/Tasker/Error.html +139 -0
- data/docs/Tasker/Events/Bus.html +1226 -0
- data/docs/Tasker/Events/Catalog/CatalogPrinter.html +258 -0
- data/docs/Tasker/Events/Catalog/CustomEventRegistrar.html +276 -0
- data/docs/Tasker/Events/Catalog/ExamplePayloadGenerator.html +294 -0
- data/docs/Tasker/Events/Catalog.html +1291 -0
- data/docs/Tasker/Events/CustomRegistry.html +943 -0
- data/docs/Tasker/Events/DefinitionLoader.html +575 -0
- data/docs/Tasker/Events/EventPayloadBuilder/ErrorInfoExtractor.html +286 -0
- data/docs/Tasker/Events/EventPayloadBuilder/StepPayloadBuilder.html +312 -0
- data/docs/Tasker/Events/EventPayloadBuilder.html +664 -0
- data/docs/Tasker/Events/Publisher.html +365 -0
- data/docs/Tasker/Events/Subscribers/BaseSubscriber/ErrorCategorizer/ErrorTypeClassifier.html +1128 -0
- data/docs/Tasker/Events/Subscribers/BaseSubscriber/ErrorCategorizer.html +270 -0
- data/docs/Tasker/Events/Subscribers/BaseSubscriber/MetricTagsExtractor.html +266 -0
- data/docs/Tasker/Events/Subscribers/BaseSubscriber.html +2556 -0
- data/docs/Tasker/Events/Subscribers/MetricsSubscriber.html +723 -0
- data/docs/Tasker/Events/Subscribers/TelemetrySubscriber.html +2251 -0
- data/docs/Tasker/Events/Subscribers.html +117 -0
- data/docs/Tasker/Events/SubscriptionLoader.html +493 -0
- data/docs/Tasker/Events.html +294 -0
- data/docs/Tasker/EventsGenerator.html +459 -0
- data/docs/Tasker/Functions/FunctionBasedAnalyticsMetrics/AnalyticsMetrics.html +135 -0
- data/docs/Tasker/Functions/FunctionBasedAnalyticsMetrics.html +412 -0
- data/docs/Tasker/Functions/FunctionBasedDependencyLevels.html +598 -0
- data/docs/Tasker/Functions/FunctionBasedSlowestSteps/SlowestStep.html +135 -0
- data/docs/Tasker/Functions/FunctionBasedSlowestSteps.html +453 -0
- data/docs/Tasker/Functions/FunctionBasedSlowestTasks/SlowestTask.html +135 -0
- data/docs/Tasker/Functions/FunctionBasedSlowestTasks.html +453 -0
- data/docs/Tasker/Functions/FunctionBasedStepReadinessStatus.html +1457 -0
- data/docs/Tasker/Functions/FunctionBasedSystemHealthCounts/HealthMetrics.html +135 -0
- data/docs/Tasker/Functions/FunctionBasedSystemHealthCounts.html +370 -0
- data/docs/Tasker/Functions/FunctionBasedTaskExecutionContext.html +1250 -0
- data/docs/Tasker/Functions/FunctionWrapper.html +479 -0
- data/docs/Tasker/Functions.html +117 -0
- data/docs/Tasker/Generators/AuthenticatorGenerator/UsageInstructionsFormatter.html +244 -0
- data/docs/Tasker/Generators/AuthenticatorGenerator.html +373 -0
- data/docs/Tasker/Generators/AuthorizationCoordinatorGenerator.html +430 -0
- data/docs/Tasker/Generators/SubscriberGenerator.html +377 -0
- data/docs/Tasker/Generators/TaskHandlerGenerator.html +263 -0
- data/docs/Tasker/Generators.html +117 -0
- data/docs/Tasker/GraphQLTypes/AnnotationType.html +132 -0
- data/docs/Tasker/GraphQLTypes/BaseArgument.html +124 -0
- data/docs/Tasker/GraphQLTypes/BaseConnection.html +124 -0
- data/docs/Tasker/GraphQLTypes/BaseEdge.html +130 -0
- data/docs/Tasker/GraphQLTypes/BaseEnum.html +124 -0
- data/docs/Tasker/GraphQLTypes/BaseField.html +124 -0
- data/docs/Tasker/GraphQLTypes/BaseInputObject.html +124 -0
- data/docs/Tasker/GraphQLTypes/BaseInterface.html +116 -0
- data/docs/Tasker/GraphQLTypes/BaseObject.html +128 -0
- data/docs/Tasker/GraphQLTypes/BaseScalar.html +124 -0
- data/docs/Tasker/GraphQLTypes/BaseUnion.html +124 -0
- data/docs/Tasker/GraphQLTypes/DependentSystemObjectMapType.html +132 -0
- data/docs/Tasker/GraphQLTypes/DependentSystemType.html +132 -0
- data/docs/Tasker/GraphQLTypes/MutationType.html +132 -0
- data/docs/Tasker/GraphQLTypes/NamedStepType.html +132 -0
- data/docs/Tasker/GraphQLTypes/NamedTaskType.html +132 -0
- data/docs/Tasker/GraphQLTypes/NamedTasksNamedStepType.html +132 -0
- data/docs/Tasker/GraphQLTypes/NodeType.html +118 -0
- data/docs/Tasker/GraphQLTypes/QueryType.html +139 -0
- data/docs/Tasker/GraphQLTypes/TaskAnnotationType.html +132 -0
- data/docs/Tasker/GraphQLTypes/TaskInterface.html +111 -0
- data/docs/Tasker/GraphQLTypes/TaskType.html +201 -0
- data/docs/Tasker/GraphQLTypes/WorkflowStepType.html +694 -0
- data/docs/Tasker/GraphQLTypes.html +130 -0
- data/docs/Tasker/GraphqlController.html +251 -0
- data/docs/Tasker/HandlerFactory.html +1518 -0
- data/docs/Tasker/HandlerSerializer.html +682 -0
- data/docs/Tasker/HandlersController.html +574 -0
- data/docs/Tasker/HashIdentityStrategy.html +278 -0
- data/docs/Tasker/Health/ReadinessChecker.html +712 -0
- data/docs/Tasker/Health/StatusChecker.html +653 -0
- data/docs/Tasker/Health.html +117 -0
- data/docs/Tasker/HealthController.html +523 -0
- data/docs/Tasker/IdentityStrategy.html +276 -0
- data/docs/Tasker/InvalidTaskHandlerConfig.html +135 -0
- data/docs/Tasker/LifecycleEvents/Events/Step.html +162 -0
- data/docs/Tasker/LifecycleEvents/Events/Task.html +162 -0
- data/docs/Tasker/LifecycleEvents/Events.html +204 -0
- data/docs/Tasker/LifecycleEvents/Publisher.html +132 -0
- data/docs/Tasker/LifecycleEvents.html +799 -0
- data/docs/Tasker/Logging/CorrelationIdGenerator.html +688 -0
- data/docs/Tasker/Logging.html +115 -0
- data/docs/Tasker/MetricsController.html +293 -0
- data/docs/Tasker/MetricsExportJob.html +414 -0
- data/docs/Tasker/Mutations/BaseMutation.html +128 -0
- data/docs/Tasker/Mutations/CancelStep.html +219 -0
- data/docs/Tasker/Mutations/CancelTask.html +221 -0
- data/docs/Tasker/Mutations/CreateTask.html +243 -0
- data/docs/Tasker/Mutations/UpdateStep.html +243 -0
- data/docs/Tasker/Mutations/UpdateTask.html +243 -0
- data/docs/Tasker/Mutations.html +117 -0
- data/docs/Tasker/NamedStep.html +216 -0
- data/docs/Tasker/NamedTask.html +910 -0
- data/docs/Tasker/NamedTasksNamedStep.html +435 -0
- data/docs/Tasker/Orchestration/BackoffCalculator.html +404 -0
- data/docs/Tasker/Orchestration/ConnectionBuilder/ConfigValidator.html +258 -0
- data/docs/Tasker/Orchestration/ConnectionBuilder.html +435 -0
- data/docs/Tasker/Orchestration/ConnectionPoolIntelligence.html +513 -0
- data/docs/Tasker/Orchestration/Coordinator.html +641 -0
- data/docs/Tasker/Orchestration/FutureStateAnalyzer.html +1045 -0
- data/docs/Tasker/Orchestration/Orchestrator.html +679 -0
- data/docs/Tasker/Orchestration/PluginIntegration.html +1127 -0
- data/docs/Tasker/Orchestration/ResponseProcessor.html +504 -0
- data/docs/Tasker/Orchestration/RetryHeaderParser.html +304 -0
- data/docs/Tasker/Orchestration/StepExecutor.html +995 -0
- data/docs/Tasker/Orchestration/StepSequenceFactory.html +644 -0
- data/docs/Tasker/Orchestration/TaskFinalizer/BlockageChecker.html +264 -0
- data/docs/Tasker/Orchestration/TaskFinalizer/ContextManager.html +254 -0
- data/docs/Tasker/Orchestration/TaskFinalizer/DelayCalculator.html +556 -0
- data/docs/Tasker/Orchestration/TaskFinalizer/FinalizationDecisionMaker.html +348 -0
- data/docs/Tasker/Orchestration/TaskFinalizer/FinalizationProcessor.html +286 -0
- data/docs/Tasker/Orchestration/TaskFinalizer/ReasonDeterminer.html +432 -0
- data/docs/Tasker/Orchestration/TaskFinalizer/ReenqueueManager.html +296 -0
- data/docs/Tasker/Orchestration/TaskFinalizer/UnclearStateHandler.html +314 -0
- data/docs/Tasker/Orchestration/TaskFinalizer.html +1212 -0
- data/docs/Tasker/Orchestration/TaskInitializer.html +766 -0
- data/docs/Tasker/Orchestration/TaskReenqueuer.html +506 -0
- data/docs/Tasker/Orchestration/ViableStepDiscovery.html +442 -0
- data/docs/Tasker/Orchestration/WorkflowCoordinator.html +510 -0
- data/docs/Tasker/Orchestration.html +130 -0
- data/docs/Tasker/PageSort/PageSortParamsBuilder.html +296 -0
- data/docs/Tasker/PageSort.html +247 -0
- data/docs/Tasker/PermanentError.html +518 -0
- data/docs/Tasker/ProceduralError.html +147 -0
- data/docs/Tasker/Queries/AllAnnotationTypes.html +217 -0
- data/docs/Tasker/Queries/AllTasks.html +221 -0
- data/docs/Tasker/Queries/BaseQuery.html +128 -0
- data/docs/Tasker/Queries/Helpers.html +187 -0
- data/docs/Tasker/Queries/OneStep.html +225 -0
- data/docs/Tasker/Queries/OneTask.html +217 -0
- data/docs/Tasker/Queries/TasksByAnnotation.html +231 -0
- data/docs/Tasker/Queries/TasksByStatus.html +233 -0
- data/docs/Tasker/Queries.html +119 -0
- data/docs/Tasker/Railtie.html +124 -0
- data/docs/Tasker/Registry/BaseRegistry.html +1690 -0
- data/docs/Tasker/Registry/EventPublisher.html +667 -0
- data/docs/Tasker/Registry/InterfaceValidator.html +569 -0
- data/docs/Tasker/Registry/RegistrationError.html +132 -0
- data/docs/Tasker/Registry/RegistryError.html +139 -0
- data/docs/Tasker/Registry/StatisticsCollector.html +841 -0
- data/docs/Tasker/Registry/SubscriberRegistry.html +1504 -0
- data/docs/Tasker/Registry/ValidationError.html +132 -0
- data/docs/Tasker/Registry.html +119 -0
- data/docs/Tasker/RetryableError.html +515 -0
- data/docs/Tasker/StateMachine/Compatibility.html +282 -0
- data/docs/Tasker/StateMachine/InvalidStateTransition.html +135 -0
- data/docs/Tasker/StateMachine/StepStateMachine/StandardizedPayloadBuilder.html +260 -0
- data/docs/Tasker/StateMachine/StepStateMachine.html +2215 -0
- data/docs/Tasker/StateMachine/TaskStateMachine.html +734 -0
- data/docs/Tasker/StateMachine.html +602 -0
- data/docs/Tasker/StepDagRelationship.html +657 -0
- data/docs/Tasker/StepHandler/Api/Config.html +1091 -0
- data/docs/Tasker/StepHandler/Api.html +884 -0
- data/docs/Tasker/StepHandler/AutomaticEventPublishing.html +321 -0
- data/docs/Tasker/StepHandler/Base.html +970 -0
- data/docs/Tasker/StepHandler.html +119 -0
- data/docs/Tasker/StepReadinessStatus.html +836 -0
- data/docs/Tasker/Task.html +2575 -0
- data/docs/Tasker/TaskAnnotation.html +137 -0
- data/docs/Tasker/TaskAnnotationSerializer.html +124 -0
- data/docs/Tasker/TaskBuilder/StepNameValidator.html +264 -0
- data/docs/Tasker/TaskBuilder/StepTemplateDefiner.html +264 -0
- data/docs/Tasker/TaskBuilder.html +764 -0
- data/docs/Tasker/TaskDiagram/StepToStepEdgeBuilder.html +260 -0
- data/docs/Tasker/TaskDiagram/TaskToRootStepEdgeBuilder.html +290 -0
- data/docs/Tasker/TaskDiagram.html +548 -0
- data/docs/Tasker/TaskDiagramsController.html +240 -0
- data/docs/Tasker/TaskExecutionContext.html +469 -0
- data/docs/Tasker/TaskHandler/ClassMethods/StepTemplateDefiner/ClassBasedEventRegistrar.html +238 -0
- data/docs/Tasker/TaskHandler/ClassMethods/StepTemplateDefiner/YamlEventRegistrar.html +254 -0
- data/docs/Tasker/TaskHandler/ClassMethods/StepTemplateDefiner.html +988 -0
- data/docs/Tasker/TaskHandler/ClassMethods.html +357 -0
- data/docs/Tasker/TaskHandler/InstanceMethods.html +1396 -0
- data/docs/Tasker/TaskHandler/StepGroup.html +1748 -0
- data/docs/Tasker/TaskHandler.html +271 -0
- data/docs/Tasker/TaskNamespace.html +312 -0
- data/docs/Tasker/TaskRunnerJob.html +406 -0
- data/docs/Tasker/TaskSerializer.html +474 -0
- data/docs/Tasker/TaskTransition.html +1517 -0
- data/docs/Tasker/TaskWorkflowSummary.html +988 -0
- data/docs/Tasker/TaskerRailsSchema/InvalidObjectTypeError.html +132 -0
- data/docs/Tasker/TaskerRailsSchema/TypeResolutionError.html +139 -0
- data/docs/Tasker/TaskerRailsSchema/UnknownInterfaceError.html +132 -0
- data/docs/Tasker/TaskerRailsSchema.html +384 -0
- data/docs/Tasker/TasksController.html +595 -0
- data/docs/Tasker/Telemetry/EventMapping.html +1307 -0
- data/docs/Tasker/Telemetry/EventRouter.html +2178 -0
- data/docs/Tasker/Telemetry/Events/ExportEvents.html +246 -0
- data/docs/Tasker/Telemetry/Events.html +115 -0
- data/docs/Tasker/Telemetry/ExportCoordinator/DistributedLockTimeoutError.html +135 -0
- data/docs/Tasker/Telemetry/ExportCoordinator.html +2137 -0
- data/docs/Tasker/Telemetry/IntelligentCacheManager.html +1083 -0
- data/docs/Tasker/Telemetry/LogBackend.html +1088 -0
- data/docs/Tasker/Telemetry/MetricTypes/Counter.html +1054 -0
- data/docs/Tasker/Telemetry/MetricTypes/Gauge.html +1270 -0
- data/docs/Tasker/Telemetry/MetricTypes/Histogram.html +1492 -0
- data/docs/Tasker/Telemetry/MetricTypes.html +153 -0
- data/docs/Tasker/Telemetry/MetricsBackend.html +2510 -0
- data/docs/Tasker/Telemetry/MetricsExportService.html +578 -0
- data/docs/Tasker/Telemetry/PluginRegistry.html +1774 -0
- data/docs/Tasker/Telemetry/Plugins/BaseExporter.html +1835 -0
- data/docs/Tasker/Telemetry/Plugins/CsvExporter.html +768 -0
- data/docs/Tasker/Telemetry/Plugins/JsonExporter.html +747 -0
- data/docs/Tasker/Telemetry/Plugins.html +117 -0
- data/docs/Tasker/Telemetry/PrometheusExporter.html +481 -0
- data/docs/Tasker/Telemetry/TraceBackend.html +891 -0
- data/docs/Tasker/Telemetry.html +130 -0
- data/docs/Tasker/Types/AuthConfig.html +886 -0
- data/docs/Tasker/Types/BackoffConfig.html +1063 -0
- data/docs/Tasker/Types/BaseConfig.html +227 -0
- data/docs/Tasker/Types/CacheConfig.html +1731 -0
- data/docs/Tasker/Types/DatabaseConfig.html +388 -0
- data/docs/Tasker/Types/DependencyGraph.html +526 -0
- data/docs/Tasker/Types/DependencyGraphConfig.html +753 -0
- data/docs/Tasker/Types/EngineConfig.html +1181 -0
- data/docs/Tasker/Types/ExecutionConfig.html +1963 -0
- data/docs/Tasker/Types/GraphEdge.html +517 -0
- data/docs/Tasker/Types/GraphMetadata.html +781 -0
- data/docs/Tasker/Types/GraphNode.html +694 -0
- data/docs/Tasker/Types/HealthConfig.html +784 -0
- data/docs/Tasker/Types/StepSequence.html +353 -0
- data/docs/Tasker/Types/StepTemplate.html +1193 -0
- data/docs/Tasker/Types/TaskRequest.html +1179 -0
- data/docs/Tasker/Types/TelemetryConfig.html +2746 -0
- data/docs/Tasker/Types.html +154 -0
- data/docs/Tasker/WorkflowStep/StepFinder.html +282 -0
- data/docs/Tasker/WorkflowStep.html +2724 -0
- data/docs/Tasker/WorkflowStepEdge.html +304 -0
- data/docs/Tasker/WorkflowStepSerializer.html +305 -0
- data/docs/Tasker/WorkflowStepTransition/TransitionDescriptionFormatter.html +282 -0
- data/docs/Tasker/WorkflowStepTransition.html +2201 -0
- data/docs/Tasker/WorkflowStepsController.html +462 -0
- data/docs/Tasker.html +452 -0
- data/docs/VISION.md +584 -0
- data/docs/WHY.md +21 -0
- data/docs/_index.html +2375 -0
- data/docs/class_list.html +54 -0
- data/docs/css/common.css +1 -0
- data/docs/css/full_list.css +58 -0
- data/docs/css/style.css +503 -0
- data/docs/events/migration_plan_outcomes.md +80 -0
- data/docs/file.README.html +541 -0
- data/docs/file_list.html +59 -0
- data/docs/frames.html +22 -0
- data/docs/index.html +541 -0
- data/docs/js/app.js +344 -0
- data/docs/js/full_list.js +242 -0
- data/docs/js/jquery.js +4 -0
- data/docs/method_list.html +9182 -0
- data/docs/top-level-namespace.html +110 -0
- data/lib/generators/tasker/authenticator_generator.rb +301 -0
- data/lib/generators/tasker/authorization_coordinator_generator.rb +139 -0
- data/lib/generators/tasker/events_generator.rb +91 -0
- data/lib/generators/tasker/subscriber_generator.rb +107 -0
- data/lib/generators/tasker/task_handler_generator.rb +138 -0
- data/lib/generators/tasker/templates/api_token_authenticator.rb.erb +113 -0
- data/lib/generators/tasker/templates/api_token_authenticator_spec.rb.erb +144 -0
- data/lib/generators/tasker/templates/authorization_coordinator.rb.erb +95 -0
- data/lib/generators/tasker/templates/authorization_coordinator_spec.rb.erb +142 -0
- data/lib/generators/tasker/templates/custom_authenticator.rb.erb +108 -0
- data/lib/generators/tasker/templates/custom_authenticator_spec.rb.erb +162 -0
- data/lib/generators/tasker/templates/custom_events.yml.erb +62 -0
- data/lib/generators/tasker/templates/custom_subscriber.rb.erb +72 -0
- data/lib/generators/tasker/templates/devise_authenticator.rb.erb +101 -0
- data/lib/generators/tasker/templates/devise_authenticator_spec.rb.erb +126 -0
- data/lib/generators/tasker/templates/initialize.rb.erb +202 -0
- data/lib/generators/tasker/templates/jwt_authenticator.rb.erb +144 -0
- data/lib/generators/tasker/templates/jwt_authenticator_spec.rb.erb +298 -0
- data/lib/generators/tasker/templates/metrics_subscriber.rb.erb +258 -0
- data/lib/generators/tasker/templates/metrics_subscriber_spec.rb.erb +308 -0
- data/lib/generators/tasker/templates/omniauth_authenticator.rb.erb +135 -0
- data/lib/generators/tasker/templates/omniauth_authenticator_spec.rb.erb +196 -0
- data/lib/generators/tasker/templates/opentelemetry_initializer.rb +52 -0
- data/lib/generators/tasker/templates/subscriber.rb.erb +64 -0
- data/lib/generators/tasker/templates/subscriber_spec.rb.erb +80 -0
- data/lib/generators/tasker/templates/task_config.yaml.erb +117 -0
- data/lib/generators/tasker/templates/task_handler.rb.erb +59 -0
- data/lib/generators/tasker/templates/task_handler_spec.rb.erb +159 -0
- data/lib/tasker/analysis/runtime_graph_analyzer.rb +1168 -0
- data/lib/tasker/analysis/template_graph_analyzer.rb +328 -0
- data/lib/tasker/authentication/coordinator.rb +78 -0
- data/lib/tasker/authentication/errors.rb +9 -0
- data/lib/tasker/authentication/interface.rb +36 -0
- data/lib/tasker/authentication/none_authenticator.rb +26 -0
- data/lib/tasker/authorization/base_coordinator.rb +112 -0
- data/lib/tasker/authorization/errors.rb +26 -0
- data/lib/tasker/authorization/resource_constants.rb +74 -0
- data/lib/tasker/authorization/resource_registry.rb +143 -0
- data/lib/tasker/authorization.rb +75 -0
- data/lib/tasker/cache_capabilities.rb +131 -0
- data/lib/tasker/cache_strategy.rb +469 -0
- data/lib/tasker/concerns/authenticatable.rb +41 -0
- data/lib/tasker/concerns/authorizable.rb +204 -0
- data/lib/tasker/concerns/controller_authorizable.rb +124 -0
- data/lib/tasker/concerns/event_publisher.rb +716 -0
- data/lib/tasker/concerns/idempotent_state_transitions.rb +128 -0
- data/lib/tasker/concerns/state_machine_base.rb +218 -0
- data/lib/tasker/concerns/structured_logging.rb +387 -0
- data/lib/tasker/configuration.rb +325 -0
- data/lib/tasker/constants/event_definitions.rb +147 -0
- data/lib/tasker/constants/registry_events.rb +54 -0
- data/lib/tasker/constants.rb +417 -0
- data/lib/tasker/engine.rb +90 -0
- data/lib/tasker/errors.rb +90 -0
- data/lib/tasker/events/catalog.rb +432 -0
- data/lib/tasker/events/custom_registry.rb +175 -0
- data/lib/tasker/events/definition_loader.rb +199 -0
- data/lib/tasker/events/event_payload_builder.rb +461 -0
- data/lib/tasker/events/publisher.rb +149 -0
- data/lib/tasker/events/subscribers/base_subscriber.rb +601 -0
- data/lib/tasker/events/subscribers/metrics_subscriber.rb +120 -0
- data/lib/tasker/events/subscribers/telemetry_subscriber.rb +462 -0
- data/lib/tasker/events/subscription_loader.rb +161 -0
- data/lib/tasker/events.rb +37 -0
- data/lib/tasker/functions/function_based_analytics_metrics.rb +103 -0
- data/lib/tasker/functions/function_based_dependency_levels.rb +54 -0
- data/lib/tasker/functions/function_based_slowest_steps.rb +84 -0
- data/lib/tasker/functions/function_based_slowest_tasks.rb +84 -0
- data/lib/tasker/functions/function_based_step_readiness_status.rb +183 -0
- data/lib/tasker/functions/function_based_system_health_counts.rb +94 -0
- data/lib/tasker/functions/function_based_task_execution_context.rb +148 -0
- data/lib/tasker/functions/function_wrapper.rb +42 -0
- data/lib/tasker/functions.rb +12 -0
- data/lib/tasker/handler_factory.rb +322 -0
- data/lib/tasker/health/readiness_checker.rb +186 -0
- data/lib/tasker/health/status_checker.rb +203 -0
- data/lib/tasker/identity_strategy.rb +38 -0
- data/lib/tasker/logging/correlation_id_generator.rb +120 -0
- data/lib/tasker/orchestration/backoff_calculator.rb +184 -0
- data/lib/tasker/orchestration/connection_builder.rb +122 -0
- data/lib/tasker/orchestration/connection_pool_intelligence.rb +177 -0
- data/lib/tasker/orchestration/coordinator.rb +119 -0
- data/lib/tasker/orchestration/future_state_analyzer.rb +137 -0
- data/lib/tasker/orchestration/plugin_integration.rb +124 -0
- data/lib/tasker/orchestration/response_processor.rb +168 -0
- data/lib/tasker/orchestration/retry_header_parser.rb +78 -0
- data/lib/tasker/orchestration/step_executor.rb +941 -0
- data/lib/tasker/orchestration/step_sequence_factory.rb +67 -0
- data/lib/tasker/orchestration/task_finalizer.rb +564 -0
- data/lib/tasker/orchestration/task_initializer.rb +140 -0
- data/lib/tasker/orchestration/task_reenqueuer.rb +71 -0
- data/lib/tasker/orchestration/viable_step_discovery.rb +65 -0
- data/lib/tasker/orchestration/workflow_coordinator.rb +294 -0
- data/lib/tasker/orchestration.rb +45 -0
- data/lib/tasker/railtie.rb +9 -0
- data/lib/tasker/registry/base_registry.rb +177 -0
- data/lib/tasker/registry/event_publisher.rb +91 -0
- data/lib/tasker/registry/interface_validator.rb +140 -0
- data/lib/tasker/registry/statistics_collector.rb +381 -0
- data/lib/tasker/registry/subscriber_registry.rb +285 -0
- data/lib/tasker/registry.rb +22 -0
- data/lib/tasker/state_machine/step_state_machine.rb +508 -0
- data/lib/tasker/state_machine/task_state_machine.rb +192 -0
- data/lib/tasker/state_machine.rb +83 -0
- data/lib/tasker/step_handler/api.rb +410 -0
- data/lib/tasker/step_handler/base.rb +206 -0
- data/lib/tasker/task_builder.rb +432 -0
- data/lib/tasker/task_handler/class_methods.rb +324 -0
- data/lib/tasker/task_handler/instance_methods.rb +293 -0
- data/lib/tasker/task_handler/step_group.rb +182 -0
- data/lib/tasker/task_handler.rb +43 -0
- data/lib/tasker/telemetry/event_mapping.rb +126 -0
- data/lib/tasker/telemetry/event_router.rb +318 -0
- data/lib/tasker/telemetry/events/export_events.rb +38 -0
- data/lib/tasker/telemetry/export_coordinator.rb +497 -0
- data/lib/tasker/telemetry/intelligent_cache_manager.rb +508 -0
- data/lib/tasker/telemetry/log_backend.rb +224 -0
- data/lib/tasker/telemetry/metric_types.rb +368 -0
- data/lib/tasker/telemetry/metrics_backend.rb +1227 -0
- data/lib/tasker/telemetry/metrics_export_service.rb +392 -0
- data/lib/tasker/telemetry/plugin_registry.rb +333 -0
- data/lib/tasker/telemetry/plugins/base_exporter.rb +246 -0
- data/lib/tasker/telemetry/plugins/csv_exporter.rb +198 -0
- data/lib/tasker/telemetry/plugins/json_exporter.rb +141 -0
- data/lib/tasker/telemetry/prometheus_exporter.rb +249 -0
- data/lib/tasker/telemetry/trace_backend.rb +186 -0
- data/lib/tasker/telemetry.rb +59 -0
- data/lib/tasker/types/auth_config.rb +81 -0
- data/lib/tasker/types/backoff_config.rb +142 -0
- data/lib/tasker/types/cache_config.rb +257 -0
- data/lib/tasker/types/database_config.rb +39 -0
- data/lib/tasker/types/dependency_graph.rb +225 -0
- data/lib/tasker/types/dependency_graph_config.rb +149 -0
- data/lib/tasker/types/engine_config.rb +131 -0
- data/lib/tasker/types/execution_config.rb +289 -0
- data/lib/tasker/types/health_config.rb +84 -0
- data/lib/tasker/types/step_sequence.rb +24 -0
- data/lib/tasker/types/step_template.rb +63 -0
- data/lib/tasker/types/task_request.rb +60 -0
- data/lib/tasker/types/telemetry_config.rb +273 -0
- data/lib/tasker/types.rb +64 -0
- data/lib/tasker/version.rb +7 -0
- data/lib/tasker.rb +82 -0
- data/lib/tasks/tasker_tasks.rake +302 -0
- metadata +958 -0
@@ -0,0 +1,325 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Tasker
|
4
|
+
# Configuration class for the Tasker gem
|
5
|
+
#
|
6
|
+
# Handles global configuration options with nested configuration blocks
|
7
|
+
# for better organization and discoverability.
|
8
|
+
#
|
9
|
+
# All configuration types are now implemented using dry-struct for type safety,
|
10
|
+
# immutability, and consistent validation patterns.
|
11
|
+
class Configuration
|
12
|
+
# Simple proxy object for configuration blocks that provides dot-notation access
|
13
|
+
# to hash values without the overhead of OpenStruct.
|
14
|
+
#
|
15
|
+
# This enables clean configuration syntax like:
|
16
|
+
# config.auth do |auth|
|
17
|
+
# auth.authentication_enabled = true
|
18
|
+
# auth.authenticator_class = 'MyAuth'
|
19
|
+
# end
|
20
|
+
#
|
21
|
+
# While maintaining the benefits of dry-struct validation and immutability.
|
22
|
+
class ConfigurationProxy
|
23
|
+
# Initialize a new configuration proxy with hash data
|
24
|
+
#
|
25
|
+
# @param hash [Hash] The hash data to wrap
|
26
|
+
def initialize(hash = {})
|
27
|
+
@hash = hash.transform_keys(&:to_sym)
|
28
|
+
end
|
29
|
+
|
30
|
+
# Handle dynamic method calls for configuration access
|
31
|
+
#
|
32
|
+
# @param method_name [Symbol] The method being called
|
33
|
+
# @param args [Array] Arguments passed to the method
|
34
|
+
def method_missing(method_name, *args)
|
35
|
+
if method_name.to_s.end_with?('=')
|
36
|
+
# Setter: config.authentication_enabled = true
|
37
|
+
key = method_name.to_s.chomp('=').to_sym
|
38
|
+
@hash[key] = args.first
|
39
|
+
elsif @hash.key?(method_name.to_sym)
|
40
|
+
# Getter: config.authentication_enabled
|
41
|
+
@hash[method_name.to_sym]
|
42
|
+
else
|
43
|
+
super
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# Check if the proxy responds to a given method
|
48
|
+
#
|
49
|
+
# @param method_name [Symbol] The method name to check
|
50
|
+
# @param include_private [Boolean] Whether to include private methods
|
51
|
+
# @return [Boolean] True if the method is supported
|
52
|
+
def respond_to_missing?(method_name, include_private = false)
|
53
|
+
method_name.to_s.end_with?('=') || @hash.key?(method_name.to_sym) || super
|
54
|
+
end
|
55
|
+
|
56
|
+
# Convert the proxy back to a hash for dry-struct creation
|
57
|
+
#
|
58
|
+
# @return [Hash] The underlying hash data
|
59
|
+
def to_h
|
60
|
+
@hash
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
# Specialized configuration proxy for telemetry settings
|
65
|
+
# Handles special methods specific to TelemetryConfig
|
66
|
+
class TelemetryConfigurationProxy < ConfigurationProxy
|
67
|
+
# Handle telemetry-specific configuration method
|
68
|
+
#
|
69
|
+
# @param options [Hash] Telemetry configuration options
|
70
|
+
def configure_telemetry(options = {})
|
71
|
+
current_config = @hash[:config] || {}
|
72
|
+
@hash[:config] = current_config.merge(options)
|
73
|
+
end
|
74
|
+
|
75
|
+
# Check if the proxy responds to telemetry-specific methods
|
76
|
+
#
|
77
|
+
# @param method_name [Symbol] The method name to check
|
78
|
+
# @param include_private [Boolean] Whether to include private methods
|
79
|
+
# @return [Boolean] True if the method is supported
|
80
|
+
def respond_to_missing?(method_name, include_private = false)
|
81
|
+
method_name.to_s == 'configure_telemetry' || super
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
# Initialize a new configuration with default values
|
86
|
+
#
|
87
|
+
# @return [Configuration] A new configuration instance
|
88
|
+
def initialize
|
89
|
+
# Initialize nested configurations using dry-struct types
|
90
|
+
@auth_config = Tasker::Types::AuthConfig.new
|
91
|
+
@database_config = Tasker::Types::DatabaseConfig.new
|
92
|
+
@telemetry_config = Tasker::Types::TelemetryConfig.new
|
93
|
+
@engine_config = Tasker::Types::EngineConfig.new
|
94
|
+
@health_config = Tasker::Types::HealthConfig.new
|
95
|
+
@dependency_graph_config = Tasker::Types::DependencyGraphConfig.new
|
96
|
+
@backoff_config = Tasker::Types::BackoffConfig.new
|
97
|
+
@execution_config = Tasker::Types::ExecutionConfig.new
|
98
|
+
@cache_config = Tasker::Types::CacheConfig.new
|
99
|
+
end
|
100
|
+
|
101
|
+
# Reset configuration to defaults (useful for testing)
|
102
|
+
def reset!
|
103
|
+
@auth_config = Tasker::Types::AuthConfig.new
|
104
|
+
@database_config = Tasker::Types::DatabaseConfig.new
|
105
|
+
@telemetry_config = Tasker::Types::TelemetryConfig.new
|
106
|
+
@engine_config = Tasker::Types::EngineConfig.new
|
107
|
+
@health_config = Tasker::Types::HealthConfig.new
|
108
|
+
@dependency_graph_config = Tasker::Types::DependencyGraphConfig.new
|
109
|
+
@backoff_config = Tasker::Types::BackoffConfig.new
|
110
|
+
@execution_config = Tasker::Types::ExecutionConfig.new
|
111
|
+
@cache_config = Tasker::Types::CacheConfig.new
|
112
|
+
end
|
113
|
+
|
114
|
+
# Create a deep copy of the configuration
|
115
|
+
#
|
116
|
+
# Since dry-struct types are immutable, we don't need to duplicate them
|
117
|
+
def dup
|
118
|
+
new_config = super
|
119
|
+
new_config.instance_variable_set(:@auth_config, @auth_config)
|
120
|
+
new_config.instance_variable_set(:@database_config, @database_config)
|
121
|
+
new_config.instance_variable_set(:@telemetry_config, @telemetry_config)
|
122
|
+
new_config.instance_variable_set(:@engine_config, @engine_config)
|
123
|
+
new_config.instance_variable_set(:@health_config, @health_config)
|
124
|
+
new_config.instance_variable_set(:@dependency_graph_config, @dependency_graph_config)
|
125
|
+
new_config.instance_variable_set(:@backoff_config, @backoff_config)
|
126
|
+
new_config.instance_variable_set(:@execution_config, @execution_config)
|
127
|
+
new_config.instance_variable_set(:@cache_config, @cache_config)
|
128
|
+
new_config
|
129
|
+
end
|
130
|
+
|
131
|
+
# Configure authentication and authorization settings
|
132
|
+
#
|
133
|
+
# @yield [ConfigurationProxy] A configuration object for setting auth options
|
134
|
+
# @return [Tasker::Types::AuthConfig] The auth configuration instance
|
135
|
+
def auth
|
136
|
+
if block_given?
|
137
|
+
# For block configuration, we need to create a new instance with the block's values
|
138
|
+
current_values = @auth_config.to_h
|
139
|
+
yield_config = ConfigurationProxy.new(current_values)
|
140
|
+
yield(yield_config)
|
141
|
+
@auth_config = Tasker::Types::AuthConfig.new(yield_config.to_h)
|
142
|
+
end
|
143
|
+
@auth_config
|
144
|
+
end
|
145
|
+
|
146
|
+
# Alias for auth configuration for backward compatibility
|
147
|
+
# @return [Tasker::Types::AuthConfig] The authentication configuration instance
|
148
|
+
def authentication
|
149
|
+
@auth_config
|
150
|
+
end
|
151
|
+
|
152
|
+
# Configure database settings
|
153
|
+
#
|
154
|
+
# @yield [ConfigurationProxy] A configuration object for setting database options
|
155
|
+
# @return [Tasker::Types::DatabaseConfig] The database configuration instance
|
156
|
+
def database
|
157
|
+
if block_given?
|
158
|
+
# For block configuration, we need to create a new instance with the block's values
|
159
|
+
current_values = @database_config.to_h
|
160
|
+
yield_config = ConfigurationProxy.new(current_values)
|
161
|
+
yield(yield_config)
|
162
|
+
@database_config = Tasker::Types::DatabaseConfig.new(yield_config.to_h)
|
163
|
+
end
|
164
|
+
@database_config
|
165
|
+
end
|
166
|
+
|
167
|
+
# Configure telemetry and observability settings
|
168
|
+
#
|
169
|
+
# @yield [TelemetryConfigurationProxy] A configuration object for setting telemetry options
|
170
|
+
# @return [Tasker::Types::TelemetryConfig] The telemetry configuration instance
|
171
|
+
def telemetry
|
172
|
+
if block_given?
|
173
|
+
# For block configuration, we need to create a new instance with the block's values
|
174
|
+
current_values = @telemetry_config.to_h
|
175
|
+
yield_config = TelemetryConfigurationProxy.new(current_values)
|
176
|
+
yield(yield_config)
|
177
|
+
@telemetry_config = Tasker::Types::TelemetryConfig.new(yield_config.to_h)
|
178
|
+
end
|
179
|
+
@telemetry_config
|
180
|
+
end
|
181
|
+
|
182
|
+
# Configure core engine settings
|
183
|
+
#
|
184
|
+
# @yield [ConfigurationProxy] A configuration object for setting engine options
|
185
|
+
# @return [Tasker::Types::EngineConfig] The engine configuration instance
|
186
|
+
def engine
|
187
|
+
if block_given?
|
188
|
+
# For block configuration, we need to create a new instance with the block's values
|
189
|
+
current_values = @engine_config.to_h
|
190
|
+
yield_config = ConfigurationProxy.new(current_values)
|
191
|
+
yield(yield_config)
|
192
|
+
@engine_config = Tasker::Types::EngineConfig.new(yield_config.to_h)
|
193
|
+
end
|
194
|
+
@engine_config
|
195
|
+
end
|
196
|
+
|
197
|
+
# Configure health check settings
|
198
|
+
#
|
199
|
+
# @yield [ConfigurationProxy] A configuration object for setting health options
|
200
|
+
# @return [Tasker::Types::HealthConfig] The health configuration instance
|
201
|
+
def health
|
202
|
+
if block_given?
|
203
|
+
# For block configuration, we need to create a new instance with the block's values
|
204
|
+
current_values = @health_config.to_h
|
205
|
+
yield_config = ConfigurationProxy.new(current_values)
|
206
|
+
yield(yield_config)
|
207
|
+
@health_config = Tasker::Types::HealthConfig.new(yield_config.to_h)
|
208
|
+
end
|
209
|
+
@health_config
|
210
|
+
end
|
211
|
+
|
212
|
+
# Configure dependency graph calculation settings
|
213
|
+
#
|
214
|
+
# @yield [ConfigurationProxy] A configuration object for setting dependency graph options
|
215
|
+
# @return [Tasker::Types::DependencyGraphConfig] The dependency graph configuration instance
|
216
|
+
def dependency_graph
|
217
|
+
if block_given?
|
218
|
+
# For block configuration, we need to create a new instance with the block's values
|
219
|
+
current_values = @dependency_graph_config.to_h
|
220
|
+
yield_config = ConfigurationProxy.new(current_values)
|
221
|
+
yield(yield_config)
|
222
|
+
@dependency_graph_config = Tasker::Types::DependencyGraphConfig.new(yield_config.to_h)
|
223
|
+
end
|
224
|
+
@dependency_graph_config
|
225
|
+
end
|
226
|
+
|
227
|
+
# Configure backoff calculation settings
|
228
|
+
#
|
229
|
+
# @yield [ConfigurationProxy] A configuration object for setting backoff options
|
230
|
+
# @return [Tasker::Types::BackoffConfig] The backoff configuration instance
|
231
|
+
def backoff
|
232
|
+
if block_given?
|
233
|
+
# For block configuration, we need to create a new instance with the block's values
|
234
|
+
current_values = @backoff_config.to_h
|
235
|
+
yield_config = ConfigurationProxy.new(current_values)
|
236
|
+
yield(yield_config)
|
237
|
+
@backoff_config = Tasker::Types::BackoffConfig.new(yield_config.to_h)
|
238
|
+
end
|
239
|
+
@backoff_config
|
240
|
+
end
|
241
|
+
|
242
|
+
# Configure step execution and concurrency settings
|
243
|
+
#
|
244
|
+
# @yield [ConfigurationProxy] A configuration object for setting execution options
|
245
|
+
# @return [Tasker::Types::ExecutionConfig] The execution configuration instance
|
246
|
+
def execution
|
247
|
+
if block_given?
|
248
|
+
# For block configuration, we need to create a new instance with the block's values
|
249
|
+
current_values = @execution_config.to_h
|
250
|
+
yield_config = ConfigurationProxy.new(current_values)
|
251
|
+
yield(yield_config)
|
252
|
+
@execution_config = Tasker::Types::ExecutionConfig.new(yield_config.to_h)
|
253
|
+
end
|
254
|
+
@execution_config
|
255
|
+
end
|
256
|
+
|
257
|
+
# Configure intelligent cache strategy settings
|
258
|
+
#
|
259
|
+
# @yield [ConfigurationProxy] A configuration object for setting cache options
|
260
|
+
# @return [Tasker::Types::CacheConfig] The cache configuration instance
|
261
|
+
def cache
|
262
|
+
if block_given?
|
263
|
+
# For block configuration, we need to create a new instance with the block's values
|
264
|
+
current_values = @cache_config.to_h
|
265
|
+
yield_config = ConfigurationProxy.new(current_values)
|
266
|
+
yield(yield_config)
|
267
|
+
@cache_config = Tasker::Types::CacheConfig.new(yield_config.to_h)
|
268
|
+
end
|
269
|
+
@cache_config
|
270
|
+
end
|
271
|
+
|
272
|
+
# Validate required configuration settings for system health
|
273
|
+
# Used by health check endpoints to ensure system is properly configured
|
274
|
+
# @return [true] if valid
|
275
|
+
# @raise [StandardError] if invalid configuration found
|
276
|
+
def validate_required_settings
|
277
|
+
errors = []
|
278
|
+
|
279
|
+
# Database connectivity check
|
280
|
+
errors << 'Database connection required' unless database_connected?
|
281
|
+
|
282
|
+
# Authentication configuration validation (if enabled)
|
283
|
+
if auth.authentication_enabled && auth.authenticator_class.blank?
|
284
|
+
errors << 'Authentication enabled but no authenticator_class configured'
|
285
|
+
end
|
286
|
+
|
287
|
+
# Health configuration validation (dry-struct handles validation automatically)
|
288
|
+
@health_config&.validate!
|
289
|
+
|
290
|
+
raise StandardError, errors.join(', ') if errors.any?
|
291
|
+
|
292
|
+
true
|
293
|
+
end
|
294
|
+
|
295
|
+
private
|
296
|
+
|
297
|
+
# Check if database is connected and available
|
298
|
+
# @return [Boolean] true if database is connected
|
299
|
+
def database_connected?
|
300
|
+
ActiveRecord::Base.connection.active?
|
301
|
+
rescue StandardError
|
302
|
+
false
|
303
|
+
end
|
304
|
+
|
305
|
+
# Get or create the global configuration
|
306
|
+
#
|
307
|
+
# @yield [Configuration] The configuration instance if a block is given
|
308
|
+
# @return [Configuration] The configuration instance
|
309
|
+
def self.configuration
|
310
|
+
@configuration ||= Configuration.new
|
311
|
+
|
312
|
+
# Yield if a block is given for backwards compatibility
|
313
|
+
yield(@configuration) if block_given?
|
314
|
+
|
315
|
+
@configuration
|
316
|
+
end
|
317
|
+
|
318
|
+
# Reset the configuration to default values
|
319
|
+
#
|
320
|
+
# @return [Configuration] A new configuration instance
|
321
|
+
def self.reset_configuration!
|
322
|
+
@configuration = Configuration.new
|
323
|
+
end
|
324
|
+
end
|
325
|
+
end
|
@@ -0,0 +1,147 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'yaml'
|
4
|
+
|
5
|
+
module Tasker
|
6
|
+
module Constants
|
7
|
+
# EventDefinitions provides a bridge between event constants and their metadata
|
8
|
+
#
|
9
|
+
# This class loads event metadata from system_events.yml and provides methods
|
10
|
+
# to find events by constant, retrieve all events by category, etc.
|
11
|
+
# It serves as the single source of truth for event documentation and payload schemas.
|
12
|
+
class EventDefinitions
|
13
|
+
class << self
|
14
|
+
# Find event definition by constant name
|
15
|
+
#
|
16
|
+
# @param constant [String] The event constant (e.g., 'task.completed')
|
17
|
+
# @return [Hash, nil] Event definition or nil if not found
|
18
|
+
def find_by(constant:)
|
19
|
+
event_metadata.find { |_key, data| data['constant'] == constant }&.last
|
20
|
+
end
|
21
|
+
|
22
|
+
# Get all events grouped by category
|
23
|
+
#
|
24
|
+
# @return [Hash] Events grouped by category (task, step, workflow, etc.)
|
25
|
+
def all_events
|
26
|
+
@all_events ||= build_all_events
|
27
|
+
end
|
28
|
+
|
29
|
+
# Get events for a specific category
|
30
|
+
#
|
31
|
+
# @param category [String] The event category (task, step, workflow, etc.)
|
32
|
+
# @return [Hash] Events in the specified category
|
33
|
+
def events_by_category(category)
|
34
|
+
all_events[category.to_s] || {}
|
35
|
+
end
|
36
|
+
|
37
|
+
# Get all event constants
|
38
|
+
#
|
39
|
+
# @return [Array<String>] All event constant names
|
40
|
+
def all_constants
|
41
|
+
event_metadata.values.pluck('constant').compact
|
42
|
+
end
|
43
|
+
|
44
|
+
# Refresh cached data (useful for testing)
|
45
|
+
#
|
46
|
+
# @return [void]
|
47
|
+
def refresh!
|
48
|
+
@event_metadata = nil
|
49
|
+
@all_events = nil
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
# Load and cache event metadata from system_events.yml
|
55
|
+
#
|
56
|
+
# @return [Hash] Event metadata with descriptions and schemas
|
57
|
+
def event_metadata
|
58
|
+
@event_metadata ||= load_event_metadata
|
59
|
+
end
|
60
|
+
|
61
|
+
# Load event metadata from YAML configuration
|
62
|
+
#
|
63
|
+
# @return [Hash] Parsed event metadata
|
64
|
+
def load_event_metadata
|
65
|
+
yaml_file = File.join(Tasker::Engine.root, 'config', 'tasker', 'system_events.yml')
|
66
|
+
|
67
|
+
unless File.exist?(yaml_file)
|
68
|
+
Rails.logger.warn("EventDefinitions: system_events.yml not found at #{yaml_file}")
|
69
|
+
return {}
|
70
|
+
end
|
71
|
+
|
72
|
+
yaml_data = YAML.load_file(yaml_file)
|
73
|
+
events_data = yaml_data['event_metadata'] || {}
|
74
|
+
|
75
|
+
# Flatten nested events structure
|
76
|
+
flattened = {}
|
77
|
+
events_data.each do |category, category_events|
|
78
|
+
category_events.each do |event_key, event_data|
|
79
|
+
# Generate the full key for this event
|
80
|
+
full_key = "#{category}_#{event_key}"
|
81
|
+
|
82
|
+
# Get the constant reference and resolve it to actual constant value
|
83
|
+
constant_ref = event_data['constant_ref']
|
84
|
+
constant_value = resolve_constant_reference(constant_ref)
|
85
|
+
|
86
|
+
if constant_value
|
87
|
+
# Enhance event data with resolved constant and category
|
88
|
+
enhanced_data = event_data.merge(
|
89
|
+
'constant' => constant_value,
|
90
|
+
'category' => category,
|
91
|
+
'key' => event_key
|
92
|
+
)
|
93
|
+
flattened[full_key] = enhanced_data
|
94
|
+
else
|
95
|
+
Rails.logger.warn("EventDefinitions: Could not resolve constant #{constant_ref}")
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
flattened
|
101
|
+
rescue StandardError => e
|
102
|
+
Rails.logger.error("EventDefinitions: Failed to load event metadata: #{e.message}")
|
103
|
+
{}
|
104
|
+
end
|
105
|
+
|
106
|
+
# Resolve constant reference to actual constant value
|
107
|
+
#
|
108
|
+
# @param constant_ref [String] The constant reference (e.g., "Tasker::Constants::TaskEvents::COMPLETED")
|
109
|
+
# @return [String, nil] The constant value or nil if not found
|
110
|
+
def resolve_constant_reference(constant_ref)
|
111
|
+
return nil unless constant_ref
|
112
|
+
|
113
|
+
# Split the constant reference and navigate to it
|
114
|
+
# E.g., "Tasker::Constants::TaskEvents::COMPLETED" -> ["Tasker", "Constants", "TaskEvents", "COMPLETED"]
|
115
|
+
parts = constant_ref.split('::')
|
116
|
+
|
117
|
+
# Start with the root constant (Tasker)
|
118
|
+
current = Object.const_get(parts.first)
|
119
|
+
|
120
|
+
# Navigate through the nested constants
|
121
|
+
parts[1..].each do |part|
|
122
|
+
current = current.const_get(part)
|
123
|
+
end
|
124
|
+
|
125
|
+
current
|
126
|
+
rescue NameError => e
|
127
|
+
Rails.logger.debug { "EventDefinitions: Cannot resolve constant #{constant_ref}: #{e.message}" }
|
128
|
+
nil
|
129
|
+
end
|
130
|
+
|
131
|
+
# Build all events grouped by category
|
132
|
+
#
|
133
|
+
# @return [Hash] Events grouped by category
|
134
|
+
def build_all_events
|
135
|
+
grouped = Hash.new { |h, k| h[k] = {} }
|
136
|
+
|
137
|
+
event_metadata.each do |event_key, event_data|
|
138
|
+
category = event_data['category']
|
139
|
+
grouped[category][event_key] = event_data
|
140
|
+
end
|
141
|
+
|
142
|
+
grouped
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# typed: false
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module Tasker
|
5
|
+
module Constants
|
6
|
+
# Registry system events
|
7
|
+
#
|
8
|
+
# Events published by registry systems for registration,
|
9
|
+
# unregistration, validation, and coordination activities.
|
10
|
+
module RegistryEvents
|
11
|
+
# Handler registration events
|
12
|
+
HANDLER_REGISTERED = 'handler.registered'
|
13
|
+
HANDLER_UNREGISTERED = 'handler.unregistered'
|
14
|
+
HANDLER_VALIDATION_FAILED = 'handler.validation_failed'
|
15
|
+
|
16
|
+
# Plugin registration events
|
17
|
+
PLUGIN_REGISTERED = 'plugin.registered'
|
18
|
+
PLUGIN_UNREGISTERED = 'plugin.unregistered'
|
19
|
+
PLUGIN_VALIDATION_FAILED = 'plugin.validation_failed'
|
20
|
+
|
21
|
+
# Subscriber registration events
|
22
|
+
SUBSCRIBER_REGISTERED = 'subscriber.registered'
|
23
|
+
SUBSCRIBER_UNREGISTERED = 'subscriber.unregistered'
|
24
|
+
SUBSCRIBER_VALIDATION_FAILED = 'subscriber.validation_failed'
|
25
|
+
|
26
|
+
# Registry coordination events
|
27
|
+
REGISTRY_SYNC_REQUESTED = 'registry.sync_requested'
|
28
|
+
REGISTRY_HEALTH_CHECK = 'registry.health_check'
|
29
|
+
REGISTRY_STATS_COLLECTED = 'registry.stats_collected'
|
30
|
+
|
31
|
+
# Cross-registry events
|
32
|
+
CROSS_REGISTRY_DISCOVERY = 'registry.cross_discovery'
|
33
|
+
REGISTRY_COORDINATION_COMPLETE = 'registry.coordination_complete'
|
34
|
+
|
35
|
+
# All registry events for convenient bulk subscription
|
36
|
+
ALL_REGISTRY_EVENTS = [
|
37
|
+
HANDLER_REGISTERED,
|
38
|
+
HANDLER_UNREGISTERED,
|
39
|
+
HANDLER_VALIDATION_FAILED,
|
40
|
+
PLUGIN_REGISTERED,
|
41
|
+
PLUGIN_UNREGISTERED,
|
42
|
+
PLUGIN_VALIDATION_FAILED,
|
43
|
+
SUBSCRIBER_REGISTERED,
|
44
|
+
SUBSCRIBER_UNREGISTERED,
|
45
|
+
SUBSCRIBER_VALIDATION_FAILED,
|
46
|
+
REGISTRY_SYNC_REQUESTED,
|
47
|
+
REGISTRY_HEALTH_CHECK,
|
48
|
+
REGISTRY_STATS_COLLECTED,
|
49
|
+
CROSS_REGISTRY_DISCOVERY,
|
50
|
+
REGISTRY_COORDINATION_COMPLETE
|
51
|
+
].freeze
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|