cally 1.0.0

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 (503) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +3 -0
  4. data/Rakefile +37 -0
  5. data/app/assets/javascripts/cally/application.js +38 -0
  6. data/app/assets/javascripts/cally/invitations.js +2 -0
  7. data/app/assets/javascripts/cally/session.js +2 -0
  8. data/app/assets/javascripts/cally/users.js +2 -0
  9. data/app/assets/stylesheets/cally/_mixins.scss +7 -0
  10. data/app/assets/stylesheets/cally/_variables.scss +8 -0
  11. data/app/assets/stylesheets/cally/application.scss +16 -0
  12. data/app/assets/stylesheets/cally/invitations.scss +4 -0
  13. data/app/assets/stylesheets/cally/main.scss +88 -0
  14. data/app/assets/stylesheets/cally/session.scss +4 -0
  15. data/app/assets/stylesheets/cally/users.scss +4 -0
  16. data/app/controllers/cally/application_controller.rb +9 -0
  17. data/app/controllers/cally/invitations_controller.rb +122 -0
  18. data/app/controllers/cally/session_controller.rb +40 -0
  19. data/app/controllers/cally/users_controller.rb +292 -0
  20. data/app/helpers/cally/application_helper.rb +30 -0
  21. data/app/helpers/cally/invitations_helper.rb +4 -0
  22. data/app/helpers/cally/session_helper.rb +4 -0
  23. data/app/helpers/cally/users_helper.rb +4 -0
  24. data/app/models/cally/application_record.rb +3 -0
  25. data/app/models/cally/invitation.rb +8 -0
  26. data/app/models/cally/user.rb +13 -0
  27. data/app/views/cally/invitations/index.html.erb +30 -0
  28. data/app/views/cally/invitations/new.html.erb +20 -0
  29. data/app/views/cally/shared/_errors.html.erb +6 -0
  30. data/app/views/cally/shared/_header.html.erb +25 -0
  31. data/app/views/cally/shared/_messages.html.erb +7 -0
  32. data/app/views/cally/users/ask_security_question.html.erb +19 -0
  33. data/app/views/cally/users/edit.html.erb +45 -0
  34. data/app/views/cally/users/forgot_password.html.erb +15 -0
  35. data/app/views/cally/users/index.html.erb +32 -0
  36. data/app/views/cally/users/login.html.erb +22 -0
  37. data/app/views/cally/users/new.html.erb +40 -0
  38. data/app/views/cally/users/old_reset_password.html.erb +3 -0
  39. data/app/views/cally/users/reset.html.erb +26 -0
  40. data/app/views/cally/users/show.html.erb +16 -0
  41. data/app/views/layouts/cally/application.html.erb +16 -0
  42. data/config/initializers/time_formats.rb +1 -0
  43. data/config/routes.rb +24 -0
  44. data/db/migrate/20170902103230_create_cally_users.rb +17 -0
  45. data/db/migrate/20170919060132_add_security_question_answer.rb +8 -0
  46. data/db/migrate/20170923052040_create_cally_invitations.rb +9 -0
  47. data/db/migrate/20170925115607_add_sent_to_invitations.rb +5 -0
  48. data/lib/cally/engine.rb +31 -0
  49. data/lib/cally/methods.rb +58 -0
  50. data/lib/cally/version.rb +3 -0
  51. data/lib/cally.rb +5 -0
  52. data/lib/tasks/cally_tasks.rake +4 -0
  53. data/test/cally_test.rb +7 -0
  54. data/test/controllers/cally/invitations_controller_test.rb +13 -0
  55. data/test/controllers/cally/session_controller_test.rb +13 -0
  56. data/test/controllers/cally/users_controller_test.rb +13 -0
  57. data/test/dummy/README.rdoc +28 -0
  58. data/test/dummy/Rakefile +6 -0
  59. data/test/dummy/app/assets/javascripts/application.js +13 -0
  60. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  61. data/test/dummy/app/controllers/application_controller.rb +5 -0
  62. data/test/dummy/app/helpers/application_helper.rb +2 -0
  63. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  64. data/test/dummy/bin/bundle +3 -0
  65. data/test/dummy/bin/rails +4 -0
  66. data/test/dummy/bin/rake +4 -0
  67. data/test/dummy/bin/setup +29 -0
  68. data/test/dummy/config/application.rb +26 -0
  69. data/test/dummy/config/boot.rb +5 -0
  70. data/test/dummy/config/database.yml +25 -0
  71. data/test/dummy/config/environment.rb +5 -0
  72. data/test/dummy/config/environments/development.rb +41 -0
  73. data/test/dummy/config/environments/production.rb +79 -0
  74. data/test/dummy/config/environments/test.rb +42 -0
  75. data/test/dummy/config/initializers/assets.rb +11 -0
  76. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  77. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  78. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  79. data/test/dummy/config/initializers/inflections.rb +16 -0
  80. data/test/dummy/config/initializers/mime_types.rb +4 -0
  81. data/test/dummy/config/initializers/session_store.rb +3 -0
  82. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  83. data/test/dummy/config/locales/en.yml +23 -0
  84. data/test/dummy/config/routes.rb +4 -0
  85. data/test/dummy/config/secrets.yml +22 -0
  86. data/test/dummy/config.ru +4 -0
  87. data/test/dummy/db/development.sqlite3 +0 -0
  88. data/test/dummy/db/schema.rb +40 -0
  89. data/test/dummy/db/test.sqlite3 +0 -0
  90. data/test/dummy/log/development.log +1038 -0
  91. data/test/dummy/log/test.log +15901 -0
  92. data/test/dummy/public/404.html +67 -0
  93. data/test/dummy/public/422.html +67 -0
  94. data/test/dummy/public/500.html +66 -0
  95. data/test/dummy/public/favicon.ico +0 -0
  96. data/test/dummy/tmp/cache/assets/sprockets/v3.0/-7/-7G6Wtrr_8yiWKMdQBCxG0EJiox04WdFTfQUZHqtBLY.cache +0 -0
  97. data/test/dummy/tmp/cache/assets/sprockets/v3.0/-U/-Uwnls2PzR4N2AVywr0B9O0jwhJonFkuBkdIg752e94.cache +0 -0
  98. data/test/dummy/tmp/cache/assets/sprockets/v3.0/-e/-ePnkBqNZBkQXLLrT8krdPAVFf35WcPxkzHi3nbIzNQ.cache +0 -0
  99. data/test/dummy/tmp/cache/assets/sprockets/v3.0/-s/-si288ORc48rxqOegeAnVE4yil1jO5-Go6mX7HgcvCE.cache +0 -0
  100. data/test/dummy/tmp/cache/assets/sprockets/v3.0/03/03GiQLFnqA9kZtSCxF3F4Nb8GEyjSN_gdGQ-lRirBj0.cache +4 -0
  101. data/test/dummy/tmp/cache/assets/sprockets/v3.0/05/05m4Gozfb11gItFHEmwtEwpxauwKUrngD6ivZifiSF4.cache +1 -0
  102. data/test/dummy/tmp/cache/assets/sprockets/v3.0/09/09zys8qWv9drSk0oTdU2b6nyr584aE9_SqxQdjpl1ZQ.cache +0 -0
  103. data/test/dummy/tmp/cache/assets/sprockets/v3.0/0E/0EEpWcr4GYho-99elTJe7nl-tF-2pj78HgS585r9iP0.cache +0 -0
  104. data/test/dummy/tmp/cache/assets/sprockets/v3.0/0F/0FqVj1sw_LtM6RrTkVkIUbJUtC6ROVOgyih29KMmUeY.cache +1 -0
  105. data/test/dummy/tmp/cache/assets/sprockets/v3.0/0X/0XMOKMw_z_7uyNxySrxXT8T9HsNrXOrufs0tDm9Gx2k.cache +1 -0
  106. data/test/dummy/tmp/cache/assets/sprockets/v3.0/0d/0di8plHB-vEGG0k-Uo7uYUsGlyrGzEFCyBRHyaS73og.cache +0 -0
  107. data/test/dummy/tmp/cache/assets/sprockets/v3.0/0y/0y_zbw0TUL872-x0Vw1q8VWAxV-gR5EOE_jAO4a9IVo.cache +4 -0
  108. data/test/dummy/tmp/cache/assets/sprockets/v3.0/17/17Sw-XgYreb2bcJUTjjtuynxxmW2UbWPS0Aepnm3lSg.cache +2 -0
  109. data/test/dummy/tmp/cache/assets/sprockets/v3.0/19/19ukIrK3XwJQV4nBV3Xjheue5HdK_ymu62td7Prbaqs.cache +2 -0
  110. data/test/dummy/tmp/cache/assets/sprockets/v3.0/1M/1MjUUC107hkbTCWYS_5eE0TnGM1C30y_OfDJhNFVk9A.cache +0 -0
  111. data/test/dummy/tmp/cache/assets/sprockets/v3.0/1Z/1Zf2BAr-hjyN2mmVW6IFnexp_A8HrzuvpyewyL-uZPY.cache +0 -0
  112. data/test/dummy/tmp/cache/assets/sprockets/v3.0/1n/1nuVLOfiyH9EIXrxTGHDycK62eGIp70A6b8WaIr7DXo.cache +1 -0
  113. data/test/dummy/tmp/cache/assets/sprockets/v3.0/22/22JbkVwfRZZ1ed7r8946IIcyjRsKW8gRe8uIALVoYD8.cache +1 -0
  114. data/test/dummy/tmp/cache/assets/sprockets/v3.0/2V/2VAzjA4TmNG4aBl4oCR6f7YE6nkAALdG7dw08wjJeE8.cache +1 -0
  115. data/test/dummy/tmp/cache/assets/sprockets/v3.0/2Y/2Y0QzeBE_3R2-qSU6uIWfxvQv1FzN9X5hX8PKZ0fpHo.cache +0 -0
  116. data/test/dummy/tmp/cache/assets/sprockets/v3.0/2l/2lDAJ7SJL4CfRFfuaxpJdo6wDGD24AfuwsOwtiMdLsc.cache +0 -0
  117. data/test/dummy/tmp/cache/assets/sprockets/v3.0/2x/2xFqoJ5964o6LRNOvnhlPWhHuEk53wfpCEw7THtXzAk.cache +0 -0
  118. data/test/dummy/tmp/cache/assets/sprockets/v3.0/32/32hYcy6WF98nG_Vz24VTrg8aN5IFAt2Q-vL3HsU74Ys.cache +1 -0
  119. data/test/dummy/tmp/cache/assets/sprockets/v3.0/3B/3B6E3xp77y6iJdPuRE3L3nvIt4CCJL8uyHhdkvvyVig.cache +0 -0
  120. data/test/dummy/tmp/cache/assets/sprockets/v3.0/3I/3Id57bA0lTkLBdBYcD_z1Nc_1aet1ocpNMQZxAMGZh0.cache +1 -0
  121. data/test/dummy/tmp/cache/assets/sprockets/v3.0/3N/3NKjgXP1aV0BydAY6HEqWAmZzjIIw-_imoB-y9qfx2s.cache +0 -0
  122. data/test/dummy/tmp/cache/assets/sprockets/v3.0/3S/3SBpCYLkoVny3FMehURZgL4KroeAvd7FnfU48mC9amk.cache +0 -0
  123. data/test/dummy/tmp/cache/assets/sprockets/v3.0/45/45yxc8XkudsEIfAj9-wJbszPtOlTPFHbcY_PhlcF9MA.cache +0 -0
  124. data/test/dummy/tmp/cache/assets/sprockets/v3.0/46/46pqmzFZhb6ihJ8pK8-jySxrRYCPrmDPCVZtQoa0gHU.cache +0 -0
  125. data/test/dummy/tmp/cache/assets/sprockets/v3.0/4C/4CTXZOGWyOAqY7fKlvYPxStOGBvkPngIzeOI_SnuFVw.cache +0 -0
  126. data/test/dummy/tmp/cache/assets/sprockets/v3.0/4P/4PxwQEE2flmw_sZgpwjsf1qt4Nh5eZYnGmmBaUmW9T4.cache +0 -0
  127. data/test/dummy/tmp/cache/assets/sprockets/v3.0/4X/4XKOS17iavBJwiSAYpiLKOsKohqn3ya3JRmCIEKUnQE.cache +0 -0
  128. data/test/dummy/tmp/cache/assets/sprockets/v3.0/4_/4_6gozIttBNwRAZiuvPdbJtHTJCP5tQqN6d_i34b4RM.cache +0 -0
  129. data/test/dummy/tmp/cache/assets/sprockets/v3.0/4g/4gxcHBuhaJYSHh09Yp8TSWgaRd3OevKbmzjSh8uL77U.cache +0 -0
  130. data/test/dummy/tmp/cache/assets/sprockets/v3.0/57/57h3gS0UDTegyWV5uNTXiNWclqPmQptiOLGHWArpmTI.cache +0 -0
  131. data/test/dummy/tmp/cache/assets/sprockets/v3.0/5L/5Lly_CA8DZvPhQV2jDQx-Y6P_y3Ygra9t5jfSlGhHDA.cache +0 -0
  132. data/test/dummy/tmp/cache/assets/sprockets/v3.0/5M/5MbBRAfsyzv9U6UZ--LwvIo4mzf11XlGiytvVvMZSHI.cache +0 -0
  133. data/test/dummy/tmp/cache/assets/sprockets/v3.0/5O/5OzIvbLg1yPzcH8lgRrMmMuriByL0fnL2yEdMpORnCs.cache +0 -0
  134. data/test/dummy/tmp/cache/assets/sprockets/v3.0/5l/5lCz4ZUXwGd4AE-1sAI_J7jY8c-yty_Yt2m17R17v64.cache +0 -0
  135. data/test/dummy/tmp/cache/assets/sprockets/v3.0/5q/5qm_wEIFUsv2zBFnis3NkdVesfTYrD07CQJ9w7MKNhI.cache +0 -0
  136. data/test/dummy/tmp/cache/assets/sprockets/v3.0/66/66BDSYZXfaTaFzShjFKozplRRznehvd3CU_vQd-st4o.cache +0 -0
  137. data/test/dummy/tmp/cache/assets/sprockets/v3.0/6C/6C2rbrWR5xHKr2qs6z4L8-WoABZ-g3j0i_4dJ7wNlfI.cache +1 -0
  138. data/test/dummy/tmp/cache/assets/sprockets/v3.0/6E/6EiuR9qYYi6ZYm6HyXRRKkJH0QQ6rcKGrfPDMvCvQZE.cache +1 -0
  139. data/test/dummy/tmp/cache/assets/sprockets/v3.0/6I/6IWnN51PzHE9hasZeoZMd64IOPlOb7T4tv5ZwQIiebI.cache +0 -0
  140. data/test/dummy/tmp/cache/assets/sprockets/v3.0/6I/6IlHTDcpN4U3SRWJBA38pK2K7HkweDGFPHkQ5teFTRY.cache +0 -0
  141. data/test/dummy/tmp/cache/assets/sprockets/v3.0/73/73eHSmgTTMpQqobtiVFbaKgMoaFrncRkfso7ixKJ_Ns.cache +0 -0
  142. data/test/dummy/tmp/cache/assets/sprockets/v3.0/7H/7HAuT2dlbhEkNo2KQg29AoEp7Tt05Ea37JhBkMNVN-k.cache +1 -0
  143. data/test/dummy/tmp/cache/assets/sprockets/v3.0/7H/7HG2ANFnibaQ69t0X6GKB6kE3AAAEVCm-19fFLOb7is.cache +1 -0
  144. data/test/dummy/tmp/cache/assets/sprockets/v3.0/7X/7XWkyke6asAc1FZH-sFbRPQotpOJX3C6QUUI2sd3aBM.cache +1 -0
  145. data/test/dummy/tmp/cache/assets/sprockets/v3.0/7j/7jhvqB7N9gHxWGePSDd5-g4MJbyalWCjNczeQObpiXA.cache +0 -0
  146. data/test/dummy/tmp/cache/assets/sprockets/v3.0/7p/7pFNTi_Q42DwJrPHVmdlgt22_7dHe3vnBk2wSuD56fA.cache +1 -0
  147. data/test/dummy/tmp/cache/assets/sprockets/v3.0/7p/7pYRGsQGpn9K6jQNc44lZhB5Jq4BKa5Cdrr02s4hKzs.cache +0 -0
  148. data/test/dummy/tmp/cache/assets/sprockets/v3.0/82/82KsptJhQon_5-h3AT2FG4ZsN_nNZmg_jP9bIQhh-Tg.cache +1 -0
  149. data/test/dummy/tmp/cache/assets/sprockets/v3.0/8A/8A88829RczEnPE79WTEui_P6eAd1udbiPW-eda6SS6Y.cache +1 -0
  150. data/test/dummy/tmp/cache/assets/sprockets/v3.0/8I/8Io6FnKGSYpxgU9zGdbs2ubhvJ1sL3_b6XVcceuFsoI.cache +0 -0
  151. data/test/dummy/tmp/cache/assets/sprockets/v3.0/8Q/8QFQ-Qlhn49f5Peuf6XWc73ZZVaX8qIPGk7I0kldp3I.cache +0 -0
  152. data/test/dummy/tmp/cache/assets/sprockets/v3.0/8i/8i465g3LM6IQI0UZ9fttuc7N1dqfNdmDmvyeBtUyNGc.cache +1 -0
  153. data/test/dummy/tmp/cache/assets/sprockets/v3.0/90/901xwPCxkRIytrNf3d_hbuQB2b2KOPoZ3hiWM56c6KI.cache +1 -0
  154. data/test/dummy/tmp/cache/assets/sprockets/v3.0/98/98NU1PFY8GjWUVNX5sRk-tCRQKuYIxCi-c6h9Jv0ST0.cache +1 -0
  155. data/test/dummy/tmp/cache/assets/sprockets/v3.0/9K/9Kd_RhHlTIPuP4Y-3qxXhlx49UxGAB15eBDjoGQ04Sw.cache +1 -0
  156. data/test/dummy/tmp/cache/assets/sprockets/v3.0/9a/9aMuRkW0rgbT4sYxhD_0wsSEYBWb_KMK6yfZEW1MpZc.cache +1 -0
  157. data/test/dummy/tmp/cache/assets/sprockets/v3.0/9c/9cHFFa1beEqMoKW1pzMqWq_v6I0EXAGIMMKXQkNeKzg.cache +0 -0
  158. data/test/dummy/tmp/cache/assets/sprockets/v3.0/9v/9v-9369ghnnYHf1e_4Lx0spzDVR_mRsHGQW7we1Pi1w.cache +0 -0
  159. data/test/dummy/tmp/cache/assets/sprockets/v3.0/9z/9zQ1-NDC-YIiM3go53dU8BLvb5hWsPwCm_IUdXlIrTQ.cache +0 -0
  160. data/test/dummy/tmp/cache/assets/sprockets/v3.0/A3/A3tbqCf8PBKD3foE0Y1XP5bNoS_arjVTJmQiSO-Sf1E.cache +1 -0
  161. data/test/dummy/tmp/cache/assets/sprockets/v3.0/A8/A8c83jY89kUuv1RfMpfKTj3UqZBUQ6OssOYGtlIYMlA.cache +0 -0
  162. data/test/dummy/tmp/cache/assets/sprockets/v3.0/AB/ABzlcTo6qgW_1Bq_YoKWz64m54uVQh1_KGbG9HoWmlM.cache +0 -0
  163. data/test/dummy/tmp/cache/assets/sprockets/v3.0/AG/AG2Uz4-X_5r8eFalp4HFxUd1zYJ9ZFtC7IIkK6uoFA0.cache +0 -0
  164. data/test/dummy/tmp/cache/assets/sprockets/v3.0/AS/ASZ8cNw59CwVjZrG0fzR7dNXGjYA8fNR_Hez6fg51kM.cache +0 -0
  165. data/test/dummy/tmp/cache/assets/sprockets/v3.0/AX/AX23agVTSYHlc1N-cGfBbFM991Zhqzl2KT00yr3A5bc.cache +0 -0
  166. data/test/dummy/tmp/cache/assets/sprockets/v3.0/AZ/AZCRXIDuLQO2JukxYBqkkzogge8wOSuRLahJXAxMJtE.cache +0 -0
  167. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Am/AmgnVafQQ9zA64gIpQWq1iN3tqG5GeB21X8SOhLY1lg.cache +0 -0
  168. data/test/dummy/tmp/cache/assets/sprockets/v3.0/BW/BWGrNF_DDTaXJWZw8cdsDE54J3wJ-DA7ZvRUfAEODos.cache +1 -0
  169. data/test/dummy/tmp/cache/assets/sprockets/v3.0/BX/BXkOmbjjbpmKEH5lXHRFkGVcWj3Pw8eTh5Mt5fkGCjg.cache +1 -0
  170. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Ba/BaO8PIlUiC0-47Q2sg7FDbpSXPQPnOVd2JuCorlGgLE.cache +1 -0
  171. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Bg/BgOENKeIuC13vgNRY9nt_j5Qh5E_MiQuxc1xyC3tA54.cache +1 -0
  172. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Bu/BuP162RZ2NFdJOFXzR_-K4UlJe9rPho2savQpesx-WM.cache +0 -0
  173. data/test/dummy/tmp/cache/assets/sprockets/v3.0/CF/CFFOyZ_E9negEK8MBohmlEyV-ogoh7trLI2IMIa5Mb0.cache +1 -0
  174. data/test/dummy/tmp/cache/assets/sprockets/v3.0/CG/CGKyUSYgc7NDw8o-XG1qHZJn4ndGmekQ-VWLr9HQhUg.cache +0 -0
  175. data/test/dummy/tmp/cache/assets/sprockets/v3.0/CU/CUjfOnHrBo4VBNotuh5hs-9YI3xyNIdEuj3BReTuxVg.cache +1 -0
  176. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Cj/CjDJtUDDWpQpH-0rqAaG2ARWwckP2vlqH14s-t6ZyWE.cache +1 -0
  177. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Ck/CkgeqiNEUyqDGDUJ3fQtQLzqVzNvABO0FY4FAvfo90Q.cache +1 -0
  178. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Cr/CrVCW6RqL1hRhBTt047U0-GKC9IrroFAgD1XgS6xoK0.cache +1 -0
  179. data/test/dummy/tmp/cache/assets/sprockets/v3.0/DO/DOsCAmCkFAyLYNkRycwi5d6p-BU-uwrlt4N4V9DNhpA.cache +1 -0
  180. data/test/dummy/tmp/cache/assets/sprockets/v3.0/DR/DR40lRJvw776QND_UlCOK6iV3lbRG6vt3wIaRnbDf_Y.cache +0 -0
  181. data/test/dummy/tmp/cache/assets/sprockets/v3.0/DU/DUImv_hPtH05drJpNXYTuGo3wjm0Ez1Om0ti-Vt_KKk.cache +0 -0
  182. data/test/dummy/tmp/cache/assets/sprockets/v3.0/DY/DY__lvkCJmChGheQVztjJEqVDgFOCjLVNBLlJsMqx8g.cache +1 -0
  183. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Du/DuESbvVEY5Wc8rKpt7UPFGrGq-RC4gP2XAvy-2OvQb0.cache +1 -0
  184. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Du/DuzBEWYl0ZkT9klbp1gq_nNr2dgfufqgBg1-RrMcylo.cache +1 -0
  185. data/test/dummy/tmp/cache/assets/sprockets/v3.0/EQ/EQgBIQrVxkiFz0pHZJv_HA9OfVLlzmR9SEvPoNX5Mwg.cache +0 -0
  186. data/test/dummy/tmp/cache/assets/sprockets/v3.0/EU/EUwGYTFxLSlkXqzM-GUNfvA8O8UfxQ986rSHL48BK_Q.cache +1 -0
  187. data/test/dummy/tmp/cache/assets/sprockets/v3.0/EV/EVpB7wcjBRrHkQMLbldAdRfTZI_E-6i3wXZHDncFgG4.cache +0 -0
  188. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Ee/EeFTb5oXLeaD_BHJeCWaSgXy-5Qdjr--WNLQMg-R9Zg.cache +0 -0
  189. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Ep/EpjVzEujnF91QLHExWOdbgnojGR9x42q2EN-wp_hb7g.cache +0 -0
  190. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Er/ErXtTZqBAeNJSFkTFM1q-wX1GtvnVM0tvUd5q6oU93c.cache +0 -0
  191. data/test/dummy/tmp/cache/assets/sprockets/v3.0/F-/F-jKvQYOLVtImcbbnTeSGLUDFgEq-cdcWZ3eKFtUhzA.cache +1 -0
  192. data/test/dummy/tmp/cache/assets/sprockets/v3.0/F6/F6YPDW0Ew0cFgQLUVbLIJwd2ajod5AP-LExOGkshKw8.cache +4 -0
  193. data/test/dummy/tmp/cache/assets/sprockets/v3.0/FP/FP-c4FCvr_TKyF_qfQz9Yo4_r04shuXTD0TMnf-qdNM.cache +0 -0
  194. data/test/dummy/tmp/cache/assets/sprockets/v3.0/FR/FRuIOo50wQni1xZYYbuoUS3oJAbGB3mEyqxWUd_r4GU.cache +0 -0
  195. data/test/dummy/tmp/cache/assets/sprockets/v3.0/FT/FTIoN4W5vLeul591kJW8z7dI3CoGYfwZgi6SxlSJ05A.cache +0 -0
  196. data/test/dummy/tmp/cache/assets/sprockets/v3.0/FX/FXSFmhM7DFCk2hvfzGKfx30mUagBnUKqwWU6mheQDcA.cache +0 -0
  197. data/test/dummy/tmp/cache/assets/sprockets/v3.0/GC/GCv3L9-77LNTLW3aNRBkVZqrd0Kd2YQCd-FH8SbjD8U.cache +0 -0
  198. data/test/dummy/tmp/cache/assets/sprockets/v3.0/GQ/GQal8OrQgbO81hndXJfU1isgidDq6K9u2nd5haxRW0s.cache +1 -0
  199. data/test/dummy/tmp/cache/assets/sprockets/v3.0/GV/GVsv-w8hgKBcvyO-cEI0EeK7O2Z_SnPQlqpVcbehBlo.cache +1 -0
  200. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Gb/Gb19qJYhribJAD1Wsk_RdE3oBGzWCryAykNnB7DFxwg.cache +0 -0
  201. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Gs/GsMim5xNkenLDFS3Uw391XgtdTTuH_JyaNYcMui0i1c.cache +0 -0
  202. data/test/dummy/tmp/cache/assets/sprockets/v3.0/H3/H3qnNJUhSoxPm9HKhQjdQH7GCyRg06un-_qu5l3iUqY.cache +0 -0
  203. data/test/dummy/tmp/cache/assets/sprockets/v3.0/HO/HOkwKduc2ZqR7mW1qShz_kd2AYPmf2eEQ88ZioUScac.cache +1 -0
  204. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Hj/HjDY_uypE87cGMJcoVreQw_NUO3R_4gP3UVWdbVliMo.cache +6 -0
  205. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Hp/HpVlYITvQpmtSXF4rMrVXVHEfQJkPW8S0CvCEPClTmc.cache +1 -0
  206. data/test/dummy/tmp/cache/assets/sprockets/v3.0/IC/ICHZHvSMw-uY4XPT_Z3ygQmqNMFV6IwMy-7AHUWmJcU.cache +0 -0
  207. data/test/dummy/tmp/cache/assets/sprockets/v3.0/I_/I_igYq6hRehfmJxy2GeTOmU4skX3vFwkkOMD0M_uoFQ.cache +0 -0
  208. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Ic/Ic9RezxoQ6zj4bT2zj3LtsXKi_dAQkB7fQNzJBWh0FE.cache +0 -0
  209. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Ii/Iisx0qwGLaiQf2R4lD-YQ_rHsUU0ReQ-Fnq3VEbZMwM.cache +0 -0
  210. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Iu/IuqW5_Az56Zq79oQmnxdtYHZbfP9jrSTTTOEP3e6lYI.cache +0 -0
  211. data/test/dummy/tmp/cache/assets/sprockets/v3.0/JW/JWwENKuFOpcdSHGdAgcUZVz82Njz3Pjm6wgvsA9l4bc.cache +0 -0
  212. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Jf/JfFhfQaT_K7WDMpQqKnoQxZJJajIOPxh5uPJIvx_iW8.cache +0 -0
  213. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Jm/Jm804vwqbO_dR0OA9orvLx5XyLiNQY5S6leYxumTgos.cache +0 -0
  214. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Jn/JnOOowKR1rMUOgInbYB61wlY2gxTjJreeMWttv0wT4s.cache +1 -0
  215. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Jy/JyMeO34a-3yk4N4dWGsVglmJi6o4h0G2NNUKj_G5RiI.cache +0 -0
  216. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Jy/JyyPIaV0_YJrzC7jW3a1oWBFC_rk1ThRn-JRPotECoc.cache +0 -0
  217. data/test/dummy/tmp/cache/assets/sprockets/v3.0/K1/K1lHNHIJrEnoIEJkrTqEIftLJB6mPdGzdsLOeeIXHfg.cache +1 -0
  218. data/test/dummy/tmp/cache/assets/sprockets/v3.0/KR/KREri62j0WX1oMPw5yGFVZPB6OcEp254T7-7pbxxuNI.cache +0 -0
  219. data/test/dummy/tmp/cache/assets/sprockets/v3.0/KT/KTioNwNDHJX61P1k7Y2eu6nCjE49V81SA-KWcJfpiyY.cache +0 -0
  220. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Ko/KoX-2FnyAynV76TTiTBBS8OIlq5DSDptRzNh6FR4yZc.cache +0 -0
  221. data/test/dummy/tmp/cache/assets/sprockets/v3.0/LA/LAbBaAZol_QoJ8WKo9ShsWfL7TycARx0pThht_TSPFM.cache +0 -0
  222. data/test/dummy/tmp/cache/assets/sprockets/v3.0/LI/LI6J9U5x4Rdnla4Xu6vvTdxPFiskPDIn7X-YKOAjV5s.cache +2 -0
  223. data/test/dummy/tmp/cache/assets/sprockets/v3.0/LP/LP-iBiX4yMwlD-ONUaXKobqMwK0E5m9V5qGhEFmScio.cache +1 -0
  224. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Lb/LboXdHbQbIUFLB3RD6rSrZHjulv_JB9MObCkYCA_XwU.cache +1 -0
  225. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Le/LeUti6cCqMQjZ6OEiT85AvsHQCE1LKgEgzKMpG1NJ8U.cache +0 -0
  226. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Lx/Lxg5sYdRUUjZTpQgz-Vds7N_ZZHmAOjiYChfAhIo4oc.cache +1 -0
  227. data/test/dummy/tmp/cache/assets/sprockets/v3.0/M1/M1iYk9DF4a5SgOHB5_VIED5Jqf_NSiUHohtQsSvY_gg.cache +0 -0
  228. data/test/dummy/tmp/cache/assets/sprockets/v3.0/MD/MDeSUGV5_X4t5Aby7auBfnolxieYKDI1u0CZ_02Um3s.cache +1 -0
  229. data/test/dummy/tmp/cache/assets/sprockets/v3.0/ME/MEH8JP05__fj9Dl5JfaSHyEA1hhmz0c7VmvJO2p4bYA.cache +1 -0
  230. data/test/dummy/tmp/cache/assets/sprockets/v3.0/ME/MEbUHElyIvSY88yrMNTF9e4DvZRcyxcIGkOEOgJ-BaM.cache +0 -0
  231. data/test/dummy/tmp/cache/assets/sprockets/v3.0/ME/MEwCV-LGlfnry2yYcGr9iWkb4ooWqhHdxS4pomCj1cQ.cache +1 -0
  232. data/test/dummy/tmp/cache/assets/sprockets/v3.0/MM/MMsUW9UrxCgfSLc7OkKTT4gdwlY-0FaLUdTXE6Z6Y_8.cache +0 -0
  233. data/test/dummy/tmp/cache/assets/sprockets/v3.0/MN/MNaoy4WQL0zrvfJYSxujVFUA60y0wofKdnLH37IAukw.cache +0 -0
  234. data/test/dummy/tmp/cache/assets/sprockets/v3.0/MY/MYPwjmRrwAmRpV8eEyzDY8CCyP-uHG1utvuXIBnEhCk.cache +0 -0
  235. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Mt/MtwPKDCtC9lvbauqPD7fuNcvgAkQi7Ng1F_ZssDCqzo.cache +0 -0
  236. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Mz/MzvODkrDRMS_CzXRWV10z7NEbQOV5_eQUxbZfp4Zzkw.cache +1 -0
  237. data/test/dummy/tmp/cache/assets/sprockets/v3.0/N6/N6zpiqdQQnMdbqKvaLmtCMaOnkGYPA52wXxffhnfJaM.cache +1 -0
  238. data/test/dummy/tmp/cache/assets/sprockets/v3.0/N7/N79h8uQX-MWoujeZow1E4xo5Xi7IqEeB9gn6iQarpkc.cache +1 -0
  239. data/test/dummy/tmp/cache/assets/sprockets/v3.0/NF/NFijgfc0LvmjZ689j7MsJgtKVHu-IlHFP_R13niGrLQ.cache +0 -0
  240. data/test/dummy/tmp/cache/assets/sprockets/v3.0/NJ/NJK1KazpzW0Anm3B_nTckSvtXyBqFfORej3pNEZDniw.cache +1 -0
  241. data/test/dummy/tmp/cache/assets/sprockets/v3.0/NR/NRRbPerBBa96LrsGXRV2T73SJLzOh_tCOIMo6at8Sfo.cache +1 -0
  242. data/test/dummy/tmp/cache/assets/sprockets/v3.0/NW/NWaLqZwAexRQYCPJcGXjr1loYBFnqoQX_n3k08dFBYU.cache +1 -0
  243. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Ng/NgvyaorbzP2UMgUB8PxbKJJn6wxpB0T4CSGRQscID1g.cache +2 -0
  244. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Nj/NjTdYgBwfn3XL1KK8PTZRy0TnIBcJpLib7qD7LGhgrs.cache +0 -0
  245. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Nu/NuFzfzvfnZqMXJHDK7tldK83dEbdFTYnVS9cnZE0KUA.cache +2 -0
  246. data/test/dummy/tmp/cache/assets/sprockets/v3.0/OF/OFmomy8soPqiR5Id8O_1uAbO12bJMf5C5tEhnJ1z03o.cache +0 -0
  247. data/test/dummy/tmp/cache/assets/sprockets/v3.0/OI/OI6uxGcnsKavdWTtwDAasU3wPx8QXhzBgV0X2n1KjMQ.cache +0 -0
  248. data/test/dummy/tmp/cache/assets/sprockets/v3.0/OI/OIOjGye-6IX32OhiDKgjIYJVVJIYL4YwWqXRQ1OuqOc.cache +0 -0
  249. data/test/dummy/tmp/cache/assets/sprockets/v3.0/OI/OIRj9DmXbwJfdvq3ZcPBfKDaXvzgzLCMmr-WVYOGjqA.cache +1 -0
  250. data/test/dummy/tmp/cache/assets/sprockets/v3.0/OR/ORoV6obevLekkwRkLgC6L86OJ0Hjc_fpHBW0z60lc5s.cache +4 -0
  251. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Od/OdsK_qqQmrZKTVMCDz3AplqVUzYA5IM19_-qOojJBOs.cache +2 -0
  252. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Oe/OeE1-fbXi1sTigNTlRhpnn5FVeZ2ZGGJRm9VXsbdlqM.cache +1 -0
  253. data/test/dummy/tmp/cache/assets/sprockets/v3.0/PA/PA8AAiF1X93v5x_Ng7P9_PhpcJ7PHU8iYqlRO27kIdo.cache +1 -0
  254. data/test/dummy/tmp/cache/assets/sprockets/v3.0/PO/POCKZGPBJr9661YN7ByNBsEddLYmt0Z7bAd82H3PwvA.cache +0 -0
  255. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Pi/Pi3Gagdd4crGUlbMg7JotJdph56agNF9f1mpZ_1zHXk.cache +1 -0
  256. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Pi/Pi4wp9ATng9qVjCiPosZnE69hsj5FrdIxtV2-wYcbXg.cache +0 -0
  257. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Pl/PlgdDzT3L-fX8DaDVuQ_At7zZykia94W7YEMfq6h7TE.cache +1 -0
  258. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Pm/Pmazs6NeGR5UPAoGWZRMbrHPHNDFtOPI3T6NZ2fxBE0.cache +1 -0
  259. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Pv/PvLeNwiihL7rwWXxI8FEftbWxeLSI9afkpyENaTG59Q.cache +0 -0
  260. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Py/PyVDfQbq1TjIvxpdIkpf5g--7_VZLZ5qBkbWo4vVhWc.cache +0 -0
  261. data/test/dummy/tmp/cache/assets/sprockets/v3.0/QB/QBGJ7zMlylmAgUKfrM9Dxuk7XJDKRYImcNS747eZwko.cache +1 -0
  262. data/test/dummy/tmp/cache/assets/sprockets/v3.0/QE/QE-jnb1fHSfnQk20hkCGzeL5eUIm8hPw6n4YSH-gtDc.cache +1 -0
  263. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Qa/QazUodDbBO086k_a3nmyi_xN2PsQAEh5lnT_6nzlDWk.cache +0 -0
  264. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Qw/QwohFtENHOM2ECLCFvikh4lSrlOvsS3WRcBLIHSkeSs.cache +0 -0
  265. data/test/dummy/tmp/cache/assets/sprockets/v3.0/R5/R5WyetYDFOD2B6uqV1_JlTWm8HXlU48uPtoVYuoaI0o.cache +1 -0
  266. data/test/dummy/tmp/cache/assets/sprockets/v3.0/RB/RBs59Tbwcium1lGEm-v8YEgRMThgSl6iRKQVpMrt1tc.cache +0 -0
  267. data/test/dummy/tmp/cache/assets/sprockets/v3.0/RP/RPEPkpOFGpjwBtvkLKSOXpShVDnrIN0FBDt6UD3C6Jg.cache +0 -0
  268. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Rx/Rxv7EbPk0KwnKCSvALi_qLY_5wuyFFTrk3xHPivK-aY.cache +1 -0
  269. data/test/dummy/tmp/cache/assets/sprockets/v3.0/SB/SBPkES1IlI0ZYVrLG7nEylMTj1RaLVrzTKjgJblZjQs.cache +0 -0
  270. data/test/dummy/tmp/cache/assets/sprockets/v3.0/SX/SXp948xK_TB2XSdmR4nNeXdDosSyG_YZyQbYAiH-RBo.cache +0 -0
  271. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Sf/Sfp5w1kmceKSYDbafC_awVmnglAp-dtOTG_SjYMcXYw.cache +1 -0
  272. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Sp/Spmg72Eg1VjPdUYjJ6YXv6sflkt2DVyoYP1sht4Q500.cache +1 -0
  273. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Sy/SyJ5wy7kQNtQUg4G3DZfBUGDDH3gk-v08GAer8ZsRso.cache +1 -0
  274. data/test/dummy/tmp/cache/assets/sprockets/v3.0/T4/T4ORczRkDrhuBWGQmVZj1yBUeLpQFzWeJn62RzSwYj4.cache +0 -0
  275. data/test/dummy/tmp/cache/assets/sprockets/v3.0/T6/T67sWTjbILwfDxKMSJF8nkQqiuTvwn33-6g5tJDTxXU.cache +1 -0
  276. data/test/dummy/tmp/cache/assets/sprockets/v3.0/TF/TF_Cf65DP61omOgFx4_1Z_gjegnOc-Jxh2fbZZUPEv0.cache +0 -0
  277. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Tm/Tmi--tHSWkYldb7lAbqHL1oWH4A41KQEjAFS_anBdV0.cache +0 -0
  278. data/test/dummy/tmp/cache/assets/sprockets/v3.0/UH/UHqPCBguDEAEa2R9eB7E8jVPmDFY3NX9l8DBF83cs8A.cache +1 -0
  279. data/test/dummy/tmp/cache/assets/sprockets/v3.0/UO/UOPiJalIWr-5wReACpJ743bHJPh9UHPsdYGdqgeUfAg.cache +1 -0
  280. data/test/dummy/tmp/cache/assets/sprockets/v3.0/UR/UR65aWCYY-YV6f5xcfHz8Y6b9v0gYdAjZlGqYZBM3IY.cache +1 -0
  281. data/test/dummy/tmp/cache/assets/sprockets/v3.0/US/USPM3OBXObJarMMz1racv8jGRBaSQBSoXLTuqdOlgFY.cache +0 -0
  282. data/test/dummy/tmp/cache/assets/sprockets/v3.0/US/USjLlrTdFeYjjf07-frsW8poAodfVDcefnPaYKy_XCY.cache +1 -0
  283. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Ue/UeKHFj-oWEcki87YQFThEiJL19XGaUQau1W6lrAQyYM.cache +1 -0
  284. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Ui/UiOqBdJcdEwWVezjPd-76TrJSGwFz89GJ84c5Hkj9-Q.cache +1 -0
  285. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Uk/UkDIfwzRMf4MnoLuRZ0drPLehJKFsejBzuUSmkeeabA.cache +0 -0
  286. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Uy/UyO_4Gm5-3t8-0z2u6WIgihsLwa0zniCYRkyfqmwmhE.cache +0 -0
  287. data/test/dummy/tmp/cache/assets/sprockets/v3.0/VD/VDL7_Szd8PzSmDcr4exJc2hOh9ThfOryaXMHSYuSTo0.cache +1 -0
  288. data/test/dummy/tmp/cache/assets/sprockets/v3.0/VH/VHWS2u88JJsIond30G_8k_PmsviF3kZtsEP9rOAQnn4.cache +0 -0
  289. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Vq/VqW21G_Qe-J6i4P5prw4yy7wHi0zzk3UV1uP8yqOLEg.cache +0 -0
  290. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Vw/VwTsxGab_IDtXS0jvIbl0hzCtdqbtxzx1vHtb0FcCIg.cache +1 -0
  291. data/test/dummy/tmp/cache/assets/sprockets/v3.0/WM/WMIFjbNGjVoJiWCwJ4akFP7rGExKJqGeQkrXj0V7aMw.cache +0 -0
  292. data/test/dummy/tmp/cache/assets/sprockets/v3.0/WR/WRDlyIp5ATFOwKbRoNT_5c01EUjlZ_MPP3lJ4X1389o.cache +0 -0
  293. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Wt/Wt9U8x96cC0_K89VUNKvuvGI8LOgyyaXWEASz2wlfCg.cache +1 -0
  294. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Wt/WtGOyP8ocT3agK-HHJVRlarOU_pwELFIgfkgs0_aMKI.cache +0 -0
  295. data/test/dummy/tmp/cache/assets/sprockets/v3.0/XQ/XQyq-uQV9CPqGmz8ZmJoCL6AXoHWnda7GrTOY8nnjQc.cache +0 -0
  296. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Xr/Xrs6vr5oyYcZlaWw_8LNV6l-mv-RM10MBWdzmyt29q0.cache +0 -0
  297. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Xw/XwOKuFU1VKQwgUQN5aaZ813miM-QZ6q8OCByeLWHnDM.cache +0 -0
  298. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Y7/Y7titeryp_FSLvKL1VfNth0YWf1a02aQKM5SB0g3RoI.cache +0 -0
  299. data/test/dummy/tmp/cache/assets/sprockets/v3.0/YY/YYChdQDpz56xC4DgwGNggmGDKCCaQ6sR1sNf7zNQN30.cache +2 -0
  300. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Yg/YgC_z2byyYQ7Vgrf3EWaLRBnM1BTqr8luRS8u-Aeph0.cache +0 -0
  301. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Yq/Yqm7_mhdOmEPRpFZQOhvsNnAv2hexScLS4_Ucd2XKuk.cache +1 -0
  302. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Yv/YvAdBCQMYerxZpr94-VwyeBCx-m8RtUTPlxqweu9aws.cache +0 -0
  303. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Z3/Z34iW436AzkZ5LVOJK8S9_dHGVHE_IxvW5cV_9A2VFo.cache +1 -0
  304. data/test/dummy/tmp/cache/assets/sprockets/v3.0/ZA/ZAuAzZU7q3LBfgoso439peUxDL1EtsGqO458k0SWYA8.cache +0 -0
  305. data/test/dummy/tmp/cache/assets/sprockets/v3.0/ZL/ZLCZ2y2m1zTRUcowbeQAexZEHAxs3yO4otcYnJ1fWo0.cache +1 -0
  306. data/test/dummy/tmp/cache/assets/sprockets/v3.0/ZS/ZSyIjBBIW-x8xE-AT41Z2RhB9lkHc9ShUW712no6D3I.cache +0 -0
  307. data/test/dummy/tmp/cache/assets/sprockets/v3.0/ZX/ZXkNasXN6xqIYfqlQe3B26iUxkaabeZDBZH1Usn33Es.cache +0 -0
  308. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Zd/ZdX6vFt1o-W153PucMXK6W-GRanJaaBOmR7X3IFZ6NA.cache +0 -0
  309. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Zf/Zf6bkcL13-g7w029OS4HxZ7QG24U_qnipyg1Ke-NmKk.cache +0 -0
  310. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Zk/Zk9PL9XcDHomDlSAAlON7ZgGL0vWUZ_O1xk5DaPcvfo.cache +0 -0
  311. data/test/dummy/tmp/cache/assets/sprockets/v3.0/Zl/Zl2fOl_j7rDU31NscZY9eHzuafsuIk6A2jlhbRKMjHA.cache +1 -0
  312. data/test/dummy/tmp/cache/assets/sprockets/v3.0/_6/_6Z3o-I-kC6zJVzYGBg6e7OPa-jcBekAOpwRy8k2-9U.cache +1 -0
  313. data/test/dummy/tmp/cache/assets/sprockets/v3.0/_7/_7hHeuVDuVND7YqIxwwev3losdxdpMsyw3Pwdszel-U.cache +0 -0
  314. data/test/dummy/tmp/cache/assets/sprockets/v3.0/_A/_A2agN27ZtIhUzH4GnpFKUck8K_FHRsmFsmTnNgAvls.cache +0 -0
  315. data/test/dummy/tmp/cache/assets/sprockets/v3.0/_H/_HYBRsZYtBmAserSVyOTEYe7RB8DZaMBE2WAUzB5jEk.cache +1 -0
  316. data/test/dummy/tmp/cache/assets/sprockets/v3.0/_k/_k8DVkvP0WZjn34iMInYqGcO9SHHj-oMttuhXX_RKD0.cache +0 -0
  317. data/test/dummy/tmp/cache/assets/sprockets/v3.0/_r/_rMU_MJB4TzoXLXk8-J7iBeeu5zra-5rMUavNWQPwVM.cache +0 -0
  318. data/test/dummy/tmp/cache/assets/sprockets/v3.0/_u/_uDa-wVcI_PWzMmEFnMsogk9WJku_RP6ygytUYI-qQs.cache +1 -0
  319. data/test/dummy/tmp/cache/assets/sprockets/v3.0/_v/_vqH126yF8wGnLOdle3o0618GwqCsUq4tZwZ24nYELs.cache +0 -0
  320. data/test/dummy/tmp/cache/assets/sprockets/v3.0/aC/aCy2Hk7GOJHyX_YeX7Ysq3R-P7HcT37doz0C9p40nV8.cache +0 -0
  321. data/test/dummy/tmp/cache/assets/sprockets/v3.0/aT/aTcvvtUPScLJqVDzIWx5qKKdhGWP2po3eczv1kdTDxQ.cache +1 -0
  322. data/test/dummy/tmp/cache/assets/sprockets/v3.0/ae/aevFo3NmfznN3LG6yZ_3TcuLjRDvDNwf0JgZsBDnNYs.cache +1 -0
  323. data/test/dummy/tmp/cache/assets/sprockets/v3.0/az/azJzeUbWTCWWFuHbVeHmy029yxcuVB_jCrELbrffJqI.cache +1 -0
  324. data/test/dummy/tmp/cache/assets/sprockets/v3.0/b6/b6h7oclGW3HFHmO8g3XDUWFi5HqtsurZ8nUdC2rx7pM.cache +1 -0
  325. data/test/dummy/tmp/cache/assets/sprockets/v3.0/bH/bHAPqm4H_iVBv-_qgdkAlcMvzslKmmJV6hhtF-nghV8.cache +1 -0
  326. data/test/dummy/tmp/cache/assets/sprockets/v3.0/bR/bR_tD3zgw5Quh8JTt2NI97_IqkVJRRCuJJ3tUK8Yg8g.cache +4 -0
  327. data/test/dummy/tmp/cache/assets/sprockets/v3.0/bh/bhfbMZaDx46KFHPPSC1aMMSBfmtdSDXXs5tsvo062lM.cache +2 -0
  328. data/test/dummy/tmp/cache/assets/sprockets/v3.0/bj/bjUCaPRSr4cy7LUw5SG4UCP4juUB7KKEIvhv53yOgPA.cache +1 -0
  329. data/test/dummy/tmp/cache/assets/sprockets/v3.0/bm/bm4azkF-FKEHqBMH_5sUVongXMjbWMdyBWo21THgoFI.cache +0 -0
  330. data/test/dummy/tmp/cache/assets/sprockets/v3.0/c4/c4bWsJ0T0wOQrhg9LX8s4ojRWgfJCJL52nfd5ZPexuw.cache +1 -0
  331. data/test/dummy/tmp/cache/assets/sprockets/v3.0/c8/c8Pt2KcDT5LM48WRBpMLhGkIGVuXeFRHzgwxGR04YzM.cache +1 -0
  332. data/test/dummy/tmp/cache/assets/sprockets/v3.0/cX/cXIl7kyaurBUGWSCTxSRaLTmO5y3RFMjMJtMXGJSzDk.cache +0 -0
  333. data/test/dummy/tmp/cache/assets/sprockets/v3.0/cc/cc0D1uO9B6LtdXOOzJ2ZgB1SysaoNcXL1jqg6mj5FpQ.cache +1 -0
  334. data/test/dummy/tmp/cache/assets/sprockets/v3.0/ct/ctPJwIB7zwTJO9GK5Zt_oDOcHF1tCJxKO5o2ZOUDa8Q.cache +0 -0
  335. data/test/dummy/tmp/cache/assets/sprockets/v3.0/d5/d5XtVLjStTWZWcCsXO4HAu5TOAb3Fo_Mc0T5E4lbHA8.cache +0 -0
  336. data/test/dummy/tmp/cache/assets/sprockets/v3.0/dE/dEnRVUiFKUsacNXNlh6fi8rP0bnYrSANQKZ5YXprWqo.cache +0 -0
  337. data/test/dummy/tmp/cache/assets/sprockets/v3.0/dG/dGswfXCdlYdXK5yCK8YB4b4xfYht37KgK5vX3vGGvhA.cache +0 -0
  338. data/test/dummy/tmp/cache/assets/sprockets/v3.0/dL/dLSUXQD6gXaZ5EHn5ifb50sl0lmccRVs8oRwXUIXTz0.cache +1 -0
  339. data/test/dummy/tmp/cache/assets/sprockets/v3.0/dP/dPOAJfsyeF8GppnWBZ5IHeiHXNsQ_uJBYZuBAgY8cCo.cache +1 -0
  340. data/test/dummy/tmp/cache/assets/sprockets/v3.0/dR/dRXLnULUonwylRHmge0_2WG3Y0l2UtaCDBqcW_hjTYI.cache +1 -0
  341. data/test/dummy/tmp/cache/assets/sprockets/v3.0/dc/dcJPBu1HspV0P-4iFU-C0FWZ6PwmIL5iPsSIXI1VPmQ.cache +0 -0
  342. data/test/dummy/tmp/cache/assets/sprockets/v3.0/dz/dzPPJRStGEbcsz5_BVLuGv5HTVDh8uU70KZMx6ZC8kA.cache +1 -0
  343. data/test/dummy/tmp/cache/assets/sprockets/v3.0/e2/e2FQPZ_0SjJMGqTKCOFcDdic0Tsmn9VetmkRVjFxlXs.cache +0 -0
  344. data/test/dummy/tmp/cache/assets/sprockets/v3.0/e3/e3peH0uuiTMR3l0vGEGVy6eopTrKr7cEZaODzViL_Tw.cache +4 -0
  345. data/test/dummy/tmp/cache/assets/sprockets/v3.0/eQ/eQGlD0WwS54gaIAIKhKVVhCKgQLo1VUZScpBEUElGpo.cache +0 -0
  346. data/test/dummy/tmp/cache/assets/sprockets/v3.0/eS/eSOAoDAfdhJUa5juQWcaF4zo0GESCTBX7DEJ94KOFG0.cache +1 -0
  347. data/test/dummy/tmp/cache/assets/sprockets/v3.0/eV/eVmkveaTdpbQNs8VUelpuNrJO5IIeiAXpFyyNDsziDg.cache +0 -0
  348. data/test/dummy/tmp/cache/assets/sprockets/v3.0/ej/ejFcC00llnlXmTxO5duIiubM187BKsshyDVSlFv5bsw.cache +1 -0
  349. data/test/dummy/tmp/cache/assets/sprockets/v3.0/ej/ejPJ_fafJGf8DJR3u0MUqgVMAwWCw7Xz-aNLR5sxojc.cache +0 -0
  350. data/test/dummy/tmp/cache/assets/sprockets/v3.0/es/es_TbuJ7PaHb-RYfZyEmtt8v-GUvB_53aIB3HkMwiIc.cache +1 -0
  351. data/test/dummy/tmp/cache/assets/sprockets/v3.0/ev/evIQV8y8HBjelsgbXA0ozrIBMpipA4Tybl8a7aK_OiA.cache +1 -0
  352. data/test/dummy/tmp/cache/assets/sprockets/v3.0/fI/fIBUbgJWMIIQSasWSzCCVHtpn0Xcow9xFU0A-2Qz_JY.cache +1 -0
  353. data/test/dummy/tmp/cache/assets/sprockets/v3.0/fK/fKOTm0xz5oo807rTo4uVM5Yxw6RalwGQjKzzn6-8Pco.cache +2 -0
  354. data/test/dummy/tmp/cache/assets/sprockets/v3.0/fQ/fQ1wSY8tXudYVJC_2cX4T_LdAWRTJVg2CMiVaXSzqpU.cache +0 -0
  355. data/test/dummy/tmp/cache/assets/sprockets/v3.0/fa/fal9cTKjHBq1vSbu9b_CahI80Sk6QoOSwSvhhz7WI9U.cache +1 -0
  356. data/test/dummy/tmp/cache/assets/sprockets/v3.0/fc/fc3m_alIoVWaIGeBHaaMId90-dMyQjGVrhSt-XHp2kA.cache +0 -0
  357. data/test/dummy/tmp/cache/assets/sprockets/v3.0/fd/fd_3goL1yijab7-VyKjAAPam1YQX4q-zabzWomhuvwQ.cache +1 -0
  358. data/test/dummy/tmp/cache/assets/sprockets/v3.0/fm/fm4F2DnmcrusC4rq-E3l5zhH3rJG0eZ4s1XexA0un1Y.cache +1 -0
  359. data/test/dummy/tmp/cache/assets/sprockets/v3.0/fn/fnlvQJr3TbATMP95QzYRNwfMbgCzQpBnjmt9K7Qu3pQ.cache +0 -0
  360. data/test/dummy/tmp/cache/assets/sprockets/v3.0/fs/fsXJclfKBgiSUvpdET1h4BA2ddZTMb5-2xMGzfevFz4.cache +0 -0
  361. data/test/dummy/tmp/cache/assets/sprockets/v3.0/g-/g-DzKZYNU8px7txrjTKh2_55DSxiy8K7o0uprIpKUvE.cache +0 -0
  362. data/test/dummy/tmp/cache/assets/sprockets/v3.0/g0/g0VmHeVabmGEdl6FDjiGYM7VL_VX4qBTIF0i3qV27OQ.cache +1 -0
  363. data/test/dummy/tmp/cache/assets/sprockets/v3.0/gz/gzwG_G1-sNVN_-0clTs2bo7EfBkjaLyKFpLcjI_H9Ug.cache +1 -0
  364. data/test/dummy/tmp/cache/assets/sprockets/v3.0/h3/h30-CnQ4AbAUAphvknid6M9R1nULl1F51mBwuIJAY5M.cache +1 -0
  365. data/test/dummy/tmp/cache/assets/sprockets/v3.0/hS/hSHzVatHl3Huvik73_q-3Fmp664Hqvnqi08KnOrCCGQ.cache +1 -0
  366. data/test/dummy/tmp/cache/assets/sprockets/v3.0/hX/hXkyjuA2VfoK_e_zfSMI_T3sQH1I0m-_F-CHccO18kw.cache +2 -0
  367. data/test/dummy/tmp/cache/assets/sprockets/v3.0/hZ/hZi1k6tpxxCGYxRe7zY74ItcOI8gZrREOpGuA8JSpGg.cache +0 -0
  368. data/test/dummy/tmp/cache/assets/sprockets/v3.0/hl/hl93BE8gTy_oKR_8uJSvC-mjCehUWGoagDXc2tbvpok.cache +1 -0
  369. data/test/dummy/tmp/cache/assets/sprockets/v3.0/hn/hnFk6FgKQjbTmnjtXhIpwBqnR-bAPrU9mQc2fE9r7Yo.cache +0 -0
  370. data/test/dummy/tmp/cache/assets/sprockets/v3.0/hp/hpDTps2QCDqf1OJqX-Surt2NlfDl2GSsS0FlHSsd1Io.cache +0 -0
  371. data/test/dummy/tmp/cache/assets/sprockets/v3.0/hw/hwwwKnJPjEme01vZ4IGcfNoHroaoBA8mzzmncxdl0tQ.cache +1 -0
  372. data/test/dummy/tmp/cache/assets/sprockets/v3.0/i2/i2hl-k_xpesT9bXTcRfEsDxywipmgIfnwb7QsfXtJL8.cache +0 -0
  373. data/test/dummy/tmp/cache/assets/sprockets/v3.0/iM/iMbtAcXrYofoDnWj3StRQOMS2DIjFv6l65yCX14GQ2g.cache +1 -0
  374. data/test/dummy/tmp/cache/assets/sprockets/v3.0/iS/iSqVZECnqIaQ5OFrPGUJK_jBfIlOkW2K10o2oRRxyGQ.cache +0 -0
  375. data/test/dummy/tmp/cache/assets/sprockets/v3.0/iZ/iZS_xEurCMtMlvJohgs5u0AEqcbGtz1ToNRpBPXFdzA.cache +0 -0
  376. data/test/dummy/tmp/cache/assets/sprockets/v3.0/ic/icGClNgl3ntlexRXnGKxcZTAg2MNY3dlqo7OBLEzsfY.cache +0 -0
  377. data/test/dummy/tmp/cache/assets/sprockets/v3.0/id/idc_N3hh-FdBtj-0tNzFdY1_FFmij4ugPE8QTdCjL9E.cache +0 -0
  378. data/test/dummy/tmp/cache/assets/sprockets/v3.0/im/imMACZydNORUlirctUTX7COofs6fkOb1eJVh6bXfseE.cache +4 -0
  379. data/test/dummy/tmp/cache/assets/sprockets/v3.0/ix/ixkPvj54mhdDnmD5d68VYDwOu211m3FbniEVqzvnxRs.cache +0 -0
  380. data/test/dummy/tmp/cache/assets/sprockets/v3.0/j0/j0jLU-n1mopUd_sgxJ07vBlOdyxQIDbsMcbpfl6UGeY.cache +0 -0
  381. data/test/dummy/tmp/cache/assets/sprockets/v3.0/jA/jA0T6DZFHf35HbVJ0hsVuEZo0U0guEjluc_1ClQPXH0.cache +1 -0
  382. data/test/dummy/tmp/cache/assets/sprockets/v3.0/jH/jHEldP_SgVw-xyGyJXpgJrRWmDChksjfaTBnxTDkQvs.cache +0 -0
  383. data/test/dummy/tmp/cache/assets/sprockets/v3.0/jN/jNjtXatGgXAE16q_sLQqqeT4a0i3lTA9QW4Y7YzgCC0.cache +1 -0
  384. data/test/dummy/tmp/cache/assets/sprockets/v3.0/jV/jVwJ_pmUGbnxmkimw1BAOVSjhTVdd1j6kJSkhe3cnSQ.cache +1 -0
  385. data/test/dummy/tmp/cache/assets/sprockets/v3.0/j_/j_7KtO1TnaWtmAukcVNiE4zzBNNBW1nJW-wfKdvZKSo.cache +1 -0
  386. data/test/dummy/tmp/cache/assets/sprockets/v3.0/jg/jg-5ilOZ-hza5z_CkM2vxCt2j7wh_Qzni2gKwNGttMY.cache +1 -0
  387. data/test/dummy/tmp/cache/assets/sprockets/v3.0/jt/jtHWXTPj_CRSqJRduOWA98CEKvZYPGBYsWviLwYBbEg.cache +1 -0
  388. data/test/dummy/tmp/cache/assets/sprockets/v3.0/jy/jyV15KDAIc3jkQMQsNzcRv0JhsUYqmw6JGZuGJNTFoM.cache +0 -0
  389. data/test/dummy/tmp/cache/assets/sprockets/v3.0/kG/kGnYvmgltHWerDrKlB6NMy52uGDtVH_9AJhZBMcyda0.cache +1 -0
  390. data/test/dummy/tmp/cache/assets/sprockets/v3.0/kk/kkvJ59QBgdmtmKfhwJ4qImcE1dUCDLD0RQBspF8Zluo.cache +0 -0
  391. data/test/dummy/tmp/cache/assets/sprockets/v3.0/kx/kxznfHVNfMZCDSYKIdGdSZ7KGCYak6EFU2wkKpbYwXo.cache +0 -0
  392. data/test/dummy/tmp/cache/assets/sprockets/v3.0/l6/l6gFWduRtz1m8hOEpy2raCay3KAfN9Yf3MrerASsLd4.cache +2 -0
  393. data/test/dummy/tmp/cache/assets/sprockets/v3.0/l7/l7OQkzNytchk7bYgutTTvesFE8FjKrNeRJmWsKSgB-4.cache +0 -0
  394. data/test/dummy/tmp/cache/assets/sprockets/v3.0/lD/lDv8VTsV8QjNxeC3C7mdnCCJPIo0n2kUatu79i65Zfo.cache +1 -0
  395. data/test/dummy/tmp/cache/assets/sprockets/v3.0/lF/lFkQ0PiEjLHG8ZnICmfXB3hQ8Myy0rO4gPsd6-LhDcM.cache +1 -0
  396. data/test/dummy/tmp/cache/assets/sprockets/v3.0/lo/loaaTV-828dx-_t0p82uJtov9uwwVr_inpxpnFWijo4.cache +0 -0
  397. data/test/dummy/tmp/cache/assets/sprockets/v3.0/lt/lt_Il2gnezo5eNTJyr1raWKlTQXLUZ2_CBLzfuzwAjk.cache +0 -0
  398. data/test/dummy/tmp/cache/assets/sprockets/v3.0/ly/lyJmJ70Hz6lxcUDu6VDbjyYN59IGeNzYKwQt4wqJ65E.cache +1 -0
  399. data/test/dummy/tmp/cache/assets/sprockets/v3.0/lz/lzur8poSctIUhDIJRoqUHszHYNUQ5PhS7XWPBr-bsW0.cache +0 -0
  400. data/test/dummy/tmp/cache/assets/sprockets/v3.0/m9/m916ksNYqgK0RWJHUQJA0EqBtx6a6bhzGLoD8Oj80u4.cache +1 -0
  401. data/test/dummy/tmp/cache/assets/sprockets/v3.0/me/me9edXAR9JOcKGhR8vnqHyFfOKJ7k2zGPiqSD8ofak0.cache +1 -0
  402. data/test/dummy/tmp/cache/assets/sprockets/v3.0/ms/msJ-k6Dla_K9JvvJgFv4YEVH1L2F5fHNWyudv1ss6aY.cache +1 -0
  403. data/test/dummy/tmp/cache/assets/sprockets/v3.0/mt/mtTeynjbYObzQ8vM4FH5RXHEkwhNEBPu1HNP5n56hKg.cache +0 -0
  404. data/test/dummy/tmp/cache/assets/sprockets/v3.0/nT/nTMrNb6KAxZFFcxYMfSoKDQuLLU4DbnG-Q2IMBn4iic.cache +0 -0
  405. data/test/dummy/tmp/cache/assets/sprockets/v3.0/nU/nUVgFb1i3zliiAmeBcYSJhIBv6Bz5d1kxFezhqnY31c.cache +1 -0
  406. data/test/dummy/tmp/cache/assets/sprockets/v3.0/ni/nipX2Xdusq8KWLZZGpLm0N3CmpqN19RvLQC-JOtaj2Q.cache +0 -0
  407. data/test/dummy/tmp/cache/assets/sprockets/v3.0/ni/nir_AAhCVuZT67klxwHUOX34ytBSdkR5MeKSsjw3eps.cache +1 -0
  408. data/test/dummy/tmp/cache/assets/sprockets/v3.0/ni/nisCO33YJ-DR0y8R_8XoRhTDSphAKq1msoC-Vf0hLg4.cache +1 -0
  409. data/test/dummy/tmp/cache/assets/sprockets/v3.0/nj/nj-frPpkXzIBHuHsGUXjp28-TTdPYW5ndnn4aGc6AGk.cache +1 -0
  410. data/test/dummy/tmp/cache/assets/sprockets/v3.0/nk/nkBQZ19zNOdfWbk5FyOdLJPbrGVGMxW5Ji7W_F4_SJQ.cache +1 -0
  411. data/test/dummy/tmp/cache/assets/sprockets/v3.0/nm/nmCpkQS_QWEUCNdrvPapJtORGLZr8tzAFcc3SzfzVdQ.cache +0 -0
  412. data/test/dummy/tmp/cache/assets/sprockets/v3.0/o1/o18Ryez2gIk5uXTq3hIp8uJEBXu_8YRMZPoIzD-6AAM.cache +1 -0
  413. data/test/dummy/tmp/cache/assets/sprockets/v3.0/o1/o1Fk5ujIjIZ05he-LKHsrBKfGt-KVGMamCBxUCXGIas.cache +0 -0
  414. data/test/dummy/tmp/cache/assets/sprockets/v3.0/oN/oNhEFrq7eBubgMHqPUvLq8rso1IfuaZX3h8a3E7ZycM.cache +1 -0
  415. data/test/dummy/tmp/cache/assets/sprockets/v3.0/oP/oP5zZWF3zsUY7EU5DZqc7IKnbpXm5ixWY8pw10FhynA.cache +2 -0
  416. data/test/dummy/tmp/cache/assets/sprockets/v3.0/oW/oWVPiRL9tAnudWqX0jP9D5d6OTUk6DOXdMN7JS7FRdw.cache +0 -0
  417. data/test/dummy/tmp/cache/assets/sprockets/v3.0/oi/oixnX5WERx-f0S__Ma-IhKRg9Z4UglmkMvpMy1qVCIM.cache +1 -0
  418. data/test/dummy/tmp/cache/assets/sprockets/v3.0/op/op8fpGWkaVsPrV_F5Rq5-_VlHCeFOXtTbzPvzOocjD0.cache +0 -0
  419. data/test/dummy/tmp/cache/assets/sprockets/v3.0/ov/ov7yNuSUPKs_M7p3COGraz-PF_DbWz3cxX32MZDW2dc.cache +1 -0
  420. data/test/dummy/tmp/cache/assets/sprockets/v3.0/ov/ovKSsPhxW8w_v7t5s3mEeBONCy8iH9khwOVv0pU4rdE.cache +0 -0
  421. data/test/dummy/tmp/cache/assets/sprockets/v3.0/ox/oxtyXVGZoa1O-cICPZ7dLDvC3u08WabyOUkAN32ssWE.cache +1 -0
  422. data/test/dummy/tmp/cache/assets/sprockets/v3.0/p0/p0vWto51k9t5bnT67f5cw2WN2WweN46-nArF9LUeWxQ.cache +1 -0
  423. data/test/dummy/tmp/cache/assets/sprockets/v3.0/pE/pEhaat2KBd5SrT7szC_8R1_6hK17FTpvoRFkmCRSD3M.cache +0 -0
  424. data/test/dummy/tmp/cache/assets/sprockets/v3.0/pF/pF2xo9xQibUrKXz7PNuQu2mHW6vKzKCAtSVIRbpm8C4.cache +1 -0
  425. data/test/dummy/tmp/cache/assets/sprockets/v3.0/pI/pI0fgaIf_zwkl-9-mLC_SeN2m4Xizzp1W1ZfizvGhHU.cache +1 -0
  426. data/test/dummy/tmp/cache/assets/sprockets/v3.0/pl/pltMNk51kCwaPlqFa7aK2Z1jtLLi-8JOw1b7egfavB8.cache +1 -0
  427. data/test/dummy/tmp/cache/assets/sprockets/v3.0/ps/pss2152e3e98slfiFJIEmvM6BTlFR33fRTzOSgZ5ywU.cache +0 -0
  428. data/test/dummy/tmp/cache/assets/sprockets/v3.0/q8/q86uel279tao5P0t5d6hEma0KGf50RYzztx7k-mGJn4.cache +1 -0
  429. data/test/dummy/tmp/cache/assets/sprockets/v3.0/qF/qFF902qQrw2LQUDARfQ95fz2S3TsC-Fo-AK6wgMr4uo.cache +0 -0
  430. data/test/dummy/tmp/cache/assets/sprockets/v3.0/qJ/qJGSZjFx5nAoZU2LmvGyvA284LKSMt0GVuKsvZ_Zxbo.cache +0 -0
  431. data/test/dummy/tmp/cache/assets/sprockets/v3.0/qP/qPdCnlO405h_Ws8oX_W5DKUhyEiVj8ekIGspaDBiN-U.cache +0 -0
  432. data/test/dummy/tmp/cache/assets/sprockets/v3.0/qR/qRcv9T6NPmakkuJR8S8ceMYgn-iC7Ykq3DEKwMrvQ-4.cache +1 -0
  433. data/test/dummy/tmp/cache/assets/sprockets/v3.0/r6/r6D22-QSEVfh1elsrEUIVuF3u-BKH_lk6leRvS2XPdI.cache +1 -0
  434. data/test/dummy/tmp/cache/assets/sprockets/v3.0/r7/r742R2oEUnjIZV9A7coBeSQemd9wFwCX9gWoTKjvnv0.cache +1 -0
  435. data/test/dummy/tmp/cache/assets/sprockets/v3.0/rQ/rQZTK9JUQjCKOZyl-d7k_2UJd4lIo62t_kS-IwbXScQ.cache +1 -0
  436. data/test/dummy/tmp/cache/assets/sprockets/v3.0/r_/r_i-poFJcx6EMH-jyHcQboJRtWPEUs_iL7F7NfYxk2g.cache +0 -0
  437. data/test/dummy/tmp/cache/assets/sprockets/v3.0/ra/rafYB7BfC8S1pFt1ifQrWUVkt47XRAnNXttdHLbAT_k.cache +1 -0
  438. data/test/dummy/tmp/cache/assets/sprockets/v3.0/rl/rlQYr0tmy2rbQhGt7ibwqZdjYn1Gl6JZI00qhv6z9hA.cache +0 -0
  439. data/test/dummy/tmp/cache/assets/sprockets/v3.0/s5/s5SaUvIDtablB5xeJAWS19YllbftAdzqwi-GLf8E7T8.cache +0 -0
  440. data/test/dummy/tmp/cache/assets/sprockets/v3.0/s6/s6gtxJbRL10sgK2zKdJXdN-Ek7KB9KgiC8pPDAayHBQ.cache +1 -0
  441. data/test/dummy/tmp/cache/assets/sprockets/v3.0/sI/sI3KEcrrV8s92i1HpZPqpGrOtyyN8ldPSamxWZ0Qdak.cache +1 -0
  442. data/test/dummy/tmp/cache/assets/sprockets/v3.0/sM/sMFOMHiLt5m7goRjcDwS13bC-zZqJ3wULYmlvxuyM9I.cache +1 -0
  443. data/test/dummy/tmp/cache/assets/sprockets/v3.0/sU/sUVaQ9HugzQ5Hx7xQNbN4yP-J4cr1KJ7GTnkqT2d8uk.cache +1 -0
  444. data/test/dummy/tmp/cache/assets/sprockets/v3.0/sZ/sZnBgLQeC27m15QvEAXbloikoNWzddEDaPmr-lKOgkI.cache +0 -0
  445. data/test/dummy/tmp/cache/assets/sprockets/v3.0/si/si-4z5KexIjFjYuqH_Yz3fLONaUBRtFrFUVN6zy16Es.cache +0 -0
  446. data/test/dummy/tmp/cache/assets/sprockets/v3.0/sr/srtX18E81WBmTV4cjOzMoyKxP9LRBEOcVsTjJM5Pwrg.cache +0 -0
  447. data/test/dummy/tmp/cache/assets/sprockets/v3.0/st/st1788tIY_Naize_TalkSeNPSUmHpWn3UX3IkYh4Eb4.cache +1 -0
  448. data/test/dummy/tmp/cache/assets/sprockets/v3.0/sv/svtrb8U8HcnPeRqEWgmTlPoNyfvEyVpK17aiHvDhWyE.cache +1 -0
  449. data/test/dummy/tmp/cache/assets/sprockets/v3.0/sx/sxHZwwsXsQHYG5LUfQ4x2rIyxwYe74KQ9AugSeUDzzE.cache +0 -0
  450. data/test/dummy/tmp/cache/assets/sprockets/v3.0/t-/t-nKszWydLQex7rYgOXejEAJIKfNSGiMXoSQ5-8BjYc.cache +1 -0
  451. data/test/dummy/tmp/cache/assets/sprockets/v3.0/tF/tF1MjGbbRLDDz9207OyceqxQHvdzf9ANadsFuSMzMFc.cache +0 -0
  452. data/test/dummy/tmp/cache/assets/sprockets/v3.0/tm/tmHA_f2vg3xGaX9vbYch03U9Ru2ZrYuH6EfM1Oo3p2c.cache +0 -0
  453. data/test/dummy/tmp/cache/assets/sprockets/v3.0/uX/uXHu1j-3uOkbRGmJtVix_Ff-ccnhMi498CLShZlUUpA.cache +1 -0
  454. data/test/dummy/tmp/cache/assets/sprockets/v3.0/uc/uc8aNVobwrNxhdjyhr8l9EfrcRC80aMKuLFuyECuPFA.cache +1 -0
  455. data/test/dummy/tmp/cache/assets/sprockets/v3.0/up/upOjGtFRi3ICAfKf2NvPfPoPLSTZCK2JtYq81AHYxX0.cache +1 -0
  456. data/test/dummy/tmp/cache/assets/sprockets/v3.0/uu/uu3gKPMvdqBfzVl0K4thb0KWtTq3lAEzCz_Y6Fhgx70.cache +1 -0
  457. data/test/dummy/tmp/cache/assets/sprockets/v3.0/v9/v97nzsSKsYea3uZ0M6bxAhDW2LGQKUNL5zB3-JJfBf4.cache +1 -0
  458. data/test/dummy/tmp/cache/assets/sprockets/v3.0/vQ/vQgAjvNr_feNXlJrEznq8Dj2-20QeaIH0OktuV8vPrI.cache +0 -0
  459. data/test/dummy/tmp/cache/assets/sprockets/v3.0/vk/vk-yEq28UDM7hqhSKtHAXZX2qnUZHrv4xCu1H3Hv9b8.cache +0 -0
  460. data/test/dummy/tmp/cache/assets/sprockets/v3.0/vr/vrbhDLBEdxNctR4GeI_6qXrmCcoddh4pWy0uYjZXkVg.cache +1 -0
  461. data/test/dummy/tmp/cache/assets/sprockets/v3.0/vw/vwgONuryOxkXZcQetbnnNgbo7FSVlgt_Hqr-oM2TE0U.cache +0 -0
  462. data/test/dummy/tmp/cache/assets/sprockets/v3.0/wS/wSN2ZtMLsxSL6Dkahc1ZwZQVKyJzCHHYHhkV20xCMu8.cache +1 -0
  463. data/test/dummy/tmp/cache/assets/sprockets/v3.0/wo/woYCH6WspNF7vxO1S5MhRRTSBxKsQbOCx6zaEAzWD88.cache +0 -0
  464. data/test/dummy/tmp/cache/assets/sprockets/v3.0/wo/woiCCOdJdP-_dTvanOghZpR9_wZohfQs_MsIQ5bfLOM.cache +0 -0
  465. data/test/dummy/tmp/cache/assets/sprockets/v3.0/wp/wpDjC-4A8sVSd7NDyEwbQK833mXADN89e_4VBpjBGd4.cache +1 -0
  466. data/test/dummy/tmp/cache/assets/sprockets/v3.0/wr/wrVo07uP9SAJYrL4uwAKd2As77H7PgmbRYwqtrBTO08.cache +1 -0
  467. data/test/dummy/tmp/cache/assets/sprockets/v3.0/ww/wwEzJr_xf0ci2mqw_XSzZmIQpJvQN5zcSHybubzBDww.cache +0 -0
  468. data/test/dummy/tmp/cache/assets/sprockets/v3.0/x2/x2IHehe_gBb_fk5LRtfi99cZ78VEnXdip43J5Wq7uQQ.cache +0 -0
  469. data/test/dummy/tmp/cache/assets/sprockets/v3.0/x7/x7NsmnxTDQIGaO_3c5-aYjdvXzLvwXsgtGXLGd4_FXw.cache +0 -0
  470. data/test/dummy/tmp/cache/assets/sprockets/v3.0/xA/xAAzQsrnEG4kiINT10L0PPkDwg1uFJhyH7otw3QMDjE.cache +1 -0
  471. data/test/dummy/tmp/cache/assets/sprockets/v3.0/xA/xA_18IvFPnhPg0IeD-AU642PkZApOC6ZtkXkrs9PIHI.cache +0 -0
  472. data/test/dummy/tmp/cache/assets/sprockets/v3.0/xB/xBFuOuuomRsZKZKb01buuDj-zEw7zB4x5KRG3tQ4tDI.cache +1 -0
  473. data/test/dummy/tmp/cache/assets/sprockets/v3.0/xD/xD_eYq0dqwf2Qo1Sjg3TMpEENaJzzIxwRUZEVCgjdK8.cache +0 -0
  474. data/test/dummy/tmp/cache/assets/sprockets/v3.0/xG/xGKF2FHOV7funLYbn4Fk9pS5lN-8vZe1o70u5YgzBes.cache +1 -0
  475. data/test/dummy/tmp/cache/assets/sprockets/v3.0/xQ/xQquG8acFW0ffG-mKH7XyzKGvWB_OkeA6pRpqVmlgis.cache +0 -0
  476. data/test/dummy/tmp/cache/assets/sprockets/v3.0/xc/xcvMMjAm60ntxxAOflflJoT_TB_-fNRmhOUzXwmgqo8.cache +1 -0
  477. data/test/dummy/tmp/cache/assets/sprockets/v3.0/xs/xsNaF1ExOUS_B7nrm0GytB-LgVbfDPbua8boocz_WBc.cache +1 -0
  478. data/test/dummy/tmp/cache/assets/sprockets/v3.0/xu/xuIMx-fsH37-NIAT5YU5C-XQSLsQA8iz1PUCGnU876U.cache +1 -0
  479. data/test/dummy/tmp/cache/assets/sprockets/v3.0/xx/xxIsEK7pSAOwDkivd32A_JcyS2_-MMdVkhFUAKFSvwY.cache +0 -0
  480. data/test/dummy/tmp/cache/assets/sprockets/v3.0/ye/ye6ahFx70vr4IrjXSFnoSo8TxXQT-WVFNKa2D5Zy3Dg.cache +1 -0
  481. data/test/dummy/tmp/cache/assets/sprockets/v3.0/zB/zBX1l0Twye8fbeTl8EbjELzyUK1y1NKngVa6fCttyXU.cache +1 -0
  482. data/test/dummy/tmp/cache/assets/sprockets/v3.0/zE/zEknbUrkhbEDAA25p7e5o5lkNW8GxfIwmi2987CDR-c.cache +0 -0
  483. data/test/dummy/tmp/cache/assets/sprockets/v3.0/za/zazcVfJ8LCckQNrY2ZGiySu91rNfiz421g-7VGiQ7f8.cache +1 -0
  484. data/test/dummy/tmp/cache/assets/sprockets/v3.0/zj/zjzCwS7WV_khBlIWYyTJVwSRnO4wJEccptl0bXeNkJw.cache +1 -0
  485. data/test/fixtures/cally/invitations.yml +15 -0
  486. data/test/fixtures/cally/users.yml +28 -0
  487. data/test/integration/cally/create_invitation_test.rb +54 -0
  488. data/test/integration/cally/create_user_test.rb +83 -0
  489. data/test/integration/cally/delete_invitation_test.rb +44 -0
  490. data/test/integration/cally/delete_user_test.rb +44 -0
  491. data/test/integration/cally/edit_user_test.rb +59 -0
  492. data/test/integration/cally/index_invitations_test.rb +36 -0
  493. data/test/integration/cally/login_logout_test.rb +51 -0
  494. data/test/integration/cally/reset_password_test.rb +90 -0
  495. data/test/integration/cally/send_invitation_test.rb +45 -0
  496. data/test/integration/cally/show_all_users_test.rb +30 -0
  497. data/test/integration/cally/show_user_profile_test.rb +31 -0
  498. data/test/integration/cally/toggle_admin_rights_test.rb +52 -0
  499. data/test/integration/navigation_test.rb +8 -0
  500. data/test/models/cally/invitation_test.rb +33 -0
  501. data/test/models/cally/user_test.rb +82 -0
  502. data/test/test_helper.rb +27 -0
  503. metadata +1137 -0
@@ -0,0 +1,292 @@
1
+ require_dependency "cally/application_controller"
2
+
3
+ module Cally
4
+ class UsersController < ApplicationController
5
+
6
+ require 'omw_random_string'
7
+ require 'omw_mailgun'
8
+
9
+ before_action :set_user, only: [:show, :edit, :update, :destroy, :toggle_admin]
10
+ before_action :user_params, only: [:create, :edit, :update, :destroy, :ask_security_question, :reset_password]
11
+ before_action :is_invitation_only?, only: [:new, :create]
12
+ before_action :same_user?, only: [:show, :edit, :update]
13
+ before_action :logged_in_as_admin?, only: [:index, :toggle_admin]
14
+ before_action :admin_or_same_user?, only: [:destroy]
15
+
16
+ def index
17
+ @users = User.paginate(page: params[:page], per_page: 20)
18
+ end
19
+
20
+ # This method shows the signup form if users count is 0.
21
+ # If this is invitation only then there must be a valid key
22
+ def new
23
+ # Checks if it is the first user or valid invitation key is provided
24
+ # If the website is not invitation only then you can create a new user here
25
+ if User.count == 0 || @invitation_only != 'true' || (@invitation_only == 'true' && valid_invitation_key?)
26
+ @user = User.new
27
+ else
28
+ flash[:error] = 'This is invitation only, enter your email for asking for invitation.'
29
+ redirect_to invitation_path
30
+ end
31
+ end
32
+
33
+ # This method creates a user if the user.count is 0.
34
+ # if the user count >= 0 and there's an valid invitation key then you can also create your account
35
+ # in all other cases this outputs an error saying there's no valid invitation key
36
+ def create
37
+ if User.count == 0 || @invitation_only != 'true' || (@invitation_only == 'true' && valid_invitation_key?)
38
+ @user = User.new(username: user_params[:username], email: user_params[:email], password: user_params[:password],
39
+ security_question: user_params[:security_question], security_answer: user_params[:security_answer])
40
+
41
+ # creates a rondow string of 32 characters which will be the user's key
42
+ @user.user_key = OmwRandomString.generate(32)
43
+
44
+ # If this is the first user created then automatically set him/her as administrator
45
+ if User.count == 0
46
+ @user.admin = true
47
+ end
48
+
49
+ if @user.save
50
+ flash[:success] = "User '#{@user.username}' successfully created."
51
+ session[:user_id] = @user.id
52
+ redirect_to user_path(@user)
53
+
54
+ # if this creation is because of an invite then remove the invitation from the database
55
+ if defined? @invitation_key
56
+ Invitation.find_by(invitation_key: @invitation_key).destroy
57
+ end
58
+ else
59
+ if defined? @invitation_key
60
+ render 'new', locals: { invitation_key: @invitation_key }
61
+ else
62
+ flash[:error] = 'Error creating account'
63
+ render 'new'
64
+ end
65
+ end
66
+ else
67
+ flash[:error] = 'This is invitation only'
68
+ redirect_to invitation_path
69
+ end
70
+ end
71
+
72
+ def login
73
+ if User.count == 0
74
+ redirect_to new_user_path
75
+ end
76
+ end
77
+
78
+ def show
79
+ end
80
+
81
+ def edit
82
+ end
83
+
84
+ def update
85
+ if @user.update(user_params)
86
+ flash[:success] = 'Your profile is updated successfully.'
87
+ redirect_to user_path(@user)
88
+ else
89
+ flash[:error] = 'Error updating your profile.'
90
+ redirect_to edit_user_path(@user)
91
+ end
92
+ end
93
+
94
+ def destroy
95
+ if @user == current_user
96
+ session[:user_id] = nil
97
+ end
98
+
99
+ if @user.destroy
100
+ flash[:success] = 'User successfully deleted.'
101
+ redirect_to login_path
102
+ else
103
+ flash[:error] = 'Error deleting user.'
104
+ if logged_in?
105
+ redirect_to user_path(current_user)
106
+ else
107
+ redirect_to login_path
108
+ end
109
+ end
110
+ end
111
+
112
+ def toggle_admin
113
+ # Here you can toggle a user administration rights if it's not the first user.
114
+ # The first user will always be an administrator.
115
+ if @user != User.first && @user.update(admin: !@user.admin)
116
+ flash[:success] = 'Admin status updated successfully.'
117
+ redirect_to users_path
118
+ else
119
+ flash[:error] = 'Error updating admin status.'
120
+ redirect_to users_path
121
+ end
122
+ end
123
+
124
+ def forgot_password
125
+ end
126
+
127
+ def ask_security_question
128
+ # When a user want to reset his/her password then he/she have to
129
+ # answer the security question given by him/her on signup
130
+ # If the user doesn't exists it throws an error.
131
+ user = User.find_by(email: user_params[:email])
132
+ if user
133
+ @user_email = user.email
134
+ @security_question = user.security_question
135
+ else
136
+ flash[:error] = "User with email: '#{user_params[:email]}' not found."
137
+ redirect_to forgot_password_path
138
+ end
139
+ end
140
+
141
+ def reset
142
+ @reset_key = params[:reset_key]
143
+ @user_key = params[:user_key]
144
+ end
145
+
146
+ def reset_password
147
+ user = User.find_by(email: user_params[:email], security_answer: user_params[:security_answer].downcase)
148
+
149
+ if user
150
+ if retrieable?(user)
151
+ # when the user haven't used up his/her retry attempts set as an environment variable.
152
+ # This will create a random string and sends this to the user's email
153
+ # When the user clicks on this url in the received email he/she will be
154
+ # able to reset his/her password
155
+ reset_key = OmwRandomString.generate(32)
156
+ user.reset_key = reset_key
157
+ added_retry = add_retry(user)
158
+
159
+ if user.save && added_retry && send_reset_key(reset_key, user)
160
+ flash[:success] = "Reset key is sent to '#{user.email}'."
161
+ redirect_to login_path
162
+ else
163
+ if @error_sent_message
164
+ flash[:error] = "error sending reset key with message: '#{@error_sent_message}'."
165
+ redirect_to forgot_password_path
166
+ else
167
+ flash[:error] = 'Error saving reset_key.'
168
+ redirect_to forgot_password_path
169
+ end
170
+ end
171
+ else
172
+ flash[:error] = 'You has reached the limit of allowed password resets.'
173
+ redirect_to forgot_password_path
174
+ end
175
+ else
176
+ flash[:error] = 'The security answer is incorrect.'
177
+ redirect_to forgot_password_path
178
+ end
179
+ end
180
+
181
+ def execute_reset
182
+ # this is called when resetting the user's password
183
+ # If successfull it will remove the reset_key in the database
184
+ # else it will show an error 'No valid reset password key'
185
+ # which means the reset key is not found in the database
186
+ @user = User.find_by(user_key: user_params[:user_key], reset_key: user_params[:reset_key])
187
+
188
+ if @user && (@user.reset_key != nil) && @user.update(user_params)
189
+ @user.reset_key = nil
190
+
191
+ if @user.save
192
+ flash[:success] = 'Password successfully changed'
193
+ session[:user_id] = @user.id
194
+ redirect_to user_path(@user)
195
+ else
196
+ flash[:error] = 'Error deleting reset_key'
197
+ redirect_to login_path
198
+ end
199
+ else
200
+ flash[:error] = 'No valid reset password key'
201
+ render 'reset', locals: { user_key: params[:user_key], reset_key: params[:reset_key] }
202
+ #redirect_to reset_path(user_key: user_params[:user_key], reset_key: user_params[:reset_key])
203
+ end
204
+ end
205
+
206
+ private
207
+
208
+ # get the params for user (create)
209
+ def user_params
210
+ if params[:user].present?
211
+ params.require(:user).permit(:username, :email, :password, :invitation_key, :user_key, :reset_key, :security_question, :security_answer)
212
+ end
213
+ end
214
+
215
+ # This checks if the env var is set to true, if not then everyone can signup
216
+ def is_invitation_only?
217
+ @invitation_only = ENV['INVITATION_ONLY'] || 'false'
218
+ end
219
+
220
+ def set_user
221
+ if (!User.exists?(id: params[:id]))
222
+ redirect_to login_path
223
+ else
224
+ @user = User.find(params[:id])
225
+ end
226
+ end
227
+
228
+ def add_retry(user)
229
+ # when a user hasn't burned all his/her retries for the day
230
+ # it will add 1 retry to the database
231
+ if user.retry_date == Date.today && user.retry < ENV['MAILGUN_RETRIES'].to_i
232
+ user.update(retry: user.retry+1)
233
+ user.update(retry_date: Date.current)
234
+ return true
235
+ elsif user.retry_date < Date.today
236
+ user.update(retry: 0)
237
+ user.update(retry_date: Date.current)
238
+
239
+ return true
240
+ else
241
+ return false
242
+ end
243
+ end
244
+
245
+ def retrieable?(user)
246
+ # In this bit of code we will check if a user hasn't burned all
247
+ # his/her retries for resetting the password.
248
+ # When he/she burned their retries it will be for this day.
249
+ if user && (user.retry < ENV['MAILGUN_RETRIES'].to_i || user.retry_date < Date.today)
250
+ return true
251
+ else
252
+ return false
253
+ end
254
+ end
255
+
256
+ def send_reset_key(reset_key, user)
257
+ # Here the reset key is send to the user's email address.
258
+ # When clicking on the url in the received e-mail the user
259
+ # will be able to reset his/her password
260
+ if !test_env?
261
+ set_mailgun_prefix
262
+ url = "#{request.base_url}/#{@mailgun_prefix}reset/#{user.user_key}/#{reset_key}"
263
+ res = Mailgun.post("/#{ENV['MAILGUN_DOMAIN']}/messages",
264
+ body: { from: "#{ENV['MAILGUN_SENDER_NAME']} <#{ENV['MAILGUN_SENDER_EMAIL']}>",
265
+ to: "#{user.email}",
266
+ subject: 'Reset your password',
267
+ text: "the reset url is: #{url}" })
268
+ if res.code == 200
269
+ return true
270
+ else
271
+ @error_sent_message = res.message
272
+ return false
273
+ end
274
+ elsif test_env?
275
+ return true
276
+ else
277
+ return false
278
+ end
279
+ end
280
+
281
+ def valid_invitation_key?
282
+ # This will check if there's a valid invitation key submitted as a parameter..
283
+ if ((params[:invitation_key] && Invitation.exists?(invitation_key: params[:invitation_key])) || (user_params && user_params[:invitation_key] && Invitation.exists?(invitation_key: user_params[:invitation_key])))
284
+ @invitation_key = params[:invitation_key] || user_params[:invitation_key]
285
+ return true
286
+ else
287
+ return false
288
+ end
289
+ end
290
+
291
+ end
292
+ end
@@ -0,0 +1,30 @@
1
+ module Cally
2
+ module ApplicationHelper
3
+ #helper_method :current_user, :logged_in?, :is_admin?, :is_first_user?
4
+
5
+ def current_user
6
+ @current_user ||= User.find(session[:user_id]) if session[:user_id]
7
+ end
8
+
9
+ def logged_in?
10
+ !!current_user
11
+ end
12
+
13
+ def is_admin?
14
+ if logged_in? && current_user.admin
15
+ return true
16
+ else
17
+ return false
18
+ end
19
+ end
20
+
21
+ def is_first_user?(user)
22
+ if user == User.first
23
+ return true
24
+ else
25
+ return false
26
+ end
27
+ end
28
+
29
+ end
30
+ end
@@ -0,0 +1,4 @@
1
+ module Cally
2
+ module InvitationsHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Cally
2
+ module SessionHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Cally
2
+ module UsersHelper
3
+ end
4
+ end
@@ -0,0 +1,3 @@
1
+ class ApplicationRecord < ActiveRecord::Base
2
+ self.abstract_class = true
3
+ end
@@ -0,0 +1,8 @@
1
+ module Cally
2
+ class Invitation < ActiveRecord::Base
3
+
4
+ before_save { self.email = email.downcase }
5
+ validates :email, uniqueness: { case_sensitive: false }, format: { with: /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i }
6
+
7
+ end
8
+ end
@@ -0,0 +1,13 @@
1
+ module Cally
2
+ class User < ActiveRecord::Base
3
+
4
+ has_secure_password
5
+ before_save { self.email = email.downcase }
6
+ before_save { self.security_answer = security_answer.downcase }
7
+ validates :username, presence: true, length: { minimum: 3, maximum: 25 }, uniqueness: { case_sensitive: false }
8
+ validates :email, presence: true, uniqueness: { case_sensitive: false }, format: { with: /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i }
9
+ validates :password, length: { minimum: 15 }, allow_nil: true
10
+ validates :security_question, presence: true
11
+ validates :security_answer, presence: true, uniqueness: { case_sensitive: false }
12
+ end
13
+ end
@@ -0,0 +1,30 @@
1
+ <%= render 'cally/shared/header' %>
2
+ <%= render 'cally/shared/messages' %>
3
+
4
+ <div class="row">
5
+ <div class="col-md-4 col-md-offset-4">
6
+ <div class="padded-mobile">
7
+ <h1 class="centered">All Invitations</h1>
8
+
9
+ <% @invitations.each do |invite| %>
10
+ <div class="row invitation-overview">
11
+ <div class="col-md-4">
12
+ <%= sanitize invite.email %>
13
+ </div>
14
+ <div class="col-md-4">
15
+ <%= invite.created_at.to_s(:omw_long) %>
16
+ </div>
17
+ <div class="col-md-4">
18
+ <%= link_to 'Delete', delete_invitation_path(invite.id), method: :delete %> |
19
+ <% if invite.sent %>
20
+ <%= link_to 'resend', send_invitation_path(invite) %>
21
+ <% else %>
22
+ <%= link_to 'send', send_invitation_path(invite) %>
23
+ <% end %>
24
+ </div>
25
+ </div>
26
+ <% end %>
27
+ </div> <!-- end padded-mobile //-->
28
+ </div> <!-- end col-md-4 outer //-->
29
+ </div> <!-- end row outer //-->
30
+ <div class="centered custom-pagination"><ul><%= will_paginate @invitations, container: false %></ul></div>
@@ -0,0 +1,20 @@
1
+ <%= render 'cally/shared/header' %>
2
+ <%= render 'cally/shared/errors', obj: @invitation %>
3
+ <%= render 'cally/shared/messages' %>
4
+
5
+ <div class="row">
6
+ <div class="col-md-4 col-md-offset-4">
7
+ <div class="padded-mobile">
8
+ <h1 class="centered">Request an invitation</h1>
9
+
10
+ <%= form_for @invitation, html: { class: 'form-horizontal' } do |f| %>
11
+ <div class="form-group">
12
+ <div class="col-md-12"><%= f.text_field :email, placeholder: 'Enter your email address', class: 'form-control' %></div>
13
+ </div>
14
+ <div class="form-group">
15
+ <div class="col-md-12"><%= f.submit 'Request invitation', class: 'btn btn-success btn-block' %></div>
16
+ </div>
17
+ <% end %>
18
+ </div> <!-- end padded-mobile div //-->
19
+ </div> <!-- end col-md-4 div //-->
20
+ </div> <!-- end row div //-->
@@ -0,0 +1,6 @@
1
+ <% if obj && obj.errors.any? %>
2
+ <% obj.errors.full_messages.each do |msg| %>
3
+ <%= msg %>
4
+ <% end %>
5
+ <% end %>
6
+
@@ -0,0 +1,25 @@
1
+ <nav class="navbar navbar-default" id="menu-bar">
2
+ <div class="container-fluid">
3
+ <div class="navbar-header">
4
+ <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#menu" aria-expanded="false">
5
+ <span class="glyphicon glyphicon-menu-hamburger"></span>
6
+ </button>
7
+ <span class="navbar-brand">Cally User Engine</span>
8
+ </div> <!-- end navbar-header //-->
9
+ <div class="collapse navbar-collapse" id="menu">
10
+ <ul class="nav navbar-nav navbar-right">
11
+ <% if logged_in? %>
12
+ <% if current_user.admin %>
13
+ <li><%= link_to 'Invitations', all_invitations_path, class: "#{'active' if current_page? all_invitations_path}" %></li>
14
+ <li><%= link_to 'All Users', users_path, class: "#{'active' if current_page? users_path}" %></li>
15
+ <% end %>
16
+ <li><%= link_to 'Profile', user_path(current_user), class: "#{'active' if current_page? user_path(current_user)}" %></li>
17
+ <li><%= link_to 'Edit', edit_user_path(current_user), class: "#{'active' if current_page? edit_user_path(current_user)}" %></li>
18
+ <li><%= link_to 'Logout', logout_path, method: :delete %></li>
19
+ <% else %>
20
+ <li><%= link_to 'Login', login_path, class: "#{'active' if current_page? login_path}" %></li>
21
+ <% end %>
22
+ </ul> <!-- end menu-items //-->
23
+ </div> <!-- end navbar-collapse //-->
24
+ </div> <!-- end container-fluid //-->
25
+ </nav> <!-- end navbar //-->
@@ -0,0 +1,7 @@
1
+ <% flash.each do |name,msg| %>
2
+ <div class="alert alert-dismissable alert-<%= name %> centered">
3
+ <button type="button" class="close" data-dismiss="alert">x</button>
4
+ <%= sanitize msg %>
5
+ </div>
6
+ <% end %>
7
+
@@ -0,0 +1,19 @@
1
+ <%= render 'cally/shared/header' %>
2
+ <%= render 'cally/shared/messages' %>
3
+
4
+ <div class="row">
5
+ <div class="col-md-4 col-md-offset-4">
6
+ <div class="padded-mobile">
7
+ <h1 class="centered">Answer your security question</h1>
8
+
9
+ <%= form_for :user, method: :put, html: { class: 'form-horizontal'} do |f| %>
10
+ <%= f.hidden_field :email, value: @user_email %>
11
+ <div class="centered security-question">security question: </div>
12
+ <div class="centered"><%= sanitize @security_question %></div>
13
+ <div class="form-group"><%= f.text_field :security_answer, placeholder: 'Enter your answer to the security question', class: 'form-control' %></div>
14
+ <div class="form-group"><%= f.submit 'Reset password', class: 'btn btn-warning btn-block' %></div>
15
+ <% end %>
16
+ </div> <!-- end padded-mobile div //-->
17
+ </div> <!-- end col-md-4 div //-->
18
+ </div> <!-- end row div //-->
19
+
@@ -0,0 +1,45 @@
1
+ <%= render 'cally/shared/header' %>
2
+ <%= render 'cally/shared/messages' %>
3
+ <%= render 'cally/shared/errors', obj: @user %>
4
+
5
+ <!-- the next div is to add an id saying this is the edit page (used by javascript password check) //-->
6
+ <div id="edit_page" class="edit_page"></div>
7
+ <!-- end special div //-->
8
+ <div class="row">
9
+ <div class="col-md-4 col-md-offset-4">
10
+ <div class="padded-mobile">
11
+ <h1 class="centered">Update your profile</h1>
12
+ <%= form_for @user, html: { class: 'form-horizontal'} do |f| %>
13
+ <div class="form-group">
14
+ <label for="user_username" class="control-label col-md-2">Username</label>
15
+ <div class="col-md-10"><%= f.text_field :username, class: 'form-control' %></div>
16
+ </div>
17
+ <div class="form-group">
18
+ <label for="user_email" class="control-label col-md-2">E-mail</label>
19
+ <div class="col-md-10"><%= f.text_field :email, class: 'form-control' %></div>
20
+ </div>
21
+ <div class="form-group">
22
+ <label for="user_password" class="control-label col-md-2">Password</label>
23
+ <div class="col-md-10"><%= f.password_field :password, class: 'form-control password' %></div>
24
+ </div>
25
+ <div class="form-group">
26
+ <label for="user_password_check" class="control-label col-md-2">Re-enter password</label>
27
+ <div class="col-md-10"><%= f.password_field :password_check, placeholder: 'Re-enter your password', class: 'form-control password-check' %></div>
28
+ </div>
29
+ <div class="form-group">
30
+ <label for="user_security_question" class="control-label col-md-2">Security Question</label>
31
+ <div class="col-md-10"><%= f.text_field :security_question, class: 'form-control' %></div>
32
+ </div>
33
+ <div class="form-group">
34
+ <label for="user_security_answer" class="control-label col-md-2">Security Answer</label>
35
+ <div class="col-md-10"><%= f.text_field :security_answer, class: 'form-control' %></div>
36
+ </div>
37
+ <div class="form-group">
38
+ <div class="col-md-10 col-md-offset-2">
39
+ <%= f.submit 'Update Profile', class: 'btn btn-primary btn-block submit-btn', disabled: 'disabled' %>
40
+ </div>
41
+ </div>
42
+ <% end %>
43
+ </div> <!-- end padded-mobile div //-->
44
+ </div> <!-- end col-md-4 div //-->
45
+ </div> <!-- end row div //-->
@@ -0,0 +1,15 @@
1
+ <%= render 'cally/shared/header' %>
2
+ <%= render 'cally/shared/messages' %>
3
+
4
+
5
+ <div class="row">
6
+ <div class="col-md-4 col-md-offset-4">
7
+ <div class="padded-mobile">
8
+ <h1 class="centered">Reset your password</h1>
9
+ <%= form_for :user, html: { class: 'form-horizontal'} do |f| %>
10
+ <div class="form-group"><%= f.text_field :email, placeholder: 'Enter your email address', class: 'form-control' %></div>
11
+ <div class="form-group"><%= f.submit 'Show security question', class: 'btn btn-primary btn-block' %></div>
12
+ <% end %>
13
+ </div> <!-- end padded-mobile div //-->
14
+ </div> <!-- end col-md-4 div //-->
15
+ </div> <!-- end row div //-->
@@ -0,0 +1,32 @@
1
+ <%= render 'cally/shared/header' %>
2
+ <%= render 'cally/shared/messages' %>
3
+
4
+ <div class="row">
5
+ <div class="col-md-4 col-md-offset-4">
6
+ <div class="padded-mobile">
7
+ <h1 class="centered">Users</h1>
8
+
9
+ <% @users.each do |user| %>
10
+ <div class="row user-overview <%= 'admin' if user.admin %>">
11
+ <div class="col-md-4">
12
+ <div><%= sanitize user.username %></div>
13
+ </div> <!-- end username and admin //-->
14
+ <div class="col-md-4">
15
+ Last Logged in: <%= user.last_logged_in_time.to_s(:omw_long) %>
16
+ </div> <!-- end last logged in time user //-->
17
+ <div class="col-md-4">
18
+ <% if !is_first_user?(user) && is_admin? && !user.admin %>
19
+ <%= link_to 'admin', toggle_admin_path(user), method: :post %> |
20
+ <% elsif !is_first_user?(user) && is_admin? && user.admin %>
21
+ <%= link_to 'revoke admin', toggle_admin_path(user), method: :post %> |
22
+ <% end %>
23
+ <% if !is_first_user?(user) && is_admin? %>
24
+ <%= link_to 'Delete', user_path(user), method: :delete %>
25
+ <% end %>
26
+ </div> <!-- end user actions //-->
27
+ </div> <!-- end row user //-->
28
+ <% end %>
29
+ </div> <!-- end padded-mobile //-->
30
+ </div> <!-- end col-md-4 outer //-->
31
+ </div> <!-- end row outer //-->
32
+ <div class="centered custom-pagination"><ul><%= will_paginate @users, container: false %></ul></div>
@@ -0,0 +1,22 @@
1
+ <%= render 'cally/shared/header' %>
2
+ <%= render 'cally/shared/messages' %>
3
+ <% session[:return_to] = request.referer %>
4
+
5
+ <% if defined? @user %>
6
+ <%= render 'cally/shared/errors', obj: @user %>
7
+ <% end %>
8
+
9
+ <div class="row">
10
+ <div class="col-md-4 col-md-offset-4">
11
+ <div class="padded-mobile">
12
+ <h1 class="centered">Login</h1>
13
+
14
+ <%= form_for :session, html: { class: 'form-horizontal'} do |f| %>
15
+ <div class="form-group"><%= f.text_field :email, placeholder: 'Enter your email address', class: 'form-control' %></div>
16
+ <div class="form-group"><%= f.password_field :password, placeholder: 'Enter your password', class: 'form-control' %></div>
17
+ <div class="form-group"><%= f.submit 'login', class: 'btn btn-block btn-primary' %></div>
18
+ <% end %>
19
+ <div class="centered"><%= link_to 'Forgot password', forgot_password_path %></div>
20
+ </div> <!-- end padded-mobile div //-->
21
+ </div> <!-- end col-md-4 div //-->
22
+ </div> <!-- end row div //-->
@@ -0,0 +1,40 @@
1
+ <%= render 'cally/shared/header' %>
2
+ <%= render 'cally/shared/errors', obj: @user %>
3
+ <%= render 'cally/shared/messages' %>
4
+
5
+ <div class="row">
6
+ <div class="col-md-4 col-md-offset-4">
7
+ <div class="padded-mobile">
8
+ <h1 class="centered">Create your account</h1>
9
+
10
+ <%= form_for @user, html: { class: 'form-horizontal'} do |f| %>
11
+ <div class="form-group">
12
+ <%= f.text_field :username, placeholder: 'enter your username', class: 'form-control' %>
13
+ </div>
14
+ <div class="form-group">
15
+ <%= f.text_field :email, placeholder: 'enter your e-mail address', class: 'form-control' %>
16
+ </div>
17
+ <div class="form-group">
18
+ <%= f.password_field :password, placeholder: 'enter your password (minimum 15 characters)', class: 'form-control password' %>
19
+ </div>
20
+ <div class="form-group">
21
+ <%= f.password_field :password_check, placeholder: 'Re-enter your password', class: 'form-control password-check' %>
22
+ </div>
23
+ <div class="form-group">
24
+ <%= f.text_field :security_question, placeholder: 'Enter your security question', class: 'form-control' %>
25
+ </div>
26
+ <div class="form-group">
27
+ <%= f.text_field :security_answer, placeholder: 'Enter your security answer', class: 'form-control' %>
28
+ </div>
29
+
30
+ <% if defined? @invitation_key %>
31
+ <%= f.hidden_field :invitation_key, value: @invitation_key %>
32
+ <% end %>
33
+
34
+ <div class="form-group">
35
+ <%= f.submit 'Create account', class: 'btn btn-success btn-block submit-btn', disabled: 'disabled' %>
36
+ </div>
37
+ <% end %>
38
+ </div> <!-- end padded-mobile div //-->
39
+ </div> <!-- end col-md-4 div //-->
40
+ </div> <!-- end row div //-->
@@ -0,0 +1,3 @@
1
+ <%= render 'cally/shared/header' %>
2
+ <%= render 'cally/shared/messages' %>
3
+ <h1>Reset your password</h1>