adhearsion-ims 0.0.1

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.
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in plugin-template.gemspec
4
+ gemspec
@@ -0,0 +1,38 @@
1
+ adhearsion-ims
2
+ ==============
3
+
4
+ A gem that provides convenience methods for integration with the IP Multimedia Subsystem (IMS) when using PRISM and Rayo. This gem is an Adhearsion plugin.
5
+
6
+ Usage
7
+ =====
8
+
9
+ class MyCallController < Adhearsion::CallController
10
+ include Adhearsion::IMS::CallControllerMethods
11
+
12
+ def run
13
+ # Complete the call as a B2BUA, must pass options returned
14
+ ims_data = ims_dial_string :b2bua
15
+ dial ims_data[:sip_uri], ims_data[:options]
16
+
17
+ # Complete the call as an Out of the Blue (OOB)
18
+ ims_data = ims_dial_string :out_of_the_blue
19
+ dial ims_data[:sip_uri], ims_data[:options]
20
+ end
21
+ end
22
+
23
+ Installation
24
+ ============
25
+
26
+ gem install adhearsion-ims
27
+
28
+ Configuration
29
+ =============
30
+
31
+ The configuration for this plugin should be included in the Adhearsion project within the file config/adhearsion.rb. The options available are:
32
+
33
+ config.adhearsion_ims.sbc_address = "192.168.0.1" #The Hostname or IP Address of the Session Border Gateway (SBG) of the IMS [OPTIONAL]
34
+ config.adhearsion_ims.cscf_address = "192.168.0.2" #The Hostname or IP Address of the Call Session Control Function (CSCF) of the IMS, can not be nil
35
+ config.adhearsion_ims.originating_ims_identity = 'foobar.com' #Originating IMS Identity for an Out of the Blue session, can not be nil
36
+ config.adhearsion_ims.uvp_address = '192.168.0.3' #The Hostname or IP Address of the Universal Voice Platform (UVP) of the IMS
37
+ config.adhearsion_ims.exclude_routes = ['foo'] #An array of routes to exclude from the route header
38
+
@@ -0,0 +1,10 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ require 'rspec/core'
4
+ require 'rspec/core/rake_task'
5
+ RSpec::Core::RakeTask.new(:spec) do |spec|
6
+ spec.pattern = 'spec/**/*_spec.rb'
7
+ spec.rspec_opts = '--color'
8
+ end
9
+
10
+ task :default => :spec
@@ -0,0 +1,5 @@
1
+ %w{
2
+ adhearsion-ims/version
3
+ adhearsion-ims/plugin
4
+ adhearsion-ims/controller_methods
5
+ }.each { |lib| require lib }
@@ -0,0 +1,160 @@
1
+ module Adhearsion
2
+ module IMS
3
+ module CallControllerMethods
4
+ ##
5
+ # Creates an IMS dial string as a B2BUA or an Out of the Blue
6
+ #
7
+ # @overload initialize(params)
8
+ # @param [Required, Symbol] :b2bua or :out_of_the_blue
9
+ # @param [Optional, Hash] :from
10
+ # @overload ims_dial_string(params, &block)
11
+ # @param [Required, Symbol] :b2bua or :out_of_the_blue
12
+ # @param [Required, Hash] :from the tel uri the call will be placed on behalf of
13
+ # @param [Required, Hash] :to the tel or SIP uri of the destination for the call
14
+ # @return [String] the dial string
15
+ # @return [Hash] dial options generated
16
+ def generate_ims_options(type, options={})
17
+ validate_options type, options
18
+
19
+ return { :sip_uri => build_to(options),
20
+ :options => { :from => build_from(options),
21
+ :headers => generate_isc_headers(type) }
22
+ }
23
+ end
24
+
25
+ ##
26
+ # Creates the headers required for IMS B2BUA or Out of the Blue dialing
27
+ #
28
+ # @param [Symbol] type should be :b2bua or :out_of_the_blue
29
+ # @return [Hash] header generated for the IMS
30
+ def generate_isc_headers(type)
31
+ headers={}
32
+
33
+ case type
34
+ when :b2bua
35
+ headers[:route] = process_b2bua_route_headers(call.variables[:route])
36
+ headers.merge! call.variables.select { |k,v| k =~ /^P/i }
37
+ when :out_of_the_blue
38
+ if Adhearsion::IMS::Plugin.config[:sbc_address]
39
+ headers[:route] = config[:sbc_address] + delimitter + config[:cscf_address]
40
+ else
41
+ headers[:route] = config[:cscf_address]
42
+ end
43
+
44
+ headers[:p_charging_vector] = "icid-value=#{uuid};orig-ioi=#{config[:originating_ims_identity]}"
45
+ end
46
+
47
+ headers
48
+ end
49
+
50
+ private
51
+
52
+ ##
53
+ # Creates the route header based on a ||| list when multiple routes, also adding the SBC address if
54
+ # required
55
+ #
56
+ # @param [String] route header
57
+ # @return [String] the routes properly constructed
58
+ def process_b2bua_route_headers(route)
59
+ if route.match(/\|\|\|/)
60
+ routes = remove_nodes(call.variables[:route].split('|||'))
61
+ routes.unshift Adhearsion::IMS::Plugin.config[:sbc_address] if Adhearsion::IMS::Plugin.config[:sbc_address]
62
+ new_route = routes.join('|||')
63
+ else
64
+ if Adhearsion::IMS::Plugin.config[:sbc_address]
65
+ new_route = Adhearsion::IMS::Plugin.config[:sbc_address] + '|||' + route
66
+ else
67
+ new_route = route
68
+ end
69
+ end
70
+
71
+ new_route
72
+ end
73
+
74
+ ##
75
+ # Removes any nodes from the routes as specified in the configuration
76
+ #
77
+ # @param [Array] route headers
78
+ # @return [Array] the routes with any nodes removed
79
+ def remove_nodes(routes)
80
+ Adhearsion::IMS::Plugin.config[:exclude_routes].each { |route| routes.delete(route) }
81
+ routes
82
+ end
83
+
84
+ def validate_options(type, options)
85
+ case type
86
+ when :b2bua
87
+ raise ArgumentError, "If requesting a :b2bua you may not specify a :to" if options[:to]
88
+ when :out_of_the_blue
89
+ raise ArgumentError, "Must provide a :to and :from in options" if options[:to].nil? || options[:from].nil?
90
+ else
91
+ raise ArgumentError, "Unknown type of #{type}, must be :b2bua or :out_of_the_blue"
92
+ end
93
+ end
94
+
95
+ ##
96
+ # Provides the delimitter for Rayo to use for multiple route headers
97
+ #
98
+ # @return [String] value to use as the delimitter
99
+ def delimitter; "|||"; end
100
+
101
+ ##
102
+ # Generates a UUID
103
+ #
104
+ # @return [String] a guid
105
+ def uuid; SecureRandom.uuid.gsub('-', ''); end
106
+
107
+ ##
108
+ # Genertes the SIP to URI
109
+ #
110
+ # @param [Optional, Hash] options containing the :to if desired
111
+ # @return [String] the string to be used for the SIP URI with the UVP
112
+ def build_to(options={})
113
+ if options[:to]
114
+ "sip:#{options[:to]}@#{config[:uvp_address]}"
115
+ else
116
+ "sip:#{to}@#{config[:uvp_address]}"
117
+ end
118
+ end
119
+
120
+ ##
121
+ # Generates the from URI
122
+ #
123
+ # @param [Optional, Hash] options to be use to build the string
124
+ # @return [String] the string to be used for the SIP URI with the UVP
125
+ def build_from(options={})
126
+ if options[:from]
127
+ "tel:#{options[:from]}"
128
+ else
129
+ "tel:#{from}"
130
+ end
131
+ end
132
+
133
+ ##
134
+ # Returns a configuration value from the plugin's config
135
+ #
136
+ # @param [Symbol] key to return the value of
137
+ # @return [String] value of the key
138
+ def config; Adhearsion::IMS::Plugin.config.to_hash; end
139
+
140
+ ##
141
+ # Used to create a convenience method for filtering out the to/from in a call header
142
+ def method_missing(method); extract_user_from variables[method]; end
143
+
144
+ ##
145
+ # Returns a extracted string to dial
146
+ #
147
+ # @param [Symbol] address to returm
148
+ # @return [String] string that may be used to dial
149
+ def extract_user_from(address)
150
+ user = /sip:([^@]+)@/.match(address).to_a[1]
151
+ # Add a US prefix if the user is all numeric
152
+ if user =~ /^\d+$/
153
+ user = "+#{user}" if user =~ /^1/
154
+ user = "+1#{user}" unless user =~ /^\+1/
155
+ end
156
+ user
157
+ end
158
+ end
159
+ end
160
+ end
@@ -0,0 +1,48 @@
1
+ module Adhearsion
2
+ module IMS
3
+ class Plugin < Adhearsion::Plugin
4
+ # Actions to perform when the plugin is loaded
5
+ #
6
+ init :adhearsion_ims do
7
+ logger.info "adhearsion-ims has been loaded"
8
+ end
9
+
10
+ # Basic configuration for the plugin
11
+ #
12
+ config :adhearsion_ims do
13
+ sbc_address nil, :desc => "The Hostname or IP Address of the Session Border Controller (SBC) of the IMS [OPTIONAL]"
14
+ cscf_address "192.168.0.2", :desc => "The Hostname or IP Address of the Call Session Control Function (CSCF) of the IMS. Can not be nil.",
15
+ :transform => Proc.new { |v| Adhearsion::IMS::Plugin.enforce_not_nil v }
16
+ originating_ims_identity nil, :desc => "Originating IMS Identity for an Out of the Blue session. Can not be nil.",
17
+ :transform => Proc.new { |v| Adhearsion::IMS::Plugin.enforce_not_nil v }
18
+ uvp_address '192.168.0.3', :desc => "The Hostname or IP Address of the Universal Voice Platform (UVP) of the IMS"
19
+ exclude_routes [], :desc => "An array of routes to exclude from the route header.",
20
+ :transform => Proc.new { |v| Adhearsion::IMS::Plugin.enforce_array v }
21
+ end
22
+
23
+ # Defining a Rake task is easy
24
+ # The following can be invoked with:
25
+ # rake plugin_demo:info
26
+ #
27
+ tasks do
28
+ namespace :adhearsion_ims do
29
+ desc "Prints the AdhearsionIMS::Plugin information"
30
+ task :info do
31
+ STDOUT.puts "adhearsion-ims plugin v. #{VERSION}"
32
+ STDOUT.puts "Provides support for the IP Multimedia Subsystem (IMS) integration with PRISM & Rayo"
33
+ STDOUT.puts "For more information please refer to http://en.wikipedia.org/wiki/IP_Multimedia_Subsystem."
34
+ end
35
+ end
36
+ end
37
+
38
+ private
39
+
40
+ class << self
41
+ def enforce_not_nil(v)
42
+ raise ArgumentError if v.nil?
43
+ v
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,5 @@
1
+ module Adhearsion
2
+ module IMS
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
@@ -0,0 +1,149 @@
1
+ require 'spec_helper'
2
+
3
+ module Adhearsion::IMS
4
+ describe Adhearsion::IMS do
5
+ describe "mixed in to a Adhearsion::IMS" do
6
+
7
+ class TestController < Adhearsion::CallController
8
+ include Adhearsion::IMS::CallControllerMethods
9
+ end
10
+
11
+ Adhearsion::IMS::Plugin.config[:cscf_address] = '1.1.1.1'
12
+ Adhearsion::IMS::Plugin.config[:originating_ims_identity] = 'foobar.com'
13
+
14
+ P_CHARGING_VECTOR_REGEX = /^icid-value=[({]?(0x)?[0-9a-fA-F]{8}([-,]?(0x)?[0-9a-fA-F]{4}){2}((-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12})|(,\{0x[0-9a-fA-F]{2}(,0x[0-9a-fA-F]{2}){7}\}))[)}]?;orig-ioi=#{Adhearsion::IMS::Plugin.config[:originating_ims_identity]}/
15
+ CALL_HEADERS = { :p_asserted_identity => 'foo',
16
+ :p_charging_vector => 'bar',
17
+ :misc_header => 'bah',
18
+ :route => '1234',
19
+ :to => 'sip:+14155551212@foo.com',
20
+ :from => 'sip:+16505551212@bar.com' }
21
+
22
+
23
+ let(:mock_call) { mock 'Call' }
24
+
25
+ subject do
26
+ mock_call.stubs(:variables).returns(CALL_HEADERS)
27
+ TestController.new mock_call
28
+ end
29
+
30
+ describe "#isc_header_copy" do
31
+ describe "when an SBC is not required" do
32
+ it "returns the headers needed to complete an IMS B2BUA call, while stripping ones it does not" do
33
+ headers = subject.generate_isc_headers :b2bua
34
+ headers[:route].should eql "#{CALL_HEADERS[:route]}"
35
+ headers[:p_asserted_identity].should eql CALL_HEADERS[:p_asserted_identity]
36
+ headers[:p_charging_vector].should eql CALL_HEADERS[:p_charging_vector]
37
+ headers.has_key?(:misc_header).should eql false
38
+ end
39
+
40
+ it "returns the headers needed to complete an IMS Out of the Blue (OOB) call" do
41
+ headers = subject.generate_isc_headers :out_of_the_blue
42
+ headers[:route].should eql "#{Adhearsion::IMS::Plugin.config[:cscf_address]}"
43
+ headers[:p_charging_vector].match(P_CHARGING_VECTOR_REGEX).to_s.should eql headers[:p_charging_vector]
44
+ end
45
+ end
46
+
47
+ describe "when an SBC is required" do
48
+ it "returns the headers needed to complete an IMS B2BUA call, while stripping ones it does not" do
49
+ Adhearsion::IMS::Plugin.config[:sbc_address] = '0.0.0.0'
50
+ headers = subject.generate_isc_headers :b2bua
51
+ headers[:route].should eql "#{Adhearsion::IMS::Plugin.config[:sbc_address]}|||#{CALL_HEADERS[:route]}"
52
+ headers[:p_asserted_identity].should eql CALL_HEADERS[:p_asserted_identity]
53
+ headers[:p_charging_vector].should eql CALL_HEADERS[:p_charging_vector]
54
+ headers.has_key?(:misc_header).should eql false
55
+ end
56
+
57
+ it "returns the headers needed to complete an IMS Out of the Blue (OOB) call" do
58
+ Adhearsion::IMS::Plugin.config[:sbc_address] = '0.0.0.0'
59
+ headers = subject.generate_isc_headers :out_of_the_blue
60
+ headers[:route].should eql "#{Adhearsion::IMS::Plugin.config[:sbc_address]}|||#{Adhearsion::IMS::Plugin.config[:cscf_address]}"
61
+ headers[:p_charging_vector].match(P_CHARGING_VECTOR_REGEX).to_s.should eql headers[:p_charging_vector]
62
+ end
63
+
64
+ it "returns the headers when there is more than one route provided in the ISC for a B2BUA call" do
65
+ CALL_HEADERS[:route] = "1234|||4567"
66
+ headers = subject.generate_isc_headers :b2bua
67
+ headers[:route].should eql "#{Adhearsion::IMS::Plugin.config[:sbc_address]}|||1234|||4567"
68
+ end
69
+
70
+ it "but removes appropriate route nodes when specified int he configuration" do
71
+ Adhearsion::IMS::Plugin.config[:exclude_routes] = ['1234']
72
+ headers = subject.generate_isc_headers :b2bua
73
+ headers[:route].should eql "#{Adhearsion::IMS::Plugin.config[:sbc_address]}|||4567"
74
+ Adhearsion::IMS::Plugin.config[:exclude_routes] = []
75
+ end
76
+ end
77
+ end
78
+
79
+ describe "#generate_ims_options" do
80
+ describe "when wanting to complete a call via the IMS" do
81
+ it "should raise an error if the wrong type is provided" do
82
+ begin
83
+ subject.generate_ims_options :foobar
84
+ rescue => e
85
+ e.to_s.should eql "Unknown type of foobar, must be :b2bua or :out_of_the_blue"
86
+ end
87
+ end
88
+
89
+ it "should raise an error if we do a :b2bua call with a :to" do
90
+ begin
91
+ subject.generate_ims_options :b2bua, :to => 'foo'
92
+ rescue => e
93
+ e.to_s.should eql "If requesting a :b2bua you may not specify a :to"
94
+ end
95
+ end
96
+
97
+ it "should raise an error if we do an :out_of_the_blue call without a :to and :from" do
98
+ begin
99
+ subject.generate_ims_options :out_of_the_blue
100
+ rescue => e
101
+ e.to_s.should eql "Must provide a :to and :from in options"
102
+ end
103
+
104
+ begin
105
+ subject.generate_ims_options :out_of_the_blue, :from => 'bar'
106
+ rescue => e
107
+ e.to_s.should eql "Must provide a :to and :from in options"
108
+ end
109
+
110
+ begin
111
+ subject.generate_ims_options :out_of_the_blue, :to => 'baz'
112
+ rescue => e
113
+ e.to_s.should eql "Must provide a :to and :from in options"
114
+ end
115
+ end
116
+
117
+ it "create a B2BUA IMS dial string with the appropriate headers and format with existing headers" do
118
+ ims_data = subject.generate_ims_options(:b2bua)
119
+ ims_data[:sip_uri].should eql "#{CALL_HEADERS[:to].gsub('@foo.com','')}@#{Adhearsion::IMS::Plugin.config[:uvp_address]}"
120
+ ims_data[:options][:from].should eql CALL_HEADERS[:from].gsub('sip', 'tel').gsub('@bar.com','')
121
+ ims_data[:options][:headers][:route].should eql "#{Adhearsion::IMS::Plugin.config[:sbc_address]}|||#{CALL_HEADERS[:route]}"
122
+ ims_data[:options][:headers][:p_asserted_identity].should eql CALL_HEADERS[:p_asserted_identity]
123
+ ims_data[:options][:headers][:p_charging_vector].should eql CALL_HEADERS[:p_charging_vector]
124
+ end
125
+
126
+ it "create a B2BUA IMS dial string with the appropriate headers and format with a new :from" do
127
+ from = '+12125551212'
128
+ ims_data = subject.generate_ims_options(:b2bua, :from => from)
129
+ ims_data[:sip_uri].should eql "#{CALL_HEADERS[:to].gsub('@foo.com','')}@#{Adhearsion::IMS::Plugin.config[:uvp_address]}"
130
+ ims_data[:options][:from].should eql "tel:#{from}"
131
+ ims_data[:options][:headers][:route].should eql "#{Adhearsion::IMS::Plugin.config[:sbc_address]}|||#{CALL_HEADERS[:route]}"
132
+ ims_data[:options][:headers][:p_asserted_identity].should eql CALL_HEADERS[:p_asserted_identity]
133
+ ims_data[:options][:headers][:p_charging_vector].should eql CALL_HEADERS[:p_charging_vector]
134
+ end
135
+
136
+ it "create an Out of the Blue dial string with the appropriate headers and format" do
137
+ to = '+14085551212'
138
+ from = '+12125551212'
139
+ ims_data = subject.generate_ims_options(:out_of_the_blue, { :to => to, :from => from })
140
+ ims_data[:sip_uri].should eql "sip:#{to}@#{Adhearsion::IMS::Plugin.config[:uvp_address]}"
141
+ ims_data[:options][:from].should eql "tel:#{from}"
142
+ ims_data[:options][:headers][:route].should eql "#{Adhearsion::IMS::Plugin.config[:sbc_address]}|||#{Adhearsion::IMS::Plugin.config[:cscf_address]}"
143
+ ims_data[:options][:headers][:p_charging_vector].match(P_CHARGING_VECTOR_REGEX).to_s.should eql ims_data[:options][:headers][:p_charging_vector]
144
+ end
145
+ end
146
+ end
147
+ end
148
+ end
149
+ end
@@ -0,0 +1,12 @@
1
+ require 'adhearsion'
2
+ require 'adhearsion-ims'
3
+
4
+ RSpec.configure do |config|
5
+ config.color_enabled = true
6
+ config.tty = true
7
+
8
+ config.mock_with :mocha
9
+ # config.filter_run :focus => true
10
+ # config.run_all_when_everything_filtered = true
11
+ end
12
+
metadata ADDED
@@ -0,0 +1,233 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: adhearsion-ims
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Jason Goecke
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-07-19 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: adhearsion
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '2.0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '2.0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: activesupport
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: '3.0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '3.0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: bundler
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: '1.0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '1.0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: rspec
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: '2.5'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: '2.5'
78
+ - !ruby/object:Gem::Dependency
79
+ name: ci_reporter
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
85
+ version: '1.6'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: '1.6'
94
+ - !ruby/object:Gem::Dependency
95
+ name: simplecov
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: simplecov-rcov
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: yard
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ~>
132
+ - !ruby/object:Gem::Version
133
+ version: '0.6'
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ~>
140
+ - !ruby/object:Gem::Version
141
+ version: '0.6'
142
+ - !ruby/object:Gem::Dependency
143
+ name: rake
144
+ requirement: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ! '>='
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ type: :development
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ! '>='
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ - !ruby/object:Gem::Dependency
159
+ name: mocha
160
+ requirement: !ruby/object:Gem::Requirement
161
+ none: false
162
+ requirements:
163
+ - - ! '>='
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
170
+ requirements:
171
+ - - ! '>='
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ - !ruby/object:Gem::Dependency
175
+ name: guard-rspec
176
+ requirement: !ruby/object:Gem::Requirement
177
+ none: false
178
+ requirements:
179
+ - - ! '>='
180
+ - !ruby/object:Gem::Version
181
+ version: '0'
182
+ type: :development
183
+ prerelease: false
184
+ version_requirements: !ruby/object:Gem::Requirement
185
+ none: false
186
+ requirements:
187
+ - - ! '>='
188
+ - !ruby/object:Gem::Version
189
+ version: '0'
190
+ description: Provides convenience methods when using Adhearsion with Rayo for IP Multimedia
191
+ Subsystem (IMS) integration. Specifically ISC triggers.
192
+ email:
193
+ - jason@goecke.net
194
+ executables: []
195
+ extensions: []
196
+ extra_rdoc_files: []
197
+ files:
198
+ - lib/adhearsion-ims/controller_methods.rb
199
+ - lib/adhearsion-ims/plugin.rb
200
+ - lib/adhearsion-ims/version.rb
201
+ - lib/adhearsion-ims.rb
202
+ - README.md
203
+ - Rakefile
204
+ - Gemfile
205
+ - spec/adhearsion-ims/controller_methods_spec.rb
206
+ - spec/spec_helper.rb
207
+ homepage: http://adhearsion.com
208
+ licenses: []
209
+ post_install_message:
210
+ rdoc_options: []
211
+ require_paths:
212
+ - lib
213
+ required_ruby_version: !ruby/object:Gem::Requirement
214
+ none: false
215
+ requirements:
216
+ - - ! '>='
217
+ - !ruby/object:Gem::Version
218
+ version: '0'
219
+ required_rubygems_version: !ruby/object:Gem::Requirement
220
+ none: false
221
+ requirements:
222
+ - - ! '>='
223
+ - !ruby/object:Gem::Version
224
+ version: '0'
225
+ requirements: []
226
+ rubyforge_project: adhearsion-ims
227
+ rubygems_version: 1.8.24
228
+ signing_key:
229
+ specification_version: 3
230
+ summary: Adhearsion IMS Integration
231
+ test_files:
232
+ - spec/adhearsion-ims/controller_methods_spec.rb
233
+ - spec/spec_helper.rb