erubis 2.6.6 → 2.7.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES.txt +79 -3
- data/MIT-LICENSE +1 -1
- data/README.txt +2 -2
- data/benchmark/bench.rb +2 -2
- data/bin/erubis +2 -2
- data/contrib/erubis +293 -155
- data/contrib/inline-require +2 -2
- data/doc-api/classes/Erubis.html +10 -1
- data/doc-api/classes/Erubis/ArrayBufferEnhancer.html +12 -12
- data/doc-api/classes/Erubis/ArrayEnhancer.html +14 -14
- data/doc-api/classes/Erubis/Basic/Converter.html +24 -24
- data/doc-api/classes/Erubis/BiPatternEnhancer.html +12 -12
- data/doc-api/classes/Erubis/CGenerator.html +60 -60
- data/doc-api/classes/Erubis/Context.html +42 -42
- data/doc-api/classes/Erubis/Converter.html +27 -27
- 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 +36 -36
- data/doc-api/classes/Erubis/ErboutEnhancer.html +14 -14
- data/doc-api/classes/Erubis/EscapeEnhancer.html +6 -6
- data/doc-api/classes/Erubis/EscapedEcpp.html +120 -0
- data/doc-api/classes/Erubis/Evaluator.html +19 -19
- data/doc-api/classes/Erubis/Generator.html +60 -60
- data/doc-api/classes/Erubis/HeaderFooterEnhancer.html +14 -14
- data/doc-api/classes/Erubis/Helpers/RailsFormHelper.html +150 -150
- data/doc-api/classes/Erubis/Helpers/RailsHelper.html +49 -49
- data/doc-api/classes/Erubis/Helpers/RailsHelper/TemplateConverter.html +24 -24
- data/doc-api/classes/Erubis/InterpolationEnhancer.html +38 -39
- data/doc-api/classes/Erubis/JavaGenerator.html +60 -60
- data/doc-api/classes/Erubis/JavascriptGenerator.html +66 -66
- data/doc-api/classes/Erubis/Main.html +22 -22
- data/doc-api/classes/Erubis/NoCodeEnhancer.html +30 -30
- data/doc-api/classes/Erubis/NoTextEnhancer.html +6 -6
- data/doc-api/classes/Erubis/OptimizedEruby.html +6 -6
- data/doc-api/classes/Erubis/OptimizedGenerator.html +72 -72
- data/doc-api/classes/Erubis/OptimizedXmlEruby.html +6 -6
- data/doc-api/classes/Erubis/PI.html +1 -0
- data/doc-api/classes/Erubis/PI/Converter.html +18 -18
- data/doc-api/classes/Erubis/PI/Ec.html +6 -6
- data/doc-api/classes/Erubis/PI/Ecpp.html +166 -0
- data/doc-api/classes/Erubis/PI/Ejava.html +6 -6
- data/doc-api/classes/Erubis/PI/Ejavascript.html +6 -6
- data/doc-api/classes/Erubis/PI/Eperl.html +6 -6
- data/doc-api/classes/Erubis/PI/Ephp.html +6 -6
- data/doc-api/classes/Erubis/PI/Eruby.html +7 -7
- data/doc-api/classes/Erubis/PI/Escheme.html +6 -6
- data/doc-api/classes/Erubis/PI/TinyEruby.html +24 -24
- data/doc-api/classes/Erubis/PercentLineEnhancer.html +18 -34
- data/doc-api/classes/Erubis/PerlGenerator.html +54 -54
- data/doc-api/classes/Erubis/PhpGenerator.html +54 -54
- 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 +12 -12
- data/doc-api/classes/Erubis/PreprocessingHelper.html +22 -22
- data/doc-api/classes/Erubis/PrintEnabledEnhancer.html +20 -20
- data/doc-api/classes/Erubis/PrintOutEnhancer.html +33 -33
- data/doc-api/classes/Erubis/RubyEvaluator.html +18 -18
- data/doc-api/classes/Erubis/RubyGenerator.html +59 -58
- data/doc-api/classes/Erubis/SchemeGenerator.html +60 -60
- data/doc-api/classes/Erubis/SimplifyEnhancer.html +7 -7
- data/doc-api/classes/Erubis/StdoutEnhancer.html +13 -13
- data/doc-api/classes/Erubis/StringBufferEnhancer.html +14 -14
- data/doc-api/classes/Erubis/TinyEruby.html +24 -24
- data/doc-api/classes/Erubis/XmlHelper.html +30 -30
- data/doc-api/classes/Kernel.html +155 -0
- data/doc-api/created.rid +1 -1
- data/doc-api/files/README_txt.html +3 -3
- data/doc-api/files/erubis/context_rb.html +1 -1
- data/doc-api/files/erubis/converter_rb.html +3 -3
- data/doc-api/files/erubis/engine/ec_rb.html +1 -1
- 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 +1 -1
- data/doc-api/files/erubis/engine/ephp_rb.html +1 -1
- data/doc-api/files/erubis/engine/eruby_rb.html +2 -2
- data/doc-api/files/erubis/engine/escheme_rb.html +1 -1
- data/doc-api/files/erubis/engine/optimized_rb.html +1 -1
- 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 +1 -1
- data/doc-api/files/erubis/evaluator_rb.html +1 -1
- data/doc-api/files/erubis/generator_rb.html +3 -3
- data/doc-api/files/erubis/helper_rb.html +1 -1
- data/doc-api/files/erubis/helpers/rails_form_helper_rb.html +1 -1
- data/doc-api/files/erubis/helpers/rails_helper_rb.html +1 -1
- data/doc-api/files/erubis/local-setting_rb.html +1 -1
- data/doc-api/files/erubis/main_rb.html +4 -2
- data/doc-api/files/erubis/preprocessing_rb.html +1 -1
- data/doc-api/files/erubis/tiny_rb.html +1 -1
- 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 +7 -0
- data/doc-api/fr_file_index.html +2 -0
- data/doc-api/fr_method_index.html +237 -223
- data/doc/docstyle.css +25 -4
- data/doc/users-guide.html +286 -21
- data/examples/basic/Makefile +7 -2
- data/examples/basic/example.ecpp +33 -0
- data/lib/erubis.rb +4 -3
- data/lib/erubis/context.rb +2 -2
- data/lib/erubis/converter.rb +3 -3
- data/lib/erubis/engine.rb +8 -8
- data/lib/erubis/engine/ec.rb +2 -2
- data/lib/erubis/engine/ecpp.rb +113 -0
- data/lib/erubis/engine/ejava.rb +9 -9
- data/lib/erubis/engine/ejavascript.rb +9 -9
- data/lib/erubis/engine/enhanced.rb +7 -2
- data/lib/erubis/engine/eperl.rb +2 -2
- data/lib/erubis/engine/ephp.rb +2 -2
- data/lib/erubis/engine/eruby.rb +8 -7
- data/lib/erubis/engine/escheme.rb +2 -2
- data/lib/erubis/engine/optimized.rb +2 -2
- data/lib/erubis/enhancer.rb +70 -27
- data/lib/erubis/error.rb +2 -2
- data/lib/erubis/evaluator.rb +2 -2
- data/lib/erubis/generator.rb +3 -3
- data/lib/erubis/helper.rb +2 -2
- data/lib/erubis/helpers/rails_form_helper.rb +2 -2
- data/lib/erubis/helpers/rails_helper.rb +2 -2
- data/lib/erubis/local-setting.rb +2 -2
- data/lib/erubis/main.rb +31 -4
- data/lib/erubis/preprocessing.rb +2 -2
- data/lib/erubis/tiny.rb +2 -2
- data/lib/erubis/util.rb +22 -0
- data/test/assert-text-equal.rb +2 -2
- 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/example.ecpp +30 -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/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/test-engines.rb +58 -2
- data/test/test-enhancers.rb +51 -2
- data/test/test-erubis.rb +14 -10
- data/test/test-index-cgi.rb +191 -0
- data/test/test-main.rb +35 -4
- data/test/test-users-guide.rb +18 -2
- data/test/test.rb +18 -2
- data/test/testutil.rb +22 -7
- 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
|
2
|
-
#line 1 "example.
|
1
|
+
$ erubis -l cpp example.ecpp
|
2
|
+
#line 1 "example.ecpp"
|
3
3
|
|
4
|
-
#include <
|
4
|
+
#include <string>
|
5
|
+
#include <iostream>
|
6
|
+
#include <sstream>
|
5
7
|
|
6
8
|
int main(int argc, char *argv[])
|
7
9
|
{
|
8
|
-
|
10
|
+
std::stringstream _buf;
|
9
11
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
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
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
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,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,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,6 +1,6 @@
|
|
1
1
|
##
|
2
|
-
## $Release: 2.
|
3
|
-
## copyright(c) 2006-
|
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
|
data/test/test-enhancers.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
##
|
2
|
-
## $Release: 2.
|
3
|
-
## copyright(c) 2006-
|
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><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
|
+
|
500
549
|
##
|
501
550
|
- name: headerfooter1
|
502
551
|
class: HeaderFooterEruby
|
data/test/test-erubis.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
##
|
2
|
-
## $Release: 2.
|
3
|
-
## copyright(c) 2006-
|
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
|
-
|
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
|
-
|
141
|
+
File.mtime(filename) < File.mtime(cachename) or raise "** failed"
|
139
142
|
engine = @klass.load_file(filename)
|
140
|
-
assert_block('cache should
|
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
|
-
|
149
|
+
File.mtime(filename) > File.mtime(cachename) or raise "** failed"
|
146
150
|
engine = @klass.load_file(filename)
|
147
|
-
assert_block('cache should
|
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
|