temple 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,20 @@
1
+ require 'irb/ruby-lex'
2
+ require 'stringio'
3
+
4
+ module Temple
5
+ module Utils
6
+ extend self
7
+
8
+ LITERAL_TOKENS = [RubyToken::TkSTRING, RubyToken::TkDSTRING]
9
+
10
+ def literal_string?(str)
11
+ lexer = RubyLex.new
12
+ lexer.set_input(StringIO.new(str.strip))
13
+
14
+ # The first token has to be a string.
15
+ LITERAL_TOKENS.include?(lexer.token.class) and
16
+ # That has to be the only token.
17
+ lexer.token.nil?
18
+ end
19
+ end
20
+ end
data/temple.gemspec CHANGED
@@ -1,52 +1,18 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
1
  # -*- encoding: utf-8 -*-
5
2
 
6
3
  Gem::Specification.new do |s|
7
4
  s.name = %q{temple}
8
- s.version = "0.0.1"
5
+ s.version = "0.1.0"
9
6
 
10
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
8
  s.authors = ["Magnus Holm"]
12
- s.date = %q{2009-12-15}
9
+ s.date = %q{2010-01-23}
13
10
  s.email = %q{judofyr@gmail.com}
14
- s.extra_rdoc_files = [
15
- "README"
16
- ]
17
- s.files = [
18
- "README",
19
- "Rakefile",
20
- "VERSION",
21
- "lib/temple.rb",
22
- "lib/temple/core.rb",
23
- "lib/temple/engine.rb",
24
- "lib/temple/filters/dynamic_inliner.rb",
25
- "lib/temple/filters/escapable.rb",
26
- "lib/temple/filters/mustache.rb",
27
- "lib/temple/filters/static_merger.rb",
28
- "lib/temple/generator.rb",
29
- "lib/temple/parsers/erb.rb",
30
- "lib/temple/parsers/mustache.rb",
31
- "spec/dynamic_inliner_spec.rb",
32
- "spec/escapable_spec.rb",
33
- "spec/spec_helper.rb",
34
- "spec/static_merger_spec.rb",
35
- "spec/temple_spec.rb",
36
- "temple.gemspec"
37
- ]
11
+ s.files = [".yardopts", "LICENSE", "README.md", "Rakefile", "lib/temple.rb", "lib/temple/core.rb", "lib/temple/engine.rb", "lib/temple/engines/erb.rb", "lib/temple/filters/dynamic_inliner.rb", "lib/temple/filters/escapable.rb", "lib/temple/filters/multi_flattener.rb", "lib/temple/filters/static_merger.rb", "lib/temple/generator.rb", "lib/temple/parsers/erb.rb", "lib/temple/utils.rb", "temple.gemspec", "test/engines/hello.erb", "test/engines/test_erb.rb", "test/engines/test_erb_m17n.rb", "test/filters/test_dynamic_inliner.rb", "test/filters/test_escapable.rb", "test/filters/test_static_merger.rb", "test/helper.rb", "test/test_generator.rb"]
38
12
  s.homepage = %q{http://github.com/judofyr/temple}
39
- s.rdoc_options = ["--charset=UTF-8"]
40
13
  s.require_paths = ["lib"]
41
- s.rubygems_version = %q{1.3.5}
42
- s.summary = %q{Template compilation framework in Ruby}
43
- s.test_files = [
44
- "spec/spec_helper.rb",
45
- "spec/static_merger_spec.rb",
46
- "spec/escapable_spec.rb",
47
- "spec/dynamic_inliner_spec.rb",
48
- "spec/temple_spec.rb"
49
- ]
14
+ s.rubygems_version = %q{1.3.6}
15
+ s.summary = %q{Template compilation framework in RUby}
50
16
 
51
17
  if s.respond_to? :specification_version then
52
18
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
@@ -58,4 +24,3 @@ Gem::Specification.new do |s|
58
24
  else
59
25
  end
60
26
  end
61
-
@@ -0,0 +1,4 @@
1
+ = hello
2
+ <% 3.times do |n| %>
3
+ * <%= n %>
4
+ <% end %>
@@ -0,0 +1,495 @@
1
+ require File.dirname(__FILE__) + '/../helper'
2
+ require 'erb'
3
+
4
+ NormalERB = ::ERB
5
+ TempleERB = Temple::Engines::ERB
6
+
7
+ class TestTempleEnginesERB < Test::Unit::TestCase
8
+ class MyError < RuntimeError ; end
9
+
10
+ def test_rock_suck
11
+ assert_equal(NormalERB, ::ERB)
12
+ TempleERB.rock!
13
+ assert_equal(TempleERB, ::ERB)
14
+ TempleERB.suck!
15
+ assert_equal(NormalERB, ::ERB)
16
+ end
17
+
18
+ def test_change_generator
19
+ gen = Temple::Core::StringBuffer
20
+ erb = TempleERB.new("Hello", nil, nil, 'foo', :generator => gen)
21
+ assert_match(/foo = ''/, erb.src)
22
+
23
+ erb = TempleERB.new("Hello", nil, nil, 'foo', :generator => gen.new(:buffer => "bar"))
24
+ assert_match(/bar = ''/, erb.src)
25
+ assert_no_match(/foo/, erb.src)
26
+ end
27
+
28
+ def test_optimizers
29
+ obj = Object.new
30
+ def obj.compile(exp)
31
+ [:static, "Hello World!"]
32
+ end
33
+
34
+ TempleERB::Optimizers << obj
35
+
36
+ erb = TempleERB.new("Hello")
37
+ assert_equal("Hello World!", erb.result)
38
+ ensure
39
+ TempleERB::Optimizers.delete(obj)
40
+ end
41
+
42
+ def test_without_filename
43
+ erb = TempleERB.new("<% raise ::TestTempleEnginesERB::MyError %>")
44
+ e = assert_raise(MyError) {
45
+ erb.result
46
+ }
47
+ assert_match(/\A\(erb\):1\b/, e.backtrace[0])
48
+ end
49
+
50
+ def test_with_filename
51
+ erb = TempleERB.new("<% raise ::TestTempleEnginesERB::MyError %>")
52
+ erb.filename = "test filename"
53
+ e = assert_raise(MyError) {
54
+ erb.result
55
+ }
56
+ assert_match(/\Atest filename:1\b/, e.backtrace[0])
57
+ end
58
+
59
+ def test_without_filename_with_safe_level
60
+ erb = TempleERB.new("<% raise ::TestTempleEnginesERB::MyError %>", 1)
61
+ e = assert_raise(MyError) {
62
+ erb.result
63
+ }
64
+ assert_match(/\A\(erb\):1\b/, e.backtrace[0])
65
+ end
66
+
67
+ def test_with_filename_and_safe_level
68
+ erb = TempleERB.new("<% raise ::TestTempleEnginesERB::MyError %>", 1)
69
+ erb.filename = "test filename"
70
+ e = assert_raise(MyError) {
71
+ erb.result
72
+ }
73
+ assert_match(/\Atest filename:1\b/, e.backtrace[0])
74
+ end
75
+ end
76
+
77
+ class TestTempleEnginesERBCore < Test::Unit::TestCase
78
+ def setup
79
+ @erb = TempleERB
80
+ end
81
+
82
+ def test_core
83
+ _test_core(nil)
84
+ _test_core(0)
85
+ _test_core(1)
86
+ _test_core(2)
87
+ _test_core(3)
88
+ end
89
+
90
+ def _test_core(safe)
91
+ erb = @erb.new("hello")
92
+ assert_equal("hello", erb.result)
93
+
94
+ erb = @erb.new("hello", safe, 0)
95
+ assert_equal("hello", erb.result)
96
+
97
+ erb = @erb.new("hello", safe, 1)
98
+ assert_equal("hello", erb.result)
99
+
100
+ erb = @erb.new("hello", safe, 2)
101
+ assert_equal("hello", erb.result)
102
+
103
+ src = <<EOS
104
+ %% hi
105
+ = hello
106
+ <% 3.times do |n| %>
107
+ % n=0
108
+ * <%= n %>
109
+ <% end %>
110
+ EOS
111
+
112
+ ans = <<EOS
113
+ %% hi
114
+ = hello
115
+
116
+ % n=0
117
+ * 0
118
+
119
+ % n=0
120
+ * 1
121
+
122
+ % n=0
123
+ * 2
124
+
125
+ EOS
126
+ erb = @erb.new(src)
127
+ assert_equal(ans, erb.result)
128
+ erb = @erb.new(src, safe, 0)
129
+ assert_equal(ans, erb.result)
130
+ erb = @erb.new(src, safe, '')
131
+ assert_equal(ans, erb.result)
132
+
133
+ ans = <<EOS
134
+ %% hi
135
+ = hello
136
+ % n=0
137
+ * 0% n=0
138
+ * 1% n=0
139
+ * 2
140
+ EOS
141
+ erb = @erb.new(src, safe, 1)
142
+ assert_equal(ans.chomp, erb.result)
143
+ erb = @erb.new(src, safe, '>')
144
+ assert_equal(ans.chomp, erb.result)
145
+
146
+ ans = <<EOS
147
+ %% hi
148
+ = hello
149
+ % n=0
150
+ * 0
151
+ % n=0
152
+ * 1
153
+ % n=0
154
+ * 2
155
+ EOS
156
+
157
+ erb = @erb.new(src, safe, 2)
158
+ assert_equal(ans, erb.result)
159
+ erb = @erb.new(src, safe, '<>')
160
+ assert_equal(ans, erb.result)
161
+
162
+ ans = <<EOS
163
+ % hi
164
+ = hello
165
+
166
+ * 0
167
+
168
+ * 0
169
+
170
+ * 0
171
+
172
+ EOS
173
+ erb = @erb.new(src, safe, '%')
174
+ assert_equal(ans, erb.result)
175
+
176
+ ans = <<EOS
177
+ % hi
178
+ = hello
179
+ * 0* 0* 0
180
+ EOS
181
+ erb = @erb.new(src, safe, '%>')
182
+ assert_equal(ans.chomp, erb.result)
183
+
184
+ ans = <<EOS
185
+ % hi
186
+ = hello
187
+ * 0
188
+ * 0
189
+ * 0
190
+ EOS
191
+ erb = @erb.new(src, safe, '%<>')
192
+ assert_equal(ans, erb.result)
193
+ end
194
+
195
+ def test_safe_04
196
+ erb = @erb.new('<%=$SAFE%>', 4)
197
+ assert_equal('4', erb.result(TOPLEVEL_BINDING.taint))
198
+ end
199
+
200
+ class Foo; end
201
+
202
+ def test_def_class
203
+ erb = @erb.new('hello')
204
+ cls = erb.def_class
205
+ assert_equal(Object, cls.superclass)
206
+ assert(cls.new.respond_to?('result'))
207
+ cls = erb.def_class(Foo)
208
+ assert_equal(Foo, cls.superclass)
209
+ assert(cls.new.respond_to?('result'))
210
+ cls = erb.def_class(Object, 'erb')
211
+ assert_equal(Object, cls.superclass)
212
+ assert(cls.new.respond_to?('erb'))
213
+ end
214
+
215
+ def test_percent
216
+ src = <<EOS
217
+ %n = 1
218
+ <%= n%>
219
+ EOS
220
+ assert_equal("1\n", TempleERB.new(src, nil, '%').result)
221
+
222
+ src = <<EOS
223
+ <%
224
+ %>
225
+ EOS
226
+ ans = "\n"
227
+ assert_equal(ans, TempleERB.new(src, nil, '%').result)
228
+
229
+ src = "<%\n%>"
230
+ # ans = "\n"
231
+ ans = ""
232
+ assert_equal(ans, TempleERB.new(src, nil, '%').result)
233
+
234
+ src = <<EOS
235
+ <%
236
+ n = 1
237
+ %><%= n%>
238
+ EOS
239
+ assert_equal("1\n", TempleERB.new(src, nil, '%').result)
240
+
241
+ src = <<EOS
242
+ %n = 1
243
+ %% <% n = 2
244
+ n.times do |i|%>
245
+ %% %%><%%<%= i%><%
246
+ end%>
247
+ %%%
248
+ EOS
249
+ ans = <<EOS
250
+ %
251
+ % %%><%0
252
+ % %%><%1
253
+ %%
254
+ EOS
255
+ assert_equal(ans, TempleERB.new(src, nil, '%').result)
256
+ end
257
+
258
+ def test_def_erb_method
259
+ klass = Class.new
260
+ klass.module_eval do
261
+ extend ERB::DefMethod
262
+ fname = File.join(File.dirname(File.expand_path(__FILE__)), 'hello.erb')
263
+ def_erb_method('hello', fname)
264
+ end
265
+ assert(klass.new.respond_to?('hello'))
266
+
267
+ assert(! klass.new.respond_to?('hello_world'))
268
+ erb = @erb.new('hello, world')
269
+ klass.module_eval do
270
+ def_erb_method('hello_world', erb)
271
+ end
272
+ assert(klass.new.respond_to?('hello_world'))
273
+ end
274
+
275
+ def test_def_method_without_filename
276
+ klass = Class.new
277
+ erb = TempleERB.new("<% raise ::TestTempleEnginesERB::MyError %>")
278
+ erb.filename = "test filename"
279
+ assert(! klass.new.respond_to?('my_error'))
280
+ erb.def_method(klass, 'my_error')
281
+ e = assert_raise(::TestTempleEnginesERB::MyError) {
282
+ klass.new.my_error
283
+ }
284
+ assert_match(/\A\(ERB\):1\b/, e.backtrace[0])
285
+ end
286
+
287
+ def test_def_method_with_fname
288
+ klass = Class.new
289
+ erb = TempleERB.new("<% raise ::TestTempleEnginesERB::MyError %>")
290
+ erb.filename = "test filename"
291
+ assert(! klass.new.respond_to?('my_error'))
292
+ erb.def_method(klass, 'my_error', 'test fname')
293
+ e = assert_raise(::TestTempleEnginesERB::MyError) {
294
+ klass.new.my_error
295
+ }
296
+ assert_match(/\Atest fname:1\b/, e.backtrace[0])
297
+ end
298
+
299
+ def test_escape
300
+ src = <<EOS
301
+ 1.<%% : <%="<%%"%>
302
+ 2.%%> : <%="%%>"%>
303
+ 3.
304
+ % x = "foo"
305
+ <%=x%>
306
+ 4.
307
+ %% print "foo"
308
+ 5.
309
+ %% <%="foo"%>
310
+ 6.<%="
311
+ % print 'foo'
312
+ "%>
313
+ 7.<%="
314
+ %% print 'foo'
315
+ "%>
316
+ EOS
317
+ ans = <<EOS
318
+ 1.<% : <%%
319
+ 2.%%> : %>
320
+ 3.
321
+ foo
322
+ 4.
323
+ % print "foo"
324
+ 5.
325
+ % foo
326
+ 6.
327
+ % print 'foo'
328
+
329
+ 7.
330
+ %% print 'foo'
331
+
332
+ EOS
333
+ assert_equal(ans, TempleERB.new(src, nil, '%').result)
334
+ end
335
+
336
+ def test_keep_lineno
337
+ src = <<EOS
338
+ Hello,
339
+ % x = "World"
340
+ <%= x%>
341
+ % raise("lineno")
342
+ EOS
343
+
344
+ erb = TempleERB.new(src, nil, '%')
345
+ begin
346
+ erb.result
347
+ assert(false)
348
+ rescue
349
+ assert_match(/\A\(erb\):4\b/, $@[0].to_s)
350
+ end
351
+
352
+ src = <<EOS
353
+ %>
354
+ Hello,
355
+ <% x = "World%%>
356
+ "%>
357
+ <%= x%>
358
+ EOS
359
+
360
+ ans = <<EOS
361
+ %>Hello,
362
+ World%>
363
+ EOS
364
+ assert_equal(ans, TempleERB.new(src, nil, '>').result)
365
+
366
+ ans = <<EOS
367
+ %>
368
+ Hello,
369
+
370
+ World%>
371
+ EOS
372
+ assert_equal(ans, TempleERB.new(src, nil, '<>').result)
373
+
374
+ ans = <<EOS
375
+ %>
376
+ Hello,
377
+
378
+ World%>
379
+
380
+ EOS
381
+ assert_equal(ans, TempleERB.new(src).result)
382
+
383
+ src = <<EOS
384
+ Hello,
385
+ <% x = "World%%>
386
+ "%>
387
+ <%= x%>
388
+ <% raise("lineno") %>
389
+ EOS
390
+
391
+ erb = TempleERB.new(src)
392
+ begin
393
+ erb.result
394
+ assert(false)
395
+ rescue
396
+ assert_match(/\A\(erb\):5\b/, $@[0].to_s)
397
+ end
398
+
399
+ erb = TempleERB.new(src, nil, '>')
400
+ begin
401
+ erb.result
402
+ assert(false)
403
+ rescue
404
+ assert_match(/\A\(erb\):5\b/, $@[0].to_s)
405
+ end
406
+
407
+ erb = TempleERB.new(src, nil, '<>')
408
+ begin
409
+ erb.result
410
+ assert(false)
411
+ rescue
412
+ assert_match(/\A\(erb\):5\b/, $@[0].to_s)
413
+ end
414
+
415
+ src = <<EOS
416
+ % y = 'Hello'
417
+ <%- x = "World%%>
418
+ "-%>
419
+ <%= x %><%- x = nil -%>
420
+ <% raise("lineno") %>
421
+ EOS
422
+
423
+ erb = TempleERB.new(src, nil, '-')
424
+ begin
425
+ erb.result
426
+ assert(false)
427
+ rescue
428
+ assert_match(/\A\(erb\):5\b/, $@[0].to_s)
429
+ end
430
+
431
+ erb = TempleERB.new(src, nil, '%-')
432
+ begin
433
+ erb.result
434
+ assert(false)
435
+ rescue
436
+ assert_match(/\A\(erb\):5\b/, $@[0].to_s)
437
+ end
438
+ end
439
+
440
+ def test_explicit
441
+ src = <<EOS
442
+ <% x = %w(hello world) -%>
443
+ NotSkip <%- y = x -%> NotSkip
444
+ <% x.each do |w| -%>
445
+ <%- up = w.upcase -%>
446
+ * <%= up %>
447
+ <% end -%>
448
+ <%- z = nil -%> NotSkip <%- z = x %>
449
+ <%- z.each do |w| -%>
450
+ <%- down = w.downcase -%>
451
+ * <%= down %>
452
+ <%- up = w.upcase -%>
453
+ * <%= up %>
454
+ <%- end -%>
455
+ KeepNewLine <%- z = nil -%>
456
+ EOS
457
+
458
+ ans = <<EOS
459
+ NotSkip NotSkip
460
+ * HELLO
461
+ * WORLD
462
+ NotSkip
463
+ * hello
464
+ * HELLO
465
+ * world
466
+ * WORLD
467
+ KeepNewLine
468
+ EOS
469
+ assert_equal(ans, TempleERB.new(src, nil, '-').result)
470
+ assert_equal(ans, TempleERB.new(src, nil, '-%').result)
471
+ end
472
+
473
+ def test_url_encode
474
+ assert_equal("Programming%20Ruby%3A%20%20The%20Pragmatic%20Programmer%27s%20Guide",
475
+ ERB::Util.url_encode("Programming Ruby: The Pragmatic Programmer's Guide"))
476
+
477
+ if "".respond_to?(:force_encoding)
478
+ assert_equal("%A5%B5%A5%F3%A5%D7%A5%EB",
479
+ ERB::Util.url_encode("\xA5\xB5\xA5\xF3\xA5\xD7\xA5\xEB".force_encoding("EUC-JP")))
480
+ end
481
+ end
482
+ end
483
+
484
+ class TestTempleEnginesERBCoreWOStrScan < TestTempleEnginesERBCore
485
+ def setup
486
+ @save_map = ERB::Compiler::Scanner.instance_variable_get('@scanner_map')
487
+ map = {[nil, false]=>ERB::Compiler::SimpleScanner}
488
+ ERB::Compiler::Scanner.instance_variable_set('@scanner_map', map)
489
+ super
490
+ end
491
+
492
+ def teardown
493
+ ERB::Compiler::Scanner.instance_variable_set('@scanner_map', @save_map)
494
+ end
495
+ end