zena 0.16.9 → 1.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (572) hide show
  1. data/.gitignore +16 -3
  2. data/CREDITS +8 -4
  3. data/History.txt +12 -15
  4. data/app/controllers/application_controller.rb +1 -0
  5. data/app/controllers/columns_controller.rb +130 -0
  6. data/app/controllers/documents_controller.rb +16 -4
  7. data/app/controllers/groups_controller.rb +1 -5
  8. data/app/controllers/iformats_controller.rb +1 -5
  9. data/app/controllers/nodes_controller.rb +116 -41
  10. data/app/controllers/preferences_controller.rb +2 -0
  11. data/app/controllers/relations_controller.rb +1 -5
  12. data/app/controllers/sites_controller.rb +1 -5
  13. data/app/controllers/user_sessions_controller.rb +8 -3
  14. data/app/controllers/users_controller.rb +23 -11
  15. data/app/controllers/versions_controller.rb +29 -46
  16. data/app/controllers/virtual_classes_controller.rb +20 -12
  17. data/app/helpers/documents_helper.rb +5 -1
  18. data/app/models/attachment.rb +41 -0
  19. data/app/models/base_contact.rb +79 -0
  20. data/app/models/cache.rb +2 -2
  21. data/app/models/cached_page.rb +5 -4
  22. data/app/models/column.rb +90 -0
  23. data/app/models/comment.rb +3 -1
  24. data/app/models/contact_content.rb +5 -5
  25. data/app/models/contact_version.rb +2 -2
  26. data/app/models/data_entry.rb +9 -8
  27. data/app/models/discussion.rb +4 -0
  28. data/app/models/document.rb +170 -42
  29. data/app/models/document_content.rb +5 -9
  30. data/app/models/group.rb +4 -3
  31. data/app/models/idx_nodes_ml_string.rb +5 -0
  32. data/app/models/idx_nodes_string.rb +5 -0
  33. data/app/models/idx_template.rb +35 -0
  34. data/app/models/iformat.rb +4 -4
  35. data/app/models/image.rb +193 -26
  36. data/app/models/link.rb +1 -1
  37. data/app/models/node.rb +358 -338
  38. data/app/models/note.rb +2 -4
  39. data/app/models/page.rb +10 -8
  40. data/app/models/reference.rb +1 -1
  41. data/app/models/relation.rb +40 -1
  42. data/app/models/relation_proxy.rb +37 -40
  43. data/app/models/role.rb +19 -0
  44. data/app/models/site.rb +54 -24
  45. data/app/models/skin.rb +1 -16
  46. data/app/models/template.rb +92 -62
  47. data/app/models/template_content.rb +12 -6
  48. data/app/models/text_document.rb +69 -36
  49. data/app/models/text_document_content.rb +3 -3
  50. data/app/models/user.rb +34 -13
  51. data/app/models/version.rb +47 -291
  52. data/app/models/virtual_class.rb +26 -29
  53. data/app/views/columns/_add.html.erb +6 -0
  54. data/app/views/columns/_form.html.erb +36 -0
  55. data/app/views/columns/_li.html.erb +11 -0
  56. data/app/views/columns/create.rjs +8 -0
  57. data/app/views/columns/destroy.rjs +6 -0
  58. data/app/views/columns/edit.html.erb +5 -0
  59. data/app/views/columns/index.html.erb +15 -0
  60. data/app/views/columns/new.html.erb +2 -0
  61. data/app/views/columns/show.rjs +1 -0
  62. data/app/views/columns/update.rjs +5 -0
  63. data/app/views/comments/_li.rhtml +1 -1
  64. data/app/views/comments/create.rjs +1 -1
  65. data/app/views/comments/index.rhtml +1 -1
  66. data/app/views/comments/publish.rjs +1 -1
  67. data/app/views/comments/remove.rjs +1 -1
  68. data/app/views/data_entries/_li.html.erb +1 -1
  69. data/app/views/discussions/create.rjs +1 -1
  70. data/app/views/documents/_crop.rhtml +4 -4
  71. data/app/views/documents/crop_form.rjs +1 -1
  72. data/app/views/documents/new.rhtml +1 -1
  73. data/app/views/documents/show.rhtml +4 -4
  74. data/app/views/groups/_form.rhtml +1 -1
  75. data/app/views/groups/index.rhtml +1 -1
  76. data/app/views/iformats/_form.rhtml +1 -1
  77. data/app/views/iformats/create.rjs +1 -1
  78. data/app/views/iformats/index.rhtml +1 -1
  79. data/app/views/links/create.rjs +1 -1
  80. data/app/views/links/destroy.rjs +1 -1
  81. data/app/views/links/show.rjs +1 -1
  82. data/app/views/nodes/_dates.rhtml +2 -2
  83. data/app/views/nodes/_gallery.rhtml +2 -2
  84. data/app/views/nodes/_list_nodes.rhtml +2 -2
  85. data/app/views/nodes/_parent.rhtml +1 -1
  86. data/app/views/nodes/_position.rhtml +2 -2
  87. data/app/views/nodes/_results.rhtml +1 -1
  88. data/app/views/nodes/create.rjs +1 -4
  89. data/app/views/nodes/destroy.erb +0 -0
  90. data/app/views/nodes/import.rhtml +1 -1
  91. data/app/views/nodes/save_text.rjs +3 -3
  92. data/app/views/nodes/table_update.rjs +1 -2
  93. data/app/views/nodes/update.rjs +1 -1
  94. data/app/views/relations/_form.erb +15 -15
  95. data/app/views/relations/_li.erb +5 -11
  96. data/app/views/relations/create.rjs +1 -1
  97. data/app/views/relations/index.erb +1 -1
  98. data/app/views/sites/_form.erb +3 -3
  99. data/app/views/sites/_li.erb +1 -1
  100. data/app/views/sites/index.erb +1 -1
  101. data/app/views/templates/document_create_tabs/_file.rhtml +3 -3
  102. data/app/views/templates/document_create_tabs/_template.rhtml +9 -9
  103. data/app/views/templates/document_create_tabs/{_text_doc.rhtml → _text_document.rhtml} +4 -4
  104. data/app/views/templates/edit_tabs/{_contact.rhtml → _basecontact.rhtml} +2 -2
  105. data/app/views/templates/edit_tabs/_document.rhtml +3 -3
  106. data/app/views/templates/edit_tabs/_help.rhtml +2 -2
  107. data/app/views/templates/edit_tabs/_image.rhtml +4 -4
  108. data/app/views/templates/edit_tabs/_template.rhtml +6 -6
  109. data/app/views/templates/edit_tabs/_text.rhtml +1 -1
  110. data/app/views/templates/edit_tabs/_textdocument.rhtml +4 -4
  111. data/app/views/templates/edit_tabs/_title.rhtml +9 -14
  112. data/app/views/users/_form.rhtml +1 -1
  113. data/app/views/users/change_info.rjs +1 -1
  114. data/app/views/users/change_password.rjs +1 -1
  115. data/app/views/users/index.rhtml +1 -1
  116. data/app/views/users/preferences.html.erb +10 -4
  117. data/app/views/users/update.rjs +1 -1
  118. data/app/views/versions/_list.rhtml +1 -1
  119. data/app/views/versions/_tr.rhtml +1 -1
  120. data/app/views/versions/backup.rjs +1 -1
  121. data/app/views/versions/destroy.rjs +6 -2
  122. data/app/views/versions/diff.rjs +1 -1
  123. data/app/views/versions/edit.rhtml +14 -6
  124. data/app/views/versions/preview.rjs +1 -1
  125. data/app/views/versions/show.rjs +1 -1
  126. data/app/views/virtual_classes/_add.erb +1 -1
  127. data/app/views/virtual_classes/_form.erb +15 -10
  128. data/app/views/virtual_classes/_li.erb +13 -7
  129. data/app/views/virtual_classes/create.rjs +2 -2
  130. data/app/views/virtual_classes/edit.html.erb +7 -0
  131. data/app/views/virtual_classes/index.erb +2 -2
  132. data/app/views/zafu/default/Node-+adminLayout.zafu +47 -0
  133. data/app/views/zafu/default/Node-+index.zafu +1 -0
  134. data/app/views/{templates/defaults/+login.zafu → zafu/default/Node-+login.zafu} +9 -7
  135. data/app/views/zafu/default/Node-+notFound.zafu +14 -0
  136. data/app/views/zafu/default/Node-+popupLayout.zafu +24 -0
  137. data/app/views/zafu/default/Node-+search.zafu +23 -0
  138. data/app/views/zafu/default/Node.zafu +95 -0
  139. data/bin/zena +0 -2
  140. data/bricks/captcha/lib/bricks/captcha.rb +62 -0
  141. data/bricks/captcha/zena/init.rb +11 -0
  142. data/bricks/data2pdf/.document +5 -0
  143. data/bricks/data2pdf/README +19 -0
  144. data/bricks/data2pdf/Rakefile +36 -0
  145. data/bricks/data2pdf/VERSION +1 -0
  146. data/bricks/data2pdf/lib/data2pdf.rb +60 -0
  147. data/bricks/data2pdf/lib/engines/prince.rb +39 -0
  148. data/bricks/data2pdf/lib/engines/xhtml2pdf.rb +41 -0
  149. data/bricks/data2pdf/lib/install.rb +111 -0
  150. data/bricks/data2pdf/test/engines/test_prince.rb +14 -0
  151. data/bricks/data2pdf/test/engines/test_xhtml2pdf.rb +14 -0
  152. data/bricks/data2pdf/test/fixtures/application.css +241 -0
  153. data/bricks/data2pdf/test/fixtures/contact.html +153 -0
  154. data/bricks/data2pdf/test/fixtures/pisa-default.css +207 -0
  155. data/bricks/data2pdf/test/fixtures/sheet1.css +207 -0
  156. data/bricks/data2pdf/test/fixtures/sheet2.css +207 -0
  157. data/bricks/data2pdf/test/fixtures/simple-html.html +337 -0
  158. data/bricks/data2pdf/test/fixtures/simple-text.txt +1 -0
  159. data/bricks/data2pdf/test/helper.rb +23 -0
  160. data/bricks/data2pdf/test/shoulda_macros/shoulda_data2pdf.rb +91 -0
  161. data/bricks/data2pdf/test/unit/test_rendering.rb +37 -0
  162. data/bricks/math/{patch/application_helper.rb → lib/bricks/math.rb} +0 -4
  163. data/bricks/math/zena/init.rb +4 -0
  164. data/bricks/sphinx/README +2 -2
  165. data/bricks/sphinx/lib/use_sphinx.rb +7 -11
  166. data/bricks/sphinx/{misc → zena}/deploy.rb +0 -0
  167. data/bricks/sphinx/{patch/node.rb → zena/init.rb} +1 -3
  168. data/bricks/sphinx/{migrate → zena/migrate}/20091102171258_add_delta_for_sphinx.rb +0 -0
  169. data/bricks/sphinx/{misc → zena}/sphinx.yml +0 -0
  170. data/bricks/sphinx/{misc → zena}/tasks.rb +0 -0
  171. data/bricks/tags/lib/{has_tags.rb → bricks/tags.rb} +12 -24
  172. data/bricks/tags/zena/init.rb +21 -0
  173. data/bricks/tags/{test → zena/test}/sites/zena/links.yml +0 -0
  174. data/bricks/tags/{test → zena/test}/unit/tags_test.rb +1 -1
  175. data/bricks/tags/zena/test/zafu/tags.yml +41 -0
  176. data/bricks/worker/README +2 -2
  177. data/bricks/worker/{misc → zena}/deploy.rb +0 -0
  178. data/bricks/worker/{misc → zena}/init.rb +2 -1
  179. data/bricks/worker/{migrate → zena/migrate}/20091104191643_create_delayed_jobs_table.rb +0 -0
  180. data/bricks/worker/{misc → zena}/tasks.rb +0 -0
  181. data/bricks/worker/{misc → zena}/worker +0 -0
  182. data/config/bricks.yml +2 -0
  183. data/config/deploy.rb +2 -7
  184. data/config/environment.rb +3 -5
  185. data/config/gems.yml +9 -4
  186. data/db/20100628074512_zena0x_to1x.rb +223 -0
  187. data/db/init/base/help.en.zml +3 -3
  188. data/db/init/base/help.fr.zml +3 -3
  189. data/db/init/base/skins.zml +2 -2
  190. data/db/init/base/skins/default.zml +4 -4
  191. data/db/init/base/skins/default/Node-+adminLayout.zafu +8 -7
  192. data/db/init/base/skins/default/Node-+login.zafu +9 -7
  193. data/db/init/base/skins/default/Node-+search.zafu +4 -1
  194. data/db/init/base/skins/default/Node-tree.zafu +3 -3
  195. data/db/init/base/skins/default/Node.zafu +20 -20
  196. data/db/init/base/skins/default/Project.zafu +1 -1
  197. data/db/init/base/skins/default/notes.zafu +5 -5
  198. data/db/init/base/skins/default/style.css +17 -12
  199. data/db/migrate/001_create_base.rb +1 -1
  200. data/db/migrate/008_user_status.rb +1 -1
  201. data/db/migrate/020_create_participation.rb +3 -3
  202. data/db/migrate/024_correct_vclass_kpath.rb +5 -3
  203. data/db/migrate/025_move_tag_into_vclass.rb +7 -5
  204. data/db/migrate/030_redit_auto_publish_site_settings.rb +2 -2
  205. data/db/migrate/032_caches_context_as_hash.rb +4 -2
  206. data/db/migrate/046_fix_zazen_image_tag.rb +2 -2
  207. data/db/migrate/047_change_default_link_id_to_zero.rb +4 -2
  208. data/db/migrate/20090825201159_insert_zero_link.rb +1 -1
  209. data/db/migrate/20090924141459_zafu_fix_sept09.rb +2 -2
  210. data/db/migrate/20100125062254_add_dynamo_to_version.rb +9 -0
  211. data/db/migrate/20100201133242_remove_default_status_on_version.rb +9 -0
  212. data/db/migrate/20100208194210_create_attachments.rb +17 -0
  213. data/db/migrate/20100210112319_change_dynamo_to_property.rb +9 -0
  214. data/db/migrate/20100320145726_transform_template_contents_into_index.rb +13 -0
  215. data/db/migrate/20100328125634_change_skin_name_to_id.rb +31 -0
  216. data/db/migrate/20100417061257_add_properties_to_sites.rb +9 -0
  217. data/db/migrate/20100419163149_rename_name_to_node_name.rb +9 -0
  218. data/db/migrate/20100422091606_change_v_class_table_into_roles.rb +27 -0
  219. data/db/migrate/20100422094048_node_habtm_roles.rb +13 -0
  220. data/db/migrate/20100422115935_create_columns.rb +15 -0
  221. data/db/migrate/20100513181529_add_site_id_to_columns.rb +9 -0
  222. data/db/migrate/20100519091711_add_index_definition_to_columns.rb +9 -0
  223. data/db/migrate/20100519091940_create_idx_nodes_string.rb +14 -0
  224. data/db/migrate/20100519232432_create_idx_nodes_ml_string.rb +15 -0
  225. data/db/migrate/20100525113858_add_porperties_to_users.rb +9 -0
  226. data/db/migrate/20100526090140_renamed_contact_model_to_base_contact.rb +13 -0
  227. data/db/migrate/20100527130937_change_column_index_to_string.rb +9 -0
  228. data/db/migrate/20100531135128_add_fulltext_builder_fields.rb +28 -0
  229. data/doc/zafu_changes.yml +2 -2
  230. data/lib/bricks/loader.rb +48 -26
  231. data/lib/exif_data.rb +21 -1
  232. data/lib/gettext_strings.rb +8 -1
  233. data/lib/tasks/zena.rake +55 -20
  234. data/lib/version_off.rb +323 -0
  235. data/lib/zazen_parser.rb +9 -0
  236. data/lib/zena.rb +13 -14
  237. data/lib/zena/acts/enrollable.rb +232 -0
  238. data/lib/zena/acts/secure.rb +86 -506
  239. data/lib/zena/acts/secure_node.rb +483 -0
  240. data/lib/zena/acts/serializable.rb +149 -0
  241. data/lib/zena/app.rb +36 -23
  242. data/lib/zena/code_syntax.rb +26 -2
  243. data/lib/zena/controller/test_case.rb +23 -2
  244. data/lib/zena/core_ext/file_utils.rb +3 -3
  245. data/lib/zena/core_ext/string.rb +2 -2
  246. data/lib/zena/db.rb +180 -24
  247. data/lib/zena/deploy.rb +140 -183
  248. data/lib/zena/deploy/awstats.conf.rhtml +4 -4
  249. data/lib/zena/deploy/httpd.rhtml +1 -2
  250. data/lib/zena/deploy/stats.vhost.rhtml +7 -7
  251. data/lib/zena/deploy/vhost.rhtml +1 -1
  252. data/lib/zena/deploy/vhost_www.rhtml +4 -4
  253. data/lib/zena/foxy_parser.rb +345 -295
  254. data/lib/zena/info.rb +1 -2
  255. data/lib/zena/integration/test_case.rb +70 -0
  256. data/lib/zena/loader/yaml_loader.rb +80 -0
  257. data/lib/zena/migrator.rb +2 -2
  258. data/lib/zena/parser.rb +19 -17
  259. data/lib/zena/parser/zafu_rules.rb +7 -0
  260. data/lib/zena/parser/zafu_tags.rb +2 -2
  261. data/lib/zena/parser/zazen_rules.rb +9 -29
  262. data/lib/zena/parser/zena_rules.rb +2 -2
  263. data/lib/zena/refactor/act_as_content.rb +6 -0
  264. data/lib/zena/routes.rb +9 -3
  265. data/lib/zena/site_worker.rb +48 -0
  266. data/lib/zena/test_controller.rb +49 -12
  267. data/lib/zena/use.rb +47 -0
  268. data/lib/zena/use/action.rb +230 -0
  269. data/lib/zena/use/ajax.rb +287 -13
  270. data/lib/zena/use/authlogic.rb +28 -12
  271. data/lib/zena/use/calendar.rb +2 -2
  272. data/lib/zena/use/conditional.rb +41 -0
  273. data/lib/zena/use/context.rb +187 -0
  274. data/lib/zena/use/dates.rb +87 -30
  275. data/lib/zena/use/display.rb +598 -0
  276. data/lib/zena/use/dyn_attributes.rb +4 -4
  277. data/lib/zena/use/error_rendering.rb +3 -1
  278. data/lib/zena/use/fixtures.rb +56 -22
  279. data/lib/zena/use/forms.rb +584 -0
  280. data/lib/zena/use/fulltext.rb +90 -0
  281. data/lib/zena/use/grid.rb +12 -7
  282. data/lib/zena/use/html_tags.rb +8 -459
  283. data/lib/zena/use/i18n.rb +172 -109
  284. data/lib/zena/use/image_builder.rb +1 -2
  285. data/lib/zena/use/ml_index.rb +56 -0
  286. data/lib/zena/use/nested_attributes_alias.rb +2 -2
  287. data/lib/zena/use/node_name.rb +94 -0
  288. data/lib/zena/use/query_builder.rb +355 -0
  289. data/lib/zena/use/query_comment.rb +63 -73
  290. data/lib/zena/use/query_node.rb +404 -317
  291. data/lib/zena/use/recursion.rb +71 -0
  292. data/lib/zena/use/refactor.rb +27 -40
  293. data/lib/zena/use/relations.rb +9 -3
  294. data/lib/zena/use/rendering.rb +143 -116
  295. data/lib/zena/use/search.rb +79 -21
  296. data/lib/zena/use/test_helper.rb +17 -9
  297. data/lib/zena/use/upload.rb +1 -1
  298. data/lib/zena/use/urls.rb +534 -28
  299. data/lib/zena/use/version_hash.rb +154 -0
  300. data/lib/zena/use/workflow.rb +635 -0
  301. data/lib/zena/use/zafu_attributes.rb +205 -0
  302. data/lib/zena/use/zafu_eval.rb +21 -0
  303. data/lib/zena/use/zafu_safe_definitions.rb +36 -0
  304. data/lib/zena/use/zafu_templates.rb +459 -0
  305. data/lib/zena/use/zazen.rb +53 -23
  306. data/lib/zena/view/test_case.rb +56 -7
  307. data/lib/zena/webdav_adapter.rb +8 -8
  308. data/lib/zena/zafu_compiler.rb +25 -0
  309. data/locale/de/LC_MESSAGES/zena.mo +0 -0
  310. data/locale/de/zena.mo +0 -0
  311. data/locale/de/zena.po +920 -781
  312. data/locale/en/LC_MESSAGES/zena.mo +0 -0
  313. data/locale/en/zena.mo +0 -0
  314. data/locale/en/zena.po +530 -405
  315. data/locale/fr/LC_MESSAGES/zena.mo +0 -0
  316. data/locale/fr/zena.mo +0 -0
  317. data/locale/fr/zena.po +588 -432
  318. data/locale/zena.pot +391 -353
  319. data/old_zafu/action.rb +129 -0
  320. data/{lib/zafu → old_zafu}/ajax.rb +0 -24
  321. data/{lib/zafu → old_zafu}/attributes.rb +2 -2
  322. data/{lib/zafu → old_zafu}/calendar.rb +1 -1
  323. data/{lib/zafu → old_zafu}/context.rb +4 -8
  324. data/{lib/zafu → old_zafu}/core/html.rb +1 -1
  325. data/old_zafu/core/move_to_parser.rb +74 -0
  326. data/old_zafu/dates.rb +20 -0
  327. data/{lib/zafu → old_zafu}/display.rb +33 -146
  328. data/{lib/zafu → old_zafu}/eval.rb +0 -0
  329. data/{lib/zafu → old_zafu}/experimental.rb +1 -1
  330. data/{lib/zafu → old_zafu}/i18n.rb +1 -1
  331. data/{lib/zafu → old_zafu}/meta.rb +0 -0
  332. data/old_zafu/query_node.rb +278 -0
  333. data/{lib/zafu → old_zafu}/refactor.rb +2 -12
  334. data/old_zafu/support/context.rb +146 -0
  335. data/{lib/zafu → old_zafu}/support/dom.rb +1 -43
  336. data/{lib/zafu → old_zafu}/support/erb.rb +0 -0
  337. data/{lib/zafu → old_zafu}/support/flow.rb +1 -13
  338. data/old_zafu/support/forms.rb +7 -0
  339. data/old_zafu/support/links.rb +75 -0
  340. data/{lib → old_zafu}/zafu_parser.rb +2 -2
  341. data/public/images/attach_window.png +0 -0
  342. data/public/images/dettach_window.png +0 -0
  343. data/public/images/ext/{contact.png → basecontact.png} +0 -0
  344. data/public/images/toggle_off.png +0 -0
  345. data/public/images/toggle_on.png +0 -0
  346. data/public/images/window/bottom_left.png +0 -0
  347. data/public/images/window/bottom_mid.png +0 -0
  348. data/public/images/window/bottom_right.png +0 -0
  349. data/public/images/window/center_left.png +0 -0
  350. data/public/images/window/center_right.png +0 -0
  351. data/public/images/window/close.png +0 -0
  352. data/public/images/window/maximize.png +0 -0
  353. data/public/images/window/minimize.png +0 -0
  354. data/public/images/window/overlay.png +0 -0
  355. data/public/images/window/sizer.png +0 -0
  356. data/public/images/window/top_left.png +0 -0
  357. data/public/images/window/top_mid.png +0 -0
  358. data/public/images/window/top_right.png +0 -0
  359. data/public/javascripts/builder.js +1 -3
  360. data/public/javascripts/controls.js +3 -5
  361. data/public/javascripts/dragdrop.js +5 -8
  362. data/public/javascripts/effects.js +6 -15
  363. data/public/javascripts/prototype.js +1574 -1020
  364. data/public/javascripts/scriptaculous.js +13 -7
  365. data/public/javascripts/slider.js +5 -7
  366. data/public/javascripts/sound.js +6 -4
  367. data/public/javascripts/unittest.js +69 -71
  368. data/public/javascripts/window.js +1843 -0
  369. data/public/javascripts/zena.js +216 -16
  370. data/public/stylesheets/admin.css +18 -13
  371. data/public/stylesheets/default.css +18 -17
  372. data/public/stylesheets/popup.css +4 -4
  373. data/public/stylesheets/window.css +155 -0
  374. data/public/stylesheets/zena.css +9 -8
  375. data/test/custom_queries/complex.host.yml +8 -8
  376. data/test/fixtures/files/Node-test.zafu +11 -11
  377. data/test/fixtures/files/import.tgz +0 -0
  378. data/test/fixtures/files/simple.zml.gz +0 -0
  379. data/test/fixtures/import/photos.en.zml +3 -3
  380. data/test/fixtures/import/photos/bird.jpg.en.zml +1 -1
  381. data/test/fixtures/import/photos/bird.jpg.fr.zml +1 -1
  382. data/test/fixtures/import/simple.zml +2 -2
  383. data/test/functional/application_controller_test.rb +2 -41
  384. data/test/functional/columns_controller_test.rb +140 -0
  385. data/test/functional/data_entries_controller_test.rb +1 -1
  386. data/test/functional/documents_controller_test.rb +88 -5
  387. data/test/functional/nodes_controller_commit_test.rb +71 -0
  388. data/test/functional/nodes_controller_test.rb +393 -93
  389. data/test/functional/note_controller_test.rb +5 -5
  390. data/test/functional/relations_controller_test.rb +1 -1
  391. data/test/functional/users_controller_test.rb +72 -14
  392. data/test/functional/versions_controller_test.rb +9 -8
  393. data/test/functional/virtual_classes_controller_test.rb +142 -65
  394. data/test/integration/multiple_hosts_test.rb +28 -20
  395. data/test/integration/navigation_test.rb +121 -83
  396. data/test/integration/query_node/basic.yml +128 -0
  397. data/test/integration/query_node/comments.yml +23 -0
  398. data/test/integration/query_node/complex.yml +111 -0
  399. data/test/integration/query_node/dates.yml +22 -0
  400. data/test/integration/query_node/errors.yml +12 -0
  401. data/test/integration/query_node/filters.yml +123 -0
  402. data/test/integration/query_node/properties.yml +41 -0
  403. data/test/integration/query_node/relations.yml +75 -0
  404. data/test/integration/query_node_test.rb +189 -0
  405. data/test/integration/xml_api_test.rb +166 -0
  406. data/test/integration/zafu_compiler/action.yml +67 -0
  407. data/test/integration/zafu_compiler/ajax.yml +263 -0
  408. data/test/{unit/zena/zena_tags → integration/zafu_compiler}/apphelper.yml +0 -0
  409. data/test/integration/zafu_compiler/asset.yml +13 -0
  410. data/test/integration/zafu_compiler/basic.yml +518 -0
  411. data/test/integration/zafu_compiler/calendar.yml +35 -0
  412. data/test/{unit/zena/zena_tags → integration/zafu_compiler}/complex.yml +16 -16
  413. data/test/integration/zafu_compiler/conditional.yml +173 -0
  414. data/test/{unit/zena/zena_tags → integration/zafu_compiler}/data.yml +3 -3
  415. data/test/integration/zafu_compiler/dates.yml +58 -0
  416. data/test/integration/zafu_compiler/display.yml +273 -0
  417. data/test/integration/zafu_compiler/errors.yml +79 -0
  418. data/test/{unit/zena/zena_tags → integration/zafu_compiler}/eval.yml +6 -2
  419. data/test/integration/zafu_compiler/forms.yml +130 -0
  420. data/test/integration/zafu_compiler/i18n.yml +107 -0
  421. data/test/integration/zafu_compiler/later.yml +31 -0
  422. data/test/integration/zafu_compiler/off/off.yml +15 -0
  423. data/test/integration/zafu_compiler/recursion.yml +28 -0
  424. data/test/integration/zafu_compiler/relations.yml +487 -0
  425. data/test/integration/zafu_compiler/roles.yml +28 -0
  426. data/test/{unit/zena/zena_tags → integration/zafu_compiler}/rubyless.yml +10 -9
  427. data/test/integration/zafu_compiler/safe_definitions.yml +65 -0
  428. data/test/integration/zafu_compiler/search.yml +13 -0
  429. data/test/integration/zafu_compiler/security.yml +30 -0
  430. data/test/integration/zafu_compiler/site.yml +14 -0
  431. data/test/integration/zafu_compiler/urls.yml +189 -0
  432. data/test/integration/zafu_compiler/user.yml +32 -0
  433. data/test/integration/zafu_compiler/version.yml +47 -0
  434. data/test/integration/zafu_compiler/workflow.yml +36 -0
  435. data/test/integration/zafu_compiler/zafu_attributes.yml +169 -0
  436. data/test/{unit/zena/zena_tags → integration/zafu_compiler}/zazen.yml +7 -3
  437. data/test/{unit/zena/zena_tags_test.rb → integration/zafu_compiler_test.rb} +137 -57
  438. data/test/sites/complex/nodes.yml +48 -47
  439. data/test/sites/complex/{virtual_classes.yml → roles.yml} +2 -1
  440. data/test/sites/ocean/nodes.yml +7 -7
  441. data/test/sites/ocean/versions.yml +30 -21
  442. data/test/sites/zena/columns.yml +12 -0
  443. data/test/sites/zena/nodes.yml +33 -32
  444. data/test/sites/zena/{virtual_classes.yml → roles.yml} +11 -1
  445. data/test/sites/zena/sites.yml +4 -1
  446. data/test/sites/zena/users.yml +5 -4
  447. data/test/sites/zena/versions.yml +398 -279
  448. data/test/test_helper.rb +2 -1
  449. data/test/test_zena.rb +3 -8
  450. data/test/unit/after_commit_test.rb +103 -0
  451. data/test/unit/attachment_test.rb +266 -0
  452. data/test/unit/base_contact_test.rb +242 -0
  453. data/test/unit/cached_page_test.rb +6 -6
  454. data/test/unit/column_test.rb +77 -0
  455. data/test/unit/comment_test.rb +1 -1
  456. data/test/unit/data_entry_test.rb +8 -2
  457. data/test/unit/document_test.rb +393 -211
  458. data/test/unit/exif_data_test.rb +1 -1
  459. data/test/unit/iformat_test.rb +9 -9
  460. data/test/unit/image_test.rb +358 -284
  461. data/test/unit/multi_version_test.rb +4 -0
  462. data/test/unit/multiversion_test.rb +2 -1013
  463. data/test/unit/node_name_test.rb +137 -0
  464. data/test/unit/node_test.rb +374 -461
  465. data/test/unit/note_test.rb +23 -23
  466. data/test/unit/page_test.rb +23 -23
  467. data/test/unit/project_test.rb +2 -2
  468. data/test/unit/relation_proxy_test.rb +25 -6
  469. data/test/unit/relation_test.rb +156 -24
  470. data/test/unit/role_test.rb +122 -0
  471. data/test/unit/section_test.rb +2 -2
  472. data/test/unit/site_test.rb +48 -12
  473. data/test/unit/skin_test.rb +0 -13
  474. data/test/unit/template_test.rb +361 -314
  475. data/test/unit/text_document_test.rb +105 -33
  476. data/test/unit/transparent_version_test.rb +4 -0
  477. data/test/unit/user_test.rb +10 -10
  478. data/test/unit/version_test.rb +209 -301
  479. data/test/unit/virtual_class_test.rb +21 -29
  480. data/test/unit/workflow_test.rb +1075 -0
  481. data/test/unit/zena/acts/enrollable_test.rb +211 -0
  482. data/test/unit/{secure_test.rb → zena/acts/secure_test.rb} +190 -105
  483. data/test/unit/zena/acts/serializable_test.rb +85 -0
  484. data/test/unit/zena/db_test.rb +27 -14
  485. data/test/unit/zena/parser/zazen.yml +1 -1
  486. data/test/unit/zena/use/action_test.rb +109 -0
  487. data/test/unit/zena/use/calendar_test.rb +8 -8
  488. data/test/unit/zena/use/dates_test.rb +10 -0
  489. data/test/unit/zena/use/dates_view_methods_test.rb +8 -12
  490. data/test/unit/zena/use/fulltext_test.rb +82 -0
  491. data/test/unit/zena/use/html_tags_test.rb +225 -201
  492. data/test/unit/zena/use/i18n_test.rb +56 -26
  493. data/test/unit/zena/use/ml_index_test.rb +129 -0
  494. data/test/unit/zena/use/nested_attributes_alias_view_test.rb +10 -10
  495. data/test/unit/zena/use/query_node_test.rb +104 -0
  496. data/test/unit/zena/use/refactor_test.rb +4 -15
  497. data/test/unit/zena/use/rendering_test.rb +23 -16
  498. data/test/unit/zena/use/upload_test.rb +2 -2
  499. data/test/unit/zena/use/urls_test.rb +2 -0
  500. data/test/unit/zena/use/version_hash_test.rb +126 -0
  501. data/test/unit/zena/use/zafu_template_test.rb +135 -0
  502. data/test/unit/zena/use/zazen_test.rb +85 -61
  503. data/vendor/plugins/gettext_i18n_rails/README.markdown +26 -22
  504. data/vendor/plugins/gettext_i18n_rails/Rakefile +31 -5
  505. data/vendor/plugins/gettext_i18n_rails/VERSION +1 -0
  506. data/vendor/plugins/gettext_i18n_rails/gettext_i18n_rails.gemspec +64 -0
  507. data/vendor/plugins/gettext_i18n_rails/init.rb +7 -3
  508. data/vendor/plugins/gettext_i18n_rails/lib/gettext_i18n_rails.rb +5 -6
  509. data/vendor/plugins/gettext_i18n_rails/lib/gettext_i18n_rails/active_record.rb +6 -2
  510. data/vendor/plugins/gettext_i18n_rails/lib/gettext_i18n_rails/backend.rb +1 -1
  511. data/vendor/plugins/gettext_i18n_rails/lib/gettext_i18n_rails/model_attributes_finder.rb +2 -2
  512. data/vendor/plugins/gettext_i18n_rails/{tasks → lib/tasks}/gettext_rails_i18n.rake +10 -9
  513. data/vendor/plugins/gettext_i18n_rails/spec/gettext_i18n_rails/action_controller_spec.rb +7 -3
  514. data/vendor/plugins/gettext_i18n_rails/spec/gettext_i18n_rails/active_record_spec.rb +7 -5
  515. data/vendor/plugins/gettext_i18n_rails/spec/gettext_i18n_rails/backend_spec.rb +7 -7
  516. data/vendor/plugins/gettext_i18n_rails/spec/gettext_i18n_rails_spec.rb +4 -0
  517. data/vendor/plugins/gettext_i18n_rails/spec/spec_helper.rb +11 -9
  518. data/vendor/plugins/mysql_timezone_utc/init.rb +1 -0
  519. data/vendor/plugins/mysql_timezone_utc/lib/mysql_timezone_utc.rb +14 -0
  520. data/vendor/plugins/postgresql_timezone_utc/init.rb +1 -0
  521. data/vendor/plugins/postgresql_timezone_utc/lib/postgresql_timezone_utc.rb +14 -0
  522. data/zena.gemspec +281 -123
  523. metadata +354 -160
  524. data/app/models/contact.rb +0 -32
  525. data/app/models/document_version.rb +0 -13
  526. data/app/models/image_version.rb +0 -21
  527. data/app/models/text_document_version.rb +0 -29
  528. data/app/views/templates/defaults/+adminLayout.zafu +0 -69
  529. data/bricks/captcha/patch/application_controller.rb +0 -10
  530. data/bricks/captcha/patch/application_helper.rb +0 -32
  531. data/bricks/captcha/patch/site.rb +0 -2
  532. data/bricks/captcha/zafu/captcha.rb +0 -29
  533. data/bricks/tags/patch/node.rb +0 -15
  534. data/bricks/tags/test/zafu/tags.yml +0 -40
  535. data/db/schema.rb +0 -295
  536. data/lib/zafu/action.rb +0 -285
  537. data/lib/zafu/core/move_to_parser.rb +0 -167
  538. data/lib/zafu/dates.rb +0 -58
  539. data/lib/zafu/support/context.rb +0 -265
  540. data/lib/zafu/support/forms.rb +0 -461
  541. data/lib/zafu/support/links.rb +0 -306
  542. data/lib/zena/acts/multiversion.rb +0 -755
  543. data/lib/zena/fix/mysql_connection.rb +0 -17
  544. data/lib/zena/use/query_node_finders.rb +0 -91
  545. data/lib/zena/use/zafu.rb +0 -514
  546. data/test/helpers/query_node/basic.yml +0 -149
  547. data/test/helpers/query_node/comments.yml +0 -18
  548. data/test/helpers/query_node/complex.yml +0 -98
  549. data/test/helpers/query_node/filters.yml +0 -110
  550. data/test/helpers/query_node/relations.yml +0 -43
  551. data/test/helpers/query_node_test.rb +0 -116
  552. data/test/sites/ocean/contact_contents.yml +0 -19
  553. data/test/sites/ocean/template_contents.yml +0 -8
  554. data/test/sites/zena/contact_contents.yml +0 -55
  555. data/test/sites/zena/document_contents.yml +0 -76
  556. data/test/sites/zena/dyn_attributes.yml +0 -43
  557. data/test/sites/zena/template_contents.yml +0 -103
  558. data/test/unit/contact_content_test.rb +0 -33
  559. data/test/unit/contact_test.rb +0 -39
  560. data/test/unit/contact_version_test.rb +0 -48
  561. data/test/unit/document_content_test.rb +0 -110
  562. data/test/unit/document_version_test.rb +0 -11
  563. data/test/unit/dyn_attributes_test.rb +0 -229
  564. data/test/unit/image_content_test.rb +0 -154
  565. data/test/unit/image_version_test.rb +0 -18
  566. data/test/unit/template_content_test.rb +0 -9
  567. data/test/unit/text_document_version_test.rb +0 -37
  568. data/test/unit/zena/use/zafu_test.rb +0 -41
  569. data/test/unit/zena/zena_tags/ajax.yml +0 -233
  570. data/test/unit/zena/zena_tags/basic.yml +0 -1306
  571. data/test/unit/zena/zena_tags/errors.yml +0 -71
  572. data/test/unit/zena/zena_tags/relations.yml +0 -405
@@ -51,7 +51,7 @@ class ExifDataTest < Test::Unit::TestCase
51
51
 
52
52
  def test_to_json_should_ignore_symbols
53
53
  e = ExifData.new("Make" => "SONY", "DateTime" => "1998:10:01 10:15:30")
54
- assert_equal '{"Make":"SONY","DateTime":"1998:10:01 10:15:30"}', e.to_json
54
+ assert_equal '{"data":{"Make":"SONY","DateTime":"1998:10:01 10:15:30"},"json_class":"ExifData"}', e.to_json
55
55
  end
56
56
 
57
57
  def test_gps_longitude
@@ -16,7 +16,7 @@ class IformatTest < Zena::Unit::TestCase
16
16
  login(:lion)
17
17
  fmt = Iformat['med']
18
18
  assert_not_equal Zena::Use::ImageBuilder::DEFAULT_FORMATS['med'], fmt
19
- assert_equal ({:name => 'med', :width=>300, :height=>200, :gravity=>Magick::CenterGravity, :size=>:limit, :hash_id => 389519063846, :popup => {:show=> %w{navigation v_title v_summary}, :name=>'std', :options=>{'v_title'=>'link'}}}), fmt
19
+ assert_equal ({:name => 'med', :width=>300, :height=>200, :gravity=>Magick::CenterGravity, :size=>:limit, :hash_id => 389519063846, :popup => {:show=> %w{navigation title summary}, :name=>'std', :options=>{'title'=>'link'}}}), fmt
20
20
  end
21
21
 
22
22
  def test_format_hash_id
@@ -120,12 +120,12 @@ class IformatTest < Zena::Unit::TestCase
120
120
  def test_update_expire_cache_and_formated_images
121
121
  login(:lion)
122
122
  bird = secure(Node) { nodes(:bird_jpg) }
123
- assert bird.c_file(Iformat['med']) # force creation of bird_med.jpg
124
- assert File.exist?(bird.version.content.filepath(Iformat['med']))
123
+ assert bird.file(Iformat['med']) # force creation of bird_med.jpg
124
+ assert File.exist?(bird.filepath(Iformat['med']))
125
125
  # Update format
126
126
  assert Iformat.update(iformats_id(:med), :width => 350)
127
- assert !File.exist?(bird.version.content.filepath(Iformat['med'])), "Calculated image removed"
128
- assert File.exist?(bird.version.content.filepath), "Original not removed"
127
+ assert !File.exist?(bird.filepath(Iformat['med'])), "Calculated image removed"
128
+ assert File.exist?(bird.filepath), "Original not removed"
129
129
  end
130
130
 
131
131
  def test_create_first
@@ -200,19 +200,19 @@ class IformatTest < Zena::Unit::TestCase
200
200
  end
201
201
 
202
202
  should 'use default fields and navigation' do
203
- assert_equal({:show=>%w{navigation v_title v_summary}, :name=>"pop", :options=>{'v_title' => 'link'}}, @imf[:popup])
203
+ assert_equal({:show=>%w{navigation title summary}, :name=>"pop", :options=>{'title' => 'link'}}, @imf[:popup])
204
204
  end
205
205
  end
206
206
 
207
207
  context 'defined with name and json' do
208
208
  setup do
209
209
  Iformat.create(:name => 'header', :height=>'34', :width => '500', :size => 'force',
210
- :popup => 'pop {"v_title":"link", "a":true}')
210
+ :popup => 'pop {"title":"link", "a":true}')
211
211
  @imf = Iformat['header']
212
212
  end
213
213
 
214
214
  should 'respect key order' do
215
- assert_equal({:show=>%w{v_title a}, :name=>"pop", :options=>{'v_title' => 'link'}}, @imf[:popup])
215
+ assert_equal({:show=>%w{title a}, :name=>"pop", :options=>{'title' => 'link'}}, @imf[:popup])
216
216
  end
217
217
  end
218
218
 
@@ -223,7 +223,7 @@ class IformatTest < Zena::Unit::TestCase
223
223
  end
224
224
 
225
225
  should 'respect key order' do
226
- assert_equal({:show=>%w{v_title navigation created_at}, :name=>"pop", :options=>{'v_title' => 'link'}}, @imf[:popup])
226
+ assert_equal({:show=>%w{title navigation created_at}, :name=>"pop", :options=>{'title' => 'link'}}, @imf[:popup])
227
227
  end
228
228
  end
229
229
 
@@ -2,310 +2,384 @@ require 'test_helper'
2
2
 
3
3
  class ImageTest < Zena::Unit::TestCase
4
4
 
5
- def test_create_with_file
6
- without_files('test.host/data/jpg') do
7
- login(:ant)
8
- img = secure!(Image) { Image.create( :parent_id=>nodes_id(:cleanWater),
9
- :inherit => 1,
10
- :name=>'birdy',
11
- :c_file => uploaded_jpg('bird.jpg')) }
12
- assert_kind_of Image , img
13
- assert ! img.new_record? , "Not a new record"
14
- assert_equal "birdy", img.name
15
- assert ! img.version.new_record? , "Version is not a new record"
16
- assert_nil img.version.content_id , "content_id is nil"
17
- assert_kind_of ImageVersion , img.version
18
- assert_equal 'jpg', img.c_ext
19
- assert_equal "660x600", "#{img.version.content.width}x#{img.version.content.height}"
20
- assert_equal file_path("birdy.jpg", 'full', img.version.content.id), img.version.content.filepath
21
- assert File.exist?(img.version.content.filepath)
22
- assert_equal File.stat(img.version.content.filepath).size, img.version.content.size
23
- end
24
- end
25
-
26
- def test_resize_image
27
- pv_format = Iformat['pv']
28
- without_files('test.host/data/jpg') do
29
- login(:ant)
30
- img = secure!(Image) { Image.create( :parent_id=>nodes_id(:cleanWater),
31
- :inherit => 1,
32
- :name=>'birdy', :c_file => uploaded_jpg('bird.jpg')) }
33
- assert !img.new_record?, "Not a new record"
34
- assert File.exist?( img.version.content.filepath ), "File exist"
35
- assert_equal "70x70", "#{img.version.content.width(pv_format)}x#{img.version.content.height(pv_format)}"
36
- assert !File.exist?( img.version.content.filepath(pv_format) ), "File does not exist"
37
- assert img.c_file(pv_format), "Can make 'pv' image"
38
- assert File.exist?( img.version.content.filepath(pv_format) ), "File exist"
39
- assert_equal file_path('birdy.jpg', 'pv', img.version.content.id), img.version.content.filepath(pv_format)
40
- end
41
- end
42
-
43
- def test_image_content_type
44
- assert Image.accept_content_type?('image/jpeg')
45
- assert !Image.accept_content_type?('application/pdf')
46
- end
47
-
48
- def test_change_image
49
- preserving_files('test.host/data') do
50
- login(:ant)
51
- img = secure!(Node) { nodes(:bird_jpg) }
52
- flo = secure!(Node) { nodes(:flower_jpg)}
53
- assert_equal 660, img.version.content.width
54
- assert_equal 600, img.version.content.height
55
- assert_equal 56243, img.version.content.size
56
- assert_equal 800, flo.version.content.width
57
- assert_equal 600, flo.version.content.height
58
- assert_equal 96648, flo.version.content.size
59
- assert img.update_attributes(:c_file=>uploaded_jpg('flower.jpg'))
60
- assert_equal flo.version.content.size, img.version.content.size
61
- assert_equal flo.version.content.width, img.version.content.width
62
- assert_equal flo.version.content.height, img.version.content.height
63
- # make sure old formated images are destroyed
5
+ context 'The Image class' do
6
+ context 'receiving accept_content_type' do
7
+ should 'accept image/jpeg' do
8
+ assert Image.accept_content_type?('image/jpeg')
9
+ end
10
+
11
+ should 'not accept application/pdf' do
12
+ assert !Image.accept_content_type?('application/pdf')
13
+ end
64
14
  end
65
- end
66
-
67
- def test_change_image_bad_file
68
- preserving_files('test.host/data') do
69
- login(:ant)
70
- img = secure!(Node) { nodes(:bird_jpg) }
71
- flo = secure!(Node) { nodes(:flower_jpg)}
72
- assert_equal 56243, img.version.content.size
73
- assert_equal 'image/jpeg', img.c_content_type
74
- assert !img.update_attributes(:c_file=>uploaded_text('some.txt'))
75
- img = secure!(Node) { nodes(:bird_jpg) } # reload
76
- assert_equal 56243, img.version.content.size
77
- assert_equal 'image/jpeg', img.c_content_type
15
+ end # The Image class
16
+
17
+ context 'Creating an image' do
18
+ setup do
19
+ login(:tiger)
78
20
  end
79
- end
80
-
81
- def test_crop_image
82
- preserving_files('test.host/data') do
83
- login(:ant)
84
- img = secure!(Node) { nodes(:bird_jpg) }
85
- assert_equal Zena::Status[:pub], img.version.status
86
- pub_version_id = img.version.id
87
- pub_content_id = img.version.content.id
88
- assert_equal 660, img.version.content.width
89
- assert_equal 600, img.version.content.height
90
- assert_equal 56243, img.version.content.size
91
- assert img.update_attributes(:c_crop=>{:x=>'500',:y=>30,:w=>'200',:h=>80})
92
- img = secure!(Node) { nodes(:bird_jpg) }
93
- assert_not_equal pub_version_id, img.version.id
94
- assert_not_equal pub_content_id, img.version.content.id
95
- assert_equal 2010, img.version.content.size
96
- assert_equal 160, img.version.content.width
97
- assert_equal 80, img.version.content.height
98
- up1 = img.updated_at
99
- # crop again, same redaction
100
- sleep(1)
101
- assert img.update_attributes(:c_crop=>{:x=>0,:y=>0,:w=>'100',:h=>50})
102
- img = secure!(Node) { nodes(:bird_jpg) }
103
- # this verifies that updated_at is updated even when we only change the content
104
- assert_not_equal up1, img.updated_at
105
- assert_equal 100, img.version.content.width
106
- assert_equal 50, img.version.content.height
21
+
22
+ context 'with a jpg file' do
23
+ subject do
24
+ secure!(Image) { Image.create(
25
+ :parent_id => nodes_id(:cleanWater),
26
+ :title => 'birdy',
27
+ :file => uploaded_jpg('bird.jpg'))
28
+ }
29
+ end
30
+
31
+ should 'be saved in the database' do
32
+ assert !subject.new_record?
33
+ end
34
+
35
+ should 'be valid' do
36
+ assert subject.valid?
37
+ end
38
+
39
+ should 'get width and height from file' do
40
+ assert_equal 660, subject.width
41
+ assert_equal 600, subject.height
42
+ end
43
+
44
+ should 'get extension from file' do
45
+ assert_equal 'jpg', subject.ext
46
+ end
47
+
48
+ should 'get content type from file' do
49
+ assert_equal 'image/jpeg', subject.content_type
50
+ end
51
+
52
+ should 'build an attachment' do
53
+ assert_difference('Attachment.count', 1) do
54
+ subject
55
+ end
56
+ end
57
+
58
+ should 'build a new version' do
59
+ assert_difference('Version.count', 1) do
60
+ subject
61
+ end
62
+ end
63
+
64
+ should 'build filepath from title' do
65
+ assert_match /birdy.jpg/, subject.filepath
66
+ end
67
+
68
+ should 'save default text' do
69
+ node = secure(Node) { Node.find(subject.id) }
70
+ assert_equal "!#{subject.zip}!", node.text
71
+ end
72
+
73
+ # should 'write file to filesystem' do
74
+ # Moved to Attachment test (no transactional fixtures)
75
+
76
+ end # with a jpg file
77
+
78
+ context 'with a file with exif tags' do
79
+ setup do
80
+ login(:tiger)
81
+ end
82
+
83
+ subject do
84
+ secure!(Image) { Image.create(
85
+ :parent_id => nodes_id(:cleanWater),
86
+ :title => 'lake',
87
+ :file => uploaded_jpg('exif_sample.jpg'))
88
+ }
89
+ end
90
+
91
+ should 'read Make from exif data' do
92
+ assert_equal 'SANYO Electric Co.,Ltd.', subject.exif['Make']
93
+ end
94
+
95
+ should 'save exif data in database' do
96
+ subject.reload
97
+ assert_equal 'SANYO Electric Co.,Ltd.', subject.exif['Make']
98
+ end
99
+
100
+ should 'save exif data in exif prop' do
101
+ assert_kind_of ExifData, subject.prop['exif']
102
+ end
103
+
104
+ should 'parse time values' do
105
+ assert_equal Time.parse("1998-01-01 00:00:00"), subject.exif.date_time
106
+ end
107
+
108
+ should 'use exif date_time as event_at' do
109
+ assert_equal Time.parse("1998-01-01 00:00:00"), subject.event_at
110
+ end
111
+ end # with a file with exif tags
112
+ end # Creating an image
113
+
114
+ context 'An image' do
115
+ setup do
116
+ login(:tiger)
107
117
  end
108
- end
109
-
110
- def test_crop_image_limit
111
- preserving_files('test.host/data') do
112
- login(:ant)
113
- img = secure!(Node) { nodes(:bird_jpg) }
114
- assert_equal Zena::Status[:pub], img.version.status
115
- pub_version_id = img.version.id
116
- pub_content_id = img.version.content.id
117
- assert_equal 660, img.version.content.width
118
- assert_equal 600, img.version.content.height
119
- assert_equal 56243, img.version.content.size
120
- assert img.update_attributes(:c_crop=>{:max_value=>'30', :max_unit=>'Kb'})
121
- img = secure!(Node) { nodes(:bird_jpg) }
122
- assert_not_equal pub_version_id, img.version.id
123
- assert_not_equal pub_content_id, img.version.content.id
124
- assert img.version.content.size < 30 * 1024 * 1.2
118
+
119
+ subject do
120
+ secure!(Node) { nodes(:bird_jpg) }
125
121
  end
126
- end
127
-
128
- def test_crop_iformat
129
- preserving_files('test.host/data') do
130
- login(:ant)
131
- img = secure!(Node) { nodes(:bird_jpg) }
132
- assert_equal Zena::Status[:pub], img.version.status
133
- pub_version_id = img.version.id
134
- pub_content_id = img.version.content.id
135
- img.update_attributes(:c_crop=>{:format=>'png'})
136
- # should build a new version
137
- img = secure!(Node) { nodes(:bird_jpg) }
138
- assert_not_equal pub_version_id, img.version.id
139
- assert_not_equal pub_content_id, img.version.content.id
140
- #assert_equal 20799, img.version.content.size
141
- assert_equal 'png', img.c_ext
122
+
123
+ context 'with a given image format' do
124
+ setup do
125
+ @pv = Iformat['pv']
126
+ end
127
+
128
+ should 'return calculated width and height for format' do
129
+ assert_equal 70, subject.width(@pv)
130
+ assert_equal 70, subject.width(@pv)
131
+ end
132
+
133
+ should 'create a new file in a folder named after the format' do
134
+ assert_match /pv/, subject.filepath(@pv)
135
+ end
136
+
137
+ should 'return the original path by default' do
138
+ assert_match /full/, subject.filepath
139
+ end
140
+
141
+ should 'create a new file corresponding to the new format on file' do
142
+ preserving_files('test.host/zafu') do
143
+ subject.file(@pv)
144
+ assert File.exist?( subject.filepath(@pv) )
145
+ end
146
+ end
147
+
148
+ should 'return a file corresponding to the format' do
149
+ preserving_files('test.host/zafu') do
150
+ assert_kind_of File, subject.file(@pv)
151
+ end
152
+ end
153
+
154
+ should 'not create a version' do
155
+ assert_difference('Version.count', 0) do
156
+ assert_difference('Attachment.count', 0) do
157
+ preserving_files('test.host/zafu') do
158
+ subject.file(@pv)
159
+ end
160
+ end
161
+ end
162
+ end
163
+ end # with a given image format
164
+
165
+ context 'without an image format' do
166
+ should 'return full resolution on width and height' do
167
+ assert_equal 660, subject.width
168
+ assert_equal 600, subject.height
169
+ end
170
+
171
+ should 'return original file size' do
172
+ assert_equal 56243, subject.size
173
+ end
142
174
  end
143
- end
144
-
145
- def test_crop_image_same_size
146
- preserving_files('test.host/data') do
147
- login(:ant)
148
- img = secure!(Node) { nodes(:bird_jpg) }
149
- assert_equal Zena::Status[:pub], img.version.status
150
- pub_version_id = img.version.id
151
- pub_content_id = img.version.content.id
152
- assert_equal 660, img.version.content.width
153
- assert_equal 600, img.version.content.height
154
- # crop keeping same size => do nothing => keep content
155
- assert !img.version.content.can_crop?('x'=>'0','y'=>0,'w'=>'660','h'=>600)
156
- img.update_attributes(:v_text=>"hey", :c_crop=>{:x=>'0',:y=>0,:w=>'660',:h=>600})
157
- img = secure!(Node) { nodes(:bird_jpg) }
158
- assert_not_equal pub_version_id, img.version.id
159
- assert_equal pub_version_id, img.version.content_id
160
- assert_equal pub_content_id, img.version.content.id
161
- assert_equal 660, img.version.content.width
162
- assert_equal 600, img.version.content.height
175
+
176
+ should 'return content_type' do
177
+ assert_equal 'image/jpeg', subject.content_type
163
178
  end
164
- end
165
-
166
- def test_crop_image_with_new_file
167
- preserving_files('test.host/data') do
168
- login(:ant)
169
- img = secure!(Node) { nodes(:bird_jpg) }
170
- assert_equal Zena::Status[:pub], img.version.status
171
- pub_version_id = img.version.id
172
- pub_content_id = img.version.content.id
173
- assert_equal 660, img.version.content.width
174
- assert_equal 600, img.version.content.height
175
- assert_equal 56243, img.version.content.size
176
- assert img.update_attributes(:name => 'lila.jpg', :c_file=>uploaded_jpg('flower.jpg'), :c_crop=>{:x=>'500',:y=>30,:w=>'200',:h=>80})
177
- img = secure!(Node) { nodes(:bird_jpg) }
178
- assert_equal 800, img.version.content.width
179
- assert_equal 600, img.version.content.height
180
- assert_equal 96648, img.version.content.size
179
+ end # An image
180
+
181
+ context 'Updating an image' do
182
+ setup do
183
+ login(:tiger)
181
184
  end
182
- end
183
-
184
- def test_change_name
185
- preserving_files('test.host/data') do
186
- login(:ant)
187
- img = secure!(Image) { Image.create( :parent_id=>nodes_id(:cleanWater),
188
- :inherit => 1,
189
- :name=>'birdy',
190
- :c_file => uploaded_jpg('bird.jpg')) }
191
- assert !img.new_record?
192
- img = secure!(Image) { Image.find(img[:id]) }
193
- old_path1 = img.version.content.filepath
194
- pv_format = Iformat['pv']
195
- old_path2 = img.version.content.filepath(pv_format)
196
- img.c_file(pv_format) # creates 'pv' file
197
- assert_equal file_path("birdy.jpg", 'full', img.version.content.id), old_path1
198
- assert_equal file_path("birdy.jpg", 'pv', img.version.content.id), old_path2
199
- assert File.exists?(old_path1), "Old file exist."
200
- assert File.exists?(old_path2), "Old file with 'pv' format exist."
201
- assert img.update_attributes(:name=>'moineau')
202
- # image content name should not change
203
- assert_equal old_path1, img.version.content.filepath
204
- assert File.exists?(old_path1), "Old file exist."
205
- assert File.exists?(old_path2), "Old file with 'pv' format exist."
185
+
186
+ subject do
187
+ secure!(Node) { nodes(:bird_jpg) }
206
188
  end
207
- end
208
189
 
209
- def test_change_name_many_versions
210
- preserving_files('test.host/data') do
211
- login(:lion)
212
- img = secure!(Image) { Image.create( :parent_id=>nodes_id(:cleanWater),
213
- :inherit => 1,
214
- :name=>'birdy',
215
- :c_file => uploaded_jpg('bird.jpg')) }
190
+ context 'with a new title' do
191
+ should 'not change filepath' do
192
+ filepath1 = subject.filepath
193
+ assert subject.update_attributes(:title => 'Milan')
194
+ assert_equal filepath1, subject.filepath
195
+ end
196
+ end # with a new title
197
+
198
+ context 'with a new file' do
199
+ setup do
200
+ subject.update_attributes(:file => uploaded_jpg('flower.jpg'))
201
+ end
202
+
203
+ should 'be valid' do
204
+ assert subject.valid?
205
+ end
206
+
207
+ should 'be saved in the database' do
208
+ assert !subject.new_record?
209
+ end
210
+
211
+ should 'not change file name' do
212
+ assert_equal 'bird.jpg', subject.filename
213
+ end
216
214
 
217
- err img
218
- assert !img.new_record?
215
+ should 'not change filepath' do
216
+ assert_match /bird.jpg/, subject.filepath
217
+ end
218
+
219
+ should 'change width' do
220
+ assert_equal 800, subject.width
221
+ end
219
222
 
220
- img = secure!(Image) { Image.find(img[:id]) }
221
- assert img.publish
222
- img_id = img[:id]
223
- v1 = img.version.id
224
- old1 = img.version.content.filepath
225
- pv_format = Iformat['pv']
226
- old1_pv = img.version.content.filepath(pv_format)
227
- img.c_file(pv_format) # creates 'pv' file
223
+ should 'change height' do
224
+ assert_equal 600, subject.height
225
+ end
228
226
 
229
- img = secure!(Image) { Image.find(img_id) }
230
- # create a new redaction with a new file
231
- assert img.update_attributes(:c_file=> uploaded_jpg('flower.jpg'))
227
+ should 'change size' do
228
+ assert_equal 96648, subject.size
229
+ end
232
230
 
233
- # publish new redaction
234
- assert img.publish
231
+ # should 'change saved file'
232
+ # Moved to Attachment test (no transactional fixtures)
235
233
 
236
- v2 = img.version.id
237
- old2 = img.version.content.filepath
238
- old2_pv = img.version.content.filepath(pv_format)
234
+ end # with a new file
239
235
 
240
- img.c_file(pv_format) # creates 'pv' file
236
+ context 'with a document file' do
237
+ setup do
238
+ subject.update_attributes(:file => uploaded_text('some.txt'))
239
+ end
241
240
 
242
- [old1,old1_pv,old2,old2_pv].each do |path|
243
- assert File.exists?(path), "Path #{path.inspect} should exist"
241
+ should 'add an error on file' do
242
+ assert_equal 'incompatible with this class', subject.errors[:file]
244
243
  end
245
244
 
246
- # We do not propagate 'name' change to document_content 'name' because this is only used to find document content and
247
- # retrieve data in case the whole database goes havoc.
248
- assert img.update_attributes(:name=>'moineau')
245
+ should 'not change content type' do
246
+ assert 'image/jpeg', subject.content_type
247
+ end
249
248
 
250
- [old1,old1_pv,old2,old2_pv].each do |path|
251
- assert File.exists?(path), "Path #{path.inspect} did not change"
249
+ should 'not change file name' do
250
+ assert 'flower.jpg', subject.filename
252
251
  end
253
252
 
254
- version1 = Version.find(v1)
255
- version2 = Version.find(v2)
256
- new1 = version1.content.filepath
257
- new2 = version2.content.filepath
258
- assert File.exists?(new1), "New file exists"
259
- assert File.exists?(new2), "New file exists"
260
- end
261
- end
262
-
263
- def test_create_with_small_file
264
- preserving_files('/sites/test.host/data') do
265
- login(:ant)
266
- img = secure!(Image) { Image.create( :parent_id=>nodes_id(:cleanWater),
267
- :name => 'bomb.png',
268
- :c_file => uploaded_png('bomb.png') )}
269
- assert_kind_of Image, img
270
- assert ! img.new_record?, "Not a new record"
271
- assert_equal 793, img.version.content.size
272
- assert img.c_file(Iformat['pv'])
273
- end
274
- end
275
-
276
- def test_update_same_image
277
- login(:tiger)
278
- bird = secure!(Node) { nodes(:bird_jpg) }
279
- assert_equal Digest::MD5.hexdigest(bird.c_file.read),
280
- Digest::MD5.hexdigest(uploaded_jpg('bird.jpg').read)
281
- bird.c_file.rewind
282
- assert_equal 1, bird.versions.count
283
- assert_equal '2006-04-11 00:00', bird.updated_at.strftime('%Y-%m-%d %H:%M')
284
- assert !bird.version.would_edit?('content_attributes' => {'file' => uploaded_jpg('bird.jpg')})
285
- assert bird.update_attributes(:c_file => uploaded_jpg('bird.jpg'))
286
- assert_equal 1, bird.versions.count
287
- assert_equal '2006-04-11 00:00', bird.updated_at.strftime('%Y-%m-%d %H:%M')
288
- assert bird.update_attributes(:c_file => uploaded_jpg('flower.jpg'))
289
- assert_equal 2, bird.versions.count
290
- assert_not_equal '2006-04-11 00:00', bird.updated_at.strftime('%Y-%m-%d %H:%M')
291
- end
292
-
293
- def test_set_event_at_from_exif_tags
294
- without_files('test.host/data/jpg') do
295
- login(:ant)
296
- img = secure!(Image) { Image.create( :parent_id=>nodes_id(:cleanWater),
297
- :inherit => 1,
298
- :name=>'lake',
299
- :c_file => uploaded_jpg('exif_sample.jpg')) }
300
- assert_equal 'SANYO Electric Co.,Ltd.', img.c_exif['Make']
301
-
302
- # reload
303
- assert img = secure!(Image) { Image.find(img.id) }
304
- assert exif_tags = img.c_exif
305
- assert_equal 'SANYO Electric Co.,Ltd.', img.c_exif['Make']
306
- assert_equal Time.parse("1998-01-01 00:00:00"), img.c_exif.date_time
307
- assert_equal Time.parse("1998-01-01 00:00:00"), img.event_at
253
+ should 'not change file path' do
254
+ image = secure!(Node) { Node.find(subject.id) }
255
+ assert_match /bird.jpg/, image.filepath
256
+ end
257
+
258
+ should 'not create a version' do
259
+ assert_difference('Version.count', 0) do
260
+ subject
261
+ end
262
+ end
263
+ end # with a document file
264
+
265
+ context 'by cropping' do
266
+ context 'with x, y, w, h' do
267
+ subject do
268
+ secure!(Node) { nodes(:bird_jpg) }.tap do |n|
269
+ n.update_attributes(
270
+ :crop => {:x => '500', :y => 30, :w => '180', :h => 80}
271
+ )
272
+ end
273
+ end
274
+
275
+ should 'save a new version' do
276
+ assert_difference('Version.count', 1) do
277
+ subject
278
+ end
279
+ end
280
+
281
+ should 'clip and modify width from x and w' do
282
+ # 660 - 500 = 160
283
+ # 160 = min(160, 180)
284
+ assert_equal 160, subject.width
285
+ end
286
+
287
+ should 'clip and modify height from y and h' do
288
+ # 600 - 30 = 570
289
+ # 80 = min(570, 80)
290
+ assert_equal 80, subject.height
291
+ end
292
+ end # with x,y,w,h
293
+
294
+ context 'with max size' do
295
+
296
+ setup do
297
+ subject.update_attributes(
298
+ :crop => {'max_value' => '30', 'max_unit' => 'Kb'}
299
+ )
300
+ end
301
+
302
+ should 'reduce file size' do
303
+ assert subject.valid?
304
+ assert subject.size < 30 * 1024 * 1.2
305
+ end
306
+ end # with limitation
307
+
308
+ context 'with a format' do
309
+ setup do
310
+ subject.update_attributes(:crop => {:format => 'png'})
311
+ end
312
+
313
+ should 'change type' do
314
+ assert_equal 'image/png', subject.content_type
315
+ assert_equal 'png', subject.ext
316
+ end
317
+ end # with a format
318
+
319
+
320
+ context 'with same size' do
321
+ setup do
322
+ subject.update_attributes(
323
+ :crop => {:x => '0', :y => 0, :w => '660', :h => 600 }
324
+ )
325
+ end
326
+
327
+ should 'not change version' do
328
+ assert_difference('Version.count', 0) do
329
+ subject
330
+ end
331
+
332
+ assert_equal 660, subject.width
333
+ assert_equal 600, subject.height
334
+ end
335
+ end # with same size
336
+
337
+ context 'with a new file' do
338
+
339
+ should 'change file and crop' do
340
+ assert_difference('Version.count', 1) do
341
+ subject.update_attributes(
342
+ :file => uploaded_jpg('flower.jpg'),
343
+ :crop => {:x => '500', :y => 30, :w =>'200',:h => 80}
344
+ )
345
+ assert_equal 800, subject.width
346
+ assert_equal 600, subject.height
347
+ assert_equal 96648, subject.size
348
+ end
349
+ end
350
+ end # with new file
351
+ end # by cropping
352
+ end # Updating an image
353
+
354
+ context 'Destroying' do
355
+ setup do
356
+ login(:tiger)
308
357
  end
309
- end
310
358
 
311
- end
359
+ context 'an image' do
360
+ subject do
361
+ secure!(Node) { nodes(:bird_jpg) }
362
+ end
363
+
364
+ should 'destroy version from database' do
365
+ assert_difference('Version.count', -1) do
366
+ subject.destroy
367
+ end
368
+ end
369
+
370
+ should 'destroy attachment from database' do
371
+ assert_difference('Attachment.count', -1) do
372
+ subject.destroy
373
+ end
374
+ end
375
+
376
+ # should 'destroy file from file system'
377
+ # Moved to Attachment test (no transactional fixtures)
378
+
379
+ # context 'with iformats'
380
+ # Moved to Attachment test (no transactional fixtures)
381
+
382
+ end # an image
383
+ end # Destroying
384
+ end # ImageTest
385
+