rene-adhearsion 0.8.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (115) hide show
  1. data/CHANGELOG +73 -0
  2. data/EVENTS +11 -0
  3. data/LICENSE +456 -0
  4. data/Rakefile +130 -0
  5. data/adhearsion.gemspec +173 -0
  6. data/app_generators/ahn/USAGE +5 -0
  7. data/app_generators/ahn/ahn_generator.rb +96 -0
  8. data/app_generators/ahn/templates/.ahnrc +34 -0
  9. data/app_generators/ahn/templates/README +8 -0
  10. data/app_generators/ahn/templates/Rakefile +25 -0
  11. data/app_generators/ahn/templates/components/ami_remote/ami_remote.rb +15 -0
  12. data/app_generators/ahn/templates/components/disabled/HOW_TO_ENABLE +7 -0
  13. data/app_generators/ahn/templates/components/disabled/restful_rpc/README.markdown +11 -0
  14. data/app_generators/ahn/templates/components/disabled/restful_rpc/example-client.rb +48 -0
  15. data/app_generators/ahn/templates/components/disabled/restful_rpc/restful_rpc.rb +91 -0
  16. data/app_generators/ahn/templates/components/disabled/restful_rpc/restful_rpc.yml +34 -0
  17. data/app_generators/ahn/templates/components/disabled/restful_rpc/spec/restful_rpc_spec.rb +263 -0
  18. data/app_generators/ahn/templates/components/disabled/sandbox/sandbox.rb +104 -0
  19. data/app_generators/ahn/templates/components/disabled/sandbox/sandbox.yml +2 -0
  20. data/app_generators/ahn/templates/components/disabled/stomp_gateway/README.markdown +47 -0
  21. data/app_generators/ahn/templates/components/disabled/stomp_gateway/stomp_gateway.rb +34 -0
  22. data/app_generators/ahn/templates/components/disabled/stomp_gateway/stomp_gateway.yml +12 -0
  23. data/app_generators/ahn/templates/components/disabled/xmpp_gateway/README.markdown +3 -0
  24. data/app_generators/ahn/templates/components/disabled/xmpp_gateway/xmpp_gateway.rb +11 -0
  25. data/app_generators/ahn/templates/components/disabled/xmpp_gateway/xmpp_gateway.yml +0 -0
  26. data/app_generators/ahn/templates/components/simon_game/simon_game.rb +56 -0
  27. data/app_generators/ahn/templates/config/startup.rb +83 -0
  28. data/app_generators/ahn/templates/dialplan.rb +3 -0
  29. data/app_generators/ahn/templates/events.rb +32 -0
  30. data/bin/ahn +28 -0
  31. data/bin/ahnctl +68 -0
  32. data/bin/jahn +42 -0
  33. data/examples/asterisk_manager_interface/standalone.rb +51 -0
  34. data/lib/adhearsion.rb +45 -0
  35. data/lib/adhearsion/cli.rb +228 -0
  36. data/lib/adhearsion/component_manager.rb +272 -0
  37. data/lib/adhearsion/component_manager/component_tester.rb +55 -0
  38. data/lib/adhearsion/component_manager/spec_framework.rb +24 -0
  39. data/lib/adhearsion/events_support.rb +84 -0
  40. data/lib/adhearsion/foundation/all.rb +15 -0
  41. data/lib/adhearsion/foundation/blank_slate.rb +3 -0
  42. data/lib/adhearsion/foundation/custom_daemonizer.rb +45 -0
  43. data/lib/adhearsion/foundation/event_socket.rb +204 -0
  44. data/lib/adhearsion/foundation/future_resource.rb +36 -0
  45. data/lib/adhearsion/foundation/metaprogramming.rb +17 -0
  46. data/lib/adhearsion/foundation/numeric.rb +13 -0
  47. data/lib/adhearsion/foundation/pseudo_guid.rb +10 -0
  48. data/lib/adhearsion/foundation/relationship_properties.rb +42 -0
  49. data/lib/adhearsion/foundation/string.rb +26 -0
  50. data/lib/adhearsion/foundation/synchronized_hash.rb +96 -0
  51. data/lib/adhearsion/foundation/thread_safety.rb +7 -0
  52. data/lib/adhearsion/host_definitions.rb +67 -0
  53. data/lib/adhearsion/initializer.rb +395 -0
  54. data/lib/adhearsion/initializer/asterisk.rb +87 -0
  55. data/lib/adhearsion/initializer/configuration.rb +321 -0
  56. data/lib/adhearsion/initializer/database.rb +60 -0
  57. data/lib/adhearsion/initializer/drb.rb +31 -0
  58. data/lib/adhearsion/initializer/freeswitch.rb +22 -0
  59. data/lib/adhearsion/initializer/ldap.rb +57 -0
  60. data/lib/adhearsion/initializer/rails.rb +41 -0
  61. data/lib/adhearsion/initializer/xmpp.rb +42 -0
  62. data/lib/adhearsion/logging.rb +92 -0
  63. data/lib/adhearsion/tasks.rb +16 -0
  64. data/lib/adhearsion/tasks/database.rb +5 -0
  65. data/lib/adhearsion/tasks/deprecations.rb +59 -0
  66. data/lib/adhearsion/tasks/generating.rb +20 -0
  67. data/lib/adhearsion/tasks/lint.rb +4 -0
  68. data/lib/adhearsion/tasks/testing.rb +37 -0
  69. data/lib/adhearsion/version.rb +33 -0
  70. data/lib/adhearsion/voip/asterisk.rb +4 -0
  71. data/lib/adhearsion/voip/asterisk/agi_server.rb +115 -0
  72. data/lib/adhearsion/voip/asterisk/commands.rb +1510 -0
  73. data/lib/adhearsion/voip/asterisk/config_generators/agents.conf.rb +140 -0
  74. data/lib/adhearsion/voip/asterisk/config_generators/config_generator.rb +101 -0
  75. data/lib/adhearsion/voip/asterisk/config_generators/queues.conf.rb +250 -0
  76. data/lib/adhearsion/voip/asterisk/config_generators/voicemail.conf.rb +240 -0
  77. data/lib/adhearsion/voip/asterisk/config_manager.rb +71 -0
  78. data/lib/adhearsion/voip/asterisk/manager_interface.rb +705 -0
  79. data/lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rb +1680 -0
  80. data/lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb +340 -0
  81. data/lib/adhearsion/voip/asterisk/manager_interface/ami_messages.rb +78 -0
  82. data/lib/adhearsion/voip/asterisk/manager_interface/ami_protocol_lexer_machine.rl +87 -0
  83. data/lib/adhearsion/voip/asterisk/special_dial_plan_managers.rb +80 -0
  84. data/lib/adhearsion/voip/asterisk/super_manager.rb +19 -0
  85. data/lib/adhearsion/voip/call.rb +497 -0
  86. data/lib/adhearsion/voip/call_routing.rb +64 -0
  87. data/lib/adhearsion/voip/commands.rb +9 -0
  88. data/lib/adhearsion/voip/constants.rb +39 -0
  89. data/lib/adhearsion/voip/conveniences.rb +18 -0
  90. data/lib/adhearsion/voip/dial_plan.rb +246 -0
  91. data/lib/adhearsion/voip/dsl/dialing_dsl.rb +151 -0
  92. data/lib/adhearsion/voip/dsl/dialing_dsl/dialing_dsl_monkey_patches.rb +37 -0
  93. data/lib/adhearsion/voip/dsl/dialplan/control_passing_exception.rb +27 -0
  94. data/lib/adhearsion/voip/dsl/dialplan/dispatcher.rb +124 -0
  95. data/lib/adhearsion/voip/dsl/dialplan/parser.rb +69 -0
  96. data/lib/adhearsion/voip/dsl/dialplan/thread_mixin.rb +16 -0
  97. data/lib/adhearsion/voip/dsl/numerical_string.rb +115 -0
  98. data/lib/adhearsion/voip/freeswitch/basic_connection_manager.rb +48 -0
  99. data/lib/adhearsion/voip/freeswitch/event_handler.rb +58 -0
  100. data/lib/adhearsion/voip/freeswitch/freeswitch_dialplan_command_factory.rb +129 -0
  101. data/lib/adhearsion/voip/freeswitch/inbound_connection_manager.rb +38 -0
  102. data/lib/adhearsion/voip/freeswitch/oes_server.rb +195 -0
  103. data/lib/adhearsion/voip/menu_state_machine/calculated_match.rb +80 -0
  104. data/lib/adhearsion/voip/menu_state_machine/matchers.rb +123 -0
  105. data/lib/adhearsion/voip/menu_state_machine/menu_builder.rb +58 -0
  106. data/lib/adhearsion/voip/menu_state_machine/menu_class.rb +149 -0
  107. data/lib/adhearsion/xmpp/connection.rb +61 -0
  108. data/lib/theatre.rb +151 -0
  109. data/lib/theatre/README.markdown +64 -0
  110. data/lib/theatre/callback_definition_loader.rb +84 -0
  111. data/lib/theatre/guid.rb +23 -0
  112. data/lib/theatre/invocation.rb +121 -0
  113. data/lib/theatre/namespace_manager.rb +153 -0
  114. data/lib/theatre/version.rb +2 -0
  115. metadata +241 -0
@@ -0,0 +1,84 @@
1
+ module Theatre
2
+
3
+ ##
4
+ # This class provides the a wrapper aroung which an events.rb file can be instance_eval'd.
5
+ #
6
+ class CallbackDefinitionLoader
7
+
8
+ attr_reader :theatre, :root_name
9
+ def initialize(theatre, root_name=:events)
10
+ @theatre = theatre
11
+ @root_name = root_name
12
+
13
+ create_recorder_method root_name
14
+ end
15
+
16
+ def anonymous_recorder
17
+ BlankSlateMessageRecorder.new(&method(:callback_registered))
18
+ end
19
+
20
+ ##
21
+ # Parses the given Ruby source code file and returns this object.
22
+ #
23
+ # @param [String, File] file The filename or File object for the Ruby source code file to parse.
24
+ #
25
+ def load_events_file(file)
26
+ file = File.open(file) if file.kind_of? String
27
+ instance_eval file.read, file.path
28
+ self
29
+ end
30
+
31
+ ##
32
+ # Parses the given Ruby source code and returns this object.
33
+ #
34
+ # NOTE: Only use this if you're generating the code yourself! If you're loading a file from the filesystem, you should
35
+ # use load_events_file() since load_events_file() will properly attribute errors in the code to the file from which the
36
+ # code was loaded.
37
+ #
38
+ # @param [String] code The Ruby source code to parse
39
+ #
40
+ def load_events_code(code)
41
+ instance_eval code
42
+ self
43
+ end
44
+
45
+ protected
46
+
47
+ ##
48
+ # Immediately register the namespace and callback with the Theatre instance given to the constructor. This method is only
49
+ # called when a new BlankSlateMessageRecorder is instantiated and receives #each().
50
+ #
51
+ def callback_registered(namespaces, callback)
52
+ # Get rid of all arguments passed to the namespaces. Will support arguments in the future.
53
+ namespaces = namespaces.map { |namespace| namespace.first }
54
+
55
+ theatre.namespace_manager.register_callback_at_namespace namespaces, callback
56
+ end
57
+
58
+ def create_recorder_method(record_method_name)
59
+ (class << self; self; end).send(:alias_method, record_method_name, :anonymous_recorder)
60
+ end
61
+
62
+ class BlankSlateMessageRecorder
63
+
64
+ (instance_methods - %w{instance_eval object_id}).each { |method| undef_method method unless method =~ /^__/ }
65
+
66
+ def initialize(&notify_on_completion)
67
+ @notify_on_completion = notify_on_completion
68
+ @namespaces = []
69
+ end
70
+
71
+ def method_missing(*method_name_and_args)
72
+ raise ArgumentError, "Supplying a block is not supported" if block_given?
73
+ @namespaces << method_name_and_args
74
+ self
75
+ end
76
+
77
+ def each(&callback)
78
+ @notify_on_completion.call(@namespaces, callback)
79
+ end
80
+
81
+ end
82
+
83
+ end
84
+ end
@@ -0,0 +1,23 @@
1
+ # Right now Adhearsion also defines this method. The eventual solution will be to extract the Adhearsion features on which
2
+ # Theatre depends and make that a dependent library.
3
+
4
+ unless respond_to? :new_guid
5
+
6
+ def random_character
7
+ case random_digit = rand(62)
8
+ when 0...10 then random_digit.to_s
9
+ when 10...36 then (random_digit + 55).chr
10
+ when 36...62 then (random_digit + 61).chr
11
+ end
12
+ end
13
+
14
+ def random_string(length_of_string=8)
15
+ Array.new(length_of_string) { random_character }.join
16
+ end
17
+
18
+ # This GUID implementation doesn't adhere to the RFC which wants to make certain segments based on the MAC address of a
19
+ # network interface card and other wackiness. It's sufficiently random for our needs.
20
+ def new_guid
21
+ [8,4,4,4,12].map { |segment_length| random_string(segment_length) }.join('-')
22
+ end
23
+ end
@@ -0,0 +1,121 @@
1
+ require 'theatre/guid'
2
+ require 'thread'
3
+ require 'monitor'
4
+
5
+ module Theatre
6
+
7
+ ##
8
+ # An Invocation is an object which Theatre generates and returns from Theatre#trigger.
9
+ #
10
+ class Invocation
11
+
12
+ attr_reader :queued_time, :started_time, :finished_time, :unique_id, :callback, :namespace, :error, :returned_value
13
+
14
+ class InvalidStateError < StandardError; end
15
+
16
+ ##
17
+ # Create a new Invocation.
18
+ #
19
+ # @param [String] namespace The "/foo/bar/qaz" path to the namespace to which this Invocation belongs.
20
+ # @param [Proc] callback The block which should be executed by an Actor scheduler.
21
+ # @param [Object] payload The message that will be sent to the callback for processing.
22
+ #
23
+ def initialize(namespace, callback, payload=:theatre_no_payload)
24
+ raise ArgumentError, "Callback must be a Proc" unless callback.kind_of? Proc
25
+ @payload = payload
26
+ @unique_id = new_guid.freeze
27
+ @callback = callback
28
+ @current_state = :new
29
+ @state_lock = Mutex.new
30
+
31
+ # Used just to protect access to the @returned_value instance variable
32
+ @returned_value_lock = Monitor.new
33
+
34
+ # Used when wait() is called to notify all waiting threads by using a ConditionVariable
35
+ @returned_value_blocker = @returned_value_lock.new_cond#Monitor::ConditionVariable.new @returned_value_lock
36
+ end
37
+
38
+ def queued
39
+ with_state_lock do
40
+ raise InvalidStateError unless @current_state == :new
41
+ @current_state = :queued
42
+ @queued_time = Time.now.freeze
43
+ end
44
+ true
45
+ end
46
+
47
+ def current_state
48
+ with_state_lock { @current_state }
49
+ end
50
+
51
+ def start
52
+ with_state_lock do
53
+ raise InvalidStateError unless @current_state == :queued
54
+ @current_state = :running
55
+ end
56
+ @started_time = Time.now.freeze
57
+
58
+ begin
59
+ self.returned_value = if @payload.equal? :theatre_no_payload
60
+ @callback.call
61
+ else
62
+ @callback.call @payload
63
+ end
64
+ with_state_lock { @current_state = :success }
65
+ rescue => @error
66
+ with_state_lock { @current_state = :error }
67
+ ensure
68
+ @finished_time = Time.now.freeze
69
+ end
70
+ end
71
+
72
+ def execution_duration
73
+ return nil unless @finished_time
74
+ @finished_time - @started_time
75
+ end
76
+
77
+ def error?
78
+ current_state.equal? :error
79
+ end
80
+
81
+ def success?
82
+ current_state.equal? :success
83
+ end
84
+
85
+ ##
86
+ # When this Invocation has been queued, started, and entered either the :success or :error state, this method will
87
+ # finally return. Until then, it blocks the Thread.
88
+ #
89
+ # @return [Object] The result of invoking this Invocation's callback
90
+ #
91
+ def wait
92
+ with_returned_value_lock { return @returned_value if defined? @returned_value }
93
+ @returned_value_blocker.wait
94
+ # Return the returned_value
95
+ with_returned_value_lock { @returned_value }
96
+ end
97
+
98
+ protected
99
+
100
+ ##
101
+ # Protected setter which does some other housework when the returned value is found (such as notifying wait()ers)
102
+ #
103
+ # @param [returned_value] The value to set this returned value to.
104
+ #
105
+ def returned_value=(returned_value)
106
+ with_returned_value_lock do
107
+ @returned_value = returned_value
108
+ @returned_value_blocker.broadcast
109
+ end
110
+ end
111
+
112
+ def with_returned_value_lock(&block)
113
+ @returned_value_lock.synchronize(&block)
114
+ end
115
+
116
+ def with_state_lock(&block)
117
+ @state_lock.synchronize(&block)
118
+ end
119
+
120
+ end
121
+ end
@@ -0,0 +1,153 @@
1
+ module Theatre
2
+
3
+ ##
4
+ # Manages the hierarchial namespaces of a Theatre. This class is Thread-safe.
5
+ #
6
+ class ActorNamespaceManager
7
+
8
+ VALID_NAMESPACE = %r{^(/[\w_]+)+$}
9
+
10
+ class << self
11
+ def valid_namespace_path?(namespace_path)
12
+ namespace_path =~ VALID_NAMESPACE
13
+ end
14
+
15
+ ##
16
+ # Since there are a couple ways to represent namespaces, this is a helper method which will normalize
17
+ # them into the most practical: an Array of Symbols
18
+ # @param [String, Array] paths The namespace to register. Can be in "/foo/bar" or *[foo,bar] format
19
+ def normalize_path_to_array(paths)
20
+ paths = paths.is_a?(Array) ? paths.flatten : Array(paths)
21
+ paths.map! { |path_segment| path_segment.kind_of?(String) ? path_segment.split('/') : path_segment }
22
+ paths.flatten!
23
+ paths.reject! { |path| path.nil? || (path.kind_of?(String) && path.empty?) }
24
+ paths.map { |path| path.to_sym }
25
+ end
26
+
27
+ end
28
+
29
+ def initialize
30
+ @registry_lock = Mutex.new
31
+ @root = RootNamespaceNode.new
32
+ end
33
+
34
+ ##
35
+ # Have this registry recognize a new path and prepare it for callback registrations. All path segements will be created
36
+ # in order. For example, when registering "/foo/bar/qaz" when no namespaces at all have been registered, this method will
37
+ # first register "foo", then "bar", then "qaz". If the namespace was already registered, it will not be affected.
38
+ #
39
+ # @param [String, Array] paths The namespace to register. Can be in "/foo/bar" or *[foo,bar] format
40
+ # @return [NamespaceNode] The NamespaceNode representing the path given.
41
+ # @raise NamespaceNotFound if a segment has not been registered yet
42
+ #
43
+ def register_namespace_name(*paths)
44
+ paths = self.class.normalize_path_to_array paths
45
+
46
+ paths.inject(@root) do |node, name|
47
+ node.register_namespace_name name
48
+ end
49
+ end
50
+
51
+ ##
52
+ # Returns a Proc found after searching with the namespace you provide
53
+ #
54
+ # @raise NamespaceNotFound if a segment has not been registered yet
55
+ #
56
+ def callbacks_for_namespaces(*paths)
57
+ search_for_namespace(paths).callbacks
58
+ end
59
+
60
+ ##
61
+ # Find a namespace in the tree.
62
+ #
63
+ # @param [Array, String] paths Must be an Array of segments or a name like "/foo/bar/qaz"
64
+ # @raise NamespaceNotFound if a segment has not been registered yet
65
+ #
66
+ def search_for_namespace(paths)
67
+ paths = self.class.normalize_path_to_array paths
68
+ path_string = "/"
69
+
70
+ found_namespace = paths.inject(@root) do |last_node,this_node_name|
71
+ raise NamespaceNotFound.new(path_string) if last_node.nil?
72
+ path_string << this_node_name.to_s
73
+ last_node.child_named this_node_name
74
+ end
75
+ raise NamespaceNotFound.new("/#{paths.join('/')}") unless found_namespace
76
+ found_namespace
77
+ end
78
+
79
+ ##
80
+ # Registers the given callback at a namespace, assuming the namespace was already registered.
81
+ #
82
+ # @param [Array] paths Must be an Array of segments
83
+ # @param [Proc] callback
84
+ # @raise NamespaceNotFound if a segment has not been registered yet
85
+ #
86
+ def register_callback_at_namespace(paths, callback)
87
+ raise ArgumentError, "callback must be a Proc" unless callback.kind_of? Proc
88
+ search_for_namespace(paths).register_callback callback
89
+ end
90
+
91
+ protected
92
+
93
+ ##
94
+ # Used by NamespaceManager to build a tree of namespaces. Has a Hash of children which is not
95
+ # Thread-safe. For Thread-safety, all access should semaphore through the NamespaceManager.
96
+ class NamespaceNode
97
+
98
+ attr_reader :name
99
+ def initialize(name)
100
+ @name = name.freeze
101
+ @children = {}
102
+ @callbacks = []
103
+ end
104
+
105
+ def register_namespace_name(name)
106
+ @children[name] ||= NamespaceNode.new(name)
107
+ end
108
+
109
+ def register_callback(callback)
110
+ @callbacks << callback
111
+ callback
112
+ end
113
+
114
+ def callbacks
115
+ @callbacks.clone
116
+ end
117
+
118
+ def delete_callback(callback)
119
+ @callbacks.delete callback
120
+ end
121
+
122
+ def child_named(name)
123
+ @children[name]
124
+ end
125
+
126
+ def destroy_namespace(name)
127
+ @children.delete name
128
+ end
129
+
130
+ def root?
131
+ false
132
+ end
133
+
134
+ end
135
+
136
+ class RootNamespaceNode < NamespaceNode
137
+ def initialize
138
+ super :ROOT
139
+ end
140
+ def root?
141
+ true
142
+ end
143
+ end
144
+
145
+ end
146
+
147
+ class NamespaceNotFound < StandardError
148
+ def initialize(full_path)
149
+ super "Could not find #{full_path.inspect} in the namespace registry. Did you register it yet?"
150
+ end
151
+ end
152
+
153
+ end
@@ -0,0 +1,2 @@
1
+ THEATRE_VERSION_MAJOR, THEATRE_VERSION_MINOR, THEATRE_VERSION_REVISION = THEATRE_VERSION = [0,8,1]
2
+ THEATRE_VERSION_STRING = THEATRE_VERSION.join '.'
metadata ADDED
@@ -0,0 +1,241 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rene-adhearsion
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.8.6
5
+ platform: ruby
6
+ authors:
7
+ - Jay Phillips
8
+ - Jason Goecke
9
+ - Ben Klang
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+
14
+ date: 2010-10-26 00:00:00 -05:00
15
+ default_executable:
16
+ dependencies:
17
+ - !ruby/object:Gem::Dependency
18
+ name: log4r
19
+ type: :runtime
20
+ version_requirement:
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: 1.0.5
26
+ version:
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
29
+ type: :runtime
30
+ version_requirement:
31
+ version_requirements: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - ">="
34
+ - !ruby/object:Gem::Version
35
+ version: 2.1.0
36
+ version:
37
+ - !ruby/object:Gem::Dependency
38
+ name: rubigen
39
+ type: :development
40
+ version_requirement:
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ version: 1.0.6
46
+ version:
47
+ - !ruby/object:Gem::Dependency
48
+ name: rspec
49
+ type: :development
50
+ version_requirement:
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - <
54
+ - !ruby/object:Gem::Version
55
+ version: 2.0.0
56
+ version:
57
+ - !ruby/object:Gem::Dependency
58
+ name: test-unit
59
+ type: :development
60
+ version_requirement:
61
+ version_requirements: !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - ">="
64
+ - !ruby/object:Gem::Version
65
+ version: "0"
66
+ version:
67
+ - !ruby/object:Gem::Dependency
68
+ name: flexmock
69
+ type: :development
70
+ version_requirement:
71
+ version_requirements: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: "0"
76
+ version:
77
+ - !ruby/object:Gem::Dependency
78
+ name: active_record
79
+ type: :development
80
+ version_requirement:
81
+ version_requirements: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ version: "0"
86
+ version:
87
+ description: Adhearsion is an open-source telephony development framework
88
+ email: dev&Adhearsion.com
89
+ executables:
90
+ - ahn
91
+ - ahnctl
92
+ - jahn
93
+ extensions: []
94
+
95
+ extra_rdoc_files: []
96
+
97
+ files:
98
+ - adhearsion.gemspec
99
+ - app_generators/ahn/ahn_generator.rb
100
+ - app_generators/ahn/templates/.ahnrc
101
+ - app_generators/ahn/templates/components/ami_remote/ami_remote.rb
102
+ - app_generators/ahn/templates/components/disabled/HOW_TO_ENABLE
103
+ - app_generators/ahn/templates/components/disabled/stomp_gateway/stomp_gateway.yml
104
+ - app_generators/ahn/templates/components/disabled/stomp_gateway/README.markdown
105
+ - app_generators/ahn/templates/components/disabled/stomp_gateway/stomp_gateway.rb
106
+ - app_generators/ahn/templates/components/disabled/sandbox/sandbox.rb
107
+ - app_generators/ahn/templates/components/disabled/sandbox/sandbox.yml
108
+ - app_generators/ahn/templates/components/disabled/restful_rpc/restful_rpc.yml
109
+ - app_generators/ahn/templates/components/disabled/restful_rpc/example-client.rb
110
+ - app_generators/ahn/templates/components/disabled/restful_rpc/README.markdown
111
+ - app_generators/ahn/templates/components/disabled/restful_rpc/restful_rpc.rb
112
+ - app_generators/ahn/templates/components/disabled/restful_rpc/spec/restful_rpc_spec.rb
113
+ - app_generators/ahn/templates/components/disabled/xmpp_gateway/xmpp_gateway.rb
114
+ - app_generators/ahn/templates/components/disabled/xmpp_gateway/xmpp_gateway.yml
115
+ - app_generators/ahn/templates/components/disabled/xmpp_gateway/README.markdown
116
+ - app_generators/ahn/templates/components/simon_game/simon_game.rb
117
+ - app_generators/ahn/templates/config/startup.rb
118
+ - app_generators/ahn/templates/dialplan.rb
119
+ - app_generators/ahn/templates/events.rb
120
+ - app_generators/ahn/templates/Rakefile
121
+ - app_generators/ahn/templates/README
122
+ - app_generators/ahn/USAGE
123
+ - bin/ahn
124
+ - bin/ahnctl
125
+ - bin/jahn
126
+ - CHANGELOG
127
+ - EVENTS
128
+ - examples/asterisk_manager_interface/standalone.rb
129
+ - lib/adhearsion.rb
130
+ - lib/adhearsion/cli.rb
131
+ - lib/adhearsion/component_manager.rb
132
+ - lib/adhearsion/component_manager/component_tester.rb
133
+ - lib/adhearsion/component_manager/spec_framework.rb
134
+ - lib/adhearsion/events_support.rb
135
+ - lib/adhearsion/foundation/all.rb
136
+ - lib/adhearsion/foundation/blank_slate.rb
137
+ - lib/adhearsion/foundation/custom_daemonizer.rb
138
+ - lib/adhearsion/foundation/event_socket.rb
139
+ - lib/adhearsion/foundation/future_resource.rb
140
+ - lib/adhearsion/foundation/metaprogramming.rb
141
+ - lib/adhearsion/foundation/numeric.rb
142
+ - lib/adhearsion/foundation/pseudo_guid.rb
143
+ - lib/adhearsion/foundation/relationship_properties.rb
144
+ - lib/adhearsion/foundation/string.rb
145
+ - lib/adhearsion/foundation/synchronized_hash.rb
146
+ - lib/adhearsion/foundation/thread_safety.rb
147
+ - lib/adhearsion/host_definitions.rb
148
+ - lib/adhearsion/initializer.rb
149
+ - lib/adhearsion/initializer/asterisk.rb
150
+ - lib/adhearsion/initializer/configuration.rb
151
+ - lib/adhearsion/initializer/database.rb
152
+ - lib/adhearsion/initializer/ldap.rb
153
+ - lib/adhearsion/initializer/drb.rb
154
+ - lib/adhearsion/initializer/freeswitch.rb
155
+ - lib/adhearsion/initializer/rails.rb
156
+ - lib/adhearsion/initializer/xmpp.rb
157
+ - lib/adhearsion/logging.rb
158
+ - lib/adhearsion/tasks.rb
159
+ - lib/adhearsion/tasks/database.rb
160
+ - lib/adhearsion/tasks/deprecations.rb
161
+ - lib/adhearsion/tasks/generating.rb
162
+ - lib/adhearsion/tasks/lint.rb
163
+ - lib/adhearsion/tasks/testing.rb
164
+ - lib/adhearsion/version.rb
165
+ - lib/adhearsion/voip/asterisk.rb
166
+ - lib/adhearsion/voip/asterisk/agi_server.rb
167
+ - lib/adhearsion/voip/asterisk/commands.rb
168
+ - lib/adhearsion/voip/asterisk/config_generators/agents.conf.rb
169
+ - lib/adhearsion/voip/asterisk/config_generators/config_generator.rb
170
+ - lib/adhearsion/voip/asterisk/config_generators/queues.conf.rb
171
+ - lib/adhearsion/voip/asterisk/config_generators/voicemail.conf.rb
172
+ - lib/adhearsion/voip/asterisk/config_manager.rb
173
+ - lib/adhearsion/voip/asterisk/manager_interface.rb
174
+ - lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rb
175
+ - lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb
176
+ - lib/adhearsion/voip/asterisk/manager_interface/ami_messages.rb
177
+ - lib/adhearsion/voip/asterisk/manager_interface/ami_protocol_lexer_machine.rl
178
+ - lib/adhearsion/voip/asterisk/special_dial_plan_managers.rb
179
+ - lib/adhearsion/voip/asterisk/super_manager.rb
180
+ - lib/adhearsion/voip/call.rb
181
+ - lib/adhearsion/voip/call_routing.rb
182
+ - lib/adhearsion/voip/commands.rb
183
+ - lib/adhearsion/voip/constants.rb
184
+ - lib/adhearsion/voip/conveniences.rb
185
+ - lib/adhearsion/voip/dial_plan.rb
186
+ - lib/adhearsion/voip/dsl/dialing_dsl.rb
187
+ - lib/adhearsion/voip/dsl/dialing_dsl/dialing_dsl_monkey_patches.rb
188
+ - lib/adhearsion/voip/dsl/dialplan/control_passing_exception.rb
189
+ - lib/adhearsion/voip/dsl/dialplan/dispatcher.rb
190
+ - lib/adhearsion/voip/dsl/dialplan/parser.rb
191
+ - lib/adhearsion/voip/dsl/dialplan/thread_mixin.rb
192
+ - lib/adhearsion/voip/dsl/numerical_string.rb
193
+ - lib/adhearsion/voip/freeswitch/basic_connection_manager.rb
194
+ - lib/adhearsion/voip/freeswitch/event_handler.rb
195
+ - lib/adhearsion/voip/freeswitch/freeswitch_dialplan_command_factory.rb
196
+ - lib/adhearsion/voip/freeswitch/inbound_connection_manager.rb
197
+ - lib/adhearsion/voip/freeswitch/oes_server.rb
198
+ - lib/adhearsion/voip/menu_state_machine/calculated_match.rb
199
+ - lib/adhearsion/voip/menu_state_machine/matchers.rb
200
+ - lib/adhearsion/voip/menu_state_machine/menu_builder.rb
201
+ - lib/adhearsion/voip/menu_state_machine/menu_class.rb
202
+ - lib/adhearsion/xmpp/connection.rb
203
+ - lib/theatre.rb
204
+ - lib/theatre/callback_definition_loader.rb
205
+ - lib/theatre/guid.rb
206
+ - lib/theatre/invocation.rb
207
+ - lib/theatre/namespace_manager.rb
208
+ - lib/theatre/README.markdown
209
+ - lib/theatre/version.rb
210
+ - LICENSE
211
+ - Rakefile
212
+ has_rdoc: true
213
+ homepage: http://adhearsion.com
214
+ licenses: []
215
+
216
+ post_install_message: " *******************************************************************\n * NOTE: You must manually install the \"rubigen\" gem to create *\n * new Adhearsion applications. *\n * *\n * The Rubigen package is no longer automatically installed due to *\n * dependency conflicts with ActiveSupport 3.0. *\n * Users of existing Adhearsion applications can safely ignore *\n * this message. *\n *******************************************************************\n"
217
+ rdoc_options: []
218
+
219
+ require_paths:
220
+ - lib
221
+ required_ruby_version: !ruby/object:Gem::Requirement
222
+ requirements:
223
+ - - ">="
224
+ - !ruby/object:Gem::Version
225
+ version: "0"
226
+ version:
227
+ required_rubygems_version: !ruby/object:Gem::Requirement
228
+ requirements:
229
+ - - ">="
230
+ - !ruby/object:Gem::Version
231
+ version: "0"
232
+ version:
233
+ requirements: []
234
+
235
+ rubyforge_project: adhearsion
236
+ rubygems_version: 1.3.5
237
+ signing_key:
238
+ specification_version: 2
239
+ summary: Adhearsion, open-source telephony development framework
240
+ test_files: []
241
+