flow-lite 0.1.0 → 1.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,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: {}