tap 0.12.0 → 0.12.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/History CHANGED
@@ -1,3 +1,11 @@
1
+ == 0.12.1 / 2009-02-18
2
+
3
+ Maintenance release with updates to Dump and Load tasks.
4
+
5
+ * refactored Dump as CoreDump
6
+ * implemented a simple yaml Dump
7
+ * simplified Load
8
+
1
9
  == 0.12.0 / 2009-02-17
2
10
 
3
11
  As of the 0.12.0 release, Tap is distributed as several independent modules
data/README CHANGED
@@ -52,6 +52,7 @@ Tap pulls documentation out of task classes to generate manifests:
52
52
  sample:
53
53
  goodnight # your basic goodnight moon task
54
54
  tap:
55
+ core_dump # dumps the application
55
56
  dump # the default dump task
56
57
  load # the default load task
57
58
 
@@ -0,0 +1,57 @@
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
@@ -1,61 +1,116 @@
1
- module Tap
2
- module Tasks
3
- # :startdoc::manifest the default dump task
4
- #
5
- # A dump task to print aggregated application results to a file or IO.
6
- # The results are printed as YAML, allowing dumped results to be
7
- # reloaded and used as inputs to other tasks.
8
- #
9
- # Often dump is used as the final task in a round of tasks; if no filepath
10
- # is specified, the results are printed to stdout.
11
- #
12
- # % tap run -- [tasks] --+ dump FILEPATH
13
- #
14
- # See Load for more details.
15
- class Dump < Tap::FileTask
16
-
17
- config :date_format, '%Y-%m-%d %H:%M:%S' # the date format
18
- config :audit, true, &c.switch # include the audit trails
19
- config :date, true, &c.switch # include a date
20
- config :filter, nil, &c.regexp_or_nil # only dump matching objects
21
-
22
- # Calls dump_to with the target. If the target is not an
23
- # IO, process assumes the target is a filepath. In that
24
- # case, the file is prepared and the results dumped to it.
25
- def process(target=$stdout)
26
- case target
27
- when IO then dump_to(target)
28
- else
29
- log_basename(:dump, target)
30
- prepare(target)
31
- File.open(target, "wb") {|file| dump_to(file) }
32
- end
33
- end
34
-
35
- # Dumps the current results in app.aggregator to the io.
36
- # The dump will include the result audits and a date,
37
- # as specified in config.
38
- def dump_to(io)
39
- trails = []
40
- results = {}
41
- app.aggregator.to_hash.each_pair do |src, _results|
42
- next if filter && src.to_s !~ filter
43
-
44
- results["#{src} (#{src.object_id})"] = _results.collect {|_audit| _audit.value }
45
- _results.each {|_audit| trails << _audit.dump }
46
- end
47
-
48
- if audit
49
- io.puts "# audit:"
50
- trails.each {|trail| io.puts "# #{trail.gsub("\n", "\n# ")}"}
51
- end
52
-
53
- if date
54
- io.puts "# date: #{Time.now.strftime(date_format)}"
55
- end
56
-
57
- YAML::dump(results, io)
58
- end
59
- end
60
- end
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
+ # :startdoc::manifest-
15
+ #
16
+ # Dumps are organized so that arguments passed on the command line are
17
+ # directed at setup rather than process. Moreover, process will always
18
+ # receive the audits passed to _execute, rather than the audit values.
19
+ # This allows a user to provide setup arguments (such as a dump path)
20
+ # on the command line, and provides dump the opportunity to inspect
21
+ # audit trails.
22
+ #
23
+ class Dump < Tap::FileTask
24
+ class << self
25
+
26
+ # Same as an ordinary parse!, except the arguments normally reserved for
27
+ # executing the task are used to call setup. The return will always be
28
+ # an instance and an empty array.
29
+ def parse!(argv=ARGV, app=Tap::App.instance)
30
+ instance, args = super
31
+ instance.setup(*args)
32
+ [instance, []]
33
+ end
34
+ end
35
+
36
+ config :date_format, '%Y-%m-%d %H:%M:%S' # the date format
37
+ config :audit, true, &c.switch # include the audit trails
38
+ config :date, true, &c.switch # include a date
39
+
40
+ # The dump target, by default $stdout. Target may be a filepath,
41
+ # in which case dumps append the file.
42
+ attr_accessor :target
43
+
44
+ def initialize(config={}, name=nil, app=App.instance, target=$stdout)
45
+ super(config, name, app)
46
+ @target = target
47
+ end
48
+
49
+ # Setup self with the input target. Setup is typically called from
50
+ # parse! and receives arguments passed from the command line.
51
+ def setup(path=target)
52
+ @target = path
53
+ end
54
+
55
+ # Overrides the standard _execute to send process the audits and not
56
+ # the audit values. This allows process to inspect audit trails.
57
+ def _execute(*inputs)
58
+ resolve_dependencies
59
+
60
+ previous = []
61
+ inputs.collect! do |input|
62
+ if input.kind_of?(Support::Audit)
63
+ previous << input
64
+ input.value
65
+ else
66
+ previous << Support::Audit.new(nil, input)
67
+ input
68
+ end
69
+ end
70
+
71
+ # this is the overridden part
72
+ send(method_name, *previous)
73
+ audit = Support::Audit.new(self, inputs, previous)
74
+
75
+ if complete_block = on_complete_block || app.on_complete_block
76
+ complete_block.call(audit)
77
+ else
78
+ app.aggregator.store(audit)
79
+ end
80
+
81
+ audit
82
+ end
83
+
84
+ # Prints the _audit to the target. The return value of process is
85
+ # not recorded in the audit trail.
86
+ def process(*_audits)
87
+ open_io do |io|
88
+ if date
89
+ io.puts "# date: #{Time.now.strftime(date_format)}"
90
+ end
91
+
92
+ _audits.each do |_audit|
93
+ if audit
94
+ io.puts "# audit:"
95
+ io.puts "# #{_audit.dump.gsub("\n", "\n# ")}"
96
+ end
97
+
98
+ YAML::dump(_audit.value, io)
99
+ end
100
+ end
101
+ end
102
+
103
+ protected
104
+
105
+ # helper to open and yield the io specified by target. open_io
106
+ # ensures file targets are closed when the block returns.
107
+ def open_io # :nodoc:
108
+ case target
109
+ when IO, StringIO then yield(target)
110
+ when String then File.open(target, 'a') {|io| yield(io) }
111
+ else raise "cannot open target: #{target.inspect}"
112
+ end
113
+ end
114
+ end
115
+ end
61
116
  end
@@ -2,110 +2,23 @@ module Tap
2
2
  module Tasks
3
3
  # :startdoc::manifest the default load task
4
4
  #
5
- # Load YAML-formatted data, as may be produced using Dump, and makes this
6
- # data available for other tasks. Load is often used as a gateway task
7
- # to other tasks.
5
+ # Loads YAML-formatted data and makes the result available for other tasks.
6
+ # Load is typically used as a gateway task to other tasks.
8
7
  #
9
8
  # % tap run -- load FILEPATH --: [task]
10
9
  #
11
- # Load can select items from Hash or Array objects using one or more keys
12
- # when only a subset is desired. By default items are selected using [].
13
- # For more flexible selection, use match.
14
- #
15
- # Match converts each of the keys to a Regexp. For hashes, all values
16
- # with a matching key will be selected. For arrays, any item matching
17
- # a regexp will be selected.
18
- #
19
- # Use the flags to flatten, compact, sort (etc) results before passing
20
- # them on to the next task.
21
10
  class Load < Tap::Task
22
11
 
23
- config :match, false, :short => :m, &c.switch # match keys
24
- config :flatten, false, :short => :f, &c.switch # flatten results
25
- config :compact, false, :short => :c, &c.switch # compact results
26
- config :unique, false, :short => :u, &c.switch # uniq results
27
- config :sort, false, :short => :s, &c.switch # sort results
28
- #config :preview, false, :short => :p, &c.switch # logs result
29
-
30
- # Loads the input as YAML and selects objects using keys. Input may
31
- # be an IO, StringIO, or a filepath. If keys are empty, the loaded
32
- # object is returned directly.
33
- #
34
- # ==== Key Selection
35
- # Keys select items from the loaded object using [] (ie obj[key]).
36
- # If match==true, the behavior is different; each string key is
37
- # converted into a Regexp and then arrays select items that match
38
- # key:
39
- #
40
- # results = []
41
- # array.each {|i| results << i if i =~ key}
42
- #
43
- # While hashes select values where the key matches key:
44
- #
45
- # results = []
46
- # hash.each_pair {|k,v| results << v if k =~ key}
47
- #
48
- # Other objects raise an error when match is true.
49
- #
50
- # ==== Post Processing
51
- # After loading/key selection, the results may be processed (in this
52
- # order) using flatten, compact, unique, and sort, each performing as
53
- # you would expect.
54
- #
55
- def process(input, *keys)
56
-
57
- # load the input
58
- obj = case input
12
+ # Loads the input as YAML. Input may be an IO, StringIO, or a filepath.
13
+ # The loaded object is returned directly.
14
+ def process(input)
15
+ case input
59
16
  when StringIO, IO
60
17
  YAML.load(input.read)
61
18
  else
62
19
  log :load, input
63
20
  YAML.load_file(input)
64
21
  end
65
-
66
- # select results by key
67
- results = case
68
- when keys.empty? then obj
69
- when match
70
- regexps = keys.collect {|key| Regexp.new(key.to_s) }
71
- select_matching(obj, regexps)
72
- else
73
- keys.collect do |key|
74
- index = key.kind_of?(String) ? YAML.load(key) : key
75
- obj[index]
76
- end
77
- end
78
-
79
- # post-process results
80
- results = results.flatten if flatten
81
- results = results.compact if compact
82
- results = results.uniq if unique
83
- results = results.sort if sort
84
-
85
- #if preview
86
- # should be a log or something
87
- #puts results.inspect
88
- #end
89
-
90
- results
91
- end
92
-
93
- protected
94
-
95
- # selects items from obj which match one of the regexps.
96
- def select_matching(obj, regexps) # :nodoc:
97
- case obj
98
- when Array
99
- obj.select {|item| regexps.any? {|r| item =~ r} }
100
- when Hash
101
- results = []
102
- obj.each_pair do |key, value|
103
- results << value if regexps.any? {|r| key =~ r}
104
- end
105
- results
106
- else
107
- raise ArgumentError, "cannot match keys from a #{obj.class}"
108
- end
109
22
  end
110
23
  end
111
24
  end
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.0
4
+ version: 0.12.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: 2009-02-17 00:00:00 -07:00
12
+ date: 2009-02-18 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -96,6 +96,7 @@ files:
96
96
  - lib/tap/support/templater.rb
97
97
  - lib/tap/support/versions.rb
98
98
  - lib/tap/task.rb
99
+ - lib/tap/tasks/core_dump.rb
99
100
  - lib/tap/tasks/dump.rb
100
101
  - lib/tap/tasks/load.rb
101
102
  - lib/tap/test.rb