erubis 2.3.1 → 2.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (163) hide show
  1. data/{CHANGES → CHANGES.txt} +373 -3
  2. data/MIT-LICENSE +1 -1
  3. data/README.txt +6 -5
  4. data/benchmark/bench.rb +18 -11
  5. data/bin/erubis +3 -4
  6. data/contrib/erubis +3462 -5
  7. data/contrib/inline-require +54 -28
  8. data/doc/docstyle.css +25 -4
  9. data/doc/users-guide.html +814 -110
  10. data/doc-api/classes/ActionView/TemplateHandlers/ErubisHandler.html +209 -0
  11. data/doc-api/classes/ActionView.html +105 -0
  12. data/doc-api/classes/Erubis/ArrayBufferEnhancer.html +14 -14
  13. data/doc-api/classes/Erubis/ArrayEnhancer.html +16 -16
  14. data/doc-api/classes/Erubis/Basic/Converter.html +36 -31
  15. data/doc-api/classes/Erubis/BiPatternEnhancer.html +16 -13
  16. data/doc-api/classes/Erubis/CGenerator.html +70 -70
  17. data/doc-api/classes/Erubis/Context.html +49 -49
  18. data/doc-api/classes/Erubis/Converter.html +30 -29
  19. data/doc-api/classes/Erubis/CppGenerator.html +382 -0
  20. data/doc-api/classes/Erubis/DeleteIndentEnhancer.html +7 -7
  21. data/doc-api/classes/Erubis/Ecpp.html +126 -0
  22. data/doc-api/classes/Erubis/Engine.html +46 -43
  23. data/doc-api/classes/Erubis/ErboutEnhancer.html +16 -16
  24. data/doc-api/classes/Erubis/EscapeEnhancer.html +7 -7
  25. data/doc-api/classes/Erubis/EscapedEcpp.html +120 -0
  26. data/doc-api/classes/Erubis/Evaluator.html +22 -22
  27. data/doc-api/classes/Erubis/Generator.html +70 -70
  28. data/doc-api/classes/Erubis/HeaderFooterEnhancer.html +18 -15
  29. data/doc-api/classes/Erubis/Helpers/RailsFormHelper.html +787 -0
  30. data/doc-api/classes/Erubis/Helpers/RailsHelper/TemplateConverter.html +213 -0
  31. data/doc-api/classes/Erubis/Helpers/RailsHelper.html +103 -54
  32. data/doc-api/classes/Erubis/Helpers.html +6 -1
  33. data/doc-api/classes/Erubis/InterpolationEnhancer.html +42 -41
  34. data/doc-api/classes/Erubis/JavaGenerator.html +69 -69
  35. data/doc-api/classes/Erubis/JavascriptGenerator.html +79 -74
  36. data/doc-api/classes/Erubis/Main.html +49 -48
  37. data/doc-api/classes/Erubis/NoCodeEnhancer.html +35 -35
  38. data/doc-api/classes/Erubis/NoTextEnhancer.html +7 -7
  39. data/doc-api/classes/Erubis/OptimizedEruby.html +7 -7
  40. data/doc-api/classes/Erubis/OptimizedGenerator.html +84 -84
  41. data/doc-api/classes/Erubis/OptimizedXmlEruby.html +7 -7
  42. data/doc-api/classes/Erubis/PI/Converter.html +23 -22
  43. data/doc-api/classes/Erubis/PI/Ec.html +7 -7
  44. data/doc-api/classes/Erubis/PI/Ecpp.html +166 -0
  45. data/doc-api/classes/Erubis/PI/Ejava.html +7 -7
  46. data/doc-api/classes/Erubis/PI/Ejavascript.html +7 -7
  47. data/doc-api/classes/Erubis/PI/Eperl.html +7 -7
  48. data/doc-api/classes/Erubis/PI/Ephp.html +7 -7
  49. data/doc-api/classes/Erubis/PI/Eruby.html +6 -6
  50. data/doc-api/classes/Erubis/PI/Escheme.html +7 -7
  51. data/doc-api/classes/Erubis/PI/TinyEruby.html +28 -27
  52. data/doc-api/classes/Erubis/PI.html +1 -0
  53. data/doc-api/classes/Erubis/PercentLineEnhancer.html +18 -29
  54. data/doc-api/classes/Erubis/PerlGenerator.html +63 -63
  55. data/doc-api/classes/Erubis/PhpGenerator.html +63 -63
  56. data/doc-api/classes/Erubis/PrefixedLineEnhancer.html +210 -0
  57. data/doc-api/classes/Erubis/PrefixedLineEruby.html +120 -0
  58. data/doc-api/classes/Erubis/PreprocessingEruby.html +183 -0
  59. data/doc-api/classes/Erubis/PreprocessingHelper.html +212 -0
  60. data/doc-api/classes/Erubis/PrintEnabledEnhancer.html +23 -23
  61. data/doc-api/classes/Erubis/PrintOutEnhancer.html +38 -38
  62. data/doc-api/classes/Erubis/RubyEvaluator.html +59 -22
  63. data/doc-api/classes/Erubis/RubyGenerator.html +53 -52
  64. data/doc-api/classes/Erubis/SchemeGenerator.html +70 -70
  65. data/doc-api/classes/Erubis/SimplifyEnhancer.html +10 -9
  66. data/doc-api/classes/Erubis/StdoutEnhancer.html +3 -3
  67. data/doc-api/classes/Erubis/StringBufferEnhancer.html +16 -16
  68. data/doc-api/classes/Erubis/TinyEruby.html +33 -33
  69. data/doc-api/classes/Erubis/XmlHelper.html +80 -15
  70. data/doc-api/classes/Erubis.html +25 -1
  71. data/doc-api/classes/Kernel.html +155 -0
  72. data/doc-api/created.rid +1 -1
  73. data/doc-api/files/README_txt.html +8 -8
  74. data/doc-api/files/erubis/context_rb.html +2 -2
  75. data/doc-api/files/erubis/converter_rb.html +3 -3
  76. data/doc-api/files/erubis/engine/ec_rb.html +2 -2
  77. data/doc-api/files/erubis/engine/ecpp_rb.html +115 -0
  78. data/doc-api/files/erubis/engine/ejava_rb.html +2 -2
  79. data/doc-api/files/erubis/engine/ejavascript_rb.html +2 -2
  80. data/doc-api/files/erubis/engine/enhanced_rb.html +2 -2
  81. data/doc-api/files/erubis/engine/eperl_rb.html +2 -2
  82. data/doc-api/files/erubis/engine/ephp_rb.html +2 -2
  83. data/doc-api/files/erubis/engine/eruby_rb.html +2 -2
  84. data/doc-api/files/erubis/engine/escheme_rb.html +2 -2
  85. data/doc-api/files/erubis/engine/optimized_rb.html +2 -2
  86. data/doc-api/files/erubis/engine_rb.html +2 -2
  87. data/doc-api/files/erubis/enhancer_rb.html +2 -2
  88. data/doc-api/files/erubis/error_rb.html +2 -2
  89. data/doc-api/files/erubis/evaluator_rb.html +2 -2
  90. data/doc-api/files/erubis/generator_rb.html +3 -3
  91. data/doc-api/files/erubis/helper_rb.html +2 -2
  92. data/doc-api/files/erubis/helpers/rails_form_helper_rb.html +107 -0
  93. data/doc-api/files/erubis/helpers/rails_helper_rb.html +3 -2
  94. data/doc-api/files/erubis/local-setting_rb.html +2 -2
  95. data/doc-api/files/erubis/main_rb.html +4 -2
  96. data/doc-api/files/erubis/preprocessing_rb.html +114 -0
  97. data/doc-api/files/erubis/tiny_rb.html +2 -2
  98. data/doc-api/files/erubis/util_rb.html +107 -0
  99. data/doc-api/files/erubis_rb.html +2 -2
  100. data/doc-api/fr_class_index.html +13 -0
  101. data/doc-api/fr_file_index.html +4 -0
  102. data/doc-api/fr_method_index.html +237 -179
  103. data/examples/basic/Makefile +7 -2
  104. data/examples/basic/example.ecpp +33 -0
  105. data/lib/erubis/context.rb +2 -3
  106. data/lib/erubis/converter.rb +17 -11
  107. data/lib/erubis/engine/ec.rb +2 -3
  108. data/lib/erubis/engine/ecpp.rb +113 -0
  109. data/lib/erubis/engine/ejava.rb +9 -10
  110. data/lib/erubis/engine/ejavascript.rb +14 -9
  111. data/lib/erubis/engine/enhanced.rb +7 -3
  112. data/lib/erubis/engine/eperl.rb +2 -3
  113. data/lib/erubis/engine/ephp.rb +2 -3
  114. data/lib/erubis/engine/eruby.rb +8 -8
  115. data/lib/erubis/engine/escheme.rb +2 -3
  116. data/lib/erubis/engine/optimized.rb +2 -3
  117. data/lib/erubis/engine.rb +13 -11
  118. data/lib/erubis/enhancer.rb +101 -34
  119. data/lib/erubis/error.rb +2 -3
  120. data/lib/erubis/evaluator.rb +27 -10
  121. data/lib/erubis/generator.rb +3 -4
  122. data/lib/erubis/helper.rb +14 -3
  123. data/lib/erubis/helpers/rails_form_helper.rb +197 -0
  124. data/lib/erubis/helpers/rails_helper.rb +219 -77
  125. data/lib/erubis/local-setting.rb +2 -3
  126. data/lib/erubis/main.rb +85 -60
  127. data/lib/erubis/preprocessing.rb +58 -0
  128. data/lib/erubis/tiny.rb +9 -9
  129. data/lib/erubis/util.rb +22 -0
  130. data/lib/erubis.rb +4 -4
  131. data/test/assert-text-equal.rb +2 -3
  132. data/test/data/users-guide/bufvar-example.rb +10 -0
  133. data/test/data/users-guide/bufvar-example.result +17 -0
  134. data/test/data/users-guide/def_method.rb +14 -0
  135. data/test/data/users-guide/def_method.result +3 -0
  136. data/test/data/users-guide/example.ecpp +30 -0
  137. data/test/data/users-guide/example1.rb +1 -0
  138. data/test/data/users-guide/example_c.result +22 -19
  139. data/test/data/users-guide/fasteruby-example.rb +8 -0
  140. data/test/data/users-guide/fasteruby-example.result +18 -0
  141. data/test/data/users-guide/main_program1.rb +8 -0
  142. data/test/data/users-guide/main_program1.result +6 -0
  143. data/test/data/users-guide/main_program2.rb +8 -0
  144. data/test/data/users-guide/main_program2.result +6 -0
  145. data/test/data/users-guide/percentline-example.rhtml +3 -1
  146. data/test/data/users-guide/percentline_example.result +5 -3
  147. data/test/data/users-guide/prefixedline-example.rb +9 -0
  148. data/test/data/users-guide/prefixedline-example.rhtml +6 -0
  149. data/test/data/users-guide/prefixedline_example.result +9 -0
  150. data/test/data/users-guide/tail_260.result +4 -0
  151. data/test/data/users-guide/tailnewline.rhtml +3 -0
  152. data/test/data/users-guide/template1.rhtml +4 -0
  153. data/test/data/users-guide/template2.rhtml +4 -0
  154. data/test/test-engines.rb +88 -5
  155. data/test/test-enhancers.rb +83 -6
  156. data/test/test-erubis.rb +115 -11
  157. data/test/test-index-cgi.rb +191 -0
  158. data/test/test-main.rb +143 -31
  159. data/test/test-users-guide.rb +20 -3
  160. data/test/test.rb +18 -3
  161. data/test/testutil.rb +44 -8
  162. metadata +104 -67
  163. data/contrib/action_view_base_rb.patch +0 -23
@@ -1,7 +1,9 @@
1
1
  $ erubis -xE PercentLine percentline-example.rhtml
2
- _buf = ''; for item in list
3
- _buf << ' <b>'; _buf << ( item ).to_s; _buf << '</b>
2
+ _buf = ''; _buf << '<ul>
3
+ '; for item in list
4
+ _buf << ' <li>'; _buf << ( item ).to_s; _buf << '</li>
4
5
  '; end
5
- _buf << '% lines with \'%%\'
6
+ _buf << '</ul>
7
+ % lines with \'%%\'
6
8
  ';
7
9
  _buf.to_s
@@ -0,0 +1,9 @@
1
+ require 'erubis'
2
+
3
+ class PrefixedLineEruby < Erubis::Eruby
4
+ include Erubis::PrefixedLineEnhancer
5
+ end
6
+
7
+ input = File.read('prefixedline-example.rhtml')
8
+ eruby = PrefixedLineEruby.new(input, :prefixchar=>'!') # default '%'
9
+ print eruby.src
@@ -0,0 +1,6 @@
1
+ <ul>
2
+ ! for item in list
3
+ <li><%= item %></li>
4
+ ! end
5
+ </ul>
6
+ !! lines with '!!'
@@ -0,0 +1,9 @@
1
+ $ ruby prefixedline-example.rb
2
+ _buf = ''; _buf << '<ul>
3
+ '; for item in list
4
+ _buf << ' <li>'; _buf << ( item ).to_s; _buf << '</li>
5
+ '; end
6
+ _buf << '</ul>
7
+ ! lines with \'!!\'
8
+ ';
9
+ _buf.to_s
@@ -0,0 +1,4 @@
1
+ $ erubis -c '{var: "AAA\n"}' tailnewline.rhtml
2
+ <div>
3
+ AAA
4
+ </div>
@@ -0,0 +1,3 @@
1
+ <div>
2
+ <%= @var -%>
3
+ </div>
@@ -0,0 +1,4 @@
1
+ <% for x in items %>
2
+ item = <%= x %>
3
+ <% end %>
4
+ ** debug: local variables=<%= local_variables().inspect() %>
@@ -0,0 +1,4 @@
1
+ <% for x in @items %>
2
+ item = <%= x %>
3
+ <% end %>
4
+ ** debug: local variables=<%= local_variables().inspect() %>
data/test/test-engines.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  ##
2
- ## $Rev: 77 $
3
- ## $Release: 2.3.1 $
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: javascript
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
+ ##
@@ -1,7 +1,6 @@
1
1
  ##
2
- ## $Rev: 77 $
3
- ## $Release: 2.3.1 $
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
- '; _buf << '% double percent
475
- '; _buf << ' % spaced percent
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>&lt;aaa&gt;</td>
535
+ </tr>
536
+ <tr>
537
+ <td>b&b</td>
538
+ <td>b&amp;b</td>
539
+ </tr>
540
+ <tr>
541
+ <td>"ccc"</td>
542
+ <td>&quot;ccc&quot;</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
- ## $Rev: 77 $
3
- ## $Release: 2.3.1 $
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
- assert_block() { !test(?f, cachename) }
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
- assert_block('cache should be newer') { File.mtime(filename) < File.mtime(cachename) }
141
+ File.mtime(filename) < File.mtime(cachename) or raise "** failed"
140
142
  engine = @klass.load_file(filename)
141
- assert_block('cache should be newer') { File.mtime(filename) < File.mtime(cachename) }
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
- assert_block('cache should be older') { File.mtime(filename) > File.mtime(cachename) }
149
+ File.mtime(filename) > File.mtime(cachename) or raise "** failed"
147
150
  engine = @klass.load_file(filename)
148
- assert_block('cache should be newer') { File.mtime(filename) <= File.mtime(cachename) }
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
  &lt;&gt;&amp;&quot;
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