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,417 @@
|
|
1
|
+
# typed: false
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require_relative 'events/definition_loader'
|
5
|
+
require_relative 'constants/event_definitions'
|
6
|
+
|
7
|
+
module Tasker
|
8
|
+
# Constants used throughout the Tasker gem
|
9
|
+
#
|
10
|
+
# This module contains constants for workflow step and task statuses,
|
11
|
+
# validation states, and configuration schemas.
|
12
|
+
#
|
13
|
+
# Event constants are generated from YAML definitions in config/tasker/system_events.yml
|
14
|
+
# Run `rake tasker:generate_constants` to regenerate after YAML changes.
|
15
|
+
module Constants
|
16
|
+
# Status values for workflow steps
|
17
|
+
module WorkflowStepStatuses
|
18
|
+
# Step is waiting to be processed
|
19
|
+
PENDING = 'pending'
|
20
|
+
# Step is currently being processed
|
21
|
+
IN_PROGRESS = 'in_progress'
|
22
|
+
# Step encountered an error during processing
|
23
|
+
ERROR = 'error'
|
24
|
+
# Step completed successfully
|
25
|
+
COMPLETE = 'complete'
|
26
|
+
# Step was manually marked as resolved
|
27
|
+
RESOLVED_MANUALLY = 'resolved_manually'
|
28
|
+
# Step was cancelled
|
29
|
+
CANCELLED = 'cancelled'
|
30
|
+
end
|
31
|
+
|
32
|
+
# Status values for tasks
|
33
|
+
module TaskStatuses
|
34
|
+
# Task is waiting to be processed
|
35
|
+
PENDING = 'pending'
|
36
|
+
# Task is currently being processed
|
37
|
+
IN_PROGRESS = 'in_progress'
|
38
|
+
# Task encountered an error during processing
|
39
|
+
ERROR = 'error'
|
40
|
+
# Task completed successfully
|
41
|
+
COMPLETE = 'complete'
|
42
|
+
# Task was manually marked as resolved
|
43
|
+
RESOLVED_MANUALLY = 'resolved_manually'
|
44
|
+
# Task was cancelled
|
45
|
+
CANCELLED = 'cancelled'
|
46
|
+
end
|
47
|
+
|
48
|
+
# Task execution context status values from TaskExecutionContext view
|
49
|
+
module TaskExecution
|
50
|
+
# Execution status values - indicate current workflow execution state
|
51
|
+
module ExecutionStatus
|
52
|
+
# Task has steps ready for immediate execution
|
53
|
+
HAS_READY_STEPS = 'has_ready_steps'
|
54
|
+
# Task has steps currently being processed
|
55
|
+
PROCESSING = 'processing'
|
56
|
+
# Task is blocked by failed steps with no ready steps
|
57
|
+
BLOCKED_BY_FAILURES = 'blocked_by_failures'
|
58
|
+
# All task steps have completed successfully
|
59
|
+
ALL_COMPLETE = 'all_complete'
|
60
|
+
# Task is waiting for step dependencies to be satisfied
|
61
|
+
WAITING_FOR_DEPENDENCIES = 'waiting_for_dependencies'
|
62
|
+
end
|
63
|
+
|
64
|
+
# Recommended action values - indicate what should happen next
|
65
|
+
module RecommendedAction
|
66
|
+
# Execute the steps that are ready for processing
|
67
|
+
EXECUTE_READY_STEPS = 'execute_ready_steps'
|
68
|
+
# Wait for currently processing steps to complete
|
69
|
+
WAIT_FOR_COMPLETION = 'wait_for_completion'
|
70
|
+
# Handle failed steps that are blocking progress
|
71
|
+
HANDLE_FAILURES = 'handle_failures'
|
72
|
+
# Finalize the task as all steps are complete
|
73
|
+
FINALIZE_TASK = 'finalize_task'
|
74
|
+
# Wait for dependencies to be satisfied
|
75
|
+
WAIT_FOR_DEPENDENCIES = 'wait_for_dependencies'
|
76
|
+
end
|
77
|
+
|
78
|
+
# Health status values - indicate overall workflow health
|
79
|
+
module HealthStatus
|
80
|
+
# No failed steps, workflow is healthy
|
81
|
+
HEALTHY = 'healthy'
|
82
|
+
# Has failed steps but also has ready steps (can make progress)
|
83
|
+
RECOVERING = 'recovering'
|
84
|
+
# Has failed steps and no ready steps (intervention needed)
|
85
|
+
BLOCKED = 'blocked'
|
86
|
+
# Health status cannot be determined
|
87
|
+
UNKNOWN = 'unknown'
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
# All valid status values for workflow steps
|
92
|
+
VALID_WORKFLOW_STEP_STATUSES = [
|
93
|
+
WorkflowStepStatuses::PENDING,
|
94
|
+
WorkflowStepStatuses::IN_PROGRESS,
|
95
|
+
WorkflowStepStatuses::ERROR,
|
96
|
+
WorkflowStepStatuses::COMPLETE,
|
97
|
+
WorkflowStepStatuses::CANCELLED,
|
98
|
+
WorkflowStepStatuses::RESOLVED_MANUALLY
|
99
|
+
].freeze
|
100
|
+
|
101
|
+
# Status values for steps that are not ready to be processed
|
102
|
+
UNREADY_WORKFLOW_STEP_STATUSES = [
|
103
|
+
WorkflowStepStatuses::IN_PROGRESS,
|
104
|
+
WorkflowStepStatuses::COMPLETE,
|
105
|
+
WorkflowStepStatuses::CANCELLED,
|
106
|
+
WorkflowStepStatuses::RESOLVED_MANUALLY
|
107
|
+
].freeze
|
108
|
+
|
109
|
+
# All valid status values for tasks
|
110
|
+
VALID_TASK_STATUSES = [
|
111
|
+
TaskStatuses::PENDING,
|
112
|
+
TaskStatuses::IN_PROGRESS,
|
113
|
+
TaskStatuses::ERROR,
|
114
|
+
TaskStatuses::COMPLETE,
|
115
|
+
TaskStatuses::CANCELLED,
|
116
|
+
TaskStatuses::RESOLVED_MANUALLY
|
117
|
+
].freeze
|
118
|
+
|
119
|
+
# Step status values that indicate completion (success or otherwise)
|
120
|
+
VALID_STEP_COMPLETION_STATES = [
|
121
|
+
WorkflowStepStatuses::COMPLETE,
|
122
|
+
WorkflowStepStatuses::RESOLVED_MANUALLY,
|
123
|
+
WorkflowStepStatuses::CANCELLED
|
124
|
+
].freeze
|
125
|
+
|
126
|
+
# Step status values that indicate the step is still in a working state
|
127
|
+
VALID_STEP_STILL_WORKING_STATES = [WorkflowStepStatuses::PENDING, WorkflowStepStatuses::IN_PROGRESS].freeze
|
128
|
+
|
129
|
+
# All valid execution status values from TaskExecutionContext view
|
130
|
+
VALID_TASK_EXECUTION_STATUSES = [
|
131
|
+
TaskExecution::ExecutionStatus::HAS_READY_STEPS,
|
132
|
+
TaskExecution::ExecutionStatus::PROCESSING,
|
133
|
+
TaskExecution::ExecutionStatus::BLOCKED_BY_FAILURES,
|
134
|
+
TaskExecution::ExecutionStatus::ALL_COMPLETE,
|
135
|
+
TaskExecution::ExecutionStatus::WAITING_FOR_DEPENDENCIES
|
136
|
+
].freeze
|
137
|
+
|
138
|
+
# All valid recommended action values from TaskExecutionContext view
|
139
|
+
VALID_TASK_RECOMMENDED_ACTIONS = [
|
140
|
+
TaskExecution::RecommendedAction::EXECUTE_READY_STEPS,
|
141
|
+
TaskExecution::RecommendedAction::WAIT_FOR_COMPLETION,
|
142
|
+
TaskExecution::RecommendedAction::HANDLE_FAILURES,
|
143
|
+
TaskExecution::RecommendedAction::FINALIZE_TASK,
|
144
|
+
TaskExecution::RecommendedAction::WAIT_FOR_DEPENDENCIES
|
145
|
+
].freeze
|
146
|
+
|
147
|
+
# All valid health status values from TaskExecutionContext view
|
148
|
+
VALID_TASK_HEALTH_STATUSES = [
|
149
|
+
TaskExecution::HealthStatus::HEALTHY,
|
150
|
+
TaskExecution::HealthStatus::RECOVERING,
|
151
|
+
TaskExecution::HealthStatus::BLOCKED,
|
152
|
+
TaskExecution::HealthStatus::UNKNOWN
|
153
|
+
].freeze
|
154
|
+
|
155
|
+
# Execution statuses that indicate the task can make immediate progress
|
156
|
+
ACTIONABLE_TASK_EXECUTION_STATUSES = [
|
157
|
+
TaskExecution::ExecutionStatus::HAS_READY_STEPS
|
158
|
+
].freeze
|
159
|
+
|
160
|
+
# Execution statuses that indicate the task should be re-enqueued for later
|
161
|
+
REENQUEUE_TASK_EXECUTION_STATUSES = [
|
162
|
+
TaskExecution::ExecutionStatus::PROCESSING,
|
163
|
+
TaskExecution::ExecutionStatus::WAITING_FOR_DEPENDENCIES
|
164
|
+
].freeze
|
165
|
+
|
166
|
+
# Execution statuses that indicate the task needs intervention
|
167
|
+
INTERVENTION_TASK_EXECUTION_STATUSES = [
|
168
|
+
TaskExecution::ExecutionStatus::BLOCKED_BY_FAILURES
|
169
|
+
].freeze
|
170
|
+
|
171
|
+
# Default value for unknown identifiers
|
172
|
+
UNKNOWN = 'unknown'
|
173
|
+
|
174
|
+
# JSON schema for validating task handler YAML configurations
|
175
|
+
YAML_SCHEMA = {
|
176
|
+
type: 'object',
|
177
|
+
required: %w[name task_handler_class step_templates],
|
178
|
+
properties: {
|
179
|
+
name: { type: 'string' },
|
180
|
+
module_namespace: { type: 'string', default: nil },
|
181
|
+
task_handler_class: { type: 'string' },
|
182
|
+
concurrent: { type: 'boolean', default: true },
|
183
|
+
default_dependent_system: { type: 'string' },
|
184
|
+
named_steps: {
|
185
|
+
type: 'array',
|
186
|
+
items: { type: 'string' }
|
187
|
+
},
|
188
|
+
schema: { type: 'object' },
|
189
|
+
step_templates: {
|
190
|
+
type: 'array',
|
191
|
+
items: {
|
192
|
+
type: 'object',
|
193
|
+
required: %w[name handler_class],
|
194
|
+
properties: {
|
195
|
+
dependent_system: { type: 'string' },
|
196
|
+
name: { type: 'string' },
|
197
|
+
description: { type: 'string' },
|
198
|
+
default_retryable: { type: 'boolean' },
|
199
|
+
default_retry_limit: { type: 'integer' },
|
200
|
+
skippable: { type: 'boolean' },
|
201
|
+
handler_class: { type: 'string' },
|
202
|
+
depends_on_step: { type: 'string' },
|
203
|
+
depends_on_steps: {
|
204
|
+
type: 'array',
|
205
|
+
items: { type: 'string' }
|
206
|
+
},
|
207
|
+
handler_config: { type: 'object' },
|
208
|
+
custom_events: {
|
209
|
+
type: 'array',
|
210
|
+
items: {
|
211
|
+
type: 'object',
|
212
|
+
required: %w[name],
|
213
|
+
properties: {
|
214
|
+
name: { type: 'string' },
|
215
|
+
description: { type: 'string' }
|
216
|
+
}
|
217
|
+
}
|
218
|
+
}
|
219
|
+
}
|
220
|
+
}
|
221
|
+
},
|
222
|
+
environments: {
|
223
|
+
type: 'object',
|
224
|
+
additionalProperties: {
|
225
|
+
type: 'object',
|
226
|
+
properties: {
|
227
|
+
step_templates: {
|
228
|
+
type: 'array',
|
229
|
+
items: {
|
230
|
+
type: 'object',
|
231
|
+
required: %w[name],
|
232
|
+
properties: {
|
233
|
+
name: { type: 'string' },
|
234
|
+
handler_config: { type: 'object' }
|
235
|
+
}
|
236
|
+
}
|
237
|
+
}
|
238
|
+
}
|
239
|
+
}
|
240
|
+
}
|
241
|
+
}
|
242
|
+
}.freeze
|
243
|
+
|
244
|
+
# Task lifecycle event constants
|
245
|
+
module TaskEvents
|
246
|
+
INITIALIZE_REQUESTED = 'task.initialize_requested'
|
247
|
+
START_REQUESTED = 'task.start_requested'
|
248
|
+
COMPLETED = 'task.completed'
|
249
|
+
FAILED = 'task.failed'
|
250
|
+
RETRY_REQUESTED = 'task.retry_requested'
|
251
|
+
CANCELLED = 'task.cancelled'
|
252
|
+
RESOLVED_MANUALLY = 'task.resolved_manually'
|
253
|
+
BEFORE_TRANSITION = 'task.before_transition'
|
254
|
+
end
|
255
|
+
|
256
|
+
# Step lifecycle event constants
|
257
|
+
module StepEvents
|
258
|
+
INITIALIZE_REQUESTED = 'step.initialize_requested'
|
259
|
+
EXECUTION_REQUESTED = 'step.execution_requested'
|
260
|
+
BEFORE_HANDLE = 'step.before_handle'
|
261
|
+
HANDLE = 'step.handle'
|
262
|
+
COMPLETED = 'step.completed'
|
263
|
+
FAILED = 'step.failed'
|
264
|
+
RETRY_REQUESTED = 'step.retry_requested'
|
265
|
+
CANCELLED = 'step.cancelled'
|
266
|
+
RESOLVED_MANUALLY = 'step.resolved_manually'
|
267
|
+
BEFORE_TRANSITION = 'step.before_transition'
|
268
|
+
end
|
269
|
+
|
270
|
+
# Workflow orchestration event constants
|
271
|
+
module WorkflowEvents
|
272
|
+
TASK_STARTED = 'workflow.task_started'
|
273
|
+
TASK_COMPLETED = 'workflow.task_completed'
|
274
|
+
TASK_FAILED = 'workflow.task_failed'
|
275
|
+
STEP_COMPLETED = 'workflow.step_completed'
|
276
|
+
STEP_FAILED = 'workflow.step_failed'
|
277
|
+
VIABLE_STEPS_DISCOVERED = 'workflow.viable_steps_discovered'
|
278
|
+
NO_VIABLE_STEPS = 'workflow.no_viable_steps'
|
279
|
+
ORCHESTRATION_REQUESTED = 'workflow.orchestration_requested'
|
280
|
+
TASK_FINALIZATION_STARTED = 'workflow.task_finalization_started'
|
281
|
+
TASK_FINALIZATION_COMPLETED = 'workflow.task_finalization_completed'
|
282
|
+
TASK_REENQUEUE_STARTED = 'workflow.task_reenqueue_started'
|
283
|
+
TASK_REENQUEUE_REQUESTED = 'workflow.task_reenqueue_requested'
|
284
|
+
TASK_REENQUEUE_FAILED = 'workflow.task_reenqueue_failed'
|
285
|
+
TASK_REENQUEUE_DELAYED = 'workflow.task_reenqueue_delayed'
|
286
|
+
TASK_STATE_UNCLEAR = 'workflow.task_state_unclear'
|
287
|
+
STEP_EXECUTION_FAILED = 'workflow.step_execution_failed'
|
288
|
+
VIABLE_STEPS_BATCH_READY = 'workflow.viable_steps_batch_ready'
|
289
|
+
STEPS_EXECUTION_STARTED = 'workflow.steps_execution_started'
|
290
|
+
STEPS_EXECUTION_COMPLETED = 'workflow.steps_execution_completed'
|
291
|
+
end
|
292
|
+
|
293
|
+
# Observability and telemetry event constants
|
294
|
+
module ObservabilityEvents
|
295
|
+
# Task-level observability events
|
296
|
+
module Task
|
297
|
+
HANDLE = 'observability.task.handle'
|
298
|
+
ENQUEUE = 'observability.task.enqueue'
|
299
|
+
FINALIZE = 'observability.task.finalize'
|
300
|
+
end
|
301
|
+
|
302
|
+
# Step-level observability events
|
303
|
+
module Step
|
304
|
+
HANDLE = 'observability.step.handle'
|
305
|
+
FIND_VIABLE = 'observability.step.find_viable'
|
306
|
+
BACKOFF = 'observability.step.backoff'
|
307
|
+
SKIP = 'observability.step.skip'
|
308
|
+
MAX_RETRIES_REACHED = 'observability.step.max_retries_reached'
|
309
|
+
end
|
310
|
+
end
|
311
|
+
|
312
|
+
# Test event constants
|
313
|
+
module TestEvents
|
314
|
+
BASIC_EVENT = 'test.event'
|
315
|
+
SLOW_EVENT = 'slow.event'
|
316
|
+
TEST_EVENT = 'test.event'
|
317
|
+
CUSTOM_EVENT = 'custom.event'
|
318
|
+
# Alternative casing event for testing
|
319
|
+
TEST_DOT_EVENT = 'Test.Event'
|
320
|
+
end
|
321
|
+
|
322
|
+
# Task finalization reason constants
|
323
|
+
module TaskFinalization
|
324
|
+
# Error messages for task failure scenarios
|
325
|
+
module ErrorMessages
|
326
|
+
STEPS_IN_ERROR_STATE = 'steps_in_error_state'
|
327
|
+
end
|
328
|
+
|
329
|
+
# Reasons for re-enqueueing tasks (asynchronous processing)
|
330
|
+
module ReenqueueReasons
|
331
|
+
# Unable to determine context
|
332
|
+
CONTEXT_UNAVAILABLE = 'context_unavailable'
|
333
|
+
# Steps are currently in progress
|
334
|
+
STEPS_IN_PROGRESS = 'steps_in_progress'
|
335
|
+
# Waiting for dependency completion
|
336
|
+
AWAITING_DEPENDENCIES = 'awaiting_dependencies'
|
337
|
+
# Ready steps are available for processing
|
338
|
+
READY_STEPS_AVAILABLE = 'ready_steps_available'
|
339
|
+
# General workflow continuation
|
340
|
+
CONTINUING_WORKFLOW = 'continuing_workflow'
|
341
|
+
# Default reason for pending steps (from TaskReenqueuer)
|
342
|
+
PENDING_STEPS_REMAINING = 'pending_steps_remaining'
|
343
|
+
# Default reason for retry backoff (from TaskReenqueuer)
|
344
|
+
RETRY_BACKOFF = 'retry_backoff'
|
345
|
+
end
|
346
|
+
|
347
|
+
# Reasons for setting tasks to pending (synchronous processing)
|
348
|
+
module PendingReasons
|
349
|
+
# Unable to determine context
|
350
|
+
CONTEXT_UNAVAILABLE = 'context_unavailable'
|
351
|
+
# Waiting for current steps to complete
|
352
|
+
WAITING_FOR_STEP_COMPLETION = 'waiting_for_step_completion'
|
353
|
+
# Waiting for dependencies to be satisfied
|
354
|
+
WAITING_FOR_DEPENDENCIES = 'waiting_for_dependencies'
|
355
|
+
# Ready for immediate processing
|
356
|
+
READY_FOR_PROCESSING = 'ready_for_processing'
|
357
|
+
# Workflow temporarily paused
|
358
|
+
WORKFLOW_PAUSED = 'workflow_paused'
|
359
|
+
end
|
360
|
+
end
|
361
|
+
|
362
|
+
# All valid re-enqueue reason values for task finalization
|
363
|
+
VALID_TASK_REENQUEUE_REASONS = [
|
364
|
+
TaskFinalization::ReenqueueReasons::CONTEXT_UNAVAILABLE,
|
365
|
+
TaskFinalization::ReenqueueReasons::STEPS_IN_PROGRESS,
|
366
|
+
TaskFinalization::ReenqueueReasons::AWAITING_DEPENDENCIES,
|
367
|
+
TaskFinalization::ReenqueueReasons::READY_STEPS_AVAILABLE,
|
368
|
+
TaskFinalization::ReenqueueReasons::CONTINUING_WORKFLOW,
|
369
|
+
TaskFinalization::ReenqueueReasons::PENDING_STEPS_REMAINING,
|
370
|
+
TaskFinalization::ReenqueueReasons::RETRY_BACKOFF
|
371
|
+
].freeze
|
372
|
+
|
373
|
+
# All valid pending reason values for task finalization
|
374
|
+
VALID_TASK_PENDING_REASONS = [
|
375
|
+
TaskFinalization::PendingReasons::CONTEXT_UNAVAILABLE,
|
376
|
+
TaskFinalization::PendingReasons::WAITING_FOR_STEP_COMPLETION,
|
377
|
+
TaskFinalization::PendingReasons::WAITING_FOR_DEPENDENCIES,
|
378
|
+
TaskFinalization::PendingReasons::READY_FOR_PROCESSING,
|
379
|
+
TaskFinalization::PendingReasons::WORKFLOW_PAUSED
|
380
|
+
].freeze
|
381
|
+
|
382
|
+
# Task Transition Event Map
|
383
|
+
TASK_TRANSITION_EVENT_MAP = {
|
384
|
+
# Initial state transitions (from nil/initial)
|
385
|
+
[nil, TaskStatuses::PENDING] => TaskEvents::INITIALIZE_REQUESTED,
|
386
|
+
[nil, TaskStatuses::IN_PROGRESS] => TaskEvents::START_REQUESTED,
|
387
|
+
[nil, TaskStatuses::COMPLETE] => TaskEvents::COMPLETED,
|
388
|
+
[nil, TaskStatuses::ERROR] => TaskEvents::FAILED,
|
389
|
+
[nil, TaskStatuses::CANCELLED] => TaskEvents::CANCELLED,
|
390
|
+
[nil, TaskStatuses::RESOLVED_MANUALLY] => TaskEvents::RESOLVED_MANUALLY,
|
391
|
+
|
392
|
+
# Normal state transitions
|
393
|
+
[TaskStatuses::PENDING,
|
394
|
+
TaskStatuses::IN_PROGRESS] => TaskEvents::START_REQUESTED,
|
395
|
+
[TaskStatuses::PENDING, TaskStatuses::CANCELLED] => TaskEvents::CANCELLED,
|
396
|
+
[TaskStatuses::PENDING, TaskStatuses::ERROR] => TaskEvents::FAILED,
|
397
|
+
|
398
|
+
[TaskStatuses::IN_PROGRESS,
|
399
|
+
TaskStatuses::PENDING] => TaskEvents::INITIALIZE_REQUESTED,
|
400
|
+
[TaskStatuses::IN_PROGRESS,
|
401
|
+
TaskStatuses::COMPLETE] => TaskEvents::COMPLETED,
|
402
|
+
[TaskStatuses::IN_PROGRESS, TaskStatuses::ERROR] => TaskEvents::FAILED,
|
403
|
+
[TaskStatuses::IN_PROGRESS,
|
404
|
+
TaskStatuses::CANCELLED] => TaskEvents::CANCELLED,
|
405
|
+
|
406
|
+
[TaskStatuses::ERROR,
|
407
|
+
TaskStatuses::PENDING] => TaskEvents::RETRY_REQUESTED,
|
408
|
+
[TaskStatuses::ERROR,
|
409
|
+
TaskStatuses::RESOLVED_MANUALLY] => TaskEvents::RESOLVED_MANUALLY,
|
410
|
+
|
411
|
+
# New transitions for admin override scenarios
|
412
|
+
[TaskStatuses::COMPLETE, TaskStatuses::CANCELLED] => TaskEvents::CANCELLED,
|
413
|
+
[TaskStatuses::RESOLVED_MANUALLY,
|
414
|
+
TaskStatuses::CANCELLED] => TaskEvents::CANCELLED
|
415
|
+
}.freeze
|
416
|
+
end
|
417
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Rails engine for Tasker gem
|
4
|
+
#
|
5
|
+
# This engine handles Rails-specific setup, autoloading configuration,
|
6
|
+
# and loading of production runtime components. Development/test-only
|
7
|
+
# dependencies are handled by the Gemfile and should not be loaded here.
|
8
|
+
|
9
|
+
# Required Rails framework
|
10
|
+
require 'rails'
|
11
|
+
|
12
|
+
# Runtime dependencies from gemspec that need explicit loading
|
13
|
+
require 'active_model_serializers'
|
14
|
+
require 'graphql'
|
15
|
+
require 'json-schema'
|
16
|
+
require 'pg'
|
17
|
+
require 'faraday'
|
18
|
+
require 'scenic'
|
19
|
+
|
20
|
+
module Tasker
|
21
|
+
class Engine < ::Rails::Engine
|
22
|
+
isolate_namespace Tasker
|
23
|
+
|
24
|
+
# Configure paths before initialization to let Zeitwerk handle autoloading
|
25
|
+
config.before_configuration do |app|
|
26
|
+
app.config.autoload_paths << root.join('lib')
|
27
|
+
app.config.eager_load_paths << root.join('lib')
|
28
|
+
end
|
29
|
+
|
30
|
+
# Validate required configuration files
|
31
|
+
initializer 'tasker.validate_configuration', before: :load_config_initializers do |_app|
|
32
|
+
# Check for required system configuration files
|
33
|
+
system_events_yaml = root.join('config', 'tasker', 'system_events.yml')
|
34
|
+
|
35
|
+
unless File.exist?(system_events_yaml)
|
36
|
+
raise Tasker::ConfigurationError,
|
37
|
+
"Required configuration file missing: #{system_events_yaml}. " \
|
38
|
+
'This file contains essential state machine mappings for Tasker. ' \
|
39
|
+
'Please ensure it exists or reinstall the gem.'
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# Initialize essential components before app initialization
|
44
|
+
initializer 'tasker.setup', before: :load_config_initializers do |_app|
|
45
|
+
# Load core components that need explicit initialization
|
46
|
+
require 'tasker/constants'
|
47
|
+
require 'tasker/configuration'
|
48
|
+
require 'tasker/types'
|
49
|
+
require 'tasker/handler_factory'
|
50
|
+
require 'tasker/identity_strategy'
|
51
|
+
require 'tasker/task_handler'
|
52
|
+
require 'tasker/task_builder'
|
53
|
+
require 'tasker/state_machine'
|
54
|
+
require 'tasker/orchestration'
|
55
|
+
require 'tasker/events'
|
56
|
+
require 'tasker/events/publisher'
|
57
|
+
require 'tasker/events/catalog'
|
58
|
+
require 'tasker/events/subscribers/base_subscriber'
|
59
|
+
require 'tasker/events/subscribers/telemetry_subscriber'
|
60
|
+
require 'tasker/functions'
|
61
|
+
|
62
|
+
# Configure Statesman for state machine support
|
63
|
+
Tasker::StateMachine.configure_statesman
|
64
|
+
|
65
|
+
# Configure generators for Rails integration
|
66
|
+
config.generators.api_only = true
|
67
|
+
config.generators.test_framework = :rspec
|
68
|
+
config.application_controller = 'ActionController::API'
|
69
|
+
end
|
70
|
+
|
71
|
+
# Initialize orchestration system after Rails is fully loaded
|
72
|
+
initializer 'tasker.orchestration', after: :load_config_initializers do |_app|
|
73
|
+
# Initialize the orchestration system in all environments
|
74
|
+
# This ensures consistent behavior between test, development, and production
|
75
|
+
Tasker::Orchestration::Coordinator.initialize!
|
76
|
+
end
|
77
|
+
|
78
|
+
config.generators do |g|
|
79
|
+
g.test_framework :rspec
|
80
|
+
g.fixture_replacement :factory_bot
|
81
|
+
g.factory_bot dir: 'spec/factories'
|
82
|
+
end
|
83
|
+
|
84
|
+
class << self
|
85
|
+
def configure(&)
|
86
|
+
yield(Engine.config)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Tasker
|
4
|
+
# Base error class for all Tasker-related errors
|
5
|
+
class Error < StandardError; end
|
6
|
+
|
7
|
+
# Raised when there are configuration-related issues in Tasker
|
8
|
+
class ConfigurationError < Error; end
|
9
|
+
|
10
|
+
# Base class for all Tasker-specific errors that occur during workflow execution
|
11
|
+
class ProceduralError < Error; end
|
12
|
+
|
13
|
+
# Error indicating a step failed but should be retried with backoff
|
14
|
+
#
|
15
|
+
# Use this error when an operation fails due to temporary conditions like:
|
16
|
+
# - Network timeouts
|
17
|
+
# - Rate limiting (429 status)
|
18
|
+
# - Server errors (5xx status)
|
19
|
+
# - Temporary service unavailability
|
20
|
+
#
|
21
|
+
# @example Basic retryable error
|
22
|
+
# raise Tasker::RetryableError, "Payment service timeout"
|
23
|
+
#
|
24
|
+
# @example With retry delay
|
25
|
+
# raise Tasker::RetryableError.new("Rate limited", retry_after: 60)
|
26
|
+
#
|
27
|
+
# @example With context for monitoring
|
28
|
+
# raise Tasker::RetryableError.new(
|
29
|
+
# "External API unavailable",
|
30
|
+
# retry_after: 30,
|
31
|
+
# context: { service: 'billing_api', error_code: 503 }
|
32
|
+
# )
|
33
|
+
class RetryableError < ProceduralError
|
34
|
+
# @return [Integer, nil] Suggested retry delay in seconds
|
35
|
+
attr_reader :retry_after
|
36
|
+
|
37
|
+
# @return [Hash] Additional context for error monitoring and debugging
|
38
|
+
attr_reader :context
|
39
|
+
|
40
|
+
# @param message [String] Error message
|
41
|
+
# @param retry_after [Integer, nil] Suggested retry delay in seconds
|
42
|
+
# @param context [Hash] Additional context for monitoring
|
43
|
+
def initialize(message, retry_after: nil, context: {})
|
44
|
+
super(message)
|
45
|
+
@retry_after = retry_after
|
46
|
+
@context = context
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# Error indicating a step failed permanently and should not be retried
|
51
|
+
#
|
52
|
+
# Use this error when an operation fails due to permanent conditions like:
|
53
|
+
# - Invalid request data (400 status)
|
54
|
+
# - Authentication/authorization failures (401/403 status)
|
55
|
+
# - Validation errors (422 status)
|
56
|
+
# - Resource not found when it should exist (404 status in some contexts)
|
57
|
+
# - Business logic violations
|
58
|
+
#
|
59
|
+
# @example Basic permanent error
|
60
|
+
# raise Tasker::PermanentError, "Invalid user ID format"
|
61
|
+
#
|
62
|
+
# @example With error code for categorization
|
63
|
+
# raise Tasker::PermanentError.new(
|
64
|
+
# "Insufficient funds for transaction",
|
65
|
+
# error_code: 'INSUFFICIENT_FUNDS'
|
66
|
+
# )
|
67
|
+
#
|
68
|
+
# @example With context for monitoring
|
69
|
+
# raise Tasker::PermanentError.new(
|
70
|
+
# "User not authorized for this operation",
|
71
|
+
# error_code: 'AUTHORIZATION_FAILED',
|
72
|
+
# context: { user_id: 123, operation: 'admin_access' }
|
73
|
+
# )
|
74
|
+
class PermanentError < ProceduralError
|
75
|
+
# @return [String, nil] Machine-readable error code for categorization
|
76
|
+
attr_reader :error_code
|
77
|
+
|
78
|
+
# @return [Hash] Additional context for error monitoring and debugging
|
79
|
+
attr_reader :context
|
80
|
+
|
81
|
+
# @param message [String] Error message
|
82
|
+
# @param error_code [String, nil] Machine-readable error code
|
83
|
+
# @param context [Hash] Additional context for monitoring
|
84
|
+
def initialize(message, error_code: nil, context: {})
|
85
|
+
super(message)
|
86
|
+
@error_code = error_code
|
87
|
+
@context = context
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|