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.
- checksums.yaml +4 -4
- data/AGENTS.md +1 -0
- data/CHANGELOG.md +18 -0
- data/CLAUDE.md +274 -0
- data/CONTRIBUTING.md +69 -0
- data/README.md +34 -33
- data/activejob-temporal.gemspec +8 -12
- data/api/job_payload_schema.json +51 -6
- data/bin/temporal-worker +3 -8
- data/gemfiles/activejob_contract.gemfile +8 -0
- data/gemfiles/temporalio_contract.gemfile +7 -0
- data/lib/activejob/temporal/activities/aj_runner_activity.rb +75 -19
- data/lib/activejob/temporal/activities/dependency_status_activity.rb +36 -19
- data/lib/activejob/temporal/adapter.rb +4 -3
- data/lib/activejob/temporal/batch_enqueuer.rb +42 -33
- data/lib/activejob/temporal/bind_policy.rb +1 -1
- data/lib/activejob/temporal/cancel.rb +66 -29
- data/lib/activejob/temporal/certificate_watcher.rb +41 -6
- data/lib/activejob/temporal/client.rb +4 -3
- data/lib/activejob/temporal/conditional_enqueue.rb +2 -1
- data/lib/activejob/temporal/configurable.rb +56 -13
- data/lib/activejob/temporal/configuration.rb +139 -7
- data/lib/activejob/temporal/configured_job_compatibility.rb +91 -9
- data/lib/activejob/temporal/connection_worker_pool.rb +18 -1
- data/lib/activejob/temporal/dead_letter_queue.rb +64 -18
- data/lib/activejob/temporal/dependency_options.rb +126 -16
- data/lib/activejob/temporal/health_check_server.rb +14 -17
- data/lib/activejob/temporal/http_line_reader.rb +20 -2
- data/lib/activejob/temporal/http_request_failure_handling.rb +41 -0
- data/lib/activejob/temporal/inspect.rb +17 -7
- data/lib/activejob/temporal/job_id_validation.rb +41 -0
- data/lib/activejob/temporal/job_payload_dependencies.rb +23 -0
- data/lib/activejob/temporal/locales/en.yml +15 -3
- data/lib/activejob/temporal/metrics_server.rb +15 -18
- data/lib/activejob/temporal/middleware/chain.rb +7 -0
- data/lib/activejob/temporal/observability.rb +14 -2
- data/lib/activejob/temporal/payload.rb +64 -25
- data/lib/activejob/temporal/payload_encryption.rb +9 -1
- data/lib/activejob/temporal/payload_serializers.rb +3 -0
- data/lib/activejob/temporal/payload_storage.rb +4 -4
- data/lib/activejob/temporal/rails_environment_loader.rb +1 -8
- data/lib/activejob/temporal/reload_signal_queue.rb +19 -19
- data/lib/activejob/temporal/retry_handler_extractor.rb +18 -3
- data/lib/activejob/temporal/schedulable.rb +5 -7
- data/lib/activejob/temporal/schedule.rb +2 -2
- data/lib/activejob/temporal/signal_query.rb +35 -23
- data/lib/activejob/temporal/temporal_options.rb +26 -1
- data/lib/activejob/temporal/tls_file.rb +16 -16
- data/lib/activejob/temporal/transaction_safety.rb +102 -1
- data/lib/activejob/temporal/version.rb +1 -1
- data/lib/activejob/temporal/visibility_query.rb +16 -1
- data/lib/activejob/temporal/worker_pool.rb +13 -0
- data/lib/activejob/temporal/worker_runtime.rb +16 -0
- data/lib/activejob/temporal/workflow_enqueuer.rb +2 -1
- data/lib/activejob/temporal/workflow_types.rb +10 -0
- data/lib/activejob/temporal/workflows/aj_workflow.rb +17 -4
- data/lib/activejob/temporal/workflows/workflow_dependencies.rb +148 -15
- data/lib/activejob/temporal.rb +2 -13
- data/test/mutant_unit_test.rb +13 -0
- 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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
|
200
|
+
status_value(status, :state)
|
|
83
201
|
end
|
|
84
202
|
|
|
85
203
|
def dependency_status_key(status)
|
|
86
|
-
job_class = status
|
|
87
|
-
job_id = status
|
|
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
|
-
|
|
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
|
data/lib/activejob/temporal.rb
CHANGED
|
@@ -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.
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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:
|
|
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: '
|
|
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: '
|
|
128
|
+
version: '1.18'
|
|
143
129
|
- !ruby/object:Gem::Dependency
|
|
144
|
-
name:
|
|
130
|
+
name: listen
|
|
145
131
|
requirement: !ruby/object:Gem::Requirement
|
|
146
132
|
requirements:
|
|
147
133
|
- - "~>"
|
|
148
134
|
- !ruby/object:Gem::Version
|
|
149
|
-
version: '
|
|
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: '
|
|
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-
|
|
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
|
|
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: []
|