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,110 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8">
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
6
|
+
<title>
|
7
|
+
Top Level Namespace
|
8
|
+
|
9
|
+
— Documentation by YARD 0.9.37
|
10
|
+
|
11
|
+
</title>
|
12
|
+
|
13
|
+
<link rel="stylesheet" href="css/style.css" type="text/css" />
|
14
|
+
|
15
|
+
<link rel="stylesheet" href="css/common.css" type="text/css" />
|
16
|
+
|
17
|
+
<script type="text/javascript">
|
18
|
+
pathId = "";
|
19
|
+
relpath = '';
|
20
|
+
</script>
|
21
|
+
|
22
|
+
|
23
|
+
<script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
|
24
|
+
|
25
|
+
<script type="text/javascript" charset="utf-8" src="js/app.js"></script>
|
26
|
+
|
27
|
+
|
28
|
+
</head>
|
29
|
+
<body>
|
30
|
+
<div class="nav_wrap">
|
31
|
+
<iframe id="nav" src="class_list.html?1"></iframe>
|
32
|
+
<div id="resizer"></div>
|
33
|
+
</div>
|
34
|
+
|
35
|
+
<div id="main" tabindex="-1">
|
36
|
+
<div id="header">
|
37
|
+
<div id="menu">
|
38
|
+
|
39
|
+
<a href="_index.html">Index</a> »
|
40
|
+
|
41
|
+
|
42
|
+
<span class="title">Top Level Namespace</span>
|
43
|
+
|
44
|
+
</div>
|
45
|
+
|
46
|
+
<div id="search">
|
47
|
+
|
48
|
+
<a class="full_list_link" id="class_list_link"
|
49
|
+
href="class_list.html">
|
50
|
+
|
51
|
+
<svg width="24" height="24">
|
52
|
+
<rect x="0" y="4" width="24" height="4" rx="1" ry="1"></rect>
|
53
|
+
<rect x="0" y="12" width="24" height="4" rx="1" ry="1"></rect>
|
54
|
+
<rect x="0" y="20" width="24" height="4" rx="1" ry="1"></rect>
|
55
|
+
</svg>
|
56
|
+
</a>
|
57
|
+
|
58
|
+
</div>
|
59
|
+
<div class="clear"></div>
|
60
|
+
</div>
|
61
|
+
|
62
|
+
<div id="content"><h1>Top Level Namespace
|
63
|
+
|
64
|
+
|
65
|
+
|
66
|
+
</h1>
|
67
|
+
<div class="box_info">
|
68
|
+
|
69
|
+
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
|
74
|
+
|
75
|
+
|
76
|
+
|
77
|
+
|
78
|
+
|
79
|
+
</div>
|
80
|
+
|
81
|
+
<h2>Defined Under Namespace</h2>
|
82
|
+
<p class="children">
|
83
|
+
|
84
|
+
|
85
|
+
<strong class="modules">Modules:</strong> <span class='object_link'><a href="Tasker.html" title="Tasker (module)">Tasker</a></span>
|
86
|
+
|
87
|
+
|
88
|
+
|
89
|
+
|
90
|
+
</p>
|
91
|
+
|
92
|
+
|
93
|
+
|
94
|
+
|
95
|
+
|
96
|
+
|
97
|
+
|
98
|
+
|
99
|
+
|
100
|
+
</div>
|
101
|
+
|
102
|
+
<div id="footer">
|
103
|
+
Generated on Tue Jul 1 16:47:34 2025 by
|
104
|
+
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
105
|
+
0.9.37 (ruby-3.2.4).
|
106
|
+
</div>
|
107
|
+
|
108
|
+
</div>
|
109
|
+
</body>
|
110
|
+
</html>
|
@@ -0,0 +1,301 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rails/generators'
|
4
|
+
|
5
|
+
module Tasker
|
6
|
+
module Generators
|
7
|
+
class AuthenticatorGenerator < Rails::Generators::NamedBase
|
8
|
+
source_root File.expand_path('templates', __dir__)
|
9
|
+
|
10
|
+
desc 'Generate a new Tasker authenticator class with configuration validation and tests'
|
11
|
+
|
12
|
+
class_option :type, type: :string, default: 'custom',
|
13
|
+
desc: 'Type of authenticator (custom, devise, jwt, api_token, omniauth)'
|
14
|
+
|
15
|
+
class_option :directory, type: :string, default: 'app/tasker/authenticators',
|
16
|
+
desc: 'Directory to place the authenticator'
|
17
|
+
|
18
|
+
class_option :user_class, type: :string, default: 'User',
|
19
|
+
desc: 'User model class name'
|
20
|
+
|
21
|
+
class_option :with_spec, type: :boolean, default: true,
|
22
|
+
desc: 'Generate spec file'
|
23
|
+
|
24
|
+
def create_authenticator_file
|
25
|
+
ensure_directory_exists(options[:directory])
|
26
|
+
|
27
|
+
case options[:type].downcase
|
28
|
+
when 'jwt'
|
29
|
+
template 'jwt_authenticator.rb.erb', File.join(options[:directory], "#{file_name}_authenticator.rb")
|
30
|
+
when 'devise'
|
31
|
+
template 'devise_authenticator.rb.erb', File.join(options[:directory], "#{file_name}_authenticator.rb")
|
32
|
+
when 'api_token'
|
33
|
+
template 'api_token_authenticator.rb.erb', File.join(options[:directory], "#{file_name}_authenticator.rb")
|
34
|
+
when 'omniauth'
|
35
|
+
template 'omniauth_authenticator.rb.erb', File.join(options[:directory], "#{file_name}_authenticator.rb")
|
36
|
+
else
|
37
|
+
template 'custom_authenticator.rb.erb', File.join(options[:directory], "#{file_name}_authenticator.rb")
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def create_spec_file
|
42
|
+
return unless options[:with_spec] && defined?(RSpec)
|
43
|
+
|
44
|
+
ensure_directory_exists('spec/tasker/authenticators')
|
45
|
+
|
46
|
+
case options[:type].downcase
|
47
|
+
when 'jwt'
|
48
|
+
template 'jwt_authenticator_spec.rb.erb',
|
49
|
+
File.join('spec/tasker/authenticators', "#{file_name}_authenticator_spec.rb")
|
50
|
+
when 'devise'
|
51
|
+
template 'devise_authenticator_spec.rb.erb',
|
52
|
+
File.join('spec/tasker/authenticators', "#{file_name}_authenticator_spec.rb")
|
53
|
+
when 'api_token'
|
54
|
+
template 'api_token_authenticator_spec.rb.erb',
|
55
|
+
File.join('spec/tasker/authenticators', "#{file_name}_authenticator_spec.rb")
|
56
|
+
when 'omniauth'
|
57
|
+
template 'omniauth_authenticator_spec.rb.erb',
|
58
|
+
File.join('spec/tasker/authenticators', "#{file_name}_authenticator_spec.rb")
|
59
|
+
else
|
60
|
+
template 'custom_authenticator_spec.rb.erb',
|
61
|
+
File.join('spec/tasker/authenticators', "#{file_name}_authenticator_spec.rb")
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def show_usage_instructions
|
66
|
+
UsageInstructionsFormatter.display(self)
|
67
|
+
end
|
68
|
+
|
69
|
+
# Service class to format and display usage instructions
|
70
|
+
# Reduces complexity by organizing instruction display logic
|
71
|
+
class UsageInstructionsFormatter
|
72
|
+
class << self
|
73
|
+
# Display complete usage instructions for the generator
|
74
|
+
#
|
75
|
+
# @param generator [AuthenticatorGenerator] The generator instance
|
76
|
+
# @return [void]
|
77
|
+
def display(generator)
|
78
|
+
display_success_header(generator)
|
79
|
+
display_created_files(generator)
|
80
|
+
display_configuration_example(generator)
|
81
|
+
display_type_specific_instructions(generator)
|
82
|
+
display_test_instructions(generator)
|
83
|
+
display_documentation_links(generator)
|
84
|
+
end
|
85
|
+
|
86
|
+
private
|
87
|
+
|
88
|
+
# Display success header
|
89
|
+
#
|
90
|
+
# @param generator [AuthenticatorGenerator] The generator instance
|
91
|
+
# @return [void]
|
92
|
+
def display_success_header(generator)
|
93
|
+
generator.say "\n#{generator.set_color('Authenticator created successfully!', :green)}"
|
94
|
+
end
|
95
|
+
|
96
|
+
# Display list of created files
|
97
|
+
#
|
98
|
+
# @param generator [AuthenticatorGenerator] The generator instance
|
99
|
+
# @return [void]
|
100
|
+
def display_created_files(generator)
|
101
|
+
generator.say "\n#{generator.set_color('Files created:', :cyan)}"
|
102
|
+
generator.say " - #{File.join(generator.options[:directory],
|
103
|
+
"#{generator.send(:file_name)}_authenticator.rb")}"
|
104
|
+
|
105
|
+
return unless generator.options[:with_spec] && defined?(RSpec)
|
106
|
+
|
107
|
+
generator.say " - #{File.join('spec/tasker/authenticators',
|
108
|
+
"#{generator.send(:file_name)}_authenticator_spec.rb")}"
|
109
|
+
end
|
110
|
+
|
111
|
+
# Display configuration example
|
112
|
+
#
|
113
|
+
# @param generator [AuthenticatorGenerator] The generator instance
|
114
|
+
# @return [void]
|
115
|
+
def display_configuration_example(generator)
|
116
|
+
generator.say "\n#{generator.set_color('Configuration example:', :yellow)}"
|
117
|
+
generator.say generator.send(:configuration_example)
|
118
|
+
end
|
119
|
+
|
120
|
+
# Display type-specific next steps
|
121
|
+
#
|
122
|
+
# @param generator [AuthenticatorGenerator] The generator instance
|
123
|
+
# @return [void]
|
124
|
+
def display_type_specific_instructions(generator)
|
125
|
+
generator.say "\n#{generator.set_color('Next steps:', :cyan)}"
|
126
|
+
|
127
|
+
case generator.options[:type].downcase
|
128
|
+
when 'jwt'
|
129
|
+
generator.send(:show_jwt_instructions)
|
130
|
+
when 'devise'
|
131
|
+
generator.send(:show_devise_instructions)
|
132
|
+
when 'api_token'
|
133
|
+
generator.send(:show_api_token_instructions)
|
134
|
+
when 'omniauth'
|
135
|
+
generator.send(:show_omniauth_instructions)
|
136
|
+
else
|
137
|
+
generator.send(:show_custom_instructions)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
# Display test running instructions
|
142
|
+
#
|
143
|
+
# @param generator [AuthenticatorGenerator] The generator instance
|
144
|
+
# @return [void]
|
145
|
+
def display_test_instructions(generator)
|
146
|
+
return unless generator.options[:with_spec] && defined?(RSpec)
|
147
|
+
|
148
|
+
generator.say "\n 4. Run your tests:"
|
149
|
+
generator.say " bundle exec rspec spec/tasker/authenticators/#{generator.send(:file_name)}_authenticator_spec.rb"
|
150
|
+
end
|
151
|
+
|
152
|
+
# Display documentation links
|
153
|
+
#
|
154
|
+
# @param generator [AuthenticatorGenerator] The generator instance
|
155
|
+
# @return [void]
|
156
|
+
def display_documentation_links(generator)
|
157
|
+
generator.say "\n#{generator.set_color('Documentation:', :magenta)}"
|
158
|
+
generator.say ' See docs/AUTH.md for complete authentication guide'
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
private
|
164
|
+
|
165
|
+
def file_name
|
166
|
+
@file_name ||= name.underscore
|
167
|
+
end
|
168
|
+
|
169
|
+
def class_name
|
170
|
+
@class_name ||= name.camelize
|
171
|
+
end
|
172
|
+
|
173
|
+
def user_model_class
|
174
|
+
options[:user_class]
|
175
|
+
end
|
176
|
+
|
177
|
+
def authenticator_type
|
178
|
+
options[:type].downcase
|
179
|
+
end
|
180
|
+
|
181
|
+
def ensure_directory_exists(directory)
|
182
|
+
directory_path = Rails.root.join(directory)
|
183
|
+
return if File.directory?(directory_path)
|
184
|
+
|
185
|
+
FileUtils.mkdir_p(directory_path)
|
186
|
+
say "Created directory: #{directory_path}"
|
187
|
+
end
|
188
|
+
|
189
|
+
def configuration_example
|
190
|
+
case authenticator_type
|
191
|
+
when 'jwt'
|
192
|
+
jwt_config_example
|
193
|
+
when 'devise'
|
194
|
+
devise_config_example
|
195
|
+
when 'api_token'
|
196
|
+
api_token_config_example
|
197
|
+
when 'omniauth'
|
198
|
+
omniauth_config_example
|
199
|
+
else
|
200
|
+
custom_config_example
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
def jwt_config_example
|
205
|
+
<<~CONFIG
|
206
|
+
# config/initializers/tasker.rb
|
207
|
+
Tasker.configuration do |config|
|
208
|
+
config.auth do |auth|
|
209
|
+
auth.authentication_enabled = true
|
210
|
+
auth.authenticator_class = '#{class_name}Authenticator'
|
211
|
+
auth.user_class = '#{user_model_class}'
|
212
|
+
end
|
213
|
+
end
|
214
|
+
CONFIG
|
215
|
+
end
|
216
|
+
|
217
|
+
def devise_config_example
|
218
|
+
<<~CONFIG
|
219
|
+
# config/initializers/tasker.rb
|
220
|
+
Tasker.configuration do |config|
|
221
|
+
config.auth do |auth|
|
222
|
+
auth.authentication_enabled = true
|
223
|
+
auth.authenticator_class = '#{class_name}Authenticator'
|
224
|
+
auth.user_class = '#{user_model_class}'
|
225
|
+
end
|
226
|
+
end
|
227
|
+
CONFIG
|
228
|
+
end
|
229
|
+
|
230
|
+
def api_token_config_example
|
231
|
+
<<~CONFIG
|
232
|
+
# config/initializers/tasker.rb
|
233
|
+
Tasker.configuration do |config|
|
234
|
+
config.auth do |auth|
|
235
|
+
auth.authentication_enabled = true
|
236
|
+
auth.authenticator_class = '#{class_name}Authenticator'
|
237
|
+
auth.user_class = '#{user_model_class}'
|
238
|
+
end
|
239
|
+
end
|
240
|
+
CONFIG
|
241
|
+
end
|
242
|
+
|
243
|
+
def omniauth_config_example
|
244
|
+
<<~CONFIG
|
245
|
+
# config/initializers/tasker.rb
|
246
|
+
Tasker.configuration do |config|
|
247
|
+
config.auth do |auth|
|
248
|
+
auth.authentication_enabled = true
|
249
|
+
auth.authenticator_class = '#{class_name}Authenticator'
|
250
|
+
auth.user_class = '#{user_model_class}'
|
251
|
+
end
|
252
|
+
end
|
253
|
+
CONFIG
|
254
|
+
end
|
255
|
+
|
256
|
+
def custom_config_example
|
257
|
+
<<~CONFIG
|
258
|
+
# config/initializers/tasker.rb
|
259
|
+
Tasker.configuration do |config|
|
260
|
+
config.auth do |auth|
|
261
|
+
auth.authentication_enabled = true
|
262
|
+
auth.authenticator_class = '#{class_name}Authenticator'
|
263
|
+
auth.user_class = '#{user_model_class}'
|
264
|
+
# Add your custom configuration here
|
265
|
+
end
|
266
|
+
end
|
267
|
+
CONFIG
|
268
|
+
end
|
269
|
+
|
270
|
+
def show_jwt_instructions
|
271
|
+
say ' 1. Add jwt gem to your Gemfile: gem "jwt"'
|
272
|
+
say ' 2. Set JWT secret in Rails credentials or environment variables'
|
273
|
+
say " 3. Customize token extraction and user lookup logic in #{class_name}Authenticator"
|
274
|
+
end
|
275
|
+
|
276
|
+
def show_devise_instructions
|
277
|
+
say ' 1. Ensure Devise is properly configured in your application'
|
278
|
+
say ' 2. Verify the authentication scope matches your Devise configuration'
|
279
|
+
say " 3. Customize authentication logic in #{class_name}Authenticator if needed"
|
280
|
+
end
|
281
|
+
|
282
|
+
def show_api_token_instructions
|
283
|
+
say " 1. Add api_token column to your #{user_model_class} model"
|
284
|
+
say ' 2. Implement token generation and validation in your user model'
|
285
|
+
say " 3. Customize token extraction logic in #{class_name}Authenticator"
|
286
|
+
end
|
287
|
+
|
288
|
+
def show_omniauth_instructions
|
289
|
+
say ' 1. Ensure OmniAuth is properly configured'
|
290
|
+
say " 2. Implement provider-based user lookup in your #{user_model_class} model"
|
291
|
+
say " 3. Customize authentication flow in #{class_name}Authenticator"
|
292
|
+
end
|
293
|
+
|
294
|
+
def show_custom_instructions
|
295
|
+
say " 1. Implement your authentication logic in #{class_name}Authenticator"
|
296
|
+
say ' 2. Add any required gems or dependencies'
|
297
|
+
say ' 3. Update configuration options as needed'
|
298
|
+
end
|
299
|
+
end
|
300
|
+
end
|
301
|
+
end
|
@@ -0,0 +1,139 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rails/generators'
|
4
|
+
|
5
|
+
module Tasker
|
6
|
+
module Generators
|
7
|
+
# Rails generator for creating authorization coordinators
|
8
|
+
#
|
9
|
+
# This generator creates authorization coordinator classes that inherit from
|
10
|
+
# Tasker::Authorization::BaseCoordinator and implement the authorization
|
11
|
+
# interface for different scenarios.
|
12
|
+
#
|
13
|
+
# @example Basic usage
|
14
|
+
# rails generate tasker:authorization_coordinator CompanyAuth
|
15
|
+
# rails generate tasker:authorization_coordinator TeamAuth --user-class=Team
|
16
|
+
#
|
17
|
+
class AuthorizationCoordinatorGenerator < Rails::Generators::NamedBase
|
18
|
+
source_root File.expand_path('templates', __dir__)
|
19
|
+
|
20
|
+
desc 'Generate a Tasker authorization coordinator class'
|
21
|
+
|
22
|
+
class_option :user_class,
|
23
|
+
type: :string,
|
24
|
+
default: 'User',
|
25
|
+
desc: 'User model class name'
|
26
|
+
|
27
|
+
class_option :directory,
|
28
|
+
type: :string,
|
29
|
+
default: 'app/tasker/authorization',
|
30
|
+
desc: 'Directory to create the coordinator in'
|
31
|
+
|
32
|
+
class_option :with_spec,
|
33
|
+
type: :boolean,
|
34
|
+
default: true,
|
35
|
+
desc: 'Generate spec file'
|
36
|
+
|
37
|
+
# Generate the authorization coordinator class
|
38
|
+
def create_coordinator_class
|
39
|
+
@coordinator_class_name = coordinator_class_name
|
40
|
+
@user_class_name = user_class_name
|
41
|
+
|
42
|
+
template 'authorization_coordinator.rb.erb',
|
43
|
+
File.join(options[:directory], "#{file_name}_coordinator.rb")
|
44
|
+
end
|
45
|
+
|
46
|
+
# Generate the spec file if requested
|
47
|
+
def create_spec_file
|
48
|
+
return unless options[:with_spec]
|
49
|
+
|
50
|
+
@coordinator_class_name = coordinator_class_name
|
51
|
+
@user_class_name = user_class_name
|
52
|
+
|
53
|
+
template 'authorization_coordinator_spec.rb.erb',
|
54
|
+
File.join('spec', options[:directory].sub('app/', ''), "#{file_name}_coordinator_spec.rb")
|
55
|
+
end
|
56
|
+
|
57
|
+
# Print usage instructions
|
58
|
+
def print_instructions
|
59
|
+
say "\n#{set_color('Authorization Coordinator Generated!', :green)}"
|
60
|
+
say set_color('=' * 50, :green)
|
61
|
+
|
62
|
+
say "\nGenerated files:"
|
63
|
+
say " #{set_color("#{options[:directory]}/#{file_name}_coordinator.rb", :cyan)} - Coordinator class"
|
64
|
+
if options[:with_spec]
|
65
|
+
say " #{set_color("spec/#{options[:directory].sub('app/', '')}/#{file_name}_coordinator_spec.rb",
|
66
|
+
:cyan)} - Test file"
|
67
|
+
end
|
68
|
+
|
69
|
+
say "\nNext steps:"
|
70
|
+
say '1. Configure Tasker to use your coordinator:'
|
71
|
+
say coordinator_configuration_example
|
72
|
+
|
73
|
+
say "\n2. Ensure your User model includes the Authorizable concern:"
|
74
|
+
say user_model_example
|
75
|
+
|
76
|
+
say "\n3. Customize the authorization logic in your coordinator"
|
77
|
+
say "\n4. Run the tests to verify everything works:"
|
78
|
+
say " #{set_color(
|
79
|
+
"bundle exec rspec spec/#{options[:directory].sub('app/', '')}/#{file_name}_coordinator_spec.rb", :yellow
|
80
|
+
)}"
|
81
|
+
|
82
|
+
say "\nFor more information, see the Tasker authentication guide:"
|
83
|
+
say " #{set_color('docs/AUTH.md', :cyan)}"
|
84
|
+
end
|
85
|
+
|
86
|
+
private
|
87
|
+
|
88
|
+
# Get the coordinator class name
|
89
|
+
def coordinator_class_name
|
90
|
+
"#{class_name}Coordinator"
|
91
|
+
end
|
92
|
+
|
93
|
+
# Get the user class name
|
94
|
+
def user_class_name
|
95
|
+
options[:user_class]
|
96
|
+
end
|
97
|
+
|
98
|
+
# Generate configuration example
|
99
|
+
def coordinator_configuration_example
|
100
|
+
<<~CONFIG
|
101
|
+
|
102
|
+
```ruby
|
103
|
+
# config/initializers/tasker.rb
|
104
|
+
Tasker.configuration do |config|
|
105
|
+
config.auth do |auth|
|
106
|
+
auth.authorization_enabled = true
|
107
|
+
auth.authorization_coordinator_class = '#{coordinator_class_name}'
|
108
|
+
auth.user_class = '#{user_class_name}'
|
109
|
+
end
|
110
|
+
end
|
111
|
+
```
|
112
|
+
CONFIG
|
113
|
+
end
|
114
|
+
|
115
|
+
# Generate user model example
|
116
|
+
def user_model_example
|
117
|
+
<<~USER_MODEL
|
118
|
+
|
119
|
+
```ruby
|
120
|
+
# app/models/#{user_class_name.underscore}.rb
|
121
|
+
class #{user_class_name} < ApplicationRecord
|
122
|
+
include Tasker::Concerns::Authorizable
|
123
|
+
|
124
|
+
def has_tasker_permission?(permission)
|
125
|
+
# Your permission checking logic
|
126
|
+
permissions.include?(permission)
|
127
|
+
end
|
128
|
+
|
129
|
+
def tasker_admin?
|
130
|
+
# Your admin checking logic
|
131
|
+
role == 'admin' || roles.include?('admin')
|
132
|
+
end
|
133
|
+
end
|
134
|
+
```
|
135
|
+
USER_MODEL
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rails/generators'
|
4
|
+
|
5
|
+
module Tasker
|
6
|
+
class EventsGenerator < Rails::Generators::Base
|
7
|
+
source_root File.expand_path('templates', __dir__)
|
8
|
+
|
9
|
+
desc 'Set up Tasker custom events configuration'
|
10
|
+
|
11
|
+
class_option :create_example, type: :boolean, default: true,
|
12
|
+
desc: 'Create example custom events file'
|
13
|
+
|
14
|
+
def create_config_directory
|
15
|
+
empty_directory 'config/tasker'
|
16
|
+
empty_directory 'config/tasker/events'
|
17
|
+
end
|
18
|
+
|
19
|
+
def create_events_config
|
20
|
+
if options[:create_example]
|
21
|
+
template 'custom_events.yml.erb', 'config/tasker/events/examples.yml'
|
22
|
+
say 'Created config/tasker/events/examples.yml with example custom events', :green
|
23
|
+
else
|
24
|
+
create_file 'config/tasker/events/.keep', ''
|
25
|
+
say 'Created config/tasker/events/ directory (add your event YAML files here)', :green
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def create_example_subscriber
|
30
|
+
return unless options[:create_example]
|
31
|
+
|
32
|
+
template 'custom_subscriber.rb.erb', 'app/subscribers/custom_events_subscriber.rb'
|
33
|
+
say 'Created app/subscribers/custom_events_subscriber.rb', :green
|
34
|
+
end
|
35
|
+
|
36
|
+
def display_setup_instructions
|
37
|
+
say <<~INSTRUCTIONS, :blue
|
38
|
+
|
39
|
+
🎉 Tasker Events Setup Complete!
|
40
|
+
|
41
|
+
📂 Default Event Location:
|
42
|
+
Your custom events are loaded from: config/tasker/events/*.yml
|
43
|
+
|
44
|
+
Next steps:
|
45
|
+
1. Add more event files to config/tasker/events/ as needed
|
46
|
+
2. Create subscribers in app/subscribers/ to handle events
|
47
|
+
3. Use EventPublisher concern to publish custom events
|
48
|
+
|
49
|
+
💡 Simple Organization:
|
50
|
+
config/
|
51
|
+
tasker/
|
52
|
+
events/
|
53
|
+
orders.yml # order.created, order.cancelled
|
54
|
+
payments.yml # payment.attempted, payment.completed
|
55
|
+
notifications.yml # notification.sent, notification.failed
|
56
|
+
|
57
|
+
🔧 Advanced Configuration (if needed):
|
58
|
+
For complex organizational needs, configure additional directories:
|
59
|
+
|
60
|
+
Tasker.configuration do |config|
|
61
|
+
config.add_custom_events_directories(
|
62
|
+
'vendor/gems/my_gem/events',
|
63
|
+
'app/modules/billing/events'
|
64
|
+
)
|
65
|
+
end
|
66
|
+
|
67
|
+
Example subscriber:
|
68
|
+
class OrderEventsSubscriber < Tasker::Events::Subscribers::BaseSubscriber
|
69
|
+
subscribe_to 'order.processed'
|
70
|
+
|
71
|
+
def handle_order_processed(event)
|
72
|
+
# Handle the event
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
Example publishing:
|
77
|
+
include Tasker::Concerns::EventPublisher
|
78
|
+
publish_event('order.processed', { order_id: '123' })
|
79
|
+
|
80
|
+
For more information, see the Tasker documentation.
|
81
|
+
|
82
|
+
INSTRUCTIONS
|
83
|
+
end
|
84
|
+
|
85
|
+
private
|
86
|
+
|
87
|
+
def application_name
|
88
|
+
Rails.application.class.module_parent_name.underscore
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|