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.
Files changed (284) hide show
  1. data/.gitignore +20 -0
  2. data/CREDITS +27 -0
  3. data/Capfile +3 -0
  4. data/DEVELOPERS +46 -0
  5. data/History.txt +15 -0
  6. data/MIT-LICENSE +19 -0
  7. data/Rakefile +44 -0
  8. data/TODO +24 -0
  9. data/TODO_ZENA_1_0 +23 -0
  10. data/app/controllers/application_controller.rb +3 -0
  11. data/app/controllers/documents_controller.rb +22 -56
  12. data/app/controllers/nodes_controller.rb +42 -27
  13. data/app/controllers/pings_controller.rb +19 -0
  14. data/app/controllers/relations_controller.rb +5 -1
  15. data/app/controllers/sites_controller.rb +1 -46
  16. data/app/controllers/user_sessions_controller.rb +47 -0
  17. data/app/controllers/users_controller.rb +1 -0
  18. data/app/controllers/versions_controller.rb +25 -7
  19. data/app/controllers/virtual_classes_controller.rb +1 -1
  20. data/app/helpers/application_helper.rb +1 -1
  21. data/app/models/comment.rb +2 -1
  22. data/app/models/contact_content.rb +2 -2
  23. data/app/models/data_entry.rb +5 -6
  24. data/app/models/document.rb +14 -10
  25. data/app/models/document_content.rb +4 -6
  26. data/app/models/iformat.rb +2 -2
  27. data/app/models/image_content.rb +6 -9
  28. data/app/models/node.rb +106 -164
  29. data/app/models/page.rb +0 -20
  30. data/app/models/site.rb +42 -12
  31. data/app/models/template.rb +3 -8
  32. data/app/models/template_content.rb +2 -0
  33. data/app/models/text_document.rb +13 -8
  34. data/app/models/user.rb +47 -100
  35. data/app/models/user_session.rb +4 -0
  36. data/app/models/version.rb +1 -1
  37. data/app/views/comments/create.rjs +3 -3
  38. data/app/views/comments/edit.rjs +1 -1
  39. data/app/views/comments/update.rjs +1 -1
  40. data/app/views/nodes/_import_results.rhtml +1 -1
  41. data/app/views/nodes/create.rjs +3 -3
  42. data/app/views/templates/document_create_tabs/_file.rhtml +1 -2
  43. data/app/views/templates/document_create_tabs/_import.rhtml +7 -2
  44. data/app/views/templates/edit_tabs/_document.rhtml +1 -3
  45. data/app/views/templates/edit_tabs/_image.rhtml +1 -3
  46. data/app/views/versions/_tr.rhtml +1 -1
  47. data/app/views/versions/edit.rhtml +2 -26
  48. data/bin/zena +6 -1
  49. data/bricks/delayed_job/README +18 -0
  50. data/bricks/delayed_job/migrate/20091104191643_create_delayed_jobs_table.rb +19 -0
  51. data/bricks/delayed_job/misc/init.rb +8 -0
  52. data/bricks/delayed_job/misc/tasks.rb +2 -0
  53. data/bricks/math/patch/application_helper.rb +1 -1
  54. data/bricks/sphinx/MIT-LICENSE +19 -0
  55. data/bricks/sphinx/README +19 -0
  56. data/bricks/sphinx/lib/use_sphinx.rb +78 -0
  57. data/bricks/sphinx/migrate/20091102171258_add_delta_for_sphinx.rb +9 -0
  58. data/bricks/sphinx/misc/deploy.rb +20 -0
  59. data/bricks/sphinx/misc/sphinx.yml +12 -0
  60. data/bricks/sphinx/misc/tasks.rb +21 -0
  61. data/bricks/sphinx/patch/node.rb +8 -0
  62. data/bricks/tags/lib/has_tags.rb +5 -3
  63. data/bricks/tags/test/zafu/tags.yml +13 -1
  64. data/config/bricks.yml +35 -0
  65. data/config/deploy.rb +8 -1
  66. data/config/environment.rb +1 -1
  67. data/config/environments/production.rb +1 -1
  68. data/config/gems.yml +28 -5
  69. data/config/sphinx.yml +12 -0
  70. data/db/init/base/skins/default/Node-+popupLayout.zafu +1 -16
  71. data/db/migrate/20091026161708_add_persistence_token.rb +13 -0
  72. data/db/migrate/20091101184952_add_session_table.rb +16 -0
  73. data/db/migrate/20091123175137_add_single_access_token.rb +9 -0
  74. data/db/migrate/20091124161608_rebuild_fullpath.rb +11 -0
  75. data/db/schema.rb +21 -8
  76. data/doc/README_FOR_APP +24 -0
  77. data/doc/fixtures.graffle +19568 -0
  78. data/doc/fixtures.pdf +0 -0
  79. data/doc/template/LICENSE +184 -0
  80. data/doc/template/README +37 -0
  81. data/doc/template/allison.css +283 -0
  82. data/doc/template/allison.js +307 -0
  83. data/doc/template/allison.rb +260 -0
  84. data/doc/template/cache/BODY +588 -0
  85. data/doc/template/cache/CLASS_INDEX +4 -0
  86. data/doc/template/cache/CLASS_PAGE +1 -0
  87. data/doc/template/cache/FILE_INDEX +4 -0
  88. data/doc/template/cache/FILE_PAGE +1 -0
  89. data/doc/template/cache/FONTS +1 -0
  90. data/doc/template/cache/FR_INDEX_BODY +1 -0
  91. data/doc/template/cache/IMGPATH +1 -0
  92. data/doc/template/cache/INDEX +1 -0
  93. data/doc/template/cache/JAVASCRIPT +307 -0
  94. data/doc/template/cache/METHOD_INDEX +4 -0
  95. data/doc/template/cache/METHOD_LIST +1 -0
  96. data/doc/template/cache/SRC_PAGE +1 -0
  97. data/doc/template/cache/STYLE +283 -0
  98. data/doc/template/cache/URL +1 -0
  99. data/doc/zafu_changes.yml +29 -0
  100. data/lib/base_additions.rb +1 -1
  101. data/lib/bricks.rb +9 -0
  102. data/lib/bricks/loader.rb +86 -0
  103. data/lib/bricks/requirements_validation.rb +71 -0
  104. data/lib/tasks/zena.rake +42 -4
  105. data/lib/zafu/action.rb +285 -0
  106. data/lib/zafu/ajax.rb +93 -0
  107. data/lib/zafu/attributes.rb +117 -0
  108. data/lib/zafu/calendar.rb +159 -0
  109. data/lib/zafu/context.rb +330 -0
  110. data/lib/zafu/core/html.rb +102 -0
  111. data/lib/zafu/core/move_to_parser.rb +167 -0
  112. data/lib/zafu/dates.rb +58 -0
  113. data/lib/zafu/display.rb +502 -0
  114. data/lib/zafu/eval.rb +66 -0
  115. data/lib/zafu/experimental.rb +66 -0
  116. data/lib/zafu/i18n.rb +64 -0
  117. data/lib/zafu/meta.rb +25 -0
  118. data/lib/zafu/refactor.rb +73 -0
  119. data/lib/zafu/support/context.rb +265 -0
  120. data/lib/zafu/support/dom.rb +145 -0
  121. data/lib/zafu/support/erb.rb +62 -0
  122. data/lib/zafu/support/flow.rb +401 -0
  123. data/lib/zafu/support/forms.rb +461 -0
  124. data/lib/zafu/support/links.rb +306 -0
  125. data/lib/zafu_parser.rb +26 -2
  126. data/lib/zena.rb +34 -15
  127. data/lib/zena/acts/multiversion.rb +2 -2
  128. data/lib/zena/acts/secure.rb +41 -30
  129. data/lib/zena/app.rb +7 -10
  130. data/lib/zena/controller/test_case.rb +12 -7
  131. data/lib/zena/crypto_provider/initial.rb +15 -0
  132. data/lib/zena/db.rb +6 -1
  133. data/lib/zena/deploy.rb +34 -6
  134. data/lib/zena/deploy/logrotate_app.rhtml +9 -0
  135. data/lib/zena/deploy/logrotate_host.rhtml +34 -0
  136. data/lib/zena/deploy/template.rb +1 -9
  137. data/lib/zena/foxy_parser.rb +1 -1
  138. data/lib/zena/info.rb +3 -1
  139. data/lib/zena/migrator.rb +1 -1
  140. data/lib/zena/parser.rb +12 -4
  141. data/lib/zena/parser/zazen_rules.rb +6 -6
  142. data/lib/zena/parser/zena_rules.rb +1 -7
  143. data/lib/zena/routes.rb +5 -5
  144. data/lib/zena/test_controller.rb +7 -2
  145. data/lib/zena/unit/test_case.rb +6 -8
  146. data/lib/zena/use/ajax.rb +10 -10
  147. data/lib/zena/use/authlogic.rb +93 -0
  148. data/lib/zena/use/dyn_attributes.rb +5 -0
  149. data/lib/zena/use/html_tags.rb +16 -34
  150. data/lib/zena/use/i18n.rb +4 -1
  151. data/lib/zena/use/node_query_finders.rb +8 -4
  152. data/lib/zena/use/refactor.rb +8 -20
  153. data/lib/zena/use/relations.rb +1 -0
  154. data/lib/zena/use/rendering.rb +4 -2
  155. data/lib/zena/use/search.rb +52 -0
  156. data/lib/zena/use/test_helper.rb +27 -28
  157. data/lib/zena/use/upload.rb +188 -0
  158. data/lib/zena/use/urls.rb +16 -14
  159. data/lib/zena/use/zafu.rb +16 -63
  160. data/lib/zena/use/zazen.rb +8 -8
  161. data/lib/zena/view/test_case.rb +8 -4
  162. data/locale/en/LC_MESSAGES/zena.mo +0 -0
  163. data/locale/en/zena.po +3 -3
  164. data/public/.htaccess +40 -0
  165. data/public/javascripts/upload-progress.js +17 -8
  166. data/public/javascripts/zena.js +8 -2
  167. data/public/stylesheets/popup.css +1 -0
  168. data/script/about +3 -0
  169. data/script/apache_logging +25 -0
  170. data/script/breakpointer +3 -0
  171. data/script/console +3 -0
  172. data/script/dbconsole +3 -0
  173. data/script/destroy +3 -0
  174. data/script/generate +3 -0
  175. data/script/performance/benchmarker +3 -0
  176. data/script/performance/profiler +3 -0
  177. data/script/plugin +3 -0
  178. data/script/process/inspector +3 -0
  179. data/script/process/reaper +3 -0
  180. data/script/process/spawner +3 -0
  181. data/script/runner +3 -0
  182. data/script/server +3 -0
  183. data/script/set_revision +29 -0
  184. data/spec/controllers/versions_controller_spec.rb +11 -0
  185. data/test/fixtures/files/Node-test.zafu +1 -1
  186. data/test/functional/nodes_controller_test.rb +25 -0
  187. data/test/functional/pings_controller_test.rb +8 -0
  188. data/test/functional/user_sessions_controller_test.rb +59 -0
  189. data/test/functional/users_controller_test.rb +81 -19
  190. data/test/helpers/node_query/filters.yml +5 -0
  191. data/test/helpers/node_query_test.rb +3 -3
  192. data/test/integration/multiple_hosts_test.rb +1 -1
  193. data/test/integration/navigation_test.rb +1 -1
  194. data/test/sites/complex/users.yml +1 -1
  195. data/test/sites/ocean/users.yml +3 -3
  196. data/test/sites/zena/users.yml +5 -4
  197. data/test/test_zena.rb +38 -38
  198. data/test/unit/cached_page_test.rb +2 -2
  199. data/test/unit/comment_test.rb +0 -1
  200. data/test/unit/document_test.rb +23 -11
  201. data/test/unit/helpers/ping_helper_test.rb +4 -0
  202. data/test/unit/multiversion_test.rb +24 -16
  203. data/test/unit/node_test.rb +32 -93
  204. data/test/unit/note_test.rb +9 -0
  205. data/test/unit/page_test.rb +2 -2
  206. data/test/unit/secure_test.rb +2 -12
  207. data/test/unit/site_test.rb +43 -24
  208. data/test/unit/template_test.rb +45 -3
  209. data/test/unit/text_document_test.rb +4 -3
  210. data/test/unit/user_test.rb +13 -33
  211. data/test/unit/zena/db_test.rb +8 -0
  212. data/test/unit/zena/parser/zazen.yml +4 -4
  213. data/test/unit/zena/use/dates_view_methods_test.rb +2 -1
  214. data/test/unit/zena/use/html_tags_test.rb +12 -4
  215. data/test/unit/zena/use/refactor_test.rb +4 -3
  216. data/test/unit/zena/use/rendering_test.rb +1 -0
  217. data/test/unit/zena/use/upload_test.rb +76 -0
  218. data/test/unit/zena/use/urls_test.rb +4 -0
  219. data/test/unit/zena/use/zafu_test.rb +8 -0
  220. data/test/unit/zena/workflow/status_version_test.rb +6 -0
  221. data/test/unit/zena/zena_tags/ajax.yml +4 -4
  222. data/test/unit/zena/zena_tags/basic.yml +21 -10
  223. data/test/unit/zena/zena_tags/relations.yml +0 -6
  224. data/test/unit/zena/zena_tags/rubyless.yml +35 -0
  225. data/test/unit/zena/zena_tags/zazen.yml +4 -4
  226. data/test/unit/zena/zena_tags_test.rb +36 -4
  227. data/vendor/TextMate/Zena.tmbundle/Commands/Run all yaml tests.tmCommand +1 -1
  228. data/vendor/TextMate/Zena.tmbundle/Commands/Run focused yaml test.tmCommand +2 -3
  229. data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/catch_exception.rb +39 -0
  230. data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/run_script.rb +102 -58
  231. data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/stdin_dialog.rb +14 -0
  232. data/vendor/TextMate/Zena.tmbundle/info.plist +2 -0
  233. data/zena.gemspec +2085 -0
  234. metadata +265 -90
  235. data/app/controllers/sessions_controller.rb +0 -41
  236. data/app/views/sites/zena_up.html.erb +0 -11
  237. data/config/database.yml +0 -40
  238. data/db/production.sqlite3 +0 -0
  239. data/lib/bricks/patcher.rb +0 -68
  240. data/lib/zena/parser/zena_tags.rb +0 -3562
  241. data/lib/zena/use/authentification.rb +0 -120
  242. data/public/images/ext/contact_pv.png +0 -0
  243. data/public/images/ext/other_pv.png +0 -0
  244. data/public/images/ext/page_pv.png +0 -0
  245. data/public/images/ext/page_tiny.png +0 -0
  246. data/public/images/ext/pdf_pv.png +0 -0
  247. data/public/images/ext/post_pv.png +0 -0
  248. data/public/images/ext/post_tiny.png +0 -0
  249. data/public/images/ext/project_pv.png +0 -0
  250. data/public/images/ext/project_tiny.png +0 -0
  251. data/public/images/ext/tag_pv.png +0 -0
  252. data/public/images/ext/zip_pv.png +0 -0
  253. data/tasks/ann.rake +0 -80
  254. data/tasks/bones.rake +0 -20
  255. data/tasks/gem.rake +0 -201
  256. data/tasks/git.rake +0 -40
  257. data/tasks/notes.rake +0 -27
  258. data/tasks/post_load.rake +0 -34
  259. data/tasks/rdoc.rake +0 -51
  260. data/tasks/rubyforge.rake +0 -55
  261. data/tasks/setup.rb +0 -292
  262. data/tasks/spec.rake +0 -54
  263. data/tasks/svn.rake +0 -47
  264. data/tasks/test.rake +0 -40
  265. data/tasks/zentest.rake +0 -36
  266. data/test/fixtures/comments.yml +0 -126
  267. data/test/fixtures/contact_contents.yml +0 -132
  268. data/test/fixtures/data_entries.yml +0 -65
  269. data/test/fixtures/discussions.yml +0 -48
  270. data/test/fixtures/document_contents.yml +0 -108
  271. data/test/fixtures/dyn_attributes.yml +0 -66
  272. data/test/fixtures/groups.yml +0 -86
  273. data/test/fixtures/groups_users.yml +0 -81
  274. data/test/fixtures/iformats.yml +0 -29
  275. data/test/fixtures/links.yml +0 -313
  276. data/test/fixtures/nodes.yml +0 -2592
  277. data/test/fixtures/relations.yml +0 -126
  278. data/test/fixtures/sites.yml +0 -58
  279. data/test/fixtures/template_contents.yml +0 -172
  280. data/test/fixtures/users.yml +0 -167
  281. data/test/fixtures/versions.yml +0 -1911
  282. data/test/fixtures/virtual_classes.yml +0 -87
  283. data/test/fixtures/zips.yml +0 -15
  284. 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
+
@@ -4,4 +4,4 @@ module Zena
4
4
  end
5
5
  end
6
6
 
7
- Bricks::Patcher.apply_patches
7
+ Bricks.apply_patches
@@ -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
@@ -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 host"
129
- task :rename_host => :environment do
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::Patcher.foreach_brick do |brick_path|
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
@@ -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