cdx 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (341) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -2
  3. data/app/assets/javascripts/cdx/admin/shared/theme.js +15 -0
  4. data/app/assets/stylesheets/cdx/admin/cdx.scss +1 -0
  5. data/app/assets/stylesheets/cdx/admin/shared/radio_buttons.scss +1 -0
  6. data/app/controllers/cdx/admin/base_controller.rb +26 -4
  7. data/app/controllers/cdx/admin/devise/confirmations_controller.rb +4 -0
  8. data/app/controllers/cdx/admin/devise/passwords_controller.rb +4 -0
  9. data/app/controllers/cdx/admin/devise/sessions_controller.rb +2 -0
  10. data/app/controllers/cdx/admin/resource_controller.rb +17 -6
  11. data/app/controllers/cdx/admin/settings_controller.rb +2 -0
  12. data/app/controllers/cdx/application_controller.rb +11 -0
  13. data/app/controllers/cdx/static_controller.rb +20 -0
  14. data/app/helpers/cdx/admin/base_helper.rb +1 -1
  15. data/app/helpers/cdx/admin/form_helper.rb +1 -1
  16. data/app/helpers/cdx/admin/resource_helper.rb +29 -19
  17. data/app/models/cdx/ability.rb +40 -0
  18. data/app/models/cdx/application_record.rb +2 -0
  19. data/app/models/cdx/asset/seo/og_image.rb +11 -0
  20. data/app/models/cdx/page.rb +1 -0
  21. data/app/models/cdx/seo.rb +22 -0
  22. data/app/models/cdx/setting.rb +7 -1
  23. data/app/models/cdx/user.rb +8 -7
  24. data/app/models/concerns/cdx/attachment_macros.rb +14 -0
  25. data/app/models/concerns/cdx/seo_support.rb +20 -0
  26. data/app/views/cdx/admin/devise/mailer/reset_password_instructions.html.erb +2 -2
  27. data/app/views/cdx/admin/devise/passwords/edit.html.erb +1 -1
  28. data/app/views/cdx/admin/devise/passwords/new.html.erb +1 -1
  29. data/app/views/cdx/admin/devise/sessions/new.html.erb +1 -1
  30. data/app/views/cdx/admin/devise/shared/_links.html.erb +3 -17
  31. data/app/views/cdx/admin/pages/_form.html.erb +3 -0
  32. data/app/views/cdx/admin/settings/_form.html.erb +4 -1
  33. data/app/views/cdx/admin/shared/_header.html.erb +1 -1
  34. data/app/views/cdx/admin/shared/_main_sidebar_menu.html.erb +5 -5
  35. data/app/views/cdx/admin/shared/_seo_form.html.erb +34 -0
  36. data/app/views/cdx/admin/users/_form.html.erb +1 -1
  37. data/app/views/cdx/static/show.html.erb +1 -0
  38. data/app/views/layouts/cdx/admin.html.erb +5 -1
  39. data/app/views/layouts/cdx/admin_login.html.erb +4 -0
  40. data/config/initializers/devise.rb +3 -5
  41. data/config/initializers/simple_form_bootstrap.rb +2 -2
  42. data/config/locales/en.activerecord.yml +44 -10
  43. data/config/locales/en.admin.yml +45 -40
  44. data/config/locales/en.simple_form.yml +9 -0
  45. data/config/locales/fr.activerecord.yml +91 -0
  46. data/config/locales/fr.admin.yml +89 -0
  47. data/config/locales/fr.simple_form.yml +9 -0
  48. data/config/routes.rb +11 -7
  49. data/db/migrate/20171002130330_create_cdx_seos.rb +10 -0
  50. data/db/migrate/20171005095457_add_template_to_pages.rb +5 -0
  51. data/lib/cdx.rb +9 -0
  52. data/lib/cdx/controller_helpers/locale.rb +17 -0
  53. data/lib/cdx/controller_helpers/seo.rb +71 -0
  54. data/lib/cdx/engine.rb +2 -0
  55. data/lib/cdx/routes.rb +43 -0
  56. data/lib/cdx/version.rb +1 -1
  57. data/lib/generators/cdx/install/templates/cdx.rb +10 -0
  58. data/spec/controllers/cdx/admin/settings_controller_spec.rb +2 -2
  59. data/spec/controllers/cdx/static_controller_spec.rb +24 -0
  60. data/spec/dummy/app/models/cdx/ability_decorator.rb +15 -0
  61. data/spec/dummy/config/application.rb +13 -0
  62. data/spec/dummy/config/database.yml +0 -2
  63. data/spec/dummy/config/environments/development.rb +5 -2
  64. data/spec/dummy/config/environments/test.rb +1 -0
  65. data/spec/dummy/config/routes.rb +6 -0
  66. data/spec/dummy/db/schema.rb +11 -1
  67. data/spec/dummy/log/development.log +1350 -0
  68. data/spec/dummy/log/test.log +24728 -0
  69. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/-i/-iFt0NG282LSk69Sr3JLKXx2M7EC8ruUNefVDbHErkE.cache +0 -0
  70. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/0F/0fNoOWKlJquYntmLiNOkQNi_6a0iVzq5OOeD51d9BAk.cache +1 -0
  71. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/0N/0nlKUDQVjUvNn0_rQNmi4goOd1QeXk_3ZCWolj26934.cache +0 -0
  72. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/0P/0p5jNivcntrR0rdOjn18-keOIRTMm5EYtltJGAa7yow.cache +1 -0
  73. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/0V/0VpY59TpaF-KXBqms-znoByVNPjR-P_eCeLlxBepkzE.cache +0 -0
  74. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/0_/0__0m7BBelMOz_X24UBi6SZ3Uh0X4h9e0V14obD3RVo.cache +0 -0
  75. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/0h/0HindtmDLfA2puS1rQHtYt_PH1W5Rcb3S-9D32folAg.cache +0 -0
  76. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/0j/0jz9seO_qzgc12jOQRBX6Wq77G29sbV101tgL__esjQ.cache +0 -0
  77. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/0q/0qtpjjwSuyn9F0Zw4FX3bgrDV2La3TQpqPnKIELASl0.cache +1 -0
  78. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/1I/1iARm3Mchh3clWJvFBWhoEgTOxzBAQlHifRPTAVxdkU.cache +1 -0
  79. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/1_/1_2bXybqcVDdWq70AmQv9_Xww4HyPC3RtGxXgrhPWMA.cache +0 -0
  80. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/1_/1_h1fVQCCAksvv_bbIZcstSElyaO0JcwYzEJSE7sKgQ.cache +1 -0
  81. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/1_/1_oe_BI62RbdA9jkSzL1VwJrFEptRf0K-WCZY-p3lc8.cache +1 -0
  82. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/1j/1jdfO5MniydqTDMCc6OlsJevFQCn0FMpg1HEbifyOHw.cache +0 -0
  83. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/1p/1PpVGdN-Gky0eA3ONio0s4i-ZQ7OvQigx1-W7ndgQBU.cache +4 -0
  84. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/1y/1yo4gBzHOyPj5eNdwH7f2XJjipPR-g43NmbdlgwasXI.cache +0 -0
  85. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/2D/2D-E_g4d_wFqhWsACw45AU1T4HgZa24X1fJCD8A-cmk.cache +1 -0
  86. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/2D/2DwgKbBdkZUZkIKin21KvhrmwLfNLjOHp0ZEkHhr2lQ.cache +1 -0
  87. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/2Y/2YoKA-UB1eAF6sFyqgSf4vPvOeXYWzmlsSOyCA1I2BE.cache +0 -0
  88. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/2m/2myor-spZvspHRsw9q5evQpjS-mbavq1dQJpei7J_tA.cache +1 -0
  89. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/2n/2N6sTK14LOJztedO9VQjEBXz9TxjMNtDPP6BMjt00Ts.cache +0 -0
  90. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/3K/3kHxvyS2gNyVlhTpICF2xM-T0l-ed7YlEluiW0Zf9T0.cache +1 -0
  91. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/3Q/3QMQjVvd2faHufB8gtFGeMIbxH-sCDr4vCOtPUgIcpE.cache +0 -0
  92. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/3l/3LkV-MY4oMsYNWdPvXQGJls3tP3qGznSwO2aiiQcSPA.cache +0 -0
  93. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/3s/3sqXUopmZBq7ucOltFVAaeq9k3bl0im68FY_F8FxeJM.cache +1 -0
  94. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/4D/4DnLFLUYvftKjHqlCMFap-uS2rn9Z73Kd4VAl62YnTc.cache +0 -0
  95. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/4X/4x1jBypiX2Fch4mNVpbwZQNrRMp4saFZ5Qok1whKYvk.cache +1 -0
  96. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/4Y/4yoJ745XP_lQvkDB_OMmcORPCl4vVsxaxW4UEUd3sbk.cache +0 -0
  97. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/4n/4n-q5a2YIbws7wp3tpljJ5BrNc_s2PJuMhPBRIzdhcI.cache +1 -0
  98. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/4w/4WAD0WBxsnN-wNF74X6MorObH79zloR5dIdEh514C0I.cache +1 -0
  99. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/51/51rQVKR5ShW5Vw6coB54r6kanmIEVsbi5cQ-WBFO560.cache +0 -0
  100. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/53/53xRB1iTmNzBgiyDHRhDLH68sNoG0l3NuadxWnO6d20.cache +0 -0
  101. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/5b/5BjBasr9gsjHQTbYdQ0Yh87NjjhdqPfLb2CkU2OHJaY.cache +1 -0
  102. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/5c/5crQT5B2P3mK86j0Dl6K9sCdXNbTbGEz3NTly0cV8Lk.cache +1 -0
  103. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/5s/5SFOdTJpduHEg91zJaIAr1VrLFih5MHNYmv9mtyTq-Q.cache +4 -0
  104. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/5y/5yEFF7UIbmhPtA3baKfA3dhd7czO7Mr-Xlc7pSouzAo.cache +1 -0
  105. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/6x/6Xjup3_QshPPWD9GFZ1Rsh6BhSv8mtwbvBGWBFySwOI.cache +0 -0
  106. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/72/72erHrbpPtcN7YqhDYnupoNuV3rf2pJozQ3J5HhD1iI.cache +1 -0
  107. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/7F/7Fhp0xcD_4hGj0bv9pVrktIH4E8hRHhBDFIU1vA9zeo.cache +0 -0
  108. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/7T/7t-1sFAQkGmXMyam9vkBvKF8MJhZ9VQJPfV_7PywF5I.cache +4 -0
  109. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/7o/7oCsmfp7c_RuA1zhrvJ7dbDSOOC0sQMg6DW3dxgYmZg.cache +0 -0
  110. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/7q/7qqDmxISOZ8Q9ZU5VFECDUzTi3VwB9rqIjgC5OOIrrQ.cache +0 -0
  111. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/80/80a3BElReHk-kquPjzlmLtsGEOVZvawBTr3Vy5PMg8o.cache +0 -0
  112. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/86/86BgsL85R9eVD-0iY6kAI8qmd7MstQe2twPO-9fIkpI.cache +0 -0
  113. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/8V/8VuRX4t14W9qg7istJ66rRqCUaW9f4HxfitJlnwH7XM.cache +0 -0
  114. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/8i/8i6ilkfD7Z06CVIqzeWC6N_idFglVWRnaZLmLbyIuXM.cache +0 -0
  115. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/8k/8KdwyF6we3R_uL-EpfzLppiDGRAnmuKcInrqDd-sM4Q.cache +0 -0
  116. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/8l/8LfCbkph35HmJStppNyWEU5kS6UZq70i3LD__bpZi3A.cache +1 -0
  117. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/90/90U29nApkOYKhI7f5Ik0hqTCMi6_cY5pBLWetmNPDok.cache +0 -0
  118. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/90/90yKdlZdkoi7cLuX9171xeFXDBamFl6Q8nBDBIMr_f4.cache +0 -0
  119. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/AL/Al4mMT2vXRy0XVI7gPZb_qv_S1xZikH5pWZAMoRg0Ow.cache +0 -0
  120. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ab/abh-MqdgcZZjYxqJAMU7VmPQgQEc1nsIRUl8PrTR4Xs.cache +1 -0
  121. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ag/AgWTHd9o70gaIXOgteE61PzuQ7zrXXhUhxXZCwD1k_8.cache +7 -0
  122. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/BK/BKAoOUUdP10MNcNv6y5kkOZFTXF7mLp6spXU2LxfK7s.cache +0 -0
  123. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/BO/BOpJ7-QqPdxiNr5QjcDhmeXJmlOQREtJCUzieBYDyfU.cache +4 -0
  124. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Bd/BD6vdNHjBq3IUAA1De-vsuBzohZ3gC0PKxbmwk9Reqs.cache +1 -0
  125. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Bd/BDRpsfEsYeCu8YKedt9og50isthWbMxWOKGwOwM3g64.cache +0 -0
  126. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Bf/bfA3l64VLm-qcg6ef6pS1swPEkyZp0aKSJKu7uWRppk.cache +0 -0
  127. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Bj/bJg2C4nvfAH4OJQI4jEHauHo1ZyFIABVFf0DMqKDPVE.cache +0 -0
  128. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Bv/BVMXHsTFCBqnlZMXA2oHjswGI3JTKoPSg2zW28E_HSY.cache +1 -0
  129. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Bx/bxBZ8hJio1vWq2nL4MtMl2o5KdgEXocU1lXqdF_H2Ok.cache +0 -0
  130. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/C9/C9XqqJn0jzF1cz4gnTlSTNhU8Pa5s4DIg-SJ88FsWXE.cache +1 -0
  131. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/C9/C9xd9XOvzRL-iSdaJVL0ot8YDzizIuYdxXGnj8VTpLo.cache +1 -0
  132. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/C9/c9JOLp9aHOmqYrc61IyX0fuLsfbltewybHRN84pKngg.cache +0 -0
  133. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/CR/crg6faV5hCnyUWUQBvwXsUKXIxeNwdFoeeRZY-9kQ8I.cache +1 -0
  134. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/CS/CSyBKXmKXX_KNNLX71lUtLo-qibtYKiDiUI7D1_Ad-U.cache +1 -0
  135. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Cf/cfPGt5PS7oDQyj24rV_aaIL-XBmlD5DQfrvhmt8Zo_k.cache +0 -0
  136. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ci/cIwTYXAvTveBOKlBbfivMJc6NSW0k7emzlT0_ZO5w9o.cache +1 -0
  137. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Cx/cxu-X2o-6X399909Ssr6XlxwqdGoWOmdLgy1SGHz7jw.cache +0 -0
  138. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/D5/D5k9pNKFy_4q1izZgrm28HRBhuv37bbussLpNbS0RDg.cache +4 -0
  139. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/D5/d5k69YupUL9o8p2iNuUEoe3zFBbG74sJg5wOOv3nfuU.cache +1 -0
  140. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/D7/d7_pzYKUCrxBOsuEKt9nrKosIlqYtXW-b8129LnvyQo.cache +0 -0
  141. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/DM/Dmx097lBqmTT-Oi4kuQviQnRh-a2HActU2dFY-s0_QA.cache +1 -0
  142. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/DO/do5awiiOZ_HS5FpsBbrlYLZ_KFBtc9ROw7Yrbtvedb0.cache +0 -0
  143. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/DV/dvShsqU3ubcbWOjmi93_42r82SrdBSKooi9vuT9v0vk.cache +1 -0
  144. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Du/DU7SS4Gqtnp5b2BRegxtPhY0d_W5RTctkJIzTnyJnSs.cache +0 -0
  145. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Dz/dzC0Tg_Pn0DAiA60zRTqwoiufYibY_nMqhh184Jrwj4.cache +1 -0
  146. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Et/ETKn_UyjMllkmPygy3je8yvIjAXuexFZMc3nOMDGZ2g.cache +1 -0
  147. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/F8/F8VP_mkjQWYzE_kstqaRPFgrOYvfvEXYlNHEJysb2jk.cache +1 -0
  148. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/FO/FORksrj3nRzuyQtF7ortyQcv8FKzQoFp7_rvh_a5e_0.cache +5 -0
  149. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Fa/fAQ7ZsIRt7gNzB93RfCmjmXarpP3psXoDtpexhi-lcw.cache +1 -0
  150. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Fp/Fp3Fi8NFOunDCuU9rnk4WpD-bwqMJ1RlEHXApZ_Ww78.cache +1 -0
  151. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Fp/fp71stt6rYCx_h5Vtv_SqeqSaErKDmdgQ_zgDk5nPFA.cache +1 -0
  152. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ft/FTS4SzX7DCL-phnfFg6c0L0hlobuf6b6PZNJEBUjiyk.cache +1 -0
  153. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Fv/fVO6OABVpR66_lo1S4dZX3TdNJFfOVTVFmQoA6Yo334.cache +0 -0
  154. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/GB/gbTW4epYUuCV1gRLZ-FfP1mirEaKjjR8xKLP1TqkBNQ.cache +1 -0
  155. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/GK/gKyqjKN5EPcboPVsaAWPRguhL4C9n4Ak_I8dxHbuBJ0.cache +0 -0
  156. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/GT/GTw48Whi_H5B30HrWKDHbhMESxxcgmt3cxVJVNxnlCA.cache +1 -0
  157. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Gz/gZr2Ax0pbGr5z478MPqutV_ckMVX5hoGCM4FlxYKptw.cache +0 -0
  158. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/HC/HCDOUd7-S45aJ_PjVAC_Vmjyud3i1aQv4cE3t9_Z3Dw.cache +0 -0
  159. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/HZ/HZ-pL107JwyUm0FXHqap6QT1gHaBdVO-HwgW7fyjS7w.cache +5 -0
  160. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Hn/HNmwBQyHv0Wd1s_FFE2ZKnlN1gc_60ojDfYMoTWxo2c.cache +1 -0
  161. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Hp/HPBbedoNr7FnvlUzBaP-F184BEU1LTSih7fp0zYyP3w.cache +0 -0
  162. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Hp/hPlcWYGmd8PAWMPpOKz8frzYfDv1ZmglHT_dv8lhcNI.cache +0 -0
  163. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/I1/I1KUnvh52K5HLo-DqDyraniWc9XvG72YgYnTWDiskOM.cache +1 -0
  164. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/IK/iK-WxRj6EtSpxgj7zp5ZKdc_QO_1aiEW1ArjZsrGStA.cache +1 -0
  165. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/If/iFR2Vv68kRTEt3rbTO4QMTv14XXSYOOYsdxuEM1XPU0.cache +1 -0
  166. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Im/ImnlN2FMoHZ7TF6gKEfHO3bjfL2wWhxOtGJXgxVn3dk.cache +1 -0
  167. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/J1/J14vesr1A3MZ9btP4P7iNs0FHKeprcTi4X1tt9XGSHo.cache +1 -0
  168. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/JG/JGEhVFfZgTVFCRiVAXe44oVveXuVRsa3isuIc9Eh9-c.cache +0 -0
  169. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Je/JEdK9d77mFvuv6Pk4agvy4WGNbFK9_XX69_mEyZfXJI.cache +1 -0
  170. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/K1/K1sN57T85a7GtrrrRdabe9ukxwC8iuJ1HCv9gvTBVZM.cache +0 -0
  171. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/KN/KnbYZeK72MsgFzLutCfAYVSnDv_j5n9x2ZwGiEzjK4A.cache +0 -0
  172. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Kg/Kg2grZ43Kx1CQ_VXx4RSCpYRCojuIKz-0Dn2G_y4Pdk.cache +1 -0
  173. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Kp/kpgcUcUZJyVmIX7ioTLnr8yi1B1R0mPdLykoKheweyk.cache +0 -0
  174. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Kq/kqVr6Q49dL2u3aAu7hQoZEW22oA76zrZItcqo2BjcIc.cache +1 -0
  175. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/L2/l2WZXgIHGA3F2zeqdZq-izZuMyvXKBI85BLC_0xWOro.cache +0 -0
  176. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/LK/Lkaf1O_V-WIPFyVu6tfJhZ0TdHUU8uCaEPLSklSzx98.cache +1 -0
  177. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/La/LADi7AZEz3mtq7mQjXXlCBbH8oBk0bcj725-vayk2OA.cache +1 -0
  178. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Lr/lRRHJn2XRFri_mi2DOWJvLRhRAiM1YKh0hurFqvG87E.cache +1 -0
  179. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ML/MLJfBFcV2AX5sApWFIAHm5Qm4kJIPo_l1P4V7hQrAFs.cache +0 -0
  180. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/MU/MUchbbk2TuTpAxTSBl03faiF7lM5jKcPso_YeoSqcx0.cache +0 -0
  181. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/MW/MwyLb1ZP1_eaMijYv-iHTtfnrjTf4fbbbV0OH1epKTo.cache +1 -0
  182. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Nj/NjG05c2jA9Navxh1LFsBqDyPgpG9fiFk_RfLkWu-65Y.cache +1 -0
  183. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Nm/nMWLxYY30O0E1hkbxV1FFweLkEB6VoFint77FrZJ3pw.cache +1 -0
  184. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/OD/OD6SmOeQUB2AEmekz7U99o3nO2ioN9_cK36K99qBJ70.cache +0 -0
  185. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/OD/oDYzF0n64vcUCyvZ5Fxgz2IFRxZVLBa1Qf7NvbP4Rj4.cache +4 -0
  186. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/OF/ofiLQRccxxIb-yC9v4M3_a-gs4kGHt6kvK9oh7bZyXc.cache +1 -0
  187. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Oh/OhWFXM9GuxBD1Yw5r1DnNgC_EUU0m41NsRdMN-cwaLE.cache +1 -0
  188. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ou/oUI7TzCsU_4rW2DtLQ3bkn1TiXdYAl4GXW9MBSS0vJ8.cache +1 -0
  189. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ou/oupue72yFp7MC2LCdPww-3HH00fR_6FjnvDpMDZCtqU.cache +0 -0
  190. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/P7/P7p2i0Sm3DJ3BZGKbialS5-rDXqxKIRt_Az1fRjq7Us.cache +1 -0
  191. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Pg/PgxniuPvmdPnZe-YAxPqcbogt2k6ZDLnVbCiWgDxooI.cache +4 -0
  192. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Pr/prvtYXooSziuVaUF2LMJF0Uv4JfpTI6ip5I_tJPQE8Q.cache +1 -0
  193. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ps/psCXHNyv38VAep2dJ0cTOdHQkS_MWXG-guuUVC8t4YI.cache +1 -0
  194. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Q3/Q3whiX7hWA6sHL4BaujPiVI1GQ6YWMNkxu74eBHZl3M.cache +1 -0
  195. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/QS/qS_9kKSqAOD1IsbS049t0luTxiGNgOkznsK63G29XbM.cache +0 -0
  196. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Qc/QCrLyf5oF6nlbHXmhp9hnfjMh1LcK07Z142GDLHKAjQ.cache +1 -0
  197. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Qm/QmyRU9WjjNWdjkDsdr9j-NKCyspm6XzAUlTOrIZDlTc.cache +0 -0
  198. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/R5/r5VCnaIlCnfLuvjK6ube003OfLDh1fNrnSHONd9_ocU.cache +1 -0
  199. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/RL/rlvpruq1is4grm3GrVv1n_01sNG2MhE9NUuoVeCdWrM.cache +1 -0
  200. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/RR/RrlF5aR2LEJoimuYzeygpTdbqFDD2PqEMRStdtvBI8c.cache +0 -0
  201. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/RR/rrk_AkULRJpki1T-n6uQCY0y4JONQ0NEXWAFTxNwNNw.cache +1 -0
  202. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/RT/rT52RKB6g3HZeXb1SBwtrPzIMAi0kgVl4sCBTPJY2EY.cache +1 -0
  203. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Sg/SGrxaiHVJzOOBm0zKHYRC-0xnLVkqOBOpuN_oY_oOUc.cache +0 -0
  204. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/T8/t8310ngJo_JGf8ppMVuyfCaStzB6-shCkX0BSA9CcLg.cache +0 -0
  205. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/TH/the1sdNgVTdgMnUinRhMI1WGI3QVETw3pm6KsU2fVMQ.cache +0 -0
  206. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/TO/To9HIgbxLeRcTRDDZ0ghnupZgaebrNoqdeFjshM3Tu4.cache +1 -0
  207. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Tf/TFHKQ4pT3CcgqUjDzLNhB15gpQkDaHi7pq6ZkJWCuDE.cache +1 -0
  208. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Tu/Tu_FRu6GxmhiowKn5FrH7vYvlCUHdkuWXr5vCz8xuAY.cache +1 -0
  209. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/U7/u7rm5QuAOWJaqKRxL8Of43KkpQdmhmEkVMc1ZvrGvK4.cache +1 -0
  210. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ud/UdUAfPcNU80Y1woqaYlbmxevwd-0qlchMQ6nPLsZBco.cache +1 -0
  211. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/V2/V2Mr-gWWDkAqZQYmZZqjbFgqWFFb4bRQBKdzIoDNDFA.cache +0 -0
  212. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/VT/VTpdpG8eJiAmc4ovAhpsyi2dHb8UZ6POiZ2bknhwemw.cache +0 -0
  213. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/VT/vTD5XYvspxAwwGpKmRLROUvKa3Rn3m1IUxSx541orUQ.cache +0 -0
  214. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Vl/Vlsm70pT87kfS0a8N036d_pas104--nq1o2oanQGIe8.cache +1 -0
  215. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/WI/Wiw750s27MY7h_DJ5btWxNxiqgRLOsI7yjhIJQvhyXI.cache +0 -0
  216. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/W_/w_XNp6PrIPf5HHSYhtAViubTyyriYzfw0xt7a3emimk.cache +1 -0
  217. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/XC/xCXzAN6gQCV7s-Ez1BT_fD5s_foJ0ARMam-3pKuiufY.cache +4 -0
  218. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/XK/XkQcEEK4sCc3352uItx_Gh5M5ChASrRUxvh1K8kviKM.cache +0 -0
  219. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Xa/xah7XHL6JDUR9tCJIfx3DVDhbycwgDfntEdzOPgm__4.cache +0 -0
  220. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Y-/y-UZhd5FyaI3Hs3KvKtWFLeBAhKUNlZYlcBFzvlKEs0.cache +0 -0
  221. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Y6/y6ItwP5AI4LqD4hXfOQh5LqyI70rX6yy0QfUO10-9HM.cache +0 -0
  222. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/YZ/YZQch5dfmJMHMA819nM1lvaJNIrW1NPDlDWWNZEgGTY.cache +0 -0
  223. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ZN/Znxtcq-ZTxzNLztrUr5qugSoCxTd-GWv73X2oF1x0ZM.cache +0 -0
  224. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ZU/Zu3ZA7q9vQyo8d_LeMVGaY5OjwMBNr9K7OyOtKQwfKw.cache +1 -0
  225. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ZW/ZWEDoKOwn8uGSGpTnLq0zIlXZCd-lcZ3cReO5xZHS2M.cache +0 -0
  226. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/_-/_-YtNYD2M-58NbvNpYe7S-PDb63s_k0Ia0DXNyor2ls.cache +0 -0
  227. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/_-/_-_qJT08J1eTH_0Vg2UVZohSjv1i11mkKvnyweIvgwU.cache +0 -0
  228. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/_1/_1dLc-fSiH4-ZGkYCSoW4WfK7njx8QYvpsT7d0iOOHw.cache +1 -0
  229. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/_7/_7STOiMb3GNnXCgsh82Vh8dSPK3TE5onjH773vl6quA.cache +0 -0
  230. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/_f/_f7ipp2FPzR3B5xuwlQ0-QZacf0rvw8DNrTBpEqkwmg.cache +0 -0
  231. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/_m/_MJSHrCWTUT8SZ71ih6F-HI5GGcJ7c2YwW8ERiIK5Tw.cache +0 -0
  232. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/_v/_Vq5M5rhogfHHjIUiJbvr3TB6vqUBRwC_CttsZjNeu0.cache +7 -0
  233. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/a1/a1R0-5ycIuReJ4-fqbXk6fH2IdxW89a5kaevGv-Dml4.cache +0 -0
  234. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/aF/aFKOFyg5JLPd7cbF-MD0fFuV2fubfdz-yKKyXwsLl8s.cache +1 -0
  235. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/aO/AohWZS-TPE-wjo80tb76OA6hA3TQQh4b7sJHv7LU6dI.cache +1 -0
  236. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/aq/aQoRtEOx37MRSLS7kP_4yDtmt0AiLLtU5bBN_GtJj8Y.cache +0 -0
  237. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/b9/B98ns1UOJj2BI40YdrYj2AYpv2jnpcH5uY7caTMKUeo.cache +1 -0
  238. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/bA/BaJKhJJLWg3gRQEGckI_F33ILRJvlBhQ9lgrgkGr4gM.cache +1 -0
  239. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/bC/bC-NuzAGHhmfyMdEou8QaKV_od64DOu3CiatbX1zS7Y.cache +4 -0
  240. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/bH/bhsmt8uMEM17fZf-7L8Tr21Qm7wp0wtNXXEbP48OsnE.cache +1 -0
  241. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/b_/b_Itlk9QZZd7Rvf8kcA4yLP1R5Acu7jB-m1xQiSU0qE.cache +0 -0
  242. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/bp/BpJfHs6Mo8lqlKf2TijySqZ444qek67RWzRwUen64vQ.cache +0 -0
  243. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/c3/c3-rWf7UzoWjsYPy5EtXvv3ufQ8CIQ6Z-0kVS09lrDs.cache +1 -0
  244. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/cC/CcBfkGECwA5O7hQpkndgB0Hi90JOu69Ifjs6wSifP7o.cache +1 -0
  245. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/cH/ChcBt03RXtOFBODQDToOchKvzpr2dW6cMQ2HrmYPNq8.cache +0 -0
  246. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/cH/cHerKTSfFWYybWwIjdgf4hdq0TMrmPhHgxlEFQ-dQb0.cache +1 -0
  247. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/cO/CO5mDqDfmtiDa_MlTuMous_vC3vHyMfMCvG0iPr3oVo.cache +1 -0
  248. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/cn/CNJKoiuv7BhPbbHegPk_Qktnz_JF6HQr35hNbw6s-RM.cache +0 -0
  249. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/d-/D-tuIWBYGuFafbtlGFsVUWuW1V532Zkwlhdc9YU_0_Q.cache +0 -0
  250. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/dK/dkEIzUkEZU4yDjWENPIb9mVQ6WLjulPZooIMhh0kjps.cache +1 -0
  251. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/dX/dX8QOFCLVNiDkCAiFD_PFv9d-Qo1wVbsDeLj4mtE4R0.cache +0 -0
  252. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/eE/EEpwNSyxAZOsAaJa0FVJLqYX-D8EEzVXrqNADqSq1pg.cache +1 -0
  253. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/eV/EVxtlJx2DKEnr7jM6G-nUsoSv7PuWNZ4HqxYV6G0LNE.cache +1 -0
  254. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/eb/ebBZEqfj1_tXnSytXRHDulZ2qjRuj2jiuzALy71-p04.cache +1 -0
  255. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ei/eI82uxHiRfJCRpat_t9RMiiro7Ggp0aaY6gS2RHhXIc.cache +0 -0
  256. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ew/EWvBebjHFMAPVeVD3tkNaDGv1De3T-L_N4DgqM7rPfA.cache +0 -0
  257. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ff/Fft1-kdQYW_lF9qeAgbnyv7nLFkLOug2kmkMt_lLSqA.cache +0 -0
  258. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/g3/G3sgs1Ax6Vk_2s37KNPp2-7IdFiT3LOWxMmlF7OUOuM.cache +0 -0
  259. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/gL/gl9epGlvS8NGjkSvO3-Zv20gDWDOihgYl4zev3I4gzM.cache +1 -0
  260. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/go/gObqKgy_NGkfRMIq-hy2D3F82sXUz_xKrQXbW3ZgU5k.cache +1 -0
  261. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/gy/gYo6RbgaJKr4uO3yVeAwQh_fzXzR08K7lkURuVclXX4.cache +1 -0
  262. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/h-/H-wscVetDYgz1C6_9m_zX4Ubit9GpN41Qh36i61d49E.cache +0 -0
  263. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/hq/Hq6ThzYH1Jwap4RjDjkeXS6kh3_SwtUrbSk5u9-pPvQ.cache +0 -0
  264. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/hv/hvCWsDxXJW9jg2ULOdo9wcMcIiVXr1vPB-7RRCtj-Zg.cache +1 -0
  265. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/hw/hWPXtikadUixtV_Vz7dJ5Yb8xdcJ6CC6pXuZKANgAVM.cache +4 -0
  266. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/iI/iiw3Z6suXDviQSt5opMZ7iCTz8rrt7lWwxCYG-jOATY.cache +0 -0
  267. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/jX/JXX-ip72L8uACavKSd8TQFVw6MQo63MyTadGeyddhj8.cache +1 -0
  268. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/jd/JD6N31VqeGIaXMEqjkdDzYExPQxGK7Zi9aVAGYcHcVc.cache +1 -0
  269. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/k5/k5e6-CoVqmpM8jXJRwAaGn_fs_rOUvkz_8mXqHu8_ao.cache +1 -0
  270. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/k6/k678AMTE8Rpt4M0p22vOGHuMydQhufi7r-XlrQU5p6Y.cache +1 -0
  271. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/kC/kCPTWFwWLADuE4b0kM5PUnetnYdoiFWVL7C91_RGlF0.cache +4 -0
  272. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/kJ/KJUwoqIiuj-qpKpMy7k0S-voZVXPonJjx6cblKKdGKg.cache +1 -0
  273. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/kL/klyYYLzIHrlg7rcBAWfk8RezPB9yU5qjkFJQgIMwyf4.cache +1 -0
  274. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/kV/KvtETa0BMROOFrdvtIkDReAoRz0wHnGGw8RyXETCu5c.cache +1 -0
  275. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/kZ/KzoIWrb49pUv8dm_4xNPu5bj7CW1DraOTvLScFbTpSo.cache +4 -0
  276. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ko/koyJ5Xizwv3o0lnBTF0IsKiH-MnMN39MMDN9JYB_6kM.cache +4 -0
  277. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/lB/lBP9PyX9X0z7Q3ChAOemieBBbC7fJE3IcmLcyBjT_fs.cache +0 -0
  278. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/nC/NcSCneaLBTHR1N_d6-NwYjql4r-jmQPEz5Wr6MadHio.cache +0 -0
  279. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/nL/Nl068pZS4lI4dvrWUTQVV3jz9IaH1sZonpVEyEd1cXo.cache +1 -0
  280. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/nL/nLmYNs5vhdCsci9KiAHI6bx7jbgGCr_Ev7Bi5CSyTxc.cache +0 -0
  281. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/nP/NpPldDHmBprTojKOz0ubr22DkyAkmWCjYgfi1jaUAH4.cache +1 -0
  282. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/oG/oGUukVPniof9dUUrs5SqfHqCD80JYsgyYjLuHhYkm58.cache +1 -0
  283. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ob/obVbAIR4nBUA03U9XbZV0AAeeBl434DzZ0vpqL4qC8w.cache +0 -0
  284. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/on/on_VGtMCJXLwRJrs_mSYnTR-mpiLLOZHZE5u7W6wfbE.cache +0 -0
  285. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/pk/pkdw-Jgeclt9vajoQqiLRaBZZzhjXjJmfzp8ePPy1G0.cache +1 -0
  286. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/qH/QhqfODycIGdVzQX8GRs-Ib6Pq1hGxqNYyLUGvZMM7os.cache +0 -0
  287. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/qb/qb67_izas1nixcQ-AauJdU9nn3EmIDDCKmYePp49rC8.cache +1 -0
  288. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ra/ray_bF5Ej18NZlHx_KQ3cYYeg7nEiYPzBT8WsdHNEmk.cache +0 -0
  289. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/s0/s08CnMSk3W06JZNTVEVqApJd8Vpz7TLOYFO9-6CsE2g.cache +1 -0
  290. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/s0/s0e75axNmtNlRg8x1AcNxSSxmweSr5pxzu6tg21QGfk.cache +0 -0
  291. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/so/soDpZ_JUnPHmG0FYpI_47WgP1hsnLMxZPrVuNh3MGzg.cache +1 -0
  292. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/sy/SYNvEuncguh0B7KSNy0mIfyZSkNlQVOOLPIV5h0ZLwA.cache +0 -0
  293. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/t4/t4fHClD6YGDsSKSJQNND8cK4DG59K4GrSawc9aFtIX0.cache +1 -0
  294. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/tn/tnXjvHNgRK7H4M44cOtCkufshJoMKyGxD_3d85_P8io.cache +0 -0
  295. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/uE/uelCAlCK-JD31uF5SDtIbiNJzKNNS8wQjyf-rYxlEqA.cache +0 -0
  296. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/uK/uk_pSKPoFIZcb3KkcV0BaPBUkiNJofSVmemhGLguLRQ.cache +1 -0
  297. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/uM/uMAAFlayLJ1Y44NPWXqXIQED5cpFgzqVlLPP5pYymoE.cache +0 -0
  298. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ut/uThFl2m0GavTCT4pl2oDWqIBIn0yj9_PoqrYL1S76XQ.cache +0 -0
  299. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ut/uTtJNzrVQtxdGXTkkbdGY_HyBs31WvuFNJRa1MKw1oA.cache +0 -0
  300. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ut/ut9R9B1Xb0I7LhpAEJGjlSe2VkwJlGyqP8EUJr8DwCw.cache +0 -0
  301. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/vC/vcr2_BONXHi2_t_Sjhvg_Ucp1qY7qOARdnYyC9_qgEU.cache +0 -0
  302. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/vZ/vZd7TqVpkThrX7nIZg2gMbl-EYQz4yX32509Kf4zI8g.cache +0 -0
  303. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/vg/vGz1YgkFiH3K3rkMCpUSjE-9ejQH7gheA_F0QTM4-Fk.cache +0 -0
  304. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/vw/Vwb24w5R2fbGV6mwam0Zv3ChgVPqtoN2ycurQcbCUpE.cache +1 -0
  305. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/wA/WaW9zL376Fd5jhAkSr65m-RaRMG7lqqaMnbbmJd2Roo.cache +1 -0
  306. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/wA/WayDgcdBl8u7lmDWTD2G5LueoPHSmIVKsH11ouhvAvA.cache +1 -0
  307. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/wS/Ws-va4f_EnxlLEeWHMcMeajnLKLNVzOV9mSnWNjxHsg.cache +0 -0
  308. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/wV/WVAQnoAwhp9Ofx9devXpnnElvhZa9wQKf7C0bYOdm2s.cache +0 -0
  309. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/wx/wX40TRI0nDBMeklwhXEUi5g4cUL49_iRk1hM17pjF1A.cache +1 -0
  310. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xI/xIIoLGg2-k4fy4TFbZ5W1VpEg4PvprGqgwAc_ok0a2E.cache +0 -0
  311. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xg/xGKpJBeLDVoGW8seoyKcDkbUQHa7BxIiOsdbe0107OQ.cache +1 -0
  312. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xl/XlVv4YODOAXqFR8rDkclOihevedZKkisiKA4UV7DIjo.cache +0 -0
  313. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xt/XTNQufvpZiYf099YZk14sezwCWcpSRJejvC_aG9Ibu4.cache +2 -0
  314. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xt/xTMrRJs3k_JFBaRV3RLvDV8TYJPDNfK8D6WN627Bk6s.cache +0 -0
  315. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/y7/Y7ykJL1z2RdshacFjZG6B5UvCj72YZYRUF2gJaF0rZg.cache +1 -0
  316. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/yB/Ybbz_WJ213Nqi-aFaaQkGhRBlFbtkpF22qQgLe_1uog.cache +1 -0
  317. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ya/yAUp6d65RN_WmANx7yBiiW_9tKgD3WcHJzuXyIPGfLo.cache +1 -0
  318. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/yr/Yr3omw0q7iUD4-ZnhTEHnG5LAfO2ozUyIRYtTL9VyLY.cache +0 -0
  319. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/yu/yuvUN0gcqkar9QF-yGu6G016_Qz1XCUVbZutajszLuo.cache +0 -0
  320. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/zO/zO0GfKcnBb5wchGGaNXRkku6RZrukJm8oOv_9zWvC3A.cache +0 -0
  321. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/zQ/zQEso6LidPVvaY-mMDkB78rkEzrYmZEYHpFCoVC3xCc.cache +1 -0
  322. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/z_/z_9uUxYxAYgjlNpeinpDwugfQyMQSwnKgYcx-axV3u8.cache +1 -0
  323. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/zi/ZiXkZ6gfSxNXmwzpX3-D8Gkr69W59cdAVYvE9E7KHl4.cache +1 -0
  324. data/spec/factories/cdx_seos.rb +13 -0
  325. data/spec/factories/cdx_settings.rb +1 -1
  326. data/spec/features/cdx/admin/login_spec.rb +15 -9
  327. data/spec/features/cdx/admin/pages_spec.rb +17 -0
  328. data/spec/features/cdx/admin/users_spec.rb +16 -0
  329. data/spec/helpers/cdx/admin/base_helper_spec.rb +37 -0
  330. data/spec/models/cdx/seo_spec.rb +13 -0
  331. data/spec/models/cdx/setting_spec.rb +1 -1
  332. data/spec/models/concerns/cdx/taxonomisable_spec.rb +24 -0
  333. data/spec/rails_helper.rb +17 -3
  334. data/spec/support/controller_macros.rb +12 -10
  335. data/spec/support/feature_macros.rb +12 -0
  336. metadata +566 -26
  337. data/app/models/cdx/attachment.rb +0 -6
  338. data/app/views/cdx/admin/devise/confirmations/new.html.erb +0 -16
  339. data/app/views/cdx/admin/devise/unlocks/new.html.erb +0 -16
  340. data/config/locales/devise.en.yml +0 -64
  341. data/config/locales/simple_form.en.yml +0 -31
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 547667c51789bfcded17ead84db8d99d42d1eee1
4
- data.tar.gz: 841323d0857e5f34187fec346b25c8e4a4c7237d
3
+ metadata.gz: 63d9635903d244298f5cf669827925fe464a589a
4
+ data.tar.gz: f0af518b0aa2f4d2d10b7ba5dbee82e6d00f183d
5
5
  SHA512:
6
- metadata.gz: 7ca3ff7e0250da582028623d0e0026fd79cb0a5feb954c1a0c9fed6a21f2f0755a43e2ff085fb0173eda5e71b070d51522b774efec0a7dad0b27e90b92d63a75
7
- data.tar.gz: c3a658c5992fe6000587611584382d42ad6c1ca8395ecc93e92dde884417a0d5e31451bfd78a64e1c695a6e10a53d6e0fea67d2163ad80e9982270beba77f8fc
6
+ metadata.gz: 9a500b1dec26eff9486b39cf615f17b1a7e495419307f18c39ee3bc906bc0f1766d6243cba6ea81d732cd8ba220572cfb886178436f7247e75ae99d62b6b7fe2
7
+ data.tar.gz: 1c5f36825c444d898d717d26317fe3e6e9af40cf9cc26b4d3be40aea5fe620d040a0781615612d48ec96ea7b57fa0059d0ca86b2c97b99bbabcdc0f1e17acf34
data/README.md CHANGED
@@ -1,8 +1,9 @@
1
1
  # Cdx
2
2
 
3
- [![Build Status](https://travis-ci.com/alexandre025/cdx.svg?token=in8sSsy4MxZn4XxNavha&branch=master)](https://travis-ci.com/alexandre025/cdx)
3
+ [![Build Status](https://travis-ci.org/alexandre025/cdx.svg?branch=master)](https://travis-ci.org/alexandre025/cdx)
4
4
  [![Gem Version](https://badge.fury.io/rb/cdx.svg)](https://badge.fury.io/rb/cdx)
5
5
  [![Dependency Status](https://gemnasium.com/badges/github.com/alexandre025/cdx.svg)](https://gemnasium.com/github.com/alexandre025/cdx)
6
+ [![Test Coverage](https://codeclimate.com/github/alexandre025/cdx/badges/coverage.svg)](https://codeclimate.com/github/alexandre025/cdx/coverage)
6
7
 
7
8
  Cdx is a rails 5.1.x engine which provide a ready to use admin panel with some components such as static pages, resource controller, multi-site, models translations, assets uploading, user management...
8
9
 
@@ -10,7 +11,7 @@ Cdx is a rails 5.1.x engine which provide a ready to use admin panel with some c
10
11
  Add this line to your application's Gemfile:
11
12
 
12
13
  ```ruby
13
- gem 'cdx', github: 'alexandre025/cdx'
14
+ gem 'cdx', '0.0.4'
14
15
  ```
15
16
 
16
17
  And then execute:
@@ -0,0 +1,15 @@
1
+ Cdx.ready(function () {
2
+
3
+ $('.theme-selector').on('select2:select', function (e) {
4
+ var theme = e.params.data.id;
5
+
6
+ var $body = $('body');
7
+
8
+ $body.removeClass(function (index, className) {
9
+ return className.indexOf('skin-') >= 0 ? className : ''
10
+ });
11
+
12
+ $body.addClass('skin-'+theme);
13
+ });
14
+
15
+ });
@@ -8,6 +8,7 @@
8
8
  @import 'shared/file';
9
9
  @import 'shared/notifications';
10
10
  @import 'shared/select2';
11
+ @import 'shared/radio_buttons';
11
12
  @import 'shared/translations';
12
13
  @import 'shared/nested_asset_form';
13
14
 
@@ -0,0 +1 @@
1
+ .form-horizontal .radio { margin-right: 15px; display: inline-block; }
@@ -1,9 +1,11 @@
1
1
  module Cdx
2
2
  module Admin
3
3
  class BaseController < Cdx::ApplicationController
4
+ include Cdx::ControllerHelpers::Locale
5
+
4
6
  layout 'cdx/admin'
5
7
 
6
- before_action :set_locale
8
+ helper_method :meta_title
7
9
 
8
10
  def authenticate_admin_user!
9
11
  if admin_user_signed_in?
@@ -13,16 +15,36 @@ module Cdx
13
15
  end
14
16
  end
15
17
 
16
- private
18
+ def meta_title
19
+ if current_settings.meta_title
20
+ "#{current_settings.meta_title} | Admin"
21
+ else
22
+ "Admin#{current_settings.acronym}"
23
+ end
24
+ end
25
+
26
+ def current_ability
27
+ if try(:current_admin_user)
28
+ controller_name_segments = params[:controller].split('/')
29
+ controller_name_segments.pop
30
+ controller_namespace = controller_name_segments.join('/').camelize
17
31
 
18
- def set_locale
19
- I18n.locale = current_settings.default_locale || I18n.default_locale
32
+ @current_ability ||= Ability.new(current_admin_user, controller_namespace, Cdx::Site.current)
20
33
  end
34
+ end
35
+
36
+ private
21
37
 
22
38
  def flash_message(object, action, context)
23
39
  object_name = object.class.name.demodulize.downcase
24
40
  flash[context] = t("admin.flash.#{object_name}.#{action}.#{context}", default: t("admin.flash.default.#{action}.#{context}", n: object_name.capitalize))
25
41
  end
42
+
43
+ protected
44
+
45
+ def action
46
+ action_name.to_sym
47
+ end
26
48
  end
27
49
  end
28
50
  end
@@ -1,4 +1,8 @@
1
1
  class Cdx::Admin::Devise::ConfirmationsController < Devise::ConfirmationsController
2
+ include Cdx::ControllerHelpers::Locale
3
+
4
+ layout 'cdx/admin_login'
5
+
2
6
  helper Cdx::Admin::BaseHelper
3
7
 
4
8
  # GET /resource/confirmation/new
@@ -1,4 +1,8 @@
1
1
  class Cdx::Admin::Devise::PasswordsController < Devise::PasswordsController
2
+ include Cdx::ControllerHelpers::Locale
3
+
4
+ layout 'cdx/admin_login'
5
+
2
6
  helper Cdx::Admin::BaseHelper
3
7
 
4
8
  # GET /resource/password/new
@@ -1,4 +1,6 @@
1
1
  class Cdx::Admin::Devise::SessionsController < Devise::SessionsController
2
+ include Cdx::ControllerHelpers::Locale
3
+
2
4
  layout 'cdx/admin_login'
3
5
 
4
6
  helper Cdx::Admin::BaseHelper
@@ -5,6 +5,8 @@ module Cdx
5
5
 
6
6
  before_action :load_resource
7
7
 
8
+ before_action :authorize_admin
9
+
8
10
  helper_method :member_action?, :new_object_url, :edit_object_url, :object_url, :collection_url, :parent_collection_url, :parent_object_url, :edit_parent_object_url
9
11
 
10
12
  def index
@@ -70,16 +72,21 @@ module Cdx
70
72
  def load_resource
71
73
  if member_action? # Load member action
72
74
  @object ||= load_resource_instance
73
- # instance_variable_set("@#{resource.object_name}", @object)
75
+ authorize! action, @object
76
+ instance_variable_set("@#{resource.object_name}", @object)
74
77
  else # Load collection
75
78
  @collection ||= collection
76
- # instance_variable_set("@#{controller_name}", @collection)
79
+ instance_variable_set("@#{controller_name}", @collection)
77
80
  end
78
81
  end
79
82
 
80
83
  def collection
81
84
  return parent.send(controller_name) if parent_data.present?
82
- model_class.where(nil)
85
+ if model_class.respond_to?(:accessible_by)
86
+ model_class.accessible_by(current_ability, action)
87
+ else
88
+ model_class.where(nil)
89
+ end
83
90
  end
84
91
 
85
92
  def resource
@@ -89,7 +96,7 @@ module Cdx
89
96
  end
90
97
 
91
98
  def load_resource_instance
92
- if new_actions.include? action_name.to_sym
99
+ if new_actions.include? action
93
100
  build_resource
94
101
  elsif params[:id]
95
102
  find_resource
@@ -120,7 +127,7 @@ module Cdx
120
127
  def parent
121
128
  if parent_data.present?
122
129
  @parent ||= parent_data[:model_class].send(:find_by, parent_data[:find_by].to_s => params["#{resource.model_name}_id"])
123
- # instance_variable_set("@#{resource.model_name}", @parent)
130
+ instance_variable_set("@#{resource.model_name}", @parent)
124
131
  else
125
132
  nil
126
133
  end
@@ -143,7 +150,7 @@ module Cdx
143
150
  end
144
151
 
145
152
  def member_action?
146
- !collection_actions.include? action_name.to_sym
153
+ !collection_actions.include? action
147
154
  end
148
155
 
149
156
  def new_object_url(options = {})
@@ -198,6 +205,10 @@ module Cdx
198
205
  def location_after_save
199
206
  collection_url
200
207
  end
208
+
209
+ def authorize_admin
210
+ authorize! action, model_class
211
+ end
201
212
  end
202
213
  end
203
214
  end
@@ -5,6 +5,8 @@ module Cdx
5
5
 
6
6
  before_action :load_settings, only: [:edit, :update]
7
7
 
8
+ authorize_resource class: 'Cdx::Setting'
9
+
8
10
  def edit
9
11
  end
10
12
 
@@ -2,6 +2,17 @@ module Cdx
2
2
  class ApplicationController < ActionController::Base
3
3
  protect_from_forgery with: :exception
4
4
 
5
+ include Cdx::ControllerHelpers::Seo
5
6
  include Cdx::ControllerHelpers::Settings
7
+
8
+ def current_ability
9
+ if try(:current_user)
10
+ controller_name_segments = params[:controller].split('/')
11
+ controller_name_segments.pop
12
+ controller_namespace = controller_name_segments.join('/').camelize
13
+
14
+ @current_ability ||= Ability.new(current_user, controller_namespace, Cdx::Site.current)
15
+ end
16
+ end
6
17
  end
7
18
  end
@@ -0,0 +1,20 @@
1
+ module Cdx
2
+ class StaticController < ApplicationController
3
+ before_action :load_object, only: :show
4
+
5
+ # We don't provide routes for this controller, you'll need to define your own routing logic.
6
+ def show
7
+ begin
8
+ render "cdx/static/custom/#{@object.template}"
9
+ rescue ActionView::MissingTemplate
10
+ render :show
11
+ end
12
+ end
13
+
14
+ private
15
+
16
+ def load_object
17
+ @object = Page.with_state(:published).friendly.find(params[:id])
18
+ end
19
+ end
20
+ end
@@ -8,7 +8,7 @@ module Cdx
8
8
  def theme_class
9
9
  if current_admin_user&.theme && !current_admin_user.theme.blank?
10
10
  "skin-#{current_admin_user.theme}"
11
- elsif current_settings
11
+ elsif current_settings.default_theme
12
12
  "skin-#{current_settings.default_theme}"
13
13
  else
14
14
  'skin-yellow'
@@ -17,7 +17,7 @@ module Cdx
17
17
  end
18
18
 
19
19
  def locales_options_tags
20
- I18n.available_locales.map { |l| ["#{EmojiFlag.new(l)} (#{l})", l] }
20
+ Cdx.available_locales.map { |l| ["#{EmojiFlag.new(l)} (#{l})", l] }
21
21
  end
22
22
 
23
23
  def available_locales_options_tags
@@ -30,38 +30,48 @@ module Cdx
30
30
  end
31
31
 
32
32
  def link_to_new(options = {})
33
- url = options[:url] || new_object_url
34
- options[:class] = 'btn-sm btn-info pull-right'
35
- link_to url, options do
36
- fa_icon(:plus) + ' ' + t('admin.actions.new')
33
+ if can? :new, @object.class
34
+ url = options[:url] || new_object_url
35
+ options[:class] = 'btn-sm btn-info pull-right'
36
+ link_to url, options do
37
+ fa_icon(:plus) + ' ' + t('admin.actions.new')
38
+ end
37
39
  end
38
40
  end
39
41
 
40
42
  def link_to_show(resource, options = {})
41
- url = options[:url] || object_url(resource)
42
- options[:class] = 'btn-sm btn-success'
43
- link_to fa_icon(:eye), url, options
43
+ if can? :show, resource
44
+ url = options[:url] || object_url(resource)
45
+ options[:class] = 'btn-sm btn-success'
46
+ link_to fa_icon(:eye), url, options
47
+ end
44
48
  end
45
49
 
46
50
  def link_to_edit(resource, options = {})
47
- url = options[:url] || edit_object_url(resource)
48
- options[:class] = 'btn-sm btn-info'
49
- link_to fa_icon(:pencil), url, options
51
+ if can? :edit, resource
52
+ url = options[:url] || edit_object_url(resource)
53
+ options[:class] = 'btn-sm btn-info'
54
+ link_to fa_icon(:pencil), url, options
55
+ end
50
56
  end
51
57
 
52
58
  def link_to_delete(resource, options = {})
53
- url = options[:url] || object_url(resource)
54
- options[:class] = %w(btn-sm btn-danger)
55
- options[:data] ||= {}
56
- options[:data][:method] ||= :delete
57
- options[:data][:confirm] ||= resource&.content_header_title ? t('admin.ujs_confirm.delete', o: resource.content_header_title) : t('admin.ujs_confirm.default')
58
- link_to fa_icon(:trash), url, options
59
+ if can? :destroy, resource
60
+ url = options[:url] || object_url(resource)
61
+ options[:class] = %w(btn-sm btn-danger)
62
+ options[:data] ||= {}
63
+ options[:data][:method] ||= :delete
64
+ options[:data][:confirm] ||= resource&.content_header_title ? t('admin.ujs_confirm.delete', o: resource.content_header_title) : t('admin.ujs_confirm.default')
65
+ link_to fa_icon(:trash), url, options
66
+ end
59
67
  end
60
68
 
61
69
  def link_to_return(options = {})
62
- url = options[:url] || collection_url
63
- options[:class] = %w(btn btn-default)
64
- link_to t('admin.actions.return'), url, options
70
+ if can? :index, @object.class
71
+ url = options[:url] || collection_url
72
+ options[:class] = %w(btn btn-default)
73
+ link_to t('admin.actions.return'), url, options
74
+ end
65
75
  end
66
76
  end
67
77
  end
@@ -0,0 +1,40 @@
1
+ module Cdx
2
+ class Ability
3
+ include CanCan::Ability
4
+
5
+ class_attribute :abilities
6
+ self.abilities = Set.new
7
+
8
+ def self.register_ability(ability)
9
+ abilities.add(ability)
10
+ end
11
+
12
+ def self.remove_ability(ability)
13
+ abilities.delete(ability)
14
+ end
15
+
16
+ def initialize(user, controller_namespace, current_site = Site.current)
17
+ clear_aliased_actions
18
+
19
+ if controller_namespace == 'Cdx::Admin'
20
+
21
+ if user.is_admin?
22
+ can :manage, :all
23
+ end
24
+
25
+ else
26
+
27
+ end
28
+
29
+ Ability.abilities.merge(abilities_to_register).each do |clazz|
30
+ merge clazz.new(user, controller_namespace, current_site)
31
+ end
32
+ end
33
+
34
+ private
35
+
36
+ def abilities_to_register
37
+ []
38
+ end
39
+ end
40
+ end
@@ -1,5 +1,7 @@
1
1
  module Cdx
2
2
  class ApplicationRecord < ActiveRecord::Base
3
3
  self.abstract_class = true
4
+
5
+ extend Cdx::AttachmentMacros
4
6
  end
5
7
  end
@@ -0,0 +1,11 @@
1
+ module Cdx
2
+ class Asset::Seo::OgImage < Asset
3
+ has_attached_file :attachment,
4
+ styles: { thumb: '600x315^', regular: '1200x630^' },
5
+ url: '/cdx/seo/og_image/:id/:style/:basename.:extension',
6
+ path: ':rails_root/public/cdx/seo/og_image/:id/:style/:basename.:extension',
7
+ convert_option: { all: '-strip -crop -gravity center -auto-orient' }
8
+
9
+ include Cdx::ImageAsset
10
+ end
11
+ end
@@ -2,6 +2,7 @@ module Cdx
2
2
  class Page < ApplicationRecord
3
3
  include Cdx::Resourceable
4
4
  include Cdx::Publishable
5
+ include Cdx::SeoSupport
5
6
 
6
7
  extend FriendlyId
7
8
 
@@ -0,0 +1,22 @@
1
+ module Cdx
2
+ class Seo < ApplicationRecord
3
+ belongs_to :record, polymorphic: true, optional: true
4
+
5
+ # Assets
6
+ has_one_attached :og_image, 'Asset::Seo::OgImage'
7
+
8
+ store_accessor :meta, :meta_title, :meta_description, :meta_keywords, :meta_canonical
9
+ store_accessor :og, :og_title, :og_description, :og_keywords, :og_video
10
+
11
+ after_validation :normalize_blank_values
12
+
13
+ def normalize_blank_values
14
+ attributes['meta'].each do |column, value|
15
+ self['meta'][column].present? || (self['meta'][column] = nil)
16
+ end
17
+ attributes['og'].each do |column, value|
18
+ self['og'][column].present? || (self['og'][column] = nil)
19
+ end
20
+ end
21
+ end
22
+ end
@@ -1,5 +1,11 @@
1
1
  module Cdx
2
2
  class Setting < ApplicationRecord
3
+ include Cdx::SeoSupport
4
+
5
+ # Constants
6
+
7
+ AVAILABLE_THEMES = %w(black-light black blue-light blue green-light green purple-light purple red-light red yellow-light yellow).freeze
8
+
3
9
  # Validators
4
10
 
5
11
  validates :acronym, :default_theme, :default_locale, presence: true
@@ -15,7 +21,7 @@ module Cdx
15
21
  end
16
22
 
17
23
  def self.current
18
- Setting.first_or_create(acronym: 'CDX', default_theme: 'yellow', default_locale: 'en', available_locales: %w(en fr es))
24
+ Setting.first_or_create(acronym: 'CDX', default_theme: AVAILABLE_THEMES.last, default_locale: 'en', available_locales: Cdx.available_locales)
19
25
  end
20
26
  end
21
27
  end