tap 0.11.0 → 0.11.1
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/bin/rap +8 -6
- data/cgi/run.rb +40 -10
- data/cmd/manifest.rb +9 -11
- data/doc/Tutorial +4 -4
- data/lib/tap/constants.rb +1 -1
- data/lib/tap/declarations.rb +35 -17
- data/lib/tap/exe.rb +2 -1
- data/lib/tap/support/constant_manifest.rb +16 -9
- data/lib/tap/support/executable.rb +9 -6
- data/lib/tap/support/lazy_attributes.rb +9 -9
- data/lib/tap/support/lazydoc/method.rb +1 -1
- data/lib/tap/support/schema.rb +1 -1
- data/lib/tap/support/shell_utils.rb +1 -3
- data/lib/tap/task.rb +6 -1
- metadata +3 -3
data/bin/rap
CHANGED
@@ -12,10 +12,11 @@ begin
|
|
12
12
|
env = Tap::Exe.instantiate
|
13
13
|
env.unshift(Tap::Declarations.env)
|
14
14
|
|
15
|
-
|
16
|
-
|
15
|
+
Dir.glob('[TtRr]apfile{,.rb}').each do |task_file|
|
16
|
+
task_file = File.expand_path(task_file)
|
17
|
+
next unless File.file?(task_file)
|
18
|
+
|
17
19
|
env.loads.unshift(task_file)
|
18
|
-
env.tasks.register(Dir.pwd, 'Tapfile')
|
19
20
|
end
|
20
21
|
|
21
22
|
rescue(Tap::Env::ConfigError)
|
@@ -71,12 +72,13 @@ begin
|
|
71
72
|
<% end %>
|
72
73
|
<% entries.each do |name, const| %>
|
73
74
|
<% desc = if const.require_path == nil # should be a declaration %>
|
74
|
-
<% manifest = const.constantize.
|
75
|
-
<% next if manifest == nil || manifest.subject.empty? %>
|
76
|
-
<% manifest
|
75
|
+
<% manifest = const.constantize.manifest %>
|
76
|
+
<% next if manifest == nil || manifest.subject.to_s.empty? %>
|
77
|
+
<% manifest %>
|
77
78
|
<% else %>
|
78
79
|
<% const.document[const.name]['manifest'] %>
|
79
80
|
<% end %>
|
81
|
+
<% desc = desc.subject.to_s if desc.kind_of?(Tap::Support::Lazydoc::Comment) %>
|
80
82
|
<%= name.ljust(width) %><%= desc.empty? ? '' : ' # ' %><%= desc %>
|
81
83
|
<% end %>}
|
82
84
|
|
data/cgi/run.rb
CHANGED
@@ -14,9 +14,19 @@ module Tap
|
|
14
14
|
module Server
|
15
15
|
module_function
|
16
16
|
|
17
|
+
def parse_schema(params)
|
18
|
+
argh = pair_parse(params)
|
19
|
+
|
20
|
+
parser = Parser.new
|
21
|
+
parser.parse(argh['nodes'] || [])
|
22
|
+
parser.parse(argh['joins'] || [])
|
23
|
+
parser.schema
|
24
|
+
end
|
25
|
+
|
17
26
|
def pair_parse(params)
|
18
27
|
pairs = {}
|
19
28
|
params.each_pair do |key, values|
|
29
|
+
next if key == nil
|
20
30
|
key = key.chomp("%w") if key =~ /%w$/
|
21
31
|
|
22
32
|
slot = pairs[key] ||= []
|
@@ -40,28 +50,48 @@ cgi = CGI.new("html3") # add HTML generation methods
|
|
40
50
|
cgi.out() do
|
41
51
|
case cgi.request_method
|
42
52
|
when /GET/i
|
43
|
-
|
44
|
-
|
53
|
+
schema = Tap::Support::Server.parse_schema(cgi.params).compact
|
54
|
+
env.render('run.erb', :env => env, :schema => schema)
|
55
|
+
|
45
56
|
when /POST/i
|
46
57
|
action = cgi.params['action'][0]
|
47
58
|
case action
|
48
59
|
when 'add'
|
49
60
|
index = cgi.params['index'][0].to_i - 1
|
50
|
-
cgi.params['
|
61
|
+
sources = cgi.params['sources'].flatten.collect {|source| source.to_i }
|
62
|
+
targets = cgi.params['targets'].flatten.collect {|target| target.to_i }
|
63
|
+
|
64
|
+
lines = []
|
65
|
+
cgi.params['tasc'].select do |name|
|
66
|
+
name && !name.empty?
|
67
|
+
end.each do |name|
|
51
68
|
index += 1
|
52
|
-
|
53
|
-
env.render('run/
|
54
|
-
end
|
69
|
+
targets << index
|
70
|
+
lines << env.render('run/node.erb', :env => env, :node => Tap::Support::Node.new([name]), :index => index )
|
71
|
+
end
|
55
72
|
|
73
|
+
join = case
|
74
|
+
when sources.length > 1 && targets.length == 1
|
75
|
+
Tap::Support::Schema::Utils.format_merge(sources, targets, {})
|
76
|
+
when sources.length == 1 && targets.length > 0
|
77
|
+
Tap::Support::Schema::Utils.format_fork(sources, targets, {})
|
78
|
+
else nil
|
79
|
+
end
|
80
|
+
|
81
|
+
lines << env.render('run/join.erb', :env => env, :join => join) if join
|
82
|
+
lines.join("\n")
|
83
|
+
|
56
84
|
when 'remove'
|
57
|
-
|
85
|
+
|
58
86
|
else
|
87
|
+
# run
|
59
88
|
cgi.pre do
|
60
|
-
|
61
|
-
|
89
|
+
schema = Tap::Support::Server.parse_schema(cgi.params)
|
90
|
+
schema.compact.dump.to_yaml
|
91
|
+
#env.build(schema)
|
62
92
|
end
|
63
93
|
end
|
64
94
|
else
|
65
95
|
raise ArgumentError, "unhandled request method: #{cgi.request_method}"
|
66
96
|
end
|
67
|
-
end
|
97
|
+
end
|
data/cmd/manifest.rb
CHANGED
@@ -27,8 +27,8 @@ end.parse!(ARGV)
|
|
27
27
|
|
28
28
|
env = Tap::Env.instance
|
29
29
|
env_names = {}
|
30
|
-
env.
|
31
|
-
env_names[environment] =
|
30
|
+
env.minimap.each do |env_name, environment|
|
31
|
+
env_names[environment] = env_name
|
32
32
|
end
|
33
33
|
|
34
34
|
filter = case
|
@@ -57,15 +57,13 @@ width = 10
|
|
57
57
|
summary = env.inspect(template) do |templater, share|
|
58
58
|
current = templater.env
|
59
59
|
next unless filter.include?(current)
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
manifest = current.manifest(name, true)
|
66
|
-
next if manifest.empty?
|
60
|
+
|
61
|
+
manifests = []
|
62
|
+
[:commands, :generators, :tasks].each do |name|
|
63
|
+
manifest = current.send(name)
|
64
|
+
next if manifest.build.empty?
|
67
65
|
|
68
|
-
entries = manifest.
|
66
|
+
entries = manifest.minimap.collect do |(entry, path)|
|
69
67
|
path = case path
|
70
68
|
when Tap::Support::Constant then path.require_path
|
71
69
|
else path
|
@@ -75,7 +73,7 @@ summary = env.inspect(template) do |templater, share|
|
|
75
73
|
[entry, current.root.relative_filepath(:root, path) || path]
|
76
74
|
end
|
77
75
|
|
78
|
-
[name, entries]
|
76
|
+
manifests << [name, entries]
|
79
77
|
end
|
80
78
|
templater.manifests = manifests.compact
|
81
79
|
templater.env_name = env_names[current]
|
data/doc/Tutorial
CHANGED
@@ -27,7 +27,7 @@ Now from the command line:
|
|
27
27
|
--------------------------------------------------------------------------------
|
28
28
|
Says goodnight with a configurable message.
|
29
29
|
--------------------------------------------------------------------------------
|
30
|
-
usage:
|
30
|
+
usage: rap goodnight OBJ
|
31
31
|
|
32
32
|
configurations:
|
33
33
|
--message MESSAGE
|
@@ -45,7 +45,7 @@ The declaration syntax is obviously similar to rake; configurations are new but
|
|
45
45
|
|
46
46
|
# make the declarations available everywhere
|
47
47
|
# (normally they're accessed via Tap, as above)
|
48
|
-
|
48
|
+
include Tap::Declarations
|
49
49
|
|
50
50
|
namespace :example do
|
51
51
|
task(:say, :message) do |task, args|
|
@@ -110,7 +110,7 @@ Simple enough; the name corresponds to the class, configurations (and dependenci
|
|
110
110
|
|
111
111
|
Totally straightforward. Goodnight stores the default configurations, each instance has accessors to the configurations, and the defaults may be overridden during initialization, or later. Class definitions allow validation/transformation blocks to be specified for configurations. These blocks process inputs (ex the string inputs from the command line), quite literally defining the writer for a configuration accessor. A set of standard blocks are available through +c+, an alias for the Tap::Support::Validation module.
|
112
112
|
|
113
|
-
[
|
113
|
+
[lib/goodnight.rb]
|
114
114
|
|
115
115
|
# Goodnight::manifest a fancy goodnight moon task
|
116
116
|
# Says goodnight with a configurable message.
|
@@ -154,7 +154,7 @@ Now from the command line:
|
|
154
154
|
--------------------------------------------------------------------------------
|
155
155
|
Says goodnight with a configurable message.
|
156
156
|
--------------------------------------------------------------------------------
|
157
|
-
usage:
|
157
|
+
usage: rap goodnight OBJECTS...
|
158
158
|
|
159
159
|
configurations:
|
160
160
|
--message MESSAGE a goodnight message
|
data/lib/tap/constants.rb
CHANGED
data/lib/tap/declarations.rb
CHANGED
@@ -2,16 +2,25 @@ require File.dirname(__FILE__) + "/../tap"
|
|
2
2
|
autoload(:OpenStruct, 'ostruct')
|
3
3
|
|
4
4
|
module Tap
|
5
|
+
#--
|
6
|
+
# more thought needs to go into extending Tap with Declarations
|
7
|
+
# and there should be some discussion on why include works at
|
8
|
+
# the top level (for main/Object) while extend should be used
|
9
|
+
# in all other cases.
|
5
10
|
module Declarations
|
6
11
|
Lazydoc = Tap::Support::Lazydoc
|
12
|
+
include Tap::Support::ShellUtils
|
7
13
|
|
8
14
|
module Lazydoc
|
9
15
|
class Declaration < Comment
|
16
|
+
attr_accessor :desc
|
17
|
+
|
10
18
|
def resolve(lines)
|
11
19
|
super
|
12
20
|
|
13
21
|
@subject = case
|
14
|
-
when content.empty? || content[0][0].to_s !~ /^::desc(.*)/
|
22
|
+
when content.empty? || content[0][0].to_s !~ /^::desc(.*)/
|
23
|
+
desc.to_s
|
15
24
|
else
|
16
25
|
content[0].shift
|
17
26
|
$1.strip
|
@@ -42,16 +51,24 @@ module Tap
|
|
42
51
|
end
|
43
52
|
|
44
53
|
def self.env
|
45
|
-
@env ||= Tap::Env.
|
54
|
+
@env ||= Tap::Env.instance_for(Dir.pwd)
|
55
|
+
end
|
56
|
+
|
57
|
+
def declaration_env
|
58
|
+
@declaration_env ||= Declarations.env
|
46
59
|
end
|
47
60
|
|
48
|
-
|
49
|
-
|
61
|
+
attr_writer :declaration_base
|
62
|
+
|
63
|
+
def declaration_base
|
64
|
+
@declaration_base ||= ''
|
50
65
|
end
|
51
66
|
|
52
|
-
|
67
|
+
attr_writer :current_desc
|
53
68
|
|
54
|
-
|
69
|
+
def current_desc
|
70
|
+
@current_desc ||= nil
|
71
|
+
end
|
55
72
|
|
56
73
|
def task(*args, &block)
|
57
74
|
const_name, configs, dependencies, arg_names = resolve_args(args)
|
@@ -93,8 +110,7 @@ module Tap
|
|
93
110
|
end
|
94
111
|
|
95
112
|
def desc(str)
|
96
|
-
self.current_desc =
|
97
|
-
current_desc.subject = str
|
113
|
+
self.current_desc = str
|
98
114
|
end
|
99
115
|
|
100
116
|
protected
|
@@ -179,12 +195,12 @@ module Tap
|
|
179
195
|
end
|
180
196
|
|
181
197
|
# register the subclass in the manifest
|
182
|
-
manifest =
|
198
|
+
manifest = declaration_env.tasks
|
183
199
|
const_name = subclass.to_s
|
184
|
-
unless manifest.
|
200
|
+
unless manifest.entries.any? {|const| const.name == const_name }
|
185
201
|
manifest.entries << Tap::Support::Constant.new(const_name)
|
186
202
|
end
|
187
|
-
|
203
|
+
|
188
204
|
subclass
|
189
205
|
end
|
190
206
|
|
@@ -193,16 +209,18 @@ module Tap
|
|
193
209
|
# register documentation
|
194
210
|
caller[1] =~ Lazydoc::CALLER_REGEXP
|
195
211
|
task_class.source_file = File.expand_path($1)
|
196
|
-
|
197
|
-
|
212
|
+
manifest = task_class.lazydoc(false).register($3.to_i - 1, Lazydoc::Declaration)
|
213
|
+
manifest.desc = current_desc
|
214
|
+
task_class.manifest = manifest
|
215
|
+
|
216
|
+
self.current_desc = nil
|
198
217
|
|
199
218
|
if arg_names
|
200
219
|
comment = Lazydoc::Comment.new
|
201
|
-
comment.subject = arg_names.join(' ')
|
202
|
-
|
220
|
+
comment.subject = arg_names.collect {|name| name.to_s.upcase }.join(' ')
|
221
|
+
task_class.args = comment
|
203
222
|
end
|
204
|
-
|
205
|
-
self.current_desc = nil
|
223
|
+
|
206
224
|
task_class
|
207
225
|
end
|
208
226
|
end
|
data/lib/tap/exe.rb
CHANGED
@@ -74,7 +74,8 @@ module Tap
|
|
74
74
|
end
|
75
75
|
|
76
76
|
def build(argv=ARGV)
|
77
|
-
Support::Schema.parse(argv)
|
77
|
+
schema = argv.kind_of?(Support::Schema) ? argv : Support::Schema.parse(argv)
|
78
|
+
schema.compact.build(app) do |args|
|
78
79
|
task = args.shift
|
79
80
|
const = tasks.search(task)
|
80
81
|
|
@@ -71,7 +71,7 @@ module Tap
|
|
71
71
|
|
72
72
|
search_paths[search_path_index, search_paths.length - search_path_index].each do |(path_root, paths)|
|
73
73
|
paths[path_index, paths.length - path_index].each do |path|
|
74
|
-
new_entries = resolve(path_root, path)
|
74
|
+
new_entries = resolve(path_root, path)
|
75
75
|
entries.concat(new_entries)
|
76
76
|
|
77
77
|
@path_index += 1
|
@@ -95,17 +95,24 @@ module Tap
|
|
95
95
|
# filepath from path_root to path.
|
96
96
|
def resolve(path_root, path)
|
97
97
|
entries = []
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
98
|
+
lazydoc = nil
|
99
|
+
|
100
|
+
Lazydoc.scan(File.read(path), const_attr) do |const_name, attr_key, comment|
|
101
|
+
if lazydoc == nil
|
102
|
+
lazydoc = Lazydoc[path]
|
103
|
+
|
104
|
+
if lazydoc.default_const_name.empty?
|
105
|
+
relative_path = Root.relative_filepath(path_root, path).chomp(File.extname(path))
|
106
|
+
lazydoc.default_const_name = relative_path.camelize
|
107
|
+
end
|
102
108
|
end
|
103
109
|
|
104
|
-
|
105
|
-
|
106
|
-
entries << Constant.new(const_name, path)
|
107
|
-
end
|
110
|
+
if const_name.empty?
|
111
|
+
const_name = lazydoc.default_const_name
|
108
112
|
end
|
113
|
+
|
114
|
+
lazydoc[const_name][attr_key] = comment
|
115
|
+
entries << Constant.new(const_name, path)
|
109
116
|
end
|
110
117
|
|
111
118
|
entries
|
@@ -204,19 +204,22 @@ module Tap
|
|
204
204
|
# Adds the dependency to each member in batch (and implicitly self).
|
205
205
|
# The dependency will be resolved with the input arguments during
|
206
206
|
# _execute, using resolve_dependencies.
|
207
|
-
def depends_on(
|
207
|
+
def depends_on(*dependencies)
|
208
208
|
batch.each do |e|
|
209
|
-
e.unbatched_depends_on(
|
209
|
+
e.unbatched_depends_on(*dependencies)
|
210
210
|
end
|
211
211
|
self
|
212
212
|
end
|
213
213
|
|
214
214
|
# Like depends_on, but only adds the dependency to self.
|
215
|
-
def unbatched_depends_on(
|
216
|
-
raise ArgumentError, "cannot depend on self" if
|
215
|
+
def unbatched_depends_on(*dependencies)
|
216
|
+
raise ArgumentError, "cannot depend on self" if dependencies.include?(self)
|
217
|
+
|
218
|
+
dependencies.each do |dependency|
|
219
|
+
app.dependencies.register(dependency)
|
220
|
+
self.dependencies << dependency unless self.dependencies.include?(dependency)
|
221
|
+
end
|
217
222
|
|
218
|
-
app.dependencies.register(dependency)
|
219
|
-
dependencies << dependency unless dependencies.include?(dependency)
|
220
223
|
self
|
221
224
|
end
|
222
225
|
|
@@ -29,17 +29,17 @@ module Tap
|
|
29
29
|
lazydoc
|
30
30
|
end
|
31
31
|
|
32
|
-
# Creates a lazy attribute
|
32
|
+
# Creates a lazy attribute accessor for the specified attribute.
|
33
33
|
def lazy_attr(key, attribute=key)
|
34
|
-
instance_eval %Q{
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
34
|
+
instance_eval %Q{
|
35
|
+
def #{key}
|
36
|
+
lazydoc[to_s]['#{attribute}'] ||= Lazydoc::Comment.new
|
37
|
+
end
|
38
|
+
|
39
|
+
def #{key}=(comment)
|
40
|
+
Lazydoc[source_file][to_s]['#{attribute}'] = comment
|
41
|
+
end}
|
41
42
|
end
|
42
|
-
|
43
43
|
end
|
44
44
|
end
|
45
45
|
end
|
data/lib/tap/support/schema.rb
CHANGED
@@ -259,7 +259,7 @@ module Tap
|
|
259
259
|
|
260
260
|
# build the workflow
|
261
261
|
joins.each_pair do |join, (source_node, target_nodes)|
|
262
|
-
raise "unassigned join: #{join}" if source_node == nil
|
262
|
+
raise "unassigned join: #{join}" if source_node == nil || target_nodes.empty?
|
263
263
|
|
264
264
|
targets = target_nodes.collect do |target_node|
|
265
265
|
tasks[target_node][0]
|
@@ -15,9 +15,7 @@ module Tap
|
|
15
15
|
# Commands longer than these limits fail, usually with something like: 'the input
|
16
16
|
# line is too long'
|
17
17
|
module ShellUtils
|
18
|
-
|
19
|
-
module_function
|
20
|
-
|
18
|
+
|
21
19
|
# Run the system command +cmd+, passing the result to the block, if given.
|
22
20
|
# Raises an error if the command fails. Uses the same semantics as
|
23
21
|
# Kernel::exec and Kernel::system.
|
data/lib/tap/task.rb
CHANGED
@@ -196,7 +196,12 @@ module Tap
|
|
196
196
|
opts.separator "options:"
|
197
197
|
|
198
198
|
opts.on_tail("-h", "--help", "Print this help") do
|
199
|
-
|
199
|
+
prg = case $0
|
200
|
+
when /rap$/ then 'rap'
|
201
|
+
else 'tap run --'
|
202
|
+
end
|
203
|
+
|
204
|
+
opts.banner = "#{help}usage: #{prg} #{to_s.underscore} #{args.subject}"
|
200
205
|
if block_given?
|
201
206
|
yield(opts.to_s)
|
202
207
|
else
|
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.11.
|
4
|
+
version: 0.11.1
|
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: 2008-
|
12
|
+
date: 2008-11-02 01:00:00 -06:00
|
13
13
|
default_executable: tap
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -166,7 +166,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
166
166
|
requirements: []
|
167
167
|
|
168
168
|
rubyforge_project: tap
|
169
|
-
rubygems_version: 1.
|
169
|
+
rubygems_version: 1.3.0
|
170
170
|
signing_key:
|
171
171
|
specification_version: 2
|
172
172
|
summary: A framework for creating configurable, distributable tasks and workflows.
|