adhearsion 0.8.6 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. data/CHANGELOG +24 -0
  2. data/Rakefile +3 -1
  3. data/adhearsion.gemspec +21 -4
  4. data/app_generators/ahn/templates/components/disabled/restful_rpc/restful_rpc.rb +6 -2
  5. data/app_generators/ahn/templates/config/startup.rb +11 -2
  6. data/lib/adhearsion.rb +7 -1
  7. data/lib/adhearsion/component_manager.rb +67 -2
  8. data/lib/adhearsion/foundation/all.rb +7 -1
  9. data/lib/adhearsion/foundation/blank_slate.rb +1 -3
  10. data/lib/adhearsion/initializer.rb +1 -2
  11. data/lib/adhearsion/initializer/asterisk.rb +2 -2
  12. data/lib/adhearsion/initializer/configuration.rb +16 -5
  13. data/lib/adhearsion/tasks.rb +1 -0
  14. data/lib/adhearsion/tasks/components.rb +32 -0
  15. data/lib/adhearsion/version.rb +3 -3
  16. data/lib/adhearsion/voip/asterisk/commands.rb +44 -16
  17. data/lib/adhearsion/voip/asterisk/config_generators/voicemail.conf.rb +2 -2
  18. data/lib/adhearsion/voip/asterisk/manager_interface.rb +14 -13
  19. data/lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rb +134 -134
  20. data/lib/adhearsion/voip/asterisk/manager_interface/ami_lexer.rl.rb +63 -10
  21. data/lib/adhearsion/voip/asterisk/manager_interface/ami_messages.rb +1 -1
  22. data/lib/adhearsion/voip/asterisk/special_dial_plan_managers.rb +2 -2
  23. data/lib/adhearsion/voip/call.rb +11 -11
  24. data/lib/adhearsion/voip/call_routing.rb +1 -1
  25. data/lib/adhearsion/voip/dial_plan.rb +15 -6
  26. data/lib/adhearsion/voip/dsl/dialing_dsl.rb +1 -1
  27. data/lib/adhearsion/voip/dsl/dialing_dsl/dialing_dsl_monkey_patches.rb +1 -1
  28. data/lib/adhearsion/voip/dsl/dialplan/dispatcher.rb +1 -1
  29. data/lib/adhearsion/voip/dsl/dialplan/parser.rb +4 -6
  30. data/lib/adhearsion/voip/dsl/numerical_string.rb +1 -3
  31. data/lib/adhearsion/voip/freeswitch/basic_connection_manager.rb +2 -2
  32. data/lib/adhearsion/voip/freeswitch/freeswitch_dialplan_command_factory.rb +2 -2
  33. data/lib/adhearsion/voip/freeswitch/oes_server.rb +1 -1
  34. data/lib/adhearsion/voip/menu_state_machine/matchers.rb +1 -1
  35. data/lib/adhearsion/voip/menu_state_machine/menu_builder.rb +1 -1
  36. data/lib/theatre/callback_definition_loader.rb +1 -1
  37. metadata +78 -19
@@ -6,14 +6,34 @@ module Adhearsion
6
6
  module Manager
7
7
  class AbstractAsteriskManagerInterfaceStreamLexer
8
8
 
9
- BUFFER_SIZE = 8.kilobytes unless defined? 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 "Respone: Success" or "Response: Pong"
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
- if new_data.size + @data.size > BUFFER_SIZE
94
- @data.slice! 0...new_data.size
95
- # TODO: What if the current_pointer wasn't at the end of the data for some reason?
96
- @current_pointer = @data.size
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
- @start_of_version = @current_pointer
200
+ @version_start = @current_pointer
148
201
  end
149
202
 
150
203
  def version_stops
151
- self.ami_version = @data[@start_of_version...@current_pointer].to_f
152
- @start_of_version = nil
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
@@ -13,7 +13,7 @@ module Adhearsion
13
13
 
14
14
  class << self
15
15
  def from_immediate_response(text)
16
- returning new do |instance|
16
+ new.tap do |instance|
17
17
  instance.text_body = text
18
18
  end
19
19
  end
@@ -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
- returning "M(#{macro_name}^#{encoded_options})" do |str|
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
- returning Hash[*unencoded] do |hash|
34
+ Hash[*unencoded].tap do |hash|
35
35
  hash[:timeout] &&= hash[:timeout].to_i
36
36
  hash[:play] &&= hash[:play].split('++')
37
37
  end
@@ -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
- returning new(io, variable_parser_for(io).variables) do |call|
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
- returning new_variables do
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
- returning new_variables do
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
- returning variables do
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
- returning vars do
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
- returning variables do
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
- returning variables do
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
- returning variables do
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
- returning variables do
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
- returning new(*args, &block) do |parser|
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
- returning new_variables do
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
@@ -31,7 +31,7 @@ module Adhearsion
31
31
  attr_accessor :rules
32
32
 
33
33
  def define(&block)
34
- returning new do |router|
34
+ new.tap do |router|
35
35
  router.define(&block)
36
36
  rules.concat router.rules
37
37
  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 limits the prevents"
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
- returning(new(*args)) { |instance| instance.stage! }
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
- elsif entry_point = dial_plan.lookup(call.context.to_sym)
133
- entry_point
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
- returning new do |loader|
182
+ new.tap do |loader|
174
183
  files.each do |file|
175
184
  loader.load file
176
185
  end
@@ -76,7 +76,7 @@ module Adhearsion
76
76
  end
77
77
 
78
78
  def defined_properties_without_name
79
- returning @table.clone do |copy|
79
+ @table.clone.tap do |copy|
80
80
  copy.delete :name
81
81
  end
82
82
  end
@@ -22,7 +22,7 @@ module Adhearsion
22
22
  when ProviderDefinition
23
23
  RouteRule.new :patterns => self, :providers => other
24
24
  when RouteRule
25
- returning other do |route|
25
+ other.tap do |route|
26
26
  route.unshift_pattern self
27
27
  end
28
28
  else raise ArgumentError, "Unsupported route definition #{other.inspect}"
@@ -108,7 +108,7 @@ module Adhearsion
108
108
  end
109
109
 
110
110
  def clone
111
- returning super do |nemesis|
111
+ super.tap do |nemesis|
112
112
  instance_variables.each do |iv|
113
113
  value = instance_variable_get(iv)
114
114
  nemesis.instance_variable_set iv, value.clone if value
@@ -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
- returning({}) do |contexts|
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] = returning OpenStruct.new do |metadata|
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"__send__ __id__ define_method instance_eval meta_def meta_eval metaclass"
49
- (instance_methods - keep).each do |m|
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"__id__ __send__ __real_num __real_string").each do |m|
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
- (returning [] do |lines|
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
- returning h do |hash|
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
- returning [] do |cmds|
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
- returning DSL::Dialplan::NoOpEventCommand.new do |command|
115
+ DSL::Dialplan::NoOpEventCommand.new.tap do |command|
116
116
  command.on_keypress &dtmf_hook
117
117
  end
118
118
  end
@@ -95,7 +95,7 @@ module Adhearsion
95
95
  end
96
96
 
97
97
  def rubyize_keys_for(hash)
98
- returning({}) do |pretty|
98
+ {}.tap do |pretty|
99
99
  hash.each { |k,v| pretty[k.to_s.underscore] = v }
100
100
  end
101
101
  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
- returning Array.new do |matches|
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
- returning CalculatedMatchCollection.new do |collection|
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[__send__ __id__]).each { |m| undef_method m }
64
+ (instance_methods - %w{instance_eval object_id}).each { |method| undef_method method unless method =~ /^__/ }
65
65
 
66
66
  def initialize(&notify_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: 51
4
+ hash: 23
5
5
  prerelease: false
6
6
  segments:
7
+ - 1
7
8
  - 0
8
- - 8
9
- - 6
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-08-24 00:00:00 -04:00
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: rubigen
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: 27
31
+ hash: 29
32
32
  segments:
33
33
  - 1
34
34
  - 0
35
- - 6
36
- version: 1.0.6
35
+ - 5
36
+ version: 1.0.5
37
37
  type: :runtime
38
38
  version_requirements: *id001
39
39
  - !ruby/object:Gem::Dependency
40
- name: log4r
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: 29
47
+ hash: 11
48
48
  segments:
49
+ - 2
49
50
  - 1
50
51
  - 0
51
- - 5
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: activesupport
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: 11
63
+ hash: 27
64
64
  segments:
65
- - 2
66
65
  - 1
67
66
  - 0
68
- version: 2.1.0
69
- type: :runtime
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: