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,131 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Tasker
|
4
|
+
module Types
|
5
|
+
# Configuration type for core engine settings
|
6
|
+
#
|
7
|
+
# This configuration handles core Tasker engine settings including task handler
|
8
|
+
# directories, identity strategies, and custom event configurations.
|
9
|
+
# It provides the same functionality as the original EngineConfiguration but with
|
10
|
+
# dry-struct type safety and immutability.
|
11
|
+
#
|
12
|
+
# @example Basic usage
|
13
|
+
# config = EngineConfig.new(
|
14
|
+
# task_handler_directory: 'app/tasks',
|
15
|
+
# identity_strategy: :hash
|
16
|
+
# )
|
17
|
+
#
|
18
|
+
# @example Full configuration
|
19
|
+
# config = EngineConfig.new(
|
20
|
+
# task_handler_directory: 'app/tasks',
|
21
|
+
# task_config_directory: 'config/tasks',
|
22
|
+
# default_module_namespace: 'MyApp::Tasks',
|
23
|
+
# identity_strategy: :custom,
|
24
|
+
# identity_strategy_class: 'MyApp::CustomIdentityStrategy',
|
25
|
+
# custom_events_directories: ['config/events', 'lib/events']
|
26
|
+
# )
|
27
|
+
class EngineConfig < BaseConfig
|
28
|
+
transform_keys(&:to_sym)
|
29
|
+
|
30
|
+
# Directory where task handlers are located
|
31
|
+
#
|
32
|
+
# @!attribute [r] task_handler_directory
|
33
|
+
# @return [String] Task handler directory path
|
34
|
+
attribute :task_handler_directory, Types::String.default('tasks')
|
35
|
+
|
36
|
+
# Directory where task configuration files are located
|
37
|
+
#
|
38
|
+
# @!attribute [r] task_config_directory
|
39
|
+
# @return [String] Task configuration directory path
|
40
|
+
attribute :task_config_directory, Types::String.default('tasker/tasks')
|
41
|
+
|
42
|
+
# Default module namespace for task handlers
|
43
|
+
#
|
44
|
+
# @!attribute [r] default_module_namespace
|
45
|
+
# @return [String, nil] Default module namespace for generated handlers
|
46
|
+
attribute? :default_module_namespace, Types::String.optional.default(nil)
|
47
|
+
|
48
|
+
# The strategy to use for generating task identities
|
49
|
+
#
|
50
|
+
# @!attribute [r] identity_strategy
|
51
|
+
# @return [Symbol] Identity strategy (:default, :hash, :custom)
|
52
|
+
attribute :identity_strategy, Types::Symbol.default(:default)
|
53
|
+
|
54
|
+
# The class name to use for custom identity strategy
|
55
|
+
#
|
56
|
+
# @!attribute [r] identity_strategy_class
|
57
|
+
# @return [String, nil] Custom identity strategy class name
|
58
|
+
attribute? :identity_strategy_class, Types::String.optional.default(nil)
|
59
|
+
|
60
|
+
# Directories to search for custom event YAML files
|
61
|
+
#
|
62
|
+
# @!attribute [r] custom_events_directories
|
63
|
+
# @return [Array<String>] Custom event directories
|
64
|
+
attribute :custom_events_directories, Types::Array.of(Types::String).default(proc {
|
65
|
+
default_custom_events_directories
|
66
|
+
}.freeze, shared: true)
|
67
|
+
|
68
|
+
# Get default custom events directories
|
69
|
+
#
|
70
|
+
# @return [Array<String>] Default directories to search for custom events
|
71
|
+
def self.default_custom_events_directories
|
72
|
+
[
|
73
|
+
'config/tasker/events'
|
74
|
+
].freeze
|
75
|
+
end
|
76
|
+
|
77
|
+
# Creates and returns an appropriate identity strategy instance
|
78
|
+
#
|
79
|
+
# @return [Tasker::IdentityStrategy] The identity strategy instance
|
80
|
+
# @raise [ArgumentError] If an invalid strategy is specified
|
81
|
+
def identity_strategy_instance
|
82
|
+
case identity_strategy
|
83
|
+
when :default
|
84
|
+
Tasker::IdentityStrategy.new
|
85
|
+
when :hash
|
86
|
+
Tasker::HashIdentityStrategy.new
|
87
|
+
when :custom
|
88
|
+
if identity_strategy_class.nil?
|
89
|
+
raise ArgumentError, 'Custom identity strategy selected but no identity_strategy_class provided'
|
90
|
+
end
|
91
|
+
|
92
|
+
begin
|
93
|
+
identity_strategy_class.constantize.new
|
94
|
+
rescue NameError => e
|
95
|
+
raise ArgumentError, "Invalid identity_strategy_class: #{e.message}"
|
96
|
+
end
|
97
|
+
else
|
98
|
+
raise ArgumentError, "Unknown identity_strategy: #{identity_strategy}"
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
# Add custom event directories to the existing configuration
|
103
|
+
#
|
104
|
+
# Since dry-struct types are immutable, this returns a new instance.
|
105
|
+
#
|
106
|
+
# @param directories [Array<String>] Additional directories to search for events
|
107
|
+
# @return [EngineConfig] New instance with updated directories
|
108
|
+
def add_custom_events_directories(*directories)
|
109
|
+
new_directories = (custom_events_directories + directories.flatten).uniq
|
110
|
+
self.class.new(to_h.merge(custom_events_directories: new_directories))
|
111
|
+
end
|
112
|
+
|
113
|
+
# Set custom event directories (replaces the default list)
|
114
|
+
#
|
115
|
+
# Since dry-struct types are immutable, this returns a new instance.
|
116
|
+
#
|
117
|
+
# @param directories [Array<String>] Directories to search for events
|
118
|
+
# @return [EngineConfig] New instance with updated directories
|
119
|
+
def set_custom_events_directories(directories)
|
120
|
+
self.class.new(to_h.merge(custom_events_directories: directories.flatten))
|
121
|
+
end
|
122
|
+
|
123
|
+
private
|
124
|
+
|
125
|
+
# Use class method for default custom events directories
|
126
|
+
def default_custom_events_directories
|
127
|
+
self.class.default_custom_events_directories
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
@@ -0,0 +1,289 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Tasker
|
4
|
+
module Types
|
5
|
+
# Configuration type for step execution and concurrency settings
|
6
|
+
#
|
7
|
+
# This configuration exposes previously hardcoded execution constants
|
8
|
+
# used in concurrent step processing, timeout handling, and memory management.
|
9
|
+
#
|
10
|
+
# Strategic Design:
|
11
|
+
# - CONFIGURABLE: Performance characteristics that vary by deployment environment
|
12
|
+
# - ARCHITECTURAL: Carefully chosen constants based on Ruby/Rails characteristics
|
13
|
+
#
|
14
|
+
# @example Basic usage
|
15
|
+
# config = ExecutionConfig.new(
|
16
|
+
# max_concurrent_steps_limit: 20, # High-performance system
|
17
|
+
# batch_timeout_base_seconds: 60 # API-heavy workflows
|
18
|
+
# )
|
19
|
+
#
|
20
|
+
# @example Environment-specific tuning
|
21
|
+
# # Development environment
|
22
|
+
# config = ExecutionConfig.new(
|
23
|
+
# min_concurrent_steps: 2,
|
24
|
+
# max_concurrent_steps_limit: 6,
|
25
|
+
# concurrency_cache_duration: 60
|
26
|
+
# )
|
27
|
+
#
|
28
|
+
# # Production environment
|
29
|
+
# config = ExecutionConfig.new(
|
30
|
+
# min_concurrent_steps: 5,
|
31
|
+
# max_concurrent_steps_limit: 25,
|
32
|
+
# batch_timeout_base_seconds: 45,
|
33
|
+
# max_batch_timeout_seconds: 300
|
34
|
+
# )
|
35
|
+
class ExecutionConfig < BaseConfig
|
36
|
+
transform_keys(&:to_sym)
|
37
|
+
|
38
|
+
# ====================
|
39
|
+
# CONFIGURABLE SETTINGS
|
40
|
+
# ====================
|
41
|
+
# These affect performance characteristics and should vary by deployment
|
42
|
+
|
43
|
+
# Minimum concurrent steps allowed
|
44
|
+
#
|
45
|
+
# Conservative bound to ensure system stability even under extreme load.
|
46
|
+
# Small systems might prefer 2, large systems might prefer 5+.
|
47
|
+
#
|
48
|
+
# @!attribute [r] min_concurrent_steps
|
49
|
+
# @return [Integer] Minimum concurrent steps (default: 3)
|
50
|
+
attribute :min_concurrent_steps, Types::Integer.default(3)
|
51
|
+
|
52
|
+
# Maximum concurrent steps limit
|
53
|
+
#
|
54
|
+
# Upper bound for dynamic concurrency calculation.
|
55
|
+
# High-performance systems with large connection pools can handle 20-30+.
|
56
|
+
# Standard deployments typically use 8-15.
|
57
|
+
#
|
58
|
+
# @!attribute [r] max_concurrent_steps_limit
|
59
|
+
# @return [Integer] Maximum concurrent steps limit (default: 12)
|
60
|
+
attribute :max_concurrent_steps_limit, Types::Integer.default(12)
|
61
|
+
|
62
|
+
# Cache duration for concurrency calculation
|
63
|
+
#
|
64
|
+
# How long to cache the calculated optimal concurrency before recalculating.
|
65
|
+
# Busy systems might want shorter cache (15s), stable systems longer (60s).
|
66
|
+
#
|
67
|
+
# @!attribute [r] concurrency_cache_duration
|
68
|
+
# @return [Integer] Cache duration in seconds (default: 30)
|
69
|
+
attribute :concurrency_cache_duration, Types::Integer.default(30)
|
70
|
+
|
71
|
+
# Base timeout for batch execution
|
72
|
+
#
|
73
|
+
# Starting timeout before per-step adjustments.
|
74
|
+
# API-heavy workflows might need 60s+, simple workflows can use 15-20s.
|
75
|
+
#
|
76
|
+
# @!attribute [r] batch_timeout_base_seconds
|
77
|
+
# @return [Integer] Base timeout in seconds (default: 30)
|
78
|
+
attribute :batch_timeout_base_seconds, Types::Integer.default(30)
|
79
|
+
|
80
|
+
# Per-step timeout addition
|
81
|
+
#
|
82
|
+
# Additional timeout per step in a batch.
|
83
|
+
# Complex steps might need 10s+, simple steps can use 2-3s.
|
84
|
+
#
|
85
|
+
# @!attribute [r] batch_timeout_per_step_seconds
|
86
|
+
# @return [Integer] Per-step timeout in seconds (default: 5)
|
87
|
+
attribute :batch_timeout_per_step_seconds, Types::Integer.default(5)
|
88
|
+
|
89
|
+
# Maximum batch timeout ceiling
|
90
|
+
#
|
91
|
+
# Absolute maximum timeout regardless of batch size.
|
92
|
+
# Long-running workflows might need 300-600s, fast workflows 60-120s.
|
93
|
+
#
|
94
|
+
# @!attribute [r] max_batch_timeout_seconds
|
95
|
+
# @return [Integer] Maximum timeout in seconds (default: 120)
|
96
|
+
attribute :max_batch_timeout_seconds, Types::Integer.default(120)
|
97
|
+
|
98
|
+
# Connection pressure response factors
|
99
|
+
#
|
100
|
+
# Configurable factors that determine how connection pressure affects
|
101
|
+
# concurrency recommendations. Higher values are more aggressive,
|
102
|
+
# lower values are more conservative.
|
103
|
+
#
|
104
|
+
# @!attribute [r] connection_pressure_factors
|
105
|
+
# @return [Hash] Pressure response factors by pressure level
|
106
|
+
attribute :connection_pressure_factors, Types::Hash.default(proc {
|
107
|
+
{
|
108
|
+
low: 0.8, # Use 80% of available when pressure is low
|
109
|
+
moderate: 0.6, # Use 60% of available when pressure is moderate
|
110
|
+
high: 0.4, # Use 40% of available when pressure is high
|
111
|
+
critical: 0.2 # Use 20% of available when pressure is critical
|
112
|
+
}
|
113
|
+
}.freeze)
|
114
|
+
|
115
|
+
# Health assessment cache duration
|
116
|
+
#
|
117
|
+
# How long to cache connection health assessments before recalculating.
|
118
|
+
# Frequent assessments provide better responsiveness but add overhead.
|
119
|
+
#
|
120
|
+
# @!attribute [r] health_assessment_cache_duration
|
121
|
+
# @return [Integer] Cache duration in seconds (default: 30)
|
122
|
+
attribute :health_assessment_cache_duration, Types::Integer.default(30)
|
123
|
+
|
124
|
+
# Connection health log level
|
125
|
+
#
|
126
|
+
# Log level for connection health assessment messages.
|
127
|
+
# Production systems typically use 'info' or 'warn'.
|
128
|
+
#
|
129
|
+
# @!attribute [r] connection_health_log_level
|
130
|
+
# @return [String] Log level (default: 'debug')
|
131
|
+
attribute :connection_health_log_level, Types::String.default('debug')
|
132
|
+
|
133
|
+
# ====================
|
134
|
+
# ARCHITECTURAL CONSTANTS
|
135
|
+
# ====================
|
136
|
+
# These are carefully chosen based on Ruby/Rails characteristics
|
137
|
+
# and should NOT be exposed as configuration options
|
138
|
+
|
139
|
+
# Future cleanup wait time
|
140
|
+
#
|
141
|
+
# Time to wait for executing futures during cleanup.
|
142
|
+
# Based on Ruby Concurrent::Future characteristics - 1 second is optimal
|
143
|
+
# for most Ruby applications and provides good balance of responsiveness
|
144
|
+
# vs resource cleanup.
|
145
|
+
#
|
146
|
+
# @return [Integer] Wait time in seconds
|
147
|
+
def future_cleanup_wait_seconds
|
148
|
+
1
|
149
|
+
end
|
150
|
+
|
151
|
+
# GC trigger batch size threshold
|
152
|
+
#
|
153
|
+
# Batch size that triggers intelligent garbage collection.
|
154
|
+
# Based on Ruby memory management patterns - 6 concurrent operations
|
155
|
+
# is typically where memory pressure becomes noticeable in Ruby.
|
156
|
+
#
|
157
|
+
# @return [Integer] Batch size threshold
|
158
|
+
def gc_trigger_batch_size_threshold
|
159
|
+
6
|
160
|
+
end
|
161
|
+
|
162
|
+
# GC trigger duration threshold
|
163
|
+
#
|
164
|
+
# Batch duration that triggers intelligent garbage collection.
|
165
|
+
# Based on Ruby GC timing characteristics - 30 seconds is typically
|
166
|
+
# when Ruby benefits from explicit GC triggering.
|
167
|
+
#
|
168
|
+
# @return [Integer] Duration threshold in seconds
|
169
|
+
def gc_trigger_duration_threshold
|
170
|
+
30
|
171
|
+
end
|
172
|
+
|
173
|
+
# ====================
|
174
|
+
# CALCULATED VALUES
|
175
|
+
# ====================
|
176
|
+
|
177
|
+
# Calculate batch timeout for a given batch size
|
178
|
+
#
|
179
|
+
# @param batch_size [Integer] Number of steps in the batch
|
180
|
+
# @return [Integer] Calculated timeout in seconds
|
181
|
+
def calculate_batch_timeout(batch_size)
|
182
|
+
calculated_timeout = batch_timeout_base_seconds + (batch_size * batch_timeout_per_step_seconds)
|
183
|
+
[calculated_timeout, max_batch_timeout_seconds].min
|
184
|
+
end
|
185
|
+
|
186
|
+
# Check if batch should trigger garbage collection
|
187
|
+
#
|
188
|
+
# @param batch_size [Integer] Size of the batch
|
189
|
+
# @param batch_duration [Float] Duration of batch execution in seconds
|
190
|
+
# @return [Boolean] Whether to trigger GC
|
191
|
+
def should_trigger_gc?(batch_size, batch_duration)
|
192
|
+
batch_size >= gc_trigger_batch_size_threshold ||
|
193
|
+
batch_duration >= gc_trigger_duration_threshold
|
194
|
+
end
|
195
|
+
|
196
|
+
# Validate concurrency bounds
|
197
|
+
#
|
198
|
+
# Ensures min <= max and both are positive
|
199
|
+
# @return [Array<String>] Validation errors (empty if valid)
|
200
|
+
def validate_concurrency_bounds
|
201
|
+
errors = []
|
202
|
+
|
203
|
+
errors << "min_concurrent_steps must be positive (got: #{min_concurrent_steps})" if min_concurrent_steps <= 0
|
204
|
+
|
205
|
+
if max_concurrent_steps_limit <= 0
|
206
|
+
errors << "max_concurrent_steps_limit must be positive (got: #{max_concurrent_steps_limit})"
|
207
|
+
end
|
208
|
+
|
209
|
+
if min_concurrent_steps > max_concurrent_steps_limit
|
210
|
+
errors << "min_concurrent_steps (#{min_concurrent_steps}) cannot exceed " \
|
211
|
+
"max_concurrent_steps_limit (#{max_concurrent_steps_limit})"
|
212
|
+
end
|
213
|
+
|
214
|
+
errors
|
215
|
+
end
|
216
|
+
|
217
|
+
# Validate timeout configuration
|
218
|
+
#
|
219
|
+
# Ensures timeouts are positive and logical
|
220
|
+
# @return [Array<String>] Validation errors (empty if valid)
|
221
|
+
def validate_timeout_configuration
|
222
|
+
errors = []
|
223
|
+
|
224
|
+
if batch_timeout_base_seconds <= 0
|
225
|
+
errors << "batch_timeout_base_seconds must be positive (got: #{batch_timeout_base_seconds})"
|
226
|
+
end
|
227
|
+
|
228
|
+
if batch_timeout_per_step_seconds <= 0
|
229
|
+
errors << "batch_timeout_per_step_seconds must be positive (got: #{batch_timeout_per_step_seconds})"
|
230
|
+
end
|
231
|
+
|
232
|
+
if max_batch_timeout_seconds <= batch_timeout_base_seconds
|
233
|
+
errors << "max_batch_timeout_seconds (#{max_batch_timeout_seconds}) must be greater than " \
|
234
|
+
"batch_timeout_base_seconds (#{batch_timeout_base_seconds})"
|
235
|
+
end
|
236
|
+
|
237
|
+
errors
|
238
|
+
end
|
239
|
+
|
240
|
+
# Validate connection configuration
|
241
|
+
#
|
242
|
+
# Ensures connection pressure factors and health settings are valid
|
243
|
+
# @return [Array<String>] Validation errors (empty if valid)
|
244
|
+
def validate_connection_configuration
|
245
|
+
errors = []
|
246
|
+
|
247
|
+
if health_assessment_cache_duration <= 0
|
248
|
+
errors << "health_assessment_cache_duration must be positive (got: #{health_assessment_cache_duration})"
|
249
|
+
end
|
250
|
+
|
251
|
+
# Validate connection pressure factors
|
252
|
+
required_pressure_levels = %i[low moderate high critical]
|
253
|
+
missing_levels = required_pressure_levels - connection_pressure_factors.keys
|
254
|
+
unless missing_levels.empty?
|
255
|
+
errors << "connection_pressure_factors missing required levels: #{missing_levels.join(', ')}"
|
256
|
+
end
|
257
|
+
|
258
|
+
connection_pressure_factors.each do |level, factor|
|
259
|
+
unless factor.is_a?(Numeric) && factor >= 0.0 && factor <= 1.0
|
260
|
+
errors << "connection_pressure_factors[#{level}] must be between 0.0 and 1.0 (got: #{factor})"
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
264
|
+
# Validate log level
|
265
|
+
valid_log_levels = %w[debug info warn error fatal]
|
266
|
+
unless valid_log_levels.include?(connection_health_log_level)
|
267
|
+
errors << "connection_health_log_level must be one of: #{valid_log_levels.join(', ')} " \
|
268
|
+
"(got: #{connection_health_log_level})"
|
269
|
+
end
|
270
|
+
|
271
|
+
errors
|
272
|
+
end
|
273
|
+
|
274
|
+
# Comprehensive validation
|
275
|
+
#
|
276
|
+
# @return [Boolean] True if valid, raises exception if invalid
|
277
|
+
# @raise [Dry::Struct::Error] If validation fails
|
278
|
+
# rubocop:disable Naming/PredicateMethod
|
279
|
+
def validate!
|
280
|
+
errors = validate_concurrency_bounds + validate_timeout_configuration + validate_connection_configuration
|
281
|
+
|
282
|
+
raise Dry::Struct::Error, "ExecutionConfig validation failed: #{errors.join(', ')}" unless errors.empty?
|
283
|
+
|
284
|
+
true
|
285
|
+
end
|
286
|
+
# rubocop:enable Naming/PredicateMethod
|
287
|
+
end
|
288
|
+
end
|
289
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Tasker
|
4
|
+
module Types
|
5
|
+
# Configuration type for health check settings
|
6
|
+
#
|
7
|
+
# This configuration handles health check endpoint behavior and authentication requirements.
|
8
|
+
# It provides the same functionality as the original HealthConfiguration but with
|
9
|
+
# dry-struct type safety and immutability.
|
10
|
+
#
|
11
|
+
# @example Basic usage
|
12
|
+
# config = HealthConfig.new(
|
13
|
+
# status_requires_authentication: false,
|
14
|
+
# readiness_timeout_seconds: 10.0
|
15
|
+
# )
|
16
|
+
#
|
17
|
+
# @example Full configuration
|
18
|
+
# config = HealthConfig.new(
|
19
|
+
# status_endpoint_requires_auth: true,
|
20
|
+
# ready_requires_authentication: false,
|
21
|
+
# status_requires_authentication: true,
|
22
|
+
# readiness_timeout_seconds: 5.0,
|
23
|
+
# cache_duration_seconds: 15
|
24
|
+
# )
|
25
|
+
class HealthConfig < BaseConfig
|
26
|
+
transform_keys(&:to_sym)
|
27
|
+
|
28
|
+
# Custom boolean type that accepts various truthy/falsy values
|
29
|
+
BooleanType = Types::Bool.constructor do |value|
|
30
|
+
case value
|
31
|
+
when true, 'true', 'yes', '1', 1
|
32
|
+
true
|
33
|
+
when false, 'false', 'no', '0', 0, nil, ''
|
34
|
+
false
|
35
|
+
else
|
36
|
+
!value.nil? # Convert any other truthy value to true, falsy to false
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# Whether status endpoint requires authentication (backward compatibility)
|
41
|
+
#
|
42
|
+
# @!attribute [r] status_endpoint_requires_auth
|
43
|
+
# @return [Boolean] Whether status endpoint requires auth
|
44
|
+
attribute :status_endpoint_requires_auth, BooleanType.default(true)
|
45
|
+
|
46
|
+
# Whether ready endpoint requires authentication (K8s compatibility)
|
47
|
+
#
|
48
|
+
# @!attribute [r] ready_requires_authentication
|
49
|
+
# @return [Boolean] Whether ready endpoint requires authentication
|
50
|
+
attribute :ready_requires_authentication, BooleanType.default(false)
|
51
|
+
|
52
|
+
# Whether status endpoint requires authentication
|
53
|
+
#
|
54
|
+
# @!attribute [r] status_requires_authentication
|
55
|
+
# @return [Boolean] Whether status endpoint requires authentication
|
56
|
+
attribute :status_requires_authentication, BooleanType.default(true)
|
57
|
+
|
58
|
+
# Timeout for readiness checks in seconds
|
59
|
+
#
|
60
|
+
# @!attribute [r] readiness_timeout_seconds
|
61
|
+
# @return [Float] Readiness check timeout in seconds
|
62
|
+
attribute :readiness_timeout_seconds, Types::Float.constrained(gt: 0).default(5.0)
|
63
|
+
|
64
|
+
# Cache duration for status data in seconds
|
65
|
+
#
|
66
|
+
# @!attribute [r] cache_duration_seconds
|
67
|
+
# @return [Integer] Cache duration in seconds
|
68
|
+
attribute :cache_duration_seconds, Types::Integer.constrained(gt: 0).default(15)
|
69
|
+
|
70
|
+
# Validate health configuration settings
|
71
|
+
#
|
72
|
+
# This method maintains compatibility with the original HealthConfiguration
|
73
|
+
# but is largely redundant since dry-struct handles validation automatically.
|
74
|
+
#
|
75
|
+
# @return [true] if valid
|
76
|
+
# @raise [StandardError] if invalid configuration found
|
77
|
+
def validate!
|
78
|
+
# dry-struct automatically validates types and constraints
|
79
|
+
# This method is kept for backward compatibility
|
80
|
+
true
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# typed: false
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module Tasker
|
5
|
+
module Types
|
6
|
+
# StepSequence represents a sequence of workflow steps to be executed.
|
7
|
+
#
|
8
|
+
# It provides a container for an array of WorkflowStep instances and
|
9
|
+
# utility methods for working with the step sequence.
|
10
|
+
class StepSequence < Dry::Struct
|
11
|
+
# @!attribute [r] steps
|
12
|
+
# @return [Array<Tasker::WorkflowStep>] List of workflow steps in this sequence
|
13
|
+
attribute :steps, Types::Array.default([].freeze)
|
14
|
+
|
15
|
+
# Finds a step in the sequence by its name
|
16
|
+
#
|
17
|
+
# @param name [String] The name of the step to find
|
18
|
+
# @return [Tasker::WorkflowStep, nil] The matching step or nil if not found
|
19
|
+
def find_step_by_name(name)
|
20
|
+
Tasker::WorkflowStep.find_step_by_name(steps, name)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Tasker
|
4
|
+
module Types
|
5
|
+
# StepTemplate defines the structure for workflow step templates
|
6
|
+
#
|
7
|
+
# A step template provides the blueprint for creating specific workflow steps
|
8
|
+
# in a task's sequence. It defines the behavior, dependencies, and configuration
|
9
|
+
# for steps of a particular type.
|
10
|
+
class StepTemplate < Dry::Struct
|
11
|
+
# @!attribute [r] dependent_system
|
12
|
+
# @return [String] The system that this step depends on for execution
|
13
|
+
attribute :dependent_system, Types::Strict::String
|
14
|
+
|
15
|
+
# @!attribute [r] name
|
16
|
+
# @return [String] The name identifier for this step template
|
17
|
+
attribute :name, Types::Strict::String
|
18
|
+
|
19
|
+
# @!attribute [r] description
|
20
|
+
# @return [String] A human-readable description of what this step does
|
21
|
+
attribute :description, Types::String
|
22
|
+
|
23
|
+
# @!attribute [r] default_retryable
|
24
|
+
# @return [Boolean] Whether this step can be retried by default
|
25
|
+
attribute :default_retryable, Types::Bool.default(true)
|
26
|
+
|
27
|
+
# @!attribute [r] default_retry_limit
|
28
|
+
# @return [Integer] The default maximum number of retry attempts
|
29
|
+
attribute :default_retry_limit, Types::Integer.default(3)
|
30
|
+
|
31
|
+
# @!attribute [r] skippable
|
32
|
+
# @return [Boolean] Whether this step can be skipped in the workflow
|
33
|
+
attribute :skippable, Types::Bool.default(false)
|
34
|
+
|
35
|
+
# @!attribute [r] handler_class
|
36
|
+
# @return [Class] The class that implements the step's logic
|
37
|
+
attribute :handler_class, Types::Class
|
38
|
+
|
39
|
+
# @!attribute [r] handler_config
|
40
|
+
# @return [Object, nil] Optional configuration for the step handler
|
41
|
+
attribute :handler_config, Types::Any.optional.default(nil)
|
42
|
+
|
43
|
+
# @!attribute [r] depends_on_step
|
44
|
+
# @return [String, nil] Optional name of a step that must be completed before this one
|
45
|
+
attribute :depends_on_step, Types::String.optional.default(nil)
|
46
|
+
|
47
|
+
# @!attribute [r] depends_on_steps
|
48
|
+
# @return [Array<String>] Names of steps that must be completed before this one
|
49
|
+
attribute :depends_on_steps, Types.Array(Types::String).default([].freeze)
|
50
|
+
|
51
|
+
# @!attribute [r] custom_events
|
52
|
+
# @return [Array<Hash>] Custom events that this step handler can publish
|
53
|
+
attribute :custom_events, Types.Array(Types::Hash).optional.default([].freeze)
|
54
|
+
|
55
|
+
# Returns all dependency step names as a single array
|
56
|
+
#
|
57
|
+
# @return [Array<String>] All step dependencies
|
58
|
+
def all_dependencies
|
59
|
+
[depends_on_step, *depends_on_steps].compact.uniq
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# typed: false
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module Tasker
|
5
|
+
module Types
|
6
|
+
# TaskRequest represents a request to perform a task within the system
|
7
|
+
#
|
8
|
+
# It contains all the necessary information to identify, track, and execute a task
|
9
|
+
# including context data, metadata, and configuration for the task execution.
|
10
|
+
class TaskRequest < Dry::Struct
|
11
|
+
# @!attribute [r] name
|
12
|
+
# @return [String] The name of the task to be performed
|
13
|
+
attribute :name, Types::Strict::String
|
14
|
+
|
15
|
+
# @!attribute [r] namespace
|
16
|
+
# @return [String] The namespace of the task to be performed
|
17
|
+
attribute :namespace, Types::Strict::String.default('default')
|
18
|
+
|
19
|
+
# @!attribute [r] version
|
20
|
+
# @return [String] The version of the task to be performed
|
21
|
+
attribute :version, Types::Strict::String.default('0.1.0')
|
22
|
+
|
23
|
+
# @!attribute [r] context
|
24
|
+
# @return [Hash] Context data required for task execution, containing task-specific information
|
25
|
+
attribute :context, Types::Hash
|
26
|
+
|
27
|
+
# @!attribute [r] status
|
28
|
+
# @return [String] Current status of the task (e.g., PENDING, IN_PROGRESS, COMPLETED, FAILED)
|
29
|
+
attribute :status, Types::String.default(Constants::TaskStatuses::PENDING)
|
30
|
+
|
31
|
+
# @!attribute [r] initiator
|
32
|
+
# @return [String] The entity or system that initiated this task request
|
33
|
+
attribute :initiator, Types::String.default(Constants::UNKNOWN)
|
34
|
+
|
35
|
+
# @!attribute [r] source_system
|
36
|
+
# @return [String] The system from which this task originated
|
37
|
+
attribute :source_system, Types::String.default(Constants::UNKNOWN)
|
38
|
+
|
39
|
+
# @!attribute [r] reason
|
40
|
+
# @return [String] The reason why this task was requested
|
41
|
+
attribute :reason, Types::String.default(Constants::UNKNOWN)
|
42
|
+
|
43
|
+
# @!attribute [r] complete
|
44
|
+
# @return [Boolean] Indicates whether the task has been completed
|
45
|
+
attribute :complete, Types::Bool.default(false)
|
46
|
+
|
47
|
+
# @!attribute [r] tags
|
48
|
+
# @return [Array<String>] Tags associated with this task for categorization or filtering
|
49
|
+
attribute :tags, Types::Array.of(Types::String).default([].freeze)
|
50
|
+
|
51
|
+
# @!attribute [r] bypass_steps
|
52
|
+
# @return [Array<String>] List of step names that should be bypassed during task execution
|
53
|
+
attribute :bypass_steps, Types::Array.of(Types::String).default([].freeze)
|
54
|
+
|
55
|
+
# @!attribute [r] requested_at
|
56
|
+
# @return [Time] Timestamp when the task was initially requested
|
57
|
+
attribute(:requested_at, Types::JSON::Time.default { Time.zone.now })
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|