adhearsion-ims 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +4 -0
- data/README.md +38 -0
- data/Rakefile +10 -0
- data/lib/adhearsion-ims.rb +5 -0
- data/lib/adhearsion-ims/controller_methods.rb +160 -0
- data/lib/adhearsion-ims/plugin.rb +48 -0
- data/lib/adhearsion-ims/version.rb +5 -0
- data/spec/adhearsion-ims/controller_methods_spec.rb +149 -0
- data/spec/spec_helper.rb +12 -0
- metadata +233 -0
data/Gemfile
ADDED
data/README.md
ADDED
@@ -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
|
+
|
data/Rakefile
ADDED
@@ -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,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
|
data/spec/spec_helper.rb
ADDED
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
|