cally 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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>