adhearsion 0.8.6 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +24 -0
- data/Rakefile +3 -1
- data/adhearsion.gemspec +21 -4
- data/app_generators/ahn/templates/components/disabled/restful_rpc/restful_rpc.rb +6 -2
- data/app_generators/ahn/templates/config/startup.rb +11 -2
- data/lib/adhearsion.rb +7 -1
- data/lib/adhearsion/component_manager.rb +67 -2
- data/lib/adhearsion/foundation/all.rb +7 -1
- data/lib/adhearsion/foundation/blank_slate.rb +1 -3
- data/lib/adhearsion/initializer.rb +1 -2
- data/lib/adhearsion/initializer/asterisk.rb +2 -2
- data/lib/adhearsion/initializer/configuration.rb +16 -5
- data/lib/adhearsion/tasks.rb +1 -0
- data/lib/adhearsion/tasks/components.rb +32 -0
- data/lib/adhearsion/version.rb +3 -3
- data/lib/adhearsion/voip/asterisk/commands.rb +44 -16
- data/lib/adhearsion/voip/asterisk/config_generators/voicemail.conf.rb +2 -2
- data/lib/adhearsion/voip/asterisk/manager_interface.rb +14 -13
- data/lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rb +134 -134
- data/lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb +63 -10
- data/lib/adhearsion/voip/asterisk/manager_interface/ami_messages.rb +1 -1
- data/lib/adhearsion/voip/asterisk/special_dial_plan_managers.rb +2 -2
- data/lib/adhearsion/voip/call.rb +11 -11
- data/lib/adhearsion/voip/call_routing.rb +1 -1
- data/lib/adhearsion/voip/dial_plan.rb +15 -6
- data/lib/adhearsion/voip/dsl/dialing_dsl.rb +1 -1
- data/lib/adhearsion/voip/dsl/dialing_dsl/dialing_dsl_monkey_patches.rb +1 -1
- data/lib/adhearsion/voip/dsl/dialplan/dispatcher.rb +1 -1
- data/lib/adhearsion/voip/dsl/dialplan/parser.rb +4 -6
- data/lib/adhearsion/voip/dsl/numerical_string.rb +1 -3
- data/lib/adhearsion/voip/freeswitch/basic_connection_manager.rb +2 -2
- data/lib/adhearsion/voip/freeswitch/freeswitch_dialplan_command_factory.rb +2 -2
- data/lib/adhearsion/voip/freeswitch/oes_server.rb +1 -1
- data/lib/adhearsion/voip/menu_state_machine/matchers.rb +1 -1
- data/lib/adhearsion/voip/menu_state_machine/menu_builder.rb +1 -1
- data/lib/theatre/callback_definition_loader.rb +1 -1
- metadata +78 -19
@@ -6,14 +6,34 @@ module Adhearsion
|
|
6
6
|
module Manager
|
7
7
|
class AbstractAsteriskManagerInterfaceStreamLexer
|
8
8
|
|
9
|
-
BUFFER_SIZE =
|
9
|
+
BUFFER_SIZE = 128.kilobytes unless defined? BUFFER_SIZE
|
10
|
+
|
11
|
+
##
|
12
|
+
# IMPORTANT! See method documentation for adjust_pointers!
|
13
|
+
#
|
14
|
+
# @see adjust_pointers
|
15
|
+
#
|
16
|
+
POINTERS = [
|
17
|
+
:@current_pointer,
|
18
|
+
:@token_start,
|
19
|
+
:@token_end,
|
20
|
+
:@version_start,
|
21
|
+
:@event_name_start,
|
22
|
+
:@current_key_position,
|
23
|
+
:@current_value_position,
|
24
|
+
:@last_seen_value_end,
|
25
|
+
:@error_reason_start,
|
26
|
+
:@follows_text_start,
|
27
|
+
:@current_syntax_error_start,
|
28
|
+
:@immediate_response_start
|
29
|
+
]
|
10
30
|
|
11
31
|
%%{
|
12
32
|
machine ami_protocol_parser;
|
13
33
|
|
14
34
|
# All required Ragel actions are implemented as Ruby methods.
|
15
35
|
|
16
|
-
# Executed after a "
|
36
|
+
# Executed after a "Response: Success" or "Response: Pong"
|
17
37
|
action init_success { init_success }
|
18
38
|
|
19
39
|
action init_response_follows { init_response_follows }
|
@@ -68,7 +88,6 @@ module Adhearsion
|
|
68
88
|
variable cs @current_state;
|
69
89
|
variable ts @token_start;
|
70
90
|
variable te @token_end;
|
71
|
-
variable stack @stack;
|
72
91
|
variable act @ragel_act;
|
73
92
|
variable eof @eof;
|
74
93
|
variable stack @ragel_stack;
|
@@ -90,10 +109,23 @@ module Adhearsion
|
|
90
109
|
end
|
91
110
|
|
92
111
|
def extend_buffer_with(new_data)
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
112
|
+
length = new_data.size
|
113
|
+
|
114
|
+
if length > BUFFER_SIZE
|
115
|
+
raise Exception, "ERROR: Buffer overrun! Input size (#{new_data.size}) larger than buffer (#{BUFFER_SIZE})"
|
116
|
+
end
|
117
|
+
|
118
|
+
if length + @data.size > BUFFER_SIZE
|
119
|
+
if @data.size != @current_pointer
|
120
|
+
if @current_pointer < length
|
121
|
+
# We are about to shift more bytes off the array than we have
|
122
|
+
# parsed. This will cause the parser to lose state so
|
123
|
+
# integrity cannot be guaranteed.
|
124
|
+
raise Exception, "ERROR: Buffer overrun! AMI parser cannot guarantee sanity. New data size: #{new_data.size}; Current pointer at #{@current_pointer}; Data size: #{@data.size}"
|
125
|
+
end
|
126
|
+
end
|
127
|
+
@data.slice! 0...length
|
128
|
+
adjust_pointers -length
|
97
129
|
end
|
98
130
|
@data << new_data
|
99
131
|
@data_ending_pointer = @data.size
|
@@ -101,6 +133,27 @@ module Adhearsion
|
|
101
133
|
|
102
134
|
protected
|
103
135
|
|
136
|
+
##
|
137
|
+
# This method will adjust all pointers into the buffer according
|
138
|
+
# to the supplied offset. This is necessary any time the buffer
|
139
|
+
# changes, for example when the sliding window is incremented forward
|
140
|
+
# after new data is received.
|
141
|
+
#
|
142
|
+
# It is VERY IMPORTANT that when any additional pointers are defined
|
143
|
+
# that they are added to this method. Unpredictable results may
|
144
|
+
# otherwise occur!
|
145
|
+
#
|
146
|
+
# @see https://adhearsion.lighthouseapp.com/projects/5871-adhearsion/tickets/72-ami-lexer-buffer-offset#ticket-72-26
|
147
|
+
#
|
148
|
+
# @param offset Adjust pointers by offset. May be negative.
|
149
|
+
#
|
150
|
+
def adjust_pointers(offset)
|
151
|
+
POINTERS.each do |ptr|
|
152
|
+
value = instance_variable_get(ptr)
|
153
|
+
instance_variable_set(ptr, value + offset) if !value.nil?
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
104
157
|
##
|
105
158
|
# Called after a response or event has been successfully parsed.
|
106
159
|
#
|
@@ -144,12 +197,12 @@ module Adhearsion
|
|
144
197
|
end
|
145
198
|
|
146
199
|
def version_starts
|
147
|
-
@
|
200
|
+
@version_start = @current_pointer
|
148
201
|
end
|
149
202
|
|
150
203
|
def version_stops
|
151
|
-
self.ami_version = @data[@
|
152
|
-
@
|
204
|
+
self.ami_version = @data[@version_start...@current_pointer].to_f
|
205
|
+
@version_start = nil
|
153
206
|
end
|
154
207
|
|
155
208
|
def event_name_starts
|
@@ -9,7 +9,7 @@ module Adhearsion
|
|
9
9
|
macro_name = options.delete :macro
|
10
10
|
options[:play] &&= options[:play].kind_of?(Array) ? options[:play].join('++') : options[:play]
|
11
11
|
encoded_options = URI.escape options.map { |key,value| "#{key}:#{value}" }.join('!')
|
12
|
-
|
12
|
+
"M(#{macro_name}^#{encoded_options})".tap do |str|
|
13
13
|
if str.rindex('^') != str.index('^')
|
14
14
|
raise ArgumentError, "You seem to have supplied a :confirm option with a caret (^) in it!" +
|
15
15
|
" Please remove it. This will blow Asterisk up."
|
@@ -31,7 +31,7 @@ module Adhearsion
|
|
31
31
|
unencoded = URI.unescape(encoded_hash).split('!')
|
32
32
|
unencoded.shift unless unencoded.first.include?(':')
|
33
33
|
unencoded = unencoded.map { |pair| key, value = pair.split(':'); [key.to_sym ,value] }.flatten
|
34
|
-
|
34
|
+
Hash[*unencoded].tap do |hash|
|
35
35
|
hash[:timeout] &&= hash[:timeout].to_i
|
36
36
|
hash[:play] &&= hash[:play].split('++')
|
37
37
|
end
|
data/lib/adhearsion/voip/call.rb
CHANGED
@@ -174,7 +174,7 @@ module Adhearsion
|
|
174
174
|
# Given an IO (probably a socket accepted from an Asterisk service),
|
175
175
|
# creates a Call instance which encapsulates everything we know about that call.
|
176
176
|
def receive_from(io, &block)
|
177
|
-
|
177
|
+
new(io, variable_parser_for(io).variables).tap do |call|
|
178
178
|
block.call(call) if block
|
179
179
|
end
|
180
180
|
end
|
@@ -332,7 +332,7 @@ module Adhearsion
|
|
332
332
|
|
333
333
|
def remove_agi_prefixes_from_keys_and_strip_whitespace(variables)
|
334
334
|
variables.inject({}) do |new_variables,(key,value)|
|
335
|
-
|
335
|
+
new_variables.tap do
|
336
336
|
stripped_name = key.kind_of?(String) ? key[/^(agi_)?(.+)$/,2] : key
|
337
337
|
new_variables[stripped_name] = value.kind_of?(String) ? value.strip : value
|
338
338
|
end
|
@@ -341,21 +341,21 @@ module Adhearsion
|
|
341
341
|
|
342
342
|
def coerce_keys_into_symbols(variables)
|
343
343
|
variables.inject({}) do |new_variables,(key,value)|
|
344
|
-
|
344
|
+
new_variables.tap do
|
345
345
|
new_variables[key.to_sym] = value
|
346
346
|
end
|
347
347
|
end
|
348
348
|
end
|
349
349
|
|
350
350
|
def coerce_extension_into_phone_number_object(variables)
|
351
|
-
|
351
|
+
variables.tap do
|
352
352
|
variables[:extension] = Adhearsion::VoIP::DSL::PhoneNumber.new(variables[:extension])
|
353
353
|
end
|
354
354
|
end
|
355
355
|
|
356
356
|
def coerce_numerical_values_to_numerics(variables)
|
357
357
|
variables.inject({}) do |vars,(key,value)|
|
358
|
-
|
358
|
+
vars.tap do
|
359
359
|
is_numeric = value =~ /^-?\d+(?:(\.)\d+)?$/
|
360
360
|
is_float = $1
|
361
361
|
vars[key] = if is_numeric
|
@@ -402,13 +402,13 @@ module Adhearsion
|
|
402
402
|
end
|
403
403
|
|
404
404
|
def coerce_type_of_number_into_symbol(variables)
|
405
|
-
|
405
|
+
variables.tap do
|
406
406
|
variables[:type_of_calling_number] = Adhearsion::VoIP::Constants::Q931_TYPE_OF_NUMBER[variables.delete(:callington).to_i]
|
407
407
|
end
|
408
408
|
end
|
409
409
|
|
410
410
|
def decompose_uri_query_into_hash(variables)
|
411
|
-
|
411
|
+
variables.tap do
|
412
412
|
if variables[:request] && variables[:request].query
|
413
413
|
variables[:query] = variables[:request].query.split('&').inject({}) do |query_string_parameters, key_value_pair|
|
414
414
|
parameter_name, parameter_value = *key_value_pair.match(/(.+)=(.*)/).captures
|
@@ -422,7 +422,7 @@ module Adhearsion
|
|
422
422
|
end
|
423
423
|
|
424
424
|
def override_variables_with_query_params(variables)
|
425
|
-
|
425
|
+
variables.tap do
|
426
426
|
if variables[:query]
|
427
427
|
variables[:query].each do |key, value|
|
428
428
|
variables[key.to_sym] = value
|
@@ -432,7 +432,7 @@ module Adhearsion
|
|
432
432
|
end
|
433
433
|
|
434
434
|
def remove_dashes_from_context_name(variables)
|
435
|
-
|
435
|
+
variables.tap do
|
436
436
|
variables[:context].gsub!('-', '_')
|
437
437
|
end
|
438
438
|
end
|
@@ -444,7 +444,7 @@ module Adhearsion
|
|
444
444
|
|
445
445
|
class << self
|
446
446
|
def parse(*args, &block)
|
447
|
-
|
447
|
+
new(*args, &block).tap do |parser|
|
448
448
|
parser.parse
|
449
449
|
end
|
450
450
|
end
|
@@ -476,7 +476,7 @@ module Adhearsion
|
|
476
476
|
|
477
477
|
def initialize_variables_as_hash_from_lines
|
478
478
|
@variables = lines.inject({}) do |new_variables,line|
|
479
|
-
|
479
|
+
new_variables.tap do
|
480
480
|
key, value = self.class.separate_line_into_key_value_pair line
|
481
481
|
new_variables[key] = value
|
482
482
|
end
|
@@ -9,7 +9,7 @@ begin
|
|
9
9
|
minver = Adhearsion::PkgVersion.new("1.6.0")
|
10
10
|
if curver < minver
|
11
11
|
puts "****************************************************************************"
|
12
|
-
puts "Versions of JRuby prior to 1.6.0 contain a bug that
|
12
|
+
puts "Versions of JRuby prior to 1.6.0 contain a bug that impacts"
|
13
13
|
puts "using the \"+\" operator to jump from one context to another."
|
14
14
|
puts "Adhearsion has detected JRuby version #{JRUBY_VERSION}. For more information see:"
|
15
15
|
puts "https://adhearsion.lighthouseapp.com/projects/5871/tickets/92-menu-method-under-jruby-does-not-appear-to-work"
|
@@ -40,7 +40,7 @@ module Adhearsion
|
|
40
40
|
|
41
41
|
class << self
|
42
42
|
def create(*args)
|
43
|
-
|
43
|
+
new(*args).tap { |instance| instance.stage! }
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
@@ -127,10 +127,19 @@ module Adhearsion
|
|
127
127
|
# Find the dialplan by the context name from the call or from the
|
128
128
|
# first path entry in the AGI URL
|
129
129
|
def entry_point_for(call)
|
130
|
+
|
131
|
+
# Try the request URI for an entry point first
|
130
132
|
if call.respond_to?(:request) && m = call.request.path.match(%r{/([^/]+)})
|
131
|
-
dial_plan.lookup(m[1].to_sym)
|
132
|
-
|
133
|
-
|
133
|
+
if entry_point = dial_plan.lookup(m[1].to_sym)
|
134
|
+
return entry_point
|
135
|
+
else
|
136
|
+
ahn_log.warn "AGI URI requested context \"#{m[1]}\" but matching Adhearsion context not found! Falling back to Asterisk context."
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
# Fall back to the matching Asterisk context name
|
141
|
+
if entry_point = dial_plan.lookup(call.context.to_sym)
|
142
|
+
return entry_point
|
134
143
|
end
|
135
144
|
end
|
136
145
|
|
@@ -170,7 +179,7 @@ module Adhearsion
|
|
170
179
|
raise ArgumentError, "Unrecognized type of file #{file.inspect}"
|
171
180
|
end
|
172
181
|
end
|
173
|
-
|
182
|
+
new.tap do |loader|
|
174
183
|
files.each do |file|
|
175
184
|
loader.load file
|
176
185
|
end
|
@@ -22,7 +22,7 @@ module Adhearsion
|
|
22
22
|
when ProviderDefinition
|
23
23
|
RouteRule.new :patterns => self, :providers => other
|
24
24
|
when RouteRule
|
25
|
-
|
25
|
+
other.tap do |route|
|
26
26
|
route.unshift_pattern self
|
27
27
|
end
|
28
28
|
else raise ArgumentError, "Unsupported route definition #{other.inspect}"
|
@@ -19,7 +19,7 @@ module Adhearsion
|
|
19
19
|
dialplans = AHN_CONFIG.files_from_setting "paths", "dialplan"
|
20
20
|
ahn_log.dialplan.warn "No dialplan files were found!" if dialplans.empty?
|
21
21
|
|
22
|
-
|
22
|
+
{}.tap do |contexts|
|
23
23
|
dialplans.each do |file|
|
24
24
|
raise "Dialplan file #{file} does not exist!" unless File.exists? file
|
25
25
|
envelope.instance_eval do
|
@@ -31,7 +31,7 @@ module Adhearsion
|
|
31
31
|
warn %'Dialplan context "#{name}" exists in both #{contexts[name].file} and #{file}.' +
|
32
32
|
%' Using the "#{name}" context from #{contexts[name].file}.'
|
33
33
|
else
|
34
|
-
contexts[name] =
|
34
|
+
contexts[name] = OpenStruct.new.tap do |metadata|
|
35
35
|
metadata.file = file
|
36
36
|
metadata.name = name
|
37
37
|
metadata.block = block
|
@@ -45,10 +45,8 @@ module Adhearsion
|
|
45
45
|
|
46
46
|
class ContextsEnvelope
|
47
47
|
|
48
|
-
keep = %w"
|
49
|
-
(instance_methods - keep).each
|
50
|
-
undef_method m
|
51
|
-
end
|
48
|
+
keep = %w"define_method instance_eval meta_def meta_eval metaclass"
|
49
|
+
(instance_methods - keep).each { |m| undef_method m unless m =~ /^__/ }
|
52
50
|
|
53
51
|
def initialize
|
54
52
|
@parsed_contexts = {}
|
@@ -19,9 +19,7 @@ module Adhearsion
|
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
-
(instance_methods - %w
|
23
|
-
undef_method m
|
24
|
-
end
|
22
|
+
(instance_methods - %w{instance_eval object_id}).each { |m| undef_method m unless m =~ /^__/ }
|
25
23
|
|
26
24
|
attr_reader :__real_num, :__real_string
|
27
25
|
|
@@ -18,7 +18,7 @@ module Adhearsion
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def get_raw_header
|
21
|
-
(
|
21
|
+
([].tap do |lines|
|
22
22
|
until line = @io.gets and line.chomp.empty?
|
23
23
|
lines << line.chomp
|
24
24
|
end
|
@@ -34,7 +34,7 @@ module Adhearsion
|
|
34
34
|
|
35
35
|
def separate_pairs(lines)
|
36
36
|
lines.inject({}) do |h,line|
|
37
|
-
|
37
|
+
h.tap do |hash|
|
38
38
|
k,v = line.split(/\s*:\s*/)
|
39
39
|
hash[k] = URI.unescape(v).strip if k && v
|
40
40
|
end
|
@@ -84,7 +84,7 @@ module Adhearsion
|
|
84
84
|
end
|
85
85
|
|
86
86
|
rec_cmd = cmd "record", file, :on_keypress => dtmf_breaker
|
87
|
-
|
87
|
+
[].tap do |cmds|
|
88
88
|
cmds << play('beep') if hash[:beep]
|
89
89
|
cmds << rec_cmd
|
90
90
|
if hash[:timeout]
|
@@ -112,7 +112,7 @@ module Adhearsion
|
|
112
112
|
digits << digit
|
113
113
|
return! digits.to_s if number && digits.size >= number
|
114
114
|
end
|
115
|
-
|
115
|
+
DSL::Dialplan::NoOpEventCommand.new.tap do |command|
|
116
116
|
command.on_keypress &dtmf_hook
|
117
117
|
end
|
118
118
|
end
|
@@ -79,7 +79,7 @@ module Adhearsion
|
|
79
79
|
def numbers_in_range_like(num)
|
80
80
|
return (pattern === 0 ? [0] : nil) if num == 0
|
81
81
|
raise ArgumentError unless num.kind_of?(Numeric)
|
82
|
-
|
82
|
+
Array.new.tap do |matches|
|
83
83
|
first, last = pattern.first, pattern.last
|
84
84
|
power = 0
|
85
85
|
while num < last
|
@@ -46,7 +46,7 @@ module Adhearsion
|
|
46
46
|
end
|
47
47
|
|
48
48
|
def calculate_matches_for(result)
|
49
|
-
|
49
|
+
CalculatedMatchCollection.new.tap do |collection|
|
50
50
|
weighted_match_calculators.each do |pattern|
|
51
51
|
collection << pattern.match(result)
|
52
52
|
end
|
@@ -61,7 +61,7 @@ module Theatre
|
|
61
61
|
|
62
62
|
class BlankSlateMessageRecorder
|
63
63
|
|
64
|
-
(instance_methods - %w
|
64
|
+
(instance_methods - %w{instance_eval object_id}).each { |method| undef_method method unless method =~ /^__/ }
|
65
65
|
|
66
66
|
def initialize(¬ify_on_completion)
|
67
67
|
@notify_on_completion = notify_on_completion
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: adhearsion
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
|
+
- 1
|
7
8
|
- 0
|
8
|
-
-
|
9
|
-
|
10
|
-
version: 0.8.6
|
9
|
+
- 0
|
10
|
+
version: 1.0.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Jay Phillips
|
@@ -17,57 +17,115 @@ autorequire:
|
|
17
17
|
bindir: bin
|
18
18
|
cert_chain: []
|
19
19
|
|
20
|
-
date: 2010-
|
20
|
+
date: 2010-10-28 00:00:00 -04:00
|
21
21
|
default_executable:
|
22
22
|
dependencies:
|
23
23
|
- !ruby/object:Gem::Dependency
|
24
|
-
name:
|
24
|
+
name: log4r
|
25
25
|
prerelease: false
|
26
26
|
requirement: &id001 !ruby/object:Gem::Requirement
|
27
27
|
none: false
|
28
28
|
requirements:
|
29
29
|
- - ">="
|
30
30
|
- !ruby/object:Gem::Version
|
31
|
-
hash:
|
31
|
+
hash: 29
|
32
32
|
segments:
|
33
33
|
- 1
|
34
34
|
- 0
|
35
|
-
-
|
36
|
-
version: 1.0.
|
35
|
+
- 5
|
36
|
+
version: 1.0.5
|
37
37
|
type: :runtime
|
38
38
|
version_requirements: *id001
|
39
39
|
- !ruby/object:Gem::Dependency
|
40
|
-
name:
|
40
|
+
name: activesupport
|
41
41
|
prerelease: false
|
42
42
|
requirement: &id002 !ruby/object:Gem::Requirement
|
43
43
|
none: false
|
44
44
|
requirements:
|
45
45
|
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
hash:
|
47
|
+
hash: 11
|
48
48
|
segments:
|
49
|
+
- 2
|
49
50
|
- 1
|
50
51
|
- 0
|
51
|
-
|
52
|
-
version: 1.0.5
|
52
|
+
version: 2.1.0
|
53
53
|
type: :runtime
|
54
54
|
version_requirements: *id002
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: rubigen
|
57
57
|
prerelease: false
|
58
58
|
requirement: &id003 !ruby/object:Gem::Requirement
|
59
59
|
none: false
|
60
60
|
requirements:
|
61
61
|
- - ">="
|
62
62
|
- !ruby/object:Gem::Version
|
63
|
-
hash:
|
63
|
+
hash: 27
|
64
64
|
segments:
|
65
|
-
- 2
|
66
65
|
- 1
|
67
66
|
- 0
|
68
|
-
|
69
|
-
|
67
|
+
- 6
|
68
|
+
version: 1.0.6
|
69
|
+
type: :development
|
70
70
|
version_requirements: *id003
|
71
|
+
- !ruby/object:Gem::Dependency
|
72
|
+
name: rspec
|
73
|
+
prerelease: false
|
74
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
75
|
+
none: false
|
76
|
+
requirements:
|
77
|
+
- - <
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
hash: 15
|
80
|
+
segments:
|
81
|
+
- 2
|
82
|
+
- 0
|
83
|
+
- 0
|
84
|
+
version: 2.0.0
|
85
|
+
type: :development
|
86
|
+
version_requirements: *id004
|
87
|
+
- !ruby/object:Gem::Dependency
|
88
|
+
name: test-unit
|
89
|
+
prerelease: false
|
90
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
91
|
+
none: false
|
92
|
+
requirements:
|
93
|
+
- - ">="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
hash: 3
|
96
|
+
segments:
|
97
|
+
- 0
|
98
|
+
version: "0"
|
99
|
+
type: :development
|
100
|
+
version_requirements: *id005
|
101
|
+
- !ruby/object:Gem::Dependency
|
102
|
+
name: flexmock
|
103
|
+
prerelease: false
|
104
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ">="
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
hash: 3
|
110
|
+
segments:
|
111
|
+
- 0
|
112
|
+
version: "0"
|
113
|
+
type: :development
|
114
|
+
version_requirements: *id006
|
115
|
+
- !ruby/object:Gem::Dependency
|
116
|
+
name: active_record
|
117
|
+
prerelease: false
|
118
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
119
|
+
none: false
|
120
|
+
requirements:
|
121
|
+
- - ">="
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
hash: 3
|
124
|
+
segments:
|
125
|
+
- 0
|
126
|
+
version: "0"
|
127
|
+
type: :development
|
128
|
+
version_requirements: *id007
|
71
129
|
description: Adhearsion is an open-source telephony development framework
|
72
130
|
email: dev&Adhearsion.com
|
73
131
|
executables:
|
@@ -140,6 +198,7 @@ files:
|
|
140
198
|
- lib/adhearsion/initializer/xmpp.rb
|
141
199
|
- lib/adhearsion/logging.rb
|
142
200
|
- lib/adhearsion/tasks.rb
|
201
|
+
- lib/adhearsion/tasks/components.rb
|
143
202
|
- lib/adhearsion/tasks/database.rb
|
144
203
|
- lib/adhearsion/tasks/deprecations.rb
|
145
204
|
- lib/adhearsion/tasks/generating.rb
|
@@ -197,7 +256,7 @@ has_rdoc: true
|
|
197
256
|
homepage: http://adhearsion.com
|
198
257
|
licenses: []
|
199
258
|
|
200
|
-
post_install_message:
|
259
|
+
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"
|
201
260
|
rdoc_options: []
|
202
261
|
|
203
262
|
require_paths:
|