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 +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
|