alchemy_cms 3.2.1 → 3.3.0.rc1

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 (556) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +28 -0
  3. data/.gitignore +2 -2
  4. data/.travis.yml +11 -3
  5. data/CHANGELOG.md +100 -0
  6. data/CONTRIBUTING.md +1 -1
  7. data/Gemfile +12 -1
  8. data/README.md +25 -7
  9. data/Rakefile +1 -3
  10. data/alchemy_cms.gemspec +7 -15
  11. data/app/assets/fonts/alchemy/icons.eot +0 -0
  12. data/app/assets/fonts/alchemy/icons.svg +28 -66
  13. data/app/assets/fonts/alchemy/icons.ttf +0 -0
  14. data/app/assets/fonts/alchemy/icons.woff +0 -0
  15. data/app/assets/images/alchemy/icons.png +0 -0
  16. data/app/assets/javascripts/alchemy/alchemy.base.js.coffee +10 -3
  17. data/app/assets/javascripts/alchemy/alchemy.buttons.js.coffee +15 -6
  18. data/app/assets/javascripts/alchemy/alchemy.char_counter.js.coffee +1 -1
  19. data/app/assets/javascripts/alchemy/alchemy.datepicker.js.coffee +1 -1
  20. data/app/assets/javascripts/alchemy/alchemy.dialog.js.coffee +10 -4
  21. data/app/assets/javascripts/alchemy/alchemy.dirty.js.coffee +16 -22
  22. data/app/assets/javascripts/alchemy/alchemy.dragndrop.js.coffee +69 -32
  23. data/app/assets/javascripts/alchemy/alchemy.element_editors.js.coffee +147 -83
  24. data/app/assets/javascripts/alchemy/alchemy.file_progress.js.coffee +14 -14
  25. data/app/assets/javascripts/alchemy/alchemy.hotkeys.js.coffee +1 -1
  26. data/app/assets/javascripts/alchemy/alchemy.i18n.js.coffee +1 -1
  27. data/app/assets/javascripts/alchemy/alchemy.image_overlay.coffee +55 -0
  28. data/app/assets/javascripts/alchemy/alchemy.initializer.js.coffee +8 -1
  29. data/app/assets/javascripts/alchemy/alchemy.js +3 -1
  30. data/app/assets/javascripts/alchemy/alchemy.link_dialog.js.coffee +36 -31
  31. data/app/assets/javascripts/alchemy/alchemy.preview.js.coffee +35 -29
  32. data/app/assets/javascripts/alchemy/alchemy.sitemap.js.coffee +51 -5
  33. data/app/assets/javascripts/alchemy/alchemy.tinymce.js.coffee +26 -10
  34. data/app/assets/javascripts/alchemy/{alchemy.windows.js.coffee → alchemy.trash_window.js.coffee} +1 -13
  35. data/app/assets/javascripts/alchemy/alchemy.uploader.js.coffee +15 -17
  36. data/app/assets/javascripts/tinymce/plugins/alchemy_link/plugin.min.js +3 -3
  37. data/app/assets/stylesheets/alchemy/_extends.scss +1 -1
  38. data/app/assets/stylesheets/alchemy/_mixins.scss +27 -0
  39. data/app/assets/stylesheets/alchemy/_variables.scss +1 -0
  40. data/app/assets/stylesheets/alchemy/admin.scss +1 -0
  41. data/app/assets/stylesheets/alchemy/archive.scss +0 -57
  42. data/app/assets/stylesheets/alchemy/base.scss +1 -18
  43. data/app/assets/stylesheets/alchemy/buttons.scss +30 -25
  44. data/app/assets/stylesheets/alchemy/dialogs.scss +25 -9
  45. data/app/assets/stylesheets/alchemy/elements.scss +182 -126
  46. data/app/assets/stylesheets/alchemy/form_fields.scss +14 -8
  47. data/app/assets/stylesheets/alchemy/forms.scss +10 -1
  48. data/app/assets/stylesheets/alchemy/frame.scss +3 -10
  49. data/app/assets/stylesheets/alchemy/icon-font.scss +13 -6
  50. data/app/assets/stylesheets/alchemy/icons.scss +16 -0
  51. data/app/assets/stylesheets/alchemy/image_library.scss +269 -0
  52. data/app/assets/stylesheets/alchemy/selects.scss +1 -0
  53. data/app/assets/stylesheets/alchemy/sitemap.scss +12 -1
  54. data/app/assets/stylesheets/alchemy/toolbar.scss +2 -2
  55. data/app/assets/stylesheets/alchemy/upload.scss +97 -87
  56. data/app/assets/stylesheets/alchemy/welcome.sass +49 -0
  57. data/app/controllers/alchemy/admin/attachments_controller.rb +21 -29
  58. data/app/controllers/alchemy/admin/base_controller.rb +23 -4
  59. data/app/controllers/alchemy/admin/clipboard_controller.rb +0 -1
  60. data/app/controllers/alchemy/admin/contents_controller.rb +2 -4
  61. data/app/controllers/alchemy/admin/dashboard_controller.rb +4 -4
  62. data/app/controllers/alchemy/admin/elements_controller.rb +20 -11
  63. data/app/controllers/alchemy/admin/essence_files_controller.rb +2 -2
  64. data/app/controllers/alchemy/admin/essence_pictures_controller.rb +10 -9
  65. data/app/controllers/alchemy/admin/languages_controller.rb +0 -1
  66. data/app/controllers/alchemy/admin/layoutpages_controller.rb +0 -2
  67. data/app/controllers/alchemy/admin/legacy_page_urls_controller.rb +0 -1
  68. data/app/controllers/alchemy/admin/pages_controller.rb +46 -29
  69. data/app/controllers/alchemy/admin/pictures_controller.rb +44 -55
  70. data/app/controllers/alchemy/admin/resources_controller.rb +8 -75
  71. data/app/controllers/alchemy/admin/tags_controller.rb +10 -8
  72. data/app/controllers/alchemy/admin/trash_controller.rb +0 -6
  73. data/app/controllers/alchemy/api/contents_controller.rb +0 -1
  74. data/app/controllers/alchemy/api/elements_controller.rb +0 -1
  75. data/app/controllers/alchemy/api/pages_controller.rb +4 -1
  76. data/app/controllers/alchemy/attachments_controller.rb +4 -5
  77. data/app/controllers/alchemy/base_controller.rb +6 -5
  78. data/app/controllers/alchemy/elements_controller.rb +1 -1
  79. data/app/controllers/alchemy/messages_controller.rb +9 -4
  80. data/app/controllers/alchemy/pages_controller.rb +133 -137
  81. data/app/controllers/alchemy/pictures_controller.rb +12 -10
  82. data/app/controllers/concerns/alchemy/admin/uploader_responses.rb +41 -0
  83. data/app/controllers/concerns/alchemy/legacy_page_redirects.rb +56 -0
  84. data/app/controllers/concerns/alchemy/locale_redirects.rb +38 -0
  85. data/app/controllers/concerns/alchemy/page_redirects.rb +80 -0
  86. data/app/controllers/concerns/alchemy/site_redirects.rb +22 -0
  87. data/app/helpers/alchemy/admin/attachments_helper.rb +1 -2
  88. data/app/helpers/alchemy/admin/base_helper.rb +36 -62
  89. data/app/helpers/alchemy/admin/contents_helper.rb +6 -80
  90. data/app/helpers/alchemy/admin/elements_helper.rb +36 -15
  91. data/app/helpers/alchemy/admin/essences_helper.rb +15 -8
  92. data/app/helpers/alchemy/admin/form_helper.rb +6 -10
  93. data/app/helpers/alchemy/admin/navigation_helper.rb +4 -7
  94. data/app/helpers/alchemy/admin/pages_helper.rb +14 -35
  95. data/app/helpers/alchemy/admin/pictures_helper.rb +12 -14
  96. data/app/helpers/alchemy/admin/tags_helper.rb +5 -7
  97. data/app/helpers/alchemy/base_helper.rb +9 -17
  98. data/app/helpers/alchemy/elements_block_helper.rb +5 -13
  99. data/app/helpers/alchemy/elements_helper.rb +6 -6
  100. data/app/helpers/alchemy/essences_helper.rb +3 -16
  101. data/app/helpers/alchemy/pages_helper.rb +32 -25
  102. data/app/helpers/alchemy/url_helper.rb +14 -16
  103. data/app/mailers/alchemy/messages.rb +0 -2
  104. data/app/models/alchemy.rb +0 -2
  105. data/app/models/alchemy/attachment.rb +45 -56
  106. data/app/models/alchemy/cell.rb +7 -8
  107. data/app/models/alchemy/content.rb +39 -24
  108. data/app/models/alchemy/content/factory.rb +27 -44
  109. data/app/models/alchemy/element.rb +101 -267
  110. data/app/models/alchemy/element/definitions.rb +9 -8
  111. data/app/models/alchemy/element/element_contents.rb +150 -0
  112. data/app/models/alchemy/element/element_essences.rb +109 -0
  113. data/app/models/alchemy/element/presenters.rb +18 -7
  114. data/app/models/alchemy/essence_date.rb +1 -2
  115. data/app/models/alchemy/essence_file.rb +10 -6
  116. data/app/models/alchemy/essence_html.rb +0 -1
  117. data/app/models/alchemy/essence_picture.rb +12 -4
  118. data/app/models/alchemy/essence_richtext.rb +6 -3
  119. data/app/models/alchemy/language.rb +48 -21
  120. data/app/models/alchemy/language/code.rb +1 -4
  121. data/app/models/alchemy/page.rb +33 -35
  122. data/app/models/alchemy/page/page_cells.rb +6 -10
  123. data/app/models/alchemy/page/page_elements.rb +130 -100
  124. data/app/models/alchemy/page/page_naming.rb +2 -3
  125. data/app/models/alchemy/page/page_natures.rb +50 -16
  126. data/app/models/alchemy/page/page_scopes.rb +7 -7
  127. data/app/models/alchemy/page/page_users.rb +3 -3
  128. data/app/models/alchemy/picture.rb +48 -33
  129. data/app/models/alchemy/picture/transformations.rb +8 -9
  130. data/app/models/alchemy/site.rb +19 -17
  131. data/app/models/alchemy/site/layout.rb +9 -9
  132. data/app/models/alchemy/tag.rb +0 -2
  133. data/app/models/alchemy/tree_node.rb +5 -4
  134. data/app/serializers/alchemy/attachment_serializer.rb +0 -1
  135. data/app/serializers/alchemy/base_serializer.rb +30 -0
  136. data/app/serializers/alchemy/cell_serializer.rb +0 -1
  137. data/app/serializers/alchemy/essence_boolean_serializer.rb +0 -1
  138. data/app/serializers/alchemy/essence_date_serializer.rb +0 -1
  139. data/app/serializers/alchemy/essence_file_serializer.rb +0 -1
  140. data/app/serializers/alchemy/essence_html_serializer.rb +0 -1
  141. data/app/serializers/alchemy/essence_link_serializer.rb +0 -1
  142. data/app/serializers/alchemy/essence_picture_serializer.rb +0 -1
  143. data/app/serializers/alchemy/essence_richtext_serializer.rb +0 -1
  144. data/app/serializers/alchemy/essence_select_serializer.rb +0 -1
  145. data/app/serializers/alchemy/essence_text_serializer.rb +0 -1
  146. data/app/serializers/alchemy/legacy_element_serializer.rb +0 -1
  147. data/app/serializers/alchemy/page_serializer.rb +0 -1
  148. data/app/serializers/alchemy/page_tree_serializer.rb +90 -0
  149. data/app/serializers/alchemy/picture_serializer.rb +0 -1
  150. data/app/views/alchemy/_menubar.html.erb +3 -3
  151. data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +11 -16
  152. data/app/views/alchemy/admin/attachments/_attachment.html.erb +9 -9
  153. data/app/views/alchemy/admin/attachments/_files_list.html.erb +7 -15
  154. data/app/views/alchemy/admin/attachments/_overlay_file_list.html.erb +1 -1
  155. data/app/views/alchemy/admin/attachments/_tag_list.html.erb +2 -2
  156. data/app/views/alchemy/admin/attachments/edit.html.erb +3 -3
  157. data/app/views/alchemy/admin/attachments/index.html.erb +10 -17
  158. data/app/views/alchemy/admin/clipboard/clear.js.erb +1 -1
  159. data/app/views/alchemy/admin/clipboard/index.html.erb +3 -3
  160. data/app/views/alchemy/admin/clipboard/insert.js.erb +3 -3
  161. data/app/views/alchemy/admin/clipboard/remove.js.erb +2 -2
  162. data/app/views/alchemy/admin/contents/_missing.html.erb +5 -7
  163. data/app/views/alchemy/admin/contents/create.js.erb +1 -1
  164. data/app/views/alchemy/admin/contents/new.html.erb +2 -2
  165. data/app/views/alchemy/admin/dashboard/_locked_pages.html.erb +6 -6
  166. data/app/views/alchemy/admin/dashboard/_recent_pages.html.erb +2 -2
  167. data/app/views/alchemy/admin/dashboard/_users.html.erb +2 -2
  168. data/app/views/alchemy/admin/dashboard/help.html.erb +15 -15
  169. data/app/views/alchemy/admin/dashboard/index.html.erb +6 -6
  170. data/app/views/alchemy/admin/dashboard/info.html.erb +5 -5
  171. data/app/views/alchemy/admin/elements/_add_picture.html.erb +1 -1
  172. data/app/views/alchemy/admin/elements/_element.html.erb +52 -18
  173. data/app/views/alchemy/admin/elements/_element_footer.html.erb +11 -0
  174. data/app/views/alchemy/admin/elements/{_element_head.html.erb → _element_header.html.erb} +8 -8
  175. data/app/views/alchemy/admin/elements/_element_toolbar.html.erb +49 -0
  176. data/app/views/alchemy/admin/elements/_new_element_form.html.erb +7 -6
  177. data/app/views/alchemy/admin/elements/_picture_gallery_editor.html.erb +1 -1
  178. data/app/views/alchemy/admin/elements/_refresh_editor.js.erb +1 -1
  179. data/app/views/alchemy/admin/elements/create.js.erb +13 -8
  180. data/app/views/alchemy/admin/elements/fold.js.erb +12 -7
  181. data/app/views/alchemy/admin/elements/index.html.erb +12 -8
  182. data/app/views/alchemy/admin/elements/list.html.erb +3 -3
  183. data/app/views/alchemy/admin/elements/new.html.erb +4 -4
  184. data/app/views/alchemy/admin/elements/order.js.erb +3 -4
  185. data/app/views/alchemy/admin/elements/publish.js.erb +15 -0
  186. data/app/views/alchemy/admin/elements/trash.js.erb +3 -3
  187. data/app/views/alchemy/admin/elements/update.js.erb +7 -8
  188. data/app/views/alchemy/admin/essence_files/edit.html.erb +16 -13
  189. data/app/views/alchemy/admin/essence_pictures/crop.html.erb +3 -3
  190. data/app/views/alchemy/admin/essence_pictures/edit.html.erb +8 -8
  191. data/app/views/alchemy/admin/languages/_form.html.erb +12 -3
  192. data/app/views/alchemy/admin/languages/_language.html.erb +8 -2
  193. data/app/views/alchemy/admin/languages/_table.html.erb +11 -5
  194. data/app/views/alchemy/admin/languages/index.html.erb +1 -1
  195. data/app/views/alchemy/admin/layoutpages/_layoutpage.html.erb +8 -8
  196. data/app/views/alchemy/admin/layoutpages/edit.html.erb +2 -2
  197. data/app/views/alchemy/admin/layoutpages/index.html.erb +6 -13
  198. data/app/views/alchemy/admin/leave.html.erb +5 -5
  199. data/app/views/alchemy/admin/legacy_page_urls/_form.html.erb +1 -1
  200. data/app/views/alchemy/admin/legacy_page_urls/_legacy_page_url.html.erb +4 -4
  201. data/app/views/alchemy/admin/legacy_page_urls/_new.html.erb +1 -1
  202. data/app/views/alchemy/admin/pages/_create_language_form.html.erb +9 -9
  203. data/app/views/alchemy/admin/pages/_external_link.html.erb +6 -6
  204. data/app/views/alchemy/admin/pages/_file_link.html.erb +6 -6
  205. data/app/views/alchemy/admin/pages/_form.html.erb +6 -6
  206. data/app/views/alchemy/admin/pages/_internal_link.html.erb +9 -11
  207. data/app/views/alchemy/admin/pages/_legacy_urls.html.erb +3 -3
  208. data/app/views/alchemy/admin/pages/_locked_page.html.erb +4 -4
  209. data/app/views/alchemy/admin/pages/_new_page_form.html.erb +2 -2
  210. data/app/views/alchemy/admin/pages/_page.html.erb +95 -80
  211. data/app/views/alchemy/admin/pages/_page_for_links.html.erb +22 -22
  212. data/app/views/alchemy/admin/pages/_page_infos.html.erb +12 -0
  213. data/app/views/alchemy/admin/pages/_page_status.html.erb +7 -9
  214. data/app/views/alchemy/admin/pages/_sitemap.html.erb +35 -6
  215. data/app/views/alchemy/admin/pages/_tinymce_custom_config.html.erb +0 -3
  216. data/app/views/alchemy/admin/pages/configure.html.erb +1 -1
  217. data/app/views/alchemy/admin/pages/configure_external.html.erb +4 -4
  218. data/app/views/alchemy/admin/pages/edit.html.erb +39 -44
  219. data/app/views/alchemy/admin/pages/flush.js.erb +1 -1
  220. data/app/views/alchemy/admin/pages/fold.js.erb +2 -3
  221. data/app/views/alchemy/admin/pages/index.html.erb +15 -22
  222. data/app/views/alchemy/admin/pages/info.html.erb +8 -8
  223. data/app/views/alchemy/admin/pages/link.html.erb +3 -3
  224. data/app/views/alchemy/admin/pages/locked.html.erb +1 -1
  225. data/app/views/alchemy/admin/pages/new.html.erb +4 -4
  226. data/app/views/alchemy/admin/pages/sort.js.erb +1 -2
  227. data/app/views/alchemy/admin/pages/unlock.js.erb +1 -1
  228. data/app/views/alchemy/admin/pages/update.js.erb +3 -3
  229. data/app/views/alchemy/admin/partials/_autocomplete_tag_list.html.erb +1 -1
  230. data/app/views/alchemy/admin/partials/_language_tree_select.html.erb +1 -1
  231. data/app/views/alchemy/admin/partials/_main_navigation_entry.html.erb +1 -1
  232. data/app/views/alchemy/admin/partials/_remote_search_form.html.erb +9 -15
  233. data/app/views/alchemy/admin/partials/_search_form.html.erb +14 -13
  234. data/app/views/alchemy/admin/partials/_sub_navigation.html.erb +1 -1
  235. data/app/views/alchemy/admin/pictures/_archive.html.erb +14 -14
  236. data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +30 -36
  237. data/app/views/alchemy/admin/pictures/_filter_bar.html.erb +5 -5
  238. data/app/views/alchemy/admin/pictures/{edit.html.erb → _form.html.erb} +7 -6
  239. data/app/views/alchemy/admin/pictures/_infos.html.erb +50 -0
  240. data/app/views/alchemy/admin/pictures/_overlay_picture_list.html.erb +1 -1
  241. data/app/views/alchemy/admin/pictures/_picture.html.erb +17 -51
  242. data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +1 -1
  243. data/app/views/alchemy/admin/pictures/_tag_list.html.erb +2 -2
  244. data/app/views/alchemy/admin/pictures/edit_multiple.html.erb +6 -6
  245. data/app/views/alchemy/admin/pictures/index.html.erb +28 -36
  246. data/app/views/alchemy/admin/pictures/show.html.erb +46 -9
  247. data/app/views/alchemy/admin/pictures/update.js.erb +6 -0
  248. data/app/views/alchemy/admin/resources/_form.html.erb +3 -3
  249. data/app/views/alchemy/admin/resources/_resource.html.erb +4 -4
  250. data/app/views/alchemy/admin/resources/_table.html.erb +5 -6
  251. data/app/views/alchemy/admin/resources/index.csv.erb +12 -10
  252. data/app/views/alchemy/admin/resources/index.html.erb +4 -4
  253. data/app/views/alchemy/admin/sites/index.html.erb +1 -1
  254. data/app/views/alchemy/admin/tags/_tag.html.erb +4 -4
  255. data/app/views/alchemy/admin/tags/edit.html.erb +5 -5
  256. data/app/views/alchemy/admin/tags/index.html.erb +8 -8
  257. data/app/views/alchemy/admin/tags/new.html.erb +2 -2
  258. data/app/views/alchemy/admin/trash/clear.js.erb +1 -1
  259. data/app/views/alchemy/admin/trash/index.html.erb +8 -6
  260. data/app/views/alchemy/admin/uploader/_button.html.erb +39 -0
  261. data/app/views/alchemy/admin/uploader/_setup.html.erb +13 -0
  262. data/app/views/alchemy/base/500.html.erb +4 -4
  263. data/app/views/alchemy/elements/_editor_not_found.html.erb +1 -1
  264. data/app/views/alchemy/essences/_essence_boolean_editor.html.erb +3 -4
  265. data/app/views/alchemy/essences/_essence_boolean_view.html.erb +1 -1
  266. data/app/views/alchemy/essences/_essence_date_editor.html.erb +2 -6
  267. data/app/views/alchemy/essences/_essence_date_view.html.erb +1 -1
  268. data/app/views/alchemy/essences/_essence_file_editor.html.erb +9 -11
  269. data/app/views/alchemy/essences/_essence_file_view.html.erb +11 -5
  270. data/app/views/alchemy/essences/_essence_html_editor.html.erb +1 -1
  271. data/app/views/alchemy/essences/_essence_link_editor.html.erb +1 -1
  272. data/app/views/alchemy/essences/_essence_link_view.html.erb +1 -1
  273. data/app/views/alchemy/essences/_essence_picture_editor.html.erb +47 -52
  274. data/app/views/alchemy/essences/_essence_richtext_editor.html.erb +1 -1
  275. data/app/views/alchemy/essences/_essence_richtext_view.html.erb +1 -1
  276. data/app/views/alchemy/essences/_essence_select_editor.html.erb +23 -13
  277. data/app/views/alchemy/essences/_essence_text_editor.html.erb +1 -1
  278. data/app/views/alchemy/essences/_essence_text_view.html.erb +1 -1
  279. data/app/views/alchemy/essences/shared/_essence_picture_tools.html.erb +29 -36
  280. data/app/views/alchemy/essences/shared/_linkable_essence_tools.html.erb +5 -5
  281. data/app/views/alchemy/language_links/_language.html.erb +15 -9
  282. data/app/views/alchemy/messages/contact_form_mail.de.text.erb +1 -1
  283. data/app/views/alchemy/messages/contact_form_mail.en.text.erb +1 -1
  284. data/app/views/alchemy/messages/contact_form_mail.es.text.erb +1 -1
  285. data/app/views/alchemy/navigation/_link.html.erb +0 -1
  286. data/app/views/alchemy/pages/show.rss.builder +6 -4
  287. data/app/views/alchemy/welcome.html.erb +28 -0
  288. data/app/views/layouts/alchemy/admin.html.erb +14 -10
  289. data/bin/alchemy +3 -4
  290. data/bin/rspec +7 -0
  291. data/bin/spring +15 -0
  292. data/config/alchemy/config.yml +16 -17
  293. data/config/initializers/assets.rb +13 -0
  294. data/config/locales/alchemy.de.yml +27 -29
  295. data/config/locales/alchemy.en.yml +23 -29
  296. data/config/locales/alchemy.es.yml +23 -29
  297. data/config/locales/alchemy.fr.yml +19 -28
  298. data/config/locales/alchemy.nl.yml +19 -27
  299. data/config/locales/alchemy.ru.yml +19 -28
  300. data/config/routes.rb +53 -54
  301. data/config/spring.rb +2 -0
  302. data/db/migrate/20130827094554_alchemy_two_point_six.rb +1 -3
  303. data/db/migrate/20150608204610_add_parent_element_id_to_alchemy_elements.rb +6 -0
  304. data/db/migrate/20150729151825_add_link_text_to_alchemy_essence_files.rb +5 -0
  305. data/db/migrate/20150906195818_add_locale_to_alchemy_languages.rb +7 -0
  306. data/lib/alchemy/auth_accessors.rb +1 -1
  307. data/lib/alchemy/cache_digests/template_tracker.rb +7 -13
  308. data/lib/alchemy/config.rb +5 -7
  309. data/lib/alchemy/configuration_methods.rb +11 -1
  310. data/lib/alchemy/controller_actions.rb +9 -12
  311. data/lib/alchemy/engine.rb +11 -28
  312. data/lib/alchemy/errors.rb +0 -1
  313. data/lib/alchemy/essence.rb +20 -20
  314. data/lib/alchemy/filetypes.rb +1 -3
  315. data/lib/alchemy/forms/builder.rb +0 -2
  316. data/lib/alchemy/hints.rb +1 -3
  317. data/lib/alchemy/i18n.rb +81 -53
  318. data/lib/alchemy/kaminari/scoped_pagination_url_helper.rb +0 -2
  319. data/lib/alchemy/locale.rb +0 -1
  320. data/lib/alchemy/logger.rb +1 -3
  321. data/lib/alchemy/modules.rb +3 -3
  322. data/lib/alchemy/mount_point.rb +0 -2
  323. data/lib/alchemy/name_conversions.rb +1 -3
  324. data/lib/alchemy/on_page_layout.rb +37 -23
  325. data/lib/alchemy/on_page_layout/callbacks_runner.rb +34 -0
  326. data/lib/alchemy/page_layout.rb +23 -24
  327. data/lib/alchemy/paths.rb +32 -0
  328. data/lib/alchemy/permissions.rb +20 -20
  329. data/lib/alchemy/picture_attributes.rb +0 -3
  330. data/lib/alchemy/resource.rb +66 -22
  331. data/lib/alchemy/resources_helper.rb +48 -11
  332. data/lib/alchemy/routing_constraints.rb +4 -5
  333. data/lib/alchemy/seeder.rb +1 -4
  334. data/lib/alchemy/shell.rb +12 -14
  335. data/lib/alchemy/tasks/helpers.rb +5 -7
  336. data/lib/alchemy/test_support/essence_shared_examples.rb +24 -24
  337. data/lib/alchemy/test_support/factories.rb +2 -146
  338. data/lib/alchemy/test_support/factories/attachment_factory.rb +9 -0
  339. data/lib/alchemy/test_support/factories/cell_factory.rb +9 -0
  340. data/lib/alchemy/test_support/factories/content_factory.rb +10 -0
  341. data/lib/alchemy/test_support/factories/dummy_user_factory.rb +21 -0
  342. data/lib/alchemy/test_support/factories/element_factory.rb +21 -0
  343. data/lib/alchemy/test_support/factories/essence_file_factory.rb +8 -0
  344. data/lib/alchemy/test_support/factories/essence_picture_factory.rb +8 -0
  345. data/lib/alchemy/test_support/factories/essence_text_factory.rb +7 -0
  346. data/lib/alchemy/test_support/factories/language_factory.rb +28 -0
  347. data/lib/alchemy/test_support/factories/page_factory.rb +45 -0
  348. data/lib/alchemy/test_support/factories/picture_factory.rb +10 -0
  349. data/lib/alchemy/test_support/factories/site_factory.rb +12 -0
  350. data/lib/alchemy/test_support/integration_helpers.rb +0 -3
  351. data/lib/alchemy/tinymce.rb +24 -35
  352. data/lib/alchemy/touching.rb +5 -6
  353. data/lib/alchemy/upgrader.rb +3 -5
  354. data/lib/alchemy/upgrader/tasks/available_contents_upgrader.rb +155 -0
  355. data/lib/alchemy/upgrader/tasks/nestable_elements_migration.rb +71 -0
  356. data/lib/alchemy/upgrader/tasks/three_point_two_task.rb +31 -0
  357. data/lib/alchemy/upgrader/three_point_three.rb +50 -0
  358. data/lib/alchemy/upgrader/three_point_two.rb +3 -32
  359. data/lib/alchemy/upgrader/three_point_zero.rb +0 -1
  360. data/lib/alchemy/version.rb +1 -1
  361. data/lib/rails/generators/alchemy/base.rb +1 -1
  362. data/lib/rails/generators/alchemy/elements/elements_generator.rb +1 -7
  363. data/lib/rails/generators/alchemy/elements/templates/editor.html.erb +5 -7
  364. data/lib/rails/generators/alchemy/elements/templates/editor.html.haml +6 -8
  365. data/lib/rails/generators/alchemy/elements/templates/editor.html.slim +6 -7
  366. data/lib/rails/generators/alchemy/elements/templates/view.html.erb +4 -4
  367. data/lib/rails/generators/alchemy/elements/templates/view.html.haml +3 -3
  368. data/lib/rails/generators/alchemy/elements/templates/view.html.slim +3 -3
  369. data/lib/rails/generators/alchemy/essence/essence_generator.rb +2 -3
  370. data/lib/rails/generators/alchemy/essence/templates/editor.html.erb +1 -1
  371. data/lib/rails/generators/alchemy/install/files/alchemy.de.yml +2 -2
  372. data/lib/rails/generators/alchemy/install/files/alchemy.en.yml +2 -2
  373. data/lib/rails/generators/alchemy/install/files/alchemy.es.yml +3 -3
  374. data/lib/rails/generators/alchemy/install/install_generator.rb +0 -1
  375. data/lib/rails/generators/alchemy/install/templates/elements.yml.tt +2 -2
  376. data/lib/rails/generators/alchemy/install/templates/page_layouts.yml.tt +1 -1
  377. data/lib/rails/generators/alchemy/module/module_generator.rb +1 -1
  378. data/lib/rails/templates/alchemy.rb +2 -2
  379. data/lib/tasks/alchemy/convert.rake +4 -8
  380. data/lib/tasks/alchemy/db.rake +2 -3
  381. data/lib/tasks/alchemy/install.rake +3 -4
  382. data/lib/tasks/alchemy/tidy.rake +4 -5
  383. data/lib/tasks/alchemy/upgrade.rake +2 -4
  384. data/spec/controllers/{admin → alchemy/admin}/attachments_controller_spec.rb +26 -44
  385. data/spec/controllers/{admin → alchemy/admin}/base_controller_spec.rb +14 -1
  386. data/spec/controllers/{admin → alchemy/admin}/clipboard_controller_spec.rb +3 -3
  387. data/spec/controllers/{admin → alchemy/admin}/contents_controller_spec.rb +4 -4
  388. data/spec/controllers/{admin → alchemy/admin}/dashboard_controller_spec.rb +11 -6
  389. data/spec/controllers/{admin → alchemy/admin}/elements_controller_spec.rb +54 -31
  390. data/spec/controllers/{admin → alchemy/admin}/essence_files_controller_spec.rb +8 -3
  391. data/spec/controllers/{admin → alchemy/admin}/essence_pictures_controller_spec.rb +3 -3
  392. data/spec/controllers/{admin → alchemy/admin}/languages_controller_spec.rb +13 -1
  393. data/spec/controllers/{admin → alchemy/admin}/layoutpages_controller_spec.rb +0 -6
  394. data/spec/controllers/{admin → alchemy/admin}/pages_controller_spec.rb +103 -35
  395. data/spec/controllers/{admin → alchemy/admin}/pictures_controller_spec.rb +133 -108
  396. data/spec/controllers/alchemy/admin/resources_controller_spec.rb +81 -0
  397. data/spec/controllers/{admin → alchemy/admin}/trash_controller_spec.rb +12 -13
  398. data/spec/controllers/alchemy/api/contents_controller_spec.rb +12 -13
  399. data/spec/controllers/alchemy/api/elements_controller_spec.rb +8 -9
  400. data/spec/controllers/alchemy/api/pages_controller_spec.rb +40 -7
  401. data/spec/controllers/{attachments_controller_spec.rb → alchemy/attachments_controller_spec.rb} +7 -7
  402. data/spec/controllers/alchemy/base_controller_spec.rb +106 -0
  403. data/spec/controllers/{elements_controller_spec.rb → alchemy/elements_controller_spec.rb} +4 -4
  404. data/spec/controllers/{messages_controller_spec.rb → alchemy/messages_controller_spec.rb} +14 -9
  405. data/spec/controllers/alchemy/on_page_layout_mixin_spec.rb +330 -0
  406. data/spec/controllers/{pages_controller_spec.rb → alchemy/pages_controller_spec.rb} +167 -89
  407. data/spec/controllers/{pictures_controller_spec.rb → alchemy/pictures_controller_spec.rb} +42 -20
  408. data/spec/dummy/app/models/dummy_user.rb +4 -0
  409. data/spec/dummy/app/views/alchemy/elements/_all_you_can_eat_view.html.erb +31 -0
  410. data/spec/dummy/app/views/alchemy/elements/_article_editor.html.erb +6 -10
  411. data/spec/dummy/app/views/alchemy/elements/_article_view.html.erb +9 -24
  412. data/spec/dummy/app/views/alchemy/elements/_bild_editor.html.erb +3 -0
  413. data/spec/dummy/app/views/alchemy/elements/_bild_view.html.erb +5 -0
  414. data/spec/dummy/app/views/alchemy/elements/_contactform_editor.html.erb +6 -0
  415. data/spec/dummy/app/views/alchemy/elements/_contactform_view.html.erb +16 -0
  416. data/spec/dummy/app/views/alchemy/elements/_download_editor.html.erb +3 -0
  417. data/spec/dummy/app/views/alchemy/elements/_download_view.html.erb +5 -0
  418. data/spec/dummy/app/views/alchemy/elements/_erb_element_editor.html.erb +3 -0
  419. data/spec/dummy/app/views/alchemy/elements/_erb_element_view.html.erb +5 -0
  420. data/spec/dummy/app/views/alchemy/elements/_header_editor.html.erb +3 -0
  421. data/spec/dummy/app/views/alchemy/elements/_header_view.html.erb +5 -0
  422. data/spec/dummy/app/views/alchemy/elements/_news_editor.html.erb +5 -0
  423. data/spec/dummy/app/views/alchemy/elements/_search_editor.html.erb +1 -0
  424. data/spec/dummy/app/views/alchemy/elements/_search_view.html.erb +4 -0
  425. data/spec/dummy/app/views/alchemy/elements/_slide_editor.html.erb +3 -0
  426. data/spec/dummy/app/views/alchemy/elements/_slide_view.html.erb +5 -0
  427. data/spec/dummy/app/views/alchemy/elements/_slider_editor.html.erb +2 -0
  428. data/spec/dummy/app/views/alchemy/elements/_slider_view.html.erb +4 -0
  429. data/spec/dummy/app/views/alchemy/elements/_text_editor.html.erb +3 -0
  430. data/spec/dummy/app/views/alchemy/elements/_text_view.html.erb +5 -0
  431. data/spec/dummy/app/views/alchemy/page_layouts/_standard.html.erb +1 -0
  432. data/spec/dummy/config/alchemy/elements.yml +10 -13
  433. data/spec/dummy/config/alchemy/page_layouts.yml +1 -1
  434. data/spec/dummy/config/initializers/alchemy.rb +1 -0
  435. data/spec/dummy/config/locales/kl.yml +2 -0
  436. data/spec/dummy/db/migrate/20150608204610_add_parent_element_id_to_alchemy_elements.rb +1 -0
  437. data/spec/dummy/db/migrate/20150729151825_add_link_text_to_alchemy_essence_files.rb +1 -0
  438. data/spec/dummy/db/migrate/20150906195818_add_locale_to_alchemy_languages.rb +1 -0
  439. data/spec/dummy/db/schema.rb +10 -6
  440. data/spec/factories.rb +13 -0
  441. data/spec/features/admin/admin_layout_spec.rb +14 -0
  442. data/spec/features/admin/dashboard_spec.rb +1 -2
  443. data/spec/features/admin/edit_elements_feature_spec.rb +36 -0
  444. data/spec/features/admin/language_tree_feature_spec.rb +7 -8
  445. data/spec/features/admin/languages_features_spec.rb +65 -0
  446. data/spec/features/admin/legacy_page_url_management_spec.rb +3 -3
  447. data/spec/features/admin/link_overlay_spec.rb +16 -17
  448. data/spec/features/admin/locale_select_feature_spec.rb +1 -1
  449. data/spec/features/admin/modules_integration_spec.rb +0 -1
  450. data/spec/features/admin/navigation_feature_spec.rb +11 -2
  451. data/spec/features/admin/page_creation_feature_spec.rb +5 -5
  452. data/spec/features/admin/page_editing_feature_spec.rb +6 -6
  453. data/spec/features/admin/picture_library_integration_spec.rb +3 -3
  454. data/spec/features/admin/resources_integration_spec.rb +7 -12
  455. data/spec/features/admin/site_select_feature_spec.rb +1 -2
  456. data/spec/features/admin/tinymce_feature_spec.rb +0 -1
  457. data/spec/features/page_feature_spec.rb +57 -158
  458. data/spec/features/page_redirects_spec.rb +358 -0
  459. data/spec/features/picture_security_spec.rb +1 -7
  460. data/spec/fixtures/animated.gif +0 -0
  461. data/spec/helpers/{admin → alchemy/admin}/attachments_helper_spec.rb +0 -0
  462. data/spec/helpers/{admin → alchemy/admin}/base_helper_spec.rb +39 -29
  463. data/spec/helpers/{admin → alchemy/admin}/contents_helper_spec.rb +4 -23
  464. data/spec/helpers/{admin → alchemy/admin}/elements_helper_spec.rb +141 -5
  465. data/spec/helpers/{admin → alchemy/admin}/essences_helper_spec.rb +69 -8
  466. data/spec/helpers/{admin → alchemy/admin}/navigation_helper_spec.rb +43 -37
  467. data/spec/helpers/{admin → alchemy/admin}/pages_helper_spec.rb +6 -38
  468. data/spec/helpers/{admin → alchemy/admin}/pictures_helper_spec.rb +0 -1
  469. data/spec/helpers/{admin → alchemy/admin}/tags_helper_spec.rb +1 -3
  470. data/spec/helpers/{base_helper_spec.rb → alchemy/base_helper_spec.rb} +1 -2
  471. data/spec/helpers/{elements_block_helper_spec.rb → alchemy/elements_block_helper_spec.rb} +3 -3
  472. data/spec/helpers/{elements_helper_spec.rb → alchemy/elements_helper_spec.rb} +18 -19
  473. data/spec/helpers/alchemy/essences_helper_spec.rb +85 -0
  474. data/spec/helpers/{pages_helper_spec.rb → alchemy/pages_helper_spec.rb} +125 -39
  475. data/spec/helpers/alchemy/picture_url_helpers_spec.rb +78 -0
  476. data/spec/helpers/{url_helper_spec.rb → alchemy/url_helper_spec.rb} +66 -40
  477. data/spec/libraries/config_spec.rb +2 -3
  478. data/spec/libraries/controller_actions_spec.rb +18 -18
  479. data/spec/libraries/i18n_spec.rb +7 -0
  480. data/spec/libraries/page_layout_spec.rb +13 -7
  481. data/spec/libraries/paths_spec.rb +15 -0
  482. data/spec/libraries/permissions_spec.rb +6 -7
  483. data/spec/libraries/resource_spec.rb +48 -75
  484. data/spec/libraries/resources_helper_spec.rb +55 -6
  485. data/spec/libraries/shell_spec.rb +0 -4
  486. data/spec/libraries/template_tracker_spec.rb +4 -13
  487. data/spec/libraries/tinymce_spec.rb +53 -9
  488. data/spec/mailers/{messages_spec.rb → alchemy/messages_spec.rb} +0 -2
  489. data/spec/models/{attachment_spec.rb → alchemy/attachment_spec.rb} +43 -20
  490. data/spec/models/{cell_spec.rb → alchemy/cell_spec.rb} +2 -3
  491. data/spec/models/{content_spec.rb → alchemy/content_spec.rb} +179 -70
  492. data/spec/models/{element_spec.rb → alchemy/element_spec.rb} +315 -70
  493. data/spec/models/{element_to_page_spec.rb → alchemy/element_to_page_spec.rb} +0 -1
  494. data/spec/models/{essence_boolean_spec.rb → alchemy/essence_boolean_spec.rb} +0 -0
  495. data/spec/models/{essence_date_spec.rb → alchemy/essence_date_spec.rb} +2 -3
  496. data/spec/models/{essence_file_spec.rb → alchemy/essence_file_spec.rb} +2 -5
  497. data/spec/models/{essence_html_spec.rb → alchemy/essence_html_spec.rb} +1 -1
  498. data/spec/models/{essence_link_spec.rb → alchemy/essence_link_spec.rb} +0 -0
  499. data/spec/models/{essence_picture_spec.rb → alchemy/essence_picture_spec.rb} +101 -29
  500. data/spec/models/{essence_richtext_spec.rb → alchemy/essence_richtext_spec.rb} +7 -2
  501. data/spec/models/{essence_select_spec.rb → alchemy/essence_select_spec.rb} +0 -0
  502. data/spec/models/{essence_text_spec.rb → alchemy/essence_text_spec.rb} +4 -8
  503. data/spec/models/alchemy/language_spec.rb +243 -0
  504. data/spec/models/{legacy_page_url_spec.rb → alchemy/legacy_page_url_spec.rb} +1 -1
  505. data/spec/models/{message_spec.rb → alchemy/message_spec.rb} +0 -0
  506. data/spec/models/{page_spec.rb → alchemy/page_spec.rb} +460 -248
  507. data/spec/models/{picture_spec.rb → alchemy/picture_spec.rb} +118 -30
  508. data/spec/models/{site_spec.rb → alchemy/site_spec.rb} +19 -84
  509. data/spec/models/{tag_spec.rb → alchemy/tag_spec.rb} +1 -3
  510. data/spec/models/dummy_model_spec.rb +1 -2
  511. data/spec/requests/alchemy/admin/resources_requests_spec.rb +26 -0
  512. data/spec/requests/alchemy/admin/site_requests_spec.rb +19 -0
  513. data/spec/requests/alchemy/site_requests_spec.rb +18 -0
  514. data/spec/requests/alchemy/sitemap_spec.rb +56 -0
  515. data/spec/routing/api_routing_spec.rb +1 -1
  516. data/spec/routing/routing_spec.rb +121 -15
  517. data/spec/spec_helper.rb +2 -1
  518. data/spec/support/hint_examples.rb +1 -3
  519. data/spec/support/test_tweaks.rb +3 -3
  520. data/spec/support/transformation_examples.rb +6 -7
  521. data/spec/tasks/helpers_spec.rb +2 -4
  522. data/spec/views/admin/pictures/show_spec.rb +43 -0
  523. data/spec/views/essences/essence_boolean_editor_spec.rb +0 -1
  524. data/spec/views/essences/essence_boolean_view_spec.rb +2 -4
  525. data/spec/views/essences/essence_date_view_spec.rb +0 -1
  526. data/spec/views/essences/essence_file_editor_spec.rb +4 -6
  527. data/spec/views/essences/essence_file_view_spec.rb +56 -3
  528. data/spec/views/essences/essence_link_view_spec.rb +1 -1
  529. data/spec/views/essences/essence_picture_editor_spec.rb +80 -0
  530. data/spec/views/essences/essence_picture_view_spec.rb +0 -1
  531. data/spec/views/essences/essence_select_view_spec.rb +0 -1
  532. data/spec/views/essences/essence_text_view_spec.rb +0 -1
  533. data/vendor/assets/javascripts/handlebars.js +4608 -0
  534. data/vendor/assets/javascripts/tinymce/langs/de.js +19 -0
  535. data/vendor/assets/javascripts/tinymce/langs/es.js +19 -0
  536. data/vendor/assets/javascripts/tinymce/langs/fr.js +23 -4
  537. data/vendor/assets/javascripts/tinymce/langs/nl.js +22 -3
  538. data/vendor/assets/javascripts/tinymce/langs/ru.js +22 -3
  539. data/vendor/assets/javascripts/tinymce/plugins/paste/plugin.min.js +1 -1
  540. data/vendor/assets/javascripts/tinymce/plugins/table/plugin.min.js +1 -1
  541. data/vendor/assets/javascripts/tinymce/themes/modern/theme.min.js +1 -1
  542. data/vendor/assets/javascripts/tinymce/tinymce.min.js +12 -13
  543. metadata +274 -256
  544. data/app/views/alchemy/admin/attachments/create.js.erb +0 -11
  545. data/app/views/alchemy/admin/attachments/new.html.erb +0 -14
  546. data/app/views/alchemy/admin/elements/_element_foot.html.erb +0 -36
  547. data/app/views/alchemy/admin/partials/_upload_form.html.erb +0 -67
  548. data/app/views/alchemy/admin/pictures/info.html.erb +0 -38
  549. data/app/views/alchemy/admin/pictures/new.html.erb +0 -16
  550. data/lib/alchemy/middleware/rescue_old_cookies.rb +0 -27
  551. data/spec/controllers/admin/resources_controller_spec.rb +0 -53
  552. data/spec/controllers/base_controller_spec.rb +0 -51
  553. data/spec/helpers/essences_helper_spec.rb +0 -156
  554. data/spec/helpers/picture_url_helpers_spec.rb +0 -35
  555. data/spec/libraries/on_page_layout_spec.rb +0 -112
  556. data/spec/models/language_spec.rb +0 -123
@@ -12,45 +12,59 @@ module Alchemy
12
12
 
13
13
  context 'page path helpers' do
14
14
  describe "#show_page_path_params" do
15
- context "when multi_language" do
15
+ subject(:show_page_path_params) { helper.show_page_path_params(page) }
16
16
 
17
+ context "if prefix_locale? is false" do
17
18
  before do
18
- allow(helper).to receive(:multi_language?).and_return(true)
19
+ expect(helper).to receive(:prefix_locale?) { false }
19
20
  end
20
21
 
21
- it "should return a Hash with urlname and language_id parameter" do
22
- allow(helper).to receive(:multi_language?).and_return(true)
23
- expect(helper.show_page_path_params(page)).to include(urlname: 'testpage', locale: 'en')
22
+ it "returns a Hash with urlname and no locale parameter" do
23
+ expect(show_page_path_params).to include(urlname: 'testpage')
24
+ expect(show_page_path_params).to_not include(locale: 'en')
24
25
  end
25
26
 
26
- it "should return a Hash with urlname, language_id and query parameter" do
27
- allow(helper).to receive(:multi_language?).and_return(true)
28
- expect(helper.show_page_path_params(page, {query: 'test'})).to include(urlname: 'testpage', locale: 'en', query: 'test')
27
+ context "with addiitonal parameters" do
28
+ subject(:show_page_path_params) do
29
+ helper.show_page_path_params(page, {query: 'test'})
30
+ end
31
+
32
+ it "returns a Hash with urlname, no locale and query parameter" do
33
+ expect(show_page_path_params).to \
34
+ include(urlname: 'testpage', query: 'test')
35
+ expect(show_page_path_params).to_not \
36
+ include(locale: 'en')
37
+ end
29
38
  end
30
39
  end
31
40
 
32
- context "not multi_language" do
41
+ context "if prefix_locale? is false" do
33
42
  before do
34
- allow(helper).to receive(:multi_language?).and_return(false)
43
+ expect(helper).to receive(:prefix_locale?) { true }
35
44
  end
36
45
 
37
- it "should return a Hash with the urlname but without language_id parameter" do
38
- expect(helper.show_page_path_params(page)).to include(urlname: 'testpage')
39
- expect(helper.show_page_path_params(page)).not_to include(locale: 'en')
46
+ it "returns a Hash with urlname and locale parameter" do
47
+ expect(show_page_path_params).to \
48
+ include(urlname: 'testpage', locale: 'en')
40
49
  end
41
50
 
42
- it "should return a Hash with urlname and query parameter" do
43
- expect(helper.show_page_path_params(page, {query: 'test'})).to include(urlname: 'testpage', query: 'test')
44
- expect(helper.show_page_path_params(page)).not_to include(locale: 'en')
51
+ context "with additional parameters" do
52
+ subject(:show_page_path_params) do
53
+ helper.show_page_path_params(page, {query: 'test'})
54
+ end
55
+
56
+ it "returns a Hash with urlname, locale and query parameter" do
57
+ expect(show_page_path_params).to \
58
+ include(urlname: 'testpage', locale: 'en', query: 'test')
59
+ end
45
60
  end
46
61
  end
47
62
  end
48
63
 
49
64
  describe "#show_alchemy_page_path" do
50
- context "when multi_language" do
51
-
65
+ context "when prefix_locale? set to true" do
52
66
  before do
53
- allow(helper).to receive(:multi_language?).and_return(true)
67
+ expect(helper).to receive(:prefix_locale?) { true }
54
68
  end
55
69
 
56
70
  it "should return the correct relative path string" do
@@ -58,13 +72,14 @@ module Alchemy
58
72
  end
59
73
 
60
74
  it "should return the correct relative path string with additional parameters" do
61
- expect(helper.show_alchemy_page_path(page, {query: 'test'})).to eq("/#{page.language_code}/testpage?query=test")
75
+ expect(helper.show_alchemy_page_path(page, {query: 'test'})).to \
76
+ eq("/#{page.language_code}/testpage?query=test")
62
77
  end
63
78
  end
64
79
 
65
- context "not multi_language" do
80
+ context "when prefix_locale? set to false" do
66
81
  before do
67
- allow(helper).to receive(:multi_language?).and_return(false)
82
+ expect(helper).to receive(:prefix_locale?) { false }
68
83
  end
69
84
 
70
85
  it "should return the correct relative path string" do
@@ -72,38 +87,42 @@ module Alchemy
72
87
  end
73
88
 
74
89
  it "should return the correct relative path string with additional parameter" do
75
- expect(helper.show_alchemy_page_path(page, {query: 'test'})).to eq("/testpage?query=test")
90
+ expect(helper.show_alchemy_page_path(page, {query: 'test'})).to \
91
+ eq("/testpage?query=test")
76
92
  end
77
93
  end
78
94
  end
79
95
 
80
96
  describe "#show_alchemy_page_url" do
81
- context "when multi_language" do
82
-
97
+ context "when prefix_locale? set to true" do
83
98
  before do
84
- allow(helper).to receive(:multi_language?).and_return(true)
99
+ expect(helper).to receive(:prefix_locale?) { true }
85
100
  end
86
101
 
87
102
  it "should return the correct url string" do
88
- expect(helper.show_alchemy_page_url(page)).to eq("http://#{helper.request.host}/#{page.language_code}/testpage")
103
+ expect(helper.show_alchemy_page_url(page)).to \
104
+ eq("http://#{helper.request.host}/#{page.language_code}/testpage")
89
105
  end
90
106
 
91
107
  it "should return the correct url string with additional parameters" do
92
- expect(helper.show_alchemy_page_url(page, {query: 'test'})).to eq("http://#{helper.request.host}/#{page.language_code}/testpage?query=test")
108
+ expect(helper.show_alchemy_page_url(page, {query: 'test'})).to \
109
+ eq("http://#{helper.request.host}/#{page.language_code}/testpage?query=test")
93
110
  end
94
111
  end
95
112
 
96
- context "not multi_language" do
113
+ context "when prefix_locale? set to false" do
97
114
  before do
98
- allow(helper).to receive(:multi_language?).and_return(false)
115
+ expect(helper).to receive(:prefix_locale?) { false }
99
116
  end
100
117
 
101
118
  it "should return the correct url string" do
102
- expect(helper.show_alchemy_page_url(page)).to eq("http://#{helper.request.host}/testpage")
119
+ expect(helper.show_alchemy_page_url(page)).to \
120
+ eq("http://#{helper.request.host}/testpage")
103
121
  end
104
122
 
105
123
  it "should return the correct url string with additional parameter" do
106
- expect(helper.show_alchemy_page_url(page, {query: 'test'})).to eq("http://#{helper.request.host}/testpage?query=test")
124
+ expect(helper.show_alchemy_page_url(page, {query: 'test'})).to \
125
+ eq("http://#{helper.request.host}/testpage?query=test")
107
126
  end
108
127
  end
109
128
  end
@@ -114,19 +133,22 @@ module Alchemy
114
133
 
115
134
  describe '#show_alchemy_picture_path' do
116
135
  it "should return the correct relative path string" do
117
- expect(helper.show_alchemy_picture_path(picture)).to match(Regexp.new("/pictures/42/show/cute_kitten.jpg"))
136
+ expect(helper.show_alchemy_picture_path(picture)).to \
137
+ match(Regexp.new("/pictures/42/show/cute_kitten.jpg"))
118
138
  end
119
139
  end
120
140
 
121
141
  describe '#show_alchemy_picture_url' do
122
142
  it "should return the correct url string" do
123
- expect(helper.show_alchemy_picture_url(picture)).to match(Regexp.new("http://#{helper.request.host}/pictures/42/show/cute_kitten.jpg"))
143
+ expect(helper.show_alchemy_picture_url(picture)).to \
144
+ match(Regexp.new("http://#{helper.request.host}/pictures/42/show/cute_kitten.jpg"))
124
145
  end
125
146
  end
126
147
 
127
148
  describe '#show_picture_path_params' do
128
149
  it "should return the correct params for rendering a picture" do
129
- expect(helper.show_picture_path_params(picture)).to include(name: 'cute_kitten', format: 'jpg')
150
+ expect(helper.show_picture_path_params(picture)).to \
151
+ include(name: 'cute_kitten', format: 'jpg')
130
152
  end
131
153
 
132
154
  it "should include the secure hash parameter" do
@@ -136,13 +158,15 @@ module Alchemy
136
158
 
137
159
  context "with additional params" do
138
160
  it "should include these params" do
139
- expect(helper.show_picture_path_params(picture, {format: 'png'})).to include(name: 'cute_kitten', format: 'png')
161
+ expect(helper.show_picture_path_params(picture, {format: 'png'})).to \
162
+ include(name: 'cute_kitten', format: 'png')
140
163
  end
141
164
  end
142
165
 
143
166
  context "with additional params crop set to true" do
144
167
  it "should include crop as parameter" do
145
- expect(helper.show_picture_path_params(picture, {crop: true})).to include(name: 'cute_kitten', crop: 'crop')
168
+ expect(helper.show_picture_path_params(picture, {crop: true})).to \
169
+ include(name: 'cute_kitten', crop: 'crop')
146
170
  end
147
171
  end
148
172
  end
@@ -152,18 +176,20 @@ module Alchemy
152
176
  let(:attachment) { mock_model(Attachment, urlname: 'test-attachment.pdf') }
153
177
 
154
178
  it 'should return the correct relative path to download an attachment' do
155
- expect(helper.download_alchemy_attachment_path(attachment)).to eq("/attachment/#{attachment.id}/download/#{attachment.urlname}")
179
+ expect(helper.download_alchemy_attachment_path(attachment)).to \
180
+ eq("/attachment/#{attachment.id}/download/#{attachment.urlname}")
156
181
  end
157
182
 
158
183
  it 'should return the correct url to download an attachment' do
159
- expect(helper.download_alchemy_attachment_url(attachment)).to eq("http://#{helper.request.host}/attachment/#{attachment.id}/download/#{attachment.urlname}")
184
+ expect(helper.download_alchemy_attachment_url(attachment)).to \
185
+ eq("http://#{helper.request.host}/attachment/#{attachment.id}/download/#{attachment.urlname}")
160
186
  end
161
187
  end
162
188
 
163
189
  describe '#full_url_for_element' do
164
190
  subject { full_url_for_element(element) }
165
191
 
166
- let(:element) { build_stubbed(:element, name: 'headline', page: page) }
192
+ let(:element) { build_stubbed(:alchemy_element, name: 'headline', page: page) }
167
193
  let(:current_server) { '' }
168
194
 
169
195
  it "returns the url to this element" do
@@ -2,7 +2,6 @@ require 'spec_helper'
2
2
 
3
3
  module Alchemy
4
4
  describe Config do
5
-
6
5
  describe ".get" do
7
6
  it "should call #show" do
8
7
  expect(Config).to receive(:show).and_return({})
@@ -55,7 +54,7 @@ module Alchemy
55
54
 
56
55
  describe '.read_file' do
57
56
  context 'when given path to yml file exists' do
58
- before { allow(File).to receive(:exists?).and_return(true) }
57
+ before { allow(File).to receive(:exist?).and_return(true) }
59
58
 
60
59
  it 'should call YAML.load_file with the given config path' do
61
60
  expect(YAML).to receive(:load_file).once.with('path/to/config.yml').and_return({})
@@ -64,7 +63,7 @@ module Alchemy
64
63
 
65
64
  context 'but its empty' do
66
65
  before do
67
- allow(File).to receive(:exists?).with('empty_file.yml').and_return(true)
66
+ allow(File).to receive(:exist?).with('empty_file.yml').and_return(true)
68
67
  allow(YAML).to receive(:load_file).and_return(false) # YAML.load_file returns false if file is empty.
69
68
  end
70
69
 
@@ -53,7 +53,7 @@ describe 'Alchemy::ControllerActions', type: 'controller' do
53
53
 
54
54
  describe "#set_alchemy_language" do
55
55
  let(:default_language) { Alchemy::Language.default }
56
- let(:klingonian) { FactoryGirl.create(:klingonian) }
56
+ let(:klingon) { create(:alchemy_language, :klingon) }
57
57
 
58
58
  after do
59
59
  # We must never change the app's locale
@@ -62,25 +62,25 @@ describe 'Alchemy::ControllerActions', type: 'controller' do
62
62
 
63
63
  context "with a Language argument" do
64
64
  it "should set the language to the passed Language instance" do
65
- controller.send :set_alchemy_language, klingonian
66
- expect(assigns(:language)).to eq(klingonian)
67
- expect(Alchemy::Language.current).to eq(klingonian)
65
+ controller.send :set_alchemy_language, klingon
66
+ expect(assigns(:language)).to eq(klingon)
67
+ expect(Alchemy::Language.current).to eq(klingon)
68
68
  end
69
69
  end
70
70
 
71
71
  context "with a language id argument" do
72
72
  it "should set the language to the language specified by the passed id" do
73
- controller.send :set_alchemy_language, klingonian.id
74
- expect(assigns(:language)).to eq(klingonian)
75
- expect(Alchemy::Language.current).to eq(klingonian)
73
+ controller.send :set_alchemy_language, klingon.id
74
+ expect(assigns(:language)).to eq(klingon)
75
+ expect(Alchemy::Language.current).to eq(klingon)
76
76
  end
77
77
  end
78
78
 
79
79
  context "with a language code argument" do
80
80
  it "should set the language to the language specified by the passed code" do
81
- controller.send :set_alchemy_language, klingonian.code
82
- expect(assigns(:language)).to eq(klingonian)
83
- expect(Alchemy::Language.current).to eq(klingonian)
81
+ controller.send :set_alchemy_language, klingon.code
82
+ expect(assigns(:language)).to eq(klingon)
83
+ expect(Alchemy::Language.current).to eq(klingon)
84
84
  end
85
85
  end
86
86
 
@@ -96,24 +96,24 @@ describe 'Alchemy::ControllerActions', type: 'controller' do
96
96
 
97
97
  context "with language in the session" do
98
98
  before do
99
- allow(controller).to receive(:session).and_return(alchemy_language_id: klingonian.id)
100
- allow(Alchemy::Language).to receive(:current).and_return(klingonian)
99
+ allow(controller).to receive(:session).and_return(alchemy_language_id: klingon.id)
100
+ allow(Alchemy::Language).to receive(:current).and_return(klingon)
101
101
  end
102
102
 
103
103
  it "should use the language from the session" do
104
104
  controller.send :set_alchemy_language
105
- expect(assigns(:language)).to eq(klingonian)
106
- expect(Alchemy::Language.current).to eq(klingonian)
105
+ expect(assigns(:language)).to eq(klingon)
106
+ expect(Alchemy::Language.current).to eq(klingon)
107
107
  end
108
108
  end
109
109
 
110
110
  context "with lang param" do
111
111
  it "should set the language" do
112
- allow(controller).to receive(:params).and_return(locale: klingonian.code)
112
+ allow(controller).to receive(:params).and_return(locale: klingon.code)
113
113
  controller.send :set_alchemy_language
114
- expect(assigns(:language)).to eq(klingonian)
115
- expect(Alchemy::Language.current).to eq(klingonian)
116
- expect(controller.session).to include_language_information_for(klingonian)
114
+ expect(assigns(:language)).to eq(klingon)
115
+ expect(Alchemy::Language.current).to eq(klingon)
116
+ expect(controller.session).to include_language_information_for(klingon)
117
117
  end
118
118
 
119
119
  context "for language that does not exist" do
@@ -1,6 +1,13 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  module Alchemy
4
+ describe ".t" do
5
+ it 'scopes translations intro alchemy namespace' do
6
+ expect(::I18n).to receive(:t).with(:foo, default: 'Foo', scope: ['alchemy'])
7
+ ::Alchemy.t(:foo)
8
+ end
9
+ end
10
+
4
11
  describe I18n do
5
12
  describe '.translation_files' do
6
13
  subject { I18n.translation_files }
@@ -2,7 +2,6 @@ require 'spec_helper'
2
2
 
3
3
  module Alchemy
4
4
  describe PageLayout do
5
-
6
5
  describe ".all" do
7
6
  # skip memoization
8
7
  before { PageLayout.instance_variable_set("@definitions", nil) }
@@ -27,7 +26,7 @@ module Alchemy
27
26
  end
28
27
 
29
28
  context "with missing layouts file" do
30
- before { expect(File).to receive(:exists?).and_return(false) }
29
+ before { expect(File).to receive(:exist?).and_return(false) }
31
30
 
32
31
  it "raises error empty array" do
33
32
  expect { subject }.to raise_error(LoadError)
@@ -49,12 +48,20 @@ module Alchemy
49
48
  end
50
49
 
51
50
  describe ".get" do
52
- it "should return the page_layout description found by given name" do
51
+ it "should return the page_layout definition found by given name" do
53
52
  allow(PageLayout).to receive(:all).and_return([{'name' => 'default'}, {'name' => 'contact'}])
54
53
  expect(PageLayout.get('default')).to eq({'name' => 'default'})
55
54
  end
56
55
  end
57
56
 
57
+ describe ".get_all_by_attributes" do
58
+ subject { PageLayout.get_all_by_attributes(unique: true) }
59
+
60
+ it "should return all page layout with the given attribute" do
61
+ expect(subject.map { |page_layout| page_layout['name'] }.to_a).to eq(['index', 'news', 'contact', 'erb_layout'])
62
+ end
63
+ end
64
+
58
65
  describe '.layouts_with_own_for_select' do
59
66
  it "should not hold a layout twice" do
60
67
  layouts = PageLayout.layouts_with_own_for_select('standard', 1, false)
@@ -91,7 +98,7 @@ module Alchemy
91
98
  end
92
99
 
93
100
  before do
94
- allow(Site).to receive(:layout_definitions).and_return(definitions)
101
+ allow(Site).to receive(:definitions).and_return(definitions)
95
102
  end
96
103
 
97
104
  it "should only return layouts for site" do
@@ -113,7 +120,7 @@ module Alchemy
113
120
  end
114
121
  end
115
122
 
116
- context "when page_layout description does not contain the elements key" do
123
+ context "when page_layout definition does not contain the elements key" do
117
124
  it "should return an empty array" do
118
125
  allow(PageLayout).to receive(:get).with('layout_without_elements_key').and_return({'name' => 'layout_without_elements_key'})
119
126
  expect(PageLayout.element_names_for('layout_without_elements_key')).to eq([])
@@ -132,13 +139,12 @@ module Alchemy
132
139
  end
133
140
 
134
141
  context "with translation present" do
135
- before { expect(I18n).to receive(:t).and_return('Kontakt') }
142
+ before { expect(Alchemy).to receive(:t).and_return('Kontakt') }
136
143
 
137
144
  it "returns the translated name" do
138
145
  is_expected.to eq('Kontakt')
139
146
  end
140
147
  end
141
148
  end
142
-
143
149
  end
144
150
  end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ module Alchemy
4
+ describe 'Paths' do
5
+ describe 'defaults' do
6
+ it 'has default value for Alchemy.admin_path' do
7
+ expect(Alchemy.admin_path).to eq('/admin')
8
+ end
9
+
10
+ it 'has default value for Alchemy.admin_constraints' do
11
+ expect(Alchemy.admin_constraints).to eq({})
12
+ end
13
+ end
14
+ end
15
+ end
@@ -9,12 +9,12 @@ describe Alchemy::Permissions do
9
9
  let(:restricted_attachment) { mock_model(Alchemy::Attachment, restricted?: true) }
10
10
  let(:picture) { mock_model(Alchemy::Picture, restricted?: false) }
11
11
  let(:restricted_picture) { mock_model(Alchemy::Picture, restricted?: true) }
12
- let(:public_page) { build_stubbed(:public_page, restricted: false) }
13
- let(:unpublic_page) { build_stubbed(:page, public: false) }
14
- let(:visible_page) { build_stubbed(:page, restricted: false, visible: true) }
15
- let(:not_visible_page) { build_stubbed(:public_page, restricted: false, visible: false) }
16
- let(:restricted_page) { build_stubbed(:public_page, public: true, restricted: true) }
17
- let(:visible_restricted_page) { build_stubbed(:page, visible: true, restricted: true) }
12
+ let(:public_page) { build_stubbed(:alchemy_page, :public, restricted: false) }
13
+ let(:unpublic_page) { build_stubbed(:alchemy_page, public: false) }
14
+ let(:visible_page) { build_stubbed(:alchemy_page, restricted: false, visible: true) }
15
+ let(:not_visible_page) { build_stubbed(:alchemy_page, :public, restricted: false, visible: false) }
16
+ let(:restricted_page) { build_stubbed(:alchemy_page, :public, public: true, restricted: true) }
17
+ let(:visible_restricted_page) { build_stubbed(:alchemy_page, visible: true, restricted: true) }
18
18
  let(:published_element) { mock_model(Alchemy::Element, restricted?: false, public?: true, trashed?: false) }
19
19
  let(:restricted_element) { mock_model(Alchemy::Element, restricted?: true, public?: true, trashed?: false) }
20
20
  let(:published_content) { mock_model(Alchemy::Content, restricted?: false, public?: true, trashed?: false) }
@@ -165,7 +165,6 @@ describe Alchemy::Permissions do
165
165
 
166
166
  it "can see all pictures" do
167
167
  is_expected.to be_able_to(:read, Alchemy::Picture)
168
- is_expected.to be_able_to(:info, Alchemy::Picture)
169
168
  end
170
169
 
171
170
  it "can manage contents" do
@@ -46,7 +46,7 @@ module Alchemy
46
46
  double(:column, {name: 'id', type: :integer, array: false}),
47
47
  double(:column, {name: 'starts_at', type: :datetime, array: false}),
48
48
  double(:column, {name: 'location_id', type: :integer, array: false}),
49
- double(:column, {name: 'organizer_id', type: :integer, array: false}),
49
+ double(:column, {name: 'organizer_id', type: :integer, array: false})
50
50
  ]
51
51
  end
52
52
 
@@ -58,16 +58,6 @@ module Alchemy
58
58
  end
59
59
 
60
60
  describe "#initialize" do
61
- it "sets the standard database attributes (rails defaults) to be skipped" do
62
- resource = Resource.new("admin/parties")
63
- expect(resource.skipped_attributes).to eq(%w(id updated_at created_at creator_id updater_id))
64
- end
65
-
66
- it "sets the restricted attributes accessor to an empty array by default" do
67
- resource = Resource.new("admin/parties")
68
- expect(resource.restricted_attributes).to eq([])
69
- end
70
-
71
61
  it "sets an instance variable that holds the controller path" do
72
62
  resource = Resource.new("admin/parties")
73
63
  expect(resource.instance_variable_get(:@controller_path)).to eq("admin/parties")
@@ -96,10 +86,8 @@ module Alchemy
96
86
 
97
87
  context "when model has alchemy_resource_relations defined" do
98
88
  before do
99
- Party.class_eval do
100
- def self.alchemy_resource_relations
101
- {location: {attr_method: 'name', type: 'string'}}
102
- end
89
+ allow(Party).to receive(:alchemy_resource_relations) do
90
+ {location: {attr_method: 'name', type: 'string'}}
103
91
  end
104
92
  end
105
93
 
@@ -119,14 +107,6 @@ module Alchemy
119
107
  expect { Resource.new("admin/parties") }.to raise_error(MissingActiveRecordAssociation)
120
108
  end
121
109
  end
122
-
123
- after do
124
- Party.class_eval do
125
- class << self
126
- undef alchemy_resource_relations
127
- end
128
- end
129
- end
130
110
  end
131
111
  end
132
112
 
@@ -190,37 +170,54 @@ module Alchemy
190
170
  end
191
171
 
192
172
  describe "#attributes" do
173
+ subject { resource.attributes }
174
+
193
175
  it "parses and returns the resource model's attributes from ActiveRecord::ModelSchema" do
194
- expect(resource.attributes).to eq([
195
- {:name => "name", :type => :string},
196
- {:name => "hidden_value", :type => :string},
197
- {:name => "description", :type => :string},
198
- {:name => "starts_at", :type => :datetime},
199
- {:name => "location_id", :type => :integer},
200
- {:name => "organizer_id", :type => :integer},
176
+ expect(subject).to eq([
177
+ {name: "name", type: :string},
178
+ {name: "hidden_value", type: :string},
179
+ {name: "description", type: :string},
180
+ {name: "starts_at", type: :datetime},
181
+ {name: "location_id", type: :integer},
182
+ {name: "organizer_id", type: :integer}
201
183
  ])
202
184
  end
203
185
 
186
+ it "skips the standard database attributes (rails defaults)" do
187
+ expect(subject.map { |el| el[:name] }).not_to include(%w(id updated_at created_at creator_id updater_id))
188
+ end
189
+
204
190
  it "skips attributes returned by skipped_alchemy_resource_attributes" do
205
- # attr_accessor, hence skipped_alchemy_resource_attributes= works
206
- resource.skipped_attributes = %w(hidden_value)
207
- expect(resource.attributes).to include({:name => "id", :type => :integer})
208
- expect(resource.attributes).not_to include({:name => "hidden_value", :type => :string})
191
+ allow(Party).to receive(:skipped_alchemy_resource_attributes) { %w(hidden_value) }
192
+ expect(subject).to include({name: "id", type: :integer})
193
+ expect(subject).not_to include({name: "hidden_value", type: :string})
209
194
  end
210
195
 
211
196
  context "when resource_relations are not defined" do
212
197
  it "includes the attribute" do
213
- expect(resource.attributes.detect { |a| a[:name] == "location_id" }).to eq({:name => "location_id", :type => :integer})
198
+ expect(subject.detect { |a| a[:name] == "location_id" }).to eq({name: "location_id", type: :integer})
199
+ end
200
+ end
201
+
202
+ context "with restricted attributes set" do
203
+ before do
204
+ allow(Party).to receive(:restricted_alchemy_resource_attributes) do
205
+ [{name: "name", type: :string}]
206
+ end
207
+ end
208
+
209
+ it "should include the restricted attributes" do
210
+ expect(subject).to include(name: "name", type: :string)
214
211
  end
215
212
  end
216
213
  end
217
214
 
218
215
  context "when `skipped_alchemy_resource_attributes` is defined as class method in the model" do
216
+ let(:custom_skipped_attributes) { %w(hidden_name) }
217
+
219
218
  before do
220
- Party.class_eval do
221
- def self.skipped_alchemy_resource_attributes
222
- %w(hidden_name)
223
- end
219
+ allow(Party).to receive(:skipped_alchemy_resource_attributes) do
220
+ custom_skipped_attributes
224
221
  end
225
222
  end
226
223
 
@@ -230,33 +227,16 @@ module Alchemy
230
227
  expect(resource.attributes.detect { |a| a[:name] == 'name' }).not_to be_nil
231
228
  end
232
229
  end
233
-
234
- describe '#skipped_attributes' do
235
- it "returns the result of Model.skipped_alchemy_resource_attributes" do
236
- custom_skipped_attributes = %w(hidden_name)
237
- resource.skipped_attributes = custom_skipped_attributes
238
- end
239
- end
240
-
241
- after do
242
- Party.class_eval do
243
- class << self
244
- undef skipped_alchemy_resource_attributes
245
- end
246
- end
247
- end
248
230
  end
249
231
 
250
232
  describe "#searchable_attributes" do
251
233
  subject { resource.searchable_attributes }
252
234
 
253
- before { resource.skipped_attributes = [] }
254
-
255
235
  it "returns all attributes of type string" do
256
236
  is_expected.to eq([
257
- {:name => "name", :type => :string},
258
- {:name => "hidden_value", :type => :string},
259
- {:name => "description", :type => :string}
237
+ {name: "name", type: :string},
238
+ {name: "hidden_value", type: :string},
239
+ {name: "description", type: :string}
260
240
  ])
261
241
  end
262
242
 
@@ -286,7 +266,11 @@ module Alchemy
286
266
  ]
287
267
  end
288
268
 
289
- before { resource.restricted_attributes = [:synced_at, :remote_record_id] }
269
+ before do
270
+ allow(Party).to receive(:restricted_alchemy_resource_attributes) do
271
+ [:synced_at, :remote_record_id]
272
+ end
273
+ end
290
274
 
291
275
  it "does not contain restricted attributes" do
292
276
  is_expected.to eq([{name: "name", type: :string}, {name: "title", type: :string}])
@@ -297,12 +281,10 @@ module Alchemy
297
281
  let(:resource) { Resource.new("admin/events") }
298
282
 
299
283
  before do
300
- Event.class_eval do
301
- def self.alchemy_resource_relations
302
- {
303
- :location => {:attr_method => "name", :attr_type => :string}
304
- }
305
- end
284
+ allow(Event).to receive(:alchemy_resource_relations) do
285
+ {
286
+ location: {attr_method: "name", attr_type: :string}
287
+ }
306
288
  end
307
289
  end
308
290
 
@@ -345,14 +327,6 @@ module Alchemy
345
327
  expect(resource.attributes.detect { |a| a[:name] == "location_id" }[:type]).to eq(:string)
346
328
  end
347
329
  end
348
-
349
- after do
350
- Event.class_eval do
351
- class << self
352
- undef :alchemy_resource_relations
353
- end
354
- end
355
- end
356
330
  end
357
331
 
358
332
  describe "#engine_name" do
@@ -366,6 +340,5 @@ module Alchemy
366
340
  expect(resource.in_engine?).to eq(true)
367
341
  end
368
342
  end
369
-
370
343
  end
371
344
  end