tenjin 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (170) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.txt +54 -0
  3. data/benchmark/bench.rb +502 -0
  4. data/benchmark/bench_context.rb +17 -0
  5. data/benchmark/bench_context.yaml +141 -0
  6. data/benchmark/templates/_footer.html +4 -0
  7. data/benchmark/templates/_header.html +52 -0
  8. data/benchmark/templates/bench_eruby.rhtml +29 -0
  9. data/benchmark/templates/bench_tenjin.rbhtml +29 -0
  10. data/bin/rbtenjin +449 -0
  11. data/doc-api/classes/Tenjin.html +141 -0
  12. data/doc-api/classes/Tenjin/ArrayBufferTemplate.html +270 -0
  13. data/doc-api/classes/Tenjin/BaseContext.html +312 -0
  14. data/doc-api/classes/Tenjin/Context.html +126 -0
  15. data/doc-api/classes/Tenjin/ContextHelper.html +433 -0
  16. data/doc-api/classes/Tenjin/Engine.html +616 -0
  17. data/doc-api/classes/Tenjin/ErubisTemplate.html +166 -0
  18. data/doc-api/classes/Tenjin/HtmlHelper.html +359 -0
  19. data/doc-api/classes/Tenjin/Preprocessor.html +242 -0
  20. data/doc-api/classes/Tenjin/Template.html +916 -0
  21. data/doc-api/created.rid +1 -0
  22. data/doc-api/files/README_txt.html +185 -0
  23. data/doc-api/files/lib/tenjin_rb.html +136 -0
  24. data/doc-api/fr_class_index.html +36 -0
  25. data/doc-api/fr_file_index.html +28 -0
  26. data/doc-api/fr_method_index.html +89 -0
  27. data/doc-api/index.html +24 -0
  28. data/doc-api/rdoc-style.css +208 -0
  29. data/doc/docstyle.css +188 -0
  30. data/doc/examples.html +312 -0
  31. data/doc/faq.html +909 -0
  32. data/doc/users-guide.html +1691 -0
  33. data/lib/tenjin.rb +959 -0
  34. data/setup.rb +1331 -0
  35. data/tenjin.gemspec +58 -0
  36. data/test/assert-text-equal.rb +45 -0
  37. data/test/data/examples/form/create.rbhtml +4 -0
  38. data/test/data/examples/form/form.rbhtml +14 -0
  39. data/test/data/examples/form/layout.rbhtml +8 -0
  40. data/test/data/examples/form/main.rb +9 -0
  41. data/test/data/examples/form/main.result +21 -0
  42. data/test/data/examples/form/update.rbhtml +4 -0
  43. data/test/data/examples/preprocessing/helper.rb +16 -0
  44. data/test/data/examples/preprocessing/main.rb +11 -0
  45. data/test/data/examples/preprocessing/main.result +17 -0
  46. data/test/data/examples/preprocessing/select.rbhtml +15 -0
  47. data/test/data/examples/preprocessing/select_P.result +18 -0
  48. data/test/data/examples/table/table.rb +9 -0
  49. data/test/data/examples/table/table.rbhtml +16 -0
  50. data/test/data/examples/table/table.result +20 -0
  51. data/test/data/examples/table/table_s.result +18 -0
  52. data/test/data/faq/ex1.rbhtml +5 -0
  53. data/test/data/faq/ex10-baselayout.rbhtml +27 -0
  54. data/test/data/faq/ex10-content.rbhtml +12 -0
  55. data/test/data/faq/ex10-customlayout.rbhtml +11 -0
  56. data/test/data/faq/ex10_inherit.result +25 -0
  57. data/test/data/faq/ex11-bench.rb +28 -0
  58. data/test/data/faq/ex11-content.rbhtml +9 -0
  59. data/test/data/faq/ex11-layout1.rbhtml +5 -0
  60. data/test/data/faq/ex11-layout2.rbhtml +6 -0
  61. data/test/data/faq/ex11.rb +5 -0
  62. data/test/data/faq/ex11.rbhtml +8 -0
  63. data/test/data/faq/ex11.source +11 -0
  64. data/test/data/faq/ex11_arraybuffer.result +15 -0
  65. data/test/data/faq/ex1_chksyntax.result +3 -0
  66. data/test/data/faq/ex2-content.rbhtml +3 -0
  67. data/test/data/faq/ex2-layout.rbhtml +11 -0
  68. data/test/data/faq/ex2_removenl.result +19 -0
  69. data/test/data/faq/ex3.rb +4 -0
  70. data/test/data/faq/ex3.rbhtml +1 -0
  71. data/test/data/faq/ex3_escapefunc1.result +2 -0
  72. data/test/data/faq/ex3_escapefunc2.result +2 -0
  73. data/test/data/faq/ex5.rbhtml +7 -0
  74. data/test/data/faq/ex5_template_args.source +9 -0
  75. data/test/data/faq/ex6-content.rhtml +6 -0
  76. data/test/data/faq/ex6-layout.rhtml +6 -0
  77. data/test/data/faq/ex6.rb +10 -0
  78. data/test/data/faq/ex6_eruby.result +12 -0
  79. data/test/data/faq/ex7-expr-pattern.rb +34 -0
  80. data/test/data/faq/ex7-expr-pattern.rbhtml +3 -0
  81. data/test/data/faq/ex7_expr_pattern.result +4 -0
  82. data/test/data/faq/ex8-m18n.rb +77 -0
  83. data/test/data/faq/ex8-m18n.rbhtml +4 -0
  84. data/test/data/faq/ex8_m18n.result +10 -0
  85. data/test/data/faq/ex9-baselayout.rbhtml +8 -0
  86. data/test/data/faq/ex9-content.rbhtml +6 -0
  87. data/test/data/faq/ex9-mylayout.rbhtml +5 -0
  88. data/test/data/faq/ex9_changelayout.result +11 -0
  89. data/test/data/users_guide/content6.rbhtml +3 -0
  90. data/test/data/users_guide/content7.rbhtml +5 -0
  91. data/test/data/users_guide/content8.rbhtml +2 -0
  92. data/test/data/users_guide/contextdata.rb +7 -0
  93. data/test/data/users_guide/datafile.rb +5 -0
  94. data/test/data/users_guide/datafile.yaml +10 -0
  95. data/test/data/users_guide/ex.rbhtml +6 -0
  96. data/test/data/users_guide/ex.result +7 -0
  97. data/test/data/users_guide/ex.script +5 -0
  98. data/test/data/users_guide/ex_script.result +7 -0
  99. data/test/data/users_guide/ex_source.result +8 -0
  100. data/test/data/users_guide/example1.rbhtml +12 -0
  101. data/test/data/users_guide/example1.result +17 -0
  102. data/test/data/users_guide/example10.rbhtml +4 -0
  103. data/test/data/users_guide/example10_template_args.result +6 -0
  104. data/test/data/users_guide/example11.rbhtml +5 -0
  105. data/test/data/users_guide/example11_template_args_result +2 -0
  106. data/test/data/users_guide/example12.rbhtml +12 -0
  107. data/test/data/users_guide/example12_preprocessed.result +10 -0
  108. data/test/data/users_guide/example12_preprocessed_source.result +10 -0
  109. data/test/data/users_guide/example13.rbhtml +6 -0
  110. data/test/data/users_guide/example13_preprocessed.result +2 -0
  111. data/test/data/users_guide/example13_preprocessed_source.result +2 -0
  112. data/test/data/users_guide/example14.rb +32 -0
  113. data/test/data/users_guide/example14.rbhtml +6 -0
  114. data/test/data/users_guide/example14_tmplclass.result +15 -0
  115. data/test/data/users_guide/example15.rb +10 -0
  116. data/test/data/users_guide/example15_escapefunc.result +14 -0
  117. data/test/data/users_guide/example16.rbhtml +4 -0
  118. data/test/data/users_guide/example16a.rb +10 -0
  119. data/test/data/users_guide/example16a.result +4 -0
  120. data/test/data/users_guide/example16b.rb +13 -0
  121. data/test/data/users_guide/example16b.result +4 -0
  122. data/test/data/users_guide/example16c.rb +12 -0
  123. data/test/data/users_guide/example16c.result +4 -0
  124. data/test/data/users_guide/example1_S.result +14 -0
  125. data/test/data/users_guide/example1_SXNC.result +10 -0
  126. data/test/data/users_guide/example1_source.result +14 -0
  127. data/test/data/users_guide/example2.rbhtml +3 -0
  128. data/test/data/users_guide/example2_sb.result2 +9 -0
  129. data/test/data/users_guide/example3.rbhtml +5 -0
  130. data/test/data/users_guide/example3_syntaxcheck.result +2 -0
  131. data/test/data/users_guide/example4.rbhtml +13 -0
  132. data/test/data/users_guide/example4_datafile_rb.result +13 -0
  133. data/test/data/users_guide/example4_yaml.result +13 -0
  134. data/test/data/users_guide/example5.rbhtml +9 -0
  135. data/test/data/users_guide/example5_datastr_rb.result +9 -0
  136. data/test/data/users_guide/example5_datastr_yaml.result +9 -0
  137. data/test/data/users_guide/example6.rbhtml +19 -0
  138. data/test/data/users_guide/example6_layout.result +29 -0
  139. data/test/data/users_guide/example6_nested.result +28 -0
  140. data/test/data/users_guide/example7_layout2.result +13 -0
  141. data/test/data/users_guide/example8_layout3.result +8 -0
  142. data/test/data/users_guide/example9.rbhtml +18 -0
  143. data/test/data/users_guide/example9_capture.result +26 -0
  144. data/test/data/users_guide/footer.html +5 -0
  145. data/test/data/users_guide/footer.rbhtml +4 -0
  146. data/test/data/users_guide/layout6.rbhtml +17 -0
  147. data/test/data/users_guide/layout7.rbhtml +9 -0
  148. data/test/data/users_guide/layout8_html.rbhtml +5 -0
  149. data/test/data/users_guide/layout8_xhtml.rbhtml +6 -0
  150. data/test/data/users_guide/layout9.rbhtml +25 -0
  151. data/test/data/users_guide/sidemenu.rbhtml +5 -0
  152. data/test/data/users_guide/user_app.cgi +39 -0
  153. data/test/data/users_guide/user_app.result +30 -0
  154. data/test/data/users_guide/user_create.rbhtml +6 -0
  155. data/test/data/users_guide/user_edit.rbhtml +7 -0
  156. data/test/data/users_guide/user_form.rbhtml +10 -0
  157. data/test/data/users_guide/user_layout.rbhtml +16 -0
  158. data/test/test_all.rb +23 -0
  159. data/test/test_engine.rb +526 -0
  160. data/test/test_engine.yaml +2039 -0
  161. data/test/test_examples.rb +81 -0
  162. data/test/test_faq.rb +60 -0
  163. data/test/test_htmlhelper.rb +78 -0
  164. data/test/test_main.rb +564 -0
  165. data/test/test_main.yaml +174 -0
  166. data/test/test_template.rb +113 -0
  167. data/test/test_template.yaml +1244 -0
  168. data/test/test_users_guide.rb +75 -0
  169. data/test/testcase-helper.rb +166 -0
  170. metadata +226 -0
@@ -0,0 +1,19 @@
1
+ <html>
2
+ <body>
3
+
4
+ <div id="sidemenu">
5
+ <?rb import 'sidemenu.rbhtml' ?>
6
+ </div>
7
+
8
+ <div id="main-content">
9
+ <?rb for item in @items ?>
10
+ <p>${item}</p>
11
+ <?rb end ?>
12
+ </div>
13
+
14
+ <div id="footer">
15
+ #{import 'footer.rbhtml', false}
16
+ </div>
17
+
18
+ </body>
19
+ </table>
@@ -0,0 +1,29 @@
1
+ $ rbtenjin -f contextdata.rb --layout=layout6.rbhtml content6.rbhtml
2
+ <html>
3
+ <body>
4
+
5
+ <div id="sidemenu">
6
+ <ul>
7
+ <li><a href="/">Top</a></li>
8
+ <li><a href="/prod">Products</a></li>
9
+ <li><a href="/support">Support</a></li>
10
+ </ul>
11
+ </div>
12
+
13
+ <div id="main-content">
14
+ <p>&lt;FOO&gt;</p>
15
+ <p>&amp;BAR</p>
16
+ <p>&quot;BAZ&quot;</p>
17
+
18
+ </div>
19
+
20
+ <div id="footer">
21
+ <hr />
22
+ <address>
23
+ <a href="mailto:webmaster@example.com">webmaster@example.com</a>
24
+ </address>
25
+
26
+ </div>
27
+
28
+ </body>
29
+ </table>
@@ -0,0 +1,28 @@
1
+ $ rbtenjin -f contextdata.rb example6.rbhtml
2
+ <html>
3
+ <body>
4
+
5
+ <div id="sidemenu">
6
+ <ul>
7
+ <li><a href="/">Top</a></li>
8
+ <li><a href="/prod">Products</a></li>
9
+ <li><a href="/support">Support</a></li>
10
+ </ul>
11
+ </div>
12
+
13
+ <div id="main-content">
14
+ <p>&lt;FOO&gt;</p>
15
+ <p>&amp;BAR</p>
16
+ <p>&quot;BAZ&quot;</p>
17
+ </div>
18
+
19
+ <div id="footer">
20
+ <hr />
21
+ <address>
22
+ <a href="mailto:webmaster@example.com">webmaster@example.com</a>
23
+ </address>
24
+
25
+ </div>
26
+
27
+ </body>
28
+ </table>
@@ -0,0 +1,13 @@
1
+ $ rbtenjin --layout=layout7.rbhtml content7.rbhtml
2
+ ...
3
+ <h1>Document Title</h1>
4
+
5
+ <div id="main-content">
6
+ <table>
7
+ ...content...
8
+ </table>
9
+
10
+ <div>
11
+
12
+ <a href="/next/page">Next page</a>
13
+ ...
@@ -0,0 +1,8 @@
1
+ $ rbtenjin --postfix='.rbhtml' --layout=':layout8_html' content8.rbhtml
2
+ <?xml version="1.0" encoding="UTF-8"?>
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
+ <body>
5
+ <h1>Hello World!</h1>
6
+
7
+ </body>
8
+ </html>
@@ -0,0 +1,18 @@
1
+ <?rb @title = 'Capture Test' ?>
2
+ <html>
3
+ <body>
4
+
5
+ <?rb start_capture(:content_part) ?>
6
+ <ul>
7
+ <?rb for i in [0, 1, 2] ?>
8
+ <li>i = #{i}</li>
9
+ <?rb end ?>
10
+ </ul>
11
+ <?rb stop_capture() ?>
12
+
13
+ <?rb start_capture('footer_part') ?>
14
+ <div class="footer">copyright&copy; 2007 kuwata-lab.com</div>
15
+ <?rb stop_capture() ?>
16
+
17
+ </body>
18
+ </html>
@@ -0,0 +1,26 @@
1
+ $ rbtenjin --layout=layout9.rbhtml example9.rbhtml
2
+ <html lang="en">
3
+ <head>
4
+ <title>Capture Test</title>
5
+ </head>
6
+ <body>
7
+
8
+ <!-- HEADER -->
9
+ <h1>Capture Test</h1>
10
+ <!-- /HEADER -->
11
+
12
+ <!-- CONTENT -->
13
+ <ul>
14
+ <li>i = 0</li>
15
+ <li>i = 1</li>
16
+ <li>i = 2</li>
17
+ </ul>
18
+
19
+ <!-- /CONTENT -->
20
+
21
+ <!-- FOOTER -->
22
+ <div class="footer">copyright&copy; 2007 kuwata-lab.com</div>
23
+ <!-- /FOOTER -->
24
+
25
+ </body>
26
+ </html>
@@ -0,0 +1,5 @@
1
+ <?rb #@ARGS ?>
2
+ <hr />
3
+ <address>
4
+ <a href="mailto:webmaster@example.com">webmaster@example.com</a>
5
+ </address>
@@ -0,0 +1,4 @@
1
+ <hr />
2
+ <address>
3
+ <a href="mailto:${@webmaster_email}">${@webmaster_email}</a>
4
+ </address>
@@ -0,0 +1,17 @@
1
+ <html>
2
+ <body>
3
+
4
+ <div id="sidemenu">
5
+ <?rb import 'sidemenu.rbhtml' ?>
6
+ </div>
7
+
8
+ <div id="main-content">
9
+ #{@_content}
10
+ </div>
11
+
12
+ <div id="footer">
13
+ #{import 'footer.rbhtml', false}
14
+ </div>
15
+
16
+ </body>
17
+ </table>
@@ -0,0 +1,9 @@
1
+ ...
2
+ <h1>${@title}</h1>
3
+
4
+ <div id="main-content">
5
+ #{@_content}
6
+ <div>
7
+
8
+ <a href="${@url}">Next page</a>
9
+ ...
@@ -0,0 +1,5 @@
1
+ <html>
2
+ <body>
3
+ #{@_content}
4
+ </body>
5
+ </html>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
3
+ <body>
4
+ #{@_content}
5
+ </body>
6
+ </html>
@@ -0,0 +1,25 @@
1
+ <html lang="en">
2
+ <head>
3
+ <title>${@title}</title>
4
+ </head>
5
+ <body>
6
+
7
+ <!-- HEADER -->
8
+ <?rb unless captured_as('header_part') ?>
9
+ <h1>${@title}</h1>
10
+ <?rb end ?>
11
+ <!-- /HEADER -->
12
+
13
+ <!-- CONTENT -->
14
+ #{@content_part}
15
+ <!-- /CONTENT -->
16
+
17
+ <!-- FOOTER -->
18
+ <?rb unless captured_as('footer_part') ?>
19
+ <hr />
20
+ <address>webmaster@localhost</address>
21
+ <?rb end ?>
22
+ <!-- /FOOTER -->
23
+
24
+ </body>
25
+ </html>
@@ -0,0 +1,5 @@
1
+ <ul>
2
+ <?rb for item in @menu ?>
3
+ <li><a href="${item['url']}">${item['name']}</a></li>
4
+ <?rb end ?>
5
+ </ul>
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'cgi'
4
+ require 'tenjin'
5
+
6
+ ## set action ('create' or 'edit')
7
+ action = nil
8
+ cgi = nil
9
+ if ENV['REQUEST_METHOD']
10
+ cgi = CGI.new
11
+ action = cgi['action']
12
+ elsif ARGV[0]
13
+ action = ARGV[0]
14
+ end
15
+ action = 'create' unless ['create', 'edit'].include?(action)
16
+
17
+ ## set context data
18
+ if action == 'create'
19
+ title = 'Create User'
20
+ params = {}
21
+ else
22
+ title = 'Edit User'
23
+ params = {:name=>'Margalette',
24
+ :email=>'meg@example.com',
25
+ :gender=>'f',
26
+ :id=>123 }
27
+ end
28
+ context = { :title=>title, :params=>params }
29
+ # or context = Tenjin::Context.new(:title=>title, :params=>params)
30
+
31
+ ## create engine object
32
+ layout = :layout # or 'user_layout.rbhtml'
33
+ engine = Tenjin::Engine.new(:prefix=>'user_', :postfix=>'.rbhtml', :layout=>layout)
34
+
35
+ ## evaluate template
36
+ template_name = action.intern # :create or :edit
37
+ output = engine.render(template_name, context)
38
+ print cgi.header() if cgi
39
+ print output
@@ -0,0 +1,30 @@
1
+ $ ruby user_app.cgi create
2
+ <html>
3
+ <body>
4
+
5
+ <h1>Create User</h1>
6
+
7
+ <div id="main-content">
8
+ <form action="user_app.cgi" method="post">
9
+ <input type="hidden" name="action" value="create" />
10
+ <p>
11
+ Name: <input type="text" name="name" value="" /><br />
12
+ Email: <input type="text" name="email" value="" /><br />
13
+ Gender:
14
+ <input type="radio" name="gender" value="m" />Male
15
+ <input type="radio" name="gender" value="f" />Female
16
+ </p>
17
+ <input type="submit" value="Create" />
18
+ </form>
19
+
20
+ </div>
21
+
22
+ <div id="footer">
23
+ <hr />
24
+ <address>
25
+ <a href="mailto:webmaster@example.com">webmaster@example.com</a>
26
+ </address>
27
+ </div>
28
+
29
+ </body>
30
+ </html>
@@ -0,0 +1,6 @@
1
+ <?rb #@ARGS ?>
2
+ <form action="user_app.cgi" method="post">
3
+ <input type="hidden" name="action" value="create" />
4
+ <?rb import :form ?>
5
+ <input type="submit" value="Create" />
6
+ </form>
@@ -0,0 +1,7 @@
1
+ <?rb #@ARGS params ?>
2
+ <form action="user_app.cgi" method="post">
3
+ <input type="hidden" name="action" value="edit" />
4
+ <input type="hidden" name="id" value="${params['id']}" />
5
+ <?rb import :form ?>
6
+ <input type="submit" value="Edit" />
7
+ </form>
@@ -0,0 +1,10 @@
1
+ <?rb #@ARGS params ?>
2
+ <p>
3
+ Name: <input type="text" name="name" value="${params['name']}" /><br />
4
+ Email: <input type="text" name="email" value="${params['email']}" /><br />
5
+ Gender:
6
+ <?rb gender = @params['gender'] ?>
7
+ <?rb chk = { true=>' checked="checked"', false=>'' } ?>
8
+ <input type="radio" name="gender" value="m" #{chk[gender=='m']} />Male
9
+ <input type="radio" name="gender" value="f" #{chk[gender=='f']} />Female
10
+ </p>
@@ -0,0 +1,16 @@
1
+ <?rb #@ARGS _content, title ?>
2
+ <html>
3
+ <body>
4
+
5
+ <h1>${title}</h1>
6
+
7
+ <div id="main-content">
8
+ #{_content}
9
+ </div>
10
+
11
+ <div id="footer">
12
+ <?rb import 'footer.html' ?>
13
+ </div>
14
+
15
+ </body>
16
+ </html>
data/test/test_all.rb ADDED
@@ -0,0 +1,23 @@
1
+ ###
2
+ ### $Rev: 45 $
3
+ ### $Release: 0.6.0 $
4
+ ### copyright(c) 2007 kuwata-lab all rights reserved.
5
+ ###
6
+
7
+ basedir = File.dirname(File.dirname(File.expand_path(__FILE__)))
8
+ testdir = basedir + '/test'
9
+ $: << testdir
10
+
11
+ require 'test/unit'
12
+ #require 'testutil'
13
+ require 'testcase-helper'
14
+ require 'assert-text-equal'
15
+ require 'tenjin'
16
+
17
+ Dir.chdir testdir
18
+ load 'test_template.rb'
19
+ load 'test_engine.rb'
20
+ load 'test_main.rb'
21
+ load 'test_htmlhelper.rb'
22
+ load 'test_users_guide.rb'
23
+ load 'test_faq.rb'
@@ -0,0 +1,526 @@
1
+ ###
2
+ ### $Rev: 59 $
3
+ ### $Release: 0.6.0 $
4
+ ### copyright(c) 2007 kuwata-lab all rights reserved.
5
+ ###
6
+
7
+ require 'test/unit'
8
+ #require 'testutil'
9
+ require 'testcase-helper'
10
+ require 'assert-text-equal'
11
+ require 'yaml'
12
+
13
+ require 'tenjin'
14
+
15
+
16
+ class TenjinEngineTest < Test::Unit::TestCase
17
+
18
+ s = File.read(__FILE__.sub(/\.\w+$/, '.yaml'))
19
+ s.gsub!(/^\t/, ' ' * 8)
20
+ ydoc = YAML.load(s)
21
+ _data_convert(ydoc, 'ruby')
22
+ TESTDATA = {}
23
+ ydoc.each { |e| TESTDATA[e['name']] = e }
24
+ TESTDATA['basic']['templates'].each do |d|
25
+ d['filename'].sub!(/\.xxhtml$/, '.rbhtml')
26
+ end
27
+
28
+ def _setup
29
+ TESTDATA['basic']['templates'].each do |hash|
30
+ File.write(hash['filename'], hash['content'])
31
+ end
32
+ end
33
+
34
+ def _teardown
35
+ TESTDATA['basic']['templates'].each do |hash|
36
+ filenames = [hash['filename'], hash['filename']+'.cache']
37
+ filenames.each do |fname|
38
+ File.unlink(fname) if test(?f, fname)
39
+ end
40
+ end
41
+ end
42
+
43
+ def _remove_files(*filenames)
44
+ for filename in filenames.flatten
45
+ for fname in Dir.glob("#{filename}*")
46
+ File.unlink(fname)
47
+ end
48
+ end
49
+ end
50
+
51
+ def _template_class
52
+ Tenjin::Template
53
+ end
54
+
55
+ def _test_basic
56
+
57
+ ## setup
58
+ _setup()
59
+
60
+ ## body
61
+ begin
62
+ testname = (caller[0] =~ /`(.*)'/) && $1
63
+ list = testname.split('_')
64
+ action = list[2] # 'list', 'show', 'create', or 'edit'
65
+ shortp = list[3] != 'filename' # template short name or filename
66
+ layoutp = list[4] != 'nolayout' # use layout or not
67
+ layout = layoutp ? 'user_layout.rbhtml' : nil
68
+ engine = Tenjin::Engine.new(:prefix=>'user_', :postfix=>'.rbhtml', :layout=>layout, :templateclass=>_template_class())
69
+ context = TESTDATA['basic']['contexts'][action]
70
+ key = 'user_' + action + (layout ? '_withlayout' : '_nolayout')
71
+ expected = TESTDATA['basic']['expected'].find{|h| h['name'] == key}['content']
72
+ filename = 'user_%s.rbhtml' % action
73
+ tplname = shortp ? action.intern : filename
74
+ output = engine.render(tplname, context, layoutp)
75
+ assert_text_equal(expected, output)
76
+
77
+ ## teardown
78
+ ensure
79
+ _teardown
80
+ end
81
+ end
82
+
83
+
84
+ # fileame, nolayout
85
+
86
+ def test_basic_list_filename_nolayout
87
+ _test_basic
88
+ end
89
+
90
+ def test_basic_show_filename_nolayout
91
+ _test_basic
92
+ end
93
+
94
+ def test_basic_create_filename_nolayout
95
+ _test_basic
96
+ end
97
+
98
+ def test_basic_edit_filename_nolayout
99
+ _test_basic
100
+ end
101
+
102
+
103
+ # shortname, nolayout
104
+
105
+ def test_basic_list_shortname_nolayout
106
+ _test_basic
107
+ end
108
+
109
+ def test_basic_show_shortname_nolayout
110
+ _test_basic
111
+ end
112
+
113
+ def test_basic_create_shortname_nolayout
114
+ _test_basic
115
+ end
116
+
117
+ def test_basic_edit_shortname_nolayout
118
+ _test_basic
119
+ end
120
+
121
+
122
+ # filename, withlayout
123
+
124
+ def test_basic_list_filename_withlayout
125
+ _test_basic
126
+ end
127
+
128
+ def test_basic_show_filename_withlayout
129
+ _test_basic
130
+ end
131
+
132
+ def test_basic_create_filename_withlayout
133
+ _test_basic
134
+ end
135
+
136
+ def test_basic_edit_filename_withlayout
137
+ _test_basic
138
+ end
139
+
140
+
141
+ # shortname, withlayout
142
+
143
+ def test_basic_list_shortname_withlayout
144
+ _test_basic
145
+ end
146
+
147
+ def test_basic_show_shortname_withlayout
148
+ _test_basic
149
+ end
150
+
151
+ def test_basic_create_shortname_withlayout
152
+ _test_basic
153
+ end
154
+
155
+ def test_basic_edit_shortname_withlayout
156
+ _test_basic
157
+ end
158
+
159
+
160
+ ## ----------------------------------------
161
+
162
+ def test_capture_and_echo
163
+ hash = TESTDATA['test_capture_and_echo']
164
+ layout = hash['layout']
165
+ content = hash['content']
166
+ expected = hash['expected']
167
+ layout_filename = 'user_layout.rbhtml'
168
+ content_filename = 'user_content.rbhtml'
169
+ begin
170
+ File.write(layout_filename, layout)
171
+ File.write(content_filename, content)
172
+ engine = Tenjin::Engine.new(:prefix=>'user_', :postfix=>'.rbhtml', :layout=>:layout, :templateclass=>_template_class())
173
+ context = { :items => %w[AAA BBB CCC] }
174
+ result = engine.render(:content, context)
175
+ assert_text_equal(expected, result)
176
+ ensure
177
+ [layout_filename, layout_filename + '.cache',
178
+ content_filename, content_filename + '.cache'].each do |filename|
179
+ File.unlink(filename) if test(?f, filename)
180
+ end
181
+ end
182
+ end
183
+
184
+
185
+ def test_captured_as
186
+ hash = TESTDATA['test_captured_as']
187
+ files = [
188
+ ['baselayout.rbhtml', hash['baselayout']],
189
+ ['customlayout.rbhtml', hash['customlayout']],
190
+ ['content.rbhtml', hash['content']],
191
+ ]
192
+ context = hash['context']
193
+ expected = hash['expected']
194
+ begin
195
+ for filename, content in files
196
+ File.write(filename, content)
197
+ end
198
+ engine = Tenjin::Engine.new(:postfix=>'.rbhtml', :templateclass=>_template_class())
199
+ result = engine.render(:content, context)
200
+ assert_text_equal(expected, result)
201
+ ensure
202
+ for filename, content in files
203
+ for fname in Dir.glob("#{filename}*")
204
+ File.unlink(fname) if test(?f, fname)
205
+ end
206
+ end
207
+ end
208
+ end
209
+
210
+
211
+ def test_local_layout
212
+ hash = TESTDATA['test_local_layout']
213
+ context = hash['context']
214
+ names = ['layout_html', 'layout_xhtml', 'content_html']
215
+ fname = lambda { |base| 'local_%s.rbhtml' % base }
216
+ begin
217
+ names.each do |name|
218
+ File.write(fname.call(name), hash[name])
219
+ end
220
+ engine = Tenjin::Engine.new(:prefix=>'local_', :postfix=>'.rbhtml', :layout=>:layout_html, :templateclass=>_template_class())
221
+ ##
222
+ content_html = hash['content_html']
223
+ File.write(fname.call('content_html'), content_html)
224
+ actual = engine.render(:content_html, context)
225
+ assert_text_equal(hash['expected_html'], actual)
226
+ ##
227
+ sleep(1)
228
+ content_html = hash['content_html'] + "<?rb @_layout = :layout_xhtml ?>\n"
229
+ File.write(fname.call('content_html'), content_html)
230
+ actual = engine.render(:content_html, context)
231
+ assert_text_equal(hash['expected_xhtml'], actual)
232
+ ##
233
+ sleep(1)
234
+ content_html = hash['content_html'] + "<?rb @_layout = false ?>\n"
235
+ File.write(fname.call('content_html'), content_html)
236
+ actual = engine.render(:content_html, context)
237
+ assert_text_equal(hash['expected_nolayout'], actual)
238
+ ensure
239
+ names.collect {|name| fname.call(name)}.each do |filename|
240
+ File.unlink(filename) if test(?f, filename)
241
+ filename += '.cache'
242
+ File.unlink(filename) if test(?f, filename)
243
+ end
244
+ end
245
+ end
246
+
247
+
248
+ def test_cachefile
249
+ data = TESTDATA['test_cachefile']
250
+ filenames = {
251
+ 'layout'=> 'layout.rbhtml',
252
+ 'page' => 'account_create.rbhtml',
253
+ 'form' => 'account_form.rbhtml',
254
+ }
255
+ expected = data['expected']
256
+ context = { 'params'=> { } }
257
+ begin
258
+ for key, filename in filenames
259
+ File.write(filename, data[key])
260
+ end
261
+ args = { :prefix=>'account_', :postfix=>'.rbhtml',
262
+ :layout=>'layout.rbhtml', :templateclass=>_template_class() }
263
+ ## no caching
264
+ args[:cache] = false
265
+ engine = Tenjin::Engine.new(args)
266
+ output = engine.render(:create, context)
267
+ assert_text_equal(expected, output)
268
+ assert !test(?f, 'account_create.rbhtml.cache')
269
+ #assert !test(?f, 'account_create.rbhtml.pstore')
270
+ assert !test(?f, 'account_form.rbhtml.cache')
271
+ #assert !test(?f, 'account_form.rbhtml.pstore')
272
+ ## ruby code caching
273
+ args[:cache] = true
274
+ engine = Tenjin::Engine.new(args)
275
+ output = engine.render(:create, context)
276
+ assert test(?f, 'account_create.rbhtml.cache')
277
+ #assert !test(?f, 'account_create.rbhtml.pstore')
278
+ assert test(?f, 'account_form.rbhtml.cache')
279
+ #assert !test(?f, 'account_form.rbhtml.pstore')
280
+ File.unlink('account_create.rbhtml.cache')
281
+ File.unlink('account_form.rbhtml.cache')
282
+ ## pstore caching
283
+ #args[:cache] = true
284
+ #engine = Tenjin::Engine(args)
285
+ #output = engine.render(:create, context)
286
+ #assert !test(?f, 'account_create.rbhtml.cache')
287
+ #assert !test(?f, 'account_create.rbhtml.pstore')
288
+ #assert !test(?f, 'account_form.rbhtml.cache')
289
+ #assert !test(?f, 'account_form.rbhtml.pstore')
290
+ ensure
291
+ for key, filename in filenames
292
+ for fname in [filename, filename+'.cache', filename+'.pstore']
293
+ test(?f, fname) and File.unlink(fname)
294
+ end
295
+ end
296
+ end
297
+
298
+ end
299
+
300
+
301
+ def test_change_layout()
302
+ data = TESTDATA['test_change_layout']
303
+ ## setup
304
+ basenames = %w[baselayout customlayout content]
305
+ for basename in basenames
306
+ File.write("#{basename}.rbhtml", data[basename])
307
+ end
308
+ ## body
309
+ begin
310
+ engine = Tenjin::Engine.new(:layout=>'baselayout.rbhtml',
311
+ :templateclass=>_template_class())
312
+ output = engine.render('content.rbhtml')
313
+ expected = data['expected']
314
+ assert_text_equal(expected, output)
315
+ ensure
316
+ for basename in basenames
317
+ Dir.glob("#{basename}.rbhtml*").each do |fname|
318
+ File.unlink(fname)
319
+ end
320
+ end
321
+ end
322
+ end
323
+
324
+
325
+ def test_context_scope
326
+ return if ENV['TEST'] && ENV['TEST'] != 'template_args'
327
+ data = TESTDATA['test_context_scope']
328
+ content = data['content']
329
+ expected = data['expected']
330
+ begin
331
+ File.write('base.rbhtml', data['base'])
332
+ File.write('part.rbhtml', data['part'])
333
+ engine = Tenjin::Engine.new()
334
+ actual = engine.render('base.rbhtml');
335
+ assert_text_equal(expected, actual)
336
+ ensure
337
+ _remove_files(['base', 'part'])
338
+ end
339
+ end
340
+
341
+
342
+ def test_template_args
343
+ return if ENV['TEST'] && ENV['TEST'] != 'template_args'
344
+ data = TESTDATA['test_template_args']
345
+ content = data['content']
346
+ expected = data['expected']
347
+ errormsg = data['errormsg']
348
+ exception = eval(data['exception'])
349
+ context = data['context']
350
+ for basename in %w[content]
351
+ File.write("#{basename}.rbhtml", data[basename])
352
+ end
353
+ # when no cache file
354
+ args1 = nil;
355
+ ex = assert_raise(exception) do
356
+ assert(!test(?f, 'content.rbhtml.cache'))
357
+ engine = Tenjin::Engine.new(:cache=>true)
358
+ args1 = engine.get_template('content.rbhtml').args
359
+ assert_not_nil(args1)
360
+ output = engine.render('content.rbhtml', context)
361
+ end
362
+ assert_equal(errormsg, ex.to_s.sub(/:0x\w+>/, '>'))
363
+ # when cache file exist
364
+ ex = assert_raise(NameError) do
365
+ #File.unlink('content.rbhtml');
366
+ assert(test(?f, 'content.rbhtml.cache'))
367
+ engine = Tenjin::Engine.new(:cache=>true)
368
+ args2 = engine.get_template('content.rbhtml').args
369
+ assert_not_nil(args2)
370
+ assert_equal(args1, args2)
371
+ output = engine.render('content.rbhtml', context)
372
+ end
373
+ assert_equal(errormsg, ex.to_s.sub(/:0x\w+>/, '>'))
374
+ ensure
375
+ _remove_files(['content'])
376
+ end
377
+
378
+
379
+ def test_cached_contents
380
+ return if ENV['TEST'] && ENV['TEST'] != 'template_args'
381
+ data = TESTDATA['test_cached_contents']
382
+ filename = 'input.pyhtml'
383
+ cachename = filename+'.cache'
384
+ _testproc = proc do |cacheflag, n|
385
+ script = data["script#{n}"]
386
+ cache = data["cache#{n}"]
387
+ args = data["args#{n}"]
388
+ cachename = filename+'.cache'
389
+ engine = Tenjin::Engine.new(:cache=>cacheflag)
390
+ t = engine.get_template(filename)
391
+ assert_equal(args, t.args)
392
+ assert_text_equal(script, t.script)
393
+ cache_actual = File.read(engine.cachename(filename))
394
+ assert_text_equal(cache, cache_actual)
395
+ end
396
+ #
397
+ ## args=[x,y,z], cache=1
398
+ for f in Dir.glob(filename+'*') do File.unlink(f) end
399
+ File.write(filename, data["input1"])
400
+ assert(!test(?f, cachename))
401
+ _testproc.call(cacheflag=true, n=1)
402
+ assert(test(?f, cachename))
403
+ _testproc.call(cacheflag=true, n=1)
404
+ ## args=[], cache=1
405
+ sleep(1)
406
+ File.write(filename, data["input2"])
407
+ #assert(test(?f, cachename))
408
+ _testproc.call(cacheflag=true, n=2)
409
+ #assert(test(?f, cachename))
410
+ _testproc.call(cacheflag=true, n=2)
411
+ ensure
412
+ _remove_files(['input.pyhtml'])
413
+ end
414
+
415
+
416
+ def _test_template_path(arg1, arg2, arg3)
417
+ data = TESTDATA['test_template_path']
418
+ basedir = 'test_templates'
419
+ keys = [arg1, arg2, arg3]
420
+ begin
421
+ for dir in [basedir, "#{basedir}/common", "#{basedir}/user"]
422
+ Dir.mkdir(dir) unless test(?d, dir)
423
+ end
424
+ d = { 'layout'=>arg1, 'body'=>arg2, 'footer'=>arg3 }
425
+ for key in %w[layout body footer]
426
+ filename = "#{basedir}/common/#{key}.rbhtml"
427
+ File.write(filename, data["common_#{key}"])
428
+ if d[key] == 'user'
429
+ filename = "#{basedir}/user/#{key}.rbhtml"
430
+ File.write(filename, data["user_#{key}"])
431
+ end
432
+ end
433
+ #
434
+ path = ["#{basedir}/user", "#{basedir}/common"]
435
+ engine = Tenjin::Engine.new(:postfix=>'.rbhtml', :path=>path, :layout=>:layout, :templateclass=>_template_class())
436
+ context = { :items=>%w[AAA BBB CCC] }
437
+ output = engine.render(:body, context)
438
+ #
439
+ expected = data["expected_#{keys.join('_')}"]
440
+ assert_text_equal(expected, output)
441
+ ensure
442
+ require 'fileutils'
443
+ FileUtils.rm_rf(basedir)
444
+ end
445
+ end
446
+
447
+ def test_template_path_common_common_common()
448
+ _test_template_path('common', 'common', 'common')
449
+ end
450
+ def test_template_path_user_common_common()
451
+ _test_template_path('user', 'common', 'common')
452
+ end
453
+ def test_template_path_common_user_common()
454
+ _test_template_path('common', 'user', 'common')
455
+ end
456
+ def test_template_path_user_user_common()
457
+ _test_template_path('user', 'user', 'common')
458
+ end
459
+ def test_template_path_common_common_user()
460
+ _test_template_path('common', 'common', 'user')
461
+ end
462
+ def test_template_path_user_common_user()
463
+ _test_template_path('user', 'common', 'user')
464
+ end
465
+ def test_template_path_common_user_user()
466
+ _test_template_path('common', 'user', 'user')
467
+ end
468
+ def test_template_path_user_user_user()
469
+ _test_template_path('user', 'user', 'user')
470
+ end
471
+
472
+
473
+ def test_preprocessor
474
+ return if ENV['TEST'] && ENV['TEST'] != 'preprocessor'
475
+ data = TESTDATA['test_preprocessor']
476
+ form = data['form']
477
+ create = data['create']
478
+ update = data['update']
479
+ layout = data['layout']
480
+ context = data['context']
481
+ #
482
+ basenames = %w[form create update layout]
483
+ filenames = []
484
+ basenames.each do |name|
485
+ filenames << (filename = "prep_#{name}.rbhtml")
486
+ File.write(filename, data[name])
487
+ end
488
+ engine = Tenjin::Engine.new(:prefix=>'prep_', :postfix=>'.rbhtml', :layout=>:layout, :preprocess=>true)
489
+ #
490
+ context = { :title=>'Create', :action=>'create', :params=>{'state'=>:NY} }
491
+ actual = engine.render(:create, context) # 1st
492
+ assert_text_equal(data['expected1'], actual)
493
+ context[:params] = {'state'=>:xx}
494
+ actual = engine.render(:create, context) # 2nd
495
+ #assert_text_equal(data['expected1'], actual)
496
+ assert_text_equal(data['expected1'].sub(/ checked="checked"/, ''), actual)
497
+ #
498
+ context = { :title=>'Update', :action=>'update', :params=>{'state'=>:NY} }
499
+ actual = engine.render(:update, context) # 1st
500
+ assert_text_equal(data['expected2'], actual)
501
+ context[:params] = {'state'=>:xx}
502
+ actual = engine.render(:update, context) # 2nd
503
+ assert_text_equal(data['expected2'], actual) # not changed!
504
+ #assert_text_equal(data['expected2'].sub(/ checked="checked"/, ''), actual)
505
+ ensure
506
+ _remove_files(Dir.glob('prep_*'))
507
+ end
508
+
509
+
510
+ if ENV['TEST']
511
+ targetname = 'test_' + ENV['TEST']
512
+ for m in self.instance_methods
513
+ private m if m =~ /^test_/ && m != targetname
514
+ end
515
+ end
516
+
517
+ end
518
+
519
+
520
+ #if defined?(Tenjin::ArrayBufferTemplate)
521
+ # class TenjinEngine2Test < TenjinEngineTest
522
+ # def _template_class
523
+ # Tenjin::ArrayBufferTemplate
524
+ # end
525
+ # end
526
+ #end