tap 0.17.1 → 0.18.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -46,7 +46,7 @@ module Tap
46
46
  open_io(output, overwrite ? 'w' : 'a') do |io|
47
47
  dump(input, io)
48
48
  end
49
- output
49
+ input
50
50
  end
51
51
 
52
52
  # Dumps the object to io, by default dump puts (not prints) obj.to_s.
@@ -22,7 +22,7 @@ module Tap
22
22
  # :startdoc::task-
23
23
  #
24
24
  # Load serves as a baseclass for more complicated loads. A YAML load
25
- # (see {tap-tasks}[http://tap.rubyforge.org/tap-tasks]) looks like this:
25
+ # could look like this:
26
26
  #
27
27
  # class Yaml < Tap::Tasks::Load
28
28
  # def load(io)
@@ -30,10 +30,9 @@ module Tap
30
30
  # end
31
31
  # end
32
32
  #
33
- # Load is constructed to reque itself in cases where objects are to
34
- # be loaded sequentially from the same io. Load will reque until the
35
- # end-of-file is reached, but this behavior can be modified by
36
- # overriding the complete? method. An example is a prompt task:
33
+ # Load subclasses may be constructed to reque itself in cases where objects
34
+ # are sequentially loaded from the same io. Load will reque until the
35
+ # complete? method returns true. An example is a prompt task:
37
36
  #
38
37
  # class Prompt < Tap::Tasks::Load
39
38
  # config :exit_seq, "\n"
@@ -87,7 +86,7 @@ module Tap
87
86
  # * Returning all other objects
88
87
  #
89
88
  def open(io)
90
- return File.open(io) if file
89
+ return(io.kind_of?(File) ? io : File.open(io)) if file
91
90
 
92
91
  case io
93
92
  when String
@@ -110,10 +109,10 @@ module Tap
110
109
  io.close
111
110
  end
112
111
 
113
- # Returns io.eof? Override in subclasses for the desired behavior
114
- # (see process).
112
+ # Returns true by default. Override in subclasses to allow recurrent
113
+ # loading (see process).
115
114
  def complete?(io, last)
116
- io.eof?
115
+ true
117
116
  end
118
117
  end
119
118
  end
@@ -0,0 +1,203 @@
1
+ require 'ostruct'
2
+ autoload(:ERB, 'erb')
3
+ autoload(:YAML, 'yaml')
4
+
5
+ module Tap
6
+ # Templater is a convenience class for creating ERB templates. As
7
+ # a subclass of OpenStruct, attributes can be assigned/unassigned
8
+ # directly. When the template is built, all the method of
9
+ # Templater (and hence all the assigned attributes) are available.
10
+ #
11
+ # t = Templater.new( "key: <%= value %>")
12
+ # t.value = "default"
13
+ # t.build # => "key: default"
14
+ #
15
+ # t.value = "another"
16
+ # t.build # => "key: another"
17
+ #
18
+ # Templater includes the Templater::Utils utility methods.
19
+ #
20
+ # === ERB Redirection
21
+ #
22
+ # Templater hooks into the ERB templating mechanism by providing itself
23
+ # as the ERB output target (_erbout). ERB concatenates each line of an
24
+ # ERB template to _erbout, as can be seen here:
25
+ #
26
+ # e = ERB.new("<%= 1 + 2 %>")
27
+ # e.src # => "_erbout = ''; _erbout.concat(( 1 + 2 ).to_s); _erbout"
28
+ #
29
+ # By setting itself as _erbout, instances of Templater can redirect
30
+ # output to a temporary target and perform string transformations.
31
+ # For example, redirection allows indentation of nested content:
32
+ #
33
+ # template = %Q{
34
+ # # Un-nested content
35
+ # <% redirect do |target| %>
36
+ # # Nested content
37
+ # <% module_nest("Nesting::Module") { target } %>
38
+ # <% end %>
39
+ # }
40
+ #
41
+ # t = Templater.new(template)
42
+ # t.build
43
+ # # => %Q{
44
+ # # # Un-nested content
45
+ # # module Nesting
46
+ # # module Module
47
+ # # # Nested content
48
+ # #
49
+ # # end
50
+ # # end}
51
+ #
52
+ class Templater < OpenStruct
53
+
54
+ # Utility methods for Templater; mostly string manipulations
55
+ # useful in creating documentation.
56
+ module Utils
57
+
58
+ # yamlize converts the object to YAML (using to_yaml), omitting
59
+ # the header and final newline:
60
+ #
61
+ # {'key' => 'value'}.to_yaml # => "--- \nkey: value\n"
62
+ # yamlize {'key' => 'value'} # => "key: value"
63
+ def yamlize(object)
64
+ object == nil ? "~" : YAML.dump(object)[4...-1].strip
65
+ end
66
+
67
+ # Comments out the string.
68
+ def comment(str)
69
+ str.split("\n").collect {|line| "# #{line}" }.join("\n")
70
+ end
71
+
72
+ # Nest the return of the block in the nesting lines.
73
+ #
74
+ # nest([["\nmodule Some", "end\n"],["module Nested", "end"]]) { "class Const\nend" }
75
+ # # => %Q{
76
+ # # module Some
77
+ # # module Nested
78
+ # # class Const
79
+ # # end
80
+ # # end
81
+ # # end
82
+ # # }
83
+ #
84
+ def nest(nesting, indent=" ", line_sep="\n")
85
+ content = yield
86
+ return content if nesting.empty?
87
+
88
+ depth = nesting.length
89
+ lines = [indent * depth + content.gsub(/#{line_sep}/, line_sep + indent * depth)]
90
+
91
+ nesting.reverse_each do |(start_line, end_line)|
92
+ depth -= 1
93
+ lines.unshift(indent * depth + start_line)
94
+ lines << (indent * depth + end_line)
95
+ end
96
+
97
+ lines.join(line_sep)
98
+ end
99
+
100
+ # Nest the return of the block in the nesting module.
101
+ #
102
+ # module_nest('Some::Nested') { "class Const\nend" }
103
+ # # => %Q{
104
+ # # module Some
105
+ # # module Nested
106
+ # # class Const
107
+ # # end
108
+ # # end
109
+ # # end
110
+ # # }.strip
111
+ #
112
+ def module_nest(const_name, indent=" ", line_sep="\n")
113
+ nesting = const_name.split(/::/).collect do |name|
114
+ ["module #{name}", "end"]
115
+ end
116
+
117
+ nest(nesting, indent, line_sep) { yield }
118
+ end
119
+ end
120
+
121
+ class << self
122
+
123
+ # Builds the erb template with the specified attributes.
124
+ def build(template, attributes={}, filename=nil)
125
+ new(template, attributes, filename).build
126
+ end
127
+ end
128
+
129
+ include Utils
130
+
131
+ # Initialized a new Templater. An ERB or String may be provided as the
132
+ # template. If a String is provided, it will be used to initialize an
133
+ # ERB with a trim_mode of "<>".
134
+ def initialize(template, attributes={})
135
+ @template = case template
136
+ when ERB
137
+ # matching w/wo the coding effectively checks @src
138
+ # across ruby versions (encoding appears in 1.9)
139
+ if template.instance_variable_get(:@src) !~ /^(#coding:US-ASCII\n)?_erbout =/
140
+ raise ArgumentError, "Templater does not work with ERB templates where eoutvar != '_erbout'"
141
+ end
142
+ template
143
+ when String then ERB.new(template, nil, "<>")
144
+ else raise ArgumentError, "cannot convert #{template.class} into an ERB template"
145
+ end
146
+
147
+ src = @template.instance_variable_get(:@src)
148
+ @template.instance_variable_set(:@src, "self." + src)
149
+
150
+ super(attributes)
151
+ end
152
+
153
+ # Returns self (not the underlying erbout storage that actually receives
154
+ # the output lines). In the ERB context, this method directs erb outputs
155
+ # to Templater#concat and into the redirect mechanism.
156
+ def _erbout
157
+ self
158
+ end
159
+
160
+ # Sets the underlying erbout storage to input.
161
+ def _erbout=(input)
162
+ @_erbout = input
163
+ end
164
+
165
+ unless RUBY_VERSION < "1.9"
166
+ #-- TODO
167
+ # check if this is still needed...
168
+ def force_encoding(encoding)
169
+ @_erbout.force_encoding(encoding)
170
+ @_erbout
171
+ end
172
+ end
173
+
174
+ # Redirects output of erb to the redirected_erbout string
175
+ # for the duration of the block. When redirect completes,
176
+ # the redirected_erbout is concatenated to the main
177
+ # erbout storage.
178
+ def redirect # :yields: redirected_erbout
179
+ current = @_erbout
180
+ @_erbout = ""
181
+ result = yield(@_erbout)
182
+ @_erbout = current
183
+ concat(result)
184
+ end
185
+
186
+ # Concatenates the specified input to the underlying erbout storage.
187
+ def concat(input)
188
+ @_erbout << input
189
+ end
190
+
191
+ # Build the template, setting the attributes and filename if specified.
192
+ # All methods of self will be accessible in the template.
193
+ def build(attrs=nil, filename=nil)
194
+ attrs.each_pair do |key, value|
195
+ send("#{key}=", value)
196
+ end if attrs
197
+
198
+ @template.filename = filename
199
+ @template.result(binding)
200
+ @_erbout
201
+ end
202
+ end
203
+ end
@@ -1,7 +1,7 @@
1
1
  module Tap
2
2
  MAJOR = 0
3
- MINOR = 17
4
- TINY = 1
3
+ MINOR = 18
4
+ TINY = 0
5
5
 
6
6
  VERSION="#{MAJOR}.#{MINOR}.#{TINY}"
7
7
  WEBSITE="http://tap.rubyforge.org"
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.17.1
4
+ version: 0.18.0
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-06-06 00:00:00 -06:00
12
+ date: 2009-06-17 00:00:00 -06:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -46,7 +46,7 @@ files:
46
46
  - lib/tap/app/queue.rb
47
47
  - lib/tap/app/stack.rb
48
48
  - lib/tap/app/state.rb
49
- - lib/tap/constants.rb
49
+ - lib/tap/version.rb
50
50
  - lib/tap/tasks/dump.rb
51
51
  - lib/tap/env.rb
52
52
  - lib/tap/env/constant.rb
@@ -59,6 +59,7 @@ files:
59
59
  - lib/tap/joins.rb
60
60
  - lib/tap/joins/switch.rb
61
61
  - lib/tap/joins/sync.rb
62
+ - lib/tap/middleware.rb
62
63
  - lib/tap/tasks/load.rb
63
64
  - lib/tap/root.rb
64
65
  - lib/tap/root/utils.rb
@@ -66,8 +67,8 @@ files:
66
67
  - lib/tap/schema.rb
67
68
  - lib/tap/schema/parser.rb
68
69
  - lib/tap/schema/utils.rb
69
- - lib/tap/support/intern.rb
70
- - lib/tap/support/templater.rb
70
+ - lib/tap/intern.rb
71
+ - lib/tap/templater.rb
71
72
  - lib/tap/task.rb
72
73
  - README
73
74
  - MIT-LICENSE
@@ -1,53 +0,0 @@
1
- module Tap
2
- module Support
3
-
4
- # Generates an Intern module to override the specified method_name. Intern
5
- # modules are useful to override a tiny bit of functionality without having
6
- # to generate a full subclass.
7
- #
8
- # An Intern module:
9
- #
10
- # - adds an accessor for <method_name>_block
11
- # - overrides <method_name> to call the block, prepending self to
12
- # the input arguments
13
- #
14
- # For example:
15
- #
16
- # array = [1,2,3].extend Intern(:last)
17
- #
18
- # array.last # => 3
19
- # array.last_block = lambda {|arr| arr.first }
20
- # array.last # => 3
21
- #
22
- def self.Intern(method_name)
23
- mod = INTERN_MODULES[method_name.to_sym]
24
- return mod unless mod == nil
25
-
26
- mod = INTERN_MODULES[method_name.to_sym] = Module.new
27
- mod.module_eval %Q{
28
- attr_accessor :#{method_name}_block
29
-
30
- def #{method_name}(*inputs)
31
- return super unless #{method_name}_block
32
- inputs.unshift(self)
33
-
34
- arity = #{method_name}_block.arity
35
- n = inputs.length
36
- unless n == arity || (arity < 0 && (-1-n) <= arity)
37
- raise ArgumentError.new("wrong number of arguments (\#{n} for \#{arity})")
38
- end
39
-
40
- #{method_name}_block.call(*inputs)
41
- end
42
- }
43
- mod
44
- end
45
-
46
- # An array of already-declared intern modules,
47
- # keyed by method_name.
48
- INTERN_MODULES = {}
49
-
50
- # An Intern module for :process.
51
- Intern = Support.Intern(:process)
52
- end
53
- end
@@ -1,207 +0,0 @@
1
- require 'ostruct'
2
- autoload(:ERB, 'erb')
3
- autoload(:YAML, 'yaml')
4
-
5
- module Tap
6
- module Support
7
-
8
- # Templater is a convenience class for creating ERB templates. As
9
- # a subclass of OpenStruct, attributes can be assigned/unassigned
10
- # directly. When the template is built, all the method of
11
- # Templater (and hence all the assigned attributes) are available.
12
- #
13
- # t = Templater.new( "key: <%= value %>")
14
- # t.value = "default"
15
- # t.build # => "key: default"
16
- #
17
- # t.value = "another"
18
- # t.build # => "key: another"
19
- #
20
- # Templater includes the Templater::Utils utility methods.
21
- #
22
- # === ERB Redirection
23
- #
24
- # Templater hooks into the ERB templating mechanism by providing itself
25
- # as the ERB output target (_erbout). ERB concatenates each line of an
26
- # ERB template to _erbout, as can be seen here:
27
- #
28
- # e = ERB.new("<%= 1 + 2 %>")
29
- # e.src # => "_erbout = ''; _erbout.concat(( 1 + 2 ).to_s); _erbout"
30
- #
31
- # By setting itself as _erbout, instances of Templater can redirect
32
- # output to a temporary target and perform string transformations.
33
- # For example, redirection allows indentation of nested content:
34
- #
35
- # template = %Q{
36
- # # Un-nested content
37
- # <% redirect do |target| %>
38
- # # Nested content
39
- # <% module_nest("Nesting::Module") { target } %>
40
- # <% end %>
41
- # }
42
- #
43
- # t = Templater.new(template)
44
- # t.build
45
- # # => %Q{
46
- # # # Un-nested content
47
- # # module Nesting
48
- # # module Module
49
- # # # Nested content
50
- # #
51
- # # end
52
- # # end}
53
- #
54
- class Templater < OpenStruct
55
-
56
- # Utility methods for Templater; mostly string manipulations
57
- # useful in creating documentation.
58
- module Utils
59
-
60
- # yamlize converts the object to YAML (using to_yaml), omitting
61
- # the header and final newline:
62
- #
63
- # {'key' => 'value'}.to_yaml # => "--- \nkey: value\n"
64
- # yamlize {'key' => 'value'} # => "key: value"
65
- def yamlize(object)
66
- object == nil ? "~" : YAML.dump(object)[4...-1].strip
67
- end
68
-
69
- # Comments out the string.
70
- def comment(str)
71
- str.split("\n").collect {|line| "# #{line}" }.join("\n")
72
- end
73
-
74
- # Nest the return of the block in the nesting lines.
75
- #
76
- # nest([["\nmodule Some", "end\n"],["module Nested", "end"]]) { "class Const\nend" }
77
- # # => %Q{
78
- # # module Some
79
- # # module Nested
80
- # # class Const
81
- # # end
82
- # # end
83
- # # end
84
- # # }
85
- #
86
- def nest(nesting, indent=" ", line_sep="\n")
87
- content = yield
88
- return content if nesting.empty?
89
-
90
- depth = nesting.length
91
- lines = [indent * depth + content.gsub(/#{line_sep}/, line_sep + indent * depth)]
92
-
93
- nesting.reverse_each do |(start_line, end_line)|
94
- depth -= 1
95
- lines.unshift(indent * depth + start_line)
96
- lines << (indent * depth + end_line)
97
- end
98
-
99
- lines.join(line_sep)
100
- end
101
-
102
- # Nest the return of the block in the nesting module.
103
- #
104
- # module_nest('Some::Nested') { "class Const\nend" }
105
- # # => %Q{
106
- # # module Some
107
- # # module Nested
108
- # # class Const
109
- # # end
110
- # # end
111
- # # end
112
- # # }.strip
113
- #
114
- def module_nest(const_name, indent=" ", line_sep="\n")
115
- nesting = const_name.split(/::/).collect do |name|
116
- ["module #{name}", "end"]
117
- end
118
-
119
- nest(nesting, indent, line_sep) { yield }
120
- end
121
- end
122
-
123
- class << self
124
-
125
- # Builds the erb template with the specified attributes.
126
- def build(template, attributes={}, filename=nil)
127
- new(template, attributes, filename).build
128
- end
129
- end
130
-
131
- include Utils
132
-
133
- # Initialized a new Templater. An ERB or String may be provided as the
134
- # template. If a String is provided, it will be used to initialize an
135
- # ERB with a trim_mode of "<>".
136
- def initialize(template, attributes={})
137
- @template = case template
138
- when ERB
139
- # matching w/wo the coding effectively checks @src
140
- # across ruby versions (encoding appears in 1.9)
141
- if template.instance_variable_get(:@src) !~ /^(#coding:US-ASCII\n)?_erbout =/
142
- raise ArgumentError, "Templater does not work with ERB templates where eoutvar != '_erbout'"
143
- end
144
- template
145
- when String then ERB.new(template, nil, "<>")
146
- else raise ArgumentError, "cannot convert #{template.class} into an ERB template"
147
- end
148
-
149
- src = @template.instance_variable_get(:@src)
150
- @template.instance_variable_set(:@src, "self." + src)
151
-
152
- super(attributes)
153
- end
154
-
155
- # Returns self (not the underlying erbout storage that actually receives
156
- # the output lines). In the ERB context, this method directs erb outputs
157
- # to Templater#concat and into the redirect mechanism.
158
- def _erbout
159
- self
160
- end
161
-
162
- # Sets the underlying erbout storage to input.
163
- def _erbout=(input)
164
- @_erbout = input
165
- end
166
-
167
- unless RUBY_VERSION < "1.9"
168
- #-- TODO
169
- # check if this is still needed...
170
- def force_encoding(encoding)
171
- @_erbout.force_encoding(encoding)
172
- @_erbout
173
- end
174
- end
175
-
176
- # Redirects output of erb to the redirected_erbout string
177
- # for the duration of the block. When redirect completes,
178
- # the redirected_erbout is concatenated to the main
179
- # erbout storage.
180
- def redirect # :yields: redirected_erbout
181
- current = @_erbout
182
- @_erbout = ""
183
- result = yield(@_erbout)
184
- @_erbout = current
185
- concat(result)
186
- end
187
-
188
- # Concatenates the specified input to the underlying erbout storage.
189
- def concat(input)
190
- @_erbout << input
191
- end
192
-
193
- # Build the template. All methods of self will be
194
- # accessible in the template.
195
- def build(attrs={}, filename=nil)
196
- attrs.each_pair do |key, value|
197
- send("#{key}=", value)
198
- end
199
-
200
- @template.filename = filename
201
- @template.result(binding)
202
- @_erbout
203
- end
204
-
205
- end
206
- end
207
- end