activejob-temporal 0.1.0 → 0.2.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 (60) hide show
  1. checksums.yaml +4 -4
  2. data/AGENTS.md +1 -0
  3. data/CHANGELOG.md +18 -0
  4. data/CLAUDE.md +274 -0
  5. data/CONTRIBUTING.md +69 -0
  6. data/README.md +34 -33
  7. data/activejob-temporal.gemspec +8 -12
  8. data/api/job_payload_schema.json +51 -6
  9. data/bin/temporal-worker +3 -8
  10. data/gemfiles/activejob_contract.gemfile +8 -0
  11. data/gemfiles/temporalio_contract.gemfile +7 -0
  12. data/lib/activejob/temporal/activities/aj_runner_activity.rb +75 -19
  13. data/lib/activejob/temporal/activities/dependency_status_activity.rb +36 -19
  14. data/lib/activejob/temporal/adapter.rb +4 -3
  15. data/lib/activejob/temporal/batch_enqueuer.rb +42 -33
  16. data/lib/activejob/temporal/bind_policy.rb +1 -1
  17. data/lib/activejob/temporal/cancel.rb +66 -29
  18. data/lib/activejob/temporal/certificate_watcher.rb +41 -6
  19. data/lib/activejob/temporal/client.rb +4 -3
  20. data/lib/activejob/temporal/conditional_enqueue.rb +2 -1
  21. data/lib/activejob/temporal/configurable.rb +56 -13
  22. data/lib/activejob/temporal/configuration.rb +139 -7
  23. data/lib/activejob/temporal/configured_job_compatibility.rb +91 -9
  24. data/lib/activejob/temporal/connection_worker_pool.rb +18 -1
  25. data/lib/activejob/temporal/dead_letter_queue.rb +64 -18
  26. data/lib/activejob/temporal/dependency_options.rb +126 -16
  27. data/lib/activejob/temporal/health_check_server.rb +14 -17
  28. data/lib/activejob/temporal/http_line_reader.rb +20 -2
  29. data/lib/activejob/temporal/http_request_failure_handling.rb +41 -0
  30. data/lib/activejob/temporal/inspect.rb +17 -7
  31. data/lib/activejob/temporal/job_id_validation.rb +41 -0
  32. data/lib/activejob/temporal/job_payload_dependencies.rb +23 -0
  33. data/lib/activejob/temporal/locales/en.yml +15 -3
  34. data/lib/activejob/temporal/metrics_server.rb +15 -18
  35. data/lib/activejob/temporal/middleware/chain.rb +7 -0
  36. data/lib/activejob/temporal/observability.rb +14 -2
  37. data/lib/activejob/temporal/payload.rb +64 -25
  38. data/lib/activejob/temporal/payload_encryption.rb +9 -1
  39. data/lib/activejob/temporal/payload_serializers.rb +3 -0
  40. data/lib/activejob/temporal/payload_storage.rb +4 -4
  41. data/lib/activejob/temporal/rails_environment_loader.rb +1 -8
  42. data/lib/activejob/temporal/reload_signal_queue.rb +19 -19
  43. data/lib/activejob/temporal/retry_handler_extractor.rb +18 -3
  44. data/lib/activejob/temporal/schedulable.rb +5 -7
  45. data/lib/activejob/temporal/schedule.rb +2 -2
  46. data/lib/activejob/temporal/signal_query.rb +35 -23
  47. data/lib/activejob/temporal/temporal_options.rb +26 -1
  48. data/lib/activejob/temporal/tls_file.rb +16 -16
  49. data/lib/activejob/temporal/transaction_safety.rb +102 -1
  50. data/lib/activejob/temporal/version.rb +1 -1
  51. data/lib/activejob/temporal/visibility_query.rb +16 -1
  52. data/lib/activejob/temporal/worker_pool.rb +13 -0
  53. data/lib/activejob/temporal/worker_runtime.rb +16 -0
  54. data/lib/activejob/temporal/workflow_enqueuer.rb +2 -1
  55. data/lib/activejob/temporal/workflow_types.rb +10 -0
  56. data/lib/activejob/temporal/workflows/aj_workflow.rb +17 -4
  57. data/lib/activejob/temporal/workflows/workflow_dependencies.rb +148 -15
  58. data/lib/activejob/temporal.rb +2 -13
  59. data/test/mutant_unit_test.rb +13 -0
  60. metadata +43 -48
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "time"
4
+ require "timeout"
3
5
  require "temporalio/error"
4
6
 
5
7
  require_relative "../activities/dependency_status_activity"
@@ -11,8 +13,11 @@ module ActiveJob
11
13
  DEPENDENCY_CHECK_ACTIVITY_TIMEOUT = 30.0
12
14
  DEPENDENCY_CHECK_RETRY_POLICY = Temporalio::RetryPolicy.new(max_attempts: 1)
13
15
  DEPENDENCY_WAIT_INTERVAL = 10.0
16
+ DEPENDENCY_WAIT_TIMEOUT = 86_400.0
17
+ DEPENDENCY_WAIT_MAX_INTERVAL = 60.0
18
+ DEPENDENCY_WAIT_BACKOFF = 2.0
14
19
  DEPENDENCY_NOT_FOUND_MAX_CHECKS = 6
15
- COMPLETED_DEPENDENCY_STATES = %w[completed].freeze
20
+ COMPLETED_DEPENDENCY_STATES = %w[completed continued_as_new].freeze
16
21
  FAILED_DEPENDENCY_STATES = %w[failed canceled terminated timed_out unknown].freeze
17
22
  NOT_FOUND_DEPENDENCY_STATES = %w[not_found].freeze
18
23
 
@@ -23,16 +28,19 @@ module ActiveJob
23
28
  return if dependencies.empty?
24
29
 
25
30
  workflow_state["phase"] = "waiting_dependencies"
26
- not_found_counts = Hash.new(0)
27
- loop do
28
- wait_while_paused
29
- statuses = check_dependency_statuses(dependencies)
30
- expired_not_found_statuses = expired_not_found_statuses(statuses, not_found_counts)
31
- failed_statuses = failed_dependency_statuses(statuses) + expired_not_found_statuses
32
- fail_for_dependencies!(failed_statuses) if fail_on_dependency_failure?(payload) && failed_statuses.any?
33
- break if dependencies_satisfied?(statuses, expired_not_found_statuses)
34
-
35
- Temporalio::Workflow.sleep(DEPENDENCY_WAIT_INTERVAL)
31
+ wait_options = dependency_wait_options(payload)
32
+ deadline = dependency_wait_deadline(wait_options)
33
+ begin
34
+ with_dependency_wait_timeout(wait_options, deadline) do
35
+ wait_for_dependency_statuses(payload, dependencies, wait_options)
36
+ end
37
+ rescue Timeout::Error
38
+ timed_out_statuses = dependency_timeout_statuses(dependencies)
39
+ if fail_on_dependency_failure?(payload)
40
+ fail_for_dependencies!(timed_out_statuses)
41
+ else
42
+ workflow_state.delete("dependency_wait")
43
+ end
36
44
  end
37
45
  end
38
46
 
@@ -50,6 +58,116 @@ module ActiveJob
50
58
  )
51
59
  end
52
60
 
61
+ def wait_for_dependency_statuses(payload, dependencies, wait_options)
62
+ not_found_counts = dependency_wait_not_found_counts
63
+ wait_interval = dependency_wait_current_interval(wait_options)
64
+ loop do
65
+ wait_while_paused
66
+ statuses = check_dependency_statuses(dependencies)
67
+ expired_not_found_statuses = expired_not_found_statuses(statuses, not_found_counts)
68
+ failed_statuses = failed_dependency_statuses(statuses) + expired_not_found_statuses
69
+ fail_for_dependencies!(failed_statuses) if fail_on_dependency_failure?(payload) && failed_statuses.any?
70
+ break if dependencies_satisfied?(statuses, expired_not_found_statuses)
71
+
72
+ persist_dependency_wait_state(not_found_counts, wait_interval)
73
+ continue_as_new_if_needed(payload)
74
+ Temporalio::Workflow.sleep(wait_interval)
75
+ wait_interval = next_dependency_wait_interval(wait_interval, wait_options)
76
+ end
77
+ workflow_state.delete("dependency_wait")
78
+ end
79
+
80
+ def with_dependency_wait_timeout(wait_options, deadline, &)
81
+ remaining_timeout = dependency_wait_remaining_timeout(deadline)
82
+ raise Timeout::Error, "dependency wait timed out" unless remaining_timeout.positive?
83
+
84
+ Temporalio::Workflow.timeout(
85
+ remaining_timeout,
86
+ Timeout::Error,
87
+ "dependency wait timed out after #{wait_options[:timeout]} seconds",
88
+ summary: "Dependency wait timeout",
89
+ &
90
+ )
91
+ end
92
+
93
+ def dependency_wait_options(payload)
94
+ configured_options = payload[:dependency_wait] || payload["dependency_wait"] || {}
95
+ initial_interval = positive_float_option(configured_options, :initial_interval, DEPENDENCY_WAIT_INTERVAL)
96
+ max_interval = positive_float_option(configured_options, :max_interval, DEPENDENCY_WAIT_MAX_INTERVAL)
97
+ {
98
+ timeout: positive_float_option(configured_options, :timeout, DEPENDENCY_WAIT_TIMEOUT),
99
+ initial_interval: initial_interval,
100
+ max_interval: [max_interval, initial_interval].max,
101
+ backoff: backoff_option(configured_options)
102
+ }
103
+ end
104
+
105
+ def positive_float_option(options, key, default)
106
+ value = options[key] || options[key.to_s]
107
+ return default unless value
108
+
109
+ number = Float(value)
110
+ number.positive? ? number : default
111
+ rescue ArgumentError, TypeError
112
+ default
113
+ end
114
+
115
+ def backoff_option(options)
116
+ value = options[:backoff] || options["backoff"]
117
+ return DEPENDENCY_WAIT_BACKOFF unless value
118
+
119
+ backoff = Float(value)
120
+ backoff >= 1.0 ? backoff : DEPENDENCY_WAIT_BACKOFF
121
+ rescue ArgumentError, TypeError
122
+ DEPENDENCY_WAIT_BACKOFF
123
+ end
124
+
125
+ def dependency_wait_not_found_counts
126
+ Hash.new(0).merge(dependency_wait_state["not_found_counts"] || {})
127
+ end
128
+
129
+ def dependency_wait_current_interval(wait_options)
130
+ current_interval = dependency_wait_state["current_interval"]
131
+ return wait_options[:initial_interval] unless current_interval
132
+
133
+ interval = Float(current_interval)
134
+ interval.positive? ? interval : wait_options[:initial_interval]
135
+ rescue ArgumentError, TypeError
136
+ wait_options[:initial_interval]
137
+ end
138
+
139
+ def dependency_wait_state
140
+ workflow_state["dependency_wait"] ||= {}
141
+ end
142
+
143
+ def dependency_wait_deadline(wait_options)
144
+ deadline_at = dependency_wait_state["deadline_at"]
145
+ return Time.iso8601(deadline_at) if deadline_at
146
+
147
+ persist_dependency_wait_deadline(wait_options)
148
+ rescue ArgumentError, TypeError
149
+ persist_dependency_wait_deadline(wait_options)
150
+ end
151
+
152
+ def persist_dependency_wait_deadline(wait_options)
153
+ deadline = Temporalio::Workflow.now + wait_options[:timeout]
154
+ dependency_wait_state["deadline_at"] = deadline.iso8601
155
+ deadline
156
+ end
157
+
158
+ def dependency_wait_remaining_timeout(deadline)
159
+ deadline - Temporalio::Workflow.now
160
+ end
161
+
162
+ def persist_dependency_wait_state(not_found_counts, wait_interval)
163
+ dependency_wait_state["not_found_counts"] = not_found_counts
164
+ dependency_wait_state["current_interval"] = wait_interval
165
+ end
166
+
167
+ def next_dependency_wait_interval(wait_interval, wait_options)
168
+ [wait_interval * wait_options[:backoff], wait_options[:max_interval]].min
169
+ end
170
+
53
171
  def dependencies_satisfied?(statuses, expired_not_found_statuses)
54
172
  expired_not_found_keys = expired_not_found_statuses.map { |status| dependency_status_key(status) }
55
173
  statuses.all? do |status|
@@ -79,16 +197,23 @@ module ActiveJob
79
197
  end
80
198
 
81
199
  def dependency_state(status)
82
- status["state"] || status[:state]
200
+ status_value(status, :state)
83
201
  end
84
202
 
85
203
  def dependency_status_key(status)
86
- job_class = status["job_class"] || status[:job_class]
87
- job_id = status["job_id"] || status[:job_id]
204
+ job_class = status_value(status, :job_class)
205
+ job_id = status_value(status, :job_id)
206
+ workflow_id = status_value(status, :workflow_id)
207
+ run_id = status_value(status, :run_id)
88
208
  return "#{job_class}:#{job_id}" if job_class && job_id
89
209
  return job_id if job_id
210
+ return [workflow_id, run_id].compact.join(":") if workflow_id
211
+
212
+ status.hash
213
+ end
90
214
 
91
- status["workflow_id"] || status[:workflow_id] || status.hash
215
+ def status_value(status, key)
216
+ status[key.to_s] || status[key]
92
217
  end
93
218
 
94
219
  def fail_on_dependency_failure?(payload)
@@ -109,6 +234,14 @@ module ActiveJob
109
234
  non_retryable: true
110
235
  )
111
236
  end
237
+
238
+ def dependency_timeout_statuses(dependencies)
239
+ dependencies.map do |dependency|
240
+ dependency.each_with_object({ "state" => "timed_out" }) do |(key, value), status|
241
+ status[key.to_s] = value
242
+ end
243
+ end
244
+ end
112
245
  end
113
246
  end
114
247
  end
@@ -9,17 +9,9 @@ require_relative "temporal/configurable"
9
9
  require_relative "temporal/client"
10
10
  require_relative "temporal/logger"
11
11
  require_relative "temporal/bind_policy"
12
- require_relative "temporal/rails_environment_loader"
13
12
  require_relative "temporal/tls_file"
14
- require_relative "temporal/certificate_watcher"
15
- require_relative "temporal/reload_signal_queue"
16
- require_relative "temporal/worker_client_reloader"
17
- require_relative "temporal/worker_pool"
18
13
  require_relative "temporal/audit_log"
19
- require_relative "temporal/metrics_server"
20
14
  require_relative "temporal/observability"
21
- require_relative "temporal/worker_health"
22
- require_relative "temporal/health_check_server"
23
15
  require_relative "temporal/middleware"
24
16
  require_relative "temporal/payload_serializers"
25
17
  require_relative "temporal/rate_limit_options"
@@ -36,6 +28,7 @@ require_relative "temporal/child_workflow_options"
36
28
  require_relative "temporal/chain_options"
37
29
  require_relative "temporal/dependency_options"
38
30
  require_relative "temporal/workflow_identity"
31
+ require_relative "temporal/workflow_types"
39
32
  require_relative "temporal/job_payload_builder"
40
33
  require_relative "temporal/schedule_options"
41
34
  require_relative "temporal/conditional_enqueue"
@@ -44,17 +37,13 @@ require_relative "temporal/temporal_options"
44
37
  require_relative "temporal/schedule"
45
38
  require_relative "temporal/schedulable"
46
39
  require_relative "temporal/workflow_id_builder"
40
+ require_relative "temporal/job_id_validation"
47
41
  require_relative "temporal/batch_enqueue_result"
48
42
  require_relative "temporal/batch_enqueuer"
49
43
  require_relative "temporal/workflow_enqueuer_batch"
50
44
  require_relative "temporal/workflow_enqueuer"
51
45
  require_relative "temporal/adapter"
52
46
  require_relative "temporal/transaction_safety"
53
- require_relative "temporal/workflows/aj_workflow"
54
- require_relative "temporal/workflows/dead_letter_workflow"
55
- require_relative "temporal/activities/rate_limit_activity"
56
- require_relative "temporal/activities/dependency_status_activity"
57
- require_relative "temporal/activities/aj_runner_activity"
58
47
  require_relative "temporal/cancel"
59
48
  require_relative "temporal/inspect"
60
49
  require_relative "temporal/signal_query"
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "mutant/minitest/coverage"
4
+ require_relative "../spec/spec_helper"
5
+
6
+ # mutant-minitest discovers test/**/*_test.rb, while the migrated suite keeps
7
+ # the existing spec/ split for CI and developer workflows.
8
+ Minitest::Spec.cover "ActiveJob::Temporal::WorkflowIdBuilder#build"
9
+ Minitest::Spec.cover "ActiveJob::Temporal::WorkflowIdBuilder.default_for"
10
+
11
+ Dir[File.expand_path("../spec/unit/**/*_spec.rb", __dir__)].each do |path|
12
+ require path
13
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activejob-temporal
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Temporal Technologies
@@ -16,7 +16,7 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '8.1'
19
+ version: '7.2'
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
22
  version: '9'
@@ -26,7 +26,7 @@ dependencies:
26
26
  requirements:
27
27
  - - ">="
28
28
  - !ruby/object:Gem::Version
29
- version: '8.1'
29
+ version: '7.2'
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
32
  version: '9'
@@ -36,7 +36,7 @@ dependencies:
36
36
  requirements:
37
37
  - - ">="
38
38
  - !ruby/object:Gem::Version
39
- version: '8.1'
39
+ version: '7.2'
40
40
  - - "<"
41
41
  - !ruby/object:Gem::Version
42
42
  version: '9'
@@ -46,7 +46,7 @@ dependencies:
46
46
  requirements:
47
47
  - - ">="
48
48
  - !ruby/object:Gem::Version
49
- version: '8.1'
49
+ version: '7.2'
50
50
  - - "<"
51
51
  - !ruby/object:Gem::Version
52
52
  version: '9'
@@ -78,20 +78,6 @@ dependencies:
78
78
  - - ">="
79
79
  - !ruby/object:Gem::Version
80
80
  version: '0.3'
81
- - !ruby/object:Gem::Dependency
82
- name: listen
83
- requirement: !ruby/object:Gem::Requirement
84
- requirements:
85
- - - "~>"
86
- - !ruby/object:Gem::Version
87
- version: '3.9'
88
- type: :runtime
89
- prerelease: false
90
- version_requirements: !ruby/object:Gem::Requirement
91
- requirements:
92
- - - "~>"
93
- - !ruby/object:Gem::Version
94
- version: '3.9'
95
81
  - !ruby/object:Gem::Dependency
96
82
  name: temporalio
97
83
  requirement: !ruby/object:Gem::Requirement
@@ -127,33 +113,53 @@ dependencies:
127
113
  - !ruby/object:Gem::Version
128
114
  version: '2.14'
129
115
  - !ruby/object:Gem::Dependency
130
- name: bundler-audit
116
+ name: github_changelog_generator
131
117
  requirement: !ruby/object:Gem::Requirement
132
118
  requirements:
133
119
  - - "~>"
134
120
  - !ruby/object:Gem::Version
135
- version: '0.9'
121
+ version: '1.18'
136
122
  type: :development
137
123
  prerelease: false
138
124
  version_requirements: !ruby/object:Gem::Requirement
139
125
  requirements:
140
126
  - - "~>"
141
127
  - !ruby/object:Gem::Version
142
- version: '0.9'
128
+ version: '1.18'
143
129
  - !ruby/object:Gem::Dependency
144
- name: github_changelog_generator
130
+ name: listen
145
131
  requirement: !ruby/object:Gem::Requirement
146
132
  requirements:
147
133
  - - "~>"
148
134
  - !ruby/object:Gem::Version
149
- version: '1.18'
135
+ version: '3.9'
150
136
  type: :development
151
137
  prerelease: false
152
138
  version_requirements: !ruby/object:Gem::Requirement
153
139
  requirements:
154
140
  - - "~>"
155
141
  - !ruby/object:Gem::Version
156
- version: '1.18'
142
+ version: '3.9'
143
+ - !ruby/object:Gem::Dependency
144
+ name: minitest
145
+ requirement: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - ">="
148
+ - !ruby/object:Gem::Version
149
+ version: '5.11'
150
+ - - "<"
151
+ - !ruby/object:Gem::Version
152
+ version: '7'
153
+ type: :development
154
+ prerelease: false
155
+ version_requirements: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '5.11'
160
+ - - "<"
161
+ - !ruby/object:Gem::Version
162
+ version: '7'
157
163
  - !ruby/object:Gem::Dependency
158
164
  name: msgpack
159
165
  requirement: !ruby/object:Gem::Requirement
@@ -169,7 +175,7 @@ dependencies:
169
175
  - !ruby/object:Gem::Version
170
176
  version: '1.8'
171
177
  - !ruby/object:Gem::Dependency
172
- name: mutant-rspec
178
+ name: mutant-minitest
173
179
  requirement: !ruby/object:Gem::Requirement
174
180
  requirements:
175
181
  - - "~>"
@@ -210,20 +216,6 @@ dependencies:
210
216
  - - "~>"
211
217
  - !ruby/object:Gem::Version
212
218
  version: '13.2'
213
- - !ruby/object:Gem::Dependency
214
- name: rspec
215
- requirement: !ruby/object:Gem::Requirement
216
- requirements:
217
- - - "~>"
218
- - !ruby/object:Gem::Version
219
- version: '3.12'
220
- type: :development
221
- prerelease: false
222
- version_requirements: !ruby/object:Gem::Requirement
223
- requirements:
224
- - - "~>"
225
- - !ruby/object:Gem::Version
226
- version: '3.12'
227
219
  - !ruby/object:Gem::Dependency
228
220
  name: rubocop
229
221
  requirement: !ruby/object:Gem::Requirement
@@ -273,9 +265,6 @@ dependencies:
273
265
  - - "~>"
274
266
  - !ruby/object:Gem::Version
275
267
  version: '0.9'
276
- - - ">="
277
- - !ruby/object:Gem::Version
278
- version: 0.9.42
279
268
  type: :development
280
269
  prerelease: false
281
270
  version_requirements: !ruby/object:Gem::Requirement
@@ -283,9 +272,6 @@ dependencies:
283
272
  - - "~>"
284
273
  - !ruby/object:Gem::Version
285
274
  version: '0.9'
286
- - - ">="
287
- - !ruby/object:Gem::Version
288
- version: 0.9.42
289
275
  description: |
290
276
  activejob-temporal bridges Rails ActiveJob with Temporal's durable execution engine.
291
277
  It provides a drop-in ActiveJob adapter, Temporal workflows, and supporting tooling
@@ -297,12 +283,17 @@ executables:
297
283
  extensions: []
298
284
  extra_rdoc_files: []
299
285
  files:
286
+ - AGENTS.md
300
287
  - CHANGELOG.md
288
+ - CLAUDE.md
289
+ - CONTRIBUTING.md
301
290
  - LICENSE
302
291
  - README.md
303
292
  - activejob-temporal.gemspec
304
293
  - api/job_payload_schema.json
305
294
  - bin/temporal-worker
295
+ - gemfiles/activejob_contract.gemfile
296
+ - gemfiles/temporalio_contract.gemfile
306
297
  - lib/activejob-temporal.rb
307
298
  - lib/activejob/temporal.rb
308
299
  - lib/activejob/temporal/active_job_handler_source.rb
@@ -333,8 +324,10 @@ files:
333
324
  - lib/activejob/temporal/external_operation.rb
334
325
  - lib/activejob/temporal/health_check_server.rb
335
326
  - lib/activejob/temporal/http_line_reader.rb
327
+ - lib/activejob/temporal/http_request_failure_handling.rb
336
328
  - lib/activejob/temporal/inspect.rb
337
329
  - lib/activejob/temporal/job_descriptor.rb
330
+ - lib/activejob/temporal/job_id_validation.rb
338
331
  - lib/activejob/temporal/job_payload_builder.rb
339
332
  - lib/activejob/temporal/job_payload_chain_builder.rb
340
333
  - lib/activejob/temporal/job_payload_child_workflows.rb
@@ -378,10 +371,12 @@ files:
378
371
  - lib/activejob/temporal/worker_client_reloader.rb
379
372
  - lib/activejob/temporal/worker_health.rb
380
373
  - lib/activejob/temporal/worker_pool.rb
374
+ - lib/activejob/temporal/worker_runtime.rb
381
375
  - lib/activejob/temporal/workflow_enqueuer.rb
382
376
  - lib/activejob/temporal/workflow_enqueuer_batch.rb
383
377
  - lib/activejob/temporal/workflow_id_builder.rb
384
378
  - lib/activejob/temporal/workflow_identity.rb
379
+ - lib/activejob/temporal/workflow_types.rb
385
380
  - lib/activejob/temporal/workflows/aj_workflow.rb
386
381
  - lib/activejob/temporal/workflows/dead_letter_support.rb
387
382
  - lib/activejob/temporal/workflows/dead_letter_workflow.rb
@@ -394,13 +389,13 @@ files:
394
389
  - lib/activejob/temporal/workflows/workflow_local_activities.rb
395
390
  - lib/activejob/temporal/workflows/workflow_nexus.rb
396
391
  - lib/activejob/temporal/workflows/workflow_versioning.rb
392
+ - test/mutant_unit_test.rb
397
393
  homepage: https://github.com/schovi/activejob-temporal
398
394
  licenses:
399
395
  - MIT
400
396
  metadata:
401
397
  homepage_uri: https://github.com/schovi/activejob-temporal
402
- source_code_uri: https://github.com/schovi/activejob-temporal/tree/main
403
- documentation_uri: https://github.com/schovi/activejob-temporal/blob/main/docs/README.md
398
+ source_code_uri: https://github.com/schovi/activejob-temporal
404
399
  changelog_uri: https://github.com/schovi/activejob-temporal/blob/main/CHANGELOG.md
405
400
  rubygems_mfa_required: 'true'
406
401
  rdoc_options: []