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.
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
@@ -7,7 +7,6 @@
7
7
  }.each { |f| require f }
8
8
 
9
9
  %w{
10
- custom_daemonizer
11
10
  exception_handler
12
11
  libc
13
12
  object
@@ -4,11 +4,6 @@ require 'adhearsion/logging'
4
4
 
5
5
  class Object
6
6
  include Adhearsion::Logging::HasLogger
7
-
8
- undef :pb_logger
9
- def pb_logger
10
- logger
11
- end
12
7
  end
13
8
 
14
9
  module Celluloid
@@ -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 platform or plugin configuration
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.platform.logging.level = :debug
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.punchblock.username = "usera@freeswitch.local-dev.mojolingo.com" # Your XMPP JID for use with Rayo
28
- # config.punchblock.password = "1" # Your XMPP password
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.punchblock.platform = :asterisk # Use Asterisk
34
- # config.punchblock.username = "manager" # Your AMI username
35
- # config.punchblock.password = "password" # Your AMI password
36
- # config.punchblock.host = "asterisk.local-dev.mojolingo.com" # Your AMI host
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
@@ -0,0 +1,7 @@
1
+ require 'sinatra'
2
+
3
+ get '/' do
4
+ 'Hello world!'
5
+ end
6
+
7
+ run Sinatra::Application
@@ -0,0 +1,4 @@
1
+ en:
2
+ hello:
3
+ audio: hello_world.wav
4
+ text: "Hello world"
@@ -4,8 +4,8 @@ Adhearsion::Events.draw do
4
4
  <% unless options[:empty] %>
5
5
  # Register global handlers for events
6
6
  #
7
- # eg. Handling Punchblock events
8
- # punchblock do |event|
7
+ # eg. Handling Rayo events
8
+ # rayo do |event|
9
9
  # ...
10
10
  # end
11
11
  #
@@ -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.response
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(:response => "5") }
8
+ let(:example_response) { OpenStruct.new(:utterance => "5") }
9
9
  let(:example_number) { "5" }
10
- let(:long_response) { OpenStruct.new(:response => "55555") }
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
- DEFAULT_PID_FILE_NAME = 'adhearsion.pid'
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
- @mode = options[:mode]
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
- update_rails_env_var
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.config.platform.environment}\"!" if Adhearsion.status == :running
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 update_rails_env_var
96
- env = ENV['AHN_ENV']
97
- if env && Adhearsion.config.valid_environment?(env.to_sym)
98
- unless ENV['RAILS_ENV']
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.platform.lib.nil?
125
+ return false if Adhearsion.config.core.lib.nil?
182
126
 
183
- lib_folder = [Adhearsion.config.platform.root, Adhearsion.config.platform.lib].join '/'
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
- @mode == :console
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
- outputters = init_get_logging_appenders
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.platform.process_name
191
+ Adhearsion::LinuxProcName.set_proc_name Adhearsion.config.core.process_name
326
192
  end
327
193
 
328
194
  def trigger_after_initialized_hooks