tasker-engine 0.1.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 +440 -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/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/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 +414 -0
- data/app/models/tasker/task_annotation.rb +36 -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 +95 -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/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_single_and_batch_v02.sql +223 -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 +2254 -0
- data/db/migrate/20250701165431_initial_tasker_schema.rb +116 -0
- data/db/migrate/20250710110830_step_readiness_sql_functions_v02.rb +39 -0
- data/db/views/tasker_step_dag_relationships_v01.sql +69 -0
- data/docs/APPLICATION_GENERATOR.md +384 -0
- data/docs/AUTH.md +1741 -0
- data/docs/CIRCUIT_BREAKER.md +224 -0
- data/docs/DEVELOPER_GUIDE.md +2664 -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 +548 -0
- data/docs/QUICK_START.md +270 -0
- data/docs/REGISTRY_SYSTEMS.md +373 -0
- data/docs/REST_API.md +632 -0
- data/docs/REVERSIONING.md +404 -0
- data/docs/ROADMAP.md +221 -0
- data/docs/SQL_FUNCTIONS.md +1408 -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 +360 -0
- data/docs/Tasker/Authorization/ResourceConstants.html +146 -0
- data/docs/Tasker/Authorization/ResourceRegistry.html +875 -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 +1528 -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 +2478 -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 +395 -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 +306 -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 +468 -0
- data/docs/VISION.md +584 -0
- data/docs/WHY.md +21 -0
- data/docs/_index.html +2319 -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 +537 -0
- data/docs/file_list.html +59 -0
- data/docs/frames.html +22 -0
- data/docs/index.html +537 -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 +8854 -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 +82 -0
- data/lib/generators/tasker/templates/authorization_coordinator_spec.rb.erb +136 -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 +60 -0
- data/lib/generators/tasker/templates/task_handler_spec.rb.erb +165 -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 +73 -0
- data/lib/tasker/authorization/resource_registry.rb +136 -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 +327 -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 +327 -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 +416 -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 +8 -0
- data/lib/tasker.rb +82 -0
- data/lib/tasks/tasker_tasks.rake +383 -0
- metadata +954 -0
@@ -0,0 +1,383 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
namespace :tasker do
|
4
|
+
namespace :install do
|
5
|
+
# @!method database_objects
|
6
|
+
# @description Copies required database views, functions, and init schema from Tasker gem to host application
|
7
|
+
# @example Install database objects
|
8
|
+
# rake tasker:install:database_objects
|
9
|
+
desc 'Copy Tasker database views, functions, and init schema to your application'
|
10
|
+
task database_objects: :environment do
|
11
|
+
require 'fileutils'
|
12
|
+
|
13
|
+
puts 'Installing Tasker database objects...'
|
14
|
+
|
15
|
+
# Check and configure SQL schema format
|
16
|
+
check_and_configure_sql_schema_format
|
17
|
+
|
18
|
+
# Find the Tasker gem path using multiple methods for reliability
|
19
|
+
tasker_gem_path = find_tasker_gem_path
|
20
|
+
|
21
|
+
if tasker_gem_path.blank?
|
22
|
+
puts '❌ Could not find Tasker gem path'
|
23
|
+
puts ' Please ensure Tasker gem is properly installed'
|
24
|
+
exit 1
|
25
|
+
end
|
26
|
+
|
27
|
+
puts "📍 Found Tasker gem at: #{tasker_gem_path}"
|
28
|
+
|
29
|
+
# Copy database views
|
30
|
+
copy_database_directory(tasker_gem_path, 'views')
|
31
|
+
|
32
|
+
# Copy database functions
|
33
|
+
copy_database_directory(tasker_gem_path, 'functions')
|
34
|
+
|
35
|
+
# Copy init schema
|
36
|
+
copy_database_directory(tasker_gem_path, 'init')
|
37
|
+
|
38
|
+
puts '✅ Tasker database objects installed successfully!'
|
39
|
+
puts ''
|
40
|
+
puts 'Next steps:'
|
41
|
+
puts ' 1. Run migrations: bundle exec rails db:migrate'
|
42
|
+
puts ' 2. Setup Tasker: bundle exec rails tasker:setup'
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
# Find Tasker gem path using multiple detection methods
|
48
|
+
#
|
49
|
+
# @return [String, nil] Path to Tasker gem or nil if not found
|
50
|
+
def find_tasker_gem_path
|
51
|
+
# Method 1: Use bundle show (most reliable)
|
52
|
+
tasker_gem_path = `bundle show tasker-engine 2>/dev/null`.strip
|
53
|
+
return tasker_gem_path unless tasker_gem_path.empty?
|
54
|
+
|
55
|
+
# Method 2: Use Bundler specs
|
56
|
+
begin
|
57
|
+
require 'bundler'
|
58
|
+
spec = Bundler.load.specs.find { |s| s.name == 'tasker-engine' }
|
59
|
+
return spec.full_gem_path if spec
|
60
|
+
rescue StandardError => e
|
61
|
+
puts " ⚠️ Bundler spec detection failed: #{e.message}"
|
62
|
+
end
|
63
|
+
|
64
|
+
# Method 3: Use Tasker::Engine if available
|
65
|
+
begin
|
66
|
+
require 'tasker'
|
67
|
+
return Tasker::Engine.root.to_s if defined?(Tasker::Engine)
|
68
|
+
rescue StandardError => e
|
69
|
+
puts " ⚠️ Engine detection failed: #{e.message}"
|
70
|
+
end
|
71
|
+
|
72
|
+
# Method 4: Try to find gem in default gem paths
|
73
|
+
begin
|
74
|
+
gem_paths = Gem.path
|
75
|
+
gem_paths.each do |gem_path|
|
76
|
+
potential_path = File.join(gem_path, 'gems')
|
77
|
+
Dir.glob(File.join(potential_path, 'tasker-engine-*')).each do |tasker_dir|
|
78
|
+
return tasker_dir if File.directory?(File.join(tasker_dir, 'db'))
|
79
|
+
end
|
80
|
+
end
|
81
|
+
rescue StandardError => e
|
82
|
+
puts " ⚠️ Gem path detection failed: #{e.message}"
|
83
|
+
end
|
84
|
+
|
85
|
+
nil
|
86
|
+
end
|
87
|
+
|
88
|
+
# Copy a database directory (views or functions) from gem to application
|
89
|
+
#
|
90
|
+
# @param gem_path [String] Path to Tasker gem
|
91
|
+
# @param directory_name [String] Name of directory to copy ('views' or 'functions')
|
92
|
+
def copy_database_directory(gem_path, directory_name)
|
93
|
+
source_path = File.join(gem_path, 'db', directory_name)
|
94
|
+
target_path = Rails.root.join('db', directory_name)
|
95
|
+
|
96
|
+
if Dir.exist?(source_path)
|
97
|
+
# Create target directory if it doesn't exist
|
98
|
+
FileUtils.mkdir_p(File.dirname(target_path))
|
99
|
+
|
100
|
+
# Copy the entire directory
|
101
|
+
begin
|
102
|
+
FileUtils.cp_r(source_path, Rails.root.join('db').to_s)
|
103
|
+
|
104
|
+
# Count files copied
|
105
|
+
file_count = Dir.glob(File.join(target_path, '**', '*')).count { |f| File.file?(f) }
|
106
|
+
|
107
|
+
puts " ✓ Copied #{file_count} #{directory_name} files to db/#{directory_name}/"
|
108
|
+
rescue StandardError => e
|
109
|
+
puts " ❌ Failed to copy #{directory_name} directory: #{e.message}"
|
110
|
+
puts ' Please check file system permissions and available disk space.'
|
111
|
+
exit 1
|
112
|
+
end
|
113
|
+
else
|
114
|
+
puts " ⚠️ #{directory_name.capitalize} directory not found at #{source_path}"
|
115
|
+
puts ' This may indicate an incomplete Tasker installation'
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
# Check if SQL schema format is configured and offer to fix it if needed
|
120
|
+
def check_and_configure_sql_schema_format
|
121
|
+
application_rb_path = Rails.root.join('config/application.rb')
|
122
|
+
|
123
|
+
unless File.exist?(application_rb_path)
|
124
|
+
puts "⚠️ Application file not found: #{application_rb_path}"
|
125
|
+
puts ' This is unexpected for a Rails application.'
|
126
|
+
return
|
127
|
+
end
|
128
|
+
|
129
|
+
application_content = File.read(application_rb_path)
|
130
|
+
|
131
|
+
if application_content.include?('config.active_record.schema_format = :sql')
|
132
|
+
puts '✅ SQL schema format already configured'
|
133
|
+
return
|
134
|
+
end
|
135
|
+
|
136
|
+
puts ''
|
137
|
+
puts '⚠️ IMPORTANT: SQL Schema Format Configuration Required'
|
138
|
+
puts ''
|
139
|
+
puts ' Tasker uses database functions and views that are not preserved'
|
140
|
+
puts " in Rails' default schema.rb file. To ensure these database objects"
|
141
|
+
puts ' are properly recreated during test database drops/recreates, you'
|
142
|
+
puts ' need to configure Rails to use structure.sql instead.'
|
143
|
+
puts ''
|
144
|
+
puts ' This requires adding the following line to config/application.rb:'
|
145
|
+
puts ' config.active_record.schema_format = :sql'
|
146
|
+
puts ''
|
147
|
+
print ' Would you like me to add this configuration automatically? (y/n): '
|
148
|
+
|
149
|
+
response = $stdin.gets.chomp.downcase
|
150
|
+
|
151
|
+
if %w[y yes].include?(response)
|
152
|
+
if update_application_rb_schema_format(application_rb_path, application_content)
|
153
|
+
puts '✅ SQL schema format configured successfully!'
|
154
|
+
puts ' Your application will now use db/structure.sql instead of db/schema.rb'
|
155
|
+
else
|
156
|
+
puts '❌ Failed to update application.rb automatically'
|
157
|
+
puts ' Please manually add: config.active_record.schema_format = :sql'
|
158
|
+
puts ' to your config/application.rb file inside the Application class'
|
159
|
+
end
|
160
|
+
else
|
161
|
+
puts '⚠️ Skipping automatic configuration.'
|
162
|
+
puts ' WARNING: Database functions and views may not work correctly'
|
163
|
+
puts ' in test environments without this configuration.'
|
164
|
+
puts ''
|
165
|
+
puts ' To configure manually, add this line to config/application.rb:'
|
166
|
+
puts ' config.active_record.schema_format = :sql'
|
167
|
+
end
|
168
|
+
puts ''
|
169
|
+
end
|
170
|
+
|
171
|
+
# Update application.rb to include SQL schema format configuration
|
172
|
+
#
|
173
|
+
# @param application_rb_path [String] Path to application.rb file
|
174
|
+
# @param application_content [String] Current content of application.rb
|
175
|
+
# @return [Boolean] Success status
|
176
|
+
def update_application_rb_schema_format(application_rb_path, application_content)
|
177
|
+
if application_content.include?('class Application < Rails::Application')
|
178
|
+
# Add SQL schema format configuration
|
179
|
+
new_application_content = application_content.gsub(
|
180
|
+
/(class Application < Rails::Application\s*\n)/,
|
181
|
+
"\\1 # Configure SQL schema format to preserve database functions and views\n config.active_record.schema_format = :sql\n\n"
|
182
|
+
)
|
183
|
+
|
184
|
+
begin
|
185
|
+
File.write(application_rb_path, new_application_content)
|
186
|
+
true
|
187
|
+
rescue StandardError => e
|
188
|
+
puts " Error writing to application.rb: #{e.message}"
|
189
|
+
false
|
190
|
+
end
|
191
|
+
else
|
192
|
+
puts ' Could not find Application class in application.rb'
|
193
|
+
false
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
# @!method setup
|
199
|
+
# @description Initializes Tasker by creating the configuration file and necessary directory structure
|
200
|
+
# @example Run setup task
|
201
|
+
# rake tasker:setup
|
202
|
+
desc 'Setup Tasker with configuration and directory structure'
|
203
|
+
task setup: :environment do
|
204
|
+
require 'fileutils'
|
205
|
+
|
206
|
+
# Source template file
|
207
|
+
template_path = File.expand_path('../generators/tasker/templates/initialize.rb.erb', __dir__)
|
208
|
+
# Target path in the Rails app
|
209
|
+
target_path = Rails.root.join('config/initializers/tasker.rb')
|
210
|
+
|
211
|
+
# Create config file if it doesn't exist
|
212
|
+
if File.exist?(target_path)
|
213
|
+
puts "Configuration file already exists at #{target_path}."
|
214
|
+
puts 'To overwrite, use tasker:setup:force'
|
215
|
+
else
|
216
|
+
FileUtils.cp(template_path, target_path)
|
217
|
+
puts "Tasker configuration initialized at #{target_path}"
|
218
|
+
|
219
|
+
# Only load config if we just created it (otherwise could error if invalid)
|
220
|
+
require target_path
|
221
|
+
end
|
222
|
+
|
223
|
+
# Create necessary directories based on configuration
|
224
|
+
task_handler_dir = Rails.root.join('app', Tasker::Configuration.configuration.engine.task_handler_directory)
|
225
|
+
task_config_dir = Rails.root.join('config', Tasker::Configuration.configuration.engine.task_config_directory)
|
226
|
+
task_spec_dir = Rails.root.join('spec', Tasker::Configuration.configuration.engine.task_handler_directory)
|
227
|
+
|
228
|
+
[task_handler_dir, task_config_dir, task_spec_dir].each do |dir|
|
229
|
+
unless File.directory?(dir)
|
230
|
+
FileUtils.mkdir_p(dir)
|
231
|
+
puts "Created directory: #{dir}"
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
puts 'Tasker setup complete!'
|
236
|
+
puts 'You can now generate task handlers with: rails generate task_handler NAME'
|
237
|
+
end
|
238
|
+
|
239
|
+
namespace :setup do
|
240
|
+
# @!method force
|
241
|
+
# @description Forcibly initializes Tasker by overwriting the existing configuration file
|
242
|
+
# @example Run force setup task
|
243
|
+
# rake tasker:setup:force
|
244
|
+
desc 'Force setup Tasker by overwriting existing configuration file'
|
245
|
+
task force: :environment do
|
246
|
+
require 'fileutils'
|
247
|
+
|
248
|
+
# Source template file
|
249
|
+
template_path = File.expand_path('../generators/tasker/templates/initialize.rb.erb', __dir__)
|
250
|
+
# Target path in the Rails app
|
251
|
+
target_path = Rails.root.join('config/initializers/tasker.rb')
|
252
|
+
|
253
|
+
# Always copy the file
|
254
|
+
FileUtils.cp(template_path, target_path)
|
255
|
+
puts "Tasker configuration initialized at #{target_path}"
|
256
|
+
|
257
|
+
# Now run the regular setup task to create directories
|
258
|
+
Rake::Task['tasker:setup'].reenable
|
259
|
+
Rake::Task['tasker:setup'].invoke
|
260
|
+
end
|
261
|
+
end
|
262
|
+
|
263
|
+
desc 'Export metrics to configured storage backends'
|
264
|
+
task :export_metrics, [:format] => :environment do |_task, args|
|
265
|
+
format = (args[:format] || ENV['METRICS_FORMAT'] || 'prometheus').to_sym
|
266
|
+
|
267
|
+
puts "Starting metrics export (format: #{format})"
|
268
|
+
|
269
|
+
begin
|
270
|
+
coordinator = Tasker::Telemetry::ExportCoordinator.new
|
271
|
+
result = coordinator.schedule_export(format: format)
|
272
|
+
|
273
|
+
if result[:success]
|
274
|
+
puts '✅ Metrics export scheduled successfully'
|
275
|
+
puts " Job ID: #{result[:job_id]}"
|
276
|
+
puts " Export time: #{result[:export_time]}"
|
277
|
+
puts " Format: #{result[:format]}"
|
278
|
+
else
|
279
|
+
puts "❌ Metrics export scheduling failed: #{result[:error]}"
|
280
|
+
exit 1
|
281
|
+
end
|
282
|
+
rescue StandardError => e
|
283
|
+
puts "❌ Metrics export error: #{e.message}"
|
284
|
+
puts e.backtrace.first(5).join("\n") if ENV['VERBOSE']
|
285
|
+
exit 1
|
286
|
+
end
|
287
|
+
end
|
288
|
+
|
289
|
+
desc 'Export metrics immediately (synchronous)'
|
290
|
+
task :export_metrics_now, [:format] => :environment do |_task, args|
|
291
|
+
format = (args[:format] || ENV['METRICS_FORMAT'] || 'prometheus').to_sym
|
292
|
+
|
293
|
+
puts "Starting immediate metrics export (format: #{format})"
|
294
|
+
|
295
|
+
begin
|
296
|
+
coordinator = Tasker::Telemetry::ExportCoordinator.new
|
297
|
+
result = coordinator.execute_coordinated_export(format: format)
|
298
|
+
|
299
|
+
if result[:success]
|
300
|
+
puts '✅ Metrics exported successfully'
|
301
|
+
puts " Format: #{result[:format]}"
|
302
|
+
puts " Metrics count: #{result[:metrics_count] || 'unknown'}"
|
303
|
+
puts " Duration: #{result[:duration]&.round(3)}s"
|
304
|
+
else
|
305
|
+
puts "❌ Metrics export failed: #{result[:error]}"
|
306
|
+
exit 1
|
307
|
+
end
|
308
|
+
rescue StandardError => e
|
309
|
+
puts "❌ Metrics export error: #{e.message}"
|
310
|
+
puts e.backtrace.first(5).join("\n") if ENV['VERBOSE']
|
311
|
+
exit 1
|
312
|
+
end
|
313
|
+
end
|
314
|
+
|
315
|
+
desc 'Sync metrics to cache storage'
|
316
|
+
task sync_metrics: :environment do
|
317
|
+
puts 'Starting metrics cache synchronization'
|
318
|
+
|
319
|
+
begin
|
320
|
+
backend = Tasker::Telemetry::MetricsBackend.instance
|
321
|
+
result = backend.sync_to_cache!
|
322
|
+
|
323
|
+
if result[:success]
|
324
|
+
puts '✅ Metrics synchronized successfully'
|
325
|
+
puts " Strategy: #{result[:strategy]}"
|
326
|
+
puts " Synced metrics: #{result[:synced_metrics] || result[:total_synced]}"
|
327
|
+
puts " Duration: #{result[:duration]&.round(3)}s"
|
328
|
+
else
|
329
|
+
puts "❌ Metrics sync failed: #{result[:error]}"
|
330
|
+
exit 1
|
331
|
+
end
|
332
|
+
rescue StandardError => e
|
333
|
+
puts "❌ Metrics sync error: #{e.message}"
|
334
|
+
puts e.backtrace.first(5).join("\n") if ENV['VERBOSE']
|
335
|
+
exit 1
|
336
|
+
end
|
337
|
+
end
|
338
|
+
|
339
|
+
desc 'Show metrics export status and configuration'
|
340
|
+
task metrics_status: :environment do
|
341
|
+
puts 'Tasker Metrics Export Status'
|
342
|
+
puts '=' * 40
|
343
|
+
|
344
|
+
begin
|
345
|
+
backend = Tasker::Telemetry::MetricsBackend.instance
|
346
|
+
Tasker::Telemetry::ExportCoordinator.instance
|
347
|
+
|
348
|
+
# Backend status
|
349
|
+
puts 'Backend Status:'
|
350
|
+
puts " Instance ID: #{backend.instance_id}"
|
351
|
+
puts " Sync Strategy: #{backend.sync_strategy}"
|
352
|
+
puts " Cache Store: #{backend.cache_capabilities[:store_class]}"
|
353
|
+
puts " Metrics Count: #{backend.all_metrics.size}"
|
354
|
+
|
355
|
+
# Cache capabilities
|
356
|
+
puts "\nCache Capabilities:"
|
357
|
+
backend.cache_capabilities.each do |key, value|
|
358
|
+
puts " #{key}: #{value}"
|
359
|
+
end
|
360
|
+
|
361
|
+
# Configuration
|
362
|
+
config = Tasker::Configuration.configuration.telemetry
|
363
|
+
puts "\nTelemetry Configuration:"
|
364
|
+
puts " Enabled: #{config.enabled}"
|
365
|
+
puts " Metrics Enabled: #{config.metrics_enabled}"
|
366
|
+
puts " Metrics Format: #{config.metrics_format}"
|
367
|
+
puts " Metrics Endpoint: #{config.metrics_endpoint}"
|
368
|
+
puts " Auth Required: #{config.metrics_auth_required}"
|
369
|
+
|
370
|
+
# Prometheus config
|
371
|
+
if config.prometheus
|
372
|
+
puts "\nPrometheus Configuration:"
|
373
|
+
puts " Endpoint: #{config.prometheus[:endpoint] || 'not configured'}"
|
374
|
+
puts " Retention Window: #{config.prometheus[:retention_window]}"
|
375
|
+
puts " Safety Margin: #{config.prometheus[:safety_margin]}"
|
376
|
+
puts " Export Timeout: #{config.prometheus[:export_timeout]}"
|
377
|
+
end
|
378
|
+
rescue StandardError => e
|
379
|
+
puts "❌ Status check error: #{e.message}"
|
380
|
+
exit 1
|
381
|
+
end
|
382
|
+
end
|
383
|
+
end
|