tap 0.18.0 → 0.19.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History +21 -0
- data/MIT-LICENSE +17 -15
- data/README +13 -30
- data/bin/tap +19 -24
- data/cmd/console.rb +1 -12
- data/cmd/manifest.rb +14 -19
- data/cmd/run.rb +96 -86
- data/doc/API +194 -54
- data/doc/Examples/Command Line +27 -1
- data/lib/tap.rb +2 -1
- data/lib/tap/app.rb +613 -166
- data/lib/tap/app/api.rb +115 -0
- data/lib/tap/app/queue.rb +36 -37
- data/lib/tap/app/state.rb +2 -1
- data/lib/tap/env.rb +454 -270
- data/lib/tap/env/constant.rb +83 -33
- data/lib/tap/env/context.rb +61 -0
- data/lib/tap/env/manifest.rb +140 -50
- data/lib/tap/env/minimap.rb +55 -39
- data/lib/tap/join.rb +71 -53
- data/lib/tap/joins/sync.rb +3 -1
- data/lib/tap/middleware.rb +4 -25
- data/lib/tap/middlewares/debugger.rb +75 -0
- data/lib/tap/parser.rb +268 -0
- data/lib/tap/prompt.rb +36 -0
- data/lib/tap/root.rb +3 -3
- data/lib/tap/signals.rb +26 -0
- data/lib/tap/signals/class_methods.rb +222 -0
- data/lib/tap/signals/help.rb +40 -0
- data/lib/tap/signals/module_methods.rb +20 -0
- data/lib/tap/signals/signal.rb +68 -0
- data/lib/tap/task.rb +28 -79
- data/lib/tap/tasks/dump.rb +6 -0
- data/lib/tap/tasks/load.rb +9 -37
- data/lib/tap/templater.rb +12 -1
- data/lib/tap/version.rb +1 -1
- metadata +22 -16
- data/doc/Class Reference +0 -330
- data/lib/tap/exe.rb +0 -130
- data/lib/tap/schema.rb +0 -374
- data/lib/tap/schema/parser.rb +0 -425
- data/lib/tap/schema/utils.rb +0 -56
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'tap/signals'
|
2
|
+
|
3
|
+
module Tap
|
4
|
+
module Signals
|
5
|
+
class Help < Signal
|
6
|
+
|
7
|
+
def call(args)
|
8
|
+
argv = convert_to_array(args, ['sig'])
|
9
|
+
argv.empty? ? list : desc(*argv)
|
10
|
+
end
|
11
|
+
|
12
|
+
def list
|
13
|
+
signals = obj.class.signals
|
14
|
+
width = signals.keys.collect {|key| key.length }.max
|
15
|
+
|
16
|
+
lines = []
|
17
|
+
signals.each_pair do |key, signal|
|
18
|
+
next if key.empty?
|
19
|
+
|
20
|
+
desc = signal.desc.to_s
|
21
|
+
desc = " # #{desc}" unless desc.empty?
|
22
|
+
lines << " /#{key.ljust(width)}#{desc}"
|
23
|
+
end
|
24
|
+
|
25
|
+
"signals: (#{obj.class})\n#{lines.join("\n")}"
|
26
|
+
end
|
27
|
+
|
28
|
+
def desc(sig)
|
29
|
+
clas = obj.signal(sig).class
|
30
|
+
|
31
|
+
if clas.respond_to?(:desc)
|
32
|
+
desc = clas.desc
|
33
|
+
"#{clas} -- #{desc.to_s}\n#{desc.wrap}"
|
34
|
+
else
|
35
|
+
"#{clas} -- no help available"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'tap/signals/class_methods'
|
2
|
+
|
3
|
+
module Tap
|
4
|
+
module Signals
|
5
|
+
module ModuleMethods
|
6
|
+
module_function
|
7
|
+
|
8
|
+
# Extends including classes with Configurable::ClassMethods
|
9
|
+
def included(base)
|
10
|
+
base.extend ClassMethods
|
11
|
+
base.extend ModuleMethods unless base.kind_of?(Class)
|
12
|
+
|
13
|
+
# initialize any class variables
|
14
|
+
ClassMethods.initialize(base)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
extend ModuleMethods
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
module Tap
|
2
|
+
module Signals
|
3
|
+
|
4
|
+
# Signal attaches an object and allows a specific method to be triggered
|
5
|
+
# through a standard interface.
|
6
|
+
class Signal
|
7
|
+
class << self
|
8
|
+
# A description of self
|
9
|
+
attr_accessor :desc
|
10
|
+
end
|
11
|
+
|
12
|
+
# The object receiving signals through self.
|
13
|
+
attr_reader :obj
|
14
|
+
|
15
|
+
attr_reader :block
|
16
|
+
|
17
|
+
def initialize(obj, &block)
|
18
|
+
@obj = obj
|
19
|
+
@block = block
|
20
|
+
end
|
21
|
+
|
22
|
+
# Calls process with the input args and returns the result. This method
|
23
|
+
# is a hook for subclasses.
|
24
|
+
def call(args)
|
25
|
+
process(args)
|
26
|
+
end
|
27
|
+
|
28
|
+
# Simply returns the input args. This method is a hook for subclasses.
|
29
|
+
def process(args)
|
30
|
+
args
|
31
|
+
end
|
32
|
+
|
33
|
+
protected
|
34
|
+
|
35
|
+
def convert_to_array(obj, signature=[], options=false)
|
36
|
+
return obj if obj.kind_of?(Array)
|
37
|
+
|
38
|
+
argv = signature.collect {|key| obj[key] }
|
39
|
+
|
40
|
+
if options
|
41
|
+
opts = {}
|
42
|
+
(obj.keys - signature).each do |key|
|
43
|
+
opts[key] = obj[key]
|
44
|
+
end
|
45
|
+
|
46
|
+
argv << opts
|
47
|
+
end
|
48
|
+
|
49
|
+
argv
|
50
|
+
end
|
51
|
+
|
52
|
+
def convert_to_hash(obj, signature=[], remainder=nil)
|
53
|
+
return obj if obj.kind_of?(Hash)
|
54
|
+
|
55
|
+
args, argh = obj, {}
|
56
|
+
signature.each do |key|
|
57
|
+
argh[key] = args.shift
|
58
|
+
end
|
59
|
+
|
60
|
+
if remainder
|
61
|
+
argh[remainder] = args
|
62
|
+
end
|
63
|
+
|
64
|
+
argh
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
data/lib/tap/task.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
require 'tap/joins'
|
2
2
|
require 'tap/root'
|
3
|
-
require 'tap/env/string_ext'
|
4
3
|
|
5
4
|
module Tap
|
6
5
|
class App
|
@@ -121,48 +120,16 @@ module Tap
|
|
121
120
|
# end
|
122
121
|
# end
|
123
122
|
#
|
124
|
-
class Task
|
123
|
+
class Task < App::Api
|
125
124
|
include App::Node
|
126
|
-
include Configurable
|
127
125
|
|
128
126
|
class << self
|
129
|
-
def inherited(child) # :nodoc:
|
130
|
-
unless child.instance_variable_defined?(:@source_file)
|
131
|
-
caller[0] =~ Lazydoc::CALLER_REGEXP
|
132
|
-
child.instance_variable_set(:@source_file, File.expand_path($1))
|
133
|
-
end
|
134
|
-
super
|
135
|
-
end
|
136
|
-
|
137
|
-
# Parses the argv into an instance of self. By default parse
|
138
|
-
# parses an argh then calls instantiate, but there is no requirement
|
139
|
-
# that this occurs in subclasses.
|
140
|
-
#
|
141
|
-
# ==== Block Overrides
|
142
|
-
#
|
143
|
-
# For convenience, parse will yield the internal ConfigParser to the
|
144
|
-
# block, if given. This functionality was added to Task so they are
|
145
|
-
# more flexible in executable files but it is not a part of the API
|
146
|
-
# requirements for parse/parse!.
|
147
|
-
#
|
148
|
-
def parse(argv=ARGV, app=Tap::App.instance, &block) # :yields: opts
|
149
|
-
parse!(argv.dup, app, &block)
|
150
|
-
end
|
151
127
|
|
152
|
-
|
153
|
-
|
154
|
-
opts = ConfigParser.new
|
155
|
-
|
156
|
-
unless configurations.empty?
|
157
|
-
opts.separator "configurations:"
|
158
|
-
opts.add(configurations)
|
159
|
-
opts.separator ""
|
160
|
-
end
|
161
|
-
|
162
|
-
opts.separator "options:"
|
128
|
+
def parser
|
129
|
+
opts = super
|
163
130
|
|
164
131
|
# add option to print help
|
165
|
-
opts.on("--help", "Print this help") do
|
132
|
+
opts.on!("--help", "Print this help") do
|
166
133
|
lines = desc.kind_of?(Lazydoc::Comment) ? desc.wrap(77, 2, nil) : []
|
167
134
|
lines.collect! {|line| " #{line}"}
|
168
135
|
unless lines.empty?
|
@@ -172,30 +139,37 @@ module Tap
|
|
172
139
|
end
|
173
140
|
|
174
141
|
puts "#{self}#{desc.empty? ? '' : ' -- '}#{desc.to_s}"
|
175
|
-
puts
|
142
|
+
puts help
|
176
143
|
puts "usage: tap run -- #{to_s.underscore} #{args}"
|
177
144
|
puts
|
178
145
|
puts opts
|
179
146
|
exit
|
180
147
|
end
|
181
148
|
|
149
|
+
opts.on('--enque', 'Manually enques self') do
|
150
|
+
opts['enque'] = true
|
151
|
+
end
|
152
|
+
|
182
153
|
# add option to specify a config file
|
183
154
|
opts.on('--config FILE', 'Specifies a config file') do |config_file|
|
184
155
|
opts.config.merge!(load_config(config_file))
|
185
156
|
end
|
186
157
|
|
187
|
-
|
158
|
+
opts
|
159
|
+
end
|
160
|
+
|
161
|
+
# Same as parse, but removes arguments destructively.
|
162
|
+
def parse!(argv=ARGV, app=Tap::App.instance)
|
163
|
+
parser = self.parser
|
188
164
|
|
189
165
|
# (note defaults are not added so they will not
|
190
166
|
# conflict with string keys from a config file)
|
191
|
-
argv =
|
167
|
+
argv = parser.parse!(argv, :add_defaults => false)
|
168
|
+
enque = parser.config.delete('enque')
|
169
|
+
instance = build({'config' => parser.nested_config}, app)
|
192
170
|
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
# Instantiates an instance of self and returns an instance of self.
|
197
|
-
def instantiate(argh={}, app=Tap::App.instance)
|
198
|
-
new(argh[:config] || {}, app)
|
171
|
+
instance.enq(*argv) if enque
|
172
|
+
[instance, argv]
|
199
173
|
end
|
200
174
|
|
201
175
|
# Recursively loads path into a nested configuration file.
|
@@ -301,37 +275,19 @@ module Tap
|
|
301
275
|
end
|
302
276
|
end
|
303
277
|
|
304
|
-
instance_variable_set(:@source_file, __FILE__)
|
305
|
-
|
306
|
-
lazy_attr :desc, 'task'
|
307
278
|
lazy_attr :args, :process
|
308
279
|
lazy_register :process, Lazydoc::Arguments
|
309
280
|
|
310
|
-
|
311
|
-
# [depreciated] manifest will be removed at 1.0
|
312
|
-
lazy_attr :manifest
|
313
|
-
def self.desc(resolve=true)
|
314
|
-
comment = const_attrs['task'] ||= self.manifest
|
315
|
-
resolve && comment.kind_of?(Lazydoc::Comment) ? comment.resolve : comment
|
316
|
-
end
|
317
|
-
def self.manifest
|
318
|
-
# :::-
|
319
|
-
#"warn manifest is depreciated, use ::task instead"
|
320
|
-
# :::+
|
321
|
-
const_attrs['manifest'] ||= Lazydoc::Subject.new(nil, lazydoc)
|
322
|
-
end
|
323
|
-
###############################################################
|
281
|
+
signal :enq
|
324
282
|
|
325
|
-
# The App receiving self during enq
|
326
|
-
attr_reader :app
|
327
|
-
|
328
283
|
# Initializes a new Task.
|
329
284
|
def initialize(config={}, app=Tap::App.instance)
|
330
|
-
@app = app
|
331
285
|
@joins = []
|
332
|
-
|
333
|
-
|
334
|
-
|
286
|
+
super
|
287
|
+
end
|
288
|
+
|
289
|
+
def associations
|
290
|
+
[nil, joins]
|
335
291
|
end
|
336
292
|
|
337
293
|
# Auditing method call. Resolves dependencies, executes method_name,
|
@@ -425,8 +381,8 @@ module Tap
|
|
425
381
|
end
|
426
382
|
|
427
383
|
# Logs the inputs to the application logger (via app.log)
|
428
|
-
def log(action, msg=
|
429
|
-
app.log(action, msg, level)
|
384
|
+
def log(action, msg=nil, level=Logger::INFO)
|
385
|
+
app.log(action, msg, level) { yield }
|
430
386
|
end
|
431
387
|
|
432
388
|
# Provides an abbreviated version of the default inspect, with only
|
@@ -434,12 +390,5 @@ module Tap
|
|
434
390
|
def inspect
|
435
391
|
"#<#{self.class.to_s}:#{object_id} #{config.to_hash.inspect} >"
|
436
392
|
end
|
437
|
-
|
438
|
-
def to_hash
|
439
|
-
{
|
440
|
-
:class => self.class,
|
441
|
-
:config => config.to_hash
|
442
|
-
}
|
443
|
-
end
|
444
393
|
end
|
445
394
|
end
|
data/lib/tap/tasks/dump.rb
CHANGED
data/lib/tap/tasks/load.rb
CHANGED
@@ -30,26 +30,6 @@ module Tap
|
|
30
30
|
# end
|
31
31
|
# end
|
32
32
|
#
|
33
|
-
# Load subclasses may be constructed to reque itself in cases where objects
|
34
|
-
# are sequentially loaded from the same io. Load will reque until the
|
35
|
-
# complete? method returns true. An example is a prompt task:
|
36
|
-
#
|
37
|
-
# class Prompt < Tap::Tasks::Load
|
38
|
-
# config :exit_seq, "\n"
|
39
|
-
#
|
40
|
-
# def load(io)
|
41
|
-
# if io.eof?
|
42
|
-
# nil
|
43
|
-
# else
|
44
|
-
# io.readline
|
45
|
-
# end
|
46
|
-
# end
|
47
|
-
#
|
48
|
-
# def complete?(io, line)
|
49
|
-
# line == nil || line == exit_seq
|
50
|
-
# end
|
51
|
-
# end
|
52
|
-
#
|
53
33
|
# If the use_close configuration is specified, load will close io upon
|
54
34
|
# completion. Files opened by load are always closed upon completion.
|
55
35
|
#
|
@@ -59,20 +39,14 @@ module Tap
|
|
59
39
|
config :use_close, false, :long => :close, &c.flag # Close the input when complete
|
60
40
|
|
61
41
|
# Loads data from io. Process will open the input io object, load
|
62
|
-
# a result
|
63
|
-
# complete? method). Unless loading is complete, process will enque
|
64
|
-
# io to self. Process will close io when loading is complete, provided
|
42
|
+
# a result. Process will close io when loading is complete, provided
|
65
43
|
# use_close or file is specified.
|
66
44
|
def process(io=$stdin)
|
67
45
|
io = open(io)
|
68
46
|
result = load(io)
|
69
47
|
|
70
|
-
if
|
71
|
-
|
72
|
-
close(io)
|
73
|
-
end
|
74
|
-
else
|
75
|
-
enq(io)
|
48
|
+
if use_close || file
|
49
|
+
close(io)
|
76
50
|
end
|
77
51
|
|
78
52
|
result
|
@@ -80,13 +54,12 @@ module Tap
|
|
80
54
|
|
81
55
|
# Opens the io; specifically this means:
|
82
56
|
#
|
83
|
-
# * Opening a File (file true)
|
84
57
|
# * Creating a StringIO for String inputs
|
85
58
|
# * Opening an IO for integer file descriptors
|
86
59
|
# * Returning all other objects
|
87
60
|
#
|
88
61
|
def open(io)
|
89
|
-
return
|
62
|
+
return open_file(io) if file
|
90
63
|
|
91
64
|
case io
|
92
65
|
when String
|
@@ -98,6 +71,11 @@ module Tap
|
|
98
71
|
end
|
99
72
|
end
|
100
73
|
|
74
|
+
# Opens io as a File.
|
75
|
+
def open_file(io)
|
76
|
+
io.kind_of?(File) ? io : File.open(io)
|
77
|
+
end
|
78
|
+
|
101
79
|
# Loads data from io using io.read. Load is intended as a hook
|
102
80
|
# for subclasses.
|
103
81
|
def load(io)
|
@@ -108,12 +86,6 @@ module Tap
|
|
108
86
|
def close(io)
|
109
87
|
io.close
|
110
88
|
end
|
111
|
-
|
112
|
-
# Returns true by default. Override in subclasses to allow recurrent
|
113
|
-
# loading (see process).
|
114
|
-
def complete?(io, last)
|
115
|
-
true
|
116
|
-
end
|
117
89
|
end
|
118
90
|
end
|
119
91
|
end
|
data/lib/tap/templater.rb
CHANGED
@@ -116,13 +116,24 @@ module Tap
|
|
116
116
|
|
117
117
|
nest(nesting, indent, line_sep) { yield }
|
118
118
|
end
|
119
|
+
|
120
|
+
def indent(indent, str)
|
121
|
+
lines = str.kind_of?(Array) ? str : str.split("\n")
|
122
|
+
lines.collect! {|line| "#{indent}#{line}" }
|
123
|
+
lines.join("\n")
|
124
|
+
end
|
119
125
|
end
|
120
126
|
|
121
127
|
class << self
|
122
128
|
|
123
129
|
# Builds the erb template with the specified attributes.
|
124
130
|
def build(template, attributes={}, filename=nil)
|
125
|
-
new(template
|
131
|
+
new(template).build(attributes, filename)
|
132
|
+
end
|
133
|
+
|
134
|
+
# Builds the erb template file with the specified attributes.
|
135
|
+
def build_file(path, attributes={})
|
136
|
+
self.build(File.read(path), attributes, path)
|
126
137
|
end
|
127
138
|
end
|
128
139
|
|
data/lib/tap/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tap
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.19.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Simon Chiang
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-12-05 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -20,7 +20,7 @@ dependencies:
|
|
20
20
|
requirements:
|
21
21
|
- - ">="
|
22
22
|
- !ruby/object:Gem::Version
|
23
|
-
version: 0.
|
23
|
+
version: 0.6.0
|
24
24
|
version:
|
25
25
|
description:
|
26
26
|
email: simon.a.chiang@gmail.com
|
@@ -33,7 +33,6 @@ extra_rdoc_files:
|
|
33
33
|
- MIT-LICENSE
|
34
34
|
- History
|
35
35
|
- doc/API
|
36
|
-
- doc/Class Reference
|
37
36
|
- doc/Examples/Command Line
|
38
37
|
- doc/Examples/Workflow
|
39
38
|
files:
|
@@ -42,43 +41,50 @@ files:
|
|
42
41
|
- cmd/run.rb
|
43
42
|
- lib/tap.rb
|
44
43
|
- lib/tap/app.rb
|
44
|
+
- lib/tap/app/api.rb
|
45
45
|
- lib/tap/app/node.rb
|
46
46
|
- lib/tap/app/queue.rb
|
47
47
|
- lib/tap/app/stack.rb
|
48
48
|
- lib/tap/app/state.rb
|
49
|
-
- lib/tap/version.rb
|
50
|
-
- lib/tap/tasks/dump.rb
|
51
49
|
- lib/tap/env.rb
|
52
50
|
- lib/tap/env/constant.rb
|
51
|
+
- lib/tap/env/context.rb
|
53
52
|
- lib/tap/env/gems.rb
|
54
53
|
- lib/tap/env/manifest.rb
|
55
54
|
- lib/tap/env/minimap.rb
|
56
55
|
- lib/tap/env/string_ext.rb
|
57
|
-
- lib/tap/
|
56
|
+
- lib/tap/intern.rb
|
58
57
|
- lib/tap/join.rb
|
59
58
|
- lib/tap/joins.rb
|
60
59
|
- lib/tap/joins/switch.rb
|
61
60
|
- lib/tap/joins/sync.rb
|
62
61
|
- lib/tap/middleware.rb
|
63
|
-
- lib/tap/
|
62
|
+
- lib/tap/middlewares/debugger.rb
|
63
|
+
- lib/tap/parser.rb
|
64
|
+
- lib/tap/prompt.rb
|
64
65
|
- lib/tap/root.rb
|
65
66
|
- lib/tap/root/utils.rb
|
66
67
|
- lib/tap/root/versions.rb
|
67
|
-
- lib/tap/
|
68
|
-
- lib/tap/
|
69
|
-
- lib/tap/
|
70
|
-
- lib/tap/
|
71
|
-
- lib/tap/
|
68
|
+
- lib/tap/signals.rb
|
69
|
+
- lib/tap/signals/class_methods.rb
|
70
|
+
- lib/tap/signals/help.rb
|
71
|
+
- lib/tap/signals/module_methods.rb
|
72
|
+
- lib/tap/signals/signal.rb
|
72
73
|
- lib/tap/task.rb
|
74
|
+
- lib/tap/tasks/dump.rb
|
75
|
+
- lib/tap/tasks/load.rb
|
76
|
+
- lib/tap/templater.rb
|
77
|
+
- lib/tap/version.rb
|
73
78
|
- README
|
74
79
|
- MIT-LICENSE
|
75
80
|
- History
|
76
81
|
- doc/API
|
77
|
-
- doc/Class Reference
|
78
82
|
- doc/Examples/Command Line
|
79
83
|
- doc/Examples/Workflow
|
80
84
|
has_rdoc: true
|
81
85
|
homepage: http://tap.rubyforge.org
|
86
|
+
licenses: []
|
87
|
+
|
82
88
|
post_install_message:
|
83
89
|
rdoc_options:
|
84
90
|
- --main
|
@@ -104,9 +110,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
104
110
|
requirements: []
|
105
111
|
|
106
112
|
rubyforge_project: tap
|
107
|
-
rubygems_version: 1.3.
|
113
|
+
rubygems_version: 1.3.5
|
108
114
|
signing_key:
|
109
|
-
specification_version:
|
115
|
+
specification_version: 3
|
110
116
|
summary: A configurable, distributable workflow framework.
|
111
117
|
test_files: []
|
112
118
|
|