simplerubysteps 0.0.2 → 0.0.4

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,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: