tap 0.12.3 → 0.12.4
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 +11 -0
- data/README +0 -1
- data/bin/tap +4 -6
- data/cmd/run.rb +25 -17
- data/lib/tap/app.rb +2 -7
- data/lib/tap/constants.rb +1 -1
- data/lib/tap/dump.rb +142 -0
- data/lib/tap/env.rb +10 -12
- data/lib/tap/exe.rb +10 -1
- data/lib/tap/file_task.rb +2 -2
- data/lib/tap/generator/generators/root/root_generator.rb +11 -4
- data/lib/tap/generator/generators/root/templates/gemspec +3 -2
- data/lib/tap/load.rb +64 -0
- data/lib/tap/support/constant.rb +5 -7
- metadata +5 -6
- data/lib/tap/tasks/core_dump.rb +0 -57
- data/lib/tap/tasks/dump.rb +0 -125
- data/lib/tap/tasks/load.rb +0 -31
data/History
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
== 0.12.4 / 2009-03-23
|
2
|
+
|
3
|
+
* fixed bug in App#inspect
|
4
|
+
* documentation updates
|
5
|
+
* changed the default load/dump configs to load and
|
6
|
+
dump data without serialization
|
7
|
+
* made stdin the default input to load
|
8
|
+
* updated run syntax to allow arguments to be passed
|
9
|
+
to saved workflows
|
10
|
+
* updates to RootGenerator
|
11
|
+
|
1
12
|
== 0.12.3 / 2009-03-05
|
2
13
|
|
3
14
|
* Updates to allow Tap to use the latest Configurable.
|
data/README
CHANGED
data/bin/tap
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
# usage: tap <command> {options} [args]
|
2
|
+
# usage: tap <command> {options} [args] [-d-]
|
3
|
+
#
|
4
|
+
# Launches a tap command. To enable debugging, append the -d- superflag.
|
3
5
|
#
|
4
6
|
# examples:
|
5
7
|
# tap generate root . # generates a root dir
|
@@ -14,11 +16,7 @@ require "#{File.dirname(__FILE__)}/../lib/tap.rb"
|
|
14
16
|
|
15
17
|
# setup the environment
|
16
18
|
begin
|
17
|
-
|
18
|
-
# handle super options
|
19
|
-
$DEBUG = true if ARGV.delete('-d-')
|
20
|
-
env = Tap::Exe.instantiate
|
21
|
-
|
19
|
+
env = Tap::Exe.setup(ARGV)
|
22
20
|
rescue(Tap::Env::ConfigError)
|
23
21
|
# catch errors and exit gracefully
|
24
22
|
# (errors usu from gem loading errors)
|
data/cmd/run.rb
CHANGED
@@ -1,8 +1,13 @@
|
|
1
|
-
# usage: tap run
|
1
|
+
# usage: tap run [args] [options] -- [SCHEMA]
|
2
2
|
#
|
3
3
|
# examples:
|
4
4
|
# tap run --help Prints this help
|
5
|
+
# tap run -w workflow.yml Build and run a workflow
|
6
|
+
# tap run -w workflow.yml a b c Same with [a, b, c] ARGV
|
7
|
+
#
|
8
|
+
# schema:
|
5
9
|
# tap run -- task --help Prints help for task
|
10
|
+
# tap run -- load hello --: dump Say hello
|
6
11
|
#
|
7
12
|
|
8
13
|
env = Tap::Env.instance
|
@@ -12,10 +17,10 @@ app = Tap::App.instance
|
|
12
17
|
# divide argv
|
13
18
|
#
|
14
19
|
|
15
|
-
|
20
|
+
argv = []
|
16
21
|
break_regexp = Tap::Support::Parser::BREAK
|
17
22
|
while !ARGV.empty? && ARGV[0] !~ break_regexp
|
18
|
-
|
23
|
+
argv << ARGV.shift
|
19
24
|
end
|
20
25
|
|
21
26
|
#
|
@@ -35,7 +40,7 @@ ConfigParser.new do |opts|
|
|
35
40
|
|
36
41
|
opts.separator ""
|
37
42
|
opts.separator "options:"
|
38
|
-
|
43
|
+
|
39
44
|
opts.on("-h", "--help", "Show this message") do
|
40
45
|
Tap::App.lazydoc.resolve
|
41
46
|
puts Lazydoc.usage(__FILE__)
|
@@ -48,29 +53,32 @@ ConfigParser.new do |opts|
|
|
48
53
|
exit
|
49
54
|
end
|
50
55
|
|
51
|
-
|
56
|
+
opts.on("-w", "--workflow FILE", "Build the workflow file") do |path|
|
57
|
+
unless File.exists?(path)
|
58
|
+
puts "No such file or directory - #{path}"
|
59
|
+
puts "(did you mean 'tap run -- #{path}'?)"
|
60
|
+
exit
|
61
|
+
end
|
62
|
+
|
63
|
+
schema = Tap::Support::Schema.load_file(path)
|
64
|
+
env.build(schema, app)
|
65
|
+
end
|
66
|
+
|
67
|
+
end.parse!(argv, app.config)
|
52
68
|
|
53
69
|
#
|
54
70
|
# build and run the argv
|
55
71
|
#
|
56
72
|
|
57
|
-
run_argv.each do |path|
|
58
|
-
unless File.exists?(path)
|
59
|
-
puts "No such file or directory - #{path}"
|
60
|
-
puts "(did you mean 'tap run -- #{path}'?)"
|
61
|
-
exit
|
62
|
-
end
|
63
|
-
|
64
|
-
schema = Tap::Support::Schema.load_file(path)
|
65
|
-
env.build(schema, app)
|
66
|
-
end
|
67
|
-
|
68
73
|
schema = Tap::Support::Schema.parse(ARGV)
|
69
|
-
ARGV.clear
|
70
74
|
env.build(schema, app)
|
75
|
+
ARGV.replace(argv)
|
71
76
|
|
72
77
|
if app.queue.empty?
|
73
78
|
puts "no task specified"
|
79
|
+
unless ARGV.empty?
|
80
|
+
puts "(did you mean 'tap run -- #{ARGV.join(' ')}'?)"
|
81
|
+
end
|
74
82
|
exit
|
75
83
|
end
|
76
84
|
|
data/lib/tap/app.rb
CHANGED
@@ -197,8 +197,8 @@ module Tap
|
|
197
197
|
self.logger = logger
|
198
198
|
end
|
199
199
|
|
200
|
-
# The default App logger writes to $
|
201
|
-
DEFAULT_LOGGER = Logger.new($
|
200
|
+
# The default App logger writes to $stderr at level INFO.
|
201
|
+
DEFAULT_LOGGER = Logger.new($stderr)
|
202
202
|
DEFAULT_LOGGER.level = Logger::INFO
|
203
203
|
DEFAULT_LOGGER.formatter = lambda do |severity, time, progname, msg|
|
204
204
|
" %s[%s] %18s %s\n" % [severity[0,1], time.strftime('%H:%M:%S') , progname || '--' , msg]
|
@@ -356,11 +356,6 @@ module Tap
|
|
356
356
|
self
|
357
357
|
end
|
358
358
|
|
359
|
-
# Returns a string like: "#<Tap::App:#{object_id} root: #{root} >"
|
360
|
-
def inspect
|
361
|
-
"#<#{self.class.to_s}:#{object_id} root: #{root} >"
|
362
|
-
end
|
363
|
-
|
364
359
|
# TerminateErrors are raised to kill executing tasks when terminate is
|
365
360
|
# called on an running App. They are handled by the run rescue code.
|
366
361
|
class TerminateError < RuntimeError
|
data/lib/tap/constants.rb
CHANGED
data/lib/tap/dump.rb
ADDED
@@ -0,0 +1,142 @@
|
|
1
|
+
module Tap
|
2
|
+
|
3
|
+
# :startdoc::manifest the default dump task
|
4
|
+
#
|
5
|
+
# A dump task to output results. Unlike most tasks, dump does not enque
|
6
|
+
# arguments from the command line; instead command line arguments are only
|
7
|
+
# used to setup the dump. Specifically dump accepts a filepath.
|
8
|
+
#
|
9
|
+
# % tap run -- [task] --: dump FILEPATH
|
10
|
+
#
|
11
|
+
# Results that come to dump are appended to the file. Dump only accepts
|
12
|
+
# one object at a time, so joins that produce an array need to iterate
|
13
|
+
# outputs to dump:
|
14
|
+
#
|
15
|
+
# % tap run -- load hello -- load world "--2(0,1)i" dump
|
16
|
+
#
|
17
|
+
# Note that dump uses $stdout by default so you can pipe or redirect dumps
|
18
|
+
# as normal.
|
19
|
+
#
|
20
|
+
# % tap run -- load hello --: dump | cat
|
21
|
+
# hello
|
22
|
+
#
|
23
|
+
# % tap run -- load hello --: dump 1> results.txt
|
24
|
+
# % cat results.txt
|
25
|
+
# hello
|
26
|
+
#
|
27
|
+
# :startdoc::manifest-
|
28
|
+
#
|
29
|
+
# Dump serves as a baseclass for more complicated dump tasks. A YAML dump
|
30
|
+
# task (see {tap-tasks}[http://tap.rubyforge.org/tap-tasks]) looks like this:
|
31
|
+
#
|
32
|
+
# class Yaml < Tap::Dump
|
33
|
+
# def dump(obj, io)
|
34
|
+
# YAML.dump(obj, io)
|
35
|
+
# end
|
36
|
+
# end
|
37
|
+
#
|
38
|
+
# === Implementation Notes
|
39
|
+
#
|
40
|
+
# Dump passes on the command line arguments to setup rather than process.
|
41
|
+
# Moreover, process will always receive the audits passed to _execute, rather
|
42
|
+
# than the audit values. This allows a user to provide setup arguments (such
|
43
|
+
# as a dump path) on the command line, and provides dump the opportunity to
|
44
|
+
# inspect audit trails within process.
|
45
|
+
#
|
46
|
+
class Dump < Tap::Task
|
47
|
+
class << self
|
48
|
+
|
49
|
+
# Same as an ordinary parse!, except the arguments normally reserved for
|
50
|
+
# executing the task are used to call setup. The return will always be
|
51
|
+
# an instance and an empty array.
|
52
|
+
def parse!(argv=ARGV, app=Tap::App.instance)
|
53
|
+
instance, args = super
|
54
|
+
instance.setup(*args)
|
55
|
+
[instance, []]
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
lazy_attr :args, :setup
|
60
|
+
lazy_register :setup, Lazydoc::Arguments
|
61
|
+
|
62
|
+
config :date_format, '%Y-%m-%d %H:%M:%S' # The date format
|
63
|
+
config :audit, false, &c.switch # Include the audit trails
|
64
|
+
config :date, false, &c.switch # Include a date
|
65
|
+
|
66
|
+
# The dump target, by default $stdout. Target may be a filepath,
|
67
|
+
# in which case dumps append the file.
|
68
|
+
attr_accessor :target
|
69
|
+
|
70
|
+
def initialize(config={}, name=nil, app=App.instance)
|
71
|
+
super(config, name, app)
|
72
|
+
@target = $stdout
|
73
|
+
end
|
74
|
+
|
75
|
+
# Setup self with the input target. Setup receives arguments passed from
|
76
|
+
# the command line, via parse!
|
77
|
+
def setup(output=$stdout)
|
78
|
+
@target = output
|
79
|
+
self
|
80
|
+
end
|
81
|
+
|
82
|
+
# Overrides the standard _execute to send process the audits and not
|
83
|
+
# the audit values. This allows process to inspect audit trails.
|
84
|
+
def _execute(input)
|
85
|
+
resolve_dependencies
|
86
|
+
|
87
|
+
previous = input.kind_of?(Support::Audit) ? input : Support::Audit.new(nil, input)
|
88
|
+
input = previous.value
|
89
|
+
|
90
|
+
# this is the overridden part
|
91
|
+
audit = Support::Audit.new(self, input, app.audit ? previous : nil)
|
92
|
+
send(method_name, audit)
|
93
|
+
|
94
|
+
if complete_block = on_complete_block || app.on_complete_block
|
95
|
+
complete_block.call(audit)
|
96
|
+
else
|
97
|
+
app.aggregator.store(audit)
|
98
|
+
end
|
99
|
+
|
100
|
+
audit
|
101
|
+
end
|
102
|
+
|
103
|
+
# The default process prints dump headers as specified in the config,
|
104
|
+
# then append the audit value to io.
|
105
|
+
def process(_audit)
|
106
|
+
open_io(target) do |io|
|
107
|
+
if date
|
108
|
+
io.puts "# date: #{Time.now.strftime(date_format)}"
|
109
|
+
end
|
110
|
+
|
111
|
+
if audit
|
112
|
+
io.puts "# audit:"
|
113
|
+
io.puts "# #{_audit.dump.gsub("\n", "\n# ")}"
|
114
|
+
end
|
115
|
+
|
116
|
+
dump(_audit.value, io)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
# Dumps the object to io, by default dump puts (not prints) obj.to_s.
|
121
|
+
def dump(obj, io)
|
122
|
+
io.puts obj.to_s
|
123
|
+
end
|
124
|
+
|
125
|
+
protected
|
126
|
+
|
127
|
+
# helper to open and yield the io specified by target. open_io
|
128
|
+
# ensures file targets are closed when the block returns.
|
129
|
+
def open_io(io) # :nodoc:
|
130
|
+
case io
|
131
|
+
when IO, StringIO
|
132
|
+
yield(io)
|
133
|
+
when String
|
134
|
+
dir = File.dirname(io)
|
135
|
+
FileUtils.mkdir_p(dir) unless File.directory?(dir)
|
136
|
+
File.open(io, 'a') {|file| yield(file) }
|
137
|
+
else
|
138
|
+
raise "cannot open io: #{target.inspect}"
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
data/lib/tap/env.rb
CHANGED
@@ -103,7 +103,7 @@ module Tap
|
|
103
103
|
attr_reader :envs
|
104
104
|
|
105
105
|
# The Root directory structure for self.
|
106
|
-
nest(:root, Tap::Root, :
|
106
|
+
nest(:root, Tap::Root, :set_default => false)
|
107
107
|
|
108
108
|
# Specify gems to load as nested Envs. Gems may be specified
|
109
109
|
# by name and/or version, like 'gemname >= 1.2'; by default the
|
@@ -213,10 +213,16 @@ module Tap
|
|
213
213
|
@gems = []
|
214
214
|
@env_paths = []
|
215
215
|
|
216
|
-
|
217
|
-
when
|
218
|
-
|
216
|
+
@root = case path_root_or_config
|
217
|
+
when Root then path_root_or_config
|
218
|
+
when String then Root.new(path_root_or_config)
|
219
|
+
else Root.new
|
219
220
|
end
|
221
|
+
|
222
|
+
unless path_root_or_config.kind_of?(Hash)
|
223
|
+
path_root_or_config = {}
|
224
|
+
end
|
225
|
+
initialize_config(path_root_or_config)
|
220
226
|
end
|
221
227
|
|
222
228
|
# Clears manifests so they may be regenerated.
|
@@ -476,14 +482,6 @@ module Tap
|
|
476
482
|
# A hash of the manifests for self.
|
477
483
|
attr_reader :manifests
|
478
484
|
|
479
|
-
def initialize_root(config)
|
480
|
-
case config
|
481
|
-
when Root then config
|
482
|
-
when String then Root.new(config)
|
483
|
-
else Root.new.reconfigure(config)
|
484
|
-
end
|
485
|
-
end
|
486
|
-
|
487
485
|
def minikey(env)
|
488
486
|
env.root.root
|
489
487
|
end
|
data/lib/tap/exe.rb
CHANGED
@@ -5,6 +5,15 @@ require 'tap/support/schema'
|
|
5
5
|
module Tap
|
6
6
|
class Exe < Env
|
7
7
|
class << self
|
8
|
+
def setup(argv=ARGV)
|
9
|
+
if argv[-1] == '-d-'
|
10
|
+
argv.pop
|
11
|
+
$DEBUG = true
|
12
|
+
end
|
13
|
+
|
14
|
+
instantiate
|
15
|
+
end
|
16
|
+
|
8
17
|
def instantiate(path_or_root=Dir.pwd)
|
9
18
|
exe = super
|
10
19
|
|
@@ -121,7 +130,7 @@ module Tap
|
|
121
130
|
end
|
122
131
|
end
|
123
132
|
|
124
|
-
def set_signals
|
133
|
+
def set_signals(app=Tap::App.instance)
|
125
134
|
# info signal -- Note: some systems do
|
126
135
|
# not support the INFO signal
|
127
136
|
# (windows, fedora, at least)
|
data/lib/tap/file_task.rb
CHANGED
@@ -34,11 +34,11 @@ module Tap
|
|
34
34
|
include Tap::Support::ShellUtils
|
35
35
|
|
36
36
|
# The backup directory
|
37
|
-
config_attr :backup_dir, 'backup' #
|
37
|
+
config_attr :backup_dir, 'backup' # The backup directory
|
38
38
|
|
39
39
|
# A flag indicating whether or track changes
|
40
40
|
# for rollback on execution error
|
41
|
-
config :rollback_on_error, true, &c.switch #
|
41
|
+
config :rollback_on_error, true, &c.switch # Rollback changes on error
|
42
42
|
|
43
43
|
def initialize(config={}, name=nil, app=App.instance)
|
44
44
|
super
|
@@ -19,8 +19,9 @@ module Tap::Generator::Generators
|
|
19
19
|
#
|
20
20
|
class RootGenerator < Tap::Generator::Base
|
21
21
|
|
22
|
-
config :config_file,
|
22
|
+
config :config_file, false, &c.switch # Create a full tap.yml file
|
23
23
|
config :license, true, &c.switch # Create an MIT-LICENSE
|
24
|
+
config :history, true, &c.switch # Create History file
|
24
25
|
config :rapfile, false, &c.switch # Create a Rapfile
|
25
26
|
|
26
27
|
# ::args ROOT, PROJECT_NAME=basename(ROOT)
|
@@ -38,7 +39,12 @@ module Tap::Generator::Generators
|
|
38
39
|
m.directory r[target]
|
39
40
|
next
|
40
41
|
when source =~ /gemspec$/
|
41
|
-
m.template r[project_name + '.gemspec'], source,
|
42
|
+
m.template r[project_name + '.gemspec'], source, {
|
43
|
+
:project_name => project_name,
|
44
|
+
:config_file => config_file,
|
45
|
+
:license => license,
|
46
|
+
:history => history
|
47
|
+
}
|
42
48
|
next
|
43
49
|
when source =~ /Rapfile$/
|
44
50
|
next unless rapfile
|
@@ -49,6 +55,7 @@ module Tap::Generator::Generators
|
|
49
55
|
m.template r[target], source, :project_name => project_name, :license => license
|
50
56
|
end
|
51
57
|
|
58
|
+
m.file(r['History']) if history
|
52
59
|
m.file(r['tap.yml']) do |file|
|
53
60
|
Configurable::Utils.dump(Tap::Env.configurations, file) do |key, delegate|
|
54
61
|
default = delegate.default(false)
|
@@ -69,8 +76,8 @@ module Tap::Generator::Generators
|
|
69
76
|
leader = key == 'root' || default == nil ? '# ' : ''
|
70
77
|
config = YAML.dump({key => default})[5..-1].strip.gsub(/\n+/, "\n#{leader}")
|
71
78
|
"#{lines.join("\n")}#{leader}#{config}\n\n"
|
72
|
-
end
|
73
|
-
end
|
79
|
+
end if config_file
|
80
|
+
end
|
74
81
|
end
|
75
82
|
|
76
83
|
end
|
@@ -14,13 +14,14 @@ Gem::Specification.new do |s|
|
|
14
14
|
|
15
15
|
# list extra rdoc files here.
|
16
16
|
s.extra_rdoc_files = %W{
|
17
|
+
<%= history ? " History\n" : '' %>
|
17
18
|
README
|
18
19
|
<%= license ? " MIT-LICENSE\n" : '' %>
|
19
20
|
}
|
20
21
|
|
21
22
|
# list the files you want to include here. you can
|
22
|
-
# check this manifest using '
|
23
|
+
# check this manifest using 'rap print_manifest'
|
23
24
|
s.files = %W{
|
24
|
-
|
25
|
+
tap.yml
|
25
26
|
}
|
26
27
|
end
|
data/lib/tap/load.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'stringio'
|
2
|
+
|
3
|
+
module Tap
|
4
|
+
# :startdoc::manifest the default load task
|
5
|
+
#
|
6
|
+
# Loads data from the input IO; string data is simply passed through. Load
|
7
|
+
# is typically used as a gateway to other tasks.
|
8
|
+
#
|
9
|
+
# % tap run -- load string --: [task]
|
10
|
+
#
|
11
|
+
# Note that load takes $stdin by default, so you can pipe or redirect data
|
12
|
+
# into to a workflow like so:
|
13
|
+
#
|
14
|
+
# % echo 'hello' | tap run -- load --: dump --audit
|
15
|
+
# # audit:
|
16
|
+
# # o-[tap/load] "hello\n"
|
17
|
+
# # o-[tap/dump] ["hello\n"]
|
18
|
+
# #
|
19
|
+
# hello
|
20
|
+
#
|
21
|
+
# % tap run -- load --: dump --audit < 'somefile.txt'
|
22
|
+
# # audit:
|
23
|
+
# # o-[tap/load] "contents of somefile\n"
|
24
|
+
# # o-[tap/dump] ["contents of somefile\n"]
|
25
|
+
# #
|
26
|
+
# contents of somefile
|
27
|
+
#
|
28
|
+
# ::manifest-
|
29
|
+
#
|
30
|
+
# Load serves as a baseclass for more complicated load tasks. A YAML load
|
31
|
+
# task (see {tap-tasks}[http://tap.rubyforge.org/tap-tasks]) looks like this:
|
32
|
+
#
|
33
|
+
# class Yaml < Tap::Load
|
34
|
+
# def load(io)
|
35
|
+
# YAML.load(io)
|
36
|
+
# end
|
37
|
+
# end
|
38
|
+
#
|
39
|
+
class Load < Tap::Task
|
40
|
+
|
41
|
+
# The default process simply reads the input data and returns it.
|
42
|
+
# See load.
|
43
|
+
def process(input=$stdin)
|
44
|
+
# read on an empty stdin ties up the command line;
|
45
|
+
# this facilitates the intended behavior
|
46
|
+
if input == $stdin && input.stat.size == 0
|
47
|
+
input = ''
|
48
|
+
end
|
49
|
+
|
50
|
+
case input
|
51
|
+
when StringIO, IO
|
52
|
+
load(input)
|
53
|
+
else
|
54
|
+
load(StringIO.new(input))
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# Loads data from the io; the return of load is the return of process. By
|
59
|
+
# default load simply reads data from io.
|
60
|
+
def load(io)
|
61
|
+
io.read
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
data/lib/tap/support/constant.rb
CHANGED
@@ -72,9 +72,8 @@ module Tap
|
|
72
72
|
# The path to load to initialize a missing constant
|
73
73
|
attr_reader :require_path
|
74
74
|
|
75
|
-
# Initializes a new Constant with the specified constant
|
76
|
-
#
|
77
|
-
# constant name.
|
75
|
+
# Initializes a new Constant with the specified constant name and
|
76
|
+
# require_path. The name should be a valid constant name.
|
78
77
|
def initialize(name, require_path=nil)
|
79
78
|
@name = name
|
80
79
|
@require_path = require_path
|
@@ -100,7 +99,7 @@ module Tap
|
|
100
99
|
@const_name ||= (name =~ /.*::(.*)$/ ? $1 : name)
|
101
100
|
end
|
102
101
|
|
103
|
-
# Returns
|
102
|
+
# Returns the nesting constants of name.
|
104
103
|
def nesting
|
105
104
|
@nesting ||= (name =~ /(.*)::.*$/ ? $1 : '')
|
106
105
|
end
|
@@ -123,9 +122,8 @@ module Tap
|
|
123
122
|
another.require_path == self.require_path
|
124
123
|
end
|
125
124
|
|
126
|
-
# Looks up and returns the constant indicated by name.
|
127
|
-
#
|
128
|
-
# requires require_path and tries again.
|
125
|
+
# Looks up and returns the constant indicated by name. If the constant
|
126
|
+
# cannot be found, constantize requires require_path and tries again.
|
129
127
|
#
|
130
128
|
# Raises a NameError if the constant cannot be found.
|
131
129
|
def constantize
|
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.12.
|
4
|
+
version: 0.12.4
|
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-03-
|
12
|
+
date: 2009-03-23 00:00:00 -06: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.4.
|
23
|
+
version: 0.4.1
|
24
24
|
version:
|
25
25
|
description:
|
26
26
|
email: simon.a.chiang@gmail.com
|
@@ -97,9 +97,8 @@ files:
|
|
97
97
|
- lib/tap/support/templater.rb
|
98
98
|
- lib/tap/support/versions.rb
|
99
99
|
- lib/tap/task.rb
|
100
|
-
- lib/tap/
|
101
|
-
- lib/tap/
|
102
|
-
- lib/tap/tasks/load.rb
|
100
|
+
- lib/tap/dump.rb
|
101
|
+
- lib/tap/load.rb
|
103
102
|
- lib/tap/test.rb
|
104
103
|
- lib/tap/test/assertions.rb
|
105
104
|
- lib/tap/test/env_vars.rb
|
data/lib/tap/tasks/core_dump.rb
DELETED
@@ -1,57 +0,0 @@
|
|
1
|
-
module Tap
|
2
|
-
module Tasks
|
3
|
-
# :startdoc::manifest dumps the application
|
4
|
-
#
|
5
|
-
# A dump task to print the application data to a file or IO. Currently the
|
6
|
-
# dump result is only useful for viewing results. In the future the core
|
7
|
-
# dump will be reloadable so a terminated app may restart execution.
|
8
|
-
#
|
9
|
-
# A core dump may be used in a terminal round to capture all the unhandled
|
10
|
-
# results from previous rounds; if no filepath is specified, the results
|
11
|
-
# are printed to stdout.
|
12
|
-
#
|
13
|
-
# % tap run -- [tasks] --+ core_dump FILEPATH
|
14
|
-
#
|
15
|
-
class CoreDump < Tap::FileTask
|
16
|
-
|
17
|
-
config :date, true, &c.switch # include a date
|
18
|
-
config :date_format, '%Y-%m-%d %H:%M:%S' # the date format
|
19
|
-
config :info, true, &c.switch # dump the app state information
|
20
|
-
config :aggregator, true, &c.switch # dump aggregator results
|
21
|
-
config :audit, true, &c.switch # include the audit trails with results
|
22
|
-
|
23
|
-
def process(target=$stdout)
|
24
|
-
case target
|
25
|
-
when IO then dump_to(target)
|
26
|
-
when String
|
27
|
-
log_basename(:dump, target)
|
28
|
-
prepare(target)
|
29
|
-
File.open(target, "wb") {|file| dump_to(file) }
|
30
|
-
else
|
31
|
-
raise "cannot dump to: #{target.inspect}"
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
def dump_to(io)
|
36
|
-
io.puts "# date: #{Time.now.strftime(date_format)}" if date
|
37
|
-
io.puts "# info: #{app.info}" if info
|
38
|
-
|
39
|
-
if aggregator
|
40
|
-
trails = []
|
41
|
-
results = {}
|
42
|
-
app.aggregator.to_hash.each_pair do |src, _results|
|
43
|
-
results["#{src} (#{src.object_id})"] = _results.collect {|_audit| _audit.value }
|
44
|
-
_results.each {|_audit| trails << _audit.dump }
|
45
|
-
end
|
46
|
-
|
47
|
-
if audit
|
48
|
-
io.puts "# audit:"
|
49
|
-
trails.each {|trail| io.puts "# #{trail.gsub("\n", "\n# ")}"}
|
50
|
-
end
|
51
|
-
|
52
|
-
YAML::dump(results, io)
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
data/lib/tap/tasks/dump.rb
DELETED
@@ -1,125 +0,0 @@
|
|
1
|
-
module Tap
|
2
|
-
module Tasks
|
3
|
-
# :startdoc::manifest the default dump task
|
4
|
-
#
|
5
|
-
# A dump task to print results as YAML. Unlike most tasks, dump arguments
|
6
|
-
# do not enque to the task; instead the arguments are used to setup a
|
7
|
-
# dump and the dump uses whatever results come to them in a workflow.
|
8
|
-
#
|
9
|
-
# Multiple dumps to the same file append rather than overwrite. If no file
|
10
|
-
# is specified, the dump goes to $stdout.
|
11
|
-
#
|
12
|
-
# % tap run -- [task] --: dump FILEPATH
|
13
|
-
#
|
14
|
-
# Results may be printed directly, without conversion to YAML by using the
|
15
|
-
# --no-yaml option.
|
16
|
-
#
|
17
|
-
# :startdoc::manifest-
|
18
|
-
#
|
19
|
-
# Dumps are organized so that arguments passed on the command line are
|
20
|
-
# directed at setup rather than process. Moreover, process will always
|
21
|
-
# receive the audits passed to _execute, rather than the audit values.
|
22
|
-
# This allows a user to provide setup arguments (such as a dump path)
|
23
|
-
# on the command line, and provides dump the opportunity to inspect
|
24
|
-
# audit trails.
|
25
|
-
#
|
26
|
-
class Dump < Tap::FileTask
|
27
|
-
class << self
|
28
|
-
|
29
|
-
# Same as an ordinary parse!, except the arguments normally reserved for
|
30
|
-
# executing the task are used to call setup. The return will always be
|
31
|
-
# an instance and an empty array.
|
32
|
-
def parse!(argv=ARGV, app=Tap::App.instance)
|
33
|
-
instance, args = super
|
34
|
-
instance.setup(*args)
|
35
|
-
[instance, []]
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
lazy_attr :args, :setup
|
40
|
-
lazy_register :setup, Lazydoc::Arguments
|
41
|
-
|
42
|
-
config :date_format, '%Y-%m-%d %H:%M:%S' # the date format
|
43
|
-
config :audit, true, &c.switch # include the audit trails
|
44
|
-
config :date, true, &c.switch # include a date
|
45
|
-
config :yaml, true, &c.switch # dump as yaml (vs string)
|
46
|
-
|
47
|
-
# The dump target, by default $stdout. Target may be a filepath,
|
48
|
-
# in which case dumps append the file.
|
49
|
-
attr_accessor :target
|
50
|
-
|
51
|
-
def initialize(config={}, name=nil, app=App.instance, target=$stdout)
|
52
|
-
super(config, name, app)
|
53
|
-
@target = target
|
54
|
-
end
|
55
|
-
|
56
|
-
# Setup self with the input target. Setup is typically called from
|
57
|
-
# parse! and receives arguments passed from the command line.
|
58
|
-
def setup(path=target)
|
59
|
-
@target = path
|
60
|
-
end
|
61
|
-
|
62
|
-
# Overrides the standard _execute to send process the audits and not
|
63
|
-
# the audit values. This allows process to inspect audit trails.
|
64
|
-
def _execute(*inputs)
|
65
|
-
resolve_dependencies
|
66
|
-
|
67
|
-
previous = []
|
68
|
-
inputs.collect! do |input|
|
69
|
-
if input.kind_of?(Support::Audit)
|
70
|
-
previous << input
|
71
|
-
input.value
|
72
|
-
else
|
73
|
-
previous << Support::Audit.new(nil, input)
|
74
|
-
input
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
# this is the overridden part
|
79
|
-
audit = Support::Audit.new(self, inputs, app.audit ? previous : nil)
|
80
|
-
send(method_name, audit)
|
81
|
-
|
82
|
-
if complete_block = on_complete_block || app.on_complete_block
|
83
|
-
complete_block.call(audit)
|
84
|
-
else
|
85
|
-
app.aggregator.store(audit)
|
86
|
-
end
|
87
|
-
|
88
|
-
audit
|
89
|
-
end
|
90
|
-
|
91
|
-
# Prints the _audit to the target. The return value of process is
|
92
|
-
# not recorded in the audit trail.
|
93
|
-
def process(_audit)
|
94
|
-
open_io do |io|
|
95
|
-
if date
|
96
|
-
io.puts "# date: #{Time.now.strftime(date_format)}"
|
97
|
-
end
|
98
|
-
|
99
|
-
if audit
|
100
|
-
io.puts "# audit:"
|
101
|
-
io.puts "# #{_audit.dump.gsub("\n", "\n# ")}"
|
102
|
-
end
|
103
|
-
|
104
|
-
if yaml
|
105
|
-
YAML::dump(_audit.value, io)
|
106
|
-
else
|
107
|
-
io << _audit.value.to_s
|
108
|
-
end
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
protected
|
113
|
-
|
114
|
-
# helper to open and yield the io specified by target. open_io
|
115
|
-
# ensures file targets are closed when the block returns.
|
116
|
-
def open_io # :nodoc:
|
117
|
-
case target
|
118
|
-
when IO, StringIO then yield(target)
|
119
|
-
when String then File.open(target, 'a') {|io| yield(io) }
|
120
|
-
else raise "cannot open target: #{target.inspect}"
|
121
|
-
end
|
122
|
-
end
|
123
|
-
end
|
124
|
-
end
|
125
|
-
end
|
data/lib/tap/tasks/load.rb
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
module Tap
|
2
|
-
module Tasks
|
3
|
-
# :startdoc::manifest the default load task
|
4
|
-
#
|
5
|
-
# Loads YAML-formatted data and makes the result available for other tasks.
|
6
|
-
# Use the --no-yaml configuration to read the data without loading as YAML.
|
7
|
-
#
|
8
|
-
# Load is typically used as a gateway task to other tasks.
|
9
|
-
#
|
10
|
-
# % tap run -- load FILEPATH --: [task]
|
11
|
-
#
|
12
|
-
class Load < Tap::Task
|
13
|
-
|
14
|
-
config :yaml, true, &c.switch # load as yaml (vs string)
|
15
|
-
|
16
|
-
# Loads the input as YAML. Input may be an IO, StringIO, or a filepath.
|
17
|
-
# The loaded object is returned directly.
|
18
|
-
def process(input)
|
19
|
-
str = case input
|
20
|
-
when StringIO, IO
|
21
|
-
input.read
|
22
|
-
else
|
23
|
-
log :load, input
|
24
|
-
File.read(input)
|
25
|
-
end
|
26
|
-
|
27
|
-
yaml ? YAML.load(str) : str
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|