tasker-engine 0.1.0 → 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.
Potentially problematic release.
This version of tasker-engine might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/README.md +12 -9
- data/app/controllers/tasker/analytics_controller.rb +2 -2
- data/app/controllers/tasker/graphql_controller.rb +3 -3
- data/app/controllers/tasker/health_controller.rb +1 -1
- data/app/controllers/tasker/metrics_controller.rb +3 -3
- data/app/controllers/tasker/task_diagrams_controller.rb +30 -0
- data/app/jobs/tasker/metrics_export_job.rb +1 -1
- data/app/models/tasker/application_record.rb +5 -5
- 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/task.rb +11 -1
- data/app/models/tasker/task_diagram.rb +332 -0
- data/app/models/tasker/workflow_step_edge.rb +4 -5
- data/app/views/tasker/task/_diagram.html.erb +32 -0
- data/config/routes.rb +3 -3
- data/db/init/schema.sql +23 -0
- data/docs/APPLICATION_GENERATOR.md +1 -1
- data/docs/AUTH.md +51 -12
- data/docs/DEVELOPER_GUIDE.md +9 -8
- data/docs/EXECUTION_CONFIGURATION.md +1 -1
- data/docs/HEALTH.md +3 -3
- data/docs/METRICS.md +4 -4
- data/docs/OPTIMIZATION_PLAN.md +3 -3
- data/docs/OVERVIEW.md +4 -0
- data/docs/QUICK_START.md +1 -1
- data/docs/REST_API.md +1 -1
- data/docs/TASK_DIAGRAM.md +252 -0
- data/docs/TELEMETRY.md +5 -5
- data/docs/TROUBLESHOOTING.md +3 -3
- data/docs/TaskHandlerGenerator.html +55 -55
- data/docs/Tasker/Analysis/RuntimeGraphAnalyzer.html +1 -1
- data/docs/Tasker/Analysis/TemplateGraphAnalyzer.html +1 -1
- data/docs/Tasker/Analysis.html +1 -1
- data/docs/Tasker/AnalyticsController.html +1 -1
- data/docs/Tasker/AnalyticsService/BottleneckAnalytics.html +1 -1
- data/docs/Tasker/AnalyticsService/PerformanceAnalytics.html +1 -1
- data/docs/Tasker/AnalyticsService.html +1 -1
- data/docs/Tasker/AnnotationType.html +1 -1
- data/docs/Tasker/AnnotationTypeSerializer.html +1 -1
- data/docs/Tasker/ApplicationController.html +2 -2
- data/docs/Tasker/ApplicationJob.html +1 -1
- data/docs/Tasker/ApplicationRecord.html +6 -6
- data/docs/Tasker/Authentication/AuthenticationError.html +1 -1
- data/docs/Tasker/Authentication/ConfigurationError.html +1 -1
- data/docs/Tasker/Authentication/Coordinator.html +1 -1
- data/docs/Tasker/Authentication/Interface.html +1 -1
- data/docs/Tasker/Authentication/InterfaceError.html +1 -1
- data/docs/Tasker/Authentication/NoneAuthenticator.html +1 -1
- data/docs/Tasker/Authentication.html +1 -1
- data/docs/Tasker/Authorization/AuthorizationError.html +1 -1
- data/docs/Tasker/Authorization/BaseCoordinator.html +2 -2
- data/docs/Tasker/Authorization/ConfigurationError.html +1 -1
- data/docs/Tasker/Authorization/ResourceConstants/ACTIONS.html +10 -10
- data/docs/Tasker/Authorization/ResourceConstants/RESOURCES.html +13 -8
- data/docs/Tasker/Authorization/ResourceConstants.html +1 -1
- data/docs/Tasker/Authorization/ResourceRegistry.html +40 -33
- data/docs/Tasker/Authorization/UnauthorizedError.html +1 -1
- data/docs/Tasker/Authorization.html +2 -2
- data/docs/Tasker/CacheCapabilities.html +1 -1
- data/docs/Tasker/CacheStrategy.html +1 -1
- data/docs/Tasker/Concerns/Authenticatable.html +1 -1
- data/docs/Tasker/Concerns/Authorizable/AdminStatusChecker.html +1 -1
- data/docs/Tasker/Concerns/Authorizable.html +1 -1
- data/docs/Tasker/Concerns/ControllerAuthorizable.html +1 -1
- data/docs/Tasker/Concerns/EventPublisher.html +1 -1
- data/docs/Tasker/Concerns/IdempotentStateTransitions.html +1 -1
- data/docs/Tasker/Concerns/StateMachineBase/ClassMethods.html +1 -1
- data/docs/Tasker/Concerns/StateMachineBase/StateMachineBase/ClassMethods.html +1 -1
- data/docs/Tasker/Concerns/StateMachineBase/StateMachineBase.html +1 -1
- data/docs/Tasker/Concerns/StateMachineBase.html +1 -1
- data/docs/Tasker/Concerns/StructuredLogging.html +1 -1
- data/docs/Tasker/Concerns.html +1 -1
- data/docs/Tasker/Configuration/ConfigurationProxy.html +1 -1
- data/docs/Tasker/Configuration/TelemetryConfigurationProxy.html +1 -1
- data/docs/Tasker/Configuration.html +1 -1
- data/docs/Tasker/ConfigurationError.html +1 -1
- data/docs/Tasker/ConfiguredTask.html +2 -2
- data/docs/Tasker/Constants/EventDefinitions.html +1 -1
- data/docs/Tasker/Constants/ObservabilityEvents/Step.html +1 -1
- data/docs/Tasker/Constants/ObservabilityEvents/Task.html +1 -1
- data/docs/Tasker/Constants/ObservabilityEvents.html +1 -1
- data/docs/Tasker/Constants/RegistryEvents.html +1 -1
- data/docs/Tasker/Constants/StepEvents.html +1 -1
- data/docs/Tasker/Constants/TaskEvents.html +1 -1
- data/docs/Tasker/Constants/TaskExecution/ExecutionStatus.html +1 -1
- data/docs/Tasker/Constants/TaskExecution/HealthStatus.html +1 -1
- data/docs/Tasker/Constants/TaskExecution/RecommendedAction.html +1 -1
- data/docs/Tasker/Constants/TaskExecution.html +1 -1
- data/docs/Tasker/Constants/TaskFinalization/ErrorMessages.html +1 -1
- data/docs/Tasker/Constants/TaskFinalization/PendingReasons.html +1 -1
- data/docs/Tasker/Constants/TaskFinalization/ReenqueueReasons.html +1 -1
- data/docs/Tasker/Constants/TaskFinalization.html +1 -1
- data/docs/Tasker/Constants/TaskStatuses.html +1 -1
- data/docs/Tasker/Constants/TestEvents.html +1 -1
- data/docs/Tasker/Constants/WorkflowEvents.html +1 -1
- data/docs/Tasker/Constants/WorkflowStepStatuses.html +1 -1
- data/docs/Tasker/Constants.html +1 -1
- data/docs/Tasker/DependentSystem.html +1 -1
- data/docs/Tasker/DependentSystemObjectMap.html +1 -1
- data/docs/Tasker/DetectorRegistry.html +1 -1
- data/docs/Tasker/Diagram/Edge.html +1 -1
- data/docs/Tasker/Diagram/Flowchart.html +1 -1
- data/docs/Tasker/Diagram/Node.html +1 -1
- data/docs/Tasker/Diagram.html +1 -1
- data/docs/Tasker/Engine.html +1 -1
- data/docs/Tasker/Error.html +1 -1
- data/docs/Tasker/Events/Catalog/CatalogPrinter.html +1 -1
- data/docs/Tasker/Events/Catalog/CustomEventRegistrar.html +1 -1
- data/docs/Tasker/Events/Catalog/ExamplePayloadGenerator.html +1 -1
- data/docs/Tasker/Events/Catalog.html +1 -1
- data/docs/Tasker/Events/CustomRegistry.html +1 -1
- data/docs/Tasker/Events/DefinitionLoader.html +1 -1
- data/docs/Tasker/Events/EventPayloadBuilder/ErrorInfoExtractor.html +1 -1
- data/docs/Tasker/Events/EventPayloadBuilder/StepPayloadBuilder.html +1 -1
- data/docs/Tasker/Events/EventPayloadBuilder.html +1 -1
- data/docs/Tasker/Events/Publisher.html +1 -1
- data/docs/Tasker/Events/Subscribers/BaseSubscriber/ErrorCategorizer/ErrorTypeClassifier.html +1 -1
- data/docs/Tasker/Events/Subscribers/BaseSubscriber/ErrorCategorizer.html +1 -1
- data/docs/Tasker/Events/Subscribers/BaseSubscriber/MetricTagsExtractor.html +1 -1
- data/docs/Tasker/Events/Subscribers/BaseSubscriber.html +1 -1
- data/docs/Tasker/Events/Subscribers/MetricsSubscriber.html +2 -2
- data/docs/Tasker/Events/Subscribers/TelemetrySubscriber.html +5 -5
- data/docs/Tasker/Events/Subscribers.html +1 -1
- data/docs/Tasker/Events/SubscriptionLoader.html +1 -1
- data/docs/Tasker/Events.html +1 -1
- data/docs/Tasker/EventsGenerator.html +2 -2
- data/docs/Tasker/Functions/FunctionBasedAnalyticsMetrics/AnalyticsMetrics.html +1 -1
- data/docs/Tasker/Functions/FunctionBasedAnalyticsMetrics.html +1 -1
- data/docs/Tasker/Functions/FunctionBasedDependencyLevels.html +1 -1
- data/docs/Tasker/Functions/FunctionBasedSlowestSteps/SlowestStep.html +1 -1
- data/docs/Tasker/Functions/FunctionBasedSlowestSteps.html +1 -1
- data/docs/Tasker/Functions/FunctionBasedSlowestTasks/SlowestTask.html +1 -1
- data/docs/Tasker/Functions/FunctionBasedSlowestTasks.html +1 -1
- data/docs/Tasker/Functions/FunctionBasedStepReadinessStatus.html +1 -1
- data/docs/Tasker/Functions/FunctionBasedSystemHealthCounts/HealthMetrics.html +1 -1
- data/docs/Tasker/Functions/FunctionBasedSystemHealthCounts.html +1 -1
- data/docs/Tasker/Functions/FunctionBasedTaskExecutionContext.html +1 -1
- data/docs/Tasker/Functions/FunctionWrapper.html +1 -1
- data/docs/Tasker/Functions.html +1 -1
- data/docs/Tasker/Generators/AuthenticatorGenerator/UsageInstructionsFormatter.html +1 -1
- data/docs/Tasker/Generators/AuthenticatorGenerator.html +1 -1
- data/docs/Tasker/Generators/AuthorizationCoordinatorGenerator.html +1 -1
- data/docs/Tasker/Generators/SubscriberGenerator.html +1 -1
- data/docs/Tasker/Generators/TaskHandlerGenerator.html +4 -4
- data/docs/Tasker/Generators.html +1 -1
- data/docs/Tasker/GraphQLTypes/AnnotationType.html +1 -1
- data/docs/Tasker/GraphQLTypes/BaseArgument.html +1 -1
- data/docs/Tasker/GraphQLTypes/BaseConnection.html +1 -1
- data/docs/Tasker/GraphQLTypes/BaseEdge.html +1 -1
- data/docs/Tasker/GraphQLTypes/BaseEnum.html +1 -1
- data/docs/Tasker/GraphQLTypes/BaseField.html +1 -1
- data/docs/Tasker/GraphQLTypes/BaseInputObject.html +1 -1
- data/docs/Tasker/GraphQLTypes/BaseInterface.html +1 -1
- data/docs/Tasker/GraphQLTypes/BaseObject.html +1 -1
- data/docs/Tasker/GraphQLTypes/BaseScalar.html +1 -1
- data/docs/Tasker/GraphQLTypes/BaseUnion.html +1 -1
- data/docs/Tasker/GraphQLTypes/DependentSystemObjectMapType.html +1 -1
- data/docs/Tasker/GraphQLTypes/DependentSystemType.html +1 -1
- data/docs/Tasker/GraphQLTypes/MutationType.html +1 -1
- data/docs/Tasker/GraphQLTypes/NamedStepType.html +1 -1
- data/docs/Tasker/GraphQLTypes/NamedTaskType.html +1 -1
- data/docs/Tasker/GraphQLTypes/NamedTasksNamedStepType.html +1 -1
- data/docs/Tasker/GraphQLTypes/NodeType.html +1 -1
- data/docs/Tasker/GraphQLTypes/QueryType.html +1 -1
- data/docs/Tasker/GraphQLTypes/TaskAnnotationType.html +1 -1
- data/docs/Tasker/GraphQLTypes/TaskInterface.html +1 -1
- data/docs/Tasker/GraphQLTypes/TaskType.html +1 -1
- data/docs/Tasker/GraphQLTypes/WorkflowStepType.html +1 -1
- data/docs/Tasker/GraphQLTypes.html +1 -1
- data/docs/Tasker/GraphqlController.html +1 -1
- data/docs/Tasker/HandlerFactory.html +44 -54
- data/docs/Tasker/HandlerSerializer.html +1 -1
- data/docs/Tasker/HandlersController.html +1 -1
- data/docs/Tasker/HashIdentityStrategy.html +1 -1
- data/docs/Tasker/Health/ReadinessChecker.html +2 -2
- data/docs/Tasker/Health/StatusChecker.html +2 -2
- data/docs/Tasker/Health.html +1 -1
- data/docs/Tasker/HealthController.html +1 -1
- data/docs/Tasker/IdentityStrategy.html +1 -1
- data/docs/Tasker/InvalidTaskHandlerConfig.html +1 -1
- data/docs/Tasker/Logging/CorrelationIdGenerator.html +2 -2
- data/docs/Tasker/Logging.html +1 -1
- data/docs/Tasker/MetricsController.html +1 -1
- data/docs/Tasker/MetricsExportJob.html +1 -1
- data/docs/Tasker/Mutations/BaseMutation.html +1 -1
- data/docs/Tasker/Mutations/CancelStep.html +1 -1
- data/docs/Tasker/Mutations/CancelTask.html +1 -1
- data/docs/Tasker/Mutations/CreateTask.html +1 -1
- data/docs/Tasker/Mutations/UpdateStep.html +1 -1
- data/docs/Tasker/Mutations/UpdateTask.html +1 -1
- data/docs/Tasker/Mutations.html +1 -1
- data/docs/Tasker/NamedStep.html +1 -1
- data/docs/Tasker/NamedTask.html +1 -1
- data/docs/Tasker/NamedTasksNamedStep.html +1 -1
- data/docs/Tasker/Orchestration/BackoffCalculator.html +1 -1
- data/docs/Tasker/Orchestration/ConnectionBuilder/ConfigValidator.html +1 -1
- data/docs/Tasker/Orchestration/ConnectionBuilder.html +2 -2
- data/docs/Tasker/Orchestration/ConnectionPoolIntelligence.html +3 -3
- data/docs/Tasker/Orchestration/Coordinator.html +1 -1
- data/docs/Tasker/Orchestration/FutureStateAnalyzer.html +1 -1
- data/docs/Tasker/Orchestration/PluginIntegration.html +1 -1
- data/docs/Tasker/Orchestration/ResponseProcessor.html +1 -1
- data/docs/Tasker/Orchestration/RetryHeaderParser.html +1 -1
- data/docs/Tasker/Orchestration/StepExecutor.html +4 -4
- data/docs/Tasker/Orchestration/StepSequenceFactory.html +1 -1
- data/docs/Tasker/Orchestration/TaskFinalizer/BlockageChecker.html +1 -1
- data/docs/Tasker/Orchestration/TaskFinalizer/ContextManager.html +1 -1
- data/docs/Tasker/Orchestration/TaskFinalizer/DelayCalculator.html +2 -2
- data/docs/Tasker/Orchestration/TaskFinalizer/FinalizationDecisionMaker.html +1 -1
- data/docs/Tasker/Orchestration/TaskFinalizer/FinalizationProcessor.html +1 -1
- data/docs/Tasker/Orchestration/TaskFinalizer/ReasonDeterminer.html +1 -1
- data/docs/Tasker/Orchestration/TaskFinalizer/ReenqueueManager.html +1 -1
- data/docs/Tasker/Orchestration/TaskFinalizer/UnclearStateHandler.html +1 -1
- data/docs/Tasker/Orchestration/TaskFinalizer.html +1 -1
- data/docs/Tasker/Orchestration/TaskInitializer.html +1 -1
- data/docs/Tasker/Orchestration/TaskReenqueuer.html +1 -1
- data/docs/Tasker/Orchestration/ViableStepDiscovery.html +1 -1
- data/docs/Tasker/Orchestration/WorkflowCoordinator.html +1 -1
- data/docs/Tasker/Orchestration.html +1 -1
- data/docs/Tasker/PageSort/PageSortParamsBuilder.html +1 -1
- data/docs/Tasker/PageSort.html +1 -1
- data/docs/Tasker/PermanentError.html +1 -1
- data/docs/Tasker/ProceduralError.html +1 -1
- data/docs/Tasker/Queries/AllAnnotationTypes.html +1 -1
- data/docs/Tasker/Queries/AllTasks.html +1 -1
- data/docs/Tasker/Queries/BaseQuery.html +1 -1
- data/docs/Tasker/Queries/Helpers.html +1 -1
- data/docs/Tasker/Queries/OneStep.html +1 -1
- data/docs/Tasker/Queries/OneTask.html +1 -1
- data/docs/Tasker/Queries/TasksByAnnotation.html +1 -1
- data/docs/Tasker/Queries/TasksByStatus.html +1 -1
- data/docs/Tasker/Queries.html +1 -1
- data/docs/Tasker/Railtie.html +1 -1
- data/docs/Tasker/Registry/BaseRegistry.html +2 -2
- data/docs/Tasker/Registry/EventPublisher.html +1 -1
- data/docs/Tasker/Registry/InterfaceValidator.html +1 -1
- data/docs/Tasker/Registry/RegistrationError.html +1 -1
- data/docs/Tasker/Registry/RegistryError.html +1 -1
- data/docs/Tasker/Registry/StatisticsCollector.html +1 -1
- data/docs/Tasker/Registry/SubscriberRegistry.html +1 -1
- data/docs/Tasker/Registry/ValidationError.html +1 -1
- data/docs/Tasker/Registry.html +1 -1
- data/docs/Tasker/RetryableError.html +1 -1
- data/docs/Tasker/StateMachine/Compatibility.html +1 -1
- data/docs/Tasker/StateMachine/InvalidStateTransition.html +1 -1
- data/docs/Tasker/StateMachine/StepStateMachine.html +1 -1
- data/docs/Tasker/StateMachine/TaskStateMachine.html +1 -1
- data/docs/Tasker/StateMachine.html +1 -1
- data/docs/Tasker/StepDagRelationship.html +1 -1
- data/docs/Tasker/StepHandler/Api/Config.html +1 -1
- data/docs/Tasker/StepHandler/Api.html +1 -1
- data/docs/Tasker/StepHandler/AutomaticEventPublishing.html +1 -1
- data/docs/Tasker/StepHandler/Base.html +1 -1
- data/docs/Tasker/StepHandler.html +1 -1
- data/docs/Tasker/StepReadinessStatus.html +1 -1
- data/docs/Tasker/Task.html +210 -113
- data/docs/Tasker/TaskAnnotation.html +1 -1
- data/docs/Tasker/TaskAnnotationSerializer.html +1 -1
- data/docs/Tasker/TaskBuilder/StepNameValidator.html +1 -1
- data/docs/Tasker/TaskBuilder/StepTemplateDefiner.html +1 -1
- data/docs/Tasker/TaskBuilder.html +1 -1
- data/docs/Tasker/TaskDiagram/StepToStepEdgeBuilder.html +1 -1
- data/docs/Tasker/TaskDiagram/TaskToRootStepEdgeBuilder.html +1 -1
- data/docs/Tasker/TaskDiagram.html +1 -1
- data/docs/Tasker/TaskDiagramsController.html +1 -1
- data/docs/Tasker/TaskExecutionContext.html +1 -1
- data/docs/Tasker/TaskHandler/ClassMethods/StepTemplateDefiner/ClassBasedEventRegistrar.html +1 -1
- data/docs/Tasker/TaskHandler/ClassMethods/StepTemplateDefiner/YamlEventRegistrar.html +1 -1
- data/docs/Tasker/TaskHandler/ClassMethods/StepTemplateDefiner.html +1 -1
- data/docs/Tasker/TaskHandler/ClassMethods.html +6 -44
- data/docs/Tasker/TaskHandler/InstanceMethods.html +1 -1
- data/docs/Tasker/TaskHandler/StepGroup.html +1 -1
- data/docs/Tasker/TaskHandler.html +1 -1
- data/docs/Tasker/TaskNamespace.html +1 -1
- data/docs/Tasker/TaskRunnerJob.html +1 -1
- data/docs/Tasker/TaskSerializer.html +1 -1
- data/docs/Tasker/TaskTransition.html +1 -1
- data/docs/Tasker/TaskerRailsSchema/InvalidObjectTypeError.html +1 -1
- data/docs/Tasker/TaskerRailsSchema/TypeResolutionError.html +1 -1
- data/docs/Tasker/TaskerRailsSchema/UnknownInterfaceError.html +1 -1
- data/docs/Tasker/TaskerRailsSchema.html +1 -1
- data/docs/Tasker/TasksController.html +1 -1
- data/docs/Tasker/Telemetry/EventMapping.html +1 -1
- data/docs/Tasker/Telemetry/EventRouter.html +1 -1
- data/docs/Tasker/Telemetry/Events/ExportEvents.html +1 -1
- data/docs/Tasker/Telemetry/Events.html +1 -1
- data/docs/Tasker/Telemetry/ExportCoordinator.html +1 -1
- data/docs/Tasker/Telemetry/IntelligentCacheManager.html +2 -2
- data/docs/Tasker/Telemetry/LogBackend.html +1 -1
- data/docs/Tasker/Telemetry/MetricTypes/Counter.html +2 -2
- data/docs/Tasker/Telemetry/MetricTypes/Gauge.html +73 -73
- data/docs/Tasker/Telemetry/MetricTypes/Histogram.html +103 -103
- data/docs/Tasker/Telemetry/MetricTypes.html +1 -1
- data/docs/Tasker/Telemetry/MetricsBackend.html +1 -1
- data/docs/Tasker/Telemetry/MetricsExportService.html +1 -1
- data/docs/Tasker/Telemetry/PluginRegistry.html +1 -1
- data/docs/Tasker/Telemetry/Plugins/BaseExporter.html +1 -1
- data/docs/Tasker/Telemetry/Plugins/CsvExporter.html +1 -1
- data/docs/Tasker/Telemetry/Plugins/JsonExporter.html +1 -1
- data/docs/Tasker/Telemetry/Plugins.html +1 -1
- data/docs/Tasker/Telemetry/PrometheusExporter.html +1 -1
- data/docs/Tasker/Telemetry/TraceBackend.html +1 -1
- data/docs/Tasker/Telemetry.html +1 -1
- data/docs/Tasker/Types/AuthConfig.html +1 -1
- data/docs/Tasker/Types/BackoffConfig.html +1 -1
- data/docs/Tasker/Types/BaseConfig.html +1 -1
- data/docs/Tasker/Types/CacheConfig.html +1 -1
- data/docs/Tasker/Types/DatabaseConfig.html +1 -1
- data/docs/Tasker/Types/DependencyGraph.html +1 -1
- data/docs/Tasker/Types/DependencyGraphConfig.html +1 -1
- data/docs/Tasker/Types/EngineConfig.html +1 -1
- data/docs/Tasker/Types/ExecutionConfig.html +1 -1
- data/docs/Tasker/Types/GraphEdge.html +1 -1
- data/docs/Tasker/Types/GraphMetadata.html +1 -1
- data/docs/Tasker/Types/GraphNode.html +1 -1
- data/docs/Tasker/Types/HealthConfig.html +1 -1
- data/docs/Tasker/Types/StepSequence.html +1 -1
- data/docs/Tasker/Types/StepTemplate.html +1 -1
- data/docs/Tasker/Types/TaskRequest.html +1 -1
- data/docs/Tasker/Types/TelemetryConfig.html +2 -2
- data/docs/Tasker/Types.html +1 -1
- data/docs/Tasker/WorkflowStep/StepFinder.html +1 -1
- data/docs/Tasker/WorkflowStep.html +1 -1
- data/docs/Tasker/WorkflowStepEdge.html +4 -6
- data/docs/Tasker/WorkflowStepSerializer.html +1 -1
- data/docs/Tasker/WorkflowStepTransition/TransitionDescriptionFormatter.html +1 -1
- data/docs/Tasker/WorkflowStepTransition.html +1 -1
- data/docs/Tasker/WorkflowStepsController.html +1 -1
- data/docs/Tasker.html +5 -21
- data/docs/VISION.md +1 -1
- data/docs/_index.html +77 -21
- data/docs/class_list.html +1 -1
- data/docs/file.README.html +14 -10
- data/docs/index.html +14 -10
- data/docs/method_list.html +1433 -1105
- data/docs/top-level-namespace.html +1 -1
- data/lib/generators/tasker/authenticator_generator.rb +5 -5
- data/lib/generators/tasker/authorization_coordinator_generator.rb +1 -1
- data/lib/generators/tasker/events_generator.rb +1 -1
- data/lib/generators/tasker/task_handler_generator.rb +4 -4
- data/lib/generators/tasker/templates/api_token_authenticator.rb.erb +1 -1
- data/lib/generators/tasker/templates/authorization_coordinator.rb.erb +13 -0
- data/lib/generators/tasker/templates/authorization_coordinator_spec.rb.erb +7 -1
- data/lib/generators/tasker/templates/custom_authenticator.rb.erb +1 -1
- data/lib/generators/tasker/templates/devise_authenticator.rb.erb +1 -1
- data/lib/generators/tasker/templates/initialize.rb.erb +1 -1
- data/lib/generators/tasker/templates/jwt_authenticator.rb.erb +1 -1
- data/lib/generators/tasker/templates/omniauth_authenticator.rb.erb +1 -1
- data/lib/generators/tasker/templates/opentelemetry_initializer.rb +4 -4
- data/lib/generators/tasker/templates/task_config.yaml.erb +25 -25
- data/lib/generators/tasker/templates/task_handler.rb.erb +2 -3
- data/lib/generators/tasker/templates/task_handler_spec.rb.erb +43 -49
- data/lib/tasker/analysis/runtime_graph_analyzer.rb +1 -1
- data/lib/tasker/authentication/coordinator.rb +2 -2
- data/lib/tasker/authorization/base_coordinator.rb +1 -1
- data/lib/tasker/authorization/resource_constants.rb +2 -1
- data/lib/tasker/authorization/resource_registry.rb +7 -0
- data/lib/tasker/authorization.rb +1 -1
- data/lib/tasker/concerns/authenticatable.rb +1 -1
- data/lib/tasker/concerns/controller_authorizable.rb +3 -3
- data/lib/tasker/concerns/structured_logging.rb +2 -2
- data/lib/tasker/events/definition_loader.rb +1 -1
- data/lib/tasker/events/subscribers/metrics_subscriber.rb +1 -1
- data/lib/tasker/events/subscribers/telemetry_subscriber.rb +5 -5
- data/lib/tasker/handler_factory.rb +2 -7
- data/lib/tasker/health/readiness_checker.rb +1 -1
- data/lib/tasker/health/status_checker.rb +1 -1
- data/lib/tasker/logging/correlation_id_generator.rb +1 -1
- data/lib/tasker/orchestration/backoff_calculator.rb +1 -1
- data/lib/tasker/orchestration/connection_builder.rb +1 -1
- data/lib/tasker/orchestration/connection_pool_intelligence.rb +3 -3
- data/lib/tasker/orchestration/step_executor.rb +2 -2
- data/lib/tasker/orchestration/task_finalizer.rb +1 -1
- data/lib/tasker/registry/base_registry.rb +1 -1
- data/lib/tasker/task_builder.rb +1 -1
- data/lib/tasker/task_handler/class_methods.rb +1 -4
- data/lib/tasker/telemetry/intelligent_cache_manager.rb +1 -1
- data/lib/tasker/telemetry/metric_types.rb +9 -57
- data/lib/tasker/telemetry/metrics_backend.rb +3 -3
- data/lib/tasker/telemetry/metrics_export_service.rb +1 -1
- data/lib/tasker/telemetry/prometheus_exporter.rb +2 -2
- data/lib/tasker/types/telemetry_config.rb +1 -1
- data/lib/tasker/version.rb +1 -2
- data/lib/tasks/tasker_tasks.rake +4 -85
- metadata +11 -7
- data/db/functions/get_step_readiness_status_single_and_batch_v02.sql +0 -223
- data/db/migrate/20250710110830_step_readiness_sql_functions_v02.rb +0 -39
- data/docs/REVERSIONING.md +0 -404
|
@@ -100,7 +100,7 @@
|
|
|
100
100
|
</div>
|
|
101
101
|
|
|
102
102
|
<div id="footer">
|
|
103
|
-
Generated on
|
|
103
|
+
Generated on Tue Jul 1 16:47:34 2025 by
|
|
104
104
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
|
105
105
|
0.9.37 (ruby-3.2.4).
|
|
106
106
|
</div>
|
|
@@ -204,7 +204,7 @@ module Tasker
|
|
|
204
204
|
def jwt_config_example
|
|
205
205
|
<<~CONFIG
|
|
206
206
|
# config/initializers/tasker.rb
|
|
207
|
-
Tasker
|
|
207
|
+
Tasker.configuration do |config|
|
|
208
208
|
config.auth do |auth|
|
|
209
209
|
auth.authentication_enabled = true
|
|
210
210
|
auth.authenticator_class = '#{class_name}Authenticator'
|
|
@@ -217,7 +217,7 @@ module Tasker
|
|
|
217
217
|
def devise_config_example
|
|
218
218
|
<<~CONFIG
|
|
219
219
|
# config/initializers/tasker.rb
|
|
220
|
-
Tasker
|
|
220
|
+
Tasker.configuration do |config|
|
|
221
221
|
config.auth do |auth|
|
|
222
222
|
auth.authentication_enabled = true
|
|
223
223
|
auth.authenticator_class = '#{class_name}Authenticator'
|
|
@@ -230,7 +230,7 @@ module Tasker
|
|
|
230
230
|
def api_token_config_example
|
|
231
231
|
<<~CONFIG
|
|
232
232
|
# config/initializers/tasker.rb
|
|
233
|
-
Tasker
|
|
233
|
+
Tasker.configuration do |config|
|
|
234
234
|
config.auth do |auth|
|
|
235
235
|
auth.authentication_enabled = true
|
|
236
236
|
auth.authenticator_class = '#{class_name}Authenticator'
|
|
@@ -243,7 +243,7 @@ module Tasker
|
|
|
243
243
|
def omniauth_config_example
|
|
244
244
|
<<~CONFIG
|
|
245
245
|
# config/initializers/tasker.rb
|
|
246
|
-
Tasker
|
|
246
|
+
Tasker.configuration do |config|
|
|
247
247
|
config.auth do |auth|
|
|
248
248
|
auth.authentication_enabled = true
|
|
249
249
|
auth.authenticator_class = '#{class_name}Authenticator'
|
|
@@ -256,7 +256,7 @@ module Tasker
|
|
|
256
256
|
def custom_config_example
|
|
257
257
|
<<~CONFIG
|
|
258
258
|
# config/initializers/tasker.rb
|
|
259
|
-
Tasker
|
|
259
|
+
Tasker.configuration do |config|
|
|
260
260
|
config.auth do |auth|
|
|
261
261
|
auth.authentication_enabled = true
|
|
262
262
|
auth.authenticator_class = '#{class_name}Authenticator'
|
|
@@ -101,7 +101,7 @@ module Tasker
|
|
|
101
101
|
|
|
102
102
|
```ruby
|
|
103
103
|
# config/initializers/tasker.rb
|
|
104
|
-
Tasker
|
|
104
|
+
Tasker.configuration do |config|
|
|
105
105
|
config.auth do |auth|
|
|
106
106
|
auth.authorization_enabled = true
|
|
107
107
|
auth.authorization_coordinator_class = '#{coordinator_class_name}'
|
|
@@ -57,7 +57,7 @@ module Tasker
|
|
|
57
57
|
🔧 Advanced Configuration (if needed):
|
|
58
58
|
For complex organizational needs, configure additional directories:
|
|
59
59
|
|
|
60
|
-
Tasker
|
|
60
|
+
Tasker.configuration do |config|
|
|
61
61
|
config.add_custom_events_directories(
|
|
62
62
|
'vendor/gems/my_gem/events',
|
|
63
63
|
'app/modules/billing/events'
|
|
@@ -11,7 +11,7 @@ module Tasker
|
|
|
11
11
|
|
|
12
12
|
class_option :module_namespace, type: :string, default: nil,
|
|
13
13
|
desc: 'The module namespace for the task handler ' \
|
|
14
|
-
'(defaults to Tasker
|
|
14
|
+
'(defaults to Tasker.configuration.engine.default_module_namespace)'
|
|
15
15
|
class_option :namespace_name, type: :string, default: 'default',
|
|
16
16
|
desc: 'The TaskNamespace for organizing the task (e.g., payments, inventory, notifications)'
|
|
17
17
|
class_option :version, type: :string, default: '0.1.0',
|
|
@@ -23,7 +23,7 @@ module Tasker
|
|
|
23
23
|
|
|
24
24
|
def create_task_handler_files
|
|
25
25
|
# Set variables first
|
|
26
|
-
@module_namespace = options[:module_namespace] || Tasker
|
|
26
|
+
@module_namespace = options[:module_namespace] || Tasker.configuration.engine.default_module_namespace
|
|
27
27
|
@module_path = @module_namespace&.underscore
|
|
28
28
|
@task_handler_class = name.camelize
|
|
29
29
|
@task_name = name.underscore
|
|
@@ -36,8 +36,8 @@ module Tasker
|
|
|
36
36
|
ensure_configuration_loaded
|
|
37
37
|
|
|
38
38
|
# Get directory paths from configuration
|
|
39
|
-
@task_handler_directory = Tasker
|
|
40
|
-
@task_config_directory = Tasker
|
|
39
|
+
@task_handler_directory = Tasker.configuration.engine.task_handler_directory
|
|
40
|
+
@task_config_directory = Tasker.configuration.engine.task_config_directory
|
|
41
41
|
|
|
42
42
|
# Ensure directories exist
|
|
43
43
|
ensure_directories_exist(
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
# Expects tokens to be passed in request headers and looks up users by token.
|
|
8
8
|
#
|
|
9
9
|
# Configuration example:
|
|
10
|
-
# Tasker
|
|
10
|
+
# Tasker.configuration do |config|
|
|
11
11
|
# config.auth do |auth|
|
|
12
12
|
# auth.strategy = :custom
|
|
13
13
|
# auth.options = {
|
|
@@ -28,6 +28,8 @@ class <%= @coordinator_class_name %> < Tasker::Authorization::BaseCoordinator
|
|
|
28
28
|
authorize_task(action, context)
|
|
29
29
|
when Tasker::Authorization::ResourceConstants::RESOURCES::WORKFLOW_STEP
|
|
30
30
|
authorize_workflow_step(action, context)
|
|
31
|
+
when Tasker::Authorization::ResourceConstants::RESOURCES::TASK_DIAGRAM
|
|
32
|
+
authorize_task_diagram(action, context)
|
|
31
33
|
when Tasker::Authorization::ResourceConstants::RESOURCES::HEALTH_STATUS
|
|
32
34
|
authorize_system_status(action, context)
|
|
33
35
|
else
|
|
@@ -68,6 +70,17 @@ class <%= @coordinator_class_name %> < Tasker::Authorization::BaseCoordinator
|
|
|
68
70
|
end
|
|
69
71
|
end
|
|
70
72
|
|
|
73
|
+
# Authorize task diagram operations
|
|
74
|
+
def authorize_task_diagram(action, context)
|
|
75
|
+
case action
|
|
76
|
+
when :index, :show
|
|
77
|
+
# TODO: Implement your diagram access logic
|
|
78
|
+
user.has_tasker_permission?("tasker.task_diagram:#{action}")
|
|
79
|
+
else
|
|
80
|
+
false
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
71
84
|
# Authorize system status operations
|
|
72
85
|
def authorize_system_status(action, context)
|
|
73
86
|
case action
|
|
@@ -20,7 +20,8 @@ RSpec.describe <%= @coordinator_class_name %>, type: :model do
|
|
|
20
20
|
permissions: [
|
|
21
21
|
'tasker.task:index',
|
|
22
22
|
'tasker.task:show',
|
|
23
|
-
'tasker.workflow_step:index'
|
|
23
|
+
'tasker.workflow_step:index',
|
|
24
|
+
'tasker.task_diagram:index'
|
|
24
25
|
],
|
|
25
26
|
roles: ['user'],
|
|
26
27
|
admin: false
|
|
@@ -54,6 +55,7 @@ RSpec.describe <%= @coordinator_class_name %>, type: :model do
|
|
|
54
55
|
expect { coordinator.authorize!('tasker.task', :index) }.not_to raise_error
|
|
55
56
|
expect { coordinator.authorize!('tasker.task', :create) }.not_to raise_error
|
|
56
57
|
expect { coordinator.authorize!('tasker.workflow_step', :update) }.not_to raise_error
|
|
58
|
+
expect { coordinator.authorize!('tasker.task_diagram', :show) }.not_to raise_error
|
|
57
59
|
end
|
|
58
60
|
end
|
|
59
61
|
|
|
@@ -64,6 +66,7 @@ RSpec.describe <%= @coordinator_class_name %>, type: :model do
|
|
|
64
66
|
expect { coordinator.authorize!('tasker.task', :index) }.not_to raise_error
|
|
65
67
|
expect { coordinator.authorize!('tasker.task', :show) }.not_to raise_error
|
|
66
68
|
expect { coordinator.authorize!('tasker.workflow_step', :index) }.not_to raise_error
|
|
69
|
+
expect { coordinator.authorize!('tasker.task_diagram', :index) }.not_to raise_error
|
|
67
70
|
end
|
|
68
71
|
|
|
69
72
|
it 'denies access to forbidden resources' do
|
|
@@ -79,6 +82,7 @@ RSpec.describe <%= @coordinator_class_name %>, type: :model do
|
|
|
79
82
|
it 'denies all operations' do
|
|
80
83
|
expect { coordinator.authorize!('tasker.task', :index) }.to raise_error(Tasker::Authorization::UnauthorizedError)
|
|
81
84
|
expect { coordinator.authorize!('tasker.workflow_step', :show) }.to raise_error(Tasker::Authorization::UnauthorizedError)
|
|
85
|
+
expect { coordinator.authorize!('tasker.task_diagram', :show) }.to raise_error(Tasker::Authorization::UnauthorizedError)
|
|
82
86
|
end
|
|
83
87
|
end
|
|
84
88
|
end
|
|
@@ -91,6 +95,7 @@ RSpec.describe <%= @coordinator_class_name %>, type: :model do
|
|
|
91
95
|
expect(coordinator.can?('tasker.task', :index)).to be true
|
|
92
96
|
expect(coordinator.can?('tasker.task', :create)).to be true
|
|
93
97
|
expect(coordinator.can?('tasker.workflow_step', :update)).to be true
|
|
98
|
+
expect(coordinator.can?('tasker.task_diagram', :show)).to be true
|
|
94
99
|
end
|
|
95
100
|
end
|
|
96
101
|
|
|
@@ -101,6 +106,7 @@ RSpec.describe <%= @coordinator_class_name %>, type: :model do
|
|
|
101
106
|
expect(coordinator.can?('tasker.task', :index)).to be true
|
|
102
107
|
expect(coordinator.can?('tasker.task', :show)).to be true
|
|
103
108
|
expect(coordinator.can?('tasker.workflow_step', :index)).to be true
|
|
109
|
+
expect(coordinator.can?('tasker.task_diagram', :index)).to be true
|
|
104
110
|
end
|
|
105
111
|
|
|
106
112
|
it 'returns false for forbidden operations' do
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
# Supports both Bearer token and raw token formats in Authorization headers.
|
|
8
8
|
#
|
|
9
9
|
# Configuration example:
|
|
10
|
-
# Tasker
|
|
10
|
+
# Tasker.configuration do |config|
|
|
11
11
|
# config.auth do |auth|
|
|
12
12
|
# auth.strategy = :custom
|
|
13
13
|
# auth.options = {
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
# Supports multiple authentication providers and session-based authentication.
|
|
8
8
|
#
|
|
9
9
|
# Configuration example:
|
|
10
|
-
# Tasker
|
|
10
|
+
# Tasker.configuration do |config|
|
|
11
11
|
# config.auth do |auth|
|
|
12
12
|
# auth.strategy = :custom
|
|
13
13
|
# auth.options = {
|
|
@@ -9,10 +9,10 @@ require 'opentelemetry/instrumentation/all'
|
|
|
9
9
|
|
|
10
10
|
# Configure OpenTelemetry
|
|
11
11
|
OpenTelemetry::SDK.configure do |c|
|
|
12
|
-
c.service_name = Tasker
|
|
12
|
+
c.service_name = Tasker.configuration.telemetry.service_name
|
|
13
13
|
|
|
14
14
|
# Service version must be configured for instrumentation to work properly
|
|
15
|
-
c.service_version = '
|
|
15
|
+
c.service_version = 'v1.0.0'
|
|
16
16
|
|
|
17
17
|
# Configure OTLP exporter to send to local Jaeger
|
|
18
18
|
otlp_exporter = OpenTelemetry::Exporter::OTLP::Exporter.new(
|
|
@@ -27,8 +27,8 @@ OpenTelemetry::SDK.configure do |c|
|
|
|
27
27
|
# Resource configuration
|
|
28
28
|
c.resource = OpenTelemetry::SDK::Resources::Resource.create({
|
|
29
29
|
# Core service identification
|
|
30
|
-
'service.name' => Tasker
|
|
31
|
-
'service.version' => Tasker
|
|
30
|
+
'service.name' => Tasker.configuration.telemetry.service_name,
|
|
31
|
+
'service.version' => Tasker.configuration.telemetry.service_version,
|
|
32
32
|
'service.framework' => 'tasker'
|
|
33
33
|
})
|
|
34
34
|
|
|
@@ -8,17 +8,17 @@ module_namespace: <%= @module_namespace %>
|
|
|
8
8
|
task_handler_class: <%= @task_handler_class %>
|
|
9
9
|
description: "<%= @description || "Generated task handler for #{@task_name}" %>"
|
|
10
10
|
|
|
11
|
-
default_dependent_system:
|
|
11
|
+
default_dependent_system: <%= @dependent_system %>
|
|
12
12
|
named_steps:
|
|
13
|
-
<% if @steps && @steps.any?
|
|
14
|
-
<% @steps.each do |step|
|
|
13
|
+
<% if @steps && @steps.any? -%>
|
|
14
|
+
<% @steps.each do |step| -%>
|
|
15
15
|
- <%= step %>
|
|
16
|
-
<% end
|
|
17
|
-
<% else
|
|
16
|
+
<% end -%>
|
|
17
|
+
<% else -%>
|
|
18
18
|
- fetch_data
|
|
19
19
|
- process_data
|
|
20
20
|
- complete_task
|
|
21
|
-
<% end
|
|
21
|
+
<% end -%>
|
|
22
22
|
|
|
23
23
|
schema:
|
|
24
24
|
type: object
|
|
@@ -29,16 +29,16 @@ schema:
|
|
|
29
29
|
type: integer
|
|
30
30
|
|
|
31
31
|
step_templates:
|
|
32
|
-
<% if @steps && @steps.any?
|
|
33
|
-
<% @steps.each_with_index do |step, index|
|
|
32
|
+
<% if @steps && @steps.any? -%>
|
|
33
|
+
<% @steps.each_with_index do |step, index| -%>
|
|
34
34
|
- name: <%= step %>
|
|
35
35
|
description: <%= step.humanize %> step
|
|
36
36
|
handler_class: <%= @module_namespace ? "#{@module_namespace}::" : '' %><%= @task_handler_class %>::<%= step.classify %>StepHandler
|
|
37
|
-
<% if index > 0
|
|
37
|
+
<% if index > 0 -%>
|
|
38
38
|
depends_on_step: <%= @steps[index - 1] %>
|
|
39
|
-
<% end
|
|
40
|
-
<% end
|
|
41
|
-
<% else
|
|
39
|
+
<% end -%>
|
|
40
|
+
<% end -%>
|
|
41
|
+
<% else -%>
|
|
42
42
|
- name: fetch_data
|
|
43
43
|
description: Fetch required data from dependent system
|
|
44
44
|
handler_class: <%= @module_namespace ? "#{@module_namespace}::" : '' %><%= @task_handler_class %>::FetchDataStepHandler
|
|
@@ -63,55 +63,55 @@ step_templates:
|
|
|
63
63
|
description: Complete the task with processed data
|
|
64
64
|
depends_on_step: process_data
|
|
65
65
|
handler_class: <%= @module_namespace ? "#{@module_namespace}::" : '' %><%= @task_handler_class %>::CompleteTaskStepHandler
|
|
66
|
-
<% end
|
|
66
|
+
<% end -%>
|
|
67
67
|
|
|
68
68
|
environments:
|
|
69
69
|
development:
|
|
70
70
|
step_templates:
|
|
71
|
-
<% if @steps && @steps.any?
|
|
72
|
-
<% first_step = @steps.first
|
|
71
|
+
<% if @steps && @steps.any? -%>
|
|
72
|
+
<% first_step = @steps.first -%>
|
|
73
73
|
- name: <%= first_step %>
|
|
74
74
|
handler_config:
|
|
75
75
|
params:
|
|
76
76
|
debug: true
|
|
77
|
-
<% else
|
|
77
|
+
<% else -%>
|
|
78
78
|
- name: fetch_data
|
|
79
79
|
handler_config:
|
|
80
80
|
url: http://localhost:3000/api/data
|
|
81
81
|
params:
|
|
82
82
|
id: 1
|
|
83
83
|
debug: true
|
|
84
|
-
<% end
|
|
84
|
+
<% end -%>
|
|
85
85
|
|
|
86
86
|
test:
|
|
87
87
|
step_templates:
|
|
88
|
-
<% if @steps && @steps.any?
|
|
89
|
-
<% first_step = @steps.first
|
|
88
|
+
<% if @steps && @steps.any? -%>
|
|
89
|
+
<% first_step = @steps.first -%>
|
|
90
90
|
- name: <%= first_step %>
|
|
91
91
|
handler_config:
|
|
92
92
|
params:
|
|
93
93
|
test_mode: true
|
|
94
|
-
<% else
|
|
94
|
+
<% else -%>
|
|
95
95
|
- name: fetch_data
|
|
96
96
|
handler_config:
|
|
97
97
|
url: http://test-api.example.com/data
|
|
98
98
|
params:
|
|
99
99
|
id: 1
|
|
100
100
|
test_mode: true
|
|
101
|
-
<% end
|
|
101
|
+
<% end -%>
|
|
102
102
|
|
|
103
103
|
production:
|
|
104
104
|
step_templates:
|
|
105
|
-
<% if @steps && @steps.any?
|
|
106
|
-
<% first_step = @steps.first
|
|
105
|
+
<% if @steps && @steps.any? -%>
|
|
106
|
+
<% first_step = @steps.first -%>
|
|
107
107
|
- name: <%= first_step %>
|
|
108
108
|
handler_config:
|
|
109
109
|
params: {}
|
|
110
|
-
<% else
|
|
110
|
+
<% else -%>
|
|
111
111
|
- name: fetch_data
|
|
112
112
|
handler_config:
|
|
113
113
|
url: https://api.example.com/data
|
|
114
114
|
params:
|
|
115
115
|
id: 1
|
|
116
116
|
api_key: ${API_KEY}
|
|
117
|
-
<% end
|
|
117
|
+
<% end -%>
|
|
@@ -19,10 +19,9 @@ module <%= @module_namespace %>
|
|
|
19
19
|
connection.get("/data/#{input_id}")
|
|
20
20
|
end
|
|
21
21
|
|
|
22
|
-
def process_results(
|
|
22
|
+
def process_results(_task, _sequence, step)
|
|
23
23
|
# Extract the response ID from the API response
|
|
24
|
-
|
|
25
|
-
step.results = { response_id: data.deep_symbolize_keys.dig(:data, :id) }
|
|
24
|
+
step.results = { response_id: step.results.deep_symbolize_keys.dig(:data, :id) }
|
|
26
25
|
end
|
|
27
26
|
end
|
|
28
27
|
|
|
@@ -5,17 +5,26 @@ require 'rails_helper'
|
|
|
5
5
|
RSpec.describe <%= @module_namespace ? "#{@module_namespace}::" : '' %><%= @task_handler_class %> do
|
|
6
6
|
let(:stubs) { Faraday::Adapter::Test::Stubs.new }
|
|
7
7
|
let(:connection) { Faraday.new { |b| b.adapter(:test, stubs) } }
|
|
8
|
-
let(:task_handler)
|
|
8
|
+
let(:task_handler) do
|
|
9
|
+
handler = described_class.new
|
|
10
|
+
mock_connection = connection # Capture connection in closure
|
|
11
|
+
original_get_step_handler = handler.method(:get_step_handler)
|
|
12
|
+
handler.define_singleton_method(:get_step_handler) do |step|
|
|
13
|
+
step_handler = original_get_step_handler.call(step)
|
|
14
|
+
step_handler.instance_variable_set(:@connection, mock_connection)
|
|
15
|
+
step_handler
|
|
16
|
+
end
|
|
17
|
+
handler
|
|
18
|
+
end
|
|
9
19
|
let(:yaml_path) { described_class.yaml_path }
|
|
10
|
-
let(:yaml_config) {
|
|
20
|
+
let(:yaml_config) { YAML.load_file(yaml_path) }
|
|
11
21
|
let(:handler_class) { described_class }
|
|
12
|
-
let(:input_id) { 1 }
|
|
13
22
|
let(:task_request) do
|
|
14
23
|
Tasker::Types::TaskRequest.new(
|
|
15
24
|
name: "<%= @task_name %>",
|
|
16
25
|
namespace: "<%= @namespace_name || 'default' %>",
|
|
17
26
|
version: "<%= @version || '0.1.0' %>",
|
|
18
|
-
context: { "input_id" =>
|
|
27
|
+
context: { "input_id" => "123" },
|
|
19
28
|
initiator: "user",
|
|
20
29
|
reason: "test",
|
|
21
30
|
source_system: "test_system"
|
|
@@ -24,33 +33,6 @@ RSpec.describe <%= @module_namespace ? "#{@module_namespace}::" : '' %><%= @task
|
|
|
24
33
|
let(:task) { task_handler.initialize_task!(task_request) }
|
|
25
34
|
let(:factory) { Tasker::HandlerFactory.instance }
|
|
26
35
|
|
|
27
|
-
before do
|
|
28
|
-
# Register handler with namespace + version support
|
|
29
|
-
factory.register(
|
|
30
|
-
"<%= @task_name %>",
|
|
31
|
-
described_class,
|
|
32
|
-
namespace_name: "<%= @namespace_name || 'default' %>",
|
|
33
|
-
version: "<%= @version || '0.1.0' %>",
|
|
34
|
-
replace: true
|
|
35
|
-
)
|
|
36
|
-
# Stub data endpoint
|
|
37
|
-
stubs.get("/data/#{input_id}") do |_env|
|
|
38
|
-
[
|
|
39
|
-
200,
|
|
40
|
-
{ 'Content-Type' => 'application/json' },
|
|
41
|
-
{ data: { id: input_id } }.to_json
|
|
42
|
-
]
|
|
43
|
-
end
|
|
44
|
-
# Stub data endpoint
|
|
45
|
-
stubs.get("/data") do |_env|
|
|
46
|
-
[
|
|
47
|
-
200,
|
|
48
|
-
{ 'Content-Type' => 'application/json' },
|
|
49
|
-
{ data: [ { id: input_id } ] }.to_json
|
|
50
|
-
]
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
|
|
54
36
|
describe '#initialize' do
|
|
55
37
|
it 'loads the task configuration from YAML' do
|
|
56
38
|
expect(task_handler.config).to be_a(Hash)
|
|
@@ -122,6 +104,36 @@ RSpec.describe <%= @module_namespace ? "#{@module_namespace}::" : '' %><%= @task
|
|
|
122
104
|
end
|
|
123
105
|
|
|
124
106
|
describe 'complete workflow' do
|
|
107
|
+
before do
|
|
108
|
+
# Register handler with namespace + version support
|
|
109
|
+
factory.register(
|
|
110
|
+
"<%= @task_name %>",
|
|
111
|
+
described_class,
|
|
112
|
+
namespace_name: "<%= @namespace_name || 'default' %>",
|
|
113
|
+
version: "<%= @version || '0.1.0' %>"
|
|
114
|
+
)
|
|
115
|
+
stubs.get("/data") do |env|
|
|
116
|
+
Faraday::Response.new(
|
|
117
|
+
Faraday::Env.from(
|
|
118
|
+
status: 200,
|
|
119
|
+
response_headers: { 'Content-Type' => 'application/json' },
|
|
120
|
+
body: { data: { id: 123 } }.to_json,
|
|
121
|
+
url: env.url
|
|
122
|
+
)
|
|
123
|
+
)
|
|
124
|
+
end
|
|
125
|
+
stubs.get("/data/123") do |env|
|
|
126
|
+
Faraday::Response.new(
|
|
127
|
+
Faraday::Env.from(
|
|
128
|
+
status: 200,
|
|
129
|
+
response_headers: { 'Content-Type' => 'application/json' },
|
|
130
|
+
body: { data: { id: 123 } }.to_json,
|
|
131
|
+
url: env.url
|
|
132
|
+
)
|
|
133
|
+
)
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
125
137
|
it 'can handle the task' do
|
|
126
138
|
expect(task).to be_valid
|
|
127
139
|
expect(task.save).to be_truthy
|
|
@@ -145,21 +157,3 @@ RSpec.describe <%= @module_namespace ? "#{@module_namespace}::" : '' %><%= @task
|
|
|
145
157
|
end
|
|
146
158
|
end
|
|
147
159
|
end
|
|
148
|
-
|
|
149
|
-
# Create task handler with connection stubbing (for API integration tests)
|
|
150
|
-
def create_api_task_handler_with_connection(handler_class, connection)
|
|
151
|
-
handler = handler_class.new
|
|
152
|
-
|
|
153
|
-
# Override get_step_handler to inject the mocked connection
|
|
154
|
-
original_get_step_handler = handler.method(:get_step_handler)
|
|
155
|
-
handler.define_singleton_method(:get_step_handler) do |step|
|
|
156
|
-
step_handler = original_get_step_handler.call(step)
|
|
157
|
-
|
|
158
|
-
# For API step handlers, override the connection that was built during initialization
|
|
159
|
-
step_handler.instance_variable_set(:@connection, connection) if step_handler.is_a?(Tasker::StepHandler::Api)
|
|
160
|
-
|
|
161
|
-
step_handler
|
|
162
|
-
end
|
|
163
|
-
|
|
164
|
-
handler
|
|
165
|
-
end
|
|
@@ -127,7 +127,7 @@ module Tasker
|
|
|
127
127
|
# @return [Tasker::Types::DependencyGraphConfig] Configuration for calculations
|
|
128
128
|
# @api private
|
|
129
129
|
def dependency_graph_config
|
|
130
|
-
@dependency_graph_config ||= Tasker
|
|
130
|
+
@dependency_graph_config ||= Tasker.configuration.dependency_graph
|
|
131
131
|
end
|
|
132
132
|
|
|
133
133
|
# Generate cache version based on task state for intelligent cache invalidation
|
|
@@ -24,7 +24,7 @@ module Tasker
|
|
|
24
24
|
private
|
|
25
25
|
|
|
26
26
|
def build_authenticator
|
|
27
|
-
auth_config = Tasker
|
|
27
|
+
auth_config = Tasker.configuration.auth
|
|
28
28
|
|
|
29
29
|
if auth_config.authentication_enabled
|
|
30
30
|
build_custom_authenticator(auth_config)
|
|
@@ -43,7 +43,7 @@ module Tasker
|
|
|
43
43
|
|
|
44
44
|
# Instantiate the host app's authenticator
|
|
45
45
|
klass = authenticator_class.constantize
|
|
46
|
-
# Pass empty options hash for now - authenticators can get config from Tasker
|
|
46
|
+
# Pass empty options hash for now - authenticators can get config from Tasker.configuration
|
|
47
47
|
authenticator = klass.new({})
|
|
48
48
|
|
|
49
49
|
# Validate it implements the interface
|
|
@@ -100,7 +100,7 @@ module Tasker
|
|
|
100
100
|
#
|
|
101
101
|
# @return [Boolean] True if authorization is enabled
|
|
102
102
|
def authorization_enabled?
|
|
103
|
-
Tasker
|
|
103
|
+
Tasker.configuration.auth.authorization_enabled
|
|
104
104
|
end
|
|
105
105
|
|
|
106
106
|
# The user object for authorization checks
|
|
@@ -16,6 +16,7 @@ module Tasker
|
|
|
16
16
|
module RESOURCES
|
|
17
17
|
TASK = 'tasker.task'
|
|
18
18
|
WORKFLOW_STEP = 'tasker.workflow_step'
|
|
19
|
+
TASK_DIAGRAM = 'tasker.task_diagram'
|
|
19
20
|
HEALTH_STATUS = 'tasker.health_status'
|
|
20
21
|
HANDLER = 'tasker.handler'
|
|
21
22
|
METRICS = 'tasker.metrics'
|
|
@@ -25,7 +26,7 @@ module Tasker
|
|
|
25
26
|
#
|
|
26
27
|
# @return [Array<String>] All defined resource names
|
|
27
28
|
def self.all
|
|
28
|
-
[TASK, WORKFLOW_STEP, HEALTH_STATUS, HANDLER, METRICS, ANALYTICS]
|
|
29
|
+
[TASK, WORKFLOW_STEP, TASK_DIAGRAM, HEALTH_STATUS, HANDLER, METRICS, ANALYTICS]
|
|
29
30
|
end
|
|
30
31
|
|
|
31
32
|
# Check if a resource constant is defined
|
|
@@ -48,6 +48,13 @@ module Tasker
|
|
|
48
48
|
],
|
|
49
49
|
description: 'Individual workflow steps'
|
|
50
50
|
},
|
|
51
|
+
ResourceConstants::RESOURCES::TASK_DIAGRAM => {
|
|
52
|
+
actions: [
|
|
53
|
+
ResourceConstants::ACTIONS::INDEX,
|
|
54
|
+
ResourceConstants::ACTIONS::SHOW
|
|
55
|
+
],
|
|
56
|
+
description: 'Task workflow diagrams'
|
|
57
|
+
},
|
|
51
58
|
ResourceConstants::RESOURCES::HEALTH_STATUS => {
|
|
52
59
|
actions: [
|
|
53
60
|
ResourceConstants::ACTIONS::INDEX
|
data/lib/tasker/authorization.rb
CHANGED
|
@@ -19,7 +19,7 @@ module Tasker
|
|
|
19
19
|
# - User model integration via the Authorizable concern
|
|
20
20
|
#
|
|
21
21
|
# @example Basic configuration
|
|
22
|
-
# Tasker
|
|
22
|
+
# Tasker.configuration do |config|
|
|
23
23
|
# config.auth do |auth|
|
|
24
24
|
# auth.enabled = true
|
|
25
25
|
# auth.coordinator_class = 'MyAuthorizationCoordinator'
|
|
@@ -66,10 +66,10 @@ module Tasker
|
|
|
66
66
|
#
|
|
67
67
|
# @return [BaseCoordinator] New coordinator instance
|
|
68
68
|
def build_authorization_coordinator
|
|
69
|
-
coordinator_class = Tasker
|
|
69
|
+
coordinator_class = Tasker.configuration.auth.authorization_coordinator_class.constantize
|
|
70
70
|
coordinator_class.new(current_tasker_user)
|
|
71
71
|
rescue NameError => e
|
|
72
|
-
coordinator_class_name = Tasker
|
|
72
|
+
coordinator_class_name = Tasker.configuration.auth.authorization_coordinator_class
|
|
73
73
|
raise Tasker::Authorization::ConfigurationError,
|
|
74
74
|
"Authorization coordinator class '#{coordinator_class_name}' not found: #{e.message}"
|
|
75
75
|
end
|
|
@@ -117,7 +117,7 @@ module Tasker
|
|
|
117
117
|
#
|
|
118
118
|
# @return [Boolean] True if authorization should be skipped
|
|
119
119
|
def skip_authorization?
|
|
120
|
-
!Tasker
|
|
120
|
+
!Tasker.configuration.auth.authorization_enabled
|
|
121
121
|
end
|
|
122
122
|
end
|
|
123
123
|
end
|
|
@@ -322,7 +322,7 @@ module Tasker
|
|
|
322
322
|
def extract_standard_context
|
|
323
323
|
context = {
|
|
324
324
|
environment: Rails.env,
|
|
325
|
-
tasker_version: Tasker::
|
|
325
|
+
tasker_version: Tasker::VERSION
|
|
326
326
|
}
|
|
327
327
|
|
|
328
328
|
# Add process/thread info if available
|
|
@@ -380,7 +380,7 @@ module Tasker
|
|
|
380
380
|
#
|
|
381
381
|
# @return [Tasker::Types::TelemetryConfig] Telemetry configuration
|
|
382
382
|
def telemetry_config
|
|
383
|
-
@telemetry_config ||= Tasker
|
|
383
|
+
@telemetry_config ||= Tasker.configuration.telemetry
|
|
384
384
|
end
|
|
385
385
|
end
|
|
386
386
|
end
|