temporalio 0.4.0-aarch64-linux-musl → 0.6.0-aarch64-linux-musl

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 (145) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -1
  3. data/lib/temporalio/activity/cancellation_details.rb +58 -0
  4. data/lib/temporalio/activity/context.rb +10 -1
  5. data/lib/temporalio/activity/definition.rb +41 -3
  6. data/lib/temporalio/activity/info.rb +25 -4
  7. data/lib/temporalio/activity.rb +2 -0
  8. data/lib/temporalio/api/activity/v1/message.rb +1 -1
  9. data/lib/temporalio/api/batch/v1/message.rb +7 -2
  10. data/lib/temporalio/api/cloud/account/v1/message.rb +1 -1
  11. data/lib/temporalio/api/cloud/cloudservice/v1/request_response.rb +22 -2
  12. data/lib/temporalio/api/cloud/cloudservice/v1/service.rb +2 -2
  13. data/lib/temporalio/api/cloud/connectivityrule/v1/message.rb +29 -0
  14. data/lib/temporalio/api/cloud/identity/v1/message.rb +7 -2
  15. data/lib/temporalio/api/cloud/namespace/v1/message.rb +7 -2
  16. data/lib/temporalio/api/cloud/nexus/v1/message.rb +3 -2
  17. data/lib/temporalio/api/cloud/operation/v1/message.rb +2 -2
  18. data/lib/temporalio/api/cloud/region/v1/message.rb +1 -1
  19. data/lib/temporalio/api/cloud/resource/v1/message.rb +1 -1
  20. data/lib/temporalio/api/cloud/sink/v1/message.rb +1 -1
  21. data/lib/temporalio/api/cloud/usage/v1/message.rb +1 -1
  22. data/lib/temporalio/api/command/v1/message.rb +2 -2
  23. data/lib/temporalio/api/common/v1/grpc_status.rb +1 -1
  24. data/lib/temporalio/api/common/v1/message.rb +4 -2
  25. data/lib/temporalio/api/deployment/v1/message.rb +3 -2
  26. data/lib/temporalio/api/enums/v1/batch_operation.rb +2 -2
  27. data/lib/temporalio/api/enums/v1/command_type.rb +1 -1
  28. data/lib/temporalio/api/enums/v1/common.rb +5 -2
  29. data/lib/temporalio/api/enums/v1/deployment.rb +3 -2
  30. data/lib/temporalio/api/enums/v1/event_type.rb +2 -2
  31. data/lib/temporalio/api/enums/v1/failed_cause.rb +2 -2
  32. data/lib/temporalio/api/enums/v1/namespace.rb +1 -1
  33. data/lib/temporalio/api/enums/v1/nexus.rb +1 -1
  34. data/lib/temporalio/api/enums/v1/query.rb +1 -1
  35. data/lib/temporalio/api/enums/v1/reset.rb +1 -1
  36. data/lib/temporalio/api/enums/v1/schedule.rb +1 -1
  37. data/lib/temporalio/api/enums/v1/task_queue.rb +3 -2
  38. data/lib/temporalio/api/enums/v1/update.rb +1 -1
  39. data/lib/temporalio/api/enums/v1/workflow.rb +2 -2
  40. data/lib/temporalio/api/errordetails/v1/message.rb +1 -1
  41. data/lib/temporalio/api/export/v1/message.rb +1 -1
  42. data/lib/temporalio/api/failure/v1/message.rb +3 -2
  43. data/lib/temporalio/api/filter/v1/message.rb +1 -1
  44. data/lib/temporalio/api/history/v1/message.rb +4 -2
  45. data/lib/temporalio/api/namespace/v1/message.rb +1 -1
  46. data/lib/temporalio/api/nexus/v1/message.rb +2 -2
  47. data/lib/temporalio/api/operatorservice/v1/request_response.rb +1 -1
  48. data/lib/temporalio/api/operatorservice/v1/service.rb +1 -1
  49. data/lib/temporalio/api/payload_visitor.rb +106 -1
  50. data/lib/temporalio/api/protocol/v1/message.rb +1 -1
  51. data/lib/temporalio/api/query/v1/message.rb +1 -1
  52. data/lib/temporalio/api/replication/v1/message.rb +1 -1
  53. data/lib/temporalio/api/rules/v1/message.rb +27 -0
  54. data/lib/temporalio/api/schedule/v1/message.rb +2 -2
  55. data/lib/temporalio/api/sdk/v1/enhanced_stack_trace.rb +1 -1
  56. data/lib/temporalio/api/sdk/v1/task_complete_metadata.rb +1 -1
  57. data/lib/temporalio/api/sdk/v1/user_metadata.rb +1 -1
  58. data/lib/temporalio/api/sdk/v1/worker_config.rb +23 -0
  59. data/lib/temporalio/api/sdk/v1/workflow_metadata.rb +1 -1
  60. data/lib/temporalio/api/taskqueue/v1/message.rb +6 -2
  61. data/lib/temporalio/api/testservice/v1/request_response.rb +1 -1
  62. data/lib/temporalio/api/testservice/v1/service.rb +1 -1
  63. data/lib/temporalio/api/update/v1/message.rb +1 -1
  64. data/lib/temporalio/api/version/v1/message.rb +1 -1
  65. data/lib/temporalio/api/worker/v1/message.rb +31 -0
  66. data/lib/temporalio/api/workflow/v1/message.rb +14 -2
  67. data/lib/temporalio/api/workflowservice/v1/request_response.rb +28 -2
  68. data/lib/temporalio/api/workflowservice/v1/service.rb +2 -2
  69. data/lib/temporalio/cancellation.rb +16 -12
  70. data/lib/temporalio/client/async_activity_handle.rb +12 -4
  71. data/lib/temporalio/client/connection/cloud_service.rb +135 -0
  72. data/lib/temporalio/client/connection/workflow_service.rb +150 -0
  73. data/lib/temporalio/client/connection.rb +2 -1
  74. data/lib/temporalio/client/interceptor.rb +25 -7
  75. data/lib/temporalio/client/schedule.rb +10 -2
  76. data/lib/temporalio/client/with_start_workflow_operation.rb +9 -1
  77. data/lib/temporalio/client/workflow_handle.rb +50 -10
  78. data/lib/temporalio/client/workflow_update_handle.rb +9 -3
  79. data/lib/temporalio/client.rb +110 -6
  80. data/lib/temporalio/common_enums.rb +14 -0
  81. data/lib/temporalio/contrib/open_telemetry.rb +7 -7
  82. data/lib/temporalio/converters/data_converter.rb +18 -8
  83. data/lib/temporalio/converters/failure_converter.rb +6 -3
  84. data/lib/temporalio/converters/payload_converter/binary_null.rb +2 -2
  85. data/lib/temporalio/converters/payload_converter/binary_plain.rb +2 -2
  86. data/lib/temporalio/converters/payload_converter/binary_protobuf.rb +2 -2
  87. data/lib/temporalio/converters/payload_converter/composite.rb +6 -4
  88. data/lib/temporalio/converters/payload_converter/encoding.rb +4 -2
  89. data/lib/temporalio/converters/payload_converter/json_plain.rb +24 -7
  90. data/lib/temporalio/converters/payload_converter/json_protobuf.rb +2 -2
  91. data/lib/temporalio/converters/payload_converter.rb +16 -6
  92. data/lib/temporalio/error/failure.rb +19 -1
  93. data/lib/temporalio/error.rb +1 -1
  94. data/lib/temporalio/internal/bridge/3.2/temporalio_bridge.so +0 -0
  95. data/lib/temporalio/internal/bridge/3.3/temporalio_bridge.so +0 -0
  96. data/lib/temporalio/internal/bridge/3.4/temporalio_bridge.so +0 -0
  97. data/lib/temporalio/internal/bridge/api/activity_result/activity_result.rb +1 -1
  98. data/lib/temporalio/internal/bridge/api/activity_task/activity_task.rb +3 -2
  99. data/lib/temporalio/internal/bridge/api/child_workflow/child_workflow.rb +1 -1
  100. data/lib/temporalio/internal/bridge/api/common/common.rb +1 -1
  101. data/lib/temporalio/internal/bridge/api/core_interface.rb +1 -1
  102. data/lib/temporalio/internal/bridge/api/external_data/external_data.rb +1 -1
  103. data/lib/temporalio/internal/bridge/api/nexus/nexus.rb +3 -2
  104. data/lib/temporalio/internal/bridge/api/workflow_activation/workflow_activation.rb +2 -2
  105. data/lib/temporalio/internal/bridge/api/workflow_commands/workflow_commands.rb +3 -2
  106. data/lib/temporalio/internal/bridge/api/workflow_completion/workflow_completion.rb +1 -1
  107. data/lib/temporalio/internal/bridge/worker.rb +28 -4
  108. data/lib/temporalio/internal/bridge.rb +1 -1
  109. data/lib/temporalio/internal/client/implementation.rb +60 -52
  110. data/lib/temporalio/internal/proto_utils.rb +4 -4
  111. data/lib/temporalio/internal/worker/activity_worker.rb +93 -20
  112. data/lib/temporalio/internal/worker/workflow_instance/child_workflow_handle.rb +8 -6
  113. data/lib/temporalio/internal/worker/workflow_instance/context.rb +66 -24
  114. data/lib/temporalio/internal/worker/workflow_instance/details.rb +5 -2
  115. data/lib/temporalio/internal/worker/workflow_instance/external_workflow_handle.rb +2 -2
  116. data/lib/temporalio/internal/worker/workflow_instance/externally_immutable_hash.rb +2 -0
  117. data/lib/temporalio/internal/worker/workflow_instance/illegal_call_tracer.rb +64 -18
  118. data/lib/temporalio/internal/worker/workflow_instance/outbound_implementation.rb +28 -14
  119. data/lib/temporalio/internal/worker/workflow_instance/replay_safe_logger.rb +5 -2
  120. data/lib/temporalio/internal/worker/workflow_instance/scheduler.rb +10 -4
  121. data/lib/temporalio/internal/worker/workflow_instance.rb +58 -23
  122. data/lib/temporalio/internal/worker/workflow_worker.rb +16 -6
  123. data/lib/temporalio/priority.rb +100 -0
  124. data/lib/temporalio/scoped_logger.rb +1 -1
  125. data/lib/temporalio/testing/activity_environment.rb +17 -2
  126. data/lib/temporalio/testing/workflow_environment.rb +3 -3
  127. data/lib/temporalio/version.rb +1 -1
  128. data/lib/temporalio/versioning_override.rb +56 -0
  129. data/lib/temporalio/worker/deployment_options.rb +45 -0
  130. data/lib/temporalio/worker/illegal_workflow_call_validator.rb +73 -0
  131. data/lib/temporalio/worker/interceptor.rb +13 -1
  132. data/lib/temporalio/worker/poller_behavior.rb +61 -0
  133. data/lib/temporalio/worker/thread_pool.rb +1 -1
  134. data/lib/temporalio/worker/workflow_executor/thread_pool.rb +2 -1
  135. data/lib/temporalio/worker/workflow_replayer.rb +12 -13
  136. data/lib/temporalio/worker.rb +73 -28
  137. data/lib/temporalio/worker_deployment_version.rb +67 -0
  138. data/lib/temporalio/workflow/child_workflow_handle.rb +10 -2
  139. data/lib/temporalio/workflow/definition.rb +187 -39
  140. data/lib/temporalio/workflow/external_workflow_handle.rb +3 -1
  141. data/lib/temporalio/workflow/info.rb +4 -1
  142. data/lib/temporalio/workflow.rb +134 -11
  143. data/lib/temporalio.rb +1 -0
  144. data/temporalio.gemspec +1 -0
  145. metadata +13 -2
@@ -47,6 +47,21 @@ module Temporalio
47
47
  @workflow_raw_args = value
48
48
  end
49
49
 
50
+ # Add workflow hints to be passed to converter for workflow args.
51
+ #
52
+ # @param hints [Array<Object>] Hints to add.
53
+ def workflow_arg_hint(*hints)
54
+ @workflow_arg_hints ||= []
55
+ @workflow_arg_hints.concat(hints)
56
+ end
57
+
58
+ # Set workflow result hint to be passed to converter for workflow result.
59
+ #
60
+ # @param hint [Object] Hint to set.
61
+ def workflow_result_hint(hint)
62
+ @workflow_result_hint = hint
63
+ end
64
+
50
65
  # Configure workflow failure exception types. This sets the types of exceptions that, if a
51
66
  # workflow-thrown exception extends, will cause the workflow/update to fail instead of suspending the workflow
52
67
  # via task failure. These are applied in addition to the worker option. If {::Exception} is set, it effectively
@@ -55,7 +70,7 @@ module Temporalio
55
70
  # @param types [Array<Class<Exception>>] Exception types to turn into workflow failures.
56
71
  def workflow_failure_exception_type(*types)
57
72
  types.each do |t|
58
- raise ArgumentError, 'All types must classes inheriting Exception' unless t.is_a?(Class) && t < Exception
73
+ raise ArgumentError, 'All types must classes inheriting Exception' unless t.is_a?(Class) && t <= Exception
59
74
  end
60
75
  @workflow_failure_exception_types ||= []
61
76
  @workflow_failure_exception_types.concat(types)
@@ -91,6 +106,15 @@ module Temporalio
91
106
  end
92
107
  end
93
108
 
109
+ # Set the versioning behavior of this workflow.
110
+ #
111
+ # WARNING: This method is experimental and may change in future versions.
112
+ #
113
+ # @param behavior [VersioningBehavior] The versioning behavior.
114
+ def workflow_versioning_behavior(behavior)
115
+ @versioning_behavior = behavior
116
+ end
117
+
94
118
  # Mark an `initialize` as needing the workflow start arguments. Otherwise, `initialize` must accept no required
95
119
  # arguments. This must be placed above the `initialize` method or it will fail.
96
120
  #
@@ -112,16 +136,20 @@ module Temporalio
112
136
  # {Converters::RawValue} which is a raw payload wrapper, convertible with {Workflow.payload_converter}.
113
137
  # @param unfinished_policy [HandlerUnfinishedPolicy] How to treat unfinished handlers if they are still running
114
138
  # when the workflow ends. The default warns, but this can be disabled.
139
+ # @param arg_hints [Array<Object>, nil] Argument hint(s) for the signal.
115
140
  def workflow_signal(
116
141
  name: nil,
117
142
  description: nil,
118
143
  dynamic: false,
119
144
  raw_args: false,
120
- unfinished_policy: HandlerUnfinishedPolicy::WARN_AND_ABANDON
145
+ unfinished_policy: HandlerUnfinishedPolicy::WARN_AND_ABANDON,
146
+ arg_hints: nil
121
147
  )
122
148
  raise 'Cannot provide name if dynamic is true' if name && dynamic
123
149
 
124
- self.pending_handler_details = { type: :signal, name:, description:, dynamic:, raw_args:, unfinished_policy: }
150
+ self.pending_handler_details =
151
+ { type: :signal, name:, description:, dynamic:, raw_args:, unfinished_policy:,
152
+ arg_hints: Array(arg_hints) }
125
153
  end
126
154
 
127
155
  # Mark the next method as a workflow query with a default name as the name of the method. Queries can not have
@@ -135,15 +163,20 @@ module Temporalio
135
163
  # it is useful to have the second parameter be `*args` and `raw_args` be true.
136
164
  # @param raw_args [Boolean] If true, does not convert arguments, but instead provides each argument as
137
165
  # {Converters::RawValue} which is a raw payload wrapper, convertible with {Workflow.payload_converter}.
166
+ # @param arg_hints [Object, Array<Object>, nil] Argument hint(s) for the query.
167
+ # @param result_hint [Object, nil] Result hint for the query.
138
168
  def workflow_query(
139
169
  name: nil,
140
170
  description: nil,
141
171
  dynamic: false,
142
- raw_args: false
172
+ raw_args: false,
173
+ arg_hints: nil,
174
+ result_hint: nil
143
175
  )
144
176
  raise 'Cannot provide name if dynamic is true' if name && dynamic
145
177
 
146
- self.pending_handler_details = { type: :query, name:, description:, dynamic:, raw_args: }
178
+ self.pending_handler_details = { type: :query, name:, description:, dynamic:, raw_args:,
179
+ arg_hints: Array(arg_hints), result_hint: }
147
180
  end
148
181
 
149
182
  # Mark the next method as a workflow update with a default name as the name of the method. Updates can return
@@ -159,16 +192,21 @@ module Temporalio
159
192
  # {Converters::RawValue} which is a raw payload wrapper, convertible with {Workflow.payload_converter}.
160
193
  # @param unfinished_policy [HandlerUnfinishedPolicy] How to treat unfinished handlers if they are still running
161
194
  # when the workflow ends. The default warns, but this can be disabled.
195
+ # @param arg_hints [Object, Array<Object>, nil] Argument hint(s) for the update.
196
+ # @param result_hint [Object, nil] Result hint for the update.
162
197
  def workflow_update(
163
198
  name: nil,
164
199
  description: nil,
165
200
  dynamic: false,
166
201
  raw_args: false,
167
- unfinished_policy: HandlerUnfinishedPolicy::WARN_AND_ABANDON
202
+ unfinished_policy: HandlerUnfinishedPolicy::WARN_AND_ABANDON,
203
+ arg_hints: nil,
204
+ result_hint: nil
168
205
  )
169
206
  raise 'Cannot provide name if dynamic is true' if name && dynamic
170
207
 
171
- self.pending_handler_details = { type: :update, name:, description:, dynamic:, raw_args:, unfinished_policy: }
208
+ self.pending_handler_details = { type: :update, name:, description:, dynamic:, raw_args:, unfinished_policy:,
209
+ arg_hints: Array(arg_hints), result_hint: }
172
210
  end
173
211
 
174
212
  # Mark the next method as a workflow update validator to the given update method. The validator is expected to
@@ -181,6 +219,24 @@ module Temporalio
181
219
  self.pending_handler_details = { type: :update_validator, update_method: }
182
220
  end
183
221
 
222
+ # Mark the next method as returning some dynamic configuraion.
223
+ #
224
+ # Because dynamic workflows may conceptually represent more than one workflow type, it may
225
+ # be desirable to have different settings for fields that would normally be passed to
226
+ # `workflow_xxx` setters, but vary based on the workflow type name or other information
227
+ # available in the workflow's context. This function will be called after the workflow's
228
+ # `initialize`, if it has one, but before the workflow's `execute` method.
229
+ #
230
+ # The method must only take self as a parameter, and any values set in the class it returns
231
+ # will override those provided to other `workflow_xxx` setters.
232
+ #
233
+ # Cannot be specified on non-dynamic workflows.
234
+ def workflow_dynamic_options
235
+ raise 'Dynamic options method can only be set on workflows using `workflow_dynamic`' unless @workflow_dynamic
236
+
237
+ self.pending_handler_details = { type: :dynamic_options }
238
+ end
239
+
184
240
  private
185
241
 
186
242
  attr_reader :pending_handler_details
@@ -208,6 +264,15 @@ module Temporalio
208
264
  # Reset details
209
265
  self.pending_handler_details = nil
210
266
 
267
+ # Disallow kwargs in parameters
268
+ begin
269
+ if instance_method(method_name).parameters.any? { |t, _| t == :key || t == :keyreq }
270
+ raise "Workflow #{handler[:type]} cannot have keyword arguments"
271
+ end
272
+ rescue NameError
273
+ # Ignore name error
274
+ end
275
+
211
276
  # Initialize class variables if not done already
212
277
  @workflow_signals ||= {}
213
278
  @workflow_queries ||= {}
@@ -215,7 +280,7 @@ module Temporalio
215
280
  @workflow_update_validators ||= {}
216
281
  @defined_methods ||= []
217
282
 
218
- defn, hash, other_hashes =
283
+ defn, hash =
219
284
  case handler[:type]
220
285
  when :init
221
286
  raise "workflow_init was applied to #{method_name} instead of initialize" if method_name != :initialize
@@ -239,23 +304,33 @@ module Temporalio
239
304
  to_invoke: method_name,
240
305
  description: handler[:description],
241
306
  raw_args: handler[:raw_args],
242
- unfinished_policy: handler[:unfinished_policy]
243
- ), @workflow_signals, [@workflow_queries, @workflow_updates]]
307
+ unfinished_policy: handler[:unfinished_policy],
308
+ arg_hints: handler[:arg_hints]
309
+ ), @workflow_signals]
244
310
  when :query
245
311
  [Query.new(
246
312
  name: handler[:dynamic] ? nil : (handler[:name] || method_name).to_s,
247
313
  to_invoke: method_name,
248
314
  description: handler[:description],
249
- raw_args: handler[:raw_args]
250
- ), @workflow_queries, [@workflow_signals, @workflow_updates]]
315
+ raw_args: handler[:raw_args],
316
+ arg_hints: handler[:arg_hints],
317
+ result_hint: handler[:result_hint]
318
+ ), @workflow_queries]
251
319
  when :update
252
320
  [Update.new(
253
321
  name: handler[:dynamic] ? nil : (handler[:name] || method_name).to_s,
254
322
  to_invoke: method_name,
255
323
  description: handler[:description],
256
324
  raw_args: handler[:raw_args],
257
- unfinished_policy: handler[:unfinished_policy]
258
- ), @workflow_updates, [@workflow_signals, @workflow_queries]]
325
+ unfinished_policy: handler[:unfinished_policy],
326
+ arg_hints: handler[:arg_hints],
327
+ result_hint: handler[:result_hint]
328
+ ), @workflow_updates]
329
+ when :dynamic_options
330
+ raise 'Dynamic options method already set' if @dynamic_options_method
331
+
332
+ @dynamic_options_method = method_name
333
+ return
259
334
  else
260
335
  raise "Unrecognized handler type #{handler[:type]}"
261
336
  end
@@ -266,8 +341,6 @@ module Temporalio
266
341
  if other && other.to_invoke != method_name
267
342
  raise "Workflow #{handler[:type].name} #{defn.name || '<dynamic>'} defined on " \
268
343
  "different methods #{other.to_invoke} and #{method_name}"
269
- elsif defn.name && other_hashes.any? { |h| h.include?(defn.name) }
270
- raise "Workflow signal #{defn.name} already defined as a different handler type"
271
344
  end
272
345
  hash[defn.name] = defn
273
346
 
@@ -293,7 +366,7 @@ module Temporalio
293
366
  end
294
367
 
295
368
  # @!visibility private
296
- def self._workflow_type_from_workflow_parameter(workflow)
369
+ def self._workflow_type_and_hints_from_workflow_parameter(workflow)
297
370
  case workflow
298
371
  when Class
299
372
  unless workflow < Definition
@@ -301,11 +374,15 @@ module Temporalio
301
374
  end
302
375
 
303
376
  info = Info.from_class(workflow)
304
- info.name || raise(ArgumentError, 'Cannot pass dynamic workflow to start')
377
+ raise(ArgumentError, 'Cannot pass dynamic workflow to start') unless info.name
378
+
379
+ [info.name.to_s, info.arg_hints, info.result_hint]
305
380
  when Info
306
- workflow.name || raise(ArgumentError, 'Cannot pass dynamic workflow to start')
381
+ raise(ArgumentError, 'Cannot pass dynamic workflow to start') unless workflow.name
382
+
383
+ [workflow.name.to_s, nil, nil]
307
384
  when String, Symbol
308
- workflow.to_s
385
+ [workflow.to_s, nil, nil]
309
386
  else
310
387
  raise ArgumentError, 'Workflow is not a workflow class or string/symbol'
311
388
  end
@@ -318,6 +395,11 @@ module Temporalio
318
395
  raise "Leftover #{pending_handler_details&.[](:type)} handler not applied to a method"
319
396
  end
320
397
 
398
+ # Disallow kwargs in execute parameters
399
+ if instance_method(:execute).parameters.any? { |t, _| t == :key || t == :keyreq }
400
+ raise 'Workflow execute cannot have keyword arguments'
401
+ end
402
+
321
403
  # Apply all update validators before merging with super
322
404
  updates = @workflow_updates&.dup || {}
323
405
  @workflow_update_validators&.each_value do |validator|
@@ -387,6 +469,10 @@ module Temporalio
387
469
 
388
470
  raise 'Workflow cannot be given a name and be dynamic' if dynamic && override_name
389
471
 
472
+ if !dynamic && !@dynamic_options_method.nil?
473
+ raise 'Workflow cannot have a dynamic_options_method unless it is dynamic'
474
+ end
475
+
390
476
  Info.new(
391
477
  workflow_class: self,
392
478
  override_name:,
@@ -396,7 +482,11 @@ module Temporalio
396
482
  failure_exception_types: @workflow_failure_exception_types || [],
397
483
  signals:,
398
484
  queries:,
399
- updates:
485
+ updates:,
486
+ versioning_behavior: @versioning_behavior || VersioningBehavior::UNSPECIFIED,
487
+ dynamic_options_method: @dynamic_options_method,
488
+ arg_hints: @workflow_arg_hints,
489
+ result_hint: @workflow_result_hint
400
490
  )
401
491
  end
402
492
 
@@ -409,7 +499,8 @@ module Temporalio
409
499
  # Information about the workflow definition. This is usually not used directly.
410
500
  class Info
411
501
  attr_reader :workflow_class, :override_name, :dynamic, :init, :raw_args,
412
- :failure_exception_types, :signals, :queries, :updates
502
+ :failure_exception_types, :signals, :queries, :updates, :versioning_behavior,
503
+ :dynamic_options_method, :arg_hints, :result_hint
413
504
 
414
505
  # Derive the workflow definition info from the class.
415
506
  #
@@ -434,7 +525,11 @@ module Temporalio
434
525
  failure_exception_types: [],
435
526
  signals: {},
436
527
  queries: {},
437
- updates: {}
528
+ updates: {},
529
+ versioning_behavior: VersioningBehavior::UNSPECIFIED,
530
+ dynamic_options_method: nil,
531
+ arg_hints: nil,
532
+ result_hint: nil
438
533
  )
439
534
  @workflow_class = workflow_class
440
535
  @override_name = override_name
@@ -445,6 +540,10 @@ module Temporalio
445
540
  @signals = signals.dup.freeze
446
541
  @queries = queries.dup.freeze
447
542
  @updates = updates.dup.freeze
543
+ @versioning_behavior = versioning_behavior
544
+ @dynamic_options_method = dynamic_options_method
545
+ @arg_hints = arg_hints
546
+ @result_hint = result_hint
448
547
  Internal::ProtoUtils.assert_non_reserved_name(name)
449
548
  end
450
549
 
@@ -457,15 +556,17 @@ module Temporalio
457
556
  # A signal definition. This is usually built as a result of a {Definition.workflow_signal} method, but can be
458
557
  # manually created to set at runtime on {Workflow.signal_handlers}.
459
558
  class Signal
460
- attr_reader :name, :to_invoke, :description, :raw_args, :unfinished_policy
559
+ attr_reader :name, :to_invoke, :description, :raw_args, :unfinished_policy, :arg_hints
461
560
 
462
561
  # @!visibility private
463
- def self._name_from_parameter(signal)
562
+ def self._name_and_hints_from_parameter(signal)
464
563
  case signal
465
564
  when Workflow::Definition::Signal
466
- signal.name || raise(ArgumentError, 'Cannot call dynamic signal directly')
565
+ raise(ArgumentError, 'Cannot call dynamic signal directly') unless signal.name
566
+
567
+ [signal.name, signal.arg_hints]
467
568
  when String, Symbol
468
- signal.to_s
569
+ [signal.to_s, nil]
469
570
  else
470
571
  raise ArgumentError, 'Signal is not a definition or string/symbol'
471
572
  end
@@ -481,18 +582,21 @@ module Temporalio
481
582
  # @param raw_args [Boolean] Whether the parameters should be raw values.
482
583
  # @param unfinished_policy [HandlerUnfinishedPolicy] How the workflow reacts when this handler is still running
483
584
  # on workflow completion.
585
+ # @param arg_hints [Array<Object>, nil] Argument hints for the signal.
484
586
  def initialize(
485
587
  name:,
486
588
  to_invoke:,
487
589
  description: nil,
488
590
  raw_args: false,
489
- unfinished_policy: HandlerUnfinishedPolicy::WARN_AND_ABANDON
591
+ unfinished_policy: HandlerUnfinishedPolicy::WARN_AND_ABANDON,
592
+ arg_hints: nil
490
593
  )
491
594
  @name = name
492
595
  @to_invoke = to_invoke
493
596
  @description = description
494
597
  @raw_args = raw_args
495
598
  @unfinished_policy = unfinished_policy
599
+ @arg_hints = arg_hints
496
600
  Internal::ProtoUtils.assert_non_reserved_name(name)
497
601
  end
498
602
  end
@@ -500,15 +604,17 @@ module Temporalio
500
604
  # A query definition. This is usually built as a result of a {Definition.workflow_query} method, but can be
501
605
  # manually created to set at runtime on {Workflow.query_handlers}.
502
606
  class Query
503
- attr_reader :name, :to_invoke, :description, :raw_args
607
+ attr_reader :name, :to_invoke, :description, :raw_args, :arg_hints, :result_hint
504
608
 
505
609
  # @!visibility private
506
- def self._name_from_parameter(query)
610
+ def self._name_and_hints_from_parameter(query)
507
611
  case query
508
612
  when Workflow::Definition::Query
509
- query.name || raise(ArgumentError, 'Cannot call dynamic query directly')
613
+ raise(ArgumentError, 'Cannot call dynamic query directly') unless query.name
614
+
615
+ [query.name, query.arg_hints, query.result_hint]
510
616
  when String, Symbol
511
- query.to_s
617
+ [query.to_s, nil, nil]
512
618
  else
513
619
  raise ArgumentError, 'Query is not a definition or string/symbol'
514
620
  end
@@ -522,16 +628,22 @@ module Temporalio
522
628
  # @param description [String, nil] Description for this handler that may appear in CLI/UI. This is currently
523
629
  # experimental.
524
630
  # @param raw_args [Boolean] Whether the parameters should be raw values.
631
+ # @param arg_hints [Array<Object>, nil] Argument hints for the query.
632
+ # @param result_hint [Object, nil] Result hints for the query.
525
633
  def initialize(
526
634
  name:,
527
635
  to_invoke:,
528
636
  description: nil,
529
- raw_args: false
637
+ raw_args: false,
638
+ arg_hints: nil,
639
+ result_hint: nil
530
640
  )
531
641
  @name = name
532
642
  @to_invoke = to_invoke
533
643
  @description = description
534
644
  @raw_args = raw_args
645
+ @arg_hints = arg_hints
646
+ @result_hint = result_hint
535
647
  Internal::ProtoUtils.assert_non_reserved_name(name)
536
648
  end
537
649
  end
@@ -539,15 +651,18 @@ module Temporalio
539
651
  # An update definition. This is usually built as a result of a {Definition.workflow_update} method, but can be
540
652
  # manually created to set at runtime on {Workflow.update_handlers}.
541
653
  class Update
542
- attr_reader :name, :to_invoke, :description, :raw_args, :unfinished_policy, :validator_to_invoke
654
+ attr_reader :name, :to_invoke, :description, :raw_args, :unfinished_policy, :validator_to_invoke,
655
+ :arg_hints, :result_hint
543
656
 
544
657
  # @!visibility private
545
- def self._name_from_parameter(update)
658
+ def self._name_and_hints_from_parameter(update)
546
659
  case update
547
660
  when Workflow::Definition::Update
548
- update.name || raise(ArgumentError, 'Cannot call dynamic update directly')
661
+ raise(ArgumentError, 'Cannot call dynamic update directly') unless update.name
662
+
663
+ [update.name, update.arg_hints, update.result_hint]
549
664
  when String, Symbol
550
- update.to_s
665
+ [update.to_s, nil, nil]
551
666
  else
552
667
  raise ArgumentError, 'Update is not a definition or string/symbol'
553
668
  end
@@ -564,13 +679,17 @@ module Temporalio
564
679
  # @param unfinished_policy [HandlerUnfinishedPolicy] How the workflow reacts when this handler is still running
565
680
  # on workflow completion.
566
681
  # @param validator_to_invoke [Symbol, Proc, nil] Method name or proc validator to invoke.
682
+ # @param arg_hints [Array<Object>, nil] Argument hints for the update.
683
+ # @param result_hint [Object, nil] Result hints for the update.
567
684
  def initialize(
568
685
  name:,
569
686
  to_invoke:,
570
687
  description: nil,
571
688
  raw_args: false,
572
689
  unfinished_policy: HandlerUnfinishedPolicy::WARN_AND_ABANDON,
573
- validator_to_invoke: nil
690
+ validator_to_invoke: nil,
691
+ arg_hints: nil,
692
+ result_hint: nil
574
693
  )
575
694
  @name = name
576
695
  @to_invoke = to_invoke
@@ -578,6 +697,8 @@ module Temporalio
578
697
  @raw_args = raw_args
579
698
  @unfinished_policy = unfinished_policy
580
699
  @validator_to_invoke = validator_to_invoke
700
+ @arg_hints = arg_hints
701
+ @result_hint = result_hint
581
702
  Internal::ProtoUtils.assert_non_reserved_name(name)
582
703
  end
583
704
 
@@ -589,10 +710,37 @@ module Temporalio
589
710
  description:,
590
711
  raw_args:,
591
712
  unfinished_policy:,
592
- validator_to_invoke:
713
+ validator_to_invoke:,
714
+ arg_hints:,
715
+ result_hint:
593
716
  )
594
717
  end
595
718
  end
596
719
  end
720
+
721
+ DefinitionOptions = Struct.new(
722
+ :failure_exception_types,
723
+ :versioning_behavior
724
+ )
725
+ # @!attribute failure_exception_types
726
+ # Dynamic equivalent of {Definition.workflow_failure_exception_type}.
727
+ # Will override any types set there if set, including if set to an empty array.
728
+ # @return [Array<Class<Exception>>, nil] The failure exception types
729
+ #
730
+ # @!attribute versioning_behavior
731
+ # Dynamic equivalent of {Definition.workflow_versioning_behavior}.
732
+ # Will override any behavior set there if set.
733
+ # WARNING: Deployment-based versioning is experimental and APIs may change.
734
+ # @return [VersioningBehavior, nil] The versioning behavior
735
+ #
736
+ # @return [VersioningBehavior, nil] The versioning behavior
737
+ class DefinitionOptions
738
+ def initialize(
739
+ failure_exception_types: nil,
740
+ versioning_behavior: nil
741
+ )
742
+ super
743
+ end
744
+ end
597
745
  end
598
746
  end
@@ -28,7 +28,9 @@ module Temporalio
28
28
  # @param signal [Workflow::Definition::Signal, Symbol, String] Signal definition or name.
29
29
  # @param args [Array<Object>] Signal args.
30
30
  # @param cancellation [Cancellation] Cancellation for canceling the signalling.
31
- def signal(signal, *args, cancellation: Workflow.cancellation)
31
+ # @param arg_hints [Array<Object>, nil] Overrides converter hints for arguments if any. If unset/nil and the
32
+ # signal definition has arg hints, those are used by default.
33
+ def signal(signal, *args, cancellation: Workflow.cancellation, arg_hints: nil)
32
34
  raise NotImplementedError
33
35
  end
34
36
 
@@ -12,6 +12,7 @@ module Temporalio
12
12
  :last_result,
13
13
  :namespace,
14
14
  :parent,
15
+ :priority,
15
16
  :retry_policy,
16
17
  :root,
17
18
  :run_id,
@@ -44,6 +45,8 @@ module Temporalio
44
45
  # @return [String] Namespace for the workflow.
45
46
  # @!attribute parent
46
47
  # @return [ParentInfo, nil] Parent information for the workflow if this is a child.
48
+ # @!attribute priority
49
+ # @return [Priority] The priority of this workflow.
47
50
  # @!attribute retry_policy
48
51
  # @return [RetryPolicy, nil] Retry policy for the workflow.
49
52
  # @!attribute root
@@ -54,7 +57,7 @@ module Temporalio
54
57
  # @!attribute run_timeout
55
58
  # @return [Float, nil] Run timeout for the workflow.
56
59
  # @!attribute start_time
57
- # @return [Time] Time when the workflow started.
60
+ # @return [Time] Time when the workflow started on the server.
58
61
  # @!attribute task_queue
59
62
  # @return [String] Task queue for the workflow.
60
63
  # @!attribute task_timeout