erubis 2.3.1 → 2.7.0
Sign up to get free protection for your applications and to get access to all the features.
- data/{CHANGES → CHANGES.txt} +373 -3
- data/MIT-LICENSE +1 -1
- data/README.txt +6 -5
- data/benchmark/bench.rb +18 -11
- data/bin/erubis +3 -4
- data/contrib/erubis +3462 -5
- data/contrib/inline-require +54 -28
- data/doc/docstyle.css +25 -4
- data/doc/users-guide.html +814 -110
- data/doc-api/classes/ActionView/TemplateHandlers/ErubisHandler.html +209 -0
- data/doc-api/classes/ActionView.html +105 -0
- data/doc-api/classes/Erubis/ArrayBufferEnhancer.html +14 -14
- data/doc-api/classes/Erubis/ArrayEnhancer.html +16 -16
- data/doc-api/classes/Erubis/Basic/Converter.html +36 -31
- data/doc-api/classes/Erubis/BiPatternEnhancer.html +16 -13
- data/doc-api/classes/Erubis/CGenerator.html +70 -70
- data/doc-api/classes/Erubis/Context.html +49 -49
- data/doc-api/classes/Erubis/Converter.html +30 -29
- data/doc-api/classes/Erubis/CppGenerator.html +382 -0
- data/doc-api/classes/Erubis/DeleteIndentEnhancer.html +7 -7
- data/doc-api/classes/Erubis/Ecpp.html +126 -0
- data/doc-api/classes/Erubis/Engine.html +46 -43
- data/doc-api/classes/Erubis/ErboutEnhancer.html +16 -16
- data/doc-api/classes/Erubis/EscapeEnhancer.html +7 -7
- data/doc-api/classes/Erubis/EscapedEcpp.html +120 -0
- data/doc-api/classes/Erubis/Evaluator.html +22 -22
- data/doc-api/classes/Erubis/Generator.html +70 -70
- data/doc-api/classes/Erubis/HeaderFooterEnhancer.html +18 -15
- data/doc-api/classes/Erubis/Helpers/RailsFormHelper.html +787 -0
- data/doc-api/classes/Erubis/Helpers/RailsHelper/TemplateConverter.html +213 -0
- data/doc-api/classes/Erubis/Helpers/RailsHelper.html +103 -54
- data/doc-api/classes/Erubis/Helpers.html +6 -1
- data/doc-api/classes/Erubis/InterpolationEnhancer.html +42 -41
- data/doc-api/classes/Erubis/JavaGenerator.html +69 -69
- data/doc-api/classes/Erubis/JavascriptGenerator.html +79 -74
- data/doc-api/classes/Erubis/Main.html +49 -48
- data/doc-api/classes/Erubis/NoCodeEnhancer.html +35 -35
- data/doc-api/classes/Erubis/NoTextEnhancer.html +7 -7
- data/doc-api/classes/Erubis/OptimizedEruby.html +7 -7
- data/doc-api/classes/Erubis/OptimizedGenerator.html +84 -84
- data/doc-api/classes/Erubis/OptimizedXmlEruby.html +7 -7
- data/doc-api/classes/Erubis/PI/Converter.html +23 -22
- data/doc-api/classes/Erubis/PI/Ec.html +7 -7
- data/doc-api/classes/Erubis/PI/Ecpp.html +166 -0
- data/doc-api/classes/Erubis/PI/Ejava.html +7 -7
- data/doc-api/classes/Erubis/PI/Ejavascript.html +7 -7
- data/doc-api/classes/Erubis/PI/Eperl.html +7 -7
- data/doc-api/classes/Erubis/PI/Ephp.html +7 -7
- data/doc-api/classes/Erubis/PI/Eruby.html +6 -6
- data/doc-api/classes/Erubis/PI/Escheme.html +7 -7
- data/doc-api/classes/Erubis/PI/TinyEruby.html +28 -27
- data/doc-api/classes/Erubis/PI.html +1 -0
- data/doc-api/classes/Erubis/PercentLineEnhancer.html +18 -29
- data/doc-api/classes/Erubis/PerlGenerator.html +63 -63
- data/doc-api/classes/Erubis/PhpGenerator.html +63 -63
- data/doc-api/classes/Erubis/PrefixedLineEnhancer.html +210 -0
- data/doc-api/classes/Erubis/PrefixedLineEruby.html +120 -0
- data/doc-api/classes/Erubis/PreprocessingEruby.html +183 -0
- data/doc-api/classes/Erubis/PreprocessingHelper.html +212 -0
- data/doc-api/classes/Erubis/PrintEnabledEnhancer.html +23 -23
- data/doc-api/classes/Erubis/PrintOutEnhancer.html +38 -38
- data/doc-api/classes/Erubis/RubyEvaluator.html +59 -22
- data/doc-api/classes/Erubis/RubyGenerator.html +53 -52
- data/doc-api/classes/Erubis/SchemeGenerator.html +70 -70
- data/doc-api/classes/Erubis/SimplifyEnhancer.html +10 -9
- data/doc-api/classes/Erubis/StdoutEnhancer.html +3 -3
- data/doc-api/classes/Erubis/StringBufferEnhancer.html +16 -16
- data/doc-api/classes/Erubis/TinyEruby.html +33 -33
- data/doc-api/classes/Erubis/XmlHelper.html +80 -15
- data/doc-api/classes/Erubis.html +25 -1
- data/doc-api/classes/Kernel.html +155 -0
- data/doc-api/created.rid +1 -1
- data/doc-api/files/README_txt.html +8 -8
- data/doc-api/files/erubis/context_rb.html +2 -2
- data/doc-api/files/erubis/converter_rb.html +3 -3
- data/doc-api/files/erubis/engine/ec_rb.html +2 -2
- data/doc-api/files/erubis/engine/ecpp_rb.html +115 -0
- data/doc-api/files/erubis/engine/ejava_rb.html +2 -2
- data/doc-api/files/erubis/engine/ejavascript_rb.html +2 -2
- data/doc-api/files/erubis/engine/enhanced_rb.html +2 -2
- data/doc-api/files/erubis/engine/eperl_rb.html +2 -2
- data/doc-api/files/erubis/engine/ephp_rb.html +2 -2
- data/doc-api/files/erubis/engine/eruby_rb.html +2 -2
- data/doc-api/files/erubis/engine/escheme_rb.html +2 -2
- data/doc-api/files/erubis/engine/optimized_rb.html +2 -2
- data/doc-api/files/erubis/engine_rb.html +2 -2
- data/doc-api/files/erubis/enhancer_rb.html +2 -2
- data/doc-api/files/erubis/error_rb.html +2 -2
- data/doc-api/files/erubis/evaluator_rb.html +2 -2
- data/doc-api/files/erubis/generator_rb.html +3 -3
- data/doc-api/files/erubis/helper_rb.html +2 -2
- data/doc-api/files/erubis/helpers/rails_form_helper_rb.html +107 -0
- data/doc-api/files/erubis/helpers/rails_helper_rb.html +3 -2
- data/doc-api/files/erubis/local-setting_rb.html +2 -2
- data/doc-api/files/erubis/main_rb.html +4 -2
- data/doc-api/files/erubis/preprocessing_rb.html +114 -0
- data/doc-api/files/erubis/tiny_rb.html +2 -2
- data/doc-api/files/erubis/util_rb.html +107 -0
- data/doc-api/files/erubis_rb.html +2 -2
- data/doc-api/fr_class_index.html +13 -0
- data/doc-api/fr_file_index.html +4 -0
- data/doc-api/fr_method_index.html +237 -179
- data/examples/basic/Makefile +7 -2
- data/examples/basic/example.ecpp +33 -0
- data/lib/erubis/context.rb +2 -3
- data/lib/erubis/converter.rb +17 -11
- data/lib/erubis/engine/ec.rb +2 -3
- data/lib/erubis/engine/ecpp.rb +113 -0
- data/lib/erubis/engine/ejava.rb +9 -10
- data/lib/erubis/engine/ejavascript.rb +14 -9
- data/lib/erubis/engine/enhanced.rb +7 -3
- data/lib/erubis/engine/eperl.rb +2 -3
- data/lib/erubis/engine/ephp.rb +2 -3
- data/lib/erubis/engine/eruby.rb +8 -8
- data/lib/erubis/engine/escheme.rb +2 -3
- data/lib/erubis/engine/optimized.rb +2 -3
- data/lib/erubis/engine.rb +13 -11
- data/lib/erubis/enhancer.rb +101 -34
- data/lib/erubis/error.rb +2 -3
- data/lib/erubis/evaluator.rb +27 -10
- data/lib/erubis/generator.rb +3 -4
- data/lib/erubis/helper.rb +14 -3
- data/lib/erubis/helpers/rails_form_helper.rb +197 -0
- data/lib/erubis/helpers/rails_helper.rb +219 -77
- data/lib/erubis/local-setting.rb +2 -3
- data/lib/erubis/main.rb +85 -60
- data/lib/erubis/preprocessing.rb +58 -0
- data/lib/erubis/tiny.rb +9 -9
- data/lib/erubis/util.rb +22 -0
- data/lib/erubis.rb +4 -4
- data/test/assert-text-equal.rb +2 -3
- data/test/data/users-guide/bufvar-example.rb +10 -0
- data/test/data/users-guide/bufvar-example.result +17 -0
- data/test/data/users-guide/def_method.rb +14 -0
- data/test/data/users-guide/def_method.result +3 -0
- data/test/data/users-guide/example.ecpp +30 -0
- data/test/data/users-guide/example1.rb +1 -0
- data/test/data/users-guide/example_c.result +22 -19
- data/test/data/users-guide/fasteruby-example.rb +8 -0
- data/test/data/users-guide/fasteruby-example.result +18 -0
- data/test/data/users-guide/main_program1.rb +8 -0
- data/test/data/users-guide/main_program1.result +6 -0
- data/test/data/users-guide/main_program2.rb +8 -0
- data/test/data/users-guide/main_program2.result +6 -0
- data/test/data/users-guide/percentline-example.rhtml +3 -1
- data/test/data/users-guide/percentline_example.result +5 -3
- data/test/data/users-guide/prefixedline-example.rb +9 -0
- data/test/data/users-guide/prefixedline-example.rhtml +6 -0
- data/test/data/users-guide/prefixedline_example.result +9 -0
- data/test/data/users-guide/tail_260.result +4 -0
- data/test/data/users-guide/tailnewline.rhtml +3 -0
- data/test/data/users-guide/template1.rhtml +4 -0
- data/test/data/users-guide/template2.rhtml +4 -0
- data/test/test-engines.rb +88 -5
- data/test/test-enhancers.rb +83 -6
- data/test/test-erubis.rb +115 -11
- data/test/test-index-cgi.rb +191 -0
- data/test/test-main.rb +143 -31
- data/test/test-users-guide.rb +20 -3
- data/test/test.rb +18 -3
- data/test/testutil.rb +44 -8
- metadata +104 -67
- data/contrib/action_view_base_rb.patch +0 -23
@@ -1,7 +1,9 @@
|
|
1
1
|
$ erubis -xE PercentLine percentline-example.rhtml
|
2
|
-
_buf = '';
|
3
|
-
|
2
|
+
_buf = ''; _buf << '<ul>
|
3
|
+
'; for item in list
|
4
|
+
_buf << ' <li>'; _buf << ( item ).to_s; _buf << '</li>
|
4
5
|
'; end
|
5
|
-
_buf << '
|
6
|
+
_buf << '</ul>
|
7
|
+
% lines with \'%%\'
|
6
8
|
';
|
7
9
|
_buf.to_s
|
data/test/test-engines.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
##
|
2
|
-
## $
|
3
|
-
##
|
4
|
-
## copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
|
2
|
+
## $Release: 2.7.0 $
|
3
|
+
## copyright(c) 2006-2011 kuwata-lab.com all rights reserved.
|
5
4
|
##
|
6
5
|
|
7
6
|
require "#{File.dirname(__FILE__)}/test.rb"
|
@@ -10,6 +9,7 @@ require 'erubis'
|
|
10
9
|
require 'erubis/engine/eruby'
|
11
10
|
require 'erubis/engine/ephp'
|
12
11
|
require 'erubis/engine/ec'
|
12
|
+
require 'erubis/engine/ecpp'
|
13
13
|
require 'erubis/engine/ejava'
|
14
14
|
require 'erubis/engine/escheme'
|
15
15
|
require 'erubis/engine/eperl'
|
@@ -29,6 +29,9 @@ class EnginesTest < Test::Unit::TestCase
|
|
29
29
|
assert_text_equal(@expected, actual)
|
30
30
|
end
|
31
31
|
|
32
|
+
|
33
|
+
self.post_definition()
|
34
|
+
|
32
35
|
end
|
33
36
|
|
34
37
|
__END__
|
@@ -65,6 +68,31 @@ __END__
|
|
65
68
|
';
|
66
69
|
_buf.to_s
|
67
70
|
##
|
71
|
+
- name: ruby2_options
|
72
|
+
lang: ruby
|
73
|
+
class: Eruby
|
74
|
+
options: { :bufvar: '@_out_buf' }
|
75
|
+
input: |
|
76
|
+
<table>
|
77
|
+
<% for item in @items %>
|
78
|
+
<tr>
|
79
|
+
<td><%= i+1 %></td>
|
80
|
+
<td><%== list %></td>
|
81
|
+
</tr>
|
82
|
+
<% end %>
|
83
|
+
</table>
|
84
|
+
expected: |
|
85
|
+
@_out_buf = ''; @_out_buf << '<table>
|
86
|
+
'; for item in @items
|
87
|
+
@_out_buf << ' <tr>
|
88
|
+
<td>'; @_out_buf << ( i+1 ).to_s; @_out_buf << '</td>
|
89
|
+
<td>'; @_out_buf << Erubis::XmlHelper.escape_xml( list ); @_out_buf << '</td>
|
90
|
+
</tr>
|
91
|
+
'; end
|
92
|
+
@_out_buf << '</table>
|
93
|
+
';
|
94
|
+
@_out_buf.to_s
|
95
|
+
##
|
68
96
|
- name: php1
|
69
97
|
lang: php
|
70
98
|
class: Ephp
|
@@ -136,6 +164,36 @@ __END__
|
|
136
164
|
"</table>\n", stdout);
|
137
165
|
fprintf(stderr, "*** debug: i=" "%d", i); fputs("\n", stdout);
|
138
166
|
##
|
167
|
+
- name: cpp1
|
168
|
+
lang: cpp
|
169
|
+
class: Ecpp
|
170
|
+
options: { :filename: foo.html, :indent: ' ' }
|
171
|
+
input: |4
|
172
|
+
<table>
|
173
|
+
<tbody>
|
174
|
+
<% for (i = 0; i < n; i++) { %>
|
175
|
+
<tr>
|
176
|
+
<td><%= i %></td>
|
177
|
+
<td><%== list[i] %></td>
|
178
|
+
</tr>
|
179
|
+
<% } %>
|
180
|
+
</tbody>
|
181
|
+
</table>
|
182
|
+
<%=== i %>
|
183
|
+
expected: |
|
184
|
+
#line 1 "foo.html"
|
185
|
+
_buf << "<table>\n"
|
186
|
+
" <tbody>\n";
|
187
|
+
for (i = 0; i < n; i++) {
|
188
|
+
_buf << " <tr>\n"
|
189
|
+
" <td>"; _buf << (i); _buf << "</td>\n"
|
190
|
+
" <td>"; escape(list[i]); _buf << "</td>\n"
|
191
|
+
" </tr>\n";
|
192
|
+
}
|
193
|
+
_buf << " </tbody>\n"
|
194
|
+
"</table>\n";
|
195
|
+
std::cerr << "*** debug: i=" << (i); _buf << "\n";
|
196
|
+
##
|
139
197
|
- name: java1
|
140
198
|
lang: java
|
141
199
|
class: Ejava
|
@@ -298,11 +356,11 @@ __END__
|
|
298
356
|
'); print('*** debug: $i=', $i, "\n");print('
|
299
357
|
');
|
300
358
|
##
|
301
|
-
- name:
|
359
|
+
- name: javascript1
|
302
360
|
lang: javascript
|
303
361
|
class: Ejavascript
|
304
362
|
options:
|
305
|
-
input: |
|
363
|
+
input: &javascript_input |
|
306
364
|
<%
|
307
365
|
var user = 'Erubis';
|
308
366
|
var list = ['<aaa>', 'b&b', '"ccc"'];
|
@@ -340,3 +398,28 @@ __END__
|
|
340
398
|
alert("*** debug: i="+(i)); _buf.push("\n");
|
341
399
|
document.write(_buf.join(""));
|
342
400
|
##
|
401
|
+
- name: javascript2
|
402
|
+
lang: javascript
|
403
|
+
class: Ejavascript
|
404
|
+
options: { :docwrite: false }
|
405
|
+
input: *javascript_input
|
406
|
+
expected: |4
|
407
|
+
var _buf = [];
|
408
|
+
var user = 'Erubis';
|
409
|
+
var list = ['<aaa>', 'b&b', '"ccc"'];
|
410
|
+
|
411
|
+
_buf.push("<p>Hello "); _buf.push(user); _buf.push("!</p>\n\
|
412
|
+
<table>\n\
|
413
|
+
<tbody>\n");
|
414
|
+
var i;
|
415
|
+
for (i = 0; i < list.length; i++) {
|
416
|
+
_buf.push(" <tr bgcolor="); _buf.push(++i % 2 == 0 ? '#FFCCCC' : '#CCCCFF'); _buf.push("\">\n\
|
417
|
+
<td>"); _buf.push(i); _buf.push("</td>\n\
|
418
|
+
<td>"); _buf.push(list[i]); _buf.push("</td>\n\
|
419
|
+
</tr>\n");
|
420
|
+
}
|
421
|
+
_buf.push(" </tbody>\n\
|
422
|
+
</table>\n");
|
423
|
+
alert("*** debug: i="+(i)); _buf.push("\n");
|
424
|
+
_buf.join("");
|
425
|
+
##
|
data/test/test-enhancers.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
##
|
2
|
-
## $
|
3
|
-
##
|
4
|
-
## copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
|
2
|
+
## $Release: 2.7.0 $
|
3
|
+
## copyright(c) 2006-2011 kuwata-lab.com all rights reserved.
|
5
4
|
##
|
6
5
|
|
7
6
|
require "#{File.dirname(__FILE__)}/test.rb"
|
@@ -98,6 +97,8 @@ class EnhancersTest < Test::Unit::TestCase
|
|
98
97
|
end
|
99
98
|
|
100
99
|
|
100
|
+
self.post_definition()
|
101
|
+
|
101
102
|
end
|
102
103
|
|
103
104
|
__END__
|
@@ -471,8 +472,8 @@ __END__
|
|
471
472
|
'; end
|
472
473
|
_buf << '</table>
|
473
474
|
<pre>
|
474
|
-
|
475
|
-
|
475
|
+
% double percent
|
476
|
+
% spaced percent
|
476
477
|
</pre>
|
477
478
|
';
|
478
479
|
_buf.to_s
|
@@ -496,6 +497,55 @@ __END__
|
|
496
497
|
% spaced percent
|
497
498
|
</pre>
|
498
499
|
|
500
|
+
##
|
501
|
+
- name: prefixedline1
|
502
|
+
class: PrefixedLineEruby
|
503
|
+
options: { :prefixchar: '!' }
|
504
|
+
input: |
|
505
|
+
<table>
|
506
|
+
! for item in list
|
507
|
+
<tr>
|
508
|
+
<td><%= item %></td>
|
509
|
+
<td><%== item %></td>
|
510
|
+
</tr>
|
511
|
+
! end
|
512
|
+
</table>
|
513
|
+
<pre>
|
514
|
+
!! doubled characters
|
515
|
+
</pre>
|
516
|
+
src: |
|
517
|
+
_buf = ''; _buf << '<table>
|
518
|
+
'; for item in list
|
519
|
+
_buf << ' <tr>
|
520
|
+
<td>'; _buf << ( item ).to_s; _buf << '</td>
|
521
|
+
<td>'; _buf << Erubis::XmlHelper.escape_xml( item ); _buf << '</td>
|
522
|
+
</tr>
|
523
|
+
'; end
|
524
|
+
_buf << '</table>
|
525
|
+
<pre>
|
526
|
+
! doubled characters
|
527
|
+
</pre>
|
528
|
+
';
|
529
|
+
_buf.to_s
|
530
|
+
output: |
|
531
|
+
<table>
|
532
|
+
<tr>
|
533
|
+
<td><aaa></td>
|
534
|
+
<td><aaa></td>
|
535
|
+
</tr>
|
536
|
+
<tr>
|
537
|
+
<td>b&b</td>
|
538
|
+
<td>b&b</td>
|
539
|
+
</tr>
|
540
|
+
<tr>
|
541
|
+
<td>"ccc"</td>
|
542
|
+
<td>"ccc"</td>
|
543
|
+
</tr>
|
544
|
+
</table>
|
545
|
+
<pre>
|
546
|
+
! doubled characters
|
547
|
+
</pre>
|
548
|
+
|
499
549
|
##
|
500
550
|
- name: headerfooter1
|
501
551
|
class: HeaderFooterEruby
|
@@ -566,4 +616,31 @@ __END__
|
|
566
616
|
_buf.to_s
|
567
617
|
output: *basic1_output
|
568
618
|
|
569
|
-
|
619
|
+
- name: interpolation2
|
620
|
+
desc: sharp, back-quote, and backslash should be escaped, but other quotes should not be escaped (reported by andrewj)
|
621
|
+
class: InterpolationEruby
|
622
|
+
options:
|
623
|
+
testopt:
|
624
|
+
input: |
|
625
|
+
<p>`back-quote`</p>
|
626
|
+
<p><%= `echo back-tick operator` %></p>
|
627
|
+
<p>#{sharp}</p>
|
628
|
+
<p>'single quote'</p>
|
629
|
+
<p>"double quote"</p>
|
630
|
+
<p>backslash\n\t</p>
|
631
|
+
src: |
|
632
|
+
_buf = ''; _buf << %Q`<p>\`back-quote\`</p>
|
633
|
+
<p>#{ `echo back-tick operator` }</p>
|
634
|
+
<p>\#{sharp}</p>
|
635
|
+
<p>'single quote'</p>
|
636
|
+
<p>"double quote"</p>
|
637
|
+
<p>backslash\\n\\t</p>\n`
|
638
|
+
_buf.to_s
|
639
|
+
output: |
|
640
|
+
<p>`back-quote`</p>
|
641
|
+
<p>back-tick operator
|
642
|
+
</p>
|
643
|
+
<p>#{sharp}</p>
|
644
|
+
<p>'single quote'</p>
|
645
|
+
<p>"double quote"</p>
|
646
|
+
<p>backslash\n\t</p>
|
data/test/test-erubis.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
##
|
2
|
-
## $
|
3
|
-
##
|
4
|
-
## copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
|
2
|
+
## $Release: 2.7.0 $
|
3
|
+
## copyright(c) 2006-2011 kuwata-lab.com all rights reserved.
|
5
4
|
##
|
6
5
|
|
7
6
|
require "#{File.dirname(__FILE__)}/test.rb"
|
@@ -120,32 +119,36 @@ END
|
|
120
119
|
filename = 'tmp.load_file_timestamp1'
|
121
120
|
cachename = filename + '.cache'
|
122
121
|
begin
|
122
|
+
## when cache doesn't exist then it is created automatically
|
123
123
|
File.open(filename, 'w') { |f| f.write(@input) }
|
124
|
-
|
124
|
+
mtime = Time.now - 2.0
|
125
|
+
File.utime(mtime, mtime, filename)
|
126
|
+
!test(?f, cachename) or raise "** failed"
|
125
127
|
engine = @klass.load_file(filename)
|
126
128
|
assert_block() { test(?f, cachename) }
|
127
129
|
assert_block() { File.mtime(filename) <= File.mtime(cachename) }
|
128
130
|
assert_text_equal(@src, engine.src)
|
129
|
-
|
131
|
+
## when cache has different timestamp then it is recreated
|
130
132
|
input2 = @input.gsub(/ul>/, 'ol>')
|
131
133
|
src2 = @src.gsub(/ul>/, 'ol>')
|
132
|
-
mtime = File.mtime(filename)
|
133
134
|
File.open(filename, 'w') { |f| f.write(input2) }
|
134
135
|
t1 = Time.now()
|
135
136
|
sleep(1)
|
136
137
|
t2 = Time.now()
|
138
|
+
#
|
137
139
|
File.utime(t1, t1, filename)
|
138
140
|
File.utime(t2, t2, cachename)
|
139
|
-
|
141
|
+
File.mtime(filename) < File.mtime(cachename) or raise "** failed"
|
140
142
|
engine = @klass.load_file(filename)
|
141
|
-
assert_block('cache should
|
142
|
-
assert_text_equal(@src, engine.src)
|
143
|
+
assert_block('cache should have same timestamp') { File.mtime(filename) == File.mtime(cachename) }
|
144
|
+
#assert_text_equal(@src, engine.src)
|
145
|
+
assert_text_equal(src2, engine.src)
|
143
146
|
#
|
144
147
|
File.utime(t2, t2, filename)
|
145
148
|
File.utime(t1, t1, cachename)
|
146
|
-
|
149
|
+
File.mtime(filename) > File.mtime(cachename) or raise "** failed"
|
147
150
|
engine = @klass.load_file(filename)
|
148
|
-
assert_block('cache should
|
151
|
+
assert_block('cache should have same timestamp') { File.mtime(filename) == File.mtime(cachename) }
|
149
152
|
assert_text_equal(src2, engine.src)
|
150
153
|
ensure
|
151
154
|
File.unlink(cachename) if File.file?(cachename)
|
@@ -154,8 +157,67 @@ END
|
|
154
157
|
end
|
155
158
|
|
156
159
|
|
160
|
+
class Dummy
|
161
|
+
end
|
162
|
+
|
163
|
+
def _class_has_instance_method(klass, method)
|
164
|
+
return klass.instance_methods.collect{|m| m.to_s}.include?(method.to_s)
|
165
|
+
end
|
166
|
+
|
167
|
+
def test_def_method1
|
168
|
+
s = "<%for i in list%>i=<%=i%>\n<%end%>"
|
169
|
+
eruby = Erubis::Eruby.new(s)
|
170
|
+
assert(! _class_has_instance_method(Dummy, 'render'))
|
171
|
+
eruby.def_method(Dummy, 'render(list)', 'foo.rhtml')
|
172
|
+
assert(_class_has_instance_method(Dummy, 'render'))
|
173
|
+
actual = Dummy.new().render(%w[1 2 3])
|
174
|
+
assert_equal("i=1\ni=2\ni=3\n", actual)
|
175
|
+
end
|
176
|
+
|
177
|
+
def test_def_method2
|
178
|
+
s = "<%for i in list%>i=<%=i%>\n<%end%>"
|
179
|
+
eruby = Erubis::Eruby.new(s)
|
180
|
+
assert(! (eruby.respond_to? :render))
|
181
|
+
eruby.def_method(eruby, 'render(list)', 'foo.rhtml')
|
182
|
+
assert eruby.respond_to?(:render)
|
183
|
+
actual = eruby.render([1, 2, 3])
|
184
|
+
assert_equal("i=1\ni=2\ni=3\n", actual)
|
185
|
+
assert(! _class_has_instance_method(eruby.class, 'render'))
|
186
|
+
end
|
187
|
+
|
188
|
+
def test_evaluate_creates_proc
|
189
|
+
s = "hello <%= @name %>"
|
190
|
+
eruby = Erubis::Eruby.new(s)
|
191
|
+
assert_nil(eruby.instance_variable_get('@_proc'))
|
192
|
+
actual1 = eruby.evaluate(:name=>'world')
|
193
|
+
assert_not_nil(eruby.instance_variable_get('@_proc'))
|
194
|
+
assert_instance_of(Proc, eruby.instance_variable_get('@_proc'))
|
195
|
+
actual2 = eruby.evaluate(:name=>'world')
|
196
|
+
assert_equal(actual1, actual2)
|
197
|
+
# convert() must clear @_proc
|
198
|
+
eruby.convert(s)
|
199
|
+
assert_nil(eruby.instance_variable_get('@_proc'))
|
200
|
+
end
|
201
|
+
|
202
|
+
#def test_toplevel_binding
|
203
|
+
# s = "locals = <%= local_variables().inspect %>\n<% x = 50 %>\n"
|
204
|
+
# eruby = Erubis::Eruby.new(s)
|
205
|
+
# _x = eval 'x', TOPLEVEL_BINDING
|
206
|
+
# _y = eval 'y', TOPLEVEL_BINDING
|
207
|
+
# actual = eruby.evaluate(:x=>_x, :y=>_y)
|
208
|
+
# _x = eval 'x', TOPLEVEL_BINDING
|
209
|
+
# _y = eval 'y', TOPLEVEL_BINDING
|
210
|
+
# puts "*** actual=#{actual.inspect}, x=#{_x.inspect}, y=#{_y.inspect}"
|
211
|
+
#end
|
212
|
+
|
213
|
+
self.post_definition()
|
214
|
+
|
157
215
|
end
|
158
216
|
|
217
|
+
x = 10
|
218
|
+
y = 20
|
219
|
+
|
220
|
+
|
159
221
|
__END__
|
160
222
|
- name: basic1
|
161
223
|
input: &basic1_input|
|
@@ -463,6 +525,48 @@ __END__
|
|
463
525
|
<>&"
|
464
526
|
<>&"
|
465
527
|
|
528
|
+
##
|
529
|
+
- name: tailch1
|
530
|
+
options:
|
531
|
+
input: |
|
532
|
+
<p>
|
533
|
+
<% str = '<>&"' %>
|
534
|
+
<%= str %>
|
535
|
+
<%= str =%>
|
536
|
+
<%= str -%>
|
537
|
+
</p>
|
538
|
+
src: |
|
539
|
+
_buf = ''; _buf << '<p>
|
540
|
+
'; str = '<>&"'
|
541
|
+
_buf << ' '; _buf << ( str ).to_s; _buf << '
|
542
|
+
'; _buf << ' '; _buf << ( str ).to_s; _buf << ' '; _buf << ( str ).to_s; _buf << '</p>
|
543
|
+
';
|
544
|
+
_buf.to_s
|
545
|
+
output: |
|
546
|
+
<p>
|
547
|
+
<>&"
|
548
|
+
<>&" <>&"</p>
|
549
|
+
|
550
|
+
##
|
551
|
+
- name: doublepercent1
|
552
|
+
options:
|
553
|
+
input: |
|
554
|
+
<% x1 = 10 %>
|
555
|
+
<%% x2 = 20 %>
|
556
|
+
<%= x1 %>
|
557
|
+
<%%= x2 %>
|
558
|
+
src: |
|
559
|
+
_buf = ''; x1 = 10
|
560
|
+
_buf << '<% x2 = 20 %>
|
561
|
+
'; _buf << ( x1 ).to_s; _buf << '
|
562
|
+
'; _buf << '<%= x2 %>
|
563
|
+
';
|
564
|
+
_buf.to_s
|
565
|
+
output: |
|
566
|
+
<% x2 = 20 %>
|
567
|
+
10
|
568
|
+
<%= x2 %>
|
569
|
+
|
466
570
|
##
|
467
571
|
- name: optimized1
|
468
572
|
class: OptimizedEruby
|
@@ -0,0 +1,191 @@
|
|
1
|
+
##
|
2
|
+
## $Release: 2.7.0 $
|
3
|
+
## copyright(c) 2006-2011 kuwata-lab.com all rights reserved.
|
4
|
+
##
|
5
|
+
|
6
|
+
require "#{File.dirname(__FILE__)}/test.rb"
|
7
|
+
|
8
|
+
require 'stringio'
|
9
|
+
|
10
|
+
load "#{File.dirname(__FILE__)}/../public_html/index.cgi"
|
11
|
+
|
12
|
+
|
13
|
+
def spec(desc)
|
14
|
+
yield
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
def dummy_env(request_method='GET', request_uri='/', opts={})
|
19
|
+
if request_method.is_a?(Hash)
|
20
|
+
opts = request_method
|
21
|
+
request_method = 'GET'
|
22
|
+
request_uri = '/'
|
23
|
+
elsif request_uri.is_a?(Hash)
|
24
|
+
opts = request_uri
|
25
|
+
request_uri = '/'
|
26
|
+
end
|
27
|
+
env = {
|
28
|
+
'REQUEST_METHOD' => request_method.to_s,
|
29
|
+
'REQUEST_URI' => request_uri.to_s,
|
30
|
+
'DOCUMENT_ROOT' => Dir.pwd,
|
31
|
+
}
|
32
|
+
opts.each {|k, v| env[k.to_s.upcase] = v }
|
33
|
+
env.update(opts)
|
34
|
+
return env
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
def dummy_template(filename, content)
|
39
|
+
begin
|
40
|
+
File.open(filename, 'wb') {|f| f.write(content) }
|
41
|
+
return yield
|
42
|
+
ensure
|
43
|
+
[filename, filename + '.cache'].each do |fname|
|
44
|
+
File.unlink(fname) if File.exist?(fname)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
class ErubisHandlerTest < Test::Unit::TestCase
|
51
|
+
|
52
|
+
def test_initialize
|
53
|
+
|
54
|
+
spec "sets @encoding and @layout" do
|
55
|
+
encoding_bkup = $ENCODING
|
56
|
+
layout_bkup = $LAYOUT
|
57
|
+
begin
|
58
|
+
$ENCODING = 'cp932'
|
59
|
+
$LAYOUT = 'site.rhtml'
|
60
|
+
obj = ErubisHandler.new
|
61
|
+
assert_equal 'cp932', obj.encoding
|
62
|
+
assert_equal 'site.rhtml', obj.layout
|
63
|
+
ensure
|
64
|
+
$ENCODING = encoding_bkup
|
65
|
+
$LAYOUT = layout_bkup
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_handle
|
72
|
+
|
73
|
+
spec "renders requested template file." do
|
74
|
+
base = "_test_handle"
|
75
|
+
env = dummy_env('GET', "/#{base}.html")
|
76
|
+
handler = ErubisHandler.new
|
77
|
+
input = <<'END'
|
78
|
+
<h1><%= '<b>SOS</b>' %></h1>
|
79
|
+
<ul>
|
80
|
+
<% for item in %w[Haruhi Mikuru Yuki] %>
|
81
|
+
<li><%= item %></li>
|
82
|
+
<% end %>
|
83
|
+
</ul>
|
84
|
+
END
|
85
|
+
expected = <<'END'
|
86
|
+
<h1><b>SOS</b></h1>
|
87
|
+
<ul>
|
88
|
+
<li>Haruhi</li>
|
89
|
+
<li>Mikuru</li>
|
90
|
+
<li>Yuki</li>
|
91
|
+
</ul>
|
92
|
+
END
|
93
|
+
out = dummy_template("#{base}.rhtml", input) do
|
94
|
+
handler.handle(env)
|
95
|
+
end
|
96
|
+
assert_equal expected, out
|
97
|
+
end
|
98
|
+
|
99
|
+
spec "raises 404 error when requested file not found." do
|
100
|
+
req_url = "/_test_handle.html"
|
101
|
+
env = dummy_env('GET', req_url)
|
102
|
+
handler = ErubisHandler.new
|
103
|
+
ex = assert_raise HttpError do
|
104
|
+
handler.handle(env)
|
105
|
+
end
|
106
|
+
assert_equal 404, ex.status
|
107
|
+
assert_equal "#{req_url}: not found.", ex.message
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
111
|
+
|
112
|
+
end
|
113
|
+
|
114
|
+
|
115
|
+
class ErubisApplicationTest < Test::Unit::TestCase
|
116
|
+
|
117
|
+
def test_handle_request
|
118
|
+
|
119
|
+
spec "handles request by handler object and returns response data." do
|
120
|
+
app = ErubisApplication.new()
|
121
|
+
def app.get_handler
|
122
|
+
return Class.new {
|
123
|
+
def handle(env); "<p>Hello SOS</p>"; end
|
124
|
+
def encoding; "euc_jp"; end
|
125
|
+
}.new
|
126
|
+
end
|
127
|
+
expected = [
|
128
|
+
200,
|
129
|
+
[["Content-Type", "text/html;charset=euc_jp"]],
|
130
|
+
["<p>Hello SOS</p>"],
|
131
|
+
]
|
132
|
+
env = dummy_env('GET', '/')
|
133
|
+
ret = app.call(env)
|
134
|
+
assert_equal expected, ret
|
135
|
+
end
|
136
|
+
|
137
|
+
end
|
138
|
+
|
139
|
+
def test_handle_http_error
|
140
|
+
|
141
|
+
spec "renders error page." do
|
142
|
+
req_path = '/HaruhiSuzumiya.html'
|
143
|
+
app = ErubisApplication.new()
|
144
|
+
env = dummy_env('GET', req_path)
|
145
|
+
expected = [
|
146
|
+
404,
|
147
|
+
[["Content-Type", "text/html"]],
|
148
|
+
["<h2>404 Not Found</h2>\n<p>#{req_path}: not found.</p>\n"],
|
149
|
+
]
|
150
|
+
ret = app.call(env)
|
151
|
+
assert_equal expected, ret
|
152
|
+
end
|
153
|
+
|
154
|
+
end
|
155
|
+
|
156
|
+
def test_run
|
157
|
+
|
158
|
+
spec "prints to $stdout" do
|
159
|
+
input = "<p>Hello SOS</p>"
|
160
|
+
app = ErubisApplication.new
|
161
|
+
base = "SOS"
|
162
|
+
env = dummy_env("GET", "/#{base}.html")
|
163
|
+
sio = StringIO.new
|
164
|
+
output = dummy_template("#{base}.rhtml", input) do
|
165
|
+
app.run(env, sio)
|
166
|
+
sio.string
|
167
|
+
end
|
168
|
+
expected = ""
|
169
|
+
expected << "Content-Type: text/html\r\n"
|
170
|
+
expected << "\r\n"
|
171
|
+
expected << "<p>Hello SOS</p>"
|
172
|
+
assert_equal expected, output
|
173
|
+
end
|
174
|
+
|
175
|
+
spec "prints 'Status:' header if status code is not 200." do
|
176
|
+
req_path = "/SOS.html"
|
177
|
+
env = dummy_env("GET", req_path)
|
178
|
+
app = ErubisApplication.new
|
179
|
+
sio = StringIO.new
|
180
|
+
app.run(env, sio)
|
181
|
+
expected = "Status: 404 Not Found\r\n"
|
182
|
+
expected << "Content-Type: text/html\r\n"
|
183
|
+
expected << "\r\n"
|
184
|
+
expected << "<h2>404 Not Found</h2>\n"
|
185
|
+
expected << "<p>#{req_path}: not found.</p>\n"
|
186
|
+
assert_equal expected, sio.string
|
187
|
+
end
|
188
|
+
|
189
|
+
end
|
190
|
+
|
191
|
+
end
|