ruby_ami 2.1.0 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f5e6e035e1967a44a905b10ad704dbac564d4c90
4
- data.tar.gz: 20f7fd7d4a8061c6e15dffa0b2f178645ef31b32
3
+ metadata.gz: 290ed21fc6ee40c83c12d15b2acf9240f7ce47f1
4
+ data.tar.gz: 34ec462b7e67818135a307ead4baafae599fbae4
5
5
  SHA512:
6
- metadata.gz: a5fafdd9ed56328ed906339a18d1ad8e3671985b6fd5a834ce9c6fe3d6e7ffccd7c44c2f0960d7f6f77358b3739ea6bb3e522f92191209e30b2ad12648cf0e7d
7
- data.tar.gz: 0dc58ad3d2f2e3bf7e88fb66c43230d8c513bd61f7bdf7a196bd816e94fc78d7542b0eb55b26c154a7de6c26a56e4c881cd65ea52988192d5dd0d9e6d24be0f2
6
+ metadata.gz: 20c254c3d24652245ee2d806406aee1646e2756960e9a1a0a1bf14a9e77ec7e9b3c2048fde0a5e5b0d83210fe50d531cdc2222bddf552c2bae04a51fcd6d54fb
7
+ data.tar.gz: 039e2f837d3a941dedaab896db37bdc6867da934b0bc2eb3c9b1a3bb0e8ff2c9ae1d5ecda2d159a7adf843777834e6cb3a3b9764eab13a29366e378a7b4b28ce
data/.travis.yml CHANGED
@@ -1,13 +1,14 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 1.9.2
4
3
  - 1.9.3
5
4
  - 2.0.0
6
- - jruby-19mode
7
- - rbx-19mode
8
- - ruby-head
5
+ - 2.1.0
6
+ - jruby
7
+ - rbx-2.1.1
8
+ - ruby-head
9
9
  matrix:
10
10
  allow_failures:
11
- - rvm: jruby-19mode
11
+ - rvm: ruby-head
12
+ - rvm: rbx-2.1.1
12
13
  notifications:
13
14
  irc: "irc.freenode.org#adhearsion"
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # [develop](https://github.com/adhearsion/ruby_ami)
2
2
 
3
+ # [2.2.0](https://github.com/adhearsion/ruby_ami/compare/v2.1.0...v2.2.0) - [2014-02-28](https://rubygems.org/gems/ruby_ami/versions/2.2.0)
4
+ * Feature: Provide timestamps of events as `#timestamp`, `#receipt_time` and `#best_time`.
5
+ * Feature: More performant parsing of AGI environment strings
6
+
3
7
  # [2.1.0](https://github.com/adhearsion/ruby_ami/compare/v2.0.0...v2.1.0) - [2013-05-29](https://rubygems.org/gems/ruby_ami/versions/2.1.0)
4
8
  * Enhancement: Replace Ragel parser with pure Ruby version, which is much more performant and simpler
5
9
  * Bugfix: Handle AGI 5xx responses
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'bundler/setup'
5
+ require 'ruby_ami'
6
+ require 'benchmark/ips'
7
+
8
+ env_string = "agi_request%3A%20async%0Aagi_channel%3A%20SIP%2F1234-00000000%0Aagi_language%3A%20en%0Aagi_type%3A%20SIP%0Aagi_uniqueid%3A%201320835995.0%0Aagi_version%3A%201.8.4.1%0Aagi_callerid%3A%205678%0Aagi_calleridname%3A%20Jane%20Smith%0Aagi_callingpres%3A%200%0Aagi_callingani2%3A%200%0Aagi_callington%3A%200%0Aagi_callingtns%3A%200%0Aagi_dnid%3A%201000%0Aagi_rdnis%3A%20unknown%0Aagi_context%3A%20default%0Aagi_extension%3A%201000%0Aagi_priority%3A%201%0Aagi_enhanced%3A%200.0%0Aagi_accountcode%3A%20%0Aagi_threadid%3A%204366221312%0A%0A"
9
+
10
+ Benchmark.ips do |ips|
11
+ ips.report("environment parsing") { RubyAMI::AsyncAGIEnvironmentParser.new(env_string).to_hash }
12
+ ips.report("CGI unescaping") { CGI.unescape(env_string) }
13
+ end
@@ -10,7 +10,7 @@ module RubyAMI
10
10
 
11
11
  def initialize(result_string)
12
12
  @result_string = result_string.dup
13
- raise ArgumentError, "The result string did not match the required format." unless match
13
+ raise ArgumentError, "The result string (#{@result_string}) did not match the required format (#{FORMAT})." unless match
14
14
  parse
15
15
  end
16
16
 
@@ -3,13 +3,16 @@ require 'cgi'
3
3
 
4
4
  module RubyAMI
5
5
  class AsyncAGIEnvironmentParser
6
+ NEWLINE = "%0A".freeze
7
+ COLON_SPACE = '%3A%20'.freeze
8
+
6
9
  def initialize(environment_string)
7
10
  @environment_string = environment_string.dup
8
11
  end
9
12
 
10
13
  def to_hash
11
14
  to_array.inject({}) do |accumulator, element|
12
- accumulator[element[0].to_sym] = element[1] || ''
15
+ accumulator[element[0].to_sym] = CGI.unescape(element[1] || '')
13
16
  accumulator
14
17
  end
15
18
  end
@@ -21,7 +24,7 @@ module RubyAMI
21
24
  private
22
25
 
23
26
  def to_array
24
- CGI.unescape(@environment_string).split("\n").map { |p| p.split ': ' }
27
+ @environment_string.split(NEWLINE).map { |p| p.split COLON_SPACE }
25
28
  end
26
29
  end
27
30
  end
@@ -3,13 +3,25 @@ require 'ruby_ami/response'
3
3
 
4
4
  module RubyAMI
5
5
  class Event < Response
6
- attr_reader :name
6
+ attr_reader :name, :receipt_time
7
7
 
8
8
  def initialize(name, headers = {})
9
+ @receipt_time = DateTime.now
9
10
  super headers
10
11
  @name = name
11
12
  end
12
13
 
14
+ # @return [DateTime, nil] the timestamp of the event, or nil if none is available
15
+ def timestamp
16
+ return unless headers['Timestamp']
17
+ DateTime.strptime headers['Timestamp'], '%s'
18
+ end
19
+
20
+ # @return [DateTime] the best known timestamp for the event. Either its timestamp if specified, or its receipt time if not.
21
+ def best_time
22
+ timestamp || receipt_time
23
+ end
24
+
13
25
  def inspect_attributes
14
26
  [:name] + super
15
27
  end
@@ -1,4 +1,4 @@
1
1
  # encoding: utf-8
2
2
  module RubyAMI
3
- VERSION = "2.1.0"
3
+ VERSION = "2.2.0"
4
4
  end
@@ -3,6 +3,49 @@ require 'spec_helper'
3
3
 
4
4
  module RubyAMI
5
5
  describe Event do
6
+ subject { described_class.new 'Hangup' }
7
+
8
+ describe "#receipt_time" do
9
+ before do
10
+ @now = DateTime.now
11
+ DateTime.stub now: @now
12
+ end
13
+
14
+ it "should be the time the object was created (event receipt time)" do
15
+ subject.receipt_time.should == @now
16
+ end
17
+ end
18
+
19
+ context "when the event has a timestamp" do
20
+ subject { described_class.new 'Hangup', 'Timestamp' => '1393368380.572575' }
21
+
22
+ describe "#timestamp" do
23
+ it "should be a time object representing the event's timestamp (assuming UTC)" do
24
+ subject.timestamp.should == DateTime.new(2014, 2, 25, 22, 46, 20)
25
+ end
26
+ end
27
+
28
+ describe "#best_time" do
29
+ it "should be the timestamp" do
30
+ subject.best_time.should == subject.timestamp
31
+ end
32
+ end
33
+ end
34
+
35
+ context "when the event does not have a timestamp" do
36
+ describe "#timestamp" do
37
+ it "should be nil" do
38
+ subject.timestamp.should be_nil
39
+ end
40
+ end
41
+
42
+ describe "#best_time" do
43
+ it "should be the receipt_time" do
44
+ subject.best_time.should == subject.receipt_time
45
+ end
46
+ end
47
+ end
48
+
6
49
  describe "equality" do
7
50
  context "with the same name and the same headers" do
8
51
  let :event1 do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby_ami
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Langfeld
@@ -9,160 +9,160 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-05-29 00:00:00.000000000 Z
12
+ date: 2014-02-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: celluloid-io
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - ~>
18
+ - - "~>"
19
19
  - !ruby/object:Gem::Version
20
20
  version: '0.13'
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
- - - ~>
25
+ - - "~>"
26
26
  - !ruby/object:Gem::Version
27
27
  version: '0.13'
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: bundler
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
- - - ~>
32
+ - - "~>"
33
33
  - !ruby/object:Gem::Version
34
34
  version: '1.0'
35
35
  type: :development
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
- - - ~>
39
+ - - "~>"
40
40
  - !ruby/object:Gem::Version
41
41
  version: '1.0'
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: rspec
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
- - - ~>
46
+ - - "~>"
47
47
  - !ruby/object:Gem::Version
48
48
  version: '2.5'
49
49
  type: :development
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
- - - ~>
53
+ - - "~>"
54
54
  - !ruby/object:Gem::Version
55
55
  version: '2.5'
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: cucumber
58
58
  requirement: !ruby/object:Gem::Requirement
59
59
  requirements:
60
- - - '>='
60
+ - - ">="
61
61
  - !ruby/object:Gem::Version
62
62
  version: '0'
63
63
  type: :development
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
- - - '>='
67
+ - - ">="
68
68
  - !ruby/object:Gem::Version
69
69
  version: '0'
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: yard
72
72
  requirement: !ruby/object:Gem::Requirement
73
73
  requirements:
74
- - - ~>
74
+ - - "~>"
75
75
  - !ruby/object:Gem::Version
76
76
  version: '0.6'
77
77
  type: :development
78
78
  prerelease: false
79
79
  version_requirements: !ruby/object:Gem::Requirement
80
80
  requirements:
81
- - - ~>
81
+ - - "~>"
82
82
  - !ruby/object:Gem::Version
83
83
  version: '0.6'
84
84
  - !ruby/object:Gem::Dependency
85
85
  name: rake
86
86
  requirement: !ruby/object:Gem::Requirement
87
87
  requirements:
88
- - - '>='
88
+ - - ">="
89
89
  - !ruby/object:Gem::Version
90
90
  version: '0'
91
91
  type: :development
92
92
  prerelease: false
93
93
  version_requirements: !ruby/object:Gem::Requirement
94
94
  requirements:
95
- - - '>='
95
+ - - ">="
96
96
  - !ruby/object:Gem::Version
97
97
  version: '0'
98
98
  - !ruby/object:Gem::Dependency
99
99
  name: guard-rspec
100
100
  requirement: !ruby/object:Gem::Requirement
101
101
  requirements:
102
- - - '>='
102
+ - - ">="
103
103
  - !ruby/object:Gem::Version
104
104
  version: '0'
105
105
  type: :development
106
106
  prerelease: false
107
107
  version_requirements: !ruby/object:Gem::Requirement
108
108
  requirements:
109
- - - '>='
109
+ - - ">="
110
110
  - !ruby/object:Gem::Version
111
111
  version: '0'
112
112
  - !ruby/object:Gem::Dependency
113
113
  name: guard-shell
114
114
  requirement: !ruby/object:Gem::Requirement
115
115
  requirements:
116
- - - '>='
116
+ - - ">="
117
117
  - !ruby/object:Gem::Version
118
118
  version: '0'
119
119
  type: :development
120
120
  prerelease: false
121
121
  version_requirements: !ruby/object:Gem::Requirement
122
122
  requirements:
123
- - - '>='
123
+ - - ">="
124
124
  - !ruby/object:Gem::Version
125
125
  version: '0'
126
126
  - !ruby/object:Gem::Dependency
127
127
  name: guard-cucumber
128
128
  requirement: !ruby/object:Gem::Requirement
129
129
  requirements:
130
- - - '>='
130
+ - - ">="
131
131
  - !ruby/object:Gem::Version
132
132
  version: '0'
133
133
  type: :development
134
134
  prerelease: false
135
135
  version_requirements: !ruby/object:Gem::Requirement
136
136
  requirements:
137
- - - '>='
137
+ - - ">="
138
138
  - !ruby/object:Gem::Version
139
139
  version: '0'
140
140
  - !ruby/object:Gem::Dependency
141
141
  name: guard-rake
142
142
  requirement: !ruby/object:Gem::Requirement
143
143
  requirements:
144
- - - '>='
144
+ - - ">="
145
145
  - !ruby/object:Gem::Version
146
146
  version: '0'
147
147
  type: :development
148
148
  prerelease: false
149
149
  version_requirements: !ruby/object:Gem::Requirement
150
150
  requirements:
151
- - - '>='
151
+ - - ">="
152
152
  - !ruby/object:Gem::Version
153
153
  version: '0'
154
154
  - !ruby/object:Gem::Dependency
155
155
  name: benchmark_suite
156
156
  requirement: !ruby/object:Gem::Requirement
157
157
  requirements:
158
- - - '>='
158
+ - - ">="
159
159
  - !ruby/object:Gem::Version
160
160
  version: '0'
161
161
  type: :development
162
162
  prerelease: false
163
163
  version_requirements: !ruby/object:Gem::Requirement
164
164
  requirements:
165
- - - '>='
165
+ - - ">="
166
166
  - !ruby/object:Gem::Version
167
167
  version: '0'
168
168
  description: A Ruby client library for the Asterisk Management Interface built on
@@ -174,15 +174,16 @@ executables: []
174
174
  extensions: []
175
175
  extra_rdoc_files: []
176
176
  files:
177
- - .gitignore
178
- - .rspec
179
- - .travis.yml
177
+ - ".gitignore"
178
+ - ".rspec"
179
+ - ".travis.yml"
180
180
  - CHANGELOG.md
181
181
  - Gemfile
182
182
  - Guardfile
183
183
  - LICENSE.txt
184
184
  - README.md
185
185
  - Rakefile
186
+ - benchmarks/agi_env_parse.rb
186
187
  - benchmarks/lexer.rb
187
188
  - cucumber.yml
188
189
  - features/lexer.feature
@@ -223,17 +224,17 @@ require_paths:
223
224
  - lib
224
225
  required_ruby_version: !ruby/object:Gem::Requirement
225
226
  requirements:
226
- - - '>='
227
+ - - ">="
227
228
  - !ruby/object:Gem::Version
228
229
  version: '0'
229
230
  required_rubygems_version: !ruby/object:Gem::Requirement
230
231
  requirements:
231
- - - '>='
232
+ - - ">="
232
233
  - !ruby/object:Gem::Version
233
234
  version: '0'
234
235
  requirements: []
235
236
  rubyforge_project: ruby_ami
236
- rubygems_version: 2.0.3
237
+ rubygems_version: 2.2.0
237
238
  signing_key:
238
239
  specification_version: 4
239
240
  summary: Futzing with AMI so you don't have to