aws-flow 1.0.8 → 1.0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +1 -1
  3. data/Rakefile +18 -31
  4. data/aws-flow.gemspec +1 -1
  5. data/lib/aws/decider.rb +1 -2
  6. data/lib/aws/decider/activity.rb +99 -53
  7. data/lib/aws/decider/activity_definition.rb +43 -7
  8. data/lib/aws/decider/async_decider.rb +56 -57
  9. data/lib/aws/decider/async_retrying_executor.rb +4 -5
  10. data/lib/aws/decider/data_converter.rb +2 -2
  11. data/lib/aws/decider/decider.rb +46 -41
  12. data/lib/aws/decider/decision_context.rb +2 -2
  13. data/lib/aws/decider/exceptions.rb +6 -6
  14. data/lib/aws/decider/executor.rb +15 -11
  15. data/lib/aws/decider/flow_defaults.rb +54 -22
  16. data/lib/aws/decider/generic_client.rb +7 -7
  17. data/lib/aws/decider/history_helper.rb +0 -0
  18. data/lib/aws/decider/implementation.rb +5 -5
  19. data/lib/aws/decider/options.rb +285 -155
  20. data/lib/aws/decider/state_machines.rb +10 -10
  21. data/lib/aws/decider/task_handler.rb +5 -5
  22. data/lib/aws/decider/task_poller.rb +152 -15
  23. data/lib/aws/decider/utilities.rb +14 -14
  24. data/lib/aws/decider/version.rb +1 -1
  25. data/lib/aws/decider/worker.rb +21 -20
  26. data/lib/aws/decider/workflow_client.rb +78 -31
  27. data/lib/aws/decider/workflow_clock.rb +1 -1
  28. data/lib/aws/decider/workflow_definition.rb +5 -5
  29. data/lib/aws/decider/workflow_definition_factory.rb +1 -1
  30. data/lib/aws/decider/workflow_enabled.rb +1 -1
  31. data/lib/aws/flow/async_backtrace.rb +19 -18
  32. data/lib/aws/flow/async_scope.rb +32 -16
  33. data/lib/aws/flow/begin_rescue_ensure.rb +61 -56
  34. data/lib/aws/flow/fiber.rb +14 -6
  35. data/lib/aws/flow/flow_utils.rb +9 -6
  36. data/lib/aws/flow/future.rb +43 -18
  37. data/lib/aws/flow/implementation.rb +34 -18
  38. data/lib/aws/flow/simple_dfa.rb +12 -4
  39. data/lib/aws/flow/tasks.rb +120 -86
  40. data/{test/aws → spec/aws/integration}/integration_spec.rb +0 -0
  41. data/{test/aws → spec/aws/unit}/async_backtrace_spec.rb +1 -0
  42. data/{test/aws → spec/aws/unit}/async_scope_spec.rb +0 -0
  43. data/{test/aws → spec/aws/unit}/begin_rescue_ensure_spec.rb +90 -2
  44. data/{test/aws → spec/aws/unit}/decider_spec.rb +41 -53
  45. data/{test/aws → spec/aws/unit}/external_task_spec.rb +0 -0
  46. data/{test/aws → spec/aws/unit}/factories.rb +0 -0
  47. data/{test/aws → spec/aws/unit}/fiber_condition_variable_spec.rb +0 -0
  48. data/{test/aws → spec/aws/unit}/fiber_spec.rb +0 -0
  49. data/{test/aws → spec/aws/unit}/flow_spec.rb +0 -0
  50. data/{test/aws → spec/aws/unit}/future_spec.rb +0 -0
  51. data/{test/aws → spec/aws/unit}/preinclude_tests.rb +0 -0
  52. data/{test/aws → spec/aws/unit}/rubyflow.rb +0 -0
  53. data/{test/aws → spec/aws/unit}/simple_dfa_spec.rb +0 -0
  54. data/{test/aws → spec}/spec_helper.rb +0 -0
  55. metadata +30 -30
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 74aff8c011e1dda48d38cf639ec0f6fcc1e2ee5a
4
+ data.tar.gz: 1b23c646c3afe8a5827d21feb8cc1701fad571b8
5
+ SHA512:
6
+ metadata.gz: bee020ffb919c382d69db2ef2860e5f134fc49ec7fa90bee420256a6adba01e6daf86e5aad6d8bc30110c2805205298f9f53623ec0e0a91077f511843a64406e
7
+ data.tar.gz: d1edebf2776156f6a881f156c92ed93f21c80d534d464b383c4c56c13a45eabbb7805199cd8abbd968578e02c9611b0f313469c4433186c7c114c22fc2981d86
data/Gemfile CHANGED
@@ -3,7 +3,7 @@ source "http://www.rubygems.org"
3
3
  gemspec
4
4
 
5
5
  group :test do
6
- gem "rspec", "1.3.0"
6
+ gem "rspec", "2.14"
7
7
  gem "rake"
8
8
  gem "factory_girl"
9
9
  end
data/Rakefile CHANGED
@@ -13,38 +13,25 @@
13
13
  # permissions and limitations under the License.
14
14
  ##
15
15
 
16
- require 'spec/rake/spectask'
16
+ require "rspec/core/rake_task"
17
17
 
18
- desc "Run unit tests in test/"
19
- Spec::Rake::SpecTask.new(:unit_tests) do |t|
20
- t.libs << 'lib'
21
- t.spec_opts = ['--color', '--format nested']
22
- t.spec_files = FileList['test/**/*.rb']
23
- t.spec_files.delete_if do |x|
24
- (x =~ /.*factories.rb/) ||
25
- (x =~ /.*spec_helper.rb/) ||
26
- (x =~ /.*preinclude_tests.rb/) ||
27
- (x =~ /.*integration.*/)
28
- end
29
- t.spec_files.unshift("test/aws/factories.rb")
30
- t.spec_files.unshift("test/aws/spec_helper.rb")
31
- t.spec_files.unshift("test/aws/preinclude_tests.rb")
18
+ desc "Run unit tests"
19
+ RSpec::Core::RakeTask.new(:unit_tests) do |spec|
20
+ spec.rspec_opts = ['--color', '--format nested']
21
+ spec.pattern = 'spec/**/unit/*.rb'
32
22
  end
33
- task :test => :unit_tests
34
23
 
35
- desc "Run integration tests in test/"
36
- Spec::Rake::SpecTask.new do |t|
37
- t.libs << 'lib'
38
- #t.ruby_opts = ['-rspec/test/unit'] # Add this line in if you're using Test::Unit instead of RSpec
39
- t.spec_opts = ['--color', '--format nested']
40
- t.spec_files = FileList['test/**/*.rb']
41
- t.spec_files.delete_if do |x|
42
- (x =~ /.*factories.rb/) ||
43
- (x =~ /.*spec_helper.rb/) ||
44
- (x =~ /.*preinclude_tests.rb/)
45
- end
46
- t.spec_files.unshift("test/aws/factories.rb")
47
- t.spec_files.unshift("test/aws/spec_helper.rb")
48
- t.spec_files.unshift("test/aws/preinclude_tests.rb")
24
+ desc "Run integration tests"
25
+ RSpec::Core::RakeTask.new(:integration_tests) do |spec|
26
+ spec.rspec_opts = ['--color', '--format nested']
27
+ spec.pattern = 'spec/**/integration/*.rb'
49
28
  end
50
- task :integration_tests => :spec
29
+
30
+ desc "Run all tests"
31
+ RSpec::Core::RakeTask.new(:all_tests) do |spec|
32
+ spec.rspec_opts = ['--color', '--format nested']
33
+ spec.pattern = 'spec/**/*.rb'
34
+ end
35
+
36
+ task :test => :all_tests
37
+
@@ -10,6 +10,6 @@ Gem::Specification.new do |s|
10
10
  s.email = ''
11
11
  s.files = `git ls-files`.split("\n").reject {|file| file =~ /aws-flow-core/}
12
12
  s.require_paths << "lib/aws/"
13
- s.add_dependency "aws-sdk", "~> 1"
13
+ s.add_dependency "aws-sdk", "~> 1", ">= 1.36.2"
14
14
  s.add_dependency "aws-flow-core", ">= 1.0.1"
15
15
  end
@@ -13,7 +13,6 @@
13
13
  # permissions and limitations under the License.
14
14
  #++
15
15
 
16
-
17
16
  require 'aws/flow'
18
17
  include AWS::Flow::Core
19
18
 
@@ -48,7 +47,7 @@ require "aws/decider/flow_defaults"
48
47
  require "aws/decider/implementation"
49
48
  require "aws/decider/version"
50
49
 
51
- # @!visibility private
50
+ # @api private
52
51
  def get_const(name)
53
52
  name = name.split('::').reverse
54
53
  current = Object
@@ -17,37 +17,48 @@ module AWS
17
17
  module Flow
18
18
 
19
19
  # Represents information about an open request.
20
- # @!visibility private
20
+ # @api private
21
21
  class OpenRequestInfo
22
22
  attr_accessor :completion_handle, :result, :blocking_promise, :description, :run_id
23
23
  end
24
24
 
25
+ # Contains metadata about an activity.
26
+ # @api private
25
27
  class ActivityMetadata
28
+ # The stored ID of the activity.
26
29
  attr_reader :activity_id
30
+
31
+ # Initializes a new ActivityMetadata object.
32
+ #
33
+ # @param activity_id
34
+ # The ID of the activity.
35
+ #
27
36
  def initialize(activity_id); @activity_id = activity_id; end
28
37
  end
29
38
 
30
-
31
39
  # A generic activity client that can be used to perform standard activity actions.
32
40
  class GenericActivityClient < GenericClient
33
- # The data converter used for serializing/deserializing data when sending requests to and receiving results from
34
- # workflow executions of this workflow type. By default, this is {YAMLDataConverter}.
41
+
42
+ # The data converter used for serializing/deserializing data when sending
43
+ # requests to and receiving results from workflow executions of this
44
+ # workflow type. By default, this is {YAMLDataConverter}.
35
45
  attr_accessor :data_converter
36
46
 
37
47
  # The decision helper used by the activity client.
38
48
  attr_accessor :decision_helper
39
49
 
40
- # A hash of ActivityRuntimeOptions for the activity client
50
+ # A hash of {ActivityRuntimeOptions} for the activity client.
41
51
  attr_accessor :options
42
52
 
43
- # Returns the default option class for the activity client, which is {ActivityRuntimeOptions}.
53
+ # Returns the default option class for the activity client, which is {ActivityRuntimeOptions}.
44
54
  def self.default_option_class; ActivityRuntimeOptions; end
45
55
 
46
- # Separates the activity name from the activity type at the point of the last (.) symbol.
56
+ # Separates the activity name from the activity type at the point of the last period.
47
57
  #
48
58
  # @param [String] name
49
59
  # The name of the activity type.
50
60
  #
61
+ # @api private
51
62
  def activity_name_from_activity_type(name)
52
63
  return name.to_s.split(".").last.to_sym
53
64
  end
@@ -57,7 +68,8 @@ module AWS
57
68
  # @param [DecisionHelper] decision_helper
58
69
  # The decision helper to use for the activity client.
59
70
  #
60
- # @param [ActivityOptions] options ActivityOptions to set for the activity client.
71
+ # @param [ActivityOptions] options
72
+ # The activity options to set for the activity client.
61
73
  #
62
74
  def initialize(decision_helper, options)
63
75
  @decision_helper = decision_helper
@@ -68,16 +80,17 @@ module AWS
68
80
  super
69
81
  end
70
82
 
71
- # Runs an activity given a name and block of options.
83
+ # Registers and schedules a new activity type, provided a name and block of options.
72
84
  #
73
85
  # @param method_name
74
- # The name of the activity type to define
86
+ # *Required*. The name of the activity type to define.
75
87
  #
76
88
  # @param args
77
- # Arguments for the method
89
+ # *Required*. Arguments for the method provided in *method_name*.
78
90
  #
79
91
  # @param block
80
- # A block of {ActivityOptions}
92
+ # *Required*. A block of {ActivityOptions} to use when registering the new {ActivityType}. This can be set to an
93
+ # empty block, in which case, the default activity options will be used.
81
94
  #
82
95
  def method_missing(method_name, *args, &block)
83
96
  options = Utilities::interpret_block_for_options(ActivityOptions, block)
@@ -101,20 +114,20 @@ module AWS
101
114
  result
102
115
  end
103
116
 
104
- # @!visibility private
117
+ # @api private
105
118
  def retry_alias_to_method(retry_alias)
106
119
  retry_alias.to_s[/__(.*)_retry/, 1].to_sym
107
120
  end
108
121
 
109
- # @!visibility private
122
+ # @api private
110
123
  def method_to_retry_alias(method_name)
111
124
  "#{__method_name.to_s + "_retry"}".to_sym
112
125
  end
113
126
 
114
127
  # Requests that the activity is canceled.
115
128
  #
116
- # @param [Future] to_cancel
117
- # The Future for the task to be canceled.
129
+ # @param [WorkflowFuture] to_cancel
130
+ # The {WorkflowFuture} for the task to be canceled.
118
131
  #
119
132
  def request_cancel_activity_task(to_cancel)
120
133
  metadata = to_cancel.metadata
@@ -124,9 +137,9 @@ module AWS
124
137
  @decision_helper[metadata.activity_id].consume(:cancel)
125
138
  end
126
139
 
127
- # A handler for the ActivityClassCanceled event.
140
+ # A handler for the `ActivityClassCanceled` event.
128
141
  #
129
- # @param [ActivityClassCanceled] event
142
+ # @param [AWS::SimpleWorkflow::HistoryEvent] event
130
143
  # The event data.
131
144
  #
132
145
  def handle_activity_task_canceled(event)
@@ -141,9 +154,9 @@ module AWS
141
154
  end
142
155
  end
143
156
 
144
- # A handler for the ActivityClassTimedOut event.
157
+ # A handler for the `ActivityClassTimedOut` event.
145
158
  #
146
- # @param [ActivityClassTimedOut] event
159
+ # @param [AWS::SimpleWorkflow::HistoryEvent] event
147
160
  # The event data.
148
161
  #
149
162
  def handle_activity_task_timed_out(event)
@@ -160,7 +173,7 @@ module AWS
160
173
  end
161
174
  end
162
175
 
163
- # A handler for the {ActivityTaskFailed} event.
176
+ # A handler for the `ActivityTaskFailed` event.
164
177
  #
165
178
  # @param [ActivityClassFailed] event
166
179
  # The event data.
@@ -181,9 +194,9 @@ module AWS
181
194
  open_request_info.completion_handle.fail(failure)
182
195
  end
183
196
 
184
- # A handler for the {ScheduleActivityTaskFailed} event.
197
+ # A handler for the `ScheduleActivityTaskFailed` event.
185
198
  #
186
- # @param [ScheduleActivityTaskFailed] event
199
+ # @param [AWS::SimpleWorkflow::HistoryEvent] event
187
200
  # The event data.
188
201
  #
189
202
  def handle_schedule_activity_task_failed(event)
@@ -199,9 +212,9 @@ module AWS
199
212
  end
200
213
  end
201
214
 
202
- # A handler for the {ActivityClassCompleted} event.
215
+ # A handler for the `ActivityClassCompleted` event.
203
216
  #
204
- # @param [ActivityClassCompleted] event
217
+ # @param [AWS::SimpleWorkflow::HistoryEvent] event
205
218
  # The event data.
206
219
  #
207
220
  def handle_activity_task_completed(event)
@@ -215,19 +228,19 @@ module AWS
215
228
  end
216
229
  end
217
230
 
218
- # Schedules the named activity.
231
+ # Schedules a named activity.
219
232
  #
220
233
  # @param [String] name
221
- # The name of the activity to schedule.
234
+ # *Required*. The name of the activity to schedule.
222
235
  #
223
- # @param [String]
224
- # activity_type The activity type for this scheduled activity.
236
+ # @param [String] activity_type
237
+ # *Required*. The activity type for this scheduled activity.
225
238
  #
226
- # @param [Object]
227
- # input Optional data passed to the activity.
239
+ # @param [Object] input
240
+ # *Required*. Additional data passed to the activity.
228
241
  #
229
- # @param [ActivityOptions]
230
- # options ActivityOptions to set for the scheduled activity.
242
+ # @param [ActivityOptions] options
243
+ # *Required*. {ActivityOptions} to set for the scheduled activity.
231
244
  #
232
245
  def schedule_activity(name, activity_type, input, options)
233
246
  options = Utilities::merge_all_options(@option_map[activity_name_from_activity_type(name)], options)
@@ -272,7 +285,7 @@ module AWS
272
285
  # we should serialize the error, and stuff that into details, so
273
286
  # that things above us can pull it out correctly. We don't have to
274
287
  # do this for ActivityTaskFailedException, as the details is
275
- # *already* serialized
288
+ # *already* serialized.
276
289
  if error.is_a? ActivityTaskFailedException
277
290
  details = @data_converter.load(error.details)
278
291
  error.cause = details
@@ -299,21 +312,28 @@ module AWS
299
312
 
300
313
  # Represents an activity client.
301
314
  class ActivityClient
302
- # Gets the data converter for the Activity Client.
315
+
316
+ # Gets the data converter for the activity client.
303
317
  def data_converter
304
318
  @generic_client.data_converter
305
319
  end
306
320
 
307
- # Sets the data converter for the Activity Client.
321
+ # Sets the data converter for the activity client.
322
+ #
323
+ # @param other
324
+ # The data converter to set.
325
+ #
308
326
  def data_converter=(other)
309
327
  @generic_client.data_converter = other
310
328
  end
311
329
 
312
330
  # Exponentially retries the supplied method with optional settings.
313
331
  #
314
- # @param [String] method_name The method name to retry.
332
+ # @param [String] method_name
333
+ # The method name to retry.
315
334
  #
316
- # @param [ExponentialRetryOptions] block A hash of ExponentialRetryOptions to use.
335
+ # @param [ExponentialRetryOptions] block
336
+ # A hash of {ExponentialRetryOptions} to use.
317
337
  #
318
338
  def exponential_retry(method_name, &block)
319
339
  @generic_client.retry(method_name, lambda {|first, time_of_failure, attempts| 1}, block)
@@ -323,10 +343,11 @@ module AWS
323
343
  # Methods and constants related to activities.
324
344
  #
325
345
  # @!attribute activity_client
326
- # Gets the [ActivityClient] for this Activity.
346
+ # Gets the {ActivityClient} contained by the class.
327
347
  #
328
348
  # @!attribute activities
329
- # Gets an list of activities for this Activity.
349
+ # Gets the list of {ActivityType} objects that were created by the
350
+ # {#activity} method.
330
351
  #
331
352
  module Activities
332
353
  @precursors ||= []
@@ -335,21 +356,34 @@ module AWS
335
356
  base.send :include, InstanceMethods
336
357
  end
337
358
  module InstanceMethods
359
+ # Sets the {ActivityExecutionContext} instance for the activity task.
338
360
  attr_writer :_activity_execution_context
361
+
362
+ # Gets the activity execution context for the activity task. Raises an `IllegalStateException` if the activity
363
+ # has no context.
364
+ #
365
+ # @return [ActivityExecutionContext] The execution context for this activity.
366
+ #
339
367
  def activity_execution_context
340
368
  raise IllegalStateException.new("No activity execution context") unless @_activity_execution_context
341
369
  @_activity_execution_context
342
370
  end
371
+
372
+ # Records a heartbeat for the activity, indicating to Amazon SWF that the activity is still making progress.
373
+ #
374
+ # @param [String] details
375
+ # If specified, contains details about the progress of the activity task. Up to 2048
376
+ # characters can be provided.
377
+ #
343
378
  def record_activity_heartbeat(details)
344
379
  @_activity_execution_context.record_activity_heartbeat(details)
345
380
  end
346
381
  end
347
382
 
348
-
349
- # @!visibility private
383
+ # @api private
350
384
  extend Utilities::UpwardLookups
351
385
 
352
- # @!visibility private
386
+ # @api private
353
387
  def look_upwards(variable)
354
388
  precursors = self.ancestors.dup
355
389
  precursors.delete(self)
@@ -357,21 +391,33 @@ module AWS
357
391
  end
358
392
  property(:activities, [])
359
393
 
360
- # @!visibility private
394
+ # @api private
361
395
  def _options; @activities.map(&:options); end
362
396
 
363
- # Defines one or more activities, with {ActivityOptions} provided in the supplied block.
397
+ # Defines one or more activities with {ActivityOptions} provided in the
398
+ # supplied block.
364
399
  #
365
400
  # @param [Array] activity_names
366
- # The names of the activities to define.
401
+ # The names of the activities to define. These names will be used to
402
+ # create {ActivityType} objects, one per name.
403
+ #
404
+ # Each activity type is named as *prefix.activity_name*, where the
405
+ # *prefix* is specified in the options block, and each *activity_name*
406
+ # comes from the list passed to this parameter.
367
407
  #
368
408
  # @param [Hash] block
369
409
  # {ActivityOptions} to use on the defined activities.
370
410
  #
411
+ # The following options are *required* when registering an activity:
412
+ #
413
+ # * `version` - The version of the activity type.
414
+ # * `task_list` - The task list used to poll for activity tasks.
415
+ #
371
416
  # @example Defining an activity
372
417
  # new_activity_class = Class.new(MyActivity) do
373
418
  # extend Activities
374
- # activity :run_activity1 do
419
+ #
420
+ # activity :activity1 do
375
421
  # {
376
422
  # :default_task_heartbeat_timeout => "3600",
377
423
  # :default_task_list => task_list,
@@ -379,10 +425,12 @@ module AWS
379
425
  # :default_task_schedule_to_start_timeout => "20",
380
426
  # :default_task_start_to_close_timeout => "20",
381
427
  # :version => "1",
382
- # :prefix_name => "#{class_name}Activity"
428
+ # :prefix_name => "ExampleActivity"
383
429
  # }
384
430
  # end
385
- # def run_activity1
431
+ #
432
+ # def activity1
433
+ # puts "Hello!"
386
434
  # end
387
435
  # end
388
436
  def activity(*activity_names, &block)
@@ -396,9 +444,8 @@ module AWS
396
444
  end
397
445
  end
398
446
 
399
- # This module is for internal use only and may be changed or removed
400
- # without prior notice. Use {Activities} instead.
401
- # @!visibility private
447
+ # @deprecated Use {Activities} instead.
448
+ # @api private
402
449
  module Activity
403
450
  include Activities
404
451
  def self.extended(base)
@@ -406,6 +453,5 @@ module AWS
406
453
  end
407
454
  end
408
455
 
409
-
410
456
  end
411
457
  end