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.
- data/History.txt +23 -1
- data/MIT-LICENSE +2 -2
- data/README.rdoc +2 -15
- data/app/controllers/acls_controller.rb +1 -1
- data/app/controllers/documents_controller.rb +12 -3
- data/app/controllers/nodes_controller.rb +1 -3
- data/app/controllers/sites_controller.rb +7 -0
- data/app/controllers/versions_controller.rb +1 -1
- data/app/controllers/virtual_classes_controller.rb +7 -8
- data/app/models/acl.rb +3 -2
- data/app/models/relation_proxy.rb +2 -1
- data/app/models/role.rb +16 -0
- data/app/models/site.rb +48 -0
- data/app/models/text_document.rb +2 -1
- data/app/models/user.rb +2 -1
- data/app/models/zip.rb +2 -1
- data/app/views/acls/index.rhtml +11 -1
- data/app/views/documents/show.rhtml +1 -1
- data/app/views/relations/_add.erb +2 -2
- data/app/views/relations/_form.erb +5 -2
- data/app/views/relations/_li.erb +4 -1
- data/app/views/relations/index.erb +3 -3
- data/app/views/sites/_form.erb +1 -1
- data/app/views/sites/_job.erb +4 -0
- data/app/views/sites/index.erb +1 -1
- data/app/views/sites/jobs.erb +10 -0
- data/app/views/templates/document_create_tabs/_file.rhtml +3 -0
- data/app/views/zafu/default/Node-+search.zafu +2 -2
- data/bricks/acls/zena/init.rb +2 -1
- data/bricks/acls/zena/test/integration/acl_integration_test.rb +5 -5
- data/bricks/acls/zena/test/sites/erebus/acls.yml +2 -2
- data/bricks/acls/zena/test/unit/acl_test.rb +2 -2
- data/bricks/grid/lib/bricks/grid.rb +110 -0
- data/bricks/grid/zena/init.rb +4 -0
- data/bricks/math/lib/bricks/math.rb +1 -0
- data/bricks/pdf/lib/bricks/pdf.rb +10 -1
- data/bricks/sphinx/zena/tasks.rb +8 -40
- data/bricks/spreadsheet/README +31 -0
- data/bricks/spreadsheet/lib/bricks/spreadsheet.rb +293 -0
- data/bricks/spreadsheet/zena/init.rb +3 -0
- data/bricks/spreadsheet/zena/test/sites/zena/links.yml +11 -0
- data/bricks/spreadsheet/zena/test/unit/xlsx_test.rb +5 -0
- data/bricks/spreadsheet/zena/test/zafu/README +27 -0
- data/bricks/spreadsheet/zena/test/zafu/spreadsheet.yml +19 -0
- data/bricks/worker/lib/bricks/worker.rb +11 -5
- data/bricks/worker/zena/init.rb +8 -0
- data/bricks/worker/zena/migrate/20120501091514_add_site_id_to_jobs.rb +9 -0
- data/bricks/zena/zena/migrate/01_base.rb +0 -7
- data/bricks/zena/zena/migrate/20111214112233_add_comment_to_relations.rb +9 -0
- data/config/bricks.yml +15 -1
- data/config/environments/production.rb +2 -2
- data/config/gems.yml +6 -1
- data/doc/zafu_changes.yml +1 -1
- data/lib/tasks/zena.rake +6 -2
- data/lib/zena/app.rb +1 -1
- data/lib/zena/code/default_syntax.rb +5 -1
- data/lib/zena/db_helper/mysql.rb +5 -1
- data/lib/zena/deploy/app_init.rhtml +11 -7
- data/lib/zena/deploy/awstats.conf.rhtml +1 -1
- data/lib/zena/deploy/start_stop.rhtml +5 -5
- data/lib/zena/deploy/vhost.rhtml +16 -2
- data/lib/zena/deploy.rb +5 -3
- data/lib/zena/info.rb +1 -1
- data/lib/zena/parser/zazen_rules.rb +7 -7
- data/lib/zena/remote/node.rb +7 -0
- data/lib/zena/routes.rb +4 -5
- data/lib/zena/test_controller.rb +18 -1
- data/lib/zena/use/action.rb +13 -4
- data/lib/zena/use/ajax.rb +10 -4
- data/lib/zena/use/authlogic.rb +1 -1
- data/lib/zena/use/calendar.rb +4 -0
- data/lib/zena/use/conditional.rb +3 -0
- data/lib/zena/use/dates.rb +44 -4
- data/lib/zena/use/display.rb +45 -15
- data/lib/zena/use/forms.rb +59 -30
- data/lib/zena/use/query_builder.rb +12 -12
- data/lib/zena/use/recursion.rb +1 -1
- data/lib/zena/use/rendering.rb +18 -17
- data/lib/zena/use/urls.rb +2 -1
- data/lib/zena/use/zafu_safe_definitions.rb +0 -9
- data/lib/zena/use/zafu_templates.rb +2 -2
- data/lib/zena/use/zazen.rb +1 -3
- data/lib/zena/use.rb +13 -2
- data/lib/zena.rb +8 -2
- data/public/images/bullet_back.png +0 -0
- data/public/javascripts/grid.js +535 -0
- data/public/javascripts/tablekit.js +0 -0
- data/public/javascripts/window.js +0 -0
- data/public/javascripts/zena.js +17 -7
- data/public/stylesheets/admin.css +5 -1
- data/public/stylesheets/grid.css +19 -0
- data/test/fixtures/files/TestNode.zafu +123 -311
- data/test/fixtures/files/translations_fr.yml +6 -1
- data/test/functional/acls_controller_test.rb +2 -2
- data/test/functional/nodes_controller_test.rb +17 -11
- data/test/functional/virtual_classes_controller_test.rb +1 -1
- data/test/integration/query_node/basic.yml +9 -0
- data/test/integration/query_node/dates.yml +1 -1
- data/test/integration/zafu_compiler/ajax.yml +9 -9
- data/test/integration/zafu_compiler/basic.yml +0 -24
- data/test/integration/zafu_compiler/dates.yml +24 -7
- data/test/integration/zafu_compiler/display.yml +45 -2
- data/test/integration/zafu_compiler/errors.yml +0 -6
- data/test/integration/zafu_compiler/forms.yml +41 -3
- data/test/integration/zafu_compiler/query.yml +29 -3
- data/test/integration/zafu_compiler/roles.yml +0 -4
- data/test/integration/zafu_compiler/safe_definitions.yml +1 -1
- data/test/integration/zafu_compiler_test.rb +11 -3
- data/test/selenium/Add/add3.rsel +8 -8
- data/test/selenium/Drop/drop1.rsel +12 -12
- data/test/selenium/Drop/drop2.rsel +14 -14
- data/test/selenium/Drop/drop3.rsel +21 -21
- data/test/selenium/Drop/drop4.rsel +1 -1
- data/test/selenium/Edit/edit2.rsel +9 -9
- data/test/selenium/Edit/edit4.rsel +55 -0
- data/test/selenium/Edit/edit5.rsel +41 -0
- data/test/selenium/Edit/edit6.rsel +53 -0
- data/test/selenium/Filter/0setup.rsel +12 -0
- data/test/selenium/Filter/filter1.rsel +9 -0
- data/test/selenium/Filter/filter2.rsel +9 -0
- data/test/selenium/Form/form1.rsel +1 -1
- data/test/selenium/Form/form2.rsel +1 -1
- data/test/selenium/Form/form3.rsel +15 -0
- data/test/selenium/Grid/0setup.rsel +13 -0
- data/test/selenium/Grid/grid1.rsel +11 -0
- data/test/selenium/Swap/0setup.rsel +12 -0
- data/test/selenium/Swap/swap1.rsel +13 -0
- data/test/selenium/Swap/swap2.rsel +11 -0
- data/test/selenium/Toggle/toggle1.rsel +6 -6
- data/test/sites/zena/versions.yml +1 -1
- data/test/unit/relation_proxy_test.rb +36 -0
- data/test/unit/site_test.rb +10 -2
- data/test/unit/zena/use/rendering_test.rb +7 -6
- data/test/unit/zena/use/zazen_test.rb +1 -2
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/Run 2.tmCommand +24 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/Run Context.tmCommand +58 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/Run Focused Should.tmCommand +88 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/Run.tmCommand +27 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/YAML to Shoulda.tmCommand +23 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Preferences/Symbol List: Context.tmPreferences +19 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Preferences/Symbol List: Should.tmPreferences +19 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory attributes for.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory build.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory_define with class.tmSnippet +18 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory_define.tmSnippet +18 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory_next.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory_sequence.tmSnippet +18 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_bad_value.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_contains.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_does_not_contain.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_good_value.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_same_elements.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_save.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_sent_email.tmSnippet +18 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_valid.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/association.tmSnippet +17 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/attribute.tmSnippet +17 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/before_should block.tmSnippet +18 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/context block get.tmSnippet +22 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/context block post.tmSnippet +23 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/context block with setup.tmSnippet +25 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/setup.tmSnippet +18 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should block with before proc.tmSnippet +18 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should block.tmSnippet +18 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_allow_values_for.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_assign_to.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_be_restful denied.tmSnippet +20 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_be_restful.tmSnippet +20 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_belong_to.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_change by.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_change from to.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_ensure_length_at_least.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_ensure_length_in_range.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_ensure_length_is.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_ensure_value_in_range.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_eventually.tmSnippet +18 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_filter_params.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_and_belong_to_many.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_class_methods.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_db_column.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_db_columns.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_index.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_indices.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_instance_methods.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_many.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_named_scope.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_one.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_readonly_attributes.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_allow_mass_assignment_of.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_allow_values_for.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_assign_to.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_change.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_set_the_flash.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_redirect_to.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_render_a_form.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_render_template.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_render_with_layout.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_render_without_layout.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_respond_with.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_respond_with_content_type.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_return_from_session.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_route.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_set_the_flash_to.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_acceptance_of.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_numericality_of.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_presence_of.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_uniqueness_of with scope.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_uniqueness_of.tmSnippet +16 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/catch_exception.rb +39 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/run_script.rb +104 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/stdin_dialog.rb +14 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/test.rb +17 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/todo.txt +13 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/bin/yaml_to_shoulda.rb +25 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Syntaxes/Ruby on Rails (Shoulda).tmLanguage +166 -0
- data/vendor/TextMate/Ruby Shoulda.tmbundle/info.plist +304 -0
- data/vendor/TextMate/Zena.tmbundle/Commands/Run all yaml tests.tmCommand +37 -0
- data/vendor/TextMate/Zena.tmbundle/Commands/Run focused yaml test.tmCommand +52 -0
- data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/catch_exception.rb +39 -0
- data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/run_script.rb +118 -0
- data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/stdin_dialog.rb +14 -0
- data/vendor/TextMate/Zena.tmbundle/info.plist +17 -0
- data/vendor/plugins/selenium-on-rails/CHANGELOG +125 -0
- data/vendor/plugins/selenium-on-rails/LICENSE-2.0.txt +202 -0
- data/vendor/plugins/selenium-on-rails/README.md +202 -0
- data/vendor/plugins/selenium-on-rails/Rakefile +38 -0
- data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumController.html +265 -0
- data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumHelper.html +148 -0
- data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/FixtureLoader.html +231 -0
- data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/PartialsSupport.html +195 -0
- data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/Paths.html +295 -0
- data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/RSelenese.html +219 -0
- data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/Renderer.html +156 -0
- data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/Selenese.html +179 -0
- data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/SuiteRenderer.html +223 -0
- data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/TestBuilder.html +441 -0
- data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/TestBuilderAccessors.html +3098 -0
- data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/TestBuilderActions.html +2080 -0
- data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/TestBuilderUserAccessors.html +116 -0
- data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/TestBuilderUserActions.html +116 -0
- data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails.html +126 -0
- data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRailsConfig.html +150 -0
- data/vendor/plugins/selenium-on-rails/doc/files/CHANGELOG.html +422 -0
- data/vendor/plugins/selenium-on-rails/doc/files/README.html +321 -0
- data/vendor/plugins/selenium-on-rails/doc/files/lib/controllers/selenium_controller_rb.html +108 -0
- data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_helper_rb.html +101 -0
- data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/acceptance_test_runner_rb.html +222 -0
- data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/fixture_loader_rb.html +109 -0
- data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/partials_support_rb.html +111 -0
- data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/paths_rb.html +101 -0
- data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/renderer_rb.html +101 -0
- data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/rselenese_rb.html +118 -0
- data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/selenese_rb.html +101 -0
- data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/suite_renderer_rb.html +101 -0
- data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/test_builder_accessors_rb.html +114 -0
- data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/test_builder_actions_rb.html +113 -0
- data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/test_builder_rb.html +120 -0
- data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails_config_rb.html +108 -0
- data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails_rb.html +115 -0
- data/vendor/plugins/selenium-on-rails/doc/fr_class_index.html +42 -0
- data/vendor/plugins/selenium-on-rails/doc/fr_file_index.html +43 -0
- data/vendor/plugins/selenium-on-rails/doc/fr_method_index.html +182 -0
- data/vendor/plugins/selenium-on-rails/doc/index.html +24 -0
- data/vendor/plugins/selenium-on-rails/doc/rdoc-style.css +208 -0
- data/vendor/plugins/selenium-on-rails/generators/selenium/USAGE +19 -0
- data/vendor/plugins/selenium-on-rails/generators/selenium/selenium_generator.rb +50 -0
- data/vendor/plugins/selenium-on-rails/generators/selenium/templates/rhtml.rhtml +16 -0
- data/vendor/plugins/selenium-on-rails/generators/selenium/templates/rselenese.rhtml +14 -0
- data/vendor/plugins/selenium-on-rails/generators/selenium/templates/selenese.rhtml +11 -0
- data/vendor/plugins/selenium-on-rails/init.rb +15 -0
- data/vendor/plugins/selenium-on-rails/lib/controllers/selenium_controller.rb +122 -0
- data/vendor/plugins/selenium-on-rails/lib/controllers/switch_environment_controller.rb +16 -0
- data/vendor/plugins/selenium-on-rails/lib/selenium_helper.rb +8 -0
- data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/acceptance_test_runner.rb +215 -0
- data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/fixture_loader.rb +57 -0
- data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/partials_support.rb +36 -0
- data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/paths.rb +61 -0
- data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/renderer.rb +20 -0
- data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/rselenese.rb +44 -0
- data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/selenese.rb +87 -0
- data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/suite_renderer.rb +56 -0
- data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/test_builder.rb +116 -0
- data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/test_builder_accessors.rb +1002 -0
- data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/test_builder_actions.rb +514 -0
- data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/test_builder_user_accessors.rb.example +91 -0
- data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/test_builder_user_actions.rb.example +24 -0
- data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails.rb +11 -0
- data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails_config.rb +30 -0
- data/vendor/plugins/selenium-on-rails/lib/views/layouts/layout.rhtml +18 -0
- data/vendor/plugins/selenium-on-rails/lib/views/record.rhtml +5 -0
- data/vendor/plugins/selenium-on-rails/lib/views/selenium_helper.rb +9 -0
- data/vendor/plugins/selenium-on-rails/lib/views/setup.rhtml +67 -0
- data/vendor/plugins/selenium-on-rails/lib/views/test_suite.rhtml +26 -0
- data/vendor/plugins/selenium-on-rails/routes.rb +24 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/Blank.html +7 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/InjectedRemoteRunner.html +8 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/RemoteRunner.html +110 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/SeleniumLog.html +109 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/TestPrompt.html +145 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/TestRunner-splash.html +55 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/TestRunner.hta +177 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/TestRunner.html +177 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/domviewer/butmin.gif +0 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/domviewer/butplus.gif +0 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/domviewer/domviewer.css +298 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/domviewer/domviewer.html +16 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/domviewer/selenium-domviewer.js +205 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/icons/all.png +0 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/icons/continue.png +0 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/icons/continue_disabled.png +0 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/icons/pause.png +0 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/icons/pause_disabled.png +0 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/icons/selected.png +0 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/icons/step.png +0 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/icons/step_disabled.png +0 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/iedoc-core.xml +1759 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/iedoc.xml +1800 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/lib/cssQuery/cssQuery-p.js +6 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/lib/cssQuery/src/cssQuery-level2.js +142 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/lib/cssQuery/src/cssQuery-level3.js +150 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/lib/cssQuery/src/cssQuery-standard.js +53 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/lib/cssQuery/src/cssQuery.js +356 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/lib/prototype.js +2006 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/lib/scriptaculous/builder.js +101 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/lib/scriptaculous/controls.js +815 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/lib/scriptaculous/dragdrop.js +915 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/lib/scriptaculous/effects.js +958 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/lib/scriptaculous/scriptaculous.js +47 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/lib/scriptaculous/slider.js +283 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/lib/scriptaculous/unittest.js +383 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/lib/snapsie.js +91 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/scripts/find_matching_child.js +69 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/scripts/htmlutils.js +1616 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/scripts/injection.html +72 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-api.js +3184 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-browserbot.js +2300 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-browserdetect.js +153 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-commandhandlers.js +377 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-executionloop.js +175 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-logging.js +148 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-remoterunner.js +695 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-testrunner.js +1362 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-version.js +5 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/scripts/ui-doc.html +803 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/scripts/ui-element.js +1537 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/scripts/ui-map-sample.js +979 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/scripts/user-extensions.js +3 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/scripts/user-extensions.js.sample +75 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/scripts/xmlextras.js +153 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/selenium-logo.png +0 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/selenium-test.css +43 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/selenium.css +316 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/xpath/dom.js +566 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/xpath/javascript-xpath-0.1.11.js +2816 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/xpath/util.js +549 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/xpath/xmltoken.js +149 -0
- data/vendor/plugins/selenium-on-rails/selenium-core/xpath/xpath.js +2450 -0
- data/vendor/plugins/selenium-on-rails/tasks/test_acceptance.rake +8 -0
- data/vendor/plugins/selenium-on-rails/test/fixtures/config.yml +37 -0
- data/vendor/plugins/selenium-on-rails/test/fixtures/selenium.yml +27 -0
- data/vendor/plugins/selenium-on-rails/test/paths_test.rb +72 -0
- data/vendor/plugins/selenium-on-rails/test/renderer_test.rb +157 -0
- data/vendor/plugins/selenium-on-rails/test/rselenese_test.rb +708 -0
- data/vendor/plugins/selenium-on-rails/test/selenese_test.rb +242 -0
- data/vendor/plugins/selenium-on-rails/test/selenium_controller_test.rb +67 -0
- data/vendor/plugins/selenium-on-rails/test/selenium_on_rails_config_test.rb +43 -0
- data/vendor/plugins/selenium-on-rails/test/selenium_support_test.rb +35 -0
- data/vendor/plugins/selenium-on-rails/test/setup_test.rb +31 -0
- data/vendor/plugins/selenium-on-rails/test/suite_renderer_test.rb +109 -0
- data/vendor/plugins/selenium-on-rails/test/switch_environment_controller_test.rb +17 -0
- data/vendor/plugins/selenium-on-rails/test/test_builder_functions_authortest.rb +51 -0
- data/vendor/plugins/selenium-on-rails/test/test_helper.rb +101 -0
- data/vendor/plugins/selenium-on-rails/test_data/_partial.rsel +1 -0
- data/vendor/plugins/selenium-on-rails/test_data/own_layout.html +12 -0
- data/vendor/plugins/selenium-on-rails/test_data/partials/_html.html +6 -0
- data/vendor/plugins/selenium-on-rails/test_data/partials/_nesting.rsel +2 -0
- data/vendor/plugins/selenium-on-rails/test_data/partials/_rhtml.rhtml +6 -0
- data/vendor/plugins/selenium-on-rails/test_data/partials/_rsel.rsel +1 -0
- data/vendor/plugins/selenium-on-rails/test_data/partials/_sel.sel +5 -0
- data/vendor/plugins/selenium-on-rails/test_data/partials/all_partials.rsel +5 -0
- data/vendor/plugins/selenium-on-rails/test_data/rhtml.rhtml +7 -0
- data/vendor/plugins/selenium-on-rails/test_data/rselenese.rsel +8 -0
- data/vendor/plugins/selenium-on-rails/test_data/selenese.sel +7 -0
- data/vendor/plugins/selenium-on-rails/test_data/suite_one/subsuite/suite_one_subsuite_testcase.sel +1 -0
- data/vendor/plugins/selenium-on-rails/test_data/suite_one/suite_one_testcase1.sel +1 -0
- data/vendor/plugins/selenium-on-rails/test_data/suite_one/suite_one_testcase2.sel +1 -0
- data/vendor/plugins/selenium-on-rails/test_data/suite_two/suite_two_testcase.sel +1 -0
- data/zena.gemspec +290 -7
- metadata +346 -52
- data/app/views/nodes/_table.rhtml +0 -14
- 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
|
+
|
|
@@ -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}&debug"
|
|
95
104
|
end
|
|
96
105
|
|
|
97
106
|
{
|
data/bricks/sphinx/zena/tasks.rb
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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('&', '&').gsub('<', '<').gsub('>', '>')
|
|
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,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 =
|
|
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
|
|
data/bricks/worker/zena/init.rb
CHANGED
|
@@ -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"
|