adhearsion 1.2.6 → 2.0.0.alpha1

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 (236) hide show
  1. data/.gitignore +17 -10
  2. data/CHANGELOG.md +273 -0
  3. data/Gemfile +1 -1
  4. data/Guardfile +17 -0
  5. data/README.markdown +61 -9
  6. data/Rakefile +16 -48
  7. data/adhearsion.gemspec +21 -7
  8. data/bin/ahn +3 -1
  9. data/cucumber.yml +4 -0
  10. data/features/app_generator.feature +42 -0
  11. data/features/cli.feature +108 -0
  12. data/features/step_definitions/app_generator_steps.rb +6 -0
  13. data/features/step_definitions/cli_steps.rb +74 -0
  14. data/features/support/aruba_helper.rb +22 -0
  15. data/features/support/env.rb +37 -0
  16. data/features/support/utils.rb +8 -0
  17. data/lib/adhearsion.rb +85 -41
  18. data/lib/adhearsion/call.rb +176 -0
  19. data/lib/adhearsion/call_controller.rb +134 -0
  20. data/lib/adhearsion/call_controller/dial.rb +70 -0
  21. data/lib/adhearsion/call_controller/input.rb +173 -0
  22. data/lib/adhearsion/call_controller/menu.rb +124 -0
  23. data/lib/adhearsion/call_controller/output.rb +267 -0
  24. data/lib/adhearsion/call_controller/record.rb +42 -0
  25. data/lib/adhearsion/call_controller/utility.rb +60 -0
  26. data/lib/adhearsion/calls.rb +81 -0
  27. data/lib/adhearsion/cli.rb +1 -3
  28. data/lib/adhearsion/cli_commands.rb +142 -0
  29. data/lib/adhearsion/configuration.rb +149 -0
  30. data/lib/adhearsion/console.rb +19 -8
  31. data/lib/adhearsion/dialplan_controller.rb +9 -0
  32. data/lib/adhearsion/events.rb +84 -0
  33. data/lib/adhearsion/foundation/all.rb +0 -7
  34. data/lib/adhearsion/foundation/custom_daemonizer.rb +4 -6
  35. data/lib/adhearsion/foundation/exception_handler.rb +9 -0
  36. data/lib/adhearsion/foundation/object.rb +26 -8
  37. data/lib/adhearsion/foundation/synchronized_hash.rb +3 -6
  38. data/lib/adhearsion/foundation/thread_safety.rb +17 -1
  39. data/lib/adhearsion/generators/app/app_generator.rb +4 -13
  40. data/lib/adhearsion/generators/app/templates/Gemfile +10 -5
  41. data/lib/adhearsion/generators/app/templates/Procfile +1 -0
  42. data/lib/adhearsion/generators/app/templates/README.md +28 -0
  43. data/lib/adhearsion/generators/app/templates/config/adhearsion.rb +41 -0
  44. data/lib/adhearsion/generators/app/templates/{components/simon_game → lib}/simon_game.rb +6 -18
  45. data/lib/adhearsion/generators/app/templates/script/ahn +2 -2
  46. data/lib/adhearsion/initializer.rb +151 -293
  47. data/lib/adhearsion/initializer/logging.rb +33 -0
  48. data/lib/adhearsion/logging.rb +65 -69
  49. data/lib/adhearsion/menu_dsl.rb +15 -0
  50. data/lib/adhearsion/menu_dsl/calculated_match.rb +39 -0
  51. data/lib/adhearsion/menu_dsl/calculated_match_collection.rb +41 -0
  52. data/lib/adhearsion/menu_dsl/fixnum_match_calculator.rb +18 -0
  53. data/lib/adhearsion/menu_dsl/match_calculator.rb +36 -0
  54. data/lib/adhearsion/{voip/menu_state_machine/menu_class.rb → menu_dsl/menu.rb} +38 -40
  55. data/lib/adhearsion/menu_dsl/menu_builder.rb +69 -0
  56. data/lib/adhearsion/menu_dsl/range_match_calculator.rb +55 -0
  57. data/lib/adhearsion/menu_dsl/string_match_calculator.rb +21 -0
  58. data/lib/adhearsion/outbound_call.rb +64 -0
  59. data/lib/adhearsion/plugin.rb +319 -0
  60. data/lib/adhearsion/plugin/collection.rb +19 -0
  61. data/lib/adhearsion/plugin/initializer.rb +37 -0
  62. data/lib/adhearsion/plugin/methods_container.rb +6 -0
  63. data/lib/adhearsion/process.rb +94 -0
  64. data/lib/adhearsion/punchblock_plugin.rb +29 -0
  65. data/lib/adhearsion/punchblock_plugin/initializer.rb +137 -0
  66. data/lib/adhearsion/router.rb +30 -0
  67. data/lib/adhearsion/router/route.rb +42 -0
  68. data/lib/adhearsion/script_ahn_loader.rb +2 -2
  69. data/lib/adhearsion/tasks.rb +14 -9
  70. data/lib/adhearsion/tasks/configuration.rb +26 -0
  71. data/lib/adhearsion/tasks/plugins.rb +17 -0
  72. data/lib/adhearsion/version.rb +8 -14
  73. data/spec/adhearsion/call_controller/dial_spec.rb +138 -0
  74. data/spec/adhearsion/call_controller/input_spec.rb +278 -0
  75. data/spec/adhearsion/call_controller/menu_spec.rb +120 -0
  76. data/spec/adhearsion/call_controller/output_spec.rb +466 -0
  77. data/spec/adhearsion/call_controller/record_spec.rb +125 -0
  78. data/spec/adhearsion/call_controller_spec.rb +395 -0
  79. data/spec/adhearsion/call_spec.rb +438 -0
  80. data/spec/adhearsion/calls_spec.rb +47 -0
  81. data/spec/adhearsion/configuration_spec.rb +308 -0
  82. data/spec/adhearsion/dialplan_controller_spec.rb +26 -0
  83. data/spec/adhearsion/events_spec.rb +112 -0
  84. data/spec/adhearsion/initializer/logging_spec.rb +58 -0
  85. data/spec/adhearsion/initializer_spec.rb +209 -122
  86. data/spec/adhearsion/logging_spec.rb +58 -47
  87. data/spec/adhearsion/menu_dsl/calculated_match_collection_spec.rb +56 -0
  88. data/spec/adhearsion/menu_dsl/calculated_match_spec.rb +57 -0
  89. data/spec/adhearsion/menu_dsl/fixnum_match_calculator_spec.rb +33 -0
  90. data/spec/adhearsion/menu_dsl/match_calculator_spec.rb +13 -0
  91. data/spec/adhearsion/menu_dsl/menu_builder_spec.rb +118 -0
  92. data/spec/adhearsion/menu_dsl/menu_spec.rb +210 -0
  93. data/spec/adhearsion/menu_dsl/range_match_calculator_spec.rb +28 -0
  94. data/spec/adhearsion/menu_dsl/string_match_calculator_spec.rb +36 -0
  95. data/spec/adhearsion/menu_dsl_spec.rb +12 -0
  96. data/spec/adhearsion/outbound_call_spec.rb +174 -0
  97. data/spec/adhearsion/plugin_spec.rb +489 -0
  98. data/spec/adhearsion/process_spec.rb +34 -0
  99. data/spec/adhearsion/punchblock_plugin/initializer_spec.rb +294 -0
  100. data/spec/adhearsion/router/route_spec.rb +99 -0
  101. data/spec/adhearsion/router_spec.rb +106 -0
  102. data/spec/adhearsion_spec.rb +46 -0
  103. data/spec/spec_helper.rb +14 -14
  104. data/spec/support/call_controller_test_helpers.rb +48 -0
  105. data/spec/support/initializer_stubs.rb +8 -13
  106. data/spec/support/punchblock_mocks.rb +6 -0
  107. metadata +255 -253
  108. data/CHANGELOG +0 -174
  109. data/bin/ahnctl +0 -68
  110. data/bin/jahn +0 -43
  111. data/examples/asterisk_manager_interface/standalone.rb +0 -51
  112. data/lib/adhearsion/commands.rb +0 -302
  113. data/lib/adhearsion/component_manager.rb +0 -278
  114. data/lib/adhearsion/component_manager/component_tester.rb +0 -54
  115. data/lib/adhearsion/component_manager/spec_framework.rb +0 -18
  116. data/lib/adhearsion/events_support.rb +0 -65
  117. data/lib/adhearsion/foundation/blank_slate.rb +0 -3
  118. data/lib/adhearsion/foundation/event_socket.rb +0 -205
  119. data/lib/adhearsion/foundation/future_resource.rb +0 -36
  120. data/lib/adhearsion/foundation/metaprogramming.rb +0 -17
  121. data/lib/adhearsion/foundation/numeric.rb +0 -13
  122. data/lib/adhearsion/foundation/pseudo_guid.rb +0 -10
  123. data/lib/adhearsion/foundation/relationship_properties.rb +0 -42
  124. data/lib/adhearsion/foundation/string.rb +0 -26
  125. data/lib/adhearsion/generators/app/templates/.ahnrc +0 -34
  126. data/lib/adhearsion/generators/app/templates/README +0 -8
  127. data/lib/adhearsion/generators/app/templates/components/ami_remote/ami_remote.rb +0 -15
  128. data/lib/adhearsion/generators/app/templates/components/disabled/HOW_TO_ENABLE +0 -7
  129. data/lib/adhearsion/generators/app/templates/components/disabled/stomp_gateway/README.markdown +0 -47
  130. data/lib/adhearsion/generators/app/templates/components/disabled/stomp_gateway/stomp_gateway.rb +0 -34
  131. data/lib/adhearsion/generators/app/templates/components/disabled/stomp_gateway/stomp_gateway.yml +0 -12
  132. data/lib/adhearsion/generators/app/templates/components/disabled/xmpp_gateway/README.markdown +0 -3
  133. data/lib/adhearsion/generators/app/templates/components/disabled/xmpp_gateway/xmpp_gateway.rb +0 -11
  134. data/lib/adhearsion/generators/app/templates/components/disabled/xmpp_gateway/xmpp_gateway.yml +0 -0
  135. data/lib/adhearsion/generators/app/templates/config/startup.rb +0 -81
  136. data/lib/adhearsion/generators/app/templates/dialplan.rb +0 -3
  137. data/lib/adhearsion/generators/app/templates/events.rb +0 -33
  138. data/lib/adhearsion/host_definitions.rb +0 -67
  139. data/lib/adhearsion/initializer/asterisk.rb +0 -86
  140. data/lib/adhearsion/initializer/configuration.rb +0 -324
  141. data/lib/adhearsion/initializer/database.rb +0 -60
  142. data/lib/adhearsion/initializer/drb.rb +0 -31
  143. data/lib/adhearsion/initializer/freeswitch.rb +0 -22
  144. data/lib/adhearsion/initializer/ldap.rb +0 -57
  145. data/lib/adhearsion/initializer/rails.rb +0 -41
  146. data/lib/adhearsion/initializer/xmpp.rb +0 -42
  147. data/lib/adhearsion/tasks/components.rb +0 -32
  148. data/lib/adhearsion/tasks/database.rb +0 -5
  149. data/lib/adhearsion/tasks/deprecations.rb +0 -59
  150. data/lib/adhearsion/tasks/generating.rb +0 -20
  151. data/lib/adhearsion/tasks/lint.rb +0 -4
  152. data/lib/adhearsion/voip/asterisk.rb +0 -4
  153. data/lib/adhearsion/voip/asterisk/agi_server.rb +0 -121
  154. data/lib/adhearsion/voip/asterisk/commands.rb +0 -1966
  155. data/lib/adhearsion/voip/asterisk/config_generators/agents.conf.rb +0 -140
  156. data/lib/adhearsion/voip/asterisk/config_generators/config_generator.rb +0 -102
  157. data/lib/adhearsion/voip/asterisk/config_generators/queues.conf.rb +0 -250
  158. data/lib/adhearsion/voip/asterisk/config_generators/voicemail.conf.rb +0 -240
  159. data/lib/adhearsion/voip/asterisk/config_manager.rb +0 -64
  160. data/lib/adhearsion/voip/asterisk/manager_interface.rb +0 -697
  161. data/lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rb +0 -1681
  162. data/lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb +0 -341
  163. data/lib/adhearsion/voip/asterisk/manager_interface/ami_messages.rb +0 -78
  164. data/lib/adhearsion/voip/asterisk/manager_interface/ami_protocol_lexer_machine.rl +0 -87
  165. data/lib/adhearsion/voip/asterisk/special_dial_plan_managers.rb +0 -80
  166. data/lib/adhearsion/voip/call.rb +0 -521
  167. data/lib/adhearsion/voip/call_routing.rb +0 -64
  168. data/lib/adhearsion/voip/commands.rb +0 -17
  169. data/lib/adhearsion/voip/constants.rb +0 -39
  170. data/lib/adhearsion/voip/conveniences.rb +0 -18
  171. data/lib/adhearsion/voip/dial_plan.rb +0 -252
  172. data/lib/adhearsion/voip/dsl/dialing_dsl.rb +0 -151
  173. data/lib/adhearsion/voip/dsl/dialing_dsl/dialing_dsl_monkey_patches.rb +0 -37
  174. data/lib/adhearsion/voip/dsl/dialplan/control_passing_exception.rb +0 -27
  175. data/lib/adhearsion/voip/dsl/dialplan/dispatcher.rb +0 -124
  176. data/lib/adhearsion/voip/dsl/dialplan/parser.rb +0 -69
  177. data/lib/adhearsion/voip/dsl/dialplan/thread_mixin.rb +0 -16
  178. data/lib/adhearsion/voip/dsl/numerical_string.rb +0 -128
  179. data/lib/adhearsion/voip/freeswitch/basic_connection_manager.rb +0 -48
  180. data/lib/adhearsion/voip/freeswitch/event_handler.rb +0 -58
  181. data/lib/adhearsion/voip/freeswitch/freeswitch_dialplan_command_factory.rb +0 -129
  182. data/lib/adhearsion/voip/freeswitch/inbound_connection_manager.rb +0 -38
  183. data/lib/adhearsion/voip/freeswitch/oes_server.rb +0 -195
  184. data/lib/adhearsion/voip/menu_state_machine/calculated_match.rb +0 -80
  185. data/lib/adhearsion/voip/menu_state_machine/matchers.rb +0 -123
  186. data/lib/adhearsion/voip/menu_state_machine/menu_builder.rb +0 -57
  187. data/lib/adhearsion/xmpp/connection.rb +0 -61
  188. data/lib/theatre.rb +0 -147
  189. data/lib/theatre/README.markdown +0 -64
  190. data/lib/theatre/callback_definition_loader.rb +0 -86
  191. data/lib/theatre/guid.rb +0 -23
  192. data/lib/theatre/invocation.rb +0 -131
  193. data/lib/theatre/namespace_manager.rb +0 -153
  194. data/lib/theatre/version.rb +0 -2
  195. data/spec/adhearsion/cli_spec.rb +0 -306
  196. data/spec/adhearsion/component_manager_spec.rb +0 -292
  197. data/spec/adhearsion/constants_spec.rb +0 -8
  198. data/spec/adhearsion/drb_spec.rb +0 -65
  199. data/spec/adhearsion/fixtures/dialplan.rb +0 -3
  200. data/spec/adhearsion/foundation/event_socket_spec.rb +0 -168
  201. data/spec/adhearsion/host_definitions_spec.rb +0 -79
  202. data/spec/adhearsion/initializer/configuration_spec.rb +0 -291
  203. data/spec/adhearsion/initializer/loading_spec.rb +0 -154
  204. data/spec/adhearsion/initializer/paths_spec.rb +0 -74
  205. data/spec/adhearsion/relationship_properties_spec.rb +0 -54
  206. data/spec/adhearsion/voip/asterisk/agi_server_spec.rb +0 -473
  207. data/spec/adhearsion/voip/asterisk/ami/ami_spec.rb +0 -550
  208. data/spec/adhearsion/voip/asterisk/ami/lexer/ami_fixtures.yml +0 -30
  209. data/spec/adhearsion/voip/asterisk/ami/lexer/lexer_story +0 -291
  210. data/spec/adhearsion/voip/asterisk/ami/lexer/lexer_story.rb +0 -241
  211. data/spec/adhearsion/voip/asterisk/ami/lexer/story_helper.rb +0 -124
  212. data/spec/adhearsion/voip/asterisk/commands_spec.rb +0 -3241
  213. data/spec/adhearsion/voip/asterisk/config_file_generators/agents_spec.rb +0 -251
  214. data/spec/adhearsion/voip/asterisk/config_file_generators/queues_spec.rb +0 -323
  215. data/spec/adhearsion/voip/asterisk/config_file_generators/voicemail_spec.rb +0 -306
  216. data/spec/adhearsion/voip/asterisk/config_manager_spec.rb +0 -127
  217. data/spec/adhearsion/voip/asterisk/menu_command/calculated_match_spec.rb +0 -109
  218. data/spec/adhearsion/voip/asterisk/menu_command/matchers_spec.rb +0 -97
  219. data/spec/adhearsion/voip/call_routing_spec.rb +0 -125
  220. data/spec/adhearsion/voip/dialplan_manager_spec.rb +0 -468
  221. data/spec/adhearsion/voip/dsl/dialing_dsl_spec.rb +0 -270
  222. data/spec/adhearsion/voip/dsl/dispatcher_spec.rb +0 -82
  223. data/spec/adhearsion/voip/dsl/dispatcher_spec_helper.rb +0 -45
  224. data/spec/adhearsion/voip/dsl/parser_spec.rb +0 -69
  225. data/spec/adhearsion/voip/freeswitch/basic_connection_manager_spec.rb +0 -39
  226. data/spec/adhearsion/voip/freeswitch/inbound_connection_manager_spec.rb +0 -39
  227. data/spec/adhearsion/voip/freeswitch/oes_server_spec.rb +0 -9
  228. data/spec/adhearsion/voip/numerical_string_spec.rb +0 -61
  229. data/spec/adhearsion/voip/phone_number_spec.rb +0 -45
  230. data/spec/support/the_following_code.rb +0 -3
  231. data/spec/theatre/dsl_examples/simple_before_call.rb +0 -7
  232. data/spec/theatre/dsl_spec.rb +0 -69
  233. data/spec/theatre/invocation_spec.rb +0 -182
  234. data/spec/theatre/namespace_spec.rb +0 -125
  235. data/spec/theatre/spec_helper_spec.rb +0 -28
  236. data/spec/theatre/theatre_class_spec.rb +0 -148
@@ -1,37 +0,0 @@
1
- module Adhearsion
2
- module VoIP
3
- module DSL
4
- class DialingDSL
5
- module MonkeyPatches
6
- module RegexpMonkeyPatch
7
-
8
- def |(other)
9
- case other
10
- when RouteRule
11
- other.unshift_pattern self
12
- other
13
- when Regexp
14
- RouteRule.new :patterns => [self, other]
15
- else
16
- raise ArgumentError, "Unsupported pattern type #{other.inspect}"
17
- end
18
- end
19
-
20
- def >>(other)
21
- case other
22
- when ProviderDefinition
23
- RouteRule.new :patterns => self, :providers => other
24
- when RouteRule
25
- other.tap do |route|
26
- route.unshift_pattern self
27
- end
28
- else raise ArgumentError, "Unsupported route definition #{other.inspect}"
29
- end
30
- end
31
-
32
- end
33
- end
34
- end
35
- end
36
- end
37
- end
@@ -1,27 +0,0 @@
1
- module Adhearsion
2
- module VoIP
3
- module DSL
4
- module Dialplan
5
- # A ControlPassingException is used internally to stop execution of one
6
- # dialplan context and begin execution of another proc instead. It is
7
- # most notably used by the ~@ unary operator that can be called on a
8
- # context name within a dialplan to transfer control entirely to that
9
- # particular context. The serve() method in the servlet_container actually
10
- # rescues these exceptions specifically and then does +e.target to execute
11
- # that code.
12
- class ControlPassingException < StandardError
13
-
14
- attr_reader :target
15
-
16
- def initialize(target)
17
- super()
18
- @target = target
19
- end
20
-
21
- end
22
-
23
- class ContextNotFoundException < StandardError; end
24
- end
25
- end
26
- end
27
- end
@@ -1,124 +0,0 @@
1
- module Adhearsion
2
- module VoIP
3
- module DSL
4
- module Dialplan
5
-
6
- class ReturnValue < StandardError
7
- attr_reader :obj
8
- def initialize(obj)
9
- @obj = obj
10
- super
11
- end
12
- end
13
-
14
- class Hangup < StandardError; end
15
-
16
- # Instantiated and returned in every dialplan command
17
- class EventCommand
18
-
19
- attr_accessor :app, :args, :response_block, :returns, :on_keypress
20
-
21
- def initialize(app, *args, &block)
22
- @hash = args.pop if args.last.kind_of?(Hash)
23
- @app, @args = app, args
24
-
25
- if @hash
26
- @returns = @hash[:returns] || :raw
27
- @on_keypress = @hash[:on_keypress]
28
- end
29
-
30
- @response_block = block if block_given?
31
- end
32
-
33
- def on_keypress(&block)
34
- block_given? ? @on_keypress = block : @on_keypress
35
- end
36
-
37
- def on_break(&block)
38
- block_given? ? @on_break = block : @on_break
39
- end
40
-
41
- end
42
-
43
- class NoOpEventCommand < EventCommand
44
- attr_reader :timeout, :on_keypress
45
- def initialize(timeout=nil, hash={})
46
- @timeout = timeout
47
- @on_keypress = hash[:on_keypress]
48
- end
49
- end
50
-
51
- class ExitingEventCommand < EventCommand; end
52
-
53
- # Serves as a EventCommand proxy for handling EventCommands. Useful
54
- # if doing any pre-processing.
55
- #
56
- # For example, when sending commands over the event socket to FreeSwitch,
57
- # every command must start with "api", but, when doing an originate, it
58
- # must begin with an ampersand. These two pre-processors would be developed
59
- # as separate CommandDispatchers.
60
- class CommandDispatcher
61
-
62
- attr_reader :factory, :context
63
-
64
- def initialize(factory, context=nil)
65
- @context = context
66
- @factory = factory.new context
67
- end
68
-
69
- def dispatch!(event_command)
70
- raise NotImplementedError, "Must subclass #{self.class} and override this!"
71
- end
72
-
73
- def method_missing(name, *args, &block)
74
- *commands = *@factory.send(name, *args, &block)
75
- commands.map do |command|
76
- if command.kind_of? Proc
77
- instance_eval(&command)
78
- elsif command.kind_of? EventCommand
79
- dispatched_command = dispatch! command
80
- if command.response_block
81
- while (new_cmd = command.response_block.call(dispatched_command)).kind_of? EventCommand
82
- dispatched_command = dispatch! new_cmd
83
- end
84
- end
85
- dispatched_command
86
- else
87
- command
88
- end
89
- end.last
90
- rescue ReturnValue => r
91
- return r.obj
92
- end
93
-
94
- def return!(obj)
95
- raise DSL::Dialplan::ReturnValue.new(obj)
96
- end
97
-
98
- def break!(uuid=@context)
99
- raise NotImplementedError, "Must subclass #{self.class} and override this!"
100
- end
101
-
102
- # Takes a Hash and meta_def()'s a method for each key that returns
103
- # the key's value in the Hash.
104
- def def_keys!(hash)
105
- hash.each_pair do |k,v|
106
- meta_def(k) { v } rescue nil
107
- end
108
- end
109
-
110
- def clone
111
- super.tap do |nemesis|
112
- instance_variables.each do |iv|
113
- value = instance_variable_get(iv)
114
- nemesis.instance_variable_set iv, value.clone if value
115
- end
116
- end
117
- end
118
-
119
- end
120
-
121
- end
122
- end
123
- end
124
- end
@@ -1,69 +0,0 @@
1
- require 'ostruct'
2
-
3
- module Adhearsion
4
- module VoIP
5
- module DSL
6
- module Dialplan
7
- #TODO: This is obsolete, but we still need it for Freeswitch until we port that to the new 0.8.0 APIs
8
- module DialplanParser
9
-
10
- # Create a container and then clone that. when the container is created
11
- # it should have all the contexts meta_def'd into it. for each call coming
12
- # in, the cloned copy has the variables meta_def'd and set as instance
13
- # variables
14
-
15
- #TODO: separate into smaller pieces
16
- def self.get_contexts
17
- envelope = ContextsEnvelope.new
18
-
19
- dialplans = AHN_CONFIG.files_from_setting "paths", "dialplan"
20
- ahn_log.dialplan.warn "No dialplan files were found!" if dialplans.empty?
21
-
22
- {}.tap do |contexts|
23
- dialplans.each do |file|
24
- raise "Dialplan file #{file} does not exist!" unless File.exists? file
25
- envelope.instance_eval do
26
- eval File.read(file)
27
- end
28
- current_contexts = envelope.parsed_contexts
29
- current_contexts.each_pair do |name, block|
30
- if contexts.has_key? name
31
- warn %'Dialplan context "#{name}" exists in both #{contexts[name].file} and #{file}.' +
32
- %' Using the "#{name}" context from #{contexts[name].file}.'
33
- else
34
- contexts[name] = OpenStruct.new.tap do |metadata|
35
- metadata.file = file
36
- metadata.name = name
37
- metadata.block = block
38
- end
39
- end
40
- end
41
- end
42
- end
43
- end
44
- end
45
-
46
- class ContextsEnvelope
47
-
48
- keep = [:define_method, :instance_eval, :meta_def, :meta_eval, :metaclass, :methods, :object_id]
49
- (instance_methods.map{|m| m.to_sym} - keep).each { |m| undef_method m unless m.to_s =~ /^__/ }
50
-
51
- def initialize
52
- @parsed_contexts = {}
53
- end
54
-
55
- attr_reader :parsed_contexts
56
-
57
- def method_missing(name, *args, &block)
58
- super unless block_given?
59
- @parsed_contexts[name] = block
60
- meta_def(name) { block }
61
- end
62
-
63
- end
64
-
65
- end
66
-
67
- end
68
- end
69
- end
@@ -1,16 +0,0 @@
1
- require 'ostruct'
2
- module Adhearsion
3
- module VoIP
4
- module DSL
5
- module Dialplan
6
- module ThreadMixin
7
-
8
- def call
9
- @thread_call_struct ||= OpenStruct.new
10
- end
11
-
12
- end
13
- end
14
- end
15
- end
16
- end
@@ -1,128 +0,0 @@
1
- module Adhearsion
2
- module VoIP
3
- module DSL
4
- # In Ruby, a number with a leading zero such as 023.45 or 023 does not evaluate as expected.
5
- # In the case of the float 023.45, you get a syntax error. In the case of 023 the number is
6
- # parsed as being in octal form and the number 19 is returned.
7
- #
8
- # In Adhearsion, various strings that are entirely numeric might start with zero and that zero
9
- # should be preserved when converting that string of numbers into a number. The numerical string
10
- # retains the zero while still allowing it to be compared to other numbers.
11
- #
12
- # [[I think this leading zero thing is only part of the reason that NumericalString exists. I'm
13
- # currently writing tests for this leading zero stuff so I thought I'd dump some of my assumptions
14
- # about it here in the documentation.]]
15
- class NumericalString
16
- class << self
17
- def starts_with_leading_zero?(string)
18
- string.to_s[/^0\d+/]
19
- end
20
- end
21
-
22
- (instance_methods.map{|m| m.to_sym} - [:instance_eval, :object_id, :class]).each { |m| undef_method m unless m.to_s =~ /^__/ }
23
-
24
- attr_reader :__real_num, :__real_string
25
-
26
- def initialize(str)
27
- @__real_string = str.to_s
28
- @__real_num = str.to_i if @__real_string =~ /^\d+$/
29
- end
30
-
31
- def method_missing(name, *args, &block)
32
- @__real_string.__send__ name, *args, &block
33
- end
34
-
35
- def respond_to?(m)
36
- @__real_string.respond_to?(m) || m == :__real_num || m == :__real_string
37
- end
38
-
39
- def ==(x)
40
- return x.is_a?(Fixnum) ? x == @__real_num : x == @__real_string
41
- end
42
- alias :=== :==
43
-
44
- def is_a?(obj)
45
- case obj.to_s
46
- when "Fixnum" then true
47
- when "String" then true
48
- end
49
- end
50
- alias :kind_of? :is_a?
51
-
52
- end
53
-
54
- # The PhoneNumber class is used by one object throughout Adhearsion: the AGI
55
- # "extension" variable. Using some clevery Ruby hackery, the Extension class allows
56
- # dialplan writers to use the best of Fixnum and String usage such as
57
- #
58
- # - Dialing international numbers
59
- # - Using a regexp in a case statement for "extension"
60
- # - Using a numerical range against extension -- e.g. (100...200)
61
- # - Using the thousands separator
62
- class PhoneNumber < NumericalString
63
-
64
- # Checks against a pattern identifying US local numbers (i.e numbers
65
- # without an area code seven digits long)
66
- def us_local_number?() to_s =~ Adhearsion::VoIP::Constants::US_LOCAL_NUMBER end
67
-
68
- # Checks against a pattern identifying US domestic numbers.
69
- def us_national_number?() to_s =~ Adhearsion::VoIP::Constants::US_NATIONAL_NUMBER end
70
-
71
- # Checks against a pattern identifying an ISN number. See http://freenum.org
72
- # for more info.
73
- def isn?() to_s =~ Adhearsion::VoIP::Constants::ISN end
74
-
75
- # Useful for dialing those 1-800-FUDGEME type numbers with letters in them. Letters
76
- # in the argument will be converted to their appropriate keypad key.
77
- def self.from_vanity str
78
- str.gsub(/\W/, '').upcase.tr('A-Z', '22233344455566677778889999')
79
- end
80
-
81
- end
82
-
83
- end
84
- end
85
- end
86
-
87
- # These monkey patches are necessary for the NumericalString to work, unfortunately.
88
- class Class
89
- def alias_method_once(new_name, old_name)
90
- unless instance_methods.map{|m| m.to_sym}.include?(new_name.to_sym)
91
- alias_method(new_name, old_name)
92
- end
93
- end
94
- end
95
-
96
- [Object, Range, class << String; self; end].each do |klass|
97
- klass.alias_method_once(:pre_modified_threequal, :===)
98
- end
99
-
100
- class Object
101
- def ===(arg)
102
- if arg.respond_to? :__real_string
103
- arg = arg.__real_num if kind_of?(Numeric) || kind_of?(Range)
104
- pre_modified_threequal arg
105
- else
106
- pre_modified_threequal arg
107
- end
108
- end
109
- end
110
-
111
- class Range
112
- alias_method_once(:original_threequal, :===)
113
- def ===(arg)
114
- if (arg.respond_to? :__real_string) && !arg.__real_num.nil?
115
- arg = arg.__real_num
116
- original_threequal arg
117
- else
118
- original_threequal arg
119
- end
120
- end
121
- end
122
-
123
- class << String
124
- alias_method_once(:original_threequal, :===)
125
- def ===(arg)
126
- arg.respond_to?(:__real_string) || original_threequal(arg)
127
- end
128
- end
@@ -1,48 +0,0 @@
1
- module Adhearsion
2
- module VoIP
3
- module FreeSwitch
4
-
5
- class BasicConnectionManager
6
-
7
- def initialize(io)
8
- @io = io
9
- end
10
-
11
- # The send-command operator
12
- def <<(str)
13
- @io.write str + "\n\n"
14
- end
15
-
16
- def get_header
17
- separate_pairs get_raw_header
18
- end
19
-
20
- def get_raw_header
21
- ([].tap do |lines|
22
- until line = @io.gets and line.chomp.empty?
23
- lines << line.chomp
24
- end
25
- end) * "\n"
26
- end
27
-
28
- def next_event
29
- header = get_raw_header
30
- length = header.first[/\d+$/].to_i
31
- # puts "Reading an event of #{length} bytes"
32
- separate_pairs @io.read(length)
33
- end
34
-
35
- def separate_pairs(lines)
36
- lines.split("\n").inject({}) do |h,line|
37
- h.tap do |hash|
38
- k,v = line.split(/\s*:\s*/)
39
- hash[k] = URI.unescape(v).strip if k && v
40
- end
41
- end
42
- end
43
-
44
- end
45
-
46
- end
47
- end
48
- end