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,126 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rails_helper'
|
4
|
+
|
5
|
+
RSpec.describe <%= class_name %>Authenticator, type: :model do
|
6
|
+
let(:options) { { scope: :user } }
|
7
|
+
let(:authenticator) { described_class.new(options) }
|
8
|
+
let(:controller) { instance_double('ActionController::Base') }
|
9
|
+
|
10
|
+
describe '#initialize' do
|
11
|
+
it 'sets default scope to :user' do
|
12
|
+
authenticator = described_class.new
|
13
|
+
expect(authenticator.send(:scope)).to eq(:user)
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'accepts custom scope' do
|
17
|
+
authenticator = described_class.new(scope: :admin)
|
18
|
+
expect(authenticator.send(:scope)).to eq(:admin)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '#authenticate!' do
|
23
|
+
context 'when Devise authentication succeeds' do
|
24
|
+
before do
|
25
|
+
allow(controller).to receive(:authenticate_user!).and_return(true)
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'returns true' do
|
29
|
+
expect(authenticator.authenticate!(controller)).to be true
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'when Devise authentication fails' do
|
34
|
+
before do
|
35
|
+
allow(controller).to receive(:authenticate_user!).and_raise(StandardError, 'Authentication failed')
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'raises AuthenticationError' do
|
39
|
+
expect do
|
40
|
+
authenticator.authenticate!(controller)
|
41
|
+
end.to raise_error(Tasker::Authentication::AuthenticationError, /Devise authentication failed/)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe '#current_user' do
|
47
|
+
let(:user) { double('User', id: 1) }
|
48
|
+
|
49
|
+
context 'when Devise current_user returns a user' do
|
50
|
+
before do
|
51
|
+
allow(controller).to receive(:current_user).and_return(user)
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'returns the user' do
|
55
|
+
expect(authenticator.current_user(controller)).to eq(user)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
context 'when Devise current_user returns nil' do
|
60
|
+
before do
|
61
|
+
allow(controller).to receive(:current_user).and_return(nil)
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'returns nil' do
|
65
|
+
expect(authenticator.current_user(controller)).to be_nil
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe '#authenticated?' do
|
71
|
+
context 'when user_signed_in? is available' do
|
72
|
+
before do
|
73
|
+
allow(controller).to receive(:respond_to?).with(:user_signed_in?).and_return(true)
|
74
|
+
allow(controller).to receive(:user_signed_in?).and_return(true)
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'uses Devise signed_in helper' do
|
78
|
+
expect(authenticator.authenticated?(controller)).to be true
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
context 'when user_signed_in? is not available' do
|
83
|
+
let(:user) { double('User') }
|
84
|
+
|
85
|
+
before do
|
86
|
+
allow(controller).to receive(:respond_to?).with(:user_signed_in?).and_return(false)
|
87
|
+
allow(authenticator).to receive(:current_user).with(controller).and_return(user)
|
88
|
+
end
|
89
|
+
|
90
|
+
it 'falls back to checking current_user presence' do
|
91
|
+
expect(authenticator.authenticated?(controller)).to be true
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
describe '#validate_configuration' do
|
97
|
+
context 'when Devise is available' do
|
98
|
+
before do
|
99
|
+
stub_const('Devise', double('Devise', mappings: { user: double('mapping') }))
|
100
|
+
end
|
101
|
+
|
102
|
+
it 'returns no errors for valid configuration' do
|
103
|
+
errors = authenticator.validate_configuration(scope: :user)
|
104
|
+
expect(errors).to be_empty
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
context 'when Devise is not available' do
|
109
|
+
before do
|
110
|
+
hide_const('Devise')
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'returns validation error' do
|
114
|
+
errors = authenticator.validate_configuration(options)
|
115
|
+
expect(errors).to include('Devise gem is required for DeviseAuthenticator')
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
context 'with invalid scope type' do
|
120
|
+
it 'returns validation error' do
|
121
|
+
errors = authenticator.validate_configuration(scope: 'user')
|
122
|
+
expect(errors).to include('Devise scope must be a symbol')
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
@@ -0,0 +1,202 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Configure Tasker
|
4
|
+
Tasker.configuration do |config|
|
5
|
+
# Engine configuration
|
6
|
+
# config.engine do |engine|
|
7
|
+
# engine.task_handler_directory = 'custom_tasks'
|
8
|
+
# engine.task_config_directory = 'custom_tasks'
|
9
|
+
# engine.default_module_namespace = 'OurTasks'
|
10
|
+
# engine.identity_strategy = :hash
|
11
|
+
# engine.identity_strategy_class = 'MyApp::CustomIdentityStrategy'
|
12
|
+
# end
|
13
|
+
|
14
|
+
# Authentication and authorization configuration
|
15
|
+
# config.auth do |auth|
|
16
|
+
# auth.strategy = :devise
|
17
|
+
# auth.options = { scope: :user }
|
18
|
+
# auth.enabled = true
|
19
|
+
# auth.coordinator_class = 'MyApp::AuthorizationCoordinator'
|
20
|
+
# auth.user_class = 'User'
|
21
|
+
# end
|
22
|
+
|
23
|
+
# Database configuration
|
24
|
+
# config.database do |db|
|
25
|
+
# db.enable_secondary_database = true
|
26
|
+
# db.name = :tasker
|
27
|
+
# end
|
28
|
+
|
29
|
+
# Telemetry and observability configuration
|
30
|
+
# Tasker provides two complementary observability systems:
|
31
|
+
# 1. TelemetrySubscriber (event-driven OpenTelemetry spans for detailed tracing)
|
32
|
+
# 2. MetricsBackend (native metrics collection for dashboards and alerting)
|
33
|
+
# config.telemetry do |tel|
|
34
|
+
# # === OPENTELEMETRY SPANS (Event-Driven Tracing) ===
|
35
|
+
# tel.enabled = true # Enable TelemetrySubscriber
|
36
|
+
# tel.service_name = 'my_app_tasker'
|
37
|
+
# tel.service_version = '1.2.3'
|
38
|
+
#
|
39
|
+
# # === STRUCTURED LOGGING ===
|
40
|
+
# tel.structured_logging_enabled = true
|
41
|
+
# tel.correlation_id_header = 'X-Correlation-ID' # HTTP header for correlation ID propagation
|
42
|
+
# tel.log_level = 'info' # debug, info, warn, error, fatal
|
43
|
+
# tel.log_format = 'json' # json, pretty_json, logfmt
|
44
|
+
#
|
45
|
+
# # === SENSITIVE DATA FILTERING ===
|
46
|
+
# tel.filter_mask = '***REDACTED***'
|
47
|
+
# tel.filter_parameters = [:password, :api_key, 'credit_card.number', /token/i]
|
48
|
+
#
|
49
|
+
# # === NATIVE METRICS COLLECTION (Direct Collection) ===
|
50
|
+
# tel.metrics_enabled = true # Enable MetricsBackend
|
51
|
+
# tel.metrics_format = 'prometheus' # 'prometheus', 'json', 'csv'
|
52
|
+
#
|
53
|
+
# # Prometheus export configuration (matches TelemetryConfig.default_prometheus_config)
|
54
|
+
# tel.prometheus = {
|
55
|
+
# endpoint: ENV['PROMETHEUS_ENDPOINT'], # Prometheus remote write endpoint (nil disables)
|
56
|
+
#
|
57
|
+
# # Basic authentication for Prometheus endpoint
|
58
|
+
# username: ENV['PROMETHEUS_USERNAME'],
|
59
|
+
# password: ENV['PROMETHEUS_PASSWORD'],
|
60
|
+
#
|
61
|
+
# # Job configuration
|
62
|
+
# job_timeout: 5.minutes,
|
63
|
+
# export_timeout: 2.minutes,
|
64
|
+
# retry_attempts: 3,
|
65
|
+
#
|
66
|
+
# # Export scheduling
|
67
|
+
# retention_window: 5.minutes, # How long metrics are retained before TTL expiry
|
68
|
+
# safety_margin: 1.minute, # Export before TTL expires (safety buffer)
|
69
|
+
#
|
70
|
+
# # Metric naming
|
71
|
+
# metric_prefix: 'tasker',
|
72
|
+
# include_instance_labels: true,
|
73
|
+
#
|
74
|
+
# # Performance tuning
|
75
|
+
# compression: 'snappy', # 'snappy', 'gzip', or nil
|
76
|
+
# batch_size: 1000,
|
77
|
+
#
|
78
|
+
# # Test/development mode
|
79
|
+
# skip_if_unavailable: true # Don't fail if Prometheus is unreachable
|
80
|
+
# }
|
81
|
+
#
|
82
|
+
# # === PERFORMANCE MONITORING ===
|
83
|
+
# tel.performance_monitoring_enabled = true
|
84
|
+
# tel.slow_query_threshold_seconds = 1.0 # Detect slow operations
|
85
|
+
# tel.memory_threshold_mb = 100 # Memory spike detection
|
86
|
+
# tel.event_sampling_rate = 1.0 # 1.0 = 100%, 0.1 = 10% sampling
|
87
|
+
# tel.filtered_events = [] # Events to exclude from collection
|
88
|
+
# end
|
89
|
+
|
90
|
+
# Dependency graph and bottleneck analysis configuration
|
91
|
+
# These settings control how Tasker analyzes workflow dependencies,
|
92
|
+
# identifies bottlenecks, and calculates impact scores for optimization.
|
93
|
+
# config.dependency_graph do |graph|
|
94
|
+
# # Impact multipliers for bottleneck scoring calculations
|
95
|
+
# # These affect how different factors influence bottleneck impact scores
|
96
|
+
# graph.impact_multipliers = {
|
97
|
+
# downstream_weight: 5, # Weight for downstream step count (higher = more impact)
|
98
|
+
# blocked_weight: 15, # Weight for blocked step count (higher = more critical)
|
99
|
+
# path_length_weight: 10, # Weight for critical path length
|
100
|
+
# completed_penalty: 15, # Penalty for completed steps (reduce priority)
|
101
|
+
# blocked_penalty: 25, # Penalty for blocked steps (increase priority)
|
102
|
+
# error_penalty: 30, # Penalty for error steps (highest priority)
|
103
|
+
# retry_penalty: 10 # Penalty for retry steps (moderate priority)
|
104
|
+
# }
|
105
|
+
#
|
106
|
+
# # Severity multipliers for state-based calculations
|
107
|
+
# # These adjust impact scores based on step states and conditions
|
108
|
+
# graph.severity_multipliers = {
|
109
|
+
# error_state: 2.0, # Multiplier for steps in error state
|
110
|
+
# exhausted_retry_bonus: 0.5, # Additional multiplier for exhausted retries
|
111
|
+
# dependency_issue: 1.2 # Multiplier for dependency-related issues
|
112
|
+
# }
|
113
|
+
#
|
114
|
+
# # Penalty constants for problematic step conditions
|
115
|
+
# # These add penalty points for specific retry and failure conditions
|
116
|
+
# graph.penalty_constants = {
|
117
|
+
# retry_instability: 3, # Points per retry attempt (instability indicator)
|
118
|
+
# non_retryable: 10, # Points for non-retryable failures
|
119
|
+
# exhausted_retry: 20 # Points for exhausted retry attempts
|
120
|
+
# }
|
121
|
+
#
|
122
|
+
# # Severity thresholds for impact score classification
|
123
|
+
# # These determine when bottlenecks are classified as Critical/High/Medium/Low
|
124
|
+
# graph.severity_thresholds = {
|
125
|
+
# critical: 100, # Score >= 100: Critical bottleneck
|
126
|
+
# high: 50, # Score >= 50: High priority bottleneck
|
127
|
+
# medium: 20 # Score >= 20: Medium priority bottleneck
|
128
|
+
# } # Score < 20: Low priority
|
129
|
+
#
|
130
|
+
# # Duration estimation constants for path analysis
|
131
|
+
# # These are used for calculating estimated execution times
|
132
|
+
# graph.duration_estimates = {
|
133
|
+
# base_step_seconds: 30, # Estimated time per step (default)
|
134
|
+
# error_penalty_seconds: 60, # Additional time penalty for error steps
|
135
|
+
# retry_penalty_seconds: 30 # Additional time penalty per retry attempt
|
136
|
+
# }
|
137
|
+
# end
|
138
|
+
|
139
|
+
# Execution and performance configuration
|
140
|
+
# These settings control concurrent step execution, memory management,
|
141
|
+
# and timeout behavior for optimal performance and system tuning.
|
142
|
+
# config.execution do |exec|
|
143
|
+
# # === CONCURRENCY SETTINGS ===
|
144
|
+
# # These control dynamic concurrency calculation bounds
|
145
|
+
# exec.min_concurrent_steps = 3 # Conservative lower bound for system stability
|
146
|
+
# exec.max_concurrent_steps_limit = 12 # Upper bound (should align with DB connection pool)
|
147
|
+
# exec.concurrency_cache_duration = 30 # Cache duration in seconds for concurrency calculations
|
148
|
+
#
|
149
|
+
# # === TIMEOUT CONFIGURATION ===
|
150
|
+
# # These control batch execution timeouts with automatic calculation
|
151
|
+
# exec.batch_timeout_base_seconds = 30 # Base timeout before per-step adjustments
|
152
|
+
# exec.batch_timeout_per_step_seconds = 5 # Additional timeout per step in batch
|
153
|
+
# exec.max_batch_timeout_seconds = 120 # Absolute maximum timeout cap
|
154
|
+
#
|
155
|
+
# # === ARCHITECTURAL CONSTANTS (Ruby-specific, not configurable) ===
|
156
|
+
# # These are set based on Ruby/Rails characteristics and should not be changed:
|
157
|
+
# # - future_cleanup_wait_seconds: 1 second (optimal for Concurrent::Future cleanup)
|
158
|
+
# # - gc_trigger_batch_size_threshold: 6 operations (Ruby memory pressure detection)
|
159
|
+
# # - gc_trigger_duration_threshold: 30 seconds (Ruby GC timing characteristics)
|
160
|
+
# end
|
161
|
+
|
162
|
+
# Backoff and retry configuration
|
163
|
+
# These settings control retry timing, exponential backoff calculations,
|
164
|
+
# and task reenqueue delays for optimal failure recovery.
|
165
|
+
# config.backoff do |backoff|
|
166
|
+
# # Default backoff progression for retry attempts (in seconds)
|
167
|
+
# # Each element represents the backoff time for that attempt number.
|
168
|
+
# # For attempts beyond this array, exponential backoff calculation is used.
|
169
|
+
# backoff.default_backoff_seconds = [1, 2, 4, 8, 16, 32]
|
170
|
+
#
|
171
|
+
# # Maximum backoff time to cap exponential backoff calculations
|
172
|
+
# # Prevents excessively long delays between retry attempts
|
173
|
+
# backoff.max_backoff_seconds = 300 # 5 minutes maximum
|
174
|
+
#
|
175
|
+
# # Multiplier for exponential backoff calculation
|
176
|
+
# # Formula: backoff_time = attempt_number ^ backoff_multiplier * base_seconds
|
177
|
+
# backoff.backoff_multiplier = 2.0
|
178
|
+
#
|
179
|
+
# # Whether to apply jitter to backoff calculations
|
180
|
+
# # Helps prevent "thundering herd" when many steps retry simultaneously
|
181
|
+
# backoff.jitter_enabled = true
|
182
|
+
#
|
183
|
+
# # Maximum jitter percentage for randomization
|
184
|
+
# # E.g., 0.1 means ±10% variation in backoff times
|
185
|
+
# backoff.jitter_max_percentage = 0.1
|
186
|
+
#
|
187
|
+
# # Task reenqueue delays for different execution states
|
188
|
+
# # Controls how long to wait before retrying tasks in different states
|
189
|
+
# backoff.reenqueue_delays = {
|
190
|
+
# has_ready_steps: 0, # Steps ready - immediate processing
|
191
|
+
# waiting_for_dependencies: 45, # Waiting for dependencies - moderate delay
|
192
|
+
# processing: 10 # Steps processing - short delay
|
193
|
+
# }
|
194
|
+
#
|
195
|
+
# # Default reenqueue delay for unclear or unmatched states
|
196
|
+
# backoff.default_reenqueue_delay = 30
|
197
|
+
#
|
198
|
+
# # Buffer time added to optimal backoff calculations
|
199
|
+
# # Ensures steps are definitely ready for retry when tasks are reenqueued
|
200
|
+
# backoff.buffer_seconds = 5
|
201
|
+
# end
|
202
|
+
end
|
@@ -0,0 +1,144 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# JWT authenticator for <%= class_name %>
|
4
|
+
# Generated by: rails generate tasker:authenticator <%= file_name %> --type=jwt
|
5
|
+
#
|
6
|
+
# This authenticator implements JWT-based authentication with security best practices.
|
7
|
+
# Supports both Bearer token and raw token formats in Authorization headers.
|
8
|
+
#
|
9
|
+
# Configuration example:
|
10
|
+
# Tasker.configuration do |config|
|
11
|
+
# config.auth do |auth|
|
12
|
+
# auth.strategy = :custom
|
13
|
+
# auth.options = {
|
14
|
+
# authenticator_class: '<%= class_name %>Authenticator',
|
15
|
+
# secret: Rails.application.credentials.jwt_secret,
|
16
|
+
# algorithm: 'HS256',
|
17
|
+
# header_name: 'Authorization',
|
18
|
+
# user_class: '<%= user_model_class %>'
|
19
|
+
# }
|
20
|
+
# end
|
21
|
+
# end
|
22
|
+
|
23
|
+
class <%= class_name %>Authenticator
|
24
|
+
include Tasker::Authentication::Interface
|
25
|
+
|
26
|
+
def initialize(options = {})
|
27
|
+
@secret = options[:secret] || Rails.application.secret_key_base
|
28
|
+
@algorithm = options[:algorithm] || 'HS256'
|
29
|
+
@header_name = options[:header_name] || 'Authorization'
|
30
|
+
@user_class = options[:user_class] || '<%= user_model_class %>'
|
31
|
+
end
|
32
|
+
|
33
|
+
# Required: Authenticate the request, raise exception if fails
|
34
|
+
def authenticate!(controller)
|
35
|
+
user = current_user(controller)
|
36
|
+
unless user
|
37
|
+
raise Tasker::Authentication::AuthenticationError,
|
38
|
+
'Invalid or missing JWT token'
|
39
|
+
end
|
40
|
+
true
|
41
|
+
end
|
42
|
+
|
43
|
+
# Required: Get the current authenticated user
|
44
|
+
def current_user(controller)
|
45
|
+
return @current_user if defined?(@current_user)
|
46
|
+
|
47
|
+
@current_user = begin
|
48
|
+
token = extract_token(controller.request)
|
49
|
+
return nil unless token
|
50
|
+
|
51
|
+
payload = decode_token(token)
|
52
|
+
return nil unless payload
|
53
|
+
|
54
|
+
find_user(payload)
|
55
|
+
rescue JWT::DecodeError, StandardError => e
|
56
|
+
Rails.logger.debug "JWT authentication failed: #{e.message}"
|
57
|
+
nil
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
# Optional: Configuration validation with security best practices
|
62
|
+
def validate_configuration(options = {})
|
63
|
+
errors = []
|
64
|
+
|
65
|
+
# Validate JWT secret
|
66
|
+
secret = options[:secret]
|
67
|
+
if secret.blank?
|
68
|
+
errors << 'JWT secret is required'
|
69
|
+
elsif secret.length < 32
|
70
|
+
errors << 'JWT secret should be at least 32 characters for security'
|
71
|
+
end
|
72
|
+
|
73
|
+
# Validate algorithm
|
74
|
+
algorithm = options[:algorithm] || 'HS256'
|
75
|
+
allowed_algorithms = %w[HS256 HS384 HS512 RS256 RS384 RS512 ES256 ES384 ES512]
|
76
|
+
unless allowed_algorithms.include?(algorithm)
|
77
|
+
errors << "JWT algorithm must be one of: #{allowed_algorithms.join(', ')}"
|
78
|
+
end
|
79
|
+
|
80
|
+
# Validate user class
|
81
|
+
user_class = options[:user_class] || '<%= user_model_class %>'
|
82
|
+
begin
|
83
|
+
user_class.constantize
|
84
|
+
rescue NameError
|
85
|
+
errors << "User class '#{user_class}' not found"
|
86
|
+
end
|
87
|
+
|
88
|
+
errors
|
89
|
+
end
|
90
|
+
|
91
|
+
# Helper method for generating test tokens (useful for testing)
|
92
|
+
def self.generate_test_token(payload, secret: nil, algorithm: 'HS256')
|
93
|
+
secret ||= Rails.application.secret_key_base
|
94
|
+
|
95
|
+
# Add standard JWT claims
|
96
|
+
now = Time.current.to_i
|
97
|
+
full_payload = {
|
98
|
+
'iat' => now,
|
99
|
+
'exp' => now + 1.hour.to_i
|
100
|
+
}.merge(payload.stringify_keys)
|
101
|
+
|
102
|
+
JWT.encode(full_payload, secret, algorithm)
|
103
|
+
end
|
104
|
+
|
105
|
+
private
|
106
|
+
|
107
|
+
attr_reader :secret, :algorithm, :header_name, :user_class
|
108
|
+
|
109
|
+
def extract_token(request)
|
110
|
+
header = request.headers[@header_name]
|
111
|
+
return nil unless header.present?
|
112
|
+
|
113
|
+
# Support both "Bearer <token>" and raw token formats
|
114
|
+
header.start_with?('Bearer ') ? header.sub(/^Bearer /, '') : header
|
115
|
+
end
|
116
|
+
|
117
|
+
def decode_token(token)
|
118
|
+
payload, _header = JWT.decode(
|
119
|
+
token,
|
120
|
+
@secret,
|
121
|
+
true, # verify signature
|
122
|
+
{
|
123
|
+
algorithm: @algorithm,
|
124
|
+
verify_expiration: true,
|
125
|
+
verify_iat: true
|
126
|
+
}
|
127
|
+
)
|
128
|
+
payload
|
129
|
+
rescue JWT::ExpiredSignature, JWT::InvalidIatError
|
130
|
+
# These are expected errors for expired tokens
|
131
|
+
nil
|
132
|
+
end
|
133
|
+
|
134
|
+
def find_user(payload)
|
135
|
+
# Support both 'user_id' and 'sub' (subject) claims
|
136
|
+
user_id = payload['user_id'] || payload['sub']
|
137
|
+
return nil unless user_id
|
138
|
+
|
139
|
+
user_model = @user_class.constantize
|
140
|
+
user_model.find_by(id: user_id)
|
141
|
+
rescue ActiveRecord::RecordNotFound, NoMethodError
|
142
|
+
nil
|
143
|
+
end
|
144
|
+
end
|