adhearsion 2.6.4 → 3.0.0.beta1

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 (242) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +6 -9
  3. data/CHANGELOG.md +22 -7
  4. data/Gemfile +2 -0
  5. data/README.markdown +4 -5
  6. data/Rakefile +1 -2
  7. data/adhearsion.gemspec +19 -8
  8. data/features/cli_create.feature +19 -3
  9. data/features/step_definitions/cli_steps.rb +0 -11
  10. data/features/support/env.rb +3 -4
  11. data/lib/adhearsion.rb +48 -27
  12. data/lib/adhearsion/call.rb +34 -50
  13. data/lib/adhearsion/call_controller.rb +6 -12
  14. data/lib/adhearsion/call_controller/dial.rb +15 -53
  15. data/lib/adhearsion/call_controller/input.rb +39 -162
  16. data/lib/adhearsion/call_controller/input/ask_grammar_builder.rb +44 -0
  17. data/lib/adhearsion/call_controller/input/menu_builder.rb +136 -0
  18. data/lib/adhearsion/call_controller/input/prompt_builder.rb +78 -0
  19. data/lib/adhearsion/call_controller/input/result.rb +46 -0
  20. data/lib/adhearsion/call_controller/output.rb +48 -67
  21. data/lib/adhearsion/call_controller/output/abstract_player.rb +3 -3
  22. data/lib/adhearsion/call_controller/output/async_player.rb +3 -3
  23. data/lib/adhearsion/call_controller/output/player.rb +1 -1
  24. data/lib/adhearsion/call_controller/record.rb +23 -8
  25. data/lib/adhearsion/calls.rb +1 -1
  26. data/lib/adhearsion/cli_commands/ahn_command.rb +2 -65
  27. data/lib/adhearsion/cli_commands/thor_errors.rb +0 -6
  28. data/lib/adhearsion/configuration.rb +91 -39
  29. data/lib/adhearsion/core_ext/blather/stanza.rb +41 -0
  30. data/lib/adhearsion/core_ext/blather/stanza/presence.rb +13 -0
  31. data/lib/adhearsion/error.rb +5 -0
  32. data/lib/adhearsion/event.rb +21 -0
  33. data/lib/adhearsion/event/active_speaker.rb +11 -0
  34. data/lib/adhearsion/event/answered.rb +11 -0
  35. data/lib/adhearsion/event/asterisk.rb +10 -0
  36. data/lib/adhearsion/event/asterisk/ami.rb +34 -0
  37. data/lib/adhearsion/event/complete.rb +75 -0
  38. data/lib/adhearsion/event/dtmf.rb +11 -0
  39. data/lib/adhearsion/event/end.rb +22 -0
  40. data/lib/adhearsion/event/input_timers_started.rb +9 -0
  41. data/lib/adhearsion/event/joined.rb +17 -0
  42. data/lib/adhearsion/event/offer.rb +14 -0
  43. data/lib/adhearsion/event/ringing.rb +11 -0
  44. data/lib/adhearsion/event/started_speaking.rb +13 -0
  45. data/lib/adhearsion/event/stopped_speaking.rb +13 -0
  46. data/lib/adhearsion/event/unjoined.rb +17 -0
  47. data/lib/adhearsion/events.rb +47 -66
  48. data/lib/adhearsion/foundation.rb +0 -1
  49. data/lib/adhearsion/foundation/object.rb +0 -5
  50. data/lib/adhearsion/generators/app/app_generator.rb +4 -1
  51. data/lib/adhearsion/generators/app/templates/Gemfile.erb +2 -10
  52. data/lib/adhearsion/generators/app/templates/adhearsion.erb +9 -9
  53. data/lib/adhearsion/generators/app/templates/config.ru +7 -0
  54. data/lib/adhearsion/generators/app/templates/en.yml +4 -0
  55. data/lib/adhearsion/generators/app/templates/events.erb +2 -2
  56. data/lib/adhearsion/generators/app/templates/hello_world.wav +0 -0
  57. data/lib/adhearsion/generators/app/templates/simon_game.rb +2 -1
  58. data/lib/adhearsion/generators/app/templates/simon_game_spec.rb +2 -2
  59. data/lib/adhearsion/has_headers.rb +34 -0
  60. data/lib/adhearsion/http_server.rb +37 -0
  61. data/lib/adhearsion/initializer.rb +19 -153
  62. data/lib/adhearsion/logging.rb +6 -25
  63. data/lib/adhearsion/outbound_call.rb +5 -5
  64. data/lib/adhearsion/plugin.rb +1 -0
  65. data/lib/adhearsion/protocol_error.rb +26 -0
  66. data/lib/adhearsion/rayo.rb +30 -0
  67. data/lib/adhearsion/rayo/client.rb +62 -0
  68. data/lib/adhearsion/rayo/client/component_registry.rb +33 -0
  69. data/lib/adhearsion/rayo/command.rb +21 -0
  70. data/lib/adhearsion/rayo/command/accept.rb +16 -0
  71. data/lib/adhearsion/rayo/command/answer.rb +16 -0
  72. data/lib/adhearsion/rayo/command/dial.rb +57 -0
  73. data/lib/adhearsion/rayo/command/hangup.rb +16 -0
  74. data/lib/adhearsion/rayo/command/join.rb +43 -0
  75. data/lib/adhearsion/rayo/command/mute.rb +13 -0
  76. data/lib/adhearsion/rayo/command/redirect.rb +23 -0
  77. data/lib/adhearsion/rayo/command/reject.rb +40 -0
  78. data/lib/adhearsion/rayo/command/unjoin.rb +24 -0
  79. data/lib/adhearsion/rayo/command/unmute.rb +13 -0
  80. data/lib/adhearsion/rayo/command_node.rb +47 -0
  81. data/lib/adhearsion/rayo/component.rb +21 -0
  82. data/lib/adhearsion/rayo/component/asterisk.rb +13 -0
  83. data/lib/adhearsion/rayo/component/asterisk/agi.rb +14 -0
  84. data/lib/adhearsion/rayo/component/asterisk/agi/command.rb +46 -0
  85. data/lib/adhearsion/rayo/component/asterisk/ami.rb +14 -0
  86. data/lib/adhearsion/rayo/component/asterisk/ami/action.rb +61 -0
  87. data/lib/adhearsion/rayo/component/component_node.rb +90 -0
  88. data/lib/adhearsion/rayo/component/input.rb +186 -0
  89. data/lib/adhearsion/rayo/component/output.rb +471 -0
  90. data/lib/adhearsion/rayo/component/prompt.rb +53 -0
  91. data/lib/adhearsion/rayo/component/receive_fax.rb +26 -0
  92. data/lib/adhearsion/rayo/component/record.rb +165 -0
  93. data/lib/adhearsion/rayo/component/send_fax.rb +64 -0
  94. data/lib/adhearsion/rayo/component/stop.rb +11 -0
  95. data/lib/adhearsion/rayo/connection.rb +12 -0
  96. data/lib/adhearsion/rayo/connection/asterisk.rb +74 -0
  97. data/lib/adhearsion/rayo/connection/connected.rb +22 -0
  98. data/lib/adhearsion/rayo/connection/generic_connection.rb +22 -0
  99. data/lib/adhearsion/rayo/connection/xmpp.rb +198 -0
  100. data/lib/adhearsion/rayo/disconnected_error.rb +22 -0
  101. data/lib/adhearsion/{punchblock_plugin → rayo}/initializer.rb +19 -19
  102. data/lib/adhearsion/rayo/rayo_node.rb +127 -0
  103. data/lib/adhearsion/rayo/ref.rb +57 -0
  104. data/lib/adhearsion/statistics.rb +1 -1
  105. data/lib/adhearsion/tasks.rb +1 -2
  106. data/lib/adhearsion/tasks/configuration.rb +1 -1
  107. data/lib/adhearsion/tasks/environment.rb +0 -2
  108. data/lib/adhearsion/tasks/i18n.rb +49 -0
  109. data/lib/adhearsion/translator.rb +11 -0
  110. data/lib/adhearsion/translator/asterisk.rb +234 -0
  111. data/lib/adhearsion/translator/asterisk/agi_app.rb +17 -0
  112. data/lib/adhearsion/translator/asterisk/agi_command.rb +45 -0
  113. data/lib/adhearsion/translator/asterisk/ami_error_converter.rb +20 -0
  114. data/lib/adhearsion/translator/asterisk/call.rb +416 -0
  115. data/lib/adhearsion/translator/asterisk/channel.rb +43 -0
  116. data/lib/adhearsion/translator/asterisk/component.rb +88 -0
  117. data/lib/adhearsion/translator/asterisk/component/asterisk.rb +15 -0
  118. data/lib/adhearsion/translator/asterisk/component/asterisk/agi_command.rb +42 -0
  119. data/lib/adhearsion/translator/asterisk/component/asterisk/ami_action.rb +68 -0
  120. data/lib/adhearsion/translator/asterisk/component/composed_prompt.rb +76 -0
  121. data/lib/adhearsion/translator/asterisk/component/dtmf_recognizer.rb +137 -0
  122. data/lib/adhearsion/translator/asterisk/component/input.rb +34 -0
  123. data/lib/adhearsion/translator/asterisk/component/input_component.rb +90 -0
  124. data/lib/adhearsion/translator/asterisk/component/mrcp_native_prompt.rb +71 -0
  125. data/lib/adhearsion/translator/asterisk/component/mrcp_prompt.rb +55 -0
  126. data/lib/adhearsion/translator/asterisk/component/mrcp_recog_prompt.rb +165 -0
  127. data/lib/adhearsion/translator/asterisk/component/output.rb +233 -0
  128. data/lib/adhearsion/translator/asterisk/component/record.rb +101 -0
  129. data/lib/adhearsion/translator/asterisk/component/stop_by_redirect.rb +30 -0
  130. data/lib/adhearsion/translator/asterisk/unimrcp_app.rb +28 -0
  131. data/lib/adhearsion/uri_list.rb +21 -0
  132. data/lib/adhearsion/version.rb +1 -1
  133. data/spec/adhearsion/call_controller/dial_spec.rb +79 -1420
  134. data/spec/adhearsion/call_controller/input_spec.rb +1141 -237
  135. data/spec/adhearsion/call_controller/output/async_player_spec.rb +10 -10
  136. data/spec/adhearsion/call_controller/output/player_spec.rb +8 -8
  137. data/spec/adhearsion/call_controller/output_spec.rb +162 -215
  138. data/spec/adhearsion/call_controller/record_spec.rb +15 -16
  139. data/spec/adhearsion/call_controller_spec.rb +23 -40
  140. data/spec/adhearsion/call_spec.rb +123 -129
  141. data/spec/adhearsion/calls_spec.rb +3 -3
  142. data/spec/adhearsion/configuration_spec.rb +94 -108
  143. data/spec/adhearsion/event/answered_spec.rb +50 -0
  144. data/spec/adhearsion/event/asterisk/Find Results +402 -0
  145. data/spec/adhearsion/event/asterisk/ami_spec.rb +81 -0
  146. data/spec/adhearsion/event/complete_spec.rb +176 -0
  147. data/spec/adhearsion/event/dtmf_spec.rb +35 -0
  148. data/spec/adhearsion/event/end_spec.rb +85 -0
  149. data/spec/adhearsion/event/input_timers_started_spec.rb +19 -0
  150. data/spec/adhearsion/event/joined_spec.rb +53 -0
  151. data/spec/adhearsion/event/offer_spec.rb +106 -0
  152. data/spec/adhearsion/event/ringing_spec.rb +50 -0
  153. data/spec/adhearsion/event/started_speaking_spec.rb +37 -0
  154. data/spec/adhearsion/event/stopped_speaking_spec.rb +37 -0
  155. data/spec/adhearsion/event/unjoined_spec.rb +48 -0
  156. data/spec/adhearsion/event/untitled +0 -0
  157. data/spec/adhearsion/events_spec.rb +19 -45
  158. data/spec/adhearsion/initializer_spec.rb +12 -184
  159. data/spec/adhearsion/logging_spec.rb +5 -20
  160. data/spec/adhearsion/outbound_call_spec.rb +13 -13
  161. data/spec/adhearsion/plugin_spec.rb +3 -4
  162. data/spec/adhearsion/protocol_error_spec.rb +91 -0
  163. data/spec/adhearsion/rayo/client/component_registry_spec.rb +26 -0
  164. data/spec/adhearsion/rayo/client_spec.rb +134 -0
  165. data/spec/adhearsion/rayo/command/accept_spec.rb +63 -0
  166. data/spec/adhearsion/rayo/command/answer_spec.rb +73 -0
  167. data/spec/adhearsion/rayo/command/dial_spec.rb +156 -0
  168. data/spec/adhearsion/rayo/command/hangup_spec.rb +63 -0
  169. data/spec/adhearsion/rayo/command/join_spec.rb +158 -0
  170. data/spec/adhearsion/rayo/command/mute_spec.rb +32 -0
  171. data/spec/adhearsion/rayo/command/redirect_spec.rb +89 -0
  172. data/spec/adhearsion/rayo/command/reject_spec.rb +117 -0
  173. data/spec/adhearsion/rayo/command/unjoin_spec.rb +82 -0
  174. data/spec/adhearsion/rayo/command/unmute_spec.rb +32 -0
  175. data/spec/adhearsion/rayo/command_node_spec.rb +101 -0
  176. data/spec/adhearsion/rayo/component/asterisk/agi/command_spec.rb +111 -0
  177. data/spec/adhearsion/rayo/component/asterisk/ami/action_spec.rb +173 -0
  178. data/spec/adhearsion/rayo/component/component_node_spec.rb +110 -0
  179. data/spec/adhearsion/rayo/component/input_spec.rb +715 -0
  180. data/spec/adhearsion/rayo/component/output_spec.rb +1030 -0
  181. data/spec/adhearsion/rayo/component/prompt_spec.rb +171 -0
  182. data/spec/adhearsion/rayo/component/receive_fax_spec.rb +136 -0
  183. data/spec/adhearsion/rayo/component/record_spec.rb +497 -0
  184. data/spec/adhearsion/rayo/component/send_fax_spec.rb +144 -0
  185. data/spec/adhearsion/rayo/connection/asterisk_spec.rb +118 -0
  186. data/spec/adhearsion/rayo/connection/xmpp_spec.rb +449 -0
  187. data/spec/adhearsion/rayo/initializer_spec.rb +353 -0
  188. data/spec/adhearsion/rayo/ref_spec.rb +168 -0
  189. data/spec/adhearsion/rayo_spec.rb +7 -0
  190. data/spec/adhearsion/router/route_spec.rb +1 -1
  191. data/spec/adhearsion/statistics_spec.rb +2 -5
  192. data/spec/adhearsion/translator/asterisk/call_spec.rb +2047 -0
  193. data/spec/adhearsion/translator/asterisk/component/asterisk/agi_command_spec.rb +256 -0
  194. data/spec/adhearsion/translator/asterisk/component/asterisk/ami_action_spec.rb +151 -0
  195. data/spec/adhearsion/translator/asterisk/component/composed_prompt_spec.rb +257 -0
  196. data/spec/adhearsion/translator/asterisk/component/input_spec.rb +571 -0
  197. data/spec/adhearsion/translator/asterisk/component/mrcp_native_prompt_spec.rb +774 -0
  198. data/spec/adhearsion/translator/asterisk/component/mrcp_prompt_spec.rb +1244 -0
  199. data/spec/adhearsion/translator/asterisk/component/output_spec.rb +1850 -0
  200. data/spec/adhearsion/translator/asterisk/component/record_spec.rb +426 -0
  201. data/spec/adhearsion/translator/asterisk/component/stop_by_redirect_spec.rb +62 -0
  202. data/spec/adhearsion/translator/asterisk/component_spec.rb +83 -0
  203. data/spec/adhearsion/translator/asterisk_spec.rb +685 -0
  204. data/spec/adhearsion/uri_list_spec.rb +88 -0
  205. data/spec/adhearsion_spec.rb +89 -14
  206. data/spec/fixtures/locale/en.yml +13 -0
  207. data/spec/fixtures/locale/it.yml +13 -0
  208. data/spec/spec_helper.rb +18 -5
  209. data/spec/support/call_controller_test_helpers.rb +3 -2
  210. data/spec/support/initializer_stubs.rb +3 -1
  211. data/spec/support/punchblock_examples.rb +65 -0
  212. data/spec/support/punchblock_mocks.rb +12 -0
  213. metadata +412 -70
  214. data/features/cli_daemon.feature +0 -20
  215. data/features/cli_restart.feature +0 -52
  216. data/features/cli_stop.feature +0 -50
  217. data/lib/adhearsion/call_controller/menu_dsl.rb +0 -21
  218. data/lib/adhearsion/call_controller/menu_dsl/array_match_calculator.rb +0 -26
  219. data/lib/adhearsion/call_controller/menu_dsl/calculated_match.rb +0 -43
  220. data/lib/adhearsion/call_controller/menu_dsl/calculated_match_collection.rb +0 -45
  221. data/lib/adhearsion/call_controller/menu_dsl/fixnum_match_calculator.rb +0 -11
  222. data/lib/adhearsion/call_controller/menu_dsl/match_calculator.rb +0 -40
  223. data/lib/adhearsion/call_controller/menu_dsl/menu.rb +0 -207
  224. data/lib/adhearsion/call_controller/menu_dsl/menu_builder.rb +0 -92
  225. data/lib/adhearsion/call_controller/menu_dsl/range_match_calculator.rb +0 -60
  226. data/lib/adhearsion/call_controller/menu_dsl/string_match_calculator.rb +0 -25
  227. data/lib/adhearsion/call_controller/utility.rb +0 -77
  228. data/lib/adhearsion/foundation/custom_daemonizer.rb +0 -52
  229. data/lib/adhearsion/punchblock_plugin.rb +0 -63
  230. data/scripts/cloc-1.64.pl +0 -10483
  231. data/spec/adhearsion/call_controller/menu_dsl/array_match_calculator_spec.rb +0 -76
  232. data/spec/adhearsion/call_controller/menu_dsl/calculated_match_collection_spec.rb +0 -60
  233. data/spec/adhearsion/call_controller/menu_dsl/calculated_match_spec.rb +0 -61
  234. data/spec/adhearsion/call_controller/menu_dsl/fixnum_match_calculator_spec.rb +0 -39
  235. data/spec/adhearsion/call_controller/menu_dsl/match_calculator_spec.rb +0 -17
  236. data/spec/adhearsion/call_controller/menu_dsl/menu_builder_spec.rb +0 -165
  237. data/spec/adhearsion/call_controller/menu_dsl/menu_spec.rb +0 -420
  238. data/spec/adhearsion/call_controller/menu_dsl/range_match_calculator_spec.rb +0 -32
  239. data/spec/adhearsion/call_controller/menu_dsl/string_match_calculator_spec.rb +0 -40
  240. data/spec/adhearsion/call_controller/utility_spec.rb +0 -90
  241. data/spec/adhearsion/punchblock_plugin/initializer_spec.rb +0 -356
  242. data/spec/adhearsion/punchblock_plugin_spec.rb +0 -59
@@ -1,20 +0,0 @@
1
- Feature: Adhearsion Ahn CLI (daemon)
2
- As an Adhearsion user
3
- I want the ahn command to provide a 'daemon' command
4
- So that I can start my adhearsion app as a daemon
5
-
6
- @reconnect @skip_jruby
7
- Scenario: Command daemon with path works correctly
8
- Given that I create a valid app under "path/somewhere"
9
- When I run `ahn daemon path/somewhere`
10
- And I cd to "path/somewhere"
11
- And I terminate the process using the pid file "adhearsion.pid"
12
- Then the exit status should be 0
13
-
14
- @reconnect @skip_jruby
15
- Scenario: Command daemon with pid option
16
- Given that I create a valid app under "path/somewhere"
17
- When I run `ahn daemon path/somewhere --pid-file=ahn.pid`
18
- And I cd to "path/somewhere"
19
- And I terminate the process using the pid file "ahn.pid"
20
- Then the exit status should be 0
@@ -1,52 +0,0 @@
1
- Feature: Adhearsion Ahn CLI (restart)
2
- As an Adhearsion user
3
- I want the ahn command to provide a 'restart' command
4
- So that I can restart a running Adhearsion daemon
5
-
6
- @reconnect @skip_jruby
7
- Scenario: Command restart with a missing or wrong pid
8
- Given that I create a valid app under "path/somewhere"
9
- When I run `ahn daemon path/somewhere --pid-file=ahn.pid`
10
- And I run `ahn restart path/somewhere --pid-file=ahn2.pid`
11
- Then the output should contain:
12
- """
13
- Could not read pid from the file
14
- """
15
- And the output should contain:
16
- """
17
- Starting Adhearsion
18
- """
19
-
20
- @reconnect
21
- Scenario: Command restart with no path outside of the app directory
22
- Given that I create a valid app under "path/somewhere"
23
- When I run `ahn daemon path/somewhere --pid-file=ahn.pid`
24
- And I run `ahn restart --pid-file=ahn.pid`
25
- Then the output should contain:
26
- """
27
- A valid path is required for restart, unless run from an Adhearson app directory
28
- """
29
- And the exit status should be 1
30
-
31
- @reconnect @skip_jruby
32
- Scenario: Command restart with no path inside of the app directory
33
- Given that I create a valid app under "path/somewhere"
34
- When I cd to "path/somewhere"
35
- And I run `ahn daemon --pid-file=ahn.pid`
36
- And I run `ahn restart --pid-file=ahn.pid`
37
- Then the output should contain:
38
- """
39
- Starting Adhearsion
40
- """
41
- And the exit status should be 0
42
-
43
- @reconnect @skip_jruby
44
- Scenario: Command restart on a stopped application
45
- Given that I create a valid app under "path/somewhere"
46
- When I cd to "path/somewhere"
47
- And I run `ahn restart --pid-file=ahn.pid`
48
- Then the output should contain:
49
- """
50
- Starting Adhearsion
51
- """
52
- And the exit status should be 0
@@ -1,50 +0,0 @@
1
- Feature: Adhearsion Ahn CLI (stop)
2
- As an Adhearsion user
3
- I want the ahn command to provide a 'stop' command
4
- So that I can stop a running Adhearsion daemon
5
-
6
- @reconnect @skip_jruby
7
- Scenario: Command stop with valid path and pid option
8
- Given that I create a valid app under "path/somewhere"
9
- When I run `ahn daemon path/somewhere --pid-file=ahn.pid`
10
- And I run `ahn stop path/somewhere --pid-file=ahn.pid`
11
- Then the output should contain:
12
- """
13
- Stopping Adhearsion
14
- """
15
- And the file "ahn.pid" should not exist
16
-
17
- @reconnect @skip_jruby
18
- Scenario: Command stop with valid path and no pid option
19
- Given that I create a valid app under "path/somewhere"
20
- When I run `ahn daemon path/somewhere`
21
- And I run `ahn stop path/somewhere`
22
- Then the output should contain:
23
- """
24
- Stopping Adhearsion
25
- """
26
- And the file "path/somewhere/adhearsion.pid" should not exist
27
-
28
- @reconnect @skip_jruby
29
- Scenario: Command stop with no options inside the app directory
30
- Given that I create a valid app under "path/somewhere"
31
- And I cd to "path/somewhere"
32
- When I run `ahn daemon`
33
- And I run `ahn stop`
34
- Then the output should contain:
35
- """
36
- Stopping Adhearsion
37
- """
38
- And the file "adhearsion.pid" should not exist
39
-
40
- @reconnect @skip_jruby
41
- Scenario: Command stop with pid option inside the app directory
42
- Given that I create a valid app under "path/somewhere"
43
- And I cd to "path/somewhere"
44
- When I run `ahn daemon --pid-file=ahn.pid`
45
- And I run `ahn stop --pid-file=ahn.pid`
46
- Then the output should contain:
47
- """
48
- Stopping Adhearsion
49
- """
50
- And the file "ahn.pid" should not exist
@@ -1,21 +0,0 @@
1
- # encoding: utf-8
2
-
3
- %w(
4
- calculated_match
5
- calculated_match_collection
6
- match_calculator
7
- fixnum_match_calculator
8
- range_match_calculator
9
- string_match_calculator
10
- array_match_calculator
11
- menu_builder
12
- menu
13
- ).each { |r| require "adhearsion/call_controller/menu_dsl/#{r}" }
14
-
15
- module Adhearsion
16
- class CallController
17
- # @private
18
- module MenuDSL
19
- end
20
- end
21
- end
@@ -1,26 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Adhearsion
4
- class CallController
5
- module MenuDSL
6
- class ArrayMatchCalculator < MatchCalculator
7
- def match(query)
8
- args = { :query => query, :exact_matches => [], :potential_matches => [] }
9
-
10
- pattern.compact.each do |pat|
11
- pattern_string = pat.to_s
12
- query_string = query.to_s
13
-
14
- if pattern_string == query_string
15
- args[:exact_matches] << pat
16
- elsif pattern_string.start_with? query_string
17
- args[:potential_matches] << pat
18
- end
19
- end
20
-
21
- new_calculated_match args
22
- end
23
- end
24
- end
25
- end
26
- end
@@ -1,43 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Adhearsion
4
- class CallController
5
- module MenuDSL
6
- class CalculatedMatch
7
-
8
- def self.failed_match!(pattern, query, match_payload)
9
- new :pattern => pattern, :query => query, :match_payload => match_payload
10
- end
11
-
12
- attr_reader :match_payload, :potential_matches, :exact_matches, :pattern, :query, :block
13
-
14
- def initialize(options = {})
15
- @pattern, @query, @match_payload, @block = options.values_at :pattern, :query, :match_payload, :block
16
- @potential_matches = options[:potential_matches] ? Array(options[:potential_matches]) : []
17
- @exact_matches = options[:exact_matches] ? Array(options[:exact_matches]) : []
18
- end
19
-
20
- def exact_match?
21
- exact_matches.any?
22
- end
23
-
24
- def potential_match?
25
- potential_matches.any?
26
- end
27
-
28
- def failed_match?
29
- !(potential_match? || exact_match?)
30
- end
31
-
32
- def type_of_match
33
- if exact_match?
34
- :exact
35
- elsif potential_match?
36
- :potential
37
- end
38
- end
39
-
40
- end
41
- end
42
- end
43
- end
@@ -1,45 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Adhearsion
4
- class CallController
5
- module MenuDSL
6
- class CalculatedMatchCollection
7
- attr_reader :calculated_matches, :potential_matches, :exact_matches,
8
- :actual_potential_matches, :actual_exact_matches
9
-
10
- def initialize
11
- @calculated_matches = []
12
- @potential_matches = []
13
- @exact_matches = []
14
- @actual_potential_matches = []
15
- @actual_exact_matches = []
16
- end
17
-
18
- def <<(calculated_match)
19
- calculated_matches << calculated_match
20
- actual_potential_matches.concat calculated_match.potential_matches
21
- actual_exact_matches.concat calculated_match.exact_matches
22
-
23
- potential_matches << calculated_match if calculated_match.potential_match?
24
- exact_matches << calculated_match if calculated_match.exact_match?
25
- end
26
-
27
- def potential_match_count
28
- actual_potential_matches.size
29
- end
30
-
31
- def exact_match_count
32
- actual_exact_matches.size
33
- end
34
-
35
- def potential_match?
36
- potential_match_count > 0
37
- end
38
-
39
- def exact_match?
40
- exact_match_count > 0
41
- end
42
- end
43
- end
44
- end
45
- end
@@ -1,11 +0,0 @@
1
- # encoding: utf-8
2
- require 'adhearsion/call_controller/menu_dsl/string_match_calculator'
3
-
4
- module Adhearsion
5
- class CallController
6
- module MenuDSL
7
- class FixnumMatchCalculator < StringMatchCalculator
8
- end
9
- end
10
- end
11
- end
@@ -1,40 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Adhearsion
4
- class CallController
5
- module MenuDSL
6
- class MatchCalculator
7
-
8
- class << self
9
-
10
- def build_with_pattern(pattern, match_payload, &block)
11
- class_for_pattern(pattern).new pattern, match_payload, &block
12
- end
13
-
14
- private
15
-
16
- def class_for_pattern(pattern)
17
- MenuDSL.const_get "#{pattern.class.name.camelize}MatchCalculator"
18
- end
19
- end
20
-
21
- attr_reader :pattern, :match_payload, :block
22
-
23
- def initialize(pattern, match_payload, &block)
24
- @pattern, @match_payload, @block = pattern, match_payload, block
25
- end
26
-
27
- protected
28
-
29
- def new_calculated_match(options)
30
- CalculatedMatch.new({:pattern => pattern, :match_payload => match_payload, :block => block}.merge(options))
31
- end
32
-
33
- def coerce_to_numeric(victim)
34
- victim.kind_of?(Numeric) ? victim : (victim.to_s =~ /^\d+$/ ? victim.to_s.to_i : nil )
35
- end
36
-
37
- end # class MatchCalculator
38
- end
39
- end
40
- end
@@ -1,207 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Adhearsion
4
- class CallController
5
- module MenuDSL
6
-
7
- class Menu
8
-
9
- DEFAULT_MAX_NUMBER_OF_TRIES = 1
10
- DEFAULT_TIMEOUT = 5
11
-
12
- InvalidStructureError = Class.new Adhearsion::Error
13
-
14
- attr_reader :builder, :timeout, :tries_count, :max_number_of_tries, :terminator, :limit, :interruptible, :status, :renderer
15
-
16
- def initialize(options = {}, &block)
17
- @tries_count = 0 # Counts the number of tries the menu's been executed
18
- @timeout = options[:timeout] || DEFAULT_TIMEOUT
19
- @max_number_of_tries = options[:tries] || DEFAULT_MAX_NUMBER_OF_TRIES
20
- @terminator = options[:terminator].to_s
21
- @limit = options[:limit]
22
- @interruptible = options.has_key?(:interruptible) ? options[:interruptible] : true
23
- @builder = MenuDSL::MenuBuilder.new
24
- @terminated = false
25
- @renderer = options[:renderer]
26
-
27
- @builder.build(&block) if block
28
-
29
- initialize_digit_buffer
30
- end
31
-
32
- def validate(mode = nil)
33
- case mode
34
- when :basic
35
- @terminator.present? || !!@limit || raise(InvalidStructureError, "You must specify at least one of limit or terminator")
36
- else
37
- @builder.has_matchers? || raise(InvalidStructureError, "You must specify one or more matchers")
38
- end
39
- end
40
-
41
- def <<(other)
42
- if other == terminator
43
- @terminated = true
44
- else
45
- digit_buffer << other
46
- end
47
- end
48
-
49
- def digit_buffer
50
- @digit_buffer
51
- end
52
-
53
- def digit_buffer_string
54
- digit_buffer.to_s
55
- end
56
- alias :result :digit_buffer_string
57
-
58
- def digit_buffer_empty?
59
- digit_buffer.empty?
60
- end
61
-
62
- def continue
63
- return get_another_digit_or_timeout! if digit_buffer_empty?
64
-
65
- return menu_terminated! if @terminated
66
- return menu_validator_terminated! if execute_validator_hook
67
- return menu_limit_reached! if limit && digit_buffer.size >= limit
68
-
69
- calculated_matches = builder.calculate_matches_for digit_buffer_string
70
-
71
- if calculated_matches.exact_match_count >= 1
72
- first_exact_match = calculated_matches.exact_matches.first
73
- if calculated_matches.potential_match_count.zero?
74
- menu_result_found! first_exact_match, digit_buffer_string
75
- else
76
- get_another_digit_or_finish! first_exact_match.match_payload, first_exact_match.query
77
- end
78
- elsif calculated_matches.potential_match_count >= 1 || !@builder.has_matchers?
79
- get_another_digit_or_timeout!
80
- else
81
- invalid!
82
- end
83
- end
84
-
85
- def should_continue?
86
- tries_count < max_number_of_tries
87
- end
88
-
89
- def restart!
90
- @tries_count += 1
91
- digit_buffer.clear!
92
- end
93
-
94
- def timeout!
95
- @status = :timeout
96
- end
97
-
98
- def execute_invalid_hook
99
- builder.execute_hook_for :invalid, digit_buffer_string
100
- end
101
-
102
- def execute_timeout_hook
103
- builder.execute_hook_for :timeout, digit_buffer_string
104
- end
105
-
106
- def execute_failure_hook
107
- builder.execute_hook_for :failure, digit_buffer_string
108
- end
109
-
110
- def execute_validator_hook
111
- builder.execute_hook_for :validator, digit_buffer_string
112
- end
113
-
114
- protected
115
-
116
- # If you're using a more complex class in subclasses, you may want to override this method in addition to the
117
- # digit buffer, digit_buffer_empty, and digit_buffer_string methods
118
- def initialize_digit_buffer
119
- @digit_buffer = ClearableStringBuffer.new
120
- end
121
-
122
- def invalid!
123
- @status = :invalid
124
- MenuResultInvalid.new
125
- end
126
-
127
- def menu_result_found!(match_object, new_extension)
128
- @status = :matched
129
- MenuResultFound.new(match_object, new_extension)
130
- end
131
-
132
- def menu_terminated!
133
- @status = :terminated
134
- MenuTerminated.new
135
- end
136
-
137
- def menu_validator_terminated!
138
- @status = :validator_terminated
139
- MenuValidatorTerminated.new
140
- end
141
-
142
- def menu_limit_reached!
143
- @status = :limited
144
- MenuLimitReached.new
145
- end
146
-
147
- def get_another_digit_or_finish!(match_payload, new_extension)
148
- @status = :multi_matched
149
- MenuGetAnotherDigitOrFinish.new(match_payload, new_extension)
150
- end
151
-
152
- def get_another_digit_or_timeout!
153
- @status = :potential
154
- MenuGetAnotherDigitOrTimeout.new
155
- end
156
-
157
- # The superclass from which all message-like exceptions descend. It should never
158
- # be instantiated directly.
159
- MenuResult = Class.new
160
- MenuResultDone = Class.new MenuResult
161
-
162
- class MenuResultFound < MenuResult
163
-
164
- attr_reader :match_object, :new_extension
165
-
166
- def initialize(match_object, new_extension)
167
- super()
168
- @match_object = match_object
169
- @new_extension = new_extension
170
- end
171
-
172
- end #class MenuResultFound < MenuResult
173
-
174
- MenuGetAnotherDigit = Module.new
175
-
176
- class MenuGetAnotherDigitOrFinish < MenuResultFound
177
- include MenuGetAnotherDigit
178
- end
179
-
180
- class MenuGetAnotherDigitOrTimeout < MenuResult
181
- include MenuGetAnotherDigit
182
- end
183
-
184
- MenuResultInvalid = Class.new MenuResult
185
-
186
- MenuTerminated = Class.new MenuResultDone
187
- MenuValidatorTerminated = Class.new MenuResultDone
188
- MenuLimitReached = Class.new MenuResultDone
189
-
190
- # For our default purpose, we need the digit_buffer to behave much like a normal String except that it should
191
- # handle its own resetting (clearing)
192
- class ClearableStringBuffer < String
193
- def clear!
194
- replace ""
195
- end
196
-
197
- def <<(other)
198
- super other.to_s
199
- end
200
- end
201
-
202
-
203
- end # class Menu
204
-
205
- end
206
- end
207
- end