ruby-asterisk 0.0.7 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 53c6e14b4aa50cd5f5e4742021d1b806c58ee640
4
+ data.tar.gz: 21d66e82b5e2755110f83c6fcecd235560cd992b
5
+ SHA512:
6
+ metadata.gz: be06cc29301f21aafa7a9d9d72cdfff8cca8cd1822fa447096e60f3db791f3d3bc6cdae8eb3bf8c506d63c077cb8f433ffb55cc01d3856c5f296e81ce6f47ba4
7
+ data.tar.gz: ecca78c7fa306058acc211ff90d6d330b0009f3219d3315fd2123190491e678b12103a6e3d3f510edf388a6782efc41f41a3309b1ae4556a8cadd69e51e62ec6
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # RUBY-ASTERISK
2
2
 
3
+ [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/emilianodellacasa/ruby-asterisk)
4
+
3
5
  This gem add support to your Ruby or RubyOnRails projects to Asterisk Manager Interface
4
6
 
5
7
  There was a project with the same name, but it appears to be discontinued so I decided to start a new project
@@ -90,6 +92,58 @@ To get the state of an extension use the following command
90
92
  ```ruby
91
93
  @ami.extension_state(@exten,@context)
92
94
  ```
95
+ ### SKINNY DEVICES AND LINES
96
+
97
+ To get list of skinny devices
98
+
99
+ ```ruby
100
+ @ami.skinny_devices
101
+ ```
102
+
103
+ To get list of skinny lines
104
+
105
+ ```ruby
106
+ @ami.skinny_lines
107
+ ```
108
+
109
+ ### QUEUE PAUSE
110
+
111
+ To pause or unpause a member in a call queue
112
+
113
+ ```ruby
114
+ @ami.queue_pause("SIP/100", "true", "myqueue", "reason")
115
+ ```
116
+
117
+ ### PING
118
+
119
+ To ping asterisk AMI
120
+
121
+ ```ruby
122
+ @ami.ping
123
+ ```
124
+
125
+ ### EVENT MASK
126
+
127
+ To enable or disable sending events to this manager connection
128
+
129
+ ```ruby
130
+ @ami.event_mask("on")
131
+ ```
132
+
133
+ ### SIPpeers
134
+
135
+ To get a list of sip peers (equivalent to "sip show peers" call on the asterisk server). This can be used to get a buddy list.
136
+
137
+ ```ruby
138
+ @ami.sip_peers
139
+ ```
140
+
141
+ ### STATUS
142
+
143
+ To get a status of a single channel or for all channels
144
+ ```ruby
145
+ @ami.status
146
+ ```
93
147
 
94
148
  ### THE RESPONSE OBJECT
95
149
 
@@ -100,6 +154,7 @@ The response object contains all information about all data received from Asteri
100
154
  - action_id
101
155
  - message
102
156
  - data
157
+ - raw_response
103
158
 
104
159
  The data property contains all additional information obtained from Asterisk, like for example the list of active channels after a "core show channels" command.
105
160
 
@@ -5,113 +5,144 @@ require "ruby-asterisk/response"
5
5
  require 'net/telnet'
6
6
 
7
7
  module RubyAsterisk
8
- class AMI
9
- attr_accessor :host, :port, :connected
10
-
11
- def initialize(host,port)
12
- self.host = host.to_s
13
- self.port = port.to_i
14
- self.connected = false
15
- @session = nil
16
- end
17
-
18
- def connect
19
- begin
20
- @session = Net::Telnet::new("Host" => self.host,"Port" => self.port)
21
- self.connected = true
22
- rescue Exception => ex
23
- false
24
- end
25
- end
26
-
27
- def disconnect
8
+ class AMI
9
+ attr_accessor :host, :port, :connected
10
+
11
+ def initialize(host,port)
12
+ self.host = host.to_s
13
+ self.port = port.to_i
14
+ self.connected = false
15
+ @session = nil
16
+ end
17
+
18
+ def connect
28
19
  begin
29
- @session.close if self.connected
30
- @session = nil
31
- self.connected = false
32
- true
20
+ @session = Net::Telnet::new("Host" => self.host,"Port" => self.port)
21
+ self.connected = true
33
22
  rescue Exception => ex
34
- puts ex
35
23
  false
36
24
  end
37
25
  end
38
26
 
39
- def login(username,password)
40
- self.connect unless self.connected
41
- request = Request.new("Login",{"Username" => username, "Secret" => password})
42
- request.commands.each do |command|
43
- @session.write(command)
44
- end
45
- @session.waitfor("String" => "ActionID: "+request.action_id, "Timeout" => 3) do |data|
46
- request.response_data << data
47
- end
48
- Response.new("Login",request.response_data)
49
- end
50
-
51
- def command(command)
52
- request = Request.new("Command",{ "Command" => command })
53
- request.commands.each do |command|
54
- @session.write(command)
55
- end
56
- @session.waitfor("String" => "ActionID: "+request.action_id, "Timeout" => 3) do |data|
57
- request.response_data << data
27
+ def disconnect
28
+ begin
29
+ @session.close if self.connected
30
+ @session = nil
31
+ self.connected = false
32
+ true
33
+ rescue Exception => ex
34
+ puts ex
35
+ false
58
36
  end
59
- Response.new("Command",request.response_data)
60
- end
37
+ end
61
38
 
62
- def core_show_channels
63
- request = Request.new("CoreShowChannels")
64
- request.commands.each do |command|
65
- @session.write(command)
66
- end
67
- @session.waitfor("String" => "ActionID: "+request.action_id, "Timeout" => 3) do |data|
68
- request.response_data << data
69
- end
70
- Response.new("CoreShowChannels",request.response_data)
71
- end
39
+ def login(username,password)
40
+ self.connect unless self.connected
41
+ execute "Login", {"Username" => username, "Secret" => password, "Event" => "On"}
42
+ end
72
43
 
73
- def meet_me_list
74
- request = Request.new("MeetMeList")
75
- request.commands.each do |command|
76
- @session.write(command)
77
- end
78
- @session.waitfor("String" => "ActionID: "+request.action_id, "Timeout" => 3) do |data|
79
- request.response_data << data
80
- end
81
- Response.new("MeetMeList",request.response_data)
44
+ def command(command)
45
+ execute "Command", {"Command" => command}
82
46
  end
83
47
 
84
- def parked_calls
85
- request = Request.new("ParkedCalls")
86
- request.commands.each do |command|
87
- @session.write(command)
88
- end
89
- @session.waitfor("String" => "ActionID: "+request.action_id, "Timeout" => 3) do |data|
90
- request.response_data << data
91
- end
92
- Response.new("ParkedCalls",request.response_data)
48
+ def core_show_channels
49
+ execute "CoreShowChannels"
93
50
  end
94
51
 
95
- def extension_state(exten,context)
96
- request = Request.new("ExtensionState",{"Exten" => exten, "Context" => context})
97
- request.commands.each do |command|
98
- @session.write(command)
99
- end
100
- @session.waitfor("String" => "ActionID: "+request.action_id, "Timeout" => 3) do |data|
101
- request.response_data << data
102
- end
103
- Response.new("ExtensionState",request.response_data)
52
+ def meet_me_list
53
+ execute "MeetMeList"
54
+ end
55
+
56
+ def parked_calls
57
+ execute "ParkedCalls"
58
+ end
59
+
60
+ def extension_state(exten, context, action_id=nil)
61
+ execute "ExtensionState", {"Exten" => exten, "Context" => context, "ActionID" => action_id}
104
62
  end
105
63
 
106
- def originate(caller,context,callee,priority,variable=nil)
107
- request = Request.new("Originate",{"Channel" => caller, "Context" => context, "Exten" => callee, "Priority" => priority, "Callerid" => caller, "Timeout" => "30000", "Variable" => variable })
108
- request.commands.each do |command|
64
+ def skinny_devices
65
+ execute "SKINNYdevices"
66
+ end
67
+
68
+ def skinny_lines
69
+ execute "SKINNYlines"
70
+ end
71
+
72
+ def status(channel=nil,action_id=nil)
73
+ execute "Status", {"Channel" => channel, "ActionID" => action_id}
74
+ end
75
+
76
+ def originate(caller,context,callee,priority,variable=nil)
77
+ execute "Originate", {"Channel" => caller, "Context" => context, "Exten" => callee, "Priority" => priority, "Callerid" => caller, "Timeout" => "30000", "Variable" => variable }
78
+ end
79
+
80
+ def channels
81
+ execute "Command", { "Command" => "show channels" }
82
+ end
83
+
84
+ def redirect(caller,context,callee,priority,variable=nil)
85
+ execute "Redirect", {"Channel" => caller, "Context" => context, "Exten" => callee, "Priority" => priority, "Callerid" => caller, "Timeout" => "30000", "Variable" => variable}
86
+ end
87
+
88
+ def queues
89
+ execute "Queues", {}
90
+ end
91
+
92
+ def queue_add(queue, exten, penalty=2, paused=false, member_name)
93
+ execute "QueueAdd", {"Queue" => queue, "Interface" => exten, "Penalty" => penalty, "Paused" => paused, "MemberName" => member_name}
94
+ end
95
+
96
+ def queue_pause(queue, exten)
97
+ execute "QueuePause", {"Interface" => exten, "Paused" => paused}
98
+ end
99
+
100
+ def queue_remove(queue, exten)
101
+ execute "QueueRemove", {"Queue" => queue, "Interface" => exten}
102
+ end
103
+
104
+ def queue_status
105
+ execute "QueueStatus"
106
+ end
107
+
108
+ def queue_summary(queue)
109
+ execute "QueueSummary", {"Queue" => queue}
110
+ end
111
+
112
+ def mailbox_status(exten, context="default")
113
+ execute "MailboxStatus", {"Mailbox" => "#{exten}@#{context}"}
114
+ end
115
+
116
+ def mailbox_count(exten, context="default")
117
+ execute "MailboxCount", {"Mailbox" => "#{exten}@#{context}"}
118
+ end
119
+
120
+ def queue_pause(interface,paused,queue,reason='none')
121
+ execute "QueuePause", {"Interface" => interface, "Paused" => paused, "Queue" => queue, "Reason" => reason}
122
+ end
123
+
124
+ def ping
125
+ execute "Ping"
126
+ end
127
+
128
+ def event_mask(event_mask="off")
129
+ execute "Events", {"EventMask" => event_mask}
130
+ end
131
+
132
+ def sip_peers
133
+ execute "SIPpeers"
134
+ end
135
+
136
+ private
137
+ def execute(command, options={})
138
+ request = Request.new(command, options)
139
+ request.commands.each do |command|
109
140
  @session.write(command)
110
141
  end
111
- @session.waitfor("String" => "ActionID: "+request.action_id, "Timeout" => 30) do |data|
142
+ @session.waitfor("Match" => /ActionID: #{request.action_id}.*?\n\n/m, "Timeout" => 10) do |data|
112
143
  request.response_data << data
113
144
  end
114
- Response.new("Originate",request.response_data)
115
- end
116
- end
145
+ Response.new(command,request.response_data)
146
+ end
147
+ end
117
148
  end
@@ -1,32 +1,32 @@
1
1
  module RubyAsterisk
2
- class Request
3
- attr_accessor :action, :action_id, :parameters, :response_data
2
+ class Request
3
+ attr_accessor :action, :action_id, :parameters, :response_data
4
4
 
5
- def initialize(action,parameters={})
6
- self.action = action
7
- self.action_id = self.generate_action_id
8
- self.parameters = parameters
9
- self.response_data = ""
10
- end
5
+ def initialize(action,parameters={})
6
+ self.action = action
7
+ self.action_id = self.generate_action_id
8
+ self.parameters = parameters
9
+ self.response_data = ""
10
+ end
11
11
 
12
- def commands
13
- _commands=["Action: "+self.action+"\r\n","ActionID: "+self.action_id+"\r\n"]
14
- self.parameters.each do |key,value|
15
- _commands<<key+": "+value+"\r\n" unless value.nil?
16
- end
17
- _commands[_commands.length-1]<<"\r\n"
18
- _commands
19
- end
12
+ def commands
13
+ _commands=["Action: "+self.action+"\r\n","ActionID: "+self.action_id+"\r\n"]
14
+ self.parameters.each do |key,value|
15
+ _commands<<key+": "+value+"\r\n" unless value.nil?
16
+ end
17
+ _commands[_commands.length-1]<<"\r\n"
18
+ _commands
19
+ end
20
20
 
21
- protected
21
+ protected
22
22
 
23
- def generate_action_id
23
+ def generate_action_id
24
24
  if RUBY_VERSION.start_with?("1.9")
25
- Random.rand(999).to_s
25
+ Random.rand(999).to_s
26
26
  else
27
27
  rand(999).to_s
28
28
  end
29
- end
29
+ end
30
30
 
31
- end
31
+ end
32
32
  end
@@ -1,114 +1,162 @@
1
1
  module RubyAsterisk
2
- class Response
3
- attr_accessor :type, :success, :action_id, :message, :data
4
-
5
- def initialize(type,response)
6
- self.type = type
7
- self.success = self._parse_successfull(response)
8
- self.action_id = self._parse_action_id(response)
9
- self.message = self._parse_message(response)
10
- self.data = self._parse_data(response)
11
- end
12
-
13
- protected
14
-
15
- def _parse_successfull(response)
16
- response.include?("Response: Success")
17
- end
18
-
19
- def _parse_action_id(response)
20
- _action_id = self._parse(response,"ActionID:")
21
- end
22
-
23
- def _parse_message(response)
24
- _message = self._parse(response,"Message:")
25
- end
26
-
27
- def _parse(response,field)
28
- _value = nil
29
- response.each_line do |line|
2
+ class Response
3
+ attr_accessor :type, :success, :action_id, :message, :data, :raw_response
4
+
5
+ def initialize(type,response)
6
+ self.raw_response = response
7
+ self.type = type
8
+ self.success = self._parse_successfull(response)
9
+ self.action_id = self._parse_action_id(response)
10
+ self.message = self._parse_message(response)
11
+ self.data = self._parse_data(response)
12
+ end
13
+
14
+ protected
15
+
16
+ def _parse_successfull(response)
17
+ response.include?("Response: Success")
18
+ end
19
+
20
+ def _parse_action_id(response)
21
+ self._parse(response,"ActionID:")
22
+ end
23
+
24
+ def _parse_message(response)
25
+ self._parse(response,"Message:")
26
+ end
27
+
28
+ def _parse(response,field)
29
+ _value = nil
30
+ response.each_line do |line|
30
31
  if line.start_with?(field)
31
32
  _value = line[line.rindex(":")+1..line.size].strip
32
33
  end
33
34
  end
34
- _value
35
- end
36
-
37
- def _parse_data(response)
38
- case self.type
39
- when "CoreShowChannels"
40
- self._parse_data_core_show_channels(response)
41
- when "ParkedCalls"
42
- self._parse_data_parked_calls(response)
43
- when "Originate"
44
- self._parse_originate(response)
45
- when "MeetMeList"
35
+ _value
36
+ end
37
+
38
+ def _parse_data(response)
39
+ case self.type
40
+ when "CoreShowChannels"
41
+ self._parse_data_core_show_channels(response)
42
+ when "ParkedCalls"
43
+ self._parse_data_parked_calls(response)
44
+ when "Originate"
45
+ self._parse_originate(response)
46
+ when "MeetMeList"
46
47
  self._parse_meet_me_list(response)
47
- when "ExtensionState"
48
- self._parse_extension_state(response)
49
- end
48
+ when "Status"
49
+ self._parse_status(response)
50
+ when "ExtensionState"
51
+ self._parse_extension_state(response)
52
+ when "SKINNYdevices"
53
+ self._parse_skinny_devices(response)
54
+ when "SKINNYlines"
55
+ self._parse_skinny_lines(response)
56
+ when "Command"
57
+ response
58
+ when "QueuePause"
59
+ self._parse_queue_pause(response)
60
+ when "Pong"
61
+ self._parse_pong(response)
62
+ when "Events"
63
+ self._parse_event_mask(response)
64
+ when "SIPpeers"
65
+ self._parse_sip_peers(response)
66
+ end
67
+
68
+ end
69
+
70
+ def _parse_sip_peers(response)
71
+ self._parse_objects(response, :peers, "Event: PeerEntry")
50
72
  end
51
73
 
52
- def _parse_meet_me_list(response)
74
+ def _parse_meet_me_list(response)
53
75
  self._parse_objects(response,:rooms,"Event: MeetmeList")
54
76
  end
55
77
 
56
- def _parse_originate(response)
57
- self._parse_objects(response,:dial,"Event: Dial")
58
- end
78
+ def _parse_originate(response)
79
+ self._parse_objects(response,:dial,"Event: Dial")
80
+ end
59
81
 
60
- def _parse_data_parked_calls(response)
61
- self._parse_objects(response,:calls,"Event: ParkedCall")
62
- end
82
+ def _parse_data_parked_calls(response)
83
+ self._parse_objects(response,:calls,"Event: ParkedCall")
84
+ end
63
85
 
64
- def _parse_data_core_show_channels(response)
65
- self._parse_objects(response,:channels,"Event: CoreShowChannel","Event: CoreShowChannelsComplete")
66
- end
86
+ def _parse_data_core_show_channels(response)
87
+ self._parse_objects(response,:channels,"Event: CoreShowChannel","Event: CoreShowChannelsComplete")
88
+ end
67
89
 
68
- def _parse_extension_state(response)
90
+ def _parse_extension_state(response)
69
91
  _data = self._parse_objects(response,:hints,"Response:")
70
- self._convert_status(_data)
92
+ self._convert_status(_data)
93
+ end
94
+
95
+ def _parse_skinny_devices(response)
96
+ self._parse_objects(response,:skinnydevs,"Event: DeviceEntry")
97
+ end
98
+
99
+ def _parse_skinny_lines(response)
100
+ self._parse_objects(response,:skinnylines,"Event: LineEntry")
101
+ end
102
+
103
+ def _parse_queue_pause(response)
104
+ _data = self._parse_objects(response,:queue_pause,"Response:")
105
+ end
106
+
107
+ def _parse_pong(response)
108
+ _data = self._parse_objects(response,:pong, "Response:")
109
+ end
110
+
111
+ def _parse_event_mask(response)
112
+ _data = self._parse_objects(response, :event_mask, "Ping:")
113
+ end
114
+
115
+ def _parse_status(response)
116
+ self._parse_objects(response, :status, "Event: Status")
71
117
  end
72
118
 
73
- def _convert_status(_data)
74
- _data[:hints].each do |hint|
75
- case hint["Status"]
76
- when "-1"
77
- hint["DescriptiveStatus"] = "Extension not found"
78
- when "0"
79
- hint["DescriptiveStatus"] = "Idle"
80
- when "1"
119
+ def _convert_status(_data)
120
+ _data[:hints].each do |hint|
121
+ case hint["Status"]
122
+ when "-1"
123
+ hint["DescriptiveStatus"] = "Extension not found"
124
+ when "0"
125
+ hint["DescriptiveStatus"] = "Idle"
126
+ when "1"
81
127
  hint["DescriptiveStatus"] = "In Use"
82
- when "2"
128
+ when "2"
83
129
  hint["DescriptiveStatus"] = "Busy"
84
- when "4"
130
+ when "4"
85
131
  hint["DescriptiveStatus"] = "Unavailable"
86
- when "8"
132
+ when "8"
87
133
  hint["DescriptiveStatus"] = "Ringing"
88
- when "16"
134
+ when "16"
89
135
  hint["DescriptiveStatus"] = "On Hold"
90
- end
91
- end
92
- _data
93
- end
136
+ end
137
+ end
138
+ _data
139
+ end
94
140
 
95
- def _parse_objects(response,symbol_name,search_for,stop_with=nil)
96
- _data = { symbol_name => [] }
141
+ def _parse_objects(response,symbol_name,search_for,stop_with=nil)
142
+ _data = { symbol_name => [] }
97
143
  parsing = false
98
144
  object = nil
99
145
  response.each_line do |line|
100
- if line.strip.empty? or (!stop_with.nil? and line.start_with?(stop_with))
146
+ line.strip!
147
+ if line.strip.empty? or (!stop_with.nil? and line.start_with?(stop_with))
101
148
  parsing = false
102
149
  elsif line.start_with?(search_for)
103
150
  _data[symbol_name] << object unless object.nil?
104
151
  object = {}
105
152
  parsing = true
106
153
  elsif parsing
107
- object[line.split(':')[0].strip]=line.split(':')[1].strip unless line.split(':')[1].nil?
154
+ tokens = line.split(':', 2)
155
+ object[tokens[0].strip]=tokens[1].strip unless tokens[1].nil?
108
156
  end
109
157
  end
110
158
  _data[symbol_name] << object unless object.nil?
111
159
  _data
112
- end
113
- end
160
+ end
161
+ end
114
162
  end
@@ -1,3 +1,3 @@
1
1
  module Rami
2
- VERSION = "0.0.7"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -2,6 +2,16 @@
2
2
  require 'spec_helper'
3
3
  describe RubyAsterisk::Response do
4
4
 
5
+ def sip_peers_response
6
+ "Response: Success
7
+ Message: Peer status list will follow
8
+
9
+ Event: PeerEntry
10
+ Channeltype: SIP
11
+ ObjectName: 9915057
12
+ IPport: 5060"
13
+ end
14
+
5
15
  def empty_core_show_channels_response
6
16
  "Event: CoreShowChannelsComplete
7
17
  EventList: Complete
@@ -127,6 +137,11 @@ describe RubyAsterisk::Response do
127
137
  @response = RubyAsterisk::Response.new("Originate",originate_response)
128
138
  @response.data[:dial][0]["UniqueID"].should eq("1335457364.68")
129
139
  end
140
+
141
+ it "should have a field with original raw response" do
142
+ @response = RubyAsterisk::Response.new("Originate",originate_response)
143
+ @response.raw_response.should eq(originate_response)
144
+ end
130
145
  end
131
146
 
132
147
  describe "receiving a MeetMeList request" do
@@ -154,4 +169,17 @@ describe RubyAsterisk::Response do
154
169
  end
155
170
  end
156
171
  end
172
+
173
+ describe "receiving a SIPPeers request" do
174
+ it "should parse correctly data coming from Asterisk abous sip peers" do
175
+ @response = RubyAsterisk::Response.new("SIPpeers",sip_peers_response)
176
+ @response.data[:peers].should_not be_empty
177
+ end
178
+
179
+ it "should correctly fill the fields" do
180
+ @response = RubyAsterisk::Response.new("SIPpeers",sip_peers_response)
181
+ @response.data[:peers][0]["ObjectName"].should eq("9915057")
182
+ @response.data[:peers][0]["IPport"].should eq("5060")
183
+ end
184
+ end
157
185
  end
@@ -139,4 +139,12 @@ describe RubyAsterisk do
139
139
  @session.extension_state("9100","HINT").should be_kind_of(RubyAsterisk::Response)
140
140
  end
141
141
  end
142
+
143
+ describe ".sip_peers" do
144
+ it "should return a response object" do
145
+ @session.login("mark","mysecret")
146
+ @session.sip_peers.should be_kind_of(RubyAsterisk::Response)
147
+ end
148
+ end
149
+
142
150
  end
metadata CHANGED
@@ -1,49 +1,51 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: ruby-asterisk
3
- version: !ruby/object:Gem::Version
4
- prerelease:
5
- version: 0.0.7
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
6
5
  platform: ruby
7
- authors:
6
+ authors:
8
7
  - Emiliano Della Casa
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
-
13
- date: 2012-07-11 00:00:00 Z
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
11
+ date: 2013-11-07 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
16
14
  name: rake
17
- prerelease: false
18
- requirement: &id001 !ruby/object:Gem::Requirement
19
- none: false
20
- requirements:
21
- - - ">="
22
- - !ruby/object:Gem::Version
23
- version: "0"
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
24
20
  type: :development
25
- version_requirements: *id001
26
- - !ruby/object:Gem::Dependency
27
- name: rspec
28
21
  prerelease: false
29
- requirement: &id002 !ruby/object:Gem::Requirement
30
- none: false
31
- requirements:
32
- - - ">="
33
- - !ruby/object:Gem::Version
34
- version: "0"
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
35
34
  type: :development
36
- version_requirements: *id002
37
- description: Add support to your ruby or rails projects to Asterisk Manager Interface (AMI)
38
- email:
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: Add support to your ruby or rails projects to Asterisk Manager Interface
42
+ (AMI)
43
+ email:
39
44
  - e.dellacasa@engim.eu
40
45
  executables: []
41
-
42
46
  extensions: []
43
-
44
47
  extra_rdoc_files: []
45
-
46
- files:
48
+ files:
47
49
  - .gitignore
48
50
  - .rspec
49
51
  - CHANGELOG
@@ -61,30 +63,25 @@ files:
61
63
  - spec/spec_helper.rb
62
64
  homepage: http://github.com/emilianodellacasa/ruby-asterisk
63
65
  licenses: []
64
-
66
+ metadata: {}
65
67
  post_install_message:
66
68
  rdoc_options: []
67
-
68
- require_paths:
69
+ require_paths:
69
70
  - lib
70
- required_ruby_version: !ruby/object:Gem::Requirement
71
- none: false
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: "0"
76
- required_rubygems_version: !ruby/object:Gem::Requirement
77
- none: false
78
- requirements:
79
- - - ">="
80
- - !ruby/object:Gem::Version
81
- version: "0"
71
+ required_ruby_version: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ required_rubygems_version: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - '>='
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
82
81
  requirements: []
83
-
84
82
  rubyforge_project: ruby-asterisk
85
- rubygems_version: 1.8.17
83
+ rubygems_version: 2.0.3
86
84
  signing_key:
87
- specification_version: 3
85
+ specification_version: 4
88
86
  summary: Asterisk Manager Interface in Ruby
89
87
  test_files: []
90
-