porthole 0.99.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. data/LICENSE +20 -0
  2. data/README.md +415 -0
  3. data/Rakefile +89 -0
  4. data/bin/porthole +94 -0
  5. data/lib/porthole.rb +304 -0
  6. data/lib/porthole/context.rb +142 -0
  7. data/lib/porthole/generator.rb +195 -0
  8. data/lib/porthole/parser.rb +263 -0
  9. data/lib/porthole/settings.rb +226 -0
  10. data/lib/porthole/sinatra.rb +205 -0
  11. data/lib/porthole/template.rb +58 -0
  12. data/lib/porthole/version.rb +3 -0
  13. data/lib/rack/bug/panels/mustache_panel.rb +81 -0
  14. data/lib/rack/bug/panels/mustache_panel/mustache_extension.rb +27 -0
  15. data/lib/rack/bug/panels/mustache_panel/view.mustache +46 -0
  16. data/man/porthole.1 +165 -0
  17. data/man/porthole.1.html +213 -0
  18. data/man/porthole.1.ron +127 -0
  19. data/man/porthole.5 +539 -0
  20. data/man/porthole.5.html +422 -0
  21. data/man/porthole.5.ron +324 -0
  22. data/test/autoloading_test.rb +56 -0
  23. data/test/fixtures/comments.porthole +1 -0
  24. data/test/fixtures/comments.rb +14 -0
  25. data/test/fixtures/complex_view.porthole +17 -0
  26. data/test/fixtures/complex_view.rb +34 -0
  27. data/test/fixtures/crazy_recursive.porthole +9 -0
  28. data/test/fixtures/crazy_recursive.rb +31 -0
  29. data/test/fixtures/delimiters.porthole +8 -0
  30. data/test/fixtures/delimiters.rb +23 -0
  31. data/test/fixtures/dot_notation.porthole +10 -0
  32. data/test/fixtures/dot_notation.rb +25 -0
  33. data/test/fixtures/double_section.porthole +7 -0
  34. data/test/fixtures/double_section.rb +14 -0
  35. data/test/fixtures/escaped.porthole +1 -0
  36. data/test/fixtures/escaped.rb +14 -0
  37. data/test/fixtures/inner_partial.porthole +1 -0
  38. data/test/fixtures/inner_partial.txt +1 -0
  39. data/test/fixtures/inverted_section.porthole +7 -0
  40. data/test/fixtures/inverted_section.rb +14 -0
  41. data/test/fixtures/lambda.porthole +7 -0
  42. data/test/fixtures/lambda.rb +31 -0
  43. data/test/fixtures/method_missing.rb +19 -0
  44. data/test/fixtures/namespaced.porthole +1 -0
  45. data/test/fixtures/namespaced.rb +25 -0
  46. data/test/fixtures/nested_objects.porthole +17 -0
  47. data/test/fixtures/nested_objects.rb +35 -0
  48. data/test/fixtures/node.porthole +8 -0
  49. data/test/fixtures/partial_with_module.porthole +4 -0
  50. data/test/fixtures/partial_with_module.rb +37 -0
  51. data/test/fixtures/passenger.conf +5 -0
  52. data/test/fixtures/passenger.rb +27 -0
  53. data/test/fixtures/recursive.porthole +4 -0
  54. data/test/fixtures/recursive.rb +14 -0
  55. data/test/fixtures/simple.porthole +5 -0
  56. data/test/fixtures/simple.rb +26 -0
  57. data/test/fixtures/template_partial.porthole +2 -0
  58. data/test/fixtures/template_partial.rb +18 -0
  59. data/test/fixtures/template_partial.txt +4 -0
  60. data/test/fixtures/unescaped.porthole +1 -0
  61. data/test/fixtures/unescaped.rb +14 -0
  62. data/test/fixtures/utf8.porthole +3 -0
  63. data/test/fixtures/utf8_partial.porthole +1 -0
  64. data/test/helper.rb +7 -0
  65. data/test/parser_test.rb +78 -0
  66. data/test/partial_test.rb +168 -0
  67. data/test/porthole_test.rb +677 -0
  68. data/test/spec_test.rb +68 -0
  69. data/test/template_test.rb +20 -0
  70. metadata +127 -0
@@ -0,0 +1,677 @@
1
+ # -*- coding: utf-8 -*-
2
+ $LOAD_PATH.unshift File.dirname(__FILE__)
3
+ require 'helper'
4
+
5
+ class PortholeTest < Test::Unit::TestCase
6
+ def test_instance_render
7
+ klass = Class.new(Porthole)
8
+ klass.template = "Hi %%thing%%!"
9
+ assert_equal "Hi world!", klass.render(:thing => :world)
10
+ assert_equal "Nice.", klass.render("%%compliment%%.", :compliment => "Nice")
11
+ assert_equal <<-end_simple, Simple.new.render(:name => "yo", :in_ca => false)
12
+ Hello yo
13
+ You have just won $10000!
14
+ end_simple
15
+ end
16
+
17
+ def test_passenger
18
+ assert_equal <<-end_passenger, Passenger.to_text
19
+ <VirtualHost *>
20
+ ServerName example.com
21
+ DocumentRoot /var/www/example.com
22
+ RailsEnv production
23
+ </VirtualHost>
24
+ end_passenger
25
+ end
26
+
27
+ def test_complex_view
28
+ assert_equal <<-end_complex, ComplexView.render
29
+ <h1>Colors</h1>
30
+ <ul>
31
+ <li><strong>red</strong></li>
32
+ <li><a href="#Green">green</a></li>
33
+ <li><a href="#Blue">blue</a></li>
34
+ </ul>
35
+
36
+ end_complex
37
+ end
38
+
39
+ def test_nested_objects
40
+ assert_equal <<-end_complex, NestedObjects.render
41
+ <h1>Colors</h1>
42
+ <ul>
43
+ <li><strong>red</strong></li>
44
+ <li><a href="#Green">green</a></li>
45
+ <li><a href="#Blue">blue</a></li>
46
+ </ul>
47
+
48
+ end_complex
49
+ end
50
+
51
+ def test_single_line_sections
52
+ html = %(<p class="flash-notice" %%# no_flash %%style="display: none;"%%/ no_flash %%>)
53
+
54
+ instance = Porthole.new
55
+ instance.template = html
56
+ instance[:no_flash] = true
57
+ assert_equal %Q'<p class="flash-notice" style="display: none;">', instance.render
58
+ end
59
+
60
+ def test_strings_as_sections_do_not_enumerate
61
+ instance = Porthole.new
62
+ instance[:contact] = "Call 1-888-FLOWERS\nAsk for Johnson."
63
+ instance.template = "%%#contact%%<div id='contact'>%%contact%%</div>%%/contact%%"
64
+
65
+ assert_equal "<div id='contact'>Call 1-888-FLOWERS\nAsk for Johnson.</div>",
66
+ instance.render
67
+ end
68
+
69
+ def test_sassy_single_line_sections
70
+ instance = Porthole.new
71
+ instance[:full_time] = true
72
+ instance.template = "\n %%#full_time%%full time%%/full_time%%\n"
73
+
74
+ assert_equal "\n full time\n", instance.render
75
+ end
76
+
77
+ def test_sassier_single_line_sections
78
+ instance = Porthole.new
79
+ instance.template = "\t%%#list%%\r\n\t%%/list%%"
80
+
81
+ assert_equal "", instance.render
82
+ end
83
+
84
+ def test_padding_before_section
85
+ instance = Porthole.new
86
+ instance.template = "\t%%#list%%a%%/list%%"
87
+
88
+ assert_equal "\taa", instance.render(:list => [1, 2])
89
+ end
90
+
91
+ def test_padding_before_section_on_eos
92
+ instance = Porthole.new
93
+ instance.template = "%%#list%%\n\t%%/list%%"
94
+
95
+ assert_equal "", instance.render(:list => [1, 2])
96
+ end
97
+
98
+ def test_two_line_sections
99
+ html = %(<p class="flash-notice" %%# no_flash %%style="display: none;"\n%%/ no_flash %%>)
100
+
101
+ instance = Porthole.new
102
+ instance.template = html
103
+ instance[:no_flash] = true
104
+ assert_equal %Q'<p class="flash-notice" style="display: none;"\n>', instance.render
105
+ end
106
+
107
+ def test_multi_line_sections_preserve_trailing_newline
108
+ view = Porthole.new
109
+ view.template = <<template
110
+ %%#something%%
111
+ yay
112
+ %%/something%%
113
+ Howday.
114
+ template
115
+
116
+ view[:something] = true
117
+ assert_equal <<-rendered, view.render
118
+ yay
119
+ Howday.
120
+ rendered
121
+ end
122
+
123
+ def test_single_line_inverted_sections
124
+ html = %(<p class="flash-notice" %%^ flash %%style="display: none;"%%/ flash %%>)
125
+
126
+ instance = Porthole.new
127
+ instance.template = html
128
+ assert_equal %Q'<p class="flash-notice" style="display: none;">', instance.render
129
+ end
130
+
131
+ def test_simple
132
+ assert_equal <<-end_simple, Simple.render
133
+ Hello Chris
134
+ You have just won $10000!
135
+ Well, $6000.0, after taxes.
136
+ end_simple
137
+ end
138
+
139
+ def test_hash_assignment
140
+ view = Simple.new
141
+ view[:name] = 'Bob'
142
+ view[:value] = '4000'
143
+ view[:in_ca] = false
144
+
145
+ assert_equal <<-end_simple, view.render
146
+ Hello Bob
147
+ You have just won $4000!
148
+ end_simple
149
+ end
150
+
151
+ def test_crazier_hash_assignment
152
+ view = Simple.new
153
+ view[:name] = 'Crazy'
154
+ view[:in_ca] = [
155
+ { :taxed_value => 1 },
156
+ { :taxed_value => 2 },
157
+ { :taxed_value => 3 },
158
+ ]
159
+
160
+ assert_equal <<-end_simple, view.render
161
+ Hello Crazy
162
+ You have just won $10000!
163
+ Well, $1, after taxes.
164
+ Well, $2, after taxes.
165
+ Well, $3, after taxes.
166
+ end_simple
167
+ end
168
+
169
+ def test_fileless_templates
170
+ view = Simple.new
171
+ view.template = 'Hi %%person%%!'
172
+ view[:person] = 'mom'
173
+
174
+ assert_equal 'Hi mom!', view.render
175
+ end
176
+
177
+ def test_delimiters
178
+ assert_equal <<-end_template, Delimiters.render
179
+ * It worked the first time.
180
+ * And it worked the second time.
181
+ * As well as the third.
182
+ * Then, surprisingly, it worked the final time.
183
+ end_template
184
+ end
185
+
186
+ def test_double_section
187
+ assert_equal <<-end_section, DoubleSection.render
188
+ * first
189
+ * second
190
+ * third
191
+ end_section
192
+ end
193
+
194
+ def test_inverted_section
195
+ assert_equal <<-end_section, InvertedSection.render
196
+ * first
197
+ * second
198
+ * third
199
+ end_section
200
+ end
201
+
202
+ def test_comments
203
+ assert_equal "<h1>A Comedy of Errors</h1>\n", Comments.render
204
+ end
205
+
206
+ def test_multi_linecomments
207
+ view = Comments.new
208
+ view.template = "<h1>%%title%%%%! just something interesting... \n#or not... %%</h1>\n"
209
+ assert_equal "<h1>A Comedy of Errors</h1>\n", view.render
210
+ end
211
+
212
+ def test_escaped
213
+ assert_equal '<h1>Bear &gt; Shark</h1>', Escaped.render
214
+ end
215
+
216
+ def test_unescaped
217
+ assert_equal '<h1>Bear > Shark</h1>', Unescaped.render
218
+ end
219
+
220
+ def test_unescaped_ampersand
221
+ view = Porthole.new
222
+ view.template = "<h1>%%& title%%</h1>"
223
+ view[:title] = "Bear > Shark"
224
+ assert_equal '<h1>Bear > Shark</h1>', view.render
225
+ end
226
+
227
+ def test_classify
228
+ assert_equal 'TemplatePartial', Porthole.classify('template_partial')
229
+ assert_equal 'Admin::TemplatePartial', Porthole.classify('admin/template_partial')
230
+ end
231
+
232
+ def test_underscore
233
+ assert_equal 'template_partial', Porthole.underscore('TemplatePartial')
234
+ assert_equal 'admin/template_partial', Porthole.underscore('Admin::TemplatePartial')
235
+ assert_equal 'views/in/sub/directories', Porthole.underscore('Views::In::Sub::Directories')
236
+ end
237
+
238
+ def test_anon_subclass_underscore
239
+ klass = Class.new(TemplatePartial)
240
+ assert_equal 'template_partial', klass.underscore
241
+ end
242
+
243
+ def test_namespaced_underscore
244
+ Object.const_set(:Views, Class.new)
245
+ klass = Class.new(Porthole)
246
+ klass.view_namespace = Views
247
+ assert_equal 'stat_stuff', klass.underscore('Views::StatStuff')
248
+
249
+ assert_equal 'views/stat_stuff', Porthole.underscore('Views::StatStuff')
250
+ end
251
+
252
+ def test_render
253
+ assert_equal 'Hello World!', Porthole.render('Hello World!')
254
+ end
255
+
256
+ def test_render_with_params
257
+ assert_equal 'Hello World!', Porthole.render('Hello %%planet%%!', :planet => 'World')
258
+ end
259
+
260
+ def test_render_from_file
261
+ expected = <<-data
262
+ <VirtualHost *>
263
+ ServerName example.com
264
+ DocumentRoot /var/www/example.com
265
+ RailsEnv production
266
+ </VirtualHost>
267
+ data
268
+ template = File.read(File.dirname(__FILE__) + "/fixtures/passenger.conf")
269
+ assert_equal expected, Porthole.render(template, :stage => 'production',
270
+ :server => 'example.com',
271
+ :deploy_to => '/var/www/example.com' )
272
+ end
273
+
274
+ def test_render_from_symbol
275
+ expected = <<-data
276
+ <VirtualHost *>
277
+ ServerName example.com
278
+ DocumentRoot /var/www/example.com
279
+ RailsEnv production
280
+ </VirtualHost>
281
+ data
282
+ old_path, Porthole.template_path = Porthole.template_path, File.dirname(__FILE__) + "/fixtures"
283
+ old_extension, Porthole.template_extension = Porthole.template_extension, "conf"
284
+
285
+ assert_equal expected, Porthole.render(:passenger, :stage => 'production',
286
+ :server => 'example.com',
287
+ :deploy_to => '/var/www/example.com' )
288
+
289
+ Porthole.template_path, Porthole.template_extension = old_path, old_extension
290
+ end
291
+
292
+ def test_doesnt_execute_what_it_doesnt_need_to
293
+ instance = Porthole.new
294
+ instance[:show] = false
295
+ instance.instance_eval do
296
+ def die
297
+ raise "bummer"
298
+ end
299
+ end
300
+ instance.template = '%%#show%% <li>%%die%%</li> %%/show%% yay'
301
+
302
+ assert_equal " yay", instance.render
303
+ end
304
+
305
+ def test_reports_unclosed_sections
306
+ instance = Porthole.new
307
+ instance[:list] = [ :item => 1234 ]
308
+ instance.template = '%%#list%% <li>%%item%%</li> %%/gist%%'
309
+
310
+ begin
311
+ instance.render
312
+ rescue => e
313
+ end
314
+
315
+ assert e.message.include?('Unclosed section')
316
+ end
317
+
318
+ def test_unclosed_sections_reports_the_line_number
319
+ instance = Porthole.new
320
+ instance[:list] = [ :item => 1234 ]
321
+ instance.template = "hi\nmom\n%%#list%% <li>%%item%%</li> %%/gist%%"
322
+
323
+ begin
324
+ instance.render
325
+ rescue => e
326
+ end
327
+
328
+ assert e.message.include?('Line 3')
329
+ end
330
+
331
+ def test_enumerable_sections_accept_a_hash_as_a_context
332
+ instance = Porthole.new
333
+ instance[:list] = { :item => 1234 }
334
+ instance.template = '%%#list%% <li>%%item%%</li> %%/list%%'
335
+
336
+ assert_equal ' <li>1234</li> ', instance.render
337
+ end
338
+
339
+ def test_enumerable_sections_accept_a_string_keyed_hash_as_a_context
340
+ instance = Porthole.new
341
+ instance[:list] = { 'item' => 1234 }
342
+ instance.template = '%%#list%% <li>%%item%%</li> %%/list%%'
343
+
344
+ assert_equal ' <li>1234</li> ', instance.render
345
+ end
346
+
347
+ def test_not_found_in_context_renders_empty_string
348
+ instance = Porthole.new
349
+ instance.template = '%%#list%% <li>%%item%%</li> %%/list%%'
350
+
351
+ assert_equal '', instance.render
352
+ end
353
+
354
+ def test_not_found_in_nested_context_renders_empty_string
355
+ instance = Porthole.new
356
+ instance[:list] = { :item => 1234 }
357
+ instance.template = '%%#list%% <li>%%prefix%%%%item%%</li> %%/list%%'
358
+
359
+ assert_equal ' <li>1234</li> ', instance.render
360
+ end
361
+
362
+ def test_not_found_in_context_raises_when_asked_to
363
+ instance = Porthole.new
364
+ instance.raise_on_context_miss = true
365
+ instance.template = '%%#list%% <li>%%item%%</li> %%/list%%'
366
+
367
+ assert_raises Porthole::ContextMiss do
368
+ instance.render
369
+ end
370
+ end
371
+
372
+ def test_knows_when_its_been_compiled_when_set_with_string
373
+ klass = Class.new(Porthole)
374
+
375
+ assert ! klass.compiled?
376
+ klass.template = 'Hi, %%person%%!'
377
+ assert klass.compiled?
378
+ end
379
+
380
+ def test_knows_when_its_been_compiled_when_using_a_file_template
381
+ klass = Class.new(Simple)
382
+ klass.template_file = File.dirname(__FILE__) + '/fixtures/simple.porthole'
383
+
384
+ assert ! klass.compiled?
385
+ klass.render
386
+ assert klass.compiled?
387
+ end
388
+
389
+ def test_an_instance_knows_when_its_class_is_compiled
390
+ instance = Simple.new
391
+
392
+ assert ! Simple.compiled?
393
+ assert ! instance.compiled?
394
+
395
+ Simple.render
396
+
397
+ assert Simple.compiled?
398
+ assert instance.compiled?
399
+ end
400
+
401
+ def test_knows_when_its_been_compiled_at_the_instance_level
402
+ klass = Class.new(Porthole)
403
+ instance = klass.new
404
+
405
+ assert ! instance.compiled?
406
+ instance.template = 'Hi, %%person%%!'
407
+ assert instance.compiled?
408
+ end
409
+
410
+ def test_sections_returning_lambdas_get_called_with_text
411
+ view = Lambda.new
412
+ view[:name] = 'Chris'
413
+
414
+ assert_equal "Hi Chris.\n\nHi %%name%%.", view.render.chomp
415
+ assert_equal 1, view.calls
416
+
417
+ assert_equal "Hi Chris.\n\nHi %%name%%.", view.render.chomp
418
+ assert_equal 1, view.calls
419
+
420
+ assert_equal "Hi Chris.\n\nHi %%name%%.", view.render.chomp
421
+ assert_equal 1, view.calls
422
+ end
423
+
424
+ def test_sections_which_refer_to_unary_method_call_them_as_proc
425
+ kls = Class.new(Porthole) do
426
+ def unary_method(arg)
427
+ "(#{arg})"
428
+ end
429
+ end
430
+
431
+ str = kls.render("%%#unary_method%%test%%/unary_method%%")
432
+ assert_equal "(test)", str
433
+ end
434
+
435
+ def test_lots_of_staches
436
+ template = "%%%%foo%%%%"
437
+
438
+ begin
439
+ Porthole.render(template, :foo => "defunkt")
440
+ rescue => e
441
+ end
442
+
443
+ assert e.message.include?("Illegal content in tag")
444
+ end
445
+
446
+ def test_liberal_tag_names
447
+ template = "%%first-name%% %%middle_name!%% %%lastName?%%"
448
+ hash = {
449
+ 'first-name' => 'chris',
450
+ 'middle_name!' => 'j',
451
+ 'lastName?' => 'strath'
452
+ }
453
+
454
+ assert_equal "chris j strath", Porthole.render(template, hash)
455
+ end
456
+
457
+ def test_nested_sections_same_names
458
+ template = <<template
459
+ %%#items%%
460
+ start
461
+ %%#items%%
462
+ %%a%%
463
+ %%/items%%
464
+ end
465
+ %%/items%%
466
+ template
467
+
468
+ data = {
469
+ "items" => [
470
+ { "items" => [ {"a" => 1}, {"a" => 2}, {"a" => 3} ] },
471
+ { "items" => [ {"a" => 4}, {"a" => 5}, {"a" => 6} ] },
472
+ { "items" => [ {"a" => 7}, {"a" => 8}, {"a" => 9} ] }
473
+ ]
474
+ }
475
+
476
+ assert_equal <<expected, Porthole.render(template, data)
477
+ start
478
+ 1
479
+ 2
480
+ 3
481
+ end
482
+ start
483
+ 4
484
+ 5
485
+ 6
486
+ end
487
+ start
488
+ 7
489
+ 8
490
+ 9
491
+ end
492
+ expected
493
+ end
494
+
495
+ def test_id_with_nested_context
496
+ html = %(<div>%%id%%</div>\n<div>%%# has_a? %%%%id%%%%/ has_a? %%</div>\n<div>%%# has_b? %%%%id%%%%/ has_b? %%</div>\n)
497
+
498
+ instance = Porthole.new
499
+ instance.template = html
500
+ instance[:id] = 3
501
+ instance[:has_a?] = true
502
+ instance[:has_b?] = true
503
+ assert_equal <<-rendered, instance.render
504
+ <div>3</div>
505
+ <div>3</div>
506
+ <div>3</div>
507
+ rendered
508
+ end
509
+
510
+ def test_utf8
511
+ klass = Class.new(Porthole)
512
+ klass.template_name = 'utf8'
513
+ klass.template_path = 'test/fixtures'
514
+ view = klass.new
515
+ view[:test] = "中文"
516
+
517
+ assert_equal <<-rendered, view.render
518
+ <h1>中文 中文</h1>
519
+
520
+ <h2>中文又来啦</h2>
521
+ rendered
522
+ end
523
+
524
+ def test_indentation
525
+ view = Porthole.new
526
+ view[:name] = 'indent'
527
+ view[:text] = 'puts :indented!'
528
+ view.template = <<template
529
+ def %%name%%
530
+ %%text%%
531
+ end
532
+ template
533
+
534
+ assert_equal <<template, view.render
535
+ def indent
536
+ puts :indented!
537
+ end
538
+ template
539
+ end
540
+
541
+ def test_struct
542
+ person = Struct.new(:name, :age)
543
+ view = Porthole.new
544
+ view[:person] = person.new('Marvin', 25)
545
+ view.template = '%%#person%%%%name%% is %%age%%%%/person%%'
546
+ assert_equal 'Marvin is 25', view.render
547
+ end
548
+
549
+ def test_method_missing
550
+ assert_equal('[ 0 1 2 3 4 5 6 7 8 9 10 ]', MethodMissing.render)
551
+ end
552
+
553
+ def test_custom_escaping
554
+ view = Class.new(Porthole) do
555
+ def escapeHTML(str)
556
+ "pong"
557
+ end
558
+ end
559
+
560
+ assert_equal 'pong', view.render("%%thing%%", :thing => "nothing")
561
+ assert_equal 'nothing', Porthole.render("%%thing%%", :thing => "nothing")
562
+ end
563
+
564
+ def test_implicit_iterator
565
+ view = Porthole.new
566
+ view.template = "%%#people%%* %%.%%\n%%/people%%"
567
+ view[:people] = %w( Chris Mark Scott )
568
+
569
+ assert_equal <<text, view.render
570
+ * Chris
571
+ * Mark
572
+ * Scott
573
+ text
574
+ end
575
+
576
+ def test_unescaped_implicit_iterator
577
+ view = Porthole.new
578
+ view.template = "%%#people%%* %%{.}%%\n%%/people%%"
579
+ view[:people] = %w( Chris Mark Scott )
580
+
581
+ assert_equal <<text, view.render
582
+ * Chris
583
+ * Mark
584
+ * Scott
585
+ text
586
+ end
587
+
588
+ def test_dot_notation
589
+ assert_equal <<-text, DotNotation.render
590
+ * Chris Firescythe
591
+ * 24
592
+ * Cincinnati, OH
593
+ * Cincinnati, OH
594
+ * Cincinnati, OH
595
+ * Cincinnati, OH
596
+ * Normal
597
+
598
+ * Chris Firescythe
599
+ * Cincinnati, OH
600
+ text
601
+ end
602
+
603
+ def test_inherited_attributes
604
+ Object.const_set :TestNamespace, Module.new
605
+ base = Class.new(Porthole)
606
+ tmpl = Class.new(base)
607
+
608
+ {:template_path => File.expand_path('./foo'),
609
+ :template_extension => 'stache',
610
+ :view_namespace => TestNamespace,
611
+ :view_path => './foo'
612
+ }.each do |attr, value|
613
+ base.send("#{attr}=", value)
614
+ assert_equal value, tmpl.send(attr)
615
+ end
616
+ end
617
+ def test_array_of_arrays
618
+ template = <<template
619
+ %%#items%%
620
+ start
621
+ %%#map%%
622
+ %%a%%
623
+ %%/map%%
624
+ end
625
+ %%/items%%
626
+ template
627
+
628
+ data = {
629
+ "items" => [
630
+ [ {"a" => 1}, {"a" => 2}, {"a" => 3} ],
631
+ [ {"a" => 4}, {"a" => 5}, {"a" => 6} ],
632
+ [ {"a" => 7}, {"a" => 8}, {"a" => 9} ]
633
+ ]
634
+ }
635
+
636
+ assert_equal <<expected, Porthole.render(template, data)
637
+ start
638
+ 1
639
+ 2
640
+ 3
641
+ end
642
+ start
643
+ 4
644
+ 5
645
+ 6
646
+ end
647
+ start
648
+ 7
649
+ 8
650
+ 9
651
+ end
652
+ expected
653
+ end
654
+ def test_indentation_again
655
+ template = <<template
656
+ SELECT
657
+ %%#cols%%
658
+ %%name%%,
659
+ %%/cols%%
660
+ FROM
661
+ DUMMY1
662
+ template
663
+
664
+ view = Porthole.new
665
+ view[:cols] = [{:name => 'Name'}, {:name => 'Age'}, {:name => 'Weight'}]
666
+ view.template = template
667
+
668
+ assert_equal <<template, view.render
669
+ SELECT
670
+ Name,
671
+ Age,
672
+ Weight,
673
+ FROM
674
+ DUMMY1
675
+ template
676
+ end
677
+ end