punchblock 0.4.2 → 0.4.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,11 @@
1
+ # develop
2
+
3
+ # v0.4.3
4
+ * Feature: Support for meta-data on recordings (size & duration)
5
+ * Feature: Allow specifying all of Blather's setup options (required to use PB as an XMPP component)
6
+ * Bugfix: Rayo events are discarded if they don't come from the specified domain
7
+ * Bugfix: Component execution in the sample DSL now doesn't expect events on the main queue
8
+
1
9
  # v0.4.2
2
10
  * Bugfix: Conference complete event was not being handled
3
11
 
data/Gemfile CHANGED
@@ -1,2 +1,4 @@
1
1
  source :rubygems
2
2
  gemspec
3
+
4
+ gem 'bluecloth' unless RUBY_PLATFORM =~ /java/
data/Rakefile CHANGED
@@ -17,7 +17,8 @@ RSpec::Core::RakeTask.new(:rcov) do |spec|
17
17
  end
18
18
 
19
19
  task :default => :spec
20
- task :hudson => ['ci:setup:rspec', :spec]
20
+ task :ci => ['ci:setup:rspec', :spec]
21
+ task :hudson => :ci
21
22
 
22
23
  require 'yard'
23
24
  YARD::Rake::YardocTask.new
@@ -73,7 +73,6 @@ connection_thread = Thread.new do
73
73
  end
74
74
 
75
75
  CALL_QUEUES = {}
76
- INFO_EVENT_QUEUE = Queue.new
77
76
 
78
77
  ### DISPATCHER THREAD
79
78
  # This thread multiplexes the event stream from the underlying connection handler and routes them
@@ -94,14 +93,11 @@ Thread.new do
94
93
  CALL_QUEUES[event.call_id] = Queue.new
95
94
  CALL_QUEUES[event.call_id].push event
96
95
  run_call connection, event
97
- when Event::Info
98
- INFO_EVENT_QUEUE.push event
99
- when Event::Answered, Event::Complete, Event::End, Event::Ringing
96
+ when Event
100
97
  CALL_QUEUES[event.call_id].push event
101
98
  else
102
99
  puts "Unknown event: #{event.inspect}"
103
100
  end
104
-
105
101
  end
106
102
  end
107
103
 
@@ -5,6 +5,19 @@
5
5
  has_guarded_handlers
6
6
  }.each { |l| require l }
7
7
 
8
+ class Hash
9
+ def select(&block)
10
+ val = super(&block)
11
+ if val.is_a?(Array)
12
+ val = val.inject({}) do |accumulator, element|
13
+ accumulator[element[0]] = element[1]
14
+ accumulator
15
+ end
16
+ end
17
+ val
18
+ end
19
+ end
20
+
8
21
  module Punchblock
9
22
  extend ActiveSupport::Autoload
10
23
 
@@ -201,8 +201,16 @@ module Punchblock
201
201
  read_attr :uri
202
202
  end
203
203
 
204
+ def duration
205
+ read_attr :duration, :to_i
206
+ end
207
+
208
+ def size
209
+ read_attr :size, :to_i
210
+ end
211
+
204
212
  def inspect_attributes # :nodoc:
205
- [:uri] + super
213
+ [:uri, :duration, :size] + super
206
214
  end
207
215
  end
208
216
 
@@ -23,11 +23,12 @@ module Punchblock
23
23
  #
24
24
  def initialize(options = {})
25
25
  super
26
- raise ArgumentError unless @username = options.delete(:username)
27
- raise ArgumentError unless options.has_key? :password
28
- @rayo_domain = options[:rayo_domain] || Blather::JID.new(@username).domain
29
26
 
30
- setup @username, options.delete(:password)
27
+ raise ArgumentError unless (@username = options[:username]) && options[:password]
28
+
29
+ setup *[:username, :password, :host, :port, :certs].map { |key| options.delete key }
30
+
31
+ @rayo_domain = options[:rayo_domain] || Blather::JID.new(@username).domain
31
32
 
32
33
  @callmap = {} # This hash maps call IDs to their XMPP domain.
33
34
 
@@ -124,7 +125,7 @@ module Punchblock
124
125
  private
125
126
 
126
127
  def handle_presence(p)
127
- throw :pass unless p.rayo_event?
128
+ throw :pass unless p.rayo_event? && p.from.domain == @rayo_domain
128
129
  @logger.info "Receiving event for call ID #{p.call_id}" if @logger
129
130
  @callmap[p.call_id] = p.from.domain
130
131
  @logger.debug p.inspect if @logger
@@ -4,43 +4,42 @@
4
4
  # THIS IS IMPERMANENT AND WILL DISAPPEAR
5
5
  module Punchblock
6
6
  class DSL
7
- def initialize(protocol, call, queue) # :nodoc:
8
- @protocol, @call, @queue = protocol, call, queue
7
+ def initialize(connection, call, queue) # :nodoc:
8
+ @connection, @call, @queue = connection, call, queue
9
9
  end
10
10
 
11
11
  def accept # :nodoc:
12
- write @protocol.class::Command::Accept.new
12
+ write Command::Accept.new
13
13
  end
14
14
 
15
15
  def answer # :nodoc:
16
- write @protocol.class::Command::Answer.new
16
+ write Command::Answer.new
17
17
  end
18
18
 
19
19
  def hangup # :nodoc:
20
- write @protocol.class::Command::Hangup.new
20
+ write Command::Hangup.new
21
21
  end
22
22
 
23
23
  def reject(reason = nil) # :nodoc:
24
- write @protocol.class::Command::Reject.new(:reason => reason)
24
+ write Command::Reject.new(:reason => reason)
25
25
  end
26
26
 
27
27
  def redirect(dest) # :nodoc:
28
- write @protocol.class::Command::Redirect.new(:to => dest)
28
+ write Command::Redirect.new(:to => dest)
29
29
  end
30
30
 
31
31
  def record(options = {})
32
- write @protocol.class::Component::Record.new(options)
32
+ write Component::Record.new(options)
33
33
  end
34
34
 
35
35
  def say(string, type = :text) # :nodoc:
36
- write @protocol.class::Component::Tropo::Say.new(type => string)
37
- puts "Waiting on the queue..."
38
- response = @queue.pop
39
- # TODO: Error handling
36
+ component = Component::Tropo::Say.new(type => string)
37
+ write component
38
+ component.complete_event.resource
40
39
  end
41
40
 
42
41
  def write(msg) # :nodoc:
43
- @protocol.write @call, msg
42
+ @connection.write @call, msg
44
43
  end
45
44
  end
46
45
  end
@@ -1,3 +1,3 @@
1
1
  module Punchblock
2
- VERSION = "0.4.2"
2
+ VERSION = "0.4.3"
3
3
  end
@@ -23,7 +23,7 @@ Gem::Specification.new do |s|
23
23
  s.required_rubygems_version = Gem::Requirement.new(">= 1.3.7") if s.respond_to? :required_rubygems_version=
24
24
 
25
25
  s.add_runtime_dependency %q<niceogiri>, [">= 0.0.4"]
26
- s.add_runtime_dependency %q<blather>, [">= 0.5.3"]
26
+ s.add_runtime_dependency %q<blather>, [">= 0.5.7"]
27
27
  s.add_runtime_dependency %q<pry>, [">= 0.8.3"]
28
28
  s.add_runtime_dependency %q<activesupport>, [">= 2.1.0"]
29
29
  s.add_runtime_dependency %q<state_machine>, [">= 1.0.1"]
@@ -34,7 +34,6 @@ Gem::Specification.new do |s|
34
34
  s.add_development_dependency %q<rspec>, ["~> 2.3.0"]
35
35
  s.add_development_dependency %q<ci_reporter>, [">= 1.6.3"]
36
36
  s.add_development_dependency %q<yard>, ["~> 0.6.0"]
37
- s.add_development_dependency %q<bluecloth>, [">= 0"]
38
37
  s.add_development_dependency %q<rcov>, [">= 0"]
39
38
  s.add_development_dependency %q<rake>, [">= 0"]
40
39
  s.add_development_dependency %q<mocha>, [">= 0"]
@@ -158,7 +158,7 @@ module Punchblock
158
158
  <<-MESSAGE
159
159
  <complete xmlns='urn:xmpp:rayo:ext:1'>
160
160
  <success xmlns='urn:xmpp:rayo:record:complete:1'/>
161
- <recording xmlns='urn:xmpp:rayo:record:complete:1' uri="file:/tmp/rayo7451601434771683422.mp3"/>
161
+ <recording xmlns='urn:xmpp:rayo:record:complete:1' uri="file:/tmp/rayo7451601434771683422.mp3" duration="34000" size="23450"/>
162
162
  </complete>
163
163
  MESSAGE
164
164
  end
@@ -175,7 +175,9 @@ module Punchblock
175
175
  subject { RayoNode.import(parse_stanza(stanza).root).recording }
176
176
 
177
177
  it { should be_instance_of Record::Recording }
178
- its(:uri) { should == "file:/tmp/rayo7451601434771683422.mp3" }
178
+ its(:uri) { should == "file:/tmp/rayo7451601434771683422.mp3" }
179
+ its(:duration) { should == 34000 }
180
+ its(:size) { should == 23450 }
179
181
  end
180
182
  end
181
183
 
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  module Punchblock
4
4
  describe Connection do
5
- let(:connection) { Connection.new :username => 1, :password => 1 }
5
+ let(:connection) { Connection.new :username => '1@call.rayo.net', :password => 1 }
6
6
 
7
7
  subject { connection }
8
8
 
@@ -156,6 +156,28 @@ module Punchblock
156
156
 
157
157
  it { should be_empty }
158
158
  end
159
+
160
+ describe "from someone other than the rayo domain" do
161
+ let :irrelevant_xml do
162
+ <<-MSG
163
+ <presence to='16577@app.rayo.net/1' from='9f00061@jabber.org/fgh4590'>
164
+ <complete xmlns='urn:xmpp:rayo:ext:1'>
165
+ <success xmlns='urn:xmpp:tropo:say:complete:1' />
166
+ </complete>
167
+ </presence>
168
+ MSG
169
+ end
170
+
171
+ let(:example_irrelevant_event) { import_stanza irrelevant_xml }
172
+
173
+ before do
174
+ lambda { connection.__send__ :handle_presence, example_irrelevant_event }.should throw_symbol(:pass)
175
+ end
176
+
177
+ subject { connection.event_queue }
178
+
179
+ it { should be_empty }
180
+ end
159
181
  end
160
182
  end
161
183
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: punchblock
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.2
4
+ version: 0.4.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,12 +11,12 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2011-09-21 00:00:00.000000000 +01:00
14
+ date: 2011-09-30 00:00:00.000000000 +01:00
15
15
  default_executable:
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: niceogiri
19
- requirement: &2164697820 !ruby/object:Gem::Requirement
19
+ requirement: &2157505380 !ruby/object:Gem::Requirement
20
20
  none: false
21
21
  requirements:
22
22
  - - ! '>='
@@ -24,21 +24,21 @@ dependencies:
24
24
  version: 0.0.4
25
25
  type: :runtime
26
26
  prerelease: false
27
- version_requirements: *2164697820
27
+ version_requirements: *2157505380
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: blather
30
- requirement: &2164697340 !ruby/object:Gem::Requirement
30
+ requirement: &2157504780 !ruby/object:Gem::Requirement
31
31
  none: false
32
32
  requirements:
33
33
  - - ! '>='
34
34
  - !ruby/object:Gem::Version
35
- version: 0.5.3
35
+ version: 0.5.7
36
36
  type: :runtime
37
37
  prerelease: false
38
- version_requirements: *2164697340
38
+ version_requirements: *2157504780
39
39
  - !ruby/object:Gem::Dependency
40
40
  name: pry
41
- requirement: &2164696840 !ruby/object:Gem::Requirement
41
+ requirement: &2157504300 !ruby/object:Gem::Requirement
42
42
  none: false
43
43
  requirements:
44
44
  - - ! '>='
@@ -46,10 +46,10 @@ dependencies:
46
46
  version: 0.8.3
47
47
  type: :runtime
48
48
  prerelease: false
49
- version_requirements: *2164696840
49
+ version_requirements: *2157504300
50
50
  - !ruby/object:Gem::Dependency
51
51
  name: activesupport
52
- requirement: &2164696360 !ruby/object:Gem::Requirement
52
+ requirement: &2157503760 !ruby/object:Gem::Requirement
53
53
  none: false
54
54
  requirements:
55
55
  - - ! '>='
@@ -57,10 +57,10 @@ dependencies:
57
57
  version: 2.1.0
58
58
  type: :runtime
59
59
  prerelease: false
60
- version_requirements: *2164696360
60
+ version_requirements: *2157503760
61
61
  - !ruby/object:Gem::Dependency
62
62
  name: state_machine
63
- requirement: &2164695820 !ruby/object:Gem::Requirement
63
+ requirement: &2157503280 !ruby/object:Gem::Requirement
64
64
  none: false
65
65
  requirements:
66
66
  - - ! '>='
@@ -68,10 +68,10 @@ dependencies:
68
68
  version: 1.0.1
69
69
  type: :runtime
70
70
  prerelease: false
71
- version_requirements: *2164695820
71
+ version_requirements: *2157503280
72
72
  - !ruby/object:Gem::Dependency
73
73
  name: future-resource
74
- requirement: &2164695340 !ruby/object:Gem::Requirement
74
+ requirement: &2157502680 !ruby/object:Gem::Requirement
75
75
  none: false
76
76
  requirements:
77
77
  - - ! '>='
@@ -79,10 +79,10 @@ dependencies:
79
79
  version: 0.0.2
80
80
  type: :runtime
81
81
  prerelease: false
82
- version_requirements: *2164695340
82
+ version_requirements: *2157502680
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: has-guarded-handlers
85
- requirement: &2164681760 !ruby/object:Gem::Requirement
85
+ requirement: &2157502200 !ruby/object:Gem::Requirement
86
86
  none: false
87
87
  requirements:
88
88
  - - ! '>='
@@ -90,10 +90,10 @@ dependencies:
90
90
  version: 0.0.3
91
91
  type: :runtime
92
92
  prerelease: false
93
- version_requirements: *2164681760
93
+ version_requirements: *2157502200
94
94
  - !ruby/object:Gem::Dependency
95
95
  name: bundler
96
- requirement: &2164681240 !ruby/object:Gem::Requirement
96
+ requirement: &2157501720 !ruby/object:Gem::Requirement
97
97
  none: false
98
98
  requirements:
99
99
  - - ~>
@@ -101,10 +101,10 @@ dependencies:
101
101
  version: 1.0.0
102
102
  type: :development
103
103
  prerelease: false
104
- version_requirements: *2164681240
104
+ version_requirements: *2157501720
105
105
  - !ruby/object:Gem::Dependency
106
106
  name: rspec
107
- requirement: &2164680720 !ruby/object:Gem::Requirement
107
+ requirement: &2157501140 !ruby/object:Gem::Requirement
108
108
  none: false
109
109
  requirements:
110
110
  - - ~>
@@ -112,10 +112,10 @@ dependencies:
112
112
  version: 2.3.0
113
113
  type: :development
114
114
  prerelease: false
115
- version_requirements: *2164680720
115
+ version_requirements: *2157501140
116
116
  - !ruby/object:Gem::Dependency
117
117
  name: ci_reporter
118
- requirement: &2164680240 !ruby/object:Gem::Requirement
118
+ requirement: &2157500560 !ruby/object:Gem::Requirement
119
119
  none: false
120
120
  requirements:
121
121
  - - ! '>='
@@ -123,10 +123,10 @@ dependencies:
123
123
  version: 1.6.3
124
124
  type: :development
125
125
  prerelease: false
126
- version_requirements: *2164680240
126
+ version_requirements: *2157500560
127
127
  - !ruby/object:Gem::Dependency
128
128
  name: yard
129
- requirement: &2164679720 !ruby/object:Gem::Requirement
129
+ requirement: &2157500040 !ruby/object:Gem::Requirement
130
130
  none: false
131
131
  requirements:
132
132
  - - ~>
@@ -134,21 +134,10 @@ dependencies:
134
134
  version: 0.6.0
135
135
  type: :development
136
136
  prerelease: false
137
- version_requirements: *2164679720
138
- - !ruby/object:Gem::Dependency
139
- name: bluecloth
140
- requirement: &2164679160 !ruby/object:Gem::Requirement
141
- none: false
142
- requirements:
143
- - - ! '>='
144
- - !ruby/object:Gem::Version
145
- version: '0'
146
- type: :development
147
- prerelease: false
148
- version_requirements: *2164679160
137
+ version_requirements: *2157500040
149
138
  - !ruby/object:Gem::Dependency
150
139
  name: rcov
151
- requirement: &2164678600 !ruby/object:Gem::Requirement
140
+ requirement: &2157499500 !ruby/object:Gem::Requirement
152
141
  none: false
153
142
  requirements:
154
143
  - - ! '>='
@@ -156,10 +145,10 @@ dependencies:
156
145
  version: '0'
157
146
  type: :development
158
147
  prerelease: false
159
- version_requirements: *2164678600
148
+ version_requirements: *2157499500
160
149
  - !ruby/object:Gem::Dependency
161
150
  name: rake
162
- requirement: &2164678100 !ruby/object:Gem::Requirement
151
+ requirement: &2157499000 !ruby/object:Gem::Requirement
163
152
  none: false
164
153
  requirements:
165
154
  - - ! '>='
@@ -167,10 +156,10 @@ dependencies:
167
156
  version: '0'
168
157
  type: :development
169
158
  prerelease: false
170
- version_requirements: *2164678100
159
+ version_requirements: *2157499000
171
160
  - !ruby/object:Gem::Dependency
172
161
  name: mocha
173
- requirement: &2164677580 !ruby/object:Gem::Requirement
162
+ requirement: &2157498500 !ruby/object:Gem::Requirement
174
163
  none: false
175
164
  requirements:
176
165
  - - ! '>='
@@ -178,10 +167,10 @@ dependencies:
178
167
  version: '0'
179
168
  type: :development
180
169
  prerelease: false
181
- version_requirements: *2164677580
170
+ version_requirements: *2157498500
182
171
  - !ruby/object:Gem::Dependency
183
172
  name: i18n
184
- requirement: &2164677040 !ruby/object:Gem::Requirement
173
+ requirement: &2157497940 !ruby/object:Gem::Requirement
185
174
  none: false
186
175
  requirements:
187
176
  - - ! '>='
@@ -189,10 +178,10 @@ dependencies:
189
178
  version: '0'
190
179
  type: :development
191
180
  prerelease: false
192
- version_requirements: *2164677040
181
+ version_requirements: *2157497940
193
182
  - !ruby/object:Gem::Dependency
194
183
  name: countdownlatch
195
- requirement: &2164676440 !ruby/object:Gem::Requirement
184
+ requirement: &2157480960 !ruby/object:Gem::Requirement
196
185
  none: false
197
186
  requirements:
198
187
  - - ! '>='
@@ -200,7 +189,7 @@ dependencies:
200
189
  version: '0'
201
190
  type: :development
202
191
  prerelease: false
203
- version_requirements: *2164676440
192
+ version_requirements: *2157480960
204
193
  description: Like Rack is to Rails and Sinatra, Punchblock provides a consistent API
205
194
  on top of several underlying third-party call control protocols.
206
195
  email: punchblock@adhearsion.com