erubi 1.0.0 → 1.1.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cefbc9c1251647b1876b855e13cde7e22fe0877b
4
- data.tar.gz: b237d3a6ad613c5f48a1fafa65aa01675fcfb59a
3
+ metadata.gz: ba16a36a1aa6da80b461f49724bf565bbd3245e5
4
+ data.tar.gz: 91c6545b66c34061ed72b00292a1a882cb4b6d45
5
5
  SHA512:
6
- metadata.gz: 18e593606c5c1b881bd52f20a5b9800b5dd058264cc38f609c8251e3be220d8d1a3540066dc7dfffe9143ebfdacc5af6dab7c21e22aaea9ea945dc9ecaaa0b62
7
- data.tar.gz: 13a3fa3d9d49edc442a32f4d4ee41d1262e471dd524b6693af392019d04d4563ff632a3e55c8e01d37fca1650b42ce07335e0abc8dbda243dd17f9d3437bd339
6
+ metadata.gz: 75fb3e6d36720ceefec4de3358b7052de90e6de7bb1d28570878f3bfc38fda5a2696c0c66e0b4159a22fdb5c5c63d95aeed78bbd5b3caeb0fc417a044679bb4d
7
+ data.tar.gz: f7edc95fef95ffce7537ea88ac3a68216c56cb999977b2008da27c50e9577e644776b44d6eda8d18366ee3235d0ee819e6552deb3d354b3ca67308aebe35a6a7
data/CHANGELOG CHANGED
@@ -1,3 +1,23 @@
1
+ === 1.1.0 (2016-11-14)
2
+
3
+ * Add :ensure option to supporting restoring bufvar to original value (jeremyevans)
4
+
5
+ * Don't have tilt support require erb (jeremyevans)
6
+
7
+ * Support :engine_class option in tilt support to override engine class used (jeremyevans)
8
+
9
+ * Support :capture option in tilt support to use Erubi::CaptureEngine (jeremyevans)
10
+
11
+ * Add erubi/capture file containing Erubi::CaptureEngine, allowing <%|= and <%|== for capture (and escaping) blocks in templates (jeremyevans)
12
+
13
+ * Raise ArgumentError if template source code contains indicators matched by regexp but not handled (jeremyevans)
14
+
15
+ * Add :bufval option to support arbitrary buffer values (jeremyevans)
16
+
17
+ * Add :regexp option to specify regexp used for scanning (jeremyevans)
18
+
19
+ * Add :src option to specify initial template source (jeremyevans)
20
+
1
21
  === 1.0.0 (2016-11-10)
2
22
 
3
23
  * Initial Public Release
data/README.rdoc CHANGED
@@ -3,11 +3,12 @@
3
3
  Erubi is a ERB template engine for ruby. It is a simplified fork of Erubis, with
4
4
  the following differences:
5
5
 
6
- * Handles postfix conditionals when using escaping (e.g. <tt><%= foo if bar %><tt>)
6
+ * Handles postfix conditionals when using escaping (e.g. <tt><%= foo if bar %></tt>)
7
7
  * Supports frozen_string_literal: true in templates via :freeze option
8
8
  * Works with ruby's --enable-frozen-string-literal option
9
9
  * Escapes ' (apostrophe) when escaping for better XSS protection
10
- * Has 90% smaller memory footprint
10
+ * Has 90% smaller memory footprint for base engine
11
+ * Has 75% smaller memory footprint for tilt support
11
12
  * Does no monkey patching (Erubis adds a method to Kernel)
12
13
  * Uses an immutable design (all options passed to the constructor, which returns a frozen object)
13
14
  * Has simpler internals (1 file, <100 lines of code)
@@ -18,7 +19,6 @@ It is not designed with Erubis API compatibility in mind, though most Erubis
18
19
  ERB syntax works, with the following exceptions:
19
20
 
20
21
  * No support for <tt><%===</tt> for debug output
21
- * No support for custom patterns
22
22
 
23
23
  = Installation
24
24
 
@@ -30,7 +30,7 @@ Source code is available on GitHub at https://github.com/jeremyevans/erubi
30
30
 
31
31
  = Usage
32
32
 
33
- The expected usage is via tilt, and erubi ships with tilt integration:
33
+ The expected usage is via tilt, and erubi ships with tilt 2 integration:
34
34
 
35
35
  require 'tilt/erubi'
36
36
  Tilt.new("filename.erb").render
@@ -45,6 +45,23 @@ source:
45
45
  require 'erubi'
46
46
  eval(Erubi::Engine.new(File.read('filename.erb')).src)
47
47
 
48
+ == Capturing
49
+
50
+ Erubi does not support capturing block output into the template by default.
51
+ However, it comes with an +erubi/capture+ file that supports capturing
52
+ via <tt><%|=</tt> and <tt><%|==</tt> tags:
53
+
54
+ <%|= form do %>
55
+ <input>
56
+ <% end %>
57
+
58
+ This offers similar functionality to that offered by Rails' <tt><%=</tt>
59
+ tags, but without the corner cases with that approach (which are due to
60
+ attempting to parse ruby code via a regexp). Similar to the <tt><%=</tt>
61
+ and <tt><%==</tt> tags, <tt><%|=</tt> captures by default and
62
+ <tt><%|==</tt> captures and escapes by default, but this can be reversed
63
+ via the +:escape_capture+ or +:escape+ options.
64
+
48
65
  = Reporting Bugs
49
66
 
50
67
  The bug tracker is located at https://github.com/jeremyevans/erubi/issues
data/lib/erubi.rb CHANGED
@@ -2,11 +2,12 @@
2
2
 
3
3
  module Erubi
4
4
  ESCAPE_TABLE = {'&' => '&amp;'.freeze, '<' => '&lt;'.freeze, '>' => '&gt;'.freeze, '"' => '&quot;'.freeze, "'" => '&#039;'.freeze}.freeze
5
- RANGE_FIRST = 0..0
6
5
  RANGE_ALL = 0..-1
7
- RANGE_LAST = -1..-1
8
6
 
9
7
  if RUBY_VERSION >= '1.9'
8
+ RANGE_FIRST = 0
9
+ RANGE_LAST = -1
10
+
10
11
  # Escape the following characters with their HTML/XML
11
12
  # equivalents.
12
13
  def self.h(value)
@@ -14,6 +15,9 @@ module Erubi
14
15
  end
15
16
  else
16
17
  # :nocov:
18
+ RANGE_FIRST = 0..0
19
+ RANGE_LAST = -1..-1
20
+
17
21
  def self.h(value)
18
22
  value.to_s.gsub(/[&<>"']/){|s| ESCAPE_TABLE[s]}
19
23
  end
@@ -31,26 +35,33 @@ module Erubi
31
35
  attr_reader :bufvar
32
36
 
33
37
  # Initialize a new Erubi::Engine. Options:
38
+ # :bufval :: The value to use for the buffer variable, as a string.
34
39
  # :bufvar :: The variable name to use for the buffer variable, as a string.
40
+ # :ensure :: Wrap the template in a begin/ensure block restoring the previous value of bufvar.
35
41
  # :escapefunc :: The function to use for escaping, as a string (default: ::Erubi.h).
36
42
  # :escape :: Whether to make <%= escape by default, and <%== not escape by default.
37
43
  # :escape_html :: Same as :escape, with lower priority.
38
44
  # :filename :: The filename for the template.
39
45
  # :freeze :: Whether to enable frozen string literals in the resulting source code.
40
46
  # :outvar :: Same as bufvar, with lower priority.
41
- # :postable :: the postamble for the template, by default returns the resulting source code.
47
+ # :postamble :: The postamble for the template, by default returns the resulting source code.
42
48
  # :preamble :: The preamble for the template, by default initializes up the buffer variable.
49
+ # :regexp :: The regexp to use for scanning.
50
+ # :src :: The initial value to use for the source code
43
51
  # :trim :: Whether to trim leading and trailing whitespace, true by default.
44
52
  def initialize(input, properties={})
45
53
  escape = properties.fetch(:escape){properties.fetch(:escape_html, false)}
46
54
  trim = properties[:trim] != false
47
55
  @filename = properties[:filename]
48
56
  @bufvar = bufvar = properties[:bufvar] || properties[:outvar] || "_buf"
49
- preamble = properties[:preamble] || "#{bufvar} = String.new;"
57
+ bufval = properties[:bufval] || 'String.new'
58
+ regexp = properties[:regexp] || /<%(={1,2}|-|\#|%)?(.*?)([-=])?%>([ \t]*\r?\n)?/m
59
+ preamble = properties[:preamble] || "#{bufvar} = #{bufval};"
50
60
  postamble = properties[:postamble] || "#{bufvar}.to_s\n"
51
61
 
52
- @src = src = String.new
62
+ @src = src = properties[:src] || String.new
53
63
  src << "# frozen_string_literal: true\n" if properties[:freeze]
64
+ src << "begin; __original_outvar = #{bufvar} if defined?(#{bufvar}); " if properties[:ensure]
54
65
 
55
66
  unless escapefunc = properties[:escapefunc]
56
67
  if escape
@@ -65,12 +76,13 @@ module Erubi
65
76
 
66
77
  pos = 0
67
78
  is_bol = true
68
- input.scan(/<%(={1,2}|-|\#|%)?(.*?)([-=])?%>([ \t]*\r?\n)?/m) do |indicator, code, tailch, rspace|
79
+ input.scan(regexp) do |indicator, code, tailch, rspace|
69
80
  match = Regexp.last_match
70
81
  len = match.begin(0) - pos
71
82
  text = input[pos, len]
72
83
  pos = match.end(0)
73
84
  ch = indicator ? indicator[RANGE_FIRST] : nil
85
+
74
86
  lspace = nil
75
87
 
76
88
  unless ch == '='
@@ -98,7 +110,8 @@ module Erubi
98
110
 
99
111
  is_bol = rspace ? true : false
100
112
  add_text(text) if text && !text.empty?
101
- if ch == '='
113
+ case ch
114
+ when '='
102
115
  rspace = nil if tailch && !tailch.empty?
103
116
  add_text(lspace) if lspace
104
117
  if ((indicator == '=') ^ escape)
@@ -107,7 +120,7 @@ module Erubi
107
120
  src << " #{bufvar} << #{escapefunc}((" << code << '));'
108
121
  end
109
122
  add_text(rspace) if rspace
110
- elsif ch == '#'
123
+ when '#'
111
124
  n = code.count("\n") + (rspace ? 1 : 0)
112
125
  if trim
113
126
  add_code("\n" * n)
@@ -116,9 +129,9 @@ module Erubi
116
129
  add_code("\n" * n)
117
130
  add_text(rspace) if rspace
118
131
  end
119
- elsif ch == '%'
132
+ when '%'
120
133
  add_text("#{lspace}#{prefix||='<%'}#{code}#{tailch}#{postfix||='%>'}#{rspace}")
121
- else
134
+ when nil, '-'
122
135
  if trim
123
136
  add_code("#{lspace}#{code}#{rspace}")
124
137
  else
@@ -126,6 +139,8 @@ module Erubi
126
139
  add_code(code)
127
140
  add_text(rspace) if rspace
128
141
  end
142
+ else
143
+ handle(indicator, code, tailch, rspace, lspace)
129
144
  end
130
145
  end
131
146
  rest = pos == 0 ? input : input[pos..-1]
@@ -133,6 +148,7 @@ module Erubi
133
148
 
134
149
  src << "\n" unless src[RANGE_LAST] == "\n"
135
150
  src << postamble
151
+ src << "; ensure\n #{bufvar} = __original_outvar\nend\n" if properties[:ensure]
136
152
  freeze
137
153
  end
138
154
 
@@ -148,5 +164,10 @@ module Erubi
148
164
  @src << code
149
165
  @src << ';' unless code[RANGE_LAST] == "\n"
150
166
  end
167
+
168
+ # Raise an exception, as the base engine class does not support handling other indicators.
169
+ def handle(indicator, code, tailch, rspace, lspace)
170
+ raise ArgumentError, "Invalid indicator: #{indicator}"
171
+ end
151
172
  end
152
173
  end
@@ -0,0 +1,88 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'erubi'
4
+
5
+ module Erubi
6
+ # A buffer class used for templates that support captures
7
+ class Buffer
8
+ def initialize
9
+ @bufs = [new_buffer]
10
+ end
11
+
12
+ # Return the current buffer
13
+ def buffer
14
+ @bufs.last
15
+ end
16
+
17
+ # Append to the current buffer
18
+ def <<(str)
19
+ buffer << str
20
+ end
21
+
22
+ # Add a new buffer, that future appends will go to.
23
+ def before_append!
24
+ @bufs << new_buffer
25
+ end
26
+
27
+ # Take the current buffer and append it to the previous buffer.
28
+ def append=(_)
29
+ buf = @bufs.pop
30
+ buffer << buf.to_s
31
+ end
32
+
33
+ # Escape the current buffer and append it to the previous buffer,
34
+ def escape=(_)
35
+ buf = @bufs.pop
36
+ buffer << escape(buf.to_s)
37
+ end
38
+
39
+ # Return the current buffer, as a string.
40
+ def to_s
41
+ buffer.to_s
42
+ end
43
+
44
+ private
45
+
46
+ # An object to use for the underlying buffers.
47
+ def new_buffer
48
+ String.new
49
+ end
50
+
51
+ # HTML/XML escape the given string.
52
+ def escape(str)
53
+ ::Erubi.h(str)
54
+ end
55
+ end
56
+
57
+ # An engine class that supports capturing blocks via the <%|= and <%|== tags.
58
+ class CaptureEngine < Engine
59
+ # Initializes the engine. Accepts the same arguments as ::Erubi::Engine, and these
60
+ # additional options:
61
+ # :escape_capture :: Whether to make <%|= escape by default, and <%|== not escape by default,
62
+ # defaults to the same value as :escape.
63
+ def initialize(input, properties={})
64
+ properties = Hash[properties]
65
+ escape = properties.fetch(:escape){properties.fetch(:escape_html, false)}
66
+ @escape_capture = properties.fetch(:escape_capture, escape)
67
+ properties[:regexp] ||= /<%(\|?={1,2}|-|\#|%)?(.*?)([-=])?%>([ \t]*\r?\n)?/m
68
+ properties[:bufval] ||= "::Erubi::Buffer.new"
69
+ super
70
+ end
71
+
72
+ private
73
+
74
+ # Handle the <%|= and <%|== tags
75
+ def handle(indicator, code, tailch, rspace, lspace)
76
+ case indicator
77
+ when '|=', '|=='
78
+ rspace = nil if tailch && !tailch.empty?
79
+ add_text(lspace) if lspace
80
+ meth = ((indicator == '|=') ^ @escape_capture) ? 'append' : 'escape'
81
+ src << " #{@bufvar}.before_append!; #{@bufvar}.#{meth}= " << code
82
+ add_text(rspace) if rspace
83
+ else
84
+ super
85
+ end
86
+ end
87
+ end
88
+ end
data/lib/tilt/erubi.rb CHANGED
@@ -1,32 +1,28 @@
1
1
  require 'tilt'
2
- require 'tilt/erb'
2
+ require 'tilt/template'
3
3
  require 'erubi'
4
4
 
5
5
  module Tilt
6
6
  # Erubi (a simplified version of Erubis) template implementation
7
- class ErubiTemplate < ERBTemplate
7
+ class ErubiTemplate < Template
8
8
  def prepare
9
- @options.merge!(:preamble => false, :postamble => false)
10
- @engine = Erubi::Engine.new(data, @options)
11
- @outvar = @engine.bufvar
12
- @engine
13
- end
9
+ @options.merge!(:preamble => false, :postamble => false, :ensure=>true)
14
10
 
15
- def precompiled_preamble(locals)
16
- [super, "#{@outvar} = _buf = String.new"].join("\n")
17
- end
11
+ engine_class = if @options[:engine_class]
12
+ @options[:engine_class]
13
+ elsif @options[:capture]
14
+ Erubi::CaptureEngine
15
+ else
16
+ Erubi::Engine
17
+ end
18
18
 
19
- def precompiled_postamble(locals)
20
- [@outvar, super].join("\n")
19
+ @engine = engine_class.new(data, @options)
20
+ @outvar = @engine.bufvar
21
+ @engine
21
22
  end
22
23
 
23
- # Erubi doesn't have ERB's line-off-by-one under 1.9 problem.
24
- # Override and adjust back.
25
- if RUBY_VERSION >= '1.9.0'
26
- def precompiled(locals)
27
- source, offset = super
28
- [source, offset - 1]
29
- end
24
+ def precompiled_template(locals)
25
+ @engine.src
30
26
  end
31
27
 
32
28
  Tilt.register self, 'erb', 'rhtml', 'erubi'
data/test/test.rb CHANGED
@@ -22,6 +22,8 @@ if ENV['COVERAGE']
22
22
  end
23
23
 
24
24
  require 'erubi'
25
+ require 'erubi/capture'
26
+ require 'tilt/erubi'
25
27
  require 'minitest/spec'
26
28
  require 'minitest/autorun'
27
29
 
@@ -31,9 +33,21 @@ describe Erubi::Engine do
31
33
  end
32
34
 
33
35
  def check_output(input, src, result, &block)
34
- t = Erubi::Engine.new(input, @options)
35
- t.src.must_equal src
36
+ t = (@options[:engine] || Erubi::Engine).new(input, @options)
36
37
  eval(t.src, block.binding).must_equal result
38
+ t.src.must_equal src
39
+ end
40
+
41
+ def setup_foo
42
+ @foo = Object.new
43
+ @foo.instance_variable_set(:@t, self)
44
+ def self.a; @a; end
45
+ def @foo.bar
46
+ @t.a << "a"
47
+ yield
48
+ @t.a << 'b'
49
+ @t.a.buffer.upcase!
50
+ end
37
51
  end
38
52
 
39
53
  it "should handle no options" do
@@ -79,6 +93,138 @@ END2
79
93
  END3
80
94
  end
81
95
 
96
+ it "should handle ensure option" do
97
+ list = ['&\'<>"2']
98
+ @options[:ensure] = true
99
+ @options[:bufvar] = '@a'
100
+ @a = 'bar'
101
+ check_output(<<END1, <<END2, <<END3){}
102
+ <table>
103
+ <tbody>
104
+ <% i = 0
105
+ list.each_with_index do |item, i| %>
106
+ <tr>
107
+ <td><%= i+1 %></td>
108
+ <td><%== item %></td>
109
+ </tr>
110
+ <% end %>
111
+ </tbody>
112
+ </table>
113
+ <%== i+1 %>
114
+ END1
115
+ begin; __original_outvar = @a if defined?(@a); @a = String.new; @a << '<table>
116
+ <tbody>
117
+ '; i = 0
118
+ list.each_with_index do |item, i|
119
+ @a << ' <tr>
120
+ <td>'; @a << ( i+1 ).to_s; @a << '</td>
121
+ <td>'; @a << ::Erubi.h(( item )); @a << '</td>
122
+ </tr>
123
+ '; end
124
+ @a << ' </tbody>
125
+ </table>
126
+ '; @a << ::Erubi.h(( i+1 )); @a << '
127
+ ';
128
+ @a.to_s
129
+ ; ensure
130
+ @a = __original_outvar
131
+ end
132
+ END2
133
+ <table>
134
+ <tbody>
135
+ <tr>
136
+ <td>1</td>
137
+ <td>&amp;&#039;&lt;&gt;&quot;2</td>
138
+ </tr>
139
+ </tbody>
140
+ </table>
141
+ 1
142
+ END3
143
+ @a.must_equal 'bar'
144
+ end
145
+
146
+ [['', false], ['=', true]].each do |ind, escape|
147
+ it "should allow <%|=#{ind} for capturing without escaping when :escape_capture => #{escape}" do
148
+ @options[:bufvar] = '@a'
149
+ @options[:capture] = true
150
+ @options[:escape_capture] = escape
151
+ @options[:escape] = !escape
152
+ @options[:engine] = ::Erubi::CaptureEngine
153
+ setup_foo
154
+ check_output(<<END1, <<END2, <<END3){}
155
+ <table>
156
+ <tbody>
157
+ <%|=#{ind} @foo.bar do %>
158
+ <tr>
159
+ <td><%=#{ind} 1 %></td>
160
+ <td><%=#{ind} '&' %></td>
161
+ </tr>
162
+ <% end %>
163
+ </tbody>
164
+ </table>
165
+ END1
166
+ #{'__erubi = ::Erubi;' unless escape}@a = ::Erubi::Buffer.new; @a << '<table>
167
+ <tbody>
168
+ '; @a << ' '; @a.before_append!; @a.append= @foo.bar do @a << '
169
+ '; @a << ' <tr>
170
+ <td>'; @a << #{!escape ? '__erubi' : '::Erubi'}.h(( 1 )); @a << '</td>
171
+ <td>'; @a << #{!escape ? '__erubi' : '::Erubi'}.h(( '&' )); @a << '</td>
172
+ </tr>
173
+ '; end
174
+ @a << ' </tbody>
175
+ </table>
176
+ ';
177
+ @a.to_s
178
+ END2
179
+ <table>
180
+ <tbody>
181
+ A
182
+ <TR>
183
+ <TD>1</TD>
184
+ <TD>&AMP;</TD>
185
+ </TR>
186
+ B </tbody>
187
+ </table>
188
+ END3
189
+ end
190
+ end
191
+
192
+ [['', true], ['=', false]].each do |ind, escape|
193
+ it "should allow <%|=#{ind} for capturing with escaping when :escape => #{escape}" do
194
+ @options[:bufvar] = '@a'
195
+ @options[:capture] = true
196
+ @options[:escape] = escape
197
+ @options[:engine] = ::Erubi::CaptureEngine
198
+ setup_foo
199
+ check_output(<<END1, <<END2, <<END3){}
200
+ <table>
201
+ <tbody>
202
+ <%|=#{ind} @foo.bar do %>
203
+ <b><%=#{ind} '&' %></b>
204
+ <% end %>
205
+ </tbody>
206
+ </table>
207
+ END1
208
+ #{'__erubi = ::Erubi;' if escape}@a = ::Erubi::Buffer.new; @a << '<table>
209
+ <tbody>
210
+ '; @a << ' '; @a.before_append!; @a.escape= @foo.bar do @a << '
211
+ '; @a << ' <b>'; @a << #{escape ? '__erubi' : '::Erubi'}.h(( '&' )); @a << '</b>
212
+ '; end
213
+ @a << ' </tbody>
214
+ </table>
215
+ ';
216
+ @a.to_s
217
+ END2
218
+ <table>
219
+ <tbody>
220
+ A
221
+ &lt;B&gt;&amp;AMP;&lt;/B&gt;
222
+ B </tbody>
223
+ </table>
224
+ END3
225
+ end
226
+ end
227
+
82
228
  [:outvar, :bufvar].each do |var|
83
229
  it "should handle :#{var} and :freeze options" do
84
230
  @options[var] = "@_out_buf"
@@ -339,8 +485,12 @@ END3
339
485
  Erubi::Engine.new('').frozen?.must_equal true
340
486
  end
341
487
 
488
+ it "should raise an error if a tag is not handled when a custom regexp is used" do
489
+ proc{Erubi::Engine.new('<%] %>', :regexp =>/<%(={1,2}|\]|-|\#|%)?(.*?)([-=])?%>([ \t]*\r?\n)?/m)}.must_raise ArgumentError
490
+ proc{Erubi::CaptureEngine.new('<%] %>', :regexp =>/<%(={1,2}|\]|-|\#|%)?(.*?)([-=])?%>([ \t]*\r?\n)?/m)}.must_raise ArgumentError
491
+ end
492
+
342
493
  it "should have working tilt support" do
343
- require 'tilt/erubi'
344
494
  @list = ['&\'<>"2']
345
495
  Tilt::ErubiTemplate.new{<<END1}.render(self).must_equal(<<END2)
346
496
  <table>
@@ -365,6 +515,34 @@ END1
365
515
  </tbody>
366
516
  </table>
367
517
  1
518
+ END2
519
+ end
520
+
521
+ it "should have working tilt support for capturing" do
522
+ setup_foo
523
+ Tilt::ErubiTemplate.new(:capture=>true, :outvar=>'@a'){<<END1}.render(self).must_equal(<<END2)
524
+ 1<%|= @foo.bar do %>bar<% end %>2
525
+ END1
526
+ 1ABARB2
527
+ END2
528
+ end
529
+
530
+ it "should have working tilt support for specifying engine class" do
531
+ setup_foo
532
+ @a = 1
533
+ Tilt::ErubiTemplate.new(:engine_class=>Erubi::CaptureEngine, :outvar=>'@a'){<<END1}.render(self).must_equal(<<END2)
534
+ 1<%|= @foo.bar do %>bar<% end %>2
535
+ END1
536
+ 1ABARB2
537
+ END2
538
+ @a.must_equal 1
539
+ end
540
+
541
+ it "should have working tilt support for locals" do
542
+ Tilt::ErubiTemplate.new{<<END1}.render(self, :b=>3).must_equal(<<END2)
543
+ <%= b %>
544
+ END1
545
+ 3
368
546
  END2
369
547
  end
370
548
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: erubi
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Evans
@@ -9,8 +9,36 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-11-10 00:00:00.000000000 Z
13
- dependencies: []
12
+ date: 2016-11-14 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: tilt
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '2'
21
+ type: :development
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: '2'
28
+ - !ruby/object:Gem::Dependency
29
+ name: minitest
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
14
42
  description: Erubi is a ERB template engine for ruby. It is a simplified fork of Erubis
15
43
  email: code@jeremyevans.net
16
44
  executables: []
@@ -25,6 +53,7 @@ files:
25
53
  - README.rdoc
26
54
  - Rakefile
27
55
  - lib/erubi.rb
56
+ - lib/erubi/capture.rb
28
57
  - lib/tilt/erubi.rb
29
58
  - test/test.rb
30
59
  homepage: https://github.com/jeremyevans/erubi