zena 1.1.3 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (392) hide show
  1. data/History.txt +23 -1
  2. data/MIT-LICENSE +2 -2
  3. data/README.rdoc +2 -15
  4. data/app/controllers/acls_controller.rb +1 -1
  5. data/app/controllers/documents_controller.rb +12 -3
  6. data/app/controllers/nodes_controller.rb +1 -3
  7. data/app/controllers/sites_controller.rb +7 -0
  8. data/app/controllers/versions_controller.rb +1 -1
  9. data/app/controllers/virtual_classes_controller.rb +7 -8
  10. data/app/models/acl.rb +3 -2
  11. data/app/models/relation_proxy.rb +2 -1
  12. data/app/models/role.rb +16 -0
  13. data/app/models/site.rb +48 -0
  14. data/app/models/text_document.rb +2 -1
  15. data/app/models/user.rb +2 -1
  16. data/app/models/zip.rb +2 -1
  17. data/app/views/acls/index.rhtml +11 -1
  18. data/app/views/documents/show.rhtml +1 -1
  19. data/app/views/relations/_add.erb +2 -2
  20. data/app/views/relations/_form.erb +5 -2
  21. data/app/views/relations/_li.erb +4 -1
  22. data/app/views/relations/index.erb +3 -3
  23. data/app/views/sites/_form.erb +1 -1
  24. data/app/views/sites/_job.erb +4 -0
  25. data/app/views/sites/index.erb +1 -1
  26. data/app/views/sites/jobs.erb +10 -0
  27. data/app/views/templates/document_create_tabs/_file.rhtml +3 -0
  28. data/app/views/zafu/default/Node-+search.zafu +2 -2
  29. data/bricks/acls/zena/init.rb +2 -1
  30. data/bricks/acls/zena/test/integration/acl_integration_test.rb +5 -5
  31. data/bricks/acls/zena/test/sites/erebus/acls.yml +2 -2
  32. data/bricks/acls/zena/test/unit/acl_test.rb +2 -2
  33. data/bricks/grid/lib/bricks/grid.rb +110 -0
  34. data/bricks/grid/zena/init.rb +4 -0
  35. data/bricks/math/lib/bricks/math.rb +1 -0
  36. data/bricks/pdf/lib/bricks/pdf.rb +10 -1
  37. data/bricks/sphinx/zena/tasks.rb +8 -40
  38. data/bricks/spreadsheet/README +31 -0
  39. data/bricks/spreadsheet/lib/bricks/spreadsheet.rb +293 -0
  40. data/bricks/spreadsheet/zena/init.rb +3 -0
  41. data/bricks/spreadsheet/zena/test/sites/zena/links.yml +11 -0
  42. data/bricks/spreadsheet/zena/test/unit/xlsx_test.rb +5 -0
  43. data/bricks/spreadsheet/zena/test/zafu/README +27 -0
  44. data/bricks/spreadsheet/zena/test/zafu/spreadsheet.yml +19 -0
  45. data/bricks/worker/lib/bricks/worker.rb +11 -5
  46. data/bricks/worker/zena/init.rb +8 -0
  47. data/bricks/worker/zena/migrate/20120501091514_add_site_id_to_jobs.rb +9 -0
  48. data/bricks/zena/zena/migrate/01_base.rb +0 -7
  49. data/bricks/zena/zena/migrate/20111214112233_add_comment_to_relations.rb +9 -0
  50. data/config/bricks.yml +15 -1
  51. data/config/environments/production.rb +2 -2
  52. data/config/gems.yml +6 -1
  53. data/doc/zafu_changes.yml +1 -1
  54. data/lib/tasks/zena.rake +6 -2
  55. data/lib/zena/app.rb +1 -1
  56. data/lib/zena/code/default_syntax.rb +5 -1
  57. data/lib/zena/db_helper/mysql.rb +5 -1
  58. data/lib/zena/deploy/app_init.rhtml +11 -7
  59. data/lib/zena/deploy/awstats.conf.rhtml +1 -1
  60. data/lib/zena/deploy/start_stop.rhtml +5 -5
  61. data/lib/zena/deploy/vhost.rhtml +16 -2
  62. data/lib/zena/deploy.rb +5 -3
  63. data/lib/zena/info.rb +1 -1
  64. data/lib/zena/parser/zazen_rules.rb +7 -7
  65. data/lib/zena/remote/node.rb +7 -0
  66. data/lib/zena/routes.rb +4 -5
  67. data/lib/zena/test_controller.rb +18 -1
  68. data/lib/zena/use/action.rb +13 -4
  69. data/lib/zena/use/ajax.rb +10 -4
  70. data/lib/zena/use/authlogic.rb +1 -1
  71. data/lib/zena/use/calendar.rb +4 -0
  72. data/lib/zena/use/conditional.rb +3 -0
  73. data/lib/zena/use/dates.rb +44 -4
  74. data/lib/zena/use/display.rb +45 -15
  75. data/lib/zena/use/forms.rb +59 -30
  76. data/lib/zena/use/query_builder.rb +12 -12
  77. data/lib/zena/use/recursion.rb +1 -1
  78. data/lib/zena/use/rendering.rb +18 -17
  79. data/lib/zena/use/urls.rb +2 -1
  80. data/lib/zena/use/zafu_safe_definitions.rb +0 -9
  81. data/lib/zena/use/zafu_templates.rb +2 -2
  82. data/lib/zena/use/zazen.rb +1 -3
  83. data/lib/zena/use.rb +13 -2
  84. data/lib/zena.rb +8 -2
  85. data/public/images/bullet_back.png +0 -0
  86. data/public/javascripts/grid.js +535 -0
  87. data/public/javascripts/tablekit.js +0 -0
  88. data/public/javascripts/window.js +0 -0
  89. data/public/javascripts/zena.js +17 -7
  90. data/public/stylesheets/admin.css +5 -1
  91. data/public/stylesheets/grid.css +19 -0
  92. data/test/fixtures/files/TestNode.zafu +123 -311
  93. data/test/fixtures/files/translations_fr.yml +6 -1
  94. data/test/functional/acls_controller_test.rb +2 -2
  95. data/test/functional/nodes_controller_test.rb +17 -11
  96. data/test/functional/virtual_classes_controller_test.rb +1 -1
  97. data/test/integration/query_node/basic.yml +9 -0
  98. data/test/integration/query_node/dates.yml +1 -1
  99. data/test/integration/zafu_compiler/ajax.yml +9 -9
  100. data/test/integration/zafu_compiler/basic.yml +0 -24
  101. data/test/integration/zafu_compiler/dates.yml +24 -7
  102. data/test/integration/zafu_compiler/display.yml +45 -2
  103. data/test/integration/zafu_compiler/errors.yml +0 -6
  104. data/test/integration/zafu_compiler/forms.yml +41 -3
  105. data/test/integration/zafu_compiler/query.yml +29 -3
  106. data/test/integration/zafu_compiler/roles.yml +0 -4
  107. data/test/integration/zafu_compiler/safe_definitions.yml +1 -1
  108. data/test/integration/zafu_compiler_test.rb +11 -3
  109. data/test/selenium/Add/add3.rsel +8 -8
  110. data/test/selenium/Drop/drop1.rsel +12 -12
  111. data/test/selenium/Drop/drop2.rsel +14 -14
  112. data/test/selenium/Drop/drop3.rsel +21 -21
  113. data/test/selenium/Drop/drop4.rsel +1 -1
  114. data/test/selenium/Edit/edit2.rsel +9 -9
  115. data/test/selenium/Edit/edit4.rsel +55 -0
  116. data/test/selenium/Edit/edit5.rsel +41 -0
  117. data/test/selenium/Edit/edit6.rsel +53 -0
  118. data/test/selenium/Filter/0setup.rsel +12 -0
  119. data/test/selenium/Filter/filter1.rsel +9 -0
  120. data/test/selenium/Filter/filter2.rsel +9 -0
  121. data/test/selenium/Form/form1.rsel +1 -1
  122. data/test/selenium/Form/form2.rsel +1 -1
  123. data/test/selenium/Form/form3.rsel +15 -0
  124. data/test/selenium/Grid/0setup.rsel +13 -0
  125. data/test/selenium/Grid/grid1.rsel +11 -0
  126. data/test/selenium/Swap/0setup.rsel +12 -0
  127. data/test/selenium/Swap/swap1.rsel +13 -0
  128. data/test/selenium/Swap/swap2.rsel +11 -0
  129. data/test/selenium/Toggle/toggle1.rsel +6 -6
  130. data/test/sites/zena/versions.yml +1 -1
  131. data/test/unit/relation_proxy_test.rb +36 -0
  132. data/test/unit/site_test.rb +10 -2
  133. data/test/unit/zena/use/rendering_test.rb +7 -6
  134. data/test/unit/zena/use/zazen_test.rb +1 -2
  135. data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/Run 2.tmCommand +24 -0
  136. data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/Run Context.tmCommand +58 -0
  137. data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/Run Focused Should.tmCommand +88 -0
  138. data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/Run.tmCommand +27 -0
  139. data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/YAML to Shoulda.tmCommand +23 -0
  140. data/vendor/TextMate/Ruby Shoulda.tmbundle/Preferences/Symbol List: Context.tmPreferences +19 -0
  141. data/vendor/TextMate/Ruby Shoulda.tmbundle/Preferences/Symbol List: Should.tmPreferences +19 -0
  142. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory attributes for.tmSnippet +16 -0
  143. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory build.tmSnippet +16 -0
  144. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory.tmSnippet +16 -0
  145. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory_define with class.tmSnippet +18 -0
  146. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory_define.tmSnippet +18 -0
  147. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory_next.tmSnippet +16 -0
  148. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory_sequence.tmSnippet +18 -0
  149. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_bad_value.tmSnippet +16 -0
  150. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_contains.tmSnippet +16 -0
  151. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_does_not_contain.tmSnippet +16 -0
  152. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_good_value.tmSnippet +16 -0
  153. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_same_elements.tmSnippet +16 -0
  154. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_save.tmSnippet +16 -0
  155. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_sent_email.tmSnippet +18 -0
  156. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_valid.tmSnippet +16 -0
  157. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/association.tmSnippet +17 -0
  158. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/attribute.tmSnippet +17 -0
  159. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/before_should block.tmSnippet +18 -0
  160. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/context block get.tmSnippet +22 -0
  161. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/context block post.tmSnippet +23 -0
  162. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/context block with setup.tmSnippet +25 -0
  163. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/setup.tmSnippet +18 -0
  164. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should block with before proc.tmSnippet +18 -0
  165. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should block.tmSnippet +18 -0
  166. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_allow_values_for.tmSnippet +16 -0
  167. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_assign_to.tmSnippet +16 -0
  168. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_be_restful denied.tmSnippet +20 -0
  169. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_be_restful.tmSnippet +20 -0
  170. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_belong_to.tmSnippet +16 -0
  171. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_change by.tmSnippet +16 -0
  172. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_change from to.tmSnippet +16 -0
  173. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_ensure_length_at_least.tmSnippet +16 -0
  174. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_ensure_length_in_range.tmSnippet +16 -0
  175. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_ensure_length_is.tmSnippet +16 -0
  176. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_ensure_value_in_range.tmSnippet +16 -0
  177. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_eventually.tmSnippet +18 -0
  178. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_filter_params.tmSnippet +16 -0
  179. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_and_belong_to_many.tmSnippet +16 -0
  180. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_class_methods.tmSnippet +16 -0
  181. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_db_column.tmSnippet +16 -0
  182. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_db_columns.tmSnippet +16 -0
  183. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_index.tmSnippet +16 -0
  184. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_indices.tmSnippet +16 -0
  185. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_instance_methods.tmSnippet +16 -0
  186. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_many.tmSnippet +16 -0
  187. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_named_scope.tmSnippet +16 -0
  188. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_one.tmSnippet +16 -0
  189. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_readonly_attributes.tmSnippet +16 -0
  190. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_allow_mass_assignment_of.tmSnippet +16 -0
  191. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_allow_values_for.tmSnippet +16 -0
  192. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_assign_to.tmSnippet +16 -0
  193. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_change.tmSnippet +16 -0
  194. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_set_the_flash.tmSnippet +16 -0
  195. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_redirect_to.tmSnippet +16 -0
  196. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_render_a_form.tmSnippet +16 -0
  197. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_render_template.tmSnippet +16 -0
  198. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_render_with_layout.tmSnippet +16 -0
  199. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_render_without_layout.tmSnippet +16 -0
  200. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_respond_with.tmSnippet +16 -0
  201. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_respond_with_content_type.tmSnippet +16 -0
  202. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_return_from_session.tmSnippet +16 -0
  203. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_route.tmSnippet +16 -0
  204. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_set_the_flash_to.tmSnippet +16 -0
  205. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_acceptance_of.tmSnippet +16 -0
  206. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_numericality_of.tmSnippet +16 -0
  207. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_presence_of.tmSnippet +16 -0
  208. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_uniqueness_of with scope.tmSnippet +16 -0
  209. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_uniqueness_of.tmSnippet +16 -0
  210. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/catch_exception.rb +39 -0
  211. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/run_script.rb +104 -0
  212. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/stdin_dialog.rb +14 -0
  213. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/test.rb +17 -0
  214. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/todo.txt +13 -0
  215. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/bin/yaml_to_shoulda.rb +25 -0
  216. data/vendor/TextMate/Ruby Shoulda.tmbundle/Syntaxes/Ruby on Rails (Shoulda).tmLanguage +166 -0
  217. data/vendor/TextMate/Ruby Shoulda.tmbundle/info.plist +304 -0
  218. data/vendor/TextMate/Zena.tmbundle/Commands/Run all yaml tests.tmCommand +37 -0
  219. data/vendor/TextMate/Zena.tmbundle/Commands/Run focused yaml test.tmCommand +52 -0
  220. data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/catch_exception.rb +39 -0
  221. data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/run_script.rb +118 -0
  222. data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/stdin_dialog.rb +14 -0
  223. data/vendor/TextMate/Zena.tmbundle/info.plist +17 -0
  224. data/vendor/plugins/selenium-on-rails/CHANGELOG +125 -0
  225. data/vendor/plugins/selenium-on-rails/LICENSE-2.0.txt +202 -0
  226. data/vendor/plugins/selenium-on-rails/README.md +202 -0
  227. data/vendor/plugins/selenium-on-rails/Rakefile +38 -0
  228. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumController.html +265 -0
  229. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumHelper.html +148 -0
  230. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/FixtureLoader.html +231 -0
  231. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/PartialsSupport.html +195 -0
  232. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/Paths.html +295 -0
  233. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/RSelenese.html +219 -0
  234. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/Renderer.html +156 -0
  235. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/Selenese.html +179 -0
  236. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/SuiteRenderer.html +223 -0
  237. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/TestBuilder.html +441 -0
  238. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/TestBuilderAccessors.html +3098 -0
  239. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/TestBuilderActions.html +2080 -0
  240. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/TestBuilderUserAccessors.html +116 -0
  241. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/TestBuilderUserActions.html +116 -0
  242. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails.html +126 -0
  243. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRailsConfig.html +150 -0
  244. data/vendor/plugins/selenium-on-rails/doc/files/CHANGELOG.html +422 -0
  245. data/vendor/plugins/selenium-on-rails/doc/files/README.html +321 -0
  246. data/vendor/plugins/selenium-on-rails/doc/files/lib/controllers/selenium_controller_rb.html +108 -0
  247. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_helper_rb.html +101 -0
  248. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/acceptance_test_runner_rb.html +222 -0
  249. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/fixture_loader_rb.html +109 -0
  250. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/partials_support_rb.html +111 -0
  251. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/paths_rb.html +101 -0
  252. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/renderer_rb.html +101 -0
  253. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/rselenese_rb.html +118 -0
  254. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/selenese_rb.html +101 -0
  255. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/suite_renderer_rb.html +101 -0
  256. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/test_builder_accessors_rb.html +114 -0
  257. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/test_builder_actions_rb.html +113 -0
  258. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/test_builder_rb.html +120 -0
  259. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails_config_rb.html +108 -0
  260. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails_rb.html +115 -0
  261. data/vendor/plugins/selenium-on-rails/doc/fr_class_index.html +42 -0
  262. data/vendor/plugins/selenium-on-rails/doc/fr_file_index.html +43 -0
  263. data/vendor/plugins/selenium-on-rails/doc/fr_method_index.html +182 -0
  264. data/vendor/plugins/selenium-on-rails/doc/index.html +24 -0
  265. data/vendor/plugins/selenium-on-rails/doc/rdoc-style.css +208 -0
  266. data/vendor/plugins/selenium-on-rails/generators/selenium/USAGE +19 -0
  267. data/vendor/plugins/selenium-on-rails/generators/selenium/selenium_generator.rb +50 -0
  268. data/vendor/plugins/selenium-on-rails/generators/selenium/templates/rhtml.rhtml +16 -0
  269. data/vendor/plugins/selenium-on-rails/generators/selenium/templates/rselenese.rhtml +14 -0
  270. data/vendor/plugins/selenium-on-rails/generators/selenium/templates/selenese.rhtml +11 -0
  271. data/vendor/plugins/selenium-on-rails/init.rb +15 -0
  272. data/vendor/plugins/selenium-on-rails/lib/controllers/selenium_controller.rb +122 -0
  273. data/vendor/plugins/selenium-on-rails/lib/controllers/switch_environment_controller.rb +16 -0
  274. data/vendor/plugins/selenium-on-rails/lib/selenium_helper.rb +8 -0
  275. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/acceptance_test_runner.rb +215 -0
  276. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/fixture_loader.rb +57 -0
  277. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/partials_support.rb +36 -0
  278. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/paths.rb +61 -0
  279. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/renderer.rb +20 -0
  280. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/rselenese.rb +44 -0
  281. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/selenese.rb +87 -0
  282. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/suite_renderer.rb +56 -0
  283. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/test_builder.rb +116 -0
  284. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/test_builder_accessors.rb +1002 -0
  285. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/test_builder_actions.rb +514 -0
  286. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/test_builder_user_accessors.rb.example +91 -0
  287. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/test_builder_user_actions.rb.example +24 -0
  288. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails.rb +11 -0
  289. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails_config.rb +30 -0
  290. data/vendor/plugins/selenium-on-rails/lib/views/layouts/layout.rhtml +18 -0
  291. data/vendor/plugins/selenium-on-rails/lib/views/record.rhtml +5 -0
  292. data/vendor/plugins/selenium-on-rails/lib/views/selenium_helper.rb +9 -0
  293. data/vendor/plugins/selenium-on-rails/lib/views/setup.rhtml +67 -0
  294. data/vendor/plugins/selenium-on-rails/lib/views/test_suite.rhtml +26 -0
  295. data/vendor/plugins/selenium-on-rails/routes.rb +24 -0
  296. data/vendor/plugins/selenium-on-rails/selenium-core/Blank.html +7 -0
  297. data/vendor/plugins/selenium-on-rails/selenium-core/InjectedRemoteRunner.html +8 -0
  298. data/vendor/plugins/selenium-on-rails/selenium-core/RemoteRunner.html +110 -0
  299. data/vendor/plugins/selenium-on-rails/selenium-core/SeleniumLog.html +109 -0
  300. data/vendor/plugins/selenium-on-rails/selenium-core/TestPrompt.html +145 -0
  301. data/vendor/plugins/selenium-on-rails/selenium-core/TestRunner-splash.html +55 -0
  302. data/vendor/plugins/selenium-on-rails/selenium-core/TestRunner.hta +177 -0
  303. data/vendor/plugins/selenium-on-rails/selenium-core/TestRunner.html +177 -0
  304. data/vendor/plugins/selenium-on-rails/selenium-core/domviewer/butmin.gif +0 -0
  305. data/vendor/plugins/selenium-on-rails/selenium-core/domviewer/butplus.gif +0 -0
  306. data/vendor/plugins/selenium-on-rails/selenium-core/domviewer/domviewer.css +298 -0
  307. data/vendor/plugins/selenium-on-rails/selenium-core/domviewer/domviewer.html +16 -0
  308. data/vendor/plugins/selenium-on-rails/selenium-core/domviewer/selenium-domviewer.js +205 -0
  309. data/vendor/plugins/selenium-on-rails/selenium-core/icons/all.png +0 -0
  310. data/vendor/plugins/selenium-on-rails/selenium-core/icons/continue.png +0 -0
  311. data/vendor/plugins/selenium-on-rails/selenium-core/icons/continue_disabled.png +0 -0
  312. data/vendor/plugins/selenium-on-rails/selenium-core/icons/pause.png +0 -0
  313. data/vendor/plugins/selenium-on-rails/selenium-core/icons/pause_disabled.png +0 -0
  314. data/vendor/plugins/selenium-on-rails/selenium-core/icons/selected.png +0 -0
  315. data/vendor/plugins/selenium-on-rails/selenium-core/icons/step.png +0 -0
  316. data/vendor/plugins/selenium-on-rails/selenium-core/icons/step_disabled.png +0 -0
  317. data/vendor/plugins/selenium-on-rails/selenium-core/iedoc-core.xml +1759 -0
  318. data/vendor/plugins/selenium-on-rails/selenium-core/iedoc.xml +1800 -0
  319. data/vendor/plugins/selenium-on-rails/selenium-core/lib/cssQuery/cssQuery-p.js +6 -0
  320. data/vendor/plugins/selenium-on-rails/selenium-core/lib/cssQuery/src/cssQuery-level2.js +142 -0
  321. data/vendor/plugins/selenium-on-rails/selenium-core/lib/cssQuery/src/cssQuery-level3.js +150 -0
  322. data/vendor/plugins/selenium-on-rails/selenium-core/lib/cssQuery/src/cssQuery-standard.js +53 -0
  323. data/vendor/plugins/selenium-on-rails/selenium-core/lib/cssQuery/src/cssQuery.js +356 -0
  324. data/vendor/plugins/selenium-on-rails/selenium-core/lib/prototype.js +2006 -0
  325. data/vendor/plugins/selenium-on-rails/selenium-core/lib/scriptaculous/builder.js +101 -0
  326. data/vendor/plugins/selenium-on-rails/selenium-core/lib/scriptaculous/controls.js +815 -0
  327. data/vendor/plugins/selenium-on-rails/selenium-core/lib/scriptaculous/dragdrop.js +915 -0
  328. data/vendor/plugins/selenium-on-rails/selenium-core/lib/scriptaculous/effects.js +958 -0
  329. data/vendor/plugins/selenium-on-rails/selenium-core/lib/scriptaculous/scriptaculous.js +47 -0
  330. data/vendor/plugins/selenium-on-rails/selenium-core/lib/scriptaculous/slider.js +283 -0
  331. data/vendor/plugins/selenium-on-rails/selenium-core/lib/scriptaculous/unittest.js +383 -0
  332. data/vendor/plugins/selenium-on-rails/selenium-core/lib/snapsie.js +91 -0
  333. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/find_matching_child.js +69 -0
  334. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/htmlutils.js +1616 -0
  335. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/injection.html +72 -0
  336. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-api.js +3184 -0
  337. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-browserbot.js +2300 -0
  338. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-browserdetect.js +153 -0
  339. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-commandhandlers.js +377 -0
  340. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-executionloop.js +175 -0
  341. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-logging.js +148 -0
  342. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-remoterunner.js +695 -0
  343. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-testrunner.js +1362 -0
  344. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-version.js +5 -0
  345. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/ui-doc.html +803 -0
  346. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/ui-element.js +1537 -0
  347. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/ui-map-sample.js +979 -0
  348. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/user-extensions.js +3 -0
  349. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/user-extensions.js.sample +75 -0
  350. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/xmlextras.js +153 -0
  351. data/vendor/plugins/selenium-on-rails/selenium-core/selenium-logo.png +0 -0
  352. data/vendor/plugins/selenium-on-rails/selenium-core/selenium-test.css +43 -0
  353. data/vendor/plugins/selenium-on-rails/selenium-core/selenium.css +316 -0
  354. data/vendor/plugins/selenium-on-rails/selenium-core/xpath/dom.js +566 -0
  355. data/vendor/plugins/selenium-on-rails/selenium-core/xpath/javascript-xpath-0.1.11.js +2816 -0
  356. data/vendor/plugins/selenium-on-rails/selenium-core/xpath/util.js +549 -0
  357. data/vendor/plugins/selenium-on-rails/selenium-core/xpath/xmltoken.js +149 -0
  358. data/vendor/plugins/selenium-on-rails/selenium-core/xpath/xpath.js +2450 -0
  359. data/vendor/plugins/selenium-on-rails/tasks/test_acceptance.rake +8 -0
  360. data/vendor/plugins/selenium-on-rails/test/fixtures/config.yml +37 -0
  361. data/vendor/plugins/selenium-on-rails/test/fixtures/selenium.yml +27 -0
  362. data/vendor/plugins/selenium-on-rails/test/paths_test.rb +72 -0
  363. data/vendor/plugins/selenium-on-rails/test/renderer_test.rb +157 -0
  364. data/vendor/plugins/selenium-on-rails/test/rselenese_test.rb +708 -0
  365. data/vendor/plugins/selenium-on-rails/test/selenese_test.rb +242 -0
  366. data/vendor/plugins/selenium-on-rails/test/selenium_controller_test.rb +67 -0
  367. data/vendor/plugins/selenium-on-rails/test/selenium_on_rails_config_test.rb +43 -0
  368. data/vendor/plugins/selenium-on-rails/test/selenium_support_test.rb +35 -0
  369. data/vendor/plugins/selenium-on-rails/test/setup_test.rb +31 -0
  370. data/vendor/plugins/selenium-on-rails/test/suite_renderer_test.rb +109 -0
  371. data/vendor/plugins/selenium-on-rails/test/switch_environment_controller_test.rb +17 -0
  372. data/vendor/plugins/selenium-on-rails/test/test_builder_functions_authortest.rb +51 -0
  373. data/vendor/plugins/selenium-on-rails/test/test_helper.rb +101 -0
  374. data/vendor/plugins/selenium-on-rails/test_data/_partial.rsel +1 -0
  375. data/vendor/plugins/selenium-on-rails/test_data/own_layout.html +12 -0
  376. data/vendor/plugins/selenium-on-rails/test_data/partials/_html.html +6 -0
  377. data/vendor/plugins/selenium-on-rails/test_data/partials/_nesting.rsel +2 -0
  378. data/vendor/plugins/selenium-on-rails/test_data/partials/_rhtml.rhtml +6 -0
  379. data/vendor/plugins/selenium-on-rails/test_data/partials/_rsel.rsel +1 -0
  380. data/vendor/plugins/selenium-on-rails/test_data/partials/_sel.sel +5 -0
  381. data/vendor/plugins/selenium-on-rails/test_data/partials/all_partials.rsel +5 -0
  382. data/vendor/plugins/selenium-on-rails/test_data/rhtml.rhtml +7 -0
  383. data/vendor/plugins/selenium-on-rails/test_data/rselenese.rsel +8 -0
  384. data/vendor/plugins/selenium-on-rails/test_data/selenese.sel +7 -0
  385. data/vendor/plugins/selenium-on-rails/test_data/suite_one/subsuite/suite_one_subsuite_testcase.sel +1 -0
  386. data/vendor/plugins/selenium-on-rails/test_data/suite_one/suite_one_testcase1.sel +1 -0
  387. data/vendor/plugins/selenium-on-rails/test_data/suite_one/suite_one_testcase2.sel +1 -0
  388. data/vendor/plugins/selenium-on-rails/test_data/suite_two/suite_two_testcase.sel +1 -0
  389. data/zena.gemspec +290 -7
  390. metadata +346 -52
  391. data/app/views/nodes/_table.rhtml +0 -14
  392. data/lib/zena/use/grid.rb +0 -154
@@ -0,0 +1,110 @@
1
+ # encoding: utf-8
2
+ require 'json'
3
+
4
+ module Bricks
5
+ module Grid
6
+ module Common
7
+
8
+ def get_table_from_json(text)
9
+ error = nil
10
+ if !text.blank?
11
+ begin
12
+ table = JSON.parse(text) rescue nil
13
+ end
14
+ if table &&
15
+ table.kind_of?(Array) &&
16
+ table.size == 2 &&
17
+ table[0].kind_of?(Hash) &&
18
+ table[0]['type'] == 'table'
19
+ # ok
20
+ else
21
+ table = nil
22
+ error = "<span class='unknownLink'>could not build table from text</span>"
23
+ end
24
+ end
25
+
26
+ table ||= [{"type"=>"table"},[]]
27
+
28
+ return table, error
29
+ end
30
+
31
+ end # Common
32
+
33
+ module ControllerMethods
34
+ include Common
35
+ end
36
+
37
+ # Routes = {
38
+ # :cell_update => :post, :table_update => :post, :cell_edit => :get
39
+ # }
40
+
41
+ module ViewMethods
42
+ include Common
43
+
44
+ # Create a table from an attribute
45
+ def make_table(opts)
46
+ style, node, attribute = opts[:style], opts[:node], opts[:attribute]
47
+ case (style || '').sub('.', '')
48
+ when ">"
49
+ prefix = "<div class='img_right'>"
50
+ suffix = "</div>"
51
+ when "<"
52
+ prefix = "<div class='img_left'>"
53
+ suffix = "</div>"
54
+ when "="
55
+ prefix = "<div class='img_center'>"
56
+ suffix = "</div>"
57
+ else
58
+ prefix = ''
59
+ suffix = ''
60
+ end
61
+
62
+ table, error = get_table_from_json(node.prop[attribute])
63
+
64
+ res = prefix + error.to_s
65
+ if node.can_write?
66
+ msg = opts[:msg] || _('type to edit')
67
+ res << "<table data-a='node[#{attribute}]' data-msg='#{msg}' class='grid'>\n<tr>"
68
+ else
69
+ res << "<table><tr>"
70
+ end
71
+
72
+
73
+ if table[1][0]
74
+ table[1][0].each do |heading|
75
+ res << "<th>#{ heading }</th>"
76
+ end
77
+ res << "</tr>\n"
78
+ table[1][1..-1].each do |row|
79
+ res << "<tr>\n"
80
+ row.each do |td|
81
+ res << "<td>#{td}</td>\n"
82
+ end
83
+ res << "</tr>\n"
84
+ end
85
+ end
86
+ res << "</table>\n"
87
+ res << suffix
88
+ res
89
+ rescue JSON::ParserError
90
+ "<span class='unknownLink'>could not build table from text</span>"
91
+ end
92
+ end
93
+
94
+ # New better grid using JS.
95
+ module ZafuMethods
96
+ def r_grid
97
+ attr = @params[:attr]
98
+ return parser_error("Missing 'attr' parameter") unless attr
99
+ # Make sure it compiles
100
+ code = RubyLess.translate(node(Node).klass, attr)
101
+ msg = RubyLess.translate(self, "t('type to edit')")
102
+ out "<%= make_table(:attribute => #{attr.inspect}, :node => #{node(Node)}, :msg => #{msg}) %>"
103
+ if @params[:edit] == 'true'
104
+ out "<% js_data << %Q{$$('.grid').each(function(e) {Grid.make(e)})} %>"
105
+ end
106
+ end
107
+ end
108
+ end # Grid
109
+ end # Zena
110
+
@@ -0,0 +1,4 @@
1
+ require 'bricks/grid'
2
+
3
+ Zena.use Bricks::Grid
4
+
@@ -36,6 +36,7 @@ module Bricks
36
36
  FileUtils::mkpath(File.dirname(filepath)) unless File.exist?(File.dirname(filepath))
37
37
  begin
38
38
  tempf = Tempfile.new(filename) # TODO: do we need to close this file ?
39
+ tempf.close
39
40
  base = tempf.path
40
41
  latex_template = %q{
41
42
  \documentclass[10pt]{article}
@@ -58,6 +58,15 @@ module Bricks
58
58
 
59
59
  module ControllerMethods
60
60
  def render_to_pdf(opts)
61
+ if opts[:debug]
62
+ template_path = template_url(opts)
63
+ result = {
64
+ :data => render_to_string(:file => template_path, :layout=>false),
65
+ :type => 'text/html',
66
+ }
67
+ return result
68
+ end
69
+
61
70
  # Get zafu template (compile if needed)
62
71
  template_path = template_url(opts)
63
72
 
@@ -91,7 +100,7 @@ module Bricks
91
100
  if query_string == ''
92
101
  debug_url = "#{request.path}?debug"
93
102
  else
94
- debug_url = "#{request.path}?#{query_string}&debug"
103
+ debug_url = "#{request.path}?#{query_string}&amp;debug"
95
104
  end
96
105
 
97
106
  {
@@ -3,6 +3,7 @@
3
3
  require 'tempfile'
4
4
  require 'yaml'
5
5
  require 'thinking_sphinx'
6
+ require 'zlib'
6
7
 
7
8
 
8
9
  class RenderClass
@@ -64,47 +65,14 @@ namespace :sphinx do
64
65
  desc "Create a crontab entry to run the indexer every 30 minutes"
65
66
  task :setup_indexer do
66
67
  Rake::Task['sphinx:setup'].invoke if !setup_done
67
-
68
- config = YAML.load_file(File.join(RAILS_ROOT, 'config', 'sphinx.yml'))[RAILS_ENV]
69
- every = config['run_indexer_at'] || '10,40'
70
- res = `crontab -l 2>&1`
71
- if $? != 0 || res =~ /\Acrontab/
72
- puts "Sphinx indexer: could not access crontab (#{res.chomp})"
68
+ unless app = ENV['APP']
69
+ puts "Please set APP to the app name when running this task."
73
70
  else
74
- crontab = res.chomp.split("\n")
75
- res = []
76
- root = File.expand_path(File.join(RAILS_ROOT, '..', '..', 'current'))
77
- job = "#{every} * * * * cd #{root} && /usr/bin/env rake RAILS_ENV=production sphinx:index >> /root/cron.log 2>&1"
78
- job_inserted = false
79
- job_action = 'install'
80
- crontab.each do |line|
81
- if line =~ /sphinx:index/
82
- if !job_inserted
83
- # update
84
- res << job
85
- job_inserted = true
86
- job_action = 'update'
87
- end
88
- else
89
- res << line
90
- end
91
- end
92
-
93
- if !job_inserted
94
- # new entry in crontab
95
- res << job
96
- end
97
-
98
- tmpf = Tempfile.new('crontab')
99
- File.open(tmpf.path, 'wb') do |file|
100
- file.puts res.join("\n")
101
- end
102
- user = `whoami`
103
- res = `crontab -u #{user.chomp} #{tmpf.path}`
104
- if $? == 0
105
- puts "Sphinx indexer: cron job #{job_action} ok"
106
- else
107
- puts "Sphinx indexer: could not #{job_action} cron job\n#{res}"
71
+ root = "/home/#{app}/app/current"
72
+ every = [Zlib.crc32(app) % 60, (Zlib.crc32(app)+30) % 60].sort.join(',')
73
+ File.open("/etc/cron.d/sphinx_#{app}", 'wb') do |f|
74
+ f.puts "# Generated by $ rake sphinx:setup_indexer APP=#{app}"
75
+ f.puts "#{every} * * * * cd #{root} && /usr/bin/env rake RAILS_ENV=production sphinx:index >> #{root}/log/production.log 2>&1"
108
76
  end
109
77
  end
110
78
  end
@@ -0,0 +1,31 @@
1
+ == Presentation
2
+
3
+ Simple xlsx rendering engine for zena.
4
+
5
+ == Install
6
+
7
+ Drop the folder into the "bricks" folder.
8
+
9
+ == Licence
10
+
11
+ MIT-LICENCE:
12
+
13
+ Copyright (c) 2012 Gaspard Bucher
14
+
15
+ Permission is hereby granted, free of charge, to any person obtaining a copy
16
+ of this software and associated documentation files (the "Software"), to deal
17
+ in the Software without restriction, including without limitation the rights
18
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
19
+ copies of the Software, and to permit persons to whom the Software is
20
+ furnished to do so, subject to the following conditions:
21
+
22
+ The above copyright notice and this permission notice shall be included in
23
+ all copies or substantial portions of the Software.
24
+
25
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
26
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
27
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
28
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
29
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
30
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
31
+ THE SOFTWARE.
@@ -0,0 +1,293 @@
1
+ require 'simple_xlsx'
2
+ require 'fileutils'
3
+ =begin rdoc
4
+ Spreadsheet is module to create spreadsheet documents (csv or xlsx).
5
+
6
+ =end
7
+ module Bricks
8
+ module Spreadsheet
9
+ # Wrappers to expose rendering engine to RubyLess.
10
+ class Row
11
+ attr_reader :cells
12
+ include RubyLess
13
+ # we use Zafu to declare <r:cell>. See r_cell below.
14
+
15
+ def initialize
16
+ @cells = []
17
+ end
18
+
19
+ def cell(value)
20
+ if value.kind_of?(Time)
21
+ tz = visitor.tz
22
+ value = tz.utc_to_local(value)
23
+ end
24
+ @cells << (value || '')
25
+ "#{value};"
26
+ end
27
+ end
28
+
29
+ class Head < Row
30
+ end
31
+
32
+ class Sheet
33
+ attr_reader :rows, :name
34
+ def initialize(name)
35
+ @name = name
36
+ @rows = []
37
+ end
38
+
39
+ def row
40
+ row = Row.new
41
+ @rows << row
42
+ row
43
+ end
44
+
45
+ def head
46
+ row = Head.new
47
+ @rows << row
48
+ row
49
+ end
50
+ end
51
+
52
+ class Document
53
+ def initialize
54
+ @sheets = []
55
+ end
56
+
57
+ def sheet(name = nil)
58
+ if name.kind_of?(Hash)
59
+ name = name[:name]
60
+ end
61
+ s = Sheet.new(name || 'Sheet1')
62
+ @sheets << s
63
+ s
64
+ end
65
+
66
+ def render_xlsx
67
+ tmpf = Tempfile.new('output.xlsx')
68
+ tmpf.close
69
+ # Zip does not want the file to exist beforehand.
70
+ path = tmpf.path
71
+ FileUtils.rm(path)
72
+ SimpleXlsx::Serializer.new(path) do |doc|
73
+ @sheets.each do |s|
74
+ doc.add_sheet(s.name) do |sheet|
75
+ s.rows.each do |r|
76
+ sheet.add_row r.cells
77
+ end # each row
78
+ end
79
+ end # each @sheet
80
+ end
81
+ File.open(path, 'rb') { |file| file.read }
82
+ end
83
+
84
+ def render_html
85
+ html = []
86
+ @sheets.each do |s|
87
+ html << '<table>'
88
+ s.rows.each do |r|
89
+ html << '<tr>'
90
+ r.cells.each do |c|
91
+ html << "<td>#{escape_html(c)}</td>"
92
+ end
93
+ html << '</tr>'
94
+ end # each row
95
+ html << '</table>'
96
+ end # each @sheet
97
+ html.join("\n")
98
+ end
99
+
100
+ def render_csv
101
+ csv = ''
102
+ @sheets.each_with_index do |s, i|
103
+ if i > 1
104
+ csv << "\n\n"
105
+ end
106
+ s.rows.each do |r|
107
+ r.cells.each do |c|
108
+ csv << "#{escape_csv(c)};"
109
+ end
110
+ csv << "\n"
111
+ end # each row
112
+ end # each @sheet
113
+ csv
114
+ end
115
+
116
+ def escape_csv(val)
117
+ if val =~ /[\n;]/
118
+ val.to_s.inspect
119
+ else
120
+ val.to_s
121
+ end
122
+ end
123
+
124
+ def escape_html(val)
125
+ val.to_s.gsub('&', '&amp;').gsub('<', '&lt;').gsub('>', '&gt;')
126
+ end
127
+ end
128
+
129
+ module ControllerMethods
130
+ def render_to_csv(opts)
131
+ render_spreadsheet(opts, :csv)
132
+ end
133
+
134
+ def render_to_xlsx(opts)
135
+ render_spreadsheet(opts, :xlsx)
136
+ end
137
+
138
+ def render_spreadsheet(opts, type)
139
+ if opts[:debug]
140
+ type = :html
141
+ end
142
+ # Get zafu template (compile if needed)
143
+ if opts[:inline]
144
+ # This is used during testing
145
+ else
146
+ template_path = template_url(opts)
147
+ end
148
+
149
+ # temporary file
150
+ @spreadsheet = Bricks::Spreadsheet::Document.new
151
+
152
+ if opts[:inline]
153
+ err = render_to_string(:inline => opts[:inline])
154
+ else
155
+ err = render_to_string(:file => template_path, :layout=>false)
156
+ end
157
+
158
+ if err =~ /parser_error/
159
+ data = err
160
+ type = :html
161
+ end
162
+
163
+ begin
164
+ if type == :xlsx
165
+ {
166
+ :data => @spreadsheet.render_xlsx,
167
+ :type => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
168
+ :disposition => 'attachment',
169
+ }
170
+ elsif type == :csv
171
+ {
172
+ :data => @spreadsheet.render_csv,
173
+ :type => 'text/csv',
174
+ :disposition => 'attachment',
175
+ }
176
+ else
177
+ data = data || @spreadsheet.render_html
178
+ {
179
+ :data => %Q{
180
+ <html>
181
+ <head>
182
+ </head>
183
+ <style>
184
+ body {padding:10px;}
185
+ table {border-collapse:collapse}
186
+ td{border:1px solid #444; padding:2px;}
187
+ .parser_error {border:1px solid red; background:#fee; color:#333;}
188
+ .parser_error .method { background:#faa; padding:0 2px;}
189
+ </style>
190
+ </head>
191
+ <body>
192
+ <h1>Render as #{type}</h1>
193
+ #{data}
194
+ </body>
195
+ </html>
196
+ },
197
+ :type => 'text/html',
198
+ :disposition => 'inline',
199
+ }
200
+ end
201
+ rescue => err
202
+ {
203
+ :data => %Q{<html><head></head><body><h1>Could not render #{type}</h1>\n#{data}<pre>#{err}\n#{err.backtrace[0..8].join("\n")}</pre></body></html>},
204
+ :type => 'text/html',
205
+ :disposition => 'inline',
206
+ }
207
+ end
208
+ end
209
+ end # ControllerMethods
210
+
211
+ module ZafuMethods
212
+ def r_spreadsheet
213
+ # Enter xlsx context.
214
+ r = get_var_name('spreadsheet', 'doc')
215
+ set_context_var('spreadsheet', 'doc', RubyLess::TypedString.new(
216
+ r,
217
+ :class => Bricks::Spreadsheet::Document
218
+ ))
219
+ expand_if("#{r} = @spreadsheet")
220
+ end
221
+
222
+ def r_sheet(expand = true)
223
+ if doc = get_context_var('spreadsheet', 'doc')
224
+ s = get_var_name('spreadsheet', 'sheet')
225
+ if name = @params[:name]
226
+ code = RubyLess.translate_string(self, name)
227
+ else
228
+ code = ''
229
+ end
230
+ out "<% #{s} = #{doc}.sheet(#{code}) %>"
231
+ set_context_var('spreadsheet', 'sheet', RubyLess::TypedString.new(
232
+ s,
233
+ :class => Bricks::Spreadsheet::Sheet
234
+ ))
235
+ if expand
236
+ expand_with
237
+ end
238
+ else
239
+ parser_error("Should only be called in a spreadsheet context.")
240
+ end
241
+ end
242
+
243
+ def r_row
244
+ sheet = get_context_var('spreadsheet', 'sheet')
245
+ if !sheet
246
+ # Allow sheet to be omitted.
247
+ r_sheet(false)
248
+ sheet = get_context_var('spreadsheet', 'sheet')
249
+ end
250
+ if sheet
251
+ r = get_var_name('spreadsheet', 'row')
252
+ out "<% #{r} = #{sheet}.row %>"
253
+ set_context_var('spreadsheet', 'row', RubyLess::TypedString.new(
254
+ r,
255
+ :class => Bricks::Spreadsheet::Row
256
+ ))
257
+ expand_with
258
+ else
259
+ parser_error("Should only be called in a spreadsheet/sheet context.")
260
+ end
261
+ end
262
+
263
+ def r_head
264
+ if sheet = get_context_var('spreadsheet', 'sheet')
265
+ r = get_var_name('spreadsheet', 'head')
266
+ out "<% #{r} = #{sheet}.head %>"
267
+ set_context_var('spreadsheet', 'row', RubyLess::TypedString.new(
268
+ r,
269
+ :class => Bricks::Spreadsheet::Head
270
+ ))
271
+ expand_with
272
+ else
273
+ parser_error("Should only be called in a spreadsheet/sheet context.")
274
+ end
275
+ end
276
+
277
+ def r_cell
278
+ if row = get_context_var('spreadsheet', 'row')
279
+ code = get_attribute_or_eval
280
+ if not code
281
+ code = get_var_name('spreadsheet', 'cell')
282
+ out "<% #{code} = capture do %>"
283
+ out expand_with
284
+ out "<% end %>"
285
+ end
286
+ out "<% #{row}.cell(#{code}) %>"
287
+ else
288
+ parser_error("Should only be called in a spreadsheet/sheet/row context.")
289
+ end
290
+ end
291
+ end # ZafuMethods
292
+ end # Spreadsheet
293
+ end # Bricks
@@ -0,0 +1,3 @@
1
+ require 'bricks/spreadsheet'
2
+
3
+ Zena.use Bricks::Spreadsheet
@@ -0,0 +1,11 @@
1
+ status_tagged_blue:
2
+ source: status
3
+ comment: blue
4
+
5
+ status_tagged_sky:
6
+ source: status
7
+ comment: sky
8
+
9
+ bird_tagged_blue:
10
+ source: bird_jpg
11
+ comment: blue
@@ -0,0 +1,5 @@
1
+ require File.dirname(__FILE__) + '/../../../../../test/test_helper'
2
+
3
+ class XlsxTest < Zena::Unit::TestCase
4
+ # How to test ?
5
+ end
@@ -0,0 +1,27 @@
1
+ It's not really easy to test xlsx file generation...
2
+
3
+ <r:spreadsheet>
4
+ <r:head>
5
+ <r:cell eval='n.created_at'/>
6
+ <r:cell eval='n.title'/>
7
+ <r:cell text='Hello #{n.title}'/>
8
+ </r:head>
9
+ <r:row>
10
+ <r:cell eval='n.created_at'/>
11
+ <r:cell eval='n.title'/>
12
+ <r:cell text='Hello #{n.title}'/>
13
+ </r:row>
14
+ </r:spreadsheet>
15
+
16
+ <% if x = @spreadsheet %>
17
+ <% x.head do |h| %>
18
+ <% h.cell(@node.created_at) %>
19
+ <% h.cell(@node.prop['title']) %>
20
+ <% h.cell(%Q{Hello #{@node.prop['title']}}) %>
21
+ <% end %>
22
+ <% x.row do |r| %>
23
+ <% r.cell(@node.created_at) %>
24
+ <% r.cell(@node.prop['title']) %>
25
+ <% r.cell(%Q{Hello #{@node.prop['title']}}) %>
26
+ <% end %>
27
+ <% end %>
@@ -0,0 +1,19 @@
1
+ # test_file: ../../../../../test/integration/zafu_compiler_test.rb
2
+ default:
3
+ context:
4
+ node: 'status'
5
+ visitor: 'anon'
6
+ format: 'csv'
7
+ src: "<r:spreadsheet><r:sheet name='hep #{title}'><r:row><r:cell text='foo'/><r:cell eval='title'/></r:row></r:sheet></r:spreadsheet>"
8
+ tem: "/if _zdoc = @spreadsheet.*_zsheet = _zdoc.sheet.\"hep #\{@node.*title.*/"
9
+ res: "foo;status title;\n"
10
+
11
+ two_lines:
12
+ src: "<r:spreadsheet><r:sheet name='hep #{title}'><r:row><r:cell text='foo'/><r:cell eval='title'/></r:row><r:row><r:cell text='foo:#{title}'/><r:cell>blah</r:cell></r:row></r:sheet></r:spreadsheet>"
13
+ tem: "/if _zdoc = @spreadsheet.*_zsheet = _zdoc.sheet.\"hep #\{@node.*title.*/"
14
+ res: "foo;status title;\nfoo:status title;blah;\n"
15
+
16
+ empty_cell:
17
+ src: "<r:spreadsheet><r:sheet name='hep #{title}'><r:row><r:cell text='foo'/><r:cell eval='title'/></r:row><r:row><r:cell text='foo:#{title}'/><r:cell/></r:row></r:sheet></r:spreadsheet>"
18
+ tem: "/if _zdoc = @spreadsheet.*_zsheet = _zdoc.sheet.\"hep #\{@node.*title.*/"
19
+ res: "foo;status title;\nfoo:status title;;\n"
@@ -1,5 +1,6 @@
1
1
  module Bricks
2
2
  module Worker
3
+ # This is only used to display jobs. Job creation is done in Delayed::Job.
3
4
  class Job < ActiveRecord::Base
4
5
  include RubyLess
5
6
  set_table_name :delayed_jobs
@@ -24,14 +25,19 @@ module Bricks
24
25
  safe_context :delayed_jobs => [Job]
25
26
 
26
27
  def delayed_jobs
27
- jobs = Bricks::Worker::Job.find(:all,
28
- # FIXME: find a way to add site_id to delayed_jobs...
29
- #:conditions => ['site_id = ?', current_site.id],
30
- :order => 'run_at ASC'
31
- )
28
+ jobs = current_site.jobs
32
29
  jobs.empty? ? nil : jobs
33
30
  end
34
31
  end # ViewMethods
32
+
33
+ module SiteMethods
34
+ def jobs
35
+ Bricks::Worker::Job.all(
36
+ :conditions => ['site_id = ?', self.id],
37
+ :order => 'run_at ASC'
38
+ )
39
+ end
40
+ end
35
41
  end # Worker
36
42
  end
37
43
 
@@ -7,4 +7,12 @@ silence_warnings do
7
7
  Delayed::Job.const_set("MAX_RUN_TIME", 5.minutes)
8
8
  end
9
9
 
10
+ class Delayed::Job
11
+ before_create :set_site_id
12
+ private
13
+ def set_site_id
14
+ self[:site_id] = current_site[:id]
15
+ end
16
+ end
17
+
10
18
  Zena.use Bricks::Worker
@@ -0,0 +1,9 @@
1
+ class AddSiteIdToJobs < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :delayed_jobs, :site_id, :integer
4
+ end
5
+
6
+ def self.down
7
+ drop_column :delayed_jobs, :site_id
8
+ end
9
+ end
@@ -366,12 +366,6 @@ class Base < ActiveRecord::Migration
366
366
 
367
367
  add_index "sites", ["host"], :name => "index_sites_on_host"
368
368
 
369
- create_table "stored_columns", :options => table_options, :force => true do |t|
370
- t.integer "stored_role_id"
371
- t.string "name"
372
- t.string "ptype"
373
- end
374
-
375
369
  create_table "users", :options => table_options, :force => true do |t|
376
370
  t.datetime "created_at"
377
371
  t.datetime "updated_at"
@@ -450,7 +444,6 @@ class Base < ActiveRecord::Migration
450
444
  drop_table "roles"
451
445
  drop_table "sessions"
452
446
  drop_table "sites"
453
- drop_table "stored_columns"
454
447
  drop_table "users"
455
448
  drop_table "versions"
456
449
  drop_table "zips"