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.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +3 -0
- data/Rakefile +31 -0
- data/app/assets/javascripts/async_response/application.js +35 -0
- data/app/assets/javascripts/async_response/async_response.js +34 -0
- data/app/assets/stylesheets/async_response/application.css +14 -0
- data/app/controllers/async_response/application_controller.rb +4 -0
- data/app/controllers/async_response/concerns/async_controller.rb +24 -0
- data/app/controllers/async_response/responses_controller.rb +28 -0
- data/app/helpers/async_response/application_helper.rb +4 -0
- data/app/models/async_response/job.rb +57 -0
- data/app/views/async_response/responses/index.html.haml +44 -0
- data/app/views/layouts/async_response/application.html.haml +28 -0
- data/config/routes.rb +4 -0
- data/db/migrate/20150702102322_create_async_response_jobs.rb +15 -0
- data/db/migrate/20150702131057_add_params_json_to_async_response_jobs.rb +5 -0
- data/lib/async_response/builder.rb +47 -0
- data/lib/async_response/engine.rb +12 -0
- data/lib/async_response/expirer.rb +14 -0
- data/lib/async_response/version.rb +3 -0
- data/lib/async_response/workers/sidekiq.rb +43 -0
- data/lib/async_response.rb +20 -0
- data/lib/tasks/async_response_tasks.rake +4 -0
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/javascripts/application.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +15 -0
- data/spec/dummy/app/controllers/application_controller.rb +5 -0
- data/spec/dummy/app/controllers/projects_controller.rb +34 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/bin/setup +29 -0
- data/spec/dummy/config/application.rb +26 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +41 -0
- data/spec/dummy/config/environments/production.rb +79 -0
- data/spec/dummy/config/environments/test.rb +42 -0
- data/spec/dummy/config/initializers/assets.rb +11 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +4 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +4 -0
- data/spec/dummy/config/secrets.yml +22 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/schema.rb +30 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/development.log +2882 -0
- data/spec/dummy/log/test.log +2638 -0
- data/spec/dummy/public/404.html +67 -0
- data/spec/dummy/public/422.html +67 -0
- data/spec/dummy/public/500.html +66 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/spec/controllers/projects_controller_spec.rb +43 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/-783RFwXs4Ee9ZDS5nCkVOSZTyk0pFUTyZJC50DotJs.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/-zeUwlY0iBAZuYNBCenXRAenRD2gfdPJ0rO3bJ2TKm0.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/0MtcJLD6j0r7M9MumjBBAA2AqHGHalxogMTMcwgRa0s.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/0QhFXP7LrfE-06fMH_JnpbOneboWOBzCYqOK9nug22o.cache +3 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/0S403J6D4dPNmSCmfLwcdBL_QFbxYqwNA3R0n1LJhgQ.cache +2 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/0VVAC5y97sGbCrmns1Y0VDRLTX-NtH3XqX70DW8kOiA.cache +3 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/1OfF7MXl5U1YlhnthjZQlXgbm6Xq25FTi1wEyVQbIpY.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/1Qx6Rf0sd9E_s4zoRJPqraepuOGTFaqt21dR85lH9fg.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/1pMTfMCtd-oGdtw1ex7LEIse-7k-t63g062_BJxrCw0.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/1pjuuf4-skJIXivL_QwkVJCcmlhlnN3VETTHhXbwRj0.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/1vOu0cTkgzOMybEF5h6Y3vleR9V5bsmJxtdhIV9Pnto.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/2L0Cf95guGcqSs1FuvCKdwmQpvVUDAO51okOmDbjCh4.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/2Uq1VcFPTCe3_ihV_y0i6FxmAmC2YbNXREoSg5f-Ka4.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/2eHBS1yohu30yQSEE1bgop6FS-FkvhpPAtpjaVOas9g.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/2ubj0lI1p_12PNsXipFE3UwFouIUXgLHY9hNLq0maAk.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/3TXA5An-YMwlpyKDZ8IhDGCHwPi3dkQQKYL5rycA0eY.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/3TnLpcKi2n7dSjD8-j_QNGjcP-MH2TyCLQhSM8Et3lk.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/3vlResiwETfGapG4UWH3oep61Vs7fRXISfjvOiqI5zE.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/4Cgm8MRsS_VTb1hKmu8KQNnX0gESWltoX0mXscUDDqI.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/4YSma6j2oF19ZhPsfFzFCy-9FDiCMiln41ZOw2xZVoc.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/556CzHOAbUV8w-tpxZU8ASnvr9QmKi9gbCymgOepVL0.cache +2 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/6KwB_YQBJBGHY52mT5arv5YTUv0Nw9lOU_bv_e2WEaI.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/6PvYEUn96b2RwgmRDtrBVWJcfo2d3T5QmBvmdagWoQU.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/6Sr-EUcSbWERaffJoAygia8384tZudiMV8x_jhBw-Fc.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/6UiJMClHk1QRzbC2DGIxNi1GFCiDzQM9dUAW6TqQQ9g.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/6boz4nvdC6N9g7og6nL83AqzZM0ucY2O7TnF7ssNE_A.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/7Q8Bk_Fan6rGhXCmEVznBB72TH5T3hQqRKbbG4nh1a8.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/7mJpY9ItMhtiiPGT1zpvi52A1Y0EI7uTC8YcSim-QE0.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/81zUrnEP1KFG9Sb7IbBQMcot6YANKxz6CM9Z2SqG5F4.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/8brF3mwsnB0aAuunKDqBZxt2gwLoShg2mIZ1taxnNNM.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/8bua_oKmlUDpsnxbD9-gapgFdHpEXEXIcLz5FuSIU5E.cache +2 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/8d2lTMCGhtFDVr8dwUg01auf3xDeI7aHH0bbOrYcM6I.cache +2 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/8o9ci5MrO_xZJysGi_v38Z3mi1SPm8p1n93P9zOzXYc.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/9LdOQCJSyP0D-pupoWAg9inVuu11MxLTWUCbS8BcwYk.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/9k0bP_C0y5jHN_ocV4Yg79NggZnocAWb7N4aewGYVPg.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/AE0lBjl_g1isExqRe8zYAAhWyz5PyaEJMN7V3E8vX2U.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/BEkkkwKJLPiLi1qz5btskV4TU3WcoakG4E3MAKyzctQ.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/BTq7WC-_TGHmvh5fqs5IynytjrRPmXzPPisB6BBcv0M.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/CjA6Sfvwqh0gMHEt80BlMz1IK-l_XA5YWk6QYTA_RZs.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/Cpcb-TXd89Mz6c7iFvrY9PbzwGNhVjRE22cdKdWwcPk.cache +3 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/DRdFu23jWYbTGSfFfainDfRgJOS-Gol1A2erk7NTnSM.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/DqqOzJWKA_timtG2gpHVHm8g1UdxbstpTokfi2DS-AU.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/DyPMBiVAIXNLFI9P9DbHtLoEwqcn-9NeYxz8EWt67IE.cache +2 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/EcDQulEWn40moq8-8B3KcUBV2HGcf7_MgpOLV3r4mDM.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/ErYOk9mmud3Pfm5b9QaQLA_pMfA5gJF3sC7VoFloCzc.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/FUbxjcM6I3i_JSc6x9SmV69ufS1fDi9a601FFHxek3s.cache +3 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/Fd5iLyLswdFU8FUvk_Q4mINBHyav3knueb-RF5T8CVE.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/Fqj-80mNb7-NxvWBG0AGw8wAmG4mjdYHtxjG_u3LVEE.cache +2 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/Fst1kR3s-xiPxztKPYaWiSAGUw1tgfN25ShWjyJAdEE.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/G_WBkxBKPhPlAjrAgDGGzJgoOTo_NuK72e3HOKpSEY8.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/HFcQQM32obBjJiwdOQwCcE6YDLcYKFV_awF07J-h67Y.cache +3 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/HiWSRSYRLULX0EZ00SwwGGXTrRzOPMy7O4Gr3XjIR5I.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/HlEyy5JMoLpLGEpiHt_h8edUFxGQ77SP6E_DOJqPxZ4.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/ISQ7LfCwq2SdvSwJCxUbT6lXbKSwT0xrJYWohIbsXuk.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/IZh4bmRkR1YotMCiElf4VSYdm6nKZp3ybsF_PF8eggE.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/IrsZkHlubufu0q1biYTe9IRQucc8PodWPneuorCt3b0.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/JQ3RICmxRktvTdxMtBHiAXfCVa74ku0h70sOaYQD-yw.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/JZ3fUyviGJF3CZqBA0gScITxzFDhwibWBj-imO8C2ig.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/JzfyCnTj2rNmVVnbxxGWIMkEaVA3k-cjFrH084F6Fk4.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/KO0rZoeZsLBThYtzdaMIpr0ybOooCwT5lq7HRswEt0w.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/KmjjXAtQ3Nvrvv5O0L_x5FjkYHjAEy63fP1GnWjUb0w.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/KvSryfpLkn_JdmQN94ZJdpAutAFl1kZqNc33tyLQhcA.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/Kyd6jyCYIJ2YhLHrtTSCDSK2r1o6zBluAGr2MAp9ybA.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/Lmt1ar4CfizCwm6FS0VF-yStJV9e6Mus4P1vZJF1qM0.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/M7QQmbwh7ZzF6lkxcExQqeR7ntmZ8Zg4QnepaLjpxqk.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/Mi3p_pCsUHmLrOOD91_2SqLjGkUwgpQ_7MA1F5KUfiw.cache +2 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/Miduxdp1CNxleRi5nHxMQ5Mu6hb5pVOERiqzSGOFpJs.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/N3qEy2kA0K5XcK6gp4HFj-7smwITPH_W8CV_reSr4Yw.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/N8llxE0vUU9SqO5k4wJMvzeQwkYI4X37jgFEgUEA1eo.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/NYQK-NTEm1z-rdw_W2vj4mJUyjypmq0JvObFb6tXZLY.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/Nz3--dBlBZMBYxcQSu_FmPJHkl3Y367SLcssq5jOtkI.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/OLiwZAYURs4AVAjjhB1h3G9tRRlXeFiKsOR_U-TDFDY.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/ONr0GL4frosKTu9O_1KoibbARlbO-KOLDo1H4QH241A.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/OXtZS3Uxi49PCqPr0ebmmmSOhFuS1vzsZxLxuVd0ZH8.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/OrCcf17jaf1USEjbaWiC8YGtLzc6Ex6687SHHSMj1LE.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/Q6cVaZXlTHwJhm2fPfGo_zCVotz4oohoH3QCKDD0GuA.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/QcBllL_e9KQOHDb0luxO-PKxzioWQx0E9DD29QDcusw.cache +2 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/R64M0MMvTnTelciiMsOYn7WZBqIDOIn0-blRKa6Zu6s.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/RFiHS_XROFZkWvyKJkrRAnYuPTmSPsiRcHLX2yWncEE.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/RTxXZagYRszr2ZUhbk4bv0bi5iReYj0nQy_EVjAoUww.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/RYH9uHDE4CdwhaKTPVweIK5SsB7zVIa7alCH2_FCZF4.cache +2 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/RcXivU0Qr8IcT1XjtB-pZ3-0WDm5iDuuCtMuOoWVwAw.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/S0qB6XISPQFmVNR3m6_lGx1zuBQ81u7MiVgNbdXDwG0.cache +3 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/SU03LdbUEwJ5zs7PoB_pjYL4kEWddkihh9eYucNIwO4.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/SltwDf99Eh2nGTLFXf5bVs5ltTBzh-apbugM0PzH4Qk.cache +2 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/T6cqTTQaHkUrcc_PwmGTnpXWWMksuS-9UeaUgPayuLk.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/T9B7odwUEN5L0hb7auGrNan8rByXOPL3EEB8PSSaSpE.cache +3 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/UEHO4cCqoyW23X-DBLugFSAAZQcCkpTcighZ97crSdk.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/US8IYlWcHrKlUEAvopK9QuThYImqhqeVENeBy6tBGOs.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/UpUFv3XCMi_DARP8bgZWRiNKs1UbI6Q_Ul_JjTe9Cm4.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/VUodZ4e4CzbfgFWTEX-6xqlLAwerwbY8GewQPC5qeaI.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/VwhAErAB8OE1QiAy3-uLy3CtW0C8YG73jcbZ8C3l6D0.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/W8i-psM30zakXT2B7nUPLsk7Caim3WKYStiSa0jr3bA.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/WO55w-fj_6DwbvFaF4zKV0ICUSnRRtpKUFezc0T6dU8.cache +2 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/WQgfYXGMAg2lxA3Go72Lpr_Zj39PJcfA3mZWFEB30-0.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/Wz8ecjM_Q8xmuRfmM1wuQ8oswdt2NrLgGfgoHDN6EJU.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/XIx5vyHm8TlxFgLG1z1n_YPQ3yrhT7WziQEPloBPiAY.cache +2 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/XTQIwxSYZddrzEY_W_t-uDHi2GmSfn33iFqwgxzLPt0.cache +2 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/XYXFQWtME3tCa0DfTUpwrBSOAeEpvRj1V_7dapFSxYk.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/YKwedfgWrIzxG1MuDXod8IxXF56PUIRwWxurkBEvZ-4.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/YRqyGAocYX3a_9Z4HtHdKat-3LnrYrRXAirkObav-xM.cache +2 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/YSgRa8qCD8t2uf8AM083WXZQva_CqnMKbcBB590I8gs.cache +3 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/YZmPPvLJPQWXC9dnuZVJ-wgaWURL43iRCXFwlqKScIE.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/YaQB1RkDN8-FubZwncxRK9rzmM23ifUxaakK16XdOuA.cache +2 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/ZSM25cQyxfy8kAKp5mCP2w5vnon0JqQ5agclQNs4hRA.cache +2 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/Zen-b-_c8denGrlPiPTgPrFkCQxCBBPSJ0k97bxXrVw.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/ZiENFdL6PvfaaXmDMapHA90l0ga7SFDKk8taEWqf6jc.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/ZjDMOVsDHmb2W06kqbB_PLPvdDrX3xj34iBCTDfxPN8.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/_6LdbF9trbRJe7Iqu_Js1LoYWnmBRvTRU0OjrGoqYkU.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/_YeGhdxUnzc6oLpdDrtn5vcwX6LfiAnI6latmMzScn4.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/_kmoCXoXeCIxfNm4rTzArpRhs7zl2y04p7qZpzbt9u8.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/aNupD4VBSwIwAKD47bslDwBH2yyGTgl97ASGquUKOog.cache +3 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/aV4RcEPErWIdWPwh8VISTk6xKg9ZY4mDIBM1foe7ly8.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/bQ0B6S1LP5zUQglHlIL27BsgKI4XFieIj6s4Px0lbDU.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/bUrhIiDPSm9yqwM308ecgDgz7JqQPYpJ4S9MtJ5NaGA.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/bYWBRBSiCWu2JLyrw7eoE8Zz6-zDTm5ruJIKUSRtq4s.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/ba8T0x50EVKw1_5RFMVvmEVuoYg0lDaRYdbYLcGEUdY.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/boPSCBi-zgv_QzXKGLbCSnRpD-f4BwwMPpimTtbxg5Y.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/bsEu7D0a6IG63HJLEsYnOpL_s63wMmSIZCw2cy_RXQM.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/cAszxrnFoXU84PMzArpfYRCvjRgcw3_0VFSAKtgtERw.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/cLvmgu2AOzV2LyS2W21ITyegbBXMChimgObER_HTXtw.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/cQ9Dq23qFKKdC9OjfemeOMlyZFOguS2vYxqL4awYyR4.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/cpdtIU8udx-lxCV_2-lBzctOJhydC3Mtkgr6cXDxKMg.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/d-cOwtw3xG7Kprj3JzPkkqZxBSCyn4jRClM85I_1OIw.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/e0A_fKMgYMhD_xtefOiY4Wx8NdpjANeR7GDSaOKY558.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/e6Z8w6LXcntZmuy7Ve3p4IidWEr8qmWFcTo_7NcVeVY.cache +3 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/es6UvWckIXl0uYxx5SECiacB7cLRi-_-YXvpIsitGE4.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/fwgD_yermLNOXjmqgw6j5jDBn2npiH_FDhfefB2ZdLQ.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/gCeU7CVBwMdxbMCY8CYpq8aR3oNZlB8Bso6dRVuuBas.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/gcLoFzGV8BIK5JZz7fWDcu-l-wcJr35YfARjflhHskE.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/gxe4j8_zH9WhEb29BfP5iP27hWIIyjruIKRd7M1D8jM.cache +3 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/h38XjFoJWo63nGDcRPdqsVG0Oa5xhuvp1-fGuy_1l1U.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/hRcGGnNVGvTGrxyra_5VOrkzmatc0zOUXcAAaxtiODw.cache +2 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/hUePPUoB_bMurOwbN8Am0WDJaLdMJvP3RN3zwoCnVCA.cache +2 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/iVrAOXux2KuhJzTsheFkP5NVnAub0CC7Jjn95i2SCIY.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/iZ3NuIj17m3j4UikKNxIFrgReokDT0z6fevFXq6pfdc.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/ibZy3OgewKB13N6QyTk1ghdbUB09_c8fn9JJNc2Aylw.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/jb4H1Z9llRC8wzFhLm7QvDIoZJgkyRFisjs9mxC0HmI.cache +3 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/jewJx3a4gxEJWINpBqWrMJoCvw1hR0lsYHcFxmFN56w.cache +2 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/jh5sN5WOP2Bdp5DjUM8IkxHgNLxfzFhe31PRnlrYRbE.cache +2 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/jzI-j3cGErzW7qklfRfdpjxbxNqfi_RmB3kfnCcJn-Q.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/k7nSxJ3BjYCCIWb8TJSWCrLA7LN2gjwZOdTTwvoE8a4.cache +3 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/kMiJhXiOxSpK5EvjmtMWdwxMf8H4IyzFmNoCVVk0Wng.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/kez-03bNo18wZyZ7prZBX1dxL2BykVLgZByRfN-WT7s.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/koNQLQQE6fT02wk7jGSsgEH1-jkeqMI60vOXtWT8mX0.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/l0hoEchMWiRhkse0R8FVr-rVCtLrMjVfLJM_HL3tb5c.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/l2uXtMtrNjb3zNweGeO4Gt31r1OXSPm2PTRfI9wNgl4.cache +3 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/lM4PNWXxtSmBkkee98Q-9OVMzvvc1ggH3oF5pA91mdw.cache +2 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/lw5RpJBo4JHVKzluaiqMGVm5NCUFDdwP3wDwCZUj5mk.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/lzvWLTIpwaoSCLf02JlvC1TiR-fT_dfp5w4I9X1bd9w.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/m11asMQm5-VNzYm8cshOBt5UHjqXVfJ0FmHaruRiFao.cache +3 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/mNb_jW3wHyYVc4lb5aWGv_3SGK6D78HNnms0y3rgazM.cache +2 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/mhp6jdyn7r6D8WhRVqiI21wB5ERatCV8gp9aZl2UhNM.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/mu5Hlj4P_B9KwSreDXF-zKOeyAGLJ_tTPLG5m4iocBo.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/nbKYdjGUoSbJvV_LYGBo6O_UnK84d8m3S838nJa4NeQ.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/nitLVOySfF-wVL3qK8cYUMiqEu_Em95FhcRkp5Kfyfg.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/nlklyto7WH4myKA5-xlGpbUERLzGC63wRunhjRdlZSM.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/oSDKzGvV9V5vuuxX2ESz2Jm5Yk7_PaQM4nCYuveAqdk.cache +2 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/o_lE7AvvrOVzvlGy0fYkT8ohD-Ws91bpi2qOG6vcAUk.cache +2 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/p43U_hoO8WuzY2C84r4mxxO0QSjyA--hVsunYUY0B-g.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/pIfMG9R2gjwXP4dzEDebX-RVV8Ja7URRotpmTImA304.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/pVLbctirD8tkX-rLDXBVRPys8OrrzfacaIeoriFBPBA.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/paDSxfrf9XhZFb9CmMKhOaZBnTGEP11DGqX6Tn-IeQ4.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/q09-OpwpNQzalVGsXDB6b9C0tqFdR1_3CCWYlEh_lhk.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/q0ias_pEQhirB8QsOkqxuMcxXF05sTdpOJKDLY67YRQ.cache +3 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/qPcdzV7WQBwG-ZhQgx1M5K3qhEPgOYWwqVbmefx4ARY.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/qT4M_3ZgnZtQqqiq6pgl_4QckJg6y11bCTEdOqCPCLA.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/qU_QjNqHdsWCHKjOtOzsOLAayHf-h6UobxCZdFYx0Qs.cache +3 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/qmoB8fFsCqH6HS4TfdFkXwxiGsPukRUUyKQDig8-_R0.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/rJ893qZ5iIUACnzemLRxvQdZDOOXGQSyOHvijNHVmrM.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/rkGTYHSzmx6LpN2Vf3B3Viv826749uouP97eZsh202M.cache +3 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/sXDLhs3KBS1r3F0oFTWHztAAtDuHXWS3FIlMHQ-Z-Og.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/seh6pxB8-kXtfW6aZHOWBF_WqD0AVoR1J0toinZlNUU.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/syJz_A9jmBXT6LGzMWgG5EfyeEe0aQTyhlsGWMo0FOA.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/tUmOeGzlmQGTH8n7IjrgpNCRL4CHptM2UcPT0gMCdyg.cache +2 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/thfvbEs0rhGaflrUZM59MIxNKjUn7Nwul64vu7IvYvQ.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/toghiOgyde1NRjiYhT9iwCuhgk5RpCtXVC0V9So8eyg.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/u2zBgyETzmPfAmDpschNgwUlaCzkcnELuTWmAzzB2K0.cache +3 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/uDnXkP5Hb1Olf9B40LR9Sh7LNrkkqlpsGmzZAvXr_HM.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/uhUzbnw4-fyrqca0lmlFQg8KB6oC5ucLM6sQSU-0nus.cache +2 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/v-g_rR1X4wrT6wZmKNHRl1WYz5PIURJyfQ8_AwALffQ.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/vH1_nCfYo49sRz08UubuuroQ_uQ1WQLvKfncytk4BTo.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/vK5wU1Oejv4Ihayhn8xZnGMN-48keGnZ0XVQwi-lf7o.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/vU2qPtfBQHjbs7W48Qq2UTyPbf1Con0zymzBq5acg2w.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/wGvSWcT-U3i109LGzO3XsLXo9AaW5HnXQ2LMRJMvjuo.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/wN6rENFLhYA1FfmSuHolHGIah8XQwKpE0SX-RrMNJcM.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/wTMiQpvtAKbceoWE9p9UBv1vkAeQCccost5Akrtdamo.cache +2 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/wbsE1TSmuQbqlln-eU6yj1ErHXOF-y9Zr0n2-FtLC9Q.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/wfNvQRgDqCq5UZA2iax9cij6A5toMiCNUobo7ctBMpk.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/wvZFh71Y3Vn6zS-hzHyHT1o3iGBnbwKaJiYRRnEK8ns.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/x-R9D8NqYDVTSppHFwhCTP5MCaJsFkqi42h6-ZzHaPc.cache +2 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/x9cQF4XHdwM3LbV4rJI1jb7emogrUnoSlF_DJWcgamc.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/xODqDo2-C_gBPsRb3NNoHsHpSVVRlCM7DKxr6y6tlnE.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/xSCd2djurOPOKkU9rjwUnwkhUUmhPI2zSZUQKKqmqBo.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/xcMOdOqIZLl-EgpYikz3g3I82yo8gw8mVo9RKfgFtGg.cache +3 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/xxcBLPDJgq_w7qMUy4wkWNWk9iiadh9qbmj2nU165dg.cache +3 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/yhPwG2LaMYYXoOzhmON0mMGY3jkqNyUQLONDEMDAfas.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/yiahuojfqJTrp4gxae05N9FlzyG9zPC1DE8xBEUKFEc.cache +2 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/yxFZvvn8PiixnsItlEHXVrUqwCeB-WaCvdqPvk2ZqCI.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/z0UfsmfrmWx31sVWnIwFhZsP_ZDLCVpbBm8mLEWbnPY.cache +2 -0
- data/spec/factories/jobs.rb +30 -0
- data/spec/lib/async_response/builder_spec.rb +62 -0
- data/spec/lib/async_response/expirer_spec.rb +13 -0
- data/spec/models/async_response/job_spec.rb +7 -0
- data/spec/spec_helper.rb +20 -0
- 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
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,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,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,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,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,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,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>.
|
data/spec/dummy/Rakefile
ADDED
|
@@ -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,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,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>
|