tap 0.7.9 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History +28 -0
- data/MIT-LICENSE +1 -1
- data/README +71 -43
- data/Rakefile +81 -64
- data/Tutorial +235 -0
- data/bin/tap +80 -44
- data/lib/tap.rb +41 -12
- data/lib/tap/app.rb +243 -246
- data/lib/tap/file_task.rb +357 -118
- data/lib/tap/generator.rb +88 -29
- data/lib/tap/generator/generators/config/config_generator.rb +4 -2
- data/lib/tap/generator/generators/config/templates/config.erb +1 -2
- data/lib/tap/generator/generators/file_task/file_task_generator.rb +3 -18
- data/lib/tap/generator/generators/file_task/templates/task.erb +22 -15
- data/lib/tap/generator/generators/file_task/templates/test.erb +13 -2
- data/{test/test/inference_methods/test_assert_files_exist/input/input_1.txt → lib/tap/generator/generators/generator/USAGE} +0 -0
- data/lib/tap/generator/generators/generator/generator_generator.rb +21 -0
- data/lib/tap/generator/generators/generator/templates/generator.erb +23 -0
- data/lib/tap/generator/generators/generator/templates/usage.erb +1 -0
- data/{test/test/inference_methods/test_assert_files_exist/input/input_2.txt → lib/tap/generator/generators/package/USAGE} +0 -0
- data/lib/tap/generator/generators/package/package_generator.rb +38 -0
- data/lib/tap/generator/generators/package/templates/package.erb +186 -0
- data/lib/tap/generator/generators/root/root_generator.rb +14 -9
- data/lib/tap/generator/generators/root/templates/Rakefile +20 -14
- data/{test/test/inference_methods/test_infer_glob/expected/file.yml → lib/tap/generator/generators/root/templates/ReadMe.txt} +0 -0
- data/lib/tap/generator/generators/root/templates/tap.yml +82 -0
- data/lib/tap/generator/generators/root/templates/test/tap_test_helper.rb +0 -1
- data/lib/tap/generator/generators/root/templates/test/tap_test_suite.rb +2 -1
- data/{test/test/inference_methods/test_infer_glob/expected/file_1.txt → lib/tap/generator/generators/script/USAGE} +0 -0
- data/lib/tap/generator/generators/script/script_generator.rb +17 -0
- data/lib/tap/generator/generators/script/templates/script.erb +42 -0
- data/lib/tap/generator/generators/task/task_generator.rb +1 -1
- data/lib/tap/generator/generators/task/templates/task.erb +24 -16
- data/lib/tap/generator/generators/task/templates/test.erb +13 -17
- data/lib/tap/generator/generators/workflow/templates/task.erb +10 -10
- data/lib/tap/generator/generators/workflow/templates/test.erb +1 -1
- data/lib/tap/generator/generators/workflow/workflow_generator.rb +3 -18
- data/lib/tap/root.rb +108 -146
- data/lib/tap/script.rb +362 -0
- data/lib/tap/script/console.rb +28 -0
- data/lib/tap/script/destroy.rb +13 -1
- data/lib/tap/script/generate.rb +13 -1
- data/lib/tap/script/run.rb +100 -57
- data/lib/tap/support/batch_queue.rb +0 -3
- data/lib/tap/support/logger.rb +6 -3
- data/lib/tap/support/rake.rb +54 -0
- data/lib/tap/support/task_configuration.rb +169 -0
- data/lib/tap/support/tdoc.rb +198 -0
- data/lib/tap/support/tdoc/config_attr.rb +338 -0
- data/lib/tap/support/tdoc/tdoc_html_generator.rb +38 -0
- data/lib/tap/support/tdoc/tdoc_html_template.rb +42 -0
- data/lib/tap/support/versions.rb +33 -1
- data/lib/tap/task.rb +339 -227
- data/lib/tap/test.rb +86 -128
- data/lib/tap/test/env_vars.rb +16 -5
- data/lib/tap/test/file_methods.rb +373 -0
- data/lib/tap/test/subset_methods.rb +299 -180
- data/lib/tap/version.rb +2 -1
- data/lib/tap/workflow.rb +2 -0
- data/test/app/lib/app_test_task.rb +1 -0
- data/test/app_test.rb +327 -83
- data/test/check/binding_eval.rb +23 -0
- data/test/check/define_method_check.rb +22 -0
- data/test/check/dependencies_check.rb +175 -0
- data/test/check/inheritance_check.rb +22 -0
- data/test/file_task_test.rb +524 -291
- data/test/{test/inference_methods/test_infer_glob/expected/file_2.txt → root/glob/one.txt} +0 -0
- data/test/root/glob/two.txt +0 -0
- data/test/root_test.rb +330 -262
- data/test/script_test.rb +194 -0
- data/test/support/audit_test.rb +5 -2
- data/test/support/combinator_test.rb +10 -10
- data/test/support/rake_test.rb +35 -0
- data/test/support/task_configuration_test.rb +272 -0
- data/test/support/tdoc_test.rb +363 -0
- data/test/support/templater_test.rb +2 -2
- data/test/support/versions_test.rb +32 -0
- data/test/tap_test_helper.rb +39 -0
- data/test/task_base_test.rb +115 -0
- data/test/task_class_test.rb +56 -4
- data/test/task_execute_test.rb +29 -0
- data/test/task_test.rb +89 -70
- data/test/test/env_vars_test.rb +48 -0
- data/test/test/{inference_methods → file_methods}/test_assert_expected/expected/file.txt +0 -0
- data/test/test/{inference_methods → file_methods}/test_assert_expected/expected/folder/file.txt +0 -0
- data/test/test/{inference_methods → file_methods}/test_assert_expected/input/file.txt +0 -0
- data/test/test/{inference_methods → file_methods}/test_assert_expected/input/folder/file.txt +0 -0
- data/test/test/file_methods/test_assert_files_exist/input/input_1.txt +0 -0
- data/test/test/file_methods/test_assert_files_exist/input/input_2.txt +0 -0
- data/test/test/file_methods/test_assert_output_files_equal/expected/one.txt +1 -0
- data/test/test/file_methods/test_assert_output_files_equal/expected/two.txt +1 -0
- data/test/test/file_methods/test_assert_output_files_equal/input/one.txt +1 -0
- data/test/test/file_methods/test_assert_output_files_equal/input/two.txt +1 -0
- data/test/test/{inference_methods → file_methods}/test_file_compare/expected/output_1.txt +0 -0
- data/test/test/{inference_methods → file_methods}/test_file_compare/expected/output_2.txt +0 -0
- data/test/test/{inference_methods → file_methods}/test_file_compare/input/input_1.txt +0 -0
- data/test/test/{inference_methods → file_methods}/test_file_compare/input/input_2.txt +0 -0
- data/test/test/file_methods/test_infer_glob/expected/file.yml +0 -0
- data/test/test/file_methods/test_infer_glob/expected/file_1.txt +0 -0
- data/test/test/file_methods/test_infer_glob/expected/file_2.txt +0 -0
- data/test/test/file_methods/test_method_glob/expected/file.yml +0 -0
- data/test/test/file_methods/test_method_glob/expected/file_1.txt +0 -0
- data/test/test/file_methods/test_method_glob/expected/file_2.txt +0 -0
- data/test/test/{inference_methods → file_methods}/test_yml_compare/expected/output_1.yml +0 -0
- data/test/test/{inference_methods → file_methods}/test_yml_compare/expected/output_2.yml +0 -0
- data/test/test/{inference_methods → file_methods}/test_yml_compare/input/input_1.yml +0 -0
- data/test/test/{inference_methods → file_methods}/test_yml_compare/input/input_2.yml +0 -0
- data/test/test/file_methods_test.rb +204 -0
- data/test/test/subset_methods_test.rb +93 -33
- data/test/test/test_assert_expected_result_files/expected/task/name/a.txt +1 -0
- data/test/test/test_assert_expected_result_files/expected/task/name/b.txt +1 -0
- data/test/test/test_assert_expected_result_files/input/a.txt +1 -0
- data/test/test/test_assert_expected_result_files/input/b.txt +1 -0
- data/test/test/test_file_task_test/expected/one.txt +1 -0
- data/test/test/test_file_task_test/expected/two.txt +1 -0
- data/test/test/test_file_task_test/input/one.txt +1 -0
- data/test/test/test_file_task_test/input/two.txt +1 -0
- data/test/test_test.rb +143 -3
- data/test/workflow_test.rb +2 -0
- data/vendor/rails_generator.rb +56 -0
- data/vendor/rails_generator/base.rb +263 -0
- data/vendor/rails_generator/commands.rb +581 -0
- data/vendor/rails_generator/generated_attribute.rb +42 -0
- data/vendor/rails_generator/lookup.rb +209 -0
- data/vendor/rails_generator/manifest.rb +53 -0
- data/vendor/rails_generator/options.rb +143 -0
- data/vendor/rails_generator/scripts.rb +83 -0
- data/vendor/rails_generator/scripts/destroy.rb +7 -0
- data/vendor/rails_generator/scripts/generate.rb +7 -0
- data/vendor/rails_generator/scripts/update.rb +12 -0
- data/vendor/rails_generator/simple_logger.rb +46 -0
- data/vendor/rails_generator/spec.rb +44 -0
- metadata +180 -196
- data/lib/tap/generator/generators/root/templates/app.yml +0 -19
- data/lib/tap/generator/generators/root/templates/config/process_tap_request.yml +0 -4
- data/lib/tap/generator/generators/root/templates/lib/process_tap_request.rb +0 -26
- data/lib/tap/generator/generators/root/templates/public/images/nav.jpg +0 -0
- data/lib/tap/generator/generators/root/templates/public/stylesheets/color.css +0 -57
- data/lib/tap/generator/generators/root/templates/public/stylesheets/layout.css +0 -108
- data/lib/tap/generator/generators/root/templates/public/stylesheets/normalize.css +0 -40
- data/lib/tap/generator/generators/root/templates/public/stylesheets/typography.css +0 -21
- data/lib/tap/generator/generators/root/templates/server/config/environment.rb +0 -60
- data/lib/tap/generator/generators/root/templates/server/lib/tasks/clear_database_prerequisites.rake +0 -5
- data/lib/tap/generator/generators/root/templates/server/test/test_helper.rb +0 -53
- data/lib/tap/script/server.rb +0 -12
- data/lib/tap/support/rap.rb +0 -38
- data/lib/tap/test/inference_methods.rb +0 -298
- data/test/task/config/task_with_config.yml +0 -1
- data/test/test/inference_methods_test.rb +0 -311
data/lib/tap/script.rb
ADDED
@@ -0,0 +1,362 @@
|
|
1
|
+
require 'getoptlong'
|
2
|
+
require 'singleton'
|
3
|
+
autoload(:PP, "pp")
|
4
|
+
|
5
|
+
module Tap
|
6
|
+
module Support
|
7
|
+
autoload(:TDoc, 'tap/support/tdoc')
|
8
|
+
end
|
9
|
+
|
10
|
+
# == UNDER CONSTRUCTION
|
11
|
+
class ScriptConfig < OpenStruct
|
12
|
+
class << self
|
13
|
+
def defaults
|
14
|
+
{:gems => [],
|
15
|
+
:load_once_paths => [],
|
16
|
+
:load_paths => ["lib"],
|
17
|
+
:script_paths => ["script"]}
|
18
|
+
end
|
19
|
+
|
20
|
+
def spec_filepath(dir=nil)
|
21
|
+
dir == nil ? "tapspec.yml" : File.join(dir, "tapspec.yml")
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def initialize(config={}, app=Tap::App.instance)
|
26
|
+
super(
|
27
|
+
:gemspecs => [],
|
28
|
+
:load_once_paths => [],
|
29
|
+
:load_paths => [],
|
30
|
+
:script_paths => [])
|
31
|
+
|
32
|
+
config = ScriptConfig.defaults.merge(config)
|
33
|
+
resolve_paths(config, app)
|
34
|
+
collect_gem_paths(config)
|
35
|
+
|
36
|
+
# add additional configurations
|
37
|
+
config.each_pair do |key, value|
|
38
|
+
next if self.respond_to?(key)
|
39
|
+
self.send("#{key}=", value)
|
40
|
+
end
|
41
|
+
|
42
|
+
self.load_once_paths.uniq!
|
43
|
+
self.load_paths.uniq!
|
44
|
+
self.script_paths.uniq!
|
45
|
+
end
|
46
|
+
|
47
|
+
def scripts
|
48
|
+
scripts = {}
|
49
|
+
self.script_paths.each do |dir|
|
50
|
+
Dir.glob(File.expand_path(File.join(dir, "**/*.rb"))).each do |file|
|
51
|
+
script = Tap::App.relative_filepath(dir, file).chomp(".rb")
|
52
|
+
raise "script name confict: #{script}" if scripts.include?(script)
|
53
|
+
scripts[script] = file
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# allow gem scripts to overrride default scripts
|
58
|
+
# (hence do this second)
|
59
|
+
script_dir = File.expand_path(File.join( File.dirname(__FILE__), "script"))
|
60
|
+
Dir.glob( script_dir + "/**/*.rb" ).each do |file|
|
61
|
+
script = Tap::App.relative_filepath(script_dir, file).chomp(".rb")
|
62
|
+
scripts[script] = file unless scripts.include?(script)
|
63
|
+
end
|
64
|
+
|
65
|
+
scripts
|
66
|
+
end
|
67
|
+
|
68
|
+
protected
|
69
|
+
|
70
|
+
# Resolve configuration paths, :load_paths, :load_once_paths, :script_paths,
|
71
|
+
# to full paths using the provided app, or by expanding the paths relative to
|
72
|
+
# the full_gem_path of the provided gemspec.
|
73
|
+
def resolve_paths(config, app_or_gemspec) # :nodoc:
|
74
|
+
# resolve and collect paths
|
75
|
+
[:load_paths, :load_once_paths, :script_paths].each do |key|
|
76
|
+
paths = arrayify(config[key])
|
77
|
+
|
78
|
+
paths.collect! do |path|
|
79
|
+
case app_or_gemspec
|
80
|
+
when Tap::App
|
81
|
+
app_or_gemspec.filepath(path)
|
82
|
+
when Gem::Specification
|
83
|
+
expanded = File.expand_path(path, app_or_gemspec.full_gem_path)
|
84
|
+
unless expanded.index(app_or_gemspec.full_gem_path) == 0
|
85
|
+
raise "'#{path}' for '#{app_or_gemspec.name}' resolves to a non-gem directory"
|
86
|
+
end
|
87
|
+
expanded
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
self.send(key).concat(paths)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
# Recursively collects paths from the gems specfied in config[:gems],
|
96
|
+
# using tap specification file for the gem as determined by
|
97
|
+
# ScriptConfig#spec_filepath
|
98
|
+
def collect_gem_paths(config) # :nodoc:
|
99
|
+
arrayify(config[:gems]).each do |string|
|
100
|
+
# figure the version of the gem, by default >= 0.0.0
|
101
|
+
string =~ /^([^<=>]*)(.*)$/
|
102
|
+
gem_name, version = $1, $2
|
103
|
+
version = ">= 0.0.0" if version.empty?
|
104
|
+
|
105
|
+
# load the gem and get the spec
|
106
|
+
gem(gem_name, version)
|
107
|
+
spec = Gem.loaded_specs[gem_name]
|
108
|
+
|
109
|
+
# prevent an infinite loop...
|
110
|
+
next if self.gemspecs.include?(spec)
|
111
|
+
self.gemspecs << spec
|
112
|
+
|
113
|
+
# load gem config from the spec, if possible,
|
114
|
+
# otherwise use the defaults for the gem
|
115
|
+
tap_spec_file = ScriptConfig.spec_filepath(spec.full_gem_path)
|
116
|
+
gem_config = if File.exists?(tap_spec_file)
|
117
|
+
YAML.load_file(tap_spec_file).symbolize_keys
|
118
|
+
else
|
119
|
+
ScriptConfig.defaults
|
120
|
+
end
|
121
|
+
|
122
|
+
resolve_paths(gem_config, spec)
|
123
|
+
collect_gem_paths(gem_config)
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def arrayify(obj) # :nodoc:
|
128
|
+
case obj
|
129
|
+
when nil then []
|
130
|
+
when Array then obj
|
131
|
+
else
|
132
|
+
obj.to_s.strip.empty? ? [] : [obj]
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
# == UNDER CONSTRUCTION
|
138
|
+
#
|
139
|
+
# Script is a mixed bag of methods encapsulating many scripting
|
140
|
+
# functions like reconfiguring an application, handling options
|
141
|
+
# and assembling usage information.
|
142
|
+
class Script
|
143
|
+
|
144
|
+
class << self
|
145
|
+
def config_filepath(dir=nil)
|
146
|
+
dir == nil ? "tap.yml" : File.join(dir, "tap.yml")
|
147
|
+
end
|
148
|
+
|
149
|
+
def read_config(config_file)
|
150
|
+
config = if File.exists?(config_file)
|
151
|
+
config_str = ERB.new( File.read(config_file) ).result
|
152
|
+
config = config_str.empty? ? {} : YAML.load(config_str)
|
153
|
+
config == false ? {} : config
|
154
|
+
else
|
155
|
+
{}
|
156
|
+
end
|
157
|
+
|
158
|
+
unless config.kind_of?(Hash)
|
159
|
+
raise "cannot parse file contents into a hash using YAML: #{config_file}"
|
160
|
+
end
|
161
|
+
|
162
|
+
config.symbolize_keys
|
163
|
+
end
|
164
|
+
|
165
|
+
def split_arguments(argv, separator_regexp=/^-{2}$/)
|
166
|
+
splits = []
|
167
|
+
current = []
|
168
|
+
argv.each do |arg|
|
169
|
+
if arg =~ separator_regexp
|
170
|
+
splits << current unless current.empty?
|
171
|
+
current = []
|
172
|
+
else
|
173
|
+
current << arg
|
174
|
+
end
|
175
|
+
end
|
176
|
+
splits << current unless current.empty?
|
177
|
+
splits
|
178
|
+
end
|
179
|
+
|
180
|
+
def next_arg(argv)
|
181
|
+
index = nil
|
182
|
+
argv.each_with_index do |arg, i|
|
183
|
+
if arg !~ /^-/
|
184
|
+
index = i
|
185
|
+
break
|
186
|
+
end
|
187
|
+
end
|
188
|
+
index == nil ? nil : argv.delete_at(index)
|
189
|
+
end
|
190
|
+
|
191
|
+
def usage(program_file, *sections)
|
192
|
+
options = sections.last.kind_of?(Hash) ? sections.pop : {}
|
193
|
+
options = {:keep_headers => true}.merge(options)
|
194
|
+
comment = Support::TDoc.usage(program_file, sections, options[:keep_headers])
|
195
|
+
comment.rstrip + "\n"
|
196
|
+
end
|
197
|
+
|
198
|
+
def usage_options(opts)
|
199
|
+
opt_lines = ["Options:\n"]
|
200
|
+
opts.each do |long, short, mode, desc|
|
201
|
+
short = short == nil ? " " : "(#{short})"
|
202
|
+
opt_lines << " %-25s %s %s" % [long, short, desc]
|
203
|
+
end
|
204
|
+
opt_lines.join("\n")
|
205
|
+
end
|
206
|
+
|
207
|
+
# Handles options using GetoptLong, and passes each option and
|
208
|
+
# value in ARGV to the block.
|
209
|
+
#
|
210
|
+
#--
|
211
|
+
# expect [long, <short>, type, desc]
|
212
|
+
#++
|
213
|
+
def handle_options(*options)
|
214
|
+
options = options.collect do |opt|
|
215
|
+
opt = opt[0..-2]
|
216
|
+
opt.compact
|
217
|
+
end
|
218
|
+
|
219
|
+
opts = GetoptLong.new(*options)
|
220
|
+
opts.each do |opt, value|
|
221
|
+
yield(opt, value)
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
def handle_task_options(task)
|
226
|
+
return task.handle_options if task.respond_to?(:handle_options)
|
227
|
+
|
228
|
+
config = {}
|
229
|
+
opt_map = {}
|
230
|
+
opts = task.class.configurations.collect do |declaration_class, key, value, attributes|
|
231
|
+
long, short, opt_type, desc = config_to_opt(key, value, attributes)
|
232
|
+
opt_map[long] = key
|
233
|
+
[long, short, opt_type, desc]
|
234
|
+
end
|
235
|
+
opts << ['--help', '-h', GetoptLong::NO_ARGUMENT, "Print this help."]
|
236
|
+
|
237
|
+
handle_options(*opts) do |opt, value|
|
238
|
+
case opt
|
239
|
+
when '--help'
|
240
|
+
class_doc = Tap::Support::TDoc[task.class]
|
241
|
+
if class_doc == nil
|
242
|
+
puts "could not find help for '#{task.class}'"
|
243
|
+
exit
|
244
|
+
end
|
245
|
+
|
246
|
+
sections = class_doc.comment_sections(/Description|Usage/i, true)
|
247
|
+
opt_lines = opts.collect do |long, short, opt_type, desc|
|
248
|
+
key = opt_map[long]
|
249
|
+
default = PP.singleline_pp(task.class.configurations.default[key], "")
|
250
|
+
config_attr = class_doc.find_configuration_named(key.to_s)
|
251
|
+
|
252
|
+
short = "(#{short})" unless short.to_s.empty?
|
253
|
+
if desc == nil && config_attr != nil
|
254
|
+
desc = config_attr.desc + " (#{default})"
|
255
|
+
end
|
256
|
+
|
257
|
+
" %-25s %-5s %s" % [long, short, desc]
|
258
|
+
end
|
259
|
+
|
260
|
+
puts %Q{#{task.class.to_s}
|
261
|
+
#{sections["Description"]}
|
262
|
+
|
263
|
+
Usage:
|
264
|
+
#{sections["Usage"]}
|
265
|
+
|
266
|
+
Options:
|
267
|
+
#{opt_lines.join("\n")}}
|
268
|
+
exit
|
269
|
+
|
270
|
+
else
|
271
|
+
key = opt_map[opt]
|
272
|
+
config[key] = YAML.load(value)
|
273
|
+
end
|
274
|
+
end
|
275
|
+
|
276
|
+
# reconfigure task
|
277
|
+
task.batch.each do |t|
|
278
|
+
t.config = config
|
279
|
+
end
|
280
|
+
end
|
281
|
+
|
282
|
+
protected
|
283
|
+
|
284
|
+
def config_to_opt(key, value, attributes)
|
285
|
+
attributes = {
|
286
|
+
:long => key,
|
287
|
+
:short => nil,
|
288
|
+
:opt_type => GetoptLong::REQUIRED_ARGUMENT,
|
289
|
+
:desc => nil
|
290
|
+
}.merge(attributes)
|
291
|
+
|
292
|
+
long = attributes[:long]
|
293
|
+
attributes[:long] = "--#{long}" unless long =~ /^-{2}/
|
294
|
+
|
295
|
+
short = attributes[:short].to_s
|
296
|
+
attributes[:short] = "-#{short}" unless short.empty? || short =~ /^-/
|
297
|
+
|
298
|
+
[attributes[:long], attributes[:short], attributes[:opt_type], attributes[:desc]]
|
299
|
+
end
|
300
|
+
end
|
301
|
+
|
302
|
+
include Singleton
|
303
|
+
|
304
|
+
attr_accessor :config
|
305
|
+
|
306
|
+
def reset
|
307
|
+
self.config = nil
|
308
|
+
end
|
309
|
+
|
310
|
+
# Configures the app with the input configurations.
|
311
|
+
def configure_app(app_config={}, app=Tap::App.instance)
|
312
|
+
app_config = app_config ? app_config.symbolize_keys : {}
|
313
|
+
|
314
|
+
# partition script_config from config
|
315
|
+
script_config = ScriptConfig.defaults
|
316
|
+
script_config_keys = script_config.keys
|
317
|
+
app_config.delete_if do |key, value|
|
318
|
+
if script_config_keys.include?(key)
|
319
|
+
script_config[key] = value
|
320
|
+
true
|
321
|
+
else
|
322
|
+
false
|
323
|
+
end
|
324
|
+
end
|
325
|
+
|
326
|
+
# reconfigure the current app with remaining keys
|
327
|
+
# this must be done first so load paths can be
|
328
|
+
# resolved using the most current app config
|
329
|
+
app.reconfigure(app_config) do |key, value|
|
330
|
+
# collect unknown options
|
331
|
+
script_config[key] = value
|
332
|
+
end
|
333
|
+
|
334
|
+
# define the config, using the newly configured app
|
335
|
+
self.config = ScriptConfig.new(script_config, app)
|
336
|
+
|
337
|
+
# add load paths to system load paths
|
338
|
+
# echos Rail::Initializer.set_load_path
|
339
|
+
tap_gem_dir = File.expand_path(File.dirname(__FILE__) + "/..")
|
340
|
+
config.load_paths.unshift(tap_gem_dir)
|
341
|
+
config.load_paths.reverse_each do |dir|
|
342
|
+
$LOAD_PATH.unshift(dir) #if File.directory?(dir)
|
343
|
+
end
|
344
|
+
$LOAD_PATH.uniq!
|
345
|
+
|
346
|
+
# set Dependencies load paths and freeze setting of load_paths
|
347
|
+
# echos Rail::Initializer.set_autoload_paths
|
348
|
+
Dependencies.load_once_paths = config.load_once_paths
|
349
|
+
Dependencies.load_paths = config.load_paths
|
350
|
+
|
351
|
+
extra = Dependencies.load_once_paths - Dependencies.load_paths
|
352
|
+
unless extra.empty?
|
353
|
+
raise(
|
354
|
+
"load_once_paths must be a subset of the load_paths.\n" +
|
355
|
+
"Extra items in load_once_paths: #{extra * ','}")
|
356
|
+
end
|
357
|
+
|
358
|
+
config
|
359
|
+
end
|
360
|
+
|
361
|
+
end
|
362
|
+
end
|
data/lib/tap/script/console.rb
CHANGED
@@ -1,3 +1,31 @@
|
|
1
|
+
# = Usage
|
2
|
+
# tap console {options}
|
3
|
+
#
|
4
|
+
# = Description
|
5
|
+
# Opens up an IRB session with Tap initialized with configurations
|
6
|
+
# in tap.yml. Access the Tap::App.instance through 'app'
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'tap/script'
|
10
|
+
|
11
|
+
#
|
12
|
+
# handle options
|
13
|
+
#
|
14
|
+
|
15
|
+
opts = [
|
16
|
+
['--help', '-h', GetoptLong::NO_ARGUMENT, "Print this help."]]
|
17
|
+
|
18
|
+
Tap::Script.handle_options(*opts) do |opt, value|
|
19
|
+
case opt
|
20
|
+
when '--help'
|
21
|
+
puts Tap::Script.usage(__FILE__, "Usage", "Description", :keep_headers => false)
|
22
|
+
puts
|
23
|
+
puts Tap::Script.usage_options(opts)
|
24
|
+
exit
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
1
29
|
require "irb"
|
2
30
|
|
3
31
|
def app
|
data/lib/tap/script/destroy.rb
CHANGED
@@ -1,8 +1,20 @@
|
|
1
|
-
|
1
|
+
begin
|
2
|
+
$:.unshift File.dirname(__FILE__) + "/../../../vendor"
|
3
|
+
require 'tap/generator'
|
4
|
+
rescue(LoadError)
|
5
|
+
puts "The 'rails' gem is required for destroyers -- install using:"
|
6
|
+
puts " % gem install rails"
|
7
|
+
exit
|
8
|
+
end
|
9
|
+
|
2
10
|
Rails::Generator::Base.use_tap_sources!
|
3
11
|
|
4
12
|
require 'rails_generator/scripts/destroy'
|
5
13
|
generator = ARGV.shift
|
14
|
+
|
15
|
+
# Ensure help is printed if help is the first argument
|
16
|
+
generator = nil if generator == '--help' || generator == '-h'
|
17
|
+
|
6
18
|
script = Rails::Generator::Scripts::Destroy.new
|
7
19
|
script.extend Tap::Generator::Usage
|
8
20
|
script.run(ARGV, :generator => generator)
|
data/lib/tap/script/generate.rb
CHANGED
@@ -1,8 +1,20 @@
|
|
1
|
-
|
1
|
+
begin
|
2
|
+
$:.unshift File.dirname(__FILE__) + "/../../../vendor"
|
3
|
+
require 'tap/generator'
|
4
|
+
rescue(LoadError)
|
5
|
+
puts "The 'rails' gem is required for generators -- install using:"
|
6
|
+
puts " % gem install rails"
|
7
|
+
exit
|
8
|
+
end
|
9
|
+
|
2
10
|
Rails::Generator::Base.use_tap_sources!
|
3
11
|
|
4
12
|
require 'rails_generator/scripts/generate'
|
5
13
|
generator = ARGV.shift
|
14
|
+
|
15
|
+
# Ensure help is printed if help is the first argument
|
16
|
+
generator = nil if generator == '--help' || generator == '-h'
|
17
|
+
|
6
18
|
script = Rails::Generator::Scripts::Generate.new
|
7
19
|
script.extend Tap::Generator::Usage
|
8
20
|
script.run(ARGV, :generator => generator)
|
data/lib/tap/script/run.rb
CHANGED
@@ -1,86 +1,130 @@
|
|
1
|
+
# = Usage
|
2
|
+
# tap run {options} -- {task options} task INPUTS...
|
3
|
+
#
|
4
|
+
# examples:
|
5
|
+
# tap run --help Prints this help
|
6
|
+
# tap run -- task --help Prints help for task
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'tap/script'
|
10
|
+
|
1
11
|
app = Tap::App.instance
|
2
|
-
|
12
|
+
script = Tap::Script.instance
|
3
13
|
|
4
14
|
#
|
5
15
|
# handle options
|
6
16
|
#
|
7
|
-
require 'getoptlong'
|
8
17
|
|
9
|
-
opts =
|
10
|
-
['--
|
11
|
-
['--
|
12
|
-
['--
|
13
|
-
['--
|
14
|
-
['--debug', '-d', GetoptLong::NO_ARGUMENT],# "Trace execution and debug."],
|
15
|
-
['--help', '-h', GetoptLong::OPTIONAL_ARGUMENT])#, "Display help for app, or specified task."])
|
18
|
+
opts = [
|
19
|
+
['--help', '-h', GetoptLong::NO_ARGUMENT, "Print this help"],
|
20
|
+
['--debug', '-d', GetoptLong::NO_ARGUMENT, "Trace execution and debug"],
|
21
|
+
['--force', '-f', GetoptLong::NO_ARGUMENT, "Force execution at checkpoints"],
|
22
|
+
['--quiet', '-q', GetoptLong::NO_ARGUMENT, "Suppress logging"]]
|
16
23
|
|
17
|
-
opts
|
24
|
+
Tap::Script.handle_options(*opts) do |opt, value|
|
18
25
|
case opt
|
19
26
|
when '--help'
|
20
|
-
puts "
|
21
|
-
|
22
|
-
|
23
|
-
if value.empty?
|
24
|
-
help
|
25
|
-
else
|
26
|
-
task = task(value)
|
27
|
-
puts task.class.help
|
28
|
-
puts "Default Config:"
|
29
|
-
puts task.class.default_config.stringify_keys.to_yaml
|
30
|
-
end
|
31
|
-
|
32
|
-
when '--usage'
|
33
|
-
puts "usage!"
|
27
|
+
puts Tap::Script.usage(__FILE__, "Usage", :keep_headers => false)
|
28
|
+
puts
|
29
|
+
puts Tap::Script.usage_options(opts)
|
34
30
|
exit
|
35
|
-
|
36
|
-
when '--app-config'
|
37
|
-
config = Tap::App.parse_yaml(value)
|
38
|
-
if config.kind_of?(String)
|
39
|
-
raise "application config file does not exist: #{config}" unless File.exists?(config)
|
40
|
-
config = Tap::App.read_erb_yaml(config)
|
41
|
-
end
|
42
|
-
app.reconfigure(config)
|
43
|
-
|
44
|
-
when '--config'
|
45
|
-
task_config = Tap::App.parse_yaml(value)
|
46
|
-
if task_config.kind_of?(String)
|
47
|
-
raise "task config file does not exist: #{config}" unless File.exists?(config)
|
48
|
-
task_config = Tap::App.read_erb_yaml(config)
|
49
|
-
end
|
50
|
-
|
31
|
+
|
51
32
|
when '--quiet', '--force', '--debug'
|
52
33
|
# simply track these have been set
|
53
34
|
opt =~ /^-+(\w+)/
|
54
35
|
app.options.send("#{$1}=", true)
|
55
|
-
|
56
|
-
else
|
57
|
-
puts "unknown option: #{opt}"
|
58
|
-
exit
|
36
|
+
|
59
37
|
end
|
60
38
|
end
|
61
39
|
|
62
40
|
#
|
63
|
-
#
|
64
|
-
#
|
65
|
-
|
66
|
-
if
|
41
|
+
# handle options for each specified task
|
42
|
+
#
|
43
|
+
argv = Tap::Script.split_arguments(ARGV)
|
44
|
+
if argv.empty?
|
67
45
|
puts "no task specified"
|
68
46
|
exit
|
69
47
|
end
|
70
48
|
|
71
|
-
|
72
|
-
|
73
|
-
ARGV.
|
49
|
+
argv.each do |args|
|
50
|
+
ARGV.clear
|
51
|
+
ARGV.concat(args)
|
52
|
+
|
53
|
+
td = Tap::Script.next_arg(ARGV)
|
54
|
+
if td == 'rake'
|
55
|
+
# interpret 'rake' tds as specifications for
|
56
|
+
# rake tasks and/or inputs:
|
57
|
+
# tap run rake -T
|
58
|
+
# tap run rake test
|
59
|
+
#
|
60
|
+
app.extend Tap::Support::Rake
|
61
|
+
|
62
|
+
rake = Rake.application
|
63
|
+
options = rake.options
|
64
|
+
|
65
|
+
# merge options down from app
|
66
|
+
app.options.marshal_dump.each_pair do |key, value|
|
67
|
+
options.send("#{key}=", value)
|
68
|
+
end
|
69
|
+
options.silent = true
|
70
|
+
|
71
|
+
# now follow the same protocol as
|
72
|
+
# in run, handling options
|
73
|
+
rake.init
|
74
|
+
rake.load_rakefile
|
75
|
+
|
76
|
+
# takes the place of rake.top_level
|
77
|
+
if options.show_tasks
|
78
|
+
rake.display_tasks_and_comments
|
79
|
+
exit
|
80
|
+
elsif options.show_prereqs
|
81
|
+
rake.display_prerequisites
|
82
|
+
exit
|
83
|
+
else
|
84
|
+
rake.top_level_tasks.each do |task_name|
|
85
|
+
task = app.task(task_name)
|
86
|
+
app.queue.enq(task)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
next
|
91
|
+
end
|
92
|
+
|
93
|
+
# lookup the task
|
94
|
+
begin
|
95
|
+
task = (td.nil? ? nil : app.task(td))
|
96
|
+
rescue(Tap::App::LookupError)
|
97
|
+
end
|
98
|
+
|
99
|
+
# unless a Tap::Task was found, treat the
|
100
|
+
# args as a specification for Rake.
|
101
|
+
unless task.kind_of?(Tap::Task)
|
102
|
+
args.unshift(td) unless task == nil
|
103
|
+
args.unshift('rake')
|
104
|
+
redo
|
105
|
+
end
|
106
|
+
|
107
|
+
# handle task configuration options
|
108
|
+
Tap::Script.handle_task_options(task)
|
74
109
|
|
75
|
-
|
110
|
+
# queue the task with the remaining inputs
|
111
|
+
args = ARGV.collect! {|arg| Tap::App.parse_yaml(arg) }
|
112
|
+
app.queue.enq(task, *args)
|
113
|
+
end
|
114
|
+
ARGV.clear
|
76
115
|
|
77
116
|
#
|
78
117
|
# set signals and run!
|
79
118
|
#
|
80
119
|
|
81
|
-
# info signal
|
82
|
-
|
83
|
-
|
120
|
+
# info signal -- Note: windows does
|
121
|
+
# not support the INFO signal
|
122
|
+
if RUBY_PLATFORM.index('mswin').nil?
|
123
|
+
Signal.trap("INFO") do
|
124
|
+
puts app.info
|
125
|
+
end
|
126
|
+
|
127
|
+
puts "ctl-i prints information"
|
84
128
|
end
|
85
129
|
|
86
130
|
# interuption signal
|
@@ -104,8 +148,7 @@ Signal.trap("INT") do
|
|
104
148
|
end
|
105
149
|
end
|
106
150
|
|
107
|
-
puts "ctl-i prints information"
|
108
151
|
puts "ctl-c interupts execution"
|
109
152
|
puts "beginning run..."
|
110
153
|
|
111
|
-
app.run
|
154
|
+
app.run
|