adhearsion-ims 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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