tap 0.18.0 → 0.19.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.
- 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
|
|