flow-lite 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +149 -1
- data/lib/flow-lite.rb +19 -14
- data/lib/flow-lite/version.rb +2 -2
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fd6dc6a4982583a8267aea617e5d7852321b7a00
|
4
|
+
data.tar.gz: 5e050df47d5f1d52881c2666f1bb732f39cb4981
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7778366b484f614248c91c33d9aa3e01377c6861408277e5f9e49391e0b5640edcc3dee685c7ed415484bc0a3f2f9c3a2aff852bbbba777b9087e7e49e8803c0
|
7
|
+
data.tar.gz: 1b0d6f6148183a97326edcf11c1a0b7b140573b0d758d157c5c06d43947c4e2ca26831c24973f5f56688b06fae421188e44648a94bcde84c81ba27ebd7d10319
|
data/README.md
CHANGED
@@ -12,7 +12,155 @@ flow-lite gem - (yet) another (lite) workflow engine; let's you define your work
|
|
12
12
|
|
13
13
|
## Usage
|
14
14
|
|
15
|
-
|
15
|
+
|
16
|
+
Define the workflow steps in a Flowfile. Example:
|
17
|
+
|
18
|
+
|
19
|
+
``` ruby
|
20
|
+
step :first_step do
|
21
|
+
puts "first_step"
|
22
|
+
second_step # note: you can call other steps like methods
|
23
|
+
end
|
24
|
+
|
25
|
+
step :second_step do
|
26
|
+
puts "second_step"
|
27
|
+
third_step
|
28
|
+
end
|
29
|
+
|
30
|
+
step :third_step do
|
31
|
+
puts "third_step"
|
32
|
+
end
|
33
|
+
```
|
34
|
+
|
35
|
+
And than use the `flow` command line tool to run a step.
|
36
|
+
Example:
|
37
|
+
|
38
|
+
```
|
39
|
+
$ flow first_step
|
40
|
+
```
|
41
|
+
|
42
|
+
Note: By default the `flow` command line tool reads in the `Flowfile`. Use `-f/--flowfile` option to use a different file.
|
43
|
+
|
44
|
+
|
45
|
+
That's it for now.
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
## Backstage Internals / Inside Flowfiles
|
50
|
+
|
51
|
+
|
52
|
+
If you read in a `Flowfile` the flow machinery
|
53
|
+
builds a new (regular) class derived from `Flow::Base`
|
54
|
+
and every step becomes a (regular) method. Example:
|
55
|
+
|
56
|
+
``` ruby
|
57
|
+
require 'flow-lite'
|
58
|
+
|
59
|
+
flowfile = Flow::Flowfile.load( <<TXT )
|
60
|
+
step :hello do
|
61
|
+
puts "Hello, world!"
|
62
|
+
end
|
63
|
+
|
64
|
+
step :hola do
|
65
|
+
puts "¡Hola, mundo!"
|
66
|
+
end
|
67
|
+
TXT
|
68
|
+
|
69
|
+
flow = flowfile.flow # (auto-)builds a flow class (see Note 1)
|
70
|
+
# and constructs/returns an instance
|
71
|
+
flow.hello #=> "Hello, world!"
|
72
|
+
flow.hola #=> "¡Hola, mundo!"
|
73
|
+
|
74
|
+
# or use ruby's (regular) message/metaprogramming machinery
|
75
|
+
flow.send( :hello ) #=> "Hello, world!"
|
76
|
+
flow.send( :hola ) #=> "¡Hola, mundo!"
|
77
|
+
# or try
|
78
|
+
flow.class.instance_methods.grep( /^step_/ ) #=> [:step_hello, :step_hola]
|
79
|
+
# ...
|
80
|
+
```
|
81
|
+
|
82
|
+
Note 1: The Flowfile "source / configuration":
|
83
|
+
|
84
|
+
``` ruby
|
85
|
+
step :hello do
|
86
|
+
puts "Hello, world!"
|
87
|
+
end
|
88
|
+
|
89
|
+
step :hola do
|
90
|
+
puts "¡Hola, mundo!"
|
91
|
+
end
|
92
|
+
```
|
93
|
+
|
94
|
+
gets used to (auto-) build (via metaprogramming) a flow class like:
|
95
|
+
|
96
|
+
``` ruby
|
97
|
+
class Greeter < Flow::Base
|
98
|
+
def hello
|
99
|
+
puts "Hello, world!"
|
100
|
+
end
|
101
|
+
alias_method :step_hello, :hello
|
102
|
+
|
103
|
+
def hola
|
104
|
+
puts "¡Hola, mundo!"
|
105
|
+
end
|
106
|
+
alias_method :step_hola, :hola
|
107
|
+
end
|
108
|
+
```
|
109
|
+
|
110
|
+
|
111
|
+
|
112
|
+
**Tips & Tricks**
|
113
|
+
|
114
|
+
Auto-include pre-build / pre-defined steps. Use a (regular) Module e.g.:
|
115
|
+
|
116
|
+
``` ruby
|
117
|
+
module GitHubActions
|
118
|
+
def setup
|
119
|
+
# setup ssh
|
120
|
+
ssh_key = ENV['SSH_KEY']
|
121
|
+
ssh_path = File.expand_path( '~/.ssh' )
|
122
|
+
|
123
|
+
FileUtils.mkdir_p( ssh_path ) # make sure path exists
|
124
|
+
File.open( "#{ssh_path}/id_rsa", 'w' ) { |f| f.write( ssh_key ) }
|
125
|
+
File.chmod( 0600, "#{ssh_path}/id_rsa" )
|
126
|
+
|
127
|
+
# setup git
|
128
|
+
user_name = ENV['GITHUB_NAME'] || 'you'
|
129
|
+
user_email = ENV['GITHUB_EMAIL'] || 'you@example.com'
|
130
|
+
|
131
|
+
Git.config( 'user.name', user_name, global: true )
|
132
|
+
Git.config( 'user.email', user_email, global: true )
|
133
|
+
|
134
|
+
# ...
|
135
|
+
end
|
136
|
+
# optional - for auto-discovery add a step alias
|
137
|
+
alias_method :step_setup, :setup
|
138
|
+
end
|
139
|
+
```
|
140
|
+
|
141
|
+
and than use (regular) include e.g.:
|
142
|
+
|
143
|
+
``` ruby
|
144
|
+
class Flow::Base
|
145
|
+
include GitHubActions
|
146
|
+
end
|
147
|
+
```
|
148
|
+
|
149
|
+
Now all your flows can (re)use `setup` or any other methods you define.
|
150
|
+
|
151
|
+
|
152
|
+
|
153
|
+
|
154
|
+
|
155
|
+
## Installation
|
156
|
+
|
157
|
+
Use
|
158
|
+
|
159
|
+
gem install flow-lite
|
160
|
+
|
161
|
+
or add to your Gemfile
|
162
|
+
|
163
|
+
gem 'flow-lite'
|
16
164
|
|
17
165
|
|
18
166
|
|
data/lib/flow-lite.rb
CHANGED
@@ -40,7 +40,20 @@ end # class Step
|
|
40
40
|
|
41
41
|
|
42
42
|
class Base ## base class for flow class (auto)-constructed/build from flowfile
|
43
|
-
|
43
|
+
def self.define_step( step )
|
44
|
+
name = step.names[0]
|
45
|
+
puts " adding step >#{name}<..."
|
46
|
+
define_method( name, &step.block )
|
47
|
+
alias_method( :"step_#{name}", name ) ## (auto-)add step_<name> alias
|
48
|
+
|
49
|
+
alt_names = step.names[1..-1]
|
50
|
+
alt_names.each do |alt_name|
|
51
|
+
puts " adding alias >#{alt_name}< for >#{name}<..."
|
52
|
+
alias_method( alt_name, name )
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end # class Base
|
56
|
+
|
44
57
|
|
45
58
|
|
46
59
|
class Flowfile
|
@@ -66,20 +79,12 @@ class Flowfile
|
|
66
79
|
|
67
80
|
def build_flow_class
|
68
81
|
puts " building flow class..."
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
puts " adding step #{i+1}/#{flowfile.steps.size} >#{name}<..."
|
74
|
-
define_method( name, &step.block )
|
75
|
-
|
76
|
-
alt_names = step.names[1..-1]
|
77
|
-
alt_names.each do |alt_name|
|
78
|
-
puts " adding alias >#{alt_name}< for >#{name}<..."
|
79
|
-
alias_method( alt_name, name )
|
80
|
-
end
|
81
|
-
end
|
82
|
+
klass = Class.new( Base )
|
83
|
+
|
84
|
+
steps.each do |step|
|
85
|
+
klass.define_step( step )
|
82
86
|
end
|
87
|
+
|
83
88
|
klass
|
84
89
|
end
|
85
90
|
|
data/lib/flow-lite/version.rb
CHANGED