zena 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +28 -0
- data/README.rdoc +6 -6
- data/Rakefile +3 -0
- data/app/controllers/users_controller.rb +4 -2
- data/app/models/acl.rb +6 -0
- data/app/models/cached_page.rb +2 -1
- data/app/models/document.rb +3 -4
- data/app/models/node.rb +8 -5
- data/app/models/site.rb +1 -1
- data/app/models/template.rb +2 -2
- data/app/models/user.rb +5 -3
- data/app/views/acls/_add.rhtml +2 -1
- data/app/views/acls/_form.rhtml +15 -7
- data/app/views/acls/_li.rhtml +2 -0
- data/app/views/acls/index.rhtml +3 -1
- data/app/views/acls/show.html.erb +1 -1
- data/app/views/links/destroy.rjs +16 -2
- data/app/views/versions/destroy.rjs +1 -1
- data/app/views/zafu/default/Node-admin.zafu +1 -1
- data/bin/zena +5 -3
- data/bricks/acls/lib/bricks/acls.rb +11 -4
- data/bricks/acls/zena/migrate/20110627193757_add_allowed_mode_and_format_to_acl.rb +11 -0
- data/bricks/acls/zena/test/integration/acl_integration_test.rb +42 -0
- data/bricks/acls/zena/test/sites/erebus/acls.yml +8 -0
- data/bricks/mongrel/zena/deploy.rb +19 -0
- data/bricks/single/lib/bricks/single.rb +15 -0
- data/bricks/single/zena/init.rb +1 -0
- data/bricks/sphinx/zena/tasks.rb +1 -1
- data/bricks/static/lib/bricks/static.rb +151 -0
- data/bricks/static/zena/init.rb +1 -0
- data/bricks/static/zena/migrate/20110702010330_add_static_to_idx_templates.rb +12 -0
- data/bricks/static/zena/skins/blog/Image-edit.zafu +6 -0
- data/bricks/static/zena/skins/blog/Image.zafu +19 -0
- data/bricks/static/zena/skins/blog/Node-+index.zafu +1 -0
- data/bricks/static/zena/skins/blog/Node-+notFound.zafu +7 -0
- data/bricks/static/zena/skins/blog/Node-+search.zafu +19 -0
- data/bricks/static/zena/skins/blog/Node.zafu +66 -0
- data/bricks/static/zena/skins/blog/Post.zafu +12 -0
- data/bricks/static/zena/skins/blog/Project--kml.zafu +30 -0
- data/bricks/static/zena/skins/blog/Project.zafu +45 -0
- data/bricks/static/zena/skins/blog/comments.zafu +30 -0
- data/bricks/static/zena/skins/blog/dict.yml +11 -0
- data/bricks/static/zena/skins/blog/img/dateBg.jpg +0 -0
- data/bricks/static/zena/skins/blog/img/header.png +0 -0
- data/bricks/static/zena/skins/blog/img/mapPin.png +0 -0
- data/bricks/static/zena/skins/blog/img/menu.gif +0 -0
- data/bricks/static/zena/skins/blog/img/menuover.gif +0 -0
- data/bricks/static/zena/skins/blog/img/style.css +110 -0
- data/bricks/static/zena/test/integration/static_integration_test.rb +30 -0
- data/bricks/static/zena/test/unit/static_test.rb +33 -0
- data/bricks/zena/zena/migrate/01_base.rb +1 -2
- data/bricks/zena/zena/migrate/20110623072048_fix_cached_path_index.rb +10 -0
- data/bricks/zena/zena/migrate/20110710113731_remove_icon_field.rb +18 -0
- data/config/bricks.yml +4 -0
- data/config/deploy.rb +17 -2
- data/config/gems.yml +9 -7
- data/config/selenium.yml +38 -0
- data/lib/bricks/requirements_validation.rb +8 -2
- data/lib/gettext_strings.rb +2 -1
- data/lib/tasks/zena.rake +5 -0
- data/lib/zena/app.rb +12 -0
- data/lib/zena/console.rb +9 -1
- data/lib/zena/core_ext/string.rb +7 -2
- data/lib/zena/deploy.rb +60 -6
- data/lib/zena/deploy/app_init.rhtml +56 -0
- data/lib/zena/deploy/haproxy.cnf.rhtml +34 -0
- data/lib/zena/deploy/httpd.rhtml +6 -0
- data/lib/zena/deploy/start_stop.rhtml +35 -0
- data/lib/zena/info.rb +1 -1
- data/lib/zena/remote/connection.rb +1 -1
- data/lib/zena/site_worker.rb +9 -5
- data/lib/zena/use.rb +1 -1
- data/lib/zena/use/action.rb +2 -2
- data/lib/zena/use/ajax.rb +22 -9
- data/lib/zena/use/conditional.rb +5 -0
- data/lib/zena/use/context.rb +6 -1
- data/lib/zena/use/dates.rb +17 -2
- data/lib/zena/use/display.rb +14 -3
- data/lib/zena/use/forms.rb +37 -47
- data/lib/zena/use/html_tags.rb +3 -0
- data/lib/zena/use/node_context.rb +17 -17
- data/lib/zena/use/rendering.rb +1 -1
- data/lib/zena/use/urls.rb +11 -2
- data/lib/zena/use/zafu_attributes.rb +1 -0
- data/lib/zena/use/zafu_safe_definitions.rb +16 -1
- data/lib/zena/use/zafu_templates.rb +39 -24
- data/lib/zena/use/zazen.rb +1 -0
- data/locale/de/LC_MESSAGES/zena.mo +0 -0
- data/locale/de/zena.po +105 -89
- data/locale/en/LC_MESSAGES/zena.mo +0 -0
- data/locale/en/zena.mo +0 -0
- data/locale/en/zena.po +188 -253
- data/locale/fr/LC_MESSAGES/zena.mo +0 -0
- data/locale/fr/zena.mo +0 -0
- data/locale/fr/zena.po +200 -257
- data/locale/zena.pot +95 -85
- data/public/javascripts/zena.js +2 -2
- data/test/fixtures/files/{Node-test.zafu → TestNode.zafu} +206 -4
- data/test/functional/nodes_controller_test.rb +2 -2
- data/test/integration/navigation_test.rb +9 -3
- data/test/integration/query_node/basic.yml +4 -4
- data/test/integration/query_node/filters.yml +2 -2
- data/test/integration/zafu_compiler/ajax.yml +6 -6
- data/test/integration/zafu_compiler/basic.yml +1 -1
- data/test/integration/zafu_compiler/calendar.yml +4 -3
- data/test/integration/zafu_compiler/conditional.yml +3 -10
- data/test/integration/zafu_compiler/context.yml +1 -1
- data/test/integration/zafu_compiler/dates.yml +9 -1
- data/test/integration/zafu_compiler/display.yml +7 -1
- data/test/integration/zafu_compiler/eval.yml +12 -46
- data/test/integration/zafu_compiler/forms.yml +1 -1
- data/test/integration/zafu_compiler/query.yml +2 -2
- data/test/integration/zafu_compiler/relations.yml +19 -9
- data/test/integration/zafu_compiler/roles.yml +12 -0
- data/test/integration/zafu_compiler/safe_definitions.yml +1 -1
- data/test/integration/zafu_compiler/urls.yml +13 -5
- data/test/integration/zafu_compiler/version.yml +6 -0
- data/test/integration/zafu_compiler/zafu_attributes.yml +4 -4
- data/test/integration/zafu_compiler_test.rb +1 -1
- data/test/selenium.readme +8 -0
- data/test/selenium/Add/0setup.rsel +12 -0
- data/test/selenium/Add/add1.rsel +22 -0
- data/test/selenium/Add/add2.rsel +22 -0
- data/test/selenium/Add/add3.rsel +22 -0
- data/test/selenium/Drop/0setup.rsel +12 -0
- data/test/selenium/Drop/drop1.rsel +25 -0
- data/test/selenium/Drop/drop2.rsel +25 -0
- data/test/selenium/Drop/drop3.rsel +51 -0
- data/test/selenium/Drop/drop4.rsel +44 -0
- data/test/selenium/Drop/drop5.rsel +16 -0
- data/test/selenium/Edit/0setup.rsel +12 -0
- data/test/selenium/Edit/edit1.rsel +31 -0
- data/test/selenium/Edit/edit2.rsel +39 -0
- data/test/selenium/Edit/edit3.rsel +40 -0
- data/test/selenium/Form/0setup.rsel +12 -0
- data/test/selenium/Form/form1.rsel +9 -0
- data/test/selenium/Form/form2.rsel +9 -0
- data/test/selenium/Paginate/0setup.rsel +12 -0
- data/test/selenium/Paginate/paginate1.rsel +24 -0
- data/test/selenium/Toggle/0setup.rsel +12 -0
- data/test/selenium/Toggle/toggle1.rsel +21 -0
- data/test/sites/zena/nodes.yml +4 -4
- data/test/sites/zena/roles.yml +3 -2
- data/test/sites/zena/versions.yml +12 -11
- data/test/unit/core_ext_test.rb +23 -5
- data/test/unit/document_test.rb +6 -2
- data/test/unit/node_test.rb +2 -2
- data/test/unit/remote_test.rb +1 -2
- data/test/unit/role_test.rb +2 -2
- data/test/unit/user_test.rb +48 -1
- data/test/unit/virtual_class_test.rb +7 -7
- data/test/unit/zena/acts/secure_test.rb +1 -1
- data/test/unit/zena/use/rendering_test.rb +1 -1
- data/test/unit/zena/use/urls_test.rb +3 -3
- data/zena.gemspec +65 -101
- metadata +67 -103
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/Run 2.tmCommand +0 -24
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/Run Context.tmCommand +0 -58
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/Run Focused Should.tmCommand +0 -88
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/Run.tmCommand +0 -27
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/YAML to Shoulda.tmCommand +0 -23
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Preferences/Symbol List: Context.tmPreferences +0 -19
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Preferences/Symbol List: Should.tmPreferences +0 -19
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory attributes for.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory build.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory_define with class.tmSnippet +0 -18
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory_define.tmSnippet +0 -18
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory_next.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory_sequence.tmSnippet +0 -18
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_bad_value.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_contains.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_does_not_contain.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_good_value.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_same_elements.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_save.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_sent_email.tmSnippet +0 -18
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_valid.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/association.tmSnippet +0 -17
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/attribute.tmSnippet +0 -17
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/before_should block.tmSnippet +0 -18
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/context block get.tmSnippet +0 -22
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/context block post.tmSnippet +0 -23
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/context block with setup.tmSnippet +0 -25
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/setup.tmSnippet +0 -18
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should block with before proc.tmSnippet +0 -18
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should block.tmSnippet +0 -18
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_allow_values_for.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_assign_to.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_be_restful denied.tmSnippet +0 -20
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_be_restful.tmSnippet +0 -20
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_belong_to.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_change by.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_change from to.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_ensure_length_at_least.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_ensure_length_in_range.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_ensure_length_is.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_ensure_value_in_range.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_eventually.tmSnippet +0 -18
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_filter_params.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_and_belong_to_many.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_class_methods.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_db_column.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_db_columns.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_index.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_indices.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_instance_methods.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_many.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_named_scope.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_one.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_readonly_attributes.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_allow_mass_assignment_of.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_allow_values_for.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_assign_to.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_change.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_set_the_flash.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_redirect_to.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_render_a_form.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_render_template.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_render_with_layout.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_render_without_layout.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_respond_with.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_respond_with_content_type.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_return_from_session.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_route.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_set_the_flash_to.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_acceptance_of.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_numericality_of.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_presence_of.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_uniqueness_of with scope.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_uniqueness_of.tmSnippet +0 -16
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/catch_exception.rb +0 -39
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/run_script.rb +0 -104
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/stdin_dialog.rb +0 -14
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/test.rb +0 -17
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/todo.txt +0 -13
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/bin/yaml_to_shoulda.rb +0 -25
- data/vendor/TextMate/Ruby Shoulda.tmbundle/Syntaxes/Ruby on Rails (Shoulda).tmLanguage +0 -166
- data/vendor/TextMate/Ruby Shoulda.tmbundle/info.plist +0 -304
- data/vendor/TextMate/Zena.tmbundle/Commands/Run all yaml tests.tmCommand +0 -37
- data/vendor/TextMate/Zena.tmbundle/Commands/Run focused yaml test.tmCommand +0 -52
- data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/catch_exception.rb +0 -39
- data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/run_script.rb +0 -118
- data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/stdin_dialog.rb +0 -14
- data/vendor/TextMate/Zena.tmbundle/info.plist +0 -17
data/config/selenium.yml
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
# Please read as our directions have changed:
|
2
|
+
# Move this file to your rails apps config directory and rename it to selenium.yml in order to configure the plugin
|
3
|
+
|
4
|
+
#
|
5
|
+
# General settings
|
6
|
+
#
|
7
|
+
|
8
|
+
environments:
|
9
|
+
- test
|
10
|
+
# - development # Uncomment this line to enable in development environment. N.B. your development database will likely be altered/destroyed/abducted
|
11
|
+
|
12
|
+
#selenium_path: 'c:\selenium' #path to selenium installation. only needed if you for some reason don't want to use the bundled version of selenium core
|
13
|
+
|
14
|
+
#
|
15
|
+
# rake test:acceptance settings
|
16
|
+
#
|
17
|
+
|
18
|
+
browsers:
|
19
|
+
# Windows
|
20
|
+
#firefox: 'c:\Program Files\Mozilla Firefox\firefox.exe'
|
21
|
+
#ie: 'c:\Program Files\Internet Explorer\iexplore.exe'
|
22
|
+
|
23
|
+
# Mac OS X
|
24
|
+
firefox: '/Applications/Firefox.app/Contents/MacOS/firefox-bin'
|
25
|
+
safari: '/Applications/Safari.app/Contents/MacOS/Safari'
|
26
|
+
chrome: '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome'
|
27
|
+
|
28
|
+
host: 'test.host'
|
29
|
+
#port_start: 3000
|
30
|
+
#port_end: 3005
|
31
|
+
#base_url_path: '/'
|
32
|
+
#max_browser_duration: 120
|
33
|
+
#multi_window: false
|
34
|
+
|
35
|
+
#result_dir: 'c:\result' # the directory where the results will be stored after a test:acceptance run
|
36
|
+
|
37
|
+
#fixtures_path: <%= "#{RAILS_ROOT}/spec/fixtures" %>
|
38
|
+
#selenium_tests_path: <%= "#{RAILS_ROOT}/spec/selenium" %>
|
@@ -23,8 +23,14 @@ module Bricks
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
when 'adapter'
|
26
|
-
|
27
|
-
|
26
|
+
db_config = File.join(RAILS_ROOT, 'config', 'database.yml')
|
27
|
+
if File.exist?(db_config)
|
28
|
+
config = YAML.load_file(db_config)
|
29
|
+
adapter = config[RAILS_ENV]['adapter']
|
30
|
+
else
|
31
|
+
puts "No config/database.yml file, using 'mysql' as adapter to validate bricks"
|
32
|
+
adapter = 'mysql'
|
33
|
+
end
|
28
34
|
unless v.split(',').map(&:strip).include?(adapter)
|
29
35
|
errors << "'#{adapter}' not supported"
|
30
36
|
end
|
data/lib/gettext_strings.rb
CHANGED
@@ -115,7 +115,8 @@ module Zena
|
|
115
115
|
N_('Sunday')
|
116
116
|
|
117
117
|
N_('datetime') # Same as %Y-%m-%d %H:%M
|
118
|
-
N_(
|
118
|
+
N_(Zena::Use::Dates::DATETIME)
|
119
|
+
N_('%Y-%m-%d %H:%M') # marked as not needed if we use the above constant...
|
119
120
|
N_('news_date') # calendar day (event list view)
|
120
121
|
|
121
122
|
N_('Mon')
|
data/lib/tasks/zena.rake
CHANGED
@@ -441,6 +441,11 @@ namespace :zena do
|
|
441
441
|
end
|
442
442
|
Rake::Task['zena:test'].comment = "Run the tests in test/helpers and test/unit"
|
443
443
|
|
444
|
+
desc 'Start server for Selenium testing'
|
445
|
+
task :test_server => ["zena:test:prepare", "zena:build_fixtures"] do
|
446
|
+
exec('script/server -e test')
|
447
|
+
end
|
448
|
+
|
444
449
|
desc 'Analyse code coverage by tests (needs rcov)'
|
445
450
|
task :coverage do
|
446
451
|
cmd = "rcov -I 'lib:test' --rails --exclude 'var/*,gems/*,/Library/*'"
|
data/lib/zena/app.rb
CHANGED
@@ -61,6 +61,18 @@ module Zena
|
|
61
61
|
include mod
|
62
62
|
end
|
63
63
|
end
|
64
|
+
|
65
|
+
::Site.class_eval do
|
66
|
+
Zena::Use.each_module_for('Site') do |mod|
|
67
|
+
include mod
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
::Skin.class_eval do
|
72
|
+
Zena::Use.each_module_for('Skin') do |mod|
|
73
|
+
include mod
|
74
|
+
end
|
75
|
+
end
|
64
76
|
end
|
65
77
|
end
|
66
78
|
end
|
data/lib/zena/console.rb
CHANGED
@@ -15,7 +15,13 @@ module Zena
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
+
# FIXME: DOCUMENT
|
19
|
+
def create(attrs)
|
20
|
+
secure(Node) { Node.create_node(Node.transform_attributes(attrs)) }
|
21
|
+
end
|
22
|
+
|
18
23
|
def rename_prop(list, old_key, new_key)
|
24
|
+
list = find(list) if list.kind_of?(String)
|
19
25
|
if list.first.kind_of?(Node)
|
20
26
|
list = list.map(&:visible_versions).flatten
|
21
27
|
end
|
@@ -32,6 +38,7 @@ module Zena
|
|
32
38
|
end
|
33
39
|
|
34
40
|
def field_to_prop(list, native_key, prop_key)
|
41
|
+
list = find(list) if list.kind_of?(String)
|
35
42
|
list.each do |rec|
|
36
43
|
next unless value = rec[native_key]
|
37
44
|
if rec.kind_of?(Node)
|
@@ -48,6 +55,7 @@ module Zena
|
|
48
55
|
end
|
49
56
|
|
50
57
|
def set_prop(list, key, value)
|
58
|
+
list = find(list) if list.kind_of?(String)
|
51
59
|
list.each do |rec|
|
52
60
|
if rec.kind_of?(Node)
|
53
61
|
elems = rec.visible_versions
|
@@ -100,7 +108,7 @@ module Zena
|
|
100
108
|
if count_or_query.kind_of?(Hash)
|
101
109
|
query = count_or_query
|
102
110
|
elsif count_or_query.kind_of?(Fixnum)
|
103
|
-
query = {:qb => "node
|
111
|
+
query = {:qb => "node where id = #{count_or_query} in site", :_find => :first}
|
104
112
|
elsif pseudo_sql.nil?
|
105
113
|
query = {:qb => count_or_query}
|
106
114
|
else
|
data/lib/zena/core_ext/string.rb
CHANGED
@@ -16,9 +16,9 @@ class String
|
|
16
16
|
ALLOWED_CHARS_IN_URL = " a-zA-Z0-9\\."
|
17
17
|
# in filename, allow '-' and '_' because it does not represent a space and we do
|
18
18
|
# not have the mode confusion thing.
|
19
|
-
ALLOWED_CHARS_IN_FILENAME = "#{ALLOWED_CHARS_IN_URL}_
|
19
|
+
ALLOWED_CHARS_IN_FILENAME = "#{ALLOWED_CHARS_IN_URL}_\\-\\+$"
|
20
20
|
# Everything apart from a-zA-Z0-9_.-/$ are not allowed in template paths
|
21
|
-
ALLOWED_CHARS_IN_FILEPATH = "#{ALLOWED_CHARS_IN_FILENAME}
|
21
|
+
ALLOWED_CHARS_IN_FILEPATH = "#{ALLOWED_CHARS_IN_FILENAME}/"
|
22
22
|
TO_FILENAME_REGEXP = %r{([^ #{ALLOWED_CHARS_IN_FILENAME}]+)}n
|
23
23
|
TO_URL_NAME_REGEXP = %r{([^ #{ALLOWED_CHARS_IN_URL}])}
|
24
24
|
|
@@ -29,6 +29,11 @@ class String
|
|
29
29
|
end.tr(' ', '-')
|
30
30
|
end
|
31
31
|
|
32
|
+
# Change a string into something that can be inserted in an url.
|
33
|
+
def urlencode
|
34
|
+
URI.escape(self)
|
35
|
+
end
|
36
|
+
|
32
37
|
# Retrieve original title from an url_name
|
33
38
|
def self.from_url_name(str)
|
34
39
|
CGI.unescape(str.tr('-', ' '))
|
data/lib/zena/deploy.rb
CHANGED
@@ -27,7 +27,6 @@ require 'erb'
|
|
27
27
|
require File.join(File.dirname(__FILE__), 'info')
|
28
28
|
require File.join(File.dirname(__FILE__), '..', 'bricks')
|
29
29
|
|
30
|
-
|
31
30
|
Capistrano::Configuration.instance(:must_exist).load do
|
32
31
|
|
33
32
|
set :templates, File.join(File.dirname(__FILE__), 'deploy')
|
@@ -196,6 +195,10 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
196
195
|
vhost = render("#{templates}/vhost.rhtml", :config => self)
|
197
196
|
put(vhost, "#{vhost_root}/#{self[:host]}")
|
198
197
|
|
198
|
+
# directory setup for log
|
199
|
+
run "test -e #{sites_root}/#{self[:host]}/log || mkdir #{sites_root}/#{self[:host]}/log"
|
200
|
+
run "chown www-data:www-data #{sites_root}/#{self[:host]}/log"
|
201
|
+
|
199
202
|
run "test -e /etc/apache2/sites-enabled/#{self[:host]} || a2ensite #{self[:host]}" if debian_host
|
200
203
|
|
201
204
|
unless self[:host] =~ /^www/
|
@@ -297,10 +300,6 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
297
300
|
|
298
301
|
desc "Apache2 initial setup"
|
299
302
|
task :apache2_setup, :roles => :web do
|
300
|
-
# TODO: can we move this into the mongrel brick?
|
301
|
-
if self[:mongrel_port]
|
302
|
-
self[:ports] = (mongrel_port.to_i...(mongrel_port.to_i + mongrel_count.to_i)).to_a
|
303
|
-
end
|
304
303
|
httpd_conf = render("#{templates}/httpd.rhtml", :config => self)
|
305
304
|
log_rotate = render("#{templates}/logrotate_app.rhtml", :config => self)
|
306
305
|
if debian_host
|
@@ -384,6 +383,61 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
384
383
|
end
|
385
384
|
end # db
|
386
385
|
|
386
|
+
#========================== INIT (start/stop init scripts) ===============================#
|
387
|
+
|
388
|
+
namespace :debian do
|
389
|
+
|
390
|
+
desc "create Start/stop scripts and installs rc.d defaults"
|
391
|
+
task :setup, :roles => :app do
|
392
|
+
unless debian_host
|
393
|
+
puts "skipping 'logrotate' (debian specific)"
|
394
|
+
else
|
395
|
+
# Create /usr/local/bin/zena_[app] script
|
396
|
+
app_init = render("#{templates}/app_init.rhtml", :config => self)
|
397
|
+
put(app_init, "/usr/local/bin/zena_#{db_name}")
|
398
|
+
run "chmod 700 /usr/local/bin/zena_#{db_name}"
|
399
|
+
if db_name == 'zena'
|
400
|
+
init_name = 'zapp'
|
401
|
+
else
|
402
|
+
init_name = db_name
|
403
|
+
end
|
404
|
+
run "cd /usr/local/bin && test -e /usr/local/bin/#{init_name} || ln -sf /usr/local/bin/zena_#{db_name} /usr/local/bin/#{init_name}"
|
405
|
+
|
406
|
+
if self[:rvm_ruby_string]
|
407
|
+
run "rvm wrapper #{self[:rvm_ruby_string]} init zena_#{db_name}"
|
408
|
+
init_script = "/usr/local/rvm/bin/init_zena_#{db_name}"
|
409
|
+
else
|
410
|
+
init_script = "/usr/local/bin/zena_#{db_name}"
|
411
|
+
end
|
412
|
+
|
413
|
+
start_stop = render("#{templates}/start_stop.rhtml", :config => self, :init_script => init_script)
|
414
|
+
put(start_stop, "/etc/init.d/zena_#{db_name}")
|
415
|
+
run "chmod 755 /etc/init.d/zena_#{db_name}"
|
416
|
+
# Install defaults
|
417
|
+
run "cd /etc/init.d && update-rc.d zena_#{db_name} defaults"
|
418
|
+
end
|
419
|
+
end
|
420
|
+
|
421
|
+
# FIXME: We now have the on_stop, on_start callbacks that do not handle haproxy and the
|
422
|
+
# init script which is some sort of hack but useful on the server... A better solution
|
423
|
+
# would be to use a directory config/start and config/stop with scripts that are run on
|
424
|
+
# start/stop/restart.... Then each service just writes what it needs there and that's it.
|
425
|
+
desc "Use init script to start all services"
|
426
|
+
task :restart, :roles => :app do
|
427
|
+
run "/usr/local/bin/zena_#{db_name} start"
|
428
|
+
end
|
429
|
+
|
430
|
+
desc "Use init script to stop all services"
|
431
|
+
task :stop, :roles => :app do
|
432
|
+
run "/usr/local/bin/zena_#{db_name} stop"
|
433
|
+
end
|
434
|
+
|
435
|
+
desc "Use init script to restart all services"
|
436
|
+
task :start, :roles => :app do
|
437
|
+
run "/usr/local/bin/zena_#{db_name} restart"
|
438
|
+
end
|
439
|
+
end # debian
|
440
|
+
|
387
441
|
# Would need to be fixed before being used
|
388
442
|
#
|
389
443
|
# desc "Get backup file back"
|
@@ -457,5 +511,5 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
457
511
|
app.stop
|
458
512
|
end
|
459
513
|
|
460
|
-
end #
|
514
|
+
end # deploy
|
461
515
|
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# Zena Startup script (automatically generated by 'cap debian:app_setup')
|
4
|
+
#
|
5
|
+
# chkconfig: - 85 15
|
6
|
+
# description: zena_<%= config[:db_name] %> starts and stop services for <%= config[:db_name] %> Zena application.
|
7
|
+
#
|
8
|
+
ROOT = "<%= config[:deploy_to] %>"
|
9
|
+
APP_ROOT = "#{ROOT}/current"
|
10
|
+
|
11
|
+
cmd = ARGV.first
|
12
|
+
|
13
|
+
def run(cmd)
|
14
|
+
puts cmd
|
15
|
+
system(cmd)
|
16
|
+
end
|
17
|
+
|
18
|
+
operations = [
|
19
|
+
'ruby lib/upload_progress_server.rb ',
|
20
|
+
'rake worker:',
|
21
|
+
<% if config[:app_type] == :mongrel %>
|
22
|
+
'mongrel_rails cluster::',
|
23
|
+
<% end %>
|
24
|
+
]
|
25
|
+
|
26
|
+
if %w{stop restart}.include?(cmd)
|
27
|
+
puts "Stopping #{APP_ROOT}..."
|
28
|
+
operations.each do |op|
|
29
|
+
run "cd #{APP_ROOT} && #{op}stop"
|
30
|
+
end
|
31
|
+
|
32
|
+
<% if config[:haproxy_port] %>
|
33
|
+
# Stop haproxy
|
34
|
+
pid_file = "#{ROOT}/shared/pids/haproxy.pid"
|
35
|
+
if File.exist?(pid_file) && pid = File.read("#{ROOT}/shared/pids/haproxy.pid")
|
36
|
+
run "kill #{pid}"
|
37
|
+
end
|
38
|
+
<% end %>
|
39
|
+
end
|
40
|
+
|
41
|
+
if %w{start restart}.include?(cmd)
|
42
|
+
puts "Starting #{APP_ROOT}..."
|
43
|
+
operations.each do |op|
|
44
|
+
run "cd #{APP_ROOT} && #{op}start"
|
45
|
+
end
|
46
|
+
|
47
|
+
<% if config[:haproxy_port] %>
|
48
|
+
# Start haproxy
|
49
|
+
run "cd #{APP_ROOT} && haproxy -D -f config/haproxy.cnf"
|
50
|
+
<% end %>
|
51
|
+
end
|
52
|
+
|
53
|
+
unless %w{start stop restart}.include?(cmd)
|
54
|
+
puts "Usage: zena_<%= config[:db_name] %> {start|stop|restart}"
|
55
|
+
exit
|
56
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# Start haproxy with
|
2
|
+
# > haproxy -d -f config/haproxy.cnf
|
3
|
+
|
4
|
+
global
|
5
|
+
maxconn 1024
|
6
|
+
pidfile <%= config[:deploy_to] %>/shared/pids/haproxy.pid
|
7
|
+
log 127.0.0.1 local0 info
|
8
|
+
|
9
|
+
defaults
|
10
|
+
balance roundrobin
|
11
|
+
mode http
|
12
|
+
retries 3
|
13
|
+
option redispatch
|
14
|
+
contimeout 300000
|
15
|
+
clitimeout 300000
|
16
|
+
srvtimeout 300000
|
17
|
+
|
18
|
+
# [<%= config[:balancer] %>]
|
19
|
+
listen <%= config[:balancer] %>_haproxy 127.0.0.1:<%= config[:haproxy_port] %>
|
20
|
+
option httplog
|
21
|
+
log global
|
22
|
+
<% if config[:haproxy_password] %>
|
23
|
+
stats enable
|
24
|
+
stats uri /_haproxy
|
25
|
+
stats auth admin:<%= config[:haproxy_password] %>
|
26
|
+
<% end %>
|
27
|
+
<% config[:ports].each do |port| %>
|
28
|
+
server worker_<%= port %> localhost:<%= port %> check inter 20000 maxconn 1<% end %>
|
29
|
+
# [/<%= config[:balancer] %>]
|
30
|
+
|
31
|
+
# Beware of /etc/apache2/conf.d/<%= config[:balancer] %>
|
32
|
+
# <Proxy balancer://<%= config[:balancer] %>>
|
33
|
+
# BalancerMember http://127.0.0.1:<%= config[:haproxy_port] %>
|
34
|
+
# </Proxy>
|
data/lib/zena/deploy/httpd.rhtml
CHANGED
@@ -10,10 +10,16 @@ PassengerDefaultUser www-data
|
|
10
10
|
Order allow,deny
|
11
11
|
Allow from all
|
12
12
|
</Proxy>
|
13
|
+
<% if config[:haproxy_port] %>
|
14
|
+
<Proxy balancer://<%= config[:balancer] %>>
|
15
|
+
BalancerMember http://127.0.0.1:<%= config[:haproxy_port] %>
|
16
|
+
</Proxy>
|
17
|
+
<% else %>
|
13
18
|
<Proxy balancer://<%= config[:balancer] %>><% config[:ports].each do |port| %>
|
14
19
|
BalancerMember http://127.0.0.1:<%= port %><% end %>
|
15
20
|
</Proxy>
|
16
21
|
<% end %>
|
22
|
+
<% end %>
|
17
23
|
|
18
24
|
<IfModule mod_expires.c>
|
19
25
|
ExpiresActive on
|
@@ -0,0 +1,35 @@
|
|
1
|
+
#! /bin/sh
|
2
|
+
### BEGIN INIT INFO
|
3
|
+
# Provides: zena
|
4
|
+
# Required-Start: $remote_fs
|
5
|
+
# Required-Stop: $remote_fs
|
6
|
+
# Default-Start: 2 3 4 5
|
7
|
+
# Default-Stop: 0 1 6
|
8
|
+
# Short-Description: launch <%= init_script %>
|
9
|
+
### END INIT INFO
|
10
|
+
|
11
|
+
# Author: Gaspard Bucher <gaspard@teti.ch>
|
12
|
+
#
|
13
|
+
|
14
|
+
# PATH should only include /usr/* if it runs after the mountnfs.sh script
|
15
|
+
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin
|
16
|
+
DESC="Zena server"
|
17
|
+
|
18
|
+
case "$1" in
|
19
|
+
start)
|
20
|
+
# launch all services for <%= config[:db_name] %>
|
21
|
+
<%= init_script %> start
|
22
|
+
;;
|
23
|
+
stop)
|
24
|
+
# stop all services for <%= config[:db_name] %>
|
25
|
+
<%= init_script %> stop
|
26
|
+
;;
|
27
|
+
restart)
|
28
|
+
# restart all services for <%= config[:db_name] %>
|
29
|
+
<%= init_script %> restart
|
30
|
+
;;
|
31
|
+
*)
|
32
|
+
echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2
|
33
|
+
exit 3
|
34
|
+
;;
|
35
|
+
esac
|
data/lib/zena/info.rb
CHANGED
data/lib/zena/site_worker.rb
CHANGED
@@ -22,12 +22,16 @@ module Zena
|
|
22
22
|
Thread.current[:visitor] = site.any_admin
|
23
23
|
end
|
24
24
|
|
25
|
-
if
|
26
|
-
|
27
|
-
|
25
|
+
if page.nil?
|
26
|
+
site.send(action)
|
27
|
+
else
|
28
|
+
if nodes = get_nodes
|
29
|
+
# Register next one (if we are lucky and have many workers, we can parallelize work)
|
30
|
+
Zena::SiteWorker.perform(site, action, page + 1)
|
28
31
|
|
29
|
-
|
30
|
-
|
32
|
+
# do action on nodes
|
33
|
+
site.send(action, nodes, page, page_count)
|
34
|
+
end
|
31
35
|
end
|
32
36
|
end
|
33
37
|
|