temporal-ruby 0.0.0 → 0.0.1.pre.pre1

Sign up to get free protection for your applications and to get access to all the features.
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: