zena 0.15.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 (1826) hide show
  1. data/History.txt +18 -0
  2. data/README.txt +133 -0
  3. data/app/controllers/application_controller.rb +3 -0
  4. data/app/controllers/comments_controller.rb +141 -0
  5. data/app/controllers/data_entries_controller.rb +81 -0
  6. data/app/controllers/discussions_controller.rb +48 -0
  7. data/app/controllers/documents_controller.rb +136 -0
  8. data/app/controllers/groups_controller.rb +99 -0
  9. data/app/controllers/iformats_controller.rb +78 -0
  10. data/app/controllers/links_controller.rb +98 -0
  11. data/app/controllers/nodes_controller.rb +497 -0
  12. data/app/controllers/preferences_controller.rb +52 -0
  13. data/app/controllers/relations_controller.rb +95 -0
  14. data/app/controllers/sessions_controller.rb +41 -0
  15. data/app/controllers/sites_controller.rb +112 -0
  16. data/app/controllers/users_controller.rb +139 -0
  17. data/app/controllers/versions_controller.rb +268 -0
  18. data/app/controllers/virtual_classes_controller.rb +95 -0
  19. data/app/helpers/application_helper.rb +4 -0
  20. data/app/helpers/documents_helper.rb +13 -0
  21. data/app/helpers/nodes_helper.rb +20 -0
  22. data/app/helpers/versions_helper.rb +18 -0
  23. data/app/models/book.rb +242 -0
  24. data/app/models/cache.rb +52 -0
  25. data/app/models/cached_page.rb +134 -0
  26. data/app/models/comment.rb +125 -0
  27. data/app/models/contact.rb +32 -0
  28. data/app/models/contact_content.rb +70 -0
  29. data/app/models/contact_version.rb +40 -0
  30. data/app/models/data_entry.rb +162 -0
  31. data/app/models/discussion.rb +65 -0
  32. data/app/models/document.rb +146 -0
  33. data/app/models/document_content.rb +186 -0
  34. data/app/models/document_version.rb +13 -0
  35. data/app/models/dyn_attribute.rb +4 -0
  36. data/app/models/group.rb +142 -0
  37. data/app/models/iformat.rb +146 -0
  38. data/app/models/image.rb +96 -0
  39. data/app/models/image_content.rb +189 -0
  40. data/app/models/image_version.rb +21 -0
  41. data/app/models/link.rb +121 -0
  42. data/app/models/node.rb +1752 -0
  43. data/app/models/note.rb +58 -0
  44. data/app/models/page.rb +53 -0
  45. data/app/models/project.rb +10 -0
  46. data/app/models/reference.rb +18 -0
  47. data/app/models/relation.rb +18 -0
  48. data/app/models/relation_proxy.rb +379 -0
  49. data/app/models/section.rb +5 -0
  50. data/app/models/site.rb +355 -0
  51. data/app/models/skin.rb +20 -0
  52. data/app/models/template.rb +134 -0
  53. data/app/models/template_content.rb +112 -0
  54. data/app/models/template_version.rb +37 -0
  55. data/app/models/text_document.rb +162 -0
  56. data/app/models/text_document_content.rb +46 -0
  57. data/app/models/text_document_version.rb +21 -0
  58. data/app/models/user.rb +412 -0
  59. data/app/models/version.rb +328 -0
  60. data/app/models/virtual_class.rb +134 -0
  61. data/app/models/zip.rb +6 -0
  62. data/app/views/comments/_add.rhtml +6 -0
  63. data/app/views/comments/_bin.rhtml +5 -0
  64. data/app/views/comments/_form.rhtml +26 -0
  65. data/app/views/comments/_li.rhtml +13 -0
  66. data/app/views/comments/_li_simple.rhtml +3 -0
  67. data/app/views/comments/_list.rhtml +13 -0
  68. data/app/views/comments/create.rjs +32 -0
  69. data/app/views/comments/edit.rjs +2 -0
  70. data/app/views/comments/empty_bin.rjs +1 -0
  71. data/app/views/comments/index.rhtml +12 -0
  72. data/app/views/comments/publish.rjs +7 -0
  73. data/app/views/comments/remove.rjs +9 -0
  74. data/app/views/comments/reply_to.rjs +2 -0
  75. data/app/views/comments/update.rjs +1 -0
  76. data/app/views/data_entries/_li.html.erb +9 -0
  77. data/app/views/data_entries/create.rjs +1 -0
  78. data/app/views/data_entries/destroy.rjs +1 -0
  79. data/app/views/data_entries/edit.rjs +1 -0
  80. data/app/views/data_entries/index.html.erb +5 -0
  81. data/app/views/data_entries/show.html.erb +5 -0
  82. data/app/views/data_entries/show.rjs +1 -0
  83. data/app/views/data_entries/update.rjs +1 -0
  84. data/app/views/discussions/_add.rhtml +6 -0
  85. data/app/views/discussions/_form.rhtml +21 -0
  86. data/app/views/discussions/_li.rhtml +9 -0
  87. data/app/views/discussions/_list.rhtml +4 -0
  88. data/app/views/discussions/create.rjs +10 -0
  89. data/app/views/discussions/remove.rjs +7 -0
  90. data/app/views/discussions/show.rjs +1 -0
  91. data/app/views/discussions/update.rjs +2 -0
  92. data/app/views/documents/_crop.rhtml +10 -0
  93. data/app/views/documents/crop_form.rjs +4 -0
  94. data/app/views/documents/new.rhtml +18 -0
  95. data/app/views/documents/show.rhtml +17 -0
  96. data/app/views/groups/_add.rhtml +6 -0
  97. data/app/views/groups/_form.rhtml +44 -0
  98. data/app/views/groups/_li.rhtml +13 -0
  99. data/app/views/groups/create.rjs +8 -0
  100. data/app/views/groups/destroy.rjs +2 -0
  101. data/app/views/groups/edit.html.erb +5 -0
  102. data/app/views/groups/index.rhtml +6 -0
  103. data/app/views/groups/show.html.erb +5 -0
  104. data/app/views/groups/show.rjs +1 -0
  105. data/app/views/iformats/_add.rhtml +6 -0
  106. data/app/views/iformats/_form.rhtml +29 -0
  107. data/app/views/iformats/_li.rhtml +15 -0
  108. data/app/views/iformats/create.rjs +8 -0
  109. data/app/views/iformats/destroy.rjs +11 -0
  110. data/app/views/iformats/edit.html.erb +5 -0
  111. data/app/views/iformats/index.rhtml +7 -0
  112. data/app/views/iformats/show.html.erb +5 -0
  113. data/app/views/iformats/show.rjs +1 -0
  114. data/app/views/iformats/update.rjs +5 -0
  115. data/app/views/image/_title.rhtml +8 -0
  116. data/app/views/links/_add.rhtml +6 -0
  117. data/app/views/links/_form.rhtml +34 -0
  118. data/app/views/links/_li.rhtml +7 -0
  119. data/app/views/links/_list.rhtml +9 -0
  120. data/app/views/links/create.rjs +5 -0
  121. data/app/views/links/destroy.rjs +11 -0
  122. data/app/views/links/show.rjs +5 -0
  123. data/app/views/nodes/404.html +15 -0
  124. data/app/views/nodes/500.html +15 -0
  125. data/app/views/nodes/_dates.rhtml +13 -0
  126. data/app/views/nodes/_edit_attribute.rhtml +32 -0
  127. data/app/views/nodes/_gallery.rhtml +16 -0
  128. data/app/views/nodes/_groups.rhtml +25 -0
  129. data/app/views/nodes/_import_results.rhtml +20 -0
  130. data/app/views/nodes/_list_nodes.rhtml +9 -0
  131. data/app/views/nodes/_parent.rhtml +15 -0
  132. data/app/views/nodes/_position.rhtml +22 -0
  133. data/app/views/nodes/_results.rhtml +29 -0
  134. data/app/views/nodes/_show_attr.rhtml +6 -0
  135. data/app/views/nodes/_table.rhtml +14 -0
  136. data/app/views/nodes/clear_order.rjs +7 -0
  137. data/app/views/nodes/create.rjs +17 -0
  138. data/app/views/nodes/drive.rjs +2 -0
  139. data/app/views/nodes/drop.rjs +1 -0
  140. data/app/views/nodes/edit.html.erb +17 -0
  141. data/app/views/nodes/edit.rjs +7 -0
  142. data/app/views/nodes/import.rhtml +10 -0
  143. data/app/views/nodes/save_text.rjs +13 -0
  144. data/app/views/nodes/search.rjs +3 -0
  145. data/app/views/nodes/show.rjs +1 -0
  146. data/app/views/nodes/table_update.rjs +8 -0
  147. data/app/views/nodes/update.rjs +29 -0
  148. data/app/views/nodes/zafu.rjs +1 -0
  149. data/app/views/relations/_add.erb +6 -0
  150. data/app/views/relations/_form.erb +43 -0
  151. data/app/views/relations/_li.erb +16 -0
  152. data/app/views/relations/create.rjs +8 -0
  153. data/app/views/relations/destroy.rjs +6 -0
  154. data/app/views/relations/edit.erb +2 -0
  155. data/app/views/relations/index.erb +6 -0
  156. data/app/views/relations/new.erb +2 -0
  157. data/app/views/relations/show.rjs +1 -0
  158. data/app/views/relations/update.rjs +5 -0
  159. data/app/views/search/_form.rhtml +13 -0
  160. data/app/views/sites/_form.erb +37 -0
  161. data/app/views/sites/_li.erb +13 -0
  162. data/app/views/sites/clear_cache.rjs +2 -0
  163. data/app/views/sites/edit.erb +2 -0
  164. data/app/views/sites/index.erb +6 -0
  165. data/app/views/sites/show.rjs +1 -0
  166. data/app/views/sites/update.rjs +5 -0
  167. data/app/views/sites/zena_up.html.erb +11 -0
  168. data/app/views/templates/defaults/+adminLayout.zafu +69 -0
  169. data/app/views/templates/defaults/+login.zafu +32 -0
  170. data/app/views/templates/document_create_tabs/_file.rhtml +13 -0
  171. data/app/views/templates/document_create_tabs/_import.rhtml +9 -0
  172. data/app/views/templates/document_create_tabs/_template.rhtml +22 -0
  173. data/app/views/templates/document_create_tabs/_text_doc.rhtml +14 -0
  174. data/app/views/templates/drive_tabs/_drive.rhtml +11 -0
  175. data/app/views/templates/drive_tabs/_help.rhtml +0 -0
  176. data/app/views/templates/drive_tabs/_links.rhtml +8 -0
  177. data/app/views/templates/edit_tabs/_contact.rhtml +8 -0
  178. data/app/views/templates/edit_tabs/_custom.rhtml +6 -0
  179. data/app/views/templates/edit_tabs/_document.rhtml +8 -0
  180. data/app/views/templates/edit_tabs/_help.rhtml +7 -0
  181. data/app/views/templates/edit_tabs/_image.rhtml +19 -0
  182. data/app/views/templates/edit_tabs/_template.rhtml +8 -0
  183. data/app/views/templates/edit_tabs/_text.rhtml +1 -0
  184. data/app/views/templates/edit_tabs/_textdocument.rhtml +16 -0
  185. data/app/views/templates/edit_tabs/_title.rhtml +27 -0
  186. data/app/views/users/_add.rhtml +6 -0
  187. data/app/views/users/_form.rhtml +49 -0
  188. data/app/views/users/_li.rhtml +18 -0
  189. data/app/views/users/change_info.rjs +7 -0
  190. data/app/views/users/change_password.rjs +7 -0
  191. data/app/views/users/create.rjs +8 -0
  192. data/app/views/users/index.rhtml +7 -0
  193. data/app/views/users/preferences.html.erb +40 -0
  194. data/app/views/users/show.rjs +1 -0
  195. data/app/views/users/update.rjs +16 -0
  196. data/app/views/versions/_li.rhtml +3 -0
  197. data/app/views/versions/_list.rhtml +5 -0
  198. data/app/views/versions/_tr.rhtml +10 -0
  199. data/app/views/versions/backup.rjs +16 -0
  200. data/app/views/versions/css_preview.rjs +2 -0
  201. data/app/views/versions/destroy.rjs +6 -0
  202. data/app/views/versions/diff.rjs +3 -0
  203. data/app/views/versions/edit.rhtml +55 -0
  204. data/app/views/versions/preview.rjs +9 -0
  205. data/app/views/versions/show.rjs +5 -0
  206. data/app/views/versions/update.rjs +9 -0
  207. data/app/views/virtual_classes/_add.erb +6 -0
  208. data/app/views/virtual_classes/_form.erb +30 -0
  209. data/app/views/virtual_classes/_li.erb +12 -0
  210. data/app/views/virtual_classes/create.rjs +8 -0
  211. data/app/views/virtual_classes/destroy.rjs +6 -0
  212. data/app/views/virtual_classes/index.erb +7 -0
  213. data/app/views/virtual_classes/new.erb +2 -0
  214. data/app/views/virtual_classes/show.rjs +1 -0
  215. data/app/views/virtual_classes/update.rjs +5 -0
  216. data/bin/zena +5 -0
  217. data/bricks/captcha/MIT-LICENSE +19 -0
  218. data/bricks/captcha/README +11 -0
  219. data/bricks/captcha/patch/application_controller.rb +10 -0
  220. data/bricks/captcha/patch/application_helper.rb +32 -0
  221. data/bricks/captcha/patch/site.rb +2 -0
  222. data/bricks/captcha/zafu/captcha.rb +29 -0
  223. data/bricks/math/patch/application_helper.rb +95 -0
  224. data/bricks/tags/README +31 -0
  225. data/bricks/tags/lib/has_tags.rb +164 -0
  226. data/bricks/tags/patch/node.rb +15 -0
  227. data/bricks/tags/test/sites/zena/links.yml +11 -0
  228. data/bricks/tags/test/unit/tags_test.rb +103 -0
  229. data/bricks/tags/test/zafu/tags.yml +28 -0
  230. data/bricks/toto.zip +0 -0
  231. data/config/awstats.conf.rhtml +1497 -0
  232. data/config/boot.rb +109 -0
  233. data/config/database.rhtml +25 -0
  234. data/config/database.yml +40 -0
  235. data/config/database_example.yml +27 -0
  236. data/config/deploy.rb +382 -0
  237. data/config/deploy_config_example.rb +7 -0
  238. data/config/environment.rb +13 -0
  239. data/config/environments/development.rb +21 -0
  240. data/config/environments/production.rb +27 -0
  241. data/config/environments/test.rb +22 -0
  242. data/config/gems.yml +46 -0
  243. data/config/httpd.rhtml +18 -0
  244. data/config/initializers/mime_types.rb +10 -0
  245. data/config/initializers/zena.rb +1 -0
  246. data/config/locales/de.yml +120 -0
  247. data/config/locales/fr-CH.yml +123 -0
  248. data/config/locales/fr.yml +123 -0
  249. data/config/mongrel_upload_progress.conf +7 -0
  250. data/config/routes.rb +3 -0
  251. data/config/start.html +44 -0
  252. data/config/stats.vhost.rhtml +40 -0
  253. data/config/vhost.rhtml +84 -0
  254. data/config/vhost_www.rhtml +10 -0
  255. data/config/zena.rb +39 -0
  256. data/db/init/base/help.en.zml +94 -0
  257. data/db/init/base/help.fr.zml +88 -0
  258. data/db/init/base/skins.zml +3 -0
  259. data/db/init/base/skins/default.zml +10 -0
  260. data/db/init/base/skins/default/Node-+adminLayout.zafu +45 -0
  261. data/db/init/base/skins/default/Node-+index.zafu +1 -0
  262. data/db/init/base/skins/default/Node-+login.zafu +25 -0
  263. data/db/init/base/skins/default/Node-+notFound.zafu +14 -0
  264. data/db/init/base/skins/default/Node-+popupLayout.zafu +39 -0
  265. data/db/init/base/skins/default/Node-+search.zafu +20 -0
  266. data/db/init/base/skins/default/Node-tree.zafu +19 -0
  267. data/db/init/base/skins/default/Node.zafu +95 -0
  268. data/db/init/base/skins/default/Project.zafu +8 -0
  269. data/db/init/base/skins/default/favicon.png +0 -0
  270. data/db/init/base/skins/default/notes.zafu +22 -0
  271. data/db/init/base/skins/default/style.css +80 -0
  272. data/db/migrate/001_create_base.rb +156 -0
  273. data/db/migrate/002_add_time_zone_to_users.rb +9 -0
  274. data/db/migrate/003_add_custom_base_flag.rb +11 -0
  275. data/db/migrate/004_rename_template_skin.rb +9 -0
  276. data/db/migrate/005_create_cached_pages.rb +20 -0
  277. data/db/migrate/006_create_sites.rb +60 -0
  278. data/db/migrate/007_replace_id_by_zip.rb +17 -0
  279. data/db/migrate/008_user_status.rb +10 -0
  280. data/db/migrate/009_fulltext.rb +13 -0
  281. data/db/migrate/010_create_template_content.rb +17 -0
  282. data/db/migrate/011_project_to_section.rb +9 -0
  283. data/db/migrate/012_add_project_id.rb +12 -0
  284. data/db/migrate/013_remove_defaults.rb +29 -0
  285. data/db/migrate/014_add_sort_field.rb +10 -0
  286. data/db/migrate/015_add_dyn_attributes.rb +18 -0
  287. data/db/migrate/016_remove_translations.rb +20 -0
  288. data/db/migrate/017_rename_authorize.rb +9 -0
  289. data/db/migrate/018_add_auth_option.rb +9 -0
  290. data/db/migrate/019_remove_user_status.rb +25 -0
  291. data/db/migrate/020_create_participation.rb +30 -0
  292. data/db/migrate/021_create_relations.rb +23 -0
  293. data/db/migrate/022_create_virtual_classes.rb +20 -0
  294. data/db/migrate/023_ip_on_anonymous_comment.rb +9 -0
  295. data/db/migrate/024_correct_vclass_kpath.rb +11 -0
  296. data/db/migrate/025_move_tag_into_vclass.rb +13 -0
  297. data/db/migrate/026_rename_templates.rb +47 -0
  298. data/db/migrate/027_add_country_to_contacts.rb +9 -0
  299. data/db/migrate/028_change_size_of_conten_type_field.rb +9 -0
  300. data/db/migrate/029_create_data_entries.rb +21 -0
  301. data/db/migrate/030_redit_auto_publish_site_settings.rb +13 -0
  302. data/db/migrate/031_create_iformats.rb +21 -0
  303. data/db/migrate/032_caches_context_as_hash.rb +10 -0
  304. data/db/migrate/033_documents_kpath_change.rb +17 -0
  305. data/db/migrate/034_change_file_storage.rb +38 -0
  306. data/db/migrate/035_add_status_to_link.rb +13 -0
  307. data/db/migrate/036_add_flag_fields_on_nodes.rb +11 -0
  308. data/db/migrate/037_add_auto_create_discussion_to_v_class.rb +11 -0
  309. data/db/migrate/038_create_site_attributes.rb +15 -0
  310. data/db/migrate/039_default_position.rb +10 -0
  311. data/db/migrate/040_second_value_for_data_entry.rb +11 -0
  312. data/db/migrate/041_add_attributes_to_v_class.rb +9 -0
  313. data/db/migrate/042_fix_position_should_be_float.rb +8 -0
  314. data/db/migrate/043_move_user_lang_into_participation.rb +15 -0
  315. data/db/migrate/044_remove_monolingual_site_option.rb +9 -0
  316. data/db/migrate/045_avoid_star_in_templates.rb +13 -0
  317. data/db/migrate/046_fix_zazen_image_tag.rb +47 -0
  318. data/db/migrate/047_change_default_link_id_to_zero.rb +12 -0
  319. data/db/migrate/048_link_source_target_can_be_null.rb +11 -0
  320. data/db/migrate/049_fix_publish_from_is_null.rb +9 -0
  321. data/db/migrate/050_date_in_links.rb +9 -0
  322. data/db/migrate/051_add_exif_tags_to_images.rb +9 -0
  323. data/db/migrate/20090825201159_insert_zero_link.rb +8 -0
  324. data/db/migrate/20090825201200_merge_bricks_migrations_with_std_migrations.rb +19 -0
  325. data/db/migrate/20090924141459_zafu_fix_sept09.rb +19 -0
  326. data/db/migrate/20090927125912_allow_null_in_text_fields.rb +17 -0
  327. data/db/migrate/20090928133440_no_more_private_nodes.rb +25 -0
  328. data/db/migrate/20090928143754_version_status_change.rb +24 -0
  329. data/db/migrate/20091001084025_change_status_values_for_comments.rb +22 -0
  330. data/db/migrate/20091009084057_add_vhash_in_node.rb +13 -0
  331. data/db/migrate/20091013100351_rename_publish_group_to_drive_group.rb +12 -0
  332. data/db/migrate/20091014130833_fix_template_title.rb +16 -0
  333. data/db/migrate/20091014183726_merge_participation_into_users.rb +21 -0
  334. data/db/production.sqlite3 +0 -0
  335. data/db/schema.rb +281 -0
  336. data/lib/base_additions.rb +7 -0
  337. data/lib/bricks/patcher.rb +68 -0
  338. data/lib/comment_query.rb +92 -0
  339. data/lib/core_ext/date_time.rb +5 -0
  340. data/lib/core_ext/dir.rb +12 -0
  341. data/lib/core_ext/fixnum.rb +20 -0
  342. data/lib/core_ext/string.rb +74 -0
  343. data/lib/exif_data.rb +54 -0
  344. data/lib/fix_rails_layouts.rb +9 -0
  345. data/lib/gettext_strings.rb +160 -0
  346. data/lib/image_builder.rb +325 -0
  347. data/lib/log_recorder/lib/log_recorder.rb +138 -0
  348. data/lib/log_recorder/test/log_recorder_test.rb +0 -0
  349. data/lib/parser.rb +1 -0
  350. data/lib/tasks/capistrano.rake +99 -0
  351. data/lib/tasks/zena.rake +358 -0
  352. data/lib/tasks/zena.rb +2 -0
  353. data/lib/upload_progress_server.rb +24 -0
  354. data/lib/webdav_adapter.rb +172 -0
  355. data/lib/zafu_parser.rb +3 -0
  356. data/lib/zazen_parser.rb +1 -0
  357. data/lib/zena.rb +398 -0
  358. data/lib/zena/acts/multiversion.rb +755 -0
  359. data/lib/zena/acts/secure.rb +774 -0
  360. data/lib/zena/app.rb +39 -0
  361. data/lib/zena/code_syntax.rb +275 -0
  362. data/lib/zena/controller/test_case.rb +32 -0
  363. data/lib/zena/db.rb +252 -0
  364. data/lib/zena/fix/mysql_connection.rb +17 -0
  365. data/lib/zena/foxy_parser.rb +845 -0
  366. data/lib/zena/migrator.rb +109 -0
  367. data/lib/zena/parser.rb +601 -0
  368. data/lib/zena/parser/zafu_rules.rb +232 -0
  369. data/lib/zena/parser/zafu_tags.rb +197 -0
  370. data/lib/zena/parser/zazen_rules.rb +427 -0
  371. data/lib/zena/parser/zazen_tags.rb +44 -0
  372. data/lib/zena/parser/zena_rules.rb +29 -0
  373. data/lib/zena/parser/zena_tags.rb +3559 -0
  374. data/lib/zena/root.rb +3 -0
  375. data/lib/zena/routes.rb +73 -0
  376. data/lib/zena/test_controller.rb +74 -0
  377. data/lib/zena/unit/test_case.rb +24 -0
  378. data/lib/zena/use/ajax.rb +119 -0
  379. data/lib/zena/use/authentification.rb +120 -0
  380. data/lib/zena/use/calendar.rb +130 -0
  381. data/lib/zena/use/custom_queries/complex.host.yml +173 -0
  382. data/lib/zena/use/dates.rb +230 -0
  383. data/lib/zena/use/dyn_attributes.rb +256 -0
  384. data/lib/zena/use/error_rendering.rb +52 -0
  385. data/lib/zena/use/fixtures.rb +133 -0
  386. data/lib/zena/use/grid.rb +148 -0
  387. data/lib/zena/use/html_tags.rb +603 -0
  388. data/lib/zena/use/i18n.rb +247 -0
  389. data/lib/zena/use/nested_attributes_alias.rb +201 -0
  390. data/lib/zena/use/node_query_finders.rb +491 -0
  391. data/lib/zena/use/refactor.rb +231 -0
  392. data/lib/zena/use/relations.rb +360 -0
  393. data/lib/zena/use/rendering.rb +248 -0
  394. data/lib/zena/use/test_helper.rb +151 -0
  395. data/lib/zena/use/urls.rb +180 -0
  396. data/lib/zena/use/zafu.rb +549 -0
  397. data/lib/zena/use/zazen.rb +230 -0
  398. data/lib/zena/view/test_case.rb +23 -0
  399. data/locale/en/LC_MESSAGES/zena.mo +0 -0
  400. data/locale/en/zena.po +2116 -0
  401. data/locale/fr/LC_MESSAGES/zena.mo +0 -0
  402. data/locale/fr/zena.po +2172 -0
  403. data/locale/zena.pot +1915 -0
  404. data/public/calendar/calendar-brown.css +225 -0
  405. data/public/calendar/calendar-setup.js +153 -0
  406. data/public/calendar/calendar.js +1817 -0
  407. data/public/calendar/iconCalendar.gif +0 -0
  408. data/public/calendar/lang/calendar-en-utf8.js +128 -0
  409. data/public/calendar/lang/calendar-fr-utf8.js +120 -0
  410. data/public/calendar/lang/lang.zip +0 -0
  411. data/public/dispatch.cgi +10 -0
  412. data/public/dispatch.fcgi +24 -0
  413. data/public/dispatch.rb +10 -0
  414. data/public/favicon.ico +0 -0
  415. data/public/images/accept.png +0 -0
  416. data/public/images/action.png +0 -0
  417. data/public/images/add.png +0 -0
  418. data/public/images/ajax-loader.gif +0 -0
  419. data/public/images/anchor.png +0 -0
  420. data/public/images/application.png +0 -0
  421. data/public/images/application_add.png +0 -0
  422. data/public/images/application_cascade.png +0 -0
  423. data/public/images/application_delete.png +0 -0
  424. data/public/images/application_double.png +0 -0
  425. data/public/images/application_edit.png +0 -0
  426. data/public/images/application_error.png +0 -0
  427. data/public/images/application_form.png +0 -0
  428. data/public/images/application_form_add.png +0 -0
  429. data/public/images/application_form_delete.png +0 -0
  430. data/public/images/application_form_edit.png +0 -0
  431. data/public/images/application_form_magnify.png +0 -0
  432. data/public/images/application_get.png +0 -0
  433. data/public/images/application_go.png +0 -0
  434. data/public/images/application_home.png +0 -0
  435. data/public/images/application_key.png +0 -0
  436. data/public/images/application_lightning.png +0 -0
  437. data/public/images/application_link.png +0 -0
  438. data/public/images/application_osx.png +0 -0
  439. data/public/images/application_osx_terminal.png +0 -0
  440. data/public/images/application_put.png +0 -0
  441. data/public/images/application_side_boxes.png +0 -0
  442. data/public/images/application_side_contract.png +0 -0
  443. data/public/images/application_side_expand.png +0 -0
  444. data/public/images/application_side_list.png +0 -0
  445. data/public/images/application_side_tree.png +0 -0
  446. data/public/images/application_split.png +0 -0
  447. data/public/images/application_tile_horizontal.png +0 -0
  448. data/public/images/application_tile_vertical.png +0 -0
  449. data/public/images/application_view_columns.png +0 -0
  450. data/public/images/application_view_detail.png +0 -0
  451. data/public/images/application_view_gallery.png +0 -0
  452. data/public/images/application_view_icons.png +0 -0
  453. data/public/images/application_view_list.png +0 -0
  454. data/public/images/application_view_tile.png +0 -0
  455. data/public/images/application_xp.png +0 -0
  456. data/public/images/application_xp_terminal.png +0 -0
  457. data/public/images/arrow_branch.png +0 -0
  458. data/public/images/arrow_divide.png +0 -0
  459. data/public/images/arrow_down.png +0 -0
  460. data/public/images/arrow_in.png +0 -0
  461. data/public/images/arrow_inout.png +0 -0
  462. data/public/images/arrow_join.png +0 -0
  463. data/public/images/arrow_left.png +0 -0
  464. data/public/images/arrow_merge.png +0 -0
  465. data/public/images/arrow_out.png +0 -0
  466. data/public/images/arrow_redo.png +0 -0
  467. data/public/images/arrow_refresh.png +0 -0
  468. data/public/images/arrow_refresh_small.png +0 -0
  469. data/public/images/arrow_right.png +0 -0
  470. data/public/images/arrow_rotate_anticlockwise.png +0 -0
  471. data/public/images/arrow_rotate_clockwise.png +0 -0
  472. data/public/images/arrow_switch.png +0 -0
  473. data/public/images/arrow_turn_left.png +0 -0
  474. data/public/images/arrow_turn_right.png +0 -0
  475. data/public/images/arrow_undo.png +0 -0
  476. data/public/images/arrow_up.png +0 -0
  477. data/public/images/asterisk_orange.png +0 -0
  478. data/public/images/asterisk_yellow.png +0 -0
  479. data/public/images/attach.png +0 -0
  480. data/public/images/award_star_add.png +0 -0
  481. data/public/images/award_star_bronze_1.png +0 -0
  482. data/public/images/award_star_bronze_2.png +0 -0
  483. data/public/images/award_star_bronze_3.png +0 -0
  484. data/public/images/award_star_delete.png +0 -0
  485. data/public/images/award_star_gold_1.png +0 -0
  486. data/public/images/award_star_gold_2.png +0 -0
  487. data/public/images/award_star_gold_3.png +0 -0
  488. data/public/images/award_star_silver_1.png +0 -0
  489. data/public/images/award_star_silver_2.png +0 -0
  490. data/public/images/award_star_silver_3.png +0 -0
  491. data/public/images/basket.png +0 -0
  492. data/public/images/basket_add.png +0 -0
  493. data/public/images/basket_delete.png +0 -0
  494. data/public/images/basket_edit.png +0 -0
  495. data/public/images/basket_error.png +0 -0
  496. data/public/images/basket_go.png +0 -0
  497. data/public/images/basket_put.png +0 -0
  498. data/public/images/basket_remove.png +0 -0
  499. data/public/images/bell.png +0 -0
  500. data/public/images/bell_add.png +0 -0
  501. data/public/images/bell_delete.png +0 -0
  502. data/public/images/bell_error.png +0 -0
  503. data/public/images/bell_go.png +0 -0
  504. data/public/images/bell_link.png +0 -0
  505. data/public/images/bin.png +0 -0
  506. data/public/images/bin_closed.png +0 -0
  507. data/public/images/bin_empty.gif +0 -0
  508. data/public/images/bin_empty.png +0 -0
  509. data/public/images/bin_full.gif +0 -0
  510. data/public/images/bomb.png +0 -0
  511. data/public/images/book.png +0 -0
  512. data/public/images/book_add.png +0 -0
  513. data/public/images/book_addresses.png +0 -0
  514. data/public/images/book_delete.png +0 -0
  515. data/public/images/book_edit.png +0 -0
  516. data/public/images/book_error.png +0 -0
  517. data/public/images/book_go.png +0 -0
  518. data/public/images/book_key.png +0 -0
  519. data/public/images/book_link.png +0 -0
  520. data/public/images/book_next.png +0 -0
  521. data/public/images/book_open.png +0 -0
  522. data/public/images/book_previous.png +0 -0
  523. data/public/images/box.png +0 -0
  524. data/public/images/brick.png +0 -0
  525. data/public/images/brick_add.png +0 -0
  526. data/public/images/brick_delete.png +0 -0
  527. data/public/images/brick_edit.png +0 -0
  528. data/public/images/brick_error.png +0 -0
  529. data/public/images/brick_go.png +0 -0
  530. data/public/images/brick_link.png +0 -0
  531. data/public/images/bricks.png +0 -0
  532. data/public/images/briefcase.png +0 -0
  533. data/public/images/bug.png +0 -0
  534. data/public/images/bug_add.png +0 -0
  535. data/public/images/bug_delete.png +0 -0
  536. data/public/images/bug_edit.png +0 -0
  537. data/public/images/bug_error.png +0 -0
  538. data/public/images/bug_go.png +0 -0
  539. data/public/images/bug_link.png +0 -0
  540. data/public/images/building.png +0 -0
  541. data/public/images/building_add.png +0 -0
  542. data/public/images/building_delete.png +0 -0
  543. data/public/images/building_edit.png +0 -0
  544. data/public/images/building_error.png +0 -0
  545. data/public/images/building_go.png +0 -0
  546. data/public/images/building_key.png +0 -0
  547. data/public/images/building_link.png +0 -0
  548. data/public/images/bullet_add.png +0 -0
  549. data/public/images/bullet_arrow_bottom.png +0 -0
  550. data/public/images/bullet_arrow_down.png +0 -0
  551. data/public/images/bullet_arrow_top.png +0 -0
  552. data/public/images/bullet_arrow_up.png +0 -0
  553. data/public/images/bullet_black.png +0 -0
  554. data/public/images/bullet_blue.png +0 -0
  555. data/public/images/bullet_delete.png +0 -0
  556. data/public/images/bullet_disk.png +0 -0
  557. data/public/images/bullet_error.png +0 -0
  558. data/public/images/bullet_feed.png +0 -0
  559. data/public/images/bullet_go.png +0 -0
  560. data/public/images/bullet_green.png +0 -0
  561. data/public/images/bullet_key.png +0 -0
  562. data/public/images/bullet_orange.png +0 -0
  563. data/public/images/bullet_picture.png +0 -0
  564. data/public/images/bullet_pink.png +0 -0
  565. data/public/images/bullet_purple.png +0 -0
  566. data/public/images/bullet_red.png +0 -0
  567. data/public/images/bullet_star.png +0 -0
  568. data/public/images/bullet_toggle_minus.png +0 -0
  569. data/public/images/bullet_toggle_plus.png +0 -0
  570. data/public/images/bullet_white.png +0 -0
  571. data/public/images/bullet_wrench.png +0 -0
  572. data/public/images/bullet_yellow.png +0 -0
  573. data/public/images/cake.png +0 -0
  574. data/public/images/calculator.png +0 -0
  575. data/public/images/calculator_add.png +0 -0
  576. data/public/images/calculator_delete.png +0 -0
  577. data/public/images/calculator_edit.png +0 -0
  578. data/public/images/calculator_error.png +0 -0
  579. data/public/images/calculator_link.png +0 -0
  580. data/public/images/calendar.png +0 -0
  581. data/public/images/calendar_add.png +0 -0
  582. data/public/images/calendar_delete.png +0 -0
  583. data/public/images/calendar_edit.png +0 -0
  584. data/public/images/calendar_link.png +0 -0
  585. data/public/images/calendar_view_day.png +0 -0
  586. data/public/images/calendar_view_month.png +0 -0
  587. data/public/images/calendar_view_week.png +0 -0
  588. data/public/images/camera.png +0 -0
  589. data/public/images/camera_add.png +0 -0
  590. data/public/images/camera_delete.png +0 -0
  591. data/public/images/camera_edit.png +0 -0
  592. data/public/images/camera_error.png +0 -0
  593. data/public/images/camera_go.png +0 -0
  594. data/public/images/camera_link.png +0 -0
  595. data/public/images/camera_small.png +0 -0
  596. data/public/images/cancel.png +0 -0
  597. data/public/images/car.png +0 -0
  598. data/public/images/car_add.png +0 -0
  599. data/public/images/car_delete.png +0 -0
  600. data/public/images/cart.png +0 -0
  601. data/public/images/cart_add.png +0 -0
  602. data/public/images/cart_delete.png +0 -0
  603. data/public/images/cart_edit.png +0 -0
  604. data/public/images/cart_error.png +0 -0
  605. data/public/images/cart_go.png +0 -0
  606. data/public/images/cart_put.png +0 -0
  607. data/public/images/cart_remove.png +0 -0
  608. data/public/images/cd.png +0 -0
  609. data/public/images/cd_add.png +0 -0
  610. data/public/images/cd_burn.png +0 -0
  611. data/public/images/cd_delete.png +0 -0
  612. data/public/images/cd_edit.png +0 -0
  613. data/public/images/cd_eject.png +0 -0
  614. data/public/images/cd_go.png +0 -0
  615. data/public/images/chart_bar.png +0 -0
  616. data/public/images/chart_bar_add.png +0 -0
  617. data/public/images/chart_bar_delete.png +0 -0
  618. data/public/images/chart_bar_edit.png +0 -0
  619. data/public/images/chart_bar_error.png +0 -0
  620. data/public/images/chart_bar_link.png +0 -0
  621. data/public/images/chart_curve.png +0 -0
  622. data/public/images/chart_curve_add.png +0 -0
  623. data/public/images/chart_curve_delete.png +0 -0
  624. data/public/images/chart_curve_edit.png +0 -0
  625. data/public/images/chart_curve_error.png +0 -0
  626. data/public/images/chart_curve_go.png +0 -0
  627. data/public/images/chart_curve_link.png +0 -0
  628. data/public/images/chart_line.png +0 -0
  629. data/public/images/chart_line_add.png +0 -0
  630. data/public/images/chart_line_delete.png +0 -0
  631. data/public/images/chart_line_edit.png +0 -0
  632. data/public/images/chart_line_error.png +0 -0
  633. data/public/images/chart_line_link.png +0 -0
  634. data/public/images/chart_organisation.png +0 -0
  635. data/public/images/chart_organisation_add.png +0 -0
  636. data/public/images/chart_organisation_delete.png +0 -0
  637. data/public/images/chart_pie.png +0 -0
  638. data/public/images/chart_pie_add.png +0 -0
  639. data/public/images/chart_pie_delete.png +0 -0
  640. data/public/images/chart_pie_edit.png +0 -0
  641. data/public/images/chart_pie_error.png +0 -0
  642. data/public/images/chart_pie_link.png +0 -0
  643. data/public/images/clock.png +0 -0
  644. data/public/images/clock_add.png +0 -0
  645. data/public/images/clock_delete.png +0 -0
  646. data/public/images/clock_edit.png +0 -0
  647. data/public/images/clock_error.png +0 -0
  648. data/public/images/clock_go.png +0 -0
  649. data/public/images/clock_link.png +0 -0
  650. data/public/images/clock_pause.png +0 -0
  651. data/public/images/clock_play.png +0 -0
  652. data/public/images/clock_red.png +0 -0
  653. data/public/images/clock_stop.png +0 -0
  654. data/public/images/cog.png +0 -0
  655. data/public/images/cog_add.png +0 -0
  656. data/public/images/cog_delete.png +0 -0
  657. data/public/images/cog_edit.png +0 -0
  658. data/public/images/cog_error.png +0 -0
  659. data/public/images/cog_go.png +0 -0
  660. data/public/images/coins.png +0 -0
  661. data/public/images/coins_add.png +0 -0
  662. data/public/images/coins_delete.png +0 -0
  663. data/public/images/collection.png +0 -0
  664. data/public/images/color_swatch.png +0 -0
  665. data/public/images/color_wheel.png +0 -0
  666. data/public/images/column_add.png +0 -0
  667. data/public/images/column_delete.png +0 -0
  668. data/public/images/comment.png +0 -0
  669. data/public/images/comment_add.png +0 -0
  670. data/public/images/comment_delete.png +0 -0
  671. data/public/images/comment_edit.png +0 -0
  672. data/public/images/comments.png +0 -0
  673. data/public/images/comments_add.png +0 -0
  674. data/public/images/comments_delete.png +0 -0
  675. data/public/images/comments_red.png +0 -0
  676. data/public/images/compress.png +0 -0
  677. data/public/images/computer.png +0 -0
  678. data/public/images/computer_add.png +0 -0
  679. data/public/images/computer_delete.png +0 -0
  680. data/public/images/computer_edit.png +0 -0
  681. data/public/images/computer_error.png +0 -0
  682. data/public/images/computer_go.png +0 -0
  683. data/public/images/computer_key.png +0 -0
  684. data/public/images/computer_link.png +0 -0
  685. data/public/images/connect.png +0 -0
  686. data/public/images/contrast.png +0 -0
  687. data/public/images/contrast_decrease.png +0 -0
  688. data/public/images/contrast_high.png +0 -0
  689. data/public/images/contrast_increase.png +0 -0
  690. data/public/images/contrast_low.png +0 -0
  691. data/public/images/control_eject.png +0 -0
  692. data/public/images/control_eject_blue.png +0 -0
  693. data/public/images/control_end.png +0 -0
  694. data/public/images/control_end_blue.png +0 -0
  695. data/public/images/control_equalizer.png +0 -0
  696. data/public/images/control_equalizer_blue.png +0 -0
  697. data/public/images/control_fastforward.png +0 -0
  698. data/public/images/control_fastforward_blue.png +0 -0
  699. data/public/images/control_pause.png +0 -0
  700. data/public/images/control_pause_blue.png +0 -0
  701. data/public/images/control_play.png +0 -0
  702. data/public/images/control_play_blue.png +0 -0
  703. data/public/images/control_repeat.png +0 -0
  704. data/public/images/control_repeat_blue.png +0 -0
  705. data/public/images/control_rewind.png +0 -0
  706. data/public/images/control_rewind_blue.png +0 -0
  707. data/public/images/control_start.png +0 -0
  708. data/public/images/control_start_blue.png +0 -0
  709. data/public/images/control_stop.png +0 -0
  710. data/public/images/control_stop_blue.png +0 -0
  711. data/public/images/controller.png +0 -0
  712. data/public/images/controller_add.png +0 -0
  713. data/public/images/controller_delete.png +0 -0
  714. data/public/images/controller_error.png +0 -0
  715. data/public/images/creditcards.png +0 -0
  716. data/public/images/cross.png +0 -0
  717. data/public/images/css.png +0 -0
  718. data/public/images/css_add.png +0 -0
  719. data/public/images/css_delete.png +0 -0
  720. data/public/images/css_go.png +0 -0
  721. data/public/images/css_valid.png +0 -0
  722. data/public/images/cup.png +0 -0
  723. data/public/images/cup_add.png +0 -0
  724. data/public/images/cup_delete.png +0 -0
  725. data/public/images/cup_edit.png +0 -0
  726. data/public/images/cup_error.png +0 -0
  727. data/public/images/cup_go.png +0 -0
  728. data/public/images/cup_key.png +0 -0
  729. data/public/images/cup_link.png +0 -0
  730. data/public/images/cursor.png +0 -0
  731. data/public/images/cut.png +0 -0
  732. data/public/images/cut_red.png +0 -0
  733. data/public/images/database.png +0 -0
  734. data/public/images/database_add.png +0 -0
  735. data/public/images/database_connect.png +0 -0
  736. data/public/images/database_delete.png +0 -0
  737. data/public/images/database_edit.png +0 -0
  738. data/public/images/database_error.png +0 -0
  739. data/public/images/database_gear.png +0 -0
  740. data/public/images/database_go.png +0 -0
  741. data/public/images/database_key.png +0 -0
  742. data/public/images/database_lightning.png +0 -0
  743. data/public/images/database_link.png +0 -0
  744. data/public/images/database_refresh.png +0 -0
  745. data/public/images/database_save.png +0 -0
  746. data/public/images/database_table.png +0 -0
  747. data/public/images/date.png +0 -0
  748. data/public/images/date_add.png +0 -0
  749. data/public/images/date_delete.png +0 -0
  750. data/public/images/date_edit.png +0 -0
  751. data/public/images/date_error.png +0 -0
  752. data/public/images/date_go.png +0 -0
  753. data/public/images/date_link.png +0 -0
  754. data/public/images/date_magnify.png +0 -0
  755. data/public/images/date_next.png +0 -0
  756. data/public/images/date_previous.png +0 -0
  757. data/public/images/delete.png +0 -0
  758. data/public/images/disconnect.png +0 -0
  759. data/public/images/disk.png +0 -0
  760. data/public/images/disk_multiple.png +0 -0
  761. data/public/images/door.png +0 -0
  762. data/public/images/door_in.png +0 -0
  763. data/public/images/door_open.png +0 -0
  764. data/public/images/door_out.png +0 -0
  765. data/public/images/drink.png +0 -0
  766. data/public/images/drink_empty.png +0 -0
  767. data/public/images/drive.png +0 -0
  768. data/public/images/drive_add.png +0 -0
  769. data/public/images/drive_burn.png +0 -0
  770. data/public/images/drive_cd.png +0 -0
  771. data/public/images/drive_cd_empty.png +0 -0
  772. data/public/images/drive_delete.png +0 -0
  773. data/public/images/drive_disk.png +0 -0
  774. data/public/images/drive_edit.png +0 -0
  775. data/public/images/drive_error.png +0 -0
  776. data/public/images/drive_go.png +0 -0
  777. data/public/images/drive_key.png +0 -0
  778. data/public/images/drive_link.png +0 -0
  779. data/public/images/drive_magnify.png +0 -0
  780. data/public/images/drive_network.png +0 -0
  781. data/public/images/drive_rename.png +0 -0
  782. data/public/images/drive_user.png +0 -0
  783. data/public/images/drive_web.png +0 -0
  784. data/public/images/dvd.png +0 -0
  785. data/public/images/dvd_add.png +0 -0
  786. data/public/images/dvd_delete.png +0 -0
  787. data/public/images/dvd_edit.png +0 -0
  788. data/public/images/dvd_error.png +0 -0
  789. data/public/images/dvd_go.png +0 -0
  790. data/public/images/dvd_key.png +0 -0
  791. data/public/images/dvd_link.png +0 -0
  792. data/public/images/email.png +0 -0
  793. data/public/images/email_add.png +0 -0
  794. data/public/images/email_attach.png +0 -0
  795. data/public/images/email_delete.png +0 -0
  796. data/public/images/email_edit.png +0 -0
  797. data/public/images/email_error.png +0 -0
  798. data/public/images/email_go.png +0 -0
  799. data/public/images/email_link.png +0 -0
  800. data/public/images/email_open.png +0 -0
  801. data/public/images/email_open_image.png +0 -0
  802. data/public/images/emoticon_evilgrin.png +0 -0
  803. data/public/images/emoticon_grin.png +0 -0
  804. data/public/images/emoticon_happy.png +0 -0
  805. data/public/images/emoticon_smile.png +0 -0
  806. data/public/images/emoticon_surprised.png +0 -0
  807. data/public/images/emoticon_tongue.png +0 -0
  808. data/public/images/emoticon_unhappy.png +0 -0
  809. data/public/images/emoticon_waii.png +0 -0
  810. data/public/images/emoticon_wink.png +0 -0
  811. data/public/images/error.png +0 -0
  812. data/public/images/error_add.png +0 -0
  813. data/public/images/error_delete.png +0 -0
  814. data/public/images/error_go.png +0 -0
  815. data/public/images/exclamation.png +0 -0
  816. data/public/images/ext/contact.png +0 -0
  817. data/public/images/ext/contact_pv.png +0 -0
  818. data/public/images/ext/doc.png +0 -0
  819. data/public/images/ext/doc_tiny.png +0 -0
  820. data/public/images/ext/jpg.png +0 -0
  821. data/public/images/ext/jpg_tiny.png +0 -0
  822. data/public/images/ext/other.png +0 -0
  823. data/public/images/ext/other_pv.png +0 -0
  824. data/public/images/ext/other_tiny.png +0 -0
  825. data/public/images/ext/page.png +0 -0
  826. data/public/images/ext/page_pv.png +0 -0
  827. data/public/images/ext/page_tiny.png +0 -0
  828. data/public/images/ext/pdf.png +0 -0
  829. data/public/images/ext/pdf_pv.png +0 -0
  830. data/public/images/ext/pdf_tiny.png +0 -0
  831. data/public/images/ext/png.png +0 -0
  832. data/public/images/ext/png_tiny.png +0 -0
  833. data/public/images/ext/post.png +0 -0
  834. data/public/images/ext/post_pv.png +0 -0
  835. data/public/images/ext/post_tiny.png +0 -0
  836. data/public/images/ext/project.png +0 -0
  837. data/public/images/ext/project_pv.png +0 -0
  838. data/public/images/ext/project_tiny.png +0 -0
  839. data/public/images/ext/rtf.png +0 -0
  840. data/public/images/ext/rtf_tiny.png +0 -0
  841. data/public/images/ext/tag.png +0 -0
  842. data/public/images/ext/tag_pv.png +0 -0
  843. data/public/images/ext/xls.png +0 -0
  844. data/public/images/ext/xls_tiny.png +0 -0
  845. data/public/images/ext/zip.png +0 -0
  846. data/public/images/ext/zip_pv.png +0 -0
  847. data/public/images/ext/zip_tiny.png +0 -0
  848. data/public/images/eye.png +0 -0
  849. data/public/images/feed.png +0 -0
  850. data/public/images/feed_add.png +0 -0
  851. data/public/images/feed_delete.png +0 -0
  852. data/public/images/feed_disk.png +0 -0
  853. data/public/images/feed_edit.png +0 -0
  854. data/public/images/feed_error.png +0 -0
  855. data/public/images/feed_go.png +0 -0
  856. data/public/images/feed_key.png +0 -0
  857. data/public/images/feed_link.png +0 -0
  858. data/public/images/feed_magnify.png +0 -0
  859. data/public/images/female.png +0 -0
  860. data/public/images/film.png +0 -0
  861. data/public/images/film_add.png +0 -0
  862. data/public/images/film_delete.png +0 -0
  863. data/public/images/film_edit.png +0 -0
  864. data/public/images/film_error.png +0 -0
  865. data/public/images/film_go.png +0 -0
  866. data/public/images/film_key.png +0 -0
  867. data/public/images/film_link.png +0 -0
  868. data/public/images/film_save.png +0 -0
  869. data/public/images/find.png +0 -0
  870. data/public/images/flag_blue.png +0 -0
  871. data/public/images/flag_green.png +0 -0
  872. data/public/images/flag_orange.png +0 -0
  873. data/public/images/flag_pink.png +0 -0
  874. data/public/images/flag_purple.png +0 -0
  875. data/public/images/flag_red.png +0 -0
  876. data/public/images/flag_yellow.png +0 -0
  877. data/public/images/folder.png +0 -0
  878. data/public/images/folder_add.png +0 -0
  879. data/public/images/folder_bell.png +0 -0
  880. data/public/images/folder_brick.png +0 -0
  881. data/public/images/folder_bug.png +0 -0
  882. data/public/images/folder_camera.png +0 -0
  883. data/public/images/folder_database.png +0 -0
  884. data/public/images/folder_delete.png +0 -0
  885. data/public/images/folder_edit.png +0 -0
  886. data/public/images/folder_error.png +0 -0
  887. data/public/images/folder_explore.png +0 -0
  888. data/public/images/folder_feed.png +0 -0
  889. data/public/images/folder_find.png +0 -0
  890. data/public/images/folder_go.png +0 -0
  891. data/public/images/folder_heart.png +0 -0
  892. data/public/images/folder_image.png +0 -0
  893. data/public/images/folder_key.png +0 -0
  894. data/public/images/folder_lightbulb.png +0 -0
  895. data/public/images/folder_link.png +0 -0
  896. data/public/images/folder_magnify.png +0 -0
  897. data/public/images/folder_page.png +0 -0
  898. data/public/images/folder_page_white.png +0 -0
  899. data/public/images/folder_palette.png +0 -0
  900. data/public/images/folder_picture.png +0 -0
  901. data/public/images/folder_star.png +0 -0
  902. data/public/images/folder_table.png +0 -0
  903. data/public/images/folder_user.png +0 -0
  904. data/public/images/folder_wrench.png +0 -0
  905. data/public/images/font.png +0 -0
  906. data/public/images/font_add.png +0 -0
  907. data/public/images/font_delete.png +0 -0
  908. data/public/images/font_go.png +0 -0
  909. data/public/images/group.png +0 -0
  910. data/public/images/group_add.png +0 -0
  911. data/public/images/group_admin.png +0 -0
  912. data/public/images/group_delete.png +0 -0
  913. data/public/images/group_edit.png +0 -0
  914. data/public/images/group_error.png +0 -0
  915. data/public/images/group_gear.png +0 -0
  916. data/public/images/group_go.png +0 -0
  917. data/public/images/group_key.png +0 -0
  918. data/public/images/group_link.png +0 -0
  919. data/public/images/group_pub.png +0 -0
  920. data/public/images/group_site.png +0 -0
  921. data/public/images/heart.png +0 -0
  922. data/public/images/heart_add.png +0 -0
  923. data/public/images/heart_delete.png +0 -0
  924. data/public/images/help.png +0 -0
  925. data/public/images/home.png +0 -0
  926. data/public/images/hourglass.png +0 -0
  927. data/public/images/hourglass_add.png +0 -0
  928. data/public/images/hourglass_delete.png +0 -0
  929. data/public/images/hourglass_go.png +0 -0
  930. data/public/images/hourglass_link.png +0 -0
  931. data/public/images/house.png +0 -0
  932. data/public/images/house_go.png +0 -0
  933. data/public/images/house_link.png +0 -0
  934. data/public/images/html.png +0 -0
  935. data/public/images/html_add.png +0 -0
  936. data/public/images/html_delete.png +0 -0
  937. data/public/images/html_go.png +0 -0
  938. data/public/images/html_valid.png +0 -0
  939. data/public/images/image.png +0 -0
  940. data/public/images/image_add.png +0 -0
  941. data/public/images/image_delete.png +0 -0
  942. data/public/images/image_edit.png +0 -0
  943. data/public/images/image_link.png +0 -0
  944. data/public/images/images.png +0 -0
  945. data/public/images/img_not_found.png +0 -0
  946. data/public/images/information.png +0 -0
  947. data/public/images/ipod.png +0 -0
  948. data/public/images/ipod_cast.png +0 -0
  949. data/public/images/ipod_cast_add.png +0 -0
  950. data/public/images/ipod_cast_delete.png +0 -0
  951. data/public/images/ipod_sound.png +0 -0
  952. data/public/images/joystick.png +0 -0
  953. data/public/images/joystick_add.png +0 -0
  954. data/public/images/joystick_delete.png +0 -0
  955. data/public/images/joystick_error.png +0 -0
  956. data/public/images/key.png +0 -0
  957. data/public/images/key_add.png +0 -0
  958. data/public/images/key_delete.png +0 -0
  959. data/public/images/key_go.png +0 -0
  960. data/public/images/keyboard.png +0 -0
  961. data/public/images/keyboard_add.png +0 -0
  962. data/public/images/keyboard_delete.png +0 -0
  963. data/public/images/keyboard_magnify.png +0 -0
  964. data/public/images/latex_error.png +0 -0
  965. data/public/images/layers.png +0 -0
  966. data/public/images/layout.png +0 -0
  967. data/public/images/layout_add.png +0 -0
  968. data/public/images/layout_content.png +0 -0
  969. data/public/images/layout_delete.png +0 -0
  970. data/public/images/layout_edit.png +0 -0
  971. data/public/images/layout_error.png +0 -0
  972. data/public/images/layout_header.png +0 -0
  973. data/public/images/layout_link.png +0 -0
  974. data/public/images/layout_sidebar.png +0 -0
  975. data/public/images/lightbulb.png +0 -0
  976. data/public/images/lightbulb_add.png +0 -0
  977. data/public/images/lightbulb_delete.png +0 -0
  978. data/public/images/lightbulb_off.png +0 -0
  979. data/public/images/lightning.png +0 -0
  980. data/public/images/lightning_add.png +0 -0
  981. data/public/images/lightning_delete.png +0 -0
  982. data/public/images/lightning_go.png +0 -0
  983. data/public/images/link.png +0 -0
  984. data/public/images/link_add.png +0 -0
  985. data/public/images/link_break.png +0 -0
  986. data/public/images/link_delete.png +0 -0
  987. data/public/images/link_edit.png +0 -0
  988. data/public/images/link_error.png +0 -0
  989. data/public/images/link_go.png +0 -0
  990. data/public/images/lock.png +0 -0
  991. data/public/images/lock_add.png +0 -0
  992. data/public/images/lock_break.png +0 -0
  993. data/public/images/lock_delete.png +0 -0
  994. data/public/images/lock_edit.png +0 -0
  995. data/public/images/lock_go.png +0 -0
  996. data/public/images/lock_open.png +0 -0
  997. data/public/images/lorry.png +0 -0
  998. data/public/images/lorry_add.png +0 -0
  999. data/public/images/lorry_delete.png +0 -0
  1000. data/public/images/lorry_error.png +0 -0
  1001. data/public/images/lorry_flatbed.png +0 -0
  1002. data/public/images/lorry_go.png +0 -0
  1003. data/public/images/lorry_link.png +0 -0
  1004. data/public/images/magifier_zoom_out.png +0 -0
  1005. data/public/images/magnifier.png +0 -0
  1006. data/public/images/magnifier_zoom_in.png +0 -0
  1007. data/public/images/male.png +0 -0
  1008. data/public/images/map.png +0 -0
  1009. data/public/images/map_add.png +0 -0
  1010. data/public/images/map_delete.png +0 -0
  1011. data/public/images/map_edit.png +0 -0
  1012. data/public/images/map_go.png +0 -0
  1013. data/public/images/map_magnify.png +0 -0
  1014. data/public/images/medal_bronze_1.png +0 -0
  1015. data/public/images/medal_bronze_2.png +0 -0
  1016. data/public/images/medal_bronze_3.png +0 -0
  1017. data/public/images/medal_bronze_add.png +0 -0
  1018. data/public/images/medal_bronze_delete.png +0 -0
  1019. data/public/images/medal_gold_1.png +0 -0
  1020. data/public/images/medal_gold_2.png +0 -0
  1021. data/public/images/medal_gold_3.png +0 -0
  1022. data/public/images/medal_gold_add.png +0 -0
  1023. data/public/images/medal_gold_delete.png +0 -0
  1024. data/public/images/medal_silver_1.png +0 -0
  1025. data/public/images/medal_silver_2.png +0 -0
  1026. data/public/images/medal_silver_3.png +0 -0
  1027. data/public/images/medal_silver_add.png +0 -0
  1028. data/public/images/medal_silver_delete.png +0 -0
  1029. data/public/images/money.png +0 -0
  1030. data/public/images/money_add.png +0 -0
  1031. data/public/images/money_delete.png +0 -0
  1032. data/public/images/money_dollar.png +0 -0
  1033. data/public/images/money_euro.png +0 -0
  1034. data/public/images/money_pound.png +0 -0
  1035. data/public/images/money_yen.png +0 -0
  1036. data/public/images/monitor.png +0 -0
  1037. data/public/images/monitor_add.png +0 -0
  1038. data/public/images/monitor_delete.png +0 -0
  1039. data/public/images/monitor_edit.png +0 -0
  1040. data/public/images/monitor_error.png +0 -0
  1041. data/public/images/monitor_go.png +0 -0
  1042. data/public/images/monitor_lightning.png +0 -0
  1043. data/public/images/monitor_link.png +0 -0
  1044. data/public/images/mouse.png +0 -0
  1045. data/public/images/mouse_add.png +0 -0
  1046. data/public/images/mouse_delete.png +0 -0
  1047. data/public/images/mouse_error.png +0 -0
  1048. data/public/images/music.png +0 -0
  1049. data/public/images/new.png +0 -0
  1050. data/public/images/newspaper.png +0 -0
  1051. data/public/images/newspaper_add.png +0 -0
  1052. data/public/images/newspaper_delete.png +0 -0
  1053. data/public/images/newspaper_go.png +0 -0
  1054. data/public/images/newspaper_link.png +0 -0
  1055. data/public/images/note.png +0 -0
  1056. data/public/images/note_add.png +0 -0
  1057. data/public/images/note_delete.png +0 -0
  1058. data/public/images/note_edit.png +0 -0
  1059. data/public/images/note_error.png +0 -0
  1060. data/public/images/note_go.png +0 -0
  1061. data/public/images/overlays.png +0 -0
  1062. data/public/images/package.png +0 -0
  1063. data/public/images/package_add.png +0 -0
  1064. data/public/images/package_delete.png +0 -0
  1065. data/public/images/package_go.png +0 -0
  1066. data/public/images/package_green.png +0 -0
  1067. data/public/images/package_link.png +0 -0
  1068. data/public/images/page.png +0 -0
  1069. data/public/images/page_add.png +0 -0
  1070. data/public/images/page_attach.png +0 -0
  1071. data/public/images/page_code.png +0 -0
  1072. data/public/images/page_copy.png +0 -0
  1073. data/public/images/page_delete.png +0 -0
  1074. data/public/images/page_edit.png +0 -0
  1075. data/public/images/page_error.png +0 -0
  1076. data/public/images/page_excel.png +0 -0
  1077. data/public/images/page_find.png +0 -0
  1078. data/public/images/page_gear.png +0 -0
  1079. data/public/images/page_go.png +0 -0
  1080. data/public/images/page_green.png +0 -0
  1081. data/public/images/page_key.png +0 -0
  1082. data/public/images/page_lightning.png +0 -0
  1083. data/public/images/page_link.png +0 -0
  1084. data/public/images/page_paintbrush.png +0 -0
  1085. data/public/images/page_paste.png +0 -0
  1086. data/public/images/page_red.png +0 -0
  1087. data/public/images/page_refresh.png +0 -0
  1088. data/public/images/page_save.png +0 -0
  1089. data/public/images/page_white.png +0 -0
  1090. data/public/images/page_white_acrobat.png +0 -0
  1091. data/public/images/page_white_actionscript.png +0 -0
  1092. data/public/images/page_white_add.png +0 -0
  1093. data/public/images/page_white_c.png +0 -0
  1094. data/public/images/page_white_camera.png +0 -0
  1095. data/public/images/page_white_cd.png +0 -0
  1096. data/public/images/page_white_code.png +0 -0
  1097. data/public/images/page_white_code_red.png +0 -0
  1098. data/public/images/page_white_coldfusion.png +0 -0
  1099. data/public/images/page_white_compressed.png +0 -0
  1100. data/public/images/page_white_copy.png +0 -0
  1101. data/public/images/page_white_cplusplus.png +0 -0
  1102. data/public/images/page_white_csharp.png +0 -0
  1103. data/public/images/page_white_cup.png +0 -0
  1104. data/public/images/page_white_database.png +0 -0
  1105. data/public/images/page_white_delete.png +0 -0
  1106. data/public/images/page_white_dvd.png +0 -0
  1107. data/public/images/page_white_edit.png +0 -0
  1108. data/public/images/page_white_error.png +0 -0
  1109. data/public/images/page_white_excel.png +0 -0
  1110. data/public/images/page_white_find.png +0 -0
  1111. data/public/images/page_white_flash.png +0 -0
  1112. data/public/images/page_white_freehand.png +0 -0
  1113. data/public/images/page_white_gear.png +0 -0
  1114. data/public/images/page_white_get.png +0 -0
  1115. data/public/images/page_white_go.png +0 -0
  1116. data/public/images/page_white_h.png +0 -0
  1117. data/public/images/page_white_horizontal.png +0 -0
  1118. data/public/images/page_white_key.png +0 -0
  1119. data/public/images/page_white_lightning.png +0 -0
  1120. data/public/images/page_white_link.png +0 -0
  1121. data/public/images/page_white_magnify.png +0 -0
  1122. data/public/images/page_white_medal.png +0 -0
  1123. data/public/images/page_white_office.png +0 -0
  1124. data/public/images/page_white_paint.png +0 -0
  1125. data/public/images/page_white_paintbrush.png +0 -0
  1126. data/public/images/page_white_paste.png +0 -0
  1127. data/public/images/page_white_php.png +0 -0
  1128. data/public/images/page_white_picture.png +0 -0
  1129. data/public/images/page_white_powerpoint.png +0 -0
  1130. data/public/images/page_white_put.png +0 -0
  1131. data/public/images/page_white_ruby.png +0 -0
  1132. data/public/images/page_white_stack.png +0 -0
  1133. data/public/images/page_white_star.png +0 -0
  1134. data/public/images/page_white_swoosh.png +0 -0
  1135. data/public/images/page_white_text.png +0 -0
  1136. data/public/images/page_white_text_width.png +0 -0
  1137. data/public/images/page_white_tux.png +0 -0
  1138. data/public/images/page_white_vector.png +0 -0
  1139. data/public/images/page_white_visualstudio.png +0 -0
  1140. data/public/images/page_white_width.png +0 -0
  1141. data/public/images/page_white_word.png +0 -0
  1142. data/public/images/page_white_world.png +0 -0
  1143. data/public/images/page_white_wrench.png +0 -0
  1144. data/public/images/page_white_zip.png +0 -0
  1145. data/public/images/page_word.png +0 -0
  1146. data/public/images/page_world.png +0 -0
  1147. data/public/images/paintbrush.png +0 -0
  1148. data/public/images/paintcan.png +0 -0
  1149. data/public/images/palette.png +0 -0
  1150. data/public/images/paste_plain.png +0 -0
  1151. data/public/images/paste_word.png +0 -0
  1152. data/public/images/pencil.png +0 -0
  1153. data/public/images/pencil_add.png +0 -0
  1154. data/public/images/pencil_delete.png +0 -0
  1155. data/public/images/pencil_go.png +0 -0
  1156. data/public/images/phone.png +0 -0
  1157. data/public/images/phone_add.png +0 -0
  1158. data/public/images/phone_delete.png +0 -0
  1159. data/public/images/phone_sound.png +0 -0
  1160. data/public/images/photo.png +0 -0
  1161. data/public/images/photo_add.png +0 -0
  1162. data/public/images/photo_blue.png +0 -0
  1163. data/public/images/photo_delete.png +0 -0
  1164. data/public/images/photo_grey.png +0 -0
  1165. data/public/images/photo_link.png +0 -0
  1166. data/public/images/photos.png +0 -0
  1167. data/public/images/picture.png +0 -0
  1168. data/public/images/picture_add.png +0 -0
  1169. data/public/images/picture_delete.png +0 -0
  1170. data/public/images/picture_edit.png +0 -0
  1171. data/public/images/picture_empty.png +0 -0
  1172. data/public/images/picture_error.png +0 -0
  1173. data/public/images/picture_go.png +0 -0
  1174. data/public/images/picture_key.png +0 -0
  1175. data/public/images/picture_link.png +0 -0
  1176. data/public/images/picture_save.png +0 -0
  1177. data/public/images/pictures.png +0 -0
  1178. data/public/images/pilcrow.png +0 -0
  1179. data/public/images/pill.png +0 -0
  1180. data/public/images/pill_add.png +0 -0
  1181. data/public/images/pill_delete.png +0 -0
  1182. data/public/images/pill_go.png +0 -0
  1183. data/public/images/plugin.png +0 -0
  1184. data/public/images/plugin_add.png +0 -0
  1185. data/public/images/plugin_delete.png +0 -0
  1186. data/public/images/plugin_disabled.png +0 -0
  1187. data/public/images/plugin_edit.png +0 -0
  1188. data/public/images/plugin_error.png +0 -0
  1189. data/public/images/plugin_go.png +0 -0
  1190. data/public/images/plugin_link.png +0 -0
  1191. data/public/images/printer.png +0 -0
  1192. data/public/images/printer_add.png +0 -0
  1193. data/public/images/printer_delete.png +0 -0
  1194. data/public/images/printer_empty.png +0 -0
  1195. data/public/images/printer_error.png +0 -0
  1196. data/public/images/project.png +0 -0
  1197. data/public/images/rails.png +0 -0
  1198. data/public/images/rainbow.png +0 -0
  1199. data/public/images/report.png +0 -0
  1200. data/public/images/report_add.png +0 -0
  1201. data/public/images/report_delete.png +0 -0
  1202. data/public/images/report_disk.png +0 -0
  1203. data/public/images/report_edit.png +0 -0
  1204. data/public/images/report_go.png +0 -0
  1205. data/public/images/report_key.png +0 -0
  1206. data/public/images/report_link.png +0 -0
  1207. data/public/images/report_magnify.png +0 -0
  1208. data/public/images/report_picture.png +0 -0
  1209. data/public/images/report_user.png +0 -0
  1210. data/public/images/report_word.png +0 -0
  1211. data/public/images/resultset_first.png +0 -0
  1212. data/public/images/resultset_last.png +0 -0
  1213. data/public/images/resultset_next.png +0 -0
  1214. data/public/images/resultset_previous.png +0 -0
  1215. data/public/images/rosette.png +0 -0
  1216. data/public/images/row_add.png +0 -0
  1217. data/public/images/row_delete.png +0 -0
  1218. data/public/images/rss.png +0 -0
  1219. data/public/images/rss_add.png +0 -0
  1220. data/public/images/rss_delete.png +0 -0
  1221. data/public/images/rss_go.png +0 -0
  1222. data/public/images/rss_valid.png +0 -0
  1223. data/public/images/ruby.png +0 -0
  1224. data/public/images/ruby_add.png +0 -0
  1225. data/public/images/ruby_delete.png +0 -0
  1226. data/public/images/ruby_gear.png +0 -0
  1227. data/public/images/ruby_get.png +0 -0
  1228. data/public/images/ruby_go.png +0 -0
  1229. data/public/images/ruby_key.png +0 -0
  1230. data/public/images/ruby_link.png +0 -0
  1231. data/public/images/ruby_put.png +0 -0
  1232. data/public/images/script.png +0 -0
  1233. data/public/images/script_add.png +0 -0
  1234. data/public/images/script_code.png +0 -0
  1235. data/public/images/script_code_red.png +0 -0
  1236. data/public/images/script_delete.png +0 -0
  1237. data/public/images/script_edit.png +0 -0
  1238. data/public/images/script_error.png +0 -0
  1239. data/public/images/script_gear.png +0 -0
  1240. data/public/images/script_go.png +0 -0
  1241. data/public/images/script_key.png +0 -0
  1242. data/public/images/script_lightning.png +0 -0
  1243. data/public/images/script_link.png +0 -0
  1244. data/public/images/script_palette.png +0 -0
  1245. data/public/images/script_save.png +0 -0
  1246. data/public/images/server.png +0 -0
  1247. data/public/images/server_add.png +0 -0
  1248. data/public/images/server_chart.png +0 -0
  1249. data/public/images/server_compressed.png +0 -0
  1250. data/public/images/server_connect.png +0 -0
  1251. data/public/images/server_database.png +0 -0
  1252. data/public/images/server_delete.png +0 -0
  1253. data/public/images/server_edit.png +0 -0
  1254. data/public/images/server_error.png +0 -0
  1255. data/public/images/server_go.png +0 -0
  1256. data/public/images/server_key.png +0 -0
  1257. data/public/images/server_lightning.png +0 -0
  1258. data/public/images/server_link.png +0 -0
  1259. data/public/images/server_uncompressed.png +0 -0
  1260. data/public/images/shading.png +0 -0
  1261. data/public/images/shape_align_bottom.png +0 -0
  1262. data/public/images/shape_align_center.png +0 -0
  1263. data/public/images/shape_align_left.png +0 -0
  1264. data/public/images/shape_align_middle.png +0 -0
  1265. data/public/images/shape_align_right.png +0 -0
  1266. data/public/images/shape_align_top.png +0 -0
  1267. data/public/images/shape_flip_horizontal.png +0 -0
  1268. data/public/images/shape_flip_vertical.png +0 -0
  1269. data/public/images/shape_group.png +0 -0
  1270. data/public/images/shape_handles.png +0 -0
  1271. data/public/images/shape_move_back.png +0 -0
  1272. data/public/images/shape_move_backwards.png +0 -0
  1273. data/public/images/shape_move_forwards.png +0 -0
  1274. data/public/images/shape_move_front.png +0 -0
  1275. data/public/images/shape_rotate_anticlockwise.png +0 -0
  1276. data/public/images/shape_rotate_clockwise.png +0 -0
  1277. data/public/images/shape_square.png +0 -0
  1278. data/public/images/shape_square_add.png +0 -0
  1279. data/public/images/shape_square_delete.png +0 -0
  1280. data/public/images/shape_square_edit.png +0 -0
  1281. data/public/images/shape_square_error.png +0 -0
  1282. data/public/images/shape_square_go.png +0 -0
  1283. data/public/images/shape_square_key.png +0 -0
  1284. data/public/images/shape_square_link.png +0 -0
  1285. data/public/images/shape_ungroup.png +0 -0
  1286. data/public/images/shield.png +0 -0
  1287. data/public/images/shield_add.png +0 -0
  1288. data/public/images/shield_delete.png +0 -0
  1289. data/public/images/shield_go.png +0 -0
  1290. data/public/images/silk.html +1495 -0
  1291. data/public/images/sitemap.png +0 -0
  1292. data/public/images/sitemap_color.png +0 -0
  1293. data/public/images/sound.png +0 -0
  1294. data/public/images/sound_add.png +0 -0
  1295. data/public/images/sound_delete.png +0 -0
  1296. data/public/images/sound_low.png +0 -0
  1297. data/public/images/sound_mute.png +0 -0
  1298. data/public/images/sound_none.png +0 -0
  1299. data/public/images/spellcheck.png +0 -0
  1300. data/public/images/sport_8ball.png +0 -0
  1301. data/public/images/sport_basketball.png +0 -0
  1302. data/public/images/sport_football.png +0 -0
  1303. data/public/images/sport_golf.png +0 -0
  1304. data/public/images/sport_raquet.png +0 -0
  1305. data/public/images/sport_shuttlecock.png +0 -0
  1306. data/public/images/sport_soccer.png +0 -0
  1307. data/public/images/sport_tennis.png +0 -0
  1308. data/public/images/star.png +0 -0
  1309. data/public/images/status_away.png +0 -0
  1310. data/public/images/status_busy.png +0 -0
  1311. data/public/images/status_offline.png +0 -0
  1312. data/public/images/status_online.png +0 -0
  1313. data/public/images/stop.png +0 -0
  1314. data/public/images/style.png +0 -0
  1315. data/public/images/style_add.png +0 -0
  1316. data/public/images/style_delete.png +0 -0
  1317. data/public/images/style_edit.png +0 -0
  1318. data/public/images/style_go.png +0 -0
  1319. data/public/images/sum.png +0 -0
  1320. data/public/images/swf/xspf/Main.as +55 -0
  1321. data/public/images/swf/xspf/com/zuardi/musicplayer/MusicButton.as +557 -0
  1322. data/public/images/swf/xspf/com/zuardi/musicplayer/MusicPlayer.as +118 -0
  1323. data/public/images/swf/xspf/com/zuardi/musicplayer/Playlist.as +127 -0
  1324. data/public/images/swf/xspf/com/zuardi/musicplayer/ProgressiveSlider.as +66 -0
  1325. data/public/images/swf/xspf/license.txt +10 -0
  1326. data/public/images/swf/xspf/musicplayer.swf +0 -0
  1327. data/public/images/swf/xspf/musicplayer_f6.swf +0 -0
  1328. data/public/images/swf/xspf/musicplayerbtn.fla +0 -0
  1329. data/public/images/swf/xspf/parameters.as +39 -0
  1330. data/public/images/tab.png +0 -0
  1331. data/public/images/tab_add.png +0 -0
  1332. data/public/images/tab_delete.png +0 -0
  1333. data/public/images/tab_edit.png +0 -0
  1334. data/public/images/tab_go.png +0 -0
  1335. data/public/images/table.png +0 -0
  1336. data/public/images/table_add.png +0 -0
  1337. data/public/images/table_delete.png +0 -0
  1338. data/public/images/table_edit.png +0 -0
  1339. data/public/images/table_error.png +0 -0
  1340. data/public/images/table_gear.png +0 -0
  1341. data/public/images/table_go.png +0 -0
  1342. data/public/images/table_key.png +0 -0
  1343. data/public/images/table_lightning.png +0 -0
  1344. data/public/images/table_link.png +0 -0
  1345. data/public/images/table_multiple.png +0 -0
  1346. data/public/images/table_refresh.png +0 -0
  1347. data/public/images/table_relationship.png +0 -0
  1348. data/public/images/table_row_delete.png +0 -0
  1349. data/public/images/table_row_insert.png +0 -0
  1350. data/public/images/table_save.png +0 -0
  1351. data/public/images/table_sort.png +0 -0
  1352. data/public/images/tag.png +0 -0
  1353. data/public/images/tag_blue.png +0 -0
  1354. data/public/images/tag_blue_add.png +0 -0
  1355. data/public/images/tag_blue_delete.png +0 -0
  1356. data/public/images/tag_blue_edit.png +0 -0
  1357. data/public/images/tag_green.png +0 -0
  1358. data/public/images/tag_orange.png +0 -0
  1359. data/public/images/tag_pink.png +0 -0
  1360. data/public/images/tag_purple.png +0 -0
  1361. data/public/images/tag_red.png +0 -0
  1362. data/public/images/tag_yellow.png +0 -0
  1363. data/public/images/target.png +0 -0
  1364. data/public/images/telephone.png +0 -0
  1365. data/public/images/telephone_add.png +0 -0
  1366. data/public/images/telephone_delete.png +0 -0
  1367. data/public/images/telephone_edit.png +0 -0
  1368. data/public/images/telephone_error.png +0 -0
  1369. data/public/images/telephone_go.png +0 -0
  1370. data/public/images/telephone_key.png +0 -0
  1371. data/public/images/telephone_link.png +0 -0
  1372. data/public/images/television.png +0 -0
  1373. data/public/images/television_add.png +0 -0
  1374. data/public/images/television_delete.png +0 -0
  1375. data/public/images/text_align_center.png +0 -0
  1376. data/public/images/text_align_justify.png +0 -0
  1377. data/public/images/text_align_left.png +0 -0
  1378. data/public/images/text_align_right.png +0 -0
  1379. data/public/images/text_allcaps.png +0 -0
  1380. data/public/images/text_bold.png +0 -0
  1381. data/public/images/text_columns.png +0 -0
  1382. data/public/images/text_dropcaps.png +0 -0
  1383. data/public/images/text_heading_1.png +0 -0
  1384. data/public/images/text_heading_2.png +0 -0
  1385. data/public/images/text_heading_3.png +0 -0
  1386. data/public/images/text_heading_4.png +0 -0
  1387. data/public/images/text_heading_5.png +0 -0
  1388. data/public/images/text_heading_6.png +0 -0
  1389. data/public/images/text_horizontalrule.png +0 -0
  1390. data/public/images/text_indent.png +0 -0
  1391. data/public/images/text_indent_remove.png +0 -0
  1392. data/public/images/text_italic.png +0 -0
  1393. data/public/images/text_kerning.png +0 -0
  1394. data/public/images/text_letter_omega.png +0 -0
  1395. data/public/images/text_letterspacing.png +0 -0
  1396. data/public/images/text_linespacing.png +0 -0
  1397. data/public/images/text_list_bullets.png +0 -0
  1398. data/public/images/text_list_numbers.png +0 -0
  1399. data/public/images/text_lowercase.png +0 -0
  1400. data/public/images/text_padding_bottom.png +0 -0
  1401. data/public/images/text_padding_left.png +0 -0
  1402. data/public/images/text_padding_right.png +0 -0
  1403. data/public/images/text_padding_top.png +0 -0
  1404. data/public/images/text_replace.png +0 -0
  1405. data/public/images/text_signature.png +0 -0
  1406. data/public/images/text_smallcaps.png +0 -0
  1407. data/public/images/text_strikethrough.png +0 -0
  1408. data/public/images/text_subscript.png +0 -0
  1409. data/public/images/text_superscript.png +0 -0
  1410. data/public/images/text_underline.png +0 -0
  1411. data/public/images/text_uppercase.png +0 -0
  1412. data/public/images/textfield.png +0 -0
  1413. data/public/images/textfield_add.png +0 -0
  1414. data/public/images/textfield_delete.png +0 -0
  1415. data/public/images/textfield_key.png +0 -0
  1416. data/public/images/textfield_rename.png +0 -0
  1417. data/public/images/thumb_down.png +0 -0
  1418. data/public/images/thumb_up.png +0 -0
  1419. data/public/images/tick.png +0 -0
  1420. data/public/images/time.png +0 -0
  1421. data/public/images/time_add.png +0 -0
  1422. data/public/images/time_delete.png +0 -0
  1423. data/public/images/time_go.png +0 -0
  1424. data/public/images/timeline_marker.png +0 -0
  1425. data/public/images/transmit.png +0 -0
  1426. data/public/images/transmit_add.png +0 -0
  1427. data/public/images/transmit_blue.png +0 -0
  1428. data/public/images/transmit_delete.png +0 -0
  1429. data/public/images/transmit_edit.png +0 -0
  1430. data/public/images/transmit_error.png +0 -0
  1431. data/public/images/transmit_go.png +0 -0
  1432. data/public/images/tux.png +0 -0
  1433. data/public/images/user.png +0 -0
  1434. data/public/images/user_add.png +0 -0
  1435. data/public/images/user_admin.png +0 -0
  1436. data/public/images/user_comment.png +0 -0
  1437. data/public/images/user_delete.png +0 -0
  1438. data/public/images/user_edit.png +0 -0
  1439. data/public/images/user_female.png +0 -0
  1440. data/public/images/user_go.png +0 -0
  1441. data/public/images/user_gray.png +0 -0
  1442. data/public/images/user_green.png +0 -0
  1443. data/public/images/user_orange.png +0 -0
  1444. data/public/images/user_pub.png +0 -0
  1445. data/public/images/user_red.png +0 -0
  1446. data/public/images/user_su.png +0 -0
  1447. data/public/images/user_suit.png +0 -0
  1448. data/public/images/validate.png +0 -0
  1449. data/public/images/valider.png +0 -0
  1450. data/public/images/vcard.png +0 -0
  1451. data/public/images/vcard_add.png +0 -0
  1452. data/public/images/vcard_delete.png +0 -0
  1453. data/public/images/vcard_edit.png +0 -0
  1454. data/public/images/vector.png +0 -0
  1455. data/public/images/vector_add.png +0 -0
  1456. data/public/images/vector_delete.png +0 -0
  1457. data/public/images/wand.png +0 -0
  1458. data/public/images/weather_clouds.png +0 -0
  1459. data/public/images/weather_cloudy.png +0 -0
  1460. data/public/images/weather_lightning.png +0 -0
  1461. data/public/images/weather_rain.png +0 -0
  1462. data/public/images/weather_snow.png +0 -0
  1463. data/public/images/weather_sun.png +0 -0
  1464. data/public/images/webcam.png +0 -0
  1465. data/public/images/webcam_add.png +0 -0
  1466. data/public/images/webcam_delete.png +0 -0
  1467. data/public/images/webcam_error.png +0 -0
  1468. data/public/images/world.png +0 -0
  1469. data/public/images/world_add.png +0 -0
  1470. data/public/images/world_delete.png +0 -0
  1471. data/public/images/world_edit.png +0 -0
  1472. data/public/images/world_go.png +0 -0
  1473. data/public/images/world_link.png +0 -0
  1474. data/public/images/wrench.png +0 -0
  1475. data/public/images/wrench_orange.png +0 -0
  1476. data/public/images/xhtml.png +0 -0
  1477. data/public/images/xhtml_add.png +0 -0
  1478. data/public/images/xhtml_delete.png +0 -0
  1479. data/public/images/xhtml_go.png +0 -0
  1480. data/public/images/xhtml_valid.png +0 -0
  1481. data/public/images/zoom.png +0 -0
  1482. data/public/images/zoom_in.png +0 -0
  1483. data/public/images/zoom_out.png +0 -0
  1484. data/public/img/logo.png +0 -0
  1485. data/public/javascripts/application.js +2 -0
  1486. data/public/javascripts/builder.js +136 -0
  1487. data/public/javascripts/controls.js +965 -0
  1488. data/public/javascripts/dragdrop.js +975 -0
  1489. data/public/javascripts/effects.js +1130 -0
  1490. data/public/javascripts/prototype.js +4320 -0
  1491. data/public/javascripts/scriptaculous.js +60 -0
  1492. data/public/javascripts/slider.js +275 -0
  1493. data/public/javascripts/sound.js +55 -0
  1494. data/public/javascripts/tablekit.js +965 -0
  1495. data/public/javascripts/unittest.js +568 -0
  1496. data/public/javascripts/upload-progress.js +133 -0
  1497. data/public/javascripts/zena.js +501 -0
  1498. data/public/robots.txt +1 -0
  1499. data/public/stylesheets/admin.css +77 -0
  1500. data/public/stylesheets/calendar.css +55 -0
  1501. data/public/stylesheets/code.css +67 -0
  1502. data/public/stylesheets/comment.css +43 -0
  1503. data/public/stylesheets/csshover2.htc +121 -0
  1504. data/public/stylesheets/default.css +85 -0
  1505. data/public/stylesheets/popup.css +200 -0
  1506. data/public/stylesheets/reset.css +33 -0
  1507. data/public/stylesheets/search.css +19 -0
  1508. data/public/stylesheets/upload-progress.css +4 -0
  1509. data/public/stylesheets/wiki.css +100 -0
  1510. data/public/stylesheets/zen.css +230 -0
  1511. data/public/stylesheets/zena.css +78 -0
  1512. data/rails/init.rb +2 -0
  1513. data/tasks/ann.rake +80 -0
  1514. data/tasks/bones.rake +20 -0
  1515. data/tasks/gem.rake +201 -0
  1516. data/tasks/git.rake +40 -0
  1517. data/tasks/notes.rake +27 -0
  1518. data/tasks/post_load.rake +34 -0
  1519. data/tasks/rdoc.rake +51 -0
  1520. data/tasks/rubyforge.rake +55 -0
  1521. data/tasks/setup.rb +292 -0
  1522. data/tasks/spec.rake +54 -0
  1523. data/tasks/svn.rake +47 -0
  1524. data/tasks/test.rake +40 -0
  1525. data/tasks/zentest.rake +36 -0
  1526. data/test/fixtures/comments.yml +126 -0
  1527. data/test/fixtures/contact_contents.yml +132 -0
  1528. data/test/fixtures/data_entries.yml +65 -0
  1529. data/test/fixtures/discussions.yml +48 -0
  1530. data/test/fixtures/document_contents.yml +108 -0
  1531. data/test/fixtures/dyn_attributes.yml +66 -0
  1532. data/test/fixtures/files/Node-test.zafu +307 -0
  1533. data/test/fixtures/files/bird.jpg +0 -0
  1534. data/test/fixtures/files/bomb.png +0 -0
  1535. data/test/fixtures/files/exif_sample.jpg +0 -0
  1536. data/test/fixtures/files/flower.jpg +0 -0
  1537. data/test/fixtures/files/forest.pdf +0 -0
  1538. data/test/fixtures/files/import.tgz +0 -0
  1539. data/test/fixtures/files/jet_30.zip +0 -0
  1540. data/test/fixtures/files/lake.jpg +0 -0
  1541. data/test/fixtures/files/letter.zip +0 -0
  1542. data/test/fixtures/files/other.txt +1 -0
  1543. data/test/fixtures/files/simple.zml.gz +0 -0
  1544. data/test/fixtures/files/some.txt +1 -0
  1545. data/test/fixtures/files/translations_de.yml +4 -0
  1546. data/test/fixtures/files/translations_fr.yml +4 -0
  1547. data/test/fixtures/files/tree.jpg +0 -0
  1548. data/test/fixtures/files/water.pdf +0 -0
  1549. data/test/fixtures/groups.yml +86 -0
  1550. data/test/fixtures/groups_users.yml +81 -0
  1551. data/test/fixtures/iformats.yml +28 -0
  1552. data/test/fixtures/import/photos.en.zml +11 -0
  1553. data/test/fixtures/import/photos/bird.jpg +0 -0
  1554. data/test/fixtures/import/photos/bird.jpg.en.zml +1 -0
  1555. data/test/fixtures/import/photos/bird.jpg.fr.zml +1 -0
  1556. data/test/fixtures/import/photos/document.yml.en +4 -0
  1557. data/test/fixtures/import/photos/document.yml.fr +4 -0
  1558. data/test/fixtures/import/simple.zml +8 -0
  1559. data/test/fixtures/links.yml +313 -0
  1560. data/test/fixtures/nodes.yml +2592 -0
  1561. data/test/fixtures/relations.yml +126 -0
  1562. data/test/fixtures/sites.yml +58 -0
  1563. data/test/fixtures/template_contents.yml +172 -0
  1564. data/test/fixtures/users.yml +167 -0
  1565. data/test/fixtures/versions.yml +1909 -0
  1566. data/test/fixtures/virtual_classes.yml +87 -0
  1567. data/test/fixtures/zips.yml +15 -0
  1568. data/test/functional/application_controller_test.rb +136 -0
  1569. data/test/functional/calendar_controller_test.rb +25 -0
  1570. data/test/functional/comments_controller_test.rb +59 -0
  1571. data/test/functional/data_entries_controller_test.rb +22 -0
  1572. data/test/functional/discussion_controller_test.rb +20 -0
  1573. data/test/functional/documents_controller_test.rb +155 -0
  1574. data/test/functional/groups_controller_test.rb +109 -0
  1575. data/test/functional/iformats_controller_test.rb +115 -0
  1576. data/test/functional/links_controller_test.rb +26 -0
  1577. data/test/functional/nodes_controller_test.rb +448 -0
  1578. data/test/functional/note_controller_test.rb +53 -0
  1579. data/test/functional/preferences_controller_test.rb +11 -0
  1580. data/test/functional/relations_controller_test.rb +55 -0
  1581. data/test/functional/search_controller_test.rb +41 -0
  1582. data/test/functional/sessions_controller_test.rb +73 -0
  1583. data/test/functional/sites_controller_test.rb +102 -0
  1584. data/test/functional/users_controller_test.rb +28 -0
  1585. data/test/functional/versions_controller_test.rb +99 -0
  1586. data/test/functional/virtual_classes_controller_test.rb +62 -0
  1587. data/test/helpers/node_query/basic.yml +149 -0
  1588. data/test/helpers/node_query/comments.yml +18 -0
  1589. data/test/helpers/node_query/complex.yml +98 -0
  1590. data/test/helpers/node_query/filters.yml +105 -0
  1591. data/test/helpers/node_query/relations.yml +43 -0
  1592. data/test/helpers/node_query_test.rb +117 -0
  1593. data/test/integration/multiple_hosts_test.rb +98 -0
  1594. data/test/integration/multiversion_test.rb +164 -0
  1595. data/test/integration/navigation_test.rb +283 -0
  1596. data/test/sites/README +2 -0
  1597. data/test/sites/complex/complex.png +0 -0
  1598. data/test/sites/complex/groups.yml +9 -0
  1599. data/test/sites/complex/links.yml +75 -0
  1600. data/test/sites/complex/nodes.yml +253 -0
  1601. data/test/sites/complex/relations.yml +11 -0
  1602. data/test/sites/complex/sites.yml +13 -0
  1603. data/test/sites/complex/users.yml +20 -0
  1604. data/test/sites/complex/versions.yml +1 -0
  1605. data/test/sites/complex/virtual_classes.yml +19 -0
  1606. data/test/sites/ocean/contact_contents.yml +19 -0
  1607. data/test/sites/ocean/groups.yml +9 -0
  1608. data/test/sites/ocean/iformats.yml +7 -0
  1609. data/test/sites/ocean/nodes.yml +36 -0
  1610. data/test/sites/ocean/sites.yml +14 -0
  1611. data/test/sites/ocean/template_contents.yml +8 -0
  1612. data/test/sites/ocean/users.yml +33 -0
  1613. data/test/sites/ocean/versions.yml +48 -0
  1614. data/test/sites/zena/comments.yml +82 -0
  1615. data/test/sites/zena/contact_contents.yml +55 -0
  1616. data/test/sites/zena/data_entries.yml +42 -0
  1617. data/test/sites/zena/discussions.yml +30 -0
  1618. data/test/sites/zena/document_contents.yml +76 -0
  1619. data/test/sites/zena/dyn_attributes.yml +43 -0
  1620. data/test/sites/zena/groups.yml +11 -0
  1621. data/test/sites/zena/iformats.yml +6 -0
  1622. data/test/sites/zena/links.yml +49 -0
  1623. data/test/sites/zena/nodes.yml +338 -0
  1624. data/test/sites/zena/relations.yml +66 -0
  1625. data/test/sites/zena/sites.yml +13 -0
  1626. data/test/sites/zena/template_contents.yml +103 -0
  1627. data/test/sites/zena/users.yml +48 -0
  1628. data/test/sites/zena/versions.yml +558 -0
  1629. data/test/sites/zena/virtual_classes.yml +23 -0
  1630. data/test/test_helper.rb +62 -0
  1631. data/test/test_zena.rb +138 -0
  1632. data/test/unit/cache_test.rb +62 -0
  1633. data/test/unit/cached_page_test.rb +165 -0
  1634. data/test/unit/comment_test.rb +185 -0
  1635. data/test/unit/contact_content_test.rb +33 -0
  1636. data/test/unit/contact_test.rb +39 -0
  1637. data/test/unit/contact_version_test.rb +48 -0
  1638. data/test/unit/core_ext_test.rb +48 -0
  1639. data/test/unit/data_entry_test.rb +92 -0
  1640. data/test/unit/discussion_test.rb +59 -0
  1641. data/test/unit/document_content_test.rb +110 -0
  1642. data/test/unit/document_test.rb +234 -0
  1643. data/test/unit/document_version_test.rb +11 -0
  1644. data/test/unit/dyn_attributes_test.rb +229 -0
  1645. data/test/unit/exif_data_test.rb +66 -0
  1646. data/test/unit/group_test.rb +142 -0
  1647. data/test/unit/iformat_test.rb +190 -0
  1648. data/test/unit/image_builder_test.rb +214 -0
  1649. data/test/unit/image_content_test.rb +154 -0
  1650. data/test/unit/image_test.rb +311 -0
  1651. data/test/unit/image_version_test.rb +18 -0
  1652. data/test/unit/letter_test.rb +9 -0
  1653. data/test/unit/link_test.rb +32 -0
  1654. data/test/unit/multiversion_test.rb +1008 -0
  1655. data/test/unit/node_test.rb +1578 -0
  1656. data/test/unit/note_test.rb +85 -0
  1657. data/test/unit/page_test.rb +79 -0
  1658. data/test/unit/project_test.rb +32 -0
  1659. data/test/unit/reference_test.rb +9 -0
  1660. data/test/unit/relation_proxy_test.rb +409 -0
  1661. data/test/unit/relation_test.rb +48 -0
  1662. data/test/unit/section_test.rb +32 -0
  1663. data/test/unit/secure_test.rb +939 -0
  1664. data/test/unit/site_test.rb +236 -0
  1665. data/test/unit/skin_test.rb +18 -0
  1666. data/test/unit/template_content_test.rb +9 -0
  1667. data/test/unit/template_test.rb +357 -0
  1668. data/test/unit/template_version_test.rb +7 -0
  1669. data/test/unit/text_document_content_test.rb +8 -0
  1670. data/test/unit/text_document_test.rb +139 -0
  1671. data/test/unit/text_document_version_test.rb +37 -0
  1672. data/test/unit/user_test.rb +295 -0
  1673. data/test/unit/version_test.rb +312 -0
  1674. data/test/unit/virtual_class_test.rb +242 -0
  1675. data/test/unit/zena/db_test.rb +94 -0
  1676. data/test/unit/zena/parser/latex.yml +14 -0
  1677. data/test/unit/zena/parser/zafu.yml +391 -0
  1678. data/test/unit/zena/parser/zafu_asset.yml +43 -0
  1679. data/test/unit/zena/parser/zafu_insight.yml +3 -0
  1680. data/test/unit/zena/parser/zazen.yml +211 -0
  1681. data/test/unit/zena/parser_test.rb +184 -0
  1682. data/test/unit/zena/unit/test_case_test.rb +12 -0
  1683. data/test/unit/zena/use/calendar_test.rb +49 -0
  1684. data/test/unit/zena/use/dates_model_methods_test.rb +41 -0
  1685. data/test/unit/zena/use/dates_string_methods_test.rb +94 -0
  1686. data/test/unit/zena/use/dates_view_methods_test.rb +158 -0
  1687. data/test/unit/zena/use/html_tags_test.rb +244 -0
  1688. data/test/unit/zena/use/i18n_test.rb +34 -0
  1689. data/test/unit/zena/use/nested_attributes_alias_model_test.rb +104 -0
  1690. data/test/unit/zena/use/nested_attributes_alias_view_test.rb +99 -0
  1691. data/test/unit/zena/use/refactor_test.rb +52 -0
  1692. data/test/unit/zena/use/rendering_test.rb +23 -0
  1693. data/test/unit/zena/use/urls_test.rb +119 -0
  1694. data/test/unit/zena/use/zafu_test.rb +21 -0
  1695. data/test/unit/zena/use/zazen_test.rb +230 -0
  1696. data/test/unit/zena/zena_tags/ajax.yml +233 -0
  1697. data/test/unit/zena/zena_tags/apphelper.yml +85 -0
  1698. data/test/unit/zena/zena_tags/basic.yml +1295 -0
  1699. data/test/unit/zena/zena_tags/complex.yml +249 -0
  1700. data/test/unit/zena/zena_tags/data.yml +73 -0
  1701. data/test/unit/zena/zena_tags/errors.yml +71 -0
  1702. data/test/unit/zena/zena_tags/eval.yml +51 -0
  1703. data/test/unit/zena/zena_tags/relations.yml +411 -0
  1704. data/test/unit/zena/zena_tags/zazen.yml +84 -0
  1705. data/test/unit/zena/zena_tags_test.rb +235 -0
  1706. data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/Run 2.tmCommand +24 -0
  1707. data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/Run Context.tmCommand +58 -0
  1708. data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/Run Focused Should.tmCommand +88 -0
  1709. data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/Run.tmCommand +27 -0
  1710. data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/YAML to Shoulda.tmCommand +23 -0
  1711. data/vendor/TextMate/Ruby Shoulda.tmbundle/Preferences/Symbol List: Context.tmPreferences +19 -0
  1712. data/vendor/TextMate/Ruby Shoulda.tmbundle/Preferences/Symbol List: Should.tmPreferences +19 -0
  1713. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory attributes for.tmSnippet +16 -0
  1714. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory build.tmSnippet +16 -0
  1715. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory.tmSnippet +16 -0
  1716. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory_define with class.tmSnippet +18 -0
  1717. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory_define.tmSnippet +18 -0
  1718. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory_next.tmSnippet +16 -0
  1719. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory_sequence.tmSnippet +18 -0
  1720. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_bad_value.tmSnippet +16 -0
  1721. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_contains.tmSnippet +16 -0
  1722. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_does_not_contain.tmSnippet +16 -0
  1723. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_good_value.tmSnippet +16 -0
  1724. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_same_elements.tmSnippet +16 -0
  1725. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_save.tmSnippet +16 -0
  1726. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_sent_email.tmSnippet +18 -0
  1727. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_valid.tmSnippet +16 -0
  1728. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/association.tmSnippet +17 -0
  1729. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/attribute.tmSnippet +17 -0
  1730. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/before_should block.tmSnippet +18 -0
  1731. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/context block get.tmSnippet +22 -0
  1732. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/context block post.tmSnippet +23 -0
  1733. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/context block with setup.tmSnippet +25 -0
  1734. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/setup.tmSnippet +18 -0
  1735. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should block with before proc.tmSnippet +18 -0
  1736. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should block.tmSnippet +18 -0
  1737. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_allow_values_for.tmSnippet +16 -0
  1738. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_assign_to.tmSnippet +16 -0
  1739. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_be_restful denied.tmSnippet +20 -0
  1740. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_be_restful.tmSnippet +20 -0
  1741. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_belong_to.tmSnippet +16 -0
  1742. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_change by.tmSnippet +16 -0
  1743. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_change from to.tmSnippet +16 -0
  1744. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_ensure_length_at_least.tmSnippet +16 -0
  1745. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_ensure_length_in_range.tmSnippet +16 -0
  1746. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_ensure_length_is.tmSnippet +16 -0
  1747. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_ensure_value_in_range.tmSnippet +16 -0
  1748. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_eventually.tmSnippet +18 -0
  1749. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_filter_params.tmSnippet +16 -0
  1750. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_and_belong_to_many.tmSnippet +16 -0
  1751. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_class_methods.tmSnippet +16 -0
  1752. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_db_column.tmSnippet +16 -0
  1753. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_db_columns.tmSnippet +16 -0
  1754. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_index.tmSnippet +16 -0
  1755. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_indices.tmSnippet +16 -0
  1756. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_instance_methods.tmSnippet +16 -0
  1757. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_many.tmSnippet +16 -0
  1758. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_named_scope.tmSnippet +16 -0
  1759. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_one.tmSnippet +16 -0
  1760. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_readonly_attributes.tmSnippet +16 -0
  1761. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_allow_mass_assignment_of.tmSnippet +16 -0
  1762. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_allow_values_for.tmSnippet +16 -0
  1763. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_assign_to.tmSnippet +16 -0
  1764. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_change.tmSnippet +16 -0
  1765. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_set_the_flash.tmSnippet +16 -0
  1766. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_redirect_to.tmSnippet +16 -0
  1767. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_render_a_form.tmSnippet +16 -0
  1768. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_render_template.tmSnippet +16 -0
  1769. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_render_with_layout.tmSnippet +16 -0
  1770. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_render_without_layout.tmSnippet +16 -0
  1771. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_respond_with.tmSnippet +16 -0
  1772. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_respond_with_content_type.tmSnippet +16 -0
  1773. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_return_from_session.tmSnippet +16 -0
  1774. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_route.tmSnippet +16 -0
  1775. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_set_the_flash_to.tmSnippet +16 -0
  1776. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_acceptance_of.tmSnippet +16 -0
  1777. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_numericality_of.tmSnippet +16 -0
  1778. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_presence_of.tmSnippet +16 -0
  1779. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_uniqueness_of with scope.tmSnippet +16 -0
  1780. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_uniqueness_of.tmSnippet +16 -0
  1781. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/catch_exception.rb +39 -0
  1782. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/run_script.rb +104 -0
  1783. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/stdin_dialog.rb +14 -0
  1784. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/test.rb +17 -0
  1785. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/todo.txt +13 -0
  1786. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/bin/yaml_to_shoulda.rb +25 -0
  1787. data/vendor/TextMate/Ruby Shoulda.tmbundle/Syntaxes/Ruby on Rails (Shoulda).tmLanguage +166 -0
  1788. data/vendor/TextMate/Ruby Shoulda.tmbundle/info.plist +304 -0
  1789. data/vendor/TextMate/Zena.tmbundle/Commands/Run all yaml tests.tmCommand +37 -0
  1790. data/vendor/TextMate/Zena.tmbundle/Commands/Run focused yaml test.tmCommand +53 -0
  1791. data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/run_script.rb +74 -0
  1792. data/vendor/TextMate/Zena.tmbundle/info.plist +15 -0
  1793. data/vendor/apache_upload/mod_upload_progress.c +813 -0
  1794. data/vendor/bricks/20070122-172926.txt +282 -0
  1795. data/vendor/plugins/ar_mysql_full_text/README +15 -0
  1796. data/vendor/plugins/ar_mysql_full_text/init.rb +1 -0
  1797. data/vendor/plugins/ar_mysql_full_text/lib/ar_mysql_full_text.rb +69 -0
  1798. data/vendor/plugins/gettext_i18n_rails/README.markdown +139 -0
  1799. data/vendor/plugins/gettext_i18n_rails/Rakefile +6 -0
  1800. data/vendor/plugins/gettext_i18n_rails/init.rb +10 -0
  1801. data/vendor/plugins/gettext_i18n_rails/lib/gettext_i18n_rails.rb +21 -0
  1802. data/vendor/plugins/gettext_i18n_rails/lib/gettext_i18n_rails/action_controller.rb +6 -0
  1803. data/vendor/plugins/gettext_i18n_rails/lib/gettext_i18n_rails/active_record.rb +17 -0
  1804. data/vendor/plugins/gettext_i18n_rails/lib/gettext_i18n_rails/backend.rb +47 -0
  1805. data/vendor/plugins/gettext_i18n_rails/lib/gettext_i18n_rails/haml_parser.rb +43 -0
  1806. data/vendor/plugins/gettext_i18n_rails/lib/gettext_i18n_rails/i18n_hacks.rb +10 -0
  1807. data/vendor/plugins/gettext_i18n_rails/lib/gettext_i18n_rails/model_attributes_finder.rb +46 -0
  1808. data/vendor/plugins/gettext_i18n_rails/lib/gettext_i18n_rails/ruby_gettext_extractor.rb +136 -0
  1809. data/vendor/plugins/gettext_i18n_rails/spec/gettext_i18n_rails/action_controller_spec.rb +36 -0
  1810. data/vendor/plugins/gettext_i18n_rails/spec/gettext_i18n_rails/active_record_spec.rb +50 -0
  1811. data/vendor/plugins/gettext_i18n_rails/spec/gettext_i18n_rails/backend_spec.rb +41 -0
  1812. data/vendor/plugins/gettext_i18n_rails/spec/gettext_i18n_rails_spec.rb +43 -0
  1813. data/vendor/plugins/gettext_i18n_rails/spec/spec_helper.rb +15 -0
  1814. data/vendor/plugins/gettext_i18n_rails/tasks/gettext_rails_i18n.rake +73 -0
  1815. data/vendor/plugins/responds_to_parent/MIT-LICENSE +20 -0
  1816. data/vendor/plugins/responds_to_parent/README +42 -0
  1817. data/vendor/plugins/responds_to_parent/Rakefile +22 -0
  1818. data/vendor/plugins/responds_to_parent/init.rb +1 -0
  1819. data/vendor/plugins/responds_to_parent/lib/responds_to_parent.rb +46 -0
  1820. data/vendor/plugins/responds_to_parent/test/responds_to_parent_test.rb +115 -0
  1821. data/vendor/plugins/rjs-assertions/MIT-LICENSE +20 -0
  1822. data/vendor/plugins/rjs-assertions/README +64 -0
  1823. data/vendor/plugins/rjs-assertions/init.rb +1 -0
  1824. data/vendor/plugins/rjs-assertions/lib/rjs-assertions.rb +99 -0
  1825. data/vendor/rails_patches/support_for_inverse_relationships_on_active_record_objects.diff +739 -0
  1826. metadata +2075 -0
@@ -0,0 +1,1578 @@
1
+ require 'test_helper'
2
+
3
+ class NodeTest < Zena::Unit::TestCase
4
+
5
+ NEW_DEFAULT = {
6
+ :name => 'hello',
7
+ :rgroup_id => Zena::FoxyParser::id('zena', 'public'),
8
+ :wgroup_id => Zena::FoxyParser::id('zena', 'workers'),
9
+ :dgroup_id => Zena::FoxyParser::id('zena', 'managers'),
10
+ :parent_id => Zena::FoxyParser::id('zena', 'cleanWater'),
11
+ }.freeze
12
+
13
+ def test_find_by_path
14
+ Node.connection.execute "UPDATE nodes SET fullpath = NULL, basepath = NULL WHERE id = #{nodes_id(:wiki)}"
15
+ login(:ant)
16
+ node = nodes(:wiki)
17
+ assert_nil node[:fullpath]
18
+ node = secure!(Node) { Node.find_by_path('projects/wiki') }
19
+ assert_equal 'projects/wiki', node.fullpath
20
+ node = secure!(Node) { Node.find_by_path('projects/wiki') }
21
+ assert_equal 'projects/wiki', node[:fullpath]
22
+ end
23
+
24
+ def test_match_query
25
+ query = Node.match_query('smala')
26
+ assert_equal "nodes.name LIKE 'smala%'", query[:conditions]
27
+ query = Node.match_query('.', :node => nodes(:wiki))
28
+ assert_equal ["parent_id = ?", nodes_id(:wiki)], query[:conditions]
29
+ end
30
+
31
+ def transform_attributes_zazen_shortcut_v_text
32
+ login(:lion)
33
+ [
34
+ ["Hi, this is just a simple \"test\"::w or \"\"::w+_life.rss. OK ?\n\n!:lake+_pv!",
35
+ "Hi, this is just a simple \"test\":25 or \"\":29_life.rss. OK ?\n\n!24_pv!"],
36
+
37
+ ["Hi ![30,:lake+]! ![]!",
38
+ "Hi ![30,24]! ![]!"],
39
+
40
+ ["Hi !{:bird,:lake+}! !{}!",
41
+ "Hi !{30,24}! !{}!"],
42
+
43
+ ["Hi !30!::clean !:bird!::clean !:bird/nice bird!:21 !30_pv/hello ladies!:21",
44
+ "Hi !30!:21 !30!:21 !30/nice bird!:21 !30_pv/hello ladies!:21"],
45
+
46
+ ["Hi, this is normal "":1/ just a\n\n* asf\n* asdf ![23,33]!",
47
+ "Hi, this is normal "":1/ just a\n\n* asf\n* asdf ![23,33]!"],
48
+ ].each do |src,res|
49
+ assert_equal res, secure(Node) { Node.transform_attributes( 'v_text' => src )['v_text'] }
50
+ end
51
+ end
52
+
53
+ def test_transform_attributes
54
+ login(:tiger)
55
+ visitor[:time_zone] = "Europe/Zurich"
56
+ [
57
+ [{'parent_id' => 'lake+'},
58
+ {'parent_id' => nodes_id(:lake_jpg)}],
59
+
60
+ [{'d_super_id' => 'lake', 'd_other_id' => '11'},
61
+ {'d_super_id' => nodes_zip(:lake), 'd_other_id' => 11}],
62
+
63
+ [{'tag_ids' => "33,news"},
64
+ {'tag_ids' => [nodes_id(:art), nodes_id(:news)]}],
65
+
66
+ [{'parent_id' => '999', 'tag_ids' => "999,34,art"},
67
+ {'parent_id' => '999', 'tag_ids' => [nodes_id(:news),nodes_id(:art)]}],
68
+
69
+ [{'link' => {'hot' => {'other_id' => '22', 'date' => '2009-7-15 16:58' }}},
70
+ {'link' => {'hot' => {'other_id' => nodes_id(:status), 'date' => Time.gm(2009,7,15,16,58)}}}], # this should be 14:58 when #255 is fixed (tz support).
71
+ ].each do |src,res|
72
+ assert_equal res, secure(Node) { Node.transform_attributes( src ) }
73
+ end
74
+ end
75
+
76
+ def test_get_fullpath
77
+ Node.connection.execute "UPDATE nodes SET fullpath = NULL, basepath = NULL WHERE id IN (#{nodes_id(:lake)},#{nodes_id(:cleanWater)})"
78
+ login(:ant)
79
+ node = secure!(Node) { nodes(:lake) }
80
+ parent = node.parent
81
+ assert_nil parent[:fullpath]
82
+ assert_nil node[:fullpath]
83
+ assert_equal 'projects/cleanWater/lakeAddress', node.fullpath
84
+ node.reload
85
+ assert_equal 'projects/cleanWater/lakeAddress', node[:fullpath]
86
+ parent.reload
87
+ assert_equal 'projects/cleanWater', parent[:fullpath]
88
+ end
89
+
90
+ def test_get_fullpath_rebuild
91
+ login(:ant)
92
+ node = secure!(Node) { nodes(:lake) }
93
+ assert_equal 'projects/cleanWater/lakeAddress', node.fullpath
94
+ Node.connection.execute "UPDATE nodes SET parent_id = #{nodes_id(:collections)} WHERE id = #{node[:id]}"
95
+ node.reload
96
+ assert_equal 'projects/cleanWater/lakeAddress', node.fullpath
97
+ assert_equal 'collections/lakeAddress', node.fullpath(true)
98
+ end
99
+
100
+ def test_get_fullpath_after_private
101
+ Node.connection.execute "UPDATE nodes SET parent_id = #{nodes_id(:ant)} WHERE id = #{nodes_id(:status)}" # put 'status' page inside private 'ant' page
102
+ node = nil
103
+ login(:tiger)
104
+ assert_nothing_raised { node = secure!(Node) { nodes(:status) } }
105
+ assert_kind_of Node, node
106
+ assert_nothing_raised { node = secure!(Node) { Node.find_by_path('people/ant') } }
107
+ assert_nothing_raised { node = secure!(Node) { Node.find_by_path('people/ant/status')}}
108
+ end
109
+
110
+ def test_fullpath_updated_on_parent_rename
111
+ login(:tiger)
112
+ node = secure!(Node) { nodes(:tiger) }
113
+ assert_equal 'people/tiger', node.fullpath
114
+ node = secure!(Node) { nodes(:tiger) }
115
+ assert_equal 'people/tiger', node[:fullpath] # make sure fullpath is cached
116
+
117
+ node = secure!(Node) { nodes(:people) }
118
+ assert node.update_attributes(:v_title => 'nice people')
119
+ assert node.publish
120
+ assert_equal 'nicePeople', node.name # sync name
121
+ node = secure!(Node) { nodes(:tiger) }
122
+ assert_nil node[:fullpath] # cache empty
123
+ assert_equal 'nicePeople/tiger', node.fullpath
124
+ end
125
+
126
+ def test_rootpath
127
+ login(:ant)
128
+ node = secure!(Node) { nodes(:status) }
129
+ assert_equal 'zena/projects/cleanWater/status', node.rootpath
130
+ node = secure!(Node) { nodes(:zena) }
131
+ assert_equal 'zena', node.rootpath
132
+ end
133
+
134
+ def test_basepath
135
+ login(:tiger)
136
+ node = secure!(Node) { nodes(:status) }
137
+ assert_equal 'projects/cleanWater', node.basepath
138
+ node = secure!(Node) { nodes(:projects) }
139
+ assert_equal '', node.basepath
140
+ node = secure!(Node) { nodes(:proposition) }
141
+ assert_equal '', node.basepath
142
+ end
143
+
144
+ def test_ancestors
145
+ Node.connection.execute "UPDATE nodes SET parent_id = #{nodes_id(:proposition)} WHERE id = #{nodes_id(:bird_jpg)}"
146
+ login(:tiger)
147
+ node = secure!(Node) { nodes(:status) }
148
+ assert_equal ['zena', 'projects', 'cleanWater'], node.ancestors.map { |a| a[:name] }
149
+ node = secure!(Node) { nodes(:zena) }
150
+ assert_equal [], node.ancestors
151
+ node = secure!(Node) { nodes(:bird_jpg) }
152
+ prop = secure!(Node) { nodes(:proposition)}
153
+ assert_kind_of Node, prop
154
+ assert prop.can_read?
155
+ assert_equal ['zena', 'projects', 'secret', 'proposition'], node.ancestors.map { |a| a[:name] }
156
+ end
157
+
158
+ def test_ancestors_infinit_loop
159
+ Node.connection.execute "UPDATE nodes SET parent_id = #{nodes_id(:status)} WHERE id = #{nodes_id(:cleanWater)}"
160
+ login(:ant)
161
+ node = secure!(Node) { nodes(:lake_jpg) }
162
+ assert_raise(Zena::InvalidRecord) { node.ancestors }
163
+ end
164
+
165
+ def test_ancestor_in_hidden_project
166
+ login(:tiger)
167
+ node = secure!(Node) { nodes(:proposition) }
168
+ assert_kind_of Node, node
169
+ assert_equal ['zena', 'projects', 'secret'], node.ancestors.map { |a| a[:name] } # ant can view 'proposition' but not the project proposition is in
170
+ end
171
+
172
+ def test_create_simplest
173
+ login(:ant)
174
+ test_page = secure!(Node) { Node.create(:name=>"yoba", :parent_id => nodes_id(:cleanWater), :inherit=>1 ) }
175
+ assert ! test_page.new_record? , "Not a new record"
176
+ assert_equal nodes_id(:cleanWater), test_page.parent[:id]
177
+ end
178
+
179
+ def test_cannot_update_v_status
180
+ login(:ant)
181
+ test_page = secure!(Node) { nodes(:status) }
182
+ assert_equal 2, test_page.version.number
183
+ assert test_page.update_attributes( :v_status => Zena::Status[:pub], :v_title => "New funky title")
184
+ assert_equal 3, test_page.version.number
185
+ assert_equal Zena::Status[:red], test_page.version.status
186
+ end
187
+
188
+ def test_new_bad_parent
189
+ login(:tiger)
190
+ attrs = NEW_DEFAULT.dup
191
+ attrs[:parent_id] = nodes_id(:proposition)
192
+ node = secure!(Page) { Page.new(attrs) }
193
+ assert node.save , "Save ok"
194
+
195
+ attrs[:parent_id] = nodes_id(:myDreams) # cannot write here
196
+ node = secure!(Page) { Page.new(attrs) }
197
+ assert ! node.save , "Save fails"
198
+ assert node.errors[:parent_id].any?
199
+ assert_equal 'invalid reference', node.errors[:parent_id]
200
+
201
+ attrs[:parent_id] = nodes_id(:cleanWater) # other parent ok
202
+ node = secure!(Page) { Page.new(attrs) }
203
+ assert node.save , "Save succeeds"
204
+ end
205
+
206
+ def test_new_without_parent
207
+ login(:tiger)
208
+ attrs = NEW_DEFAULT.dup
209
+ attrs.delete(:parent_id)
210
+ node = secure!(Node) { Node.new(attrs) }
211
+ assert ! node.save , "Save fails"
212
+ assert node.errors[:parent_id].any?
213
+ assert_equal 'invalid reference', node.errors[:parent_id]
214
+ # page parent ok
215
+ assert node.new_record?
216
+ node = secure!(Node) { Node.new(attrs) }
217
+ node.parent_id = nodes_id(:lake)
218
+ assert node.save , "Save succeeds"
219
+ end
220
+
221
+ def test_page_new_without_name
222
+ login(:tiger)
223
+ node = secure!(Node) { Node.new(:parent_id=>nodes_id(:cleanWater)) }
224
+ assert ! node.save, 'Save fails'
225
+ assert_equal 'can\'t be blank', node.errors[:name]
226
+ end
227
+
228
+ def test_new_set_section_id
229
+ login(:tiger)
230
+ node = secure!(Page) { Page.create(:parent_id=>nodes_id(:people), :name=>'SuperPage')}
231
+ assert ! node.new_record?, 'Not a new record'
232
+ assert_equal nodes_id(:people), node[:section_id]
233
+ end
234
+
235
+ def toto_test_update_no_or_bad_parent
236
+ login(:ant)
237
+ node = secure!(Node) { nodes(:wiki) }
238
+ assert_kind_of Node, node
239
+ assert node.save , "Save succeeds"
240
+ node.parent_id = nil
241
+ assert ! node.save , "Save fails"
242
+ assert node.errors[:parent_id].any?
243
+ node = secure!(Node) { nodes(:wiki) }
244
+ node.parent_id = nodes_id(:wiki)
245
+ assert ! node.save , "Save fails"
246
+ assert node.errors[:parent_id].any?
247
+ node = secure!(Node) { nodes(:wiki) }
248
+ node.parent_id = nodes_id(:cleanWater)
249
+ assert ! node.save , "Save fails"
250
+ end
251
+
252
+ def test_update_bad_parent
253
+ login(:tiger)
254
+ node = secure!(Node) { nodes(:status) }
255
+ node[:parent_id] = nodes_id(:proposition)
256
+ assert node.save , "Save ok"
257
+
258
+ node = secure!(Node) { nodes(:status) }
259
+ node[:parent_id] = nodes_id(:myDreams) # cannot write here
260
+ assert ! node.save , "Save fails"
261
+ assert node.errors[:parent_id].any?
262
+ assert_equal "invalid reference", node.errors[:parent_id]
263
+
264
+ node = secure!(Node) { nodes(:status) }
265
+ node[:parent_id] = nodes_id(:projects) # parent ok
266
+ assert node.save , "Save succeeds"
267
+ end
268
+
269
+ def test_page_update_without_name
270
+ login(:tiger)
271
+ node = secure!(Node) { nodes(:status) }
272
+ node[:name] = nil
273
+ assert node.save, 'Save succeeds'
274
+ assert_equal 'statusTitle', node[:name]
275
+ node = secure!(Node) { nodes(:status) }
276
+ node[:name] = nil
277
+ node.version.title = ""
278
+ assert !node.save, 'Save fails'
279
+ assert_equal 'can\'t be blank', node.errors[:name]
280
+ end
281
+
282
+ def test_update_set_section_id
283
+ login(:tiger)
284
+ node = secure!(Node) { Node.find(nodes_id(:lion))}
285
+ assert_equal nodes_id(:people), node[:section_id]
286
+ node[:parent_id] = nodes_id(:zena)
287
+ node[:section_id] = nodes_id(:status)
288
+ assert node.save, 'Can save node'
289
+ node.reload
290
+ assert_equal nodes_id(:zena), node[:section_id]
291
+ end
292
+
293
+ def test_before_destroy
294
+ login(:tiger)
295
+ node = secure!(Node) { nodes(:projects) }
296
+ assert !node.destroy, "Cannot destroy"
297
+ assert_equal 'cannot be removed (contains subpages or data)', node.errors[:base]
298
+ node = secure!(Node) { nodes(:bananas) }
299
+ assert node.destroy, "Can destroy"
300
+ end
301
+
302
+ def test_cannot_destroy_has_private
303
+ login(:tiger)
304
+ node = secure!(Node) { nodes(:lion) }
305
+ assert_nil node.find(:all, 'pages'), "No subpages"
306
+ assert !node.destroy, "Cannot destroy"
307
+ assert_equal 'cannot be removed (contains subpages or data)', node.errors[:base]
308
+ end
309
+
310
+ def test_parent
311
+ login(:anon)
312
+ assert_equal nodes_id(:projects), secure!(Node) { nodes(:wiki) }.parent[:id]
313
+ end
314
+
315
+ def test_project
316
+ login(:anon)
317
+ assert_equal nodes_id(:zena), secure!(Node) { nodes(:people) }.project[:id]
318
+ assert_equal nodes_id(:cleanWater), secure!(Node) { nodes(:cleanWater) }.project[:id]
319
+ assert_equal nodes_id(:zena), secure!(Node) { nodes(:cleanWater) }.real_project[:id]
320
+ end
321
+
322
+ def test_section
323
+ login(:tiger)
324
+ assert_equal nodes_id(:people), secure!(Node) { nodes(:tiger) }.section[:id]
325
+ assert_equal nodes_id(:cleanWater), secure!(Node) { nodes(:cleanWater) }.project[:id]
326
+ assert_equal nodes_id(:zena), secure!(Node) { nodes(:cleanWater) }.real_project[:id]
327
+ end
328
+
329
+ def test_real_project
330
+ login(:ant)
331
+ node = secure!(Node) { nodes(:status) }
332
+ assert_equal nodes_id(:cleanWater), node.project[:id]
333
+ node = secure!(Node) { nodes(:cleanWater) }
334
+ assert_equal nodes_id(:cleanWater), node.project[:id]
335
+ assert_equal nodes_id(:zena), node.real_project[:id]
336
+ assert_equal nodes_id(:zena), node.real_project.real_project[:id]
337
+ end
338
+
339
+ def test_real_section
340
+ login(:tiger)
341
+ node = secure!(Node) { nodes(:tiger) }
342
+ assert_equal nodes_id(:people), node.section[:id]
343
+ node = secure!(Node) { nodes(:people) }
344
+ assert_equal nodes_id(:people), node.section[:id]
345
+ assert_equal nodes_id(:zena), node.real_section[:id]
346
+ assert_equal nodes_id(:zena), node.real_section.real_section[:id]
347
+ end
348
+
349
+ def test_new_child
350
+ login(:ant)
351
+ node = secure!(Node) { nodes(:cleanWater) }
352
+ child = node.new_child( :name => 'status', :class => Page )
353
+ assert ! child.save , "Save fails"
354
+ assert child.errors[:name].any?
355
+
356
+ child = node.new_child( :name => 'new_name', :class => Page )
357
+ assert child.save , "Save succeeds"
358
+ assert_equal Zena::Status[:red], child.version.status
359
+ assert_equal child[:user_id], users_id(:ant)
360
+ assert_equal node[:dgroup_id], child[:dgroup_id]
361
+ assert_equal node[:rgroup_id], child[:rgroup_id]
362
+ assert_equal node[:wgroup_id], child[:wgroup_id]
363
+ assert_equal node[:section_id], child[:section_id]
364
+ assert_equal 1, child[:inherit]
365
+ assert_equal node[:id], child[:parent_id]
366
+ end
367
+
368
+ def test_secure_find_by_path
369
+ login(:tiger)
370
+ node = secure!(Node) { Node.find_by_path('projects/secret') }
371
+ assert_kind_of Node, node
372
+ assert_kind_of User, node.instance_variable_get(:@visitor)
373
+ login(:ant)
374
+ assert_raise(ActiveRecord::RecordNotFound) { node = secure!(Node) { Node.find_by_path('projects/secret') }}
375
+ end
376
+
377
+ def test_author
378
+ login(:tiger)
379
+ node = secure!(Node) { nodes(:cleanWater) }
380
+ assert_equal node.user.contact_id, node.author[:id]
381
+ assert_equal 'Panther Tigris Sumatran', node.author.fullname
382
+ login(:anon)
383
+ node = secure!(Node) { nodes(:status) }
384
+ assert_equal 'Solenopsis Invicta', node.author.fullname
385
+ end
386
+
387
+ def test_ext
388
+ node = nodes(:status)
389
+ node[:name] = 'bob. and bob.jpg'
390
+ assert_equal 'jpg', node.ext
391
+ node[:name] = 'no ext'
392
+ assert_equal '', node.ext
393
+ node[:name] = ''
394
+ assert_equal '', node.ext
395
+ node[:name] = nil
396
+ assert_equal '', node.ext
397
+ end
398
+
399
+ def test_set_name_with_title
400
+ login(:tiger)
401
+ node = secure!(Node) { Node.create(NEW_DEFAULT.stringify_keys.merge('name' => '', 'v_title' => 'small bed')) }
402
+ assert_kind_of Node, node
403
+ assert !node.new_record?
404
+ assert_equal 'smallBed', node.name
405
+ end
406
+
407
+ def test_set_name
408
+ node = nodes(:wiki)
409
+ node.name = " J'aime l'aïl en août ! "
410
+ assert_equal 'JAimeLAilEnAout', node.name
411
+ assert_equal 'JAimeLAilEnAout', node[:name]
412
+ node.name = "LIEUX"
413
+ assert_equal 'LIEUX', node.name
414
+ end
415
+
416
+
417
+ def test_change_project_to_page
418
+ login(:tiger)
419
+ node = secure!(Node) { nodes(:cleanWater) }
420
+ assert node.update_attributes(:klass => 'Page')
421
+ node = secure!(Node) { nodes(:cleanWater) }
422
+ assert_kind_of Page, node
423
+ assert_equal 'NP', node[:kpath]
424
+ assert_equal nodes_id(:zena), node.get_project_id
425
+ assert_equal nodes_id(:zena), nodes(:status)[:project_id]
426
+ assert_equal nodes_id(:zena), nodes(:lake)[:project_id]
427
+ end
428
+ #
429
+ # def test_cannot_change_root
430
+ # login(:tiger)
431
+ # node = secure!(Node) { Node.find(visitor.site[:root_id]) }
432
+ # node = node.change_to(Page)
433
+ # assert_nil node
434
+ # node = secure!(Node) { Node.find(visitor.site[:root_id]) }
435
+ # assert_kind_of Section, node
436
+ # end
437
+
438
+ context 'A visitor in the drive group of the root node' do
439
+ setup do
440
+ login(:tiger)
441
+ @node = secure!(Node) { nodes(:zena) }
442
+ end
443
+
444
+ should 'be allowed to change groups' do
445
+ # root nodes do not have a parent_id !!
446
+ # reference = self
447
+ @node[:dgroup_id] = groups_id(:public)
448
+ assert @node.save
449
+ end
450
+
451
+ should 'be allowed to change attributes' do
452
+ assert @node.update_attributes(:name => 'vodou', :event_at => Time.now)
453
+ end
454
+
455
+ should 'not be allowed to set parent' do
456
+ assert_nil @node[:parent_id]
457
+ assert !@node.update_attributes(:parent_id => nodes_id(:status))
458
+ assert_equal 'root should not have a parent', @node.errors[:parent_id]
459
+ end
460
+ end
461
+
462
+ context 'A visitor with drive access' do
463
+ setup do
464
+ login(:tiger)
465
+ @node = secure!(Node) { nodes(:wiki) }
466
+ end
467
+
468
+ context 'on a published node with documents' do
469
+
470
+ should 'see a published node with published documents' do
471
+ assert_equal Zena::Status[:pub], @node.version.status
472
+ assert_equal Zena::Status[:pub], versions(:bird_jpg_en).status
473
+ assert_equal Zena::Status[:pub], versions(:flower_jpg_en).status
474
+ end
475
+
476
+ should 'unpublish documents when unpublishing node' do
477
+ assert @node.unpublish
478
+ assert_equal Zena::Status[:rem], versions(:bird_jpg_en).status
479
+ assert_equal Zena::Status[:rem], versions(:flower_jpg_en).status
480
+ end
481
+ end
482
+
483
+ context 'on a removed node with removed documents' do
484
+ setup do
485
+ @node.unpublish
486
+ @node = secure!(Node) { nodes(:wiki) }
487
+ end
488
+
489
+ should 'see a removed node with removed documents' do
490
+ assert_equal Zena::Status[:rem], @node.version.status
491
+ assert_equal Zena::Status[:rem], versions(:bird_jpg_en).status
492
+ assert_equal Zena::Status[:rem], versions(:flower_jpg_en).status
493
+ end
494
+
495
+ should 'publish documents when publishing node' do
496
+ assert @node.publish
497
+ assert_equal Zena::Status[:pub], versions(:bird_jpg_en).status
498
+ assert_equal Zena::Status[:pub], versions(:flower_jpg_en).status
499
+ end
500
+ end
501
+
502
+ context 'on a redaction node with documents in redaction status' do
503
+ setup do
504
+ @node.unpublish
505
+ @node.redit
506
+ @node = secure!(Node) { nodes(:wiki) }
507
+ end
508
+
509
+ should 'see redactions' do
510
+ assert_equal Zena::Status[:red], @node.version.status
511
+ assert_equal Zena::Status[:red], versions(:bird_jpg_en).status
512
+ assert_equal Zena::Status[:red], versions(:flower_jpg_en).status
513
+ end
514
+
515
+ should 'propose documents when proposing node' do
516
+ assert @node.propose
517
+ assert_equal Zena::Status[:prop_with], versions(:bird_jpg_en).status
518
+ assert_equal Zena::Status[:prop_with], versions(:flower_jpg_en).status
519
+ end
520
+ end
521
+
522
+ context 'on a proposition with proposed documents' do
523
+ setup do
524
+ @node.unpublish
525
+ @node.redit
526
+ @node.propose
527
+ @node = secure!(Node) { nodes(:wiki) }
528
+ end
529
+
530
+ should 'see propositions' do
531
+ assert_equal Zena::Status[:prop], @node.version.status
532
+ assert_equal Zena::Status[:prop_with], versions(:bird_jpg_en).status
533
+ assert_equal Zena::Status[:prop_with], versions(:flower_jpg_en).status
534
+ end
535
+
536
+ should 'refuse documents when refusing node' do
537
+ assert @node.refuse
538
+ assert_equal Zena::Status[:red], versions(:bird_jpg_en).status
539
+ assert_equal Zena::Status[:red], versions(:flower_jpg_en).status
540
+ end
541
+ end
542
+ end
543
+
544
+
545
+ def test_change_section_to_project
546
+ login(:lion)
547
+ node = secure!(Node) { nodes(:people) }
548
+ assert_equal node[:id], node.get_section_id
549
+ assert_equal nodes_id(:zena), node.get_project_id
550
+
551
+ assert node.update_attributes(:klass => "Project")
552
+ node = secure!(Node) { nodes(:people) }
553
+ assert_kind_of Project, node
554
+ assert_equal 'NPP', node[:kpath]
555
+
556
+ assert_equal nodes_id(:zena), node.get_section_id
557
+ assert_equal node[:id], node.get_project_id
558
+
559
+ assert_equal nodes_id(:zena), nodes(:ant).get_section_id # children inherit new section_id
560
+ assert_equal nodes_id(:zena), nodes(:myLife).get_section_id
561
+ assert_equal node[:id], nodes(:ant).get_project_id # children inherit new project_id
562
+ assert_equal node[:id], nodes(:myLife).get_project_id
563
+ end
564
+
565
+ def test_sync_section
566
+ login(:tiger)
567
+ node = secure!(Node) { nodes(:cleanWater) }
568
+ assert_equal nodes_id(:zena), node[:section_id]
569
+ node[:parent_id] = nodes_id(:projects)
570
+ assert node.save
571
+ assert_equal nodes_id(:zena), node[:section_id]
572
+ assert_equal nodes_id(:zena), nodes(:cleanWater)[:section_id]
573
+ end
574
+
575
+ def test_sync_project_for_node
576
+ login(:tiger)
577
+ node = secure!(Node) { nodes(:people) }
578
+ assert_equal nodes_id(:zena), node[:section_id]
579
+ assert_equal nodes_id(:zena ), node[:project_id]
580
+ node[:parent_id] = nodes_id(:cleanWater)
581
+ assert node.save
582
+ assert_equal nodes_id(:cleanWater), node[:project_id]
583
+ assert_equal nodes_id(:cleanWater), nodes(:people)[:project_id]
584
+ assert_equal nodes_id(:zena ), node[:section_id]
585
+ assert_equal nodes_id(:zena ), nodes(:people)[:section_id]
586
+ end
587
+
588
+ def test_sync_project_for_section
589
+ login(:tiger)
590
+ node = secure!(Node) { nodes(:people) }
591
+ assert_equal nodes_id(:people), node.get_section_id
592
+ assert_equal nodes_id(:zena ), node[:project_id]
593
+ node[:parent_id] = nodes_id(:cleanWater)
594
+ assert node.save
595
+ assert_equal nodes_id(:cleanWater), node[:project_id]
596
+ assert_equal nodes_id(:cleanWater), nodes(:people)[:project_id]
597
+ assert_equal nodes_id(:people), node.get_section_id
598
+ assert_equal nodes_id(:zena), nodes(:people)[:section_id]
599
+ end
600
+
601
+ def test_all_children
602
+ login(:tiger)
603
+ assert_nothing_raised { secure!(Node) { nodes(:ant) } }
604
+ nodes = secure!(Node) { nodes(:people).send(:all_children) }
605
+ people = secure!(Node) { nodes(:people) }
606
+ assert_equal 4, nodes.size
607
+ assert_equal 4, people.find(:all, 'children').size
608
+ assert_raise(NoMethodError) { people.all_children } # private method
609
+ end
610
+
611
+ def test_url_name
612
+ assert_equal "salutJEcrisAujourdHui", "salut j'écris: Aujourd'hui ".url_name!
613
+ assert_equal "a--BabMol", " à,--/ bab* mol".url_name!
614
+ assert_equal "07.11.2006-mardiProchain", "07.11.2006-mardi_prochain".url_name!
615
+ assert_equal "Node-+login", "Node-+login".url_name!
616
+ end
617
+
618
+ def test_tags
619
+ login(:lion)
620
+ @node = secure!(Node) { nodes(:status) }
621
+ assert_nothing_raised { @node.find(:all, 'set_tags') }
622
+ assert_nil @node.find(:all, 'set_tags')
623
+ @node.rel['set_tag'].other_ids = [nodes_id(:art),nodes_id(:news)]
624
+ assert @node.save
625
+ tags = @node.find(:all, 'set_tags')
626
+ assert_equal 2, tags.size
627
+ assert_equal 'art', tags[0].name
628
+ assert_equal 'news', tags[1].name
629
+ @node.rel['set_tag'].other_ids = [nodes_id(:art)]
630
+ @node.save
631
+ tags = @node.find(:all, 'set_tags')
632
+ assert_equal 1, tags.size
633
+ assert_equal 'art', tags[0].name
634
+ end
635
+
636
+ def test_tag_update
637
+ login(:lion)
638
+ node = secure!(Node) { nodes(:art) }
639
+ assert node.update_attributes('tagged_ids' => [nodes_id(:status), nodes_id(:people)])
640
+ assert_equal 2, node.find(:all, 'tagged').size
641
+ stat = secure!(Node) { nodes(:status) }
642
+ peop = secure!(Node) { nodes(:people) }
643
+ assert_equal node[:id], stat.find(:first, 'set_tags')[:id]
644
+ assert_equal node[:id], peop.find(:first, 'set_tags')[:id]
645
+ end
646
+
647
+ def test_after_all_cache_sweep
648
+ with_caching do
649
+ login(:lion)
650
+ i = 1
651
+ assert_equal "content 1", Cache.with(visitor.id, visitor.group_ids, 'NP', 'pages') { "content #{i}" }
652
+ assert_equal "content 1", Cache.with(visitor.id, visitor.group_ids, 'NN', 'notes') { "content #{i}" }
653
+ i = 2
654
+ assert_equal "content 1", Cache.with(visitor.id, visitor.group_ids, 'NP', 'pages') { "content #{i}" }
655
+ assert_equal "content 1", Cache.with(visitor.id, visitor.group_ids, 'NN', 'notes') { "content #{i}" }
656
+
657
+ # do something on a project
658
+ node = secure!(Node) { nodes(:wiki) }
659
+ assert_equal 'NPP', node.class.kpath
660
+ assert node.update_attributes(:v_title=>'new title'), "Can change attributes"
661
+ # sweep only kpath NPP
662
+ i = 3
663
+ assert_equal "content 3", Cache.with(visitor.id, visitor.group_ids, 'NP', 'pages') { "content #{i}" }
664
+ assert_equal "content 1", Cache.with(visitor.id, visitor.group_ids, 'NN', 'notes') { "content #{i}" }
665
+
666
+ # do something on a note
667
+ node = secure!(Node) { nodes(:proposition) }
668
+ assert_equal 'NNP', node.vclass.kpath
669
+ assert node.update_attributes(:name => 'popo' ), "Can change attributes"
670
+ # sweep only kpath NN
671
+ i = 4
672
+ assert_equal "content 3", Cache.with(visitor.id, visitor.group_ids, 'NP', 'pages') { "content #{i}" }
673
+ assert_equal "content 4", Cache.with(visitor.id, visitor.group_ids, 'NN', 'notes') { "content #{i}" }
674
+ end
675
+ end
676
+
677
+ def test_empty_comments
678
+ login(:tiger)
679
+ node = secure!(Node) { nodes(:lake) }
680
+ assert node.discussion
681
+ assert_nil node.comments
682
+ end
683
+
684
+ def test_discussion_lang
685
+ login(:tiger)
686
+ node = secure!(Node) { nodes(:status) }
687
+ assert_equal Zena::Status[:pub], node.version.status
688
+ discussion = node.discussion
689
+ assert_kind_of Discussion, discussion
690
+ assert_equal discussions_id(:outside_discussion_on_status_en), discussion[:id]
691
+ login(:ant)
692
+ node = secure!(Node) { nodes(:status) }
693
+ discussion = node.discussion
694
+ assert discussion.new_record?, "New discussion"
695
+ assert_equal 'fr', discussion.lang
696
+ assert discussion.open?
697
+ assert !discussion.inside?
698
+ end
699
+
700
+ def test_closed_discussion
701
+ login(:tiger)
702
+ node = secure!(Node) { nodes(:status) }
703
+ discussion = node.discussion
704
+ discussion.update_attributes(:open=>false)
705
+ node = secure!(Node) { nodes(:status) }
706
+ assert_equal discussions_id(:outside_discussion_on_status_en), node.discussion[:id]
707
+ login(:ant)
708
+ node = secure!(Node) { nodes(:status) }
709
+ assert_nil node.discussion
710
+ node.update_attributes( :v_title=>'test' )
711
+ discussion = node.discussion
712
+ assert_kind_of Discussion, discussion
713
+ assert discussion.inside?
714
+ end
715
+
716
+ def test_inside_discussion
717
+ login(:tiger)
718
+ node = secure!(Node) { nodes(:status) }
719
+ node.update_attributes( :v_title=>'new status' )
720
+ assert_equal Zena::Status[:red], node.version.status
721
+ discussion = node.discussion
722
+ assert_equal discussions_id(:inside_discussion_on_status), discussion[:id]
723
+ end
724
+
725
+ def test_auto_create_discussion
726
+ login(:tiger)
727
+ post = secure!(Node) { Node.create_node(:v_status => Zena::Status[:pub], :v_title => 'a new post', :class => 'Post', :parent_id => nodes_zip(:cleanWater)) }
728
+ letter = secure!(Node) { Node.create_node(:v_status => Zena::Status[:pub], :v_title => 'a letter', :class => 'Letter', :parent_id => nodes_zip(:cleanWater)) }
729
+ assert !post.new_record?, "Not a new record"
730
+ assert !letter.new_record?, "Not a new record"
731
+ assert_equal Zena::Status[:pub], post.version.status, "Published"
732
+ assert_equal Zena::Status[:pub], letter.version.status, "Published"
733
+ assert !letter.discussion
734
+ assert post.discussion
735
+ assert !post.discussion.new_record?
736
+ login(:anon)
737
+ letter = secure!(Node) { Node.find(letter.id) }
738
+ post = secure!(Node) { Node.find(post.id) }
739
+ assert !letter.can_comment?
740
+ assert post.can_comment?
741
+ end
742
+
743
+ def test_auto_create_discussion
744
+ login(:tiger)
745
+ letter = secure!(Node) { Node.create_node(:v_status => Zena::Status[:pub], :v_title => 'a letter', :class => 'Letter', :parent_id => nodes_zip(:cleanWater)) }
746
+ assert !letter.new_record?, "Not a new record"
747
+ assert_equal Zena::Status[:pub], letter.version.status, "Published"
748
+ login(:lion)
749
+ letter = secure!(Node) { Node.find(letter.id) }
750
+ assert letter.can_auto_create_discussion?
751
+ assert Discussion.create(:node_id=>letter[:id], :lang=>'fr', :inside=>false)
752
+ # there is an open discussion in another lang
753
+ assert letter.can_auto_create_discussion?
754
+ end
755
+
756
+ def test_comments
757
+ login(:tiger)
758
+ node = secure!(Node) { nodes(:status) }
759
+ comments = node.comments
760
+ assert_kind_of Comment, comments[0]
761
+ assert_equal 'Nice site', comments[0][:title]
762
+ end
763
+
764
+ def test_comments_on_nil
765
+ login(:ant)
766
+ node = secure!(Node) { nodes(:cleanWater) }
767
+ assert_nil node.discussion # no open discussion here
768
+ assert_equal nil, node.comments
769
+ end
770
+
771
+ def test_site_id
772
+ login(:tiger)
773
+ node = secure!(Node) { Node.create(NEW_DEFAULT) }
774
+ err node
775
+ assert !node.new_record?, "Not a new record"
776
+ assert_equal sites_id(:zena), node[:site_id]
777
+ end
778
+
779
+ def test_other_site_id
780
+ login(:whale)
781
+ node = secure!(Node) { Node.create(:parent_id=>nodes_id(:ocean), :rgroup_id=>groups_id(:aqua), :wgroup_id=>groups_id(:masters), :dgroup_id=>groups_id(:masters), :name=>"fish") }
782
+ assert !node.new_record?, "Not a new record"
783
+ assert_equal sites_id(:ocean), node[:site_id]
784
+ end
785
+
786
+ def test_other_site_id_fool_id
787
+ login(:whale)
788
+ node = secure!(Node) { Node.create(:parent_id=>nodes_id(:ocean), :rgroup_id=>groups_id(:aqua), :wgroup_id=>groups_id(:masters), :dgroup_id=>groups_id(:masters), :name=>"fish", :site_id=>sites_id(:zena)) }
789
+ assert !node.new_record?, "Not a new record"
790
+ assert_equal sites_id(:ocean), node[:site_id]
791
+ end
792
+
793
+ def test_cannot_set_site_id
794
+ login(:tiger)
795
+ node = secure!(Node) { nodes(:status) }
796
+ original_site_id = node.site_id
797
+ node.update_attributes(:site_id => 1234 )
798
+ assert_equal original_site_id, node.site_id
799
+ end
800
+
801
+ def test_zip
802
+ next_zip = Zena::Db.fetch_row("SELECT zip FROM zips WHERE site_id = #{sites_id(:zena)}").to_i
803
+ login(:tiger)
804
+ node = secure!(Node) { Node.create(:parent_id=>nodes_id(:zena), :name=>"fly")}
805
+ assert !node.new_record?, "Not a new record"
806
+ assert_equal (next_zip + 1), node.zip
807
+ end
808
+
809
+ def test_find_by_zip
810
+ login(:tiger)
811
+ assert_raise(ActiveRecord::RecordNotFound) { node = secure!(Node) { Node.find_by_zip(99) } }
812
+ assert_kind_of Node, secure!(Node) { Node.find_by_zip(nodes_zip(:cleanWater)) }
813
+ end
814
+
815
+ def test_parent_zip
816
+ login(:tiger)
817
+ node = secure!(Node) { nodes(:status) }
818
+ parent = node.parent
819
+ assert_equal nodes_id( :cleanWater), parent[:id]
820
+ assert_equal nodes_zip(:cleanWater), node.parent_zip
821
+ end
822
+
823
+ def test_create_node
824
+ login(:ant)
825
+ node = secure!(Node) { Node.create_node(:parent_id => nodes_zip(:secret), :name => 'funny') }
826
+ assert_equal nodes_id(:secret), node[:parent_id]
827
+ assert node.new_record?, "Not saved"
828
+ assert_equal 'invalid reference', node.errors[:parent_id]
829
+ end
830
+
831
+ def test_create_node_with__parent_id
832
+ login(:ant)
833
+ node = secure!(Node) { Node.create_node(:_parent_id => nodes_id(:secret), :name => 'funny') }
834
+ assert_equal nodes_id(:secret), node[:parent_id]
835
+ assert node.new_record?, "Not saved"
836
+ assert_equal 'invalid reference', node.errors[:parent_id]
837
+ end
838
+
839
+ def test_create_node_ok
840
+ login(:tiger)
841
+ node = secure!(Node) { Node.create_node('parent_id' => nodes_zip(:cleanWater), 'name' => 'funny') }
842
+ assert_equal nodes_id(:cleanWater), node[:parent_id]
843
+ assert_equal 'funny', node[:name]
844
+ assert !node.new_record?
845
+ end
846
+
847
+ def test_create_or_update_node_create
848
+ login(:tiger)
849
+ node = secure!(Node) { Node.create_or_update_node('parent_id' => nodes_zip(:cleanWater), 'name' => 'funny') }
850
+ assert_equal nodes_id(:cleanWater), node[:parent_id]
851
+ assert_equal 'funny', node[:name]
852
+ assert !node.new_record?, "Saved"
853
+ end
854
+
855
+ def test_create_or_update_node_update
856
+ login(:tiger)
857
+ node = secure!(Node) { Node.create_or_update_node('parent_id' => nodes_zip(:cleanWater), 'name' => 'status', 'v_title'=>"It's all broken") }
858
+ assert_equal nodes_id(:cleanWater), node[:parent_id]
859
+ assert_equal nodes_id(:status), node[:id]
860
+ node = secure!(Node) { nodes(:status) }
861
+ assert_equal 'status', node[:name]
862
+ assert_equal "It's all broken", node.version.title
863
+ end
864
+
865
+ def test_create_with_klass
866
+ login(:tiger)
867
+ node = secure!(Node) { Node.create_node('parent_id' => nodes_zip(:projects), 'name' => 'funny', 'klass' => 'TextDocument', 'c_content_type' => 'application/x-javascript') }
868
+ assert_kind_of TextDocument, node
869
+ assert_equal nodes_id(:projects), node[:parent_id]
870
+ assert_equal 'funny', node[:name]
871
+ assert !node.new_record?, "Saved"
872
+ end
873
+
874
+ def test_get_class
875
+ assert_equal Node, Node.get_class('node')
876
+ assert_equal Node, Node.get_class('nodes')
877
+ assert_equal Node, Node.get_class('Node')
878
+ assert_equal virtual_classes(:Letter), Node.get_class('Letter')
879
+ assert_equal TextDocument, Node.get_class('TextDocument')
880
+ end
881
+
882
+ def test_get_attributes_from_yaml
883
+ f = Tempfile.new('any.yml')
884
+ path = f.path
885
+ File.open(path, 'w') do |file|
886
+ path = file.path
887
+ file.puts "first: I am the first
888
+ five: 5
889
+ done: \"I am done\""
890
+ end
891
+ attrs = Node.get_attributes_from_yaml(path)
892
+
893
+ assert_equal 'I am the first', attrs['first']
894
+ assert_equal 5, attrs['five']
895
+ assert_equal 'I am done', attrs['done']
896
+ end
897
+
898
+ def test_create_nodes_from_gzip_file
899
+ login(:tiger)
900
+ parent = secure!(Project) { Project.create(:name => 'import', :parent_id => nodes_id(:zena)) }
901
+ assert !parent.new_record?, "Not a new record"
902
+ nodes = secure!(Node) { Node.create_nodes_from_folder(:archive => uploaded_archive('simple.zml.gz'), :parent_id => parent[:id] )}.values
903
+ assert_equal 1, nodes.size
904
+ simple = nodes[0]
905
+ assert_kind_of Note, simple
906
+ assert_equal virtual_classes(:Post), simple.vclass
907
+ assert !simple.new_record?
908
+ end
909
+
910
+ def test_create_nodes_from_folder_with_defaults
911
+ login(:tiger)
912
+ parent = secure!(Project) { Project.create(:name => 'import', :parent_id => nodes_id(:zena), :rgroup_id => groups_id(:managers), :wgroup_id => groups_id(:managers)) }
913
+ assert !parent.new_record?, "Not a new record"
914
+ result = secure!(Node) { Node.create_nodes_from_folder(:folder => File.join(Zena::ROOT, 'test', 'fixtures', 'import'), :parent_id => parent[:id] )}.values
915
+ assert_equal 4, result.size
916
+
917
+ children = parent.find(:all, 'children order by name ASC')
918
+ assert_equal 2, children.size
919
+ assert_equal 'photos', children[0].name
920
+ assert_equal groups_id(:managers), children[0].rgroup_id
921
+ assert_equal 'simple', children[1].name
922
+ assert_equal groups_id(:managers), children[1].rgroup_id
923
+
924
+ # we use children[1] as parent just to use any empty node
925
+ result = secure!(Node) { Node.create_nodes_from_folder(:folder => File.join(Zena::ROOT, 'test', 'fixtures', 'import'), :parent_id => children[1][:id], :defaults => { :rgroup_id => groups_id(:public) } )}.values
926
+ assert_equal 4, result.size
927
+
928
+ children = children[1].find(:all, 'children order by name ASC')
929
+ assert_equal 2, children.size
930
+ assert_equal 'photos', children[0].name
931
+ assert_equal groups_id(:public), children[0].rgroup_id
932
+ end
933
+
934
+ def test_create_nodes_from_folder_with_publish
935
+ login(:tiger)
936
+ nodes = secure!(Node) { Node.create_nodes_from_folder(:folder => File.join(Zena::ROOT, 'test', 'fixtures', 'import'), :parent_id => nodes_id(:zena) )}.values
937
+ assert_equal Zena::Status[:red], nodes[0].version.status
938
+
939
+ nodes = secure!(Node) { Node.create_nodes_from_folder(:folder => File.join(Zena::ROOT, 'test', 'fixtures', 'import'), :parent_id => nodes_id(:cleanWater), :defaults => { :v_status => Zena::Status[:pub] }) }.values
940
+ assert_equal Zena::Status[:pub], nodes[0].version.status
941
+ end
942
+
943
+ def test_create_nodes_from_archive
944
+ login(:tiger)
945
+ res = secure!(Node) { Node.create_nodes_from_folder(:archive => uploaded_archive('import.tgz'), :parent_id => nodes_id(:zena)) }.values
946
+ photos = secure!(Section) { Section.find_by_name('photos') }
947
+ assert_kind_of Section, photos
948
+ bird = secure!(Node) { Node.find_by_parent_id_and_name(photos[:id], 'bird') }
949
+ assert_kind_of Image, bird
950
+ assert_equal 56183, bird.version.content.size
951
+ assert_equal 'Lucy in the sky', bird.version.title
952
+ visitor.lang = 'fr'
953
+ bird = secure!(Node) { Node.find_by_parent_id_and_name(photos[:id], 'bird') }
954
+ assert_equal 'Le septième ciel', bird.version.title
955
+ assert_equal 1, bird[:inherit]
956
+ assert_equal groups_id(:public), bird[:rgroup_id]
957
+ assert_equal groups_id(:workers), bird[:wgroup_id]
958
+ assert_equal groups_id(:managers), bird[:dgroup_id]
959
+
960
+ simple = secure!(Node) { Node.find_by_parent_id_and_name(nodes_id(:zena), 'simple') }
961
+ assert_equal 0, simple[:inherit]
962
+ assert_equal groups_id(:managers), simple[:rgroup_id]
963
+ assert_equal groups_id(:managers), simple[:wgroup_id]
964
+ assert_equal groups_id(:managers), simple[:dgroup_id]
965
+ end
966
+
967
+ def test_create_nodes_from_zip_archive
968
+ login(:tiger)
969
+ res = secure!(Node) { Node.create_nodes_from_folder(:archive => uploaded_zip('letter.zip'), :parent_id => nodes_id(:zena), :class => 'Letter') }.values
970
+ res.sort!{|a,b| a.name <=> b.name}
971
+ letter, bird = res[1], res[0]
972
+ assert_kind_of Note, letter
973
+ assert_equal 'Letter', letter.klass
974
+ end
975
+
976
+ def test_update_nodes_from_archive
977
+ preserving_files('test.host/data') do
978
+ bird = node = nil
979
+ login(:tiger)
980
+ node = secure!(Page) { Page.create(:parent_id => nodes_id(:status), :name=>'photos', :v_title => 'my photos', :v_text => '![]!') }
981
+ assert !node.new_record?
982
+ assert_nothing_raised { node = secure!(Node) { Node.find_by_path( 'projects/cleanWater/status/photos') } }
983
+ assert_raise(ActiveRecord::RecordNotFound) { node = secure!(Node) { Node.find_by_path( 'projects/cleanWater/status/photos/bird') } }
984
+ assert_equal 'photos', node.name
985
+ assert_no_match %r{I took during my last vacations}, node.version.text
986
+ v1_id = node.version.id
987
+ secure!(Node) { Node.create_nodes_from_folder(:archive => uploaded_archive('import.tgz'), :parent_id => nodes_id(:status)) }.values
988
+ assert_nothing_raised { node = secure!(Node) { Node.find_by_path( 'projects/cleanWater/status/photos') } }
989
+ assert_nothing_raised { bird = secure!(Node) { Node.find_by_path( 'projects/cleanWater/status/photos/bird') } }
990
+ assert_match %r{I took during my last vacations}, node.version.text
991
+ assert_equal v1_id, node.version.id
992
+ assert_kind_of Image, bird
993
+ end
994
+ end
995
+
996
+ def test_to_yaml
997
+ test_site('zena')
998
+ User.connection.execute "UPDATE users SET time_zone = 'Asia/Jakarta' WHERE id = #{users_id(:tiger)}"
999
+ login(:tiger)
1000
+ assert_equal 'Asia/Jakarta', visitor.time_zone
1001
+ status = secure!(Node) { nodes(:status) }
1002
+ assert status.update_attributes_with_transformation(:v_status => Zena::Status[:pub], :v_text => "This is a \"link\":#{nodes_zip(:projects)}.", :d_foo => "A picture: !#{nodes_zip(:bird_jpg)}!")
1003
+ yaml = status.to_yaml
1004
+ assert_match %r{v_text:\s+\"?This is a "link":\(\.\./\.\.\)\.}, yaml
1005
+ assert_match %r{d_foo:\s+\"?A picture: !\(\.\./\.\./wiki/bird\)!}, yaml
1006
+ assert_no_match %r{log_at}, yaml
1007
+
1008
+ prop = secure!(Node) { nodes(:proposition) }
1009
+ assert prop.update_attributes_with_transformation(:v_status => Zena::Status[:pub], :v_text => "This is a \"link\":#{nodes_zip(:projects)}.", :d_foo => "A picture: !#{nodes_zip(:bird_jpg)}!", :log_at => "2008-10-20 14:53")
1010
+ assert_equal Time.gm(2008,10,20,7,53), prop.log_at
1011
+ yaml = prop.to_yaml
1012
+ assert_match %r{v_text:\s+\"?This is a "link":\(\.\./\.\.\)\.}, yaml
1013
+ assert_match %r{d_foo:\s+\"?A picture: !\(\.\./\.\./wiki/bird\)!}, yaml
1014
+ assert_match %r{log_at:\s+\"?2008-10-20 14:53:00\"?$}, yaml
1015
+ end
1016
+
1017
+ def test_order_position
1018
+ login(:tiger)
1019
+ parent = secure!(Node) { nodes(:cleanWater) }
1020
+ children = parent.find(:all, 'children')
1021
+ assert_equal 8, children.size
1022
+ assert_equal 'bananas', children[0].name
1023
+ assert_equal 'crocodiles', children[1].name
1024
+
1025
+ Node.connection.execute "UPDATE nodes SET position = -1.0 WHERE id = #{nodes_id(:water_pdf)}"
1026
+ Node.connection.execute "UPDATE nodes SET position = -0.5 WHERE id = #{nodes_id(:lake)}"
1027
+ children = parent.find(:all, 'children')
1028
+ assert_equal 8, children.size
1029
+ assert_equal 'water', children[0].name
1030
+ assert_equal 'lakeAddress', children[1].name
1031
+ end
1032
+
1033
+ def test_plural_relation
1034
+ assert Node.plural_relation?('pages')
1035
+ assert Node.plural_relation?('children')
1036
+ assert ! Node.plural_relation?('parent')
1037
+ assert ! Node.plural_relation?('project')
1038
+ assert Node.plural_relation?('projects')
1039
+ assert Node.plural_relation?('posts')
1040
+ assert ! Node.plural_relation?('post')
1041
+ assert Node.plural_relation?('tags')
1042
+ assert Node.plural_relation?('tagged')
1043
+ end
1044
+
1045
+ def test_safe_read
1046
+ login(:ant)
1047
+ node = secure!(Node) {Node.find(:first, :conditions => ['id = ?', nodes_id(:lake)], :select => "*, 'foozibar' AS foobar") }
1048
+ status = secure!(Node) { nodes(:status) }
1049
+ assert_equal 'lakeAddress', node.safe_read('name')
1050
+ assert_equal 'The lake we love', node.safe_read('v_title')
1051
+ assert_equal 'gaspard', status.safe_read('d_assigned')
1052
+ assert_equal 'Between Tanzania, Congo and Zambia', node.safe_read('c_address')
1053
+ assert_equal 'foozibar', node.safe_read('foobar')
1054
+ end
1055
+
1056
+ def test_classes_for_form
1057
+ assert_equal [["Page", "Page"],
1058
+ ["  Project", "Project"],
1059
+ ["  Section", "Section"],
1060
+ ["    Skin", "Skin"]], Node.classes_for_form(:class=>'Page', :without=>'Document')
1061
+ end
1062
+
1063
+ def test_change_to_classes_for_form
1064
+ assert_equal [["Page", "Page"],
1065
+ ["  Project", "Project"],
1066
+ ["  Section", "Section"],
1067
+ ["    Skin", "Skin"]], Project.classes_for_form(:class=>'Page', :without=>'Document')
1068
+ end
1069
+
1070
+ def test_allowed_change_to_classes
1071
+ node_changes = Node.allowed_change_to_classes.reject{|k| k[/Dummy/]} # In case we are testing after Secure
1072
+ assert_equal ["Node","Note","Letter","Post","Page","Project","Section","Skin","Reference"], node_changes
1073
+
1074
+ assert_equal node_changes, Page.allowed_change_to_classes.reject{|k| k[/Dummy/]}
1075
+ assert_equal node_changes, Project.allowed_change_to_classes.reject{|k| k[/Dummy/]}
1076
+ assert_equal node_changes, Note.allowed_change_to_classes.reject{|k| k[/Dummy/]}
1077
+ assert_equal node_changes, Reference.allowed_change_to_classes.reject{|k| k[/Dummy/]}
1078
+
1079
+ assert_equal ["Document","TextDocument","Template"], Document.allowed_change_to_classes.reject{|k| k[/Dummy/]}
1080
+
1081
+ assert_equal ["Image"], Image.allowed_change_to_classes.reject{|k| k[/Dummy/]}
1082
+
1083
+ assert_equal ["Contact"], Contact.allowed_change_to_classes.reject{|k| k[/Dummy/]}
1084
+ end
1085
+
1086
+ def test_match_one_node_only
1087
+ login(:tiger)
1088
+ match = secure!(Node) { Node.find(:all, Node.match_query('opening')) }
1089
+ assert_equal 1, match.size
1090
+ assert_equal nodes_id(:opening), match[0][:id]
1091
+ end
1092
+
1093
+ def find_nodes_with_pagination_in_cleanWaterProject(page, per_page = 3, opts=nil)
1094
+ previous_page, collection, next_page = nil, nil, nil
1095
+ opts ||= {:conditions => ['project_id = ?', nodes_id(:cleanWater)], :order=>'name ASC'}
1096
+ collection = secure(Node) do
1097
+ previous_page, collection, next_page = Node.find_with_pagination(:all, opts.merge(:page=>page, :per_page=>per_page))
1098
+ collection
1099
+ end
1100
+ [previous_page, collection, next_page]
1101
+ end
1102
+
1103
+ def test_find_with_pagination_page_1
1104
+ login(:tiger)
1105
+ previous_page, collection, next_page = find_nodes_with_pagination_in_cleanWaterProject(1,3)
1106
+ assert_nil previous_page
1107
+ assert_equal 2, next_page
1108
+ assert_equal 3, collection.size
1109
+ assert_equal [:bananas, :crocodiles, :lake_jpg].map{|s| nodes_id(s)}, collection.map{|r| r[:id]}
1110
+ end
1111
+
1112
+ def test_find_with_pagination_page_2
1113
+ login(:tiger)
1114
+ previous_page, collection, next_page = find_nodes_with_pagination_in_cleanWaterProject(2,3)
1115
+ assert_equal 1, previous_page
1116
+ assert_equal 3, next_page
1117
+ assert_equal 3, collection.size
1118
+ assert_equal [:lake, :opening, :status].map{|s| nodes_id(s)}, collection.map{|r| r[:id]}
1119
+ end
1120
+
1121
+ def test_find_with_pagination_page_3
1122
+ login(:tiger)
1123
+ previous_page, collection, next_page = find_nodes_with_pagination_in_cleanWaterProject(3,3)
1124
+ assert_equal 2, previous_page
1125
+ assert_nil next_page
1126
+ assert_equal 2, collection.size
1127
+ assert_equal [:track, :water_pdf].map{|s| nodes_id(s)}, collection.map{|r| r[:id]}
1128
+ end
1129
+
1130
+ def test_find_with_pagination_page_4
1131
+ login(:tiger)
1132
+ previous_page, collection, next_page = find_nodes_with_pagination_in_cleanWaterProject(4,3)
1133
+ assert_equal 3, previous_page
1134
+ assert_nil next_page
1135
+ assert_nil collection
1136
+ end
1137
+
1138
+ def test_find_match_with_pagination
1139
+ login(:tiger)
1140
+ previous_page, match, next_page, count_all = secure!(Node) { Node.find_with_pagination(:all, Node.match_query('opening').merge(:page => 1, :per_page => 3)) }
1141
+ assert_equal 1, match.size
1142
+ assert_equal 1, count_all
1143
+ assert_nil previous_page
1144
+ assert_nil next_page
1145
+ assert_equal nodes_id(:opening), match[0][:id]
1146
+ end
1147
+
1148
+ def test_data
1149
+ login(:ant)
1150
+ node = secure!(Node) { nodes(:cleanWater) }
1151
+ entries = node.data
1152
+ assert_equal 4, entries.size
1153
+ assert_equal BigDecimal.new("13.0"), entries[2].value
1154
+ node = secure!(Node) { nodes(:tiger) }
1155
+ assert_nil node.data
1156
+ assert_nil node.data_b
1157
+ end
1158
+
1159
+ def test_data_d
1160
+ login(:ant)
1161
+ node = secure!(Node) { nodes(:cleanWater) }
1162
+ entries = node.data_d
1163
+ assert_equal 1, entries.size
1164
+ assert_equal BigDecimal.new("56"), entries[0].value
1165
+ end
1166
+
1167
+ def test_icon_by_relation
1168
+ login(:ant)
1169
+ node = secure!(Node) { nodes(:cleanWater) } # has an 'icon' relation
1170
+ icon = node.icon
1171
+ assert_kind_of Image, icon
1172
+ assert_equal nodes_id(:lake_jpg), icon[:id]
1173
+ end
1174
+
1175
+ def test_icon_by_first_child
1176
+ login(:tiger)
1177
+ node = secure!(Node) { nodes(:wiki) } # has no 'icon' relation
1178
+ icon = node.icon
1179
+ assert_kind_of Image, icon
1180
+ assert_equal nodes_id(:bird_jpg), icon[:id] # first child
1181
+ # define flower as icon
1182
+ assert node.update_attributes(:icon_id => nodes_id(:flower_jpg))
1183
+ node = secure!(Node) { nodes(:wiki) } # reload
1184
+ icon = node.icon
1185
+ assert_kind_of Image, icon
1186
+ assert_equal nodes_id(:flower_jpg), icon[:id] # icon
1187
+ end
1188
+
1189
+
1190
+ context 'A class\' native classes hash' do
1191
+ should 'be indexed by kpath' do
1192
+ assert_equal ['N', 'ND', 'NDI', 'NDT', 'NDTT', 'NN', 'NP', 'NPP', 'NPS', 'NPSS', 'NR', 'NRC', 'NU', 'NUS'], Node.native_classes.keys.sort
1193
+ assert_equal ['ND', 'NDI', 'NDT', 'NDTT'], Document.native_classes.keys.sort
1194
+ end
1195
+
1196
+ should 'should point to real (ruby) sub-classes and self' do
1197
+ assert Page.native_classes.values.include?(Page)
1198
+ assert Page.native_classes.values.include?(Project)
1199
+ assert !Project.native_classes.values.include?(Page)
1200
+ end
1201
+ end
1202
+
1203
+ context 'A node' do
1204
+ setup do
1205
+ login(:tiger)
1206
+ @status = secure!(Node){nodes(:status)}
1207
+ @proposition = secure!(Node){nodes(:proposition)}
1208
+ end
1209
+
1210
+ should 'respond true to vkind_of if it contains a class (real or virtual) in its hierarchy' do
1211
+ assert @status.vkind_of?('Page')
1212
+ assert @proposition.vkind_of?('Post')
1213
+ end
1214
+
1215
+ should 'not respond true to vkind_of if it does not contain the class in its heirarchy' do
1216
+ assert !@status.vkind_of?('Document')
1217
+ assert !@status.vkind_of?('Post')
1218
+ end
1219
+ end
1220
+
1221
+ context 'A class (real or virtual)' do
1222
+ should 'be found from its kpath' do
1223
+ assert_equal Node, Node.get_class_from_kpath('N')
1224
+ assert_equal Page, Node.get_class_from_kpath('NP')
1225
+ assert_equal Image, Node.get_class_from_kpath('NDI')
1226
+ assert_equal virtual_classes(:Post), Node.get_class_from_kpath('NNP')
1227
+ assert_equal virtual_classes(:Letter), Node.get_class_from_kpath('NNL')
1228
+ assert_equal TextDocument, Node.get_class_from_kpath('NDT')
1229
+ end
1230
+ end
1231
+
1232
+
1233
+ def test_position_on_create
1234
+ login(:lion)
1235
+ node = secure!(Page) { Page.create(:name=>"yoba", :parent_id => nodes_id(:cleanWater), :inherit=>1 ) }
1236
+ assert !node.new_record?
1237
+ assert_equal 0.0, node.position
1238
+ assert node.update_attributes(:position => 5.0)
1239
+ assert_equal 5.0, node.position
1240
+ node = secure!(Page) { Page.find_by_id(node.id) } # reload
1241
+ assert_equal 5.0, node.position
1242
+ node = secure!(Page) { Page.create(:name=>"babo", :parent_id => nodes_id(:cleanWater), :inherit=>1 ) }
1243
+ assert !node.new_record?
1244
+ assert_equal 6.0, node.position
1245
+
1246
+ # position has different scopes depending on first two letters of kpath: 'ND', 'NN', 'NP', 'NR'
1247
+ doc = secure!(Document) { Document.create( :parent_id=>nodes_id(:cleanWater),
1248
+ :c_file => uploaded_file('water.pdf', 'application/pdf', 'wat'), :v_title => "lazy waters.pdf") }
1249
+ assert !doc.new_record?
1250
+ assert_equal 0.0, doc.position
1251
+
1252
+ # move
1253
+ assert node.update_attributes(:parent_id => nodes_id(:wiki))
1254
+ assert_equal 0.0, node.position
1255
+
1256
+ # move a page
1257
+ node = secure!(Node) { nodes(:art)}
1258
+ assert_equal 0.0, node.position
1259
+ assert node.update_attributes(:parent_id => nodes_id(:cleanWater))
1260
+ assert_equal 6.0, node.position
1261
+
1262
+ # move a document
1263
+ node = secure!(Node) { nodes(:bird_jpg)}
1264
+ assert_equal 0.0, node.position
1265
+ assert node.update_attributes(:parent_id => nodes_id(:cleanWater))
1266
+ assert_equal 0.0, node.position
1267
+ end
1268
+
1269
+ def test_add_comment
1270
+ login(:lion)
1271
+ node = secure!(Node) { nodes(:lion) }
1272
+ assert node.can_comment?
1273
+ assert_nil node.comments
1274
+
1275
+ node = secure!(Node) { nodes(:lion) } # reload
1276
+ assert node.update_attributes(:m_title => 'changed icon', :m_text => 'new icon is "flower"', :icon_id => nodes_id(:flower_jpg))
1277
+
1278
+ node = secure!(Node) { nodes(:lion) } # reload
1279
+ comments = node.comments
1280
+ assert_equal 1, comments.size
1281
+ comment = comments[0]
1282
+ assert_equal 'changed icon', comment[:title]
1283
+ assert_equal 'new icon is "flower"', comment[:text]
1284
+ assert_equal 'Panthera Leo Verneyi', comment.author_name
1285
+ end
1286
+
1287
+ def test_custom_a
1288
+ login(:lion)
1289
+ node = secure!(Node) { nodes(:status) }
1290
+ assert_nil node.custom_a
1291
+ assert node.update_attributes(:custom_a => 10)
1292
+
1293
+ node = secure!(Node) { nodes(:status) }
1294
+ assert_equal 10, node.custom_a
1295
+
1296
+ assert node.update_attributes(:custom_a => '')
1297
+
1298
+ node = secure!(Node) { nodes(:status) }
1299
+ assert_nil node.custom_a
1300
+ end
1301
+
1302
+ def test_replace_attributes_in_values
1303
+ login(:lion)
1304
+ node = secure!(Node) { nodes(:status) }
1305
+ new_attributes = node.replace_attributes_in_values(:foo => "id: [id], v_title: [v_title]")
1306
+ assert_equal "id: 22, v_title: status title", new_attributes[:foo]
1307
+ end
1308
+
1309
+ def test_copy
1310
+ login(:lion)
1311
+ node = secure!(Node) { nodes(:status) }
1312
+ new_attributes = secure(Node) { Node.transform_attributes(:copy_id => nodes_zip(:bird_jpg), :icon_id => '[id]')}
1313
+ assert_equal Hash['icon_id', nodes_id(:bird_jpg)], new_attributes
1314
+ assert node.update_attributes_with_transformation(:copy_id => nodes_zip(:bird_jpg), :icon_id => '[id]')
1315
+ assert_equal nodes_id(:bird_jpg), node.find(:first, 'icon')[:id]
1316
+ end
1317
+
1318
+ def test_export
1319
+ without_files('/test.host/tmp') do
1320
+ login(:tiger)
1321
+ export_folder = File.join(SITES_ROOT, 'test.host', 'tmp')
1322
+ FileUtils::mkpath(export_folder)
1323
+ # Add a page and a text document into 'wiki'
1324
+ assert secure!(Node) { Node.create(:v_title=>"Hello World!", :v_text => "Bonjour", :parent_id => nodes_id(:wiki), :inherit=>1 ) }
1325
+ assert secure!(TextDocument) { TextDocument.create(:name=>"yoba", :parent_id => nodes_id(:wiki), :v_text => "#header { color:red; }\n#footer { color:blue; }", :c_content_type => 'text/css') }
1326
+ wiki = secure!(Node) { nodes(:wiki) }
1327
+ assert_equal 4, wiki.find(:all, "children").size
1328
+ wiki.export_to_folder(export_folder)
1329
+ assert File.exist?(File.join(export_folder, 'wiki.zml'))
1330
+ assert File.exist?(File.join(export_folder, 'wiki'))
1331
+ assert File.exist?(File.join(export_folder, 'wiki', 'bird.jpg'))
1332
+ assert !File.exist?(File.join(export_folder, 'wiki', 'bird.zml'))
1333
+ assert File.exist?(File.join(export_folder, 'wiki', 'flower.jpg'))
1334
+ assert !File.exist?(File.join(export_folder, 'wiki', 'flower.zml'))
1335
+ assert File.exist?(File.join(export_folder, 'wiki', 'yoba.css'))
1336
+ assert !File.exist?(File.join(export_folder, 'wiki', 'yoba.zml'))
1337
+ assert File.exist?(File.join(export_folder, 'wiki', 'HelloWorld.zml'))
1338
+ end
1339
+ end
1340
+
1341
+ def test_archive
1342
+ without_files('/test.host/tmp') do
1343
+ login(:tiger)
1344
+ export_folder = File.join(SITES_ROOT, 'test.host', 'tmp')
1345
+ FileUtils::mkpath(export_folder)
1346
+ # Add a page and a text document into 'wiki'
1347
+ assert secure!(Node) { Node.create(:v_title=>"Hello World!", :v_text => "Bonjour", :parent_id => nodes_id(:wiki), :inherit=>1 ) }
1348
+ assert secure!(TextDocument) { TextDocument.create(:name=>"yoba", :parent_id => nodes_id(:wiki), :v_text => "#header { color:red; }\n#footer { color:blue; }", :c_content_type => 'text/css') }
1349
+ wiki = secure!(Node) { nodes(:wiki) }
1350
+ assert_equal 4, wiki.find(:all, "children").size
1351
+ archive = wiki.archive
1352
+ `tar -C '#{export_folder}' -xz < '#{archive.path}'`
1353
+ assert File.exist?(File.join(export_folder, 'wiki.zml'))
1354
+ assert File.exist?(File.join(export_folder, 'wiki'))
1355
+ assert File.exist?(File.join(export_folder, 'wiki', 'bird.jpg'))
1356
+ assert !File.exist?(File.join(export_folder, 'wiki', 'bird.zml'))
1357
+ assert File.exist?(File.join(export_folder, 'wiki', 'flower.jpg'))
1358
+ assert !File.exist?(File.join(export_folder, 'wiki', 'flower.zml'))
1359
+ assert File.exist?(File.join(export_folder, 'wiki', 'yoba.css'))
1360
+ assert !File.exist?(File.join(export_folder, 'wiki', 'yoba.zml'))
1361
+ assert File.exist?(File.join(export_folder, 'wiki', 'HelloWorld.zml'))
1362
+ end
1363
+ end
1364
+
1365
+ def test_translate_pseudo_id
1366
+ login(:lion)
1367
+ { '11' => nodes_id(:zena),
1368
+ nodes_zip(:cleanWater).to_i => nodes_id(:cleanWater),
1369
+ nodes_zip(:status) => nodes_id(:status)
1370
+ }.each do |k,v|
1371
+ assert_equal v, secure(Node) { Node.translate_pseudo_id(k) }, "'#{k}' should translate to '#{v}'"
1372
+ end
1373
+ end
1374
+
1375
+ def test_translate_pseudo_id_path
1376
+ login(:lion)
1377
+ lion = secure!(Node) { nodes(:lion) }
1378
+ people = secure!(Node) { nodes(:people) }
1379
+ cleanWater = secure!(Node) { nodes(:cleanWater) }
1380
+ assert lion.update_attributes(:name => 'status')
1381
+ assert_equal 'people/status', lion.fullpath
1382
+ # path base_node
1383
+ { ['(/projects/cleanWater/status)', nil] => nodes_id(:status),
1384
+ ['(/projects/cleanWater/status)', people] => nodes_id(:status),
1385
+ ['(status)', people] => nodes_id(:lion),
1386
+ ['(status)', cleanWater] => nodes_id(:status),
1387
+ }.each do |k,v|
1388
+ assert_equal v, secure(Node) { Node.translate_pseudo_id(k[0],:id,k[1]) }, "'#{k.inspect}' should translate to '#{v}'"
1389
+ end
1390
+ end
1391
+
1392
+ def test_unparse_assets
1393
+ login(:lion)
1394
+ @node = secure!(Node) { nodes(:status) }
1395
+ assert @node.update_attributes(:v_text => "Hello this is \"art\":#{nodes_zip(:art)}. !#{nodes_zip(:bird_jpg)}!")
1396
+ assert_equal "Hello this is \"art\":(../../../collections/art). !(../../wiki/bird)!", @node.unparse_assets(@node.version.text, self, 'v_text')
1397
+ end
1398
+
1399
+ def test_parse_assets
1400
+ login(:lion)
1401
+ @node = secure!(Node) { nodes(:status) }
1402
+ assert @node.update_attributes(:v_text => "Hello this is \"art\":(../../../collections/art).")
1403
+ assert_equal "Hello this is \"art\":#{nodes_zip(:art)}.", @node.parse_assets(@node.version.text, self, 'v_text')
1404
+ end
1405
+
1406
+ context 'Finding safe method type' do
1407
+ context 'for safe methods in class' do
1408
+ should 'return method name' do
1409
+ ['m_text', 'inherit', 'l_status', 'l_comment', 'm_text', 'inherit'].each do |k|
1410
+ assert_equal k, Contact.safe_method_type([k])[:method]
1411
+ end
1412
+ end
1413
+ end
1414
+
1415
+ context 'for methods not declared as safe in the class' do
1416
+ should 'return nil' do
1417
+ ['puts', 'raise', 'blah', 'system', 'id'].each do |k|
1418
+ assert_nil Contact.safe_method_type([k])
1419
+ end
1420
+ end
1421
+ end
1422
+
1423
+ context 'for relation pseudo-methods' do
1424
+ should 'use rel and try' do
1425
+ ['hot_status', 'blah_comment', 'blah_zips', 'blah_id', 'blah_ids'].each do |k|
1426
+ assert_match %r{rel\[.#{k.gsub(/_.+/,'')}.\]\.try}, Contact.safe_method_type([k])[:method]
1427
+ end
1428
+ end
1429
+ end
1430
+
1431
+ context 'for safe methods in version using nested alias' do
1432
+ should 'return version and method name when safe' do
1433
+ ['v_status', 'v_title'].each do |k|
1434
+ assert_equal "version.#{k[2..-1]}", Contact.safe_method_type([k])[:method]
1435
+ end
1436
+ end
1437
+
1438
+ should 'return version and safe_read when unsafe' do
1439
+ ['v_foo'].each do |k|
1440
+ assert_equal "version.safe_read(\"#{k[2..-1]}\")", Contact.safe_method_type([k])[:method]
1441
+ end
1442
+ end
1443
+ end
1444
+
1445
+ context 'for dynattributes using nested alias' do
1446
+ should 'return dyn access' do
1447
+ ['d_something', 'd_foo'].each do |k|
1448
+ assert_equal "version.dyn[\"#{k[2..-1]}\"]", Contact.safe_method_type([k])[:method]
1449
+ end
1450
+ end
1451
+ end
1452
+
1453
+ context 'for methods in content using nested alias' do
1454
+ should 'use safe_content_read when method not declared' do
1455
+ ['c_first_name', 'c_name', 'c_system'].each do |k|
1456
+ assert_equal "version.safe_content_read(\"#{k[2..-1]}\")", Node.safe_method_type([k])[:method]
1457
+ end
1458
+ end
1459
+
1460
+ should 'use method name when safe' do
1461
+ ['c_first_name', 'c_name'].each do |k|
1462
+ assert_equal "version.content.#{k[2..-1]}", Contact.safe_method_type([k])[:method]
1463
+ end
1464
+ end
1465
+ end
1466
+ end
1467
+
1468
+ def test_safe_
1469
+ ['c_file', 'c_blah', 'c_system'].each do |k|
1470
+ assert_match %r{safe_content_read\(.#{k.gsub(/^.+_/,'')}.\)}, Contact.safe_method_type([k])[:method], "#{k} should use safe_read"
1471
+ end
1472
+
1473
+
1474
+ ['c_file'].each do |k|
1475
+ assert Image.safe_method_type([k]), "#{k} should be safe"
1476
+ end
1477
+ end
1478
+
1479
+ def test_sync_name_on_v_title_change_no_sync
1480
+ login(:tiger)
1481
+ # We do not care anymore if the node was not in sync
1482
+ node = secure!(Node) { nodes(:status) }
1483
+ assert node.update_attributes(:v_title => 'simply different')
1484
+ assert node.publish
1485
+ assert_equal 'simplyDifferent', node.name
1486
+ visitor.lang = 'fr'
1487
+ # not ref lang
1488
+ node = secure!(Node) { nodes(:people) }
1489
+ assert node.update_attributes(:v_title => 'nice people')
1490
+ assert node.publish
1491
+ assert_equal 'fr', node.version.lang
1492
+ assert_equal 'people', node.name
1493
+ end
1494
+
1495
+ def test_sync_name_on_v_title_change
1496
+ login(:tiger)
1497
+ # was in sync, correct lang
1498
+ node = secure!(Node) { nodes(:people) }
1499
+ assert node.update_attributes(:v_title => 'nice people')
1500
+ assert_equal 'people', node.name
1501
+ assert_equal Zena::Status[:red], node.version.status
1502
+ assert node.publish
1503
+ assert_equal 'nicePeople', node.name
1504
+ end
1505
+
1506
+ def test_sync_name_before_publish_if_single_version
1507
+ login(:ant)
1508
+ node = secure!(Node) { Node.create(:v_title => 'Eve', :parent_id => nodes_id(:people)) }
1509
+ assert_equal Zena::Status[:red], node.version.status
1510
+ assert_equal 'Eve', node.name
1511
+ node.update_attributes(:v_title => 'Lilith')
1512
+ assert_equal Zena::Status[:red], node.version.status
1513
+ assert_equal 'Lilith', node.name
1514
+ end
1515
+
1516
+ def test_sync_name_on_v_title_change_auto_pub_no_sync
1517
+ Site.connection.execute "UPDATE sites set auto_publish = 1, redit_time = 3600 WHERE id = #{sites_id(:zena)}"
1518
+ Version.connection.execute "UPDATE versions set updated_at = '#{Time.now.strftime('%Y-%m-%d %H:%M:%S')}' WHERE node_id IN (#{nodes_id(:status)},#{nodes_id(:people)})"
1519
+ login(:tiger)
1520
+
1521
+ node = secure!(Node) { nodes(:status) }
1522
+ assert node.update_attributes(:v_title => 'simply different')
1523
+ assert_equal 'simplyDifferent', node.name
1524
+ visitor.lang = 'fr'
1525
+ # not ref lang
1526
+ node = secure!(Node) { nodes(:people) }
1527
+ assert node.update_attributes(:v_title => 'nice people')
1528
+ assert_equal 'fr', node.version.lang
1529
+ assert_equal 'people', node.name
1530
+ end
1531
+
1532
+ def test_sync_name_on_v_title_change_auto_pub
1533
+ test_site('zena')
1534
+ Site.connection.execute "UPDATE sites set auto_publish = 1, redit_time = 3600 WHERE id = #{sites_id(:zena)}"
1535
+ Version.connection.execute "UPDATE versions set updated_at = '#{Time.now.strftime('%Y-%m-%d %H:%M:%S')}' WHERE node_id IN (#{nodes_id(:people)})"
1536
+ login(:tiger)
1537
+ node = secure!(Node) { nodes(:people) }
1538
+ # was in sync, correct lang
1539
+ assert_equal node.name, node.version.title
1540
+ assert node.update_attributes(:v_title => 'nice people')
1541
+ node = secure!(Node) { nodes(:people) }
1542
+ assert_equal 'nice people', node.version.title
1543
+ assert_equal 'nicePeople', node.name
1544
+ end
1545
+
1546
+ # FIXME: write test
1547
+ def test_assets
1548
+ print 'P'
1549
+ # sweep_cache (save) => remove asset folder
1550
+ # render math ?
1551
+ end
1552
+
1553
+ def find_node_by_pseudo(string, base_node = nil)
1554
+ secure(Node) { Node.find_node_by_pseudo(string, base_node || @node) }
1555
+ end
1556
+
1557
+ def test_should_parse_event_at_date
1558
+ I18n.locale = 'fr'
1559
+ visitor.time_zone = 'Asia/Jakarta'
1560
+ v = secure(Node) {Node.new('event_at' => '9-9-2009 15:17')}
1561
+ assert_equal Time.utc(2009,9,9,8,17), v.event_at
1562
+ end
1563
+
1564
+ def test_should_parse_log_at_date
1565
+ I18n.locale = 'fr'
1566
+ visitor.time_zone = 'Asia/Jakarta'
1567
+ v = secure(Node) {Node.new('log_at' => '9-9-2009 15:17')}
1568
+ assert_equal Time.utc(2009,9,9,8,17), v.log_at
1569
+ end
1570
+
1571
+ def test_parse_keys
1572
+ node = secure(Node) { nodes(:status) }
1573
+ assert_equal ['d_assigned', 'v_text', 'v_title', 'v_summary', 'd_problems', 'd_archive'], node.parse_keys
1574
+
1575
+ note = secure(Node) { nodes(:opening) }
1576
+ assert_equal ['v_text', 'v_title', 'v_summary'], note.parse_keys
1577
+ end
1578
+ end