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
@@ -26,13 +26,13 @@ module Adhearsion
26
26
  def new_output(options)
27
27
  defaults = {}
28
28
 
29
- default_voice = Adhearsion.config.platform.media.default_voice || Adhearsion.config.punchblock[:default_voice]
29
+ default_voice = Adhearsion.config.core.media.default_voice
30
30
  defaults[:voice] = default_voice if default_voice
31
31
 
32
- renderer = Adhearsion.config.platform.media.default_renderer || Adhearsion.config.punchblock[:media_engine]
32
+ renderer = Adhearsion.config.core.media.default_renderer
33
33
  defaults[:renderer] = renderer if renderer
34
34
 
35
- Punchblock::Component::Output.new defaults.merge(options)
35
+ Adhearsion::Rayo::Component::Output.new defaults.merge(options)
36
36
  end
37
37
  end
38
38
  end
@@ -12,13 +12,13 @@ module Adhearsion
12
12
  def output(content, options = {})
13
13
  options.merge! :ssml => content
14
14
  component = new_output options
15
- component.register_event_handler Punchblock::Event::Complete do |event|
16
- controller.logger.error event if event.reason.is_a?(Punchblock::Event::Complete::Error)
15
+ component.register_event_handler Adhearsion::Event::Complete do |event|
16
+ controller.logger.error event if event.reason.is_a?(Adhearsion::Event::Complete::Error)
17
17
  throw :pass
18
18
  end
19
19
  controller.write_and_await_response component
20
20
  component
21
- rescue Punchblock::ProtocolError => e
21
+ rescue Adhearsion::ProtocolError => e
22
22
  raise PlaybackError, "Async output failed due to #{e.inspect}"
23
23
  end
24
24
  end
@@ -19,7 +19,7 @@ module Adhearsion
19
19
  end
20
20
  rescue Call::Hangup
21
21
  raise
22
- rescue Adhearsion::Error, Punchblock::ProtocolError => e
22
+ rescue Adhearsion::Error, Adhearsion::ProtocolError => e
23
23
  raise PlaybackError, "Output failed due to #{e.inspect}"
24
24
  end
25
25
  end
@@ -1,5 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
+ require 'ruby_speech'
4
+
3
5
  module Adhearsion
4
6
  class CallController
5
7
  module Record
@@ -33,7 +35,7 @@ module Adhearsion
33
35
 
34
36
  interruptible = options.delete :interruptible
35
37
  @stopper_component = interruptible ? setup_stopper(interruptible) : nil
36
- @record_component = Punchblock::Component::Record.new options
38
+ @record_component = Adhearsion::Rayo::Component::Record.new options
37
39
  end
38
40
 
39
41
  #
@@ -51,26 +53,39 @@ module Adhearsion
51
53
  #
52
54
  # Set a callback to be executed when recording completes
53
55
  #
54
- # @yield [Punchblock::Event::Complete] the complete Event for the recording
56
+ # @yield [Adhearsion::Event::Complete] the complete Event for the recording
55
57
  #
56
58
  def handle_record_completion(&block)
57
- @record_component.register_event_handler Punchblock::Event::Complete, &block
59
+ @record_component.register_event_handler Adhearsion::Event::Complete, &block
58
60
  end
59
61
 
60
62
  private
61
63
 
62
64
  def setup_stopper(interrupt_digits)
63
65
  interrupt_digits = interrupt_digits == true ? '0123456789#*' : interrupt_digits.to_s
64
- @stopper_component = Punchblock::Component::Input.new :mode => :dtmf,
66
+ @stopper_component = Adhearsion::Rayo::Component::Input.new :mode => :dtmf,
65
67
  :grammar => {
66
- :value => @controller.grammar_accept(interrupt_digits)
68
+ :value => grammar_accept(interrupt_digits)
67
69
  }
68
- @stopper_component.register_event_handler Punchblock::Event::Complete do |event|
70
+ @stopper_component.register_event_handler Adhearsion::Event::Complete do |event|
69
71
  @record_component.stop! unless @record_component.complete?
70
72
  end
71
73
  @stopper_component
72
74
  end
73
75
 
76
+ def grammar_accept(digits = '0123456789#*')
77
+ allowed_digits = '0123456789#*'
78
+ gram_digits = digits.chars.select { |x| allowed_digits.include? x }
79
+
80
+ RubySpeech::GRXML.draw :mode => 'dtmf', :root => 'inputdigits' do
81
+ rule id: 'inputdigits', scope: 'public' do
82
+ one_of do
83
+ gram_digits.each { |d| item { d.to_s } }
84
+ end
85
+ end
86
+ end
87
+ end
88
+
74
89
  def execute_stopper
75
90
  @controller.write_and_await_response @stopper_component if @stopper_component
76
91
  end
@@ -118,9 +133,9 @@ module Adhearsion
118
133
  # @option options [Boolean, String, Optional] :interruptible Allows the recording to be terminated by any single DTMF key, default is false
119
134
  #
120
135
  # @yield [event] Handle the recording completion event asyncronously.
121
- # @yieldparam [Punchblock::Event::Complete] event the complete event for the recording
136
+ # @yieldparam [Adhearsion::Event::Complete] event the complete event for the recording
122
137
  #
123
- # @return Punchblock::Component::Record
138
+ # @return Adhearsion::Rayo::Component::Record
124
139
  #
125
140
  def record(options = {})
126
141
  recorder = Recorder.new self, options
@@ -94,7 +94,7 @@ module Adhearsion
94
94
  return unless reason
95
95
  Adhearsion::Events.trigger :exception, reason
96
96
  logger.error "Call #{call_id} terminated abnormally due to #{reason}. Forcing hangup."
97
- PunchblockPlugin.client.execute_command Punchblock::Command::Hangup.new, :async => true, :call_id => call_id
97
+ Adhearsion.client.execute_command Adhearsion::Rayo::Command::Hangup.new, :async => true, :call_id => call_id
98
98
  end
99
99
  end
100
100
  end
@@ -40,70 +40,13 @@ module Adhearsion
40
40
  desc "start </path/to/directory>", "Start the Adhearsion server in the foreground with a console"
41
41
  method_option :noconsole, type: :boolean, aliases: %w{--no-console}
42
42
  def start(path = nil)
43
- start_app path, options[:noconsole] ? :simple : :console
44
- end
45
-
46
- desc "daemon </path/to/directory>", "Start the Adhearsion server in the background"
47
- method_option :pidfile, :type => :string, :aliases => %w(--pid-file)
48
- def daemon(path = nil)
49
- start_app path, :daemon, options[:pidfile]
50
- end
51
-
52
- desc "stop </path/to/directory>", "Stop a running Adhearsion server"
53
- method_option :pidfile, :type => :string, :aliases => %w(--pid-file)
54
- def stop(path = nil)
55
- path = execute_from_app_dir! path
56
-
57
- pid_file = if options[:pidfile]
58
- File.exists?(File.expand_path(options[:pidfile])) ?
59
- options[:pidfile] :
60
- File.join(path, options[:pidfile])
61
- else
62
- path = Dir.pwd
63
- File.join path, Adhearsion::Initializer::DEFAULT_PID_FILE_NAME
64
- end
65
- pid_file = File.expand_path pid_file
66
-
67
- begin
68
- pid = File.read(pid_file).to_i
69
- rescue
70
- raise PIDReadError, pid_file
71
- end
72
-
73
- raise PIDReadError, pid_file if pid.nil?
74
-
75
- say "Stopping Adhearsion server at #{path} with pid #{pid}"
76
- waiting_timeout = Time.now + 15
77
- begin
78
- ::Process.kill "TERM", pid
79
- sleep 0.25 while process_exists?(pid) && Time.now < waiting_timeout
80
- ::Process.kill "KILL", pid
81
- rescue Errno::ESRCH
82
- end
83
-
84
- File.delete pid_file if File.exists? pid_file
85
- end
86
-
87
- desc "restart </path/to/directory>", "Restart the Adhearsion server"
88
- method_option :pidfile, :type => :string, :aliases => %w(--pid-file)
89
- def restart(path = nil)
90
43
  path = execute_from_app_dir! path
91
- begin
92
- invoke :stop
93
- rescue PIDReadError => e
94
- puts e.message
95
- end
96
- invoke :daemon
44
+ say "Starting Adhearsion server at #{Dir.pwd}"
45
+ Adhearsion::Initializer.start :console => !options[:noconsole]
97
46
  end
98
47
 
99
48
  protected
100
49
 
101
- def start_app(path, mode, pid_file = nil)
102
- path = execute_from_app_dir! path
103
- say "Starting Adhearsion server at #{Dir.pwd}"
104
- Adhearsion::Initializer.start :mode => mode, :pid_file => pid_file
105
- end
106
-
107
50
  def execute_from_app_dir!(path)
108
51
  if in_app? and running_script_ahn?
109
52
  return Dir.pwd
@@ -130,12 +73,6 @@ module Adhearsion
130
73
  ScriptAhnLoader.in_ahn_application? or ScriptAhnLoader.in_ahn_application_subdirectory?
131
74
  end
132
75
 
133
- def process_exists?(pid = nil)
134
- # FIXME: Raise some error here
135
- return false if pid.nil?
136
- `ps -p #{pid} | sed -e '1d'`.strip.empty?
137
- end
138
-
139
76
  def method_missing(action, *args)
140
77
  help
141
78
  raise UnknownCommand, [action, *args] * " "
@@ -26,11 +26,5 @@ module Adhearsion
26
26
  super "Directory #{path} does not belong to an Adhearsion project!"
27
27
  end
28
28
  end
29
-
30
- class PIDReadError < Thor::Error
31
- def initialize(path)
32
- super "Could not read pid from the file #{path}"
33
- end
34
- end
35
29
  end
36
30
  end
@@ -7,22 +7,35 @@ module Adhearsion
7
7
 
8
8
  ConfigurationError = Class.new Adhearsion::Error # Error raised while trying to configure a non existent plugin
9
9
 
10
+ def self.validate_number(value)
11
+ return 1.0/0.0 if ["Infinity", 1.0/0.0].include? value
12
+ value.to_i
13
+ end
14
+
15
+ def self.default_port_for_platform(platform)
16
+ case platform
17
+ when :asterisk then 5038
18
+ when :xmpp then 5222
19
+ else nil
20
+ end
21
+ end
22
+
10
23
  ##
11
24
  # Initialize the configuration object
12
25
  #
13
- # * &block platform configuration block
26
+ # * &block core configuration block
14
27
  # Adhearsion::Configuration.new do
15
28
  # foo "bar", :desc => "My description"
16
29
  # end
17
30
  #
18
31
  # @return [Adhearsion::Configuration]
19
- def initialize(&block)
20
- initialize_environments
32
+ def initialize(env = :development, &block)
33
+ initialize_environments env
21
34
 
22
35
  Loquacious.env_config = true
23
36
  Loquacious.env_prefix = "AHN"
24
37
 
25
- Loquacious::Configuration.for :platform do
38
+ Loquacious::Configuration.for :core do
26
39
  root nil, :desc => "Adhearsion application root folder"
27
40
 
28
41
  lib "lib", :desc => <<-__
@@ -31,30 +44,41 @@ module Adhearsion
31
44
  want these files to be loaded. This folder is relative to the application root folder.
32
45
  __
33
46
 
34
- environment :development, :transform => Proc.new { |v| v.to_sym }, :desc => <<-__
35
- Active environment. Supported values: development, production, staging, test
36
- __
37
-
38
47
  process_name "ahn", :desc => <<-__
39
48
  Adhearsion process name, useful to make it easier to find in the process list
40
49
  Pro tip: set this to your application's name and you can do "killall myapp"
41
50
  Does not work under JRuby.
42
51
  __
43
52
 
53
+ event_threads 5, transform: Proc.new { |v| Adhearsion::Configuration.validate_number v }, desc: <<-__
54
+ The number of threads to include in the event worker pool."
55
+ __
56
+
44
57
  desc "Log configuration"
45
58
  logging {
46
59
  level :info, :transform => Proc.new { |v| v.to_sym }, :desc => <<-__
47
60
  Supported levels (in increasing severity) -- :trace < :debug < :info < :warn < :error < :fatal
48
61
  __
49
- outputters ["log/adhearsion.log"], :transform => Proc.new { |val| Array(val) }, :desc => <<-__
50
- An array of log outputters to use. The default is to log to stdout and log/adhearsion.log.
51
- Each item must be either a string to use as a filename, or a valid Logging appender (see http://github.com/TwP/logging)
52
- __
53
62
  formatter nil, :desc => <<-__
54
- A log formatter to apply to all active outputters. If nil, the Adhearsion default formatter will be used.
63
+ A log formatter to apply to the stream. If nil, the Adhearsion default formatter will be used.
55
64
  __
56
65
  }
57
66
 
67
+ type :xmpp , :transform => Proc.new { |v| v.to_sym }, :desc => <<-__
68
+ Platform used to connect to the Telephony provider. Currently supported values:
69
+ - :xmpp
70
+ - :asterisk
71
+ __
72
+ username "usera@127.0.0.1", :desc => "Authentication credentials"
73
+ password "1" , :desc => "Authentication credentials"
74
+ host nil , :desc => "Host to connect to (where rayo/asterisk is located)"
75
+ port Proc.new { Adhearsion::Configuration.default_port_for_platform type }, :transform => Proc.new { |v| Adhearsion::Configuration.validate_number v }, :desc => "Port used to connect"
76
+ certs_directory nil , :desc => "Directory containing certificates for securing the connection."
77
+ root_domain nil , :desc => "The root domain at which to address the server"
78
+ connection_timeout 60 , :transform => Proc.new { |v| Adhearsion::Configuration.validate_number v }, :desc => "The amount of time to wait for a connection"
79
+ reconnect_attempts 1.0/0.0 , :transform => Proc.new { |v| Adhearsion::Configuration.validate_number v }, :desc => "The number of times to (re)attempt connection to the server"
80
+ reconnect_timer 5 , :transform => Proc.new { |v| Adhearsion::Configuration.validate_number v }, :desc => "Delay between connection attempts"
81
+
58
82
  after_hangup_lifetime 1, :transform => Proc.new { |v| v.to_i }, :desc => <<-__
59
83
  Lifetime of a call after it has hung up. Should be set to the minimum functional value for your application. Call actors (threads) living after hangup consume more system resources and reduce the concurrent call capacity of your application.
60
84
  __
@@ -63,19 +87,57 @@ module Adhearsion
63
87
  media {
64
88
  default_voice nil, desc: 'The default voice used for all output. Set nil to use platform default.'
65
89
  default_renderer nil, desc: 'The default renderer used for all output. Set nil to use platform default.'
90
+
91
+ min_confidence 0.5, desc: 'The default minimum confidence level used for all recognizer invocations.', transform: Proc.new { |v| v.to_f }
92
+ timeout 5, desc: 'The default timeout (in seconds) used for all recognizer invocations.', transform: Proc.new { |v| v.to_i }
93
+ inter_digit_timeout 2, desc: 'The timeout used between DTMF digits and to terminate partial invocations', transform: Proc.new { |v| v.to_i }
94
+ recognizer nil, desc: 'The default recognizer used for all input. Set nil to use platform default.'
95
+ input_language 'en-US', desc: 'The default language set on generated grammars. Set nil to use platform default.'
66
96
  }
97
+
98
+ desc "Internationalisation"
99
+ i18n {
100
+ locale_path ["config/locales"], transform: Proc.new { |v| v.split ':' }, desc: <<-__
101
+ List of directories from which to load locale data, colon-delimited
102
+ __
103
+ audio_path "app/assets/audio", desc: <<-__
104
+ Base path from which audio files can be found. May be a filesystem path or some other URL (like HTTP)
105
+ __
106
+ fallback true, desc: <<-__
107
+ Whether to include text for translations that provide both text & audio. True or false.
108
+ __
109
+ }
110
+
111
+ desc "HTTP server"
112
+ http do
113
+ enable true, desc: "Enable or disable the HTTP server"
114
+ host "0.0.0.0", desc: "IP to bind the HTTP listener to"
115
+ port "8080", desc: "Port to bind the HTTP listener to"
116
+ rackup 'config.ru', desc: 'Path to Rack configuration file (relative to Adhearsion application root)'
117
+ end
67
118
  end
68
119
 
69
- Loquacious::Configuration.for :platform, &block if block_given?
120
+ Loquacious::Configuration.for :core, &block if block_given?
70
121
 
71
122
  self
72
123
  end
73
124
 
74
- def initialize_environments
125
+ def initialize_environments(active_environment)
75
126
  # Create a method per each valid environment that, when invoked, may execute
76
127
  # the block received if the environment is active
77
- valid_environments.each do |enviro|
78
- add_environment enviro
128
+ valid_environments.each do |env|
129
+ define_singleton_method env.to_sym do |*args, &block|
130
+ logger.trace "Ignoring configuration for inactive environment #{env}"
131
+ end
132
+ end
133
+
134
+ define_singleton_method active_environment do |*args, &block|
135
+ self.instance_eval(&block) unless block.nil?
136
+ self
137
+ end
138
+
139
+ if valid_environment?(active_environment)
140
+ logger.warn "You tried to initialize with an invalid environment name #{active_environment}; environment-specific config may not load successfully. Valid values are #{valid_environments}."
79
141
  end
80
142
  end
81
143
 
@@ -87,20 +149,10 @@ module Adhearsion
87
149
  @valid_environments ||= [:production, :development, :staging, :test]
88
150
  end
89
151
 
90
- def add_environment(env)
91
- return if self.class.method_defined? env.to_sym
92
- self.class.send(:define_method, env.to_sym) do |*args, &block|
93
- unless block.nil? || env != self.platform.environment.to_sym
94
- self.instance_eval(&block)
95
- end
96
- self
97
- end
98
- end
99
-
100
152
  ##
101
153
  # Direct access to a specific configuration object
102
154
  #
103
- # Adhearsion.config[:platform] => returns the configuration object associated to the Adhearsion platform
155
+ # Adhearsion.config[:core] => returns the configuration object associated with Adhearsion core
104
156
  #
105
157
  # @return [Loquacious::Configuration] configuration object or nil if the plugin does not exist
106
158
  def [](value)
@@ -119,33 +171,33 @@ module Adhearsion
119
171
 
120
172
  # root accessor
121
173
  def root
122
- platform.root
174
+ core.root
123
175
  end
124
176
 
125
177
  ##
126
- # Handle the Adhearsion platform configuration
178
+ # Handle the Adhearsion core configuration
127
179
  #
128
180
  # It accepts a block that will be executed in the Adhearsion config var environment
129
181
  # to update the desired values
130
182
  #
131
- # Adhearsion.config.platform do
183
+ # Adhearsion.config.core do
132
184
  # foo "bar", :desc => "My new description"
133
185
  # end
134
186
  #
135
- # values = Adhearsion.config.platform
187
+ # values = Adhearsion.config.core
136
188
  # values.foo => "bar"
137
189
  #
138
190
  # @return [Loquacious::Configuration] configuration object or nil if the plugin does not exist
139
- def platform(&block)
140
- Loquacious::Configuration.for :platform, &block
191
+ def core(&block)
192
+ Loquacious::Configuration.for :core, &block
141
193
  end
142
194
 
143
195
  ##
144
- # Fetchs the configuration info for the Adhearsion platform or a specific plugin
196
+ # Fetchs the configuration info for the Adhearsion core or a specific plugin
145
197
  # @param name [Symbol]
146
- # - :all => Adhearsion platform and all the loaded plugins
147
- # - nil => Adhearsion platform configuration
148
- # - :platform => Adhearsion platform configuration
198
+ # - :all => Adhearsion core and all the loaded plugins
199
+ # - nil => Adhearsion core configuration
200
+ # - :core => Adhearsion core configuration
149
201
  # - :<plugin-config-name> => Adhearsion plugin configuration
150
202
  #
151
203
  # @param args [Hash]
@@ -155,7 +207,7 @@ module Adhearsion
155
207
  def description(name, args = {:show_values => true})
156
208
  desc = StringIO.new
157
209
 
158
- name.nil? and name = :platform
210
+ name.nil? and name = :core
159
211
  if name.eql? :all
160
212
  value = ""
161
213
  Loquacious::Configuration.instance_variable_get("@table").keys.map do |config|