flow-lite 0.1.0 → 1.1.0

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
  SHA1:
3
- metadata.gz: fd6dc6a4982583a8267aea617e5d7852321b7a00
4
- data.tar.gz: 5e050df47d5f1d52881c2666f1bb732f39cb4981
3
+ metadata.gz: 48d2755dfa5c6d365387d7a788804dd458d0fedf
4
+ data.tar.gz: '04586b4969ec5b3aa278ba933904c62ea753f765'
5
5
  SHA512:
6
- metadata.gz: 7778366b484f614248c91c33d9aa3e01377c6861408277e5f9e49391e0b5640edcc3dee685c7ed415484bc0a3f2f9c3a2aff852bbbba777b9087e7e49e8803c0
7
- data.tar.gz: 1b0d6f6148183a97326edcf11c1a0b7b140573b0d758d157c5c06d43947c4e2ca26831c24973f5f56688b06fae421188e44648a94bcde84c81ba27ebd7d10319
6
+ metadata.gz: 10c26e5b61781002e063f4695d676d8847e666950b25c6fe451a1d4e396b14c5b85f5892ecd2cbcc1ac35840f3823462edcb95e0ff221acf06021e30a0503db1
7
+ data.tar.gz: b7fdb1a505e1b9eb92dd219e8e86af7813b17874562f1f45ab0b9f18be8f4f3cf1c44a8d2571c56cb8b17912960ff58b82de1f1af379b92c3cb62a1452c456ce
@@ -4,4 +4,6 @@ README.md
4
4
  Rakefile
5
5
  bin/flow
6
6
  lib/flow-lite.rb
7
+ lib/flow-lite/base.rb
8
+ lib/flow-lite/tool.rb
7
9
  lib/flow-lite/version.rb
data/README.md CHANGED
@@ -3,13 +3,14 @@
3
3
  flow-lite gem - (yet) another (lite) workflow engine; let's you define your workflow steps in Flowfiles; incl. the flow command line tool
4
4
 
5
5
 
6
- * home :: [github.com/rubycoco/git](https://github.com/rubycoco/git)
7
- * bugs :: [github.com/rubycoco/git/issues](https://github.com/rubycoco/git/issues)
6
+ * home :: [github.com/rubycoco/flow](https://github.com/rubycoco/flow)
7
+ * bugs :: [github.com/rubycoco/flow/issues](https://github.com/rubycoco/flow/issues)
8
8
  * gem :: [rubygems.org/gems/flow-lite](https://rubygems.org/gems/flow-lite)
9
9
  * rdoc :: [rubydoc.info/gems/flow-lite](http://rubydoc.info/gems/flow-lite)
10
10
 
11
11
 
12
12
 
13
+
13
14
  ## Usage
14
15
 
15
16
 
@@ -19,12 +20,12 @@ Define the workflow steps in a Flowfile. Example:
19
20
  ``` ruby
20
21
  step :first_step do
21
22
  puts "first_step"
22
- second_step # note: you can call other steps like methods
23
+ step :second_step # note: you can call other steps with step
23
24
  end
24
25
 
25
26
  step :second_step do
26
27
  puts "second_step"
27
- third_step
28
+ step :third_step
28
29
  end
29
30
 
30
31
  step :third_step do
@@ -32,14 +33,40 @@ step :third_step do
32
33
  end
33
34
  ```
34
35
 
35
- And than use the `flow` command line tool to run a step.
36
+ And then use the `flow` command line tool to run a step.
36
37
  Example:
37
38
 
38
39
  ```
39
40
  $ flow first_step
40
41
  ```
41
42
 
42
- Note: By default the `flow` command line tool reads in the `Flowfile`. Use `-f/--flowfile` option to use a different file.
43
+ Note: By default the `flow` command line tool reads in and looks for `flowfile`, `Flowfile`, `flowfile.rb`, `Flowfile.rb`
44
+ in that order.
45
+ Use the `-f/--flowfile` option to use a different file.
46
+
47
+
48
+
49
+ **Prelude / Prolog**
50
+
51
+ Use the `-r/--require` option to (auto-)require
52
+ some extra libraries or scripts.
53
+ By default for now the "prelude / prolog" that always
54
+ gets auto-required includes:
55
+
56
+ ``` ruby
57
+ require 'pp'
58
+ require 'time'
59
+ require 'date'
60
+ require 'json'
61
+ require 'yaml'
62
+ require 'fileutils'
63
+
64
+ require 'uri'
65
+ require 'net/http'
66
+ require 'net/https'
67
+ ```
68
+
69
+ Tip: See the [`flow-lite.rb`](https://github.com/rubycoco/flow/blob/master/flow-lite/lib/flow-lite.rb) source for the definite always up-to-date list.
43
70
 
44
71
 
45
72
  That's it for now.
@@ -66,14 +93,17 @@ flowfile = Flow::Flowfile.load( <<TXT )
66
93
  end
67
94
  TXT
68
95
 
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!"
96
+ flow = flowfile.flow_class.new # (auto-)build a flow class (see Note 1)
97
+ # and construct/return a new instance
98
+ flow.step_hello #=> "Hello, world!"
99
+ flow.step_hola #=> "¡Hola, mundo!"
100
+ flow.step( :hello ) #=> "Hello, world!"
101
+ flow.step( :hola ) #=> "¡Hola, mundo!"
102
+ flow.class.step_methods #=> [:hello, :hola]
73
103
 
74
104
  # or use ruby's (regular) message/metaprogramming machinery
75
- flow.send( :hello ) #=> "Hello, world!"
76
- flow.send( :hola ) #=> "¡Hola, mundo!"
105
+ flow.send( :step_hello ) #=> "Hello, world!"
106
+ flow.send( :step_hola ) #=> "¡Hola, mundo!"
77
107
  # or try
78
108
  flow.class.instance_methods.grep( /^step_/ ) #=> [:step_hello, :step_hola]
79
109
  # ...
@@ -95,27 +125,48 @@ gets used to (auto-) build (via metaprogramming) a flow class like:
95
125
 
96
126
  ``` ruby
97
127
  class Greeter < Flow::Base
98
- def hello
128
+ def step_hello
129
+ puts "Hello, world!"
130
+ end
131
+
132
+ def step_hola
133
+ puts "¡Hola, mundo!"
134
+ end
135
+ end
136
+ ```
137
+
138
+
139
+ Note: Behind the stage the metaprogramming "class macro"
140
+ `define_step( symbol, method )`
141
+ or `define_step( symbol ) { block }` defined in `Flow::Base`
142
+ gets used, thus,
143
+ if you want to create steps in a "hand-coded" class
144
+ use:
145
+
146
+
147
+ ``` ruby
148
+ class Greeter < Flow::Base
149
+ define_step :hello do
99
150
  puts "Hello, world!"
100
151
  end
101
- alias_method :step_hello, :hello
102
152
 
103
- def hola
153
+ define_step :hola do
104
154
  puts "¡Hola, mundo!"
105
155
  end
106
- alias_method :step_hola, :hola
107
156
  end
108
157
  ```
109
158
 
110
159
 
111
160
 
161
+
162
+
112
163
  **Tips & Tricks**
113
164
 
114
165
  Auto-include pre-build / pre-defined steps. Use a (regular) Module e.g.:
115
166
 
116
167
  ``` ruby
117
168
  module GitHubActions
118
- def setup
169
+ def step_setup
119
170
  # setup ssh
120
171
  ssh_key = ENV['SSH_KEY']
121
172
  ssh_path = File.expand_path( '~/.ssh' )
@@ -133,8 +184,6 @@ module GitHubActions
133
184
 
134
185
  # ...
135
186
  end
136
- # optional - for auto-discovery add a step alias
137
- alias_method :step_setup, :setup
138
187
  end
139
188
  ```
140
189
 
@@ -144,9 +193,60 @@ and than use (regular) include e.g.:
144
193
  class Flow::Base
145
194
  include GitHubActions
146
195
  end
196
+
197
+ #-or-
198
+
199
+ Flow::Base.include( GitHubActions )
200
+ ```
201
+
202
+ Now all your flows can (re)use `setup` or any other step methods you define.
203
+
204
+
205
+
206
+
207
+ ## Real World Examples
208
+
209
+ **Collect GitHub Statistics**
210
+
211
+ Use GitHub Actions to collect
212
+ GitHub Statistics via GitHub API calls
213
+ and update the JSON datasets
214
+ in the `/cache.github` repo at the `yorobot` org(anization):
215
+
216
+ ``` ruby
217
+ step :clone do
218
+ Mono.clone( '@yorobot/cache.github' )
219
+ end
220
+
221
+
222
+ step :update do
223
+ Hubba.config.data_dir = Mono.real_path( '@yorobot/cache.github' )
224
+
225
+ username = 'geraldb'
226
+ h = Hubba.reposet( username )
227
+ pp h
228
+
229
+ Hubba.update_stats( h )
230
+ Hubba.update_traffic( h )
231
+ puts "Done."
232
+ end
233
+
234
+
235
+ step :push do
236
+ msg = "auto-update week #{Date.today.cweek}"
237
+
238
+ Mono.open( '@yorobot/cache.github' ) do |proj|
239
+ if proj.changes?
240
+ proj.add( "." )
241
+ proj.commit( msg )
242
+ proj.push
243
+ end
244
+ end
245
+ end
147
246
  ```
148
247
 
149
- Now all your flows can (re)use `setup` or any other methods you define.
248
+ (Sources: [`Flowfile`](https://github.com/yorobot/backup/blob/master/Flowfile.rb), [`workflows/update.yml`](https://github.com/yorobot/backup/blob/master/.github/workflows/update.yml) @ `yorobot/backup`)
249
+
150
250
 
151
251
 
152
252
 
data/Rakefile CHANGED
@@ -8,7 +8,7 @@ Hoe.spec 'flow-lite' do
8
8
  self.summary = "flow-lite gem - (yet) another (lite) workflow engine; let's you define your workflow steps in Flowfiles; incl. the flow command line tool"
9
9
  self.description = summary
10
10
 
11
- self.urls = { home: 'https://github.com/rubycoco/git' }
11
+ self.urls = { home: 'https://github.com/rubycoco/flow' }
12
12
 
13
13
  self.author = 'Gerald Bauer'
14
14
  self.email = 'ruby-talk@ruby-lang.org'
@@ -17,11 +17,7 @@ Hoe.spec 'flow-lite' do
17
17
  self.readme_file = 'README.md'
18
18
  self.history_file = 'CHANGELOG.md'
19
19
 
20
- self.extra_deps = [
21
- ['gitti', '>= 0.6.1' ],
22
- ['hubba', '>= 1.0.0' ],
23
- ['monos', '>= 0.5.0' ],
24
- ]
20
+ self.extra_deps = []
25
21
 
26
22
  self.licenses = ['Public Domain']
27
23
 
@@ -1,21 +1,28 @@
1
+ ##
2
+ ## "prelude / prolog " add some common used stdlibs
3
+ ## add more - why? why not?
1
4
  require 'pp'
2
- require 'optparse'
5
+ require 'time'
6
+ require 'date'
7
+ require 'json'
8
+ require 'yaml'
9
+ require 'fileutils'
3
10
 
11
+ require 'uri'
12
+ require 'net/http'
13
+ require 'net/https'
4
14
 
5
15
 
6
- ####################
7
- # "prelude/prolog" add some 3rd party libs/gems
8
- # -- our own
9
- require 'gitti'
10
- require 'hubba' ## todo/fix: rename to gitti-api/gitti-apis
11
- require 'mono'
12
- # -- some more ???
16
+ require 'optparse'
13
17
 
14
18
 
15
19
 
16
20
  #####################
17
21
  # our own code
18
22
  require 'flow-lite/version' # note: let version always go first
23
+ require 'flow-lite/base'
24
+ require 'flow-lite/tool'
25
+
19
26
 
20
27
 
21
28
 
@@ -38,27 +45,22 @@ class Step
38
45
  end # class Step
39
46
 
40
47
 
48
+ class Flowfile
41
49
 
42
- class Base ## base class for flow class (auto)-constructed/build from flowfile
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 )
50
+ ## find flowfile path by convention
51
+ ## check for name by convention in this order:
52
+ NAMES = ['flowfile', 'Flowfile',
53
+ 'flowfile.rb', 'Flowfile.rb']
54
+ def self.find_file
55
+ NAMES.each do |name|
56
+ return "./#{name}" if File.exist?( "./#{name}" )
53
57
  end
54
- end
55
- end # class Base
56
-
58
+ nil
59
+ end # method self.find_file
57
60
 
58
61
 
59
- class Flowfile
60
62
  ## convenience method - use like Flowfile.load_file()
61
- def self.load_file( path='./Flowfile' )
63
+ def self.load_file( path )
62
64
  code = File.open( path, 'r:utf-8' ) { |f| f.read }
63
65
  load( code )
64
66
  end
@@ -72,17 +74,21 @@ class Flowfile
72
74
 
73
75
 
74
76
 
75
- def flow ## build flow class
77
+ def flow
78
+ ## todo/check: always return a new instance why? why not?
79
+ flow_class.new
80
+ end
81
+
82
+ def flow_class
76
83
  @flow_class ||= build_flow_class
77
- @flow_class.new ## todo/check: always return a new instance why? why not?
78
84
  end
79
85
 
80
86
  def build_flow_class
81
- puts " building flow class..."
87
+ puts "[flow] building flow class..."
82
88
  klass = Class.new( Base )
83
89
 
84
90
  steps.each do |step|
85
- klass.define_step( step )
91
+ klass.define_step( step.names, &step.block )
86
92
  end
87
93
 
88
94
  klass
@@ -102,41 +108,11 @@ class Flowfile
102
108
  @steps << Step.new( name, block )
103
109
  end
104
110
 
105
-
106
111
  def run( name )
107
- name = name.to_sym ## make sure we always use symbols
108
- if flow.respond_to?( name )
109
- flow.send( name )
110
- else
111
- puts "!! ERROR: step definition >#{name}< not found; cannot run/execute - known steps include:"
112
- pp @steps
113
- exit 1
114
- end
112
+ ## todo/check: always return/use a new instance why? why not?
113
+ flow_class.new.step( name )
115
114
  end
116
115
  end # class Flowfile
117
-
118
-
119
-
120
- class Tool
121
- def self.main( args=ARGV )
122
- options = {}
123
- OptionParser.new do |parser|
124
- parser.on( '-f FILENAME', '--flowfile FILENAME' ) do |filename|
125
- options[:flowfile] = filename
126
- end
127
- end.parse!( args )
128
-
129
- path = options[:flowfile] || './Flowfile'
130
- flowfile = Flowfile.load_file( path )
131
-
132
- ## allow multipe steps getting called - why? why not?
133
- ## flow setup clone update etc??
134
- args.each do |arg|
135
- flowfile.run( arg )
136
- end
137
- end
138
- end # class Tool
139
-
140
116
  end # module Flow
141
117
 
142
118
 
@@ -0,0 +1,89 @@
1
+
2
+ module Flow
3
+
4
+ class Base ## base class for flow class (auto)-constructed/build from flowfile
5
+ def self.define_step( name_or_names, &block )
6
+ names = if name_or_names.is_a?( Array )
7
+ name_or_names
8
+ else
9
+ [name_or_names] ## assume single symbol (name); wrap in array
10
+ end
11
+ names = names.map {|name| name.to_sym } ## make sure we always use symbols
12
+
13
+
14
+ name = names[0]
15
+ puts "[flow] adding step >#{name}<..."
16
+ define_method( :"step_#{name}", &block )
17
+
18
+ alt_names = names[1..-1]
19
+ alt_names.each do |alt_name|
20
+ puts "[flow] adding alias >#{alt_name}< for >#{name}<..."
21
+ alias_method( :"step_#{alt_name}", :"step_#{name}" )
22
+ end
23
+ end # method self.define_step
24
+
25
+
26
+
27
+
28
+ TRUE_VALUES = [
29
+ 'true', 't',
30
+ 'yes', 'y',
31
+ 'on',
32
+ '1',
33
+ ]
34
+
35
+ ### include / check for ruby debug flag too - why? why not?
36
+ def debug?
37
+ value = ENV['DEBUG']
38
+ if value && TRUE_VALUES.include?( value.downcase )
39
+ true
40
+ else
41
+ false
42
+ end
43
+ end
44
+
45
+
46
+
47
+ ## run step by symbol/name (e.g. step :hello - etc.)
48
+ ##
49
+ ## todo/check: allow (re)entrant calls to step (step calling step etc.) - why? why not?
50
+ def step( name )
51
+ step_name = :"step_#{name}" ## note: make sure we always use symbols
52
+ if respond_to?( step_name )
53
+ #######
54
+ ## check: track (and report) call stack - why? why not?
55
+ ## e.g.
56
+ ## [flow >(1) first_step)] step >first_step< - starting...
57
+ ## [flow >(2) ..first_step > second_step)] step >second_step< - starting...
58
+ ## [flow >(3) ....first_step > second_step > third_step)] step >third_step< - starting...
59
+ @stack ||= [] ## use a call stack of step names
60
+ @stack.push( name )
61
+
62
+ puts "[flow >(#{@stack.size}) #{'..'*(@stack.size-1)}#{@stack.join(' > ')})] step >#{name}< - starting..."
63
+ start_time = Time.now ## todo: use Timer? t = Timer.start / stop / diff etc. - why? why not?
64
+
65
+ __send__( step_name )
66
+
67
+ end_time = Time.now
68
+ diff_time = end_time - start_time
69
+ puts "[flow <(#{@stack.size}) #{'..'*(@stack.size-1)}#{@stack.join(' < ')})] step >#{name}< - done in #{diff_time} sec(s)"
70
+ @stack.pop
71
+ else
72
+ puts "!! ERROR: step definition >#{name}< not found; cannot run/execute - known (defined) steps include:"
73
+ pp self.class.step_methods #=> e.g. [:hello, ...]
74
+ exit 1
75
+ end
76
+ end # method step
77
+
78
+
79
+ def self.step_methods
80
+ names = instance_methods.reduce([]) do |names, name|
81
+ names << $1.to_sym if name =~ /^step_(.+)/
82
+ names
83
+ end
84
+ names
85
+ end
86
+ end # class Base
87
+
88
+
89
+ end # module Flow
@@ -0,0 +1,130 @@
1
+ module Flow
2
+
3
+ class Tool
4
+ def self.main( args=ARGV )
5
+ options = {}
6
+ OptionParser.new do |parser|
7
+ parser.on( '-f FILE', '--file FILE', '--flowfile FILE',
8
+ 'Read FILE as a flowfile.'
9
+ ) do |file|
10
+ options[:flowfile] = file
11
+ end
12
+
13
+ ## note:
14
+ ## you can add many/multiple modules
15
+ ## e.g. -r gitti -r mono etc.
16
+ parser.on( '-r NAME', '--require NAME') do |name|
17
+ options[:requires] ||= []
18
+ options[:requires] << name
19
+ end
20
+
21
+ parser.on( '-d', '--debug') do |debug|
22
+ options[:debug] = debug
23
+ ## note: for no auto-set env here - why? why not
24
+ ENV['DEBUG']='1' ## use t or true or such - why? why not?
25
+ puts "[flow] setting >DEBUG< env variable to >#{1}<"
26
+ end
27
+
28
+ ## todo/check/reserve: add -e/--env(iornmanet) e.g. dev/test/prod(uction) etc.
29
+ ## plus (convenience) shortcuts e.g. --dev, --prod(uction), --test
30
+ end.parse!( args )
31
+
32
+
33
+ ## check for any (dynamic/auto) requires
34
+ if options[:requires]
35
+ names = options[:requires]
36
+ names.each do |name|
37
+ ## todo/check: add some error/exception handling here - why? why not?
38
+ puts "[flow] auto-require >#{name}<..."
39
+ require( name )
40
+ end
41
+ else ## use/try defaults
42
+ config_path = "./config.rb"
43
+ if File.exist?( config_path )
44
+ puts "[flow] auto-require (default) >#{config_path}<..."
45
+ require( config_path )
46
+ end
47
+ end
48
+
49
+
50
+ path = nil
51
+ if options[:flowfile]
52
+ path = options[:flowfile]
53
+ else
54
+ path = Flowfile.find_file
55
+
56
+ if path.nil?
57
+ STDERR.puts "!! ERROR - no flowfile found, sorry - looking for: #{Flowfile::NAMES.join(', ')} in (#{Dir.pwd})"
58
+ exit 1
59
+ end
60
+ end
61
+
62
+
63
+ ### split args into vars and steps
64
+ vars = []
65
+ args = args.select do |arg|
66
+ ## note: mark freestanding = as fatal error (empty var)
67
+ if arg == '='
68
+ STDERR.puts "!! ERROR - empty var (=) in args; sorry - make sure there are NO spaces before ="
69
+ exit 1
70
+ elsif arg =~ /^[A-Za-z][A-Za-z0-9_]*=/
71
+ vars << arg
72
+ false ## filter -- do NOT include
73
+ else
74
+ true
75
+ end
76
+ end
77
+
78
+ if args.size > 0
79
+ puts "[flow] #{args.size} arg(s):"
80
+ pp args
81
+ end
82
+
83
+ if vars.size > 0
84
+ puts "[flow] #{vars.size} var(s):"
85
+ pp vars
86
+
87
+ ## auto-add vars to ENV
88
+ ## note: if the value is empty e.g. DEBUG= or such
89
+ ## the variable gets deleted / undefined / unset!!
90
+ vars.each do |var|
91
+ pos = var.index('=') ## split on first =
92
+ name = var[0..(pos-1)]
93
+ value = var[(pos+1)..-1]
94
+ # print "[flow] splitting "
95
+ # print "%-24s " % ">#{var}<"
96
+ # print "=> name: "
97
+ # print "%-18s " % ">#{name}<,"
98
+ # print "value: >#{value}< (#{value.class.name})"
99
+ # print "\n"
100
+
101
+ if value.empty? ## note: variable gets deleted / undefined / unset
102
+ puts "[flow] UNSET >#{name}< env variable"
103
+ ENV[ name ] = nil
104
+ else
105
+ puts "[flow] set >#{name}< env variable to >#{value}<"
106
+ ENV[ name ] = value
107
+ end
108
+ end
109
+ end
110
+
111
+
112
+
113
+ puts "[flow] loading >#{path}<..."
114
+ flowfile = Flowfile.load_file( path )
115
+
116
+
117
+
118
+ ## allow multipe steps getting called - why? why not?
119
+ ## flow setup clone update etc. - yes, yes
120
+ ## follow make model and allow variables with FOO= or bar= too
121
+ ## note: mark freestanding = as fatal error (empty var)
122
+
123
+ args.each do |arg|
124
+ flowfile.run( arg )
125
+ end
126
+ end # method self.main
127
+ end # class Tool
128
+
129
+
130
+ end # module Flow
@@ -1,6 +1,6 @@
1
1
  module FlowLite
2
2
 
3
- MAJOR = 0 ## todo: namespace inside version or something - why? why not??
3
+ MAJOR = 1 ## todo: namespace inside version or something - why? why not??
4
4
  MINOR = 1
5
5
  PATCH = 0
6
6
  VERSION = [MAJOR,MINOR,PATCH].join('.')
metadata CHANGED
@@ -1,57 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flow-lite
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gerald Bauer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-10-23 00:00:00.000000000 Z
11
+ date: 2020-11-04 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: gitti
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: 0.6.1
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: 0.6.1
27
- - !ruby/object:Gem::Dependency
28
- name: hubba
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: 1.0.0
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: 1.0.0
41
- - !ruby/object:Gem::Dependency
42
- name: monos
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: 0.5.0
48
- type: :runtime
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: 0.5.0
55
13
  - !ruby/object:Gem::Dependency
56
14
  name: rdoc
57
15
  requirement: !ruby/object:Gem::Requirement
@@ -103,8 +61,10 @@ files:
103
61
  - Rakefile
104
62
  - bin/flow
105
63
  - lib/flow-lite.rb
64
+ - lib/flow-lite/base.rb
65
+ - lib/flow-lite/tool.rb
106
66
  - lib/flow-lite/version.rb
107
- homepage: https://github.com/rubycoco/git
67
+ homepage: https://github.com/rubycoco/flow
108
68
  licenses:
109
69
  - Public Domain
110
70
  metadata: {}