archangel 0.0.2

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 (517) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +17 -0
  3. data/.editorconfig +19 -0
  4. data/.eslintignore +6 -0
  5. data/.eslintrc.json +40 -0
  6. data/.github/ISSUE_TEMPLATE.md +23 -0
  7. data/.github/PULL_REQUEST_TEMPLATE.md +18 -0
  8. data/.gitignore +22 -0
  9. data/.hound.yml +21 -0
  10. data/.mdlrc +2 -0
  11. data/.reek +35 -0
  12. data/.rspec +4 -0
  13. data/.rubocop.yml +28 -0
  14. data/.rubocop_disabled.yml +2 -0
  15. data/.rubocop_enabled.yml +2 -0
  16. data/.rubocop_todo.yml +7 -0
  17. data/.scss-lint.yml +22 -0
  18. data/.travis.yml +16 -0
  19. data/.yardopts +10 -0
  20. data/CODE_OF_CONDUCT.md +43 -0
  21. data/CONTRIBUTING.md +150 -0
  22. data/Gemfile +36 -0
  23. data/MIT-LICENSE +21 -0
  24. data/README.md +129 -0
  25. data/Rakefile +27 -0
  26. data/app/assets/config/archangel_manifest.js +14 -0
  27. data/app/assets/images/archangel/fallback/asset.png +0 -0
  28. data/app/assets/images/archangel/fallback/avatar.png +0 -0
  29. data/app/assets/images/archangel/fallback/default.png +0 -0
  30. data/app/assets/images/archangel/fallback/favicon.ico +0 -0
  31. data/app/assets/images/archangel/fallback/large_avatar.png +0 -0
  32. data/app/assets/images/archangel/fallback/large_logo.png +0 -0
  33. data/app/assets/images/archangel/fallback/logo.png +0 -0
  34. data/app/assets/images/archangel/fallback/medium_avatar.png +0 -0
  35. data/app/assets/images/archangel/fallback/medium_logo.png +0 -0
  36. data/app/assets/images/archangel/fallback/small_asset.png +0 -0
  37. data/app/assets/images/archangel/fallback/small_avatar.png +0 -0
  38. data/app/assets/images/archangel/fallback/small_logo.png +0 -0
  39. data/app/assets/images/archangel/fallback/tiny_asset.png +0 -0
  40. data/app/assets/images/archangel/fallback/tiny_avatar.png +0 -0
  41. data/app/assets/images/archangel/fallback/tiny_logo.png +0 -0
  42. data/app/assets/javascripts/archangel/input/datetime_picker.js +46 -0
  43. data/app/assets/javascripts/archangel/input/meta_keywords.js +22 -0
  44. data/app/assets/javascripts/archangel/input/parent/collection.js +0 -0
  45. data/app/assets/javascripts/archangel/input/parent/field.js +0 -0
  46. data/app/assets/javascripts/archangel/input/parent/page.js +0 -0
  47. data/app/assets/javascripts/archangel/input/wysiwyg.js.erb +51 -0
  48. data/app/assets/javascripts/archangel/object/flash.js +49 -0
  49. data/app/assets/javascripts/archangel/object/routes/auth.js +22 -0
  50. data/app/assets/javascripts/archangel/object/routes/backend.js +103 -0
  51. data/app/assets/javascripts/archangel/object/routes/frontend.js +24 -0
  52. data/app/assets/javascripts/archangel/object/routes.js.erb +84 -0
  53. data/app/assets/javascripts/archangel/object/translate/datetime_picker.js.erb +26 -0
  54. data/app/assets/javascripts/archangel/object/translate/sortable.js.erb +10 -0
  55. data/app/assets/javascripts/archangel/object/translate.js +8 -0
  56. data/app/assets/javascripts/archangel/object/url.js +24 -0
  57. data/app/assets/javascripts/archangel/object.js +25 -0
  58. data/app/assets/javascripts/archangel/sortable.js +72 -0
  59. data/app/assets/stylesheets/archangel/.keep +0 -0
  60. data/app/controllers/archangel/application_controller.rb +177 -0
  61. data/app/controllers/archangel/auth/registrations_controller.rb +22 -0
  62. data/app/controllers/archangel/auth_controller.rb +20 -0
  63. data/app/controllers/archangel/backend/assets_controller.rb +338 -0
  64. data/app/controllers/archangel/backend/collections_controller.rb +257 -0
  65. data/app/controllers/archangel/backend/dashboards_controller.rb +27 -0
  66. data/app/controllers/archangel/backend/entries_controller.rb +344 -0
  67. data/app/controllers/archangel/backend/pages_controller.rb +299 -0
  68. data/app/controllers/archangel/backend/profiles_controller.rb +211 -0
  69. data/app/controllers/archangel/backend/sites_controller.rb +175 -0
  70. data/app/controllers/archangel/backend/templates_controller.rb +270 -0
  71. data/app/controllers/archangel/backend/users_controller.rb +366 -0
  72. data/app/controllers/archangel/backend/widgets_controller.rb +264 -0
  73. data/app/controllers/archangel/backend_controller.rb +21 -0
  74. data/app/controllers/archangel/frontend/pages_controller.rb +158 -0
  75. data/app/controllers/archangel/frontend_controller.rb +10 -0
  76. data/app/controllers/concerns/archangel/actionable_concern.rb +152 -0
  77. data/app/controllers/concerns/archangel/authenticatable_concern.rb +14 -0
  78. data/app/controllers/concerns/archangel/authorizable_concern.rb +14 -0
  79. data/app/controllers/concerns/archangel/paginatable_concern.rb +34 -0
  80. data/app/controllers/concerns/archangel/seoable_concern.rb +40 -0
  81. data/app/controllers/concerns/archangel/skip_authorizable_concern.rb +14 -0
  82. data/app/controllers/concerns/archangel/themable_concern.rb +27 -0
  83. data/app/helpers/archangel/application_helper.rb +34 -0
  84. data/app/helpers/archangel/auth_helper.rb +9 -0
  85. data/app/helpers/archangel/backend/assets_helper.rb +14 -0
  86. data/app/helpers/archangel/backend/collections_helper.rb +14 -0
  87. data/app/helpers/archangel/backend/dashboards_helper.rb +14 -0
  88. data/app/helpers/archangel/backend/entries_helper.rb +14 -0
  89. data/app/helpers/archangel/backend/pages_helper.rb +14 -0
  90. data/app/helpers/archangel/backend/sites_helper.rb +14 -0
  91. data/app/helpers/archangel/backend/templates_helper.rb +14 -0
  92. data/app/helpers/archangel/backend/users_helper.rb +14 -0
  93. data/app/helpers/archangel/backend/widgets_helper.rb +14 -0
  94. data/app/helpers/archangel/backend_helper.rb +9 -0
  95. data/app/helpers/archangel/flash_helper.rb +22 -0
  96. data/app/helpers/archangel/frontend/pages_helper.rb +14 -0
  97. data/app/helpers/archangel/frontend_helper.rb +9 -0
  98. data/app/inputs/archangel/date_picker_input.rb +27 -0
  99. data/app/inputs/archangel/date_time_picker_input.rb +27 -0
  100. data/app/inputs/archangel/field_classification_input.rb +32 -0
  101. data/app/inputs/archangel/language_input.rb +31 -0
  102. data/app/inputs/archangel/meta_keywords_input.rb +27 -0
  103. data/app/inputs/archangel/role_input.rb +31 -0
  104. data/app/inputs/archangel/theme_input.rb +29 -0
  105. data/app/inputs/archangel/time_picker_input.rb +27 -0
  106. data/app/inputs/archangel/wysiwyg_input.rb +15 -0
  107. data/app/jobs/archangel/application_job.rb +9 -0
  108. data/app/mailers/archangel/application_mailer.rb +12 -0
  109. data/app/models/archangel/application_record.rb +10 -0
  110. data/app/models/archangel/asset.rb +42 -0
  111. data/app/models/archangel/collection.rb +51 -0
  112. data/app/models/archangel/entry.rb +22 -0
  113. data/app/models/archangel/field.rb +30 -0
  114. data/app/models/archangel/page.rb +123 -0
  115. data/app/models/archangel/site.rb +54 -0
  116. data/app/models/archangel/template.rb +37 -0
  117. data/app/models/archangel/user.rb +62 -0
  118. data/app/models/archangel/widget.rb +62 -0
  119. data/app/policies/archangel/application_policy.rb +142 -0
  120. data/app/policies/archangel/asset_policy.rb +17 -0
  121. data/app/policies/archangel/collection_policy.rb +9 -0
  122. data/app/policies/archangel/entry_policy.rb +17 -0
  123. data/app/policies/archangel/page_policy.rb +9 -0
  124. data/app/policies/archangel/site_policy.rb +27 -0
  125. data/app/policies/archangel/template_policy.rb +9 -0
  126. data/app/policies/archangel/user_policy.rb +9 -0
  127. data/app/policies/archangel/widget_policy.rb +9 -0
  128. data/app/services/archangel/render_service.rb +98 -0
  129. data/app/services/archangel/template_render_service.rb +40 -0
  130. data/app/themes/default/assets/javascripts/default/auth/.keep +0 -0
  131. data/app/themes/default/assets/javascripts/default/auth.js +18 -0
  132. data/app/themes/default/assets/javascripts/default/backend/core.js +7 -0
  133. data/app/themes/default/assets/javascripts/default/backend.js +50 -0
  134. data/app/themes/default/assets/javascripts/default/common/cards.js +28 -0
  135. data/app/themes/default/assets/javascripts/default/common/flash.js +48 -0
  136. data/app/themes/default/assets/javascripts/default/common/navigation.js +30 -0
  137. data/app/themes/default/assets/javascripts/default/common/sidebar.js +114 -0
  138. data/app/themes/default/assets/javascripts/default/frontend/.keep +0 -0
  139. data/app/themes/default/assets/javascripts/default/frontend.js +18 -0
  140. data/app/themes/default/assets/stylesheets/default/auth/core.scss +15 -0
  141. data/app/themes/default/assets/stylesheets/default/auth.css +13 -0
  142. data/app/themes/default/assets/stylesheets/default/backend/core.scss +22 -0
  143. data/app/themes/default/assets/stylesheets/default/backend.css +13 -0
  144. data/app/themes/default/assets/stylesheets/default/common/_bootstrap.scss +49 -0
  145. data/app/themes/default/assets/stylesheets/default/common/_selectize.scss +299 -0
  146. data/app/themes/default/assets/stylesheets/default/common/_variables.scss +82 -0
  147. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_animate.scss +27 -0
  148. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_aside.scss +67 -0
  149. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_avatars.scss +42 -0
  150. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_badge.scss +3 -0
  151. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_breadcrumb-menu.scss +36 -0
  152. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_breadcrumb.scss +4 -0
  153. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_buttons.scss +408 -0
  154. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_callout.scss +58 -0
  155. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_card.scss +199 -0
  156. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_charts.scss +9 -0
  157. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_dropdown-menu-right.scss +8 -0
  158. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_dropdown.scss +70 -0
  159. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_footer.scss +9 -0
  160. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_forms.scss +4 -0
  161. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_grid.scss +15 -0
  162. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_input-group.scss +5 -0
  163. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_layout.scss +390 -0
  164. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_loading.scss +128 -0
  165. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_mixins.scss +1 -0
  166. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_mobile.scss +0 -0
  167. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_modal.scss +12 -0
  168. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_nav.scss +39 -0
  169. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_navbar.scss +122 -0
  170. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_others.scss +4 -0
  171. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_progress.scss +15 -0
  172. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_rtl.scss +287 -0
  173. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_sidebar.scss +462 -0
  174. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_switches.scss +286 -0
  175. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_tables.scss +20 -0
  176. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_temp.scss +39 -0
  177. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_typography.scss +36 -0
  178. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_utilities.scss +3 -0
  179. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_variables.scss +208 -0
  180. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_widgets.scss +251 -0
  181. data/app/themes/default/assets/stylesheets/default/common/bootstrap/mixins/_all.scss +117 -0
  182. data/app/themes/default/assets/stylesheets/default/common/bootstrap/utilities/_background.scss +20 -0
  183. data/app/themes/default/assets/stylesheets/default/common/bootstrap/utilities/_borders.scss +17 -0
  184. data/app/themes/default/assets/stylesheets/default/common/bootstrap/utilities/_display.scss +14 -0
  185. data/app/themes/default/assets/stylesheets/default/frontend/core.scss +15 -0
  186. data/app/themes/default/assets/stylesheets/default/frontend.css +13 -0
  187. data/app/themes/default/views/layouts/auth.html.erb +35 -0
  188. data/app/themes/default/views/layouts/backend/_footer.html.erb +7 -0
  189. data/app/themes/default/views/layouts/backend/_header.html.erb +31 -0
  190. data/app/themes/default/views/layouts/backend/_sidebar.html.erb +53 -0
  191. data/app/themes/default/views/layouts/backend.html.erb +37 -0
  192. data/app/themes/default/views/layouts/frontend.liquid +22 -0
  193. data/app/uploaders/archangel/application_uploader.rb +65 -0
  194. data/app/uploaders/archangel/asset_uploader.rb +52 -0
  195. data/app/uploaders/archangel/avatar_uploader.rb +44 -0
  196. data/app/uploaders/archangel/favicon_uploader.rb +38 -0
  197. data/app/uploaders/archangel/logo_uploader.rb +44 -0
  198. data/app/views/archangel/backend/assets/_buttons.html.erb +18 -0
  199. data/app/views/archangel/backend/assets/_form.html.erb +27 -0
  200. data/app/views/archangel/backend/assets/edit.html.erb +21 -0
  201. data/app/views/archangel/backend/assets/index.html.erb +64 -0
  202. data/app/views/archangel/backend/assets/new.html.erb +21 -0
  203. data/app/views/archangel/backend/assets/show.html.erb +53 -0
  204. data/app/views/archangel/backend/collections/_buttons.html.erb +20 -0
  205. data/app/views/archangel/backend/collections/_field_fields.html.erb +9 -0
  206. data/app/views/archangel/backend/collections/_form.html.erb +24 -0
  207. data/app/views/archangel/backend/collections/edit.html.erb +21 -0
  208. data/app/views/archangel/backend/collections/index.html.erb +60 -0
  209. data/app/views/archangel/backend/collections/new.html.erb +21 -0
  210. data/app/views/archangel/backend/collections/show.html.erb +44 -0
  211. data/app/views/archangel/backend/dashboards/_buttons.html.erb +3 -0
  212. data/app/views/archangel/backend/dashboards/show.html.erb +23 -0
  213. data/app/views/archangel/backend/entries/_buttons.html.erb +20 -0
  214. data/app/views/archangel/backend/entries/_form.html.erb +25 -0
  215. data/app/views/archangel/backend/entries/edit.html.erb +21 -0
  216. data/app/views/archangel/backend/entries/index.html.erb +68 -0
  217. data/app/views/archangel/backend/entries/new.html.erb +21 -0
  218. data/app/views/archangel/backend/entries/show.html.erb +28 -0
  219. data/app/views/archangel/backend/pages/_buttons.html.erb +18 -0
  220. data/app/views/archangel/backend/pages/_form.html.erb +19 -0
  221. data/app/views/archangel/backend/pages/edit.html.erb +21 -0
  222. data/app/views/archangel/backend/pages/index.html.erb +68 -0
  223. data/app/views/archangel/backend/pages/new.html.erb +21 -0
  224. data/app/views/archangel/backend/pages/show.html.erb +49 -0
  225. data/app/views/archangel/backend/profiles/_buttons.html.erb +9 -0
  226. data/app/views/archangel/backend/profiles/_form.html.erb +31 -0
  227. data/app/views/archangel/backend/profiles/edit.html.erb +21 -0
  228. data/app/views/archangel/backend/profiles/show.html.erb +36 -0
  229. data/app/views/archangel/backend/sites/_additional_colors.html.erb +49 -0
  230. data/app/views/archangel/backend/sites/_alerts.html.erb +130 -0
  231. data/app/views/archangel/backend/sites/_badge.html.erb +99 -0
  232. data/app/views/archangel/backend/sites/_button.html.erb +243 -0
  233. data/app/views/archangel/backend/sites/_buttons.html.erb +9 -0
  234. data/app/views/archangel/backend/sites/_buttons_group.html.erb +230 -0
  235. data/app/views/archangel/backend/sites/_cards.html.erb +441 -0
  236. data/app/views/archangel/backend/sites/_carousel.html.erb +159 -0
  237. data/app/views/archangel/backend/sites/_colors.html.erb +41 -0
  238. data/app/views/archangel/backend/sites/_display_headings.html.erb +41 -0
  239. data/app/views/archangel/backend/sites/_dl.html.erb +38 -0
  240. data/app/views/archangel/backend/sites/_dropdowns.html.erb +475 -0
  241. data/app/views/archangel/backend/sites/_form.html.erb +37 -0
  242. data/app/views/archangel/backend/sites/_forms.html.erb +1176 -0
  243. data/app/views/archangel/backend/sites/_grays.html.erb +21 -0
  244. data/app/views/archangel/backend/sites/_headings.html.erb +21 -0
  245. data/app/views/archangel/backend/sites/_inline_text.html.erb +45 -0
  246. data/app/views/archangel/backend/sites/_jumbotron.html.erb +45 -0
  247. data/app/views/archangel/backend/sites/_list_group.html.erb +254 -0
  248. data/app/views/archangel/backend/sites/_modals.html.erb +41 -0
  249. data/app/views/archangel/backend/sites/_navs.html.erb +389 -0
  250. data/app/views/archangel/backend/sites/_pagination.html.erb +160 -0
  251. data/app/views/archangel/backend/sites/_social_buttons.html.erb +746 -0
  252. data/app/views/archangel/backend/sites/_tables.html.erb +372 -0
  253. data/app/views/archangel/backend/sites/edit.html.erb +21 -0
  254. data/app/views/archangel/backend/sites/sample.html.erb +38 -0
  255. data/app/views/archangel/backend/sites/show.html.erb +48 -0
  256. data/app/views/archangel/backend/templates/_buttons.html.erb +18 -0
  257. data/app/views/archangel/backend/templates/_form.html.erb +14 -0
  258. data/app/views/archangel/backend/templates/edit.html.erb +21 -0
  259. data/app/views/archangel/backend/templates/index.html.erb +60 -0
  260. data/app/views/archangel/backend/templates/new.html.erb +21 -0
  261. data/app/views/archangel/backend/templates/show.html.erb +34 -0
  262. data/app/views/archangel/backend/users/_buttons.html.erb +18 -0
  263. data/app/views/archangel/backend/users/_form.html.erb +24 -0
  264. data/app/views/archangel/backend/users/edit.html.erb +21 -0
  265. data/app/views/archangel/backend/users/index.html.erb +62 -0
  266. data/app/views/archangel/backend/users/new.html.erb +21 -0
  267. data/app/views/archangel/backend/users/show.html.erb +36 -0
  268. data/app/views/archangel/backend/widgets/_buttons.html.erb +18 -0
  269. data/app/views/archangel/backend/widgets/_form.html.erb +14 -0
  270. data/app/views/archangel/backend/widgets/edit.html.erb +21 -0
  271. data/app/views/archangel/backend/widgets/index.html.erb +60 -0
  272. data/app/views/archangel/backend/widgets/new.html.erb +21 -0
  273. data/app/views/archangel/backend/widgets/show.html.erb +42 -0
  274. data/app/views/archangel/errors/error_401.html.erb +13 -0
  275. data/app/views/archangel/errors/error_401.json.erb +4 -0
  276. data/app/views/archangel/errors/error_404.html.erb +13 -0
  277. data/app/views/archangel/errors/error_404.json.erb +4 -0
  278. data/app/views/archangel/frontend/pages/show.json.jbuilder +9 -0
  279. data/app/views/archangel/shared/_auth_token.html.erb +8 -0
  280. data/app/views/archangel/shared/_flash_messages.html.erb +9 -0
  281. data/app/views/devise/confirmations/new.html.erb +18 -0
  282. data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
  283. data/app/views/devise/mailer/email_changed.html.erb +7 -0
  284. data/app/views/devise/mailer/password_change.html.erb +3 -0
  285. data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
  286. data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
  287. data/app/views/devise/passwords/edit.html.erb +28 -0
  288. data/app/views/devise/passwords/new.html.erb +18 -0
  289. data/app/views/devise/registrations/edit.html.erb +45 -0
  290. data/app/views/devise/registrations/new.html.erb +41 -0
  291. data/app/views/devise/sessions/new.html.erb +28 -0
  292. data/app/views/devise/shared/_links.html.erb +41 -0
  293. data/app/views/devise/unlocks/new.html.erb +18 -0
  294. data/app/views/kaminari/_first_page.html.erb +11 -0
  295. data/app/views/kaminari/_gap.html.erb +8 -0
  296. data/app/views/kaminari/_last_page.html.erb +11 -0
  297. data/app/views/kaminari/_next_page.html.erb +11 -0
  298. data/app/views/kaminari/_page.html.erb +12 -0
  299. data/app/views/kaminari/_paginator.html.erb +25 -0
  300. data/app/views/kaminari/_prev_page.html.erb +11 -0
  301. data/archangel.gemspec +52 -0
  302. data/archangel.png +0 -0
  303. data/bin/rails +13 -0
  304. data/config/brakeman.yml +3 -0
  305. data/config/initializers/assets.rb +12 -0
  306. data/config/initializers/carrierwave.rb +14 -0
  307. data/config/initializers/devise.rb +341 -0
  308. data/config/initializers/kaminari.rb +13 -0
  309. data/config/initializers/liquid.rb +4 -0
  310. data/config/initializers/meta_tags.rb +31 -0
  311. data/config/initializers/simple_form.rb +177 -0
  312. data/config/initializers/simple_form_bootstrap.rb +177 -0
  313. data/config/locales/active_record.en.yml +80 -0
  314. data/config/locales/devise.en.yml +64 -0
  315. data/config/locales/devise_invitable.en.yml +31 -0
  316. data/config/locales/en.yml +109 -0
  317. data/config/locales/kaminari.en.yml +17 -0
  318. data/config/locales/responders.en.yml +12 -0
  319. data/config/locales/simple_form.en.yml +34 -0
  320. data/config/routes.rb +176 -0
  321. data/db/migrate/20171003191001_create_archangel_sites.rb +19 -0
  322. data/db/migrate/20171003210347_create_archangel_users.rb +68 -0
  323. data/db/migrate/20171005205520_create_archangel_templates.rb +18 -0
  324. data/db/migrate/20171005224054_create_archangel_pages.rb +30 -0
  325. data/db/migrate/20171006175939_create_archangel_widgets.rb +20 -0
  326. data/db/migrate/20171006184844_create_archangel_assets.rb +18 -0
  327. data/db/migrate/20171006194044_create_archangel_collections.rb +17 -0
  328. data/db/migrate/20171006194855_create_archangel_fields.rb +23 -0
  329. data/db/migrate/20171006195023_create_archangel_entries.rb +18 -0
  330. data/db/seeds.rb +65 -0
  331. data/docs/Developers.md +3 -0
  332. data/docs/ExtensionDevelopers.md +3 -0
  333. data/docs/ExtensionIdeas.md +132 -0
  334. data/docs/Release.md +25 -0
  335. data/docs/ThemeDevelopers.md +3 -0
  336. data/lib/archangel/application_responder.rb +15 -0
  337. data/lib/archangel/config.rb +21 -0
  338. data/lib/archangel/constants/language.rb +13 -0
  339. data/lib/archangel/constants/role.rb +13 -0
  340. data/lib/archangel/constants/theme.rb +18 -0
  341. data/lib/archangel/engine.rb +70 -0
  342. data/lib/archangel/i18n.rb +40 -0
  343. data/lib/archangel/liquid/drop.rb +119 -0
  344. data/lib/archangel/liquid/drops/page_drop.rb +33 -0
  345. data/lib/archangel/liquid/drops/site_drop.rb +30 -0
  346. data/lib/archangel/liquid/filters/link_to_filter.rb +35 -0
  347. data/lib/archangel/liquid/tags/application_tag.rb +17 -0
  348. data/lib/archangel/liquid/tags/asset_tag.rb +146 -0
  349. data/lib/archangel/liquid/tags/collection_tag.rb +135 -0
  350. data/lib/archangel/liquid/tags/collectionfor_tag.rb +91 -0
  351. data/lib/archangel/liquid/tags/csrf_meta_tags_tag.rb +28 -0
  352. data/lib/archangel/liquid/tags/gist_tag.rb +102 -0
  353. data/lib/archangel/liquid/tags/locale_tag.rb +27 -0
  354. data/lib/archangel/liquid/tags/meta_tags_tag.rb +30 -0
  355. data/lib/archangel/liquid/tags/text_direction_tag.rb +28 -0
  356. data/lib/archangel/liquid/tags/theme_javascript_tag.rb +30 -0
  357. data/lib/archangel/liquid/tags/theme_stylesheet_tag.rb +30 -0
  358. data/lib/archangel/liquid/tags/vimeo_tag.rb +125 -0
  359. data/lib/archangel/liquid/tags/widget_tag.rb +91 -0
  360. data/lib/archangel/liquid/tags/youtube_tag.rb +138 -0
  361. data/lib/archangel/liquid_view.rb +92 -0
  362. data/lib/archangel/testing_support/context/view_controller_context.rb +55 -0
  363. data/lib/archangel/testing_support/factories/archangel_assets.rb +20 -0
  364. data/lib/archangel/testing_support/factories/archangel_collections.rb +23 -0
  365. data/lib/archangel/testing_support/factories/archangel_entries.rb +17 -0
  366. data/lib/archangel/testing_support/factories/archangel_fields.rb +20 -0
  367. data/lib/archangel/testing_support/factories/archangel_pages.rb +39 -0
  368. data/lib/archangel/testing_support/factories/archangel_sites.rb +22 -0
  369. data/lib/archangel/testing_support/factories/archangel_templates.rb +22 -0
  370. data/lib/archangel/testing_support/factories/archangel_users.rb +53 -0
  371. data/lib/archangel/testing_support/factories/archangel_widgets.rb +19 -0
  372. data/lib/archangel/testing_support/fixtures/favicon.png +0 -0
  373. data/lib/archangel/testing_support/fixtures/image.gif +0 -0
  374. data/lib/archangel/testing_support/fixtures/stylesheet.css +3 -0
  375. data/lib/archangel/testing_support/helpers/authorization_helpers.rb +58 -0
  376. data/lib/archangel/testing_support/helpers/controller_helpers.rb +20 -0
  377. data/lib/archangel/testing_support/helpers/form_helpers.rb +18 -0
  378. data/lib/archangel/testing_support/helpers/routing_helpers.rb +22 -0
  379. data/lib/archangel/testing_support/matchers/match_stdout.rb +37 -0
  380. data/lib/archangel/testing_support/matchers/pundit.rb +17 -0
  381. data/lib/archangel/testing_support/rake/dummy_rake.rb +63 -0
  382. data/lib/archangel/testing_support/shared_contexts/rake.rb +26 -0
  383. data/lib/archangel/testing_support/support/capybara.rb +9 -0
  384. data/lib/archangel/testing_support/support/carrierwave.rb +13 -0
  385. data/lib/archangel/testing_support/support/controller.rb +11 -0
  386. data/lib/archangel/testing_support/support/database_cleaner.rb +22 -0
  387. data/lib/archangel/testing_support/support/devise.rb +7 -0
  388. data/lib/archangel/testing_support/support/factory_bot.rb +17 -0
  389. data/lib/archangel/testing_support/support/inputs.rb +24 -0
  390. data/lib/archangel/testing_support/support/liquid_filters.rb +23 -0
  391. data/lib/archangel/testing_support/support/liquid_tags.rb +23 -0
  392. data/lib/archangel/testing_support/support/shoulda.rb +12 -0
  393. data/lib/archangel/testing_support/support/verify_partial_doubles.rb +21 -0
  394. data/lib/archangel/testing_support/support.rb +26 -0
  395. data/lib/archangel/theme/themable_controller.rb +90 -0
  396. data/lib/archangel/version.rb +16 -0
  397. data/lib/archangel.rb +93 -0
  398. data/lib/generators/archangel/dummy/dummy_generator.rb +148 -0
  399. data/lib/generators/archangel/dummy/templates/config/database.yml +48 -0
  400. data/lib/generators/archangel/install/install_generator.rb +202 -0
  401. data/lib/generators/archangel/install/templates/.env.sample +4 -0
  402. data/lib/generators/archangel/install/templates/config/archangel.yml +54 -0
  403. data/lib/generators/archangel/install/templates/config/initializers/carrierwave.rb +15 -0
  404. data/lib/generators/archangel/install/templates/config/initializers/devise.rb +17 -0
  405. data/lib/generators/archangel/install/templates/vendor/assets/javascripts/archangel/auth.js +3 -0
  406. data/lib/generators/archangel/install/templates/vendor/assets/javascripts/archangel/backend.js +3 -0
  407. data/lib/generators/archangel/install/templates/vendor/assets/javascripts/archangel/frontend.js +3 -0
  408. data/lib/generators/archangel/install/templates/vendor/assets/stylesheets/archangel/auth.css +5 -0
  409. data/lib/generators/archangel/install/templates/vendor/assets/stylesheets/archangel/backend.css +5 -0
  410. data/lib/generators/archangel/install/templates/vendor/assets/stylesheets/archangel/frontend.css +5 -0
  411. data/lib/tasks/archangel/version_task.rake +8 -0
  412. data/lib/templates/erb/scaffold/_form.html.erb +13 -0
  413. data/package.json +33 -0
  414. data/spec/controllers/archangel/application_controller_spec.rb +183 -0
  415. data/spec/controllers/archangel/auth/registrations_controller_spec.rb +10 -0
  416. data/spec/controllers/archangel/auth_controller_spec.rb +8 -0
  417. data/spec/controllers/archangel/backend/assets_controller_spec.rb +237 -0
  418. data/spec/controllers/archangel/backend/collections_controller_spec.rb +252 -0
  419. data/spec/controllers/archangel/backend/dashboards_controller_spec.rb +27 -0
  420. data/spec/controllers/archangel/backend/entries_controller_spec.rb +273 -0
  421. data/spec/controllers/archangel/backend/pages_controller_spec.rb +204 -0
  422. data/spec/controllers/archangel/backend/profiles_controller_spec.rb +115 -0
  423. data/spec/controllers/archangel/backend/sites_controller_spec.rb +137 -0
  424. data/spec/controllers/archangel/backend/templates_controller_spec.rb +190 -0
  425. data/spec/controllers/archangel/backend/users_controller_spec.rb +181 -0
  426. data/spec/controllers/archangel/backend/widgets_controller_spec.rb +190 -0
  427. data/spec/controllers/archangel/backend_controller_spec.rb +8 -0
  428. data/spec/controllers/archangel/frontend/pages_controller_spec.rb +54 -0
  429. data/spec/controllers/archangel/frontend_controller_spec.rb +8 -0
  430. data/spec/features/auth/log_in_spec.rb +96 -0
  431. data/spec/features/auth/log_out_spec.rb +18 -0
  432. data/spec/features/auth/registration_spec.rb +27 -0
  433. data/spec/features/backend/duplicate_page_slugs_spec.rb +41 -0
  434. data/spec/features/frontend/drop_variables_spec.rb +125 -0
  435. data/spec/features/frontend/homepage_redirect_spec.rb +15 -0
  436. data/spec/helpers/archangel/application_helper_spec.rb +30 -0
  437. data/spec/helpers/archangel/auth_helper_spec.rb +8 -0
  438. data/spec/helpers/archangel/backend/assets_helper_spec.rb +10 -0
  439. data/spec/helpers/archangel/backend/collections_helper_spec.rb +10 -0
  440. data/spec/helpers/archangel/backend/dashboards_helper_spec.rb +10 -0
  441. data/spec/helpers/archangel/backend/entries_helper_spec.rb +10 -0
  442. data/spec/helpers/archangel/backend/pages_helper_spec.rb +10 -0
  443. data/spec/helpers/archangel/backend/sites_helper_spec.rb +10 -0
  444. data/spec/helpers/archangel/backend/templates_helper_spec.rb +10 -0
  445. data/spec/helpers/archangel/backend/users_helper_spec.rb +10 -0
  446. data/spec/helpers/archangel/backend/widgets_helper_spec.rb +10 -0
  447. data/spec/helpers/archangel/backend_helper_spec.rb +8 -0
  448. data/spec/helpers/archangel/flash_helper_spec.rb +29 -0
  449. data/spec/helpers/archangel/frontend/pages_helper_spec.rb +10 -0
  450. data/spec/helpers/archangel/frontend_helper_spec.rb +8 -0
  451. data/spec/inputs/archangel/date_picker_input_spec.rb +15 -0
  452. data/spec/inputs/archangel/date_time_picker_input_spec.rb +15 -0
  453. data/spec/inputs/archangel/field_classification_input_spec.rb +19 -0
  454. data/spec/inputs/archangel/language_input_spec.rb +17 -0
  455. data/spec/inputs/archangel/meta_keywords_input_spec.rb +13 -0
  456. data/spec/inputs/archangel/role_input_spec.rb +18 -0
  457. data/spec/inputs/archangel/theme_input_spec.rb +17 -0
  458. data/spec/inputs/archangel/time_picker_input_spec.rb +15 -0
  459. data/spec/inputs/archangel/wysiwyg_input_spec.rb +15 -0
  460. data/spec/jobs/archangel/application_job_spec.rb +8 -0
  461. data/spec/lib/archangel/liquid/filters/link_to_filter_spec.rb +63 -0
  462. data/spec/lib/archangel/liquid/tags/application_tag_spec.rb +12 -0
  463. data/spec/lib/archangel/liquid/tags/asset_tag_spec.rb +90 -0
  464. data/spec/lib/archangel/liquid/tags/collection_tag_spec.rb +105 -0
  465. data/spec/lib/archangel/liquid/tags/collectionfor_tag_spec.rb +164 -0
  466. data/spec/lib/archangel/liquid/tags/csrf_meta_tags_tag_spec.rb +33 -0
  467. data/spec/lib/archangel/liquid/tags/gist_tag_spec.rb +42 -0
  468. data/spec/lib/archangel/liquid/tags/locale_tag_spec.rb +22 -0
  469. data/spec/lib/archangel/liquid/tags/meta_tags_tag_spec.rb +24 -0
  470. data/spec/lib/archangel/liquid/tags/text_direction_tag_spec.rb +32 -0
  471. data/spec/lib/archangel/liquid/tags/theme_javascript_tag_spec.rb +25 -0
  472. data/spec/lib/archangel/liquid/tags/theme_stylesheet_tag_spec.rb +27 -0
  473. data/spec/lib/archangel/liquid/tags/vimeo_tag_spec.rb +39 -0
  474. data/spec/lib/archangel/liquid/tags/widget_tag_spec.rb +59 -0
  475. data/spec/lib/archangel/liquid/tags/youtube_tag_spec.rb +39 -0
  476. data/spec/lib/tasks/archangel/version_task_spec.rb +13 -0
  477. data/spec/mailers/archangel/application_job_spec.rb +8 -0
  478. data/spec/models/archangel/asset_spec.rb +32 -0
  479. data/spec/models/archangel/collection_spec.rb +25 -0
  480. data/spec/models/archangel/entry_spec.rb +20 -0
  481. data/spec/models/archangel/field_spec.rb +29 -0
  482. data/spec/models/archangel/page_spec.rb +94 -0
  483. data/spec/models/archangel/site_spec.rb +11 -0
  484. data/spec/models/archangel/template_spec.rb +24 -0
  485. data/spec/models/archangel/user_spec.rb +66 -0
  486. data/spec/models/archangel/widget_spec.rb +29 -0
  487. data/spec/policies/archangel/application_policy_spec.rb +8 -0
  488. data/spec/policies/archangel/asset_policy_spec.rb +22 -0
  489. data/spec/policies/archangel/collection_policy_spec.rb +20 -0
  490. data/spec/policies/archangel/entries_policy_spec.rb +22 -0
  491. data/spec/policies/archangel/page_policy_spec.rb +20 -0
  492. data/spec/policies/archangel/site_policy_spec.rb +30 -0
  493. data/spec/policies/archangel/template_policy_spec.rb +20 -0
  494. data/spec/policies/archangel/user_policy_spec.rb +20 -0
  495. data/spec/policies/archangel/widget_policy_spec.rb +20 -0
  496. data/spec/rails_helper.rb +46 -0
  497. data/spec/services/archangel/render_service_spec.rb +37 -0
  498. data/spec/services/archangel/template_render_service_spec.rb +42 -0
  499. data/spec/spec_helper.rb +23 -0
  500. data/spec/support/coveralls.rb +5 -0
  501. data/spec/uploaders/archangel/application_uploader_spec.rb +15 -0
  502. data/spec/uploaders/archangel/asset_uploader_spec.rb +71 -0
  503. data/spec/uploaders/archangel/avatar_uploader_spec.rb +50 -0
  504. data/spec/uploaders/archangel/favicon_uploader_spec.rb +39 -0
  505. data/spec/uploaders/archangel/logo_uploader_spec.rb +50 -0
  506. data/vendor/assets/icons/trumbowyg/icons.svg +1 -0
  507. data/vendor/assets/javascripts/sortable/sortable.js +3 -0
  508. data/vendor/assets/javascripts/trumbowyg/plugins/allowtagsfrompaste/trumbowyg.allowtagsfrompaste.js +143 -0
  509. data/vendor/assets/javascripts/trumbowyg/plugins/base64/trumbowyg.base64.js +129 -0
  510. data/vendor/assets/javascripts/trumbowyg/plugins/cleanpaste/trumbowyg.cleanpaste.js +110 -0
  511. data/vendor/assets/javascripts/trumbowyg/plugins/colors/trumbowyg.colors.js +183 -0
  512. data/vendor/assets/javascripts/trumbowyg/plugins/noembed/trumbowyg.noembed.js +104 -0
  513. data/vendor/assets/javascripts/trumbowyg/plugins/upload/trumbowyg.upload.js +261 -0
  514. data/vendor/assets/javascripts/trumbowyg/trumbowyg.js +1765 -0
  515. data/vendor/assets/stylesheets/trumbowyg/_trumbowyg.scss +831 -0
  516. data/vendor/assets/stylesheets/trumbowyg/plugins/colors/_trumbowyg.colors.scss +38 -0
  517. metadata +1003 -0
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_helper"
4
+
5
+ module Archangel
6
+ module Frontend
7
+ RSpec.describe PagesController, type: :controller do
8
+ describe "loads correct layout" do
9
+ it "loads correct view" do
10
+ page = create(:page)
11
+
12
+ get :show, params: { path: page.path }
13
+
14
+ expect(response).to render_with_layout("frontend")
15
+ end
16
+ end
17
+
18
+ describe "GET #show" do
19
+ it "assigns the requested page as @page" do
20
+ page = create(:page)
21
+
22
+ get :show, params: { path: page.path }
23
+
24
+ expect(response.content_type).to eq "text/html"
25
+ expect(assigns(:page)).to eq(page)
26
+ end
27
+
28
+ it "assigns the requested page as @page for JSON request" do
29
+ page = create(:page)
30
+
31
+ get :show, params: { path: page.path }, format: :json
32
+
33
+ expect(response.content_type).to eq "application/json"
34
+ expect(assigns(:page)).to eq(page)
35
+ end
36
+
37
+ it "redirects to homepage" do
38
+ page = create(:page, :homepage)
39
+
40
+ get :show, params: { path: page.path }
41
+
42
+ expect(response).to redirect_to(root_path)
43
+ end
44
+
45
+ it "returns a 404 status code when page is not found" do
46
+ get :show, params: { path: "not-a-real-page" }
47
+
48
+ expect(response).to render_template("archangel/errors/error_404")
49
+ expect(response).to have_http_status(:not_found)
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_helper"
4
+
5
+ module Archangel
6
+ RSpec.describe FrontendController, type: :controller do
7
+ end
8
+ end
@@ -0,0 +1,96 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_helper"
4
+
5
+ RSpec.feature "Auth log in", type: :feature do
6
+ describe "with valid credentials" do
7
+ it "is successful" do
8
+ create(:user, email: "me@example.com", password: "password")
9
+
10
+ visit archangel.new_user_session_path
11
+
12
+ fill_in "Email", with: "me@example.com"
13
+ fill_in "Password", with: "password"
14
+ click_button "Log in"
15
+
16
+ expect(page.body).to have_content "Signed in successfully"
17
+ end
18
+
19
+ it "locks account after 4 failed attempts" do
20
+ email = "me@example.com"
21
+ create(:user, email: email)
22
+
23
+ visit archangel.new_user_session_path
24
+
25
+ (1..2).each do |attempt_num|
26
+ fill_in "Email", with: email
27
+ fill_in "Password", with: "wrong-password-#{attempt_num}"
28
+ click_button "Log in"
29
+
30
+ expect(page.body).to have_content "Invalid Email or password"
31
+ end
32
+
33
+ fill_in "Email", with: email
34
+ fill_in "Password", with: "wrong-password-3"
35
+ click_button "Log in"
36
+
37
+ expect(page.body).to have_content(
38
+ "You have one more attempt before your account is locked"
39
+ )
40
+
41
+ fill_in "Email", with: email
42
+ fill_in "Password", with: "wrong-password-4"
43
+ click_button "Log in"
44
+
45
+ expect(page.body).to have_content "Your account is locked"
46
+ end
47
+ end
48
+
49
+ describe "unconfirmed user" do
50
+ it "cannot login" do
51
+ create(:user, :unconfirmed, email: "me@example.com", password: "password")
52
+
53
+ visit archangel.new_user_session_path
54
+
55
+ fill_in "Email", with: "me@example.com"
56
+ fill_in "Password", with: "password"
57
+ click_button "Log in"
58
+
59
+ expect(current_path).to eq(archangel.new_user_session_path)
60
+ expect(page).not_to have_content "Signed in successfully"
61
+ expect(page).to have_content(
62
+ "You have to confirm your email address before continuing"
63
+ )
64
+ end
65
+ end
66
+
67
+ describe "locked user" do
68
+ it "cannot login" do
69
+ create(:user, :unconfirmed, email: "me@example.com", password: "password")
70
+
71
+ visit archangel.new_user_session_path
72
+
73
+ fill_in "Email", with: "me@example.com"
74
+ fill_in "Password", with: "password"
75
+ click_button "Log in"
76
+
77
+ expect(current_path).to eq(archangel.new_user_session_path)
78
+ expect(page).not_to have_content "Signed in successfully"
79
+ expect(page).to have_content(
80
+ "You have to confirm your email address before continuing"
81
+ )
82
+ end
83
+ end
84
+
85
+ describe "with invalid or unknown user credentials" do
86
+ it "is not successful" do
87
+ visit archangel.new_user_session_path
88
+
89
+ fill_in "Email", with: "me@example.com"
90
+ fill_in "Password", with: "password"
91
+ click_button "Log in"
92
+
93
+ expect(page.body).to have_content "Invalid Email or password"
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_helper"
4
+
5
+ RSpec.feature "Auth log out", type: :feature do
6
+ describe "while logged in" do
7
+ before { stub_authorization! }
8
+
9
+ it "has additional form fields" do
10
+ visit archangel.backend_root_path
11
+
12
+ click_link "Log Out"
13
+
14
+ expect(page).to have_content "Signed out successfully"
15
+ expect(current_path).to eq(archangel.new_user_session_path)
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_helper"
4
+
5
+ RSpec.feature "Auth registration", type: :feature do
6
+ describe "when registration is disabled" do
7
+ it "returns a 404" do
8
+ visit archangel.new_user_registration_path
9
+
10
+ expect(page.status_code).to eq 404
11
+ end
12
+ end
13
+
14
+ describe "when registration is enabled" do
15
+ it "has additional form fields" do
16
+ allow(Archangel.config).to receive(:allow_registration) { true }
17
+
18
+ visit archangel.new_user_registration_path
19
+
20
+ expect(page).to have_text "Name"
21
+ expect(page).to have_text "Username"
22
+
23
+ expect(page).to have_selector("input[type=text][id='user_name']")
24
+ expect(page).to have_selector("input[type=text][id='user_username']")
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_helper"
4
+
5
+ RSpec.feature "Pages", type: :feature do
6
+ describe "slug creation" do
7
+ before { stub_authorization! }
8
+
9
+ it "can have duplicate slug at different level" do
10
+ foo = create(:page, slug: "foo")
11
+ create(:page, slug: "archangel")
12
+
13
+ visit archangel.new_backend_page_path
14
+
15
+ fill_in(:page_title, with: "Page Title")
16
+ fill_in(:page_slug, with: "archangel")
17
+ fill_in(:page_content, with: "Page content here.")
18
+ select(foo.title, from: :page_parent_id)
19
+
20
+ submit_form
21
+
22
+ expect(page).to have_content(
23
+ I18n.t("flash.actions.create.notice", resource_name: "Page")
24
+ )
25
+ end
26
+
27
+ it "cannot have duplicate slug at same level" do
28
+ create(:page, slug: "archangel")
29
+
30
+ visit archangel.new_backend_page_path
31
+
32
+ fill_in(:page_title, with: "Page Title")
33
+ fill_in(:page_slug, with: "archangel")
34
+ fill_in(:page_content, with: "Page content here.")
35
+
36
+ submit_form
37
+
38
+ expect(page).to have_content "has already been taken"
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,125 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_helper"
4
+
5
+ RSpec.feature "Default variables", type: :feature do
6
+ describe "for current_page" do
7
+ let(:site) { create(:site) }
8
+
9
+ it "knows the current page at root level" do
10
+ content = <<-CONTENT
11
+ Current Page: {{ current_page }}
12
+ CONTENT
13
+
14
+ post = create(:page, site: site, slug: "foo", content: content)
15
+
16
+ visit archangel.frontend_page_path(post.path)
17
+
18
+ expect(page).to have_content("Current Page: /foo")
19
+ end
20
+
21
+ it "knows the current page at child level" do
22
+ content = <<-CONTENT
23
+ Current Page: {{ current_page }}
24
+ CONTENT
25
+
26
+ parent_post = create(:page, site: site, slug: "foo")
27
+ post = create(:page, site: site,
28
+ parent: parent_post,
29
+ slug: "bar",
30
+ content: content)
31
+
32
+ visit CGI.unescape(archangel.frontend_page_path(post.path))
33
+
34
+ expect(page).to have_content("Current Page: /foo/bar")
35
+ end
36
+
37
+ it "knows it is on the current page" do
38
+ content = <<-CONTENT
39
+ {% if current_page == page.path %}
40
+ Is Current Page?: Yup!
41
+ {% else %}
42
+ Is Current Page?: Nope!
43
+ {% endif %}
44
+ CONTENT
45
+
46
+ post = create(:page, site: site, content: content)
47
+
48
+ visit archangel.frontend_page_path(post.path)
49
+
50
+ expect(page).to have_content("Is Current Page?: Yup!")
51
+ expect(page).not_to have_content("Is Current Page?: Nope!")
52
+ end
53
+
54
+ it "knows it is not on the current page" do
55
+ content = <<-CONTENT
56
+ {% if current_page == '/some-other-page' %}
57
+ Is Current Page?: Yup!
58
+ {% else %}
59
+ Is Current Page?: Nope!
60
+ {% endif %}
61
+ CONTENT
62
+
63
+ post = create(:page, site: site, content: content)
64
+
65
+ visit archangel.frontend_page_path(post.path)
66
+
67
+ expect(page).not_to have_content("Is Current Page?: Yup!")
68
+ expect(page).to have_content("Is Current Page?: Nope!")
69
+ end
70
+ end
71
+
72
+ describe "for page" do
73
+ let(:site) { create(:site) }
74
+
75
+ it "knows the page properties" do
76
+ content = <<-CONTENT
77
+ Page ID: {{ page.id }}
78
+ Page Title: {{ page.title }}
79
+ Page Path: {{ page.path }}
80
+ Page Meta Keywords: {{ page.meta_keywords }}
81
+ Page Meta Description: {{ page.meta_description }}
82
+ Page Published At: {{ page.published_at }}
83
+ CONTENT
84
+
85
+ post = create(:page, site: site, content: content)
86
+
87
+ visit archangel.frontend_page_path(post.path)
88
+
89
+ expect(page).to have_content("Page ID: #{post.id}")
90
+ expect(page).to have_content("Page Title: #{post.title}")
91
+ expect(page).to have_content("Page Path: /#{post.path}")
92
+ expect(page).to have_content("Page Meta Keywords: #{post.meta_keywords}")
93
+ expect(page)
94
+ .to have_content("Page Meta Description: #{post.meta_description}")
95
+ expect(page).to have_content("Page Published At: #{post.published_at}")
96
+ end
97
+ end
98
+
99
+ describe "for site" do
100
+ let(:site) { create(:site) }
101
+
102
+ it "knows the site properties" do
103
+ content = <<-CONTENT
104
+ Site Name: {{ site.name }}
105
+ Site Locale: {{ site.locale }}
106
+ Site Meta Keywords: {{ site.meta_keywords }}
107
+ Site Meta Description: {{ site.meta_description }}
108
+ Site Favicon: {{ site.favicon }}
109
+ Site Logo: {{ site.logo }}
110
+ CONTENT
111
+
112
+ post = create(:page, site: site, content: content)
113
+
114
+ visit archangel.frontend_page_path(post.path)
115
+
116
+ expect(page).to have_content("Site Name: #{site.name}")
117
+ expect(page).to have_content("Site Locale: #{site.locale}")
118
+ expect(page).to have_content("Site Meta Keywords: #{site.meta_keywords}")
119
+ expect(page)
120
+ .to have_content("Site Meta Description: #{site.meta_description}")
121
+ expect(page).to have_content("Site Favicon: #{site.favicon}")
122
+ expect(page).to have_content("Site Logo: #{site.logo}")
123
+ end
124
+ end
125
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_helper"
4
+
5
+ RSpec.feature "Home page", type: :feature do
6
+ describe "when on home page slug" do
7
+ it "redirects to /" do
8
+ home = create(:page, :homepage)
9
+
10
+ visit archangel.frontend_page_path(home.path)
11
+
12
+ expect(page.current_path).to eq archangel.root_path
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_helper"
4
+
5
+ module Archangel
6
+ RSpec.describe ApplicationHelper, type: :helper,
7
+ disable: :verify_partial_doubles do
8
+ before do
9
+ allow(helper).to receive(:current_site).and_return(create(:site))
10
+ end
11
+
12
+ context "#locale" do
13
+ it "returns default application locale" do
14
+ expect(helper.locale).to eq("en")
15
+ end
16
+ end
17
+
18
+ context "#text_direction" do
19
+ it "returns default `ltr` text direction" do
20
+ expect(helper.text_direction).to eq("ltr")
21
+ end
22
+
23
+ it "returns rtl text direction" do
24
+ allow(helper).to receive(:text_direction).and_return("rtl")
25
+
26
+ expect(helper.text_direction).to eq("rtl")
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_helper"
4
+
5
+ module Archangel
6
+ RSpec.describe AuthHelper, type: :helper do
7
+ end
8
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_helper"
4
+
5
+ module Archangel
6
+ module Backend
7
+ RSpec.describe AssetsHelper, type: :helper do
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_helper"
4
+
5
+ module Archangel
6
+ module Backend
7
+ RSpec.describe CollectionsHelper, type: :helper do
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_helper"
4
+
5
+ module Archangel
6
+ module Backend
7
+ RSpec.describe DashboardsHelper, type: :helper do
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_helper"
4
+
5
+ module Archangel
6
+ module Backend
7
+ RSpec.describe EntriesHelper, type: :helper do
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_helper"
4
+
5
+ module Archangel
6
+ module Backend
7
+ RSpec.describe PagesHelper, type: :helper do
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_helper"
4
+
5
+ module Archangel
6
+ module Backend
7
+ RSpec.describe SitesHelper, type: :helper do
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_helper"
4
+
5
+ module Archangel
6
+ module Backend
7
+ RSpec.describe TemplatesHelper, type: :helper do
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_helper"
4
+
5
+ module Archangel
6
+ module Backend
7
+ RSpec.describe UsersHelper, type: :helper do
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_helper"
4
+
5
+ module Archangel
6
+ module Backend
7
+ RSpec.describe WidgetsHelper, type: :helper do
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_helper"
4
+
5
+ module Archangel
6
+ RSpec.describe BackendHelper, type: :helper do
7
+ end
8
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_helper"
4
+
5
+ module Archangel
6
+ RSpec.describe FlashHelper, type: :helper do
7
+ context "#flash_class_for(obj)" do
8
+ it "returns success class" do
9
+ expect(helper.flash_class_for("success")).to eq("success")
10
+ end
11
+
12
+ it "returns error class" do
13
+ expect(helper.flash_class_for("error")).to eq("danger")
14
+ end
15
+
16
+ it "returns alert class" do
17
+ expect(helper.flash_class_for("alert")).to eq("warning")
18
+ end
19
+
20
+ it "returns notice class" do
21
+ expect(helper.flash_class_for("notice")).to eq("info")
22
+ end
23
+
24
+ it "returns unknown class" do
25
+ expect(helper.flash_class_for("unknown")).to eq("unknown")
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_helper"
4
+
5
+ module Archangel
6
+ module Frontend
7
+ RSpec.describe PagesHelper, type: :helper do
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_helper"
4
+
5
+ module Archangel
6
+ RSpec.describe FrontendHelper, type: :helper do
7
+ end
8
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_helper"
4
+
5
+ module Archangel
6
+ RSpec.describe "Date picker custom input for simple_form", type: :input do
7
+ before do
8
+ concat input_for(:foo, :input_field, as: :date_picker)
9
+ end
10
+
11
+ it "applies class to field" do
12
+ assert_select "input.datepicker", count: 1
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_helper"
4
+
5
+ module Archangel
6
+ RSpec.describe "Datetime picker custom input for simple_form", type: :input do
7
+ before do
8
+ concat input_for(:foo, :input_field, as: :date_time_picker)
9
+ end
10
+
11
+ it "applies class to field" do
12
+ assert_select "input.datetimepicker", count: 1
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_helper"
4
+
5
+ module Archangel
6
+ RSpec.describe "Field classification custom input for simple_form",
7
+ type: :input do
8
+ before { concat input_for(:foo, :select_field, as: :field_classification) }
9
+
10
+ it "applies class to field" do
11
+ assert_select "select.field_classification", count: 1
12
+ end
13
+
14
+ it "has options" do
15
+ assert_select "option", count: Archangel::Field::CLASSIFICATIONS.count
16
+ assert_select "select[multiple=multiple]", count: 0
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails_helper"
4
+
5
+ module Archangel
6
+ RSpec.describe "Language custom input for simple_form", type: :input do
7
+ before { concat input_for(:foo, :select_field, as: :language) }
8
+
9
+ it "applies class to field" do
10
+ assert_select "select.language", count: 1
11
+ end
12
+
13
+ it "has options" do
14
+ assert_select "option", count: Archangel::LANGUAGES.count
15
+ end
16
+ end
17
+ end