telephony 1.0.3

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 (365) hide show
  1. checksums.yaml +15 -0
  2. data/README.md +105 -0
  3. data/Rakefile +39 -0
  4. data/app/assets/fonts/telephony/zest-telephony.eot +0 -0
  5. data/app/assets/fonts/telephony/zest-telephony.svg +73 -0
  6. data/app/assets/fonts/telephony/zest-telephony.ttf +0 -0
  7. data/app/assets/fonts/telephony/zest-telephony.woff +0 -0
  8. data/app/assets/images/telephony/backspace.png +0 -0
  9. data/app/assets/images/telephony/icon-spinner.gif +0 -0
  10. data/app/assets/javascripts/telephony/application.js +12 -0
  11. data/app/assets/javascripts/telephony/collections/agents.js +4 -0
  12. data/app/assets/javascripts/telephony/config.js.erb +11 -0
  13. data/app/assets/javascripts/telephony/models/agent.js +103 -0
  14. data/app/assets/javascripts/telephony/models/conversation.js +226 -0
  15. data/app/assets/javascripts/telephony/models/device.js +30 -0
  16. data/app/assets/javascripts/telephony/models/transfer.js +65 -0
  17. data/app/assets/javascripts/telephony/namespace.js +6 -0
  18. data/app/assets/javascripts/telephony/push.js +80 -0
  19. data/app/assets/javascripts/telephony/vendor/backbone.js +1159 -0
  20. data/app/assets/javascripts/telephony/vendor/chosen.jquery.js +1018 -0
  21. data/app/assets/javascripts/telephony/vendor/jquery.form.js +1117 -0
  22. data/app/assets/javascripts/telephony/vendor/pusher.js +1304 -0
  23. data/app/assets/javascripts/telephony/vendor/test_dependencies.js +18 -0
  24. data/app/assets/javascripts/telephony/vendor/underscore.js +839 -0
  25. data/app/assets/javascripts/telephony/views/agents_view.js +69 -0
  26. data/app/assets/javascripts/telephony/views/application_view.js +78 -0
  27. data/app/assets/javascripts/telephony/views/call_queue_view.js +21 -0
  28. data/app/assets/javascripts/telephony/views/conversation_buttons_view.js +15 -0
  29. data/app/assets/javascripts/telephony/views/conversation_view.js +322 -0
  30. data/app/assets/javascripts/telephony/views/status_view.js +36 -0
  31. data/app/assets/javascripts/telephony/views/transfer_view.js +87 -0
  32. data/app/assets/javascripts/telephony/views/twilio_client_view.js +117 -0
  33. data/app/assets/javascripts/telephony/views/widget_view.js +55 -0
  34. data/app/assets/javascripts/telephony/widget.js +5 -0
  35. data/app/assets/javascripts/templates/telephony/agents_view.jst.ejs +8 -0
  36. data/app/assets/javascripts/templates/telephony/call_queue_view.jst.ejs +2 -0
  37. data/app/assets/javascripts/templates/telephony/conversation_buttons_view.jst.ejs +23 -0
  38. data/app/assets/javascripts/templates/telephony/conversation_view.jst.ejs +10 -0
  39. data/app/assets/javascripts/templates/telephony/status_view.jst.ejs +4 -0
  40. data/app/assets/javascripts/templates/telephony/transfer_view.jst.ejs +38 -0
  41. data/app/assets/javascripts/templates/telephony/twilio_client_view.jst.ejs +10 -0
  42. data/app/assets/stylesheets/telephony/font.css +43 -0
  43. data/app/assets/stylesheets/telephony/reset.css.scss +10 -0
  44. data/app/assets/stylesheets/telephony/widget.css.scss +512 -0
  45. data/app/controllers/telephony/agents_controller.rb +46 -0
  46. data/app/controllers/telephony/application_controller.rb +4 -0
  47. data/app/controllers/telephony/call_centers_controller.rb +9 -0
  48. data/app/controllers/telephony/conversations_controller.rb +74 -0
  49. data/app/controllers/telephony/inbound/conversation_queues_controller.rb +21 -0
  50. data/app/controllers/telephony/playable_listeners_controller.rb +43 -0
  51. data/app/controllers/telephony/providers/twilio/application_controller.rb +26 -0
  52. data/app/controllers/telephony/providers/twilio/calls_controller.rb +130 -0
  53. data/app/controllers/telephony/providers/twilio/inbound_calls_controller.rb +54 -0
  54. data/app/controllers/telephony/providers/twilio/musics_controller.rb +12 -0
  55. data/app/controllers/telephony/providers/twilio/voicemails_controller.rb +29 -0
  56. data/app/controllers/telephony/signals/agents/presences_controller.rb +64 -0
  57. data/app/controllers/telephony/transfers_controller.rb +18 -0
  58. data/app/controllers/telephony/twilio_client_controller.rb +37 -0
  59. data/app/controllers/telephony/voicemails_controller.rb +13 -0
  60. data/app/controllers/telephony/widget_controller.rb +10 -0
  61. data/app/helpers/telephony/application_helper.rb +4 -0
  62. data/app/helpers/telephony/calls_helper.rb +13 -0
  63. data/app/models/telephony/agent.rb +186 -0
  64. data/app/models/telephony/agent_state_machine.rb +54 -0
  65. data/app/models/telephony/base.rb +7 -0
  66. data/app/models/telephony/blacklisted_number.rb +5 -0
  67. data/app/models/telephony/call.rb +94 -0
  68. data/app/models/telephony/call_center.rb +26 -0
  69. data/app/models/telephony/call_state_machine.rb +98 -0
  70. data/app/models/telephony/conversation.rb +273 -0
  71. data/app/models/telephony/conversation_state_machine.rb +109 -0
  72. data/app/models/telephony/conversations_presenter.rb +83 -0
  73. data/app/models/telephony/events.rb +6 -0
  74. data/app/models/telephony/events/answer.rb +6 -0
  75. data/app/models/telephony/events/base.rb +118 -0
  76. data/app/models/telephony/events/busy.rb +6 -0
  77. data/app/models/telephony/events/call_answered.rb +22 -0
  78. data/app/models/telephony/events/call_fail.rb +6 -0
  79. data/app/models/telephony/events/complete_hold.rb +28 -0
  80. data/app/models/telephony/events/complete_one_step_transfer.rb +17 -0
  81. data/app/models/telephony/events/complete_resume.rb +28 -0
  82. data/app/models/telephony/events/complete_two_step_transfer.rb +6 -0
  83. data/app/models/telephony/events/conference.rb +6 -0
  84. data/app/models/telephony/events/connect.rb +22 -0
  85. data/app/models/telephony/events/customer_left_two_step_transfer.rb +6 -0
  86. data/app/models/telephony/events/dial_agent.rb +6 -0
  87. data/app/models/telephony/events/ended.rb +19 -0
  88. data/app/models/telephony/events/enqueue.rb +6 -0
  89. data/app/models/telephony/events/fail_one_step_transfer.rb +9 -0
  90. data/app/models/telephony/events/fail_two_step_transfer.rb +6 -0
  91. data/app/models/telephony/events/initialize_widget.rb +15 -0
  92. data/app/models/telephony/events/initiate_hold.rb +6 -0
  93. data/app/models/telephony/events/initiate_one_step_transfer.rb +6 -0
  94. data/app/models/telephony/events/initiate_resume.rb +6 -0
  95. data/app/models/telephony/events/initiate_two_step_transfer.rb +6 -0
  96. data/app/models/telephony/events/leave_two_step_transfer.rb +17 -0
  97. data/app/models/telephony/events/leave_voicemail.rb +22 -0
  98. data/app/models/telephony/events/no_answer.rb +6 -0
  99. data/app/models/telephony/events/play_closed_greeting.rb +6 -0
  100. data/app/models/telephony/events/play_message.rb +6 -0
  101. data/app/models/telephony/events/reject.rb +6 -0
  102. data/app/models/telephony/events/rona.rb +6 -0
  103. data/app/models/telephony/events/start.rb +17 -0
  104. data/app/models/telephony/events/straight_to_voicemail.rb +6 -0
  105. data/app/models/telephony/events/terminate.rb +6 -0
  106. data/app/models/telephony/events/transfer.rb +35 -0
  107. data/app/models/telephony/inbound_conversation_queue.rb +101 -0
  108. data/app/models/telephony/playable.rb +7 -0
  109. data/app/models/telephony/playable_listener.rb +42 -0
  110. data/app/models/telephony/pusher_event_publisher.rb +26 -0
  111. data/app/models/telephony/recording.rb +4 -0
  112. data/app/models/telephony/voicemail.rb +36 -0
  113. data/app/observers/telephony/agent_observer.rb +8 -0
  114. data/app/observers/telephony/call_observer.rb +15 -0
  115. data/app/observers/telephony/conversation_observer.rb +9 -0
  116. data/app/observers/telephony/event_observer.rb +9 -0
  117. data/app/views/layouts/telephony/application.html.erb +14 -0
  118. data/app/views/telephony/providers/twilio/calls/child_detached.builder +5 -0
  119. data/app/views/telephony/providers/twilio/calls/complete_hold.builder +6 -0
  120. data/app/views/telephony/providers/twilio/calls/connect.builder +13 -0
  121. data/app/views/telephony/providers/twilio/calls/dial.builder +14 -0
  122. data/app/views/telephony/providers/twilio/calls/done.builder +5 -0
  123. data/app/views/telephony/providers/twilio/calls/join_conference.builder +7 -0
  124. data/app/views/telephony/providers/twilio/calls/whisper_tone.builder +3 -0
  125. data/app/views/telephony/providers/twilio/inbound_calls/closed_hours.builder +7 -0
  126. data/app/views/telephony/providers/twilio/inbound_calls/create.builder +8 -0
  127. data/app/views/telephony/providers/twilio/inbound_calls/enqueue.builder +8 -0
  128. data/app/views/telephony/providers/twilio/inbound_calls/reject.builder +5 -0
  129. data/app/views/telephony/providers/twilio/inbound_calls/wait_music.builder +5 -0
  130. data/app/views/telephony/providers/twilio/musics/hold.builder +5 -0
  131. data/app/views/telephony/providers/twilio/voicemails/new.builder +6 -0
  132. data/app/views/telephony/twilio_client/index.html.erb +74 -0
  133. data/app/views/telephony/widget/index.erb +3 -0
  134. data/config/cucumber.yml +8 -0
  135. data/config/database.yml +57 -0
  136. data/config/environment.rb +67 -0
  137. data/config/initializers/pusher.rb +21 -0
  138. data/config/initializers/telephony.rb +44 -0
  139. data/config/routes.rb +94 -0
  140. data/config/wopr.yml.example +38 -0
  141. data/db/migrate/20130806213053_bootstrap_db.rb +105 -0
  142. data/db/migrate/20131009204026_create_telephony_blacklisted_numbers.rb +11 -0
  143. data/lib/agent_generator.rb +24 -0
  144. data/lib/tasks/cucumber.rake +65 -0
  145. data/lib/tasks/jasmine.rake +8 -0
  146. data/lib/tasks/telephony_tasks.rake +4 -0
  147. data/lib/telephony.rb +34 -0
  148. data/lib/telephony/concerns/controllers/twilio_request_verifier.rb +39 -0
  149. data/lib/telephony/conversation_data.rb +67 -0
  150. data/lib/telephony/engine.rb +19 -0
  151. data/lib/telephony/error.rb +8 -0
  152. data/lib/telephony/error/agent_on_a_call.rb +2 -0
  153. data/lib/telephony/error/base.rb +3 -0
  154. data/lib/telephony/error/connection.rb +2 -0
  155. data/lib/telephony/error/not_in_progress.rb +2 -0
  156. data/lib/telephony/error/queue_empty.rb +2 -0
  157. data/lib/telephony/helper.rb +11 -0
  158. data/lib/telephony/jobs/agent_offline.rb +28 -0
  159. data/lib/telephony/jobs/pusher_event.rb +21 -0
  160. data/lib/telephony/providers/twilio_provider.rb +162 -0
  161. data/lib/telephony/version.rb +3 -0
  162. data/spec/controllers/telephony/agents_controller_spec.rb +117 -0
  163. data/spec/controllers/telephony/call_centers_controller_spec.rb +25 -0
  164. data/spec/controllers/telephony/conversations_controller_spec.rb +229 -0
  165. data/spec/controllers/telephony/playable_listeners_controller_spec.rb +138 -0
  166. data/spec/controllers/telephony/providers/twilio/calls_controller_spec.rb +33 -0
  167. data/spec/controllers/telephony/providers/twilio/musics_controller_spec.rb +20 -0
  168. data/spec/controllers/telephony/signals/agents/presences_controller_spec.rb +154 -0
  169. data/spec/controllers/telephony/twilio_client_controller_spec.rb +58 -0
  170. data/spec/controllers/telephony/widget_controller_spec.rb +25 -0
  171. data/spec/dummy/Rakefile +7 -0
  172. data/spec/dummy/app/assets/javascripts/application.js +6 -0
  173. data/spec/dummy/app/assets/javascripts/lib/event_logger.js +82 -0
  174. data/spec/dummy/app/assets/javascripts/vendor/backbone.js +1159 -0
  175. data/spec/dummy/app/assets/javascripts/vendor/chosen.jquery.js +1018 -0
  176. data/spec/dummy/app/assets/javascripts/vendor/jquery.form.js +1117 -0
  177. data/spec/dummy/app/assets/javascripts/vendor/underscore.js +839 -0
  178. data/spec/dummy/app/assets/stylesheets/application.css +23 -0
  179. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  180. data/spec/dummy/app/controllers/widget_host_controller.rb +2 -0
  181. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  182. data/spec/dummy/app/views/layouts/application.html.erb +12 -0
  183. data/spec/dummy/app/views/widget_host/index.html.erb +53 -0
  184. data/spec/dummy/config.ru +4 -0
  185. data/spec/dummy/config/application.rb +61 -0
  186. data/spec/dummy/config/boot.rb +10 -0
  187. data/spec/dummy/config/call_centers.yml +35 -0
  188. data/spec/dummy/config/call_centers.yml.example +35 -0
  189. data/spec/dummy/config/database.yml +56 -0
  190. data/spec/dummy/config/environment.rb +5 -0
  191. data/spec/dummy/config/environments/cucumber.rb +39 -0
  192. data/spec/dummy/config/environments/development.rb +39 -0
  193. data/spec/dummy/config/environments/production.rb +67 -0
  194. data/spec/dummy/config/environments/test.rb +39 -0
  195. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  196. data/spec/dummy/config/initializers/inflections.rb +15 -0
  197. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  198. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  199. data/spec/dummy/config/initializers/session_store.rb +8 -0
  200. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  201. data/spec/dummy/config/locales/en.yml +5 -0
  202. data/spec/dummy/config/pusher.yml +14 -0
  203. data/spec/dummy/config/pusher.yml.example +14 -0
  204. data/spec/dummy/config/routes.rb +5 -0
  205. data/spec/dummy/config/sms_whitelist.json.example +4 -0
  206. data/spec/dummy/config/twilio.yml +57 -0
  207. data/spec/dummy/config/twilio.yml.example +57 -0
  208. data/spec/dummy/db/schema.rb +122 -0
  209. data/spec/dummy/db/seeds.rb +6 -0
  210. data/spec/dummy/log/production.log +156 -0
  211. data/spec/dummy/log/test.log +13812 -0
  212. data/spec/dummy/public/404.html +26 -0
  213. data/spec/dummy/public/422.html +26 -0
  214. data/spec/dummy/public/500.html +25 -0
  215. data/spec/dummy/public/assets/application-628309db7ce8c0abdd91f8f796881599.js +32 -0
  216. data/spec/dummy/public/assets/application-628309db7ce8c0abdd91f8f796881599.js.gz +0 -0
  217. data/spec/dummy/public/assets/application-6c551430f3bdd32ba57c9c41e5f91846.css +24 -0
  218. data/spec/dummy/public/assets/application-6c551430f3bdd32ba57c9c41e5f91846.css.gz +0 -0
  219. data/spec/dummy/public/assets/telephony/backspace-9f5b195e049ed90eb20ecdda6e264b0a.png +0 -0
  220. data/spec/dummy/public/assets/telephony/icon-spinner-ddbae473a70c5425810aeee31d4a8ad7.gif +0 -0
  221. data/spec/dummy/public/assets/telephony/zest-telephony-0e6b13673634da80de9ae09bcca253e3.eot +0 -0
  222. data/spec/dummy/public/assets/telephony/zest-telephony-37f394757ccb11b978f16d9fd32cb3b5.ttf +0 -0
  223. data/spec/dummy/public/assets/telephony/zest-telephony-e7efdbc60c0a1c8404951bc79c7fb3a8.woff +0 -0
  224. data/spec/dummy/public/assets/telephony/zest-telephony-f34287df626936908408f53a33db9e83.svg +73 -0
  225. data/spec/dummy/public/favicon.ico +0 -0
  226. data/spec/dummy/script/rails +6 -0
  227. data/spec/dummy/tmp/cache/assets/C98/020/sprockets%2Fa83f8254d688334ff179984e423f502f +0 -0
  228. data/spec/dummy/tmp/cache/assets/CA4/550/sprockets%2F407f9191fe573f2435c55c017cb0d022 +0 -0
  229. data/spec/dummy/tmp/cache/assets/CAA/6A0/sprockets%2F3265550e2d2c7f5a864ca85d255504c2 +0 -0
  230. data/spec/dummy/tmp/cache/assets/CB0/F60/sprockets%2F462f9efed31e6710732376ae06c27208 +0 -0
  231. data/spec/dummy/tmp/cache/assets/CB6/E20/sprockets%2Fa7092cd9f16917099d754f1380af13e1 +0 -0
  232. data/spec/dummy/tmp/cache/assets/CC7/9F0/sprockets%2F0517100815cd45c43fec1d8510fcb630 +0 -0
  233. data/spec/dummy/tmp/cache/assets/CCA/BF0/sprockets%2F16ea15e0b5d367c34b812612a4207e3e +0 -0
  234. data/spec/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953 +0 -0
  235. data/spec/dummy/tmp/cache/assets/CF1/960/sprockets%2F36ef26985821ec702c74dae4af789903 +0 -0
  236. data/spec/dummy/tmp/cache/assets/D07/F30/sprockets%2Fd12862f20df0c9ef7aa2b4216d247079 +0 -0
  237. data/spec/dummy/tmp/cache/assets/D09/BF0/sprockets%2F5c8595efaa8cc5235a09801c60e25a16 +0 -0
  238. data/spec/dummy/tmp/cache/assets/D0D/250/sprockets%2F5e759d66e374910dae5a51b221e6e3a4 +0 -0
  239. data/spec/dummy/tmp/cache/assets/D0D/E30/sprockets%2Fa282879e0788ba133f5bdc211cf134e8 +0 -0
  240. data/spec/dummy/tmp/cache/assets/D11/8E0/sprockets%2F2a193a8af29963f1113bef05788e02ff +0 -0
  241. data/spec/dummy/tmp/cache/assets/D14/270/sprockets%2F7f95a752910ed33d728532f8fabd340d +0 -0
  242. data/spec/dummy/tmp/cache/assets/D17/BE0/sprockets%2F58749d7aea4ca766c2520801f0f96b9b +0 -0
  243. data/spec/dummy/tmp/cache/assets/D18/270/sprockets%2Fbb2d88813b1795a97e9a7c14100eef77 +0 -0
  244. data/spec/dummy/tmp/cache/assets/D22/310/sprockets%2Fbae9148ce1229214dfbb0c425b0054d0 +0 -0
  245. data/spec/dummy/tmp/cache/assets/D30/EB0/sprockets%2F2c668b88beb4c9805d91ed4587f549e7 +0 -0
  246. data/spec/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
  247. data/spec/dummy/tmp/cache/assets/D3C/690/sprockets%2F681ba175fdd2da8d590b7e624b6135a6 +0 -0
  248. data/spec/dummy/tmp/cache/assets/D44/BC0/sprockets%2F7214f66dd91fdd51f00c3882293f5eea +0 -0
  249. data/spec/dummy/tmp/cache/assets/D46/FA0/sprockets%2F4f9543cd9e68ba3141fd488afb13681b +0 -0
  250. data/spec/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
  251. data/spec/dummy/tmp/cache/assets/D51/9A0/sprockets%2Fb6e4cbcf30f6f611671695f79ea846d5 +0 -0
  252. data/spec/dummy/tmp/cache/assets/D55/920/sprockets%2F0a02242aa4c4febcc796419aba103c69 +0 -0
  253. data/spec/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6 +0 -0
  254. data/spec/dummy/tmp/cache/assets/D5F/6F0/sprockets%2F155e7bc44f326371cce0ca8bc5b2414e +0 -0
  255. data/spec/dummy/tmp/cache/assets/D6B/250/sprockets%2Fe4eecce7a3371b11038c92f07cb28e67 +0 -0
  256. data/spec/dummy/tmp/cache/assets/D6B/E70/sprockets%2F103a456ae3692e3cca20b7696fdee8f0 +0 -0
  257. data/spec/dummy/tmp/cache/assets/D7F/AD0/sprockets%2Fb1c02d12303b1fe2f981771cbb0c4cbd +0 -0
  258. data/spec/dummy/tmp/cache/assets/D81/D00/sprockets%2F0c68b6d9dce98681a2a710d9fc3f7e39 +0 -0
  259. data/spec/dummy/tmp/cache/assets/D94/4D0/sprockets%2F4608a5bdf27ddf11bcaed1375911e9a2 +0 -0
  260. data/spec/dummy/tmp/cache/assets/D9A/580/sprockets%2F433005b19aaf7ed5cba9c7f8cd30b775 +0 -0
  261. data/spec/dummy/tmp/cache/assets/DA4/270/sprockets%2F860ab3bd30204e02c0a5d82bd4bbabe1 +0 -0
  262. data/spec/dummy/tmp/cache/assets/DA4/480/sprockets%2F53e39285bb57a2ddb6ff856b2eb491da +0 -0
  263. data/spec/dummy/tmp/cache/assets/DA6/3C0/sprockets%2F587c7e35f47442eadaa530acc5e9f5e6 +0 -0
  264. data/spec/dummy/tmp/cache/assets/DAB/DA0/sprockets%2Fb8fb5e8518ed3d38a7f6a8f18a9208aa +0 -0
  265. data/spec/dummy/tmp/cache/assets/DB2/700/sprockets%2Ffa85cb79b94fce1b8344d983ea863d2e +0 -0
  266. data/spec/dummy/tmp/cache/assets/DCC/4F0/sprockets%2Fbc0f3c61e16afb5a285ba8b39846ed8b +0 -0
  267. data/spec/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994 +0 -0
  268. data/spec/dummy/tmp/cache/assets/DDC/BE0/sprockets%2F2c0a4d4675a61b014aedbbabb3f071fc +0 -0
  269. data/spec/dummy/tmp/cache/assets/E04/640/sprockets%2F3c5ddf2bbefd9d70f1b506b519cf856e +0 -0
  270. data/spec/dummy/tmp/cache/assets/E04/7F0/sprockets%2F35f1b2ff729a5ec21f6dc5f7d6faa67b +0 -0
  271. data/spec/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
  272. data/spec/dummy/tmp/cache/assets/E07/230/sprockets%2Febd4f2dd708879d593aff008ccb75acc +0 -0
  273. data/spec/dummy/tmp/cache/assets/E17/9D0/sprockets%2F8db2b79f6c4eabe7a9ebe7a7898ec066 +0 -0
  274. data/spec/dummy/tmp/cache/assets/E31/F10/sprockets%2Fcebacf56667da1cc2961b59fd922eafb +0 -0
  275. data/spec/factories/agent.rb +26 -0
  276. data/spec/factories/calls.rb +106 -0
  277. data/spec/factories/conversations.rb +171 -0
  278. data/spec/factories/events.rb +250 -0
  279. data/spec/factories/playable_listeners.rb +6 -0
  280. data/spec/factories/recordings.rb +6 -0
  281. data/spec/factories/voicemails.rb +8 -0
  282. data/spec/fixtures/vcr_cassettes/Authenticating_an_online_user.yml +90 -0
  283. data/spec/fixtures/vcr_cassettes/Creating_a_conversation/creates_a_new_call.yml +42 -0
  284. data/spec/fixtures/vcr_cassettes/Creating_a_conversation/creates_a_new_conversation.yml +42 -0
  285. data/spec/fixtures/vcr_cassettes/Creating_a_conversation/returns_the_conversation_as_JSON.yml +42 -0
  286. data/spec/fixtures/vcr_cassettes/Pusher_channel_as_JSON.yml +90 -0
  287. data/spec/fixtures/vcr_cassettes/Pusher_to_publish_the_event.yml +32 -0
  288. data/spec/fixtures/vcr_cassettes/Reloading_the_widget_during_a_call/_create/during_a_call/after_a_failed_transfer/pushes_the_event_for_the_active_call.yml +1110 -0
  289. data/spec/fixtures/vcr_cassettes/Telephony_ConversationsController/_create/by_default/creates_a_new_call.yml +45 -0
  290. data/spec/fixtures/vcr_cassettes/Telephony_ConversationsController/_create/by_default/creates_a_new_conversation.yml +43 -0
  291. data/spec/fixtures/vcr_cassettes/Telephony_ConversationsController/_create/by_default/returns_the_conversation_as_JSON.yml +44 -0
  292. data/spec/fixtures/vcr_cassettes/Telephony_Providers_TwilioProvider/_call/allows_the_phone_to_ring_for_60_seconds.yml +42 -0
  293. data/spec/fixtures/vcr_cassettes/Telephony_Providers_TwilioProvider/_call/includes_a_status_change_callback_url.yml +42 -0
  294. data/spec/fixtures/vcr_cassettes/Telephony_Providers_TwilioProvider/_call/places_a_call.yml +42 -0
  295. data/spec/fixtures/vcr_cassettes/Telephony_Providers_TwilioProvider/_dial_into_conference/allows_the_phone_to_ring_for_15_seconds.yml +42 -0
  296. data/spec/fixtures/vcr_cassettes/Telephony_Providers_TwilioProvider/_dial_into_conference/places_a_call_to_redirect_the_participant_to_a_conference.yml +42 -0
  297. data/spec/fixtures/vcr_cassettes/Telephony_Providers_TwilioProvider/_hangup/by_default/hangs_up_the_call.yml +42 -0
  298. data/spec/fixtures/vcr_cassettes/buying_number_for_an_area_code.yml +42 -0
  299. data/spec/fixtures/vcr_cassettes/returns_success.yml +90 -0
  300. data/spec/javascripts/helpers/jasmine-jquery.js +546 -0
  301. data/spec/javascripts/helpers/mock-ajax.js +207 -0
  302. data/spec/javascripts/support/jasmine.yml +80 -0
  303. data/spec/javascripts/telephony/models/agent_spec.js +40 -0
  304. data/spec/javascripts/telephony/models/conversation_spec.js +515 -0
  305. data/spec/javascripts/telephony/models/device_spec.js +80 -0
  306. data/spec/javascripts/telephony/models/transfer_spec.js +22 -0
  307. data/spec/javascripts/telephony/push_spec.js +427 -0
  308. data/spec/javascripts/telephony/views/agents_view_spec.js +101 -0
  309. data/spec/javascripts/telephony/views/application_view_spec.js +74 -0
  310. data/spec/javascripts/telephony/views/conversation_view_spec.js +626 -0
  311. data/spec/javascripts/telephony/views/status_view_spec.js +30 -0
  312. data/spec/javascripts/telephony/views/transfer_view_spec.js +187 -0
  313. data/spec/javascripts/telephony/views/twilio_client_view_spec.js +77 -0
  314. data/spec/javascripts/telephony/views/widget_view_spec.js +20 -0
  315. data/spec/lib/telephony/concerns/controllers/twilio_request_verifier_spec.rb +77 -0
  316. data/spec/lib/telephony/conversation_data_spec.rb +342 -0
  317. data/spec/lib/telephony/helper_spec.rb +24 -0
  318. data/spec/lib/telephony/jobs/agent_offline_spec.rb +37 -0
  319. data/spec/lib/telephony/jobs/pusher_event_spec.rb +39 -0
  320. data/spec/lib/telephony/providers/twilio_provider_spec.rb +439 -0
  321. data/spec/lib/telephony_spec.rb +104 -0
  322. data/spec/models/telephony/agent_spec.rb +479 -0
  323. data/spec/models/telephony/agent_state_machine_spec.rb +131 -0
  324. data/spec/models/telephony/call_center_spec.rb +32 -0
  325. data/spec/models/telephony/call_spec.rb +597 -0
  326. data/spec/models/telephony/call_state_machine_spec.rb +472 -0
  327. data/spec/models/telephony/conversation_spec.rb +751 -0
  328. data/spec/models/telephony/conversation_state_machine_spec.rb +387 -0
  329. data/spec/models/telephony/conversations_presenter_spec.rb +40 -0
  330. data/spec/models/telephony/event_spec.rb +716 -0
  331. data/spec/models/telephony/inbound_conversation_queue_spec.rb +243 -0
  332. data/spec/models/telephony/playable_listener_spec.rb +43 -0
  333. data/spec/models/telephony/pusher_event_publisher_spec.rb +36 -0
  334. data/spec/models/telephony/recording_spec.rb +6 -0
  335. data/spec/models/telephony/voicemail_spec.rb +96 -0
  336. data/spec/observers/telephony/agent_observer_spec.rb +21 -0
  337. data/spec/observers/telephony/event_observer_spec.rb +19 -0
  338. data/spec/requests/create_conversation_spec.rb +39 -0
  339. data/spec/requests/dequeue_call_spec.rb +42 -0
  340. data/spec/requests/list_conversations_spec.rb +33 -0
  341. data/spec/requests/presences_spec.rb +51 -0
  342. data/spec/requests/providers/twilio/calls/child_answered_spec.rb +24 -0
  343. data/spec/requests/providers/twilio/calls/child_detached_spec.rb +249 -0
  344. data/spec/requests/providers/twilio/calls/dial_spec.rb +132 -0
  345. data/spec/requests/providers/twilio/calls/done_spec.rb +69 -0
  346. data/spec/requests/providers/twilio/calls/join_conference_spec.rb +56 -0
  347. data/spec/requests/providers/twilio/calls/leave_queue_spec.rb +44 -0
  348. data/spec/requests/providers/twilio/calls/parent_answered_spec.rb +59 -0
  349. data/spec/requests/providers/twilio/inbound/connect_dequeued_call_spec.rb +124 -0
  350. data/spec/requests/providers/twilio/inbound/enqueue_inbound_call_spec.rb +108 -0
  351. data/spec/requests/providers/twilio/inbound/enqueued_call_wait_music_spec.rb +13 -0
  352. data/spec/requests/providers/twilio/voicemails/leave_voicemail_spec.rb +78 -0
  353. data/spec/requests/search_conversations_spec.rb +101 -0
  354. data/spec/requests/transfer_spec.rb +65 -0
  355. data/spec/requests/voicemail_api_spec.rb +58 -0
  356. data/spec/spec_helper.rb +27 -0
  357. data/spec/support/factory_girl.rb +5 -0
  358. data/spec/support/matchers/be_complete_hold.rb +20 -0
  359. data/spec/support/matchers/be_whisper_tone.rb +35 -0
  360. data/spec/support/matchers/join_conference.rb +23 -0
  361. data/spec/support/nokogiri.rb +1 -0
  362. data/spec/support/pusher_helper.rb +24 -0
  363. data/spec/support/vcr.rb +12 -0
  364. data/spec/support/webmock.rb +1 -0
  365. metadata +692 -0
@@ -0,0 +1,5 @@
1
+ require 'factory_girl_rails'
2
+
3
+ RSpec.configure do |config|
4
+ config.include FactoryGirl::Syntax::Methods
5
+ end
@@ -0,0 +1,20 @@
1
+ RSpec::Matchers.define :complete_hold do |expected|
2
+ chain :with_id do |id|
3
+ @id = id
4
+ end
5
+
6
+ match do |actual|
7
+ xml = Nokogiri::XML response.body
8
+ enqueue = xml.at('/Response/Enqueue')
9
+ enqueue.text.should == 'hold'
10
+ enqueue.attributes['action'].value.should =~ %r{/zestphone/providers/twilio/calls/\d+/leave_queue}
11
+ end
12
+
13
+ failure_message_for_should do |actual|
14
+ "expected that '#{actual}' would be put in the hold queue"
15
+ end
16
+
17
+ failure_message_for_should_not do |actual|
18
+ "expected that '#{actual}' would not be put in the hold queue"
19
+ end
20
+ end
@@ -0,0 +1,35 @@
1
+ RSpec::Matchers.define :be_whisper_tone do |expected|
2
+ match do |actual|
3
+ xml = Nokogiri::XML actual
4
+ root = xml.root
5
+ root.should be
6
+ root.name.should == 'Response'
7
+ root.should have(:no).children
8
+ end
9
+
10
+ failure_message_for_should do |actual|
11
+ "expected that '#{actual}' would be a whisper tone (<Response />)"
12
+ end
13
+
14
+ failure_message_for_should_not do |actual|
15
+ "expected that '#{actual}' would not be a whisper tone (<Response />)"
16
+ end
17
+ end
18
+
19
+ RSpec::Matchers.define :be_hangup do |expected|
20
+ match do |actual|
21
+ xml = Nokogiri::XML actual
22
+ root = xml.root
23
+ root.should be
24
+ hangup = xml.at '/Response/Hangup'
25
+ hangup.should be
26
+ end
27
+
28
+ failure_message_for_should do |actual|
29
+ "expected that '#{actual}' would be a hangup (<Response><Hangup/></Response>)"
30
+ end
31
+
32
+ failure_message_for_should_not do |actual|
33
+ "expected that '#{actual}' would not be a hangup (<Response><Hangup/></Response>)"
34
+ end
35
+ end
@@ -0,0 +1,23 @@
1
+ RSpec::Matchers.define :join_conference do |expected|
2
+ chain :with_id do |id|
3
+ @id = id
4
+ end
5
+
6
+ match do |actual|
7
+ xml = Nokogiri::XML response.body
8
+ dial = xml.at '/Response/Dial'
9
+ dial.attributes['record'].value.should == 'false'
10
+ conference = dial.at('Conference')
11
+ conference.attributes['beep'].value.should == 'false'
12
+ @id ||= actual.conversation_id
13
+ conference.text.should == "conference-#{@id}"
14
+ end
15
+
16
+ failure_message_for_should do |actual|
17
+ "expected that '#{actual}' would join the conference"
18
+ end
19
+
20
+ failure_message_for_should_not do |actual|
21
+ "expected that '#{actual}' would not join the conference"
22
+ end
23
+ end
@@ -0,0 +1 @@
1
+ require 'nokogiri'
@@ -0,0 +1,24 @@
1
+ require 'openssl'
2
+
3
+ module PusherSignatureHelper
4
+ def sign_pusher_request(payload)
5
+ secret = PUSHER_CONFIG["secret"]
6
+ digest = OpenSSL::Digest::SHA256.new
7
+ body = payload.to_query
8
+ signature = OpenSSL::HMAC.hexdigest(digest, secret, body)
9
+ request.env['HTTP_X_PUSHER_SIGNATURE'] = signature
10
+
11
+ request.env['HTTP_X_PUSHER_KEY'] = PUSHER_CONFIG["app_key"]
12
+ end
13
+
14
+ def get_pusher_params(payload)
15
+ secret = PUSHER_CONFIG["secret"]
16
+ digest = OpenSSL::Digest::SHA256.new
17
+ body = payload.to_query
18
+ signature = OpenSSL::HMAC.hexdigest(digest, secret, body)
19
+ {
20
+ 'HTTP_X_PUSHER_SIGNATURE' => signature,
21
+ 'HTTP_X_PUSHER_KEY' => PUSHER_CONFIG["app_key"]
22
+ }
23
+ end
24
+ end
@@ -0,0 +1,12 @@
1
+ require 'vcr'
2
+
3
+ VCR.configure do |config|
4
+ config.cassette_library_dir = 'spec/fixtures/vcr_cassettes'
5
+ config.hook_into :webmock
6
+ config.configure_rspec_metadata!
7
+
8
+ config.default_cassette_options = {
9
+ :record => :new_episodes,
10
+ :match_requests_on => [:method, :uri]
11
+ }
12
+ end
@@ -0,0 +1 @@
1
+ require 'webmock/rspec'
metadata ADDED
@@ -0,0 +1,692 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: telephony
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.3
5
+ platform: ruby
6
+ authors:
7
+ - Zest
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-02-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '3.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '3.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: state_machine
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: kaminari
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pusher
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '='
60
+ - !ruby/object:Gem::Version
61
+ version: 0.11.3
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '='
67
+ - !ruby/object:Gem::Version
68
+ version: 0.11.3
69
+ - !ruby/object:Gem::Dependency
70
+ name: ejs
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ! '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ! '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: sass
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ! '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ! '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: Call placing and handling framework.
98
+ email:
99
+ executables: []
100
+ extensions: []
101
+ extra_rdoc_files: []
102
+ files:
103
+ - README.md
104
+ - Rakefile
105
+ - app/assets/fonts/telephony/zest-telephony.eot
106
+ - app/assets/fonts/telephony/zest-telephony.svg
107
+ - app/assets/fonts/telephony/zest-telephony.ttf
108
+ - app/assets/fonts/telephony/zest-telephony.woff
109
+ - app/assets/images/telephony/backspace.png
110
+ - app/assets/images/telephony/icon-spinner.gif
111
+ - app/assets/javascripts/telephony/application.js
112
+ - app/assets/javascripts/telephony/collections/agents.js
113
+ - app/assets/javascripts/telephony/config.js.erb
114
+ - app/assets/javascripts/telephony/models/agent.js
115
+ - app/assets/javascripts/telephony/models/conversation.js
116
+ - app/assets/javascripts/telephony/models/device.js
117
+ - app/assets/javascripts/telephony/models/transfer.js
118
+ - app/assets/javascripts/telephony/namespace.js
119
+ - app/assets/javascripts/telephony/push.js
120
+ - app/assets/javascripts/telephony/vendor/backbone.js
121
+ - app/assets/javascripts/telephony/vendor/chosen.jquery.js
122
+ - app/assets/javascripts/telephony/vendor/jquery.form.js
123
+ - app/assets/javascripts/telephony/vendor/pusher.js
124
+ - app/assets/javascripts/telephony/vendor/test_dependencies.js
125
+ - app/assets/javascripts/telephony/vendor/underscore.js
126
+ - app/assets/javascripts/telephony/views/agents_view.js
127
+ - app/assets/javascripts/telephony/views/application_view.js
128
+ - app/assets/javascripts/telephony/views/call_queue_view.js
129
+ - app/assets/javascripts/telephony/views/conversation_buttons_view.js
130
+ - app/assets/javascripts/telephony/views/conversation_view.js
131
+ - app/assets/javascripts/telephony/views/status_view.js
132
+ - app/assets/javascripts/telephony/views/transfer_view.js
133
+ - app/assets/javascripts/telephony/views/twilio_client_view.js
134
+ - app/assets/javascripts/telephony/views/widget_view.js
135
+ - app/assets/javascripts/telephony/widget.js
136
+ - app/assets/javascripts/templates/telephony/agents_view.jst.ejs
137
+ - app/assets/javascripts/templates/telephony/call_queue_view.jst.ejs
138
+ - app/assets/javascripts/templates/telephony/conversation_buttons_view.jst.ejs
139
+ - app/assets/javascripts/templates/telephony/conversation_view.jst.ejs
140
+ - app/assets/javascripts/templates/telephony/status_view.jst.ejs
141
+ - app/assets/javascripts/templates/telephony/transfer_view.jst.ejs
142
+ - app/assets/javascripts/templates/telephony/twilio_client_view.jst.ejs
143
+ - app/assets/stylesheets/telephony/font.css
144
+ - app/assets/stylesheets/telephony/reset.css.scss
145
+ - app/assets/stylesheets/telephony/widget.css.scss
146
+ - app/controllers/telephony/agents_controller.rb
147
+ - app/controllers/telephony/application_controller.rb
148
+ - app/controllers/telephony/call_centers_controller.rb
149
+ - app/controllers/telephony/conversations_controller.rb
150
+ - app/controllers/telephony/inbound/conversation_queues_controller.rb
151
+ - app/controllers/telephony/playable_listeners_controller.rb
152
+ - app/controllers/telephony/providers/twilio/application_controller.rb
153
+ - app/controllers/telephony/providers/twilio/calls_controller.rb
154
+ - app/controllers/telephony/providers/twilio/inbound_calls_controller.rb
155
+ - app/controllers/telephony/providers/twilio/musics_controller.rb
156
+ - app/controllers/telephony/providers/twilio/voicemails_controller.rb
157
+ - app/controllers/telephony/signals/agents/presences_controller.rb
158
+ - app/controllers/telephony/transfers_controller.rb
159
+ - app/controllers/telephony/twilio_client_controller.rb
160
+ - app/controllers/telephony/voicemails_controller.rb
161
+ - app/controllers/telephony/widget_controller.rb
162
+ - app/helpers/telephony/application_helper.rb
163
+ - app/helpers/telephony/calls_helper.rb
164
+ - app/models/telephony/agent.rb
165
+ - app/models/telephony/agent_state_machine.rb
166
+ - app/models/telephony/base.rb
167
+ - app/models/telephony/blacklisted_number.rb
168
+ - app/models/telephony/call.rb
169
+ - app/models/telephony/call_center.rb
170
+ - app/models/telephony/call_state_machine.rb
171
+ - app/models/telephony/conversation.rb
172
+ - app/models/telephony/conversation_state_machine.rb
173
+ - app/models/telephony/conversations_presenter.rb
174
+ - app/models/telephony/events.rb
175
+ - app/models/telephony/events/answer.rb
176
+ - app/models/telephony/events/base.rb
177
+ - app/models/telephony/events/busy.rb
178
+ - app/models/telephony/events/call_answered.rb
179
+ - app/models/telephony/events/call_fail.rb
180
+ - app/models/telephony/events/complete_hold.rb
181
+ - app/models/telephony/events/complete_one_step_transfer.rb
182
+ - app/models/telephony/events/complete_resume.rb
183
+ - app/models/telephony/events/complete_two_step_transfer.rb
184
+ - app/models/telephony/events/conference.rb
185
+ - app/models/telephony/events/connect.rb
186
+ - app/models/telephony/events/customer_left_two_step_transfer.rb
187
+ - app/models/telephony/events/dial_agent.rb
188
+ - app/models/telephony/events/ended.rb
189
+ - app/models/telephony/events/enqueue.rb
190
+ - app/models/telephony/events/fail_one_step_transfer.rb
191
+ - app/models/telephony/events/fail_two_step_transfer.rb
192
+ - app/models/telephony/events/initialize_widget.rb
193
+ - app/models/telephony/events/initiate_hold.rb
194
+ - app/models/telephony/events/initiate_one_step_transfer.rb
195
+ - app/models/telephony/events/initiate_resume.rb
196
+ - app/models/telephony/events/initiate_two_step_transfer.rb
197
+ - app/models/telephony/events/leave_two_step_transfer.rb
198
+ - app/models/telephony/events/leave_voicemail.rb
199
+ - app/models/telephony/events/no_answer.rb
200
+ - app/models/telephony/events/play_closed_greeting.rb
201
+ - app/models/telephony/events/play_message.rb
202
+ - app/models/telephony/events/reject.rb
203
+ - app/models/telephony/events/rona.rb
204
+ - app/models/telephony/events/start.rb
205
+ - app/models/telephony/events/straight_to_voicemail.rb
206
+ - app/models/telephony/events/terminate.rb
207
+ - app/models/telephony/events/transfer.rb
208
+ - app/models/telephony/inbound_conversation_queue.rb
209
+ - app/models/telephony/playable.rb
210
+ - app/models/telephony/playable_listener.rb
211
+ - app/models/telephony/pusher_event_publisher.rb
212
+ - app/models/telephony/recording.rb
213
+ - app/models/telephony/voicemail.rb
214
+ - app/observers/telephony/agent_observer.rb
215
+ - app/observers/telephony/call_observer.rb
216
+ - app/observers/telephony/conversation_observer.rb
217
+ - app/observers/telephony/event_observer.rb
218
+ - app/views/layouts/telephony/application.html.erb
219
+ - app/views/telephony/providers/twilio/calls/child_detached.builder
220
+ - app/views/telephony/providers/twilio/calls/complete_hold.builder
221
+ - app/views/telephony/providers/twilio/calls/connect.builder
222
+ - app/views/telephony/providers/twilio/calls/dial.builder
223
+ - app/views/telephony/providers/twilio/calls/done.builder
224
+ - app/views/telephony/providers/twilio/calls/join_conference.builder
225
+ - app/views/telephony/providers/twilio/calls/whisper_tone.builder
226
+ - app/views/telephony/providers/twilio/inbound_calls/closed_hours.builder
227
+ - app/views/telephony/providers/twilio/inbound_calls/create.builder
228
+ - app/views/telephony/providers/twilio/inbound_calls/enqueue.builder
229
+ - app/views/telephony/providers/twilio/inbound_calls/reject.builder
230
+ - app/views/telephony/providers/twilio/inbound_calls/wait_music.builder
231
+ - app/views/telephony/providers/twilio/musics/hold.builder
232
+ - app/views/telephony/providers/twilio/voicemails/new.builder
233
+ - app/views/telephony/twilio_client/index.html.erb
234
+ - app/views/telephony/widget/index.erb
235
+ - config/cucumber.yml
236
+ - config/database.yml
237
+ - config/environment.rb
238
+ - config/initializers/pusher.rb
239
+ - config/initializers/telephony.rb
240
+ - config/routes.rb
241
+ - config/wopr.yml.example
242
+ - db/migrate/20130806213053_bootstrap_db.rb
243
+ - db/migrate/20131009204026_create_telephony_blacklisted_numbers.rb
244
+ - lib/agent_generator.rb
245
+ - lib/tasks/cucumber.rake
246
+ - lib/tasks/jasmine.rake
247
+ - lib/tasks/telephony_tasks.rake
248
+ - lib/telephony.rb
249
+ - lib/telephony/concerns/controllers/twilio_request_verifier.rb
250
+ - lib/telephony/conversation_data.rb
251
+ - lib/telephony/engine.rb
252
+ - lib/telephony/error.rb
253
+ - lib/telephony/error/agent_on_a_call.rb
254
+ - lib/telephony/error/base.rb
255
+ - lib/telephony/error/connection.rb
256
+ - lib/telephony/error/not_in_progress.rb
257
+ - lib/telephony/error/queue_empty.rb
258
+ - lib/telephony/helper.rb
259
+ - lib/telephony/jobs/agent_offline.rb
260
+ - lib/telephony/jobs/pusher_event.rb
261
+ - lib/telephony/providers/twilio_provider.rb
262
+ - lib/telephony/version.rb
263
+ - spec/controllers/telephony/agents_controller_spec.rb
264
+ - spec/controllers/telephony/call_centers_controller_spec.rb
265
+ - spec/controllers/telephony/conversations_controller_spec.rb
266
+ - spec/controllers/telephony/playable_listeners_controller_spec.rb
267
+ - spec/controllers/telephony/providers/twilio/calls_controller_spec.rb
268
+ - spec/controllers/telephony/providers/twilio/musics_controller_spec.rb
269
+ - spec/controllers/telephony/signals/agents/presences_controller_spec.rb
270
+ - spec/controllers/telephony/twilio_client_controller_spec.rb
271
+ - spec/controllers/telephony/widget_controller_spec.rb
272
+ - spec/dummy/Rakefile
273
+ - spec/dummy/app/assets/javascripts/application.js
274
+ - spec/dummy/app/assets/javascripts/lib/event_logger.js
275
+ - spec/dummy/app/assets/javascripts/vendor/backbone.js
276
+ - spec/dummy/app/assets/javascripts/vendor/chosen.jquery.js
277
+ - spec/dummy/app/assets/javascripts/vendor/jquery.form.js
278
+ - spec/dummy/app/assets/javascripts/vendor/underscore.js
279
+ - spec/dummy/app/assets/stylesheets/application.css
280
+ - spec/dummy/app/controllers/application_controller.rb
281
+ - spec/dummy/app/controllers/widget_host_controller.rb
282
+ - spec/dummy/app/helpers/application_helper.rb
283
+ - spec/dummy/app/views/layouts/application.html.erb
284
+ - spec/dummy/app/views/widget_host/index.html.erb
285
+ - spec/dummy/config.ru
286
+ - spec/dummy/config/application.rb
287
+ - spec/dummy/config/boot.rb
288
+ - spec/dummy/config/call_centers.yml
289
+ - spec/dummy/config/call_centers.yml.example
290
+ - spec/dummy/config/database.yml
291
+ - spec/dummy/config/environment.rb
292
+ - spec/dummy/config/environments/cucumber.rb
293
+ - spec/dummy/config/environments/development.rb
294
+ - spec/dummy/config/environments/production.rb
295
+ - spec/dummy/config/environments/test.rb
296
+ - spec/dummy/config/initializers/backtrace_silencers.rb
297
+ - spec/dummy/config/initializers/inflections.rb
298
+ - spec/dummy/config/initializers/mime_types.rb
299
+ - spec/dummy/config/initializers/secret_token.rb
300
+ - spec/dummy/config/initializers/session_store.rb
301
+ - spec/dummy/config/initializers/wrap_parameters.rb
302
+ - spec/dummy/config/locales/en.yml
303
+ - spec/dummy/config/pusher.yml
304
+ - spec/dummy/config/pusher.yml.example
305
+ - spec/dummy/config/routes.rb
306
+ - spec/dummy/config/sms_whitelist.json.example
307
+ - spec/dummy/config/twilio.yml
308
+ - spec/dummy/config/twilio.yml.example
309
+ - spec/dummy/db/schema.rb
310
+ - spec/dummy/db/seeds.rb
311
+ - spec/dummy/log/production.log
312
+ - spec/dummy/log/test.log
313
+ - spec/dummy/public/404.html
314
+ - spec/dummy/public/422.html
315
+ - spec/dummy/public/500.html
316
+ - spec/dummy/public/assets/application-628309db7ce8c0abdd91f8f796881599.js
317
+ - spec/dummy/public/assets/application-628309db7ce8c0abdd91f8f796881599.js.gz
318
+ - spec/dummy/public/assets/application-6c551430f3bdd32ba57c9c41e5f91846.css
319
+ - spec/dummy/public/assets/application-6c551430f3bdd32ba57c9c41e5f91846.css.gz
320
+ - spec/dummy/public/assets/telephony/backspace-9f5b195e049ed90eb20ecdda6e264b0a.png
321
+ - spec/dummy/public/assets/telephony/icon-spinner-ddbae473a70c5425810aeee31d4a8ad7.gif
322
+ - spec/dummy/public/assets/telephony/zest-telephony-0e6b13673634da80de9ae09bcca253e3.eot
323
+ - spec/dummy/public/assets/telephony/zest-telephony-37f394757ccb11b978f16d9fd32cb3b5.ttf
324
+ - spec/dummy/public/assets/telephony/zest-telephony-e7efdbc60c0a1c8404951bc79c7fb3a8.woff
325
+ - spec/dummy/public/assets/telephony/zest-telephony-f34287df626936908408f53a33db9e83.svg
326
+ - spec/dummy/public/favicon.ico
327
+ - spec/dummy/script/rails
328
+ - spec/dummy/tmp/cache/assets/C98/020/sprockets%2Fa83f8254d688334ff179984e423f502f
329
+ - spec/dummy/tmp/cache/assets/CA4/550/sprockets%2F407f9191fe573f2435c55c017cb0d022
330
+ - spec/dummy/tmp/cache/assets/CAA/6A0/sprockets%2F3265550e2d2c7f5a864ca85d255504c2
331
+ - spec/dummy/tmp/cache/assets/CB0/F60/sprockets%2F462f9efed31e6710732376ae06c27208
332
+ - spec/dummy/tmp/cache/assets/CB6/E20/sprockets%2Fa7092cd9f16917099d754f1380af13e1
333
+ - spec/dummy/tmp/cache/assets/CC7/9F0/sprockets%2F0517100815cd45c43fec1d8510fcb630
334
+ - spec/dummy/tmp/cache/assets/CCA/BF0/sprockets%2F16ea15e0b5d367c34b812612a4207e3e
335
+ - spec/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953
336
+ - spec/dummy/tmp/cache/assets/CF1/960/sprockets%2F36ef26985821ec702c74dae4af789903
337
+ - spec/dummy/tmp/cache/assets/D07/F30/sprockets%2Fd12862f20df0c9ef7aa2b4216d247079
338
+ - spec/dummy/tmp/cache/assets/D09/BF0/sprockets%2F5c8595efaa8cc5235a09801c60e25a16
339
+ - spec/dummy/tmp/cache/assets/D0D/250/sprockets%2F5e759d66e374910dae5a51b221e6e3a4
340
+ - spec/dummy/tmp/cache/assets/D0D/E30/sprockets%2Fa282879e0788ba133f5bdc211cf134e8
341
+ - spec/dummy/tmp/cache/assets/D11/8E0/sprockets%2F2a193a8af29963f1113bef05788e02ff
342
+ - spec/dummy/tmp/cache/assets/D14/270/sprockets%2F7f95a752910ed33d728532f8fabd340d
343
+ - spec/dummy/tmp/cache/assets/D17/BE0/sprockets%2F58749d7aea4ca766c2520801f0f96b9b
344
+ - spec/dummy/tmp/cache/assets/D18/270/sprockets%2Fbb2d88813b1795a97e9a7c14100eef77
345
+ - spec/dummy/tmp/cache/assets/D22/310/sprockets%2Fbae9148ce1229214dfbb0c425b0054d0
346
+ - spec/dummy/tmp/cache/assets/D30/EB0/sprockets%2F2c668b88beb4c9805d91ed4587f549e7
347
+ - spec/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705
348
+ - spec/dummy/tmp/cache/assets/D3C/690/sprockets%2F681ba175fdd2da8d590b7e624b6135a6
349
+ - spec/dummy/tmp/cache/assets/D44/BC0/sprockets%2F7214f66dd91fdd51f00c3882293f5eea
350
+ - spec/dummy/tmp/cache/assets/D46/FA0/sprockets%2F4f9543cd9e68ba3141fd488afb13681b
351
+ - spec/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655
352
+ - spec/dummy/tmp/cache/assets/D51/9A0/sprockets%2Fb6e4cbcf30f6f611671695f79ea846d5
353
+ - spec/dummy/tmp/cache/assets/D55/920/sprockets%2F0a02242aa4c4febcc796419aba103c69
354
+ - spec/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6
355
+ - spec/dummy/tmp/cache/assets/D5F/6F0/sprockets%2F155e7bc44f326371cce0ca8bc5b2414e
356
+ - spec/dummy/tmp/cache/assets/D6B/250/sprockets%2Fe4eecce7a3371b11038c92f07cb28e67
357
+ - spec/dummy/tmp/cache/assets/D6B/E70/sprockets%2F103a456ae3692e3cca20b7696fdee8f0
358
+ - spec/dummy/tmp/cache/assets/D7F/AD0/sprockets%2Fb1c02d12303b1fe2f981771cbb0c4cbd
359
+ - spec/dummy/tmp/cache/assets/D81/D00/sprockets%2F0c68b6d9dce98681a2a710d9fc3f7e39
360
+ - spec/dummy/tmp/cache/assets/D94/4D0/sprockets%2F4608a5bdf27ddf11bcaed1375911e9a2
361
+ - spec/dummy/tmp/cache/assets/D9A/580/sprockets%2F433005b19aaf7ed5cba9c7f8cd30b775
362
+ - spec/dummy/tmp/cache/assets/DA4/270/sprockets%2F860ab3bd30204e02c0a5d82bd4bbabe1
363
+ - spec/dummy/tmp/cache/assets/DA4/480/sprockets%2F53e39285bb57a2ddb6ff856b2eb491da
364
+ - spec/dummy/tmp/cache/assets/DA6/3C0/sprockets%2F587c7e35f47442eadaa530acc5e9f5e6
365
+ - spec/dummy/tmp/cache/assets/DAB/DA0/sprockets%2Fb8fb5e8518ed3d38a7f6a8f18a9208aa
366
+ - spec/dummy/tmp/cache/assets/DB2/700/sprockets%2Ffa85cb79b94fce1b8344d983ea863d2e
367
+ - spec/dummy/tmp/cache/assets/DCC/4F0/sprockets%2Fbc0f3c61e16afb5a285ba8b39846ed8b
368
+ - spec/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994
369
+ - spec/dummy/tmp/cache/assets/DDC/BE0/sprockets%2F2c0a4d4675a61b014aedbbabb3f071fc
370
+ - spec/dummy/tmp/cache/assets/E04/640/sprockets%2F3c5ddf2bbefd9d70f1b506b519cf856e
371
+ - spec/dummy/tmp/cache/assets/E04/7F0/sprockets%2F35f1b2ff729a5ec21f6dc5f7d6faa67b
372
+ - spec/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af
373
+ - spec/dummy/tmp/cache/assets/E07/230/sprockets%2Febd4f2dd708879d593aff008ccb75acc
374
+ - spec/dummy/tmp/cache/assets/E17/9D0/sprockets%2F8db2b79f6c4eabe7a9ebe7a7898ec066
375
+ - spec/dummy/tmp/cache/assets/E31/F10/sprockets%2Fcebacf56667da1cc2961b59fd922eafb
376
+ - spec/factories/agent.rb
377
+ - spec/factories/calls.rb
378
+ - spec/factories/conversations.rb
379
+ - spec/factories/events.rb
380
+ - spec/factories/playable_listeners.rb
381
+ - spec/factories/recordings.rb
382
+ - spec/factories/voicemails.rb
383
+ - spec/fixtures/vcr_cassettes/Authenticating_an_online_user.yml
384
+ - spec/fixtures/vcr_cassettes/Creating_a_conversation/creates_a_new_call.yml
385
+ - spec/fixtures/vcr_cassettes/Creating_a_conversation/creates_a_new_conversation.yml
386
+ - spec/fixtures/vcr_cassettes/Creating_a_conversation/returns_the_conversation_as_JSON.yml
387
+ - spec/fixtures/vcr_cassettes/Pusher_channel_as_JSON.yml
388
+ - spec/fixtures/vcr_cassettes/Pusher_to_publish_the_event.yml
389
+ - spec/fixtures/vcr_cassettes/Reloading_the_widget_during_a_call/_create/during_a_call/after_a_failed_transfer/pushes_the_event_for_the_active_call.yml
390
+ - spec/fixtures/vcr_cassettes/Telephony_ConversationsController/_create/by_default/creates_a_new_call.yml
391
+ - spec/fixtures/vcr_cassettes/Telephony_ConversationsController/_create/by_default/creates_a_new_conversation.yml
392
+ - spec/fixtures/vcr_cassettes/Telephony_ConversationsController/_create/by_default/returns_the_conversation_as_JSON.yml
393
+ - spec/fixtures/vcr_cassettes/Telephony_Providers_TwilioProvider/_call/allows_the_phone_to_ring_for_60_seconds.yml
394
+ - spec/fixtures/vcr_cassettes/Telephony_Providers_TwilioProvider/_call/includes_a_status_change_callback_url.yml
395
+ - spec/fixtures/vcr_cassettes/Telephony_Providers_TwilioProvider/_call/places_a_call.yml
396
+ - spec/fixtures/vcr_cassettes/Telephony_Providers_TwilioProvider/_dial_into_conference/allows_the_phone_to_ring_for_15_seconds.yml
397
+ - spec/fixtures/vcr_cassettes/Telephony_Providers_TwilioProvider/_dial_into_conference/places_a_call_to_redirect_the_participant_to_a_conference.yml
398
+ - spec/fixtures/vcr_cassettes/Telephony_Providers_TwilioProvider/_hangup/by_default/hangs_up_the_call.yml
399
+ - spec/fixtures/vcr_cassettes/buying_number_for_an_area_code.yml
400
+ - spec/fixtures/vcr_cassettes/returns_success.yml
401
+ - spec/javascripts/helpers/jasmine-jquery.js
402
+ - spec/javascripts/helpers/mock-ajax.js
403
+ - spec/javascripts/support/jasmine.yml
404
+ - spec/javascripts/telephony/models/agent_spec.js
405
+ - spec/javascripts/telephony/models/conversation_spec.js
406
+ - spec/javascripts/telephony/models/device_spec.js
407
+ - spec/javascripts/telephony/models/transfer_spec.js
408
+ - spec/javascripts/telephony/push_spec.js
409
+ - spec/javascripts/telephony/views/agents_view_spec.js
410
+ - spec/javascripts/telephony/views/application_view_spec.js
411
+ - spec/javascripts/telephony/views/conversation_view_spec.js
412
+ - spec/javascripts/telephony/views/status_view_spec.js
413
+ - spec/javascripts/telephony/views/transfer_view_spec.js
414
+ - spec/javascripts/telephony/views/twilio_client_view_spec.js
415
+ - spec/javascripts/telephony/views/widget_view_spec.js
416
+ - spec/lib/telephony/concerns/controllers/twilio_request_verifier_spec.rb
417
+ - spec/lib/telephony/conversation_data_spec.rb
418
+ - spec/lib/telephony/helper_spec.rb
419
+ - spec/lib/telephony/jobs/agent_offline_spec.rb
420
+ - spec/lib/telephony/jobs/pusher_event_spec.rb
421
+ - spec/lib/telephony/providers/twilio_provider_spec.rb
422
+ - spec/lib/telephony_spec.rb
423
+ - spec/models/telephony/agent_spec.rb
424
+ - spec/models/telephony/agent_state_machine_spec.rb
425
+ - spec/models/telephony/call_center_spec.rb
426
+ - spec/models/telephony/call_spec.rb
427
+ - spec/models/telephony/call_state_machine_spec.rb
428
+ - spec/models/telephony/conversation_spec.rb
429
+ - spec/models/telephony/conversation_state_machine_spec.rb
430
+ - spec/models/telephony/conversations_presenter_spec.rb
431
+ - spec/models/telephony/event_spec.rb
432
+ - spec/models/telephony/inbound_conversation_queue_spec.rb
433
+ - spec/models/telephony/playable_listener_spec.rb
434
+ - spec/models/telephony/pusher_event_publisher_spec.rb
435
+ - spec/models/telephony/recording_spec.rb
436
+ - spec/models/telephony/voicemail_spec.rb
437
+ - spec/observers/telephony/agent_observer_spec.rb
438
+ - spec/observers/telephony/event_observer_spec.rb
439
+ - spec/requests/create_conversation_spec.rb
440
+ - spec/requests/dequeue_call_spec.rb
441
+ - spec/requests/list_conversations_spec.rb
442
+ - spec/requests/presences_spec.rb
443
+ - spec/requests/providers/twilio/calls/child_answered_spec.rb
444
+ - spec/requests/providers/twilio/calls/child_detached_spec.rb
445
+ - spec/requests/providers/twilio/calls/dial_spec.rb
446
+ - spec/requests/providers/twilio/calls/done_spec.rb
447
+ - spec/requests/providers/twilio/calls/join_conference_spec.rb
448
+ - spec/requests/providers/twilio/calls/leave_queue_spec.rb
449
+ - spec/requests/providers/twilio/calls/parent_answered_spec.rb
450
+ - spec/requests/providers/twilio/inbound/connect_dequeued_call_spec.rb
451
+ - spec/requests/providers/twilio/inbound/enqueue_inbound_call_spec.rb
452
+ - spec/requests/providers/twilio/inbound/enqueued_call_wait_music_spec.rb
453
+ - spec/requests/providers/twilio/voicemails/leave_voicemail_spec.rb
454
+ - spec/requests/search_conversations_spec.rb
455
+ - spec/requests/transfer_spec.rb
456
+ - spec/requests/voicemail_api_spec.rb
457
+ - spec/spec_helper.rb
458
+ - spec/support/factory_girl.rb
459
+ - spec/support/matchers/be_complete_hold.rb
460
+ - spec/support/matchers/be_whisper_tone.rb
461
+ - spec/support/matchers/join_conference.rb
462
+ - spec/support/nokogiri.rb
463
+ - spec/support/pusher_helper.rb
464
+ - spec/support/vcr.rb
465
+ - spec/support/webmock.rb
466
+ homepage: https://github.com/ZestFinance/zestphone
467
+ licenses: []
468
+ metadata: {}
469
+ post_install_message:
470
+ rdoc_options: []
471
+ require_paths:
472
+ - lib
473
+ required_ruby_version: !ruby/object:Gem::Requirement
474
+ requirements:
475
+ - - ! '>='
476
+ - !ruby/object:Gem::Version
477
+ version: '0'
478
+ required_rubygems_version: !ruby/object:Gem::Requirement
479
+ requirements:
480
+ - - ! '>='
481
+ - !ruby/object:Gem::Version
482
+ version: '0'
483
+ requirements: []
484
+ rubyforge_project:
485
+ rubygems_version: 2.2.1
486
+ signing_key:
487
+ specification_version: 4
488
+ summary: Call placing and handling framework.
489
+ test_files:
490
+ - spec/controllers/telephony/agents_controller_spec.rb
491
+ - spec/controllers/telephony/call_centers_controller_spec.rb
492
+ - spec/controllers/telephony/conversations_controller_spec.rb
493
+ - spec/controllers/telephony/playable_listeners_controller_spec.rb
494
+ - spec/controllers/telephony/providers/twilio/calls_controller_spec.rb
495
+ - spec/controllers/telephony/providers/twilio/musics_controller_spec.rb
496
+ - spec/controllers/telephony/signals/agents/presences_controller_spec.rb
497
+ - spec/controllers/telephony/twilio_client_controller_spec.rb
498
+ - spec/controllers/telephony/widget_controller_spec.rb
499
+ - spec/dummy/app/assets/javascripts/application.js
500
+ - spec/dummy/app/assets/javascripts/lib/event_logger.js
501
+ - spec/dummy/app/assets/javascripts/vendor/backbone.js
502
+ - spec/dummy/app/assets/javascripts/vendor/chosen.jquery.js
503
+ - spec/dummy/app/assets/javascripts/vendor/jquery.form.js
504
+ - spec/dummy/app/assets/javascripts/vendor/underscore.js
505
+ - spec/dummy/app/assets/stylesheets/application.css
506
+ - spec/dummy/app/controllers/application_controller.rb
507
+ - spec/dummy/app/controllers/widget_host_controller.rb
508
+ - spec/dummy/app/helpers/application_helper.rb
509
+ - spec/dummy/app/views/layouts/application.html.erb
510
+ - spec/dummy/app/views/widget_host/index.html.erb
511
+ - spec/dummy/config/application.rb
512
+ - spec/dummy/config/boot.rb
513
+ - spec/dummy/config/call_centers.yml
514
+ - spec/dummy/config/call_centers.yml.example
515
+ - spec/dummy/config/database.yml
516
+ - spec/dummy/config/environment.rb
517
+ - spec/dummy/config/environments/cucumber.rb
518
+ - spec/dummy/config/environments/development.rb
519
+ - spec/dummy/config/environments/production.rb
520
+ - spec/dummy/config/environments/test.rb
521
+ - spec/dummy/config/initializers/backtrace_silencers.rb
522
+ - spec/dummy/config/initializers/inflections.rb
523
+ - spec/dummy/config/initializers/mime_types.rb
524
+ - spec/dummy/config/initializers/secret_token.rb
525
+ - spec/dummy/config/initializers/session_store.rb
526
+ - spec/dummy/config/initializers/wrap_parameters.rb
527
+ - spec/dummy/config/locales/en.yml
528
+ - spec/dummy/config/pusher.yml
529
+ - spec/dummy/config/pusher.yml.example
530
+ - spec/dummy/config/routes.rb
531
+ - spec/dummy/config/sms_whitelist.json.example
532
+ - spec/dummy/config/twilio.yml
533
+ - spec/dummy/config/twilio.yml.example
534
+ - spec/dummy/config.ru
535
+ - spec/dummy/db/schema.rb
536
+ - spec/dummy/db/seeds.rb
537
+ - spec/dummy/log/production.log
538
+ - spec/dummy/log/test.log
539
+ - spec/dummy/public/404.html
540
+ - spec/dummy/public/422.html
541
+ - spec/dummy/public/500.html
542
+ - spec/dummy/public/assets/application-628309db7ce8c0abdd91f8f796881599.js
543
+ - spec/dummy/public/assets/application-628309db7ce8c0abdd91f8f796881599.js.gz
544
+ - spec/dummy/public/assets/application-6c551430f3bdd32ba57c9c41e5f91846.css
545
+ - spec/dummy/public/assets/application-6c551430f3bdd32ba57c9c41e5f91846.css.gz
546
+ - spec/dummy/public/assets/telephony/backspace-9f5b195e049ed90eb20ecdda6e264b0a.png
547
+ - spec/dummy/public/assets/telephony/icon-spinner-ddbae473a70c5425810aeee31d4a8ad7.gif
548
+ - spec/dummy/public/assets/telephony/zest-telephony-0e6b13673634da80de9ae09bcca253e3.eot
549
+ - spec/dummy/public/assets/telephony/zest-telephony-37f394757ccb11b978f16d9fd32cb3b5.ttf
550
+ - spec/dummy/public/assets/telephony/zest-telephony-e7efdbc60c0a1c8404951bc79c7fb3a8.woff
551
+ - spec/dummy/public/assets/telephony/zest-telephony-f34287df626936908408f53a33db9e83.svg
552
+ - spec/dummy/public/favicon.ico
553
+ - spec/dummy/Rakefile
554
+ - spec/dummy/script/rails
555
+ - spec/dummy/tmp/cache/assets/C98/020/sprockets%2Fa83f8254d688334ff179984e423f502f
556
+ - spec/dummy/tmp/cache/assets/CA4/550/sprockets%2F407f9191fe573f2435c55c017cb0d022
557
+ - spec/dummy/tmp/cache/assets/CAA/6A0/sprockets%2F3265550e2d2c7f5a864ca85d255504c2
558
+ - spec/dummy/tmp/cache/assets/CB0/F60/sprockets%2F462f9efed31e6710732376ae06c27208
559
+ - spec/dummy/tmp/cache/assets/CB6/E20/sprockets%2Fa7092cd9f16917099d754f1380af13e1
560
+ - spec/dummy/tmp/cache/assets/CC7/9F0/sprockets%2F0517100815cd45c43fec1d8510fcb630
561
+ - spec/dummy/tmp/cache/assets/CCA/BF0/sprockets%2F16ea15e0b5d367c34b812612a4207e3e
562
+ - spec/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953
563
+ - spec/dummy/tmp/cache/assets/CF1/960/sprockets%2F36ef26985821ec702c74dae4af789903
564
+ - spec/dummy/tmp/cache/assets/D07/F30/sprockets%2Fd12862f20df0c9ef7aa2b4216d247079
565
+ - spec/dummy/tmp/cache/assets/D09/BF0/sprockets%2F5c8595efaa8cc5235a09801c60e25a16
566
+ - spec/dummy/tmp/cache/assets/D0D/250/sprockets%2F5e759d66e374910dae5a51b221e6e3a4
567
+ - spec/dummy/tmp/cache/assets/D0D/E30/sprockets%2Fa282879e0788ba133f5bdc211cf134e8
568
+ - spec/dummy/tmp/cache/assets/D11/8E0/sprockets%2F2a193a8af29963f1113bef05788e02ff
569
+ - spec/dummy/tmp/cache/assets/D14/270/sprockets%2F7f95a752910ed33d728532f8fabd340d
570
+ - spec/dummy/tmp/cache/assets/D17/BE0/sprockets%2F58749d7aea4ca766c2520801f0f96b9b
571
+ - spec/dummy/tmp/cache/assets/D18/270/sprockets%2Fbb2d88813b1795a97e9a7c14100eef77
572
+ - spec/dummy/tmp/cache/assets/D22/310/sprockets%2Fbae9148ce1229214dfbb0c425b0054d0
573
+ - spec/dummy/tmp/cache/assets/D30/EB0/sprockets%2F2c668b88beb4c9805d91ed4587f549e7
574
+ - spec/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705
575
+ - spec/dummy/tmp/cache/assets/D3C/690/sprockets%2F681ba175fdd2da8d590b7e624b6135a6
576
+ - spec/dummy/tmp/cache/assets/D44/BC0/sprockets%2F7214f66dd91fdd51f00c3882293f5eea
577
+ - spec/dummy/tmp/cache/assets/D46/FA0/sprockets%2F4f9543cd9e68ba3141fd488afb13681b
578
+ - spec/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655
579
+ - spec/dummy/tmp/cache/assets/D51/9A0/sprockets%2Fb6e4cbcf30f6f611671695f79ea846d5
580
+ - spec/dummy/tmp/cache/assets/D55/920/sprockets%2F0a02242aa4c4febcc796419aba103c69
581
+ - spec/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6
582
+ - spec/dummy/tmp/cache/assets/D5F/6F0/sprockets%2F155e7bc44f326371cce0ca8bc5b2414e
583
+ - spec/dummy/tmp/cache/assets/D6B/250/sprockets%2Fe4eecce7a3371b11038c92f07cb28e67
584
+ - spec/dummy/tmp/cache/assets/D6B/E70/sprockets%2F103a456ae3692e3cca20b7696fdee8f0
585
+ - spec/dummy/tmp/cache/assets/D7F/AD0/sprockets%2Fb1c02d12303b1fe2f981771cbb0c4cbd
586
+ - spec/dummy/tmp/cache/assets/D81/D00/sprockets%2F0c68b6d9dce98681a2a710d9fc3f7e39
587
+ - spec/dummy/tmp/cache/assets/D94/4D0/sprockets%2F4608a5bdf27ddf11bcaed1375911e9a2
588
+ - spec/dummy/tmp/cache/assets/D9A/580/sprockets%2F433005b19aaf7ed5cba9c7f8cd30b775
589
+ - spec/dummy/tmp/cache/assets/DA4/270/sprockets%2F860ab3bd30204e02c0a5d82bd4bbabe1
590
+ - spec/dummy/tmp/cache/assets/DA4/480/sprockets%2F53e39285bb57a2ddb6ff856b2eb491da
591
+ - spec/dummy/tmp/cache/assets/DA6/3C0/sprockets%2F587c7e35f47442eadaa530acc5e9f5e6
592
+ - spec/dummy/tmp/cache/assets/DAB/DA0/sprockets%2Fb8fb5e8518ed3d38a7f6a8f18a9208aa
593
+ - spec/dummy/tmp/cache/assets/DB2/700/sprockets%2Ffa85cb79b94fce1b8344d983ea863d2e
594
+ - spec/dummy/tmp/cache/assets/DCC/4F0/sprockets%2Fbc0f3c61e16afb5a285ba8b39846ed8b
595
+ - spec/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994
596
+ - spec/dummy/tmp/cache/assets/DDC/BE0/sprockets%2F2c0a4d4675a61b014aedbbabb3f071fc
597
+ - spec/dummy/tmp/cache/assets/E04/640/sprockets%2F3c5ddf2bbefd9d70f1b506b519cf856e
598
+ - spec/dummy/tmp/cache/assets/E04/7F0/sprockets%2F35f1b2ff729a5ec21f6dc5f7d6faa67b
599
+ - spec/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af
600
+ - spec/dummy/tmp/cache/assets/E07/230/sprockets%2Febd4f2dd708879d593aff008ccb75acc
601
+ - spec/dummy/tmp/cache/assets/E17/9D0/sprockets%2F8db2b79f6c4eabe7a9ebe7a7898ec066
602
+ - spec/dummy/tmp/cache/assets/E31/F10/sprockets%2Fcebacf56667da1cc2961b59fd922eafb
603
+ - spec/factories/agent.rb
604
+ - spec/factories/calls.rb
605
+ - spec/factories/conversations.rb
606
+ - spec/factories/events.rb
607
+ - spec/factories/playable_listeners.rb
608
+ - spec/factories/recordings.rb
609
+ - spec/factories/voicemails.rb
610
+ - spec/fixtures/vcr_cassettes/Authenticating_an_online_user.yml
611
+ - spec/fixtures/vcr_cassettes/buying_number_for_an_area_code.yml
612
+ - spec/fixtures/vcr_cassettes/Creating_a_conversation/creates_a_new_call.yml
613
+ - spec/fixtures/vcr_cassettes/Creating_a_conversation/creates_a_new_conversation.yml
614
+ - spec/fixtures/vcr_cassettes/Creating_a_conversation/returns_the_conversation_as_JSON.yml
615
+ - spec/fixtures/vcr_cassettes/Pusher_channel_as_JSON.yml
616
+ - spec/fixtures/vcr_cassettes/Pusher_to_publish_the_event.yml
617
+ - spec/fixtures/vcr_cassettes/Reloading_the_widget_during_a_call/_create/during_a_call/after_a_failed_transfer/pushes_the_event_for_the_active_call.yml
618
+ - spec/fixtures/vcr_cassettes/returns_success.yml
619
+ - spec/fixtures/vcr_cassettes/Telephony_ConversationsController/_create/by_default/creates_a_new_call.yml
620
+ - spec/fixtures/vcr_cassettes/Telephony_ConversationsController/_create/by_default/creates_a_new_conversation.yml
621
+ - spec/fixtures/vcr_cassettes/Telephony_ConversationsController/_create/by_default/returns_the_conversation_as_JSON.yml
622
+ - spec/fixtures/vcr_cassettes/Telephony_Providers_TwilioProvider/_call/allows_the_phone_to_ring_for_60_seconds.yml
623
+ - spec/fixtures/vcr_cassettes/Telephony_Providers_TwilioProvider/_call/includes_a_status_change_callback_url.yml
624
+ - spec/fixtures/vcr_cassettes/Telephony_Providers_TwilioProvider/_call/places_a_call.yml
625
+ - spec/fixtures/vcr_cassettes/Telephony_Providers_TwilioProvider/_dial_into_conference/allows_the_phone_to_ring_for_15_seconds.yml
626
+ - spec/fixtures/vcr_cassettes/Telephony_Providers_TwilioProvider/_dial_into_conference/places_a_call_to_redirect_the_participant_to_a_conference.yml
627
+ - spec/fixtures/vcr_cassettes/Telephony_Providers_TwilioProvider/_hangup/by_default/hangs_up_the_call.yml
628
+ - spec/javascripts/helpers/jasmine-jquery.js
629
+ - spec/javascripts/helpers/mock-ajax.js
630
+ - spec/javascripts/support/jasmine.yml
631
+ - spec/javascripts/telephony/models/agent_spec.js
632
+ - spec/javascripts/telephony/models/conversation_spec.js
633
+ - spec/javascripts/telephony/models/device_spec.js
634
+ - spec/javascripts/telephony/models/transfer_spec.js
635
+ - spec/javascripts/telephony/push_spec.js
636
+ - spec/javascripts/telephony/views/agents_view_spec.js
637
+ - spec/javascripts/telephony/views/application_view_spec.js
638
+ - spec/javascripts/telephony/views/conversation_view_spec.js
639
+ - spec/javascripts/telephony/views/status_view_spec.js
640
+ - spec/javascripts/telephony/views/transfer_view_spec.js
641
+ - spec/javascripts/telephony/views/twilio_client_view_spec.js
642
+ - spec/javascripts/telephony/views/widget_view_spec.js
643
+ - spec/lib/telephony/concerns/controllers/twilio_request_verifier_spec.rb
644
+ - spec/lib/telephony/conversation_data_spec.rb
645
+ - spec/lib/telephony/helper_spec.rb
646
+ - spec/lib/telephony/jobs/agent_offline_spec.rb
647
+ - spec/lib/telephony/jobs/pusher_event_spec.rb
648
+ - spec/lib/telephony/providers/twilio_provider_spec.rb
649
+ - spec/lib/telephony_spec.rb
650
+ - spec/models/telephony/agent_spec.rb
651
+ - spec/models/telephony/agent_state_machine_spec.rb
652
+ - spec/models/telephony/call_center_spec.rb
653
+ - spec/models/telephony/call_spec.rb
654
+ - spec/models/telephony/call_state_machine_spec.rb
655
+ - spec/models/telephony/conversation_spec.rb
656
+ - spec/models/telephony/conversation_state_machine_spec.rb
657
+ - spec/models/telephony/conversations_presenter_spec.rb
658
+ - spec/models/telephony/event_spec.rb
659
+ - spec/models/telephony/inbound_conversation_queue_spec.rb
660
+ - spec/models/telephony/playable_listener_spec.rb
661
+ - spec/models/telephony/pusher_event_publisher_spec.rb
662
+ - spec/models/telephony/recording_spec.rb
663
+ - spec/models/telephony/voicemail_spec.rb
664
+ - spec/observers/telephony/agent_observer_spec.rb
665
+ - spec/observers/telephony/event_observer_spec.rb
666
+ - spec/requests/create_conversation_spec.rb
667
+ - spec/requests/dequeue_call_spec.rb
668
+ - spec/requests/list_conversations_spec.rb
669
+ - spec/requests/presences_spec.rb
670
+ - spec/requests/providers/twilio/calls/child_answered_spec.rb
671
+ - spec/requests/providers/twilio/calls/child_detached_spec.rb
672
+ - spec/requests/providers/twilio/calls/dial_spec.rb
673
+ - spec/requests/providers/twilio/calls/done_spec.rb
674
+ - spec/requests/providers/twilio/calls/join_conference_spec.rb
675
+ - spec/requests/providers/twilio/calls/leave_queue_spec.rb
676
+ - spec/requests/providers/twilio/calls/parent_answered_spec.rb
677
+ - spec/requests/providers/twilio/inbound/connect_dequeued_call_spec.rb
678
+ - spec/requests/providers/twilio/inbound/enqueue_inbound_call_spec.rb
679
+ - spec/requests/providers/twilio/inbound/enqueued_call_wait_music_spec.rb
680
+ - spec/requests/providers/twilio/voicemails/leave_voicemail_spec.rb
681
+ - spec/requests/search_conversations_spec.rb
682
+ - spec/requests/transfer_spec.rb
683
+ - spec/requests/voicemail_api_spec.rb
684
+ - spec/spec_helper.rb
685
+ - spec/support/factory_girl.rb
686
+ - spec/support/matchers/be_complete_hold.rb
687
+ - spec/support/matchers/be_whisper_tone.rb
688
+ - spec/support/matchers/join_conference.rb
689
+ - spec/support/nokogiri.rb
690
+ - spec/support/pusher_helper.rb
691
+ - spec/support/vcr.rb
692
+ - spec/support/webmock.rb