simplerubysteps 0.0.2 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 12126fa84a9d21228e4b705f57b100a007087d2d7cc2f2af84efcfc18c06ffd7
4
- data.tar.gz: 4f7d36681479f8f44370ea4615d0d13d395134c64fa31b822e6542cdcf924c92
3
+ metadata.gz: b1331d05828403e219eed44ad66888362be212c7cb31d7676e2c58ced835b0b8
4
+ data.tar.gz: f402ca43e00170f1b4814098a03b9e1048ba7d52b6f44bf613726f4409d57e98
5
5
  SHA512:
6
- metadata.gz: bfc06b92ad3921c465ffde34a2440817c0161089e0577eb058adbd4840b88e478f07404fc09387a15a3c63edcd9961b1af6586f4400bab8b3b284b74a90c672d
7
- data.tar.gz: 26aebdba09383657ff151d6ed3abdd2cd1e16fb99a614c3f8686db973aa509777a8d65761b418c12809239d712a3e51be98aab8fcc56d3579df1750c54add53f
6
+ metadata.gz: 2c8c8fb7a7e62c32abd550ad902082ccdc0568093b1a262b804b64ae9886bc9dd5dbc2673ce4460a3d881d68953a4b593a659bc507c295966e9be719f792638d
7
+ data.tar.gz: '05327638e236a405009d752d23d0b4ea28ae7cb5a77bcc43deb7ecb909674b83f80ca9f197e0ba1c2c0e6ff5172ccd7aad194a84c55b1888bdb169f0c56f8385'
data/README.md CHANGED
@@ -42,7 +42,7 @@ simplerubysteps-deploy
42
42
  ```
43
43
  export AWS_PROFILE=...
44
44
  cd samples/sample1
45
- echo '{"foo": "John Wick"}' | simplerubysteps-workflow-run
45
+ echo '{"foo": "James Bond"}' | simplerubysteps-workflow-run
46
46
  ```
47
47
 
48
48
  ### Delete CloudFormation stack
@@ -59,6 +59,14 @@ After checking out the repo, run `bin/setup` to install dependencies.
59
59
 
60
60
  To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
61
61
 
62
+ ### TODOs
63
+
64
+ * Support for StateMachineType (STANDARD or EXPRESS)
65
+ * Custom IAM role policies (Step Functions and Lambda)
66
+ * sls-like tooling in ruby with AWS SDK
67
+ * Workflow action unit test support
68
+ * ...
69
+
62
70
  ## Contributing
63
71
 
64
72
  Bug reports and pull requests are (soon - after alpha phase) welcome on GitHub at https://github.com/chtz/simplerubysteps
data/bin/setup CHANGED
@@ -4,4 +4,3 @@ IFS=$'\n\t'
4
4
  set -vx
5
5
 
6
6
  bundle install
7
-
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  bin_dir = File.expand_path(File.dirname(__FILE__))
4
- shell_script_path = File.join(bin_dir, '../lib/deploy.sh')
4
+ shell_script_path = File.join(bin_dir, "../lib/deploy.sh")
5
5
 
6
6
  Kernel.exec(shell_script_path)
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  bin_dir = File.expand_path(File.dirname(__FILE__))
4
- shell_script_path = File.join(bin_dir, '../lib/destroy.sh')
4
+ shell_script_path = File.join(bin_dir, "../lib/destroy.sh")
5
5
 
6
6
  Kernel.exec(shell_script_path)
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ bin_dir = File.expand_path(File.dirname(__FILE__))
4
+ shell_script_path = File.join(bin_dir, "../lib/logs.sh")
5
+
6
+ Kernel.exec(shell_script_path)
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  bin_dir = File.expand_path(File.dirname(__FILE__))
4
- shell_script_path = File.join(bin_dir, '../lib/workflow-run.sh')
4
+ shell_script_path = File.join(bin_dir, "../lib/workflow-run.sh")
5
5
 
6
6
  Kernel.exec(shell_script_path)
data/lib/function.rb CHANGED
@@ -1,9 +1,14 @@
1
- require 'json'
2
- require './workflow.rb'
1
+ require "json"
2
+ require "./workflow.rb"
3
3
 
4
4
  def handler(event:, context:)
5
- puts ENV.inspect
6
- puts event
7
- puts context.inspect
8
- $sm.states[event["Task"].to_sym].perform_action event["Input"]
5
+ puts ENV.inspect # FIXME remove DEBUG code
6
+ puts event # FIXME remove DEBUG code
7
+ puts context.inspect # FIXME remove DEBUG code
8
+
9
+ if event["Token"]
10
+ $sm.states[event["Task"].to_sym].perform_action event["Input"], event["Token"]
11
+ else
12
+ $sm.states[event["Task"].to_sym].perform_action event["Input"]
13
+ end
9
14
  end
data/lib/logs.sh ADDED
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+
3
+ export STACK_NAME=$(basename "$PWD")
4
+
5
+ export FUNCTION_NAME=$(aws cloudformation describe-stacks --stack-name $STACK_NAME --output text --query "Stacks[].Outputs[]"|grep LambdaFunctionName|awk '{print $2}')
6
+
7
+ aws logs tail /aws/lambda/$FUNCTION_NAME
@@ -1,3 +1,3 @@
1
1
  module Simplerubysteps
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.4"
3
3
  end
@@ -2,177 +2,267 @@ require "simplerubysteps/version"
2
2
  require "json"
3
3
 
4
4
  module Simplerubysteps
5
- $FUNCTION_ARN=ENV["LAMBDA_FUNCTION_ARN"] ? ENV["LAMBDA_FUNCTION_ARN"] : "unknown"
5
+ # Step Functions JSON generator
6
6
 
7
- class StateMachine
8
- attr_reader :states
9
- attr_reader :start_at
7
+ $FUNCTION_ARN = ENV["LAMBDA_FUNCTION_ARN"] ? ENV["LAMBDA_FUNCTION_ARN"] : "unknown"
10
8
 
11
- def initialize()
12
- @states = {}
13
- end
9
+ def function_name
10
+ return "unknown" unless $FUNCTION_ARN =~ /.+\:function\:(.+)/
11
+ $1
12
+ end
14
13
 
15
- def add(state)
16
- @start_at = state.name unless @start_at
17
-
18
- @states[state.name] = state
19
- state.state_machine = self
14
+ class StateMachine
15
+ attr_reader :states
16
+ attr_reader :start_at
20
17
 
21
- state
22
- end
18
+ def initialize()
19
+ @states = {}
20
+ end
23
21
 
24
- def render
25
- {
26
- :StartAt => @start_at,
27
- :States => @states.map { |name,state| [name, state.render] }.to_h
28
- }
29
- end
30
- end
22
+ def add(state)
23
+ @start_at = state.name unless @start_at
31
24
 
32
- class State
33
- attr_reader :name
34
- attr_accessor :state_machine
35
-
36
- def initialize(name)
37
- @name = name
38
- @dict = {}
39
- end
25
+ @states[state.name] = state
26
+ state.state_machine = self
40
27
 
41
- def []=(key,value)
42
- @dict[key] = value
43
- end
28
+ state
29
+ end
44
30
 
45
- def next=(state)
46
- @dict[:Next] = (state.is_a? Symbol) ? state : state.name
47
- end
31
+ def render
32
+ {
33
+ :StartAt => @start_at,
34
+ :States => @states.map { |name, state| [name, state.render] }.to_h,
35
+ }
36
+ end
37
+ end
48
38
 
49
- def render
50
- dict = @dict
51
- dict[:End] = true unless dict[:Next]
52
- dict
53
- end
39
+ class State
40
+ attr_reader :name
41
+ attr_accessor :state_machine
42
+
43
+ def initialize(name)
44
+ @name = name
45
+ @dict = {}
46
+ end
47
+
48
+ def []=(key, value)
49
+ @dict[key] = value
50
+ end
51
+
52
+ def next=(state)
53
+ @dict[:Next] = (state.is_a? Symbol) ? state : state.name
54
+ end
55
+
56
+ def render
57
+ dict = @dict
58
+ dict[:End] = true unless dict[:Next]
59
+ dict
60
+ end
54
61
  end
55
62
 
56
63
  class Task < State
57
- def initialize(name)
58
- super
59
- @dict[:Type] = "Task"
60
- @dict[:Resource] = $FUNCTION_ARN
61
- @dict[:"Parameters"] = {
62
- :Task => name,
63
- "Input.$" => "$"
64
- }
64
+ def initialize(name)
65
+ super
66
+ @dict[:Type] = "Task"
67
+ @dict[:Resource] = $FUNCTION_ARN
68
+ @dict[:Parameters] = {
69
+ :Task => name,
70
+ "Input.$" => "$",
71
+ }
72
+ end
73
+
74
+ def action(&action_block)
75
+ @action_block = action_block
76
+ end
77
+
78
+ def perform_action(input)
79
+ output = nil
80
+ output = @action_block.call(input) if @action_block
81
+
82
+ if @implicit_choice
83
+ output = {} unless output
84
+ @implicit_choice.perform_action(output)
65
85
  end
66
86
 
67
- def action(&action_block)
68
- @action_block = action_block
69
- end
87
+ output
88
+ end
70
89
 
71
- def perform_action(input)
72
- @action_block.call(input) if @action_block
90
+ def implicit_choice
91
+ unless @implicit_choice
92
+ @implicit_choice = Choice.new("#{name}_choice")
93
+ $sm.add @implicit_choice
94
+ self.next = @implicit_choice
73
95
  end
96
+ @implicit_choice
97
+ end
74
98
  end
75
99
 
76
- class ChoiceItem
77
- def initialize(dict = {}, state = nil)
78
- @dict = dict
79
- self.next = state if state
80
- end
81
-
82
- def next=(state)
83
- @dict[:Next] = (state.is_a? Symbol) ? state : state.name
84
- end
85
-
86
- def render
87
- @dict
88
- end
100
+ class Callback < State
101
+ def initialize(name)
102
+ super
103
+ @dict[:Type] = "Task"
104
+ @dict[:Resource] = "arn:aws:states:::lambda:invoke.waitForTaskToken"
105
+ @dict[:Parameters] = {
106
+ :FunctionName => function_name,
107
+ :Payload => {
108
+ :Task => name,
109
+ "Input.$" => "$",
110
+ "Token.$" => "$$.Task.Token",
111
+ },
112
+ }
113
+ end
114
+
115
+ def action(&action_block)
116
+ @action_block = action_block
117
+ end
118
+
119
+ def perform_action(input, token)
120
+ @action_block.call(input, token) if @action_block
121
+ end
89
122
  end
90
123
 
91
- class Choice < State
92
- attr_reader :choices
124
+ class ChoiceItem
125
+ attr_accessor :implicit_condition_block
93
126
 
94
- def initialize(name)
95
- super
96
- @choices = []
97
- @dict[:Type] = "Choice"
98
- end
127
+ def initialize(dict = {}, state = nil)
128
+ @dict = dict
129
+ self.next = state if state
130
+ end
99
131
 
100
- def add(item)
101
- @choices.push item
102
- end
103
-
104
- def add_string_matches(var, match, state)
105
- add ChoiceItem.new({
106
- :Variable => var,
107
- :StringMatches => match
108
- }, state)
109
- end
132
+ def next=(state)
133
+ @dict[:Next] = (state.is_a? Symbol) ? state : state.name
134
+ end
110
135
 
111
- def default=(state)
112
- @dict[:Default] = (state.is_a? Symbol) ? state : state.name
113
- end
136
+ def render
137
+ @dict
138
+ end
114
139
 
115
- def next=(state)
116
- self.default = state
140
+ def perform_action(choice_name, output)
141
+ if @implicit_condition_block
142
+ output["#{choice_name}_#{@dict[:Next]}"] = @implicit_condition_block.call(output) ? "yes" : "no"
117
143
  end
144
+ end
145
+ end
118
146
 
119
- def render
120
- dict = @dict.clone
121
- dict[:Choices] = @choices.map { |item| item.render }
122
- dict
147
+ class Choice < State
148
+ attr_reader :choices
149
+
150
+ def initialize(name)
151
+ super
152
+ @choices = []
153
+ @dict[:Type] = "Choice"
154
+ end
155
+
156
+ def add(item)
157
+ @choices.push item
158
+ end
159
+
160
+ def add_string_matches(var, match, state)
161
+ add ChoiceItem.new({
162
+ :Variable => var,
163
+ :StringMatches => match,
164
+ }, state)
165
+ end
166
+
167
+ def default=(state)
168
+ @dict[:Default] = (state.is_a? Symbol) ? state : state.name
169
+ end
170
+
171
+ def next=(state)
172
+ self.default = state
173
+ end
174
+
175
+ def render
176
+ dict = @dict.clone
177
+ dict[:Choices] = @choices.map { |item| item.render }
178
+ dict
179
+ end
180
+
181
+ def perform_action(output)
182
+ @choices.each do |choice|
183
+ choice.perform_action name, output
123
184
  end
185
+ end
124
186
  end
125
187
 
126
- ################################################################################
188
+ # Workflow DSL
127
189
 
128
190
  $sm = StateMachine.new
129
191
  $tasks = []
130
192
 
131
193
  def task(name)
132
- t = $sm.add Task.new(name)
194
+ t = $sm.add Task.new(name)
133
195
 
134
- $tasks.last.next = t if $tasks.last
196
+ $tasks.last.next = t if $tasks.last
135
197
 
136
- $tasks.push t
137
- yield if block_given?
138
- $tasks.pop
198
+ $tasks.push t
199
+ yield if block_given?
200
+ $tasks.pop
139
201
  end
140
202
 
203
+ def callback(name)
204
+ t = $sm.add Callback.new(name)
205
+
206
+ $tasks.last.next = t if $tasks.last
207
+
208
+ $tasks.push t
209
+ yield if block_given?
210
+ $tasks.pop
211
+ end
141
212
 
142
213
  def action(&action_block)
143
- $tasks.last.action &action_block
214
+ $tasks.last.action &action_block
144
215
  end
145
216
 
146
217
  def transition(state)
147
- $tasks.last.next = state
218
+ $tasks.last.next = state
219
+ end
220
+
221
+ def transition_to(state, &condition_block)
222
+ choice = $tasks.last.implicit_choice
223
+
224
+ c = ChoiceItem.new({
225
+ :Variable => "$.#{choice.name}_#{state}",
226
+ :StringMatches => "yes",
227
+ })
228
+ c.next = state
229
+ c.implicit_condition_block = condition_block
230
+
231
+ choice.add c
232
+ end
233
+
234
+ def default_transition_to(state)
235
+ choice = $tasks.last.implicit_choice
236
+
237
+ choice.default = state
148
238
  end
149
239
 
150
240
  def choice(name)
151
- t = $sm.add Choice.new(name)
152
-
153
- $tasks.last.next = t if $tasks.last
241
+ t = $sm.add Choice.new(name)
242
+
243
+ $tasks.last.next = t if $tasks.last
154
244
 
155
- $tasks.push t
156
- yield if block_given?
157
- $tasks.pop
245
+ $tasks.push t
246
+ yield if block_given?
247
+ $tasks.pop
158
248
  end
159
249
 
160
250
  def string_matches(var, match)
161
- c = ChoiceItem.new({
162
- :Variable => var,
163
- :StringMatches => match
164
- })
251
+ c = ChoiceItem.new({
252
+ :Variable => var,
253
+ :StringMatches => match,
254
+ })
165
255
 
166
- $tasks.last.add c
256
+ $tasks.last.add c
167
257
 
168
- $tasks.push c
169
- yield if block_given?
170
- $tasks.pop
258
+ $tasks.push c
259
+ yield if block_given?
260
+ $tasks.pop
171
261
  end
172
262
 
173
263
  def default
174
- $tasks.push $tasks.last
175
- yield if block_given?
176
- $tasks.pop
264
+ $tasks.push $tasks.last
265
+ yield if block_given?
266
+ $tasks.pop
177
267
  end
178
268
  end
@@ -0,0 +1,5 @@
1
+ #!/bin/bash
2
+
3
+ TOKEN=$(simplerubysteps-logs|grep Token|sort|tail -n 1|ruby -ne 'print $1 if /Token\"=>\"(.+)\"/')
4
+
5
+ echo "{\"continued\":\"$(date)\"}"|./send-task-success.sh $TOKEN
@@ -0,0 +1,6 @@
1
+ #!/bin/bash
2
+
3
+ tee /tmp/taskoutput.json > /dev/null
4
+ TASK_OUTPUT="$(cat /tmp/taskoutput.json)"
5
+
6
+ aws stepfunctions send-task-success --task-token="$1" --task-output "$TASK_OUTPUT"
@@ -0,0 +1,3 @@
1
+ #!/bin/bash
2
+
3
+ echo '{"foo": "John Wick"}'|simplerubysteps-workflow-run
@@ -0,0 +1,3 @@
1
+ #!/bin/bash
2
+
3
+ echo '{"foo": "James Bond"}'|simplerubysteps-workflow-run
@@ -4,37 +4,36 @@ require "simplerubysteps"
4
4
  include Simplerubysteps
5
5
 
6
6
  task :t1 do
7
- action do |input|
8
- puts "Task t1: #{input}"
9
- input.merge({ "Foo1" => (input["foo"] == "John Wick" ? "ja" : "nein") })
10
- end
11
-
12
- choice :t2 do
13
- string_matches "$.Foo1", "ja" do
14
- task :t3 do
15
- action do |input|
16
- puts "Task t3: #{input}"
17
- input.merge({ "Foo3": "Bar3x" })
18
- end
7
+ action do |input|
8
+ puts "Task t1: #{input}"
9
+ input.merge({ "Foo1" => (input["foo"] == "John Wick" ? "ja" : "nein") })
10
+ end
19
11
 
20
- transition :t5
21
- end
12
+ choice :t2 do
13
+ string_matches "$.Foo1", "ja" do
14
+ callback :t3 do
15
+ action do |input, token|
16
+ puts "Callback t3: #{input}, #{token}" # The logged token is picked up by continue-callbackbranch.sh
22
17
  end
23
18
 
24
- default do
25
- task :t4 do
26
- action do |input|
27
- puts "Task t4: #{input}"
28
- input.merge({ "Foo4": "Bar4xy" })
29
- end
30
- end
19
+ transition :t5
20
+ end
21
+ end
22
+
23
+ default do
24
+ task :t4 do
25
+ action do |input|
26
+ puts "Task t4: #{input}"
27
+ input.merge({ "Foo4": "Bar4xy" })
31
28
  end
29
+ end
32
30
  end
31
+ end
33
32
  end
34
33
 
35
34
  task :t5 do
36
- action do |input|
37
- puts "Task t5: #{input}"
38
- input.merge({ "Foo5" => "Bar5" })
39
- end
35
+ action do |input|
36
+ puts "Task t5: #{input}"
37
+ input.merge({ "Foo5" => "Bar5" })
38
+ end
40
39
  end
@@ -0,0 +1,40 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require "simplerubysteps"
4
+ include Simplerubysteps
5
+
6
+ task :t1 do
7
+ action do |input|
8
+ puts "Task t1: #{input}"
9
+ input.merge({ "t1" => (input["bar"] ? input["bar"] : "") + "t1" })
10
+ end
11
+
12
+ transition_to :t2 do |output|
13
+ output["t1"] == "foot1"
14
+ end
15
+
16
+ default_transition_to :t3
17
+ end
18
+
19
+ task :t2 do
20
+ action do |input|
21
+ puts "Task t2: #{input}"
22
+ input.merge({ "t2" => "yes" })
23
+ end
24
+
25
+ transition :t4
26
+ end
27
+
28
+ task :t3 do
29
+ action do |input|
30
+ puts "Task t3: #{input}"
31
+ input.merge({ "t3" => "yes" })
32
+ end
33
+
34
+ task :t4 do
35
+ action do |input|
36
+ puts "Task t4: #{input}"
37
+ input.merge({ "t4" => "yes" })
38
+ end
39
+ end
40
+ end
@@ -3,31 +3,23 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
3
  require "simplerubysteps/version"
4
4
 
5
5
  Gem::Specification.new do |spec|
6
- spec.name = "simplerubysteps"
7
- spec.version = Simplerubysteps::VERSION
8
- spec.authors = ["Christian Tschenett"]
9
- spec.email = ["simplerubysteps@furthermore.ch"]
6
+ spec.name = "simplerubysteps"
7
+ spec.version = Simplerubysteps::VERSION
8
+ spec.authors = ["Christian Tschenett"]
9
+ spec.email = ["simplerubysteps@furthermore.ch"]
10
10
 
11
- spec.summary = %q{simplerubysteps makes it easy to manage AWS Step Functions with ruby (eventually - this is an early alpha version and should not really be used by everyone).}
12
-
13
- spec.homepage = "https://github.com/chtz/simplerubysteps"
14
- spec.license = "MIT"
11
+ spec.summary = %q{simplerubysteps makes it easy to manage AWS Step Functions with ruby (eventually - this is an early alpha version and should not really be used by everyone).}
15
12
 
16
- spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
13
+ spec.homepage = "https://github.com/chtz/simplerubysteps"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = Dir.chdir(File.expand_path("..", __FILE__)) do
17
17
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
18
  end
19
- spec.files << "lib/deploy.sh"
20
- spec.files << "lib/destroy.sh"
21
- spec.files << "lib/workflow-run.sh"
22
- spec.files << "lib/statemachine.yaml"
23
- spec.files << "lib/function.rb"
24
19
 
25
- spec.bindir = "exe"
26
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
27
- spec.executables << "simplerubysteps-deploy"
28
- spec.executables << "simplerubysteps-destroy"
29
- spec.executables << "simplerubysteps-workflow-run"
30
-
20
+ spec.bindir = "exe"
21
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
+
31
23
  spec.require_paths = ["lib"]
32
24
 
33
25
  spec.add_development_dependency "bundler", "~> 1.17"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simplerubysteps
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Christian Tschenett
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-04-09 00:00:00.000000000 Z
11
+ date: 2023-04-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -44,6 +44,7 @@ email:
44
44
  executables:
45
45
  - simplerubysteps-deploy
46
46
  - simplerubysteps-destroy
47
+ - simplerubysteps-logs
47
48
  - simplerubysteps-workflow-run
48
49
  extensions: []
49
50
  extra_rdoc_files: []
@@ -57,15 +58,22 @@ files:
57
58
  - bin/setup
58
59
  - exe/simplerubysteps-deploy
59
60
  - exe/simplerubysteps-destroy
61
+ - exe/simplerubysteps-logs
60
62
  - exe/simplerubysteps-workflow-run
61
63
  - lib/deploy.sh
62
64
  - lib/destroy.sh
63
65
  - lib/function.rb
66
+ - lib/logs.sh
64
67
  - lib/simplerubysteps.rb
65
68
  - lib/simplerubysteps/version.rb
66
69
  - lib/statemachine.yaml
67
70
  - lib/workflow-run.sh
71
+ - samples/sample1/continue-callbackbranch.sh
72
+ - samples/sample1/send-task-success.sh
73
+ - samples/sample1/start-callbackbranch.sh
74
+ - samples/sample1/start-directbranch.sh
68
75
  - samples/sample1/workflow.rb
76
+ - samples/sample2/workflow.rb
69
77
  - simplerubysteps.gemspec
70
78
  homepage: https://github.com/chtz/simplerubysteps
71
79
  licenses: