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,432 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'custom_registry'
|
4
|
+
|
5
|
+
module Tasker
|
6
|
+
module Events
|
7
|
+
# Event Catalog provides discovery and documentation for all Tasker events
|
8
|
+
#
|
9
|
+
# This class enables developers to explore and understand the event system
|
10
|
+
# with runtime introspection, payload schemas, and usage examples.
|
11
|
+
#
|
12
|
+
# All metadata is now sourced from Constants::EventDefinitions to ensure
|
13
|
+
# a single source of truth between registration and documentation.
|
14
|
+
#
|
15
|
+
# Usage:
|
16
|
+
# # Browse all available events
|
17
|
+
# Tasker::Events.catalog
|
18
|
+
#
|
19
|
+
# # Get details about a specific event
|
20
|
+
# Tasker::Events.event_info('task.completed')
|
21
|
+
#
|
22
|
+
# # List events by category
|
23
|
+
# Tasker::Events.task_events
|
24
|
+
# Tasker::Events.step_events
|
25
|
+
class Catalog
|
26
|
+
class << self
|
27
|
+
# Get complete event catalog with descriptions and schemas
|
28
|
+
# Now reads directly from EventDefinitions for consistency
|
29
|
+
#
|
30
|
+
# @return [Hash] Complete event catalog
|
31
|
+
def catalog
|
32
|
+
@catalog ||= build_catalog_from_definitions
|
33
|
+
end
|
34
|
+
|
35
|
+
# Get information about a specific event
|
36
|
+
#
|
37
|
+
# @param event_name [String, Symbol] The event name
|
38
|
+
# @return [Hash, nil] Event information or nil if not found
|
39
|
+
def event_info(event_name)
|
40
|
+
definition = Tasker::Constants::EventDefinitions.find_by(constant: event_name.to_s)
|
41
|
+
return nil unless definition
|
42
|
+
|
43
|
+
format_event_info(definition)
|
44
|
+
end
|
45
|
+
|
46
|
+
# Get all task-related events
|
47
|
+
#
|
48
|
+
# @return [Hash] Task events with documentation
|
49
|
+
def task_events
|
50
|
+
catalog.select { |_, event| event[:category] == 'task' }
|
51
|
+
end
|
52
|
+
|
53
|
+
# Get all step-related events
|
54
|
+
#
|
55
|
+
# @return [Hash] Step events with documentation
|
56
|
+
def step_events
|
57
|
+
catalog.select { |_, event| event[:category] == 'step' }
|
58
|
+
end
|
59
|
+
|
60
|
+
# Get all workflow orchestration events
|
61
|
+
#
|
62
|
+
# @return [Hash] Workflow events with documentation
|
63
|
+
def workflow_events
|
64
|
+
catalog.select { |_, event| event[:category] == 'workflow' }
|
65
|
+
end
|
66
|
+
|
67
|
+
# Get all observability events
|
68
|
+
#
|
69
|
+
# @return [Hash] Observability events with documentation
|
70
|
+
def observability_events
|
71
|
+
catalog.select { |_, event| event[:category] == 'observability' }
|
72
|
+
end
|
73
|
+
|
74
|
+
# Get complete catalog including custom events
|
75
|
+
#
|
76
|
+
# @return [Hash] All events (system + custom)
|
77
|
+
def complete_catalog
|
78
|
+
system_catalog = catalog
|
79
|
+
custom_events_data = Tasker::Events::CustomRegistry.instance.custom_events
|
80
|
+
|
81
|
+
# Format custom events to match system catalog structure
|
82
|
+
formatted_custom = custom_events_data.transform_values do |event|
|
83
|
+
{
|
84
|
+
name: event[:name],
|
85
|
+
category: event[:category],
|
86
|
+
description: event[:description],
|
87
|
+
fired_by: event[:fired_by],
|
88
|
+
payload_schema: {}, # MVP: no schema validation yet
|
89
|
+
example_payload: {} # MVP: no examples yet
|
90
|
+
}
|
91
|
+
end
|
92
|
+
|
93
|
+
system_catalog.merge(formatted_custom)
|
94
|
+
end
|
95
|
+
|
96
|
+
# Get only custom events
|
97
|
+
#
|
98
|
+
# @return [Hash] Custom events with metadata
|
99
|
+
def custom_events
|
100
|
+
complete_catalog.select { |_, event| event[:category] == 'custom' }
|
101
|
+
end
|
102
|
+
|
103
|
+
# Search events by name or description
|
104
|
+
#
|
105
|
+
# @param query [String] Search query
|
106
|
+
# @return [Hash] Matching events
|
107
|
+
def search_events(query)
|
108
|
+
complete_catalog.select do |name, event|
|
109
|
+
name.downcase.include?(query.downcase) ||
|
110
|
+
event[:description].downcase.include?(query.downcase)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
# Get events by namespace (e.g., 'order', 'payment')
|
115
|
+
#
|
116
|
+
# @param namespace [String] Event namespace
|
117
|
+
# @return [Hash] Events in namespace
|
118
|
+
def events_by_namespace(namespace)
|
119
|
+
complete_catalog.select { |name, _| name.start_with?("#{namespace}.") }
|
120
|
+
end
|
121
|
+
|
122
|
+
# Register a custom event (called by BaseSubscriber)
|
123
|
+
#
|
124
|
+
# @param event_name [String] The custom event name
|
125
|
+
# @param metadata [Hash] Optional metadata about the event
|
126
|
+
# @return [void]
|
127
|
+
def register_custom_event(event_name, metadata = {})
|
128
|
+
CustomEventRegistrar.register(event_name, metadata, self)
|
129
|
+
end
|
130
|
+
|
131
|
+
# Pretty print the catalog for console exploration
|
132
|
+
#
|
133
|
+
# @param output [IO] Output destination (defaults to $stdout in development/test, Rails.logger in production)
|
134
|
+
# @return [void]
|
135
|
+
def print_catalog(output: nil)
|
136
|
+
CatalogPrinter.print(complete_catalog, output)
|
137
|
+
end
|
138
|
+
|
139
|
+
private
|
140
|
+
|
141
|
+
# Build the complete event catalog from EventDefinitions
|
142
|
+
# This ensures consistency between registration and documentation
|
143
|
+
#
|
144
|
+
# @return [Hash] Complete event catalog
|
145
|
+
def build_catalog_from_definitions
|
146
|
+
catalog = {}
|
147
|
+
|
148
|
+
Tasker::Constants::EventDefinitions.all_events.each_value do |events|
|
149
|
+
events.each_value do |event_definition|
|
150
|
+
event_constant = event_definition['constant'] || event_definition[:constant]
|
151
|
+
next unless event_constant
|
152
|
+
|
153
|
+
catalog[event_constant] = format_event_info(event_definition)
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
catalog
|
158
|
+
end
|
159
|
+
|
160
|
+
# Format event definition into catalog format
|
161
|
+
#
|
162
|
+
# @param definition [Hash] Event definition from EventDefinitions
|
163
|
+
# @return [Hash] Formatted event info
|
164
|
+
def format_event_info(definition)
|
165
|
+
# Handle both symbol and string keys for flexibility
|
166
|
+
constant = definition[:constant] || definition['constant']
|
167
|
+
category = definition[:category] || definition['category']
|
168
|
+
description = definition[:description] || definition['description']
|
169
|
+
payload_schema = definition[:payload_schema] || definition['payload_schema']
|
170
|
+
fired_by = definition[:fired_by] || definition['fired_by'] || []
|
171
|
+
|
172
|
+
{
|
173
|
+
name: constant,
|
174
|
+
category: category,
|
175
|
+
description: description,
|
176
|
+
payload_schema: payload_schema,
|
177
|
+
example_payload: generate_example_payload(payload_schema),
|
178
|
+
fired_by: fired_by
|
179
|
+
}
|
180
|
+
end
|
181
|
+
|
182
|
+
# Generate example payload from schema
|
183
|
+
#
|
184
|
+
# @param schema [Hash] Payload schema
|
185
|
+
# @return [Hash] Example payload
|
186
|
+
def generate_example_payload(schema)
|
187
|
+
return {} if schema.blank?
|
188
|
+
|
189
|
+
example = {}
|
190
|
+
schema.each do |key, type|
|
191
|
+
example[key] = ExamplePayloadGenerator.generate_value(key, type)
|
192
|
+
end
|
193
|
+
example
|
194
|
+
end
|
195
|
+
|
196
|
+
# Service class to generate example values for different data types
|
197
|
+
# Reduces complexity by organizing type-specific generation logic
|
198
|
+
class ExamplePayloadGenerator
|
199
|
+
class << self
|
200
|
+
# Generate example value for a key-type pair
|
201
|
+
#
|
202
|
+
# @param key [String, Symbol] The key name
|
203
|
+
# @param type [String] The data type
|
204
|
+
# @return [Object] Generated example value
|
205
|
+
def generate_value(key, type)
|
206
|
+
case type
|
207
|
+
when 'String'
|
208
|
+
generate_string_value(key)
|
209
|
+
when 'Integer'
|
210
|
+
generate_integer_value(key)
|
211
|
+
when 'Float'
|
212
|
+
generate_float_value
|
213
|
+
when 'Time'
|
214
|
+
generate_time_value
|
215
|
+
when 'Array<String>'
|
216
|
+
generate_string_array_value
|
217
|
+
else
|
218
|
+
generate_default_value(key)
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
private
|
223
|
+
|
224
|
+
# Generate example string value based on key name
|
225
|
+
#
|
226
|
+
# @param key [String, Symbol] The key name
|
227
|
+
# @return [String] Generated string value
|
228
|
+
def generate_string_value(key)
|
229
|
+
key.to_s.include?('id') ? "#{key}_123" : "example_#{key}"
|
230
|
+
end
|
231
|
+
|
232
|
+
# Generate example integer value based on key name
|
233
|
+
#
|
234
|
+
# @param key [String, Symbol] The key name
|
235
|
+
# @return [Integer] Generated integer value
|
236
|
+
def generate_integer_value(key)
|
237
|
+
key.to_s.include?('count') ? 5 : 1
|
238
|
+
end
|
239
|
+
|
240
|
+
# Generate example float value
|
241
|
+
#
|
242
|
+
# @return [Float] Generated float value
|
243
|
+
def generate_float_value
|
244
|
+
2.34
|
245
|
+
end
|
246
|
+
|
247
|
+
# Generate example time value
|
248
|
+
#
|
249
|
+
# @return [Time] Current time
|
250
|
+
def generate_time_value
|
251
|
+
Time.current
|
252
|
+
end
|
253
|
+
|
254
|
+
# Generate example string array value
|
255
|
+
#
|
256
|
+
# @return [Array<String>] Generated array of strings
|
257
|
+
def generate_string_array_value
|
258
|
+
%w[item1 item2]
|
259
|
+
end
|
260
|
+
|
261
|
+
# Generate default example value
|
262
|
+
#
|
263
|
+
# @param key [String, Symbol] The key name
|
264
|
+
# @return [String] Default example value
|
265
|
+
def generate_default_value(key)
|
266
|
+
"example_#{key}"
|
267
|
+
end
|
268
|
+
end
|
269
|
+
end
|
270
|
+
|
271
|
+
# Service class to handle custom event registration
|
272
|
+
# Reduces complexity by organizing registration logic
|
273
|
+
class CustomEventRegistrar
|
274
|
+
class << self
|
275
|
+
# Register a custom event with metadata
|
276
|
+
#
|
277
|
+
# @param event_name [String] The custom event name
|
278
|
+
# @param metadata [Hash] Optional metadata about the event
|
279
|
+
# @param catalog_instance [Catalog] The catalog instance to update
|
280
|
+
# @return [void]
|
281
|
+
def register(event_name, metadata, catalog_instance)
|
282
|
+
register_event_name(event_name, catalog_instance)
|
283
|
+
|
284
|
+
# Add to catalog if metadata provided
|
285
|
+
return unless metadata.any?
|
286
|
+
|
287
|
+
register_event_metadata(event_name, metadata, catalog_instance)
|
288
|
+
end
|
289
|
+
|
290
|
+
private
|
291
|
+
|
292
|
+
# Register the event name in the custom events list
|
293
|
+
#
|
294
|
+
# @param event_name [String] The custom event name
|
295
|
+
# @param catalog_instance [Catalog] The catalog instance to update
|
296
|
+
# @return [void]
|
297
|
+
def register_event_name(event_name, catalog_instance)
|
298
|
+
unless catalog_instance.instance_variable_get(:@custom_events)
|
299
|
+
catalog_instance.instance_variable_set(:@custom_events,
|
300
|
+
[])
|
301
|
+
end
|
302
|
+
custom_events = catalog_instance.instance_variable_get(:@custom_events)
|
303
|
+
custom_events << event_name unless custom_events.include?(event_name)
|
304
|
+
end
|
305
|
+
|
306
|
+
# Register event metadata in the catalog
|
307
|
+
#
|
308
|
+
# @param event_name [String] The custom event name
|
309
|
+
# @param metadata [Hash] Event metadata
|
310
|
+
# @param catalog_instance [Catalog] The catalog instance to update
|
311
|
+
# @return [void]
|
312
|
+
def register_event_metadata(event_name, metadata, catalog_instance)
|
313
|
+
unless catalog_instance.instance_variable_get(:@catalog)
|
314
|
+
catalog_instance.instance_variable_set(:@catalog,
|
315
|
+
{})
|
316
|
+
end
|
317
|
+
catalog = catalog_instance.instance_variable_get(:@catalog)
|
318
|
+
|
319
|
+
catalog[event_name] = build_catalog_entry(event_name, metadata)
|
320
|
+
end
|
321
|
+
|
322
|
+
# Build catalog entry from metadata
|
323
|
+
#
|
324
|
+
# @param event_name [String] The custom event name
|
325
|
+
# @param metadata [Hash] Event metadata
|
326
|
+
# @return [Hash] Catalog entry
|
327
|
+
def build_catalog_entry(event_name, metadata)
|
328
|
+
{
|
329
|
+
name: event_name,
|
330
|
+
category: 'custom',
|
331
|
+
description: metadata[:description] || 'Custom event',
|
332
|
+
payload_schema: metadata[:payload_schema] || {},
|
333
|
+
example_payload: metadata[:example] || {},
|
334
|
+
fired_by: metadata[:fired_by] || ['Custom']
|
335
|
+
}
|
336
|
+
end
|
337
|
+
end
|
338
|
+
end
|
339
|
+
|
340
|
+
# Service class to handle catalog printing and formatting
|
341
|
+
# Reduces complexity by organizing output logic
|
342
|
+
class CatalogPrinter
|
343
|
+
class << self
|
344
|
+
# Print the complete catalog with formatting
|
345
|
+
#
|
346
|
+
# @param catalog [Hash] The complete catalog to print
|
347
|
+
# @param output [IO] Output destination
|
348
|
+
# @return [void]
|
349
|
+
def print(catalog, output = nil)
|
350
|
+
log_line = build_log_function(output)
|
351
|
+
|
352
|
+
print_header(log_line)
|
353
|
+
print_categories(catalog, log_line)
|
354
|
+
end
|
355
|
+
|
356
|
+
private
|
357
|
+
|
358
|
+
# Build the appropriate logging function based on output type
|
359
|
+
#
|
360
|
+
# @param output [IO] Output destination
|
361
|
+
# @return [Proc] Logging function
|
362
|
+
def build_log_function(output)
|
363
|
+
# Default to stdout in development/test for interactive exploration, logger in production
|
364
|
+
output ||= (Rails.env.production? ? Rails.logger : $stdout)
|
365
|
+
|
366
|
+
lambda do |message|
|
367
|
+
if output == Rails.logger
|
368
|
+
Rails.logger.debug message
|
369
|
+
else
|
370
|
+
output.puts message
|
371
|
+
end
|
372
|
+
end
|
373
|
+
end
|
374
|
+
|
375
|
+
# Print catalog header
|
376
|
+
#
|
377
|
+
# @param log_line [Proc] Logging function
|
378
|
+
# @return [void]
|
379
|
+
def print_header(log_line)
|
380
|
+
log_line.call "\n📊 Tasker Event Catalog"
|
381
|
+
log_line.call '=' * 50
|
382
|
+
end
|
383
|
+
|
384
|
+
# Print events organized by categories
|
385
|
+
#
|
386
|
+
# @param catalog [Hash] The complete catalog
|
387
|
+
# @param log_line [Proc] Logging function
|
388
|
+
# @return [void]
|
389
|
+
def print_categories(catalog, log_line)
|
390
|
+
%w[task step workflow observability custom].each do |category|
|
391
|
+
events = catalog.select { |_, event| event[:category] == category }
|
392
|
+
next if events.empty?
|
393
|
+
|
394
|
+
print_category_events(category, events, log_line)
|
395
|
+
end
|
396
|
+
end
|
397
|
+
|
398
|
+
# Print events for a specific category
|
399
|
+
#
|
400
|
+
# @param category [String] The category name
|
401
|
+
# @param events [Hash] Events in the category
|
402
|
+
# @param log_line [Proc] Logging function
|
403
|
+
# @return [void]
|
404
|
+
def print_category_events(category, events, log_line)
|
405
|
+
log_line.call "\n🔹 #{category.capitalize} Events:"
|
406
|
+
events.each_value do |event|
|
407
|
+
print_event_details(event, log_line)
|
408
|
+
end
|
409
|
+
end
|
410
|
+
|
411
|
+
# Print details for a single event
|
412
|
+
#
|
413
|
+
# @param event [Hash] Event details
|
414
|
+
# @param log_line [Proc] Logging function
|
415
|
+
# @return [void]
|
416
|
+
def print_event_details(event, log_line)
|
417
|
+
log_line.call " #{event[:name]}"
|
418
|
+
log_line.call " Description: #{event[:description]}"
|
419
|
+
log_line.call " Fired by: #{event[:fired_by].join(', ')}"
|
420
|
+
|
421
|
+
log_line.call " Payload: #{event[:payload_schema].keys.join(', ')}" if event[:payload_schema].any?
|
422
|
+
|
423
|
+
log_line.call ''
|
424
|
+
end
|
425
|
+
end
|
426
|
+
end
|
427
|
+
end
|
428
|
+
end
|
429
|
+
end
|
430
|
+
end
|
431
|
+
|
432
|
+
# Delegation is handled in lib/tasker/events.rb
|
@@ -0,0 +1,175 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'singleton'
|
4
|
+
|
5
|
+
module Tasker
|
6
|
+
module Events
|
7
|
+
# CustomRegistry manages registration and validation of developer-defined custom events
|
8
|
+
#
|
9
|
+
# This registry provides a safe way for developers to define their own events
|
10
|
+
# alongside Tasker's system events, with conflict prevention and namespace validation.
|
11
|
+
#
|
12
|
+
# Usage:
|
13
|
+
# registry = Tasker::Events::CustomRegistry.instance
|
14
|
+
# registry.register_event('order.fulfilled', description: 'Order completed', fired_by: ['OrderService'])
|
15
|
+
#
|
16
|
+
# Or through the Events module:
|
17
|
+
# Tasker::Events.register_custom_event('order.fulfilled', description: 'Order completed')
|
18
|
+
class CustomRegistry
|
19
|
+
include Singleton
|
20
|
+
|
21
|
+
def initialize
|
22
|
+
@custom_events = {}
|
23
|
+
end
|
24
|
+
|
25
|
+
# Register a custom event with metadata
|
26
|
+
#
|
27
|
+
# @param name [String] Event name (must contain namespace, e.g., 'order.fulfilled')
|
28
|
+
# @param description [String] Human-readable description
|
29
|
+
# @param fired_by [Array<String>] Components that fire this event
|
30
|
+
# @return [void]
|
31
|
+
# @raise [ArgumentError] If event name is invalid or conflicts with system events
|
32
|
+
def register_event(name, description: 'Custom event', fired_by: [])
|
33
|
+
validate_event_name!(name)
|
34
|
+
|
35
|
+
@custom_events[name] = {
|
36
|
+
name: name,
|
37
|
+
category: 'custom',
|
38
|
+
description: description,
|
39
|
+
fired_by: Array(fired_by),
|
40
|
+
registered_at: Time.current
|
41
|
+
}
|
42
|
+
|
43
|
+
# Register with dry-events publisher so subscribers can listen
|
44
|
+
Tasker::Events::Publisher.instance.register_event(name)
|
45
|
+
|
46
|
+
Rails.logger.debug { "Registered custom event: #{name}" }
|
47
|
+
end
|
48
|
+
|
49
|
+
# Get all registered custom events
|
50
|
+
#
|
51
|
+
# @return [Hash] Custom events with metadata
|
52
|
+
def custom_events
|
53
|
+
@custom_events.dup
|
54
|
+
end
|
55
|
+
|
56
|
+
# Check if an event is registered as a custom event
|
57
|
+
#
|
58
|
+
# @param name [String] Event name
|
59
|
+
# @return [Boolean] Whether the event is registered
|
60
|
+
def registered?(name)
|
61
|
+
@custom_events.key?(name)
|
62
|
+
end
|
63
|
+
|
64
|
+
# Get metadata for a specific custom event
|
65
|
+
#
|
66
|
+
# @param name [String] Event name
|
67
|
+
# @return [Hash, nil] Event metadata or nil if not found
|
68
|
+
def event_metadata(name)
|
69
|
+
@custom_events[name]
|
70
|
+
end
|
71
|
+
|
72
|
+
# Clear all registered custom events (useful for testing)
|
73
|
+
#
|
74
|
+
# @return [void]
|
75
|
+
def clear!
|
76
|
+
@custom_events.clear
|
77
|
+
end
|
78
|
+
|
79
|
+
# Alias for clear! to match test expectations
|
80
|
+
alias clear_all_events clear!
|
81
|
+
|
82
|
+
# Get all registered custom event names
|
83
|
+
#
|
84
|
+
# @return [Array<String>] Array of registered event names
|
85
|
+
def registered_events
|
86
|
+
@custom_events.keys
|
87
|
+
end
|
88
|
+
|
89
|
+
# Get event information by name
|
90
|
+
#
|
91
|
+
# @param name [String] Event name
|
92
|
+
# @return [Hash, nil] Event information or nil if not found
|
93
|
+
def event_info(name)
|
94
|
+
@custom_events[name]
|
95
|
+
end
|
96
|
+
|
97
|
+
private
|
98
|
+
|
99
|
+
# Validate event name to prevent conflicts and ensure proper namespacing
|
100
|
+
#
|
101
|
+
# @param name [String] Event name to validate
|
102
|
+
# @raise [ArgumentError] If name is invalid
|
103
|
+
def validate_event_name!(name)
|
104
|
+
# Ensure the name is a string
|
105
|
+
raise ArgumentError, "Event name must be a string, got #{name.class}" unless name.is_a?(String)
|
106
|
+
|
107
|
+
# Ensure namespacing (must contain a dot)
|
108
|
+
unless name.include?('.')
|
109
|
+
raise ArgumentError, "Custom event name must contain a namespace (e.g., 'order.fulfilled')"
|
110
|
+
end
|
111
|
+
|
112
|
+
# Prevent conflicts with system events
|
113
|
+
system_events = all_system_event_constants
|
114
|
+
raise ArgumentError, "Event name '#{name}' conflicts with system event" if system_events.include?(name)
|
115
|
+
|
116
|
+
# Prevent reserved namespaces
|
117
|
+
reserved_namespaces = %w[task step workflow observability test]
|
118
|
+
namespace = name.split('.').first.downcase
|
119
|
+
if reserved_namespaces.include?(namespace)
|
120
|
+
raise ArgumentError, "Namespace '#{namespace}' is reserved for system events"
|
121
|
+
end
|
122
|
+
|
123
|
+
# Prevent duplicate registration
|
124
|
+
return unless @custom_events.key?(name)
|
125
|
+
|
126
|
+
Rails.logger.warn "Custom event '#{name}' is already registered, skipping"
|
127
|
+
nil
|
128
|
+
end
|
129
|
+
|
130
|
+
# Get all system event constants to check for conflicts
|
131
|
+
#
|
132
|
+
# @return [Array<String>] All system event constant values
|
133
|
+
def all_system_event_constants
|
134
|
+
constants = []
|
135
|
+
|
136
|
+
# Task events
|
137
|
+
constants.concat(
|
138
|
+
Tasker::Constants::TaskEvents.constants.map do |c|
|
139
|
+
Tasker::Constants::TaskEvents.const_get(c)
|
140
|
+
end
|
141
|
+
)
|
142
|
+
|
143
|
+
# Step events
|
144
|
+
constants.concat(
|
145
|
+
Tasker::Constants::StepEvents.constants.map do |c|
|
146
|
+
Tasker::Constants::StepEvents.const_get(c)
|
147
|
+
end
|
148
|
+
)
|
149
|
+
|
150
|
+
# Workflow events
|
151
|
+
constants.concat(
|
152
|
+
Tasker::Constants::WorkflowEvents.constants.map do |c|
|
153
|
+
Tasker::Constants::WorkflowEvents.const_get(c)
|
154
|
+
end
|
155
|
+
)
|
156
|
+
|
157
|
+
# Observability events - Task
|
158
|
+
constants.concat(
|
159
|
+
Tasker::Constants::ObservabilityEvents::Task.constants.map do |c|
|
160
|
+
Tasker::Constants::ObservabilityEvents::Task.const_get(c)
|
161
|
+
end
|
162
|
+
)
|
163
|
+
|
164
|
+
# Observability events - Step
|
165
|
+
constants.concat(
|
166
|
+
Tasker::Constants::ObservabilityEvents::Step.constants.map do |c|
|
167
|
+
Tasker::Constants::ObservabilityEvents::Step.const_get(c)
|
168
|
+
end
|
169
|
+
)
|
170
|
+
|
171
|
+
constants
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|