adhearsion 0.8.6 → 1.0.0

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 (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: