adhearsion 2.6.4 → 3.0.0.beta1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (242) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +6 -9
  3. data/CHANGELOG.md +22 -7
  4. data/Gemfile +2 -0
  5. data/README.markdown +4 -5
  6. data/Rakefile +1 -2
  7. data/adhearsion.gemspec +19 -8
  8. data/features/cli_create.feature +19 -3
  9. data/features/step_definitions/cli_steps.rb +0 -11
  10. data/features/support/env.rb +3 -4
  11. data/lib/adhearsion.rb +48 -27
  12. data/lib/adhearsion/call.rb +34 -50
  13. data/lib/adhearsion/call_controller.rb +6 -12
  14. data/lib/adhearsion/call_controller/dial.rb +15 -53
  15. data/lib/adhearsion/call_controller/input.rb +39 -162
  16. data/lib/adhearsion/call_controller/input/ask_grammar_builder.rb +44 -0
  17. data/lib/adhearsion/call_controller/input/menu_builder.rb +136 -0
  18. data/lib/adhearsion/call_controller/input/prompt_builder.rb +78 -0
  19. data/lib/adhearsion/call_controller/input/result.rb +46 -0
  20. data/lib/adhearsion/call_controller/output.rb +48 -67
  21. data/lib/adhearsion/call_controller/output/abstract_player.rb +3 -3
  22. data/lib/adhearsion/call_controller/output/async_player.rb +3 -3
  23. data/lib/adhearsion/call_controller/output/player.rb +1 -1
  24. data/lib/adhearsion/call_controller/record.rb +23 -8
  25. data/lib/adhearsion/calls.rb +1 -1
  26. data/lib/adhearsion/cli_commands/ahn_command.rb +2 -65
  27. data/lib/adhearsion/cli_commands/thor_errors.rb +0 -6
  28. data/lib/adhearsion/configuration.rb +91 -39
  29. data/lib/adhearsion/core_ext/blather/stanza.rb +41 -0
  30. data/lib/adhearsion/core_ext/blather/stanza/presence.rb +13 -0
  31. data/lib/adhearsion/error.rb +5 -0
  32. data/lib/adhearsion/event.rb +21 -0
  33. data/lib/adhearsion/event/active_speaker.rb +11 -0
  34. data/lib/adhearsion/event/answered.rb +11 -0
  35. data/lib/adhearsion/event/asterisk.rb +10 -0
  36. data/lib/adhearsion/event/asterisk/ami.rb +34 -0
  37. data/lib/adhearsion/event/complete.rb +75 -0
  38. data/lib/adhearsion/event/dtmf.rb +11 -0
  39. data/lib/adhearsion/event/end.rb +22 -0
  40. data/lib/adhearsion/event/input_timers_started.rb +9 -0
  41. data/lib/adhearsion/event/joined.rb +17 -0
  42. data/lib/adhearsion/event/offer.rb +14 -0
  43. data/lib/adhearsion/event/ringing.rb +11 -0
  44. data/lib/adhearsion/event/started_speaking.rb +13 -0
  45. data/lib/adhearsion/event/stopped_speaking.rb +13 -0
  46. data/lib/adhearsion/event/unjoined.rb +17 -0
  47. data/lib/adhearsion/events.rb +47 -66
  48. data/lib/adhearsion/foundation.rb +0 -1
  49. data/lib/adhearsion/foundation/object.rb +0 -5
  50. data/lib/adhearsion/generators/app/app_generator.rb +4 -1
  51. data/lib/adhearsion/generators/app/templates/Gemfile.erb +2 -10
  52. data/lib/adhearsion/generators/app/templates/adhearsion.erb +9 -9
  53. data/lib/adhearsion/generators/app/templates/config.ru +7 -0
  54. data/lib/adhearsion/generators/app/templates/en.yml +4 -0
  55. data/lib/adhearsion/generators/app/templates/events.erb +2 -2
  56. data/lib/adhearsion/generators/app/templates/hello_world.wav +0 -0
  57. data/lib/adhearsion/generators/app/templates/simon_game.rb +2 -1
  58. data/lib/adhearsion/generators/app/templates/simon_game_spec.rb +2 -2
  59. data/lib/adhearsion/has_headers.rb +34 -0
  60. data/lib/adhearsion/http_server.rb +37 -0
  61. data/lib/adhearsion/initializer.rb +19 -153
  62. data/lib/adhearsion/logging.rb +6 -25
  63. data/lib/adhearsion/outbound_call.rb +5 -5
  64. data/lib/adhearsion/plugin.rb +1 -0
  65. data/lib/adhearsion/protocol_error.rb +26 -0
  66. data/lib/adhearsion/rayo.rb +30 -0
  67. data/lib/adhearsion/rayo/client.rb +62 -0
  68. data/lib/adhearsion/rayo/client/component_registry.rb +33 -0
  69. data/lib/adhearsion/rayo/command.rb +21 -0
  70. data/lib/adhearsion/rayo/command/accept.rb +16 -0
  71. data/lib/adhearsion/rayo/command/answer.rb +16 -0
  72. data/lib/adhearsion/rayo/command/dial.rb +57 -0
  73. data/lib/adhearsion/rayo/command/hangup.rb +16 -0
  74. data/lib/adhearsion/rayo/command/join.rb +43 -0
  75. data/lib/adhearsion/rayo/command/mute.rb +13 -0
  76. data/lib/adhearsion/rayo/command/redirect.rb +23 -0
  77. data/lib/adhearsion/rayo/command/reject.rb +40 -0
  78. data/lib/adhearsion/rayo/command/unjoin.rb +24 -0
  79. data/lib/adhearsion/rayo/command/unmute.rb +13 -0
  80. data/lib/adhearsion/rayo/command_node.rb +47 -0
  81. data/lib/adhearsion/rayo/component.rb +21 -0
  82. data/lib/adhearsion/rayo/component/asterisk.rb +13 -0
  83. data/lib/adhearsion/rayo/component/asterisk/agi.rb +14 -0
  84. data/lib/adhearsion/rayo/component/asterisk/agi/command.rb +46 -0
  85. data/lib/adhearsion/rayo/component/asterisk/ami.rb +14 -0
  86. data/lib/adhearsion/rayo/component/asterisk/ami/action.rb +61 -0
  87. data/lib/adhearsion/rayo/component/component_node.rb +90 -0
  88. data/lib/adhearsion/rayo/component/input.rb +186 -0
  89. data/lib/adhearsion/rayo/component/output.rb +471 -0
  90. data/lib/adhearsion/rayo/component/prompt.rb +53 -0
  91. data/lib/adhearsion/rayo/component/receive_fax.rb +26 -0
  92. data/lib/adhearsion/rayo/component/record.rb +165 -0
  93. data/lib/adhearsion/rayo/component/send_fax.rb +64 -0
  94. data/lib/adhearsion/rayo/component/stop.rb +11 -0
  95. data/lib/adhearsion/rayo/connection.rb +12 -0
  96. data/lib/adhearsion/rayo/connection/asterisk.rb +74 -0
  97. data/lib/adhearsion/rayo/connection/connected.rb +22 -0
  98. data/lib/adhearsion/rayo/connection/generic_connection.rb +22 -0
  99. data/lib/adhearsion/rayo/connection/xmpp.rb +198 -0
  100. data/lib/adhearsion/rayo/disconnected_error.rb +22 -0
  101. data/lib/adhearsion/{punchblock_plugin → rayo}/initializer.rb +19 -19
  102. data/lib/adhearsion/rayo/rayo_node.rb +127 -0
  103. data/lib/adhearsion/rayo/ref.rb +57 -0
  104. data/lib/adhearsion/statistics.rb +1 -1
  105. data/lib/adhearsion/tasks.rb +1 -2
  106. data/lib/adhearsion/tasks/configuration.rb +1 -1
  107. data/lib/adhearsion/tasks/environment.rb +0 -2
  108. data/lib/adhearsion/tasks/i18n.rb +49 -0
  109. data/lib/adhearsion/translator.rb +11 -0
  110. data/lib/adhearsion/translator/asterisk.rb +234 -0
  111. data/lib/adhearsion/translator/asterisk/agi_app.rb +17 -0
  112. data/lib/adhearsion/translator/asterisk/agi_command.rb +45 -0
  113. data/lib/adhearsion/translator/asterisk/ami_error_converter.rb +20 -0
  114. data/lib/adhearsion/translator/asterisk/call.rb +416 -0
  115. data/lib/adhearsion/translator/asterisk/channel.rb +43 -0
  116. data/lib/adhearsion/translator/asterisk/component.rb +88 -0
  117. data/lib/adhearsion/translator/asterisk/component/asterisk.rb +15 -0
  118. data/lib/adhearsion/translator/asterisk/component/asterisk/agi_command.rb +42 -0
  119. data/lib/adhearsion/translator/asterisk/component/asterisk/ami_action.rb +68 -0
  120. data/lib/adhearsion/translator/asterisk/component/composed_prompt.rb +76 -0
  121. data/lib/adhearsion/translator/asterisk/component/dtmf_recognizer.rb +137 -0
  122. data/lib/adhearsion/translator/asterisk/component/input.rb +34 -0
  123. data/lib/adhearsion/translator/asterisk/component/input_component.rb +90 -0
  124. data/lib/adhearsion/translator/asterisk/component/mrcp_native_prompt.rb +71 -0
  125. data/lib/adhearsion/translator/asterisk/component/mrcp_prompt.rb +55 -0
  126. data/lib/adhearsion/translator/asterisk/component/mrcp_recog_prompt.rb +165 -0
  127. data/lib/adhearsion/translator/asterisk/component/output.rb +233 -0
  128. data/lib/adhearsion/translator/asterisk/component/record.rb +101 -0
  129. data/lib/adhearsion/translator/asterisk/component/stop_by_redirect.rb +30 -0
  130. data/lib/adhearsion/translator/asterisk/unimrcp_app.rb +28 -0
  131. data/lib/adhearsion/uri_list.rb +21 -0
  132. data/lib/adhearsion/version.rb +1 -1
  133. data/spec/adhearsion/call_controller/dial_spec.rb +79 -1420
  134. data/spec/adhearsion/call_controller/input_spec.rb +1141 -237
  135. data/spec/adhearsion/call_controller/output/async_player_spec.rb +10 -10
  136. data/spec/adhearsion/call_controller/output/player_spec.rb +8 -8
  137. data/spec/adhearsion/call_controller/output_spec.rb +162 -215
  138. data/spec/adhearsion/call_controller/record_spec.rb +15 -16
  139. data/spec/adhearsion/call_controller_spec.rb +23 -40
  140. data/spec/adhearsion/call_spec.rb +123 -129
  141. data/spec/adhearsion/calls_spec.rb +3 -3
  142. data/spec/adhearsion/configuration_spec.rb +94 -108
  143. data/spec/adhearsion/event/answered_spec.rb +50 -0
  144. data/spec/adhearsion/event/asterisk/Find Results +402 -0
  145. data/spec/adhearsion/event/asterisk/ami_spec.rb +81 -0
  146. data/spec/adhearsion/event/complete_spec.rb +176 -0
  147. data/spec/adhearsion/event/dtmf_spec.rb +35 -0
  148. data/spec/adhearsion/event/end_spec.rb +85 -0
  149. data/spec/adhearsion/event/input_timers_started_spec.rb +19 -0
  150. data/spec/adhearsion/event/joined_spec.rb +53 -0
  151. data/spec/adhearsion/event/offer_spec.rb +106 -0
  152. data/spec/adhearsion/event/ringing_spec.rb +50 -0
  153. data/spec/adhearsion/event/started_speaking_spec.rb +37 -0
  154. data/spec/adhearsion/event/stopped_speaking_spec.rb +37 -0
  155. data/spec/adhearsion/event/unjoined_spec.rb +48 -0
  156. data/spec/adhearsion/event/untitled +0 -0
  157. data/spec/adhearsion/events_spec.rb +19 -45
  158. data/spec/adhearsion/initializer_spec.rb +12 -184
  159. data/spec/adhearsion/logging_spec.rb +5 -20
  160. data/spec/adhearsion/outbound_call_spec.rb +13 -13
  161. data/spec/adhearsion/plugin_spec.rb +3 -4
  162. data/spec/adhearsion/protocol_error_spec.rb +91 -0
  163. data/spec/adhearsion/rayo/client/component_registry_spec.rb +26 -0
  164. data/spec/adhearsion/rayo/client_spec.rb +134 -0
  165. data/spec/adhearsion/rayo/command/accept_spec.rb +63 -0
  166. data/spec/adhearsion/rayo/command/answer_spec.rb +73 -0
  167. data/spec/adhearsion/rayo/command/dial_spec.rb +156 -0
  168. data/spec/adhearsion/rayo/command/hangup_spec.rb +63 -0
  169. data/spec/adhearsion/rayo/command/join_spec.rb +158 -0
  170. data/spec/adhearsion/rayo/command/mute_spec.rb +32 -0
  171. data/spec/adhearsion/rayo/command/redirect_spec.rb +89 -0
  172. data/spec/adhearsion/rayo/command/reject_spec.rb +117 -0
  173. data/spec/adhearsion/rayo/command/unjoin_spec.rb +82 -0
  174. data/spec/adhearsion/rayo/command/unmute_spec.rb +32 -0
  175. data/spec/adhearsion/rayo/command_node_spec.rb +101 -0
  176. data/spec/adhearsion/rayo/component/asterisk/agi/command_spec.rb +111 -0
  177. data/spec/adhearsion/rayo/component/asterisk/ami/action_spec.rb +173 -0
  178. data/spec/adhearsion/rayo/component/component_node_spec.rb +110 -0
  179. data/spec/adhearsion/rayo/component/input_spec.rb +715 -0
  180. data/spec/adhearsion/rayo/component/output_spec.rb +1030 -0
  181. data/spec/adhearsion/rayo/component/prompt_spec.rb +171 -0
  182. data/spec/adhearsion/rayo/component/receive_fax_spec.rb +136 -0
  183. data/spec/adhearsion/rayo/component/record_spec.rb +497 -0
  184. data/spec/adhearsion/rayo/component/send_fax_spec.rb +144 -0
  185. data/spec/adhearsion/rayo/connection/asterisk_spec.rb +118 -0
  186. data/spec/adhearsion/rayo/connection/xmpp_spec.rb +449 -0
  187. data/spec/adhearsion/rayo/initializer_spec.rb +353 -0
  188. data/spec/adhearsion/rayo/ref_spec.rb +168 -0
  189. data/spec/adhearsion/rayo_spec.rb +7 -0
  190. data/spec/adhearsion/router/route_spec.rb +1 -1
  191. data/spec/adhearsion/statistics_spec.rb +2 -5
  192. data/spec/adhearsion/translator/asterisk/call_spec.rb +2047 -0
  193. data/spec/adhearsion/translator/asterisk/component/asterisk/agi_command_spec.rb +256 -0
  194. data/spec/adhearsion/translator/asterisk/component/asterisk/ami_action_spec.rb +151 -0
  195. data/spec/adhearsion/translator/asterisk/component/composed_prompt_spec.rb +257 -0
  196. data/spec/adhearsion/translator/asterisk/component/input_spec.rb +571 -0
  197. data/spec/adhearsion/translator/asterisk/component/mrcp_native_prompt_spec.rb +774 -0
  198. data/spec/adhearsion/translator/asterisk/component/mrcp_prompt_spec.rb +1244 -0
  199. data/spec/adhearsion/translator/asterisk/component/output_spec.rb +1850 -0
  200. data/spec/adhearsion/translator/asterisk/component/record_spec.rb +426 -0
  201. data/spec/adhearsion/translator/asterisk/component/stop_by_redirect_spec.rb +62 -0
  202. data/spec/adhearsion/translator/asterisk/component_spec.rb +83 -0
  203. data/spec/adhearsion/translator/asterisk_spec.rb +685 -0
  204. data/spec/adhearsion/uri_list_spec.rb +88 -0
  205. data/spec/adhearsion_spec.rb +89 -14
  206. data/spec/fixtures/locale/en.yml +13 -0
  207. data/spec/fixtures/locale/it.yml +13 -0
  208. data/spec/spec_helper.rb +18 -5
  209. data/spec/support/call_controller_test_helpers.rb +3 -2
  210. data/spec/support/initializer_stubs.rb +3 -1
  211. data/spec/support/punchblock_examples.rb +65 -0
  212. data/spec/support/punchblock_mocks.rb +12 -0
  213. metadata +412 -70
  214. data/features/cli_daemon.feature +0 -20
  215. data/features/cli_restart.feature +0 -52
  216. data/features/cli_stop.feature +0 -50
  217. data/lib/adhearsion/call_controller/menu_dsl.rb +0 -21
  218. data/lib/adhearsion/call_controller/menu_dsl/array_match_calculator.rb +0 -26
  219. data/lib/adhearsion/call_controller/menu_dsl/calculated_match.rb +0 -43
  220. data/lib/adhearsion/call_controller/menu_dsl/calculated_match_collection.rb +0 -45
  221. data/lib/adhearsion/call_controller/menu_dsl/fixnum_match_calculator.rb +0 -11
  222. data/lib/adhearsion/call_controller/menu_dsl/match_calculator.rb +0 -40
  223. data/lib/adhearsion/call_controller/menu_dsl/menu.rb +0 -207
  224. data/lib/adhearsion/call_controller/menu_dsl/menu_builder.rb +0 -92
  225. data/lib/adhearsion/call_controller/menu_dsl/range_match_calculator.rb +0 -60
  226. data/lib/adhearsion/call_controller/menu_dsl/string_match_calculator.rb +0 -25
  227. data/lib/adhearsion/call_controller/utility.rb +0 -77
  228. data/lib/adhearsion/foundation/custom_daemonizer.rb +0 -52
  229. data/lib/adhearsion/punchblock_plugin.rb +0 -63
  230. data/scripts/cloc-1.64.pl +0 -10483
  231. data/spec/adhearsion/call_controller/menu_dsl/array_match_calculator_spec.rb +0 -76
  232. data/spec/adhearsion/call_controller/menu_dsl/calculated_match_collection_spec.rb +0 -60
  233. data/spec/adhearsion/call_controller/menu_dsl/calculated_match_spec.rb +0 -61
  234. data/spec/adhearsion/call_controller/menu_dsl/fixnum_match_calculator_spec.rb +0 -39
  235. data/spec/adhearsion/call_controller/menu_dsl/match_calculator_spec.rb +0 -17
  236. data/spec/adhearsion/call_controller/menu_dsl/menu_builder_spec.rb +0 -165
  237. data/spec/adhearsion/call_controller/menu_dsl/menu_spec.rb +0 -420
  238. data/spec/adhearsion/call_controller/menu_dsl/range_match_calculator_spec.rb +0 -32
  239. data/spec/adhearsion/call_controller/menu_dsl/string_match_calculator_spec.rb +0 -40
  240. data/spec/adhearsion/call_controller/utility_spec.rb +0 -90
  241. data/spec/adhearsion/punchblock_plugin/initializer_spec.rb +0 -356
  242. data/spec/adhearsion/punchblock_plugin_spec.rb +0 -59
@@ -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