adhearsion 2.6.4 → 3.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -5,7 +5,7 @@ module Adhearsion
|
|
5
5
|
class AppGenerator < Generator
|
6
6
|
|
7
7
|
BASEDIRS = %w( config script spec )
|
8
|
-
EMPTYDIRS = %w( app/call_controllers lib spec/support spec/call_controllers )
|
8
|
+
EMPTYDIRS = %w( app/assets/audio/en app/call_controllers config/locales lib spec/support spec/call_controllers )
|
9
9
|
|
10
10
|
class_option :empty, type: :boolean
|
11
11
|
|
@@ -18,13 +18,16 @@ module Adhearsion
|
|
18
18
|
template "adhearsion.erb", "config/adhearsion.rb"
|
19
19
|
template "events.erb", "config/events.rb"
|
20
20
|
template "routes.erb", "config/routes.rb"
|
21
|
+
copy_file "config.ru", "config.ru"
|
21
22
|
copy_file "gitignore", ".gitignore"
|
22
23
|
copy_file "rspec", ".rspec"
|
23
24
|
copy_file "Procfile"
|
24
25
|
copy_file "Rakefile"
|
25
26
|
copy_file "README.md"
|
26
27
|
unless options[:empty]
|
28
|
+
copy_file "hello_world.wav", "app/assets/audio/en/hello_world.wav"
|
27
29
|
copy_file "simon_game.rb", "app/call_controllers/simon_game.rb"
|
30
|
+
copy_file "en.yml", "config/locales/en.yml"
|
28
31
|
copy_file "simon_game_spec.rb", "spec/call_controllers/simon_game_spec.rb"
|
29
32
|
end
|
30
33
|
chmod "script/ahn", 0755
|
@@ -2,21 +2,13 @@ source 'https://rubygems.org'
|
|
2
2
|
|
3
3
|
gem 'adhearsion', '~> <%= Adhearsion::VERSION.split('.')[0,2].join('.') %>'
|
4
4
|
|
5
|
-
# Exercise care when updating the Punchblock major version, since Adhearsion
|
6
|
-
# apps sometimes make use of underlying features from the Punchblock API.
|
7
|
-
# Occasionally an update of Adhearsion will necessitate an update to
|
8
|
-
# Punchblock; in those cases update this line and test your app thoroughly.
|
9
|
-
gem 'punchblock', '~> <%= require "punchblock/version"; Punchblock::VERSION.split('.')[0,2].join('.') %>'
|
10
|
-
|
11
|
-
# This is here by default due to deprecation of #ask and #menu.
|
12
|
-
# See http://adhearsion.com/docs/common_problems#toc_3 for details
|
13
|
-
gem 'adhearsion-asr'
|
14
|
-
|
15
5
|
#
|
16
6
|
# Check http://ahnhub.com for a list of plugins you can use in your app.
|
17
7
|
# To use them, simply add them here and run `bundle install`.
|
18
8
|
#
|
19
9
|
|
10
|
+
gem 'sinatra'
|
11
|
+
|
20
12
|
group :development, :test do
|
21
13
|
gem 'rspec'
|
22
14
|
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Adhearsion.config do |config|
|
4
4
|
<% unless options[:empty] %>
|
5
|
-
# Centralized way to specify any Adhearsion
|
5
|
+
# Centralized way to specify any Adhearsion core or plugin configuration
|
6
6
|
# - Execute rake config:show to view the active configuration values
|
7
7
|
#
|
8
8
|
# To update a plugin configuration you can write either:
|
@@ -18,20 +18,20 @@ Adhearsion.config do |config|
|
|
18
18
|
# end
|
19
19
|
<% end %>
|
20
20
|
config.development do |dev|
|
21
|
-
dev.
|
21
|
+
dev.core.logging.level = :debug
|
22
22
|
end
|
23
23
|
|
24
24
|
##
|
25
|
-
# Use with Rayo (eg Voxeo PRISM or FreeSWITCH mod_rayo)
|
25
|
+
# Use with Rayo over XMPP (eg Voxeo PRISM or FreeSWITCH mod_rayo)
|
26
26
|
#
|
27
|
-
# config.
|
28
|
-
# config.
|
27
|
+
# config.core.username = "usera@freeswitch.local-dev.mojolingo.com" # Your XMPP JID for use with Rayo
|
28
|
+
# config.core.password = "1" # Your XMPP password
|
29
29
|
|
30
30
|
##
|
31
31
|
# Use with Asterisk
|
32
32
|
#
|
33
|
-
# config.
|
34
|
-
# config.
|
35
|
-
# config.
|
36
|
-
# config.
|
33
|
+
# config.core.type = :asterisk # Use Asterisk
|
34
|
+
# config.core.username = "manager" # Your AMI username
|
35
|
+
# config.core.password = "password" # Your AMI password
|
36
|
+
# config.core.host = "asterisk.local-dev.mojolingo.com" # Your AMI host
|
37
37
|
end
|
Binary file
|
@@ -7,6 +7,7 @@ class SimonGame < Adhearsion::CallController
|
|
7
7
|
def run
|
8
8
|
answer
|
9
9
|
reset
|
10
|
+
say t(:hello)
|
10
11
|
loop do
|
11
12
|
update_number
|
12
13
|
collect_attempt
|
@@ -24,7 +25,7 @@ class SimonGame < Adhearsion::CallController
|
|
24
25
|
|
25
26
|
def collect_attempt
|
26
27
|
result = ask @number, :limit => @number.length
|
27
|
-
@attempt = result.
|
28
|
+
@attempt = result.utterance
|
28
29
|
end
|
29
30
|
|
30
31
|
def verify_attempt
|
@@ -5,9 +5,9 @@ require 'call_controllers/simon_game'
|
|
5
5
|
|
6
6
|
describe SimonGame do
|
7
7
|
|
8
|
-
let(:example_response) { OpenStruct.new(:
|
8
|
+
let(:example_response) { OpenStruct.new(:utterance => "5") }
|
9
9
|
let(:example_number) { "5" }
|
10
|
-
let(:long_response) { OpenStruct.new(:
|
10
|
+
let(:long_response) { OpenStruct.new(:utterance => "55555") }
|
11
11
|
let(:long_number) { "55555" }
|
12
12
|
|
13
13
|
let(:mock_call) { double 'Call' }
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Adhearsion
|
4
|
+
module HasHeaders
|
5
|
+
def self.included(klass)
|
6
|
+
klass.attribute :headers, Hash, default: {}
|
7
|
+
end
|
8
|
+
|
9
|
+
def headers=(other)
|
10
|
+
super(other || {})
|
11
|
+
end
|
12
|
+
|
13
|
+
def inherit(xml_node)
|
14
|
+
xml_node.xpath('//ns:header', ns: Rayo::RAYO_NAMESPACES[:core]).to_a.each do |header|
|
15
|
+
if headers.has_key?(header[:name])
|
16
|
+
headers[header[:name]] = [headers[header[:name]]]
|
17
|
+
headers[header[:name]] << header[:value]
|
18
|
+
else
|
19
|
+
headers[header[:name]] = header[:value]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
super
|
23
|
+
end
|
24
|
+
|
25
|
+
def rayo_children(root)
|
26
|
+
super
|
27
|
+
headers.each do |name, value|
|
28
|
+
Array(value).each do |v|
|
29
|
+
root.header name: name, value: v, xmlns: Rayo::RAYO_NAMESPACES[:core]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'reel'
|
4
|
+
require 'reel/rack'
|
5
|
+
|
6
|
+
module Adhearsion
|
7
|
+
# @private
|
8
|
+
class HTTPServer
|
9
|
+
def self.start
|
10
|
+
config = Adhearsion.config.core.http
|
11
|
+
|
12
|
+
return unless config.enable
|
13
|
+
|
14
|
+
rackup = File.join(Adhearsion.root, config.rackup)
|
15
|
+
unless File.exists?(rackup)
|
16
|
+
logger.error "Cannot start HTTP server because the Rack configuration does not exist at #{rackup}"
|
17
|
+
return
|
18
|
+
end
|
19
|
+
|
20
|
+
app, options = ::Rack::Builder.parse_file rackup
|
21
|
+
options = {
|
22
|
+
Host: config.host,
|
23
|
+
Port: config.port,
|
24
|
+
}.merge(options)
|
25
|
+
|
26
|
+
app = Rack::CommonLogger.new(app, logger)
|
27
|
+
|
28
|
+
logger.info "Starting HTTP server listening on #{config.host}:#{config.port}"
|
29
|
+
|
30
|
+
supervisor = ::Reel::Rack::Server.supervise_as(:ahn_http_server, app, options)
|
31
|
+
|
32
|
+
Adhearsion::Events.register_callback :shutdown do
|
33
|
+
supervisor.terminate
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -1,7 +1,8 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
require 'adhearsion/punchblock_plugin'
|
4
3
|
require 'adhearsion/linux_proc_name'
|
4
|
+
require 'adhearsion/rayo/initializer'
|
5
|
+
require 'adhearsion/http_server'
|
5
6
|
require 'rbconfig'
|
6
7
|
|
7
8
|
module Adhearsion
|
@@ -13,45 +14,23 @@ module Adhearsion
|
|
13
14
|
end
|
14
15
|
end
|
15
16
|
|
16
|
-
|
17
|
+
attr_reader :path
|
17
18
|
|
18
|
-
attr_reader :path, :daemon, :pid_file
|
19
|
-
|
20
|
-
# Creation of pid_files
|
21
|
-
#
|
22
|
-
# - You may want to have Adhearsion create a process identification
|
23
|
-
# file when it boots so that a crash monitoring program such as
|
24
|
-
# Monit can reboot if necessary or so the init script can kill it
|
25
|
-
# for system shutdowns.
|
26
|
-
# - To have Adhearsion create a pid file in the default location (i.e.
|
27
|
-
# AHN_INSTALL_DIR/adhearsion.pid), supply :pid_file with 'true'. Otherwise
|
28
|
-
# one is not created UNLESS it is running in daemon mode, in which
|
29
|
-
# case one is created. You can force Adhearsion to not create one
|
30
|
-
# even in daemon mode by supplying "false".
|
31
19
|
def initialize(options = {})
|
32
20
|
@@started = true
|
33
21
|
@path = path
|
34
|
-
@
|
35
|
-
@pid_file = options[:pid_file].nil? ? ENV['PID_FILE'] : options[:pid_file]
|
22
|
+
@console = options[:console]
|
36
23
|
@loaded_init_files = options[:loaded_init_files]
|
37
24
|
Adhearsion.root = '.'
|
38
25
|
end
|
39
26
|
|
40
27
|
def start
|
41
28
|
catch :boot_aborted do
|
42
|
-
resolve_pid_file_path
|
43
29
|
configure_plugins
|
44
30
|
load_lib_folder
|
45
31
|
load_config_file
|
46
32
|
load_events_file
|
47
33
|
load_routes_file
|
48
|
-
initialize_log_paths
|
49
|
-
|
50
|
-
if should_daemonize?
|
51
|
-
daemonize!
|
52
|
-
else
|
53
|
-
create_pid_file
|
54
|
-
end
|
55
34
|
|
56
35
|
Adhearsion.statistics
|
57
36
|
start_logging
|
@@ -60,15 +39,18 @@ module Adhearsion
|
|
60
39
|
catch_termination_signal
|
61
40
|
set_ahn_proc_name
|
62
41
|
initialize_exception_logger
|
63
|
-
|
42
|
+
setup_i18n_load_path
|
43
|
+
Rayo::Initializer.init
|
44
|
+
HTTPServer.start
|
64
45
|
init_plugins
|
65
46
|
|
47
|
+
Rayo::Initializer.run
|
66
48
|
run_plugins
|
67
49
|
trigger_after_initialized_hooks
|
68
50
|
|
69
51
|
Adhearsion::Process.booted if Adhearsion.status == :booting
|
70
52
|
|
71
|
-
logger.info "Adhearsion v#{Adhearsion::VERSION} initialized in \"#{Adhearsion.
|
53
|
+
logger.info "Adhearsion v#{Adhearsion::VERSION} initialized in \"#{Adhearsion.environment}\"!" if Adhearsion.status == :running
|
72
54
|
end
|
73
55
|
|
74
56
|
# This method will block until all important threads have finished.
|
@@ -92,48 +74,13 @@ module Adhearsion
|
|
92
74
|
end
|
93
75
|
end
|
94
76
|
|
95
|
-
def
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
logger.info "Copying AHN_ENV (#{env}) to RAILS_ENV"
|
100
|
-
ENV['RAILS_ENV'] = env
|
101
|
-
end
|
102
|
-
else
|
103
|
-
unless ENV['RAILS_ENV']
|
104
|
-
env = Adhearsion.config.platform.environment.to_s
|
105
|
-
ENV['AHN_ENV'] = env
|
106
|
-
logger.info "Setting RAILS_ENV to \"#{env}\""
|
107
|
-
ENV['RAILS_ENV'] = env
|
108
|
-
end
|
109
|
-
end
|
110
|
-
logger.warn "AHN_ENV(#{ENV['AHN_ENV']}) does not match RAILS_ENV(#{ENV['RAILS_ENV']})!" unless ENV['RAILS_ENV'] == ENV['AHN_ENV']
|
111
|
-
env
|
112
|
-
end
|
113
|
-
|
114
|
-
def default_pid_path
|
115
|
-
File.join Adhearsion.config.root, DEFAULT_PID_FILE_NAME
|
116
|
-
end
|
117
|
-
|
118
|
-
def resolve_pid_file_path
|
119
|
-
@pid_file = if pid_file.equal?(true)
|
120
|
-
default_pid_path
|
121
|
-
elsif pid_file.equal?(false)
|
122
|
-
nil
|
123
|
-
elsif pid_file
|
124
|
-
File.expand_path pid_file
|
125
|
-
else
|
126
|
-
should_daemonize? ? default_pid_path : nil
|
77
|
+
def setup_i18n_load_path
|
78
|
+
Adhearsion.config.core.i18n.locale_path.each do |dir|
|
79
|
+
logger.debug "Adding #{dir} to the I18n load path"
|
80
|
+
I18n.load_path += Dir["#{dir}/**/*.yml"]
|
127
81
|
end
|
128
82
|
end
|
129
83
|
|
130
|
-
def resolve_log_file_path
|
131
|
-
_log_file = Adhearsion.config.platform.logging.outputters
|
132
|
-
_log_file = _log_file[0] if _log_file.is_a?(Array)
|
133
|
-
_log_file = File.expand_path(Adhearsion.config.root.dup.concat("/").concat(_log_file)) unless _log_file.start_with?("/")
|
134
|
-
_log_file
|
135
|
-
end
|
136
|
-
|
137
84
|
def catch_termination_signal
|
138
85
|
self_read, self_write = IO.pipe
|
139
86
|
|
@@ -162,9 +109,6 @@ module Adhearsion
|
|
162
109
|
when 'INT', 'TERM'
|
163
110
|
logger.info "Received SIG#{signal}. Shutting down."
|
164
111
|
Adhearsion::Process.shutdown
|
165
|
-
when 'HUP'
|
166
|
-
logger.info "Received SIGHUP. Reopening logfiles."
|
167
|
-
Adhearsion::Logging.reopen_logs
|
168
112
|
when 'ALRM'
|
169
113
|
logger.info "Received SIGALRM. Toggling trace logging."
|
170
114
|
Adhearsion::Logging.toggle_trace!
|
@@ -178,9 +122,9 @@ module Adhearsion
|
|
178
122
|
# Loads files in application lib folder
|
179
123
|
# @return [Boolean] if files have been loaded (lib folder is configured to not nil and actually exists)
|
180
124
|
def load_lib_folder
|
181
|
-
return false if Adhearsion.config.
|
125
|
+
return false if Adhearsion.config.core.lib.nil?
|
182
126
|
|
183
|
-
lib_folder = [Adhearsion.config.
|
127
|
+
lib_folder = [Adhearsion.config.core.root, Adhearsion.config.core.lib].join '/'
|
184
128
|
return false unless File.directory? lib_folder
|
185
129
|
|
186
130
|
$LOAD_PATH.unshift lib_folder
|
@@ -199,6 +143,7 @@ module Adhearsion
|
|
199
143
|
end
|
200
144
|
|
201
145
|
def load_events_file
|
146
|
+
Adhearsion::Events.init
|
202
147
|
path = "#{Adhearsion.config.root}/config/events.rb"
|
203
148
|
load path if File.exists?(path)
|
204
149
|
end
|
@@ -208,40 +153,6 @@ module Adhearsion
|
|
208
153
|
load path if File.exists?(path)
|
209
154
|
end
|
210
155
|
|
211
|
-
def init_get_logging_appenders
|
212
|
-
@file_loggers ||= memoize_logging_appenders
|
213
|
-
end
|
214
|
-
|
215
|
-
def memoize_logging_appenders
|
216
|
-
appenders = Array(Adhearsion.config.platform.logging.outputters.dup)
|
217
|
-
# Any filename in the outputters array is mapped to a ::Logging::Appenders::File instance
|
218
|
-
appenders.map! do |a|
|
219
|
-
case a
|
220
|
-
when String
|
221
|
-
f = if a.start_with?("/")
|
222
|
-
a
|
223
|
-
else
|
224
|
-
File.expand_path(Adhearsion.config.root.dup.concat("/").concat(a))
|
225
|
-
end
|
226
|
-
::Logging.appenders.file(f,
|
227
|
-
:layout => ::Logging.layouts.pattern(
|
228
|
-
Adhearsion::Logging.adhearsion_pattern_options
|
229
|
-
),
|
230
|
-
:auto_flushing => 2,
|
231
|
-
:flush_period => 2
|
232
|
-
)
|
233
|
-
else
|
234
|
-
a
|
235
|
-
end
|
236
|
-
end
|
237
|
-
|
238
|
-
if should_daemonize?
|
239
|
-
appenders
|
240
|
-
else
|
241
|
-
appenders += Adhearsion::Logging.default_appenders
|
242
|
-
end
|
243
|
-
end
|
244
|
-
|
245
156
|
def configure_plugins
|
246
157
|
Plugin.configure_plugins
|
247
158
|
end
|
@@ -254,19 +165,8 @@ module Adhearsion
|
|
254
165
|
Plugin.run_plugins
|
255
166
|
end
|
256
167
|
|
257
|
-
def should_daemonize?
|
258
|
-
@mode == :daemon
|
259
|
-
end
|
260
|
-
|
261
168
|
def need_console?
|
262
|
-
@
|
263
|
-
end
|
264
|
-
|
265
|
-
def daemonize!
|
266
|
-
logger.info "Daemonizing now!"
|
267
|
-
Adhearsion::CustomDaemonizer.daemonize resolve_log_file_path do |pid|
|
268
|
-
create_pid_file pid
|
269
|
-
end
|
169
|
+
@console == true
|
270
170
|
end
|
271
171
|
|
272
172
|
def launch_console
|
@@ -277,28 +177,8 @@ module Adhearsion
|
|
277
177
|
end
|
278
178
|
end
|
279
179
|
|
280
|
-
# Creates the relative paths associated to log files
|
281
|
-
# i.e.
|
282
|
-
# - log_file = "log/adhearsion.log" => creates 'log' folder
|
283
|
-
# - log_file = "log/test/adhearsion.log" => creates 'log' and 'log/test' folders
|
284
|
-
def initialize_log_paths
|
285
|
-
outputters = Array(Adhearsion.config.platform.logging.outputters)
|
286
|
-
outputters.select{|o| o.is_a?(String)}.each do |o|
|
287
|
-
o = o.split("/")
|
288
|
-
unless o[0].empty? # only if relative path
|
289
|
-
o.pop # not consider filename
|
290
|
-
o.inject("") do |path, folder|
|
291
|
-
path = path.concat(folder).concat("/")
|
292
|
-
Dir.mkdir(path) unless File.directory? path
|
293
|
-
path
|
294
|
-
end
|
295
|
-
end
|
296
|
-
end
|
297
|
-
end
|
298
|
-
|
299
180
|
def start_logging
|
300
|
-
|
301
|
-
Adhearsion::Logging.start outputters, Adhearsion.config.platform.logging.level, Adhearsion.config.platform.logging.formatter
|
181
|
+
Adhearsion::Logging.start Adhearsion.config.core.logging.level, Adhearsion.config.core.logging.formatter
|
302
182
|
end
|
303
183
|
|
304
184
|
def initialize_exception_logger
|
@@ -307,22 +187,8 @@ module Adhearsion
|
|
307
187
|
end
|
308
188
|
end
|
309
189
|
|
310
|
-
def create_pid_file(pid = nil)
|
311
|
-
return unless pid_file
|
312
|
-
|
313
|
-
logger.debug "Creating PID file #{pid_file}"
|
314
|
-
|
315
|
-
File.open pid_file, 'w' do |file|
|
316
|
-
file.puts pid || ::Process.pid
|
317
|
-
end
|
318
|
-
|
319
|
-
Events.register_callback :shutdown do
|
320
|
-
File.delete(pid_file) if File.exists?(pid_file)
|
321
|
-
end
|
322
|
-
end
|
323
|
-
|
324
190
|
def set_ahn_proc_name
|
325
|
-
Adhearsion::LinuxProcName.set_proc_name Adhearsion.config.
|
191
|
+
Adhearsion::LinuxProcName.set_proc_name Adhearsion.config.core.process_name
|
326
192
|
end
|
327
193
|
|
328
194
|
def trigger_after_initialized_hooks
|