locomotivecms 3.0.0.pre.alpha.3 → 3.0.0.pre.beta.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (361) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +15 -8
  3. data/app/api/locomotive/api.rb +1 -0
  4. data/app/api/locomotive/api/entities/content_entry_entity.rb +1 -0
  5. data/app/api/locomotive/api/entities/content_type_entity.rb +2 -1
  6. data/app/api/locomotive/api/entities/site_entity.rb +4 -0
  7. data/app/api/locomotive/api/entities/theme_asset_entity.rb +3 -3
  8. data/app/api/locomotive/api/forms/base_form.rb +0 -6
  9. data/app/api/locomotive/api/forms/content_type_field_form.rb +6 -10
  10. data/app/api/locomotive/api/forms/content_type_form.rb +26 -4
  11. data/app/api/locomotive/api/middlewares/params_decoder_middleware.rb +91 -0
  12. data/app/api/locomotive/api/resources/content_type_resource.rb +7 -2
  13. data/app/api/locomotive/api/resources/current_site_resource.rb +10 -2
  14. data/app/assets/images/locomotive/favicon.png +0 -0
  15. data/app/assets/javascripts/locomotive/not_logged_in.js.coffee +11 -1
  16. data/app/assets/javascripts/locomotive/views/application_view.js.coffee +0 -76
  17. data/app/assets/javascripts/locomotive/views/content_assets/edit_image_view.js.coffee +3 -1
  18. data/app/assets/javascripts/locomotive/views/dashboard/show_view.js.coffee +33 -1
  19. data/app/assets/javascripts/locomotive/views/developers_documentation/show_view.js.coffee +9 -0
  20. data/app/assets/javascripts/locomotive/views/editable_elements/edit_view.js.coffee +3 -1
  21. data/app/assets/javascripts/locomotive/views/editable_elements/index_view.js.coffee +11 -11
  22. data/app/assets/javascripts/locomotive/views/inputs/text_view.js.coffee +16 -0
  23. data/app/assets/javascripts/locomotive/views/pages/_form_view.js.coffee +0 -158
  24. data/app/assets/javascripts/locomotive/views/pages/edit_view.js.coffee +0 -41
  25. data/app/assets/javascripts/locomotive/views/public_submission_accounts/edit_view.js.coffee +7 -0
  26. data/app/assets/javascripts/locomotive/views/shared/form_view.js.coffee +11 -3
  27. data/app/assets/javascripts/locomotive/views/shared/list_view.js.coffee +4 -2
  28. data/app/assets/javascripts/locomotive/views/translations/index_view.js.coffee +5 -0
  29. data/app/assets/stylesheets/locomotive/application.scss +4 -0
  30. data/app/assets/stylesheets/locomotive/base/_fonts.scss +5 -5
  31. data/app/assets/stylesheets/locomotive/base/form/_base.scss +9 -1
  32. data/app/assets/stylesheets/locomotive/components/_activity_feed.scss +66 -0
  33. data/app/assets/stylesheets/locomotive/components/_content_assets.scss +27 -8
  34. data/app/assets/stylesheets/locomotive/components/_developers.scss +34 -0
  35. data/app/assets/stylesheets/locomotive/components/_error.scss +37 -0
  36. data/app/assets/stylesheets/locomotive/components/_list.scss +6 -0
  37. data/app/assets/stylesheets/locomotive/components/_main.scss +4 -0
  38. data/app/assets/stylesheets/locomotive/components/_misc.scss +1 -0
  39. data/app/assets/stylesheets/locomotive/components/_translations.scss +13 -0
  40. data/app/assets/stylesheets/locomotive/components/header/_base.scss +7 -2
  41. data/app/assets/stylesheets/locomotive/components/misc/_modal.scss +13 -0
  42. data/app/assets/stylesheets/locomotive/components/misc/_notify.scss +2 -2
  43. data/app/assets/stylesheets/locomotive/components/not_logged_in/_sign_in_and_up.scss +11 -1
  44. data/app/assets/stylesheets/locomotive/components/sidebar/_pages_tree.scss +2 -2
  45. data/app/assets/stylesheets/locomotive/error.scss +12 -0
  46. data/app/assets/stylesheets/locomotive/globals/_bootstrap.scss +1 -1
  47. data/app/assets/stylesheets/locomotive/globals/_mixins.scss +8 -4
  48. data/app/assets/stylesheets/locomotive/globals/_variables.scss +2 -0
  49. data/app/assets/stylesheets/locomotive/not_logged_in.scss +4 -0
  50. data/app/controllers/locomotive/accounts_controller.rb +6 -1
  51. data/app/controllers/locomotive/base_controller.rb +1 -1
  52. data/app/controllers/locomotive/concerns/exception_controller.rb +2 -1
  53. data/app/controllers/locomotive/concerns/site_dispatcher_controller.rb +2 -1
  54. data/app/controllers/locomotive/content_assets_controller.rb +2 -2
  55. data/app/controllers/locomotive/content_entries_controller.rb +2 -2
  56. data/app/controllers/locomotive/current_site_controller.rb +5 -1
  57. data/app/controllers/locomotive/custom_fields/select_options_controller.rb +1 -1
  58. data/app/controllers/locomotive/dashboard_controller.rb +2 -0
  59. data/app/controllers/locomotive/developers_documentation_controller.rb +11 -0
  60. data/app/controllers/locomotive/editable_elements_controller.rb +11 -10
  61. data/app/controllers/locomotive/errors_controller.rb +15 -0
  62. data/app/controllers/locomotive/pages_controller.rb +3 -3
  63. data/app/controllers/locomotive/public_submission_accounts_controller.rb +42 -0
  64. data/app/controllers/locomotive/translations_controller.rb +9 -23
  65. data/app/helpers/locomotive/base_helper.rb +25 -23
  66. data/app/helpers/locomotive/content_assets_helper.rb +8 -0
  67. data/app/helpers/locomotive/content_entries_helper.rb +13 -19
  68. data/app/helpers/locomotive/content_types_helper.rb +9 -12
  69. data/app/helpers/locomotive/custom_fields_helper.rb +1 -0
  70. data/app/helpers/locomotive/dashboard_helper.rb +91 -0
  71. data/app/helpers/locomotive/developers_documentation_helper.rb +32 -0
  72. data/app/helpers/locomotive/editable_elements_helper.rb +25 -14
  73. data/app/helpers/locomotive/errors_helper.rb +21 -0
  74. data/app/helpers/locomotive/my_account_helper.rb +10 -8
  75. data/app/helpers/locomotive/pages_helper.rb +1 -1
  76. data/app/helpers/locomotive/public_submission_accounts_helper.rb +11 -0
  77. data/app/helpers/locomotive/shared/accounts_helper.rb +2 -2
  78. data/app/helpers/locomotive/sites_helper.rb +15 -11
  79. data/app/helpers/locomotive/translations_helper.rb +21 -13
  80. data/app/inputs/locomotive/api_key_input.rb +2 -0
  81. data/app/inputs/locomotive/array_input.rb +8 -3
  82. data/app/inputs/locomotive/code_input.rb +1 -47
  83. data/app/inputs/locomotive/document_picker_input.rb +1 -0
  84. data/app/inputs/locomotive/rte_input.rb +2 -0
  85. data/app/inputs/locomotive/toggle_input.rb +2 -0
  86. data/app/models/locomotive/activity.rb +32 -0
  87. data/app/models/locomotive/concerns/content_entry/localized.rb +12 -1
  88. data/app/models/locomotive/concerns/content_type/entry_template.rb +52 -0
  89. data/app/models/locomotive/concerns/page/editable_elements.rb +0 -111
  90. data/app/models/locomotive/concerns/page/layout.rb +21 -6
  91. data/app/models/locomotive/concerns/site/access_points.rb +24 -3
  92. data/app/models/locomotive/concerns/site/locales.rb +7 -27
  93. data/app/models/locomotive/content_asset.rb +0 -4
  94. data/app/models/locomotive/content_entry.rb +10 -8
  95. data/app/models/locomotive/content_type.rb +12 -1
  96. data/app/models/locomotive/editable_element.rb +11 -106
  97. data/app/models/locomotive/editable_file.rb +6 -53
  98. data/app/models/locomotive/editable_model.rb +13 -0
  99. data/app/models/locomotive/editable_text.rb +0 -51
  100. data/app/models/locomotive/page.rb +31 -17
  101. data/app/models/locomotive/site.rb +12 -13
  102. data/app/models/locomotive/theme_asset.rb +0 -4
  103. data/app/models/locomotive/translation.rb +50 -35
  104. data/app/policies/locomotive/content_type_policy.rb +4 -0
  105. data/app/policies/locomotive/site_policy.rb +4 -0
  106. data/app/services/locomotive/concerns/activity_service.rb +27 -0
  107. data/app/services/locomotive/content_asset_service.rb +16 -2
  108. data/app/services/locomotive/content_entry_service.rb +77 -8
  109. data/app/services/locomotive/content_type_service.rb +6 -2
  110. data/app/services/locomotive/editable_element_service.rb +11 -4
  111. data/app/services/locomotive/membership_service.rb +20 -4
  112. data/app/services/locomotive/page_parsing_service.rb +94 -23
  113. data/app/services/locomotive/page_service.rb +61 -3
  114. data/app/services/locomotive/site_service.rb +43 -1
  115. data/app/services/locomotive/translation_service.rb +51 -0
  116. data/app/uploaders/locomotive/picture_uploader.rb +5 -1
  117. data/app/views/locomotive/accounts/{new.html.haml → new.html.slim} +0 -0
  118. data/app/views/locomotive/content_assets/{_dropzone.html.haml → _dropzone.html.slim} +4 -3
  119. data/app/views/locomotive/content_assets/{_list.html.haml → _list.html.slim} +11 -9
  120. data/app/views/locomotive/content_assets/{_nav.html.haml → _nav.html.slim} +5 -5
  121. data/app/views/locomotive/content_assets/{_search_form.html.haml → _search_form.html.slim} +1 -1
  122. data/app/views/locomotive/content_assets/edit_in_drawer.html.slim +27 -0
  123. data/app/views/locomotive/content_assets/{index.html.haml → index.html.slim} +4 -4
  124. data/app/views/locomotive/content_assets/{index_in_drawer.html.haml → index_in_drawer.html.slim} +1 -1
  125. data/app/views/locomotive/content_entries/{_entry.html.haml → _entry.html.slim} +3 -3
  126. data/app/views/locomotive/content_entries/{_list.html.haml → _list.html.slim} +9 -8
  127. data/app/views/locomotive/content_entries/{edit.html.haml → edit.html.slim} +5 -0
  128. data/app/views/locomotive/content_entries/form/{_actions.html.haml → _actions.html.slim} +0 -0
  129. data/app/views/locomotive/content_entries/form/{_advanced.html.haml → _advanced.html.slim} +0 -0
  130. data/app/views/locomotive/content_entries/form/{_main.html.haml → _main.html.slim} +0 -0
  131. data/app/views/locomotive/content_entries/form/{_panes.html.haml → _panes.html.slim} +0 -0
  132. data/app/views/locomotive/content_entries/form/{_seo.html.haml → _seo.html.slim} +0 -0
  133. data/app/views/locomotive/content_entries/form/_tabs.html.slim +13 -0
  134. data/app/views/locomotive/content_entries/{index.html.haml → index.html.slim} +22 -9
  135. data/app/views/locomotive/content_entries/{new.html.haml → new.html.slim} +0 -0
  136. data/app/views/locomotive/current_site/{_domain.html.haml → _domain.html.slim} +3 -3
  137. data/app/views/locomotive/current_site/{_locale.html.haml → _locale.html.slim} +4 -4
  138. data/app/views/locomotive/current_site/{_membership.html.haml → _membership.html.slim} +7 -6
  139. data/app/views/locomotive/current_site/{edit.html.haml → edit.html.slim} +1 -1
  140. data/app/views/locomotive/current_site/form/{_access_points.html.haml → _access_points.html.slim} +1 -0
  141. data/app/views/locomotive/current_site/form/{_advanced.html.haml → _advanced.html.slim} +0 -0
  142. data/app/views/locomotive/current_site/form/{_main.html.haml → _main.html.slim} +0 -0
  143. data/app/views/locomotive/current_site/form/{_panes.html.haml → _panes.html.slim} +0 -0
  144. data/app/views/locomotive/current_site/form/{_seo.html.haml → _seo.html.slim} +0 -0
  145. data/app/views/locomotive/current_site/form/_tabs.html.slim +14 -0
  146. data/app/views/locomotive/custom_fields/select_options/{_option.html.haml → _option.html.slim} +7 -7
  147. data/app/views/locomotive/custom_fields/select_options/{edit.html.haml → edit.html.slim} +0 -0
  148. data/app/views/locomotive/dashboard/show.html.slim +28 -0
  149. data/app/views/locomotive/developers_documentation/_api.html.slim +44 -0
  150. data/app/views/locomotive/developers_documentation/_wagon.html.slim +42 -0
  151. data/app/views/locomotive/developers_documentation/show.html.slim +11 -0
  152. data/app/views/locomotive/devise_mailer/reset_password_instructions.html.slim +12 -0
  153. data/app/views/locomotive/editable_elements/_edit.html.slim +52 -0
  154. data/app/views/locomotive/editable_elements/{_form.html.haml → _form.html.slim} +12 -3
  155. data/app/views/locomotive/editable_elements/index.html.slim +8 -0
  156. data/app/views/locomotive/editable_elements/{index_without_preview.html.haml → index_without_preview.html.slim} +5 -4
  157. data/app/views/locomotive/errors/404.html.slim +2 -0
  158. data/app/views/locomotive/errors/500.html.slim +2 -0
  159. data/app/views/locomotive/errors/no_site.html.slim +7 -0
  160. data/app/views/locomotive/layouts/application.html.slim +42 -0
  161. data/app/views/locomotive/layouts/error.html.slim +24 -0
  162. data/app/views/locomotive/layouts/{live_editing.html.haml → live_editing.html.slim} +10 -10
  163. data/app/views/locomotive/layouts/not_logged_in.html.slim +26 -0
  164. data/app/views/locomotive/layouts/{without_site.html.haml → without_site.html.slim} +9 -6
  165. data/app/views/locomotive/memberships/{edit.html.haml → edit.html.slim} +0 -0
  166. data/app/views/locomotive/memberships/{new.html.haml → new.html.slim} +0 -0
  167. data/app/views/locomotive/my_account/{edit.html.haml → edit.html.slim} +1 -1
  168. data/app/views/locomotive/my_account/form/{_actions.html.haml → _actions.html.slim} +0 -0
  169. data/app/views/locomotive/my_account/form/{_api.html.haml → _api.html.slim} +0 -1
  170. data/app/views/locomotive/my_account/form/{_credentials.html.haml → _credentials.html.slim} +0 -0
  171. data/app/views/locomotive/my_account/form/{_main.html.haml → _main.html.slim} +0 -0
  172. data/app/views/locomotive/my_account/form/{_panes.html.haml → _panes.html.slim} +1 -1
  173. data/app/views/locomotive/my_account/form/_tabs.html.slim +7 -0
  174. data/app/views/locomotive/notifications/{new_content_entry.html.haml → new_content_entry.html.slim} +11 -11
  175. data/app/views/locomotive/pages/{edit.html.haml → edit.html.slim} +0 -0
  176. data/app/views/locomotive/pages/form/{_actions.html.haml → _actions.html.slim} +0 -0
  177. data/app/views/locomotive/pages/form/{_main.html.haml → _main.html.slim} +0 -0
  178. data/app/views/locomotive/pages/form/{_panes.html.haml → _panes.html.slim} +0 -0
  179. data/app/views/locomotive/pages/form/{_seo.html.haml → _seo.html.slim} +0 -0
  180. data/app/views/locomotive/pages/form/{_tabs.html.haml → _tabs.html.slim} +1 -1
  181. data/app/views/locomotive/pages/{new.html.haml → new.html.slim} +0 -0
  182. data/app/views/locomotive/pages/show.html.slim +2 -0
  183. data/app/views/locomotive/passwords/{edit.html.haml → edit.html.slim} +6 -6
  184. data/app/views/locomotive/passwords/{new.html.haml → new.html.slim} +6 -6
  185. data/app/views/locomotive/public_submission_accounts/_account.html.slim +19 -0
  186. data/app/views/locomotive/public_submission_accounts/edit.html.slim +16 -0
  187. data/app/views/locomotive/registrations/{new.html.haml → new.html.slim} +2 -4
  188. data/app/views/locomotive/sessions/{new.html.haml → new.html.slim} +2 -4
  189. data/app/views/locomotive/shared/_footer.html.slim +2 -0
  190. data/app/views/locomotive/shared/{_form_actions.html.haml → _form_actions.html.slim} +4 -4
  191. data/app/views/locomotive/shared/_head.html.slim +39 -0
  192. data/app/views/locomotive/shared/{_header.html.haml → _header.html.slim} +10 -10
  193. data/app/views/locomotive/shared/_locale_picker_link.html.slim +11 -0
  194. data/app/views/locomotive/shared/{_main_app_head.html.haml → _main_app_head.html.slim} +0 -0
  195. data/app/views/locomotive/shared/{_main_app_head_before_backbone.html.haml → _main_app_head_before_backbone.html.slim} +0 -0
  196. data/app/views/locomotive/shared/{_main_app_header.html.haml → _main_app_header.html.slim} +0 -0
  197. data/app/views/locomotive/shared/{_sidebar.html.haml → _sidebar.html.slim} +6 -0
  198. data/app/views/locomotive/shared/{_sidebar_without_site.html.haml → _sidebar_without_site.html.slim} +0 -0
  199. data/app/views/locomotive/shared/actions/{_contents.html.haml → _contents.html.slim} +1 -1
  200. data/app/views/locomotive/shared/header/{_account.html.haml → _account.html.slim} +1 -1
  201. data/app/views/locomotive/shared/header/_account_menu.html.slim +5 -0
  202. data/app/views/locomotive/shared/header/_brand.html.slim +5 -0
  203. data/app/views/locomotive/shared/header/{_site.html.haml → _site.html.slim} +2 -2
  204. data/app/views/locomotive/shared/rte/{_image_popover.html.haml → _image_popover.html.slim} +5 -5
  205. data/app/views/locomotive/shared/rte/{_link_popover.html.haml → _link_popover.html.slim} +5 -5
  206. data/app/views/locomotive/shared/rte/_toolbar.html.slim +62 -0
  207. data/app/views/locomotive/shared/sidebar/_content_types.html.slim +16 -0
  208. data/app/views/locomotive/shared/sidebar/_link.html.slim +10 -0
  209. data/app/views/locomotive/shared/sidebar/{_my_account.html.haml → _my_account.html.slim} +2 -2
  210. data/app/views/locomotive/shared/sidebar/_page.html.slim +33 -0
  211. data/app/views/locomotive/shared/sidebar/_pages.html.slim +11 -0
  212. data/app/views/locomotive/sites/{_site.html.haml → _site.html.slim} +3 -3
  213. data/app/views/locomotive/sites/{index.html.haml → index.html.slim} +3 -3
  214. data/app/views/locomotive/sites/{new.html.haml → new.html.slim} +0 -0
  215. data/app/views/locomotive/translations/_form.html.slim +9 -0
  216. data/app/views/locomotive/translations/edit.html.slim +7 -0
  217. data/app/views/locomotive/translations/index.html.slim +41 -0
  218. data/config/initializers/slim.rb +1 -0
  219. data/config/initializers/time_format.rb +15 -0
  220. data/config/locales/admin_ui.en.yml +65 -49
  221. data/config/locales/default.en.yml +3 -0
  222. data/config/locales/default.fr.yml +4 -1
  223. data/config/locales/simple_form.en.yml +14 -8
  224. data/config/routes.rb +6 -0
  225. data/features/support/env.rb +1 -1
  226. data/lib/generators/locomotive/install/install_generator.rb +48 -0
  227. data/lib/generators/locomotive/install/templates/heroku.rb +29 -0
  228. data/lib/generators/locomotive/install/templates/locomotive.rb +5 -2
  229. data/lib/generators/locomotive/install/templates/mongoid.yml +1 -1
  230. data/lib/generators/locomotive/install/templates/mongoid_heroku.yml +78 -0
  231. data/lib/locomotive.rb +0 -1
  232. data/lib/locomotive/configuration.rb +2 -6
  233. data/lib/locomotive/dependencies.rb +1 -2
  234. data/lib/locomotive/dragonfly.rb +4 -5
  235. data/lib/locomotive/engine.rb +10 -13
  236. data/lib/locomotive/middlewares.rb +0 -1
  237. data/lib/locomotive/middlewares/custom_public_exceptions.rb +19 -0
  238. data/lib/locomotive/middlewares/site.rb +49 -16
  239. data/lib/locomotive/simple_form.rb +67 -26
  240. data/lib/locomotive/steam/middlewares/missing_translations.rb +48 -0
  241. data/lib/locomotive/steam/middlewares/page_editing.rb +48 -0
  242. data/lib/locomotive/steam/services/api_entry_submission_service.rb +38 -0
  243. data/lib/locomotive/steam_adaptor.rb +25 -6
  244. data/lib/locomotive/version.rb +1 -1
  245. data/lib/tasks/locomotive.rake +27 -47
  246. data/spec/dummy/app/views/foo/index.html.slim +1 -0
  247. data/spec/dummy/app/views/locomotive/shared/{_main_app_head.html.haml → _main_app_head.html.slim} +0 -0
  248. data/spec/dummy/config.ru +4 -0
  249. data/spec/dummy/config/application.rb +4 -0
  250. data/spec/dummy/config/environments/profile.rb +48 -0
  251. data/spec/dummy/config/mongoid.yml +6 -6
  252. data/spec/lib/locomotive/steam/services/api_entry_submission_service_spec.rb +39 -0
  253. data/spec/models/locomotive/concerns/content_type/entry_template_spec.rb +55 -0
  254. data/spec/models/locomotive/concerns/page/layout_spec.rb +2 -2
  255. data/spec/models/locomotive/concerns/site/access_points_spec.rb +87 -2
  256. data/spec/models/locomotive/concerns/site/locales_spec.rb +2 -3
  257. data/spec/models/locomotive/content_entry_spec.rb +22 -37
  258. data/spec/models/locomotive/page_spec.rb +11 -0
  259. data/spec/models/locomotive/site_spec.rb +0 -36
  260. data/spec/requests/site_spec.rb +28 -0
  261. data/spec/support/capybara.rb +27 -0
  262. data/spec/support/factories.rb +9 -0
  263. data/spec/support/features/session_helpers.rb +21 -0
  264. data/spec/support/locomotive.rb +0 -4
  265. data/spec/support/matchers.rb +0 -25
  266. data/vendor/assets/javascripts/locomotive/highlight.pack.js +1 -0
  267. data/vendor/assets/stylesheets/locomotive/highlightjs/default.css +155 -0
  268. data/vendor/assets/stylesheets/locomotive/highlightjs/github.css +123 -0
  269. metadata +179 -195
  270. data/app/assets/images/locomotive/background/body.png +0 -0
  271. data/app/assets/images/locomotive/form/error-arrow.png +0 -0
  272. data/app/assets/images/locomotive/form/input-sep.png +0 -0
  273. data/app/assets/images/locomotive/icons/start.png +0 -0
  274. data/app/assets/images/locomotive/list/empty.png +0 -0
  275. data/app/assets/images/locomotive/list/item-left.png +0 -0
  276. data/app/assets/images/locomotive/nocoffee.png +0 -0
  277. data/app/assets/images/locomotive/plugins/sites_picker_top_arrow.png +0 -0
  278. data/app/assets/images/locomotive/rails.png +0 -0
  279. data/app/assets/javascripts/locomotive/views/pages/index_view.js.coffee +0 -11
  280. data/app/cells/locomotive/content_locale_picker/show.html.haml +0 -7
  281. data/app/cells/locomotive/content_locale_picker_cell.rb +0 -21
  282. data/app/helpers/locomotive/installation_helper.rb +0 -9
  283. data/app/inputs/locomotive/locale_input.rb +0 -41
  284. data/app/inputs/locomotive/small_code_input.rb +0 -23
  285. data/app/models/locomotive/concerns/content_entry/notifications.rb +0 -33
  286. data/app/models/locomotive/concerns/content_type/item_template.rb +0 -49
  287. data/app/models/locomotive/concerns/page/parse.rb +0 -133
  288. data/app/presenters/locomotive/account_presenter.rb +0 -20
  289. data/app/presenters/locomotive/base_presenter.rb +0 -144
  290. data/app/presenters/locomotive/content_asset_presenter.rb +0 -51
  291. data/app/presenters/locomotive/content_entry_presenter.rb +0 -177
  292. data/app/presenters/locomotive/content_field_presenter.rb +0 -76
  293. data/app/presenters/locomotive/content_type_presenter.rb +0 -82
  294. data/app/presenters/locomotive/editable_control_presenter.rb +0 -19
  295. data/app/presenters/locomotive/editable_element_presenter.rb +0 -46
  296. data/app/presenters/locomotive/editable_file_presenter.rb +0 -36
  297. data/app/presenters/locomotive/editable_text_presenter.rb +0 -40
  298. data/app/presenters/locomotive/membership_presenter.rb +0 -35
  299. data/app/presenters/locomotive/page_presenter.rb +0 -81
  300. data/app/presenters/locomotive/site_presenter.rb +0 -40
  301. data/app/presenters/locomotive/snippet_presenter.rb +0 -22
  302. data/app/presenters/locomotive/theme_asset_presenter.rb +0 -61
  303. data/app/presenters/locomotive/translation_presenter.rb +0 -9
  304. data/app/views/locomotive/content_assets/edit_in_drawer.html.haml +0 -26
  305. data/app/views/locomotive/content_entries/form/_tabs.html.haml +0 -9
  306. data/app/views/locomotive/current_site/form/_tabs.html.haml +0 -14
  307. data/app/views/locomotive/dashboard/show.html.haml +0 -0
  308. data/app/views/locomotive/devise_mailer/reset_password_instructions.html.haml +0 -12
  309. data/app/views/locomotive/editable_elements/_edit.html.haml +0 -49
  310. data/app/views/locomotive/editable_elements/_edit_with_content_entry.html.haml +0 -21
  311. data/app/views/locomotive/editable_elements/index.html.haml +0 -8
  312. data/app/views/locomotive/errors/404.html.haml +0 -7
  313. data/app/views/locomotive/errors/500.html.haml +0 -7
  314. data/app/views/locomotive/errors/no_page.html.haml +0 -1
  315. data/app/views/locomotive/errors/no_site.html.haml +0 -1
  316. data/app/views/locomotive/layouts/application.html.haml +0 -42
  317. data/app/views/locomotive/layouts/error.html.haml +0 -1
  318. data/app/views/locomotive/layouts/not_logged_in.html.haml +0 -18
  319. data/app/views/locomotive/my_account/form/_tabs.html.haml +0 -7
  320. data/app/views/locomotive/pages/_editable_elements.html.haml +0 -64
  321. data/app/views/locomotive/pages/index.html.haml +0 -22
  322. data/app/views/locomotive/pages/show.html.haml +0 -2
  323. data/app/views/locomotive/shared/_footer.html.haml +0 -2
  324. data/app/views/locomotive/shared/_head.html.haml +0 -40
  325. data/app/views/locomotive/shared/_locale_picker_link.html.haml +0 -6
  326. data/app/views/locomotive/shared/header/_account_menu.html.haml +0 -5
  327. data/app/views/locomotive/shared/header/_brand.html.haml +0 -4
  328. data/app/views/locomotive/shared/rte/_toolbar.html.haml +0 -62
  329. data/app/views/locomotive/shared/sidebar/_content_types.html.haml +0 -15
  330. data/app/views/locomotive/shared/sidebar/_link.html.haml +0 -10
  331. data/app/views/locomotive/shared/sidebar/_page.html.haml +0 -33
  332. data/app/views/locomotive/shared/sidebar/_pages.html.haml +0 -11
  333. data/app/views/locomotive/translations/_form.html.haml +0 -12
  334. data/app/views/locomotive/translations/edit.html.haml +0 -15
  335. data/app/views/locomotive/translations/index.html.haml +0 -30
  336. data/app/views/locomotive/translations/new.html.haml +0 -12
  337. data/config/initializers/haml.rb +0 -2
  338. data/config/initializers/locomotive_loaded_first.rb +0 -19
  339. data/config/locales/formtastic.bg.yml +0 -113
  340. data/config/locales/formtastic.cs.yml +0 -125
  341. data/config/locales/formtastic.de.yml +0 -106
  342. data/config/locales/formtastic.es.yml +0 -84
  343. data/config/locales/formtastic.et.yml +0 -103
  344. data/config/locales/formtastic.fr.yml +0 -109
  345. data/config/locales/formtastic.it.yml +0 -99
  346. data/config/locales/formtastic.ja.yml +0 -103
  347. data/config/locales/formtastic.nb.yml +0 -103
  348. data/config/locales/formtastic.nl.yml +0 -85
  349. data/config/locales/formtastic.pl.yml +0 -105
  350. data/config/locales/formtastic.pt-BR.yml +0 -70
  351. data/config/locales/formtastic.pt.yml +0 -70
  352. data/config/locales/formtastic.ru.yml +0 -106
  353. data/config/locales/formtastic.sk.yml +0 -125
  354. data/config/locales/formtastic.sr.yml +0 -112
  355. data/config/locales/formtastic.zh-CN.yml +0 -112
  356. data/lib/locomotive/haml.rb +0 -1
  357. data/lib/locomotive/middlewares/page_editing.rb +0 -41
  358. data/spec/dummy/app/views/foo/index.html.haml +0 -1
  359. data/spec/dummy/config/initializers/haml.rb +0 -2
  360. data/spec/support/asset_host_stubs.rb +0 -17
  361. data/spec/support/controller.rb +0 -32
@@ -45,5 +45,9 @@ module Dummy
45
45
  # config.after_initialize do |c|
46
46
  # c.middleware.delete(Sass::Plugin::Rack)
47
47
  # end
48
+
49
+ # let Locomotive handle custom error page
50
+ require 'locomotive/middlewares/custom_public_exceptions'
51
+ config.exceptions_app = Locomotive::Middlewares::CustomPublicExceptions.new(Rails.public_path)
48
52
  end
49
53
  end
@@ -0,0 +1,48 @@
1
+ Dummy::Application.configure do
2
+ # Settings specified here will take precedence over those in config/application.rb.
3
+
4
+ config.cache_store = :memory_store
5
+
6
+ # In the development environment your application's code is reloaded on
7
+ # every request. This slows down response time but is perfect for development
8
+ # since you don't have to restart the web server when you make code changes.
9
+ config.cache_classes = true
10
+
11
+ # Do not eager load code on boot.
12
+ config.eager_load = true
13
+
14
+ # Show full error reports and disable caching.
15
+ config.consider_all_requests_local = true
16
+ config.action_controller.perform_caching = true
17
+
18
+ # Don't care if the mailer can't send.
19
+ config.action_mailer.raise_delivery_errors = false
20
+
21
+ # Print deprecation notices to the Rails logger.
22
+ config.active_support.deprecation = :log
23
+
24
+ # Debug mode disables concatenation and preprocessing of assets.
25
+ # This option may cause significant delays in view rendering with a large
26
+ # number of complex assets.
27
+ config.assets.debug = false #true
28
+
29
+ config.assets.compress = false
30
+
31
+ config.log_level = :info
32
+
33
+ # Adds additional error checking when serving assets at runtime.
34
+ # Checks for improperly declared sprockets dependencies.
35
+ # Raises helpful error messages.
36
+ config.assets.raise_runtime_errors = true
37
+
38
+ # Raises error for missing translations
39
+ # config.action_view.raise_on_missing_translations = true
40
+
41
+ # MockSmtp settings
42
+ config.action_mailer.delivery_method = :smtp
43
+ config.action_mailer.smtp_settings = {
44
+ :address => "localhost",
45
+ :port => 1025,
46
+ :domain => "example.com"
47
+ }
48
+ end
@@ -5,14 +5,13 @@ development:
5
5
  default:
6
6
  # Defines the name of the default database that Mongoid can connect to.
7
7
  # (required).
8
- database: locomotive_engine_coal_dev
9
- # database: locomotive_engine_dev
10
- # database: locomotive_engine_v3_dev
11
- # database: locomotive_mounter_dev
8
+ # database: locomotive_engine_wagon_dev
9
+ database: locomotive_engine_dev
12
10
  # Provides the hosts the default session can connect to. Must be an array
13
11
  # of host:port pairs. (required)
14
12
  hosts:
15
13
  - localhost:27017
14
+ # uri: 'mongodb://localhost:27017/locomotive_engine_coal_dev'
16
15
  options:
17
16
  # Change whether the session persists in safe mode by default.
18
17
  # (default: false)
@@ -65,7 +64,7 @@ development:
65
64
  profile:
66
65
  sessions:
67
66
  default:
68
- database: locomotive_engine_coal_dev
67
+ database: locomotive_engine_profile
69
68
  hosts:
70
69
  - localhost:27017
71
70
  options:
@@ -85,13 +84,14 @@ test:
85
84
  production:
86
85
  sessions:
87
86
  default:
88
- database: locomotive_engine_coal_dev
87
+ database: locomotive_engine_prod
89
88
  hosts:
90
89
  - localhost:27017
91
90
  options:
92
91
  # consistency: :strong
93
92
  # identity_map_enabled: true
94
93
 
94
+
95
95
  # defaults: &defaults
96
96
  # host: localhost
97
97
  # port: 27017
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+
3
+ describe Locomotive::Steam::APIEntrySubmissionService do
4
+
5
+ let(:site) { create(:site) }
6
+ let(:locale) { :en }
7
+ let!(:content_type) { create('message content type', site: site).reload }
8
+ let(:service) { described_class.new(site, locale) }
9
+
10
+ describe '#submit' do
11
+
12
+ let(:attributes) { { 'name' => 'John Doe', 'message' => 'Hello' } }
13
+
14
+ subject { service.submit(content_type.slug, attributes) }
15
+
16
+ it { expect { subject }.to change { content_type.entries.count } }
17
+
18
+ it 'returns a content entry' do
19
+ expect(subject.name).to eq 'John Doe'
20
+ expect(subject.message).to eq 'Hello'
21
+ end
22
+
23
+ end #
24
+
25
+ describe '#to_json' do
26
+
27
+ let(:entry) { content_type.entries.build(_id: 42, name: 'John Doe', message: 'Hello') }
28
+
29
+ subject { service.to_json(entry) }
30
+
31
+ it 'includes _id and fields' do
32
+ expect(subject).to match('"_id":"42"')
33
+ expect(subject).to match('"name":"John Doe"')
34
+ expect(subject).to match('"message":"Hello"')
35
+ end
36
+
37
+ end
38
+
39
+ end
@@ -0,0 +1,55 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Locomotive::Concerns::ContentType::EntryTemplate do
6
+
7
+ before { allow_any_instance_of(Locomotive::Site).to receive(:create_default_pages!).and_return(true) }
8
+
9
+ let(:entry_template) { nil }
10
+ let(:content_type) { build_content_type(entry_template) }
11
+
12
+ describe '#valid?' do
13
+
14
+ let(:entry_template) { 'Hello world' }
15
+
16
+ before { content_type.valid? }
17
+
18
+ subject { content_type.errors }
19
+
20
+ it { expect(subject.size).to eq 0 }
21
+
22
+ context 'wrong template' do
23
+
24
+ let(:entry_template) { '{{ foo' }
25
+
26
+ it { expect(subject.size).to eq 1 }
27
+ it { expect(subject[:entry_template]).to eq ["Liquid syntax error: Variable '{{' was not properly terminated with regexp: /\\}\\}/"] }
28
+
29
+ end
30
+
31
+ end
32
+
33
+ describe '#render_entry_template' do
34
+
35
+ let(:entry_template) { '{{ entry.title }} world' }
36
+ let(:entry) { content_type.entries.build(title: 'Hello') }
37
+ let(:registers) { { services: Locomotive::Steam::Services.build_instance } }
38
+ let(:context) { ::Liquid::Context.new({}, { 'entry' => entry }, registers, true) }
39
+
40
+ before { content_type.save! }
41
+
42
+ subject { content_type.render_entry_template(context) }
43
+
44
+ it { expect(subject).to eq 'Hello world' }
45
+
46
+ end
47
+
48
+ def build_content_type(entry_template)
49
+ build(:content_type, entry_template: entry_template).tap do |content_type|
50
+ content_type.entries_custom_fields.build label: 'Title', type: 'string'
51
+ content_type.valid?
52
+ end
53
+ end
54
+
55
+ end
@@ -21,7 +21,7 @@ describe Locomotive::Concerns::Page::Layout do
21
21
 
22
22
  describe 'false for an existing page without the allow_layout attribute' do
23
23
 
24
- let(:page) { p = Locomotive::Page.new; p.save(validate: false); p.unset(:allow_layout); Locomotive::Page.find(p._id) }
24
+ let(:page) { p = Locomotive::Page.new(site: site); p.save(validate: false); p.unset(:allow_layout); Locomotive::Page.find(p._id) }
25
25
 
26
26
  it { is_expected.to eq false }
27
27
 
@@ -37,7 +37,7 @@ describe Locomotive::Concerns::Page::Layout do
37
37
 
38
38
  it { is_expected.to eq '{% extends "awesome-layout" %}' }
39
39
 
40
- describe 'but changing the layout is not allowed' do
40
+ context 'but changing the layout is not allowed' do
41
41
 
42
42
  let(:allow_layout) { false }
43
43
 
@@ -2,8 +2,10 @@ require 'spec_helper'
2
2
 
3
3
  describe Locomotive::Concerns::Site::AccessPoints do
4
4
 
5
- describe '#domains=' do
6
- let(:site) { Locomotive::Site.new }
5
+ let(:domains) { [] }
6
+ let(:site) { build(:site, domains: domains) }
7
+
8
+ describe '#domains=' do
7
9
 
8
10
  it 'downcases the domains' do
9
11
  site.domains = ['FIRST.com', 'second.com', 'THIRD.com']
@@ -12,4 +14,87 @@ describe Locomotive::Concerns::Site::AccessPoints do
12
14
  end
13
15
  end
14
16
 
17
+ describe 'domain sync' do
18
+
19
+ let!(:listener) { DomainEventListener.new }
20
+ after { listener.shutdown }
21
+
22
+ subject { listener }
23
+
24
+ describe 'on saving' do
25
+
26
+ before { site.save }
27
+
28
+ it 'does not emit an event' do
29
+ expect(subject.size).to eq 0
30
+ end
31
+
32
+ context 'new site' do
33
+
34
+ let(:domains) { ['www.example.com', 'example.com'] }
35
+
36
+ it 'only tracks new domains' do
37
+ expect(subject.added).to eq(['www.example.com', 'example.com'])
38
+ expect(subject.removed).to eq([])
39
+ end
40
+
41
+ end
42
+
43
+ context 'existing site' do
44
+
45
+ let(:domains) { ['www.boring.org', 'www.awesome.io'] }
46
+
47
+ before { listener.clear; site.domains = ['www.acme.com', 'www.awesome.io']; site.save; site.reload }
48
+
49
+ it 'tracks new domains and removed ones' do
50
+ expect(subject.added).to eq(['www.acme.com'])
51
+ expect(subject.removed).to eq(['www.boring.org'])
52
+ end
53
+
54
+ end
55
+
56
+ end
57
+
58
+ describe 'on destroying' do
59
+
60
+ let(:domains) { ['www.example.com', 'example.com'] }
61
+
62
+ before { site.save; listener.clear; site.destroy }
63
+
64
+ it 'tracks removed domains' do
65
+ expect(subject.added).to eq([])
66
+ expect(subject.removed).to eq(['www.example.com', 'example.com'])
67
+ end
68
+
69
+ end
70
+
71
+ end
72
+
73
+ class DomainEventListener
74
+ def initialize
75
+ @stack = []
76
+ @subscriber = ActiveSupport::Notifications.subscribe('locomotive.site.domain_sync') do |name, start, finish, id, payload|
77
+ emit(name, payload)
78
+ end
79
+ end
80
+ def emit(name, info = {})
81
+ @stack << [name, info]
82
+ end
83
+ def size
84
+ @stack.size
85
+ end
86
+ def added
87
+ @stack.map { |(_, info)| info[:added] }.flatten.compact
88
+ end
89
+ def removed
90
+ @stack.map { |(_, info)| info[:removed] }.flatten.compact
91
+ end
92
+ def clear
93
+ @stack.clear
94
+ end
95
+ def shutdown
96
+ ActiveSupport::Notifications.unsubscribe(@subscriber)
97
+ end
98
+ end
99
+
15
100
  end
@@ -37,15 +37,14 @@ describe Locomotive::Concerns::Site::Locales do
37
37
  end
38
38
 
39
39
  def build_page(slug = nil, translations = {})
40
- FactoryGirl.build(:page).tap do |page|
40
+ FactoryGirl.build(:page, site: site).tap do |page|
41
41
  page.slug = slug if slug
42
- page.send(:build_fullpath)
43
42
  translations.each do |locale, translation|
44
43
  ::Mongoid::Fields::I18n.with_locale(locale) do
45
44
  page.slug = translation
46
- page.send(:build_fullpath)
47
45
  end
48
46
  end
47
+ page.send(:build_fullpath)
49
48
  end
50
49
  end
51
50
 
@@ -109,7 +109,7 @@ describe Locomotive::ContentEntry do
109
109
  expect(@content_entry.translated?).to eq(true)
110
110
  end
111
111
 
112
- describe '.slug' do
112
+ describe '#slug' do
113
113
 
114
114
  it 'is not nil in the default locale' do
115
115
  ::Mongoid::Fields::I18n.locale = 'en'
@@ -120,6 +120,14 @@ describe Locomotive::ContentEntry do
120
120
  expect(@content_entry._slug).to eq(nil) # French
121
121
  end
122
122
 
123
+ it 'is translated in all the locales when being created' do
124
+ @content_entry.site.locales = %w(en fr)
125
+ ::Mongoid::Fields::I18n.locale = 'en'
126
+ @content_entry.send(:localize_slug)
127
+ ::Mongoid::Fields::I18n.locale = 'fr'
128
+ expect(@content_entry._slug).to eq('hello-world') # French
129
+ end
130
+
123
131
  end
124
132
 
125
133
  end
@@ -360,41 +368,6 @@ describe Locomotive::ContentEntry do
360
368
 
361
369
  end
362
370
 
363
- describe '#public_submission' do
364
-
365
- before(:each) do
366
- @account_1 = FactoryGirl.build('admin user', id: fake_bson_id('1'))
367
- @account_2 = FactoryGirl.build('frenchy user', id: fake_bson_id('2'))
368
-
369
- @content_type.public_submission_enabled = true
370
- @content_type.public_submission_accounts = ['', @account_1._id, @account_2._id.to_s]
371
-
372
- site = FactoryGirl.build(:site)
373
- allow(site).to receive(:accounts).and_return([@account_1, @account_2])
374
-
375
- @content_entry = build_content_entry(site: site)
376
- end
377
-
378
- it 'does not send email notifications if the api is disabled' do
379
- @content_type.public_submission_enabled = false
380
- expect(Locomotive::Notifications).to_not receive(:new_content_entry)
381
- @content_entry.save
382
- end
383
-
384
- it 'does not send email notifications if no api accounts' do
385
- @content_type.public_submission_accounts = nil
386
- expect(Locomotive::Notifications).to_not receive(:new_content_entry)
387
- @content_entry.save
388
- end
389
-
390
- it 'sends email notifications when a new instance is created' do
391
- expect(Locomotive::Notifications).to receive(:new_content_entry).with(@account_1, @content_entry).and_return(instance_double('mailer', deliver: true))
392
- expect(Locomotive::Notifications).to receive(:new_content_entry).with(@account_2, @content_entry).and_return(instance_double('mailer', deliver: true))
393
- @content_entry.save
394
- end
395
-
396
- end
397
-
398
371
  describe '#site' do
399
372
 
400
373
  it 'assigns a site when saving the content entry' do
@@ -405,13 +378,25 @@ describe Locomotive::ContentEntry do
405
378
 
406
379
  end
407
380
 
381
+ describe '#to_liquid' do
382
+
383
+ let(:entry) { build_content_entry }
384
+
385
+ subject { entry.to_liquid }
386
+
387
+ it { expect(subject._label).to eq 'Locomotive' }
388
+
389
+ end
390
+
408
391
  def localize_content_type(content_type)
409
392
  content_type.entries_custom_fields.first.localized = true
410
393
  content_type.save
411
394
  end
412
395
 
413
396
  def build_content_entry(options = {})
414
- @content_type.entries.build({ title: 'Locomotive', description: 'Lorem ipsum....', _label_field_name: 'title', created_at: Time.zone.parse('2013-07-05 00:00:00') }.merge(options))
397
+ @content_type.entries.build({ title: 'Locomotive', description: 'Lorem ipsum....', _label_field_name: 'title', created_at: Time.zone.parse('2013-07-05 00:00:00') }.merge(options)).tap do |entry|
398
+ entry.send(:set_site)
399
+ end
415
400
  end
416
401
 
417
402
  def fake_bson_id(id)
@@ -128,6 +128,17 @@ describe Locomotive::Page do
128
128
 
129
129
  end
130
130
 
131
+ describe 'localizing slugs and fullpaths' do
132
+
133
+ let(:site) { create(:site, locales: %w(en fr)) }
134
+
135
+ subject { create(:sub_page, site: site) }
136
+
137
+ it { expect(subject.slug_translations).to eq('en' => 'subpage', 'fr' => 'subpage') }
138
+ it { expect(subject.fullpath_translations).to eq('en' => 'subpage', 'fr' => 'subpage') }
139
+
140
+ end
141
+
131
142
  describe '#deleting' do
132
143
 
133
144
  before(:each) do