temple 0.0.1 → 0.1.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,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