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,2556 @@
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::Events::Subscribers::BaseSubscriber
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::Events::Subscribers::BaseSubscriber";
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 (B)</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="../../Events.html" title="Tasker::Events (module)">Events</a></span></span> &raquo; <span class='title'><span class='object_link'><a href="../Subscribers.html" title="Tasker::Events::Subscribers (module)">Subscribers</a></span></span>
41
+ &raquo;
42
+ <span class="title">BaseSubscriber</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::Events::Subscribers::BaseSubscriber
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::Events::Subscribers::BaseSubscriber</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>lib/tasker/events/subscribers/base_subscriber.rb</dd>
98
+ </dl>
99
+
100
+ </div>
101
+
102
+ <h2>Overview</h2><div class="docstring">
103
+ <div class="discussion">
104
+
105
+ <p>BaseSubscriber provides a clean foundation for creating custom event subscribers</p>
106
+
107
+ <p>This class extracts common patterns from TelemetrySubscriber and provides: - Declarative subscription registration via class methods - Automatic method routing from event names to handler methods - Defensive payload handling with safe accessors - Easy integration with the Tasker event system - Metrics collection helper methods for common patterns</p>
108
+
109
+ <p>Usage: class OrderNotificationSubscriber &lt; Tasker::Events::Subscribers::BaseSubscriber subscribe_to :task_completed, :step_failed</p>
110
+
111
+ <pre class="code ruby"><code class="ruby"><span class='kw'>def</span> <span class='id identifier rubyid_handle_task_completed'>handle_task_completed</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='rparen'>)</span>
112
+ <span class='const'>OrderMailer</span><span class='period'>.</span><span class='id identifier rubyid_completion_email'>completion_email</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='lbracket'>[</span><span class='symbol'>:task_id</span><span class='rbracket'>]</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_deliver_later'>deliver_later</span>
113
+ <span class='kw'>end</span>
114
+
115
+ <span class='kw'>def</span> <span class='id identifier rubyid_handle_step_failed'>handle_step_failed</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='rparen'>)</span>
116
+ <span class='const'>AlertService</span><span class='period'>.</span><span class='id identifier rubyid_notify'>notify</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Step failed: </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_event'>event</span><span class='lbracket'>[</span><span class='symbol'>:step_name</span><span class='rbracket'>]</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span>
117
+ <span class='kw'>end</span>
118
+ </code></pre>
119
+
120
+ <p>end</p>
121
+
122
+ <p># Register the subscriber OrderNotificationSubscriber.subscribe(Tasker::Events::Publisher.instance)</p>
123
+
124
+
125
+ </div>
126
+ </div>
127
+ <div class="tags">
128
+
129
+
130
+ </div><div id="subclasses">
131
+ <h2>Direct Known Subclasses</h2>
132
+ <p class="children"><span class='object_link'><a href="MetricsSubscriber.html" title="Tasker::Events::Subscribers::MetricsSubscriber (class)">MetricsSubscriber</a></span>, <span class='object_link'><a href="TelemetrySubscriber.html" title="Tasker::Events::Subscribers::TelemetrySubscriber (class)">TelemetrySubscriber</a></span></p>
133
+ </div>
134
+ <h2>Defined Under Namespace</h2>
135
+ <p class="children">
136
+
137
+
138
+
139
+
140
+ <strong class="classes">Classes:</strong> <span class='object_link'><a href="BaseSubscriber/ErrorCategorizer.html" title="Tasker::Events::Subscribers::BaseSubscriber::ErrorCategorizer (class)">ErrorCategorizer</a></span>, <span class='object_link'><a href="BaseSubscriber/MetricTagsExtractor.html" title="Tasker::Events::Subscribers::BaseSubscriber::MetricTagsExtractor (class)">MetricTagsExtractor</a></span>
141
+
142
+
143
+ </p>
144
+
145
+
146
+
147
+
148
+
149
+
150
+
151
+
152
+ <h2>
153
+ Class Method Summary
154
+ <small><a href="#" class="summary_toggle">collapse</a></small>
155
+ </h2>
156
+
157
+ <ul class="summary">
158
+
159
+ <li class="public ">
160
+ <span class="summary_signature">
161
+
162
+ <a href="#filter_events-class_method" title="filter_events (class method)">.<strong>filter_events</strong>(&amp;filter_proc) &#x21d2; void </a>
163
+
164
+
165
+
166
+ </span>
167
+
168
+
169
+
170
+
171
+
172
+
173
+
174
+
175
+
176
+ <span class="summary_desc"><div class='inline'>
177
+ <p>Set a filter for events (optional).</p>
178
+ </div></span>
179
+
180
+ </li>
181
+
182
+
183
+ <li class="public ">
184
+ <span class="summary_signature">
185
+
186
+ <a href="#subscribe-class_method" title="subscribe (class method)">.<strong>subscribe</strong>(publisher) &#x21d2; BaseSubscriber </a>
187
+
188
+
189
+
190
+ </span>
191
+
192
+
193
+
194
+
195
+
196
+
197
+
198
+
199
+
200
+ <span class="summary_desc"><div class='inline'>
201
+ <p>Subscribe this subscriber to a publisher.</p>
202
+ </div></span>
203
+
204
+ </li>
205
+
206
+
207
+ <li class="public ">
208
+ <span class="summary_signature">
209
+
210
+ <a href="#subscribe_to-class_method" title="subscribe_to (class method)">.<strong>subscribe_to</strong>(*events) &#x21d2; void </a>
211
+
212
+
213
+
214
+ </span>
215
+
216
+
217
+
218
+
219
+
220
+
221
+
222
+
223
+
224
+ <span class="summary_desc"><div class='inline'>
225
+ <p>Declarative method to register events this subscriber cares about.</p>
226
+ </div></span>
227
+
228
+ </li>
229
+
230
+
231
+ </ul>
232
+
233
+ <h2>
234
+ Instance Method Summary
235
+ <small><a href="#" class="summary_toggle">collapse</a></small>
236
+ </h2>
237
+
238
+ <ul class="summary">
239
+
240
+ <li class="protected ">
241
+ <span class="summary_signature">
242
+
243
+ <a href="#build_event_subscriptions-instance_method" title="#build_event_subscriptions (instance method)">#<strong>build_event_subscriptions</strong> &#x21d2; Hash </a>
244
+
245
+
246
+
247
+ </span>
248
+
249
+
250
+
251
+ <span class="note title protected">protected</span>
252
+
253
+
254
+
255
+
256
+
257
+ <span class="summary_desc"><div class='inline'>
258
+ <p>Build event subscriptions using explicit constants.</p>
259
+ </div></span>
260
+
261
+ </li>
262
+
263
+
264
+ <li class="protected ">
265
+ <span class="summary_signature">
266
+
267
+ <a href="#build_metric_name-instance_method" title="#build_metric_name (instance method)">#<strong>build_metric_name</strong>(base_name, event_type) &#x21d2; String </a>
268
+
269
+
270
+
271
+ </span>
272
+
273
+
274
+
275
+ <span class="note title protected">protected</span>
276
+
277
+
278
+
279
+
280
+
281
+ <span class="summary_desc"><div class='inline'>
282
+ <p>Create metric name with consistent naming convention.</p>
283
+ </div></span>
284
+
285
+ </li>
286
+
287
+
288
+ <li class="protected ">
289
+ <span class="summary_signature">
290
+
291
+ <a href="#custom_event%3F-instance_method" title="#custom_event? (instance method)">#<strong>custom_event?</strong>(event_constant) &#x21d2; Boolean </a>
292
+
293
+
294
+
295
+ </span>
296
+
297
+
298
+
299
+ <span class="note title protected">protected</span>
300
+
301
+
302
+
303
+
304
+
305
+ <span class="summary_desc"><div class='inline'>
306
+ <p>Check if an event is a custom event (not a system constant).</p>
307
+ </div></span>
308
+
309
+ </li>
310
+
311
+
312
+ <li class="protected ">
313
+ <span class="summary_signature">
314
+
315
+ <a href="#event_subscriptions-instance_method" title="#event_subscriptions (instance method)">#<strong>event_subscriptions</strong> &#x21d2; Hash </a>
316
+
317
+
318
+
319
+ </span>
320
+
321
+
322
+
323
+ <span class="note title protected">protected</span>
324
+
325
+
326
+
327
+
328
+
329
+ <span class="summary_desc"><div class='inline'>
330
+ <p>Get event subscriptions mapping for this subscriber.</p>
331
+ </div></span>
332
+
333
+ </li>
334
+
335
+
336
+ <li class="protected ">
337
+ <span class="summary_signature">
338
+
339
+ <a href="#extract_core_attributes-instance_method" title="#extract_core_attributes (instance method)">#<strong>extract_core_attributes</strong>(event) &#x21d2; Hash </a>
340
+
341
+
342
+
343
+ </span>
344
+
345
+
346
+
347
+ <span class="note title protected">protected</span>
348
+
349
+
350
+
351
+
352
+
353
+ <span class="summary_desc"><div class='inline'>
354
+ <p>Extract core attributes common to most events.</p>
355
+ </div></span>
356
+
357
+ </li>
358
+
359
+
360
+ <li class="protected ">
361
+ <span class="summary_signature">
362
+
363
+ <a href="#extract_error_metrics-instance_method" title="#extract_error_metrics (instance method)">#<strong>extract_error_metrics</strong>(event) &#x21d2; Hash </a>
364
+
365
+
366
+
367
+ </span>
368
+
369
+
370
+
371
+ <span class="note title protected">protected</span>
372
+
373
+
374
+
375
+
376
+
377
+ <span class="summary_desc"><div class='inline'>
378
+ <p>Extract error metrics from failure events.</p>
379
+ </div></span>
380
+
381
+ </li>
382
+
383
+
384
+ <li class="protected ">
385
+ <span class="summary_signature">
386
+
387
+ <a href="#extract_metric_tags-instance_method" title="#extract_metric_tags (instance method)">#<strong>extract_metric_tags</strong>(event) &#x21d2; Array&lt;String&gt; </a>
388
+
389
+
390
+
391
+ </span>
392
+
393
+
394
+
395
+ <span class="note title protected">protected</span>
396
+
397
+
398
+
399
+
400
+
401
+ <span class="summary_desc"><div class='inline'>
402
+ <p>Extract business metrics tags for categorization.</p>
403
+ </div></span>
404
+
405
+ </li>
406
+
407
+
408
+ <li class="protected ">
409
+ <span class="summary_signature">
410
+
411
+ <a href="#extract_numeric_metric-instance_method" title="#extract_numeric_metric (instance method)">#<strong>extract_numeric_metric</strong>(event, key, default = 0) &#x21d2; Numeric </a>
412
+
413
+
414
+
415
+ </span>
416
+
417
+
418
+
419
+ <span class="note title protected">protected</span>
420
+
421
+
422
+
423
+
424
+
425
+ <span class="summary_desc"><div class='inline'>
426
+ <p>Extract numeric value safely for metrics.</p>
427
+ </div></span>
428
+
429
+ </li>
430
+
431
+
432
+ <li class="protected ">
433
+ <span class="summary_signature">
434
+
435
+ <a href="#extract_performance_metrics-instance_method" title="#extract_performance_metrics (instance method)">#<strong>extract_performance_metrics</strong>(event) &#x21d2; Hash </a>
436
+
437
+
438
+
439
+ </span>
440
+
441
+
442
+
443
+ <span class="note title protected">protected</span>
444
+
445
+
446
+
447
+
448
+
449
+ <span class="summary_desc"><div class='inline'>
450
+ <p>Extract performance metrics for operational monitoring.</p>
451
+ </div></span>
452
+
453
+ </li>
454
+
455
+
456
+ <li class="protected ">
457
+ <span class="summary_signature">
458
+
459
+ <a href="#extract_step_attributes-instance_method" title="#extract_step_attributes (instance method)">#<strong>extract_step_attributes</strong>(event) &#x21d2; Hash </a>
460
+
461
+
462
+
463
+ </span>
464
+
465
+
466
+
467
+ <span class="note title protected">protected</span>
468
+
469
+
470
+
471
+
472
+
473
+ <span class="summary_desc"><div class='inline'>
474
+ <p>Extract step-specific attributes (for TelemetrySubscriber compatibility).</p>
475
+ </div></span>
476
+
477
+ </li>
478
+
479
+
480
+ <li class="protected ">
481
+ <span class="summary_signature">
482
+
483
+ <a href="#extract_timing_metrics-instance_method" title="#extract_timing_metrics (instance method)">#<strong>extract_timing_metrics</strong>(event) &#x21d2; Hash </a>
484
+
485
+
486
+
487
+ </span>
488
+
489
+
490
+
491
+ <span class="note title protected">protected</span>
492
+
493
+
494
+
495
+
496
+
497
+ <span class="summary_desc"><div class='inline'>
498
+ <p>Extract timing metrics from completion events.</p>
499
+ </div></span>
500
+
501
+ </li>
502
+
503
+
504
+ <li class="protected ">
505
+ <span class="summary_signature">
506
+
507
+ <a href="#generate_handler_method_name-instance_method" title="#generate_handler_method_name (instance method)">#<strong>generate_handler_method_name</strong>(event_name) &#x21d2; Symbol </a>
508
+
509
+
510
+
511
+ </span>
512
+
513
+
514
+
515
+ <span class="note title protected">protected</span>
516
+
517
+
518
+
519
+
520
+
521
+ <span class="summary_desc"><div class='inline'>
522
+ <p>Generate handler method name from event name.</p>
523
+ </div></span>
524
+
525
+ </li>
526
+
527
+
528
+ <li class="public ">
529
+ <span class="summary_signature">
530
+
531
+ <a href="#initialize-instance_method" title="#initialize (instance method)">#<strong>initialize</strong>(name: nil, events: nil, config: {}) &#x21d2; BaseSubscriber </a>
532
+
533
+
534
+
535
+ </span>
536
+
537
+
538
+ <span class="note title constructor">constructor</span>
539
+
540
+
541
+
542
+
543
+
544
+
545
+
546
+
547
+ <span class="summary_desc"><div class='inline'>
548
+ <p>A new instance of BaseSubscriber.</p>
549
+ </div></span>
550
+
551
+ </li>
552
+
553
+
554
+ <li class="protected ">
555
+ <span class="summary_signature">
556
+
557
+ <a href="#resolve_internal_event_constant-instance_method" title="#resolve_internal_event_constant (instance method)">#<strong>resolve_internal_event_constant</strong>(event_name) &#x21d2; String </a>
558
+
559
+
560
+
561
+ </span>
562
+
563
+
564
+
565
+ <span class="note title protected">protected</span>
566
+
567
+
568
+
569
+
570
+
571
+ <span class="summary_desc"><div class='inline'>
572
+ <p>Resolve developer-friendly event name to internal constant.</p>
573
+ </div></span>
574
+
575
+ </li>
576
+
577
+
578
+ <li class="protected ">
579
+ <span class="summary_signature">
580
+
581
+ <a href="#safe_get-instance_method" title="#safe_get (instance method)">#<strong>safe_get</strong>(event, key, default = nil) &#x21d2; Object </a>
582
+
583
+
584
+
585
+ </span>
586
+
587
+
588
+
589
+ <span class="note title protected">protected</span>
590
+
591
+
592
+
593
+
594
+
595
+ <span class="summary_desc"><div class='inline'>
596
+ <p>Safe accessor for event payload keys with fallback values.</p>
597
+ </div></span>
598
+
599
+ </li>
600
+
601
+
602
+ <li class="protected ">
603
+ <span class="summary_signature">
604
+
605
+ <a href="#should_handle_event%3F-instance_method" title="#should_handle_event? (instance method)">#<strong>should_handle_event?</strong>(event_constant) &#x21d2; Boolean </a>
606
+
607
+
608
+
609
+ </span>
610
+
611
+
612
+
613
+ <span class="note title protected">protected</span>
614
+
615
+
616
+
617
+
618
+
619
+ <span class="summary_desc"><div class='inline'>
620
+ <p>Check if this subscriber should handle the given event.</p>
621
+ </div></span>
622
+
623
+ </li>
624
+
625
+
626
+ <li class="protected ">
627
+ <span class="summary_signature">
628
+
629
+ <a href="#should_process_event%3F-instance_method" title="#should_process_event? (instance method)">#<strong>should_process_event?</strong>(_event_constant) &#x21d2; Boolean </a>
630
+
631
+
632
+
633
+ </span>
634
+
635
+
636
+
637
+ <span class="note title protected">protected</span>
638
+
639
+
640
+
641
+
642
+
643
+ <span class="summary_desc"><div class='inline'>
644
+ <p>Instance-level event filtering (override in subclasses).</p>
645
+ </div></span>
646
+
647
+ </li>
648
+
649
+
650
+ <li class="public ">
651
+ <span class="summary_signature">
652
+
653
+ <a href="#subscribe_to_publisher-instance_method" title="#subscribe_to_publisher (instance method)">#<strong>subscribe_to_publisher</strong>(publisher) &#x21d2; void </a>
654
+
655
+
656
+
657
+ </span>
658
+
659
+
660
+
661
+
662
+
663
+
664
+
665
+
666
+
667
+ <span class="summary_desc"><div class='inline'>
668
+ <p>Subscribe to all events defined by the class.</p>
669
+ </div></span>
670
+
671
+ </li>
672
+
673
+
674
+ </ul>
675
+
676
+
677
+ <div id="constructor_details" class="method_details_list">
678
+ <h2>Constructor Details</h2>
679
+
680
+ <div class="method_details first">
681
+ <h3 class="signature first" id="initialize-instance_method">
682
+
683
+ #<strong>initialize</strong>(name: nil, events: nil, config: {}) &#x21d2; <tt><span class='object_link'><a href="" title="Tasker::Events::Subscribers::BaseSubscriber (class)">BaseSubscriber</a></span></tt>
684
+
685
+
686
+
687
+
688
+
689
+ </h3><div class="docstring">
690
+ <div class="discussion">
691
+
692
+ <p>Returns a new instance of BaseSubscriber.</p>
693
+
694
+
695
+ </div>
696
+ </div>
697
+ <div class="tags">
698
+
699
+
700
+ </div><table class="source_code">
701
+ <tr>
702
+ <td>
703
+ <pre class="lines">
704
+
705
+
706
+ 34
707
+ 35
708
+ 36
709
+ 37
710
+ 38
711
+ 39
712
+ 40
713
+ 41
714
+ 42
715
+ 43</pre>
716
+ </td>
717
+ <td>
718
+ <pre class="code"><span class="info file"># File 'lib/tasker/events/subscribers/base_subscriber.rb', line 34</span>
719
+
720
+ <span class='kw'>def</span> <span class='id identifier rubyid_initialize'>initialize</span><span class='lparen'>(</span><span class='label'>name:</span> <span class='kw'>nil</span><span class='comma'>,</span> <span class='label'>events:</span> <span class='kw'>nil</span><span class='comma'>,</span> <span class='label'>config:</span> <span class='lbrace'>{</span><span class='rbrace'>}</span><span class='rparen'>)</span>
721
+ <span class='ivar'>@subscription_name</span> <span class='op'>=</span> <span class='id identifier rubyid_name'>name</span>
722
+ <span class='ivar'>@subscription_config</span> <span class='op'>=</span> <span class='id identifier rubyid_config'>config</span>
723
+
724
+ <span class='comment'># If events are provided via constructor (from YAML), add them to subscribed events
725
+ </span> <span class='kw'>return</span> <span class='kw'>if</span> <span class='id identifier rubyid_events'>events</span><span class='period'>.</span><span class='id identifier rubyid_blank?'>blank?</span>
726
+
727
+ <span class='id identifier rubyid_current_events'>current_events</span> <span class='op'>=</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_class'>class</span><span class='period'>.</span><span class='id identifier rubyid_subscribed_events'>subscribed_events</span> <span class='op'>||</span> <span class='lbracket'>[</span><span class='rbracket'>]</span>
728
+ <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_class'>class</span><span class='period'>.</span><span class='id identifier rubyid_subscribed_events'>subscribed_events</span> <span class='op'>=</span> <span class='lparen'>(</span><span class='id identifier rubyid_current_events'>current_events</span> <span class='op'>+</span> <span class='const'>Array</span><span class='lparen'>(</span><span class='id identifier rubyid_events'>events</span><span class='rparen'>)</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_uniq'>uniq</span>
729
+ <span class='kw'>end</span></pre>
730
+ </td>
731
+ </tr>
732
+ </table>
733
+ </div>
734
+
735
+ </div>
736
+
737
+
738
+ <div id="class_method_details" class="method_details_list">
739
+ <h2>Class Method Details</h2>
740
+
741
+
742
+ <div class="method_details first">
743
+ <h3 class="signature first" id="filter_events-class_method">
744
+
745
+ .<strong>filter_events</strong>(&amp;filter_proc) &#x21d2; <tt>void</tt>
746
+
747
+
748
+
749
+
750
+
751
+ </h3><div class="docstring">
752
+ <div class="discussion">
753
+ <p class="note returns_void">This method returns an undefined value.</p>
754
+ <p>Set a filter for events (optional)</p>
755
+
756
+ <p>Example: filter_events { |event_name| event_name.include?(‘order’) }</p>
757
+
758
+
759
+ </div>
760
+ </div>
761
+ <div class="tags">
762
+ <p class="tag_title">Parameters:</p>
763
+ <ul class="param">
764
+
765
+ <li>
766
+
767
+ <span class='name'>filter_proc</span>
768
+
769
+
770
+ <span class='type'>(<tt>Proc</tt>)</span>
771
+
772
+
773
+
774
+ &mdash;
775
+ <div class='inline'>
776
+ <p>A proc that returns true for events to process</p>
777
+ </div>
778
+
779
+ </li>
780
+
781
+ </ul>
782
+
783
+
784
+ </div><table class="source_code">
785
+ <tr>
786
+ <td>
787
+ <pre class="lines">
788
+
789
+
790
+ 67
791
+ 68
792
+ 69</pre>
793
+ </td>
794
+ <td>
795
+ <pre class="code"><span class="info file"># File 'lib/tasker/events/subscribers/base_subscriber.rb', line 67</span>
796
+
797
+ <span class='kw'>def</span> <span class='id identifier rubyid_filter_events'>filter_events</span><span class='lparen'>(</span><span class='op'>&amp;</span><span class='id identifier rubyid_filter_proc'>filter_proc</span><span class='rparen'>)</span>
798
+ <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_event_filter'>event_filter</span> <span class='op'>=</span> <span class='id identifier rubyid_filter_proc'>filter_proc</span>
799
+ <span class='kw'>end</span></pre>
800
+ </td>
801
+ </tr>
802
+ </table>
803
+ </div>
804
+
805
+ <div class="method_details ">
806
+ <h3 class="signature " id="subscribe-class_method">
807
+
808
+ .<strong>subscribe</strong>(publisher) &#x21d2; <tt><span class='object_link'><a href="" title="Tasker::Events::Subscribers::BaseSubscriber (class)">BaseSubscriber</a></span></tt>
809
+
810
+
811
+
812
+
813
+
814
+ </h3><div class="docstring">
815
+ <div class="discussion">
816
+
817
+ <p>Subscribe this subscriber to a publisher</p>
818
+
819
+
820
+ </div>
821
+ </div>
822
+ <div class="tags">
823
+ <p class="tag_title">Parameters:</p>
824
+ <ul class="param">
825
+
826
+ <li>
827
+
828
+ <span class='name'>publisher</span>
829
+
830
+
831
+ <span class='type'>(<tt><span class='object_link'><a href="../Publisher.html" title="Tasker::Events::Publisher (class)">Tasker::Events::Publisher</a></span></tt>)</span>
832
+
833
+
834
+
835
+ &mdash;
836
+ <div class='inline'>
837
+ <p>The event publisher</p>
838
+ </div>
839
+
840
+ </li>
841
+
842
+ </ul>
843
+
844
+ <p class="tag_title">Returns:</p>
845
+ <ul class="return">
846
+
847
+ <li>
848
+
849
+
850
+ <span class='type'>(<tt><span class='object_link'><a href="" title="Tasker::Events::Subscribers::BaseSubscriber (class)">BaseSubscriber</a></span></tt>)</span>
851
+
852
+
853
+
854
+ &mdash;
855
+ <div class='inline'>
856
+ <p>The subscriber instance</p>
857
+ </div>
858
+
859
+ </li>
860
+
861
+ </ul>
862
+
863
+ </div><table class="source_code">
864
+ <tr>
865
+ <td>
866
+ <pre class="lines">
867
+
868
+
869
+ 75
870
+ 76
871
+ 77
872
+ 78
873
+ 79</pre>
874
+ </td>
875
+ <td>
876
+ <pre class="code"><span class="info file"># File 'lib/tasker/events/subscribers/base_subscriber.rb', line 75</span>
877
+
878
+ <span class='kw'>def</span> <span class='id identifier rubyid_subscribe'>subscribe</span><span class='lparen'>(</span><span class='id identifier rubyid_publisher'>publisher</span><span class='rparen'>)</span>
879
+ <span class='id identifier rubyid_subscriber'>subscriber</span> <span class='op'>=</span> <span class='id identifier rubyid_new'>new</span>
880
+ <span class='id identifier rubyid_subscriber'>subscriber</span><span class='period'>.</span><span class='id identifier rubyid_subscribe_to_publisher'>subscribe_to_publisher</span><span class='lparen'>(</span><span class='id identifier rubyid_publisher'>publisher</span><span class='rparen'>)</span>
881
+ <span class='id identifier rubyid_subscriber'>subscriber</span>
882
+ <span class='kw'>end</span></pre>
883
+ </td>
884
+ </tr>
885
+ </table>
886
+ </div>
887
+
888
+ <div class="method_details ">
889
+ <h3 class="signature " id="subscribe_to-class_method">
890
+
891
+ .<strong>subscribe_to</strong>(*events) &#x21d2; <tt>void</tt>
892
+
893
+
894
+
895
+
896
+
897
+ </h3><div class="docstring">
898
+ <div class="discussion">
899
+ <p class="note returns_void">This method returns an undefined value.</p>
900
+ <p>Declarative method to register events this subscriber cares about</p>
901
+
902
+ <p>Example: subscribe_to :task_completed, :step_failed subscribe_to ‘order.created’, ‘payment.processed’</p>
903
+
904
+
905
+ </div>
906
+ </div>
907
+ <div class="tags">
908
+ <p class="tag_title">Parameters:</p>
909
+ <ul class="param">
910
+
911
+ <li>
912
+
913
+ <span class='name'>events</span>
914
+
915
+
916
+ <span class='type'>(<tt>Array&lt;Symbol, String&gt;</tt>)</span>
917
+
918
+
919
+
920
+ &mdash;
921
+ <div class='inline'>
922
+ <p>Event names to subscribe to</p>
923
+ </div>
924
+
925
+ </li>
926
+
927
+ </ul>
928
+
929
+
930
+ </div><table class="source_code">
931
+ <tr>
932
+ <td>
933
+ <pre class="lines">
934
+
935
+
936
+ 54
937
+ 55
938
+ 56
939
+ 57
940
+ 58</pre>
941
+ </td>
942
+ <td>
943
+ <pre class="code"><span class="info file"># File 'lib/tasker/events/subscribers/base_subscriber.rb', line 54</span>
944
+
945
+ <span class='kw'>def</span> <span class='id identifier rubyid_subscribe_to'>subscribe_to</span><span class='lparen'>(</span><span class='op'>*</span><span class='id identifier rubyid_events'>events</span><span class='rparen'>)</span>
946
+ <span class='comment'># Accumulate events instead of replacing them
947
+ </span> <span class='id identifier rubyid_current_events'>current_events</span> <span class='op'>=</span> <span class='id identifier rubyid_subscribed_events'>subscribed_events</span> <span class='op'>||</span> <span class='lbracket'>[</span><span class='rbracket'>]</span>
948
+ <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_subscribed_events'>subscribed_events</span> <span class='op'>=</span> <span class='lparen'>(</span><span class='id identifier rubyid_current_events'>current_events</span> <span class='op'>+</span> <span class='id identifier rubyid_events'>events</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_s</span><span class='rparen'>)</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_uniq'>uniq</span>
949
+ <span class='kw'>end</span></pre>
950
+ </td>
951
+ </tr>
952
+ </table>
953
+ </div>
954
+
955
+ </div>
956
+
957
+ <div id="instance_method_details" class="method_details_list">
958
+ <h2>Instance Method Details</h2>
959
+
960
+
961
+ <div class="method_details first">
962
+ <h3 class="signature first" id="build_event_subscriptions-instance_method">
963
+
964
+ #<strong>build_event_subscriptions</strong> &#x21d2; <tt>Hash</tt> <span class="extras">(protected)</span>
965
+
966
+
967
+
968
+
969
+
970
+ </h3><div class="docstring">
971
+ <div class="discussion">
972
+
973
+ <p>Build event subscriptions using explicit constants</p>
974
+
975
+
976
+ </div>
977
+ </div>
978
+ <div class="tags">
979
+
980
+ <p class="tag_title">Returns:</p>
981
+ <ul class="return">
982
+
983
+ <li>
984
+
985
+
986
+ <span class='type'>(<tt>Hash</tt>)</span>
987
+
988
+
989
+
990
+ &mdash;
991
+ <div class='inline'>
992
+ <p>Mapping of event constants to handler method symbols</p>
993
+ </div>
994
+
995
+ </li>
996
+
997
+ </ul>
998
+
999
+ </div><table class="source_code">
1000
+ <tr>
1001
+ <td>
1002
+ <pre class="lines">
1003
+
1004
+
1005
+ 121
1006
+ 122
1007
+ 123
1008
+ 124
1009
+ 125
1010
+ 126
1011
+ 127
1012
+ 128
1013
+ 129
1014
+ 130
1015
+ 131
1016
+ 132
1017
+ 133
1018
+ 134
1019
+ 135
1020
+ 136
1021
+ 137
1022
+ 138
1023
+ 139
1024
+ 140</pre>
1025
+ </td>
1026
+ <td>
1027
+ <pre class="code"><span class="info file"># File 'lib/tasker/events/subscribers/base_subscriber.rb', line 121</span>
1028
+
1029
+ <span class='kw'>def</span> <span class='id identifier rubyid_build_event_subscriptions'>build_event_subscriptions</span>
1030
+ <span class='id identifier rubyid_subscriptions'>subscriptions</span> <span class='op'>=</span> <span class='lbrace'>{</span><span class='rbrace'>}</span>
1031
+
1032
+ <span class='lparen'>(</span><span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_class'>class</span><span class='period'>.</span><span class='id identifier rubyid_subscribed_events'>subscribed_events</span> <span class='op'>||</span> <span class='lbracket'>[</span><span class='rbracket'>]</span><span class='rparen'>)</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_event_name'>event_name</span><span class='op'>|</span>
1033
+ <span class='comment'># Convert developer-friendly name to internal constant
1034
+ </span> <span class='id identifier rubyid_internal_constant'>internal_constant</span> <span class='op'>=</span> <span class='id identifier rubyid_resolve_internal_event_constant'>resolve_internal_event_constant</span><span class='lparen'>(</span><span class='id identifier rubyid_event_name'>event_name</span><span class='rparen'>)</span>
1035
+
1036
+ <span class='comment'># Generate handler method name: order.processed -&gt; handle_order_processed
1037
+ </span> <span class='id identifier rubyid_handler_method'>handler_method</span> <span class='op'>=</span> <span class='id identifier rubyid_generate_handler_method_name'>generate_handler_method_name</span><span class='lparen'>(</span><span class='id identifier rubyid_event_name'>event_name</span><span class='rparen'>)</span>
1038
+
1039
+ <span class='comment'># Only add if the handler method exists
1040
+ </span> <span class='kw'>if</span> <span class='id identifier rubyid_respond_to?'>respond_to?</span><span class='lparen'>(</span><span class='id identifier rubyid_handler_method'>handler_method</span><span class='comma'>,</span> <span class='kw'>true</span><span class='rparen'>)</span>
1041
+ <span class='id identifier rubyid_subscriptions'>subscriptions</span><span class='lbracket'>[</span><span class='id identifier rubyid_internal_constant'>internal_constant</span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_handler_method'>handler_method</span>
1042
+ <span class='kw'>else</span>
1043
+ <span class='const'>Rails</span><span class='period'>.</span><span class='id identifier rubyid_logger'>logger</span><span class='period'>.</span><span class='id identifier rubyid_warn'>warn</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='embexpr_beg'>#{</span><span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_class'>class</span><span class='period'>.</span><span class='id identifier rubyid_name'>name</span><span class='embexpr_end'>}</span><span class='tstring_content'>: Handler method </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_handler_method'>handler_method</span><span class='embexpr_end'>}</span><span class='tstring_content'> not found for event </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_event_name'>event_name</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span>
1044
+ <span class='kw'>end</span>
1045
+ <span class='kw'>end</span>
1046
+
1047
+ <span class='id identifier rubyid_subscriptions'>subscriptions</span>
1048
+ <span class='kw'>end</span></pre>
1049
+ </td>
1050
+ </tr>
1051
+ </table>
1052
+ </div>
1053
+
1054
+ <div class="method_details ">
1055
+ <h3 class="signature " id="build_metric_name-instance_method">
1056
+
1057
+ #<strong>build_metric_name</strong>(base_name, event_type) &#x21d2; <tt>String</tt> <span class="extras">(protected)</span>
1058
+
1059
+
1060
+
1061
+
1062
+
1063
+ </h3><div class="docstring">
1064
+ <div class="discussion">
1065
+
1066
+ <p>Create metric name with consistent naming convention</p>
1067
+
1068
+ <p>Example: metric_name = build_metric_name(‘tasker.task’, ‘completed’) # =&gt; ‘tasker.task.completed’</p>
1069
+
1070
+
1071
+ </div>
1072
+ </div>
1073
+ <div class="tags">
1074
+ <p class="tag_title">Parameters:</p>
1075
+ <ul class="param">
1076
+
1077
+ <li>
1078
+
1079
+ <span class='name'>base_name</span>
1080
+
1081
+
1082
+ <span class='type'>(<tt>String</tt>)</span>
1083
+
1084
+
1085
+
1086
+ &mdash;
1087
+ <div class='inline'>
1088
+ <p>The base metric name</p>
1089
+ </div>
1090
+
1091
+ </li>
1092
+
1093
+ <li>
1094
+
1095
+ <span class='name'>event_type</span>
1096
+
1097
+
1098
+ <span class='type'>(<tt>String</tt>)</span>
1099
+
1100
+
1101
+
1102
+ &mdash;
1103
+ <div class='inline'>
1104
+ <p>The event type (completed, failed, etc.)</p>
1105
+ </div>
1106
+
1107
+ </li>
1108
+
1109
+ </ul>
1110
+
1111
+ <p class="tag_title">Returns:</p>
1112
+ <ul class="return">
1113
+
1114
+ <li>
1115
+
1116
+
1117
+ <span class='type'>(<tt>String</tt>)</span>
1118
+
1119
+
1120
+
1121
+ &mdash;
1122
+ <div class='inline'>
1123
+ <p>Standardized metric name</p>
1124
+ </div>
1125
+
1126
+ </li>
1127
+
1128
+ </ul>
1129
+
1130
+ </div><table class="source_code">
1131
+ <tr>
1132
+ <td>
1133
+ <pre class="lines">
1134
+
1135
+
1136
+ 433
1137
+ 434
1138
+ 435</pre>
1139
+ </td>
1140
+ <td>
1141
+ <pre class="code"><span class="info file"># File 'lib/tasker/events/subscribers/base_subscriber.rb', line 433</span>
1142
+
1143
+ <span class='kw'>def</span> <span class='id identifier rubyid_build_metric_name'>build_metric_name</span><span class='lparen'>(</span><span class='id identifier rubyid_base_name'>base_name</span><span class='comma'>,</span> <span class='id identifier rubyid_event_type'>event_type</span><span class='rparen'>)</span>
1144
+ <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_base_name'>base_name</span><span class='embexpr_end'>}</span><span class='tstring_content'>.</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_event_type'>event_type</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span><span class='period'>.</span><span class='id identifier rubyid_squeeze'>squeeze</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>.</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span>
1145
+ <span class='kw'>end</span></pre>
1146
+ </td>
1147
+ </tr>
1148
+ </table>
1149
+ </div>
1150
+
1151
+ <div class="method_details ">
1152
+ <h3 class="signature " id="custom_event?-instance_method">
1153
+
1154
+ #<strong>custom_event?</strong>(event_constant) &#x21d2; <tt>Boolean</tt> <span class="extras">(protected)</span>
1155
+
1156
+
1157
+
1158
+
1159
+
1160
+ </h3><div class="docstring">
1161
+ <div class="discussion">
1162
+
1163
+ <p>Check if an event is a custom event (not a system constant)</p>
1164
+
1165
+
1166
+ </div>
1167
+ </div>
1168
+ <div class="tags">
1169
+ <p class="tag_title">Parameters:</p>
1170
+ <ul class="param">
1171
+
1172
+ <li>
1173
+
1174
+ <span class='name'>event_constant</span>
1175
+
1176
+
1177
+ <span class='type'>(<tt>String</tt>)</span>
1178
+
1179
+
1180
+
1181
+ &mdash;
1182
+ <div class='inline'>
1183
+ <p>The event constant or name</p>
1184
+ </div>
1185
+
1186
+ </li>
1187
+
1188
+ </ul>
1189
+
1190
+ <p class="tag_title">Returns:</p>
1191
+ <ul class="return">
1192
+
1193
+ <li>
1194
+
1195
+
1196
+ <span class='type'>(<tt>Boolean</tt>)</span>
1197
+
1198
+
1199
+
1200
+ &mdash;
1201
+ <div class='inline'>
1202
+ <p>Whether it’s a custom event</p>
1203
+ </div>
1204
+
1205
+ </li>
1206
+
1207
+ </ul>
1208
+
1209
+ </div><table class="source_code">
1210
+ <tr>
1211
+ <td>
1212
+ <pre class="lines">
1213
+
1214
+
1215
+ 103
1216
+ 104
1217
+ 105
1218
+ 106</pre>
1219
+ </td>
1220
+ <td>
1221
+ <pre class="code"><span class="info file"># File 'lib/tasker/events/subscribers/base_subscriber.rb', line 103</span>
1222
+
1223
+ <span class='kw'>def</span> <span class='id identifier rubyid_custom_event?'>custom_event?</span><span class='lparen'>(</span><span class='id identifier rubyid_event_constant'>event_constant</span><span class='rparen'>)</span>
1224
+ <span class='id identifier rubyid_event_str'>event_str</span> <span class='op'>=</span> <span class='id identifier rubyid_event_constant'>event_constant</span><span class='period'>.</span><span class='id identifier rubyid_to_s'>to_s</span>
1225
+ <span class='id identifier rubyid_event_str'>event_str</span><span class='period'>.</span><span class='id identifier rubyid_exclude?'>exclude?</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>Tasker::Constants::</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span> <span class='op'>&amp;&amp;</span> <span class='id identifier rubyid_event_str'>event_str</span><span class='period'>.</span><span class='id identifier rubyid_include?'>include?</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>.</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span>
1226
+ <span class='kw'>end</span></pre>
1227
+ </td>
1228
+ </tr>
1229
+ </table>
1230
+ </div>
1231
+
1232
+ <div class="method_details ">
1233
+ <h3 class="signature " id="event_subscriptions-instance_method">
1234
+
1235
+ #<strong>event_subscriptions</strong> &#x21d2; <tt>Hash</tt> <span class="extras">(protected)</span>
1236
+
1237
+
1238
+
1239
+
1240
+
1241
+ </h3><div class="docstring">
1242
+ <div class="discussion">
1243
+
1244
+ <p>Get event subscriptions mapping for this subscriber</p>
1245
+
1246
+ <p>This method maps event constants to handler methods using naming conventions. Override this method to customize the mapping.</p>
1247
+
1248
+
1249
+ </div>
1250
+ </div>
1251
+ <div class="tags">
1252
+
1253
+ <p class="tag_title">Returns:</p>
1254
+ <ul class="return">
1255
+
1256
+ <li>
1257
+
1258
+
1259
+ <span class='type'>(<tt>Hash</tt>)</span>
1260
+
1261
+
1262
+
1263
+ &mdash;
1264
+ <div class='inline'>
1265
+ <p>Mapping of event constants to handler method symbols</p>
1266
+ </div>
1267
+
1268
+ </li>
1269
+
1270
+ </ul>
1271
+
1272
+ </div><table class="source_code">
1273
+ <tr>
1274
+ <td>
1275
+ <pre class="lines">
1276
+
1277
+
1278
+ 114
1279
+ 115
1280
+ 116</pre>
1281
+ </td>
1282
+ <td>
1283
+ <pre class="code"><span class="info file"># File 'lib/tasker/events/subscribers/base_subscriber.rb', line 114</span>
1284
+
1285
+ <span class='kw'>def</span> <span class='id identifier rubyid_event_subscriptions'>event_subscriptions</span>
1286
+ <span class='ivar'>@event_subscriptions</span> <span class='op'>||=</span> <span class='id identifier rubyid_build_event_subscriptions'>build_event_subscriptions</span>
1287
+ <span class='kw'>end</span></pre>
1288
+ </td>
1289
+ </tr>
1290
+ </table>
1291
+ </div>
1292
+
1293
+ <div class="method_details ">
1294
+ <h3 class="signature " id="extract_core_attributes-instance_method">
1295
+
1296
+ #<strong>extract_core_attributes</strong>(event) &#x21d2; <tt>Hash</tt> <span class="extras">(protected)</span>
1297
+
1298
+
1299
+
1300
+
1301
+
1302
+ </h3><div class="docstring">
1303
+ <div class="discussion">
1304
+
1305
+ <p>Extract core attributes common to most events</p>
1306
+
1307
+
1308
+ </div>
1309
+ </div>
1310
+ <div class="tags">
1311
+ <p class="tag_title">Parameters:</p>
1312
+ <ul class="param">
1313
+
1314
+ <li>
1315
+
1316
+ <span class='name'>event</span>
1317
+
1318
+
1319
+ <span class='type'>(<tt>Hash</tt>, <tt>Dry::Events::Event</tt>)</span>
1320
+
1321
+
1322
+
1323
+ &mdash;
1324
+ <div class='inline'>
1325
+ <p>The event payload or event object</p>
1326
+ </div>
1327
+
1328
+ </li>
1329
+
1330
+ </ul>
1331
+
1332
+ <p class="tag_title">Returns:</p>
1333
+ <ul class="return">
1334
+
1335
+ <li>
1336
+
1337
+
1338
+ <span class='type'>(<tt>Hash</tt>)</span>
1339
+
1340
+
1341
+
1342
+ &mdash;
1343
+ <div class='inline'>
1344
+ <p>Core attributes</p>
1345
+ </div>
1346
+
1347
+ </li>
1348
+
1349
+ </ul>
1350
+
1351
+ </div><table class="source_code">
1352
+ <tr>
1353
+ <td>
1354
+ <pre class="lines">
1355
+
1356
+
1357
+ 227
1358
+ 228
1359
+ 229
1360
+ 230
1361
+ 231
1362
+ 232
1363
+ 233</pre>
1364
+ </td>
1365
+ <td>
1366
+ <pre class="code"><span class="info file"># File 'lib/tasker/events/subscribers/base_subscriber.rb', line 227</span>
1367
+
1368
+ <span class='kw'>def</span> <span class='id identifier rubyid_extract_core_attributes'>extract_core_attributes</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='rparen'>)</span>
1369
+ <span class='lbrace'>{</span>
1370
+ <span class='label'>task_id:</span> <span class='id identifier rubyid_safe_get'>safe_get</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='comma'>,</span> <span class='symbol'>:task_id</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>unknown</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span><span class='comma'>,</span>
1371
+ <span class='label'>step_id:</span> <span class='id identifier rubyid_safe_get'>safe_get</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='comma'>,</span> <span class='symbol'>:step_id</span><span class='rparen'>)</span><span class='comma'>,</span>
1372
+ <span class='label'>event_timestamp:</span> <span class='id identifier rubyid_safe_get'>safe_get</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='comma'>,</span> <span class='symbol'>:timestamp</span><span class='comma'>,</span> <span class='const'>Time</span><span class='period'>.</span><span class='id identifier rubyid_current'>current</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_to_s'>to_s</span>
1373
+ <span class='rbrace'>}</span><span class='period'>.</span><span class='id identifier rubyid_compact'>compact</span>
1374
+ <span class='kw'>end</span></pre>
1375
+ </td>
1376
+ </tr>
1377
+ </table>
1378
+ </div>
1379
+
1380
+ <div class="method_details ">
1381
+ <h3 class="signature " id="extract_error_metrics-instance_method">
1382
+
1383
+ #<strong>extract_error_metrics</strong>(event) &#x21d2; <tt>Hash</tt> <span class="extras">(protected)</span>
1384
+
1385
+
1386
+
1387
+
1388
+
1389
+ </h3><div class="docstring">
1390
+ <div class="discussion">
1391
+
1392
+ <p>Extract error metrics from failure events</p>
1393
+
1394
+ <p>Example: error = extract_error_metrics(event) StatsD.increment(‘tasker.errors’, tags: [“error_type:#:error_type”])</p>
1395
+
1396
+
1397
+ </div>
1398
+ </div>
1399
+ <div class="tags">
1400
+ <p class="tag_title">Parameters:</p>
1401
+ <ul class="param">
1402
+
1403
+ <li>
1404
+
1405
+ <span class='name'>event</span>
1406
+
1407
+
1408
+ <span class='type'>(<tt>Hash</tt>, <tt>Dry::Events::Event</tt>)</span>
1409
+
1410
+
1411
+
1412
+ &mdash;
1413
+ <div class='inline'>
1414
+ <p>The event payload</p>
1415
+ </div>
1416
+
1417
+ </li>
1418
+
1419
+ </ul>
1420
+
1421
+ <p class="tag_title">Returns:</p>
1422
+ <ul class="return">
1423
+
1424
+ <li>
1425
+
1426
+
1427
+ <span class='type'>(<tt>Hash</tt>)</span>
1428
+
1429
+
1430
+
1431
+ &mdash;
1432
+ <div class='inline'>
1433
+ <p>Error metrics with categorization</p>
1434
+ </div>
1435
+
1436
+ </li>
1437
+
1438
+ </ul>
1439
+
1440
+ </div><table class="source_code">
1441
+ <tr>
1442
+ <td>
1443
+ <pre class="lines">
1444
+
1445
+
1446
+ 279
1447
+ 280
1448
+ 281
1449
+ 282
1450
+ 283
1451
+ 284
1452
+ 285
1453
+ 286
1454
+ 287
1455
+ 288</pre>
1456
+ </td>
1457
+ <td>
1458
+ <pre class="code"><span class="info file"># File 'lib/tasker/events/subscribers/base_subscriber.rb', line 279</span>
1459
+
1460
+ <span class='kw'>def</span> <span class='id identifier rubyid_extract_error_metrics'>extract_error_metrics</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='rparen'>)</span>
1461
+ <span class='lbrace'>{</span>
1462
+ <span class='label'>error_message:</span> <span class='id identifier rubyid_safe_get'>safe_get</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='comma'>,</span> <span class='symbol'>:error_message</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>unknown_error</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span><span class='comma'>,</span>
1463
+ <span class='label'>error_class:</span> <span class='id identifier rubyid_safe_get'>safe_get</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='comma'>,</span> <span class='symbol'>:exception_class</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>UnknownError</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span><span class='comma'>,</span>
1464
+ <span class='label'>error_type:</span> <span class='id identifier rubyid_categorize_error'>categorize_error</span><span class='lparen'>(</span><span class='id identifier rubyid_safe_get'>safe_get</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='comma'>,</span> <span class='symbol'>:exception_class</span><span class='rparen'>)</span><span class='rparen'>)</span><span class='comma'>,</span>
1465
+ <span class='label'>attempt_number:</span> <span class='id identifier rubyid_safe_get'>safe_get</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='comma'>,</span> <span class='symbol'>:attempt_number</span><span class='comma'>,</span> <span class='int'>1</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_to_i'>to_i</span><span class='comma'>,</span>
1466
+ <span class='label'>is_retryable:</span> <span class='id identifier rubyid_safe_get'>safe_get</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='comma'>,</span> <span class='symbol'>:retryable</span><span class='comma'>,</span> <span class='kw'>false</span><span class='rparen'>)</span><span class='comma'>,</span>
1467
+ <span class='label'>final_failure:</span> <span class='id identifier rubyid_safe_get'>safe_get</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='comma'>,</span> <span class='symbol'>:attempt_number</span><span class='comma'>,</span> <span class='int'>1</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_to_i'>to_i</span> <span class='op'>&gt;=</span> <span class='id identifier rubyid_safe_get'>safe_get</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='comma'>,</span> <span class='symbol'>:retry_limit</span><span class='comma'>,</span> <span class='int'>1</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_to_i'>to_i</span>
1468
+ <span class='rbrace'>}</span>
1469
+ <span class='kw'>end</span></pre>
1470
+ </td>
1471
+ </tr>
1472
+ </table>
1473
+ </div>
1474
+
1475
+ <div class="method_details ">
1476
+ <h3 class="signature " id="extract_metric_tags-instance_method">
1477
+
1478
+ #<strong>extract_metric_tags</strong>(event) &#x21d2; <tt>Array&lt;String&gt;</tt> <span class="extras">(protected)</span>
1479
+
1480
+
1481
+
1482
+
1483
+
1484
+ </h3><div class="docstring">
1485
+ <div class="discussion">
1486
+
1487
+ <p>Extract business metrics tags for categorization</p>
1488
+
1489
+ <p>Example: tags = extract_metric_tags(event) StatsD.increment(‘tasker.task.completed’, tags: tags)</p>
1490
+
1491
+
1492
+ </div>
1493
+ </div>
1494
+ <div class="tags">
1495
+ <p class="tag_title">Parameters:</p>
1496
+ <ul class="param">
1497
+
1498
+ <li>
1499
+
1500
+ <span class='name'>event</span>
1501
+
1502
+
1503
+ <span class='type'>(<tt>Hash</tt>, <tt>Dry::Events::Event</tt>)</span>
1504
+
1505
+
1506
+
1507
+ &mdash;
1508
+ <div class='inline'>
1509
+ <p>The event payload</p>
1510
+ </div>
1511
+
1512
+ </li>
1513
+
1514
+ </ul>
1515
+
1516
+ <p class="tag_title">Returns:</p>
1517
+ <ul class="return">
1518
+
1519
+ <li>
1520
+
1521
+
1522
+ <span class='type'>(<tt>Array&lt;String&gt;</tt>)</span>
1523
+
1524
+
1525
+
1526
+ &mdash;
1527
+ <div class='inline'>
1528
+ <p>Array of tag strings for metrics systems</p>
1529
+ </div>
1530
+
1531
+ </li>
1532
+
1533
+ </ul>
1534
+
1535
+ </div><table class="source_code">
1536
+ <tr>
1537
+ <td>
1538
+ <pre class="lines">
1539
+
1540
+
1541
+ 316
1542
+ 317
1543
+ 318</pre>
1544
+ </td>
1545
+ <td>
1546
+ <pre class="code"><span class="info file"># File 'lib/tasker/events/subscribers/base_subscriber.rb', line 316</span>
1547
+
1548
+ <span class='kw'>def</span> <span class='id identifier rubyid_extract_metric_tags'>extract_metric_tags</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='rparen'>)</span>
1549
+ <span class='const'><span class='object_link'><a href="BaseSubscriber/MetricTagsExtractor.html" title="Tasker::Events::Subscribers::BaseSubscriber::MetricTagsExtractor (class)">MetricTagsExtractor</a></span></span><span class='period'>.</span><span class='id identifier rubyid_extract'><span class='object_link'><a href="BaseSubscriber/MetricTagsExtractor.html#extract-class_method" title="Tasker::Events::Subscribers::BaseSubscriber::MetricTagsExtractor.extract (method)">extract</a></span></span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='rparen'>)</span>
1550
+ <span class='kw'>end</span></pre>
1551
+ </td>
1552
+ </tr>
1553
+ </table>
1554
+ </div>
1555
+
1556
+ <div class="method_details ">
1557
+ <h3 class="signature " id="extract_numeric_metric-instance_method">
1558
+
1559
+ #<strong>extract_numeric_metric</strong>(event, key, default = 0) &#x21d2; <tt>Numeric</tt> <span class="extras">(protected)</span>
1560
+
1561
+
1562
+
1563
+
1564
+
1565
+ </h3><div class="docstring">
1566
+ <div class="discussion">
1567
+
1568
+ <p>Extract numeric value safely for metrics</p>
1569
+
1570
+ <p>Example: duration = extract_numeric_metric(event, :execution_duration, 0.0) StatsD.histogram(‘task.duration’, duration)</p>
1571
+
1572
+
1573
+ </div>
1574
+ </div>
1575
+ <div class="tags">
1576
+ <p class="tag_title">Parameters:</p>
1577
+ <ul class="param">
1578
+
1579
+ <li>
1580
+
1581
+ <span class='name'>event</span>
1582
+
1583
+
1584
+ <span class='type'>(<tt>Hash</tt>, <tt>Dry::Events::Event</tt>)</span>
1585
+
1586
+
1587
+
1588
+ &mdash;
1589
+ <div class='inline'>
1590
+ <p>The event payload</p>
1591
+ </div>
1592
+
1593
+ </li>
1594
+
1595
+ <li>
1596
+
1597
+ <span class='name'>key</span>
1598
+
1599
+
1600
+ <span class='type'>(<tt>Symbol</tt>, <tt>String</tt>)</span>
1601
+
1602
+
1603
+
1604
+ &mdash;
1605
+ <div class='inline'>
1606
+ <p>The key to extract</p>
1607
+ </div>
1608
+
1609
+ </li>
1610
+
1611
+ <li>
1612
+
1613
+ <span class='name'>default</span>
1614
+
1615
+
1616
+ <span class='type'>(<tt>Numeric</tt>)</span>
1617
+
1618
+
1619
+ <em class="default">(defaults to: <tt>0</tt>)</em>
1620
+
1621
+
1622
+ &mdash;
1623
+ <div class='inline'>
1624
+ <p>The default value</p>
1625
+ </div>
1626
+
1627
+ </li>
1628
+
1629
+ </ul>
1630
+
1631
+ <p class="tag_title">Returns:</p>
1632
+ <ul class="return">
1633
+
1634
+ <li>
1635
+
1636
+
1637
+ <span class='type'>(<tt>Numeric</tt>)</span>
1638
+
1639
+
1640
+
1641
+ &mdash;
1642
+ <div class='inline'>
1643
+ <p>The numeric value</p>
1644
+ </div>
1645
+
1646
+ </li>
1647
+
1648
+ </ul>
1649
+
1650
+ </div><table class="source_code">
1651
+ <tr>
1652
+ <td>
1653
+ <pre class="lines">
1654
+
1655
+
1656
+ 447
1657
+ 448
1658
+ 449
1659
+ 450
1660
+ 451
1661
+ 452
1662
+ 453
1663
+ 454
1664
+ 455
1665
+ 456
1666
+ 457
1667
+ 458
1668
+ 459
1669
+ 460
1670
+ 461</pre>
1671
+ </td>
1672
+ <td>
1673
+ <pre class="code"><span class="info file"># File 'lib/tasker/events/subscribers/base_subscriber.rb', line 447</span>
1674
+
1675
+ <span class='kw'>def</span> <span class='id identifier rubyid_extract_numeric_metric'>extract_numeric_metric</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='comma'>,</span> <span class='id identifier rubyid_key'>key</span><span class='comma'>,</span> <span class='id identifier rubyid_default'>default</span> <span class='op'>=</span> <span class='int'>0</span><span class='rparen'>)</span>
1676
+ <span class='id identifier rubyid_value'>value</span> <span class='op'>=</span> <span class='id identifier rubyid_safe_get'>safe_get</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='comma'>,</span> <span class='id identifier rubyid_key'>key</span><span class='comma'>,</span> <span class='id identifier rubyid_default'>default</span><span class='rparen'>)</span>
1677
+
1678
+ <span class='comment'># Handle nil values and non-numeric types
1679
+ </span> <span class='kw'>return</span> <span class='id identifier rubyid_default'>default</span> <span class='kw'>if</span> <span class='id identifier rubyid_value'>value</span><span class='period'>.</span><span class='id identifier rubyid_nil?'>nil?</span> <span class='op'>||</span> <span class='op'>!</span><span class='id identifier rubyid_value'>value</span><span class='period'>.</span><span class='id identifier rubyid_respond_to?'>respond_to?</span><span class='lparen'>(</span><span class='symbol'>:to_f</span><span class='rparen'>)</span>
1680
+
1681
+ <span class='comment'># Try to convert to float
1682
+ </span> <span class='id identifier rubyid_converted'>converted</span> <span class='op'>=</span> <span class='id identifier rubyid_value'>value</span><span class='period'>.</span><span class='id identifier rubyid_to_f'>to_f</span>
1683
+
1684
+ <span class='comment'># Check if this was a valid numeric conversion
1685
+ </span> <span class='comment'># For strings that can&#39;t convert, to_f returns 0.0
1686
+ </span> <span class='kw'>return</span> <span class='id identifier rubyid_default'>default</span> <span class='kw'>if</span> <span class='id identifier rubyid_converted'>converted</span> <span class='op'>==</span> <span class='float'>0.0</span> <span class='op'>&amp;&amp;</span> <span class='id identifier rubyid_value'>value</span><span class='period'>.</span><span class='id identifier rubyid_is_a?'>is_a?</span><span class='lparen'>(</span><span class='const'>String</span><span class='rparen'>)</span> <span class='op'>&amp;&amp;</span> <span class='id identifier rubyid_value'>value</span> <span class='op'>!~</span> <span class='tstring'><span class='regexp_beg'>/</span><span class='tstring_content'>\A\s*0*(\.0*)?\s*\z</span><span class='regexp_end'>/</span></span>
1687
+
1688
+ <span class='id identifier rubyid_converted'>converted</span>
1689
+ <span class='kw'>end</span></pre>
1690
+ </td>
1691
+ </tr>
1692
+ </table>
1693
+ </div>
1694
+
1695
+ <div class="method_details ">
1696
+ <h3 class="signature " id="extract_performance_metrics-instance_method">
1697
+
1698
+ #<strong>extract_performance_metrics</strong>(event) &#x21d2; <tt>Hash</tt> <span class="extras">(protected)</span>
1699
+
1700
+
1701
+
1702
+
1703
+
1704
+ </h3><div class="docstring">
1705
+ <div class="discussion">
1706
+
1707
+ <p>Extract performance metrics for operational monitoring</p>
1708
+
1709
+ <p>Example: perf = extract_performance_metrics(event) StatsD.histogram(‘tasker.memory_usage’, <a href=":memory_usage">perf</a>)</p>
1710
+
1711
+
1712
+ </div>
1713
+ </div>
1714
+ <div class="tags">
1715
+ <p class="tag_title">Parameters:</p>
1716
+ <ul class="param">
1717
+
1718
+ <li>
1719
+
1720
+ <span class='name'>event</span>
1721
+
1722
+
1723
+ <span class='type'>(<tt>Hash</tt>, <tt>Dry::Events::Event</tt>)</span>
1724
+
1725
+
1726
+
1727
+ &mdash;
1728
+ <div class='inline'>
1729
+ <p>The event payload</p>
1730
+ </div>
1731
+
1732
+ </li>
1733
+
1734
+ </ul>
1735
+
1736
+ <p class="tag_title">Returns:</p>
1737
+ <ul class="return">
1738
+
1739
+ <li>
1740
+
1741
+
1742
+ <span class='type'>(<tt>Hash</tt>)</span>
1743
+
1744
+
1745
+
1746
+ &mdash;
1747
+ <div class='inline'>
1748
+ <p>Performance metrics</p>
1749
+ </div>
1750
+
1751
+ </li>
1752
+
1753
+ </ul>
1754
+
1755
+ </div><table class="source_code">
1756
+ <tr>
1757
+ <td>
1758
+ <pre class="lines">
1759
+
1760
+
1761
+ 298
1762
+ 299
1763
+ 300
1764
+ 301
1765
+ 302
1766
+ 303
1767
+ 304
1768
+ 305
1769
+ 306</pre>
1770
+ </td>
1771
+ <td>
1772
+ <pre class="code"><span class="info file"># File 'lib/tasker/events/subscribers/base_subscriber.rb', line 298</span>
1773
+
1774
+ <span class='kw'>def</span> <span class='id identifier rubyid_extract_performance_metrics'>extract_performance_metrics</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='rparen'>)</span>
1775
+ <span class='lbrace'>{</span>
1776
+ <span class='label'>memory_usage:</span> <span class='id identifier rubyid_safe_get'>safe_get</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='comma'>,</span> <span class='symbol'>:memory_usage</span><span class='comma'>,</span> <span class='int'>0</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_to_i'>to_i</span><span class='comma'>,</span>
1777
+ <span class='label'>cpu_time:</span> <span class='id identifier rubyid_safe_get'>safe_get</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='comma'>,</span> <span class='symbol'>:cpu_time</span><span class='comma'>,</span> <span class='float'>0.0</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_to_f'>to_f</span><span class='comma'>,</span>
1778
+ <span class='label'>queue_time:</span> <span class='id identifier rubyid_safe_get'>safe_get</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='comma'>,</span> <span class='symbol'>:queue_time</span><span class='comma'>,</span> <span class='float'>0.0</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_to_f'>to_f</span><span class='comma'>,</span>
1779
+ <span class='label'>processing_time:</span> <span class='id identifier rubyid_safe_get'>safe_get</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='comma'>,</span> <span class='symbol'>:processing_time</span><span class='comma'>,</span> <span class='float'>0.0</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_to_f'>to_f</span><span class='comma'>,</span>
1780
+ <span class='label'>retry_delay:</span> <span class='id identifier rubyid_safe_get'>safe_get</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='comma'>,</span> <span class='symbol'>:retry_delay</span><span class='comma'>,</span> <span class='float'>0.0</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_to_f'>to_f</span>
1781
+ <span class='rbrace'>}</span>
1782
+ <span class='kw'>end</span></pre>
1783
+ </td>
1784
+ </tr>
1785
+ </table>
1786
+ </div>
1787
+
1788
+ <div class="method_details ">
1789
+ <h3 class="signature " id="extract_step_attributes-instance_method">
1790
+
1791
+ #<strong>extract_step_attributes</strong>(event) &#x21d2; <tt>Hash</tt> <span class="extras">(protected)</span>
1792
+
1793
+
1794
+
1795
+
1796
+
1797
+ </h3><div class="docstring">
1798
+ <div class="discussion">
1799
+
1800
+ <p>Extract step-specific attributes (for TelemetrySubscriber compatibility)</p>
1801
+
1802
+
1803
+ </div>
1804
+ </div>
1805
+ <div class="tags">
1806
+ <p class="tag_title">Parameters:</p>
1807
+ <ul class="param">
1808
+
1809
+ <li>
1810
+
1811
+ <span class='name'>event</span>
1812
+
1813
+
1814
+ <span class='type'>(<tt>Hash</tt>, <tt>Dry::Events::Event</tt>)</span>
1815
+
1816
+
1817
+
1818
+ &mdash;
1819
+ <div class='inline'>
1820
+ <p>The event payload or event object</p>
1821
+ </div>
1822
+
1823
+ </li>
1824
+
1825
+ </ul>
1826
+
1827
+ <p class="tag_title">Returns:</p>
1828
+ <ul class="return">
1829
+
1830
+ <li>
1831
+
1832
+
1833
+ <span class='type'>(<tt>Hash</tt>)</span>
1834
+
1835
+
1836
+
1837
+ &mdash;
1838
+ <div class='inline'>
1839
+ <p>Step attributes</p>
1840
+ </div>
1841
+
1842
+ </li>
1843
+
1844
+ </ul>
1845
+
1846
+ </div><table class="source_code">
1847
+ <tr>
1848
+ <td>
1849
+ <pre class="lines">
1850
+
1851
+
1852
+ 239
1853
+ 240
1854
+ 241
1855
+ 242
1856
+ 243
1857
+ 244</pre>
1858
+ </td>
1859
+ <td>
1860
+ <pre class="code"><span class="info file"># File 'lib/tasker/events/subscribers/base_subscriber.rb', line 239</span>
1861
+
1862
+ <span class='kw'>def</span> <span class='id identifier rubyid_extract_step_attributes'>extract_step_attributes</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='rparen'>)</span>
1863
+ <span class='id identifier rubyid_extract_core_attributes'>extract_core_attributes</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_merge'>merge</span><span class='lparen'>(</span>
1864
+ <span class='label'>step_id:</span> <span class='id identifier rubyid_safe_get'>safe_get</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='comma'>,</span> <span class='symbol'>:step_id</span><span class='rparen'>)</span><span class='comma'>,</span>
1865
+ <span class='label'>step_name:</span> <span class='id identifier rubyid_safe_get'>safe_get</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='comma'>,</span> <span class='symbol'>:step_name</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>unknown_step</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span>
1866
+ <span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_compact'>compact</span>
1867
+ <span class='kw'>end</span></pre>
1868
+ </td>
1869
+ </tr>
1870
+ </table>
1871
+ </div>
1872
+
1873
+ <div class="method_details ">
1874
+ <h3 class="signature " id="extract_timing_metrics-instance_method">
1875
+
1876
+ #<strong>extract_timing_metrics</strong>(event) &#x21d2; <tt>Hash</tt> <span class="extras">(protected)</span>
1877
+
1878
+
1879
+
1880
+
1881
+
1882
+ </h3><div class="docstring">
1883
+ <div class="discussion">
1884
+
1885
+ <p>Extract timing metrics from completion events</p>
1886
+
1887
+ <p>Example: timing = extract_timing_metrics(event) StatsD.histogram(‘tasker.task.duration’, <a href=":execution_duration">timing</a>) StatsD.gauge(‘tasker.task.step_count’, <a href=":step_count">timing</a>)</p>
1888
+
1889
+
1890
+ </div>
1891
+ </div>
1892
+ <div class="tags">
1893
+ <p class="tag_title">Parameters:</p>
1894
+ <ul class="param">
1895
+
1896
+ <li>
1897
+
1898
+ <span class='name'>event</span>
1899
+
1900
+
1901
+ <span class='type'>(<tt>Hash</tt>, <tt>Dry::Events::Event</tt>)</span>
1902
+
1903
+
1904
+
1905
+ &mdash;
1906
+ <div class='inline'>
1907
+ <p>The event payload</p>
1908
+ </div>
1909
+
1910
+ </li>
1911
+
1912
+ </ul>
1913
+
1914
+ <p class="tag_title">Returns:</p>
1915
+ <ul class="return">
1916
+
1917
+ <li>
1918
+
1919
+
1920
+ <span class='type'>(<tt>Hash</tt>)</span>
1921
+
1922
+
1923
+
1924
+ &mdash;
1925
+ <div class='inline'>
1926
+ <p>Timing metrics with default values</p>
1927
+ </div>
1928
+
1929
+ </li>
1930
+
1931
+ </ul>
1932
+
1933
+ </div><table class="source_code">
1934
+ <tr>
1935
+ <td>
1936
+ <pre class="lines">
1937
+
1938
+
1939
+ 260
1940
+ 261
1941
+ 262
1942
+ 263
1943
+ 264
1944
+ 265
1945
+ 266
1946
+ 267
1947
+ 268
1948
+ 269</pre>
1949
+ </td>
1950
+ <td>
1951
+ <pre class="code"><span class="info file"># File 'lib/tasker/events/subscribers/base_subscriber.rb', line 260</span>
1952
+
1953
+ <span class='kw'>def</span> <span class='id identifier rubyid_extract_timing_metrics'>extract_timing_metrics</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='rparen'>)</span>
1954
+ <span class='lbrace'>{</span>
1955
+ <span class='label'>execution_duration:</span> <span class='id identifier rubyid_safe_get'>safe_get</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='comma'>,</span> <span class='symbol'>:execution_duration</span><span class='comma'>,</span> <span class='float'>0.0</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_to_f'>to_f</span><span class='comma'>,</span>
1956
+ <span class='label'>started_at:</span> <span class='id identifier rubyid_safe_get'>safe_get</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='comma'>,</span> <span class='symbol'>:started_at</span><span class='rparen'>)</span><span class='comma'>,</span>
1957
+ <span class='label'>completed_at:</span> <span class='id identifier rubyid_safe_get'>safe_get</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='comma'>,</span> <span class='symbol'>:completed_at</span><span class='rparen'>)</span><span class='comma'>,</span>
1958
+ <span class='label'>step_count:</span> <span class='id identifier rubyid_safe_get'>safe_get</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='comma'>,</span> <span class='symbol'>:total_steps</span><span class='comma'>,</span> <span class='int'>0</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_to_i'>to_i</span><span class='comma'>,</span>
1959
+ <span class='label'>completed_steps:</span> <span class='id identifier rubyid_safe_get'>safe_get</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='comma'>,</span> <span class='symbol'>:completed_steps</span><span class='comma'>,</span> <span class='int'>0</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_to_i'>to_i</span><span class='comma'>,</span>
1960
+ <span class='label'>failed_steps:</span> <span class='id identifier rubyid_safe_get'>safe_get</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='comma'>,</span> <span class='symbol'>:failed_steps</span><span class='comma'>,</span> <span class='int'>0</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_to_i'>to_i</span>
1961
+ <span class='rbrace'>}</span>
1962
+ <span class='kw'>end</span></pre>
1963
+ </td>
1964
+ </tr>
1965
+ </table>
1966
+ </div>
1967
+
1968
+ <div class="method_details ">
1969
+ <h3 class="signature " id="generate_handler_method_name-instance_method">
1970
+
1971
+ #<strong>generate_handler_method_name</strong>(event_name) &#x21d2; <tt>Symbol</tt> <span class="extras">(protected)</span>
1972
+
1973
+
1974
+
1975
+
1976
+
1977
+ </h3><div class="docstring">
1978
+ <div class="discussion">
1979
+
1980
+ <p>Generate handler method name from event name</p>
1981
+
1982
+
1983
+ </div>
1984
+ </div>
1985
+ <div class="tags">
1986
+ <p class="tag_title">Parameters:</p>
1987
+ <ul class="param">
1988
+
1989
+ <li>
1990
+
1991
+ <span class='name'>event_name</span>
1992
+
1993
+
1994
+ <span class='type'>(<tt>String</tt>)</span>
1995
+
1996
+
1997
+
1998
+ &mdash;
1999
+ <div class='inline'>
2000
+ <p>The event name (should be consistent format)</p>
2001
+ </div>
2002
+
2003
+ </li>
2004
+
2005
+ </ul>
2006
+
2007
+ <p class="tag_title">Returns:</p>
2008
+ <ul class="return">
2009
+
2010
+ <li>
2011
+
2012
+
2013
+ <span class='type'>(<tt>Symbol</tt>)</span>
2014
+
2015
+
2016
+
2017
+ &mdash;
2018
+ <div class='inline'>
2019
+ <p>The handler method name</p>
2020
+ </div>
2021
+
2022
+ </li>
2023
+
2024
+ </ul>
2025
+
2026
+ </div><table class="source_code">
2027
+ <tr>
2028
+ <td>
2029
+ <pre class="lines">
2030
+
2031
+
2032
+ 172
2033
+ 173
2034
+ 174
2035
+ 175
2036
+ 176
2037
+ 177
2038
+ 178
2039
+ 179
2040
+ 180</pre>
2041
+ </td>
2042
+ <td>
2043
+ <pre class="code"><span class="info file"># File 'lib/tasker/events/subscribers/base_subscriber.rb', line 172</span>
2044
+
2045
+ <span class='kw'>def</span> <span class='id identifier rubyid_generate_handler_method_name'>generate_handler_method_name</span><span class='lparen'>(</span><span class='id identifier rubyid_event_name'>event_name</span><span class='rparen'>)</span>
2046
+ <span class='comment'># Convert dots to underscores and prefix with handle_
2047
+ </span> <span class='comment'># Examples:
2048
+ </span> <span class='comment'># &#39;task.completed&#39; -&gt; :handle_task_completed
2049
+ </span> <span class='comment'># &#39;step.failed&#39; -&gt; :handle_step_failed
2050
+ </span> <span class='comment'># &#39;custom.event&#39; -&gt; :handle_custom_event
2051
+ </span> <span class='id identifier rubyid_clean_name'>clean_name</span> <span class='op'>=</span> <span class='id identifier rubyid_event_name'>event_name</span><span class='period'>.</span><span class='id identifier rubyid_to_s'>to_s</span><span class='period'>.</span><span class='id identifier rubyid_tr'>tr</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>.</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>_</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_underscore'>underscore</span>
2052
+ <span class='symbol'>:&quot;handle_</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_clean_name'>clean_name</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span>
2053
+ <span class='kw'>end</span></pre>
2054
+ </td>
2055
+ </tr>
2056
+ </table>
2057
+ </div>
2058
+
2059
+ <div class="method_details ">
2060
+ <h3 class="signature " id="resolve_internal_event_constant-instance_method">
2061
+
2062
+ #<strong>resolve_internal_event_constant</strong>(event_name) &#x21d2; <tt>String</tt> <span class="extras">(protected)</span>
2063
+
2064
+
2065
+
2066
+
2067
+
2068
+ </h3><div class="docstring">
2069
+ <div class="discussion">
2070
+
2071
+ <p>Resolve developer-friendly event name to internal constant</p>
2072
+
2073
+ <p>This handles the transparent namespace mapping: - “order.processed” -&gt; “custom.order.processed” (for custom events) - “task.completed” -&gt; “task.completed” (for system events)</p>
2074
+
2075
+
2076
+ </div>
2077
+ </div>
2078
+ <div class="tags">
2079
+ <p class="tag_title">Parameters:</p>
2080
+ <ul class="param">
2081
+
2082
+ <li>
2083
+
2084
+ <span class='name'>event_name</span>
2085
+
2086
+
2087
+ <span class='type'>(<tt>String</tt>)</span>
2088
+
2089
+
2090
+
2091
+ &mdash;
2092
+ <div class='inline'>
2093
+ <p>The developer-friendly event name</p>
2094
+ </div>
2095
+
2096
+ </li>
2097
+
2098
+ </ul>
2099
+
2100
+ <p class="tag_title">Returns:</p>
2101
+ <ul class="return">
2102
+
2103
+ <li>
2104
+
2105
+
2106
+ <span class='type'>(<tt>String</tt>)</span>
2107
+
2108
+
2109
+
2110
+ &mdash;
2111
+ <div class='inline'>
2112
+ <p>The internal event constant</p>
2113
+ </div>
2114
+
2115
+ </li>
2116
+
2117
+ </ul>
2118
+
2119
+ </div><table class="source_code">
2120
+ <tr>
2121
+ <td>
2122
+ <pre class="lines">
2123
+
2124
+
2125
+ 150
2126
+ 151
2127
+ 152
2128
+ 153
2129
+ 154
2130
+ 155
2131
+ 156
2132
+ 157
2133
+ 158
2134
+ 159
2135
+ 160
2136
+ 161
2137
+ 162
2138
+ 163
2139
+ 164
2140
+ 165
2141
+ 166</pre>
2142
+ </td>
2143
+ <td>
2144
+ <pre class="code"><span class="info file"># File 'lib/tasker/events/subscribers/base_subscriber.rb', line 150</span>
2145
+
2146
+ <span class='kw'>def</span> <span class='id identifier rubyid_resolve_internal_event_constant'>resolve_internal_event_constant</span><span class='lparen'>(</span><span class='id identifier rubyid_event_name'>event_name</span><span class='rparen'>)</span>
2147
+ <span class='id identifier rubyid_event_str'>event_str</span> <span class='op'>=</span> <span class='id identifier rubyid_event_name'>event_name</span><span class='period'>.</span><span class='id identifier rubyid_to_s'>to_s</span>
2148
+
2149
+ <span class='comment'># Check if it&#39;s already an internal constant (starts with system prefixes)
2150
+ </span> <span class='id identifier rubyid_system_prefixes'>system_prefixes</span> <span class='op'>=</span> <span class='qwords_beg'>%w[</span><span class='tstring_content'>task.</span><span class='words_sep'> </span><span class='tstring_content'>step.</span><span class='words_sep'> </span><span class='tstring_content'>workflow.</span><span class='words_sep'> </span><span class='tstring_content'>observability.</span><span class='tstring_end'>]</span></span>
2151
+ <span class='kw'>if</span> <span class='id identifier rubyid_system_prefixes'>system_prefixes</span><span class='period'>.</span><span class='id identifier rubyid_any?'>any?</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_prefix'>prefix</span><span class='op'>|</span> <span class='id identifier rubyid_event_str'>event_str</span><span class='period'>.</span><span class='id identifier rubyid_start_with?'>start_with?</span><span class='lparen'>(</span><span class='id identifier rubyid_prefix'>prefix</span><span class='rparen'>)</span> <span class='rbrace'>}</span>
2152
+ <span class='kw'>return</span> <span class='id identifier rubyid_event_str'>event_str</span> <span class='comment'># It&#39;s a system event, use as-is
2153
+ </span> <span class='kw'>end</span>
2154
+
2155
+ <span class='comment'># Check if it&#39;s already prefixed with custom.
2156
+ </span> <span class='kw'>if</span> <span class='id identifier rubyid_event_str'>event_str</span><span class='period'>.</span><span class='id identifier rubyid_start_with?'>start_with?</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>custom.</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span>
2157
+ <span class='kw'>return</span> <span class='id identifier rubyid_event_str'>event_str</span> <span class='comment'># Already internal format
2158
+ </span> <span class='kw'>end</span>
2159
+
2160
+ <span class='comment'># Assume it&#39;s a custom event and add the prefix
2161
+ </span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>custom.</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_event_str'>event_str</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span>
2162
+ <span class='kw'>end</span></pre>
2163
+ </td>
2164
+ </tr>
2165
+ </table>
2166
+ </div>
2167
+
2168
+ <div class="method_details ">
2169
+ <h3 class="signature " id="safe_get-instance_method">
2170
+
2171
+ #<strong>safe_get</strong>(event, key, default = nil) &#x21d2; <tt>Object</tt> <span class="extras">(protected)</span>
2172
+
2173
+
2174
+
2175
+
2176
+
2177
+ </h3><div class="docstring">
2178
+ <div class="discussion">
2179
+
2180
+ <p>Safe accessor for event payload keys with fallback values</p>
2181
+
2182
+
2183
+ </div>
2184
+ </div>
2185
+ <div class="tags">
2186
+ <p class="tag_title">Parameters:</p>
2187
+ <ul class="param">
2188
+
2189
+ <li>
2190
+
2191
+ <span class='name'>event</span>
2192
+
2193
+
2194
+ <span class='type'>(<tt>Hash</tt>, <tt>Dry::Events::Event</tt>)</span>
2195
+
2196
+
2197
+
2198
+ &mdash;
2199
+ <div class='inline'>
2200
+ <p>The event payload or event object</p>
2201
+ </div>
2202
+
2203
+ </li>
2204
+
2205
+ <li>
2206
+
2207
+ <span class='name'>key</span>
2208
+
2209
+
2210
+ <span class='type'>(<tt>Symbol</tt>, <tt>String</tt>)</span>
2211
+
2212
+
2213
+
2214
+ &mdash;
2215
+ <div class='inline'>
2216
+ <p>The key to access</p>
2217
+ </div>
2218
+
2219
+ </li>
2220
+
2221
+ <li>
2222
+
2223
+ <span class='name'>default</span>
2224
+
2225
+
2226
+ <span class='type'>(<tt>Object</tt>)</span>
2227
+
2228
+
2229
+ <em class="default">(defaults to: <tt>nil</tt>)</em>
2230
+
2231
+
2232
+ &mdash;
2233
+ <div class='inline'>
2234
+ <p>The default value if key is missing</p>
2235
+ </div>
2236
+
2237
+ </li>
2238
+
2239
+ </ul>
2240
+
2241
+ <p class="tag_title">Returns:</p>
2242
+ <ul class="return">
2243
+
2244
+ <li>
2245
+
2246
+
2247
+ <span class='type'>(<tt>Object</tt>)</span>
2248
+
2249
+
2250
+
2251
+ &mdash;
2252
+ <div class='inline'>
2253
+ <p>The value or default</p>
2254
+ </div>
2255
+
2256
+ </li>
2257
+
2258
+ </ul>
2259
+
2260
+ </div><table class="source_code">
2261
+ <tr>
2262
+ <td>
2263
+ <pre class="lines">
2264
+
2265
+
2266
+ 208
2267
+ 209
2268
+ 210
2269
+ 211
2270
+ 212
2271
+ 213
2272
+ 214
2273
+ 215
2274
+ 216
2275
+ 217
2276
+ 218
2277
+ 219
2278
+ 220
2279
+ 221</pre>
2280
+ </td>
2281
+ <td>
2282
+ <pre class="code"><span class="info file"># File 'lib/tasker/events/subscribers/base_subscriber.rb', line 208</span>
2283
+
2284
+ <span class='kw'>def</span> <span class='id identifier rubyid_safe_get'>safe_get</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='comma'>,</span> <span class='id identifier rubyid_key'>key</span><span class='comma'>,</span> <span class='id identifier rubyid_default'>default</span> <span class='op'>=</span> <span class='kw'>nil</span><span class='rparen'>)</span>
2285
+ <span class='kw'>return</span> <span class='id identifier rubyid_default'>default</span> <span class='kw'>if</span> <span class='id identifier rubyid_event'>event</span><span class='period'>.</span><span class='id identifier rubyid_nil?'>nil?</span>
2286
+
2287
+ <span class='comment'># Handle Dry::Events::Event objects
2288
+ </span> <span class='kw'>if</span> <span class='id identifier rubyid_event'>event</span><span class='period'>.</span><span class='id identifier rubyid_respond_to?'>respond_to?</span><span class='lparen'>(</span><span class='symbol'>:payload</span><span class='rparen'>)</span>
2289
+ <span class='id identifier rubyid_payload'>payload</span> <span class='op'>=</span> <span class='id identifier rubyid_event'>event</span><span class='period'>.</span><span class='id identifier rubyid_payload'>payload</span>
2290
+ <span class='kw'>return</span> <span class='id identifier rubyid_payload'>payload</span><span class='period'>.</span><span class='id identifier rubyid_fetch'>fetch</span><span class='lparen'>(</span><span class='id identifier rubyid_key'>key</span><span class='period'>.</span><span class='id identifier rubyid_to_sym'>to_sym</span><span class='rparen'>)</span> <span class='lbrace'>{</span> <span class='id identifier rubyid_payload'>payload</span><span class='period'>.</span><span class='id identifier rubyid_fetch'>fetch</span><span class='lparen'>(</span><span class='id identifier rubyid_key'>key</span><span class='period'>.</span><span class='id identifier rubyid_to_s'>to_s</span><span class='comma'>,</span> <span class='id identifier rubyid_default'>default</span><span class='rparen'>)</span> <span class='rbrace'>}</span>
2291
+ <span class='kw'>end</span>
2292
+
2293
+ <span class='comment'># Handle plain hash events
2294
+ </span> <span class='id identifier rubyid_event'>event</span><span class='period'>.</span><span class='id identifier rubyid_fetch'>fetch</span><span class='lparen'>(</span><span class='id identifier rubyid_key'>key</span><span class='period'>.</span><span class='id identifier rubyid_to_sym'>to_sym</span><span class='rparen'>)</span> <span class='kw'>do</span>
2295
+ <span class='id identifier rubyid_event'>event</span><span class='period'>.</span><span class='id identifier rubyid_fetch'>fetch</span><span class='lparen'>(</span><span class='id identifier rubyid_key'>key</span><span class='period'>.</span><span class='id identifier rubyid_to_s'>to_s</span><span class='comma'>,</span> <span class='id identifier rubyid_default'>default</span><span class='rparen'>)</span>
2296
+ <span class='kw'>end</span>
2297
+ <span class='kw'>end</span></pre>
2298
+ </td>
2299
+ </tr>
2300
+ </table>
2301
+ </div>
2302
+
2303
+ <div class="method_details ">
2304
+ <h3 class="signature " id="should_handle_event?-instance_method">
2305
+
2306
+ #<strong>should_handle_event?</strong>(event_constant) &#x21d2; <tt>Boolean</tt> <span class="extras">(protected)</span>
2307
+
2308
+
2309
+
2310
+
2311
+
2312
+ </h3><div class="docstring">
2313
+ <div class="discussion">
2314
+
2315
+ <p>Check if this subscriber should handle the given event</p>
2316
+
2317
+
2318
+ </div>
2319
+ </div>
2320
+ <div class="tags">
2321
+ <p class="tag_title">Parameters:</p>
2322
+ <ul class="param">
2323
+
2324
+ <li>
2325
+
2326
+ <span class='name'>event_constant</span>
2327
+
2328
+
2329
+ <span class='type'>(<tt>String</tt>)</span>
2330
+
2331
+
2332
+
2333
+ &mdash;
2334
+ <div class='inline'>
2335
+ <p>The event constant</p>
2336
+ </div>
2337
+
2338
+ </li>
2339
+
2340
+ </ul>
2341
+
2342
+ <p class="tag_title">Returns:</p>
2343
+ <ul class="return">
2344
+
2345
+ <li>
2346
+
2347
+
2348
+ <span class='type'>(<tt>Boolean</tt>)</span>
2349
+
2350
+
2351
+
2352
+ &mdash;
2353
+ <div class='inline'>
2354
+ <p>Whether to handle this event</p>
2355
+ </div>
2356
+
2357
+ </li>
2358
+
2359
+ </ul>
2360
+
2361
+ </div><table class="source_code">
2362
+ <tr>
2363
+ <td>
2364
+ <pre class="lines">
2365
+
2366
+
2367
+ 186
2368
+ 187
2369
+ 188
2370
+ 189
2371
+ 190
2372
+ 191
2373
+ 192</pre>
2374
+ </td>
2375
+ <td>
2376
+ <pre class="code"><span class="info file"># File 'lib/tasker/events/subscribers/base_subscriber.rb', line 186</span>
2377
+
2378
+ <span class='kw'>def</span> <span class='id identifier rubyid_should_handle_event?'>should_handle_event?</span><span class='lparen'>(</span><span class='id identifier rubyid_event_constant'>event_constant</span><span class='rparen'>)</span>
2379
+ <span class='comment'># Apply class-level filter if defined
2380
+ </span> <span class='kw'>return</span> <span class='kw'>false</span> <span class='kw'>if</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_class'>class</span><span class='period'>.</span><span class='id identifier rubyid_event_filter'>event_filter</span> <span class='op'>&amp;&amp;</span> <span class='op'>!</span><span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_class'>class</span><span class='period'>.</span><span class='id identifier rubyid_event_filter'>event_filter</span><span class='period'>.</span><span class='id identifier rubyid_call'>call</span><span class='lparen'>(</span><span class='id identifier rubyid_event_constant'>event_constant</span><span class='rparen'>)</span>
2381
+
2382
+ <span class='comment'># Apply instance-level filtering (override in subclasses)
2383
+ </span> <span class='id identifier rubyid_should_process_event?'>should_process_event?</span><span class='lparen'>(</span><span class='id identifier rubyid_event_constant'>event_constant</span><span class='rparen'>)</span>
2384
+ <span class='kw'>end</span></pre>
2385
+ </td>
2386
+ </tr>
2387
+ </table>
2388
+ </div>
2389
+
2390
+ <div class="method_details ">
2391
+ <h3 class="signature " id="should_process_event?-instance_method">
2392
+
2393
+ #<strong>should_process_event?</strong>(_event_constant) &#x21d2; <tt>Boolean</tt> <span class="extras">(protected)</span>
2394
+
2395
+
2396
+
2397
+
2398
+
2399
+ </h3><div class="docstring">
2400
+ <div class="discussion">
2401
+
2402
+ <p>Instance-level event filtering (override in subclasses)</p>
2403
+
2404
+
2405
+ </div>
2406
+ </div>
2407
+ <div class="tags">
2408
+ <p class="tag_title">Parameters:</p>
2409
+ <ul class="param">
2410
+
2411
+ <li>
2412
+
2413
+ <span class='name'>_event_constant</span>
2414
+
2415
+
2416
+ <span class='type'>(<tt>String</tt>)</span>
2417
+
2418
+
2419
+
2420
+ &mdash;
2421
+ <div class='inline'>
2422
+ <p>The event constant (unused in base implementation)</p>
2423
+ </div>
2424
+
2425
+ </li>
2426
+
2427
+ </ul>
2428
+
2429
+ <p class="tag_title">Returns:</p>
2430
+ <ul class="return">
2431
+
2432
+ <li>
2433
+
2434
+
2435
+ <span class='type'>(<tt>Boolean</tt>)</span>
2436
+
2437
+
2438
+
2439
+ &mdash;
2440
+ <div class='inline'>
2441
+ <p>Whether to handle this event</p>
2442
+ </div>
2443
+
2444
+ </li>
2445
+
2446
+ </ul>
2447
+
2448
+ </div><table class="source_code">
2449
+ <tr>
2450
+ <td>
2451
+ <pre class="lines">
2452
+
2453
+
2454
+ 198
2455
+ 199
2456
+ 200</pre>
2457
+ </td>
2458
+ <td>
2459
+ <pre class="code"><span class="info file"># File 'lib/tasker/events/subscribers/base_subscriber.rb', line 198</span>
2460
+
2461
+ <span class='kw'>def</span> <span class='id identifier rubyid_should_process_event?'>should_process_event?</span><span class='lparen'>(</span><span class='id identifier rubyid__event_constant'>_event_constant</span><span class='rparen'>)</span>
2462
+ <span class='kw'>true</span> <span class='comment'># Process all events by default
2463
+ </span><span class='kw'>end</span></pre>
2464
+ </td>
2465
+ </tr>
2466
+ </table>
2467
+ </div>
2468
+
2469
+ <div class="method_details ">
2470
+ <h3 class="signature " id="subscribe_to_publisher-instance_method">
2471
+
2472
+ #<strong>subscribe_to_publisher</strong>(publisher) &#x21d2; <tt>void</tt>
2473
+
2474
+
2475
+
2476
+
2477
+
2478
+ </h3><div class="docstring">
2479
+ <div class="discussion">
2480
+ <p class="note returns_void">This method returns an undefined value.</p>
2481
+ <p>Subscribe to all events defined by the class</p>
2482
+
2483
+
2484
+ </div>
2485
+ </div>
2486
+ <div class="tags">
2487
+ <p class="tag_title">Parameters:</p>
2488
+ <ul class="param">
2489
+
2490
+ <li>
2491
+
2492
+ <span class='name'>publisher</span>
2493
+
2494
+
2495
+ <span class='type'>(<tt><span class='object_link'><a href="../Publisher.html" title="Tasker::Events::Publisher (class)">Tasker::Events::Publisher</a></span></tt>)</span>
2496
+
2497
+
2498
+
2499
+ &mdash;
2500
+ <div class='inline'>
2501
+ <p>The event publisher</p>
2502
+ </div>
2503
+
2504
+ </li>
2505
+
2506
+ </ul>
2507
+
2508
+
2509
+ </div><table class="source_code">
2510
+ <tr>
2511
+ <td>
2512
+ <pre class="lines">
2513
+
2514
+
2515
+ 86
2516
+ 87
2517
+ 88
2518
+ 89
2519
+ 90
2520
+ 91
2521
+ 92
2522
+ 93
2523
+ 94
2524
+ 95</pre>
2525
+ </td>
2526
+ <td>
2527
+ <pre class="code"><span class="info file"># File 'lib/tasker/events/subscribers/base_subscriber.rb', line 86</span>
2528
+
2529
+ <span class='kw'>def</span> <span class='id identifier rubyid_subscribe_to_publisher'>subscribe_to_publisher</span><span class='lparen'>(</span><span class='id identifier rubyid_publisher'>publisher</span><span class='rparen'>)</span>
2530
+ <span class='id identifier rubyid_event_subscriptions'>event_subscriptions</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_event_constant'>event_constant</span><span class='comma'>,</span> <span class='id identifier rubyid_handler_method'>handler_method</span><span class='op'>|</span>
2531
+ <span class='comment'># Apply filtering if defined
2532
+ </span> <span class='kw'>next</span> <span class='kw'>unless</span> <span class='id identifier rubyid_should_handle_event?'>should_handle_event?</span><span class='lparen'>(</span><span class='id identifier rubyid_event_constant'>event_constant</span><span class='rparen'>)</span>
2533
+
2534
+ <span class='comment'># Subscribe to the event with automatic method routing
2535
+ </span> <span class='comment'># This will fail fast if the event doesn&#39;t exist, which is the correct behavior
2536
+ </span> <span class='id identifier rubyid_publisher'>publisher</span><span class='period'>.</span><span class='id identifier rubyid_subscribe'>subscribe</span><span class='lparen'>(</span><span class='id identifier rubyid_event_constant'>event_constant</span><span class='comma'>,</span> <span class='op'>&amp;</span><span class='id identifier rubyid_method'>method</span><span class='lparen'>(</span><span class='id identifier rubyid_handler_method'>handler_method</span><span class='rparen'>)</span><span class='rparen'>)</span>
2537
+ <span class='kw'>end</span>
2538
+ <span class='kw'>end</span></pre>
2539
+ </td>
2540
+ </tr>
2541
+ </table>
2542
+ </div>
2543
+
2544
+ </div>
2545
+
2546
+ </div>
2547
+
2548
+ <div id="footer">
2549
+ Generated on Tue Jul 1 16:47:41 2025 by
2550
+ <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
2551
+ 0.9.37 (ruby-3.2.4).
2552
+ </div>
2553
+
2554
+ </div>
2555
+ </body>
2556
+ </html>