erubis 2.3.1 → 2.7.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.
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