erubis 1.0.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.
@@ -0,0 +1,229 @@
1
+ ##
2
+ ## $Rev: 3 $
3
+ ## $Release: 1.0.0 $
4
+ ## $Date: 2006-01-31 12:54:23 +0900 (Tue, 31 Jan 2006) $
5
+ ##
6
+
7
+ testdir = File.dirname(File.expand_path(__FILE__))
8
+ libdir = File.dirname(testdir) + '/lib'
9
+ $: << testdir
10
+ $: << libdir
11
+
12
+ bindir = File.dirname(testdir) + '/bin'
13
+ $script = bindir + '/erubis'
14
+ if test(?f, 'bin/erubis')
15
+ $script = 'bin/erubis'
16
+ elsif test(?f, '../bin/erubis')
17
+ $script = '../bin/erubis'
18
+ end
19
+
20
+
21
+ require 'test/unit'
22
+ #require 'test/unit/ui/console/testrunner'
23
+ require 'assert-diff'
24
+ require 'yaml'
25
+ require 'tempfile'
26
+
27
+ require 'erubis'
28
+
29
+
30
+ class BinTest < Test::Unit::TestCase
31
+
32
+ INPUT = <<'END'
33
+ list:
34
+ <% list = ['<aaa>', 'b&b', '"ccc"']
35
+ for item in list %>
36
+ - <%= item %>
37
+ <% end %>
38
+ user: <%= defined?(user) ? user : "(none)" %>
39
+ END
40
+
41
+ SRC = <<'END'
42
+ _out = ''; _out << "list:\n"
43
+ list = ['<aaa>', 'b&b', '"ccc"']
44
+ for item in list
45
+ _out << " - "; _out << ( item ).to_s; _out << "\n"
46
+ end
47
+ _out << "user: "; _out << ( defined?(user) ? user : "(none)" ).to_s; _out << "\n"
48
+ _out
49
+ END
50
+
51
+ OUTPUT = <<'END'
52
+ list:
53
+ - <aaa>
54
+ - b&b
55
+ - "ccc"
56
+ user: (none)
57
+ END
58
+
59
+
60
+ def _test()
61
+ if @filename == nil
62
+ method = (caller[0] =~ /in `(.*)'/) && $1 #'
63
+ @filename = "tmp.#{method}"
64
+ end
65
+ File.open(@filename, 'w') { |f| f.write(@input) } if @filename
66
+ begin
67
+ command = "ruby #{$script} #{@options} #{@filename}"
68
+ output = `#{command}`
69
+ ensure
70
+ File.unlink(@filename) if @filename && test(?f, @filename)
71
+ end
72
+ assert_equal_with_diff(@expected, output)
73
+ end
74
+
75
+
76
+ def test_version
77
+ @options = '-v'
78
+ @expected = (("$Release: 1.0.0 $" =~ /[.\d]+/) && $&) + "\n"
79
+ @filename = false
80
+ _test()
81
+ end
82
+
83
+
84
+ def test_basic1
85
+ @input = INPUT
86
+ @expected = OUTPUT
87
+ @options = ''
88
+ _test()
89
+ end
90
+
91
+
92
+ def test_source1
93
+ @input = INPUT
94
+ @expected = SRC
95
+ @options = '-s'
96
+ _test()
97
+ end
98
+
99
+
100
+ def test_pattern1
101
+ @input = INPUT.gsub(/<%/, '<!--%').gsub(/%>/, '%-->')
102
+ @expected = OUTPUT
103
+ @options = "-p '<!--% %-->'"
104
+ _test()
105
+ end
106
+
107
+
108
+ def test_class1
109
+ @input = INPUT
110
+ @expected = OUTPUT.gsub(/<aaa>/, '&lt;aaa&gt;').gsub(/b&b/, 'b&amp;b').gsub(/"ccc"/, '&quot;ccc&quot;')
111
+ @options = "-c XmlEruby"
112
+ _test()
113
+ end
114
+
115
+
116
+ def test_notrim1
117
+ @input = INPUT
118
+ @expected = <<'END'
119
+ list:
120
+
121
+ - <aaa>
122
+
123
+ - b&b
124
+
125
+ - "ccc"
126
+
127
+ user: (none)
128
+ END
129
+ @options = "-T"
130
+ _test()
131
+ end
132
+
133
+
134
+ def test_notrim2
135
+ @input = INPUT
136
+ @expected = <<'END'
137
+ _out = ''; _out << "list:\n"
138
+ list = ['<aaa>', 'b&b', '"ccc"']
139
+ for item in list ; _out << "\n"
140
+ _out << " - "; _out << ( item ).to_s; _out << "\n"
141
+ end ; _out << "\n"
142
+ _out << "user: "; _out << ( defined?(user) ? user : "(none)" ).to_s; _out << "\n"
143
+ _out
144
+ END
145
+ @options = "-sT"
146
+ _test()
147
+ end
148
+
149
+
150
+ def test_context1
151
+ @input = INPUT
152
+ @expected = OUTPUT.gsub(/\(none\)/, 'Hello')
153
+ @options = '--user=Hello'
154
+ _test()
155
+ end
156
+
157
+
158
+ def test_yaml1
159
+ yamlfile = "test.context1.yaml"
160
+ @input = INPUT
161
+ @expected = OUTPUT.gsub(/\(none\)/, 'Hello')
162
+ @options = "-f #{yamlfile}"
163
+ #
164
+ yaml = <<-END
165
+ user: Hello
166
+ password: world
167
+ END
168
+ File.open(yamlfile, 'w') { |f| f.write(yaml) }
169
+ begin
170
+ _test()
171
+ ensure
172
+ File.unlink(yamlfile) if test(?f, yamlfile)
173
+ end
174
+ end
175
+
176
+
177
+ def test_include1
178
+ dir = 'foo'
179
+ lib = 'bar'
180
+ Dir.mkdir dir unless test(?d, dir)
181
+ filename = "#{dir}/#{lib}.rb"
182
+ File.open(filename, 'w') do |f|
183
+ f.write <<-'END'
184
+ def escape(str)
185
+ return "<#{str.upcase}>"
186
+ end
187
+ END
188
+ end
189
+ #
190
+ @input = "<% require '#{lib}' %>\n" + INPUT.gsub(/<%= item %>/, '<%= escape(item) %>')
191
+ @expected = OUTPUT.gsub(/<aaa>/, '<<AAA>>').gsub(/b\&b/, '<B&B>').gsub(/"ccc"/, '<"CCC">')
192
+ @options = "-I #{dir}"
193
+ #
194
+ begin
195
+ _test()
196
+ ensure
197
+ File.unlink filename if test(?f, filename)
198
+ Dir.rmdir dir if test(?d, dir)
199
+ end
200
+ end
201
+
202
+
203
+ def test_require1
204
+ dir = 'foo'
205
+ lib = 'bar'
206
+ Dir.mkdir dir unless test(?d, dir)
207
+ filename = "#{dir}/#{lib}.rb"
208
+ File.open(filename, 'w') do |f|
209
+ f.write <<-'END'
210
+ def escape(str)
211
+ return "<#{str.upcase}>"
212
+ end
213
+ END
214
+ end
215
+ #
216
+ @input = INPUT.gsub(/<%= item %>/, '<%= escape(item) %>')
217
+ @expected = OUTPUT.gsub(/<aaa>/, '<<AAA>>').gsub(/b\&b/, '<B&B>').gsub(/"ccc"/, '<"CCC">')
218
+ @options = "-I #{dir} -r #{lib}"
219
+ #
220
+ begin
221
+ _test()
222
+ ensure
223
+ File.unlink filename if test(?f, filename)
224
+ Dir.rmdir dir if test(?d, dir)
225
+ end
226
+ end
227
+
228
+
229
+ end
@@ -0,0 +1,461 @@
1
+ ##
2
+ ## $Rev: 3 $
3
+ ## $Release: 1.0.0 $
4
+ ## $Date: 2006-01-31 12:54:23 +0900 (Tue, 31 Jan 2006) $
5
+ ##
6
+
7
+ testdir = File.dirname(__FILE__)
8
+ libdir = testdir == '.' ? '../lib' : File.dirname(testdir) + '/lib'
9
+ $: << testdir
10
+ $: << libdir
11
+
12
+ require 'test/unit'
13
+ #require 'test/unit/ui/console/testrunner'
14
+ require 'assert-diff'
15
+ require 'yaml'
16
+ require 'stringio'
17
+
18
+ require 'erubis'
19
+
20
+ class ErubisTest < Test::Unit::TestCase
21
+
22
+ #str = DATA.read()
23
+ str = File.read(__FILE__)
24
+ str.gsub!(/.*^__END__$/m, '')
25
+
26
+ @@ydocs = {}
27
+ YAML.load_documents(str) do |ydoc|
28
+ name = ydoc['name']
29
+ raise "*** test name '#{name}' is duplicated." if @@ydocs[name]
30
+ ydoc.each do |key, val|
31
+ if key[-1] == ?*
32
+ key = key.sub(/\*\z/, '')
33
+ val = val[$target]
34
+ ydoc[key] = val
35
+ end
36
+ end
37
+ @@ydocs[name] = ydoc
38
+ s = <<-END
39
+ def test_#{name}
40
+ @name = #{name.dump}
41
+ _test()
42
+ end
43
+ END
44
+ eval s
45
+ end
46
+
47
+ def _test()
48
+ ydoc = @@ydocs[@name]
49
+ input = ydoc['input']
50
+ src = ydoc['src'].gsub(/@/, ' ')
51
+ output = ydoc['output'].gsub(/@/, ' ')
52
+ klass = ydoc['class'] ? (eval "Erubis::#{ydoc['class']}") : Erubis::Eruby
53
+ options = ydoc['options'] || {}
54
+ testopt = ydoc['testopt']
55
+
56
+ if testopt != 'load_file'
57
+ eruby = klass.new(input, options)
58
+ else
59
+ filename = "tmp.#{name}.eruby"
60
+ begin
61
+ File.open(filename, 'w') { |f| f.write(input) }
62
+ eruby = klass.load_file(filename, options)
63
+ ensure
64
+ File.unlink(filename) if test(?f, filename)
65
+ end
66
+ end
67
+ assert_equal_with_diff(src, eruby.src)
68
+
69
+ return if testopt == 'skip_output'
70
+
71
+ context = {}
72
+ context[:list] = ['<aaa>', 'b&b', '"ccc"']
73
+
74
+ if testopt != 'stdout'
75
+ actual = eruby.evaluate(context)
76
+ assert_equal_with_diff(output, actual)
77
+ else
78
+ begin
79
+ orig = $stdout
80
+ $stdout = stringio = StringIO.new
81
+ actual = eruby.evaluate(context)
82
+ ensure
83
+ $stdout = orig if orig
84
+ end
85
+ assert_nil(actual)
86
+ assert_equal_with_diff(output, stringio.string)
87
+ end
88
+ end
89
+
90
+ end
91
+
92
+ __END__
93
+ ---
94
+ name: basic1
95
+ input: |
96
+ <ul>
97
+ <% for item in list %>
98
+ <li><%= item %></li>
99
+ <% end %>
100
+ </ul>
101
+ src: |
102
+ _out = ''; _out << "<ul>\n"
103
+ for item in list
104
+ _out << " <li>"; _out << ( item ).to_s; _out << "</li>\n"
105
+ end
106
+ _out << "</ul>\n"
107
+ _out
108
+ output: |
109
+ <ul>
110
+ <li><aaa></li>
111
+ <li>b&b</li>
112
+ <li>"ccc"</li>
113
+ </ul>
114
+ ##
115
+ ---
116
+ name: basic2
117
+ input: |
118
+ <ul>
119
+ <% i = 0
120
+ for item in list
121
+ i += 1
122
+ %>
123
+ <li><%= item %></li>
124
+ <% end %>
125
+ </ul>
126
+ src: |
127
+ _out = ''; _out << "<ul>\n"
128
+ i = 0
129
+ for item in list
130
+ i += 1
131
+ @@
132
+ _out << " <li>"; _out << ( item ).to_s; _out << "</li>\n"
133
+ end
134
+ _out << "</ul>\n"
135
+ _out
136
+ output: |
137
+ <ul>
138
+ <li><aaa></li>
139
+ <li>b&b</li>
140
+ <li>"ccc"</li>
141
+ </ul>
142
+ ##
143
+ ---
144
+ name: basic3
145
+ input: |
146
+ <ul><% i = 0
147
+ for item in list
148
+ i += 1 %><li><%= item %></li><% end %>
149
+ </ul>
150
+ src: |
151
+ _out = ''; _out << "<ul>"; i = 0
152
+ for item in list
153
+ i += 1 ; _out << "<li>"; _out << ( item ).to_s; _out << "</li>"; end ; _out << "\n"
154
+ _out << "</ul>\n"
155
+ _out
156
+ output: |
157
+ <ul><li><aaa></li><li>b&b</li><li>"ccc"</li>
158
+ </ul>
159
+ ##
160
+ ---
161
+ name: pattern1
162
+ options:
163
+ :pattern : '\[@ @\]'
164
+ input: |
165
+ <ul>
166
+ [@ for item in list @]
167
+ <li>[@= item @]</li>
168
+ [@ end @]
169
+ </ul>
170
+ src: |
171
+ _out = ''; _out << "<ul>\n"
172
+ for item in list
173
+ _out << " <li>"; _out << ( item ).to_s; _out << "</li>\n"
174
+ end
175
+ _out << "</ul>\n"
176
+ _out
177
+ output: |
178
+ <ul>
179
+ <li><aaa></li>
180
+ <li>b&b</li>
181
+ <li>"ccc"</li>
182
+ </ul>
183
+ ##
184
+ ---
185
+ name: pattern2
186
+ options:
187
+ :pattern : '<(?:!--)?% %(?:--)?>'
188
+ input: |
189
+ <ul>
190
+ <!--% for item in list %-->
191
+ <li><%= item %></li>
192
+ <!--% end %-->
193
+ </ul>
194
+ src: |
195
+ _out = ''; _out << "<ul>\n"
196
+ for item in list
197
+ _out << " <li>"; _out << ( item ).to_s; _out << "</li>\n"
198
+ end
199
+ _out << "</ul>\n"
200
+ _out
201
+ output: |
202
+ <ul>
203
+ <li><aaa></li>
204
+ <li>b&b</li>
205
+ <li>"ccc"</li>
206
+ </ul>
207
+ ##
208
+ ---
209
+ name: trim1
210
+ options:
211
+ :trim : false
212
+ input: |
213
+ <ul>
214
+ <% for item in list %>
215
+ <li><%= item %></li>
216
+ <% end %>
217
+ </ul>
218
+ src: |
219
+ _out = ''; _out << "<ul>\n"
220
+ _out << " "; for item in list ; _out << "\n"
221
+ _out << " <li>"; _out << ( item ).to_s; _out << "</li>\n"
222
+ _out << " "; end ; _out << "\n"
223
+ _out << "</ul>\n"
224
+ _out
225
+ output: |
226
+ <ul>
227
+ @
228
+ <li><aaa></li>
229
+ @
230
+ <li>b&b</li>
231
+ @
232
+ <li>"ccc"</li>
233
+ @
234
+ </ul>
235
+ ##
236
+ ---
237
+ name: xml1
238
+ class: XmlEruby
239
+ input: |
240
+ <pre>
241
+ <% for item in list %>
242
+ <%= item %>
243
+ <%== item %>
244
+ <% end %>
245
+ </pre>
246
+ src: |
247
+ _out = ''; _out << "<pre>\n"
248
+ for item in list
249
+ _out << " "; _out << Erubis::XmlEruby.escape( item ); _out << "\n"
250
+ _out << " "; _out << ( item ).to_s; _out << "\n"
251
+ end
252
+ _out << "</pre>\n"
253
+ _out
254
+ output: |
255
+ <pre>
256
+ &lt;aaa&gt;
257
+ <aaa>
258
+ b&amp;b
259
+ b&b
260
+ &quot;ccc&quot;
261
+ "ccc"
262
+ </pre>
263
+ ##
264
+ ---
265
+ name: xml2
266
+ class: XmlEruby
267
+ testopt: skip_output
268
+ input: |
269
+ <% for item in list %>
270
+ <%= item["var#{n}"] %>
271
+ <%== item["var#{n}"] %>
272
+ <%=== item["var#{n}"] %>
273
+ <%==== item["var#{n}"] %>
274
+ <% end %>
275
+ src: |
276
+ _out = ''; for item in list
277
+ _out << " "; _out << Erubis::XmlEruby.escape( item["var#{n}"] ); _out << "\n"
278
+ _out << " "; _out << ( item["var#{n}"] ).to_s; _out << "\n"
279
+ _out << " "; $stderr.puts("** erubis: item[\"var\#{n}\"] = #{(item["var#{n}"]).inspect}"); _out << "\n"
280
+ _out << " "; _out << "\n"
281
+ end
282
+ _out
283
+ output: |
284
+ ##
285
+ ---
286
+ name: fast1
287
+ class: FastEruby
288
+ input: |
289
+ <table>
290
+ <% for item in list %>
291
+ <tr>
292
+ <td><%= item %></td>
293
+ <td><%== item %></td>
294
+ </tr>
295
+ <% end %>
296
+ </table>
297
+ <ul><% for item in list %><li><%= item %></li><% end %></ul>
298
+ src: |
299
+ _out = ''; _out << "<table>\n"
300
+ for item in list
301
+ _out << " <tr>\n <td>"
302
+ _out << ( item ).to_s; _out << "</td>\n <td>"
303
+ _out << ( item ).to_s; _out << "</td>\n </tr>\n"
304
+
305
+ end
306
+ _out << "</table>\n<ul>"
307
+ for item in list ; _out << "<li>"; _out << ( item ).to_s; _out << "</li>"; end ; _out << "</ul>\n"
308
+ _out
309
+ output: |
310
+ <table>
311
+ <tr>
312
+ <td><aaa></td>
313
+ <td><aaa></td>
314
+ </tr>
315
+ <tr>
316
+ <td>b&b</td>
317
+ <td>b&b</td>
318
+ </tr>
319
+ <tr>
320
+ <td>"ccc"</td>
321
+ <td>"ccc"</td>
322
+ </tr>
323
+ </table>
324
+ <ul><li><aaa></li><li>b&b</li><li>"ccc"</li></ul>
325
+ ##
326
+ ---
327
+ name: fast2
328
+ class: FastXmlEruby
329
+ input: |
330
+ <table>
331
+ <% for item in list %>
332
+ <tr>
333
+ <td><%= item %></td>
334
+ <td><%== item %></td>
335
+ </tr>
336
+ <% end %>
337
+ </table>
338
+ <ul><% for item in list %><li><%= item %></li><% end %></ul>
339
+ src: |
340
+ _out = ''; _out << "<table>\n"
341
+ for item in list
342
+ _out << " <tr>\n <td>"
343
+ _out << Erubis::XmlEruby.escape( item ); _out << "</td>\n <td>"
344
+ _out << ( item ).to_s; _out << "</td>\n </tr>\n"
345
+
346
+ end
347
+ _out << "</table>\n<ul>"
348
+ for item in list ; _out << "<li>"; _out << Erubis::XmlEruby.escape( item ); _out << "</li>"; end ; _out << "</ul>\n"
349
+ _out
350
+ output: |
351
+ <table>
352
+ <tr>
353
+ <td>&lt;aaa&gt;</td>
354
+ <td><aaa></td>
355
+ </tr>
356
+ <tr>
357
+ <td>b&amp;b</td>
358
+ <td>b&b</td>
359
+ </tr>
360
+ <tr>
361
+ <td>&quot;ccc&quot;</td>
362
+ <td>"ccc"</td>
363
+ </tr>
364
+ </table>
365
+ <ul><li>&lt;aaa&gt;</li><li>b&amp;b</li><li>&quot;ccc&quot;</li></ul>
366
+ ##
367
+ ---
368
+ name: fast3
369
+ desc: bug
370
+ class: FastEruby
371
+ input: |
372
+ user = <%= "Foo" %>
373
+ <% for item in list %>
374
+ <%= item %>
375
+ <% end %>
376
+ src: |
377
+ _out = ''; _out << "user = "; _out << ( "Foo" ).to_s; _out << "\n"
378
+ for item in list
379
+ _out << " "; _out << ( item ).to_s; _out << "\n"
380
+ end
381
+ _out
382
+ # _out = ''; _out << "user = "; _out << ( "Foo" ).to_s; _out << "\n"
383
+ # _out << ""; for item in list
384
+ # _out << ""; _out << " "; _out << ( item ).to_s; _out << "\n"
385
+ # _out << ""; end
386
+ # _out << ""; _out
387
+ output: |
388
+ user = Foo
389
+ <aaa>
390
+ b&b
391
+ "ccc"
392
+ ##
393
+ ---
394
+ name: stdout1
395
+ class: StdoutEruby
396
+ testopt: stdout
397
+ input: |
398
+ <ul>
399
+ <% for item in list %>
400
+ <li><%= item %></li>
401
+ <% end %>
402
+ </ul>
403
+ src: |
404
+ _out = $stdout; _out << "<ul>\n"
405
+ for item in list
406
+ _out << " <li>"; _out << ( item ).to_s; _out << "</li>\n"
407
+ end
408
+ _out << "</ul>\n"
409
+ nil
410
+ output: |
411
+ <ul>
412
+ <li><aaa></li>
413
+ <li>b&b</li>
414
+ <li>"ccc"</li>
415
+ </ul>
416
+ ---
417
+ name: loadfile1
418
+ testopt: load_file
419
+ #input: |
420
+ # <ul>
421
+ # <% for item in list %>
422
+ # <li><%= item %></li>
423
+ # <% end %>
424
+ # </ul>
425
+ input:
426
+ "<ul>\r\n <% for item in list %>\r\n <li><%= item %></li>\r\n <% end %>\r\n</ul>\r\n"
427
+ #src: |
428
+ # _out = ''; _out << "<ul>\n"
429
+ # for item in list
430
+ # _out << " <li>"; _out << ( item ).to_s; _out << "</li>\n"
431
+ # end
432
+ # _out << "</ul>\n"
433
+ # _out
434
+ src:
435
+ "_out = ''; _out << \"<ul>\\r\\n\"\n for item in list \r\n_out << \" <li>\"; _out << ( item ).to_s; _out << \"</li>\\r\\n\"\n end \r\n_out << \"</ul>\\r\\n\"\n_out\n"
436
+ #output: |
437
+ # <ul>
438
+ # <li><aaa></li>
439
+ # <li>b&b</li>
440
+ # <li>"ccc"</li>
441
+ # </ul>
442
+ output:
443
+ "<ul>\r\n <li><aaa></li>\r\n <li>b&b</li>\r\n <li>\"ccc\"</li>\r\n</ul>\r\n"
444
+ ##
445
+ ---
446
+ name: nomatch1
447
+ desc: bug
448
+ input: |
449
+ <ul>
450
+ <li>foo</li>
451
+ </ul>
452
+ src: |
453
+ _out = ''; _out << "<ul>\n"
454
+ _out << " <li>foo</li>\n"
455
+ _out << "</ul>\n"
456
+ _out
457
+ output: |
458
+ <ul>
459
+ <li>foo</li>
460
+ </ul>
461
+ ##