tasker-engine 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (605) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +22 -0
  3. data/README.md +443 -0
  4. data/Rakefile +10 -0
  5. data/app/controllers/tasker/analytics_controller.rb +179 -0
  6. data/app/controllers/tasker/application_controller.rb +45 -0
  7. data/app/controllers/tasker/graphql_controller.rb +193 -0
  8. data/app/controllers/tasker/handlers_controller.rb +217 -0
  9. data/app/controllers/tasker/health_controller.rb +229 -0
  10. data/app/controllers/tasker/metrics_controller.rb +111 -0
  11. data/app/controllers/tasker/page_sort.rb +97 -0
  12. data/app/controllers/tasker/task_diagrams_controller.rb +30 -0
  13. data/app/controllers/tasker/tasks_controller.rb +123 -0
  14. data/app/controllers/tasker/workflow_steps_controller.rb +69 -0
  15. data/app/graphql/examples/all_tasks.graphql +22 -0
  16. data/app/graphql/examples/pending_tasks.graphql +23 -0
  17. data/app/graphql/tasker/graph_ql_types/annotation_type.rb +14 -0
  18. data/app/graphql/tasker/graph_ql_types/base_argument.rb +9 -0
  19. data/app/graphql/tasker/graph_ql_types/base_connection.rb +11 -0
  20. data/app/graphql/tasker/graph_ql_types/base_edge.rb +10 -0
  21. data/app/graphql/tasker/graph_ql_types/base_enum.rb +9 -0
  22. data/app/graphql/tasker/graph_ql_types/base_field.rb +10 -0
  23. data/app/graphql/tasker/graph_ql_types/base_input_object.rb +10 -0
  24. data/app/graphql/tasker/graph_ql_types/base_interface.rb +14 -0
  25. data/app/graphql/tasker/graph_ql_types/base_object.rb +10 -0
  26. data/app/graphql/tasker/graph_ql_types/base_scalar.rb +9 -0
  27. data/app/graphql/tasker/graph_ql_types/base_union.rb +11 -0
  28. data/app/graphql/tasker/graph_ql_types/dependent_system_object_map_type.rb +18 -0
  29. data/app/graphql/tasker/graph_ql_types/dependent_system_type.rb +13 -0
  30. data/app/graphql/tasker/graph_ql_types/mutation_type.rb +16 -0
  31. data/app/graphql/tasker/graph_ql_types/named_step_type.rb +16 -0
  32. data/app/graphql/tasker/graph_ql_types/named_task_type.rb +14 -0
  33. data/app/graphql/tasker/graph_ql_types/named_tasks_named_step_type.rb +19 -0
  34. data/app/graphql/tasker/graph_ql_types/node_type.rb +12 -0
  35. data/app/graphql/tasker/graph_ql_types/query_type.rb +20 -0
  36. data/app/graphql/tasker/graph_ql_types/task_annotation_type.rb +17 -0
  37. data/app/graphql/tasker/graph_ql_types/task_interface.rb +17 -0
  38. data/app/graphql/tasker/graph_ql_types/task_type.rb +26 -0
  39. data/app/graphql/tasker/graph_ql_types/workflow_step_type.rb +154 -0
  40. data/app/graphql/tasker/graph_ql_types.rb +42 -0
  41. data/app/graphql/tasker/mutations/base_mutation.rb +13 -0
  42. data/app/graphql/tasker/mutations/cancel_step.rb +29 -0
  43. data/app/graphql/tasker/mutations/cancel_task.rb +29 -0
  44. data/app/graphql/tasker/mutations/create_task.rb +52 -0
  45. data/app/graphql/tasker/mutations/update_step.rb +36 -0
  46. data/app/graphql/tasker/mutations/update_task.rb +41 -0
  47. data/app/graphql/tasker/queries/all_annotation_types.rb +17 -0
  48. data/app/graphql/tasker/queries/all_tasks.rb +23 -0
  49. data/app/graphql/tasker/queries/base_query.rb +9 -0
  50. data/app/graphql/tasker/queries/helpers.rb +16 -0
  51. data/app/graphql/tasker/queries/one_step.rb +24 -0
  52. data/app/graphql/tasker/queries/one_task.rb +18 -0
  53. data/app/graphql/tasker/queries/tasks_by_annotation.rb +31 -0
  54. data/app/graphql/tasker/queries/tasks_by_status.rb +30 -0
  55. data/app/graphql/tasker/tasker_rails_schema.rb +52 -0
  56. data/app/jobs/tasker/application_job.rb +8 -0
  57. data/app/jobs/tasker/metrics_export_job.rb +252 -0
  58. data/app/jobs/tasker/task_runner_job.rb +224 -0
  59. data/app/models/tasker/annotation_type.rb +26 -0
  60. data/app/models/tasker/application_record.rb +70 -0
  61. data/app/models/tasker/dependent_system.rb +26 -0
  62. data/app/models/tasker/dependent_system_object_map.rb +64 -0
  63. data/app/models/tasker/diagram/edge.rb +106 -0
  64. data/app/models/tasker/diagram/flowchart.rb +137 -0
  65. data/app/models/tasker/diagram/node.rb +99 -0
  66. data/app/models/tasker/named_step.rb +41 -0
  67. data/app/models/tasker/named_task.rb +121 -0
  68. data/app/models/tasker/named_tasks_named_step.rb +82 -0
  69. data/app/models/tasker/step_dag_relationship.rb +65 -0
  70. data/app/models/tasker/step_readiness_status.rb +59 -0
  71. data/app/models/tasker/task.rb +424 -0
  72. data/app/models/tasker/task_annotation.rb +36 -0
  73. data/app/models/tasker/task_diagram.rb +332 -0
  74. data/app/models/tasker/task_execution_context.rb +29 -0
  75. data/app/models/tasker/task_namespace.rb +41 -0
  76. data/app/models/tasker/task_transition.rb +235 -0
  77. data/app/models/tasker/workflow_step.rb +461 -0
  78. data/app/models/tasker/workflow_step_edge.rb +94 -0
  79. data/app/models/tasker/workflow_step_transition.rb +434 -0
  80. data/app/serializers/tasker/annotation_type_serializer.rb +8 -0
  81. data/app/serializers/tasker/handler_serializer.rb +109 -0
  82. data/app/serializers/tasker/task_annotation_serializer.rb +32 -0
  83. data/app/serializers/tasker/task_serializer.rb +168 -0
  84. data/app/serializers/tasker/workflow_step_serializer.rb +27 -0
  85. data/app/services/tasker/analytics_service.rb +409 -0
  86. data/app/views/tasker/task/_diagram.html.erb +32 -0
  87. data/config/initializers/dry_struct.rb +11 -0
  88. data/config/initializers/statesman.rb +6 -0
  89. data/config/initializers/tasker_orchestration.rb +17 -0
  90. data/config/initializers/time_formats.rb +4 -0
  91. data/config/routes.rb +34 -0
  92. data/config/tasker/subscriptions/example_integrations.yml +67 -0
  93. data/config/tasker/system_events.yml +305 -0
  94. data/db/functions/calculate_dependency_levels_v01.sql +45 -0
  95. data/db/functions/get_analytics_metrics_v01.sql +137 -0
  96. data/db/functions/get_slowest_steps_v01.sql +82 -0
  97. data/db/functions/get_slowest_tasks_v01.sql +96 -0
  98. data/db/functions/get_step_readiness_status_batch_v01.sql +140 -0
  99. data/db/functions/get_step_readiness_status_v01.sql +139 -0
  100. data/db/functions/get_system_health_counts_v01.sql +108 -0
  101. data/db/functions/get_task_execution_context_v01.sql +108 -0
  102. data/db/functions/get_task_execution_contexts_batch_v01.sql +104 -0
  103. data/db/init/schema.sql +2277 -0
  104. data/db/migrate/20250701165431_initial_tasker_schema.rb +116 -0
  105. data/db/views/tasker_step_dag_relationships_v01.sql +69 -0
  106. data/docs/APPLICATION_GENERATOR.md +384 -0
  107. data/docs/AUTH.md +1780 -0
  108. data/docs/CIRCUIT_BREAKER.md +224 -0
  109. data/docs/DEVELOPER_GUIDE.md +2665 -0
  110. data/docs/EVENT_SYSTEM.md +637 -0
  111. data/docs/EXECUTION_CONFIGURATION.md +341 -0
  112. data/docs/FLOW_CHART.md +149 -0
  113. data/docs/HEALTH.md +542 -0
  114. data/docs/METRICS.md +731 -0
  115. data/docs/OPTIMIZATION_PLAN.md +1479 -0
  116. data/docs/OVERVIEW.md +552 -0
  117. data/docs/QUICK_START.md +270 -0
  118. data/docs/REGISTRY_SYSTEMS.md +373 -0
  119. data/docs/REST_API.md +632 -0
  120. data/docs/ROADMAP.md +221 -0
  121. data/docs/SQL_FUNCTIONS.md +1408 -0
  122. data/docs/TASK_DIAGRAM.md +252 -0
  123. data/docs/TASK_EXECUTION_CONTROL_FLOW.md +237 -0
  124. data/docs/TELEMETRY.md +795 -0
  125. data/docs/TROUBLESHOOTING.md +756 -0
  126. data/docs/TaskHandlerGenerator.html +255 -0
  127. data/docs/Tasker/Analysis/RuntimeGraphAnalyzer.html +907 -0
  128. data/docs/Tasker/Analysis/TemplateGraphAnalyzer.html +1236 -0
  129. data/docs/Tasker/Analysis.html +117 -0
  130. data/docs/Tasker/AnalyticsController.html +450 -0
  131. data/docs/Tasker/AnalyticsService/BottleneckAnalytics.html +816 -0
  132. data/docs/Tasker/AnalyticsService/PerformanceAnalytics.html +586 -0
  133. data/docs/Tasker/AnalyticsService.html +2221 -0
  134. data/docs/Tasker/AnnotationType.html +137 -0
  135. data/docs/Tasker/AnnotationTypeSerializer.html +124 -0
  136. data/docs/Tasker/ApplicationController.html +147 -0
  137. data/docs/Tasker/ApplicationJob.html +128 -0
  138. data/docs/Tasker/ApplicationRecord.html +378 -0
  139. data/docs/Tasker/Authentication/AuthenticationError.html +124 -0
  140. data/docs/Tasker/Authentication/ConfigurationError.html +124 -0
  141. data/docs/Tasker/Authentication/Coordinator.html +242 -0
  142. data/docs/Tasker/Authentication/Interface.html +560 -0
  143. data/docs/Tasker/Authentication/InterfaceError.html +124 -0
  144. data/docs/Tasker/Authentication/NoneAuthenticator.html +338 -0
  145. data/docs/Tasker/Authentication.html +119 -0
  146. data/docs/Tasker/Authorization/AuthorizationError.html +139 -0
  147. data/docs/Tasker/Authorization/BaseCoordinator.html +927 -0
  148. data/docs/Tasker/Authorization/ConfigurationError.html +153 -0
  149. data/docs/Tasker/Authorization/ResourceConstants/ACTIONS.html +428 -0
  150. data/docs/Tasker/Authorization/ResourceConstants/RESOURCES.html +365 -0
  151. data/docs/Tasker/Authorization/ResourceConstants.html +146 -0
  152. data/docs/Tasker/Authorization/ResourceRegistry.html +882 -0
  153. data/docs/Tasker/Authorization/UnauthorizedError.html +153 -0
  154. data/docs/Tasker/Authorization.html +582 -0
  155. data/docs/Tasker/CacheCapabilities.html +167 -0
  156. data/docs/Tasker/CacheStrategy.html +1297 -0
  157. data/docs/Tasker/Concerns/Authenticatable.html +116 -0
  158. data/docs/Tasker/Concerns/Authorizable/AdminStatusChecker.html +256 -0
  159. data/docs/Tasker/Concerns/Authorizable.html +816 -0
  160. data/docs/Tasker/Concerns/ControllerAuthorizable.html +157 -0
  161. data/docs/Tasker/Concerns/EventPublisher.html +4023 -0
  162. data/docs/Tasker/Concerns/IdempotentStateTransitions.html +806 -0
  163. data/docs/Tasker/Concerns/LifecycleEventHelpers.html +129 -0
  164. data/docs/Tasker/Concerns/OrchestrationPublisher.html +129 -0
  165. data/docs/Tasker/Concerns/StateMachineBase/ClassMethods.html +1075 -0
  166. data/docs/Tasker/Concerns/StateMachineBase/StateMachineBase/ClassMethods.html +191 -0
  167. data/docs/Tasker/Concerns/StateMachineBase/StateMachineBase.html +126 -0
  168. data/docs/Tasker/Concerns/StateMachineBase.html +153 -0
  169. data/docs/Tasker/Concerns/StructuredLogging.html +1413 -0
  170. data/docs/Tasker/Concerns.html +117 -0
  171. data/docs/Tasker/Configuration/AuthConfiguration.html +1023 -0
  172. data/docs/Tasker/Configuration/ConfigurationProxy.html +581 -0
  173. data/docs/Tasker/Configuration/DatabaseConfiguration.html +475 -0
  174. data/docs/Tasker/Configuration/EngineConfiguration.html +1265 -0
  175. data/docs/Tasker/Configuration/HealthConfiguration.html +791 -0
  176. data/docs/Tasker/Configuration/TelemetryConfiguration.html +1308 -0
  177. data/docs/Tasker/Configuration/TelemetryConfigurationProxy.html +388 -0
  178. data/docs/Tasker/Configuration.html +1669 -0
  179. data/docs/Tasker/ConfigurationError.html +143 -0
  180. data/docs/Tasker/ConfiguredTask.html +514 -0
  181. data/docs/Tasker/Constants/EventDefinitions.html +590 -0
  182. data/docs/Tasker/Constants/LifecycleEvents.html +137 -0
  183. data/docs/Tasker/Constants/ObservabilityEvents/Step.html +152 -0
  184. data/docs/Tasker/Constants/ObservabilityEvents/Task.html +142 -0
  185. data/docs/Tasker/Constants/ObservabilityEvents.html +126 -0
  186. data/docs/Tasker/Constants/RegistryEvents.html +285 -0
  187. data/docs/Tasker/Constants/StepEvents.html +177 -0
  188. data/docs/Tasker/Constants/TaskEvents.html +167 -0
  189. data/docs/Tasker/Constants/TaskExecution/ExecutionStatus.html +207 -0
  190. data/docs/Tasker/Constants/TaskExecution/HealthStatus.html +191 -0
  191. data/docs/Tasker/Constants/TaskExecution/RecommendedAction.html +207 -0
  192. data/docs/Tasker/Constants/TaskExecution.html +126 -0
  193. data/docs/Tasker/Constants/TaskFinalization/ErrorMessages.html +132 -0
  194. data/docs/Tasker/Constants/TaskFinalization/PendingReasons.html +207 -0
  195. data/docs/Tasker/Constants/TaskFinalization/ReenqueueReasons.html +239 -0
  196. data/docs/Tasker/Constants/TaskFinalization.html +126 -0
  197. data/docs/Tasker/Constants/TaskStatuses.html +223 -0
  198. data/docs/Tasker/Constants/TestEvents.html +163 -0
  199. data/docs/Tasker/Constants/WorkflowEvents.html +222 -0
  200. data/docs/Tasker/Constants/WorkflowStepStatuses.html +223 -0
  201. data/docs/Tasker/Constants.html +561 -0
  202. data/docs/Tasker/DependentSystem.html +137 -0
  203. data/docs/Tasker/DependentSystemObjectMap.html +250 -0
  204. data/docs/Tasker/DetectorRegistry.html +598 -0
  205. data/docs/Tasker/Diagram/Edge.html +1191 -0
  206. data/docs/Tasker/Diagram/Flowchart.html +1539 -0
  207. data/docs/Tasker/Diagram/Node.html +1165 -0
  208. data/docs/Tasker/Diagram.html +117 -0
  209. data/docs/Tasker/Engine.html +215 -0
  210. data/docs/Tasker/Error.html +139 -0
  211. data/docs/Tasker/Events/Bus.html +1226 -0
  212. data/docs/Tasker/Events/Catalog/CatalogPrinter.html +258 -0
  213. data/docs/Tasker/Events/Catalog/CustomEventRegistrar.html +276 -0
  214. data/docs/Tasker/Events/Catalog/ExamplePayloadGenerator.html +294 -0
  215. data/docs/Tasker/Events/Catalog.html +1291 -0
  216. data/docs/Tasker/Events/CustomRegistry.html +943 -0
  217. data/docs/Tasker/Events/DefinitionLoader.html +575 -0
  218. data/docs/Tasker/Events/EventPayloadBuilder/ErrorInfoExtractor.html +286 -0
  219. data/docs/Tasker/Events/EventPayloadBuilder/StepPayloadBuilder.html +312 -0
  220. data/docs/Tasker/Events/EventPayloadBuilder.html +664 -0
  221. data/docs/Tasker/Events/Publisher.html +365 -0
  222. data/docs/Tasker/Events/Subscribers/BaseSubscriber/ErrorCategorizer/ErrorTypeClassifier.html +1128 -0
  223. data/docs/Tasker/Events/Subscribers/BaseSubscriber/ErrorCategorizer.html +270 -0
  224. data/docs/Tasker/Events/Subscribers/BaseSubscriber/MetricTagsExtractor.html +266 -0
  225. data/docs/Tasker/Events/Subscribers/BaseSubscriber.html +2556 -0
  226. data/docs/Tasker/Events/Subscribers/MetricsSubscriber.html +723 -0
  227. data/docs/Tasker/Events/Subscribers/TelemetrySubscriber.html +2251 -0
  228. data/docs/Tasker/Events/Subscribers.html +117 -0
  229. data/docs/Tasker/Events/SubscriptionLoader.html +493 -0
  230. data/docs/Tasker/Events.html +294 -0
  231. data/docs/Tasker/EventsGenerator.html +459 -0
  232. data/docs/Tasker/Functions/FunctionBasedAnalyticsMetrics/AnalyticsMetrics.html +135 -0
  233. data/docs/Tasker/Functions/FunctionBasedAnalyticsMetrics.html +412 -0
  234. data/docs/Tasker/Functions/FunctionBasedDependencyLevels.html +598 -0
  235. data/docs/Tasker/Functions/FunctionBasedSlowestSteps/SlowestStep.html +135 -0
  236. data/docs/Tasker/Functions/FunctionBasedSlowestSteps.html +453 -0
  237. data/docs/Tasker/Functions/FunctionBasedSlowestTasks/SlowestTask.html +135 -0
  238. data/docs/Tasker/Functions/FunctionBasedSlowestTasks.html +453 -0
  239. data/docs/Tasker/Functions/FunctionBasedStepReadinessStatus.html +1457 -0
  240. data/docs/Tasker/Functions/FunctionBasedSystemHealthCounts/HealthMetrics.html +135 -0
  241. data/docs/Tasker/Functions/FunctionBasedSystemHealthCounts.html +370 -0
  242. data/docs/Tasker/Functions/FunctionBasedTaskExecutionContext.html +1250 -0
  243. data/docs/Tasker/Functions/FunctionWrapper.html +479 -0
  244. data/docs/Tasker/Functions.html +117 -0
  245. data/docs/Tasker/Generators/AuthenticatorGenerator/UsageInstructionsFormatter.html +244 -0
  246. data/docs/Tasker/Generators/AuthenticatorGenerator.html +373 -0
  247. data/docs/Tasker/Generators/AuthorizationCoordinatorGenerator.html +430 -0
  248. data/docs/Tasker/Generators/SubscriberGenerator.html +377 -0
  249. data/docs/Tasker/Generators/TaskHandlerGenerator.html +263 -0
  250. data/docs/Tasker/Generators.html +117 -0
  251. data/docs/Tasker/GraphQLTypes/AnnotationType.html +132 -0
  252. data/docs/Tasker/GraphQLTypes/BaseArgument.html +124 -0
  253. data/docs/Tasker/GraphQLTypes/BaseConnection.html +124 -0
  254. data/docs/Tasker/GraphQLTypes/BaseEdge.html +130 -0
  255. data/docs/Tasker/GraphQLTypes/BaseEnum.html +124 -0
  256. data/docs/Tasker/GraphQLTypes/BaseField.html +124 -0
  257. data/docs/Tasker/GraphQLTypes/BaseInputObject.html +124 -0
  258. data/docs/Tasker/GraphQLTypes/BaseInterface.html +116 -0
  259. data/docs/Tasker/GraphQLTypes/BaseObject.html +128 -0
  260. data/docs/Tasker/GraphQLTypes/BaseScalar.html +124 -0
  261. data/docs/Tasker/GraphQLTypes/BaseUnion.html +124 -0
  262. data/docs/Tasker/GraphQLTypes/DependentSystemObjectMapType.html +132 -0
  263. data/docs/Tasker/GraphQLTypes/DependentSystemType.html +132 -0
  264. data/docs/Tasker/GraphQLTypes/MutationType.html +132 -0
  265. data/docs/Tasker/GraphQLTypes/NamedStepType.html +132 -0
  266. data/docs/Tasker/GraphQLTypes/NamedTaskType.html +132 -0
  267. data/docs/Tasker/GraphQLTypes/NamedTasksNamedStepType.html +132 -0
  268. data/docs/Tasker/GraphQLTypes/NodeType.html +118 -0
  269. data/docs/Tasker/GraphQLTypes/QueryType.html +139 -0
  270. data/docs/Tasker/GraphQLTypes/TaskAnnotationType.html +132 -0
  271. data/docs/Tasker/GraphQLTypes/TaskInterface.html +111 -0
  272. data/docs/Tasker/GraphQLTypes/TaskType.html +201 -0
  273. data/docs/Tasker/GraphQLTypes/WorkflowStepType.html +694 -0
  274. data/docs/Tasker/GraphQLTypes.html +130 -0
  275. data/docs/Tasker/GraphqlController.html +251 -0
  276. data/docs/Tasker/HandlerFactory.html +1518 -0
  277. data/docs/Tasker/HandlerSerializer.html +682 -0
  278. data/docs/Tasker/HandlersController.html +574 -0
  279. data/docs/Tasker/HashIdentityStrategy.html +278 -0
  280. data/docs/Tasker/Health/ReadinessChecker.html +712 -0
  281. data/docs/Tasker/Health/StatusChecker.html +653 -0
  282. data/docs/Tasker/Health.html +117 -0
  283. data/docs/Tasker/HealthController.html +523 -0
  284. data/docs/Tasker/IdentityStrategy.html +276 -0
  285. data/docs/Tasker/InvalidTaskHandlerConfig.html +135 -0
  286. data/docs/Tasker/LifecycleEvents/Events/Step.html +162 -0
  287. data/docs/Tasker/LifecycleEvents/Events/Task.html +162 -0
  288. data/docs/Tasker/LifecycleEvents/Events.html +204 -0
  289. data/docs/Tasker/LifecycleEvents/Publisher.html +132 -0
  290. data/docs/Tasker/LifecycleEvents.html +799 -0
  291. data/docs/Tasker/Logging/CorrelationIdGenerator.html +688 -0
  292. data/docs/Tasker/Logging.html +115 -0
  293. data/docs/Tasker/MetricsController.html +293 -0
  294. data/docs/Tasker/MetricsExportJob.html +414 -0
  295. data/docs/Tasker/Mutations/BaseMutation.html +128 -0
  296. data/docs/Tasker/Mutations/CancelStep.html +219 -0
  297. data/docs/Tasker/Mutations/CancelTask.html +221 -0
  298. data/docs/Tasker/Mutations/CreateTask.html +243 -0
  299. data/docs/Tasker/Mutations/UpdateStep.html +243 -0
  300. data/docs/Tasker/Mutations/UpdateTask.html +243 -0
  301. data/docs/Tasker/Mutations.html +117 -0
  302. data/docs/Tasker/NamedStep.html +216 -0
  303. data/docs/Tasker/NamedTask.html +910 -0
  304. data/docs/Tasker/NamedTasksNamedStep.html +435 -0
  305. data/docs/Tasker/Orchestration/BackoffCalculator.html +404 -0
  306. data/docs/Tasker/Orchestration/ConnectionBuilder/ConfigValidator.html +258 -0
  307. data/docs/Tasker/Orchestration/ConnectionBuilder.html +435 -0
  308. data/docs/Tasker/Orchestration/ConnectionPoolIntelligence.html +513 -0
  309. data/docs/Tasker/Orchestration/Coordinator.html +641 -0
  310. data/docs/Tasker/Orchestration/FutureStateAnalyzer.html +1045 -0
  311. data/docs/Tasker/Orchestration/Orchestrator.html +679 -0
  312. data/docs/Tasker/Orchestration/PluginIntegration.html +1127 -0
  313. data/docs/Tasker/Orchestration/ResponseProcessor.html +504 -0
  314. data/docs/Tasker/Orchestration/RetryHeaderParser.html +304 -0
  315. data/docs/Tasker/Orchestration/StepExecutor.html +995 -0
  316. data/docs/Tasker/Orchestration/StepSequenceFactory.html +644 -0
  317. data/docs/Tasker/Orchestration/TaskFinalizer/BlockageChecker.html +264 -0
  318. data/docs/Tasker/Orchestration/TaskFinalizer/ContextManager.html +254 -0
  319. data/docs/Tasker/Orchestration/TaskFinalizer/DelayCalculator.html +556 -0
  320. data/docs/Tasker/Orchestration/TaskFinalizer/FinalizationDecisionMaker.html +348 -0
  321. data/docs/Tasker/Orchestration/TaskFinalizer/FinalizationProcessor.html +286 -0
  322. data/docs/Tasker/Orchestration/TaskFinalizer/ReasonDeterminer.html +432 -0
  323. data/docs/Tasker/Orchestration/TaskFinalizer/ReenqueueManager.html +296 -0
  324. data/docs/Tasker/Orchestration/TaskFinalizer/UnclearStateHandler.html +314 -0
  325. data/docs/Tasker/Orchestration/TaskFinalizer.html +1212 -0
  326. data/docs/Tasker/Orchestration/TaskInitializer.html +766 -0
  327. data/docs/Tasker/Orchestration/TaskReenqueuer.html +506 -0
  328. data/docs/Tasker/Orchestration/ViableStepDiscovery.html +442 -0
  329. data/docs/Tasker/Orchestration/WorkflowCoordinator.html +510 -0
  330. data/docs/Tasker/Orchestration.html +130 -0
  331. data/docs/Tasker/PageSort/PageSortParamsBuilder.html +296 -0
  332. data/docs/Tasker/PageSort.html +247 -0
  333. data/docs/Tasker/PermanentError.html +518 -0
  334. data/docs/Tasker/ProceduralError.html +147 -0
  335. data/docs/Tasker/Queries/AllAnnotationTypes.html +217 -0
  336. data/docs/Tasker/Queries/AllTasks.html +221 -0
  337. data/docs/Tasker/Queries/BaseQuery.html +128 -0
  338. data/docs/Tasker/Queries/Helpers.html +187 -0
  339. data/docs/Tasker/Queries/OneStep.html +225 -0
  340. data/docs/Tasker/Queries/OneTask.html +217 -0
  341. data/docs/Tasker/Queries/TasksByAnnotation.html +231 -0
  342. data/docs/Tasker/Queries/TasksByStatus.html +233 -0
  343. data/docs/Tasker/Queries.html +119 -0
  344. data/docs/Tasker/Railtie.html +124 -0
  345. data/docs/Tasker/Registry/BaseRegistry.html +1690 -0
  346. data/docs/Tasker/Registry/EventPublisher.html +667 -0
  347. data/docs/Tasker/Registry/InterfaceValidator.html +569 -0
  348. data/docs/Tasker/Registry/RegistrationError.html +132 -0
  349. data/docs/Tasker/Registry/RegistryError.html +139 -0
  350. data/docs/Tasker/Registry/StatisticsCollector.html +841 -0
  351. data/docs/Tasker/Registry/SubscriberRegistry.html +1504 -0
  352. data/docs/Tasker/Registry/ValidationError.html +132 -0
  353. data/docs/Tasker/Registry.html +119 -0
  354. data/docs/Tasker/RetryableError.html +515 -0
  355. data/docs/Tasker/StateMachine/Compatibility.html +282 -0
  356. data/docs/Tasker/StateMachine/InvalidStateTransition.html +135 -0
  357. data/docs/Tasker/StateMachine/StepStateMachine/StandardizedPayloadBuilder.html +260 -0
  358. data/docs/Tasker/StateMachine/StepStateMachine.html +2215 -0
  359. data/docs/Tasker/StateMachine/TaskStateMachine.html +734 -0
  360. data/docs/Tasker/StateMachine.html +602 -0
  361. data/docs/Tasker/StepDagRelationship.html +657 -0
  362. data/docs/Tasker/StepHandler/Api/Config.html +1091 -0
  363. data/docs/Tasker/StepHandler/Api.html +884 -0
  364. data/docs/Tasker/StepHandler/AutomaticEventPublishing.html +321 -0
  365. data/docs/Tasker/StepHandler/Base.html +970 -0
  366. data/docs/Tasker/StepHandler.html +119 -0
  367. data/docs/Tasker/StepReadinessStatus.html +836 -0
  368. data/docs/Tasker/Task.html +2575 -0
  369. data/docs/Tasker/TaskAnnotation.html +137 -0
  370. data/docs/Tasker/TaskAnnotationSerializer.html +124 -0
  371. data/docs/Tasker/TaskBuilder/StepNameValidator.html +264 -0
  372. data/docs/Tasker/TaskBuilder/StepTemplateDefiner.html +264 -0
  373. data/docs/Tasker/TaskBuilder.html +764 -0
  374. data/docs/Tasker/TaskDiagram/StepToStepEdgeBuilder.html +260 -0
  375. data/docs/Tasker/TaskDiagram/TaskToRootStepEdgeBuilder.html +290 -0
  376. data/docs/Tasker/TaskDiagram.html +548 -0
  377. data/docs/Tasker/TaskDiagramsController.html +240 -0
  378. data/docs/Tasker/TaskExecutionContext.html +469 -0
  379. data/docs/Tasker/TaskHandler/ClassMethods/StepTemplateDefiner/ClassBasedEventRegistrar.html +238 -0
  380. data/docs/Tasker/TaskHandler/ClassMethods/StepTemplateDefiner/YamlEventRegistrar.html +254 -0
  381. data/docs/Tasker/TaskHandler/ClassMethods/StepTemplateDefiner.html +988 -0
  382. data/docs/Tasker/TaskHandler/ClassMethods.html +357 -0
  383. data/docs/Tasker/TaskHandler/InstanceMethods.html +1396 -0
  384. data/docs/Tasker/TaskHandler/StepGroup.html +1748 -0
  385. data/docs/Tasker/TaskHandler.html +271 -0
  386. data/docs/Tasker/TaskNamespace.html +312 -0
  387. data/docs/Tasker/TaskRunnerJob.html +406 -0
  388. data/docs/Tasker/TaskSerializer.html +474 -0
  389. data/docs/Tasker/TaskTransition.html +1517 -0
  390. data/docs/Tasker/TaskWorkflowSummary.html +988 -0
  391. data/docs/Tasker/TaskerRailsSchema/InvalidObjectTypeError.html +132 -0
  392. data/docs/Tasker/TaskerRailsSchema/TypeResolutionError.html +139 -0
  393. data/docs/Tasker/TaskerRailsSchema/UnknownInterfaceError.html +132 -0
  394. data/docs/Tasker/TaskerRailsSchema.html +384 -0
  395. data/docs/Tasker/TasksController.html +595 -0
  396. data/docs/Tasker/Telemetry/EventMapping.html +1307 -0
  397. data/docs/Tasker/Telemetry/EventRouter.html +2178 -0
  398. data/docs/Tasker/Telemetry/Events/ExportEvents.html +246 -0
  399. data/docs/Tasker/Telemetry/Events.html +115 -0
  400. data/docs/Tasker/Telemetry/ExportCoordinator/DistributedLockTimeoutError.html +135 -0
  401. data/docs/Tasker/Telemetry/ExportCoordinator.html +2137 -0
  402. data/docs/Tasker/Telemetry/IntelligentCacheManager.html +1083 -0
  403. data/docs/Tasker/Telemetry/LogBackend.html +1088 -0
  404. data/docs/Tasker/Telemetry/MetricTypes/Counter.html +1054 -0
  405. data/docs/Tasker/Telemetry/MetricTypes/Gauge.html +1270 -0
  406. data/docs/Tasker/Telemetry/MetricTypes/Histogram.html +1492 -0
  407. data/docs/Tasker/Telemetry/MetricTypes.html +153 -0
  408. data/docs/Tasker/Telemetry/MetricsBackend.html +2510 -0
  409. data/docs/Tasker/Telemetry/MetricsExportService.html +578 -0
  410. data/docs/Tasker/Telemetry/PluginRegistry.html +1774 -0
  411. data/docs/Tasker/Telemetry/Plugins/BaseExporter.html +1835 -0
  412. data/docs/Tasker/Telemetry/Plugins/CsvExporter.html +768 -0
  413. data/docs/Tasker/Telemetry/Plugins/JsonExporter.html +747 -0
  414. data/docs/Tasker/Telemetry/Plugins.html +117 -0
  415. data/docs/Tasker/Telemetry/PrometheusExporter.html +481 -0
  416. data/docs/Tasker/Telemetry/TraceBackend.html +891 -0
  417. data/docs/Tasker/Telemetry.html +130 -0
  418. data/docs/Tasker/Types/AuthConfig.html +886 -0
  419. data/docs/Tasker/Types/BackoffConfig.html +1063 -0
  420. data/docs/Tasker/Types/BaseConfig.html +227 -0
  421. data/docs/Tasker/Types/CacheConfig.html +1731 -0
  422. data/docs/Tasker/Types/DatabaseConfig.html +388 -0
  423. data/docs/Tasker/Types/DependencyGraph.html +526 -0
  424. data/docs/Tasker/Types/DependencyGraphConfig.html +753 -0
  425. data/docs/Tasker/Types/EngineConfig.html +1181 -0
  426. data/docs/Tasker/Types/ExecutionConfig.html +1963 -0
  427. data/docs/Tasker/Types/GraphEdge.html +517 -0
  428. data/docs/Tasker/Types/GraphMetadata.html +781 -0
  429. data/docs/Tasker/Types/GraphNode.html +694 -0
  430. data/docs/Tasker/Types/HealthConfig.html +784 -0
  431. data/docs/Tasker/Types/StepSequence.html +353 -0
  432. data/docs/Tasker/Types/StepTemplate.html +1193 -0
  433. data/docs/Tasker/Types/TaskRequest.html +1179 -0
  434. data/docs/Tasker/Types/TelemetryConfig.html +2746 -0
  435. data/docs/Tasker/Types.html +154 -0
  436. data/docs/Tasker/WorkflowStep/StepFinder.html +282 -0
  437. data/docs/Tasker/WorkflowStep.html +2724 -0
  438. data/docs/Tasker/WorkflowStepEdge.html +304 -0
  439. data/docs/Tasker/WorkflowStepSerializer.html +305 -0
  440. data/docs/Tasker/WorkflowStepTransition/TransitionDescriptionFormatter.html +282 -0
  441. data/docs/Tasker/WorkflowStepTransition.html +2201 -0
  442. data/docs/Tasker/WorkflowStepsController.html +462 -0
  443. data/docs/Tasker.html +452 -0
  444. data/docs/VISION.md +584 -0
  445. data/docs/WHY.md +21 -0
  446. data/docs/_index.html +2375 -0
  447. data/docs/class_list.html +54 -0
  448. data/docs/css/common.css +1 -0
  449. data/docs/css/full_list.css +58 -0
  450. data/docs/css/style.css +503 -0
  451. data/docs/events/migration_plan_outcomes.md +80 -0
  452. data/docs/file.README.html +541 -0
  453. data/docs/file_list.html +59 -0
  454. data/docs/frames.html +22 -0
  455. data/docs/index.html +541 -0
  456. data/docs/js/app.js +344 -0
  457. data/docs/js/full_list.js +242 -0
  458. data/docs/js/jquery.js +4 -0
  459. data/docs/method_list.html +9182 -0
  460. data/docs/top-level-namespace.html +110 -0
  461. data/lib/generators/tasker/authenticator_generator.rb +301 -0
  462. data/lib/generators/tasker/authorization_coordinator_generator.rb +139 -0
  463. data/lib/generators/tasker/events_generator.rb +91 -0
  464. data/lib/generators/tasker/subscriber_generator.rb +107 -0
  465. data/lib/generators/tasker/task_handler_generator.rb +138 -0
  466. data/lib/generators/tasker/templates/api_token_authenticator.rb.erb +113 -0
  467. data/lib/generators/tasker/templates/api_token_authenticator_spec.rb.erb +144 -0
  468. data/lib/generators/tasker/templates/authorization_coordinator.rb.erb +95 -0
  469. data/lib/generators/tasker/templates/authorization_coordinator_spec.rb.erb +142 -0
  470. data/lib/generators/tasker/templates/custom_authenticator.rb.erb +108 -0
  471. data/lib/generators/tasker/templates/custom_authenticator_spec.rb.erb +162 -0
  472. data/lib/generators/tasker/templates/custom_events.yml.erb +62 -0
  473. data/lib/generators/tasker/templates/custom_subscriber.rb.erb +72 -0
  474. data/lib/generators/tasker/templates/devise_authenticator.rb.erb +101 -0
  475. data/lib/generators/tasker/templates/devise_authenticator_spec.rb.erb +126 -0
  476. data/lib/generators/tasker/templates/initialize.rb.erb +202 -0
  477. data/lib/generators/tasker/templates/jwt_authenticator.rb.erb +144 -0
  478. data/lib/generators/tasker/templates/jwt_authenticator_spec.rb.erb +298 -0
  479. data/lib/generators/tasker/templates/metrics_subscriber.rb.erb +258 -0
  480. data/lib/generators/tasker/templates/metrics_subscriber_spec.rb.erb +308 -0
  481. data/lib/generators/tasker/templates/omniauth_authenticator.rb.erb +135 -0
  482. data/lib/generators/tasker/templates/omniauth_authenticator_spec.rb.erb +196 -0
  483. data/lib/generators/tasker/templates/opentelemetry_initializer.rb +52 -0
  484. data/lib/generators/tasker/templates/subscriber.rb.erb +64 -0
  485. data/lib/generators/tasker/templates/subscriber_spec.rb.erb +80 -0
  486. data/lib/generators/tasker/templates/task_config.yaml.erb +117 -0
  487. data/lib/generators/tasker/templates/task_handler.rb.erb +59 -0
  488. data/lib/generators/tasker/templates/task_handler_spec.rb.erb +159 -0
  489. data/lib/tasker/analysis/runtime_graph_analyzer.rb +1168 -0
  490. data/lib/tasker/analysis/template_graph_analyzer.rb +328 -0
  491. data/lib/tasker/authentication/coordinator.rb +78 -0
  492. data/lib/tasker/authentication/errors.rb +9 -0
  493. data/lib/tasker/authentication/interface.rb +36 -0
  494. data/lib/tasker/authentication/none_authenticator.rb +26 -0
  495. data/lib/tasker/authorization/base_coordinator.rb +112 -0
  496. data/lib/tasker/authorization/errors.rb +26 -0
  497. data/lib/tasker/authorization/resource_constants.rb +74 -0
  498. data/lib/tasker/authorization/resource_registry.rb +143 -0
  499. data/lib/tasker/authorization.rb +75 -0
  500. data/lib/tasker/cache_capabilities.rb +131 -0
  501. data/lib/tasker/cache_strategy.rb +469 -0
  502. data/lib/tasker/concerns/authenticatable.rb +41 -0
  503. data/lib/tasker/concerns/authorizable.rb +204 -0
  504. data/lib/tasker/concerns/controller_authorizable.rb +124 -0
  505. data/lib/tasker/concerns/event_publisher.rb +716 -0
  506. data/lib/tasker/concerns/idempotent_state_transitions.rb +128 -0
  507. data/lib/tasker/concerns/state_machine_base.rb +218 -0
  508. data/lib/tasker/concerns/structured_logging.rb +387 -0
  509. data/lib/tasker/configuration.rb +325 -0
  510. data/lib/tasker/constants/event_definitions.rb +147 -0
  511. data/lib/tasker/constants/registry_events.rb +54 -0
  512. data/lib/tasker/constants.rb +417 -0
  513. data/lib/tasker/engine.rb +90 -0
  514. data/lib/tasker/errors.rb +90 -0
  515. data/lib/tasker/events/catalog.rb +432 -0
  516. data/lib/tasker/events/custom_registry.rb +175 -0
  517. data/lib/tasker/events/definition_loader.rb +199 -0
  518. data/lib/tasker/events/event_payload_builder.rb +461 -0
  519. data/lib/tasker/events/publisher.rb +149 -0
  520. data/lib/tasker/events/subscribers/base_subscriber.rb +601 -0
  521. data/lib/tasker/events/subscribers/metrics_subscriber.rb +120 -0
  522. data/lib/tasker/events/subscribers/telemetry_subscriber.rb +462 -0
  523. data/lib/tasker/events/subscription_loader.rb +161 -0
  524. data/lib/tasker/events.rb +37 -0
  525. data/lib/tasker/functions/function_based_analytics_metrics.rb +103 -0
  526. data/lib/tasker/functions/function_based_dependency_levels.rb +54 -0
  527. data/lib/tasker/functions/function_based_slowest_steps.rb +84 -0
  528. data/lib/tasker/functions/function_based_slowest_tasks.rb +84 -0
  529. data/lib/tasker/functions/function_based_step_readiness_status.rb +183 -0
  530. data/lib/tasker/functions/function_based_system_health_counts.rb +94 -0
  531. data/lib/tasker/functions/function_based_task_execution_context.rb +148 -0
  532. data/lib/tasker/functions/function_wrapper.rb +42 -0
  533. data/lib/tasker/functions.rb +12 -0
  534. data/lib/tasker/handler_factory.rb +322 -0
  535. data/lib/tasker/health/readiness_checker.rb +186 -0
  536. data/lib/tasker/health/status_checker.rb +203 -0
  537. data/lib/tasker/identity_strategy.rb +38 -0
  538. data/lib/tasker/logging/correlation_id_generator.rb +120 -0
  539. data/lib/tasker/orchestration/backoff_calculator.rb +184 -0
  540. data/lib/tasker/orchestration/connection_builder.rb +122 -0
  541. data/lib/tasker/orchestration/connection_pool_intelligence.rb +177 -0
  542. data/lib/tasker/orchestration/coordinator.rb +119 -0
  543. data/lib/tasker/orchestration/future_state_analyzer.rb +137 -0
  544. data/lib/tasker/orchestration/plugin_integration.rb +124 -0
  545. data/lib/tasker/orchestration/response_processor.rb +168 -0
  546. data/lib/tasker/orchestration/retry_header_parser.rb +78 -0
  547. data/lib/tasker/orchestration/step_executor.rb +941 -0
  548. data/lib/tasker/orchestration/step_sequence_factory.rb +67 -0
  549. data/lib/tasker/orchestration/task_finalizer.rb +564 -0
  550. data/lib/tasker/orchestration/task_initializer.rb +140 -0
  551. data/lib/tasker/orchestration/task_reenqueuer.rb +71 -0
  552. data/lib/tasker/orchestration/viable_step_discovery.rb +65 -0
  553. data/lib/tasker/orchestration/workflow_coordinator.rb +294 -0
  554. data/lib/tasker/orchestration.rb +45 -0
  555. data/lib/tasker/railtie.rb +9 -0
  556. data/lib/tasker/registry/base_registry.rb +177 -0
  557. data/lib/tasker/registry/event_publisher.rb +91 -0
  558. data/lib/tasker/registry/interface_validator.rb +140 -0
  559. data/lib/tasker/registry/statistics_collector.rb +381 -0
  560. data/lib/tasker/registry/subscriber_registry.rb +285 -0
  561. data/lib/tasker/registry.rb +22 -0
  562. data/lib/tasker/state_machine/step_state_machine.rb +508 -0
  563. data/lib/tasker/state_machine/task_state_machine.rb +192 -0
  564. data/lib/tasker/state_machine.rb +83 -0
  565. data/lib/tasker/step_handler/api.rb +410 -0
  566. data/lib/tasker/step_handler/base.rb +206 -0
  567. data/lib/tasker/task_builder.rb +432 -0
  568. data/lib/tasker/task_handler/class_methods.rb +324 -0
  569. data/lib/tasker/task_handler/instance_methods.rb +293 -0
  570. data/lib/tasker/task_handler/step_group.rb +182 -0
  571. data/lib/tasker/task_handler.rb +43 -0
  572. data/lib/tasker/telemetry/event_mapping.rb +126 -0
  573. data/lib/tasker/telemetry/event_router.rb +318 -0
  574. data/lib/tasker/telemetry/events/export_events.rb +38 -0
  575. data/lib/tasker/telemetry/export_coordinator.rb +497 -0
  576. data/lib/tasker/telemetry/intelligent_cache_manager.rb +508 -0
  577. data/lib/tasker/telemetry/log_backend.rb +224 -0
  578. data/lib/tasker/telemetry/metric_types.rb +368 -0
  579. data/lib/tasker/telemetry/metrics_backend.rb +1227 -0
  580. data/lib/tasker/telemetry/metrics_export_service.rb +392 -0
  581. data/lib/tasker/telemetry/plugin_registry.rb +333 -0
  582. data/lib/tasker/telemetry/plugins/base_exporter.rb +246 -0
  583. data/lib/tasker/telemetry/plugins/csv_exporter.rb +198 -0
  584. data/lib/tasker/telemetry/plugins/json_exporter.rb +141 -0
  585. data/lib/tasker/telemetry/prometheus_exporter.rb +249 -0
  586. data/lib/tasker/telemetry/trace_backend.rb +186 -0
  587. data/lib/tasker/telemetry.rb +59 -0
  588. data/lib/tasker/types/auth_config.rb +81 -0
  589. data/lib/tasker/types/backoff_config.rb +142 -0
  590. data/lib/tasker/types/cache_config.rb +257 -0
  591. data/lib/tasker/types/database_config.rb +39 -0
  592. data/lib/tasker/types/dependency_graph.rb +225 -0
  593. data/lib/tasker/types/dependency_graph_config.rb +149 -0
  594. data/lib/tasker/types/engine_config.rb +131 -0
  595. data/lib/tasker/types/execution_config.rb +289 -0
  596. data/lib/tasker/types/health_config.rb +84 -0
  597. data/lib/tasker/types/step_sequence.rb +24 -0
  598. data/lib/tasker/types/step_template.rb +63 -0
  599. data/lib/tasker/types/task_request.rb +60 -0
  600. data/lib/tasker/types/telemetry_config.rb +273 -0
  601. data/lib/tasker/types.rb +64 -0
  602. data/lib/tasker/version.rb +7 -0
  603. data/lib/tasker.rb +82 -0
  604. data/lib/tasks/tasker_tasks.rake +302 -0
  605. metadata +958 -0
@@ -0,0 +1,1539 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>
7
+ Class: Tasker::Diagram::Flowchart
8
+
9
+ &mdash; Documentation by YARD 0.9.37
10
+
11
+ </title>
12
+
13
+ <link rel="stylesheet" href="../../css/style.css" type="text/css" />
14
+
15
+ <link rel="stylesheet" href="../../css/common.css" type="text/css" />
16
+
17
+ <script type="text/javascript">
18
+ pathId = "Tasker::Diagram::Flowchart";
19
+ relpath = '../../';
20
+ </script>
21
+
22
+
23
+ <script type="text/javascript" charset="utf-8" src="../../js/jquery.js"></script>
24
+
25
+ <script type="text/javascript" charset="utf-8" src="../../js/app.js"></script>
26
+
27
+
28
+ </head>
29
+ <body>
30
+ <div class="nav_wrap">
31
+ <iframe id="nav" src="../../class_list.html?1"></iframe>
32
+ <div id="resizer"></div>
33
+ </div>
34
+
35
+ <div id="main" tabindex="-1">
36
+ <div id="header">
37
+ <div id="menu">
38
+
39
+ <a href="../../_index.html">Index (F)</a> &raquo;
40
+ <span class='title'><span class='object_link'><a href="../../Tasker.html" title="Tasker (module)">Tasker</a></span></span> &raquo; <span class='title'><span class='object_link'><a href="../Diagram.html" title="Tasker::Diagram (module)">Diagram</a></span></span>
41
+ &raquo;
42
+ <span class="title">Flowchart</span>
43
+
44
+ </div>
45
+
46
+ <div id="search">
47
+
48
+ <a class="full_list_link" id="class_list_link"
49
+ href="../../class_list.html">
50
+
51
+ <svg width="24" height="24">
52
+ <rect x="0" y="4" width="24" height="4" rx="1" ry="1"></rect>
53
+ <rect x="0" y="12" width="24" height="4" rx="1" ry="1"></rect>
54
+ <rect x="0" y="20" width="24" height="4" rx="1" ry="1"></rect>
55
+ </svg>
56
+ </a>
57
+
58
+ </div>
59
+ <div class="clear"></div>
60
+ </div>
61
+
62
+ <div id="content"><h1>Class: Tasker::Diagram::Flowchart
63
+
64
+
65
+
66
+ </h1>
67
+ <div class="box_info">
68
+
69
+ <dl>
70
+ <dt>Inherits:</dt>
71
+ <dd>
72
+ <span class="inheritName">Object</span>
73
+
74
+ <ul class="fullTree">
75
+ <li>Object</li>
76
+
77
+ <li class="next">Tasker::Diagram::Flowchart</li>
78
+
79
+ </ul>
80
+ <a href="#" class="inheritanceTree">show all</a>
81
+
82
+ </dd>
83
+ </dl>
84
+
85
+
86
+
87
+
88
+
89
+
90
+
91
+
92
+
93
+
94
+
95
+ <dl>
96
+ <dt>Defined in:</dt>
97
+ <dd>app/models/tasker/diagram/flowchart.rb</dd>
98
+ </dl>
99
+
100
+ </div>
101
+
102
+ <h2>Overview</h2><div class="docstring">
103
+ <div class="discussion">
104
+
105
+ <p>Represents a flowchart diagram with nodes and edges</p>
106
+
107
+
108
+ </div>
109
+ </div>
110
+ <div class="tags">
111
+
112
+
113
+ </div>
114
+
115
+
116
+
117
+ <h2>Instance Attribute Summary <small><a href="#" class="summary_toggle">collapse</a></small></h2>
118
+ <ul class="summary">
119
+
120
+ <li class="public ">
121
+ <span class="summary_signature">
122
+
123
+ <a href="#attributes-instance_method" title="#attributes (instance method)">#<strong>attributes</strong> &#x21d2; Hash </a>
124
+
125
+
126
+
127
+ </span>
128
+
129
+
130
+
131
+
132
+
133
+
134
+
135
+
136
+
137
+
138
+
139
+
140
+ <span class="summary_desc"><div class='inline'>
141
+ <p>Additional attributes for the flowchart.</p>
142
+ </div></span>
143
+
144
+ </li>
145
+
146
+
147
+ <li class="public ">
148
+ <span class="summary_signature">
149
+
150
+ <a href="#direction-instance_method" title="#direction (instance method)">#<strong>direction</strong> &#x21d2; String </a>
151
+
152
+
153
+
154
+ </span>
155
+
156
+
157
+
158
+
159
+
160
+
161
+
162
+
163
+
164
+
165
+
166
+
167
+ <span class="summary_desc"><div class='inline'>
168
+ <p>The direction of the flowchart (TD: top-down, LR: left-right, etc.).</p>
169
+ </div></span>
170
+
171
+ </li>
172
+
173
+
174
+ <li class="public ">
175
+ <span class="summary_signature">
176
+
177
+ <a href="#edges-instance_method" title="#edges (instance method)">#<strong>edges</strong> &#x21d2; Array&lt;Tasker::Diagram::Edge&gt; </a>
178
+
179
+
180
+
181
+ </span>
182
+
183
+
184
+
185
+
186
+
187
+
188
+
189
+
190
+
191
+
192
+
193
+
194
+ <span class="summary_desc"><div class='inline'>
195
+ <p>The edges in the flowchart.</p>
196
+ </div></span>
197
+
198
+ </li>
199
+
200
+
201
+ <li class="public ">
202
+ <span class="summary_signature">
203
+
204
+ <a href="#nodes-instance_method" title="#nodes (instance method)">#<strong>nodes</strong> &#x21d2; Array&lt;Tasker::Diagram::Node&gt; </a>
205
+
206
+
207
+
208
+ </span>
209
+
210
+
211
+
212
+
213
+
214
+
215
+
216
+
217
+
218
+
219
+
220
+
221
+ <span class="summary_desc"><div class='inline'>
222
+ <p>The nodes in the flowchart.</p>
223
+ </div></span>
224
+
225
+ </li>
226
+
227
+
228
+ <li class="public ">
229
+ <span class="summary_signature">
230
+
231
+ <a href="#title-instance_method" title="#title (instance method)">#<strong>title</strong> &#x21d2; String </a>
232
+
233
+
234
+
235
+ </span>
236
+
237
+
238
+
239
+
240
+
241
+
242
+
243
+
244
+
245
+
246
+
247
+
248
+ <span class="summary_desc"><div class='inline'>
249
+ <p>The title of the flowchart.</p>
250
+ </div></span>
251
+
252
+ </li>
253
+
254
+
255
+ </ul>
256
+
257
+
258
+
259
+
260
+
261
+ <h2>
262
+ Instance Method Summary
263
+ <small><a href="#" class="summary_toggle">collapse</a></small>
264
+ </h2>
265
+
266
+ <ul class="summary">
267
+
268
+ <li class="public ">
269
+ <span class="summary_signature">
270
+
271
+ <a href="#add_edge-instance_method" title="#add_edge (instance method)">#<strong>add_edge</strong>(edge) &#x21d2; Tasker::Diagram::Edge </a>
272
+
273
+
274
+
275
+ </span>
276
+
277
+
278
+
279
+
280
+
281
+
282
+
283
+
284
+
285
+ <span class="summary_desc"><div class='inline'>
286
+ <p>Add an edge to the flowchart.</p>
287
+ </div></span>
288
+
289
+ </li>
290
+
291
+
292
+ <li class="public ">
293
+ <span class="summary_signature">
294
+
295
+ <a href="#add_node-instance_method" title="#add_node (instance method)">#<strong>add_node</strong>(node) &#x21d2; Tasker::Diagram::Node </a>
296
+
297
+
298
+
299
+ </span>
300
+
301
+
302
+
303
+
304
+
305
+
306
+
307
+
308
+
309
+ <span class="summary_desc"><div class='inline'>
310
+ <p>Add a node to the flowchart.</p>
311
+ </div></span>
312
+
313
+ </li>
314
+
315
+
316
+ <li class="public ">
317
+ <span class="summary_signature">
318
+
319
+ <a href="#find_edges_for_node-instance_method" title="#find_edges_for_node (instance method)">#<strong>find_edges_for_node</strong>(node_id, direction = :both) &#x21d2; Array&lt;Tasker::Diagram::Edge&gt; </a>
320
+
321
+
322
+
323
+ </span>
324
+
325
+
326
+
327
+
328
+
329
+
330
+
331
+
332
+
333
+ <span class="summary_desc"><div class='inline'>
334
+ <p>Find all edges connected to a node.</p>
335
+ </div></span>
336
+
337
+ </li>
338
+
339
+
340
+ <li class="public ">
341
+ <span class="summary_signature">
342
+
343
+ <a href="#find_node-instance_method" title="#find_node (instance method)">#<strong>find_node</strong>(id) &#x21d2; Tasker::Diagram::Node<sup>?</sup> </a>
344
+
345
+
346
+
347
+ </span>
348
+
349
+
350
+
351
+
352
+
353
+
354
+
355
+
356
+
357
+ <span class="summary_desc"><div class='inline'>
358
+ <p>Find a node by its ID.</p>
359
+ </div></span>
360
+
361
+ </li>
362
+
363
+
364
+ <li class="public ">
365
+ <span class="summary_signature">
366
+
367
+ <a href="#initialize-instance_method" title="#initialize (instance method)">#<strong>initialize</strong>(nodes: [], edges: [], direction: &#39;TD&#39;, title: nil, attributes: {}) &#x21d2; Flowchart </a>
368
+
369
+
370
+
371
+ </span>
372
+
373
+
374
+ <span class="note title constructor">constructor</span>
375
+
376
+
377
+
378
+
379
+
380
+
381
+
382
+
383
+ <span class="summary_desc"><div class='inline'>
384
+ <p>Creates a new flowchart diagram.</p>
385
+ </div></span>
386
+
387
+ </li>
388
+
389
+
390
+ <li class="public ">
391
+ <span class="summary_signature">
392
+
393
+ <a href="#to_h-instance_method" title="#to_h (instance method)">#<strong>to_h</strong> &#x21d2; Hash </a>
394
+
395
+
396
+
397
+ </span>
398
+
399
+
400
+
401
+
402
+
403
+
404
+
405
+
406
+
407
+ <span class="summary_desc"><div class='inline'>
408
+ <p>Convert the flowchart to a hash representation.</p>
409
+ </div></span>
410
+
411
+ </li>
412
+
413
+
414
+ <li class="public ">
415
+ <span class="summary_signature">
416
+
417
+ <a href="#to_json-instance_method" title="#to_json (instance method)">#<strong>to_json</strong> &#x21d2; String </a>
418
+
419
+
420
+
421
+ </span>
422
+
423
+
424
+
425
+
426
+
427
+
428
+
429
+
430
+
431
+ <span class="summary_desc"><div class='inline'>
432
+ <p>Convert the flowchart to a JSON string.</p>
433
+ </div></span>
434
+
435
+ </li>
436
+
437
+
438
+ <li class="public ">
439
+ <span class="summary_signature">
440
+
441
+ <a href="#to_mermaid-instance_method" title="#to_mermaid (instance method)">#<strong>to_mermaid</strong> &#x21d2; String </a>
442
+
443
+
444
+
445
+ </span>
446
+
447
+
448
+
449
+
450
+
451
+
452
+
453
+
454
+
455
+ <span class="summary_desc"><div class='inline'>
456
+ <p>Generate Mermaid diagram syntax for this flowchart.</p>
457
+ </div></span>
458
+
459
+ </li>
460
+
461
+
462
+ </ul>
463
+
464
+
465
+ <div id="constructor_details" class="method_details_list">
466
+ <h2>Constructor Details</h2>
467
+
468
+ <div class="method_details first">
469
+ <h3 class="signature first" id="initialize-instance_method">
470
+
471
+ #<strong>initialize</strong>(nodes: [], edges: [], direction: &#39;TD&#39;, title: nil, attributes: {}) &#x21d2; <tt><span class='object_link'><a href="" title="Tasker::Diagram::Flowchart (class)">Flowchart</a></span></tt>
472
+
473
+
474
+
475
+
476
+
477
+ </h3><div class="docstring">
478
+ <div class="discussion">
479
+
480
+ <p>Creates a new flowchart diagram</p>
481
+
482
+
483
+ </div>
484
+ </div>
485
+ <div class="tags">
486
+ <p class="tag_title">Parameters:</p>
487
+ <ul class="param">
488
+
489
+ <li>
490
+
491
+ <span class='name'>nodes</span>
492
+
493
+
494
+ <span class='type'>(<tt>Array&lt;<span class='object_link'><a href="Node.html" title="Tasker::Diagram::Node (class)">Tasker::Diagram::Node</a></span>&gt;</tt>)</span>
495
+
496
+
497
+ <em class="default">(defaults to: <tt>[]</tt>)</em>
498
+
499
+
500
+ &mdash;
501
+ <div class='inline'>
502
+ <p>The nodes in the flowchart</p>
503
+ </div>
504
+
505
+ </li>
506
+
507
+ <li>
508
+
509
+ <span class='name'>edges</span>
510
+
511
+
512
+ <span class='type'>(<tt>Array&lt;<span class='object_link'><a href="Edge.html" title="Tasker::Diagram::Edge (class)">Tasker::Diagram::Edge</a></span>&gt;</tt>)</span>
513
+
514
+
515
+ <em class="default">(defaults to: <tt>[]</tt>)</em>
516
+
517
+
518
+ &mdash;
519
+ <div class='inline'>
520
+ <p>The edges in the flowchart</p>
521
+ </div>
522
+
523
+ </li>
524
+
525
+ <li>
526
+
527
+ <span class='name'>direction</span>
528
+
529
+
530
+ <span class='type'>(<tt>String</tt>)</span>
531
+
532
+
533
+ <em class="default">(defaults to: <tt>&#39;TD&#39;</tt>)</em>
534
+
535
+
536
+ &mdash;
537
+ <div class='inline'>
538
+ <p>The direction of the flowchart (default: ‘TD’)</p>
539
+ </div>
540
+
541
+ </li>
542
+
543
+ <li>
544
+
545
+ <span class='name'>title</span>
546
+
547
+
548
+ <span class='type'>(<tt>String</tt>, <tt>nil</tt>)</span>
549
+
550
+
551
+ <em class="default">(defaults to: <tt>nil</tt>)</em>
552
+
553
+
554
+ &mdash;
555
+ <div class='inline'>
556
+ <p>The title of the flowchart</p>
557
+ </div>
558
+
559
+ </li>
560
+
561
+ <li>
562
+
563
+ <span class='name'>attributes</span>
564
+
565
+
566
+ <span class='type'>(<tt>Hash</tt>)</span>
567
+
568
+
569
+ <em class="default">(defaults to: <tt>{}</tt>)</em>
570
+
571
+
572
+ &mdash;
573
+ <div class='inline'>
574
+ <p>Additional attributes for the flowchart</p>
575
+ </div>
576
+
577
+ </li>
578
+
579
+ </ul>
580
+
581
+
582
+ </div><table class="source_code">
583
+ <tr>
584
+ <td>
585
+ <pre class="lines">
586
+
587
+
588
+ 30
589
+ 31
590
+ 32
591
+ 33
592
+ 34
593
+ 35
594
+ 36</pre>
595
+ </td>
596
+ <td>
597
+ <pre class="code"><span class="info file"># File 'app/models/tasker/diagram/flowchart.rb', line 30</span>
598
+
599
+ <span class='kw'>def</span> <span class='id identifier rubyid_initialize'>initialize</span><span class='lparen'>(</span><span class='label'>nodes:</span> <span class='lbracket'>[</span><span class='rbracket'>]</span><span class='comma'>,</span> <span class='label'>edges:</span> <span class='lbracket'>[</span><span class='rbracket'>]</span><span class='comma'>,</span> <span class='label'>direction:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>TD</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='label'>title:</span> <span class='kw'>nil</span><span class='comma'>,</span> <span class='label'>attributes:</span> <span class='lbrace'>{</span><span class='rbrace'>}</span><span class='rparen'>)</span>
600
+ <span class='ivar'>@nodes</span> <span class='op'>=</span> <span class='id identifier rubyid_nodes'>nodes</span>
601
+ <span class='ivar'>@edges</span> <span class='op'>=</span> <span class='id identifier rubyid_edges'>edges</span>
602
+ <span class='ivar'>@direction</span> <span class='op'>=</span> <span class='id identifier rubyid_direction'>direction</span>
603
+ <span class='ivar'>@title</span> <span class='op'>=</span> <span class='id identifier rubyid_title'>title</span>
604
+ <span class='ivar'>@attributes</span> <span class='op'>=</span> <span class='id identifier rubyid_attributes'>attributes</span>
605
+ <span class='kw'>end</span></pre>
606
+ </td>
607
+ </tr>
608
+ </table>
609
+ </div>
610
+
611
+ </div>
612
+
613
+ <div id="instance_attr_details" class="attr_details">
614
+ <h2>Instance Attribute Details</h2>
615
+
616
+
617
+ <span id="attributes=-instance_method"></span>
618
+ <div class="method_details first">
619
+ <h3 class="signature first" id="attributes-instance_method">
620
+
621
+ #<strong>attributes</strong> &#x21d2; <tt>Hash</tt>
622
+
623
+
624
+
625
+
626
+
627
+ </h3><div class="docstring">
628
+ <div class="discussion">
629
+
630
+ <p>Returns Additional attributes for the flowchart.</p>
631
+
632
+
633
+ </div>
634
+ </div>
635
+ <div class="tags">
636
+
637
+ <p class="tag_title">Returns:</p>
638
+ <ul class="return">
639
+
640
+ <li>
641
+
642
+
643
+ <span class='type'>(<tt>Hash</tt>)</span>
644
+
645
+
646
+
647
+ &mdash;
648
+ <div class='inline'>
649
+ <p>Additional attributes for the flowchart</p>
650
+ </div>
651
+
652
+ </li>
653
+
654
+ </ul>
655
+
656
+ </div><table class="source_code">
657
+ <tr>
658
+ <td>
659
+ <pre class="lines">
660
+
661
+
662
+ 20
663
+ 21
664
+ 22</pre>
665
+ </td>
666
+ <td>
667
+ <pre class="code"><span class="info file"># File 'app/models/tasker/diagram/flowchart.rb', line 20</span>
668
+
669
+ <span class='kw'>def</span> <span class='id identifier rubyid_attributes'>attributes</span>
670
+ <span class='ivar'>@attributes</span>
671
+ <span class='kw'>end</span></pre>
672
+ </td>
673
+ </tr>
674
+ </table>
675
+ </div>
676
+
677
+
678
+ <span id="direction=-instance_method"></span>
679
+ <div class="method_details ">
680
+ <h3 class="signature " id="direction-instance_method">
681
+
682
+ #<strong>direction</strong> &#x21d2; <tt>String</tt>
683
+
684
+
685
+
686
+
687
+
688
+ </h3><div class="docstring">
689
+ <div class="discussion">
690
+
691
+ <p>Returns The direction of the flowchart (TD: top-down, LR: left-right, etc.).</p>
692
+
693
+
694
+ </div>
695
+ </div>
696
+ <div class="tags">
697
+
698
+ <p class="tag_title">Returns:</p>
699
+ <ul class="return">
700
+
701
+ <li>
702
+
703
+
704
+ <span class='type'>(<tt>String</tt>)</span>
705
+
706
+
707
+
708
+ &mdash;
709
+ <div class='inline'>
710
+ <p>The direction of the flowchart (TD: top-down, LR: left-right, etc.)</p>
711
+ </div>
712
+
713
+ </li>
714
+
715
+ </ul>
716
+
717
+ </div><table class="source_code">
718
+ <tr>
719
+ <td>
720
+ <pre class="lines">
721
+
722
+
723
+ 14
724
+ 15
725
+ 16</pre>
726
+ </td>
727
+ <td>
728
+ <pre class="code"><span class="info file"># File 'app/models/tasker/diagram/flowchart.rb', line 14</span>
729
+
730
+ <span class='kw'>def</span> <span class='id identifier rubyid_direction'>direction</span>
731
+ <span class='ivar'>@direction</span>
732
+ <span class='kw'>end</span></pre>
733
+ </td>
734
+ </tr>
735
+ </table>
736
+ </div>
737
+
738
+
739
+ <span id="edges=-instance_method"></span>
740
+ <div class="method_details ">
741
+ <h3 class="signature " id="edges-instance_method">
742
+
743
+ #<strong>edges</strong> &#x21d2; <tt>Array&lt;<span class='object_link'><a href="Edge.html" title="Tasker::Diagram::Edge (class)">Tasker::Diagram::Edge</a></span>&gt;</tt>
744
+
745
+
746
+
747
+
748
+
749
+ </h3><div class="docstring">
750
+ <div class="discussion">
751
+
752
+ <p>Returns The edges in the flowchart.</p>
753
+
754
+
755
+ </div>
756
+ </div>
757
+ <div class="tags">
758
+
759
+ <p class="tag_title">Returns:</p>
760
+ <ul class="return">
761
+
762
+ <li>
763
+
764
+
765
+ <span class='type'>(<tt>Array&lt;<span class='object_link'><a href="Edge.html" title="Tasker::Diagram::Edge (class)">Tasker::Diagram::Edge</a></span>&gt;</tt>)</span>
766
+
767
+
768
+
769
+ &mdash;
770
+ <div class='inline'>
771
+ <p>The edges in the flowchart</p>
772
+ </div>
773
+
774
+ </li>
775
+
776
+ </ul>
777
+
778
+ </div><table class="source_code">
779
+ <tr>
780
+ <td>
781
+ <pre class="lines">
782
+
783
+
784
+ 11
785
+ 12
786
+ 13</pre>
787
+ </td>
788
+ <td>
789
+ <pre class="code"><span class="info file"># File 'app/models/tasker/diagram/flowchart.rb', line 11</span>
790
+
791
+ <span class='kw'>def</span> <span class='id identifier rubyid_edges'>edges</span>
792
+ <span class='ivar'>@edges</span>
793
+ <span class='kw'>end</span></pre>
794
+ </td>
795
+ </tr>
796
+ </table>
797
+ </div>
798
+
799
+
800
+ <span id="nodes=-instance_method"></span>
801
+ <div class="method_details ">
802
+ <h3 class="signature " id="nodes-instance_method">
803
+
804
+ #<strong>nodes</strong> &#x21d2; <tt>Array&lt;<span class='object_link'><a href="Node.html" title="Tasker::Diagram::Node (class)">Tasker::Diagram::Node</a></span>&gt;</tt>
805
+
806
+
807
+
808
+
809
+
810
+ </h3><div class="docstring">
811
+ <div class="discussion">
812
+
813
+ <p>Returns The nodes in the flowchart.</p>
814
+
815
+
816
+ </div>
817
+ </div>
818
+ <div class="tags">
819
+
820
+ <p class="tag_title">Returns:</p>
821
+ <ul class="return">
822
+
823
+ <li>
824
+
825
+
826
+ <span class='type'>(<tt>Array&lt;<span class='object_link'><a href="Node.html" title="Tasker::Diagram::Node (class)">Tasker::Diagram::Node</a></span>&gt;</tt>)</span>
827
+
828
+
829
+
830
+ &mdash;
831
+ <div class='inline'>
832
+ <p>The nodes in the flowchart</p>
833
+ </div>
834
+
835
+ </li>
836
+
837
+ </ul>
838
+
839
+ </div><table class="source_code">
840
+ <tr>
841
+ <td>
842
+ <pre class="lines">
843
+
844
+
845
+ 8
846
+ 9
847
+ 10</pre>
848
+ </td>
849
+ <td>
850
+ <pre class="code"><span class="info file"># File 'app/models/tasker/diagram/flowchart.rb', line 8</span>
851
+
852
+ <span class='kw'>def</span> <span class='id identifier rubyid_nodes'>nodes</span>
853
+ <span class='ivar'>@nodes</span>
854
+ <span class='kw'>end</span></pre>
855
+ </td>
856
+ </tr>
857
+ </table>
858
+ </div>
859
+
860
+
861
+ <span id="title=-instance_method"></span>
862
+ <div class="method_details ">
863
+ <h3 class="signature " id="title-instance_method">
864
+
865
+ #<strong>title</strong> &#x21d2; <tt>String</tt>
866
+
867
+
868
+
869
+
870
+
871
+ </h3><div class="docstring">
872
+ <div class="discussion">
873
+
874
+ <p>Returns The title of the flowchart.</p>
875
+
876
+
877
+ </div>
878
+ </div>
879
+ <div class="tags">
880
+
881
+ <p class="tag_title">Returns:</p>
882
+ <ul class="return">
883
+
884
+ <li>
885
+
886
+
887
+ <span class='type'>(<tt>String</tt>)</span>
888
+
889
+
890
+
891
+ &mdash;
892
+ <div class='inline'>
893
+ <p>The title of the flowchart</p>
894
+ </div>
895
+
896
+ </li>
897
+
898
+ </ul>
899
+
900
+ </div><table class="source_code">
901
+ <tr>
902
+ <td>
903
+ <pre class="lines">
904
+
905
+
906
+ 17
907
+ 18
908
+ 19</pre>
909
+ </td>
910
+ <td>
911
+ <pre class="code"><span class="info file"># File 'app/models/tasker/diagram/flowchart.rb', line 17</span>
912
+
913
+ <span class='kw'>def</span> <span class='id identifier rubyid_title'>title</span>
914
+ <span class='ivar'>@title</span>
915
+ <span class='kw'>end</span></pre>
916
+ </td>
917
+ </tr>
918
+ </table>
919
+ </div>
920
+
921
+ </div>
922
+
923
+
924
+ <div id="instance_method_details" class="method_details_list">
925
+ <h2>Instance Method Details</h2>
926
+
927
+
928
+ <div class="method_details first">
929
+ <h3 class="signature first" id="add_edge-instance_method">
930
+
931
+ #<strong>add_edge</strong>(edge) &#x21d2; <tt><span class='object_link'><a href="Edge.html" title="Tasker::Diagram::Edge (class)">Tasker::Diagram::Edge</a></span></tt>
932
+
933
+
934
+
935
+
936
+
937
+ </h3><div class="docstring">
938
+ <div class="discussion">
939
+
940
+ <p>Add an edge to the flowchart</p>
941
+
942
+
943
+ </div>
944
+ </div>
945
+ <div class="tags">
946
+ <p class="tag_title">Parameters:</p>
947
+ <ul class="param">
948
+
949
+ <li>
950
+
951
+ <span class='name'>edge</span>
952
+
953
+
954
+ <span class='type'>(<tt><span class='object_link'><a href="Edge.html" title="Tasker::Diagram::Edge (class)">Tasker::Diagram::Edge</a></span></tt>)</span>
955
+
956
+
957
+
958
+ &mdash;
959
+ <div class='inline'>
960
+ <p>The edge to add</p>
961
+ </div>
962
+
963
+ </li>
964
+
965
+ </ul>
966
+
967
+ <p class="tag_title">Returns:</p>
968
+ <ul class="return">
969
+
970
+ <li>
971
+
972
+
973
+ <span class='type'>(<tt><span class='object_link'><a href="Edge.html" title="Tasker::Diagram::Edge (class)">Tasker::Diagram::Edge</a></span></tt>)</span>
974
+
975
+
976
+
977
+ &mdash;
978
+ <div class='inline'>
979
+ <p>The added edge</p>
980
+ </div>
981
+
982
+ </li>
983
+
984
+ </ul>
985
+
986
+ </div><table class="source_code">
987
+ <tr>
988
+ <td>
989
+ <pre class="lines">
990
+
991
+
992
+ 51
993
+ 52
994
+ 53
995
+ 54</pre>
996
+ </td>
997
+ <td>
998
+ <pre class="code"><span class="info file"># File 'app/models/tasker/diagram/flowchart.rb', line 51</span>
999
+
1000
+ <span class='kw'>def</span> <span class='id identifier rubyid_add_edge'>add_edge</span><span class='lparen'>(</span><span class='id identifier rubyid_edge'>edge</span><span class='rparen'>)</span>
1001
+ <span class='ivar'>@edges</span> <span class='op'>&lt;&lt;</span> <span class='id identifier rubyid_edge'>edge</span>
1002
+ <span class='id identifier rubyid_edge'>edge</span>
1003
+ <span class='kw'>end</span></pre>
1004
+ </td>
1005
+ </tr>
1006
+ </table>
1007
+ </div>
1008
+
1009
+ <div class="method_details ">
1010
+ <h3 class="signature " id="add_node-instance_method">
1011
+
1012
+ #<strong>add_node</strong>(node) &#x21d2; <tt><span class='object_link'><a href="Node.html" title="Tasker::Diagram::Node (class)">Tasker::Diagram::Node</a></span></tt>
1013
+
1014
+
1015
+
1016
+
1017
+
1018
+ </h3><div class="docstring">
1019
+ <div class="discussion">
1020
+
1021
+ <p>Add a node to the flowchart</p>
1022
+
1023
+
1024
+ </div>
1025
+ </div>
1026
+ <div class="tags">
1027
+ <p class="tag_title">Parameters:</p>
1028
+ <ul class="param">
1029
+
1030
+ <li>
1031
+
1032
+ <span class='name'>node</span>
1033
+
1034
+
1035
+ <span class='type'>(<tt><span class='object_link'><a href="Node.html" title="Tasker::Diagram::Node (class)">Tasker::Diagram::Node</a></span></tt>)</span>
1036
+
1037
+
1038
+
1039
+ &mdash;
1040
+ <div class='inline'>
1041
+ <p>The node to add</p>
1042
+ </div>
1043
+
1044
+ </li>
1045
+
1046
+ </ul>
1047
+
1048
+ <p class="tag_title">Returns:</p>
1049
+ <ul class="return">
1050
+
1051
+ <li>
1052
+
1053
+
1054
+ <span class='type'>(<tt><span class='object_link'><a href="Node.html" title="Tasker::Diagram::Node (class)">Tasker::Diagram::Node</a></span></tt>)</span>
1055
+
1056
+
1057
+
1058
+ &mdash;
1059
+ <div class='inline'>
1060
+ <p>The added node</p>
1061
+ </div>
1062
+
1063
+ </li>
1064
+
1065
+ </ul>
1066
+
1067
+ </div><table class="source_code">
1068
+ <tr>
1069
+ <td>
1070
+ <pre class="lines">
1071
+
1072
+
1073
+ 42
1074
+ 43
1075
+ 44
1076
+ 45</pre>
1077
+ </td>
1078
+ <td>
1079
+ <pre class="code"><span class="info file"># File 'app/models/tasker/diagram/flowchart.rb', line 42</span>
1080
+
1081
+ <span class='kw'>def</span> <span class='id identifier rubyid_add_node'>add_node</span><span class='lparen'>(</span><span class='id identifier rubyid_node'>node</span><span class='rparen'>)</span>
1082
+ <span class='ivar'>@nodes</span> <span class='op'>&lt;&lt;</span> <span class='id identifier rubyid_node'>node</span>
1083
+ <span class='id identifier rubyid_node'>node</span>
1084
+ <span class='kw'>end</span></pre>
1085
+ </td>
1086
+ </tr>
1087
+ </table>
1088
+ </div>
1089
+
1090
+ <div class="method_details ">
1091
+ <h3 class="signature " id="find_edges_for_node-instance_method">
1092
+
1093
+ #<strong>find_edges_for_node</strong>(node_id, direction = :both) &#x21d2; <tt>Array&lt;<span class='object_link'><a href="Edge.html" title="Tasker::Diagram::Edge (class)">Tasker::Diagram::Edge</a></span>&gt;</tt>
1094
+
1095
+
1096
+
1097
+
1098
+
1099
+ </h3><div class="docstring">
1100
+ <div class="discussion">
1101
+
1102
+ <p>Find all edges connected to a node</p>
1103
+
1104
+
1105
+ </div>
1106
+ </div>
1107
+ <div class="tags">
1108
+ <p class="tag_title">Parameters:</p>
1109
+ <ul class="param">
1110
+
1111
+ <li>
1112
+
1113
+ <span class='name'>node_id</span>
1114
+
1115
+
1116
+ <span class='type'>(<tt>String</tt>)</span>
1117
+
1118
+
1119
+
1120
+ &mdash;
1121
+ <div class='inline'>
1122
+ <p>The ID of the node</p>
1123
+ </div>
1124
+
1125
+ </li>
1126
+
1127
+ <li>
1128
+
1129
+ <span class='name'>direction</span>
1130
+
1131
+
1132
+ <span class='type'>(<tt>Symbol</tt>)</span>
1133
+
1134
+
1135
+ <em class="default">(defaults to: <tt>:both</tt>)</em>
1136
+
1137
+
1138
+ &mdash;
1139
+ <div class='inline'>
1140
+ <p>:outgoing, :incoming, or :both (default: :both)</p>
1141
+ </div>
1142
+
1143
+ </li>
1144
+
1145
+ </ul>
1146
+
1147
+ <p class="tag_title">Returns:</p>
1148
+ <ul class="return">
1149
+
1150
+ <li>
1151
+
1152
+
1153
+ <span class='type'>(<tt>Array&lt;<span class='object_link'><a href="Edge.html" title="Tasker::Diagram::Edge (class)">Tasker::Diagram::Edge</a></span>&gt;</tt>)</span>
1154
+
1155
+
1156
+
1157
+ &mdash;
1158
+ <div class='inline'>
1159
+ <p>The edges connected to the node</p>
1160
+ </div>
1161
+
1162
+ </li>
1163
+
1164
+ </ul>
1165
+
1166
+ </div><table class="source_code">
1167
+ <tr>
1168
+ <td>
1169
+ <pre class="lines">
1170
+
1171
+
1172
+ 69
1173
+ 70
1174
+ 71
1175
+ 72
1176
+ 73
1177
+ 74
1178
+ 75
1179
+ 76
1180
+ 77
1181
+ 78</pre>
1182
+ </td>
1183
+ <td>
1184
+ <pre class="code"><span class="info file"># File 'app/models/tasker/diagram/flowchart.rb', line 69</span>
1185
+
1186
+ <span class='kw'>def</span> <span class='id identifier rubyid_find_edges_for_node'>find_edges_for_node</span><span class='lparen'>(</span><span class='id identifier rubyid_node_id'>node_id</span><span class='comma'>,</span> <span class='id identifier rubyid_direction'>direction</span> <span class='op'>=</span> <span class='symbol'>:both</span><span class='rparen'>)</span>
1187
+ <span class='kw'>case</span> <span class='id identifier rubyid_direction'>direction</span>
1188
+ <span class='kw'>when</span> <span class='symbol'>:outgoing</span>
1189
+ <span class='ivar'>@edges</span><span class='period'>.</span><span class='id identifier rubyid_select'>select</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_edge'>edge</span><span class='op'>|</span> <span class='id identifier rubyid_edge'>edge</span><span class='period'>.</span><span class='id identifier rubyid_source_id'>source_id</span> <span class='op'>==</span> <span class='id identifier rubyid_node_id'>node_id</span> <span class='rbrace'>}</span>
1190
+ <span class='kw'>when</span> <span class='symbol'>:incoming</span>
1191
+ <span class='ivar'>@edges</span><span class='period'>.</span><span class='id identifier rubyid_select'>select</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_edge'>edge</span><span class='op'>|</span> <span class='id identifier rubyid_edge'>edge</span><span class='period'>.</span><span class='id identifier rubyid_target_id'>target_id</span> <span class='op'>==</span> <span class='id identifier rubyid_node_id'>node_id</span> <span class='rbrace'>}</span>
1192
+ <span class='kw'>else</span>
1193
+ <span class='ivar'>@edges</span><span class='period'>.</span><span class='id identifier rubyid_select'>select</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_edge'>edge</span><span class='op'>|</span> <span class='id identifier rubyid_edge'>edge</span><span class='period'>.</span><span class='id identifier rubyid_source_id'>source_id</span> <span class='op'>==</span> <span class='id identifier rubyid_node_id'>node_id</span> <span class='op'>||</span> <span class='id identifier rubyid_edge'>edge</span><span class='period'>.</span><span class='id identifier rubyid_target_id'>target_id</span> <span class='op'>==</span> <span class='id identifier rubyid_node_id'>node_id</span> <span class='rbrace'>}</span>
1194
+ <span class='kw'>end</span>
1195
+ <span class='kw'>end</span></pre>
1196
+ </td>
1197
+ </tr>
1198
+ </table>
1199
+ </div>
1200
+
1201
+ <div class="method_details ">
1202
+ <h3 class="signature " id="find_node-instance_method">
1203
+
1204
+ #<strong>find_node</strong>(id) &#x21d2; <tt><span class='object_link'><a href="Node.html" title="Tasker::Diagram::Node (class)">Tasker::Diagram::Node</a></span></tt><sup>?</sup>
1205
+
1206
+
1207
+
1208
+
1209
+
1210
+ </h3><div class="docstring">
1211
+ <div class="discussion">
1212
+
1213
+ <p>Find a node by its ID</p>
1214
+
1215
+
1216
+ </div>
1217
+ </div>
1218
+ <div class="tags">
1219
+ <p class="tag_title">Parameters:</p>
1220
+ <ul class="param">
1221
+
1222
+ <li>
1223
+
1224
+ <span class='name'>id</span>
1225
+
1226
+
1227
+ <span class='type'>(<tt>String</tt>)</span>
1228
+
1229
+
1230
+
1231
+ &mdash;
1232
+ <div class='inline'>
1233
+ <p>The ID of the node to find</p>
1234
+ </div>
1235
+
1236
+ </li>
1237
+
1238
+ </ul>
1239
+
1240
+ <p class="tag_title">Returns:</p>
1241
+ <ul class="return">
1242
+
1243
+ <li>
1244
+
1245
+
1246
+ <span class='type'>(<tt><span class='object_link'><a href="Node.html" title="Tasker::Diagram::Node (class)">Tasker::Diagram::Node</a></span></tt>, <tt>nil</tt>)</span>
1247
+
1248
+
1249
+
1250
+ &mdash;
1251
+ <div class='inline'>
1252
+ <p>The node with the given ID, or nil if not found</p>
1253
+ </div>
1254
+
1255
+ </li>
1256
+
1257
+ </ul>
1258
+
1259
+ </div><table class="source_code">
1260
+ <tr>
1261
+ <td>
1262
+ <pre class="lines">
1263
+
1264
+
1265
+ 60
1266
+ 61
1267
+ 62</pre>
1268
+ </td>
1269
+ <td>
1270
+ <pre class="code"><span class="info file"># File 'app/models/tasker/diagram/flowchart.rb', line 60</span>
1271
+
1272
+ <span class='kw'>def</span> <span class='id identifier rubyid_find_node'>find_node</span><span class='lparen'>(</span><span class='id identifier rubyid_id'>id</span><span class='rparen'>)</span>
1273
+ <span class='ivar'>@nodes</span><span class='period'>.</span><span class='id identifier rubyid_find'>find</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_node'>node</span><span class='op'>|</span> <span class='id identifier rubyid_node'>node</span><span class='period'>.</span><span class='id identifier rubyid_id'>id</span> <span class='op'>==</span> <span class='id identifier rubyid_id'>id</span> <span class='rbrace'>}</span>
1274
+ <span class='kw'>end</span></pre>
1275
+ </td>
1276
+ </tr>
1277
+ </table>
1278
+ </div>
1279
+
1280
+ <div class="method_details ">
1281
+ <h3 class="signature " id="to_h-instance_method">
1282
+
1283
+ #<strong>to_h</strong> &#x21d2; <tt>Hash</tt>
1284
+
1285
+
1286
+
1287
+
1288
+
1289
+ </h3><div class="docstring">
1290
+ <div class="discussion">
1291
+
1292
+ <p>Convert the flowchart to a hash representation</p>
1293
+
1294
+
1295
+ </div>
1296
+ </div>
1297
+ <div class="tags">
1298
+
1299
+ <p class="tag_title">Returns:</p>
1300
+ <ul class="return">
1301
+
1302
+ <li>
1303
+
1304
+
1305
+ <span class='type'>(<tt>Hash</tt>)</span>
1306
+
1307
+
1308
+
1309
+ &mdash;
1310
+ <div class='inline'>
1311
+ <p>Hash representation of the flowchart</p>
1312
+ </div>
1313
+
1314
+ </li>
1315
+
1316
+ </ul>
1317
+
1318
+ </div><table class="source_code">
1319
+ <tr>
1320
+ <td>
1321
+ <pre class="lines">
1322
+
1323
+
1324
+ 83
1325
+ 84
1326
+ 85
1327
+ 86
1328
+ 87
1329
+ 88
1330
+ 89
1331
+ 90
1332
+ 91</pre>
1333
+ </td>
1334
+ <td>
1335
+ <pre class="code"><span class="info file"># File 'app/models/tasker/diagram/flowchart.rb', line 83</span>
1336
+
1337
+ <span class='kw'>def</span> <span class='id identifier rubyid_to_h'>to_h</span>
1338
+ <span class='lbrace'>{</span>
1339
+ <span class='label'>nodes:</span> <span class='id identifier rubyid_nodes'>nodes</span><span class='period'>.</span><span class='id identifier rubyid_map'>map</span><span class='lparen'>(</span><span class='op'>&amp;</span><span class='symbol'>:to_h</span><span class='rparen'>)</span><span class='comma'>,</span>
1340
+ <span class='label'>edges:</span> <span class='id identifier rubyid_edges'>edges</span><span class='period'>.</span><span class='id identifier rubyid_map'>map</span><span class='lparen'>(</span><span class='op'>&amp;</span><span class='symbol'>:to_h</span><span class='rparen'>)</span><span class='comma'>,</span>
1341
+ <span class='label'>direction:</span> <span class='id identifier rubyid_direction'>direction</span><span class='comma'>,</span>
1342
+ <span class='label'>title:</span> <span class='id identifier rubyid_title'>title</span><span class='comma'>,</span>
1343
+ <span class='label'>attributes:</span> <span class='id identifier rubyid_attributes'>attributes</span>
1344
+ <span class='rbrace'>}</span><span class='period'>.</span><span class='id identifier rubyid_compact'>compact</span>
1345
+ <span class='kw'>end</span></pre>
1346
+ </td>
1347
+ </tr>
1348
+ </table>
1349
+ </div>
1350
+
1351
+ <div class="method_details ">
1352
+ <h3 class="signature " id="to_json-instance_method">
1353
+
1354
+ #<strong>to_json</strong> &#x21d2; <tt>String</tt>
1355
+
1356
+
1357
+
1358
+
1359
+
1360
+ </h3><div class="docstring">
1361
+ <div class="discussion">
1362
+
1363
+ <p>Convert the flowchart to a JSON string</p>
1364
+
1365
+
1366
+ </div>
1367
+ </div>
1368
+ <div class="tags">
1369
+
1370
+ <p class="tag_title">Returns:</p>
1371
+ <ul class="return">
1372
+
1373
+ <li>
1374
+
1375
+
1376
+ <span class='type'>(<tt>String</tt>)</span>
1377
+
1378
+
1379
+
1380
+ &mdash;
1381
+ <div class='inline'>
1382
+ <p>JSON representation of the flowchart</p>
1383
+ </div>
1384
+
1385
+ </li>
1386
+
1387
+ </ul>
1388
+
1389
+ </div><table class="source_code">
1390
+ <tr>
1391
+ <td>
1392
+ <pre class="lines">
1393
+
1394
+
1395
+ 96
1396
+ 97
1397
+ 98</pre>
1398
+ </td>
1399
+ <td>
1400
+ <pre class="code"><span class="info file"># File 'app/models/tasker/diagram/flowchart.rb', line 96</span>
1401
+
1402
+ <span class='kw'>def</span> <span class='id identifier rubyid_to_json'>to_json</span><span class='lparen'>(</span><span class='op'>*</span><span class='rparen'>)</span>
1403
+ <span class='id identifier rubyid_to_h'>to_h</span><span class='period'>.</span><span class='id identifier rubyid_to_json'>to_json</span><span class='lparen'>(</span><span class='op'>*</span><span class='rparen'>)</span>
1404
+ <span class='kw'>end</span></pre>
1405
+ </td>
1406
+ </tr>
1407
+ </table>
1408
+ </div>
1409
+
1410
+ <div class="method_details ">
1411
+ <h3 class="signature " id="to_mermaid-instance_method">
1412
+
1413
+ #<strong>to_mermaid</strong> &#x21d2; <tt>String</tt>
1414
+
1415
+
1416
+
1417
+
1418
+
1419
+ </h3><div class="docstring">
1420
+ <div class="discussion">
1421
+
1422
+ <p>Generate Mermaid diagram syntax for this flowchart</p>
1423
+
1424
+
1425
+ </div>
1426
+ </div>
1427
+ <div class="tags">
1428
+
1429
+ <p class="tag_title">Returns:</p>
1430
+ <ul class="return">
1431
+
1432
+ <li>
1433
+
1434
+
1435
+ <span class='type'>(<tt>String</tt>)</span>
1436
+
1437
+
1438
+
1439
+ &mdash;
1440
+ <div class='inline'>
1441
+ <p>Mermaid syntax for the flowchart</p>
1442
+ </div>
1443
+
1444
+ </li>
1445
+
1446
+ </ul>
1447
+
1448
+ </div><table class="source_code">
1449
+ <tr>
1450
+ <td>
1451
+ <pre class="lines">
1452
+
1453
+
1454
+ 103
1455
+ 104
1456
+ 105
1457
+ 106
1458
+ 107
1459
+ 108
1460
+ 109
1461
+ 110
1462
+ 111
1463
+ 112
1464
+ 113
1465
+ 114
1466
+ 115
1467
+ 116
1468
+ 117
1469
+ 118
1470
+ 119
1471
+ 120
1472
+ 121
1473
+ 122
1474
+ 123
1475
+ 124
1476
+ 125
1477
+ 126
1478
+ 127
1479
+ 128
1480
+ 129
1481
+ 130
1482
+ 131
1483
+ 132
1484
+ 133
1485
+ 134</pre>
1486
+ </td>
1487
+ <td>
1488
+ <pre class="code"><span class="info file"># File 'app/models/tasker/diagram/flowchart.rb', line 103</span>
1489
+
1490
+ <span class='kw'>def</span> <span class='id identifier rubyid_to_mermaid'>to_mermaid</span>
1491
+ <span class='id identifier rubyid_lines'>lines</span> <span class='op'>=</span> <span class='lbracket'>[</span><span class='rbracket'>]</span>
1492
+
1493
+ <span class='comment'># Add the flowchart definition
1494
+ </span> <span class='id identifier rubyid_lines'>lines</span> <span class='op'>&lt;&lt;</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>graph </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_direction'>direction</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span>
1495
+
1496
+ <span class='comment'># Use a subgraph with title if title is present
1497
+ </span> <span class='kw'>if</span> <span class='id identifier rubyid_title'>title</span>
1498
+ <span class='id identifier rubyid_lines'>lines</span> <span class='op'>&lt;&lt;</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>subgraph \&quot;</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_title'>title</span><span class='embexpr_end'>}</span><span class='tstring_content'>\&quot;</span><span class='tstring_end'>&quot;</span></span>
1499
+ <span class='id identifier rubyid_indent'>indent</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'> </span><span class='tstring_end'>&#39;</span></span>
1500
+ <span class='kw'>else</span>
1501
+ <span class='id identifier rubyid_indent'>indent</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_end'>&#39;</span></span>
1502
+ <span class='kw'>end</span>
1503
+
1504
+ <span class='comment'># Add all nodes
1505
+ </span> <span class='id identifier rubyid_nodes'>nodes</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_node'>node</span><span class='op'>|</span>
1506
+ <span class='id identifier rubyid_node'>node</span><span class='period'>.</span><span class='id identifier rubyid_to_mermaid'>to_mermaid</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_line'>line</span><span class='op'>|</span>
1507
+ <span class='id identifier rubyid_lines'>lines</span> <span class='op'>&lt;&lt;</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_indent'>indent</span><span class='embexpr_end'>}</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_line'>line</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span>
1508
+ <span class='kw'>end</span>
1509
+ <span class='kw'>end</span>
1510
+
1511
+ <span class='comment'># Add all edges
1512
+ </span> <span class='id identifier rubyid_edges'>edges</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_edge'>edge</span><span class='op'>|</span>
1513
+ <span class='id identifier rubyid_lines'>lines</span> <span class='op'>&lt;&lt;</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_indent'>indent</span><span class='embexpr_end'>}</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_edge'>edge</span><span class='period'>.</span><span class='id identifier rubyid_to_mermaid'>to_mermaid</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span>
1514
+ <span class='kw'>end</span>
1515
+
1516
+ <span class='comment'># Close the subgraph if we have a title
1517
+ </span> <span class='id identifier rubyid_lines'>lines</span> <span class='op'>&lt;&lt;</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>end</span><span class='tstring_end'>&#39;</span></span> <span class='kw'>if</span> <span class='id identifier rubyid_title'>title</span>
1518
+
1519
+ <span class='comment'># Join all lines with newlines
1520
+ </span> <span class='id identifier rubyid_lines'>lines</span><span class='period'>.</span><span class='id identifier rubyid_join'>join</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>\n</span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span>
1521
+ <span class='kw'>end</span></pre>
1522
+ </td>
1523
+ </tr>
1524
+ </table>
1525
+ </div>
1526
+
1527
+ </div>
1528
+
1529
+ </div>
1530
+
1531
+ <div id="footer">
1532
+ Generated on Tue Jul 1 16:47:38 2025 by
1533
+ <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
1534
+ 0.9.37 (ruby-3.2.4).
1535
+ </div>
1536
+
1537
+ </div>
1538
+ </body>
1539
+ </html>