aws-flow 1.0.8 → 1.0.9

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 (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