tasker-engine 1.0.3 → 1.0.4
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 +4 -4
- data/README.md +1 -1
- data/db/functions/get_step_readiness_status_single_and_batch_v02.sql +223 -0
- data/db/migrate/20250710110830_step_readiness_sql_functions_v02.rb +18 -0
- data/docs/Tasker/Analysis/RuntimeGraphAnalyzer.html +1 -1
- data/docs/Tasker/Analysis/TemplateGraphAnalyzer.html +1 -1
- data/docs/Tasker/Analysis.html +1 -1
- data/docs/Tasker/AnalyticsController.html +1 -1
- data/docs/Tasker/AnalyticsService/BottleneckAnalytics.html +1 -1
- data/docs/Tasker/AnalyticsService/PerformanceAnalytics.html +1 -1
- data/docs/Tasker/AnalyticsService.html +1 -1
- data/docs/Tasker/AnnotationType.html +1 -1
- data/docs/Tasker/AnnotationTypeSerializer.html +1 -1
- data/docs/Tasker/ApplicationController.html +1 -1
- data/docs/Tasker/ApplicationJob.html +1 -1
- data/docs/Tasker/ApplicationRecord.html +1 -1
- data/docs/Tasker/Authentication/AuthenticationError.html +1 -1
- data/docs/Tasker/Authentication/ConfigurationError.html +1 -1
- data/docs/Tasker/Authentication/Coordinator.html +1 -1
- data/docs/Tasker/Authentication/Interface.html +1 -1
- data/docs/Tasker/Authentication/InterfaceError.html +1 -1
- data/docs/Tasker/Authentication/NoneAuthenticator.html +1 -1
- data/docs/Tasker/Authentication.html +1 -1
- data/docs/Tasker/Authorization/AuthorizationError.html +1 -1
- data/docs/Tasker/Authorization/BaseCoordinator.html +1 -1
- data/docs/Tasker/Authorization/ConfigurationError.html +1 -1
- data/docs/Tasker/Authorization/ResourceConstants/ACTIONS.html +1 -1
- data/docs/Tasker/Authorization/ResourceConstants/RESOURCES.html +1 -1
- data/docs/Tasker/Authorization/ResourceConstants.html +1 -1
- data/docs/Tasker/Authorization/ResourceRegistry.html +1 -1
- data/docs/Tasker/Authorization/UnauthorizedError.html +1 -1
- data/docs/Tasker/Authorization.html +1 -1
- data/docs/Tasker/CacheCapabilities.html +1 -1
- data/docs/Tasker/CacheStrategy.html +1 -1
- data/docs/Tasker/Concerns/Authenticatable.html +1 -1
- data/docs/Tasker/Concerns/Authorizable/AdminStatusChecker.html +1 -1
- data/docs/Tasker/Concerns/Authorizable.html +1 -1
- data/docs/Tasker/Concerns/ControllerAuthorizable.html +1 -1
- data/docs/Tasker/Concerns/EventPublisher.html +1 -1
- data/docs/Tasker/Concerns/IdempotentStateTransitions.html +1 -1
- data/docs/Tasker/Concerns/StateMachineBase/ClassMethods.html +1 -1
- data/docs/Tasker/Concerns/StateMachineBase/StateMachineBase/ClassMethods.html +1 -1
- data/docs/Tasker/Concerns/StateMachineBase/StateMachineBase.html +1 -1
- data/docs/Tasker/Concerns/StateMachineBase.html +1 -1
- data/docs/Tasker/Concerns/StructuredLogging.html +1 -1
- data/docs/Tasker/Concerns.html +1 -1
- data/docs/Tasker/Configuration/ConfigurationProxy.html +1 -1
- data/docs/Tasker/Configuration/TelemetryConfigurationProxy.html +1 -1
- data/docs/Tasker/Configuration.html +1 -1
- data/docs/Tasker/ConfigurationError.html +1 -1
- data/docs/Tasker/ConfiguredTask.html +1 -1
- data/docs/Tasker/Constants/EventDefinitions.html +1 -1
- data/docs/Tasker/Constants/ObservabilityEvents/Step.html +1 -1
- data/docs/Tasker/Constants/ObservabilityEvents/Task.html +1 -1
- data/docs/Tasker/Constants/ObservabilityEvents.html +1 -1
- data/docs/Tasker/Constants/RegistryEvents.html +1 -1
- data/docs/Tasker/Constants/StepEvents.html +1 -1
- data/docs/Tasker/Constants/TaskEvents.html +1 -1
- data/docs/Tasker/Constants/TaskExecution/ExecutionStatus.html +1 -1
- data/docs/Tasker/Constants/TaskExecution/HealthStatus.html +1 -1
- data/docs/Tasker/Constants/TaskExecution/RecommendedAction.html +1 -1
- data/docs/Tasker/Constants/TaskExecution.html +1 -1
- data/docs/Tasker/Constants/TaskFinalization/ErrorMessages.html +1 -1
- data/docs/Tasker/Constants/TaskFinalization/PendingReasons.html +1 -1
- data/docs/Tasker/Constants/TaskFinalization/ReenqueueReasons.html +1 -1
- data/docs/Tasker/Constants/TaskFinalization.html +1 -1
- data/docs/Tasker/Constants/TaskStatuses.html +1 -1
- data/docs/Tasker/Constants/TestEvents.html +1 -1
- data/docs/Tasker/Constants/WorkflowEvents.html +1 -1
- data/docs/Tasker/Constants/WorkflowStepStatuses.html +1 -1
- data/docs/Tasker/Constants.html +1 -1
- data/docs/Tasker/DependentSystem.html +1 -1
- data/docs/Tasker/DependentSystemObjectMap.html +1 -1
- data/docs/Tasker/DetectorRegistry.html +1 -1
- data/docs/Tasker/Engine.html +1 -1
- data/docs/Tasker/Error.html +1 -1
- data/docs/Tasker/Events/Catalog/CatalogPrinter.html +1 -1
- data/docs/Tasker/Events/Catalog/CustomEventRegistrar.html +1 -1
- data/docs/Tasker/Events/Catalog/ExamplePayloadGenerator.html +1 -1
- data/docs/Tasker/Events/Catalog.html +1 -1
- data/docs/Tasker/Events/CustomRegistry.html +1 -1
- data/docs/Tasker/Events/DefinitionLoader.html +1 -1
- data/docs/Tasker/Events/EventPayloadBuilder/ErrorInfoExtractor.html +1 -1
- data/docs/Tasker/Events/EventPayloadBuilder/StepPayloadBuilder.html +1 -1
- data/docs/Tasker/Events/EventPayloadBuilder.html +1 -1
- data/docs/Tasker/Events/Publisher.html +1 -1
- data/docs/Tasker/Events/Subscribers/BaseSubscriber/ErrorCategorizer/ErrorTypeClassifier.html +1 -1
- data/docs/Tasker/Events/Subscribers/BaseSubscriber/ErrorCategorizer.html +1 -1
- data/docs/Tasker/Events/Subscribers/BaseSubscriber/MetricTagsExtractor.html +1 -1
- data/docs/Tasker/Events/Subscribers/BaseSubscriber.html +1 -1
- data/docs/Tasker/Events/Subscribers/MetricsSubscriber.html +1 -1
- data/docs/Tasker/Events/Subscribers/TelemetrySubscriber.html +1 -1
- data/docs/Tasker/Events/Subscribers.html +1 -1
- data/docs/Tasker/Events/SubscriptionLoader.html +1 -1
- data/docs/Tasker/Events.html +1 -1
- data/docs/Tasker/EventsGenerator.html +1 -1
- data/docs/Tasker/Functions/FunctionBasedAnalyticsMetrics/AnalyticsMetrics.html +1 -1
- data/docs/Tasker/Functions/FunctionBasedAnalyticsMetrics.html +1 -1
- data/docs/Tasker/Functions/FunctionBasedDependencyLevels.html +1 -1
- data/docs/Tasker/Functions/FunctionBasedSlowestSteps/SlowestStep.html +1 -1
- data/docs/Tasker/Functions/FunctionBasedSlowestSteps.html +1 -1
- data/docs/Tasker/Functions/FunctionBasedSlowestTasks/SlowestTask.html +1 -1
- data/docs/Tasker/Functions/FunctionBasedSlowestTasks.html +1 -1
- data/docs/Tasker/Functions/FunctionBasedStepReadinessStatus.html +1 -1
- data/docs/Tasker/Functions/FunctionBasedSystemHealthCounts/HealthMetrics.html +1 -1
- data/docs/Tasker/Functions/FunctionBasedSystemHealthCounts.html +1 -1
- data/docs/Tasker/Functions/FunctionBasedTaskExecutionContext.html +1 -1
- data/docs/Tasker/Functions/FunctionWrapper.html +1 -1
- data/docs/Tasker/Functions.html +1 -1
- data/docs/Tasker/Generators/AuthenticatorGenerator/UsageInstructionsFormatter.html +1 -1
- data/docs/Tasker/Generators/AuthenticatorGenerator.html +1 -1
- data/docs/Tasker/Generators/AuthorizationCoordinatorGenerator.html +1 -1
- data/docs/Tasker/Generators/SubscriberGenerator.html +1 -1
- data/docs/Tasker/Generators/TaskHandlerGenerator.html +1 -1
- data/docs/Tasker/Generators.html +1 -1
- data/docs/Tasker/GraphQLTypes/AnnotationType.html +1 -1
- data/docs/Tasker/GraphQLTypes/BaseArgument.html +1 -1
- data/docs/Tasker/GraphQLTypes/BaseConnection.html +1 -1
- data/docs/Tasker/GraphQLTypes/BaseEdge.html +1 -1
- data/docs/Tasker/GraphQLTypes/BaseEnum.html +1 -1
- data/docs/Tasker/GraphQLTypes/BaseField.html +1 -1
- data/docs/Tasker/GraphQLTypes/BaseInputObject.html +1 -1
- data/docs/Tasker/GraphQLTypes/BaseInterface.html +1 -1
- data/docs/Tasker/GraphQLTypes/BaseObject.html +1 -1
- data/docs/Tasker/GraphQLTypes/BaseScalar.html +1 -1
- data/docs/Tasker/GraphQLTypes/BaseUnion.html +1 -1
- data/docs/Tasker/GraphQLTypes/DependentSystemObjectMapType.html +1 -1
- data/docs/Tasker/GraphQLTypes/DependentSystemType.html +1 -1
- data/docs/Tasker/GraphQLTypes/MutationType.html +1 -1
- data/docs/Tasker/GraphQLTypes/NamedStepType.html +1 -1
- data/docs/Tasker/GraphQLTypes/NamedTaskType.html +1 -1
- data/docs/Tasker/GraphQLTypes/NamedTasksNamedStepType.html +1 -1
- data/docs/Tasker/GraphQLTypes/NodeType.html +1 -1
- data/docs/Tasker/GraphQLTypes/QueryType.html +1 -1
- data/docs/Tasker/GraphQLTypes/TaskAnnotationType.html +1 -1
- data/docs/Tasker/GraphQLTypes/TaskInterface.html +1 -1
- data/docs/Tasker/GraphQLTypes/TaskType.html +1 -1
- data/docs/Tasker/GraphQLTypes/WorkflowStepType.html +1 -1
- data/docs/Tasker/GraphQLTypes.html +1 -1
- data/docs/Tasker/GraphqlController.html +1 -1
- data/docs/Tasker/HandlerFactory.html +1 -1
- data/docs/Tasker/HandlerSerializer.html +1 -1
- data/docs/Tasker/HandlersController.html +1 -1
- data/docs/Tasker/HashIdentityStrategy.html +1 -1
- data/docs/Tasker/Health/ReadinessChecker.html +1 -1
- data/docs/Tasker/Health/StatusChecker.html +1 -1
- data/docs/Tasker/Health.html +1 -1
- data/docs/Tasker/HealthController.html +1 -1
- data/docs/Tasker/IdentityStrategy.html +1 -1
- data/docs/Tasker/InvalidTaskHandlerConfig.html +1 -1
- data/docs/Tasker/Logging/CorrelationIdGenerator.html +1 -1
- data/docs/Tasker/Logging.html +1 -1
- data/docs/Tasker/MetricsController.html +1 -1
- data/docs/Tasker/MetricsExportJob.html +1 -1
- data/docs/Tasker/Mutations/BaseMutation.html +1 -1
- data/docs/Tasker/Mutations/CancelStep.html +1 -1
- data/docs/Tasker/Mutations/CancelTask.html +1 -1
- data/docs/Tasker/Mutations/CreateTask.html +1 -1
- data/docs/Tasker/Mutations/UpdateStep.html +1 -1
- data/docs/Tasker/Mutations/UpdateTask.html +1 -1
- data/docs/Tasker/Mutations.html +1 -1
- data/docs/Tasker/NamedStep.html +1 -1
- data/docs/Tasker/NamedTask.html +1 -1
- data/docs/Tasker/NamedTasksNamedStep.html +1 -1
- data/docs/Tasker/Orchestration/BackoffCalculator.html +1 -1
- data/docs/Tasker/Orchestration/ConnectionBuilder/ConfigValidator.html +1 -1
- data/docs/Tasker/Orchestration/ConnectionBuilder.html +1 -1
- data/docs/Tasker/Orchestration/ConnectionPoolIntelligence.html +1 -1
- data/docs/Tasker/Orchestration/Coordinator.html +1 -1
- data/docs/Tasker/Orchestration/FutureStateAnalyzer.html +1 -1
- data/docs/Tasker/Orchestration/PluginIntegration.html +1 -1
- data/docs/Tasker/Orchestration/ResponseProcessor.html +1 -1
- data/docs/Tasker/Orchestration/RetryHeaderParser.html +1 -1
- data/docs/Tasker/Orchestration/StepExecutor.html +1 -1
- data/docs/Tasker/Orchestration/StepSequenceFactory.html +1 -1
- data/docs/Tasker/Orchestration/TaskFinalizer/BlockageChecker.html +1 -1
- data/docs/Tasker/Orchestration/TaskFinalizer/ContextManager.html +1 -1
- data/docs/Tasker/Orchestration/TaskFinalizer/DelayCalculator.html +1 -1
- data/docs/Tasker/Orchestration/TaskFinalizer/FinalizationDecisionMaker.html +1 -1
- data/docs/Tasker/Orchestration/TaskFinalizer/FinalizationProcessor.html +1 -1
- data/docs/Tasker/Orchestration/TaskFinalizer/ReasonDeterminer.html +1 -1
- data/docs/Tasker/Orchestration/TaskFinalizer/ReenqueueManager.html +1 -1
- data/docs/Tasker/Orchestration/TaskFinalizer/UnclearStateHandler.html +1 -1
- data/docs/Tasker/Orchestration/TaskFinalizer.html +1 -1
- data/docs/Tasker/Orchestration/TaskInitializer.html +1 -1
- data/docs/Tasker/Orchestration/TaskReenqueuer.html +1 -1
- data/docs/Tasker/Orchestration/ViableStepDiscovery.html +1 -1
- data/docs/Tasker/Orchestration/WorkflowCoordinator.html +1 -1
- data/docs/Tasker/Orchestration.html +1 -1
- data/docs/Tasker/PageSort/PageSortParamsBuilder.html +1 -1
- data/docs/Tasker/PageSort.html +1 -1
- data/docs/Tasker/PermanentError.html +1 -1
- data/docs/Tasker/ProceduralError.html +1 -1
- data/docs/Tasker/Queries/AllAnnotationTypes.html +1 -1
- data/docs/Tasker/Queries/AllTasks.html +1 -1
- data/docs/Tasker/Queries/BaseQuery.html +1 -1
- data/docs/Tasker/Queries/Helpers.html +1 -1
- data/docs/Tasker/Queries/OneStep.html +1 -1
- data/docs/Tasker/Queries/OneTask.html +1 -1
- data/docs/Tasker/Queries/TasksByAnnotation.html +1 -1
- data/docs/Tasker/Queries/TasksByStatus.html +1 -1
- data/docs/Tasker/Queries.html +1 -1
- data/docs/Tasker/Railtie.html +1 -1
- data/docs/Tasker/Registry/BaseRegistry.html +1 -1
- data/docs/Tasker/Registry/EventPublisher.html +1 -1
- data/docs/Tasker/Registry/InterfaceValidator.html +1 -1
- data/docs/Tasker/Registry/RegistrationError.html +1 -1
- data/docs/Tasker/Registry/RegistryError.html +1 -1
- data/docs/Tasker/Registry/StatisticsCollector.html +1 -1
- data/docs/Tasker/Registry/SubscriberRegistry.html +1 -1
- data/docs/Tasker/Registry/ValidationError.html +1 -1
- data/docs/Tasker/Registry.html +1 -1
- data/docs/Tasker/RetryableError.html +1 -1
- data/docs/Tasker/StateMachine/Compatibility.html +1 -1
- data/docs/Tasker/StateMachine/InvalidStateTransition.html +1 -1
- data/docs/Tasker/StateMachine/StepStateMachine.html +1 -1
- data/docs/Tasker/StateMachine/TaskStateMachine.html +1 -1
- data/docs/Tasker/StateMachine.html +1 -1
- data/docs/Tasker/StepDagRelationship.html +1 -1
- data/docs/Tasker/StepHandler/Api/Config.html +1 -1
- data/docs/Tasker/StepHandler/Api.html +1 -1
- data/docs/Tasker/StepHandler/AutomaticEventPublishing.html +1 -1
- data/docs/Tasker/StepHandler/Base.html +1 -1
- data/docs/Tasker/StepHandler.html +1 -1
- data/docs/Tasker/StepReadinessStatus.html +1 -1
- data/docs/Tasker/Task.html +1 -1
- data/docs/Tasker/TaskAnnotation.html +1 -1
- data/docs/Tasker/TaskAnnotationSerializer.html +1 -1
- data/docs/Tasker/TaskBuilder/StepNameValidator.html +1 -1
- data/docs/Tasker/TaskBuilder/StepTemplateDefiner.html +1 -1
- data/docs/Tasker/TaskBuilder.html +1 -1
- data/docs/Tasker/TaskExecutionContext.html +1 -1
- data/docs/Tasker/TaskHandler/ClassMethods/StepTemplateDefiner/ClassBasedEventRegistrar.html +1 -1
- data/docs/Tasker/TaskHandler/ClassMethods/StepTemplateDefiner/YamlEventRegistrar.html +1 -1
- data/docs/Tasker/TaskHandler/ClassMethods/StepTemplateDefiner.html +1 -1
- data/docs/Tasker/TaskHandler/ClassMethods.html +1 -1
- data/docs/Tasker/TaskHandler/InstanceMethods.html +1 -1
- data/docs/Tasker/TaskHandler/StepGroup.html +1 -1
- data/docs/Tasker/TaskHandler.html +1 -1
- data/docs/Tasker/TaskNamespace.html +1 -1
- data/docs/Tasker/TaskRunnerJob.html +1 -1
- data/docs/Tasker/TaskSerializer.html +1 -1
- data/docs/Tasker/TaskTransition.html +1 -1
- data/docs/Tasker/TaskerRailsSchema/InvalidObjectTypeError.html +1 -1
- data/docs/Tasker/TaskerRailsSchema/TypeResolutionError.html +1 -1
- data/docs/Tasker/TaskerRailsSchema/UnknownInterfaceError.html +1 -1
- data/docs/Tasker/TaskerRailsSchema.html +1 -1
- data/docs/Tasker/TasksController.html +1 -1
- data/docs/Tasker/Telemetry/EventMapping.html +1 -1
- data/docs/Tasker/Telemetry/EventRouter.html +1 -1
- data/docs/Tasker/Telemetry/Events/ExportEvents.html +1 -1
- data/docs/Tasker/Telemetry/Events.html +1 -1
- data/docs/Tasker/Telemetry/ExportCoordinator.html +1 -1
- data/docs/Tasker/Telemetry/IntelligentCacheManager.html +1 -1
- data/docs/Tasker/Telemetry/LogBackend.html +1 -1
- data/docs/Tasker/Telemetry/MetricTypes/Counter.html +1 -1
- data/docs/Tasker/Telemetry/MetricTypes/Gauge.html +1 -1
- data/docs/Tasker/Telemetry/MetricTypes/Histogram.html +1 -1
- data/docs/Tasker/Telemetry/MetricTypes.html +1 -1
- data/docs/Tasker/Telemetry/MetricsBackend.html +1 -1
- data/docs/Tasker/Telemetry/MetricsExportService.html +1 -1
- data/docs/Tasker/Telemetry/PluginRegistry.html +1 -1
- data/docs/Tasker/Telemetry/Plugins/BaseExporter.html +1 -1
- data/docs/Tasker/Telemetry/Plugins/CsvExporter.html +1 -1
- data/docs/Tasker/Telemetry/Plugins/JsonExporter.html +1 -1
- data/docs/Tasker/Telemetry/Plugins.html +1 -1
- data/docs/Tasker/Telemetry/PrometheusExporter.html +1 -1
- data/docs/Tasker/Telemetry/TraceBackend.html +1 -1
- data/docs/Tasker/Telemetry.html +1 -1
- data/docs/Tasker/Types/AuthConfig.html +1 -1
- data/docs/Tasker/Types/BackoffConfig.html +1 -1
- data/docs/Tasker/Types/BaseConfig.html +1 -1
- data/docs/Tasker/Types/CacheConfig.html +1 -1
- data/docs/Tasker/Types/DatabaseConfig.html +1 -1
- data/docs/Tasker/Types/DependencyGraph.html +1 -1
- data/docs/Tasker/Types/DependencyGraphConfig.html +1 -1
- data/docs/Tasker/Types/EngineConfig.html +1 -1
- data/docs/Tasker/Types/ExecutionConfig.html +1 -1
- data/docs/Tasker/Types/GraphEdge.html +1 -1
- data/docs/Tasker/Types/GraphMetadata.html +1 -1
- data/docs/Tasker/Types/GraphNode.html +1 -1
- data/docs/Tasker/Types/HealthConfig.html +1 -1
- data/docs/Tasker/Types/StepSequence.html +1 -1
- data/docs/Tasker/Types/StepTemplate.html +1 -1
- data/docs/Tasker/Types/TaskRequest.html +1 -1
- data/docs/Tasker/Types/TelemetryConfig.html +1 -1
- data/docs/Tasker/Types.html +1 -1
- data/docs/Tasker/WorkflowStep/StepFinder.html +1 -1
- data/docs/Tasker/WorkflowStep.html +1 -1
- data/docs/Tasker/WorkflowStepEdge.html +6 -4
- data/docs/Tasker/WorkflowStepSerializer.html +1 -1
- data/docs/Tasker/WorkflowStepTransition/TransitionDescriptionFormatter.html +1 -1
- data/docs/Tasker/WorkflowStepTransition.html +1 -1
- data/docs/Tasker/WorkflowStepsController.html +1 -1
- data/docs/Tasker.html +2 -2
- data/docs/_index.html +1 -1
- data/docs/file.README.html +2 -2
- data/docs/index.html +2 -2
- data/docs/top-level-namespace.html +1 -1
- data/lib/tasker/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3fbb4817144137a8ccd1a9635aa9b18da5a326079132176a9163722557369c1a
|
4
|
+
data.tar.gz: 4334556479c34a5dda97707490727139f11fd88960cda236c0f3421a21eaaebd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 766d4da99906b244ea0c91dae4b1d0d154bf8600639771025e072cd527e2c3806253878759d3a646ca69d53641519c79dfaf7f59713b8b8fe68362d4eea589c5
|
7
|
+
data.tar.gz: a7fde71e54c41e83812249ade41b7b34afa0c2e5849d1b27d4d05440903025ab5558b7ee85ea4d6ff01b82de422f424228dd3bcd09a3bed56d91ae2b8b515646
|
data/README.md
CHANGED
@@ -0,0 +1,223 @@
|
|
1
|
+
-- Fix step readiness logic for NULL attempts
|
2
|
+
-- When attempts is NULL, it should be treated as 0 for comparison purposes
|
3
|
+
|
4
|
+
-- Update get_step_readiness_status function
|
5
|
+
CREATE OR REPLACE FUNCTION public.get_step_readiness_status(input_task_id bigint, step_ids bigint[] DEFAULT NULL::bigint[]) RETURNS TABLE(workflow_step_id bigint, task_id bigint, named_step_id integer, name text, current_state text, dependencies_satisfied boolean, retry_eligible boolean, ready_for_execution boolean, last_failure_at timestamp without time zone, next_retry_at timestamp without time zone, total_parents integer, completed_parents integer, attempts integer, retry_limit integer, backoff_request_seconds integer, last_attempted_at timestamp without time zone)
|
6
|
+
LANGUAGE plpgsql STABLE
|
7
|
+
AS $$
|
8
|
+
BEGIN
|
9
|
+
RETURN QUERY
|
10
|
+
SELECT
|
11
|
+
ws.workflow_step_id,
|
12
|
+
ws.task_id,
|
13
|
+
ws.named_step_id,
|
14
|
+
ns.name::TEXT,
|
15
|
+
|
16
|
+
-- Current State Information (optimized using most_recent flag)
|
17
|
+
COALESCE(current_state.to_state, 'pending')::TEXT as current_state,
|
18
|
+
|
19
|
+
-- Dependency Satisfaction Analysis
|
20
|
+
CASE
|
21
|
+
WHEN dep_edges.to_step_id IS NULL OR
|
22
|
+
COUNT(dep_edges.from_step_id) = 0 THEN true
|
23
|
+
ELSE
|
24
|
+
COUNT(CASE WHEN parent_states.to_state IN ('complete', 'resolved_manually') THEN 1 END) = COUNT(dep_edges.from_step_id)
|
25
|
+
END as dependencies_satisfied,
|
26
|
+
|
27
|
+
-- Retry Eligibility
|
28
|
+
CASE
|
29
|
+
WHEN COALESCE(ws.attempts, 0) < COALESCE(ws.retry_limit, 3) THEN true
|
30
|
+
ELSE false
|
31
|
+
END as retry_eligible,
|
32
|
+
|
33
|
+
-- Overall Ready for Execution (complex business logic)
|
34
|
+
CASE
|
35
|
+
WHEN COALESCE(current_state.to_state, 'pending') IN ('pending', 'error')
|
36
|
+
AND (ws.processed = false OR ws.processed IS NULL) -- CRITICAL: Only unprocessed steps can be ready
|
37
|
+
AND (dep_edges.to_step_id IS NULL OR
|
38
|
+
COUNT(dep_edges.from_step_id) = 0 OR
|
39
|
+
COUNT(CASE WHEN parent_states.to_state IN ('complete', 'resolved_manually') THEN 1 END) = COUNT(dep_edges.from_step_id))
|
40
|
+
AND (COALESCE(ws.attempts, 0) < COALESCE(ws.retry_limit, 3)) -- FIXED: Handle NULL attempts
|
41
|
+
AND (COALESCE(ws.retryable, true) = true)
|
42
|
+
AND (ws.in_process = false OR ws.in_process IS NULL)
|
43
|
+
AND (
|
44
|
+
-- Check explicit backoff timing (most restrictive)
|
45
|
+
-- If backoff is set, the backoff period must have expired
|
46
|
+
CASE
|
47
|
+
WHEN ws.backoff_request_seconds IS NOT NULL AND ws.last_attempted_at IS NOT NULL THEN
|
48
|
+
ws.last_attempted_at + (ws.backoff_request_seconds * interval '1 second') <= NOW()
|
49
|
+
ELSE true -- No explicit backoff set
|
50
|
+
END
|
51
|
+
AND
|
52
|
+
-- Then check failure-based backoff
|
53
|
+
(last_failure.created_at IS NULL OR
|
54
|
+
last_failure.created_at + (LEAST(power(2, COALESCE(ws.attempts, 1)) * interval '1 second', interval '30 seconds')) <= NOW())
|
55
|
+
)
|
56
|
+
THEN true
|
57
|
+
ELSE false
|
58
|
+
END as ready_for_execution,
|
59
|
+
|
60
|
+
-- Timing Information
|
61
|
+
last_failure.created_at as last_failure_at,
|
62
|
+
CASE
|
63
|
+
WHEN ws.backoff_request_seconds IS NOT NULL AND ws.last_attempted_at IS NOT NULL THEN
|
64
|
+
ws.last_attempted_at + (ws.backoff_request_seconds * interval '1 second')
|
65
|
+
WHEN last_failure.created_at IS NOT NULL THEN
|
66
|
+
last_failure.created_at + (LEAST(power(2, COALESCE(ws.attempts, 1)) * interval '1 second', interval '30 seconds'))
|
67
|
+
ELSE NULL
|
68
|
+
END as next_retry_at,
|
69
|
+
|
70
|
+
-- Dependency Context (calculated from joins)
|
71
|
+
COALESCE(COUNT(dep_edges.from_step_id), 0)::INTEGER as total_parents,
|
72
|
+
COALESCE(COUNT(CASE WHEN parent_states.to_state IN ('complete', 'resolved_manually') THEN 1 END), 0)::INTEGER as completed_parents,
|
73
|
+
|
74
|
+
-- Retry Context
|
75
|
+
COALESCE(ws.attempts, 0)::INTEGER as attempts, -- FIXED: Return 0 instead of NULL
|
76
|
+
COALESCE(ws.retry_limit, 3) as retry_limit,
|
77
|
+
ws.backoff_request_seconds,
|
78
|
+
ws.last_attempted_at
|
79
|
+
|
80
|
+
FROM tasker_workflow_steps ws
|
81
|
+
JOIN tasker_named_steps ns ON ns.named_step_id = ws.named_step_id
|
82
|
+
|
83
|
+
-- OPTIMIZED: Current State using most_recent flag instead of DISTINCT ON
|
84
|
+
LEFT JOIN tasker_workflow_step_transitions current_state
|
85
|
+
ON current_state.workflow_step_id = ws.workflow_step_id
|
86
|
+
AND current_state.most_recent = true
|
87
|
+
|
88
|
+
-- OPTIMIZED: Dependency check using direct joins (no subquery)
|
89
|
+
LEFT JOIN tasker_workflow_step_edges dep_edges
|
90
|
+
ON dep_edges.to_step_id = ws.workflow_step_id
|
91
|
+
LEFT JOIN tasker_workflow_step_transitions parent_states
|
92
|
+
ON parent_states.workflow_step_id = dep_edges.from_step_id
|
93
|
+
AND parent_states.most_recent = true
|
94
|
+
|
95
|
+
-- OPTIMIZED: Last failure using index-optimized approach
|
96
|
+
LEFT JOIN tasker_workflow_step_transitions last_failure
|
97
|
+
ON last_failure.workflow_step_id = ws.workflow_step_id
|
98
|
+
AND last_failure.to_state = 'error'
|
99
|
+
AND last_failure.most_recent = true
|
100
|
+
|
101
|
+
-- KEY PERFORMANCE IMPROVEMENT: Filter by task first, then optionally by step IDs
|
102
|
+
-- CRITICAL FIX: Include ALL steps for task execution context calculation
|
103
|
+
-- Only filter by processed status when specifically querying for ready steps
|
104
|
+
WHERE ws.task_id = input_task_id
|
105
|
+
AND (step_ids IS NULL OR ws.workflow_step_id = ANY(step_ids))
|
106
|
+
|
107
|
+
GROUP BY
|
108
|
+
ws.workflow_step_id, ws.task_id, ws.named_step_id, ns.name,
|
109
|
+
current_state.to_state, last_failure.created_at,
|
110
|
+
ws.attempts, ws.retry_limit, ws.backoff_request_seconds, ws.last_attempted_at,
|
111
|
+
ws.in_process, ws.processed, ws.retryable, dep_edges.to_step_id,
|
112
|
+
current_state.workflow_step_id, last_failure.workflow_step_id;
|
113
|
+
END;
|
114
|
+
$$;
|
115
|
+
|
116
|
+
-- Also update the batch version
|
117
|
+
CREATE OR REPLACE FUNCTION public.get_step_readiness_status_batch(input_task_ids bigint[]) RETURNS TABLE(workflow_step_id bigint, task_id bigint, named_step_id integer, name text, current_state text, dependencies_satisfied boolean, retry_eligible boolean, ready_for_execution boolean, last_failure_at timestamp without time zone, next_retry_at timestamp without time zone, total_parents integer, completed_parents integer, attempts integer, retry_limit integer, backoff_request_seconds integer, last_attempted_at timestamp without time zone)
|
118
|
+
LANGUAGE plpgsql STABLE
|
119
|
+
AS $$
|
120
|
+
BEGIN
|
121
|
+
RETURN QUERY
|
122
|
+
SELECT
|
123
|
+
ws.workflow_step_id,
|
124
|
+
ws.task_id,
|
125
|
+
ws.named_step_id,
|
126
|
+
ns.name::TEXT,
|
127
|
+
|
128
|
+
-- Current State Information (optimized using most_recent flag)
|
129
|
+
COALESCE(current_state.to_state, 'pending')::TEXT as current_state,
|
130
|
+
|
131
|
+
-- Dependency Satisfaction Analysis
|
132
|
+
CASE
|
133
|
+
WHEN dep_edges.to_step_id IS NULL OR
|
134
|
+
COUNT(dep_edges.from_step_id) = 0 THEN true
|
135
|
+
ELSE
|
136
|
+
COUNT(CASE WHEN parent_states.to_state IN ('complete', 'resolved_manually') THEN 1 END) = COUNT(dep_edges.from_step_id)
|
137
|
+
END as dependencies_satisfied,
|
138
|
+
|
139
|
+
-- Retry Eligibility
|
140
|
+
CASE
|
141
|
+
WHEN COALESCE(ws.attempts, 0) < COALESCE(ws.retry_limit, 3) THEN true
|
142
|
+
ELSE false
|
143
|
+
END as retry_eligible,
|
144
|
+
|
145
|
+
-- Overall Ready for Execution (complex business logic)
|
146
|
+
CASE
|
147
|
+
WHEN COALESCE(current_state.to_state, 'pending') IN ('pending', 'error')
|
148
|
+
AND (ws.processed = false OR ws.processed IS NULL)
|
149
|
+
AND (dep_edges.to_step_id IS NULL OR
|
150
|
+
COUNT(dep_edges.from_step_id) = 0 OR
|
151
|
+
COUNT(CASE WHEN parent_states.to_state IN ('complete', 'resolved_manually') THEN 1 END) = COUNT(dep_edges.from_step_id))
|
152
|
+
AND (COALESCE(ws.attempts, 0) < COALESCE(ws.retry_limit, 3)) -- FIXED: Handle NULL attempts
|
153
|
+
AND (COALESCE(ws.retryable, true) = true)
|
154
|
+
AND (ws.in_process = false OR ws.in_process IS NULL)
|
155
|
+
AND (
|
156
|
+
-- Check explicit backoff timing (most restrictive)
|
157
|
+
-- If backoff is set, the backoff period must have expired
|
158
|
+
CASE
|
159
|
+
WHEN ws.backoff_request_seconds IS NOT NULL AND ws.last_attempted_at IS NOT NULL THEN
|
160
|
+
ws.last_attempted_at + (ws.backoff_request_seconds * interval '1 second') <= NOW()
|
161
|
+
ELSE true -- No explicit backoff set
|
162
|
+
END
|
163
|
+
AND
|
164
|
+
-- Then check failure-based backoff
|
165
|
+
(last_failure.created_at IS NULL OR
|
166
|
+
last_failure.created_at + (LEAST(power(2, COALESCE(ws.attempts, 1)) * interval '1 second', interval '30 seconds')) <= NOW())
|
167
|
+
)
|
168
|
+
THEN true
|
169
|
+
ELSE false
|
170
|
+
END as ready_for_execution,
|
171
|
+
|
172
|
+
-- Timing Information
|
173
|
+
last_failure.created_at as last_failure_at,
|
174
|
+
CASE
|
175
|
+
WHEN ws.backoff_request_seconds IS NOT NULL AND ws.last_attempted_at IS NOT NULL THEN
|
176
|
+
ws.last_attempted_at + (ws.backoff_request_seconds * interval '1 second')
|
177
|
+
WHEN last_failure.created_at IS NOT NULL THEN
|
178
|
+
last_failure.created_at + (LEAST(power(2, COALESCE(ws.attempts, 1)) * interval '1 second', interval '30 seconds'))
|
179
|
+
ELSE NULL
|
180
|
+
END as next_retry_at,
|
181
|
+
|
182
|
+
-- Dependency Context (calculated from joins)
|
183
|
+
COALESCE(COUNT(dep_edges.from_step_id), 0)::INTEGER as total_parents,
|
184
|
+
COALESCE(COUNT(CASE WHEN parent_states.to_state IN ('complete', 'resolved_manually') THEN 1 END), 0)::INTEGER as completed_parents,
|
185
|
+
|
186
|
+
-- Retry Context
|
187
|
+
COALESCE(ws.attempts, 0)::INTEGER as attempts, -- FIXED: Return 0 instead of NULL
|
188
|
+
COALESCE(ws.retry_limit, 3) as retry_limit,
|
189
|
+
ws.backoff_request_seconds,
|
190
|
+
ws.last_attempted_at
|
191
|
+
|
192
|
+
FROM tasker_workflow_steps ws
|
193
|
+
JOIN tasker_named_steps ns ON ns.named_step_id = ws.named_step_id
|
194
|
+
|
195
|
+
-- OPTIMIZED: Current State using most_recent flag instead of DISTINCT ON
|
196
|
+
LEFT JOIN tasker_workflow_step_transitions current_state
|
197
|
+
ON current_state.workflow_step_id = ws.workflow_step_id
|
198
|
+
AND current_state.most_recent = true
|
199
|
+
|
200
|
+
-- OPTIMIZED: Dependency check using direct joins (no subquery)
|
201
|
+
LEFT JOIN tasker_workflow_step_edges dep_edges
|
202
|
+
ON dep_edges.to_step_id = ws.workflow_step_id
|
203
|
+
LEFT JOIN tasker_workflow_step_transitions parent_states
|
204
|
+
ON parent_states.workflow_step_id = dep_edges.from_step_id
|
205
|
+
AND parent_states.most_recent = true
|
206
|
+
|
207
|
+
-- OPTIMIZED: Last failure using index-optimized approach
|
208
|
+
LEFT JOIN tasker_workflow_step_transitions last_failure
|
209
|
+
ON last_failure.workflow_step_id = ws.workflow_step_id
|
210
|
+
AND last_failure.to_state = 'error'
|
211
|
+
AND last_failure.most_recent = true
|
212
|
+
|
213
|
+
-- KEY PERFORMANCE IMPROVEMENT: Filter by task first, then optionally by step IDs
|
214
|
+
WHERE ws.task_id = ANY(input_task_ids)
|
215
|
+
|
216
|
+
GROUP BY
|
217
|
+
ws.workflow_step_id, ws.task_id, ws.named_step_id, ns.name,
|
218
|
+
current_state.to_state, last_failure.created_at,
|
219
|
+
ws.attempts, ws.retry_limit, ws.backoff_request_seconds, ws.last_attempted_at,
|
220
|
+
ws.in_process, ws.processed, ws.retryable, dep_edges.to_step_id,
|
221
|
+
current_state.workflow_step_id, last_failure.workflow_step_id;
|
222
|
+
END;
|
223
|
+
$$;
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class StepReadinessSqlFunctionsV02 < ActiveRecord::Migration[7.2]
|
2
|
+
def up
|
3
|
+
sql_file = File.read(Rails.root.join('db', 'functions', 'get_step_readiness_status_single_and_batch_v02.sql'))
|
4
|
+
execute(sql_file)
|
5
|
+
end
|
6
|
+
|
7
|
+
def down
|
8
|
+
original_sql_files = [
|
9
|
+
'get_step_readiness_status_v01.sql',
|
10
|
+
'get_step_readiness_status_batch_v01.sql'
|
11
|
+
]
|
12
|
+
|
13
|
+
original_sql_files.each do |file|
|
14
|
+
sql_file = File.read(Rails.root.join('db', 'functions', file))
|
15
|
+
execute(sql_file)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -897,7 +897,7 @@
|
|
897
897
|
</div>
|
898
898
|
|
899
899
|
<div id="footer">
|
900
|
-
Generated on
|
900
|
+
Generated on Thu Jul 10 08:40:46 2025 by
|
901
901
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
902
902
|
0.9.37 (ruby-3.2.4).
|
903
903
|
</div>
|
@@ -1226,7 +1226,7 @@
|
|
1226
1226
|
</div>
|
1227
1227
|
|
1228
1228
|
<div id="footer">
|
1229
|
-
Generated on
|
1229
|
+
Generated on Thu Jul 10 08:40:47 2025 by
|
1230
1230
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
1231
1231
|
0.9.37 (ruby-3.2.4).
|
1232
1232
|
</div>
|
data/docs/Tasker/Analysis.html
CHANGED
@@ -107,7 +107,7 @@
|
|
107
107
|
</div>
|
108
108
|
|
109
109
|
<div id="footer">
|
110
|
-
Generated on
|
110
|
+
Generated on Thu Jul 10 08:40:41 2025 by
|
111
111
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
112
112
|
0.9.37 (ruby-3.2.4).
|
113
113
|
</div>
|
@@ -440,7 +440,7 @@
|
|
440
440
|
</div>
|
441
441
|
|
442
442
|
<div id="footer">
|
443
|
-
Generated on
|
443
|
+
Generated on Thu Jul 10 08:40:47 2025 by
|
444
444
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
445
445
|
0.9.37 (ruby-3.2.4).
|
446
446
|
</div>
|
@@ -806,7 +806,7 @@
|
|
806
806
|
</div>
|
807
807
|
|
808
808
|
<div id="footer">
|
809
|
-
Generated on
|
809
|
+
Generated on Thu Jul 10 08:40:45 2025 by
|
810
810
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
811
811
|
0.9.37 (ruby-3.2.4).
|
812
812
|
</div>
|
@@ -576,7 +576,7 @@
|
|
576
576
|
</div>
|
577
577
|
|
578
578
|
<div id="footer">
|
579
|
-
Generated on
|
579
|
+
Generated on Thu Jul 10 08:40:45 2025 by
|
580
580
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
581
581
|
0.9.37 (ruby-3.2.4).
|
582
582
|
</div>
|
@@ -2211,7 +2211,7 @@
|
|
2211
2211
|
</div>
|
2212
2212
|
|
2213
2213
|
<div id="footer">
|
2214
|
-
Generated on
|
2214
|
+
Generated on Thu Jul 10 08:40:45 2025 by
|
2215
2215
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
2216
2216
|
0.9.37 (ruby-3.2.4).
|
2217
2217
|
</div>
|
@@ -127,7 +127,7 @@
|
|
127
127
|
</div>
|
128
128
|
|
129
129
|
<div id="footer">
|
130
|
-
Generated on
|
130
|
+
Generated on Thu Jul 10 08:40:43 2025 by
|
131
131
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
132
132
|
0.9.37 (ruby-3.2.4).
|
133
133
|
</div>
|
@@ -114,7 +114,7 @@
|
|
114
114
|
</div>
|
115
115
|
|
116
116
|
<div id="footer">
|
117
|
-
Generated on
|
117
|
+
Generated on Thu Jul 10 08:40:48 2025 by
|
118
118
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
119
119
|
0.9.37 (ruby-3.2.4).
|
120
120
|
</div>
|
@@ -137,7 +137,7 @@
|
|
137
137
|
</div>
|
138
138
|
|
139
139
|
<div id="footer">
|
140
|
-
Generated on
|
140
|
+
Generated on Thu Jul 10 08:40:47 2025 by
|
141
141
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
142
142
|
0.9.37 (ruby-3.2.4).
|
143
143
|
</div>
|
@@ -118,7 +118,7 @@
|
|
118
118
|
</div>
|
119
119
|
|
120
120
|
<div id="footer">
|
121
|
-
Generated on
|
121
|
+
Generated on Thu Jul 10 08:40:43 2025 by
|
122
122
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
123
123
|
0.9.37 (ruby-3.2.4).
|
124
124
|
</div>
|
@@ -368,7 +368,7 @@ production:
|
|
368
368
|
</div>
|
369
369
|
|
370
370
|
<div id="footer">
|
371
|
-
Generated on
|
371
|
+
Generated on Thu Jul 10 08:40:44 2025 by
|
372
372
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
373
373
|
0.9.37 (ruby-3.2.4).
|
374
374
|
</div>
|
@@ -114,7 +114,7 @@
|
|
114
114
|
</div>
|
115
115
|
|
116
116
|
<div id="footer">
|
117
|
-
Generated on
|
117
|
+
Generated on Thu Jul 10 08:40:43 2025 by
|
118
118
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
119
119
|
0.9.37 (ruby-3.2.4).
|
120
120
|
</div>
|
@@ -114,7 +114,7 @@
|
|
114
114
|
</div>
|
115
115
|
|
116
116
|
<div id="footer">
|
117
|
-
Generated on
|
117
|
+
Generated on Thu Jul 10 08:40:43 2025 by
|
118
118
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
119
119
|
0.9.37 (ruby-3.2.4).
|
120
120
|
</div>
|
@@ -232,7 +232,7 @@
|
|
232
232
|
</div>
|
233
233
|
|
234
234
|
<div id="footer">
|
235
|
-
Generated on
|
235
|
+
Generated on Thu Jul 10 08:40:45 2025 by
|
236
236
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
237
237
|
0.9.37 (ruby-3.2.4).
|
238
238
|
</div>
|
@@ -550,7 +550,7 @@
|
|
550
550
|
</div>
|
551
551
|
|
552
552
|
<div id="footer">
|
553
|
-
Generated on
|
553
|
+
Generated on Thu Jul 10 08:40:41 2025 by
|
554
554
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
555
555
|
0.9.37 (ruby-3.2.4).
|
556
556
|
</div>
|
@@ -114,7 +114,7 @@
|
|
114
114
|
</div>
|
115
115
|
|
116
116
|
<div id="footer">
|
117
|
-
Generated on
|
117
|
+
Generated on Thu Jul 10 08:40:43 2025 by
|
118
118
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
119
119
|
0.9.37 (ruby-3.2.4).
|
120
120
|
</div>
|
@@ -328,7 +328,7 @@
|
|
328
328
|
</div>
|
329
329
|
|
330
330
|
<div id="footer">
|
331
|
-
Generated on
|
331
|
+
Generated on Thu Jul 10 08:40:47 2025 by
|
332
332
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
333
333
|
0.9.37 (ruby-3.2.4).
|
334
334
|
</div>
|
@@ -109,7 +109,7 @@
|
|
109
109
|
</div>
|
110
110
|
|
111
111
|
<div id="footer">
|
112
|
-
Generated on
|
112
|
+
Generated on Thu Jul 10 08:40:41 2025 by
|
113
113
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
114
114
|
0.9.37 (ruby-3.2.4).
|
115
115
|
</div>
|
@@ -129,7 +129,7 @@
|
|
129
129
|
</div>
|
130
130
|
|
131
131
|
<div id="footer">
|
132
|
-
Generated on
|
132
|
+
Generated on Thu Jul 10 08:40:43 2025 by
|
133
133
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
134
134
|
0.9.37 (ruby-3.2.4).
|
135
135
|
</div>
|
@@ -917,7 +917,7 @@
|
|
917
917
|
</div>
|
918
918
|
|
919
919
|
<div id="footer">
|
920
|
-
Generated on
|
920
|
+
Generated on Thu Jul 10 08:40:46 2025 by
|
921
921
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
922
922
|
0.9.37 (ruby-3.2.4).
|
923
923
|
</div>
|
@@ -143,7 +143,7 @@
|
|
143
143
|
</div>
|
144
144
|
|
145
145
|
<div id="footer">
|
146
|
-
Generated on
|
146
|
+
Generated on Thu Jul 10 08:40:43 2025 by
|
147
147
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
148
148
|
0.9.37 (ruby-3.2.4).
|
149
149
|
</div>
|
@@ -418,7 +418,7 @@
|
|
418
418
|
</div>
|
419
419
|
|
420
420
|
<div id="footer">
|
421
|
-
Generated on
|
421
|
+
Generated on Thu Jul 10 08:40:41 2025 by
|
422
422
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
423
423
|
0.9.37 (ruby-3.2.4).
|
424
424
|
</div>
|
@@ -350,7 +350,7 @@
|
|
350
350
|
</div>
|
351
351
|
|
352
352
|
<div id="footer">
|
353
|
-
Generated on
|
353
|
+
Generated on Thu Jul 10 08:40:41 2025 by
|
354
354
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
355
355
|
0.9.37 (ruby-3.2.4).
|
356
356
|
</div>
|
@@ -136,7 +136,7 @@
|
|
136
136
|
</div>
|
137
137
|
|
138
138
|
<div id="footer">
|
139
|
-
Generated on
|
139
|
+
Generated on Thu Jul 10 08:40:41 2025 by
|
140
140
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
141
141
|
0.9.37 (ruby-3.2.4).
|
142
142
|
</div>
|
@@ -865,7 +865,7 @@
|
|
865
865
|
</div>
|
866
866
|
|
867
867
|
<div id="footer">
|
868
|
-
Generated on
|
868
|
+
Generated on Thu Jul 10 08:40:46 2025 by
|
869
869
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
870
870
|
0.9.37 (ruby-3.2.4).
|
871
871
|
</div>
|
@@ -143,7 +143,7 @@
|
|
143
143
|
</div>
|
144
144
|
|
145
145
|
<div id="footer">
|
146
|
-
Generated on
|
146
|
+
Generated on Thu Jul 10 08:40:43 2025 by
|
147
147
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
148
148
|
0.9.37 (ruby-3.2.4).
|
149
149
|
</div>
|
@@ -572,7 +572,7 @@
|
|
572
572
|
</div>
|
573
573
|
|
574
574
|
<div id="footer">
|
575
|
-
Generated on
|
575
|
+
Generated on Thu Jul 10 08:40:41 2025 by
|
576
576
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
577
577
|
0.9.37 (ruby-3.2.4).
|
578
578
|
</div>
|
@@ -157,7 +157,7 @@
|
|
157
157
|
</div>
|
158
158
|
|
159
159
|
<div id="footer">
|
160
|
-
Generated on
|
160
|
+
Generated on Thu Jul 10 08:40:41 2025 by
|
161
161
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
162
162
|
0.9.37 (ruby-3.2.4).
|
163
163
|
</div>
|
@@ -1287,7 +1287,7 @@
|
|
1287
1287
|
</div>
|
1288
1288
|
|
1289
1289
|
<div id="footer">
|
1290
|
-
Generated on
|
1290
|
+
Generated on Thu Jul 10 08:40:42 2025 by
|
1291
1291
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
1292
1292
|
0.9.37 (ruby-3.2.4).
|
1293
1293
|
</div>
|
@@ -106,7 +106,7 @@
|
|
106
106
|
</div>
|
107
107
|
|
108
108
|
<div id="footer">
|
109
|
-
Generated on
|
109
|
+
Generated on Thu Jul 10 08:40:41 2025 by
|
110
110
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
111
111
|
0.9.37 (ruby-3.2.4).
|
112
112
|
</div>
|
@@ -246,7 +246,7 @@
|
|
246
246
|
</div>
|
247
247
|
|
248
248
|
<div id="footer">
|
249
|
-
Generated on
|
249
|
+
Generated on Thu Jul 10 08:40:43 2025 by
|
250
250
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
251
251
|
0.9.37 (ruby-3.2.4).
|
252
252
|
</div>
|
@@ -806,7 +806,7 @@
|
|
806
806
|
</div>
|
807
807
|
|
808
808
|
<div id="footer">
|
809
|
-
Generated on
|
809
|
+
Generated on Thu Jul 10 08:40:41 2025 by
|
810
810
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
811
811
|
0.9.37 (ruby-3.2.4).
|
812
812
|
</div>
|
@@ -147,7 +147,7 @@
|
|
147
147
|
</div>
|
148
148
|
|
149
149
|
<div id="footer">
|
150
|
-
Generated on
|
150
|
+
Generated on Thu Jul 10 08:40:41 2025 by
|
151
151
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
152
152
|
0.9.37 (ruby-3.2.4).
|
153
153
|
</div>
|
@@ -4013,7 +4013,7 @@
|
|
4013
4013
|
</div>
|
4014
4014
|
|
4015
4015
|
<div id="footer">
|
4016
|
-
Generated on
|
4016
|
+
Generated on Thu Jul 10 08:40:41 2025 by
|
4017
4017
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
4018
4018
|
0.9.37 (ruby-3.2.4).
|
4019
4019
|
</div>
|
@@ -796,7 +796,7 @@
|
|
796
796
|
</div>
|
797
797
|
|
798
798
|
<div id="footer">
|
799
|
-
Generated on
|
799
|
+
Generated on Thu Jul 10 08:40:41 2025 by
|
800
800
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
801
801
|
0.9.37 (ruby-3.2.4).
|
802
802
|
</div>
|