punchblock 0.4.2 → 0.4.3

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.
@@ -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