zena 0.15.2 → 0.16.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/.gitignore +20 -0
- data/CREDITS +27 -0
- data/Capfile +3 -0
- data/DEVELOPERS +46 -0
- data/History.txt +15 -0
- data/MIT-LICENSE +19 -0
- data/Rakefile +44 -0
- data/TODO +24 -0
- data/TODO_ZENA_1_0 +23 -0
- data/app/controllers/application_controller.rb +3 -0
- data/app/controllers/documents_controller.rb +22 -56
- data/app/controllers/nodes_controller.rb +42 -27
- data/app/controllers/pings_controller.rb +19 -0
- data/app/controllers/relations_controller.rb +5 -1
- data/app/controllers/sites_controller.rb +1 -46
- data/app/controllers/user_sessions_controller.rb +47 -0
- data/app/controllers/users_controller.rb +1 -0
- data/app/controllers/versions_controller.rb +25 -7
- data/app/controllers/virtual_classes_controller.rb +1 -1
- data/app/helpers/application_helper.rb +1 -1
- data/app/models/comment.rb +2 -1
- data/app/models/contact_content.rb +2 -2
- data/app/models/data_entry.rb +5 -6
- data/app/models/document.rb +14 -10
- data/app/models/document_content.rb +4 -6
- data/app/models/iformat.rb +2 -2
- data/app/models/image_content.rb +6 -9
- data/app/models/node.rb +106 -164
- data/app/models/page.rb +0 -20
- data/app/models/site.rb +42 -12
- data/app/models/template.rb +3 -8
- data/app/models/template_content.rb +2 -0
- data/app/models/text_document.rb +13 -8
- data/app/models/user.rb +47 -100
- data/app/models/user_session.rb +4 -0
- data/app/models/version.rb +1 -1
- data/app/views/comments/create.rjs +3 -3
- data/app/views/comments/edit.rjs +1 -1
- data/app/views/comments/update.rjs +1 -1
- data/app/views/nodes/_import_results.rhtml +1 -1
- data/app/views/nodes/create.rjs +3 -3
- data/app/views/templates/document_create_tabs/_file.rhtml +1 -2
- data/app/views/templates/document_create_tabs/_import.rhtml +7 -2
- data/app/views/templates/edit_tabs/_document.rhtml +1 -3
- data/app/views/templates/edit_tabs/_image.rhtml +1 -3
- data/app/views/versions/_tr.rhtml +1 -1
- data/app/views/versions/edit.rhtml +2 -26
- data/bin/zena +6 -1
- data/bricks/delayed_job/README +18 -0
- data/bricks/delayed_job/migrate/20091104191643_create_delayed_jobs_table.rb +19 -0
- data/bricks/delayed_job/misc/init.rb +8 -0
- data/bricks/delayed_job/misc/tasks.rb +2 -0
- data/bricks/math/patch/application_helper.rb +1 -1
- data/bricks/sphinx/MIT-LICENSE +19 -0
- data/bricks/sphinx/README +19 -0
- data/bricks/sphinx/lib/use_sphinx.rb +78 -0
- data/bricks/sphinx/migrate/20091102171258_add_delta_for_sphinx.rb +9 -0
- data/bricks/sphinx/misc/deploy.rb +20 -0
- data/bricks/sphinx/misc/sphinx.yml +12 -0
- data/bricks/sphinx/misc/tasks.rb +21 -0
- data/bricks/sphinx/patch/node.rb +8 -0
- data/bricks/tags/lib/has_tags.rb +5 -3
- data/bricks/tags/test/zafu/tags.yml +13 -1
- data/config/bricks.yml +35 -0
- data/config/deploy.rb +8 -1
- data/config/environment.rb +1 -1
- data/config/environments/production.rb +1 -1
- data/config/gems.yml +28 -5
- data/config/sphinx.yml +12 -0
- data/db/init/base/skins/default/Node-+popupLayout.zafu +1 -16
- data/db/migrate/20091026161708_add_persistence_token.rb +13 -0
- data/db/migrate/20091101184952_add_session_table.rb +16 -0
- data/db/migrate/20091123175137_add_single_access_token.rb +9 -0
- data/db/migrate/20091124161608_rebuild_fullpath.rb +11 -0
- data/db/schema.rb +21 -8
- data/doc/README_FOR_APP +24 -0
- data/doc/fixtures.graffle +19568 -0
- data/doc/fixtures.pdf +0 -0
- data/doc/template/LICENSE +184 -0
- data/doc/template/README +37 -0
- data/doc/template/allison.css +283 -0
- data/doc/template/allison.js +307 -0
- data/doc/template/allison.rb +260 -0
- data/doc/template/cache/BODY +588 -0
- data/doc/template/cache/CLASS_INDEX +4 -0
- data/doc/template/cache/CLASS_PAGE +1 -0
- data/doc/template/cache/FILE_INDEX +4 -0
- data/doc/template/cache/FILE_PAGE +1 -0
- data/doc/template/cache/FONTS +1 -0
- data/doc/template/cache/FR_INDEX_BODY +1 -0
- data/doc/template/cache/IMGPATH +1 -0
- data/doc/template/cache/INDEX +1 -0
- data/doc/template/cache/JAVASCRIPT +307 -0
- data/doc/template/cache/METHOD_INDEX +4 -0
- data/doc/template/cache/METHOD_LIST +1 -0
- data/doc/template/cache/SRC_PAGE +1 -0
- data/doc/template/cache/STYLE +283 -0
- data/doc/template/cache/URL +1 -0
- data/doc/zafu_changes.yml +29 -0
- data/lib/base_additions.rb +1 -1
- data/lib/bricks.rb +9 -0
- data/lib/bricks/loader.rb +86 -0
- data/lib/bricks/requirements_validation.rb +71 -0
- data/lib/tasks/zena.rake +42 -4
- data/lib/zafu/action.rb +285 -0
- data/lib/zafu/ajax.rb +93 -0
- data/lib/zafu/attributes.rb +117 -0
- data/lib/zafu/calendar.rb +159 -0
- data/lib/zafu/context.rb +330 -0
- data/lib/zafu/core/html.rb +102 -0
- data/lib/zafu/core/move_to_parser.rb +167 -0
- data/lib/zafu/dates.rb +58 -0
- data/lib/zafu/display.rb +502 -0
- data/lib/zafu/eval.rb +66 -0
- data/lib/zafu/experimental.rb +66 -0
- data/lib/zafu/i18n.rb +64 -0
- data/lib/zafu/meta.rb +25 -0
- data/lib/zafu/refactor.rb +73 -0
- data/lib/zafu/support/context.rb +265 -0
- data/lib/zafu/support/dom.rb +145 -0
- data/lib/zafu/support/erb.rb +62 -0
- data/lib/zafu/support/flow.rb +401 -0
- data/lib/zafu/support/forms.rb +461 -0
- data/lib/zafu/support/links.rb +306 -0
- data/lib/zafu_parser.rb +26 -2
- data/lib/zena.rb +34 -15
- data/lib/zena/acts/multiversion.rb +2 -2
- data/lib/zena/acts/secure.rb +41 -30
- data/lib/zena/app.rb +7 -10
- data/lib/zena/controller/test_case.rb +12 -7
- data/lib/zena/crypto_provider/initial.rb +15 -0
- data/lib/zena/db.rb +6 -1
- data/lib/zena/deploy.rb +34 -6
- data/lib/zena/deploy/logrotate_app.rhtml +9 -0
- data/lib/zena/deploy/logrotate_host.rhtml +34 -0
- data/lib/zena/deploy/template.rb +1 -9
- data/lib/zena/foxy_parser.rb +1 -1
- data/lib/zena/info.rb +3 -1
- data/lib/zena/migrator.rb +1 -1
- data/lib/zena/parser.rb +12 -4
- data/lib/zena/parser/zazen_rules.rb +6 -6
- data/lib/zena/parser/zena_rules.rb +1 -7
- data/lib/zena/routes.rb +5 -5
- data/lib/zena/test_controller.rb +7 -2
- data/lib/zena/unit/test_case.rb +6 -8
- data/lib/zena/use/ajax.rb +10 -10
- data/lib/zena/use/authlogic.rb +93 -0
- data/lib/zena/use/dyn_attributes.rb +5 -0
- data/lib/zena/use/html_tags.rb +16 -34
- data/lib/zena/use/i18n.rb +4 -1
- data/lib/zena/use/node_query_finders.rb +8 -4
- data/lib/zena/use/refactor.rb +8 -20
- data/lib/zena/use/relations.rb +1 -0
- data/lib/zena/use/rendering.rb +4 -2
- data/lib/zena/use/search.rb +52 -0
- data/lib/zena/use/test_helper.rb +27 -28
- data/lib/zena/use/upload.rb +188 -0
- data/lib/zena/use/urls.rb +16 -14
- data/lib/zena/use/zafu.rb +16 -63
- data/lib/zena/use/zazen.rb +8 -8
- data/lib/zena/view/test_case.rb +8 -4
- data/locale/en/LC_MESSAGES/zena.mo +0 -0
- data/locale/en/zena.po +3 -3
- data/public/.htaccess +40 -0
- data/public/javascripts/upload-progress.js +17 -8
- data/public/javascripts/zena.js +8 -2
- data/public/stylesheets/popup.css +1 -0
- data/script/about +3 -0
- data/script/apache_logging +25 -0
- data/script/breakpointer +3 -0
- data/script/console +3 -0
- data/script/dbconsole +3 -0
- data/script/destroy +3 -0
- data/script/generate +3 -0
- data/script/performance/benchmarker +3 -0
- data/script/performance/profiler +3 -0
- data/script/plugin +3 -0
- data/script/process/inspector +3 -0
- data/script/process/reaper +3 -0
- data/script/process/spawner +3 -0
- data/script/runner +3 -0
- data/script/server +3 -0
- data/script/set_revision +29 -0
- data/spec/controllers/versions_controller_spec.rb +11 -0
- data/test/fixtures/files/Node-test.zafu +1 -1
- data/test/functional/nodes_controller_test.rb +25 -0
- data/test/functional/pings_controller_test.rb +8 -0
- data/test/functional/user_sessions_controller_test.rb +59 -0
- data/test/functional/users_controller_test.rb +81 -19
- data/test/helpers/node_query/filters.yml +5 -0
- data/test/helpers/node_query_test.rb +3 -3
- data/test/integration/multiple_hosts_test.rb +1 -1
- data/test/integration/navigation_test.rb +1 -1
- data/test/sites/complex/users.yml +1 -1
- data/test/sites/ocean/users.yml +3 -3
- data/test/sites/zena/users.yml +5 -4
- data/test/test_zena.rb +38 -38
- data/test/unit/cached_page_test.rb +2 -2
- data/test/unit/comment_test.rb +0 -1
- data/test/unit/document_test.rb +23 -11
- data/test/unit/helpers/ping_helper_test.rb +4 -0
- data/test/unit/multiversion_test.rb +24 -16
- data/test/unit/node_test.rb +32 -93
- data/test/unit/note_test.rb +9 -0
- data/test/unit/page_test.rb +2 -2
- data/test/unit/secure_test.rb +2 -12
- data/test/unit/site_test.rb +43 -24
- data/test/unit/template_test.rb +45 -3
- data/test/unit/text_document_test.rb +4 -3
- data/test/unit/user_test.rb +13 -33
- data/test/unit/zena/db_test.rb +8 -0
- data/test/unit/zena/parser/zazen.yml +4 -4
- data/test/unit/zena/use/dates_view_methods_test.rb +2 -1
- data/test/unit/zena/use/html_tags_test.rb +12 -4
- data/test/unit/zena/use/refactor_test.rb +4 -3
- data/test/unit/zena/use/rendering_test.rb +1 -0
- data/test/unit/zena/use/upload_test.rb +76 -0
- data/test/unit/zena/use/urls_test.rb +4 -0
- data/test/unit/zena/use/zafu_test.rb +8 -0
- data/test/unit/zena/workflow/status_version_test.rb +6 -0
- data/test/unit/zena/zena_tags/ajax.yml +4 -4
- data/test/unit/zena/zena_tags/basic.yml +21 -10
- data/test/unit/zena/zena_tags/relations.yml +0 -6
- data/test/unit/zena/zena_tags/rubyless.yml +35 -0
- data/test/unit/zena/zena_tags/zazen.yml +4 -4
- data/test/unit/zena/zena_tags_test.rb +36 -4
- data/vendor/TextMate/Zena.tmbundle/Commands/Run all yaml tests.tmCommand +1 -1
- data/vendor/TextMate/Zena.tmbundle/Commands/Run focused yaml test.tmCommand +2 -3
- data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/catch_exception.rb +39 -0
- data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/run_script.rb +102 -58
- data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/stdin_dialog.rb +14 -0
- data/vendor/TextMate/Zena.tmbundle/info.plist +2 -0
- data/zena.gemspec +2085 -0
- metadata +265 -90
- data/app/controllers/sessions_controller.rb +0 -41
- data/app/views/sites/zena_up.html.erb +0 -11
- data/config/database.yml +0 -40
- data/db/production.sqlite3 +0 -0
- data/lib/bricks/patcher.rb +0 -68
- data/lib/zena/parser/zena_tags.rb +0 -3562
- data/lib/zena/use/authentification.rb +0 -120
- data/public/images/ext/contact_pv.png +0 -0
- data/public/images/ext/other_pv.png +0 -0
- data/public/images/ext/page_pv.png +0 -0
- data/public/images/ext/page_tiny.png +0 -0
- data/public/images/ext/pdf_pv.png +0 -0
- data/public/images/ext/post_pv.png +0 -0
- data/public/images/ext/post_tiny.png +0 -0
- data/public/images/ext/project_pv.png +0 -0
- data/public/images/ext/project_tiny.png +0 -0
- data/public/images/ext/tag_pv.png +0 -0
- data/public/images/ext/zip_pv.png +0 -0
- data/tasks/ann.rake +0 -80
- data/tasks/bones.rake +0 -20
- data/tasks/gem.rake +0 -201
- data/tasks/git.rake +0 -40
- data/tasks/notes.rake +0 -27
- data/tasks/post_load.rake +0 -34
- data/tasks/rdoc.rake +0 -51
- data/tasks/rubyforge.rake +0 -55
- data/tasks/setup.rb +0 -292
- data/tasks/spec.rake +0 -54
- data/tasks/svn.rake +0 -47
- data/tasks/test.rake +0 -40
- data/tasks/zentest.rake +0 -36
- data/test/fixtures/comments.yml +0 -126
- data/test/fixtures/contact_contents.yml +0 -132
- data/test/fixtures/data_entries.yml +0 -65
- data/test/fixtures/discussions.yml +0 -48
- data/test/fixtures/document_contents.yml +0 -108
- data/test/fixtures/dyn_attributes.yml +0 -66
- data/test/fixtures/groups.yml +0 -86
- data/test/fixtures/groups_users.yml +0 -81
- data/test/fixtures/iformats.yml +0 -29
- data/test/fixtures/links.yml +0 -313
- data/test/fixtures/nodes.yml +0 -2592
- data/test/fixtures/relations.yml +0 -126
- data/test/fixtures/sites.yml +0 -58
- data/test/fixtures/template_contents.yml +0 -172
- data/test/fixtures/users.yml +0 -167
- data/test/fixtures/versions.yml +0 -1911
- data/test/fixtures/virtual_classes.yml +0 -87
- data/test/fixtures/zips.yml +0 -15
- data/test/functional/sessions_controller_test.rb +0 -73
|
@@ -0,0 +1 @@
|
|
|
1
|
+
http://blog.evanweaver.com/articles/2006/06/02/allison
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
CHANGESET1:
|
|
2
|
+
from: '0.14.0'
|
|
3
|
+
to: '0.14.1'
|
|
4
|
+
|
|
5
|
+
CHANGES:
|
|
6
|
+
if_or:
|
|
7
|
+
old: "<r:if can='write' or_test='[d_foo]'>hello</r:if>"
|
|
8
|
+
new: "<r:if can='write' or_test='d_foo'>hello</r:if>"
|
|
9
|
+
|
|
10
|
+
SHOULD_CHANGE:
|
|
11
|
+
basic:
|
|
12
|
+
link_anchor_name:
|
|
13
|
+
old: "<r:link anchor='[name]'/>"
|
|
14
|
+
new: "<r:link anchor='#{name}'/>"
|
|
15
|
+
|
|
16
|
+
CHANGESET2:
|
|
17
|
+
from: '0.15.1'
|
|
18
|
+
to: '0.15.2'
|
|
19
|
+
|
|
20
|
+
CHANGES:
|
|
21
|
+
basic:
|
|
22
|
+
link_sharp:
|
|
23
|
+
old: "<r:link sharp='true'/>"
|
|
24
|
+
new: "<r:link anchor='true'/>"
|
|
25
|
+
anchor_with_link:
|
|
26
|
+
old: "<r:link anchor='true'/>"
|
|
27
|
+
new: "<r:anchor do='link'/>"
|
|
28
|
+
|
|
29
|
+
|
data/lib/base_additions.rb
CHANGED
data/lib/bricks.rb
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), '/bricks/requirements_validation')
|
|
2
|
+
require File.join(File.dirname(__FILE__), '/bricks/loader')
|
|
3
|
+
|
|
4
|
+
module Bricks
|
|
5
|
+
extend Bricks::RequirementsValidation
|
|
6
|
+
extend Bricks::Loader
|
|
7
|
+
CONFIG = self.config_for_active_bricks
|
|
8
|
+
end
|
|
9
|
+
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
module Bricks
|
|
2
|
+
module Loader
|
|
3
|
+
def bricks
|
|
4
|
+
@@bricks ||= bricks_folders.map do |bricks_folder|
|
|
5
|
+
if File.exist?(bricks_folder)
|
|
6
|
+
Dir.entries(bricks_folder).sort.map do |brick|
|
|
7
|
+
if Bricks::CONFIG[brick]
|
|
8
|
+
File.join(bricks_folder, brick)
|
|
9
|
+
else
|
|
10
|
+
nil
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
else
|
|
14
|
+
nil
|
|
15
|
+
end
|
|
16
|
+
end.flatten.compact.uniq
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def bricks_folders
|
|
20
|
+
@@bricks_folders ||= [File.join(Zena::ROOT, 'bricks'), File.join(RAILS_ROOT, 'bricks')].uniq.reject do |f|
|
|
21
|
+
!File.exist?(f)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def models_paths
|
|
26
|
+
bricks.map {|f| Dir["#{f}/models"] }.flatten
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def libs_paths
|
|
30
|
+
bricks.map {|f| Dir["#{f}/lib"] }.flatten
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def foreach_brick(&block)
|
|
34
|
+
bricks.each do |path|
|
|
35
|
+
block.call(path)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def apply_patches(file_name = nil)
|
|
40
|
+
file_name ||= caller[0].split('/').last.split(':').first
|
|
41
|
+
foreach_brick do |brick_path|
|
|
42
|
+
patch_file = File.join(brick_path, 'patch', file_name)
|
|
43
|
+
if File.exist?(patch_file)
|
|
44
|
+
load patch_file
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def load_bricks
|
|
50
|
+
# load all libraries in bricks
|
|
51
|
+
libs_paths.each do |lib_path|
|
|
52
|
+
Dir.foreach(lib_path) do |f|
|
|
53
|
+
next unless f =~ /\A.+\.rb\Z/
|
|
54
|
+
require File.join(lib_path, f)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# FIXME: do we really need to load these now, load_path isn't enough ?
|
|
59
|
+
models_paths.each do |models_path|
|
|
60
|
+
Dir.foreach(models_path) do |f|
|
|
61
|
+
next unless f =~ /\A.+\.rb\Z/
|
|
62
|
+
require File.join(models_path, f)
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def load_misc(filename)
|
|
68
|
+
bricks.map {|f| Dir["#{f}/misc/#{filename}.rb"] }.flatten.each do |file|
|
|
69
|
+
require file
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def load_zafu(mod)
|
|
74
|
+
foreach_brick do |brick_path|
|
|
75
|
+
brick_name = File.basename(brick_path)
|
|
76
|
+
zafu_path = File.join(brick_path, 'zafu')
|
|
77
|
+
next unless File.exist?(zafu_path)
|
|
78
|
+
Dir.foreach(zafu_path) do |rules_name|
|
|
79
|
+
next if rules_name =~ /\A\./
|
|
80
|
+
load File.join(zafu_path, rules_name)
|
|
81
|
+
end
|
|
82
|
+
mod.send(:include, eval("Bricks::#{brick_name.capitalize}::Zafu"))
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
require 'yaml'
|
|
2
|
+
|
|
3
|
+
module Bricks
|
|
4
|
+
module RequirementsValidation
|
|
5
|
+
def requirement_errors(brick, requirements)
|
|
6
|
+
errors = []
|
|
7
|
+
requirements.each do |k,v|
|
|
8
|
+
case k
|
|
9
|
+
when 'gem'
|
|
10
|
+
v.split(',').each do |name|
|
|
11
|
+
begin
|
|
12
|
+
require name.strip
|
|
13
|
+
rescue LoadError => err
|
|
14
|
+
errors << "'#{name}' missing"
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
when 'file'
|
|
18
|
+
v.split(',').each do |name|
|
|
19
|
+
unless File.exist?("#{RAILS_ROOT}/#{name}")
|
|
20
|
+
errors << "'#{name}' missing"
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
when 'adapter'
|
|
24
|
+
config = YAML.load_file(File.join(RAILS_ROOT, 'config', 'database.yml'))
|
|
25
|
+
adapter = config[RAILS_ENV]['adapter']
|
|
26
|
+
unless v.split(',').map(&:strip).include?(adapter)
|
|
27
|
+
errors << "'#{adapter}' not supported"
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
errors.empty? ? nil : errors
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def config_for_active_bricks
|
|
35
|
+
if File.exist?("#{RAILS_ROOT}/config/bricks.yml")
|
|
36
|
+
raw_config = YAML.load_file("#{RAILS_ROOT}/config/bricks.yml")[RAILS_ENV] || {}
|
|
37
|
+
else
|
|
38
|
+
raw_config = YAML.load_file("#{Zena::ROOT}/config/bricks.yml")[RAILS_ENV] || {}
|
|
39
|
+
end
|
|
40
|
+
config = {}
|
|
41
|
+
|
|
42
|
+
raw_config.each do |brick, opts|
|
|
43
|
+
if opts.kind_of?(Hash)
|
|
44
|
+
next unless opts['switch'] == true
|
|
45
|
+
if activation = opts.delete('activate_if')
|
|
46
|
+
if errors = requirement_errors(brick, activation)
|
|
47
|
+
if defined?(ActiveRecord::Base) && logger = ActiveRecord::Base.logger
|
|
48
|
+
ActiveRecord::Base.logger.warn "'#{brick}' not activated: #{errors.join(', ')}"
|
|
49
|
+
end
|
|
50
|
+
puts "'#{brick}' not activated: #{errors.join(', ')}" if RAILS_ENV == 'development'
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
config[brick] = opts unless errors
|
|
54
|
+
else
|
|
55
|
+
if opts == true
|
|
56
|
+
config[brick] = {}
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
config
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def runtime_requirement_errors(brick_name)
|
|
64
|
+
return ["'#{brick_name}' was not activated."] unless opts = Bricks::CONFIG[brick_name]
|
|
65
|
+
if run_requirements = opts.delete('run_if')
|
|
66
|
+
return requirement_errors(brick_name, run_requirements)
|
|
67
|
+
end
|
|
68
|
+
nil
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
data/lib/tasks/zena.rake
CHANGED
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
require 'yaml'
|
|
2
2
|
require 'fileutils'
|
|
3
3
|
|
|
4
|
+
# We need to make sure the RAILS_ENV is set before brick activation or the wrong bricks will
|
|
5
|
+
# be loaded.
|
|
6
|
+
RAILS_ENV = 'test' if ARGV.join(' ') =~ /zena:test/
|
|
7
|
+
|
|
4
8
|
require File.join(File.dirname(__FILE__), '..', 'zena', 'info') # to have Zena::ROOT
|
|
9
|
+
require File.join(File.dirname(__FILE__), '..', 'bricks') # to have Bricks
|
|
10
|
+
|
|
11
|
+
Bricks.load_misc('tasks')
|
|
5
12
|
|
|
6
13
|
def symlink_assets(from, to)
|
|
7
14
|
from = File.expand_path(from)
|
|
@@ -39,7 +46,7 @@ def copy_assets(from, to)
|
|
|
39
46
|
from = File.expand_path(from)
|
|
40
47
|
to = File.expand_path(to)
|
|
41
48
|
return if from == to
|
|
42
|
-
['config/mongrel_upload_progress.conf', 'lib/upload_progress_server.rb', 'config/deploy.rb', 'db/migrate/*.rb', 'public/**/*'].each do |base_path|
|
|
49
|
+
['config/mongrel_upload_progress.conf', 'lib/upload_progress_server.rb', 'config/deploy.rb', 'config/bricks.yml', 'db/migrate/*.rb', 'public/**/*'].each do |base_path|
|
|
43
50
|
if base_path =~ /\*/
|
|
44
51
|
Dir["#{from}/#{base_path}"].each do |path|
|
|
45
52
|
path = path[(from.length + 1)..-1]
|
|
@@ -125,8 +132,8 @@ namespace :zena do
|
|
|
125
132
|
end
|
|
126
133
|
end
|
|
127
134
|
|
|
128
|
-
desc "Rename a
|
|
129
|
-
task :
|
|
135
|
+
desc "Rename a site"
|
|
136
|
+
task :rename_site => :environment do
|
|
130
137
|
# 0. set host name
|
|
131
138
|
unless host = ENV['HOST']
|
|
132
139
|
puts "Please set HOST to the hostname for the new site name. Aborting."
|
|
@@ -231,7 +238,7 @@ namespace :zena do
|
|
|
231
238
|
paths = {'zena' => "#{RAILS_ROOT}/db/migrate"}
|
|
232
239
|
bricks = ['zena']
|
|
233
240
|
|
|
234
|
-
Bricks
|
|
241
|
+
Bricks.foreach_brick do |brick_path|
|
|
235
242
|
brick_name = brick_path.split('/').last
|
|
236
243
|
migration_path = File.join(brick_path, 'migrate')
|
|
237
244
|
next unless File.exist?(migration_path) && File.directory?(migration_path)
|
|
@@ -373,4 +380,35 @@ namespace :zena do
|
|
|
373
380
|
end
|
|
374
381
|
end
|
|
375
382
|
end
|
|
383
|
+
|
|
384
|
+
namespace :sessions do
|
|
385
|
+
desc "Count database sessions"
|
|
386
|
+
task :count => :environment do
|
|
387
|
+
count = ActiveRecord::SessionStore::Session.count
|
|
388
|
+
puts "Sessions stored: #{count}"
|
|
389
|
+
end
|
|
390
|
+
|
|
391
|
+
desc "Clear database-stored sessions older than two weeks"
|
|
392
|
+
task :prune => :environment do
|
|
393
|
+
ActiveRecord::SessionStore::Session.delete_all [ "updated_at < ?", 2.weeks.ago
|
|
394
|
+
]
|
|
395
|
+
end
|
|
396
|
+
end
|
|
397
|
+
|
|
398
|
+
desc "Create the database, migrate, create 'localhost' site and start application"
|
|
399
|
+
task :init do
|
|
400
|
+
# FIXME: how to run sub-task
|
|
401
|
+
[
|
|
402
|
+
"rake zena:migrate RAILS_ENV=production",
|
|
403
|
+
"rake zena:mksite HOST='localhost' PASSWORD='admin' LANG='en' RAILS_ENV=production",
|
|
404
|
+
"#{Gem.win_platform? ? 'start' : 'open'} #{File.join(Zena::ROOT, 'lib/zena/deploy/start.html')}"
|
|
405
|
+
].each do |cmd|
|
|
406
|
+
puts cmd
|
|
407
|
+
system(cmd)
|
|
408
|
+
end
|
|
409
|
+
cmd = "script/server -e production -p 3211"
|
|
410
|
+
puts cmd
|
|
411
|
+
exec cmd
|
|
412
|
+
end
|
|
413
|
+
|
|
376
414
|
end
|
data/lib/zafu/action.rb
ADDED
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
module Zafu
|
|
2
|
+
module Action
|
|
3
|
+
# swap an attribute
|
|
4
|
+
# TODO: test
|
|
5
|
+
def r_swap
|
|
6
|
+
if upd = @params[:update]
|
|
7
|
+
if upd == '_page'
|
|
8
|
+
block = nil
|
|
9
|
+
elsif block = find_target(upd)
|
|
10
|
+
# ok
|
|
11
|
+
if ancestor('block') || ancestor('each')
|
|
12
|
+
upd_both = '&upd_both=true'
|
|
13
|
+
else
|
|
14
|
+
upd_both = ''
|
|
15
|
+
end
|
|
16
|
+
else
|
|
17
|
+
return
|
|
18
|
+
end
|
|
19
|
+
elsif ancestor('block') || ancestor('each')
|
|
20
|
+
# ancestor: ok
|
|
21
|
+
block = self
|
|
22
|
+
elsif parent && block = parent.descendant('block')
|
|
23
|
+
# sibling: ok
|
|
24
|
+
upd_both = ''
|
|
25
|
+
else
|
|
26
|
+
return parser_error("missing 'block' in same parent")
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
states = ((@params[:states] || 'todo, done') + ' ').split(',').map(&:strip)
|
|
30
|
+
|
|
31
|
+
query_params = "node[#{@params[:attr]}]=\#{#{states.inspect}[ ((#{states.inspect}.index(#{node_attribute(@params[:attr])}.to_s) || 0)+1) % #{states.size}]}#{upd_both}"
|
|
32
|
+
out link_to_update(block, :query_params => query_params, :method => :put, :html_params => get_html_params(@params, :link))
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def r_edit
|
|
36
|
+
if @context[:dom_prefix]
|
|
37
|
+
# ajax
|
|
38
|
+
if @context[:in_form]
|
|
39
|
+
# cancel button
|
|
40
|
+
@context[:form_cancel] || ''
|
|
41
|
+
else
|
|
42
|
+
# edit button
|
|
43
|
+
|
|
44
|
+
# TODO: show 'reply' instead of 'edit' in comments if visitor != author
|
|
45
|
+
out link_to_update(self, :default_text => _('edit'), :url => "\#{edit_#{base_class.to_s.underscore}_path(#{node_id})}", :html_params => get_html_params(@params, :link), :method => :get, :cond => "#{node}.can_write?", :else => :void)
|
|
46
|
+
end
|
|
47
|
+
else
|
|
48
|
+
# FIXME: we could link to some html page to edit the item.
|
|
49
|
+
""
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
alias r_cancel r_edit
|
|
54
|
+
|
|
55
|
+
# TODO: test
|
|
56
|
+
def r_add
|
|
57
|
+
return parser_error("should not be called from within 'each'") if parent.method == 'each'
|
|
58
|
+
return '' if @context[:make_form]
|
|
59
|
+
|
|
60
|
+
# why is node = @node (which we need) but we are supposed to have Comments ?
|
|
61
|
+
# FIXME: during rewrite, replace 'node' by 'node(klass = node_class)' so the ugly lines below would be
|
|
62
|
+
# if node_kind_of?(Comment)
|
|
63
|
+
# out "<% if #{node(Node)}.can_comment? -%>"
|
|
64
|
+
# Refs #198.
|
|
65
|
+
if node_kind_of?(Comment)
|
|
66
|
+
out "<% if #{node}.can_comment? -%>"
|
|
67
|
+
else
|
|
68
|
+
out "<% if #{node}.can_write? -%>"
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
unless descendant('add_btn')
|
|
72
|
+
# add a descendant between self and blocks.
|
|
73
|
+
blocks = @blocks.dup
|
|
74
|
+
@blocks = []
|
|
75
|
+
add_btn = make(:void, :method=>'add_btn', :params=>@params.dup, :text=>'')
|
|
76
|
+
add_btn.blocks = blocks
|
|
77
|
+
remove_instance_variable(:@all_descendants)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
if @context[:form] && @context[:dom_prefix]
|
|
81
|
+
# ajax add
|
|
82
|
+
|
|
83
|
+
@html_tag_params.merge!(:id => "#{erb_dom_id}_add")
|
|
84
|
+
@html_tag_params[:class] ||= 'btn_add'
|
|
85
|
+
if @params[:focus]
|
|
86
|
+
focus = "$(\"#{erb_dom_id}_#{@params[:focus]}\").focus();"
|
|
87
|
+
else
|
|
88
|
+
focus = "$(\"#{erb_dom_id}_form_t\").focusFirstElement();"
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
out render_html_tag("#{expand_with(:onclick=>"[\"#{erb_dom_id}_add\", \"#{erb_dom_id}_form\"].each(Element.toggle);#{focus}return false;")}")
|
|
92
|
+
|
|
93
|
+
if node_kind_of?(Node)
|
|
94
|
+
# FIXME: BUG if we set <r:form klass='Post'/> the user cannot select class with menu...
|
|
95
|
+
klass = @context[:klass] || 'Node'
|
|
96
|
+
# FIXME: inspect '@context[:form]' to see if it contains v_klass ?
|
|
97
|
+
out "<% if #{var}_new = secure(Node) { Node.new_from_class(#{klass.inspect}) } -%>"
|
|
98
|
+
else
|
|
99
|
+
out "<% if #{var}_new = #{node_class}.new -%>"
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
if @context[:form].method == 'form'
|
|
103
|
+
out expand_block(@context[:form], :in_add => true, :no_ignore => ['form'], :add=>self, :node => "#{var}_new", :parent_node => node, :klass => klass, :publish_after_save => auto_publish_param)
|
|
104
|
+
else
|
|
105
|
+
# build form from 'each'
|
|
106
|
+
out expand_block(@context[:form], :in_add => true, :no_ignore => ['form'], :add=>self, :make_form => true, :node => "#{var}_new", :parent_node => node, :klass => klass, :publish_after_save => auto_publish_param)
|
|
107
|
+
end
|
|
108
|
+
out "<% end -%>"
|
|
109
|
+
else
|
|
110
|
+
# no ajax
|
|
111
|
+
@html_tag_params[:class] ||= 'btn_add' if @html_tag
|
|
112
|
+
out render_html_tag(expand_with)
|
|
113
|
+
end
|
|
114
|
+
out "<% end -%>"
|
|
115
|
+
@html_tag_done = true
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def r_add_btn
|
|
119
|
+
if @params[:text]
|
|
120
|
+
text = @params[:text]
|
|
121
|
+
text = "<div>#{text}</div>" unless @html_tag
|
|
122
|
+
elsif @params[:trans]
|
|
123
|
+
text = _(@params[:trans])
|
|
124
|
+
text = "<div>#{text}</div>" unless @html_tag
|
|
125
|
+
elsif @blocks != []
|
|
126
|
+
text = expand_with
|
|
127
|
+
else
|
|
128
|
+
text = node_class == Comment ? _("btn_add_comment") : _("btn_add")
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
out "<a href='#' onclick='#{@context[:onclick]}'>#{text}</a>"
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# Show html to add open a popup window to add a document.
|
|
135
|
+
# TODO: inline ajax for upload ?
|
|
136
|
+
def r_add_document
|
|
137
|
+
return parser_error("only works with nodes (not with #{node_class})") unless node_kind_of?(Node)
|
|
138
|
+
@html_tag_params[:class] ||= 'btn_add'
|
|
139
|
+
res = "<a href='/documents/new?parent_id=#{erb_node_id}' onclick='uploader=window.open(\"/documents/new?parent_id=#{erb_node_id}\", \"upload\", \"width=400,height=300\");return false;'>#{_('btn_add_doc')}</a>"
|
|
140
|
+
"<% if #{node}.can_write? -%>#{render_html_tag(res)}<% end -%>"
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
#if RAILS_ENV == 'test'
|
|
144
|
+
# def r_test
|
|
145
|
+
# inspect
|
|
146
|
+
# end
|
|
147
|
+
#end
|
|
148
|
+
|
|
149
|
+
def r_drop
|
|
150
|
+
if parent.method == 'each' && @method == parent.single_child_method
|
|
151
|
+
parent.add_html_class('drop')
|
|
152
|
+
else
|
|
153
|
+
@html_tag_params[:class] ||= 'drop'
|
|
154
|
+
end
|
|
155
|
+
r_block
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
def drop_javascript
|
|
159
|
+
hover = @params[:hover]
|
|
160
|
+
change = @params[:change]
|
|
161
|
+
|
|
162
|
+
if role = @params[:set] || @params[:add]
|
|
163
|
+
query_params = ["node[#{role}_id]=[id]"]
|
|
164
|
+
else
|
|
165
|
+
query_params = []
|
|
166
|
+
# set='icon_for=[id], v_status='50', v_title='[v_title]'
|
|
167
|
+
@params.each do |k, v|
|
|
168
|
+
next if [:hover, :change, :done].include?(k)
|
|
169
|
+
value, static = parse_attributes_in_value(v, :erb => false, :skip_node_attributes => true)
|
|
170
|
+
key = change == 'params' ? "params[#{k}]" : "node[#{k}]"
|
|
171
|
+
query_params << "#{key}=#{CGI.escape(value)}"
|
|
172
|
+
end
|
|
173
|
+
return parser_error("missing parameters to set values") if query_params == []
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
query_params << "change=#{change}" if change == 'receiver'
|
|
177
|
+
query_params << "t_url=#{CGI.escape(template_url)}"
|
|
178
|
+
query_params << "dom_id=#{erb_dom_id}"
|
|
179
|
+
query_params << start_node_s_param(:erb)
|
|
180
|
+
query_params << "done=#{CGI.escape(@params[:done])}" if @params[:done]
|
|
181
|
+
|
|
182
|
+
"<script type='text/javascript'>
|
|
183
|
+
//<![CDATA[
|
|
184
|
+
Droppables.add('#{erb_dom_id}', {hoverclass:'#{hover || 'drop_hover'}', onDrop:function(element){new Ajax.Request('/nodes/#{erb_node_id}/drop?#{query_params.join('&')}', {asynchronous:true, evalScripts:true, method:'put', parameters:'drop=' + encodeURIComponent(element.id)})}})
|
|
185
|
+
//]]>
|
|
186
|
+
</script>"
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
def r_draggable
|
|
190
|
+
new_dom_scope
|
|
191
|
+
@html_tag ||= 'div'
|
|
192
|
+
case @params[:revert]
|
|
193
|
+
when 'move'
|
|
194
|
+
revert_effect = 'Element.move'
|
|
195
|
+
when 'remove'
|
|
196
|
+
revert_effect = 'Element.remove'
|
|
197
|
+
else
|
|
198
|
+
revert_effect = 'Element.move'
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
res, drag_handle = set_drag_handle_and_id(expand_with, @params, :id => erb_dom_id)
|
|
202
|
+
|
|
203
|
+
out render_html_tag(res)
|
|
204
|
+
|
|
205
|
+
if drag_handle
|
|
206
|
+
out "<script type='text/javascript'>\n//<![CDATA[\n
|
|
207
|
+
new Draggable('#{erb_dom_id}', {ghosting:true, revert:true, revertEffect:#{revert_effect}, handle:$('#{erb_dom_id}').select('.#{drag_handle}')[0]});\n//]]>\n</script>"
|
|
208
|
+
else
|
|
209
|
+
out "<script type='text/javascript'>\n//<![CDATA[\nZena.draggable('#{erb_dom_id}',0,true,true,#{revert_effect})\n//]]>\n</script>"
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
def r_unlink
|
|
214
|
+
return "" if @context[:make_form]
|
|
215
|
+
opts = {}
|
|
216
|
+
|
|
217
|
+
if upd = @params[:update]
|
|
218
|
+
if upd == '_page'
|
|
219
|
+
target = nil
|
|
220
|
+
elsif target = find_target(upd)
|
|
221
|
+
# ok
|
|
222
|
+
else
|
|
223
|
+
return
|
|
224
|
+
end
|
|
225
|
+
elsif target = ancestor('block')
|
|
226
|
+
# ok
|
|
227
|
+
else
|
|
228
|
+
target = self
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
if node_kind_of?(Node)
|
|
232
|
+
opts[:cond] = "#{node}.can_write? && #{node}.link_id"
|
|
233
|
+
opts[:url] = "/nodes/\#{#{node_id}}/links/\#{#{node}.link_id}"
|
|
234
|
+
elsif node_kind_of?(Link)
|
|
235
|
+
opts[:url] = "/nodes/\#{#{node}.this_zip}/links/\#{#{node}.zip}"
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
opts[:method] = :delete
|
|
239
|
+
opts[:default_text] = _('btn_tiny_del')
|
|
240
|
+
opts[:html_params] = get_html_params({:class => 'unlink'}.merge(@params), :link)
|
|
241
|
+
|
|
242
|
+
out link_to_update(target, opts)
|
|
243
|
+
|
|
244
|
+
#tag_to_remote
|
|
245
|
+
#"<%= tag_to_remote({:url => node_path(#{node_id}) + \"#{opts[:method] != :put ? '/zafu' : ''}?#{action.join('&')}\", :method => #{opts[:method].inspect}}) %>"
|
|
246
|
+
# out "<a class='#{@params[:class] || 'unlink'}' href='/nodes/#{erb_node_id}/links/<%= #{node}.link_id %>?#{action}' onclick=\"new Ajax.Request('/nodes/#{erb_node_id}/links/<%= #{node}.link_id %>?#{action}', {asynchronous:true, evalScripts:true, method:'delete'}); return false;\">"
|
|
247
|
+
# if !@blocks.empty?
|
|
248
|
+
# inner = expand_with
|
|
249
|
+
# else
|
|
250
|
+
# inner = _('btn_tiny_del')
|
|
251
|
+
# end
|
|
252
|
+
# out "#{inner}</a><% else -%>#{inner}<% end -%>"
|
|
253
|
+
#elsif node_kind_of?(DataEntry)
|
|
254
|
+
# text = get_text_for_erb
|
|
255
|
+
# if text.blank?
|
|
256
|
+
# text = _('btn_tiny_del')
|
|
257
|
+
# end
|
|
258
|
+
# out "<%= link_to_remote(#{text.inspect}, {:url => \"/data_entries/\#{#{node}[:id]}?dom_id=#{dom_id}#{upd_url}\", :method => :delete}, :class=>#{(@params[:class] || 'unlink').inspect}) %>"
|
|
259
|
+
#end
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
protected
|
|
263
|
+
def auto_publish_param(in_string = false)
|
|
264
|
+
if in_string
|
|
265
|
+
['true','force'].include?(@params[:publish]) ? "&publish=#{@params[:publish]}" : ''
|
|
266
|
+
else
|
|
267
|
+
@params[:publish]
|
|
268
|
+
end
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
# Returns true if a form/edit needs to keep track of link_id (l_status or l_comment used).
|
|
272
|
+
def need_link_id
|
|
273
|
+
if (input_fields = (descendants('input') + descendants('select'))) != []
|
|
274
|
+
input_fields.each do |f|
|
|
275
|
+
return true if f.params[:name] =~ /\Al_/
|
|
276
|
+
end
|
|
277
|
+
elsif (show_fields = descendants('show')) != []
|
|
278
|
+
show_fields.each do |f|
|
|
279
|
+
return true if f.params[:attr] =~ /\Al_/
|
|
280
|
+
end
|
|
281
|
+
end
|
|
282
|
+
return false
|
|
283
|
+
end
|
|
284
|
+
end # Action
|
|
285
|
+
end # Zafu
|