zena 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (245) hide show
  1. data/History.txt +28 -0
  2. data/README.rdoc +6 -6
  3. data/Rakefile +3 -0
  4. data/app/controllers/users_controller.rb +4 -2
  5. data/app/models/acl.rb +6 -0
  6. data/app/models/cached_page.rb +2 -1
  7. data/app/models/document.rb +3 -4
  8. data/app/models/node.rb +8 -5
  9. data/app/models/site.rb +1 -1
  10. data/app/models/template.rb +2 -2
  11. data/app/models/user.rb +5 -3
  12. data/app/views/acls/_add.rhtml +2 -1
  13. data/app/views/acls/_form.rhtml +15 -7
  14. data/app/views/acls/_li.rhtml +2 -0
  15. data/app/views/acls/index.rhtml +3 -1
  16. data/app/views/acls/show.html.erb +1 -1
  17. data/app/views/links/destroy.rjs +16 -2
  18. data/app/views/versions/destroy.rjs +1 -1
  19. data/app/views/zafu/default/Node-admin.zafu +1 -1
  20. data/bin/zena +5 -3
  21. data/bricks/acls/lib/bricks/acls.rb +11 -4
  22. data/bricks/acls/zena/migrate/20110627193757_add_allowed_mode_and_format_to_acl.rb +11 -0
  23. data/bricks/acls/zena/test/integration/acl_integration_test.rb +42 -0
  24. data/bricks/acls/zena/test/sites/erebus/acls.yml +8 -0
  25. data/bricks/mongrel/zena/deploy.rb +19 -0
  26. data/bricks/single/lib/bricks/single.rb +15 -0
  27. data/bricks/single/zena/init.rb +1 -0
  28. data/bricks/sphinx/zena/tasks.rb +1 -1
  29. data/bricks/static/lib/bricks/static.rb +151 -0
  30. data/bricks/static/zena/init.rb +1 -0
  31. data/bricks/static/zena/migrate/20110702010330_add_static_to_idx_templates.rb +12 -0
  32. data/bricks/static/zena/skins/blog/Image-edit.zafu +6 -0
  33. data/bricks/static/zena/skins/blog/Image.zafu +19 -0
  34. data/bricks/static/zena/skins/blog/Node-+index.zafu +1 -0
  35. data/bricks/static/zena/skins/blog/Node-+notFound.zafu +7 -0
  36. data/bricks/static/zena/skins/blog/Node-+search.zafu +19 -0
  37. data/bricks/static/zena/skins/blog/Node.zafu +66 -0
  38. data/bricks/static/zena/skins/blog/Post.zafu +12 -0
  39. data/bricks/static/zena/skins/blog/Project--kml.zafu +30 -0
  40. data/bricks/static/zena/skins/blog/Project.zafu +45 -0
  41. data/bricks/static/zena/skins/blog/comments.zafu +30 -0
  42. data/bricks/static/zena/skins/blog/dict.yml +11 -0
  43. data/bricks/static/zena/skins/blog/img/dateBg.jpg +0 -0
  44. data/bricks/static/zena/skins/blog/img/header.png +0 -0
  45. data/bricks/static/zena/skins/blog/img/mapPin.png +0 -0
  46. data/bricks/static/zena/skins/blog/img/menu.gif +0 -0
  47. data/bricks/static/zena/skins/blog/img/menuover.gif +0 -0
  48. data/bricks/static/zena/skins/blog/img/style.css +110 -0
  49. data/bricks/static/zena/test/integration/static_integration_test.rb +30 -0
  50. data/bricks/static/zena/test/unit/static_test.rb +33 -0
  51. data/bricks/zena/zena/migrate/01_base.rb +1 -2
  52. data/bricks/zena/zena/migrate/20110623072048_fix_cached_path_index.rb +10 -0
  53. data/bricks/zena/zena/migrate/20110710113731_remove_icon_field.rb +18 -0
  54. data/config/bricks.yml +4 -0
  55. data/config/deploy.rb +17 -2
  56. data/config/gems.yml +9 -7
  57. data/config/selenium.yml +38 -0
  58. data/lib/bricks/requirements_validation.rb +8 -2
  59. data/lib/gettext_strings.rb +2 -1
  60. data/lib/tasks/zena.rake +5 -0
  61. data/lib/zena/app.rb +12 -0
  62. data/lib/zena/console.rb +9 -1
  63. data/lib/zena/core_ext/string.rb +7 -2
  64. data/lib/zena/deploy.rb +60 -6
  65. data/lib/zena/deploy/app_init.rhtml +56 -0
  66. data/lib/zena/deploy/haproxy.cnf.rhtml +34 -0
  67. data/lib/zena/deploy/httpd.rhtml +6 -0
  68. data/lib/zena/deploy/start_stop.rhtml +35 -0
  69. data/lib/zena/info.rb +1 -1
  70. data/lib/zena/remote/connection.rb +1 -1
  71. data/lib/zena/site_worker.rb +9 -5
  72. data/lib/zena/use.rb +1 -1
  73. data/lib/zena/use/action.rb +2 -2
  74. data/lib/zena/use/ajax.rb +22 -9
  75. data/lib/zena/use/conditional.rb +5 -0
  76. data/lib/zena/use/context.rb +6 -1
  77. data/lib/zena/use/dates.rb +17 -2
  78. data/lib/zena/use/display.rb +14 -3
  79. data/lib/zena/use/forms.rb +37 -47
  80. data/lib/zena/use/html_tags.rb +3 -0
  81. data/lib/zena/use/node_context.rb +17 -17
  82. data/lib/zena/use/rendering.rb +1 -1
  83. data/lib/zena/use/urls.rb +11 -2
  84. data/lib/zena/use/zafu_attributes.rb +1 -0
  85. data/lib/zena/use/zafu_safe_definitions.rb +16 -1
  86. data/lib/zena/use/zafu_templates.rb +39 -24
  87. data/lib/zena/use/zazen.rb +1 -0
  88. data/locale/de/LC_MESSAGES/zena.mo +0 -0
  89. data/locale/de/zena.po +105 -89
  90. data/locale/en/LC_MESSAGES/zena.mo +0 -0
  91. data/locale/en/zena.mo +0 -0
  92. data/locale/en/zena.po +188 -253
  93. data/locale/fr/LC_MESSAGES/zena.mo +0 -0
  94. data/locale/fr/zena.mo +0 -0
  95. data/locale/fr/zena.po +200 -257
  96. data/locale/zena.pot +95 -85
  97. data/public/javascripts/zena.js +2 -2
  98. data/test/fixtures/files/{Node-test.zafu → TestNode.zafu} +206 -4
  99. data/test/functional/nodes_controller_test.rb +2 -2
  100. data/test/integration/navigation_test.rb +9 -3
  101. data/test/integration/query_node/basic.yml +4 -4
  102. data/test/integration/query_node/filters.yml +2 -2
  103. data/test/integration/zafu_compiler/ajax.yml +6 -6
  104. data/test/integration/zafu_compiler/basic.yml +1 -1
  105. data/test/integration/zafu_compiler/calendar.yml +4 -3
  106. data/test/integration/zafu_compiler/conditional.yml +3 -10
  107. data/test/integration/zafu_compiler/context.yml +1 -1
  108. data/test/integration/zafu_compiler/dates.yml +9 -1
  109. data/test/integration/zafu_compiler/display.yml +7 -1
  110. data/test/integration/zafu_compiler/eval.yml +12 -46
  111. data/test/integration/zafu_compiler/forms.yml +1 -1
  112. data/test/integration/zafu_compiler/query.yml +2 -2
  113. data/test/integration/zafu_compiler/relations.yml +19 -9
  114. data/test/integration/zafu_compiler/roles.yml +12 -0
  115. data/test/integration/zafu_compiler/safe_definitions.yml +1 -1
  116. data/test/integration/zafu_compiler/urls.yml +13 -5
  117. data/test/integration/zafu_compiler/version.yml +6 -0
  118. data/test/integration/zafu_compiler/zafu_attributes.yml +4 -4
  119. data/test/integration/zafu_compiler_test.rb +1 -1
  120. data/test/selenium.readme +8 -0
  121. data/test/selenium/Add/0setup.rsel +12 -0
  122. data/test/selenium/Add/add1.rsel +22 -0
  123. data/test/selenium/Add/add2.rsel +22 -0
  124. data/test/selenium/Add/add3.rsel +22 -0
  125. data/test/selenium/Drop/0setup.rsel +12 -0
  126. data/test/selenium/Drop/drop1.rsel +25 -0
  127. data/test/selenium/Drop/drop2.rsel +25 -0
  128. data/test/selenium/Drop/drop3.rsel +51 -0
  129. data/test/selenium/Drop/drop4.rsel +44 -0
  130. data/test/selenium/Drop/drop5.rsel +16 -0
  131. data/test/selenium/Edit/0setup.rsel +12 -0
  132. data/test/selenium/Edit/edit1.rsel +31 -0
  133. data/test/selenium/Edit/edit2.rsel +39 -0
  134. data/test/selenium/Edit/edit3.rsel +40 -0
  135. data/test/selenium/Form/0setup.rsel +12 -0
  136. data/test/selenium/Form/form1.rsel +9 -0
  137. data/test/selenium/Form/form2.rsel +9 -0
  138. data/test/selenium/Paginate/0setup.rsel +12 -0
  139. data/test/selenium/Paginate/paginate1.rsel +24 -0
  140. data/test/selenium/Toggle/0setup.rsel +12 -0
  141. data/test/selenium/Toggle/toggle1.rsel +21 -0
  142. data/test/sites/zena/nodes.yml +4 -4
  143. data/test/sites/zena/roles.yml +3 -2
  144. data/test/sites/zena/versions.yml +12 -11
  145. data/test/unit/core_ext_test.rb +23 -5
  146. data/test/unit/document_test.rb +6 -2
  147. data/test/unit/node_test.rb +2 -2
  148. data/test/unit/remote_test.rb +1 -2
  149. data/test/unit/role_test.rb +2 -2
  150. data/test/unit/user_test.rb +48 -1
  151. data/test/unit/virtual_class_test.rb +7 -7
  152. data/test/unit/zena/acts/secure_test.rb +1 -1
  153. data/test/unit/zena/use/rendering_test.rb +1 -1
  154. data/test/unit/zena/use/urls_test.rb +3 -3
  155. data/zena.gemspec +65 -101
  156. metadata +67 -103
  157. data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/Run 2.tmCommand +0 -24
  158. data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/Run Context.tmCommand +0 -58
  159. data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/Run Focused Should.tmCommand +0 -88
  160. data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/Run.tmCommand +0 -27
  161. data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/YAML to Shoulda.tmCommand +0 -23
  162. data/vendor/TextMate/Ruby Shoulda.tmbundle/Preferences/Symbol List: Context.tmPreferences +0 -19
  163. data/vendor/TextMate/Ruby Shoulda.tmbundle/Preferences/Symbol List: Should.tmPreferences +0 -19
  164. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory attributes for.tmSnippet +0 -16
  165. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory build.tmSnippet +0 -16
  166. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory.tmSnippet +0 -16
  167. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory_define with class.tmSnippet +0 -18
  168. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory_define.tmSnippet +0 -18
  169. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory_next.tmSnippet +0 -16
  170. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory_sequence.tmSnippet +0 -18
  171. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_bad_value.tmSnippet +0 -16
  172. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_contains.tmSnippet +0 -16
  173. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_does_not_contain.tmSnippet +0 -16
  174. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_good_value.tmSnippet +0 -16
  175. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_same_elements.tmSnippet +0 -16
  176. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_save.tmSnippet +0 -16
  177. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_sent_email.tmSnippet +0 -18
  178. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_valid.tmSnippet +0 -16
  179. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/association.tmSnippet +0 -17
  180. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/attribute.tmSnippet +0 -17
  181. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/before_should block.tmSnippet +0 -18
  182. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/context block get.tmSnippet +0 -22
  183. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/context block post.tmSnippet +0 -23
  184. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/context block with setup.tmSnippet +0 -25
  185. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/setup.tmSnippet +0 -18
  186. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should block with before proc.tmSnippet +0 -18
  187. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should block.tmSnippet +0 -18
  188. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_allow_values_for.tmSnippet +0 -16
  189. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_assign_to.tmSnippet +0 -16
  190. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_be_restful denied.tmSnippet +0 -20
  191. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_be_restful.tmSnippet +0 -20
  192. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_belong_to.tmSnippet +0 -16
  193. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_change by.tmSnippet +0 -16
  194. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_change from to.tmSnippet +0 -16
  195. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_ensure_length_at_least.tmSnippet +0 -16
  196. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_ensure_length_in_range.tmSnippet +0 -16
  197. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_ensure_length_is.tmSnippet +0 -16
  198. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_ensure_value_in_range.tmSnippet +0 -16
  199. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_eventually.tmSnippet +0 -18
  200. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_filter_params.tmSnippet +0 -16
  201. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_and_belong_to_many.tmSnippet +0 -16
  202. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_class_methods.tmSnippet +0 -16
  203. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_db_column.tmSnippet +0 -16
  204. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_db_columns.tmSnippet +0 -16
  205. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_index.tmSnippet +0 -16
  206. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_indices.tmSnippet +0 -16
  207. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_instance_methods.tmSnippet +0 -16
  208. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_many.tmSnippet +0 -16
  209. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_named_scope.tmSnippet +0 -16
  210. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_one.tmSnippet +0 -16
  211. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_readonly_attributes.tmSnippet +0 -16
  212. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_allow_mass_assignment_of.tmSnippet +0 -16
  213. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_allow_values_for.tmSnippet +0 -16
  214. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_assign_to.tmSnippet +0 -16
  215. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_change.tmSnippet +0 -16
  216. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_set_the_flash.tmSnippet +0 -16
  217. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_redirect_to.tmSnippet +0 -16
  218. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_render_a_form.tmSnippet +0 -16
  219. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_render_template.tmSnippet +0 -16
  220. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_render_with_layout.tmSnippet +0 -16
  221. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_render_without_layout.tmSnippet +0 -16
  222. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_respond_with.tmSnippet +0 -16
  223. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_respond_with_content_type.tmSnippet +0 -16
  224. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_return_from_session.tmSnippet +0 -16
  225. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_route.tmSnippet +0 -16
  226. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_set_the_flash_to.tmSnippet +0 -16
  227. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_acceptance_of.tmSnippet +0 -16
  228. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_numericality_of.tmSnippet +0 -16
  229. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_presence_of.tmSnippet +0 -16
  230. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_uniqueness_of with scope.tmSnippet +0 -16
  231. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_uniqueness_of.tmSnippet +0 -16
  232. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/catch_exception.rb +0 -39
  233. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/run_script.rb +0 -104
  234. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/stdin_dialog.rb +0 -14
  235. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/test.rb +0 -17
  236. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/todo.txt +0 -13
  237. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/bin/yaml_to_shoulda.rb +0 -25
  238. data/vendor/TextMate/Ruby Shoulda.tmbundle/Syntaxes/Ruby on Rails (Shoulda).tmLanguage +0 -166
  239. data/vendor/TextMate/Ruby Shoulda.tmbundle/info.plist +0 -304
  240. data/vendor/TextMate/Zena.tmbundle/Commands/Run all yaml tests.tmCommand +0 -37
  241. data/vendor/TextMate/Zena.tmbundle/Commands/Run focused yaml test.tmCommand +0 -52
  242. data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/catch_exception.rb +0 -39
  243. data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/run_script.rb +0 -118
  244. data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/stdin_dialog.rb +0 -14
  245. data/vendor/TextMate/Zena.tmbundle/info.plist +0 -17
@@ -648,7 +648,7 @@ Zena.popup_keydown = function(evt) {
648
648
  //if (e.keyCode) code = e.keyCode;
649
649
  //else if (e.which) code = e.which;
650
650
  var character = String.fromCharCode(code);
651
- alert('Character was ' + character);
651
+ //alert('Character was ' + character);
652
652
 
653
653
  if (code == Event.KEY_LEFT) {
654
654
  if (gallery.prev) {
@@ -903,7 +903,7 @@ Zena.plus_minus = function(elem, start, plus, minus) {
903
903
  var show = start == 'on' ? 'display:none;' : '';
904
904
  var hide = start == 'on' ? '' : 'display:none;';
905
905
  var trigger_tag = " <a id='off_"+id+"' style='"+show+"' onclick='Zena.m_toggle(\"" + id +"\")' class='plus_btn'>"+plus+"</a><a id='on_"+id+"' style='"+hide+"' onclick='Zena.m_toggle(\"" + id +"\")' class='minus_btn'>"+minus+"</a>";
906
- var new_tag = "<"+tag+" style='"+hide+"' id='txt_"+id+"' class='txt'>" + elem.innerHTML + "</"+tag+">";
906
+ var new_tag = "<"+tag+" style='"+hide+"' id='txt_"+id+"' class='txt" + ' ' + elem.className + "'>" + elem.innerHTML + "</"+tag+">";
907
907
  if (tag.toUpperCase() == 'SPAN' || !elem.previous()) {
908
908
  Element.replace(elem, trigger_tag + ' ' + new_tag);
909
909
  } else {
@@ -6,15 +6,216 @@
6
6
  <r:stylesheets media='all' list='reset,zena,code,calendar'/>
7
7
  </r:void>
8
8
  <link href="style.css" rel="Stylesheet" type="text/css"/>
9
-
9
+ <style>
10
+ .test { float:left; width:200px; padding:10px; background:#eee; border:1px solid #333; margin:0 10px 10px 0}
11
+ .test h3 {background:#333; color:white; text-align:center; margin:-10px -10px 10px -10px;}
12
+ .test a { color:#0067C6}
13
+ .test input {width:10em; height:1.2em; padding:2px;}
14
+ .test input[type="checkbox"] {width:1.2em;}
15
+ .test p { font-size:10px; font-style:italic; margin:-10px -10px 10px -10px; padding:5px; background:#ccc; border-bottom:1px solid #333; line-height:15px;}
16
+ .test td, .test th { border:1px solid #666; padding:2px;}
17
+ .test th { color:white; background-color:#666;}
18
+ .test .btn_x {padding:0; background:none; border:none; float:left; margin:5px 5px 5px 0;}
19
+ .test li.form {list-style-type:none; padding:0;}
20
+ .test .drop, .test .box {border:1px solid #888; margin:1em 0}
21
+ .test .drop {background:#ccc;}
22
+ .test .drop_hover { background:#ace; border:2px dashed #99f;}
23
+ </style>
10
24
  <r:javascripts list='prototype,effects,zena,dragdrop'/>
11
25
  <r:uses_datebox/>
12
26
  </r:with>
13
27
 
14
-
15
28
  <r:with part='context'/>
16
29
 
17
30
  <r:with part='content' class='project'>
31
+
32
+ <div class='test' id='add1' do='selenium'>
33
+ <h3>add1</h3>
34
+ <p>Using "add" to create new elements. The parent is guessed from context.</p>
35
+ <ul do='projects in site'>
36
+ <li do='add' klass='Project' after='self'/>
37
+ <li class='#{title}' do='each'><r:link/> <span do='parent' do='title'/></li>
38
+ </ul>
39
+ </div>
40
+
41
+ <div class='test' id='add2' do='selenium'>
42
+ <h3>add2</h3>
43
+ <p>Using "add" to create new elements. The parent is set witn node[parent_id]='root.id'.</p>
44
+ <ul do='projects in site'>
45
+ <li do='add' klass='Project' node[parent_id]='root.id' after='self'/>
46
+ <li class='#{title}' do='each'><r:link/> <span do='parent' do='title'/></li>
47
+ </ul>
48
+ </div>
49
+
50
+ <div class='test' id='add3' do='selenium'>
51
+ <h3>add3</h3>
52
+ <p>Create new elements with [add_btn] and [form_tag] (in table).</p>
53
+ <table do='projects in site'>
54
+ <tr do='add' klass='Project' after='self'>
55
+ <td do='add_btn'/>
56
+ </tr>
57
+ <tr class='#{title}' do='each'>
58
+ <td><r:link/> <span do='parent' do='title'/></td>
59
+ </tr>
60
+ <tr do='form'>
61
+ <td do='form_tag'><r:input name='title'/><r:input type='submit'/></td>
62
+ </tr>
63
+ </table>
64
+ </div>
65
+
66
+ <div class='test' id='edit1' do='selenium'>
67
+ <h3>edit1</h3>
68
+ <p>Edit in place, form built from block.</p>
69
+ <ul do='block'>
70
+ <li do='edit'/>
71
+ <li class='title' do='title'/>
72
+ <li do='if' in='form'><r:input type='submit'/></li>
73
+ </ul>
74
+ </div>
75
+
76
+ <div class='test' id='edit2' do='selenium'>
77
+ <h3>edit2</h3>
78
+ <p>Edit in place with custom from.</p>
79
+ <ul do='block'>
80
+ <li do='edit'/>
81
+ <li class='title' do='title'/>
82
+ <li do='form' on='edit'>
83
+ <r:input name='title'/> <r:input type='checkbox' name='v_status' value='50'/>
84
+ </li>
85
+ </ul>
86
+ </div>
87
+
88
+ <div class='test' id='edit3' do='selenium'>
89
+ <h3>edit3</h3>
90
+ <p>Edit table place (makes form from block). This should not break html (the form should be outside of the "table" tag).</p>
91
+ <table do='block'>
92
+ <tr><td colspan='2' do='edit'/></tr>
93
+ <tr><td>title</td><td class='title' do='title'/></tr>
94
+ </table>
95
+ </div>
96
+
97
+ <div class='test' id='toggle1' do='selenium'>
98
+ <h3>toggle1</h3>
99
+ <p>Toggle relation in list.</p>
100
+ <ul class='references' do='references'>
101
+ <li do='each' do='title'/>
102
+ </ul>
103
+ <ul do='projects in site'>
104
+ <li do='each' toggle='reference' for='start' do='title'/>
105
+ </ul>
106
+ </div>
107
+
108
+ <div class='test' id='paginate1' do='selenium'>
109
+ <h3>paginate1</h3>
110
+ <p>Ajax pagination.</p>
111
+ <table id='paginate1_tbl' do='block' do='nodes in site limit 3 paginate p'>
112
+ <tr>
113
+ <th style='width:4em'>klass</th>
114
+ <th>title</th>
115
+ </tr>
116
+ <tr>
117
+ <td colspan='2'>
118
+ <span do='link' page='list' update='paginate1_tbl'/>
119
+ </td>
120
+ </tr>
121
+ <tr id='node#{id}' do='each'>
122
+ <td do='klass'/>
123
+ <td do='title'/>
124
+ </tr>
125
+ </table>
126
+ </div>
127
+
128
+ <div class='test' id='form1' do='selenium'>
129
+ <h3>form1</h3>
130
+ <p>Form in [new] to create objects.</p>
131
+ <r:new klass='Page' title='%{hello}'>
132
+ <r:form node[v_status]='50'>
133
+ <r:input label='t' name='title'/>
134
+ </r:form>
135
+ </r:new>
136
+ </div>
137
+
138
+ <div class='test' id='form2' do='selenium'>
139
+ <h3>form2</h3>
140
+ <p>Form to update object.</p>
141
+ <r:form node[v_status]='50'>
142
+ <r:input label='t' name='title'/>
143
+ </r:form>
144
+ </div>
145
+
146
+ <div class='test' id='drop1' do='selenium'>
147
+ <h3>drop1</h3>
148
+ <p>Create a relation by drag and dropping.</p>
149
+
150
+ <ul do='pages in site limit 3'>
151
+ <li do='each' draggable='true' do='title'/>
152
+ </ul>
153
+ <ul do='drop' set='reference' change='receiver' do='references'>
154
+ <li class='#{id}' do='each'><r:unlink/> <r:title/></li>
155
+ </ul>
156
+ </div>
157
+
158
+ <div class='test' id='drop2' do='selenium'>
159
+ <h3>drop2</h3>
160
+ <p>Drop in each loop.</p>
161
+
162
+ <ul do='pages in site limit 3'>
163
+ <li do='each' draggable='true' do='title'/>
164
+ </ul>
165
+
166
+ <r:projects in='site' do='each'>
167
+ <ul class='drop drop_#{id}' do='drop' set='reference' change='receiver' do='references'>
168
+ <li class='#{id}' do='each'><r:unlink/> <r:title/></li>
169
+ </ul>
170
+ </r:projects>
171
+ </div>
172
+
173
+ <div class='test' id='drop3' do='selenium'>
174
+ <h3>drop3</h3>
175
+ <p>Drag from list in each loop.</p>
176
+ <r:projects in='site' do='each'>
177
+ <ul class='box' do='pages'>
178
+ <li class='#{id}' do='each' draggable='true' do='title'/>
179
+ </ul>
180
+ </r:projects>
181
+
182
+ <ul do='drop' set='reference' change='receiver' do='references'>
183
+ <li class='#{id}' do='each'><r:unlink/> <r:title/></li>
184
+ </ul>
185
+ </div>
186
+
187
+ <div class='test' id='drop4' do='selenium'>
188
+ <h3>drop4</h3>
189
+ <p>Drag duplicate elements in source.</p>
190
+
191
+ <ul class='box' do='pages in project limit 3'>
192
+ <li class='#{id}' do='each' draggable='true' do='title'/>
193
+ </ul>
194
+
195
+ <ul class='box' do='pages in project limit 3'>
196
+ <li class='#{id}' do='each' draggable='true' do='title'/>
197
+ </ul>
198
+
199
+ <ul do='drop' set='reference' change='receiver' do='references'>
200
+ <li class='#{id}' do='each'><r:unlink/> <r:title/></li>
201
+ </ul>
202
+ </div>
203
+
204
+ <div class='test' id='drop5' do='selenium'>
205
+ <h3>drop5</h3>
206
+ <p>Drag from drop loop.</p>
207
+
208
+ <ul class='box' do='pages in project limit 3'>
209
+ <li class='#{id}' do='each' draggable='true' do='title'/>
210
+ </ul>
211
+
212
+ <r:projects in='site' do='each'>
213
+ <ul class='drop drop_#{id}' do='drop' set='reference' change='receiver' do='references'>
214
+ <li class='#{id}' do='each' draggable='true'><r:unlink/> <r:title/></li>
215
+ </ul>
216
+ </r:projects>
217
+ </div>
218
+ <!-- OLD TESTS
18
219
  <div id='related'>
19
220
  <ul do='pages'>
20
221
  <li do='each'><p><b do='show' attr='title' edit='true' publish='true'/> <r:edit/></p>
@@ -188,7 +389,7 @@ This filter updates the "distant filter block test"
188
389
  <h3>drop set relation (drop in each)</h3>
189
390
 
190
391
  <ul do='tags in site'>
191
- <!-- drop in each -->
392
+ //! drop in each
192
393
  <li style='border:1px solid #400; min_width:100px; min_height:100px;' do='each' do='drop' set='set_tag'>
193
394
  <b do='title'/>
194
395
  <ul do='context' select='tagged'><li do='each' do='unlink' do='img' mode='tiny'/></ul>
@@ -199,7 +400,7 @@ This filter updates the "distant filter block test"
199
400
 
200
401
 
201
402
  <ul do='tags in site'>
202
- <!-- drop in each -->
403
+ //! drop in each
203
404
  <li style='border:1px solid #400; min_width:100px; min_height:100px;' do='each' do='drop' set='set_tag'>
204
405
  <b do='title'/>
205
406
  <ul do='context' select='tagged'><li do='each' do='unlink' do='img' mode='tiny'/></ul>
@@ -325,5 +526,6 @@ This filter updates the "distant filter block test"
325
526
 
326
527
 
327
528
  <hr/>
529
+ -->
328
530
  </r:with>
329
531
  </r:include>
@@ -874,7 +874,7 @@ END:VCALENDAR
874
874
  get 'edit', :id => nodes_zip(:zena)
875
875
  assert_response :success
876
876
  assert_template 'nodes/edit'
877
- assert_match %r{/Default skin/Node-%2BpopupLayout/en/_main$}, @response.layout
877
+ assert_match %r{/Default skin/Node-\+popupLayout/en/_main$}, @response.layout
878
878
  end
879
879
 
880
880
  def test_crop_image
@@ -904,7 +904,7 @@ END:VCALENDAR
904
904
  def test_should_get_test_page_without_errors
905
905
  without_files('test.host/zafu') do
906
906
  login(:tiger)
907
- get 'show', 'prefix'=>'oo', 'path'=>["page#{nodes_zip(:projects)}_test.html"]
907
+ get 'show', 'prefix'=>'oo', 'path'=>["testnode#{nodes_zip(:test)}.html"]
908
908
  assert_response :success
909
909
  end
910
910
  end
@@ -326,18 +326,24 @@ class NavigationTest < Zena::Integration::TestCase
326
326
  assert_response :success
327
327
  end
328
328
  end # in the wrong language
329
-
329
+
330
330
  context 'with a mode' do
331
+ setup do
332
+ login(:lion)
333
+ secure(Template) { Template.create(:parent_id => nodes_id(:default), :title => 'Project-changes.zafu', :v_status => Zena::Status::Pub, :text => 'nothing ever changes in "<r:title/>"') }
334
+ end
335
+
331
336
  subject do
332
- 'http://test.host/en/projects-list/Clean-Water-project_test'
337
+ 'http://test.host/en/projects-list/Clean-Water-project_changes'
333
338
  end
334
339
 
335
340
  should 'get response' do
336
341
  get subject
337
342
  assert_response :success
343
+ assert_equal 'nothing ever changes in "Clean Water project"', response.body
338
344
  end
339
345
  end # with a mode
340
-
346
+
341
347
  end # On a page with custom base
342
348
 
343
349
  def test_url_with_custom_base
@@ -5,7 +5,7 @@ default:
5
5
  visitor: 'ant'
6
6
  src: ""
7
7
  sql: "[%Q{SELECT nodes.* FROM nodes WHERE #{secure_scope('nodes')} AND nodes.parent_id = ? ORDER BY nodes.zip ASC}, @node.id]"
8
- res: "Etat des travaux, The lake we love, it's a lake, water, crocodiles, super ouverture, Keeping things clean !"
8
+ res: "Etat des travaux, The lake we love, it's a lake, water, crocodiles, super ouverture"
9
9
 
10
10
  nodes:
11
11
  src: "nodes"
@@ -14,7 +14,7 @@ nodes:
14
14
  pages:
15
15
  src: "pages"
16
16
  sql: "[%Q{SELECT nodes.* FROM nodes WHERE #{secure_scope('nodes')} AND nodes.kpath LIKE 'NP%' AND nodes.parent_id = ? ORDER BY nodes.zip ASC}, @node.id]"
17
- res: "Etat des travaux, crocodiles, Keeping things clean !"
17
+ res: "Etat des travaux, crocodiles"
18
18
 
19
19
  letters:
20
20
  src: "letters"
@@ -45,7 +45,7 @@ pages_or_letters:
45
45
  node: zena
46
46
  src: pages or letters
47
47
  sql: "[%Q{SELECT nodes.* FROM nodes WHERE #{secure_scope('nodes')} AND ((nodes.kpath LIKE 'NP%' AND nodes.parent_id = ?) OR (nodes.kpath LIKE 'NNL%' AND nodes.parent_id = ?)) GROUP BY id ORDER BY nodes.zip ASC}, @node.id, @node.id]"
48
- res: "people, projects list, Collections, Nature, zena enhancements, Skins (layout themes)"
48
+ res: "people, projects list, Collections, Kill the bugs, Nature, zena enhancements, Skins (layout themes)"
49
49
 
50
50
  project:
51
51
  sql: "[%Q{SELECT nodes.* FROM nodes WHERE #{secure_scope('nodes')} AND nodes.id = ? ORDER BY nodes.zip ASC}, @node.get_project_id]"
@@ -78,7 +78,7 @@ vclass_in_project:
78
78
 
79
79
  vlcass_or_pages:
80
80
  src: "(posts in project) or pages"
81
- res: "Etat des travaux, crocodiles, super ouverture, Keeping things clean !"
81
+ res: "Etat des travaux, crocodiles, super ouverture"
82
82
 
83
83
  find_relation:
84
84
  context:
@@ -87,7 +87,7 @@ filter_with_fullpath:
87
87
  # Get all objects under a given node (node the '/' to avoid self)
88
88
  src: "nodes where fullpath like \"#{fullpath}/%\" in site order by fullpath"
89
89
  sql: "[%Q{SELECT nodes.* FROM nodes WHERE #{secure_scope('nodes')} AND nodes.fullpath LIKE ? ORDER BY nodes.fullpath}, \"#{@node.fullpath}/%\"]"
90
- res: "Etat des travaux, The lake we love, it's a lake, water, crocodiles, super ouverture, Keeping things clean !"
90
+ res: "Etat des travaux, The lake we love, it's a lake, water, crocodiles, super ouverture"
91
91
 
92
92
  class_filter:
93
93
  src: "nodes where class like Image or class = Project in site"
@@ -120,7 +120,7 @@ filter_by_parent:
120
120
  src: "nodes where parent_id = 11 in site"
121
121
  # nodes where parent.zip = ...
122
122
  sql: "%Q{SELECT nodes.* FROM nodes,nodes AS jn1 WHERE #{secure_scope('nodes')} AND jn1.zip = 11 AND jn1.id = nodes.parent_id AND jn1.site_id = nodes.site_id ORDER BY nodes.zip ASC}"
123
- res: 'people, projects list, Collections, Nature, zena enhancements, Skins (layout themes)'
123
+ res: 'people, projects list, Collections, Kill the bugs, Nature, zena enhancements, Skins (layout themes)'
124
124
  #many_role_filter:
125
125
  # This is not working (or clause on 'indexed' fields is not supported right now)
126
126
  # src: "nodes where role = Original or role = Task in site"
@@ -12,7 +12,7 @@ block:
12
12
  add:
13
13
  src: "<ul id='children' do='nodes'><li do='each' do='link'/><li do='add'/></ul>"
14
14
  tem: "/\[\"children_add\", \"children_form\"\].each\(Element.toggle\)/"
15
- 'ajax/add/en/children_form.erb': "/class='form' id='<%= ndom_id\(@node\) %>_form'/"
15
+ 'ajax/add/en/children_form.erb': "/class='form' id='<%= ndom_id\(@node\) %>'/"
16
16
  'ajax/add/en/children.erb': "<li id='<%= ndom_id(@node) %>'><a href='<%= zen_path(@node) %>'><%= @node.prop['title'] %></a></li>"
17
17
 
18
18
  edit_not_each:
@@ -51,7 +51,7 @@ form_update:
51
51
  src: "<div id='foo' do='block'><r:form update='foo'></r:form></div>"
52
52
  res: "/t_url=ajax%2Fform%2Fupdate%2Ffoo/"
53
53
  'ajax/form/update/en/foo.erb': '/t_url=ajax%2Fform%2Fupdate%2Ffoo'
54
-
54
+
55
55
  add_each_no_form:
56
56
  src: "<ul do='children' id='things'><li do='each'>I <p do='title'>blah</p></li><li do='add'/></ul>"
57
57
  tem: "!/</ul><ul></ul>/" # bug in closing group with [add].
@@ -128,7 +128,7 @@ make_form:
128
128
  src: "<ul do='children'><li do='each' do='title'/><li do='add'/></ul>"
129
129
  tem: "/<li style='display:none;' class='form' id='list1_form'>.*remote_form_for\(:node, var2_new"
130
130
  'ajax/make/form/en/list1.erb': "<li id='<%= ndom_id(@node) %>'><%= @node.prop['title'] %></li>"
131
- 'ajax/make/form/en/list1_form.erb': "/<li class='form' id='<%= ndom_id\(@node\) %>_form'>/"
131
+ 'ajax/make/form/en/list1_form.erb': "/<li class='form' id='<%= ndom_id\(@node\) %>'>/"
132
132
 
133
133
  each_edit_cannot_write:
134
134
  context:
@@ -178,7 +178,7 @@ live_filter:
178
178
  # Make sure a unique_name is set for the given block
179
179
  tem: "/name='t_url' value='ajax/live/filter/list1'.*<% filter_form\(@node.*ml1.value LIKE \?.*, \"#\{params\[:f\]\}%\"/"
180
180
  'ajax/live/filter/en/list1.erb': "/<div id='<%= ndom_id\(@node\).*, \"#\{params\[:f\]\}%\".*var2.prop\['title'\]/"
181
- res: "/<input type='text' name='f'.*<div id='list1'><ol><li>crocodiles</li><li>Keeping things clean !</li><li>status title</li></ol></div>/"
181
+ res: "/<input type='text' name='f'.*<div id='list1'><ol><li>crocodiles</li><li>status title</li></ol></div>/"
182
182
 
183
183
  live_filter_single_element:
184
184
  context:
@@ -194,7 +194,7 @@ live_filter_select_options:
194
194
  src: "<r:filter live='true' do='select' param='f' values='1,2'/><r:block><ol do='pages where title like \"#{params[:f]}%\"'><li do='each' do='title'/></ol></r:block>"
195
195
  tem: "/select name=.f.><%= options_for_select\(\[.1., .2.\], params\[:f\].to_s/"
196
196
  'ajax/live/filter/select/options/en/list1.erb': "/<div id='<%= ndom_id\(@node\) %>'.*params\[:f\]/"
197
- res: "/<select name='f'.*<div id='list1'><ol><li>crocodiles</li><li>Keeping things clean !</li><li>status title</li></ol></div>/"
197
+ res: "/<select name='f'.*<div id='list1'><ol><li>crocodiles</li><li>status title</li></ol></div>/"
198
198
 
199
199
  draggable_do_syntax:
200
200
  src: "<r:images in='site' do='each' draggable='all' do='img' mode='pv'/>"
@@ -299,7 +299,7 @@ drop_add_link:
299
299
  src: "<div do='drop' add='favorite'></div>"
300
300
  # without the ugly inspect, this would be '#{id}' or "\#{id}"
301
301
  tem: "/drop_node_path.*\"node\[favorite_id\]\" => \"\\\\#\{id\}\"/"
302
- res: "<div class='drop' id='list1'>drop</div>"
302
+ res: "<div class='drop' id='list1'></div>"
303
303
  js: "/Droppables.add\('list1'.*/nodes/22/drop.*node\[favorite_id\]=%23%7Bid%7D"
304
304
 
305
305
  drop_var_scope:
@@ -36,7 +36,7 @@ each_alternate_class:
36
36
  context:
37
37
  node: 'cleanWater'
38
38
  src: "<ol do='pages'><li do='each' alt_class='blue' do='title'/></ol>"
39
- res: "<ol><li class=''>crocodiles</li><li class='blue'>status title</li><li class=''>Keeping things clean !</li></ol>"
39
+ res: "<ol><li class=''>crocodiles</li><li class='blue'>status title</li><li class=''>Kill the bugs</li></ol>"
40
40
 
41
41
  each_alternate_class_reverse:
42
42
  context:
@@ -15,7 +15,8 @@ calendar_tz:
15
15
  context:
16
16
  date: "2006-03-18"
17
17
  src: "<div do='calendar' attr='date' tz='America/New_York' select='posts where #{cal_start} <= date and date < #{cal_end} in project'/>"
18
- res: "/<td><p>14</p><ol><li><a href='/oo/projects-list/Clean-Water-project/post27.html'>parc openi…</a></li></ol><\/td>.*<td class='sat ref'>18</td>/"
18
+ # previous date 00:00 = uses tz in link.
19
+ res: "/date=2006-02-18\+00%3A00.*<td><p>14</p><ol><li><a href='/oo/projects-list/Clean-Water-project/post27.html'>parc openi…</a></li></ol><\/td>.*<td class='sat ref'>18</td>/"
19
20
 
20
21
  calendar_with_blocks:
21
22
  context:
@@ -32,8 +33,8 @@ calendar_with_blocks:
32
33
  calendar_node_attr:
33
34
  context:
34
35
  date: '2006-03-10'
35
- src: "<div do='calendar' attr='created_at' select='nodes where #{cal_start} <= created_at and created_at < #{cal_end} in project'/>"
36
- res: "/p>10</p>.*Keeping th…/"
36
+ src: "<div do='calendar' attr='created_at' select='pages where #{cal_start} <= created_at and created_at < #{cal_end} in site'/>"
37
+ res: "/p>10</p>.*Kill the b…/"
37
38
 
38
39
  calendar_bad_query:
39
40
  src: "<div do='calendar' attr='date' select='posts where #{cal_start} <= starsky and hutch < #{cal_end} in project'/>"
@@ -98,13 +98,13 @@ if_has_discussion:
98
98
 
99
99
  case_ancestor:
100
100
  src: "<r:root><r:pages><r:each join=', '><r:case><r:when eval='is_ancestor?(main)'><b><r:show attr='title'/></b></r:when><r:else><r:show attr='title'/></r:else></r:case></r:each></r:pages></r:root>"
101
- res: "Collections, Nature, people, <b>projects list</b>, Skins (layout themes)"
101
+ res: "Collections, Kill the bugs, Nature, people, <b>projects list</b>, Skins (layout themes)"
102
102
 
103
103
  on_if_ancestor_no_class:
104
104
  old_src: "<r:root><r:pages><li do='each' on_if_node='ancestor' join=', '><r:show attr='title'/></li></r:pages></r:root>"
105
105
  src: "<r:root><r:pages><li do='each' on_if='is_ancestor?(main)' join=', '><r:show attr='title'/></li></r:pages></r:root>"
106
106
  tem: '/var3.is_ancestor\?\(@node\)/'
107
- res: "<li class=''>Collections</li>, <li class=''>Nature</li>, <li class=''>people</li>, <li class=' on'>projects list</li>, <li class=''>Skins (layout themes)</li>"
107
+ res: "<li class=''>Collections</li>, <li class=''>Kill the bugs</li>, <li class=''>Nature</li>, <li class=''>people</li>, <li class=' on'>projects list</li>, <li class=''>Skins (layout themes)</li>"
108
108
 
109
109
  multiple_class_conditions:
110
110
  src: "<li class='unknown' do='void' one_if='custom_a == 1' two_if='custom_a == 2'>Agrippina</li>"
@@ -138,7 +138,7 @@ on_if_attribute_with_edit:
138
138
 
139
139
  on_if_node_main:
140
140
  src: "<r:parent><r:pages><div do='each' on_if='id == main.id' do='title'>hello</div></r:pages></r:parent>"
141
- res: "<div class=''>crocodiles</div><div class=''>Keeping things clean !</div><div class=' on'>status title</div>"
141
+ res: "<div class=''>crocodiles</div><div class=' on'>status title</div>"
142
142
 
143
143
  if_in_tag:
144
144
  src: "<r:form><p do='if' in='form' do='title'/></r:form><i do='if' in='form' do='title'/>done."
@@ -174,13 +174,6 @@ visitor_is_anon:
174
174
  src: "<r:if test='visitor.is_anon?'>anonymous<r:else>logged in</r:else></r:if>"
175
175
  res: "anonymous"
176
176
 
177
- test_in_each:
178
- context:
179
- node: 'cleanWater'
180
- src: "<ul do='pages'><li do='each' on_if='this.title == \"Keeping things clean !\"' do='title'/></ul>"
181
- tem: "/var2.prop\['title'\]==\"Keeping things clean !\"/"
182
- res: "<ul><li class=''>crocodiles</li><li class=' on'>Keeping things clean !</li><li class=''>status title</li></ul>"
183
-
184
177
  render_test:
185
178
  src: "<r:can_write?>hello</r:can_write?>"
186
179
  tem: "<% if @node.can_write? %>hello<% end %>"