aws-flow 3.0.0 → 3.1.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 CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- MmMyMmUwNjY1YWUzZWExMDUxNDc2MGM3YTRmYTQzYmEzZWExN2YwMw==
5
- data.tar.gz: !binary |-
6
- ZWJhNjZjMDgzNTE0NDgwYzI1NjQ4ZDVmNjA2MjM5YzYzODI2MzA5ZQ==
2
+ SHA1:
3
+ metadata.gz: 19330ec67715312fabd0fda12e2825f28b7f5cb3
4
+ data.tar.gz: 8bdb38e2cd661d142f362a279812ab5432112e4a
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- MTg4NTYwYmU3YTI1NzAxYzZhZWUyMWZlZGVlNGVmNWE3MGQ2NDQzYzJlYWM3
10
- ZmM2MjE0NGNhODhkOWNhYjRkMDM4OGNkMzU5YzU4ZjUzYmE3NmU3NDYxMDRi
11
- YTFiYjJmOTZmODUxNzk2NDJjYjczOGNhMGY1NTU2NjkxZDhhYjQ=
12
- data.tar.gz: !binary |-
13
- MTAxY2Y4ZWMwYmIyYThiOGE5MGNmODc5NTE3MTM3NDkxYTYxYTNkYTU4MmM1
14
- NmI2Njk4NzlhMmI0MTlhZTUzODIzOTZkNTRkMjRlODFhY2FmMDlhZjQ2ZDFm
15
- Zjg1NTE3ZWU0NGE4MmNjYmQyNjhhYTZlMDU0MmI3YjBhZWM4YzQ=
6
+ metadata.gz: b2664a24f3841908254d360e7a48f4a77a755fde01cbfa45307d6ed31bcdaf87d60fd75963961aa584ffad5d8af3c7e8dea309a0ea27ba9f772c3e4bb0c3d9ff
7
+ data.tar.gz: b6c576bc8b5df2f592cf1bf8bada8371e3ea6186dfc19974825bc80d1f75b1156283700fcb45d6d1b857629048966e204a5a74c1690dd3340103b060f8c53055
@@ -41,7 +41,7 @@ module AWS
41
41
  output = YAML.load source
42
42
  if output.is_a? Exception
43
43
  documents = YAML.load_stream(source)
44
- if YAML::ENGINE.yamler == 'syck'
44
+ if YAML.const_defined?(:ENGINE) && YAML::ENGINE.yamler == 'syck'
45
45
  documents = documents.documents
46
46
  end
47
47
  backtrace = documents.find {|x| ! x.is_a? Exception}
@@ -142,6 +142,7 @@ module AWS
142
142
  [:decision_sent, :handle_initiation_failed_event, :completed],
143
143
  [:initiated, :cancel, :cancelled_after_initiated],
144
144
  [:initiated, :handle_completion_event, :completed],
145
+ [:initiated, :handle_initiation_failed_event, :completed],
145
146
  [:started, :handle_decision_task_started_event, :started],
146
147
  ]
147
148
  self_transitions(:handle_decision_task_started_event)
@@ -367,6 +368,7 @@ module AWS
367
368
  [:cancellation_decision_sent, :handle_cancellation_failure_event, :started],
368
369
  [:started, :cancel, :cancelled_after_started],
369
370
  [:started, :handle_completion_event, :completed],
371
+ [:started, :handle_cancellation_event, :completed],
370
372
  [:cancelled_after_started, :handle_completion_event, :completed],
371
373
  ]
372
374
  end
@@ -290,7 +290,7 @@ module AWS
290
290
  # possibly because of large custom exceptions we should fail the
291
291
  # activity task with some minimal details
292
292
  respond_activity_task_failed_with_retry(
293
- task.task_token,
293
+ task_token,
294
294
  Utilities.validation_error_string("Activity"),
295
295
  "AWS::SimpleWorkflow::Errors::ValidationException"
296
296
  )
@@ -16,7 +16,7 @@
16
16
  module AWS
17
17
  module Flow
18
18
  def self.version
19
- "3.0.0"
19
+ "3.1.0"
20
20
  end
21
21
  end
22
22
  end
@@ -72,10 +72,10 @@ module AWS
72
72
 
73
73
  module GenericTypeModule
74
74
  def hash
75
- [@name.to_sym, @version].hash
75
+ [@name, @version].hash
76
76
  end
77
77
  def eql?(other)
78
- @name.to_sym == other.name.to_sym && @version == other.version
78
+ @name.eql?(other.name) && @version.eql?(other.version)
79
79
  end
80
80
  end
81
81
 
@@ -210,7 +210,7 @@ module AWS
210
210
 
211
211
  # Helper method to write a string to a file
212
212
  def self.write_to_file(name, string)
213
- File.open(name, 'w') { |f| f.write(string) }
213
+ File.open(name, 'wb') { |f| f.write(string) }
214
214
  end
215
215
 
216
216
  # Validates various options
@@ -0,0 +1,94 @@
1
+ require_relative 'setup'
2
+
3
+ def get_child_cancellation_history_array
4
+ [
5
+ "WorkflowExecutionStarted",
6
+ "DecisionTaskScheduled",
7
+ "DecisionTaskStarted",
8
+ ]
9
+ end
10
+
11
+ describe "TestChildCancellationNotInitiatedFromParent" do
12
+
13
+ context "ChildCancellation" do
14
+ # The following tests for swf-issue-2031
15
+ before(:all) do
16
+ class ParentWorkflow
17
+ extend AWS::Flow::Workflows
18
+ workflow :parent, :child do
19
+ {
20
+ version: "1.0",
21
+ task_list: "default",
22
+ }
23
+ end
24
+
25
+ def parent
26
+ $client.child { {workflow_id: "child_workflow_test"}}
27
+ end
28
+
29
+ def child; end
30
+ end
31
+
32
+ end
33
+
34
+ it "tests part 1 - child gets scheduled in the first decision" do
35
+
36
+ class SynchronousWorkflowTaskPoller < WorkflowTaskPoller
37
+ def get_decision_task
38
+ TestHistoryWrapper.new($type, FakeWorkflowExecution.new(nil, nil), FakeEvents.new(get_child_cancellation_history_array))
39
+ end
40
+ end
41
+
42
+ $type = FakeWorkflowType.new(nil, "ParentWorkflow.parent", "1.0")
43
+
44
+ domain = FakeDomain.new($type)
45
+ swf_client = FakeServiceClient.new
46
+
47
+ task_list = "default"
48
+
49
+ $client = AWS::Flow::workflow_client(swf_client, domain) { { from_class: "ParentWorkflow" } }
50
+
51
+ $client.start_execution
52
+
53
+ worker = SynchronousWorkflowWorker.new(swf_client, domain, task_list, ParentWorkflow)
54
+
55
+ worker.start
56
+
57
+ swf_client.trace.first[:decisions].first[:decision_type].should == "StartChildWorkflowExecution"
58
+ end
59
+
60
+ it "tests part 2 - the workflow fails because child workflow is cancelled" do
61
+
62
+ class SynchronousWorkflowTaskPoller < WorkflowTaskPoller
63
+ def get_decision_task
64
+ TestHistoryWrapper.new($type, FakeWorkflowExecution.new(nil, nil),
65
+ FakeEvents.new(get_child_cancellation_history_array().push(*[
66
+ "DecisionTaskCompleted",
67
+ ["StartChildWorkflowExecutionInitiated", {:workflow_id => "child_workflow_test"}],
68
+ ["ChildWorkflowExecutionStarted", {:workflow_execution => FakeWorkflowExecution.new("1", "child_workflow_test"), :workflow_id => "child_workflow_test"}],
69
+ ["ChildWorkflowExecutionCanceled",{:workflow_execution => FakeWorkflowExecution.new("1", "child_workflow_test")}],
70
+ "DecisionTaskScheduled",
71
+ "DecisionTaskStarted",
72
+ ])))
73
+ end
74
+ end
75
+
76
+ $type = FakeWorkflowType.new(nil, "ParentWorkflow.parent", "1.0")
77
+
78
+ domain = FakeDomain.new($type)
79
+ swf_client = FakeServiceClient.new
80
+
81
+ task_list = "default"
82
+
83
+ $client = AWS::Flow::workflow_client(swf_client, domain) { { from_class: "ParentWorkflow" } }
84
+
85
+ $client.start_execution
86
+
87
+ worker = SynchronousWorkflowWorker.new(swf_client, domain, task_list, ParentWorkflow)
88
+
89
+ worker.start
90
+
91
+ swf_client.trace.first[:decisions].first[:decision_type].should == "FailWorkflowExecution"
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,93 @@
1
+ require_relative 'setup'
2
+
3
+ def get_start_child_failed_history_array
4
+ [
5
+ "WorkflowExecutionStarted",
6
+ "DecisionTaskScheduled",
7
+ "DecisionTaskStarted",
8
+ ]
9
+ end
10
+
11
+ describe "TestStartChildFailedAfterStartChildInitiated" do
12
+
13
+ context "StartChildFailedAfterStartChildInitiated" do
14
+ # The following tests for swf-issue-2029
15
+ before(:all) do
16
+ class ParentWorkflow
17
+ extend AWS::Flow::Workflows
18
+ workflow :parent, :child do
19
+ {
20
+ version: "1.0",
21
+ task_list: "default",
22
+ }
23
+ end
24
+
25
+ def parent
26
+ $client.send_async(:child) { {workflow_id: "child_workflow_test"}}
27
+ end
28
+
29
+ def child; end
30
+ end
31
+
32
+ end
33
+
34
+ it "tests part 1 - child gets scheduled in the first decision" do
35
+
36
+ class SynchronousWorkflowTaskPoller < WorkflowTaskPoller
37
+ def get_decision_task
38
+ TestHistoryWrapper.new($type, FakeWorkflowExecution.new(nil, nil), FakeEvents.new(get_start_child_failed_history_array))
39
+ end
40
+ end
41
+
42
+ $type = FakeWorkflowType.new(nil, "ParentWorkflow.parent", "1.0")
43
+
44
+ domain = FakeDomain.new($type)
45
+ swf_client = FakeServiceClient.new
46
+
47
+ task_list = "default"
48
+
49
+ $client = AWS::Flow::workflow_client(swf_client, domain) { { from_class: "ParentWorkflow" } }
50
+
51
+ $client.start_execution
52
+
53
+ worker = SynchronousWorkflowWorker.new(swf_client, domain, task_list, ParentWorkflow)
54
+
55
+ worker.start
56
+
57
+ swf_client.trace.first[:decisions].first[:decision_type].should == "StartChildWorkflowExecution"
58
+ end
59
+
60
+ it "tests part 2 - the workflow fails because start child workflow is failed" do
61
+
62
+ class SynchronousWorkflowTaskPoller < WorkflowTaskPoller
63
+ def get_decision_task
64
+ TestHistoryWrapper.new($type, FakeWorkflowExecution.new(nil, nil),
65
+ FakeEvents.new(get_start_child_failed_history_array().push(*[
66
+ "DecisionTaskCompleted",
67
+ ["StartChildWorkflowExecutionInitiated", {:workflow_id => "child_workflow_test"}],
68
+ ["StartChildWorkflowExecutionFailed", {:workflow_type => { name: "ParentWorkflow.child", version: "1.0" }, :workflow_execution => FakeWorkflowExecution.new("1", "child_workflow_test"), :workflow_id => "child_workflow_test", cause: "WORKFLOW_ALREADY_RUNNING" }],
69
+ "DecisionTaskScheduled",
70
+ "DecisionTaskStarted",
71
+ ])))
72
+ end
73
+ end
74
+
75
+ $type = FakeWorkflowType.new(nil, "ParentWorkflow.parent", "1.0")
76
+
77
+ domain = FakeDomain.new($type)
78
+ swf_client = FakeServiceClient.new
79
+
80
+ task_list = "default"
81
+
82
+ $client = AWS::Flow::workflow_client(swf_client, domain) { { from_class: "ParentWorkflow" } }
83
+
84
+ $client.start_execution
85
+
86
+ worker = SynchronousWorkflowWorker.new(swf_client, domain, task_list, ParentWorkflow)
87
+
88
+ worker.start
89
+
90
+ swf_client.trace.first[:decisions].first[:decision_type].should == "FailWorkflowExecution"
91
+ end
92
+ end
93
+ end
@@ -7,7 +7,9 @@ describe YAMLDataConverter do
7
7
  %w{syck psych}.each do |engine|
8
8
  describe "ensures that x == load(dump(x)) is true using #{engine}" do
9
9
  before :all do
10
- YAML::ENGINE.yamler = engine
10
+ if YAML.const_defined?(:ENGINE)
11
+ YAML::ENGINE.yamler = engine
12
+ end
11
13
  end
12
14
 
13
15
  {
@@ -0,0 +1,61 @@
1
+ ##
2
+ # Copyright 2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License").
5
+ # You may not use this file except in compliance with the License.
6
+ # A copy of the License is located at
7
+ #
8
+ # http://aws.amazon.com/apache2.0
9
+ #
10
+ # or in the "license" file accompanying this file. This file is distributed
11
+ # on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
12
+ # express or implied. See the License for the specific language governing
13
+ # permissions and limitations under the License.
14
+ ##
15
+
16
+ require "spec_helper"
17
+
18
+ describe ChildWorkflowDecisionStateMachine do
19
+ before do
20
+ @this_machine = ChildWorkflowDecisionStateMachine.new('id1',nil)
21
+ end
22
+
23
+ it "ensures to handle child cancellation that wasn't initiated from the parent" do
24
+ @this_machine.current_state = :started
25
+ @this_machine.consume(:handle_cancellation_event)
26
+ @this_machine.current_state.should == :completed
27
+ end
28
+
29
+ it "ensures to handle StartChildFailed after StartChildInitiated" do
30
+ @this_machine.current_state = :initiated
31
+ @this_machine.consume(:handle_initiation_failed_event)
32
+ @this_machine.current_state.should == :completed
33
+ end
34
+
35
+ end
36
+
37
+ describe ActivityDecisionStateMachine do
38
+ before do
39
+ @this_machine = ActivityDecisionStateMachine.new('id2',nil)
40
+ end
41
+
42
+ it "ensures to handle ScheduleActivity failed after ScheduleActivity" do
43
+ @this_machine.current_state = :initiated
44
+ @this_machine.consume(:handle_initiation_failed_event)
45
+ @this_machine.current_state.should == :completed
46
+ end
47
+
48
+ end
49
+
50
+ describe TimerDecisionStateMachine do
51
+ before do
52
+ @this_machine = TimerDecisionStateMachine.new('id3',nil)
53
+ end
54
+
55
+ it "ensures to handle StartTimer failed after StartTimer" do
56
+ @this_machine.current_state = :initiated
57
+ @this_machine.consume(:handle_initiation_failed_event)
58
+ @this_machine.current_state.should == :completed
59
+ end
60
+
61
+ end
@@ -0,0 +1,50 @@
1
+ require_relative 'setup'
2
+
3
+ describe ActivityTaskPoller do
4
+
5
+ context "#respond_activity_task_failed" do
6
+
7
+ # This test checks a fix for Github issue #90
8
+ it "correctly calls #respond_activity_task_failed_with_retry on failures" do
9
+
10
+ # Set up test mock
11
+ swf = double
12
+ allow(swf).to receive(:config).and_return(swf)
13
+ allow(swf).to receive(:to_h).and_return({})
14
+
15
+ # Instantiate the poller
16
+ poller = ActivityTaskPoller.new(swf, nil, nil, nil, nil, nil)
17
+
18
+ # Set up mock logger to avoid test failures
19
+ logger = double
20
+ allow(logger).to receive(:debug)
21
+ allow(logger).to receive(:error)
22
+ poller.instance_variable_set(:@logger, logger)
23
+
24
+ # Ensure @service.respond_activity_task_failed method is called. Raise
25
+ # ValidationException to trigger the correct handler
26
+ allow(swf).to receive(:respond_activity_task_failed).with(
27
+ task_token: "task_token",
28
+ reason: "reason",
29
+ details: "details"
30
+ ).and_raise(
31
+ AWS::SimpleWorkflow::Errors::ValidationException,
32
+ "failed to satisfy constraint: Member must have length less than or equal to"
33
+ )
34
+
35
+ # Final check - ensure respond_activity_task_failed_with_retry is called
36
+ # with the correct task_token string
37
+ expect(poller).to receive(:respond_activity_task_failed_with_retry).with(
38
+ "task_token",
39
+ Utilities.validation_error_string("Activity"),
40
+ AWS::SimpleWorkflow::Errors::ValidationException.to_s
41
+ )
42
+
43
+ # Start the test
44
+ poller.respond_activity_task_failed("task_token", "reason", "details")
45
+
46
+ end
47
+
48
+ end
49
+
50
+ end
@@ -371,3 +371,84 @@ describe ActivityWorker do
371
371
 
372
372
  end
373
373
 
374
+ describe GenericType do
375
+
376
+ let(:type) { GenericType.new("name", "version", {}) }
377
+ let(:another_type) { GenericType.new("name", "version", {}) }
378
+
379
+ context "#hash" do
380
+
381
+ it "produces correct hash value" do
382
+ type.hash.should == another_type.hash
383
+ end
384
+
385
+ end
386
+
387
+ context "#eql?" do
388
+
389
+ it "correctly checks equality" do
390
+ type.should eql(another_type)
391
+ end
392
+
393
+ end
394
+
395
+ it "ensures the type can be retrieved from a hash" do
396
+ hash = { type => "foo_type" }
397
+ hash[another_type].should == "foo_type"
398
+ end
399
+
400
+ [:ActivityType, :WorkflowType].each do |type|
401
+ describe "#{type}" do
402
+ let(:swf_klass) { AWS::SimpleWorkflow.const_get(type) }
403
+ let(:flow_klass) { AWS::Flow::const_get(type) }
404
+
405
+ describe "with same name and version" do
406
+ let(:swf_type) { swf_klass.new("domain", "name", "version") }
407
+ let(:flow_type) { flow_klass.new("name", "version") }
408
+
409
+ context "#hash" do
410
+ it "produces same hash value" do
411
+ swf_type.hash.should == flow_type.hash
412
+ end
413
+ end
414
+
415
+ context "#eql?" do
416
+ it "ensures the two types are logically equivalent" do
417
+ swf_type.should eql(flow_type)
418
+ end
419
+ end
420
+
421
+ it "can be looked up in a hash" do
422
+ hash = { flow_type => "flow_type" }
423
+ hash[swf_type].should == "flow_type"
424
+ end
425
+
426
+ end
427
+
428
+ describe "with different name and version" do
429
+ let(:swf_type) { swf_klass.new("domain", "name", "version") }
430
+ let(:flow_type) { flow_klass.new("diff_name", "diff_version") }
431
+
432
+ context "#hash" do
433
+ it "produces different hash value" do
434
+ swf_type.hash.should_not == flow_type.hash
435
+ end
436
+ end
437
+
438
+ context "#eql?" do
439
+ it "ensures the two types are not logically equivalent" do
440
+ swf_type.should_not eql(flow_type)
441
+ end
442
+ end
443
+
444
+ it "cannot be looked up in a hash" do
445
+ hash = { flow_type => "flow_type" }
446
+ hash[swf_type].should be_nil
447
+ end
448
+
449
+ end
450
+ end
451
+ end
452
+
453
+ end
454
+
@@ -20,39 +20,54 @@ describe ExternalConditionVariable do
20
20
 
21
21
  it "blocks a thread and wakes it up on signal" do
22
22
  t = Thread.new { condition.wait }
23
- sleep 1
23
+ Test::Unit::wait("run", 1, t)
24
24
  t.status.should == "sleep"
25
25
  condition.signal
26
+ Test::Unit::wait("run", 1, t)
26
27
  t.status.should == false
27
28
  end
28
29
 
29
30
  it "blocks multiple threads and wakes one up on signal" do
30
31
  t1 = Thread.new { condition.wait }
31
32
  t2 = Thread.new { condition.wait }
32
- sleep 1
33
+
34
+ Test::Unit::wait("run", 1, t1, t2)
33
35
  t1.status.should == "sleep"
34
36
  t2.status.should == "sleep"
35
37
  condition.signal
38
+
39
+ Test::Unit::wait("run", 1, t1, t2)
36
40
  (t1.status == false && t2.status == false).should == false
37
41
  condition.signal
42
+
43
+ Test::Unit::wait("run", 1, t1, t2)
38
44
  (t1.status == false && t2.status == false).should == true
39
45
  end
40
46
 
41
47
  it "blocks a thread and wakes it up on broadcast" do
42
48
  t = Thread.new { condition.wait }
43
- sleep 1
49
+
50
+ Test::Unit::wait("run", 1, t)
51
+ sleep 1 if t.status == "run"
44
52
  t.status.should == "sleep"
45
53
  condition.broadcast
54
+
55
+ Test::Unit::wait("run", 1, t)
56
+ sleep 1 if t.status == "run"
46
57
  t.status.should == false
47
58
  end
48
59
 
49
60
  it "blocks multiple threads and wakes them up on broadcast" do
50
61
  t1 = Thread.new { condition.wait }
51
62
  t2 = Thread.new { condition.wait }
52
- sleep 1
63
+
64
+ Test::Unit::wait("run", 1, t1, t2)
53
65
  t1.status.should == "sleep"
54
66
  t2.status.should == "sleep"
55
67
  condition.broadcast
68
+
69
+ Test::Unit::wait("run", 1, t1, t2)
70
+ sleep 1 if t1.status == "run" || t2.status == "run"
56
71
  (t1.status == false && t2.status == false).should == true
57
72
  end
58
73
 
@@ -233,9 +233,10 @@ describe ExternalFuture do
233
233
  future = ExternalFuture.new
234
234
 
235
235
  t1 = Thread.new { future.get }
236
- sleep 1
236
+ Test::Unit::wait("run", 1, t1)
237
237
  t1.status.should == "sleep"
238
238
  future.set
239
+ Test::Unit::wait("run", 1, t1)
239
240
  t1.status.should == false
240
241
  end
241
242
 
@@ -253,7 +254,7 @@ describe ExternalFuture do
253
254
  t2 = Thread.new { future.get }
254
255
  t3 = Thread.new { future.get }
255
256
 
256
- sleep 1
257
+ Test::Unit::wait("run", 1, t1, t2, t3)
257
258
 
258
259
  t1.status.should == "sleep"
259
260
  t2.status.should == "sleep"
@@ -261,6 +262,8 @@ describe ExternalFuture do
261
262
 
262
263
  future.set
263
264
 
265
+ Test::Unit::wait("run", 1, t1, t2, t3)
266
+
264
267
  t1.status.should == false
265
268
  t2.status.should == false
266
269
  t3.status.should == false
@@ -283,9 +286,10 @@ describe ExternalFuture do
283
286
  it "nil timeout will block until the future is set" do
284
287
  future = ExternalFuture.new
285
288
  t = Thread.new { future.get(nil) }
286
- sleep 1
289
+ Test::Unit::wait("run", 1, t)
287
290
  t.status.should == "sleep"
288
291
  future.set
292
+ Test::Unit::wait("run", 1, t)
289
293
  t.status.should == false
290
294
  end
291
295
 
@@ -39,6 +39,7 @@ describe AWS::Flow::Templates::ResultWorker do
39
39
  sleep 1
40
40
  Thread.list.count.should == 2
41
41
  AWS::Flow::Templates::ResultWorker.stop
42
+ sleep 1 if Thread.list.count == 2
42
43
  Thread.list.count.should == 1
43
44
  AWS::Flow::Templates::ResultWorker.instance_variable_get("@executor").should be_nil
44
45
  end
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ describe AWS::Flow::Utils do
4
+
5
+ # This tests a fix for Github issue #89
6
+ it "aws-flow-utils writes files in binary mode" do
7
+ expect(File).to receive(:open).with("name", "wb")
8
+ AWS::Flow::Utils::InitConfig.write_to_file("name", "string")
9
+ end
10
+
11
+ end
@@ -16,6 +16,7 @@
16
16
  require 'bundler/setup'
17
17
  require 'aws/flow'
18
18
  require 'aws/decider'
19
+ require 'aws/utils'
19
20
  require 'replayer'
20
21
  require 'runner'
21
22
 
@@ -125,11 +126,19 @@ module Test
125
126
 
126
127
  module Unit
127
128
 
129
+ def self.wait(status, timeout, *t)
130
+ until t.select { |x| x.status == status }.empty? && timeout
131
+ sleep 1
132
+ timeout -= 1
133
+ end
134
+ end
135
+
128
136
  class FakeConfig
129
137
  def to_h
130
138
 
131
139
  end
132
140
  end
141
+
133
142
  class FakeServiceClient
134
143
  attr_accessor :trace
135
144
 
metadata CHANGED
@@ -1,53 +1,53 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aws-flow
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0
4
+ version: 3.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Steger, Paritosh Mohan, Jacques Thomas
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-23 00:00:00.000000000 Z
11
+ date: 2015-04-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk-v1
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1'
20
- - - ! '>='
20
+ - - ">="
21
21
  - !ruby/object:Gem::Version
22
22
  version: 1.60.2
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
- - - ~>
27
+ - - "~>"
28
28
  - !ruby/object:Gem::Version
29
29
  version: '1'
30
- - - ! '>='
30
+ - - ">="
31
31
  - !ruby/object:Gem::Version
32
32
  version: 1.60.2
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: lru_redux
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
- - - ~>
37
+ - - "~>"
38
38
  - !ruby/object:Gem::Version
39
39
  version: '0'
40
- - - ! '>='
40
+ - - ">="
41
41
  - !ruby/object:Gem::Version
42
42
  version: 0.8.1
43
43
  type: :runtime
44
44
  prerelease: false
45
45
  version_requirements: !ruby/object:Gem::Requirement
46
46
  requirements:
47
- - - ~>
47
+ - - "~>"
48
48
  - !ruby/object:Gem::Version
49
49
  version: '0'
50
- - - ! '>='
50
+ - - ">="
51
51
  - !ruby/object:Gem::Version
52
52
  version: 0.8.1
53
53
  description: Library to provide the AWS Flow Framework for Ruby
@@ -120,6 +120,8 @@ files:
120
120
  - spec/aws/decider/integration/starter_spec.rb
121
121
  - spec/aws/decider/unit/activity_spec.rb
122
122
  - spec/aws/decider/unit/async_retrying_executor_spec.rb
123
+ - spec/aws/decider/unit/child_cancellation_spec.rb
124
+ - spec/aws/decider/unit/child_startfailed_spec.rb
123
125
  - spec/aws/decider/unit/data_converter_spec.rb
124
126
  - spec/aws/decider/unit/decider_spec.rb
125
127
  - spec/aws/decider/unit/executor_spec.rb
@@ -130,6 +132,8 @@ files:
130
132
  - spec/aws/decider/unit/rubyflow.rb
131
133
  - spec/aws/decider/unit/setup.rb
132
134
  - spec/aws/decider/unit/starter_spec.rb
135
+ - spec/aws/decider/unit/state_machines_spec.rb
136
+ - spec/aws/decider/unit/task_poller_spec.rb
133
137
  - spec/aws/decider/unit/worker_spec.rb
134
138
  - spec/aws/decider/unit/workflow_client_spec.rb
135
139
  - spec/aws/flow/unit/async_backtrace_spec.rb
@@ -153,6 +157,7 @@ files:
153
157
  - spec/aws/templates/unit/result_spec.rb
154
158
  - spec/aws/templates/unit/starter_spec.rb
155
159
  - spec/aws/templates/unit/utilities_spec.rb
160
+ - spec/aws/utils/unit/utils_spec.rb
156
161
  - spec/spec_helper.rb
157
162
  homepage: https://aws.amazon.com/swf/details/flow/
158
163
  licenses:
@@ -165,17 +170,17 @@ require_paths:
165
170
  - lib/aws/
166
171
  required_ruby_version: !ruby/object:Gem::Requirement
167
172
  requirements:
168
- - - ! '>='
173
+ - - ">="
169
174
  - !ruby/object:Gem::Version
170
175
  version: 1.9.1
171
176
  required_rubygems_version: !ruby/object:Gem::Requirement
172
177
  requirements:
173
- - - ! '>='
178
+ - - ">="
174
179
  - !ruby/object:Gem::Version
175
180
  version: '0'
176
181
  requirements: []
177
182
  rubyforge_project:
178
- rubygems_version: 2.2.2
183
+ rubygems_version: 2.4.6
179
184
  signing_key:
180
185
  specification_version: 4
181
186
  summary: AWS Flow Framework for Ruby