erubis 2.6.6 → 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 (148) hide show
  1. data/CHANGES.txt +79 -3
  2. data/MIT-LICENSE +1 -1
  3. data/README.txt +2 -2
  4. data/benchmark/bench.rb +2 -2
  5. data/bin/erubis +2 -2
  6. data/contrib/erubis +293 -155
  7. data/contrib/inline-require +2 -2
  8. data/doc-api/classes/Erubis.html +10 -1
  9. data/doc-api/classes/Erubis/ArrayBufferEnhancer.html +12 -12
  10. data/doc-api/classes/Erubis/ArrayEnhancer.html +14 -14
  11. data/doc-api/classes/Erubis/Basic/Converter.html +24 -24
  12. data/doc-api/classes/Erubis/BiPatternEnhancer.html +12 -12
  13. data/doc-api/classes/Erubis/CGenerator.html +60 -60
  14. data/doc-api/classes/Erubis/Context.html +42 -42
  15. data/doc-api/classes/Erubis/Converter.html +27 -27
  16. data/doc-api/classes/Erubis/CppGenerator.html +382 -0
  17. data/doc-api/classes/Erubis/DeleteIndentEnhancer.html +7 -7
  18. data/doc-api/classes/Erubis/Ecpp.html +126 -0
  19. data/doc-api/classes/Erubis/Engine.html +36 -36
  20. data/doc-api/classes/Erubis/ErboutEnhancer.html +14 -14
  21. data/doc-api/classes/Erubis/EscapeEnhancer.html +6 -6
  22. data/doc-api/classes/Erubis/EscapedEcpp.html +120 -0
  23. data/doc-api/classes/Erubis/Evaluator.html +19 -19
  24. data/doc-api/classes/Erubis/Generator.html +60 -60
  25. data/doc-api/classes/Erubis/HeaderFooterEnhancer.html +14 -14
  26. data/doc-api/classes/Erubis/Helpers/RailsFormHelper.html +150 -150
  27. data/doc-api/classes/Erubis/Helpers/RailsHelper.html +49 -49
  28. data/doc-api/classes/Erubis/Helpers/RailsHelper/TemplateConverter.html +24 -24
  29. data/doc-api/classes/Erubis/InterpolationEnhancer.html +38 -39
  30. data/doc-api/classes/Erubis/JavaGenerator.html +60 -60
  31. data/doc-api/classes/Erubis/JavascriptGenerator.html +66 -66
  32. data/doc-api/classes/Erubis/Main.html +22 -22
  33. data/doc-api/classes/Erubis/NoCodeEnhancer.html +30 -30
  34. data/doc-api/classes/Erubis/NoTextEnhancer.html +6 -6
  35. data/doc-api/classes/Erubis/OptimizedEruby.html +6 -6
  36. data/doc-api/classes/Erubis/OptimizedGenerator.html +72 -72
  37. data/doc-api/classes/Erubis/OptimizedXmlEruby.html +6 -6
  38. data/doc-api/classes/Erubis/PI.html +1 -0
  39. data/doc-api/classes/Erubis/PI/Converter.html +18 -18
  40. data/doc-api/classes/Erubis/PI/Ec.html +6 -6
  41. data/doc-api/classes/Erubis/PI/Ecpp.html +166 -0
  42. data/doc-api/classes/Erubis/PI/Ejava.html +6 -6
  43. data/doc-api/classes/Erubis/PI/Ejavascript.html +6 -6
  44. data/doc-api/classes/Erubis/PI/Eperl.html +6 -6
  45. data/doc-api/classes/Erubis/PI/Ephp.html +6 -6
  46. data/doc-api/classes/Erubis/PI/Eruby.html +7 -7
  47. data/doc-api/classes/Erubis/PI/Escheme.html +6 -6
  48. data/doc-api/classes/Erubis/PI/TinyEruby.html +24 -24
  49. data/doc-api/classes/Erubis/PercentLineEnhancer.html +18 -34
  50. data/doc-api/classes/Erubis/PerlGenerator.html +54 -54
  51. data/doc-api/classes/Erubis/PhpGenerator.html +54 -54
  52. data/doc-api/classes/Erubis/PrefixedLineEnhancer.html +210 -0
  53. data/doc-api/classes/Erubis/PrefixedLineEruby.html +120 -0
  54. data/doc-api/classes/Erubis/PreprocessingEruby.html +12 -12
  55. data/doc-api/classes/Erubis/PreprocessingHelper.html +22 -22
  56. data/doc-api/classes/Erubis/PrintEnabledEnhancer.html +20 -20
  57. data/doc-api/classes/Erubis/PrintOutEnhancer.html +33 -33
  58. data/doc-api/classes/Erubis/RubyEvaluator.html +18 -18
  59. data/doc-api/classes/Erubis/RubyGenerator.html +59 -58
  60. data/doc-api/classes/Erubis/SchemeGenerator.html +60 -60
  61. data/doc-api/classes/Erubis/SimplifyEnhancer.html +7 -7
  62. data/doc-api/classes/Erubis/StdoutEnhancer.html +13 -13
  63. data/doc-api/classes/Erubis/StringBufferEnhancer.html +14 -14
  64. data/doc-api/classes/Erubis/TinyEruby.html +24 -24
  65. data/doc-api/classes/Erubis/XmlHelper.html +30 -30
  66. data/doc-api/classes/Kernel.html +155 -0
  67. data/doc-api/created.rid +1 -1
  68. data/doc-api/files/README_txt.html +3 -3
  69. data/doc-api/files/erubis/context_rb.html +1 -1
  70. data/doc-api/files/erubis/converter_rb.html +3 -3
  71. data/doc-api/files/erubis/engine/ec_rb.html +1 -1
  72. data/doc-api/files/erubis/engine/ecpp_rb.html +115 -0
  73. data/doc-api/files/erubis/engine/ejava_rb.html +2 -2
  74. data/doc-api/files/erubis/engine/ejavascript_rb.html +2 -2
  75. data/doc-api/files/erubis/engine/enhanced_rb.html +2 -2
  76. data/doc-api/files/erubis/engine/eperl_rb.html +1 -1
  77. data/doc-api/files/erubis/engine/ephp_rb.html +1 -1
  78. data/doc-api/files/erubis/engine/eruby_rb.html +2 -2
  79. data/doc-api/files/erubis/engine/escheme_rb.html +1 -1
  80. data/doc-api/files/erubis/engine/optimized_rb.html +1 -1
  81. data/doc-api/files/erubis/engine_rb.html +2 -2
  82. data/doc-api/files/erubis/enhancer_rb.html +2 -2
  83. data/doc-api/files/erubis/error_rb.html +1 -1
  84. data/doc-api/files/erubis/evaluator_rb.html +1 -1
  85. data/doc-api/files/erubis/generator_rb.html +3 -3
  86. data/doc-api/files/erubis/helper_rb.html +1 -1
  87. data/doc-api/files/erubis/helpers/rails_form_helper_rb.html +1 -1
  88. data/doc-api/files/erubis/helpers/rails_helper_rb.html +1 -1
  89. data/doc-api/files/erubis/local-setting_rb.html +1 -1
  90. data/doc-api/files/erubis/main_rb.html +4 -2
  91. data/doc-api/files/erubis/preprocessing_rb.html +1 -1
  92. data/doc-api/files/erubis/tiny_rb.html +1 -1
  93. data/doc-api/files/erubis/util_rb.html +107 -0
  94. data/doc-api/files/erubis_rb.html +2 -2
  95. data/doc-api/fr_class_index.html +7 -0
  96. data/doc-api/fr_file_index.html +2 -0
  97. data/doc-api/fr_method_index.html +237 -223
  98. data/doc/docstyle.css +25 -4
  99. data/doc/users-guide.html +286 -21
  100. data/examples/basic/Makefile +7 -2
  101. data/examples/basic/example.ecpp +33 -0
  102. data/lib/erubis.rb +4 -3
  103. data/lib/erubis/context.rb +2 -2
  104. data/lib/erubis/converter.rb +3 -3
  105. data/lib/erubis/engine.rb +8 -8
  106. data/lib/erubis/engine/ec.rb +2 -2
  107. data/lib/erubis/engine/ecpp.rb +113 -0
  108. data/lib/erubis/engine/ejava.rb +9 -9
  109. data/lib/erubis/engine/ejavascript.rb +9 -9
  110. data/lib/erubis/engine/enhanced.rb +7 -2
  111. data/lib/erubis/engine/eperl.rb +2 -2
  112. data/lib/erubis/engine/ephp.rb +2 -2
  113. data/lib/erubis/engine/eruby.rb +8 -7
  114. data/lib/erubis/engine/escheme.rb +2 -2
  115. data/lib/erubis/engine/optimized.rb +2 -2
  116. data/lib/erubis/enhancer.rb +70 -27
  117. data/lib/erubis/error.rb +2 -2
  118. data/lib/erubis/evaluator.rb +2 -2
  119. data/lib/erubis/generator.rb +3 -3
  120. data/lib/erubis/helper.rb +2 -2
  121. data/lib/erubis/helpers/rails_form_helper.rb +2 -2
  122. data/lib/erubis/helpers/rails_helper.rb +2 -2
  123. data/lib/erubis/local-setting.rb +2 -2
  124. data/lib/erubis/main.rb +31 -4
  125. data/lib/erubis/preprocessing.rb +2 -2
  126. data/lib/erubis/tiny.rb +2 -2
  127. data/lib/erubis/util.rb +22 -0
  128. data/test/assert-text-equal.rb +2 -2
  129. data/test/data/users-guide/bufvar-example.rb +10 -0
  130. data/test/data/users-guide/bufvar-example.result +17 -0
  131. data/test/data/users-guide/example.ecpp +30 -0
  132. data/test/data/users-guide/example_c.result +22 -19
  133. data/test/data/users-guide/fasteruby-example.rb +8 -0
  134. data/test/data/users-guide/fasteruby-example.result +18 -0
  135. data/test/data/users-guide/percentline-example.rhtml +3 -1
  136. data/test/data/users-guide/percentline_example.result +5 -3
  137. data/test/data/users-guide/prefixedline-example.rb +9 -0
  138. data/test/data/users-guide/prefixedline-example.rhtml +6 -0
  139. data/test/data/users-guide/prefixedline_example.result +9 -0
  140. data/test/test-engines.rb +58 -2
  141. data/test/test-enhancers.rb +51 -2
  142. data/test/test-erubis.rb +14 -10
  143. data/test/test-index-cgi.rb +191 -0
  144. data/test/test-main.rb +35 -4
  145. data/test/test-users-guide.rb +18 -2
  146. data/test/test.rb +18 -2
  147. data/test/testutil.rb +22 -7
  148. metadata +30 -24
@@ -0,0 +1,30 @@
1
+ <%
2
+ #include <string>
3
+ #include <iostream>
4
+ #include <sstream>
5
+
6
+ int main(int argc, char *argv[])
7
+ {
8
+ std::stringstream _buf;
9
+ %>
10
+ <html>
11
+ <body>
12
+ <p>Hello <%= argv[0] %>!</p>
13
+ <table>
14
+ <tbody>
15
+ <% for (int i = 1; i < argc; i++) { %>
16
+ <tr bgcolor="<%= i % 2 == 0 ? "#FFCCCC" : "#CCCCFF" %>">
17
+ <td><%= i %></td>
18
+ <td><%= argv[i] %></td>
19
+ </tr>
20
+ <% } %>
21
+ </tbody>
22
+ </table>
23
+ </body>
24
+ </html>
25
+ <%
26
+ std::string output = _buf.str();
27
+ std::cout << output;
28
+ return 0;
29
+ }
30
+ %>
@@ -1,29 +1,32 @@
1
- $ erubis -l c example.ec
2
- #line 1 "example.ec"
1
+ $ erubis -l cpp example.ecpp
2
+ #line 1 "example.ecpp"
3
3
 
4
- #include <stdio.h>
4
+ #include <string>
5
+ #include <iostream>
6
+ #include <sstream>
5
7
 
6
8
  int main(int argc, char *argv[])
7
9
  {
8
- int i;
10
+ std::stringstream _buf;
9
11
 
10
-
11
- fputs("<html>\n"
12
- " <body>\n"
13
- " <p>Hello ", stdout); fprintf(stdout, "%s", argv[0]); fputs("!</p>\n"
14
- " <table>\n"
15
- " <tbody>\n", stdout);
16
- for (i = 1; i < argc; i++) {
17
- fputs(" <tr bgcolor=\"", stdout); fprintf(stdout, i % 2 == 0 ? "#FFCCCC" : "#CCCCFF"); fputs("\">\n"
18
- " <td>", stdout); fprintf(stdout, "%d", i); fputs("</td>\n"
19
- " <td>", stdout); fprintf(stdout, "%s", argv[i]); fputs("</td>\n"
20
- " </tr>\n", stdout);
12
+ _buf << "<html>\n"
13
+ " <body>\n"
14
+ " <p>Hello "; _buf << (argv[0]); _buf << "!</p>\n"
15
+ " <table>\n"
16
+ " <tbody>\n";
17
+ for (int i = 1; i < argc; i++) {
18
+ _buf << " <tr bgcolor=\""; _buf << (i % 2 == 0 ? "#FFCCCC" : "#CCCCFF"); _buf << "\">\n"
19
+ " <td>"; _buf << (i); _buf << "</td>\n"
20
+ " <td>"; _buf << (argv[i]); _buf << "</td>\n"
21
+ " </tr>\n";
21
22
  }
22
- fputs(" </tbody>\n"
23
- " </table>\n"
24
- " </body>\n"
25
- "</html>\n", stdout);
23
+ _buf << " </tbody>\n"
24
+ " </table>\n"
25
+ " </body>\n"
26
+ "</html>\n";
26
27
 
28
+ std::string output = _buf.str();
29
+ std::cout << output;
27
30
  return 0;
28
31
  }
29
32
 
@@ -0,0 +1,8 @@
1
+ require 'erubis'
2
+ input = File.read('example.eruby')
3
+
4
+ puts "----- Erubis::Eruby -----"
5
+ print Erubis::Eruby.new(input).src
6
+
7
+ puts "----- Erubis::FastEruby -----"
8
+ print Erubis::FastEruby.new(input).src
@@ -0,0 +1,18 @@
1
+ $ ruby fasteruby-example.rb
2
+ ----- Erubis::Eruby -----
3
+ _buf = ''; _buf << '<div>
4
+ '; for item in list
5
+ _buf << ' <p>'; _buf << ( item ).to_s; _buf << '</p>
6
+ <p>'; _buf << Erubis::XmlHelper.escape_xml( item ); _buf << '</p>
7
+ '; end
8
+ _buf << '</div>
9
+ ';
10
+ _buf.to_s
11
+ ----- Erubis::FastEruby -----
12
+ _buf = ''; _buf << %Q`<div>\n`
13
+ for item in list
14
+ _buf << %Q` <p>#{ item }</p>
15
+ <p>#{Erubis::XmlHelper.escape_xml( item )}</p>\n`
16
+ end
17
+ _buf << %Q`</div>\n`
18
+ _buf.to_s
@@ -1,4 +1,6 @@
1
+ <ul>
1
2
  % for item in list
2
- <b><%= item %></b>
3
+ <li><%= item %></li>
3
4
  % end
5
+ </ul>
4
6
  %% lines with '%%'
@@ -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
@@ -1,6 +1,6 @@
1
1
  ##
2
- ## $Release: 2.6.6 $
3
- ## copyright(c) 2006-2010 kuwata-lab.com all rights reserved.
2
+ ## $Release: 2.7.0 $
3
+ ## copyright(c) 2006-2011 kuwata-lab.com all rights reserved.
4
4
  ##
5
5
 
6
6
  require "#{File.dirname(__FILE__)}/test.rb"
@@ -9,6 +9,7 @@ require 'erubis'
9
9
  require 'erubis/engine/eruby'
10
10
  require 'erubis/engine/ephp'
11
11
  require 'erubis/engine/ec'
12
+ require 'erubis/engine/ecpp'
12
13
  require 'erubis/engine/ejava'
13
14
  require 'erubis/engine/escheme'
14
15
  require 'erubis/engine/eperl'
@@ -67,6 +68,31 @@ __END__
67
68
  ';
68
69
  _buf.to_s
69
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
+ ##
70
96
  - name: php1
71
97
  lang: php
72
98
  class: Ephp
@@ -138,6 +164,36 @@ __END__
138
164
  "</table>\n", stdout);
139
165
  fprintf(stderr, "*** debug: i=" "%d", i); fputs("\n", stdout);
140
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
+ ##
141
197
  - name: java1
142
198
  lang: java
143
199
  class: Ejava
@@ -1,6 +1,6 @@
1
1
  ##
2
- ## $Release: 2.6.6 $
3
- ## copyright(c) 2006-2010 kuwata-lab.com all rights reserved.
2
+ ## $Release: 2.7.0 $
3
+ ## copyright(c) 2006-2011 kuwata-lab.com all rights reserved.
4
4
  ##
5
5
 
6
6
  require "#{File.dirname(__FILE__)}/test.rb"
@@ -497,6 +497,55 @@ __END__
497
497
  % spaced percent
498
498
  </pre>
499
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
+
500
549
  ##
501
550
  - name: headerfooter1
502
551
  class: HeaderFooterEruby
@@ -1,6 +1,6 @@
1
1
  ##
2
- ## $Release: 2.6.6 $
3
- ## copyright(c) 2006-2010 kuwata-lab.com all rights reserved.
2
+ ## $Release: 2.7.0 $
3
+ ## copyright(c) 2006-2011 kuwata-lab.com all rights reserved.
4
4
  ##
5
5
 
6
6
  require "#{File.dirname(__FILE__)}/test.rb"
@@ -119,32 +119,36 @@ END
119
119
  filename = 'tmp.load_file_timestamp1'
120
120
  cachename = filename + '.cache'
121
121
  begin
122
+ ## when cache doesn't exist then it is created automatically
122
123
  File.open(filename, 'w') { |f| f.write(@input) }
123
- assert_block() { !test(?f, cachename) }
124
+ mtime = Time.now - 2.0
125
+ File.utime(mtime, mtime, filename)
126
+ !test(?f, cachename) or raise "** failed"
124
127
  engine = @klass.load_file(filename)
125
128
  assert_block() { test(?f, cachename) }
126
129
  assert_block() { File.mtime(filename) <= File.mtime(cachename) }
127
130
  assert_text_equal(@src, engine.src)
128
- #
131
+ ## when cache has different timestamp then it is recreated
129
132
  input2 = @input.gsub(/ul>/, 'ol>')
130
133
  src2 = @src.gsub(/ul>/, 'ol>')
131
- mtime = File.mtime(filename)
132
134
  File.open(filename, 'w') { |f| f.write(input2) }
133
135
  t1 = Time.now()
134
136
  sleep(1)
135
137
  t2 = Time.now()
138
+ #
136
139
  File.utime(t1, t1, filename)
137
140
  File.utime(t2, t2, cachename)
138
- assert_block('cache should be newer') { File.mtime(filename) < File.mtime(cachename) }
141
+ File.mtime(filename) < File.mtime(cachename) or raise "** failed"
139
142
  engine = @klass.load_file(filename)
140
- assert_block('cache should be newer') { File.mtime(filename) < File.mtime(cachename) }
141
- 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)
142
146
  #
143
147
  File.utime(t2, t2, filename)
144
148
  File.utime(t1, t1, cachename)
145
- assert_block('cache should be older') { File.mtime(filename) > File.mtime(cachename) }
149
+ File.mtime(filename) > File.mtime(cachename) or raise "** failed"
146
150
  engine = @klass.load_file(filename)
147
- 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) }
148
152
  assert_text_equal(src2, engine.src)
149
153
  ensure
150
154
  File.unlink(cachename) if File.file?(cachename)
@@ -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