temporal-ruby 0.0.0 → 0.0.1.pre.pre1

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 (102) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +19 -42
  3. data/lib/gen/temporal/api/command/v1/message_pb.rb +146 -0
  4. data/lib/gen/temporal/api/common/v1/message_pb.rb +67 -0
  5. data/lib/gen/temporal/api/enums/v1/command_type_pb.rb +35 -0
  6. data/lib/gen/temporal/api/enums/v1/common_pb.rb +34 -0
  7. data/lib/gen/temporal/api/enums/v1/event_type_pb.rb +62 -0
  8. data/lib/gen/temporal/api/enums/v1/failed_cause_pb.rb +60 -0
  9. data/lib/gen/temporal/api/enums/v1/namespace_pb.rb +31 -0
  10. data/lib/gen/temporal/api/enums/v1/query_pb.rb +31 -0
  11. data/lib/gen/temporal/api/enums/v1/task_queue_pb.rb +30 -0
  12. data/lib/gen/temporal/api/enums/v1/workflow_pb.rb +82 -0
  13. data/lib/gen/temporal/api/errordetails/v1/message_pb.rb +55 -0
  14. data/lib/gen/temporal/api/failure/v1/message_pb.rb +81 -0
  15. data/lib/gen/temporal/api/filter/v1/message_pb.rb +38 -0
  16. data/lib/gen/temporal/api/history/v1/message_pb.rb +423 -0
  17. data/lib/gen/temporal/api/namespace/v1/message_pb.rb +55 -0
  18. data/lib/gen/temporal/api/query/v1/message_pb.rb +36 -0
  19. data/lib/gen/temporal/api/replication/v1/message_pb.rb +27 -0
  20. data/lib/gen/temporal/api/taskqueue/v1/message_pb.rb +60 -0
  21. data/lib/gen/temporal/api/version/v1/message_pb.rb +28 -0
  22. data/lib/gen/temporal/api/workflow/v1/message_pb.rb +83 -0
  23. data/lib/gen/temporal/api/workflowservice/v1/request_response_pb.rb +538 -0
  24. data/lib/gen/temporal/api/workflowservice/v1/service_pb.rb +19 -0
  25. data/lib/gen/temporal/api/workflowservice/v1/service_services_pb.rb +223 -0
  26. data/lib/temporal-ruby.rb +1 -0
  27. data/lib/temporal.rb +137 -0
  28. data/lib/temporal/activity.rb +33 -0
  29. data/lib/temporal/activity/async_token.rb +34 -0
  30. data/lib/temporal/activity/context.rb +64 -0
  31. data/lib/temporal/activity/poller.rb +79 -0
  32. data/lib/temporal/activity/task_processor.rb +78 -0
  33. data/lib/temporal/activity/workflow_convenience_methods.rb +41 -0
  34. data/lib/temporal/client.rb +21 -0
  35. data/lib/temporal/client/errors.rb +8 -0
  36. data/lib/temporal/client/grpc_client.rb +345 -0
  37. data/lib/temporal/client/serializer.rb +31 -0
  38. data/lib/temporal/client/serializer/base.rb +23 -0
  39. data/lib/temporal/client/serializer/cancel_timer.rb +19 -0
  40. data/lib/temporal/client/serializer/complete_workflow.rb +20 -0
  41. data/lib/temporal/client/serializer/fail_workflow.rb +20 -0
  42. data/lib/temporal/client/serializer/failure.rb +29 -0
  43. data/lib/temporal/client/serializer/payload.rb +25 -0
  44. data/lib/temporal/client/serializer/record_marker.rb +23 -0
  45. data/lib/temporal/client/serializer/request_activity_cancellation.rb +19 -0
  46. data/lib/temporal/client/serializer/schedule_activity.rb +53 -0
  47. data/lib/temporal/client/serializer/start_child_workflow.rb +51 -0
  48. data/lib/temporal/client/serializer/start_timer.rb +20 -0
  49. data/lib/temporal/concerns/executable.rb +37 -0
  50. data/lib/temporal/concerns/typed.rb +40 -0
  51. data/lib/temporal/configuration.rb +44 -0
  52. data/lib/temporal/errors.rb +38 -0
  53. data/lib/temporal/executable_lookup.rb +25 -0
  54. data/lib/temporal/execution_options.rb +35 -0
  55. data/lib/temporal/json.rb +18 -0
  56. data/lib/temporal/metadata.rb +68 -0
  57. data/lib/temporal/metadata/activity.rb +27 -0
  58. data/lib/temporal/metadata/base.rb +17 -0
  59. data/lib/temporal/metadata/workflow.rb +22 -0
  60. data/lib/temporal/metadata/workflow_task.rb +25 -0
  61. data/lib/temporal/metrics.rb +37 -0
  62. data/lib/temporal/metrics_adapters/log.rb +33 -0
  63. data/lib/temporal/metrics_adapters/null.rb +9 -0
  64. data/lib/temporal/middleware/chain.rb +30 -0
  65. data/lib/temporal/middleware/entry.rb +9 -0
  66. data/lib/temporal/retry_policy.rb +27 -0
  67. data/lib/temporal/saga/concern.rb +23 -0
  68. data/lib/temporal/saga/result.rb +22 -0
  69. data/lib/temporal/saga/saga.rb +24 -0
  70. data/lib/temporal/testing.rb +50 -0
  71. data/lib/temporal/testing/future_registry.rb +27 -0
  72. data/lib/temporal/testing/local_activity_context.rb +17 -0
  73. data/lib/temporal/testing/local_workflow_context.rb +178 -0
  74. data/lib/temporal/testing/temporal_override.rb +121 -0
  75. data/lib/temporal/testing/workflow_execution.rb +44 -0
  76. data/lib/temporal/testing/workflow_override.rb +36 -0
  77. data/lib/temporal/thread_local_context.rb +14 -0
  78. data/lib/temporal/thread_pool.rb +63 -0
  79. data/lib/temporal/types.rb +7 -0
  80. data/lib/temporal/uuid.rb +19 -0
  81. data/lib/temporal/version.rb +1 -1
  82. data/lib/temporal/worker.rb +88 -0
  83. data/lib/temporal/workflow.rb +42 -0
  84. data/lib/temporal/workflow/command.rb +39 -0
  85. data/lib/temporal/workflow/command_state_machine.rb +48 -0
  86. data/lib/temporal/workflow/context.rb +243 -0
  87. data/lib/temporal/workflow/convenience_methods.rb +34 -0
  88. data/lib/temporal/workflow/dispatcher.rb +31 -0
  89. data/lib/temporal/workflow/execution_info.rb +51 -0
  90. data/lib/temporal/workflow/executor.rb +45 -0
  91. data/lib/temporal/workflow/future.rb +77 -0
  92. data/lib/temporal/workflow/history.rb +76 -0
  93. data/lib/temporal/workflow/history/event.rb +69 -0
  94. data/lib/temporal/workflow/history/event_target.rb +75 -0
  95. data/lib/temporal/workflow/history/window.rb +40 -0
  96. data/lib/temporal/workflow/poller.rb +67 -0
  97. data/lib/temporal/workflow/replay_aware_logger.rb +36 -0
  98. data/lib/temporal/workflow/state_manager.rb +342 -0
  99. data/lib/temporal/workflow/task_processor.rb +78 -0
  100. data/rbi/temporal-ruby.rbi +43 -0
  101. data/temporal.gemspec +10 -2
  102. metadata +186 -6
@@ -0,0 +1,78 @@
1
+ require 'temporal/workflow/executor'
2
+ require 'temporal/workflow/history'
3
+ require 'temporal/metadata'
4
+ require 'temporal/errors'
5
+
6
+ module Temporal
7
+ class Workflow
8
+ class TaskProcessor
9
+ def initialize(task, namespace, workflow_lookup, client, middleware_chain)
10
+ @task = task
11
+ @namespace = namespace
12
+ @task_token = task.task_token
13
+ @workflow_name = task.workflow_type.name
14
+ @workflow_class = workflow_lookup.find(workflow_name)
15
+ @client = client
16
+ @middleware_chain = middleware_chain
17
+ end
18
+
19
+ def process
20
+ start_time = Time.now
21
+
22
+ Temporal.logger.info("Processing a workflow task for #{workflow_name}")
23
+ Temporal.metrics.timing('workflow_task.queue_time', queue_time_ms, workflow: workflow_name)
24
+
25
+ if !workflow_class
26
+ raise Temporal::WorkflowNotRegistered, 'Workflow is not registered with this worker'
27
+ end
28
+
29
+ history = Workflow::History.new(task.history.events)
30
+ # TODO: For sticky workflows we need to cache the Executor instance
31
+ executor = Workflow::Executor.new(workflow_class, history)
32
+ metadata = Metadata.generate(Metadata::WORKFLOW_TASK_TYPE, task, namespace)
33
+
34
+ commands = middleware_chain.invoke(metadata) do
35
+ executor.run
36
+ end
37
+
38
+ complete_task(commands)
39
+ rescue Temporal::ClientError => error
40
+ fail_task(error)
41
+ rescue StandardError => error
42
+ Temporal.logger.error("Workflow task for #{workflow_name} failed with: #{error.inspect}")
43
+ Temporal.logger.debug(error.backtrace.join("\n"))
44
+ ensure
45
+ time_diff_ms = ((Time.now - start_time) * 1000).round
46
+ Temporal.metrics.timing('workflow_task.latency', time_diff_ms, workflow: workflow_name)
47
+ Temporal.logger.debug("Workflow task processed in #{time_diff_ms}ms")
48
+ end
49
+
50
+ private
51
+
52
+ attr_reader :task, :namespace, :task_token, :workflow_name, :workflow_class, :client, :middleware_chain
53
+
54
+ def queue_time_ms
55
+ scheduled = task.scheduled_time.to_f
56
+ started = task.started_time.to_f
57
+ ((started - scheduled) * 1_000).round
58
+ end
59
+
60
+ def complete_task(commands)
61
+ Temporal.logger.info("Workflow task for #{workflow_name} completed")
62
+
63
+ client.respond_workflow_task_completed(task_token: task_token, commands: commands)
64
+ end
65
+
66
+ def fail_task(error)
67
+ Temporal.logger.error("Workflow task for #{workflow_name} failed with: #{error.inspect}")
68
+ Temporal.logger.debug(error.backtrace.join("\n"))
69
+
70
+ client.respond_workflow_task_failed(
71
+ task_token: task_token,
72
+ cause: Temporal::Api::Enums::V1::WorkflowTaskFailedCause::WORKFLOW_TASK_FAILED_CAUSE_UNHANDLED_COMMAND,
73
+ exception: error
74
+ )
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,43 @@
1
+ module Temporal
2
+ class Activity; end
3
+ class ActivityException; end
4
+ module Client
5
+ class Error; end
6
+ class ArgumentError; end
7
+ end
8
+ module Metadata
9
+ class Activity; end
10
+ class Base; end
11
+ class Workflow; end
12
+ class WorkflowTask; end
13
+ end
14
+ module Saga
15
+ module Concern; end
16
+ end
17
+ module Testing
18
+ class LocalActivityContext; end
19
+ end
20
+ class Workflow
21
+ class ExecutionInfo; end
22
+ end
23
+ class Worker; end
24
+
25
+ class Error; end
26
+ class InternalError; end
27
+ class ClientError; end
28
+ class TimeoutError; end
29
+ class ActivityException; end
30
+
31
+ class ActivityNotRegistered; end
32
+
33
+ class ApiError; end
34
+
35
+ class NotFoundFailure; end
36
+ class WorkflowExecutionAlreadyStartedFailure; end
37
+ class NamespaceNotActiveFailure; end
38
+ class ClientVersionNotSupportedFailure; end
39
+ class FeatureVersionNotSupportedFailure; end
40
+ class NamespaceAlreadyExistsFailure; end
41
+ class CancellationAlreadyRequestedFailure; end
42
+ class QueryFailedFailure; end
43
+ end
@@ -7,10 +7,18 @@ Gem::Specification.new do |spec|
7
7
  spec.email = ['anthony.dmitriyev@coinbase.com']
8
8
 
9
9
  spec.summary = 'Temporal Ruby client'
10
- spec.description = 'A Ruby SDK for implementing Temporal workflows and activities in Ruby'
10
+ spec.description = 'A Ruby client for implementing Temporal workflows and activities in Ruby'
11
11
  spec.homepage = 'https://github.com/coinbase/temporal-ruby'
12
12
  spec.license = 'Apache-2.0'
13
13
 
14
14
  spec.require_paths = ['lib']
15
- spec.files = %w(lib/temporal/version.rb lib/temporal-ruby.rb temporal.gemspec Gemfile LICENSE README.md)
15
+ spec.files = Dir["{lib,rbi}/**/*.*"] + %w(temporal.gemspec Gemfile LICENSE README.md)
16
+
17
+ spec.add_dependency 'grpc'
18
+ spec.add_dependency 'oj'
19
+
20
+ spec.add_development_dependency 'pry'
21
+ spec.add_development_dependency 'rspec'
22
+ spec.add_development_dependency 'fabrication'
23
+ spec.add_development_dependency 'grpc-tools'
16
24
  end
metadata CHANGED
@@ -1,16 +1,100 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: temporal-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.0.1.pre.pre1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Anthony Dmitriyev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-06-05 00:00:00.000000000 Z
12
- dependencies: []
13
- description: A Ruby SDK for implementing Temporal workflows and activities in Ruby
11
+ date: 2020-11-14 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: grpc
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: oj
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: pry
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: fabrication
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: grpc-tools
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: A Ruby client for implementing Temporal workflows and activities in Ruby
14
98
  email:
15
99
  - anthony.dmitriyev@coinbase.com
16
100
  executables: []
@@ -20,8 +104,104 @@ files:
20
104
  - Gemfile
21
105
  - LICENSE
22
106
  - README.md
107
+ - lib/gen/temporal/api/command/v1/message_pb.rb
108
+ - lib/gen/temporal/api/common/v1/message_pb.rb
109
+ - lib/gen/temporal/api/enums/v1/command_type_pb.rb
110
+ - lib/gen/temporal/api/enums/v1/common_pb.rb
111
+ - lib/gen/temporal/api/enums/v1/event_type_pb.rb
112
+ - lib/gen/temporal/api/enums/v1/failed_cause_pb.rb
113
+ - lib/gen/temporal/api/enums/v1/namespace_pb.rb
114
+ - lib/gen/temporal/api/enums/v1/query_pb.rb
115
+ - lib/gen/temporal/api/enums/v1/task_queue_pb.rb
116
+ - lib/gen/temporal/api/enums/v1/workflow_pb.rb
117
+ - lib/gen/temporal/api/errordetails/v1/message_pb.rb
118
+ - lib/gen/temporal/api/failure/v1/message_pb.rb
119
+ - lib/gen/temporal/api/filter/v1/message_pb.rb
120
+ - lib/gen/temporal/api/history/v1/message_pb.rb
121
+ - lib/gen/temporal/api/namespace/v1/message_pb.rb
122
+ - lib/gen/temporal/api/query/v1/message_pb.rb
123
+ - lib/gen/temporal/api/replication/v1/message_pb.rb
124
+ - lib/gen/temporal/api/taskqueue/v1/message_pb.rb
125
+ - lib/gen/temporal/api/version/v1/message_pb.rb
126
+ - lib/gen/temporal/api/workflow/v1/message_pb.rb
127
+ - lib/gen/temporal/api/workflowservice/v1/request_response_pb.rb
128
+ - lib/gen/temporal/api/workflowservice/v1/service_pb.rb
129
+ - lib/gen/temporal/api/workflowservice/v1/service_services_pb.rb
23
130
  - lib/temporal-ruby.rb
131
+ - lib/temporal.rb
132
+ - lib/temporal/activity.rb
133
+ - lib/temporal/activity/async_token.rb
134
+ - lib/temporal/activity/context.rb
135
+ - lib/temporal/activity/poller.rb
136
+ - lib/temporal/activity/task_processor.rb
137
+ - lib/temporal/activity/workflow_convenience_methods.rb
138
+ - lib/temporal/client.rb
139
+ - lib/temporal/client/errors.rb
140
+ - lib/temporal/client/grpc_client.rb
141
+ - lib/temporal/client/serializer.rb
142
+ - lib/temporal/client/serializer/base.rb
143
+ - lib/temporal/client/serializer/cancel_timer.rb
144
+ - lib/temporal/client/serializer/complete_workflow.rb
145
+ - lib/temporal/client/serializer/fail_workflow.rb
146
+ - lib/temporal/client/serializer/failure.rb
147
+ - lib/temporal/client/serializer/payload.rb
148
+ - lib/temporal/client/serializer/record_marker.rb
149
+ - lib/temporal/client/serializer/request_activity_cancellation.rb
150
+ - lib/temporal/client/serializer/schedule_activity.rb
151
+ - lib/temporal/client/serializer/start_child_workflow.rb
152
+ - lib/temporal/client/serializer/start_timer.rb
153
+ - lib/temporal/concerns/executable.rb
154
+ - lib/temporal/concerns/typed.rb
155
+ - lib/temporal/configuration.rb
156
+ - lib/temporal/errors.rb
157
+ - lib/temporal/executable_lookup.rb
158
+ - lib/temporal/execution_options.rb
159
+ - lib/temporal/json.rb
160
+ - lib/temporal/metadata.rb
161
+ - lib/temporal/metadata/activity.rb
162
+ - lib/temporal/metadata/base.rb
163
+ - lib/temporal/metadata/workflow.rb
164
+ - lib/temporal/metadata/workflow_task.rb
165
+ - lib/temporal/metrics.rb
166
+ - lib/temporal/metrics_adapters/log.rb
167
+ - lib/temporal/metrics_adapters/null.rb
168
+ - lib/temporal/middleware/chain.rb
169
+ - lib/temporal/middleware/entry.rb
170
+ - lib/temporal/retry_policy.rb
171
+ - lib/temporal/saga/concern.rb
172
+ - lib/temporal/saga/result.rb
173
+ - lib/temporal/saga/saga.rb
174
+ - lib/temporal/testing.rb
175
+ - lib/temporal/testing/future_registry.rb
176
+ - lib/temporal/testing/local_activity_context.rb
177
+ - lib/temporal/testing/local_workflow_context.rb
178
+ - lib/temporal/testing/temporal_override.rb
179
+ - lib/temporal/testing/workflow_execution.rb
180
+ - lib/temporal/testing/workflow_override.rb
181
+ - lib/temporal/thread_local_context.rb
182
+ - lib/temporal/thread_pool.rb
183
+ - lib/temporal/types.rb
184
+ - lib/temporal/uuid.rb
24
185
  - lib/temporal/version.rb
186
+ - lib/temporal/worker.rb
187
+ - lib/temporal/workflow.rb
188
+ - lib/temporal/workflow/command.rb
189
+ - lib/temporal/workflow/command_state_machine.rb
190
+ - lib/temporal/workflow/context.rb
191
+ - lib/temporal/workflow/convenience_methods.rb
192
+ - lib/temporal/workflow/dispatcher.rb
193
+ - lib/temporal/workflow/execution_info.rb
194
+ - lib/temporal/workflow/executor.rb
195
+ - lib/temporal/workflow/future.rb
196
+ - lib/temporal/workflow/history.rb
197
+ - lib/temporal/workflow/history/event.rb
198
+ - lib/temporal/workflow/history/event_target.rb
199
+ - lib/temporal/workflow/history/window.rb
200
+ - lib/temporal/workflow/poller.rb
201
+ - lib/temporal/workflow/replay_aware_logger.rb
202
+ - lib/temporal/workflow/state_manager.rb
203
+ - lib/temporal/workflow/task_processor.rb
204
+ - rbi/temporal-ruby.rbi
25
205
  - temporal.gemspec
26
206
  homepage: https://github.com/coinbase/temporal-ruby
27
207
  licenses:
@@ -38,9 +218,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
38
218
  version: '0'
39
219
  required_rubygems_version: !ruby/object:Gem::Requirement
40
220
  requirements:
41
- - - ">="
221
+ - - ">"
42
222
  - !ruby/object:Gem::Version
43
- version: '0'
223
+ version: 1.3.1
44
224
  requirements: []
45
225
  rubygems_version: 3.1.2
46
226
  signing_key: