tap 0.12.1 → 0.12.2
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 +8 -0
- data/README +1 -0
- data/cmd/console.rb +1 -1
- data/cmd/manifest.rb +1 -1
- data/cmd/run.rb +26 -4
- data/doc/Class Reference +2 -4
- data/lib/tap/app.rb +8 -8
- data/lib/tap/env.rb +1 -0
- data/lib/tap/exe.rb +5 -24
- data/lib/tap/file_task.rb +5 -6
- data/lib/tap/generator/base.rb +6 -0
- data/lib/tap/generator/generators/command/command_generator.rb +3 -3
- data/lib/tap/generator/generators/config/config_generator.rb +4 -4
- data/lib/tap/generator/generators/generator/generator_generator.rb +5 -5
- data/lib/tap/generator/generators/root/root_generator.rb +1 -1
- data/lib/tap/generator/generators/task/task_generator.rb +2 -2
- data/lib/tap/generator/preview.rb +5 -12
- data/lib/tap/support/executable.rb +1 -1
- data/lib/tap/support/executable_queue.rb +14 -1
- data/lib/tap/support/join.rb +40 -5
- data/lib/tap/task.rb +0 -4
- data/lib/tap/tasks/dump.rb +17 -8
- data/lib/tap/tasks/load.rb +9 -3
- data/lib/tap/test/tap_test.rb +1 -1
- metadata +2 -2
data/History
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
== 0.12.2 / 2009-02-23
|
2
|
+
|
3
|
+
* Added --no-yaml option to Dump and Load
|
4
|
+
* Added --aggregate option to Join
|
5
|
+
* Updated Dump behavior to merge inputs before process
|
6
|
+
* Reworked App so that it is not a Root
|
7
|
+
* Added the ability to load workflows via 'tap run'
|
8
|
+
|
1
9
|
== 0.12.1 / 2009-02-18
|
2
10
|
|
3
11
|
Maintenance release with updates to Dump and Load tasks.
|
data/README
CHANGED
@@ -91,6 +91,7 @@ Tap comes with generators. To get started:
|
|
91
91
|
- Some inconsequential tests on JRuby fail due to bugs in JRuby itself.
|
92
92
|
- Joins, Parser, and Schema require additional documentation and may be
|
93
93
|
reworked in a future release. The workflow syntax should remain the same.
|
94
|
+
- Audit.dump only works for certain cases. Merges frequently cause trouble.
|
94
95
|
|
95
96
|
== Installation
|
96
97
|
|
data/cmd/console.rb
CHANGED
data/cmd/manifest.rb
CHANGED
data/cmd/run.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# tap run
|
1
|
+
# tap run FILEPATHS... [options] -- [SCHEMA]
|
2
2
|
#
|
3
3
|
# examples:
|
4
4
|
# tap run --help Prints this help
|
@@ -8,6 +8,16 @@
|
|
8
8
|
env = Tap::Env.instance
|
9
9
|
app = Tap::App.instance
|
10
10
|
|
11
|
+
#
|
12
|
+
# divide argv
|
13
|
+
#
|
14
|
+
|
15
|
+
run_argv = []
|
16
|
+
break_regexp = Tap::Support::Parser::BREAK
|
17
|
+
while !ARGV.empty? && ARGV[0] !~ break_regexp
|
18
|
+
run_argv << ARGV.shift
|
19
|
+
end
|
20
|
+
|
11
21
|
#
|
12
22
|
# handle options
|
13
23
|
#
|
@@ -38,19 +48,31 @@ ConfigParser.new do |opts|
|
|
38
48
|
exit
|
39
49
|
end
|
40
50
|
|
41
|
-
end.parse!(
|
51
|
+
end.parse!(run_argv, app.config)
|
42
52
|
|
43
53
|
#
|
44
54
|
# build and run the argv
|
45
55
|
#
|
46
56
|
|
47
|
-
|
48
|
-
|
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
|
+
schema = Tap::Support::Schema.parse(ARGV)
|
49
69
|
ARGV.clear
|
70
|
+
env.build(schema, app)
|
50
71
|
|
51
72
|
if app.queue.empty?
|
52
73
|
puts "no task specified"
|
53
74
|
exit
|
54
75
|
end
|
55
76
|
|
77
|
+
env.set_signals
|
56
78
|
app.run
|
data/doc/Class Reference
CHANGED
@@ -248,8 +248,7 @@ inputs.
|
|
248
248
|
|
249
249
|
http://tap.rubyforge.org/images/App.png
|
250
250
|
|
251
|
-
Instances of Tap::App coordinate the execution of tasks.
|
252
|
-
subclass of Root with an ExecutableQueue.
|
251
|
+
Instances of Tap::App coordinate the execution of tasks.
|
253
252
|
|
254
253
|
Task initialization requires an App, which is by default Tap::App.instance.
|
255
254
|
Tasks use their app for logging, dependency-resolution, checks, and to enque
|
@@ -370,5 +369,4 @@ http://tap.rubyforge.org/images/Run-Env.png
|
|
370
369
|
|
371
370
|
Tap::Exe adds several configurations (ex before/after) which only get loaded
|
372
371
|
for the present directory, and methods for building and executing workflows
|
373
|
-
from command line inputs.
|
374
|
-
wraps Tap::App.instance.
|
372
|
+
from command line inputs.
|
data/lib/tap/app.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
require 'logger'
|
2
2
|
|
3
|
-
require 'tap/root'
|
4
3
|
require 'tap/support/aggregator'
|
5
4
|
require 'tap/support/dependencies'
|
6
5
|
require 'tap/support/executable_queue'
|
@@ -123,7 +122,7 @@ module Tap
|
|
123
122
|
# app.run
|
124
123
|
# array # => [1, 2, 3]
|
125
124
|
#
|
126
|
-
class App <
|
125
|
+
class App < Monitor
|
127
126
|
class << self
|
128
127
|
# Sets the current app instance
|
129
128
|
attr_writer :instance
|
@@ -134,7 +133,9 @@ module Tap
|
|
134
133
|
@instance ||= App.new
|
135
134
|
end
|
136
135
|
end
|
137
|
-
|
136
|
+
|
137
|
+
include Configurable
|
138
|
+
|
138
139
|
# The application logger
|
139
140
|
attr_reader :logger
|
140
141
|
|
@@ -157,6 +158,7 @@ module Tap
|
|
157
158
|
# will be collected by self).
|
158
159
|
attr_reader :on_complete_block
|
159
160
|
|
161
|
+
config :audit, true, &c.switch # Signal auditing
|
160
162
|
config :debug, false, &c.flag # Flag debugging
|
161
163
|
config :force, false, &c.flag # Force execution at checkpoints
|
162
164
|
config :quiet, false, &c.flag # Suppress logging
|
@@ -179,13 +181,11 @@ module Tap
|
|
179
181
|
def state_str(state)
|
180
182
|
constants.inject(nil) {|str, s| const_get(s) == state ? s.to_s : str}
|
181
183
|
end
|
182
|
-
end
|
183
|
-
|
184
|
-
include MonitorMixin
|
184
|
+
end
|
185
185
|
|
186
186
|
# Creates a new App with the given configuration.
|
187
187
|
def initialize(config={}, logger=DEFAULT_LOGGER, &block)
|
188
|
-
super()
|
188
|
+
super() # monitor
|
189
189
|
|
190
190
|
@state = State::READY
|
191
191
|
@queue = Support::ExecutableQueue.new
|
@@ -193,7 +193,7 @@ module Tap
|
|
193
193
|
@dependencies = Support::Dependencies.new
|
194
194
|
@on_complete_block = block
|
195
195
|
|
196
|
-
|
196
|
+
initialize_config(config)
|
197
197
|
self.logger = logger
|
198
198
|
end
|
199
199
|
|
data/lib/tap/env.rb
CHANGED
data/lib/tap/exe.rb
CHANGED
@@ -5,9 +5,8 @@ require 'tap/support/schema'
|
|
5
5
|
module Tap
|
6
6
|
class Exe < Env
|
7
7
|
class << self
|
8
|
-
def instantiate(
|
9
|
-
|
10
|
-
exe = super(app)
|
8
|
+
def instantiate(path_or_root=Dir.pwd)
|
9
|
+
exe = super
|
11
10
|
|
12
11
|
# add all gems if no gems are specified (Note this is VERY SLOW ~ 1/3 the overhead for tap)
|
13
12
|
exe.gems = :all if !File.exists?(Tap::Env::DEFAULT_CONFIG_FILE)
|
@@ -39,17 +38,9 @@ module Tap
|
|
39
38
|
end
|
40
39
|
end
|
41
40
|
|
42
|
-
# The Root directory structure for self.
|
43
|
-
nest(:root, Tap::App) do |config|
|
44
|
-
case config
|
45
|
-
when App then config
|
46
|
-
when String then App.new(:root => config)
|
47
|
-
else App.new(config)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
41
|
config :before, nil
|
52
42
|
config :after, nil
|
43
|
+
|
53
44
|
# Specify files to require when self is activated.
|
54
45
|
config :requires, [], &c.array_or_nil
|
55
46
|
|
@@ -63,15 +54,6 @@ module Tap
|
|
63
54
|
# The global config file path
|
64
55
|
GLOBAL_CONFIG_FILE = File.join(GLOBAL_HOME, "tap.yml")
|
65
56
|
|
66
|
-
def initialize(app=App.instance)
|
67
|
-
super(app)
|
68
|
-
end
|
69
|
-
|
70
|
-
# Alias for root (Exe should have a Tap::App as root)
|
71
|
-
def app
|
72
|
-
root
|
73
|
-
end
|
74
|
-
|
75
57
|
def activate
|
76
58
|
if super
|
77
59
|
|
@@ -117,9 +99,8 @@ module Tap
|
|
117
99
|
end
|
118
100
|
end
|
119
101
|
end
|
120
|
-
|
121
|
-
def build(
|
122
|
-
schema = argv.kind_of?(Support::Schema) ? argv : Support::Schema.parse(argv)
|
102
|
+
|
103
|
+
def build(schema, app=Tap::App.instance)
|
123
104
|
schema.build(app) do |args|
|
124
105
|
task = args.shift
|
125
106
|
const = tasks.search(task)
|
data/lib/tap/file_task.rb
CHANGED
@@ -90,13 +90,12 @@ module Tap
|
|
90
90
|
|
91
91
|
# Constructs a filepath using the dir, name, and the specified paths.
|
92
92
|
#
|
93
|
-
# t = FileTask.new
|
94
|
-
# t.
|
95
|
-
# t.
|
96
|
-
# t.filepath(:data, "result.txt") # => "/data/tap/file_task/result.txt"
|
93
|
+
# t = FileTask.new
|
94
|
+
# t.name # => "tap/file_task"
|
95
|
+
# t.filepath('data', "result.txt") # => File.expand_path("data/tap/file_task/result.txt")
|
97
96
|
#
|
98
|
-
def filepath(dir, *paths)
|
99
|
-
|
97
|
+
def filepath(dir, *paths)
|
98
|
+
File.expand_path(File.join(dir, name, *paths))
|
100
99
|
end
|
101
100
|
|
102
101
|
# Makes a backup filepath relative to backup_dir by using name, the
|
data/lib/tap/generator/base.rb
CHANGED
@@ -69,6 +69,7 @@ module Tap
|
|
69
69
|
lazy_attr :args, :manifest
|
70
70
|
lazy_register :manifest, Arguments
|
71
71
|
|
72
|
+
config :destination_root, Dir.pwd # The destination root directory
|
72
73
|
config :pretend, false, &c.flag # Run but rollback any changes.
|
73
74
|
config :force, false, &c.flag # Overwrite files that already exist.
|
74
75
|
config :skip, false, &c.flag # Skip files that already exist.
|
@@ -115,6 +116,11 @@ module Tap
|
|
115
116
|
actions.collect {|action| yield(action) }
|
116
117
|
end
|
117
118
|
|
119
|
+
# Constructs a path relative to destination_root.
|
120
|
+
def path(*paths)
|
121
|
+
File.expand_path(File.join(*paths), destination_root)
|
122
|
+
end
|
123
|
+
|
118
124
|
# Peforms a directory action (ex generate or destroy). Must be
|
119
125
|
# overridden by one of the action mixins (ex Generate or Destroy).
|
120
126
|
def directory(target, options={})
|
@@ -10,12 +10,12 @@ module Tap::Generator::Generators
|
|
10
10
|
class CommandGenerator < Tap::Generator::Base
|
11
11
|
|
12
12
|
def manifest(m, command_name)
|
13
|
-
m.directory
|
13
|
+
m.directory path('cmd')
|
14
14
|
|
15
15
|
template_files do |source, target|
|
16
|
-
m.template
|
16
|
+
m.template path('cmd', "#{command_name}.rb"), source, :command_name => command_name
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
20
|
end
|
21
|
-
end
|
21
|
+
end
|
@@ -33,7 +33,7 @@ module Tap::Generator::Generators
|
|
33
33
|
|
34
34
|
# setup formatting
|
35
35
|
leader = default == nil ? '# ' : ''
|
36
|
-
config = {key => default}
|
36
|
+
config = YAML.dump({key => default})[5..-1]
|
37
37
|
"#{lines.join("\n")}#{leader}#{config.strip}\n\n"
|
38
38
|
end
|
39
39
|
end
|
@@ -48,7 +48,7 @@ module Tap::Generator::Generators
|
|
48
48
|
|
49
49
|
# setup formatting
|
50
50
|
leader = default == nil ? '# ' : ''
|
51
|
-
config = {key => default}
|
51
|
+
config = YAML.dump({key => default})[5..-1]
|
52
52
|
"#{leader}#{config.strip}\n"
|
53
53
|
end
|
54
54
|
end
|
@@ -72,14 +72,14 @@ module Tap::Generator::Generators
|
|
72
72
|
# setup
|
73
73
|
tasc = lookup(name)
|
74
74
|
config_name ||= tasc.default_name
|
75
|
-
config_file =
|
75
|
+
config_file = path('config', config_name)
|
76
76
|
config_file += ".yml" if File.extname(config_file).empty?
|
77
77
|
|
78
78
|
# generate the dumps
|
79
79
|
dumps = Configurable::Utils.dump_file(tasc.configurations, config_file, nest, true, &format_block)
|
80
80
|
|
81
81
|
# now put the dumps to the manifest
|
82
|
-
m.directory(
|
82
|
+
m.directory(path('config'))
|
83
83
|
|
84
84
|
dumps.each do |path, content|
|
85
85
|
next if content.empty? && !blanks
|
@@ -9,26 +9,26 @@ module Tap::Generator::Generators
|
|
9
9
|
|
10
10
|
def manifest(m, const_name)
|
11
11
|
const = Tap::Support::Constant.new(const_name.camelize)
|
12
|
-
dir =
|
12
|
+
dir = path('lib', const.path)
|
13
13
|
|
14
14
|
# make the directory
|
15
15
|
m.directory dir
|
16
16
|
|
17
17
|
# make the generator
|
18
|
-
m.template
|
18
|
+
m.template path(dir, "#{const.basename}_generator.rb"), "task.erb", :const => const
|
19
19
|
|
20
20
|
# make the templates directory
|
21
|
-
m.directory
|
21
|
+
m.directory path(dir, 'templates')
|
22
22
|
|
23
23
|
# make a template file
|
24
24
|
# (note it's easier to do this as a file since erb is
|
25
25
|
# added, and would have to be escaped in a template)
|
26
|
-
m.file
|
26
|
+
m.file path(dir, 'templates', 'template_file.erb') do |file|
|
27
27
|
file << "# A sample template file.\nkey: <%= key %>\n"
|
28
28
|
end
|
29
29
|
|
30
30
|
if test
|
31
|
-
test_path =
|
31
|
+
test_path = path('test', "#{const.path}_generator_test.rb")
|
32
32
|
m.directory File.dirname(test_path)
|
33
33
|
m.template test_path, "test.erb", :const => const
|
34
34
|
end
|
@@ -62,7 +62,7 @@ module Tap::Generator::Generators
|
|
62
62
|
|
63
63
|
# setup formatting
|
64
64
|
leader = key == 'root' || default == nil ? '# ' : ''
|
65
|
-
config = {key => default}
|
65
|
+
config = YAML.dump({key => default})[5..-1]
|
66
66
|
"#{lines.join("\n")}#{leader}#{config.strip}\n\n"
|
67
67
|
end
|
68
68
|
end if config_file
|
@@ -10,12 +10,12 @@ module Tap::Generator::Generators
|
|
10
10
|
def manifest(m, const_name)
|
11
11
|
const = Tap::Support::Constant.new(const_name.camelize)
|
12
12
|
|
13
|
-
task_path =
|
13
|
+
task_path = path('lib', "#{const.path}.rb")
|
14
14
|
m.directory File.dirname(task_path)
|
15
15
|
m.template task_path, "task.erb", :const => const
|
16
16
|
|
17
17
|
if test
|
18
|
-
test_path =
|
18
|
+
test_path = path('test', "#{const.path}_test.rb")
|
19
19
|
m.directory File.dirname(test_path)
|
20
20
|
m.template test_path, "test.erb", :const => const
|
21
21
|
end
|
@@ -10,7 +10,7 @@ module Tap
|
|
10
10
|
#
|
11
11
|
# class Sample < Tap::Generator::Base
|
12
12
|
# def manifest(m)
|
13
|
-
# dir =
|
13
|
+
# dir = path('dir')
|
14
14
|
#
|
15
15
|
# m.directory dir
|
16
16
|
# m.file(File.join(dir, 'file.txt')) {|io| io << "content"}
|
@@ -27,14 +27,7 @@ module Tap
|
|
27
27
|
#
|
28
28
|
# assert_equal "content", s.preview['dir/file.txt']
|
29
29
|
#
|
30
|
-
# Note that relative filepaths are
|
31
|
-
# instance; in tests like the one above, it may be prudent to reset
|
32
|
-
# the Tap::App.instance like so:
|
33
|
-
#
|
34
|
-
# def setup
|
35
|
-
# Tap::App.instance = Tap::App.new
|
36
|
-
# end
|
37
|
-
#
|
30
|
+
# Note that relative filepaths are relative to destination_root.
|
38
31
|
module Preview
|
39
32
|
|
40
33
|
# A hash of (relative_path, content) pairs representing
|
@@ -45,10 +38,10 @@ module Tap
|
|
45
38
|
base.instance_variable_set(:@preview, {})
|
46
39
|
end
|
47
40
|
|
48
|
-
# Returns the path of path, relative to
|
49
|
-
# is
|
41
|
+
# Returns the path of path, relative to destination_root. If path
|
42
|
+
# is destination_root, '.' will be returned.
|
50
43
|
def relative_path(path)
|
51
|
-
path =
|
44
|
+
path = Root.relative_filepath(destination_root, path, destination_root) || path
|
52
45
|
path.empty? ? "." : path
|
53
46
|
end
|
54
47
|
|
@@ -143,7 +143,7 @@ module Tap
|
|
143
143
|
end
|
144
144
|
end
|
145
145
|
|
146
|
-
audit = Audit.new(self, send(method_name, *inputs), previous)
|
146
|
+
audit = Audit.new(self, send(method_name, *inputs), app.audit ? previous : nil)
|
147
147
|
if complete_block = on_complete_block || app.on_complete_block
|
148
148
|
complete_block.call(audit)
|
149
149
|
else
|
@@ -36,6 +36,19 @@ module Tap
|
|
36
36
|
synchronize { size == 0 }
|
37
37
|
end
|
38
38
|
|
39
|
+
def has?(entry)
|
40
|
+
synchronize do
|
41
|
+
entry_id = entry.object_id
|
42
|
+
|
43
|
+
@rounds.each do |round|
|
44
|
+
round.each do |enqued_entry|
|
45
|
+
return true if entry_id == enqued_entry.object_id
|
46
|
+
end
|
47
|
+
end
|
48
|
+
false
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
39
52
|
# Enqueues the method and inputs. Raises an error if the
|
40
53
|
# method is not an Executable.
|
41
54
|
def enq(method, inputs)
|
@@ -68,7 +81,7 @@ module Tap
|
|
68
81
|
check_method(method)
|
69
82
|
end
|
70
83
|
|
71
|
-
@rounds << round
|
84
|
+
@rounds << round
|
72
85
|
end
|
73
86
|
end
|
74
87
|
|
data/lib/tap/support/join.rb
CHANGED
@@ -23,6 +23,10 @@ module Tap
|
|
23
23
|
# than executed immediately.
|
24
24
|
config :stack, false, :short => 'k', &c.boolean
|
25
25
|
|
26
|
+
# Aggregates results and enques them to the target
|
27
|
+
# in a trailing round.
|
28
|
+
config :aggregate, false, :short => 'a', &c.boolean
|
29
|
+
|
26
30
|
# Initializes a new join with the specified configuration.
|
27
31
|
def initialize(config={})
|
28
32
|
initialize_config(config)
|
@@ -69,12 +73,43 @@ module Tap
|
|
69
73
|
# stack the executable is enqued the executable is executed
|
70
74
|
#
|
71
75
|
def enq(executable, *_results)
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
76
|
+
case
|
77
|
+
when aggregate
|
78
|
+
|
79
|
+
case
|
80
|
+
when iterate, splat, stack
|
81
|
+
raise "iterate, splat, or stack and aggregate"
|
82
|
+
else collect(executable, _results)
|
83
|
+
end
|
84
|
+
|
85
|
+
else
|
86
|
+
unpack(_results) do |_result|
|
87
|
+
case
|
88
|
+
when stack
|
89
|
+
executable.enq(*_result)
|
90
|
+
else
|
91
|
+
executable._execute(*_result)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
# returns the aggregator for self
|
98
|
+
def aggregator # :nodoc:
|
99
|
+
@aggregator ||= {}
|
100
|
+
end
|
101
|
+
|
102
|
+
# helper method to aggregate audited results
|
103
|
+
def collect(executable, inputs) # :nodoc:
|
104
|
+
queue = executable.app.queue
|
105
|
+
entry = aggregator[executable]
|
106
|
+
|
107
|
+
queue.synchronize do
|
108
|
+
unless queue.has?(entry)
|
109
|
+
entry = aggregator[executable] = [executable, []]
|
110
|
+
queue.concat [entry]
|
77
111
|
end
|
112
|
+
entry[1].concat(inputs)
|
78
113
|
end
|
79
114
|
end
|
80
115
|
|
data/lib/tap/task.rb
CHANGED
@@ -209,10 +209,6 @@ module Tap
|
|
209
209
|
argv = opts.parse!(argv, {}, false)
|
210
210
|
|
211
211
|
# load configurations
|
212
|
-
if config_path == nil && name != nil
|
213
|
-
config_path = app.filepath('config', "#{name}.yml")
|
214
|
-
end
|
215
|
-
|
216
212
|
config = load_config(config_path)
|
217
213
|
|
218
214
|
# build and reconfigure the instance
|
data/lib/tap/tasks/dump.rb
CHANGED
@@ -11,6 +11,9 @@ module Tap
|
|
11
11
|
#
|
12
12
|
# % tap run -- [task] --: dump FILEPATH
|
13
13
|
#
|
14
|
+
# Results may be printed directly, without conversion to YAML by using the
|
15
|
+
# --no-yaml option.
|
16
|
+
#
|
14
17
|
# :startdoc::manifest-
|
15
18
|
#
|
16
19
|
# Dumps are organized so that arguments passed on the command line are
|
@@ -33,9 +36,13 @@ module Tap
|
|
33
36
|
end
|
34
37
|
end
|
35
38
|
|
39
|
+
lazy_attr :args, :setup
|
40
|
+
lazy_register :setup, Lazydoc::Arguments
|
41
|
+
|
36
42
|
config :date_format, '%Y-%m-%d %H:%M:%S' # the date format
|
37
43
|
config :audit, true, &c.switch # include the audit trails
|
38
44
|
config :date, true, &c.switch # include a date
|
45
|
+
config :yaml, true, &c.switch # dump as yaml (vs string)
|
39
46
|
|
40
47
|
# The dump target, by default $stdout. Target may be a filepath,
|
41
48
|
# in which case dumps append the file.
|
@@ -69,8 +76,8 @@ module Tap
|
|
69
76
|
end
|
70
77
|
|
71
78
|
# this is the overridden part
|
72
|
-
|
73
|
-
|
79
|
+
audit = Support::Audit.new(self, inputs, app.audit ? previous : nil)
|
80
|
+
send(method_name, audit)
|
74
81
|
|
75
82
|
if complete_block = on_complete_block || app.on_complete_block
|
76
83
|
complete_block.call(audit)
|
@@ -83,19 +90,21 @@ module Tap
|
|
83
90
|
|
84
91
|
# Prints the _audit to the target. The return value of process is
|
85
92
|
# not recorded in the audit trail.
|
86
|
-
def process(
|
93
|
+
def process(_audit)
|
87
94
|
open_io do |io|
|
88
95
|
if date
|
89
96
|
io.puts "# date: #{Time.now.strftime(date_format)}"
|
90
97
|
end
|
91
98
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
end
|
99
|
+
if audit
|
100
|
+
io.puts "# audit:"
|
101
|
+
io.puts "# #{_audit.dump.gsub("\n", "\n# ")}"
|
102
|
+
end
|
97
103
|
|
104
|
+
if yaml
|
98
105
|
YAML::dump(_audit.value, io)
|
106
|
+
else
|
107
|
+
io << _audit.value.to_s
|
99
108
|
end
|
100
109
|
end
|
101
110
|
end
|
data/lib/tap/tasks/load.rb
CHANGED
@@ -3,22 +3,28 @@ module Tap
|
|
3
3
|
# :startdoc::manifest the default load task
|
4
4
|
#
|
5
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
|
+
#
|
6
8
|
# Load is typically used as a gateway task to other tasks.
|
7
9
|
#
|
8
10
|
# % tap run -- load FILEPATH --: [task]
|
9
11
|
#
|
10
12
|
class Load < Tap::Task
|
11
13
|
|
14
|
+
config :yaml, true, &c.switch # load as yaml (vs string)
|
15
|
+
|
12
16
|
# Loads the input as YAML. Input may be an IO, StringIO, or a filepath.
|
13
17
|
# The loaded object is returned directly.
|
14
18
|
def process(input)
|
15
|
-
case input
|
19
|
+
str = case input
|
16
20
|
when StringIO, IO
|
17
|
-
|
21
|
+
input.read
|
18
22
|
else
|
19
23
|
log :load, input
|
20
|
-
|
24
|
+
File.read(input)
|
21
25
|
end
|
26
|
+
|
27
|
+
yaml ? YAML.load(str) : str
|
22
28
|
end
|
23
29
|
end
|
24
30
|
end
|
data/lib/tap/test/tap_test.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.12.
|
4
|
+
version: 0.12.2
|
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-02-
|
12
|
+
date: 2009-02-23 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|