async_response 0.0.1

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 (271) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +3 -0
  4. data/Rakefile +31 -0
  5. data/app/assets/javascripts/async_response/application.js +35 -0
  6. data/app/assets/javascripts/async_response/async_response.js +34 -0
  7. data/app/assets/stylesheets/async_response/application.css +14 -0
  8. data/app/controllers/async_response/application_controller.rb +4 -0
  9. data/app/controllers/async_response/concerns/async_controller.rb +24 -0
  10. data/app/controllers/async_response/responses_controller.rb +28 -0
  11. data/app/helpers/async_response/application_helper.rb +4 -0
  12. data/app/models/async_response/job.rb +57 -0
  13. data/app/views/async_response/responses/index.html.haml +44 -0
  14. data/app/views/layouts/async_response/application.html.haml +28 -0
  15. data/config/routes.rb +4 -0
  16. data/db/migrate/20150702102322_create_async_response_jobs.rb +15 -0
  17. data/db/migrate/20150702131057_add_params_json_to_async_response_jobs.rb +5 -0
  18. data/lib/async_response/builder.rb +47 -0
  19. data/lib/async_response/engine.rb +12 -0
  20. data/lib/async_response/expirer.rb +14 -0
  21. data/lib/async_response/version.rb +3 -0
  22. data/lib/async_response/workers/sidekiq.rb +43 -0
  23. data/lib/async_response.rb +20 -0
  24. data/lib/tasks/async_response_tasks.rake +4 -0
  25. data/spec/dummy/README.rdoc +28 -0
  26. data/spec/dummy/Rakefile +6 -0
  27. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  28. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  29. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  30. data/spec/dummy/app/controllers/projects_controller.rb +34 -0
  31. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  32. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  33. data/spec/dummy/bin/bundle +3 -0
  34. data/spec/dummy/bin/rails +4 -0
  35. data/spec/dummy/bin/rake +4 -0
  36. data/spec/dummy/bin/setup +29 -0
  37. data/spec/dummy/config/application.rb +26 -0
  38. data/spec/dummy/config/boot.rb +5 -0
  39. data/spec/dummy/config/database.yml +25 -0
  40. data/spec/dummy/config/environment.rb +5 -0
  41. data/spec/dummy/config/environments/development.rb +41 -0
  42. data/spec/dummy/config/environments/production.rb +79 -0
  43. data/spec/dummy/config/environments/test.rb +42 -0
  44. data/spec/dummy/config/initializers/assets.rb +11 -0
  45. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  46. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  47. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  48. data/spec/dummy/config/initializers/inflections.rb +16 -0
  49. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  50. data/spec/dummy/config/initializers/session_store.rb +3 -0
  51. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  52. data/spec/dummy/config/locales/en.yml +23 -0
  53. data/spec/dummy/config/routes.rb +4 -0
  54. data/spec/dummy/config/secrets.yml +22 -0
  55. data/spec/dummy/config.ru +4 -0
  56. data/spec/dummy/db/development.sqlite3 +0 -0
  57. data/spec/dummy/db/schema.rb +30 -0
  58. data/spec/dummy/db/test.sqlite3 +0 -0
  59. data/spec/dummy/log/development.log +2882 -0
  60. data/spec/dummy/log/test.log +2638 -0
  61. data/spec/dummy/public/404.html +67 -0
  62. data/spec/dummy/public/422.html +67 -0
  63. data/spec/dummy/public/500.html +66 -0
  64. data/spec/dummy/public/favicon.ico +0 -0
  65. data/spec/dummy/spec/controllers/projects_controller_spec.rb +43 -0
  66. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/-783RFwXs4Ee9ZDS5nCkVOSZTyk0pFUTyZJC50DotJs.cache +0 -0
  67. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/-zeUwlY0iBAZuYNBCenXRAenRD2gfdPJ0rO3bJ2TKm0.cache +0 -0
  68. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/0MtcJLD6j0r7M9MumjBBAA2AqHGHalxogMTMcwgRa0s.cache +1 -0
  69. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/0QhFXP7LrfE-06fMH_JnpbOneboWOBzCYqOK9nug22o.cache +3 -0
  70. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/0S403J6D4dPNmSCmfLwcdBL_QFbxYqwNA3R0n1LJhgQ.cache +2 -0
  71. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/0VVAC5y97sGbCrmns1Y0VDRLTX-NtH3XqX70DW8kOiA.cache +3 -0
  72. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/1OfF7MXl5U1YlhnthjZQlXgbm6Xq25FTi1wEyVQbIpY.cache +1 -0
  73. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/1Qx6Rf0sd9E_s4zoRJPqraepuOGTFaqt21dR85lH9fg.cache +1 -0
  74. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/1pMTfMCtd-oGdtw1ex7LEIse-7k-t63g062_BJxrCw0.cache +1 -0
  75. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/1pjuuf4-skJIXivL_QwkVJCcmlhlnN3VETTHhXbwRj0.cache +1 -0
  76. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/1vOu0cTkgzOMybEF5h6Y3vleR9V5bsmJxtdhIV9Pnto.cache +1 -0
  77. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/2L0Cf95guGcqSs1FuvCKdwmQpvVUDAO51okOmDbjCh4.cache +1 -0
  78. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/2Uq1VcFPTCe3_ihV_y0i6FxmAmC2YbNXREoSg5f-Ka4.cache +1 -0
  79. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/2eHBS1yohu30yQSEE1bgop6FS-FkvhpPAtpjaVOas9g.cache +1 -0
  80. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/2ubj0lI1p_12PNsXipFE3UwFouIUXgLHY9hNLq0maAk.cache +0 -0
  81. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/3TXA5An-YMwlpyKDZ8IhDGCHwPi3dkQQKYL5rycA0eY.cache +0 -0
  82. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/3TnLpcKi2n7dSjD8-j_QNGjcP-MH2TyCLQhSM8Et3lk.cache +0 -0
  83. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/3vlResiwETfGapG4UWH3oep61Vs7fRXISfjvOiqI5zE.cache +0 -0
  84. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/4Cgm8MRsS_VTb1hKmu8KQNnX0gESWltoX0mXscUDDqI.cache +1 -0
  85. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/4YSma6j2oF19ZhPsfFzFCy-9FDiCMiln41ZOw2xZVoc.cache +1 -0
  86. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/556CzHOAbUV8w-tpxZU8ASnvr9QmKi9gbCymgOepVL0.cache +2 -0
  87. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/6KwB_YQBJBGHY52mT5arv5YTUv0Nw9lOU_bv_e2WEaI.cache +1 -0
  88. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/6PvYEUn96b2RwgmRDtrBVWJcfo2d3T5QmBvmdagWoQU.cache +0 -0
  89. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/6Sr-EUcSbWERaffJoAygia8384tZudiMV8x_jhBw-Fc.cache +1 -0
  90. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/6UiJMClHk1QRzbC2DGIxNi1GFCiDzQM9dUAW6TqQQ9g.cache +0 -0
  91. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/6boz4nvdC6N9g7og6nL83AqzZM0ucY2O7TnF7ssNE_A.cache +0 -0
  92. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/7Q8Bk_Fan6rGhXCmEVznBB72TH5T3hQqRKbbG4nh1a8.cache +1 -0
  93. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/7mJpY9ItMhtiiPGT1zpvi52A1Y0EI7uTC8YcSim-QE0.cache +0 -0
  94. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/81zUrnEP1KFG9Sb7IbBQMcot6YANKxz6CM9Z2SqG5F4.cache +0 -0
  95. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/8brF3mwsnB0aAuunKDqBZxt2gwLoShg2mIZ1taxnNNM.cache +0 -0
  96. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/8bua_oKmlUDpsnxbD9-gapgFdHpEXEXIcLz5FuSIU5E.cache +2 -0
  97. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/8d2lTMCGhtFDVr8dwUg01auf3xDeI7aHH0bbOrYcM6I.cache +2 -0
  98. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/8o9ci5MrO_xZJysGi_v38Z3mi1SPm8p1n93P9zOzXYc.cache +0 -0
  99. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/9LdOQCJSyP0D-pupoWAg9inVuu11MxLTWUCbS8BcwYk.cache +0 -0
  100. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/9k0bP_C0y5jHN_ocV4Yg79NggZnocAWb7N4aewGYVPg.cache +1 -0
  101. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/AE0lBjl_g1isExqRe8zYAAhWyz5PyaEJMN7V3E8vX2U.cache +1 -0
  102. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/BEkkkwKJLPiLi1qz5btskV4TU3WcoakG4E3MAKyzctQ.cache +1 -0
  103. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/BTq7WC-_TGHmvh5fqs5IynytjrRPmXzPPisB6BBcv0M.cache +1 -0
  104. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/CjA6Sfvwqh0gMHEt80BlMz1IK-l_XA5YWk6QYTA_RZs.cache +1 -0
  105. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/Cpcb-TXd89Mz6c7iFvrY9PbzwGNhVjRE22cdKdWwcPk.cache +3 -0
  106. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/DRdFu23jWYbTGSfFfainDfRgJOS-Gol1A2erk7NTnSM.cache +1 -0
  107. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/DqqOzJWKA_timtG2gpHVHm8g1UdxbstpTokfi2DS-AU.cache +0 -0
  108. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/DyPMBiVAIXNLFI9P9DbHtLoEwqcn-9NeYxz8EWt67IE.cache +2 -0
  109. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/EcDQulEWn40moq8-8B3KcUBV2HGcf7_MgpOLV3r4mDM.cache +1 -0
  110. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/ErYOk9mmud3Pfm5b9QaQLA_pMfA5gJF3sC7VoFloCzc.cache +0 -0
  111. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/FUbxjcM6I3i_JSc6x9SmV69ufS1fDi9a601FFHxek3s.cache +3 -0
  112. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/Fd5iLyLswdFU8FUvk_Q4mINBHyav3knueb-RF5T8CVE.cache +1 -0
  113. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/Fqj-80mNb7-NxvWBG0AGw8wAmG4mjdYHtxjG_u3LVEE.cache +2 -0
  114. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/Fst1kR3s-xiPxztKPYaWiSAGUw1tgfN25ShWjyJAdEE.cache +1 -0
  115. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/G_WBkxBKPhPlAjrAgDGGzJgoOTo_NuK72e3HOKpSEY8.cache +0 -0
  116. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/HFcQQM32obBjJiwdOQwCcE6YDLcYKFV_awF07J-h67Y.cache +3 -0
  117. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/HiWSRSYRLULX0EZ00SwwGGXTrRzOPMy7O4Gr3XjIR5I.cache +1 -0
  118. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/HlEyy5JMoLpLGEpiHt_h8edUFxGQ77SP6E_DOJqPxZ4.cache +1 -0
  119. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/ISQ7LfCwq2SdvSwJCxUbT6lXbKSwT0xrJYWohIbsXuk.cache +0 -0
  120. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/IZh4bmRkR1YotMCiElf4VSYdm6nKZp3ybsF_PF8eggE.cache +1 -0
  121. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/IrsZkHlubufu0q1biYTe9IRQucc8PodWPneuorCt3b0.cache +0 -0
  122. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/JQ3RICmxRktvTdxMtBHiAXfCVa74ku0h70sOaYQD-yw.cache +0 -0
  123. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/JZ3fUyviGJF3CZqBA0gScITxzFDhwibWBj-imO8C2ig.cache +1 -0
  124. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/JzfyCnTj2rNmVVnbxxGWIMkEaVA3k-cjFrH084F6Fk4.cache +0 -0
  125. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/KO0rZoeZsLBThYtzdaMIpr0ybOooCwT5lq7HRswEt0w.cache +1 -0
  126. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/KmjjXAtQ3Nvrvv5O0L_x5FjkYHjAEy63fP1GnWjUb0w.cache +1 -0
  127. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/KvSryfpLkn_JdmQN94ZJdpAutAFl1kZqNc33tyLQhcA.cache +1 -0
  128. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/Kyd6jyCYIJ2YhLHrtTSCDSK2r1o6zBluAGr2MAp9ybA.cache +1 -0
  129. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/Lmt1ar4CfizCwm6FS0VF-yStJV9e6Mus4P1vZJF1qM0.cache +0 -0
  130. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/M7QQmbwh7ZzF6lkxcExQqeR7ntmZ8Zg4QnepaLjpxqk.cache +0 -0
  131. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/Mi3p_pCsUHmLrOOD91_2SqLjGkUwgpQ_7MA1F5KUfiw.cache +2 -0
  132. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/Miduxdp1CNxleRi5nHxMQ5Mu6hb5pVOERiqzSGOFpJs.cache +0 -0
  133. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/N3qEy2kA0K5XcK6gp4HFj-7smwITPH_W8CV_reSr4Yw.cache +1 -0
  134. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/N8llxE0vUU9SqO5k4wJMvzeQwkYI4X37jgFEgUEA1eo.cache +0 -0
  135. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/NYQK-NTEm1z-rdw_W2vj4mJUyjypmq0JvObFb6tXZLY.cache +1 -0
  136. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/Nz3--dBlBZMBYxcQSu_FmPJHkl3Y367SLcssq5jOtkI.cache +1 -0
  137. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/OLiwZAYURs4AVAjjhB1h3G9tRRlXeFiKsOR_U-TDFDY.cache +1 -0
  138. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/ONr0GL4frosKTu9O_1KoibbARlbO-KOLDo1H4QH241A.cache +0 -0
  139. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/OXtZS3Uxi49PCqPr0ebmmmSOhFuS1vzsZxLxuVd0ZH8.cache +1 -0
  140. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/OrCcf17jaf1USEjbaWiC8YGtLzc6Ex6687SHHSMj1LE.cache +1 -0
  141. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/Q6cVaZXlTHwJhm2fPfGo_zCVotz4oohoH3QCKDD0GuA.cache +1 -0
  142. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/QcBllL_e9KQOHDb0luxO-PKxzioWQx0E9DD29QDcusw.cache +2 -0
  143. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/R64M0MMvTnTelciiMsOYn7WZBqIDOIn0-blRKa6Zu6s.cache +0 -0
  144. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/RFiHS_XROFZkWvyKJkrRAnYuPTmSPsiRcHLX2yWncEE.cache +1 -0
  145. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/RTxXZagYRszr2ZUhbk4bv0bi5iReYj0nQy_EVjAoUww.cache +1 -0
  146. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/RYH9uHDE4CdwhaKTPVweIK5SsB7zVIa7alCH2_FCZF4.cache +2 -0
  147. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/RcXivU0Qr8IcT1XjtB-pZ3-0WDm5iDuuCtMuOoWVwAw.cache +0 -0
  148. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/S0qB6XISPQFmVNR3m6_lGx1zuBQ81u7MiVgNbdXDwG0.cache +3 -0
  149. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/SU03LdbUEwJ5zs7PoB_pjYL4kEWddkihh9eYucNIwO4.cache +1 -0
  150. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/SltwDf99Eh2nGTLFXf5bVs5ltTBzh-apbugM0PzH4Qk.cache +2 -0
  151. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/T6cqTTQaHkUrcc_PwmGTnpXWWMksuS-9UeaUgPayuLk.cache +1 -0
  152. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/T9B7odwUEN5L0hb7auGrNan8rByXOPL3EEB8PSSaSpE.cache +3 -0
  153. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/UEHO4cCqoyW23X-DBLugFSAAZQcCkpTcighZ97crSdk.cache +0 -0
  154. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/US8IYlWcHrKlUEAvopK9QuThYImqhqeVENeBy6tBGOs.cache +1 -0
  155. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/UpUFv3XCMi_DARP8bgZWRiNKs1UbI6Q_Ul_JjTe9Cm4.cache +1 -0
  156. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/VUodZ4e4CzbfgFWTEX-6xqlLAwerwbY8GewQPC5qeaI.cache +1 -0
  157. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/VwhAErAB8OE1QiAy3-uLy3CtW0C8YG73jcbZ8C3l6D0.cache +1 -0
  158. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/W8i-psM30zakXT2B7nUPLsk7Caim3WKYStiSa0jr3bA.cache +1 -0
  159. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/WO55w-fj_6DwbvFaF4zKV0ICUSnRRtpKUFezc0T6dU8.cache +2 -0
  160. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/WQgfYXGMAg2lxA3Go72Lpr_Zj39PJcfA3mZWFEB30-0.cache +1 -0
  161. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/Wz8ecjM_Q8xmuRfmM1wuQ8oswdt2NrLgGfgoHDN6EJU.cache +0 -0
  162. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/XIx5vyHm8TlxFgLG1z1n_YPQ3yrhT7WziQEPloBPiAY.cache +2 -0
  163. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/XTQIwxSYZddrzEY_W_t-uDHi2GmSfn33iFqwgxzLPt0.cache +2 -0
  164. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/XYXFQWtME3tCa0DfTUpwrBSOAeEpvRj1V_7dapFSxYk.cache +0 -0
  165. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/YKwedfgWrIzxG1MuDXod8IxXF56PUIRwWxurkBEvZ-4.cache +0 -0
  166. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/YRqyGAocYX3a_9Z4HtHdKat-3LnrYrRXAirkObav-xM.cache +2 -0
  167. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/YSgRa8qCD8t2uf8AM083WXZQva_CqnMKbcBB590I8gs.cache +3 -0
  168. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/YZmPPvLJPQWXC9dnuZVJ-wgaWURL43iRCXFwlqKScIE.cache +1 -0
  169. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/YaQB1RkDN8-FubZwncxRK9rzmM23ifUxaakK16XdOuA.cache +2 -0
  170. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/ZSM25cQyxfy8kAKp5mCP2w5vnon0JqQ5agclQNs4hRA.cache +2 -0
  171. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/Zen-b-_c8denGrlPiPTgPrFkCQxCBBPSJ0k97bxXrVw.cache +1 -0
  172. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/ZiENFdL6PvfaaXmDMapHA90l0ga7SFDKk8taEWqf6jc.cache +1 -0
  173. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/ZjDMOVsDHmb2W06kqbB_PLPvdDrX3xj34iBCTDfxPN8.cache +0 -0
  174. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/_6LdbF9trbRJe7Iqu_Js1LoYWnmBRvTRU0OjrGoqYkU.cache +0 -0
  175. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/_YeGhdxUnzc6oLpdDrtn5vcwX6LfiAnI6latmMzScn4.cache +0 -0
  176. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/_kmoCXoXeCIxfNm4rTzArpRhs7zl2y04p7qZpzbt9u8.cache +0 -0
  177. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/aNupD4VBSwIwAKD47bslDwBH2yyGTgl97ASGquUKOog.cache +3 -0
  178. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/aV4RcEPErWIdWPwh8VISTk6xKg9ZY4mDIBM1foe7ly8.cache +1 -0
  179. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/bQ0B6S1LP5zUQglHlIL27BsgKI4XFieIj6s4Px0lbDU.cache +0 -0
  180. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/bUrhIiDPSm9yqwM308ecgDgz7JqQPYpJ4S9MtJ5NaGA.cache +1 -0
  181. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/bYWBRBSiCWu2JLyrw7eoE8Zz6-zDTm5ruJIKUSRtq4s.cache +1 -0
  182. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/ba8T0x50EVKw1_5RFMVvmEVuoYg0lDaRYdbYLcGEUdY.cache +1 -0
  183. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/boPSCBi-zgv_QzXKGLbCSnRpD-f4BwwMPpimTtbxg5Y.cache +0 -0
  184. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/bsEu7D0a6IG63HJLEsYnOpL_s63wMmSIZCw2cy_RXQM.cache +0 -0
  185. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/cAszxrnFoXU84PMzArpfYRCvjRgcw3_0VFSAKtgtERw.cache +1 -0
  186. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/cLvmgu2AOzV2LyS2W21ITyegbBXMChimgObER_HTXtw.cache +1 -0
  187. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/cQ9Dq23qFKKdC9OjfemeOMlyZFOguS2vYxqL4awYyR4.cache +0 -0
  188. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/cpdtIU8udx-lxCV_2-lBzctOJhydC3Mtkgr6cXDxKMg.cache +1 -0
  189. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/d-cOwtw3xG7Kprj3JzPkkqZxBSCyn4jRClM85I_1OIw.cache +1 -0
  190. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/e0A_fKMgYMhD_xtefOiY4Wx8NdpjANeR7GDSaOKY558.cache +0 -0
  191. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/e6Z8w6LXcntZmuy7Ve3p4IidWEr8qmWFcTo_7NcVeVY.cache +3 -0
  192. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/es6UvWckIXl0uYxx5SECiacB7cLRi-_-YXvpIsitGE4.cache +1 -0
  193. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/fwgD_yermLNOXjmqgw6j5jDBn2npiH_FDhfefB2ZdLQ.cache +0 -0
  194. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/gCeU7CVBwMdxbMCY8CYpq8aR3oNZlB8Bso6dRVuuBas.cache +0 -0
  195. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/gcLoFzGV8BIK5JZz7fWDcu-l-wcJr35YfARjflhHskE.cache +0 -0
  196. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/gxe4j8_zH9WhEb29BfP5iP27hWIIyjruIKRd7M1D8jM.cache +3 -0
  197. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/h38XjFoJWo63nGDcRPdqsVG0Oa5xhuvp1-fGuy_1l1U.cache +1 -0
  198. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/hRcGGnNVGvTGrxyra_5VOrkzmatc0zOUXcAAaxtiODw.cache +2 -0
  199. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/hUePPUoB_bMurOwbN8Am0WDJaLdMJvP3RN3zwoCnVCA.cache +2 -0
  200. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/iVrAOXux2KuhJzTsheFkP5NVnAub0CC7Jjn95i2SCIY.cache +1 -0
  201. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/iZ3NuIj17m3j4UikKNxIFrgReokDT0z6fevFXq6pfdc.cache +1 -0
  202. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/ibZy3OgewKB13N6QyTk1ghdbUB09_c8fn9JJNc2Aylw.cache +1 -0
  203. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/jb4H1Z9llRC8wzFhLm7QvDIoZJgkyRFisjs9mxC0HmI.cache +3 -0
  204. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/jewJx3a4gxEJWINpBqWrMJoCvw1hR0lsYHcFxmFN56w.cache +2 -0
  205. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/jh5sN5WOP2Bdp5DjUM8IkxHgNLxfzFhe31PRnlrYRbE.cache +2 -0
  206. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/jzI-j3cGErzW7qklfRfdpjxbxNqfi_RmB3kfnCcJn-Q.cache +0 -0
  207. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/k7nSxJ3BjYCCIWb8TJSWCrLA7LN2gjwZOdTTwvoE8a4.cache +3 -0
  208. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/kMiJhXiOxSpK5EvjmtMWdwxMf8H4IyzFmNoCVVk0Wng.cache +1 -0
  209. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/kez-03bNo18wZyZ7prZBX1dxL2BykVLgZByRfN-WT7s.cache +1 -0
  210. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/koNQLQQE6fT02wk7jGSsgEH1-jkeqMI60vOXtWT8mX0.cache +0 -0
  211. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/l0hoEchMWiRhkse0R8FVr-rVCtLrMjVfLJM_HL3tb5c.cache +1 -0
  212. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/l2uXtMtrNjb3zNweGeO4Gt31r1OXSPm2PTRfI9wNgl4.cache +3 -0
  213. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/lM4PNWXxtSmBkkee98Q-9OVMzvvc1ggH3oF5pA91mdw.cache +2 -0
  214. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/lw5RpJBo4JHVKzluaiqMGVm5NCUFDdwP3wDwCZUj5mk.cache +1 -0
  215. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/lzvWLTIpwaoSCLf02JlvC1TiR-fT_dfp5w4I9X1bd9w.cache +1 -0
  216. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/m11asMQm5-VNzYm8cshOBt5UHjqXVfJ0FmHaruRiFao.cache +3 -0
  217. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/mNb_jW3wHyYVc4lb5aWGv_3SGK6D78HNnms0y3rgazM.cache +2 -0
  218. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/mhp6jdyn7r6D8WhRVqiI21wB5ERatCV8gp9aZl2UhNM.cache +0 -0
  219. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/mu5Hlj4P_B9KwSreDXF-zKOeyAGLJ_tTPLG5m4iocBo.cache +1 -0
  220. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/nbKYdjGUoSbJvV_LYGBo6O_UnK84d8m3S838nJa4NeQ.cache +0 -0
  221. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/nitLVOySfF-wVL3qK8cYUMiqEu_Em95FhcRkp5Kfyfg.cache +1 -0
  222. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/nlklyto7WH4myKA5-xlGpbUERLzGC63wRunhjRdlZSM.cache +0 -0
  223. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/oSDKzGvV9V5vuuxX2ESz2Jm5Yk7_PaQM4nCYuveAqdk.cache +2 -0
  224. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/o_lE7AvvrOVzvlGy0fYkT8ohD-Ws91bpi2qOG6vcAUk.cache +2 -0
  225. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/p43U_hoO8WuzY2C84r4mxxO0QSjyA--hVsunYUY0B-g.cache +1 -0
  226. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/pIfMG9R2gjwXP4dzEDebX-RVV8Ja7URRotpmTImA304.cache +1 -0
  227. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/pVLbctirD8tkX-rLDXBVRPys8OrrzfacaIeoriFBPBA.cache +0 -0
  228. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/paDSxfrf9XhZFb9CmMKhOaZBnTGEP11DGqX6Tn-IeQ4.cache +1 -0
  229. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/q09-OpwpNQzalVGsXDB6b9C0tqFdR1_3CCWYlEh_lhk.cache +0 -0
  230. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/q0ias_pEQhirB8QsOkqxuMcxXF05sTdpOJKDLY67YRQ.cache +3 -0
  231. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/qPcdzV7WQBwG-ZhQgx1M5K3qhEPgOYWwqVbmefx4ARY.cache +0 -0
  232. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/qT4M_3ZgnZtQqqiq6pgl_4QckJg6y11bCTEdOqCPCLA.cache +0 -0
  233. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/qU_QjNqHdsWCHKjOtOzsOLAayHf-h6UobxCZdFYx0Qs.cache +3 -0
  234. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/qmoB8fFsCqH6HS4TfdFkXwxiGsPukRUUyKQDig8-_R0.cache +1 -0
  235. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/rJ893qZ5iIUACnzemLRxvQdZDOOXGQSyOHvijNHVmrM.cache +0 -0
  236. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/rkGTYHSzmx6LpN2Vf3B3Viv826749uouP97eZsh202M.cache +3 -0
  237. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/sXDLhs3KBS1r3F0oFTWHztAAtDuHXWS3FIlMHQ-Z-Og.cache +1 -0
  238. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/seh6pxB8-kXtfW6aZHOWBF_WqD0AVoR1J0toinZlNUU.cache +0 -0
  239. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/syJz_A9jmBXT6LGzMWgG5EfyeEe0aQTyhlsGWMo0FOA.cache +1 -0
  240. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/tUmOeGzlmQGTH8n7IjrgpNCRL4CHptM2UcPT0gMCdyg.cache +2 -0
  241. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/thfvbEs0rhGaflrUZM59MIxNKjUn7Nwul64vu7IvYvQ.cache +0 -0
  242. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/toghiOgyde1NRjiYhT9iwCuhgk5RpCtXVC0V9So8eyg.cache +1 -0
  243. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/u2zBgyETzmPfAmDpschNgwUlaCzkcnELuTWmAzzB2K0.cache +3 -0
  244. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/uDnXkP5Hb1Olf9B40LR9Sh7LNrkkqlpsGmzZAvXr_HM.cache +1 -0
  245. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/uhUzbnw4-fyrqca0lmlFQg8KB6oC5ucLM6sQSU-0nus.cache +2 -0
  246. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/v-g_rR1X4wrT6wZmKNHRl1WYz5PIURJyfQ8_AwALffQ.cache +1 -0
  247. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/vH1_nCfYo49sRz08UubuuroQ_uQ1WQLvKfncytk4BTo.cache +1 -0
  248. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/vK5wU1Oejv4Ihayhn8xZnGMN-48keGnZ0XVQwi-lf7o.cache +0 -0
  249. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/vU2qPtfBQHjbs7W48Qq2UTyPbf1Con0zymzBq5acg2w.cache +1 -0
  250. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/wGvSWcT-U3i109LGzO3XsLXo9AaW5HnXQ2LMRJMvjuo.cache +1 -0
  251. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/wN6rENFLhYA1FfmSuHolHGIah8XQwKpE0SX-RrMNJcM.cache +0 -0
  252. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/wTMiQpvtAKbceoWE9p9UBv1vkAeQCccost5Akrtdamo.cache +2 -0
  253. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/wbsE1TSmuQbqlln-eU6yj1ErHXOF-y9Zr0n2-FtLC9Q.cache +0 -0
  254. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/wfNvQRgDqCq5UZA2iax9cij6A5toMiCNUobo7ctBMpk.cache +1 -0
  255. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/wvZFh71Y3Vn6zS-hzHyHT1o3iGBnbwKaJiYRRnEK8ns.cache +0 -0
  256. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/x-R9D8NqYDVTSppHFwhCTP5MCaJsFkqi42h6-ZzHaPc.cache +2 -0
  257. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/x9cQF4XHdwM3LbV4rJI1jb7emogrUnoSlF_DJWcgamc.cache +0 -0
  258. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/xODqDo2-C_gBPsRb3NNoHsHpSVVRlCM7DKxr6y6tlnE.cache +1 -0
  259. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/xSCd2djurOPOKkU9rjwUnwkhUUmhPI2zSZUQKKqmqBo.cache +1 -0
  260. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/xcMOdOqIZLl-EgpYikz3g3I82yo8gw8mVo9RKfgFtGg.cache +3 -0
  261. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/xxcBLPDJgq_w7qMUy4wkWNWk9iiadh9qbmj2nU165dg.cache +3 -0
  262. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/yhPwG2LaMYYXoOzhmON0mMGY3jkqNyUQLONDEMDAfas.cache +0 -0
  263. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/yiahuojfqJTrp4gxae05N9FlzyG9zPC1DE8xBEUKFEc.cache +2 -0
  264. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/yxFZvvn8PiixnsItlEHXVrUqwCeB-WaCvdqPvk2ZqCI.cache +1 -0
  265. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/z0UfsmfrmWx31sVWnIwFhZsP_ZDLCVpbBm8mLEWbnPY.cache +2 -0
  266. data/spec/factories/jobs.rb +30 -0
  267. data/spec/lib/async_response/builder_spec.rb +62 -0
  268. data/spec/lib/async_response/expirer_spec.rb +13 -0
  269. data/spec/models/async_response/job_spec.rb +7 -0
  270. data/spec/spec_helper.rb +20 -0
  271. metadata +685 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4e9ee6073be567656ec7aedd34628c898f0a4271
4
+ data.tar.gz: 62d9a52443f0c23e3530812b7272bee504312d7d
5
+ SHA512:
6
+ metadata.gz: 2d2c552386489bb71f79704d3c9b08d5332abb11c348e33a9572a0e573390af7d41e9b21c4c469f9b187d7fcd2f80c1b6719a4973e491adb2ce66aaa34fbb3f6
7
+ data.tar.gz: f7ad030d35a4e9796590717da3343d8af17063e4a803a59699407a236c8c7f0e22ffaa2ed516a96dd13f18282de54b0907a3c2e515be3dea498506667161328c
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2015 Daniel Alves
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,3 @@
1
+ = AsyncResponse
2
+
3
+ This project rocks and uses MIT-LICENSE.
data/Rakefile ADDED
@@ -0,0 +1,31 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'AsyncResponse'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.rdoc')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+ APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
18
+ load 'rails/tasks/engine.rake'
19
+
20
+
21
+ Bundler::GemHelper.install_tasks
22
+
23
+ Dir[File.join(File.dirname(__FILE__), 'tasks/**/*.rake')].each {|f| load f }
24
+
25
+ require 'rspec/core'
26
+ require 'rspec/core/rake_task'
27
+
28
+ desc "Run all specs in spec directory (excluding plugin specs)"
29
+ RSpec::Core::RakeTask.new(:spec => 'app:db:test:prepare')
30
+
31
+ task :default => :spec
@@ -0,0 +1,35 @@
1
+ //= require jquery_ujs
2
+
3
+ var Responses = (function($){
4
+
5
+ var bindClicks = function(module) {
6
+ $('.btn-show').on('click', function(){
7
+ var id = $(this).data('id'),
8
+ content = $(this).data('content');
9
+
10
+ module.showResponse(id, content);
11
+ return false;
12
+ });
13
+ }
14
+
15
+ function Module(baseUrl) {
16
+ this.baseUrl = baseUrl;
17
+
18
+ bindClicks(this);
19
+ }
20
+
21
+ Module.prototype.showResponse = function(id, content) {
22
+ $.getJSON(this.baseUrl+'/'+id+'.json', function(data){
23
+ var showResponseHolder = $('#showResponseHolder'),
24
+ display = content == 'data' ? data.data : data.error;
25
+
26
+ if (content == 'params') display = JSON.parse(data.params_json);
27
+
28
+ showResponseHolder.html(JSON.stringify(display));
29
+
30
+ $('.modal').modal({show: true});
31
+ });
32
+ };
33
+
34
+ return Module;
35
+ })(jQuery);
@@ -0,0 +1,34 @@
1
+ var AsyncResponse = (function($){
2
+ function Module() {}
3
+
4
+ var loadAsyncJSON = function(url, onProgress, onLoad){
5
+ $.getJSON(url, function(data) {
6
+ if (!data.status) {
7
+ loadAsyncJSON(url, onProgress, onLoad);
8
+ return;
9
+ }
10
+
11
+ var status = data.status;
12
+ if (status == 'finished') {
13
+ onLoad(data.data);
14
+ return;
15
+ } else {
16
+
17
+ onProgress(data.status, data.percentage_completion);
18
+ loadAsyncJSON(url, onProgress, onLoad);
19
+ }
20
+ });
21
+ }
22
+
23
+ Module.prototype.loadJSON = function(options) {
24
+ var url = options.url;
25
+ var onLoad = options.onLoad || function() {};
26
+ var onProgress = options.onProgress || function() {};
27
+
28
+ loadAsyncJSON(url, onProgress, onLoad);
29
+ return url;
30
+ }
31
+
32
+ return Module;
33
+
34
+ })(jQuery);
@@ -0,0 +1,14 @@
1
+ /*
2
+ *= require_self
3
+ */
4
+
5
+
6
+ .finished {
7
+ color: green;
8
+ font-weight: bold;
9
+ }
10
+
11
+ .errored {
12
+ background-color: #f0d8d8;
13
+ color: red;
14
+ }
@@ -0,0 +1,4 @@
1
+ module AsyncResponse
2
+ class ApplicationController < ActionController::Base
3
+ end
4
+ end
@@ -0,0 +1,24 @@
1
+ module AsyncResponse
2
+ module Concerns
3
+ module AsyncController
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ end
8
+
9
+ def async_response(worker_class, expires_at: 5.minutes_from_now,
10
+ job_key: nil, params: nil)
11
+
12
+ response_json = AsyncResponse::Builder
13
+ .new(worker_class, expires_at, job_key)
14
+ .build(params)
15
+
16
+ render(json: response_json)
17
+ end
18
+
19
+ def async_response_expire!(worker_class, job_key: nil)
20
+ AsyncResponse::Expirer.new(worker_class, job_key).expire!
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,28 @@
1
+ module AsyncResponse
2
+ class ResponsesController < ApplicationController
3
+
4
+ def index
5
+ render locals: { jobs: jobs }
6
+ end
7
+
8
+ def show
9
+ render json: job
10
+ end
11
+
12
+ def destroy
13
+ job.destroy
14
+ redirect_to async_response.responses_path
15
+ end
16
+
17
+ protected
18
+
19
+ def jobs
20
+ @jobs ||= AsyncResponse::Job.order(id: :desc)
21
+ .limit(10)
22
+ end
23
+
24
+ def job
25
+ @job ||= AsyncResponse::Job.find(params[:id])
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,4 @@
1
+ module AsyncResponse
2
+ module ApplicationHelper
3
+ end
4
+ end
@@ -0,0 +1,57 @@
1
+ module AsyncResponse
2
+ class Job < ActiveRecord::Base
3
+ enum status: [:started, :running, :finished, :errored]
4
+ serialize :data, JSON
5
+ validates :job_type, :expires_at, presence: true
6
+
7
+ def self.valid_job(type, key)
8
+ record = where(job_type: type, job_key: key).last
9
+ return nil unless record
10
+ return nil if record.expired?
11
+ return nil if record.errored?
12
+
13
+ record
14
+ end
15
+
16
+ def self.expire!(type, key)
17
+ record = valid_job(type, key)
18
+ return nil unless record
19
+ record.expire!
20
+ record
21
+ end
22
+
23
+ def params=(hash)
24
+ self.params_json = hash.to_json
25
+ end
26
+
27
+ def params
28
+ JSON.parse(params_json).deep_symbolize_keys rescue nil
29
+ end
30
+
31
+ def expired?
32
+ expires_at < Time.now
33
+ end
34
+
35
+ def expire!
36
+ self.expires_at = Time.now - 1.minute
37
+ save(validate: false)
38
+ end
39
+
40
+ def finished!
41
+ increment_percentage(100)
42
+ self.status = :finished
43
+ save!
44
+ end
45
+
46
+ def increment_percentage(increment)
47
+ total = (percentage_completion || 0) + increment
48
+ total = [[total, 100].min, 0].max
49
+ self.percentage_completion = total
50
+ end
51
+
52
+ def increment_percentage!(increment)
53
+ increment_percentage(increment)
54
+ save!
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,44 @@
1
+ .page-header
2
+ %h1 Async Responses
3
+
4
+ %table.table
5
+ %tr
6
+ %th ID
7
+ %th Status
8
+ %th Type
9
+ %th Key
10
+ %th Expires at
11
+ %th
12
+
13
+ - jobs.each do |job|
14
+ %tr{ class: job.status }
15
+ %td= job.id
16
+ %td= job.status.titleize
17
+ %td= job.job_type
18
+ %td= job.job_key
19
+ %td{ nowrap: true }
20
+ = job.expires_at
21
+
22
+ %td{ align: 'right', nowrap: true }
23
+ = link_to 'Params', '#',
24
+ class: 'btn btn-sm btn-default btn-show',
25
+ data: { id: job.id, content: 'params' }
26
+
27
+ - if job.finished?
28
+ = link_to 'Data', '#',
29
+ class: 'btn btn-sm btn-default btn-show',
30
+ data: { id: job.id, content: 'data' }
31
+ - elsif job.errored?
32
+ = link_to 'Error', '#',
33
+ class: 'btn btn-sm btn-default btn-show',
34
+ data: { id: job.id, content: 'error' }
35
+
36
+ = link_to '<span class="glyphicon glyphicon-trash"></span>'.html_safe,
37
+ async_response.response_path(job.id),
38
+ method: :delete,
39
+ class: 'btn btn-sm btn-danger',
40
+ data: { confirm: 'Are you sure?' }
41
+
42
+ - content_for :after_javascript do
43
+ :javascript
44
+ var responses = new Responses("#{async_response.responses_path}");
@@ -0,0 +1,28 @@
1
+ !!!
2
+ %html
3
+ %head
4
+ %title AsyncResponse
5
+ = stylesheet_link_tag "//maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css"
6
+ = stylesheet_link_tag "async_response/application", media: "all"
7
+ = csrf_meta_tags
8
+
9
+ %body
10
+ .container
11
+ .row
12
+ .col-sm-12
13
+ = yield
14
+
15
+ = javascript_include_tag "//ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"
16
+ = javascript_include_tag "//maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"
17
+ = javascript_include_tag "async_response/application"
18
+ = content_for :after_javascript
19
+
20
+ .modal.fade
21
+ .modal-dialog
22
+ .modal-content
23
+ .modal-header
24
+ .modal-title
25
+ Show Response
26
+ .modal-body
27
+ #showResponseHolder
28
+
data/config/routes.rb ADDED
@@ -0,0 +1,4 @@
1
+ AsyncResponse::Engine.routes.draw do
2
+ root to: 'responses#index'
3
+ resources :responses, only: [:index, :show, :destroy]
4
+ end
@@ -0,0 +1,15 @@
1
+ class CreateAsyncResponseJobs < ActiveRecord::Migration
2
+ def change
3
+ create_table :async_response_jobs do |t|
4
+ t.string :job_type
5
+ t.string :job_key
6
+ t.string :scope
7
+ t.integer :percentage_completion, default: 0
8
+ t.integer :status, default: 0
9
+ t.text :error
10
+ t.text :data
11
+ t.timestamp :expires_at
12
+ t.timestamps null: false
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,5 @@
1
+ class AddParamsJsonToAsyncResponseJobs < ActiveRecord::Migration
2
+ def change
3
+ add_column :async_response_jobs, :params_json, :text
4
+ end
5
+ end
@@ -0,0 +1,47 @@
1
+ module AsyncResponse
2
+ class Builder
3
+ include AsyncResponse::Helper
4
+ attr_reader :worker_class, :expires_at, :job_key
5
+ def initialize(worker_class, expires_at, job_key)
6
+ @worker_class = worker_class
7
+ @expires_at = expires_at
8
+ @job_key = job_key
9
+ end
10
+
11
+ def build(params)
12
+ respond_with(async_job || create_job(params))
13
+ end
14
+
15
+ private
16
+
17
+ def async_job
18
+ @async_job ||= AsyncResponse::Job.valid_job(job_type,
19
+ hashed_job_key)
20
+ end
21
+
22
+ def create_job(params)
23
+ @new_job ||= AsyncResponse::Job.create!(
24
+ job_type: job_type,
25
+ job_key: hashed_job_key,
26
+ expires_at: expires_at,
27
+ params: params
28
+ )
29
+
30
+ schedule_job(@new_job)
31
+ @new_job
32
+ end
33
+
34
+ def respond_with(job)
35
+ {
36
+ status: job.status,
37
+ percentage_completion: job.percentage_completion,
38
+ data: job.data,
39
+ error: job.error
40
+ }
41
+ end
42
+
43
+ def schedule_job(job)
44
+ worker_class.perform_async(job.id)
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,12 @@
1
+ module AsyncResponse
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace AsyncResponse
4
+
5
+ config.generators do |g|
6
+ g.test_framework :rspec,:fixture => false
7
+ g.fixture_replacement :factory_girl, dir: 'spec/factories'
8
+ g.assets false
9
+ g.helper false
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,14 @@
1
+ module AsyncResponse
2
+ class Expirer
3
+ include Helper
4
+ attr_reader :worker_class, :job_key
5
+ def initialize(worker_class, job_key)
6
+ @worker_class = worker_class
7
+ @job_key = job_key
8
+ end
9
+
10
+ def expire!
11
+ AsyncResponse::Job.expire!(job_type, hashed_job_key)
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,3 @@
1
+ module AsyncResponse
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,43 @@
1
+ module AsyncResponse
2
+ module Workers
3
+ module Sidekiq
4
+ extend ActiveSupport::Concern
5
+
6
+ def response_for(job_id, &block)
7
+ job = AsyncResponse::Job.find(job_id)
8
+ return unless job
9
+
10
+ worker_response = WorkerResponse.new(job)
11
+ data = block.call(worker_response)
12
+ worker_response.finished!(data)
13
+
14
+ rescue StandardError => e
15
+ job.error = e.message
16
+ job.errored!
17
+ raise e
18
+ end
19
+
20
+ private
21
+
22
+ class WorkerResponse
23
+ attr_reader :job
24
+ def initialize(job)
25
+ @job = job
26
+ end
27
+
28
+ def params
29
+ job.params
30
+ end
31
+
32
+ def finished!(data)
33
+ job.data = data
34
+ job.finished!
35
+ end
36
+
37
+ def increment_percentage!(increment)
38
+ job.increment_percentage!(increment)
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,20 @@
1
+ require "haml"
2
+ require "jquery-rails"
3
+
4
+ module AsyncResponse
5
+ module Helper
6
+ def job_type
7
+ worker_class.name
8
+ end
9
+
10
+ def hashed_job_key
11
+ joined_job_key = job_key.join if job_key.respond_to?(:join)
12
+ Digest::SHA1.hexdigest(joined_job_key || job_key)
13
+ end
14
+ end
15
+ end
16
+
17
+ require "async_response/engine"
18
+ require "async_response/builder"
19
+ require "async_response/expirer"
20
+ require "async_response/workers/sidekiq"
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :async_response do
3
+ # # Task goes here
4
+ # end
@@ -0,0 +1,28 @@
1
+ == README
2
+
3
+ This README would normally document whatever steps are necessary to get the
4
+ application up and running.
5
+
6
+ Things you may want to cover:
7
+
8
+ * Ruby version
9
+
10
+ * System dependencies
11
+
12
+ * Configuration
13
+
14
+ * Database creation
15
+
16
+ * Database initialization
17
+
18
+ * How to run the test suite
19
+
20
+ * Services (job queues, cache servers, search engines, etc.)
21
+
22
+ * Deployment instructions
23
+
24
+ * ...
25
+
26
+
27
+ Please feel free to use a different markup language if you do not plan to run
28
+ <tt>rake doc:app</tt>.
@@ -0,0 +1,6 @@
1
+ # Add your own tasks in files placed in lib/tasks ending in .rake,
2
+ # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
3
+
4
+ require File.expand_path('../config/application', __FILE__)
5
+
6
+ Rails.application.load_tasks
@@ -0,0 +1,13 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // compiled file.
9
+ //
10
+ // Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
11
+ // about supported directives.
12
+ //
13
+ //= require_tree .
@@ -0,0 +1,15 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any styles
10
+ * defined in the other CSS/SCSS files in this directory. It is generally better to create a new
11
+ * file per style scope.
12
+ *
13
+ *= require_tree .
14
+ *= require_self
15
+ */
@@ -0,0 +1,5 @@
1
+ class ApplicationController < ActionController::Base
2
+ # Prevent CSRF attacks by raising an exception.
3
+ # For APIs, you may want to use :null_session instead.
4
+ protect_from_forgery with: :exception
5
+ end
@@ -0,0 +1,34 @@
1
+ class ProjectsController < ApplicationController
2
+ include AsyncResponse::Concerns::AsyncController
3
+
4
+ def index
5
+ respond_to do |format|
6
+ format.json do
7
+ async_response(
8
+ ProjectsIndexWorker,
9
+ expires_at: 5.minutes.from_now,
10
+ job_key: 'projects_index',
11
+ params: {
12
+ page: 1,
13
+ limit: 10
14
+ }
15
+ )
16
+ end
17
+ end
18
+ end
19
+ end
20
+
21
+ class ProjectsIndexWorker
22
+ include AsyncResponse::Workers::Sidekiq
23
+
24
+ def self.perform_async(job_id)
25
+ new.perform(job_id)
26
+ end
27
+
28
+ def perform(job_id)
29
+ response_for(job_id) do |response|
30
+ { job_a: 1 }
31
+ end
32
+ end
33
+ end
34
+
@@ -0,0 +1,2 @@
1
+ module ApplicationHelper
2
+ end
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Dummy</title>
5
+ <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
6
+ <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
7
+ <%= csrf_meta_tags %>
8
+ </head>
9
+ <body>
10
+
11
+ <%= yield %>
12
+
13
+ </body>
14
+ </html>
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
3
+ load Gem.bin_path('bundler', 'bundle')
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ APP_PATH = File.expand_path('../../config/application', __FILE__)
3
+ require_relative '../config/boot'
4
+ require 'rails/commands'