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.
- checksums.yaml +4 -4
- data/.travis.yml +6 -9
- data/CHANGELOG.md +22 -7
- data/Gemfile +2 -0
- data/README.markdown +4 -5
- data/Rakefile +1 -2
- data/adhearsion.gemspec +19 -8
- data/features/cli_create.feature +19 -3
- data/features/step_definitions/cli_steps.rb +0 -11
- data/features/support/env.rb +3 -4
- data/lib/adhearsion.rb +48 -27
- data/lib/adhearsion/call.rb +34 -50
- data/lib/adhearsion/call_controller.rb +6 -12
- data/lib/adhearsion/call_controller/dial.rb +15 -53
- data/lib/adhearsion/call_controller/input.rb +39 -162
- data/lib/adhearsion/call_controller/input/ask_grammar_builder.rb +44 -0
- data/lib/adhearsion/call_controller/input/menu_builder.rb +136 -0
- data/lib/adhearsion/call_controller/input/prompt_builder.rb +78 -0
- data/lib/adhearsion/call_controller/input/result.rb +46 -0
- data/lib/adhearsion/call_controller/output.rb +48 -67
- data/lib/adhearsion/call_controller/output/abstract_player.rb +3 -3
- data/lib/adhearsion/call_controller/output/async_player.rb +3 -3
- data/lib/adhearsion/call_controller/output/player.rb +1 -1
- data/lib/adhearsion/call_controller/record.rb +23 -8
- data/lib/adhearsion/calls.rb +1 -1
- data/lib/adhearsion/cli_commands/ahn_command.rb +2 -65
- data/lib/adhearsion/cli_commands/thor_errors.rb +0 -6
- data/lib/adhearsion/configuration.rb +91 -39
- data/lib/adhearsion/core_ext/blather/stanza.rb +41 -0
- data/lib/adhearsion/core_ext/blather/stanza/presence.rb +13 -0
- data/lib/adhearsion/error.rb +5 -0
- data/lib/adhearsion/event.rb +21 -0
- data/lib/adhearsion/event/active_speaker.rb +11 -0
- data/lib/adhearsion/event/answered.rb +11 -0
- data/lib/adhearsion/event/asterisk.rb +10 -0
- data/lib/adhearsion/event/asterisk/ami.rb +34 -0
- data/lib/adhearsion/event/complete.rb +75 -0
- data/lib/adhearsion/event/dtmf.rb +11 -0
- data/lib/adhearsion/event/end.rb +22 -0
- data/lib/adhearsion/event/input_timers_started.rb +9 -0
- data/lib/adhearsion/event/joined.rb +17 -0
- data/lib/adhearsion/event/offer.rb +14 -0
- data/lib/adhearsion/event/ringing.rb +11 -0
- data/lib/adhearsion/event/started_speaking.rb +13 -0
- data/lib/adhearsion/event/stopped_speaking.rb +13 -0
- data/lib/adhearsion/event/unjoined.rb +17 -0
- data/lib/adhearsion/events.rb +47 -66
- data/lib/adhearsion/foundation.rb +0 -1
- data/lib/adhearsion/foundation/object.rb +0 -5
- data/lib/adhearsion/generators/app/app_generator.rb +4 -1
- data/lib/adhearsion/generators/app/templates/Gemfile.erb +2 -10
- data/lib/adhearsion/generators/app/templates/adhearsion.erb +9 -9
- data/lib/adhearsion/generators/app/templates/config.ru +7 -0
- data/lib/adhearsion/generators/app/templates/en.yml +4 -0
- data/lib/adhearsion/generators/app/templates/events.erb +2 -2
- data/lib/adhearsion/generators/app/templates/hello_world.wav +0 -0
- data/lib/adhearsion/generators/app/templates/simon_game.rb +2 -1
- data/lib/adhearsion/generators/app/templates/simon_game_spec.rb +2 -2
- data/lib/adhearsion/has_headers.rb +34 -0
- data/lib/adhearsion/http_server.rb +37 -0
- data/lib/adhearsion/initializer.rb +19 -153
- data/lib/adhearsion/logging.rb +6 -25
- data/lib/adhearsion/outbound_call.rb +5 -5
- data/lib/adhearsion/plugin.rb +1 -0
- data/lib/adhearsion/protocol_error.rb +26 -0
- data/lib/adhearsion/rayo.rb +30 -0
- data/lib/adhearsion/rayo/client.rb +62 -0
- data/lib/adhearsion/rayo/client/component_registry.rb +33 -0
- data/lib/adhearsion/rayo/command.rb +21 -0
- data/lib/adhearsion/rayo/command/accept.rb +16 -0
- data/lib/adhearsion/rayo/command/answer.rb +16 -0
- data/lib/adhearsion/rayo/command/dial.rb +57 -0
- data/lib/adhearsion/rayo/command/hangup.rb +16 -0
- data/lib/adhearsion/rayo/command/join.rb +43 -0
- data/lib/adhearsion/rayo/command/mute.rb +13 -0
- data/lib/adhearsion/rayo/command/redirect.rb +23 -0
- data/lib/adhearsion/rayo/command/reject.rb +40 -0
- data/lib/adhearsion/rayo/command/unjoin.rb +24 -0
- data/lib/adhearsion/rayo/command/unmute.rb +13 -0
- data/lib/adhearsion/rayo/command_node.rb +47 -0
- data/lib/adhearsion/rayo/component.rb +21 -0
- data/lib/adhearsion/rayo/component/asterisk.rb +13 -0
- data/lib/adhearsion/rayo/component/asterisk/agi.rb +14 -0
- data/lib/adhearsion/rayo/component/asterisk/agi/command.rb +46 -0
- data/lib/adhearsion/rayo/component/asterisk/ami.rb +14 -0
- data/lib/adhearsion/rayo/component/asterisk/ami/action.rb +61 -0
- data/lib/adhearsion/rayo/component/component_node.rb +90 -0
- data/lib/adhearsion/rayo/component/input.rb +186 -0
- data/lib/adhearsion/rayo/component/output.rb +471 -0
- data/lib/adhearsion/rayo/component/prompt.rb +53 -0
- data/lib/adhearsion/rayo/component/receive_fax.rb +26 -0
- data/lib/adhearsion/rayo/component/record.rb +165 -0
- data/lib/adhearsion/rayo/component/send_fax.rb +64 -0
- data/lib/adhearsion/rayo/component/stop.rb +11 -0
- data/lib/adhearsion/rayo/connection.rb +12 -0
- data/lib/adhearsion/rayo/connection/asterisk.rb +74 -0
- data/lib/adhearsion/rayo/connection/connected.rb +22 -0
- data/lib/adhearsion/rayo/connection/generic_connection.rb +22 -0
- data/lib/adhearsion/rayo/connection/xmpp.rb +198 -0
- data/lib/adhearsion/rayo/disconnected_error.rb +22 -0
- data/lib/adhearsion/{punchblock_plugin → rayo}/initializer.rb +19 -19
- data/lib/adhearsion/rayo/rayo_node.rb +127 -0
- data/lib/adhearsion/rayo/ref.rb +57 -0
- data/lib/adhearsion/statistics.rb +1 -1
- data/lib/adhearsion/tasks.rb +1 -2
- data/lib/adhearsion/tasks/configuration.rb +1 -1
- data/lib/adhearsion/tasks/environment.rb +0 -2
- data/lib/adhearsion/tasks/i18n.rb +49 -0
- data/lib/adhearsion/translator.rb +11 -0
- data/lib/adhearsion/translator/asterisk.rb +234 -0
- data/lib/adhearsion/translator/asterisk/agi_app.rb +17 -0
- data/lib/adhearsion/translator/asterisk/agi_command.rb +45 -0
- data/lib/adhearsion/translator/asterisk/ami_error_converter.rb +20 -0
- data/lib/adhearsion/translator/asterisk/call.rb +416 -0
- data/lib/adhearsion/translator/asterisk/channel.rb +43 -0
- data/lib/adhearsion/translator/asterisk/component.rb +88 -0
- data/lib/adhearsion/translator/asterisk/component/asterisk.rb +15 -0
- data/lib/adhearsion/translator/asterisk/component/asterisk/agi_command.rb +42 -0
- data/lib/adhearsion/translator/asterisk/component/asterisk/ami_action.rb +68 -0
- data/lib/adhearsion/translator/asterisk/component/composed_prompt.rb +76 -0
- data/lib/adhearsion/translator/asterisk/component/dtmf_recognizer.rb +137 -0
- data/lib/adhearsion/translator/asterisk/component/input.rb +34 -0
- data/lib/adhearsion/translator/asterisk/component/input_component.rb +90 -0
- data/lib/adhearsion/translator/asterisk/component/mrcp_native_prompt.rb +71 -0
- data/lib/adhearsion/translator/asterisk/component/mrcp_prompt.rb +55 -0
- data/lib/adhearsion/translator/asterisk/component/mrcp_recog_prompt.rb +165 -0
- data/lib/adhearsion/translator/asterisk/component/output.rb +233 -0
- data/lib/adhearsion/translator/asterisk/component/record.rb +101 -0
- data/lib/adhearsion/translator/asterisk/component/stop_by_redirect.rb +30 -0
- data/lib/adhearsion/translator/asterisk/unimrcp_app.rb +28 -0
- data/lib/adhearsion/uri_list.rb +21 -0
- data/lib/adhearsion/version.rb +1 -1
- data/spec/adhearsion/call_controller/dial_spec.rb +79 -1420
- data/spec/adhearsion/call_controller/input_spec.rb +1141 -237
- data/spec/adhearsion/call_controller/output/async_player_spec.rb +10 -10
- data/spec/adhearsion/call_controller/output/player_spec.rb +8 -8
- data/spec/adhearsion/call_controller/output_spec.rb +162 -215
- data/spec/adhearsion/call_controller/record_spec.rb +15 -16
- data/spec/adhearsion/call_controller_spec.rb +23 -40
- data/spec/adhearsion/call_spec.rb +123 -129
- data/spec/adhearsion/calls_spec.rb +3 -3
- data/spec/adhearsion/configuration_spec.rb +94 -108
- data/spec/adhearsion/event/answered_spec.rb +50 -0
- data/spec/adhearsion/event/asterisk/Find Results +402 -0
- data/spec/adhearsion/event/asterisk/ami_spec.rb +81 -0
- data/spec/adhearsion/event/complete_spec.rb +176 -0
- data/spec/adhearsion/event/dtmf_spec.rb +35 -0
- data/spec/adhearsion/event/end_spec.rb +85 -0
- data/spec/adhearsion/event/input_timers_started_spec.rb +19 -0
- data/spec/adhearsion/event/joined_spec.rb +53 -0
- data/spec/adhearsion/event/offer_spec.rb +106 -0
- data/spec/adhearsion/event/ringing_spec.rb +50 -0
- data/spec/adhearsion/event/started_speaking_spec.rb +37 -0
- data/spec/adhearsion/event/stopped_speaking_spec.rb +37 -0
- data/spec/adhearsion/event/unjoined_spec.rb +48 -0
- data/spec/adhearsion/event/untitled +0 -0
- data/spec/adhearsion/events_spec.rb +19 -45
- data/spec/adhearsion/initializer_spec.rb +12 -184
- data/spec/adhearsion/logging_spec.rb +5 -20
- data/spec/adhearsion/outbound_call_spec.rb +13 -13
- data/spec/adhearsion/plugin_spec.rb +3 -4
- data/spec/adhearsion/protocol_error_spec.rb +91 -0
- data/spec/adhearsion/rayo/client/component_registry_spec.rb +26 -0
- data/spec/adhearsion/rayo/client_spec.rb +134 -0
- data/spec/adhearsion/rayo/command/accept_spec.rb +63 -0
- data/spec/adhearsion/rayo/command/answer_spec.rb +73 -0
- data/spec/adhearsion/rayo/command/dial_spec.rb +156 -0
- data/spec/adhearsion/rayo/command/hangup_spec.rb +63 -0
- data/spec/adhearsion/rayo/command/join_spec.rb +158 -0
- data/spec/adhearsion/rayo/command/mute_spec.rb +32 -0
- data/spec/adhearsion/rayo/command/redirect_spec.rb +89 -0
- data/spec/adhearsion/rayo/command/reject_spec.rb +117 -0
- data/spec/adhearsion/rayo/command/unjoin_spec.rb +82 -0
- data/spec/adhearsion/rayo/command/unmute_spec.rb +32 -0
- data/spec/adhearsion/rayo/command_node_spec.rb +101 -0
- data/spec/adhearsion/rayo/component/asterisk/agi/command_spec.rb +111 -0
- data/spec/adhearsion/rayo/component/asterisk/ami/action_spec.rb +173 -0
- data/spec/adhearsion/rayo/component/component_node_spec.rb +110 -0
- data/spec/adhearsion/rayo/component/input_spec.rb +715 -0
- data/spec/adhearsion/rayo/component/output_spec.rb +1030 -0
- data/spec/adhearsion/rayo/component/prompt_spec.rb +171 -0
- data/spec/adhearsion/rayo/component/receive_fax_spec.rb +136 -0
- data/spec/adhearsion/rayo/component/record_spec.rb +497 -0
- data/spec/adhearsion/rayo/component/send_fax_spec.rb +144 -0
- data/spec/adhearsion/rayo/connection/asterisk_spec.rb +118 -0
- data/spec/adhearsion/rayo/connection/xmpp_spec.rb +449 -0
- data/spec/adhearsion/rayo/initializer_spec.rb +353 -0
- data/spec/adhearsion/rayo/ref_spec.rb +168 -0
- data/spec/adhearsion/rayo_spec.rb +7 -0
- data/spec/adhearsion/router/route_spec.rb +1 -1
- data/spec/adhearsion/statistics_spec.rb +2 -5
- data/spec/adhearsion/translator/asterisk/call_spec.rb +2047 -0
- data/spec/adhearsion/translator/asterisk/component/asterisk/agi_command_spec.rb +256 -0
- data/spec/adhearsion/translator/asterisk/component/asterisk/ami_action_spec.rb +151 -0
- data/spec/adhearsion/translator/asterisk/component/composed_prompt_spec.rb +257 -0
- data/spec/adhearsion/translator/asterisk/component/input_spec.rb +571 -0
- data/spec/adhearsion/translator/asterisk/component/mrcp_native_prompt_spec.rb +774 -0
- data/spec/adhearsion/translator/asterisk/component/mrcp_prompt_spec.rb +1244 -0
- data/spec/adhearsion/translator/asterisk/component/output_spec.rb +1850 -0
- data/spec/adhearsion/translator/asterisk/component/record_spec.rb +426 -0
- data/spec/adhearsion/translator/asterisk/component/stop_by_redirect_spec.rb +62 -0
- data/spec/adhearsion/translator/asterisk/component_spec.rb +83 -0
- data/spec/adhearsion/translator/asterisk_spec.rb +685 -0
- data/spec/adhearsion/uri_list_spec.rb +88 -0
- data/spec/adhearsion_spec.rb +89 -14
- data/spec/fixtures/locale/en.yml +13 -0
- data/spec/fixtures/locale/it.yml +13 -0
- data/spec/spec_helper.rb +18 -5
- data/spec/support/call_controller_test_helpers.rb +3 -2
- data/spec/support/initializer_stubs.rb +3 -1
- data/spec/support/punchblock_examples.rb +65 -0
- data/spec/support/punchblock_mocks.rb +12 -0
- metadata +412 -70
- data/features/cli_daemon.feature +0 -20
- data/features/cli_restart.feature +0 -52
- data/features/cli_stop.feature +0 -50
- data/lib/adhearsion/call_controller/menu_dsl.rb +0 -21
- data/lib/adhearsion/call_controller/menu_dsl/array_match_calculator.rb +0 -26
- data/lib/adhearsion/call_controller/menu_dsl/calculated_match.rb +0 -43
- data/lib/adhearsion/call_controller/menu_dsl/calculated_match_collection.rb +0 -45
- data/lib/adhearsion/call_controller/menu_dsl/fixnum_match_calculator.rb +0 -11
- data/lib/adhearsion/call_controller/menu_dsl/match_calculator.rb +0 -40
- data/lib/adhearsion/call_controller/menu_dsl/menu.rb +0 -207
- data/lib/adhearsion/call_controller/menu_dsl/menu_builder.rb +0 -92
- data/lib/adhearsion/call_controller/menu_dsl/range_match_calculator.rb +0 -60
- data/lib/adhearsion/call_controller/menu_dsl/string_match_calculator.rb +0 -25
- data/lib/adhearsion/call_controller/utility.rb +0 -77
- data/lib/adhearsion/foundation/custom_daemonizer.rb +0 -52
- data/lib/adhearsion/punchblock_plugin.rb +0 -63
- data/scripts/cloc-1.64.pl +0 -10483
- data/spec/adhearsion/call_controller/menu_dsl/array_match_calculator_spec.rb +0 -76
- data/spec/adhearsion/call_controller/menu_dsl/calculated_match_collection_spec.rb +0 -60
- data/spec/adhearsion/call_controller/menu_dsl/calculated_match_spec.rb +0 -61
- data/spec/adhearsion/call_controller/menu_dsl/fixnum_match_calculator_spec.rb +0 -39
- data/spec/adhearsion/call_controller/menu_dsl/match_calculator_spec.rb +0 -17
- data/spec/adhearsion/call_controller/menu_dsl/menu_builder_spec.rb +0 -165
- data/spec/adhearsion/call_controller/menu_dsl/menu_spec.rb +0 -420
- data/spec/adhearsion/call_controller/menu_dsl/range_match_calculator_spec.rb +0 -32
- data/spec/adhearsion/call_controller/menu_dsl/string_match_calculator_spec.rb +0 -40
- data/spec/adhearsion/call_controller/utility_spec.rb +0 -90
- data/spec/adhearsion/punchblock_plugin/initializer_spec.rb +0 -356
- data/spec/adhearsion/punchblock_plugin_spec.rb +0 -59
data/features/cli_daemon.feature
DELETED
|
@@ -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
|
data/features/cli_stop.feature
DELETED
|
@@ -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,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
|