erubi 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
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