sinatra-asterisk 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/sinatra/asterisk.rb +58 -10
- data/lib/sinatra/asterisk/utils.rb +14 -0
- data/lib/sinatra/asterisk/version.rb +1 -1
- data/spec/sinatra/asterisk_spec.rb +62 -28
- data/spec/spec_helper.rb +27 -0
- metadata +3 -2
data/lib/sinatra/asterisk.rb
CHANGED
@@ -2,12 +2,16 @@ require 'sinatra/base'
|
|
2
2
|
require 'java'
|
3
3
|
require File.expand_path(__FILE__ + '/../asterisk/asterisk-java-1.0.0.M3.jar')
|
4
4
|
|
5
|
+
require 'sinatra/asterisk/utils'
|
6
|
+
|
5
7
|
module Sinatra
|
6
8
|
module Asterisk
|
7
9
|
java_import org.asteriskjava.fastagi.BaseAgiScript
|
8
10
|
java_import org.asteriskjava.fastagi.MappingStrategy
|
9
11
|
java_import org.asteriskjava.fastagi.DefaultAgiServer
|
10
12
|
java_import org.asteriskjava.manager.ManagerConnectionFactory
|
13
|
+
java_import org.asteriskjava.manager.ManagerEventListener
|
14
|
+
|
11
15
|
|
12
16
|
module Helpers
|
13
17
|
end
|
@@ -26,13 +30,8 @@ module Sinatra
|
|
26
30
|
sinatra_eigenclass = (class <<sinatra; self; end)
|
27
31
|
sinatra_eigenclass.class_eval do
|
28
32
|
# TODO: do this with a module ?
|
29
|
-
define_method
|
30
|
-
|
31
|
-
end
|
32
|
-
|
33
|
-
define_method :channel do
|
34
|
-
channel
|
35
|
-
end
|
33
|
+
define_method(:request) { request }
|
34
|
+
define_method(:channel) { channel }
|
36
35
|
end
|
37
36
|
|
38
37
|
sinatra.instance_eval(&block)
|
@@ -50,13 +49,48 @@ module Sinatra
|
|
50
49
|
end
|
51
50
|
end
|
52
51
|
end
|
52
|
+
|
53
|
+
class SinatraManagerEventListener
|
54
|
+
include ManagerEventListener
|
55
|
+
|
56
|
+
def initialize(*args)
|
57
|
+
@event_handlers, @sinatra_app = *args
|
58
|
+
end
|
59
|
+
|
60
|
+
def eval_in_sinatra(event, &block)
|
61
|
+
sinatra = @sinatra_app::new!
|
62
|
+
sinatra_eigenclass = (class <<sinatra; self; end)
|
63
|
+
sinatra_eigenclass.class_eval do
|
64
|
+
# TODO: do this with a module ?
|
65
|
+
define_method(:event) { event }
|
66
|
+
end
|
67
|
+
|
68
|
+
sinatra.instance_eval(&block)
|
69
|
+
end
|
70
|
+
|
71
|
+
# implements ManagerEventListener
|
72
|
+
def onManagerEvent(event)
|
73
|
+
event_name = event.class.name.gsub(/^.*::/, '').gsub(/Event$/, '')
|
74
|
+
catch(:halt) do
|
75
|
+
block = @event_handlers.each do |event_class, block|
|
76
|
+
catch :pass do
|
77
|
+
throw :pass unless event_class.nil? || Utils::camelize(event_class) == event_name
|
78
|
+
throw :halt, eval_in_sinatra(event, &block)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
53
84
|
|
54
|
-
def start_agi_server
|
85
|
+
def start_agi_server(port = 4573)
|
55
86
|
@agi_script = SinatraAgiScript::new
|
56
87
|
@agi_script.agi_handlers = agi_handlers
|
57
|
-
|
88
|
+
|
89
|
+
# this is a hack; settings returns the Sinatra class
|
90
|
+
@agi_script.sinatra_app = settings
|
58
91
|
|
59
92
|
@agi_server = DefaultAgiServer::new()
|
93
|
+
@agi_server.port = port
|
60
94
|
@agi_server.mappingStrategy = @agi_script
|
61
95
|
Thread.new do
|
62
96
|
begin
|
@@ -70,21 +104,35 @@ module Sinatra
|
|
70
104
|
def connect_to_manager(hostname, username, password)
|
71
105
|
factory = ManagerConnectionFactory::new(hostname, username, password)
|
72
106
|
manager_connection = factory.createManagerConnection
|
107
|
+
initialize_manager_event_listener(manager_connection)
|
73
108
|
manager_connection.login
|
74
109
|
|
75
110
|
set :manager, manager_connection
|
76
111
|
end
|
77
|
-
|
112
|
+
|
113
|
+
def initialize_manager_event_listener(manager_connection)
|
114
|
+
@manager_event_listener = SinatraManagerEventListener::new(event_handlers, settings)
|
115
|
+
manager_connection.addEventListener(@manager_event_listener)
|
116
|
+
end
|
117
|
+
|
78
118
|
def agi(uri_pattern = nil, conditions = {}, &block)
|
79
119
|
uri_pattern = Regexp::new(uri_pattern) if uri_pattern && !uri_pattern.respond_to?(:match)
|
80
120
|
agi_handlers << [uri_pattern, conditions, Proc::new(&block)]
|
81
121
|
end
|
122
|
+
|
123
|
+
def on_event(event_class = nil, &block)
|
124
|
+
event_handlers << [event_class, Proc::new(&block)]
|
125
|
+
end
|
82
126
|
|
83
127
|
private
|
84
128
|
|
85
129
|
def agi_handlers
|
86
130
|
@agi_handlers ||= []
|
87
131
|
end
|
132
|
+
|
133
|
+
def event_handlers
|
134
|
+
@event_handlers ||= []
|
135
|
+
end
|
88
136
|
|
89
137
|
def self.registered(app)
|
90
138
|
app.helpers Helpers
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Sinatra
|
2
|
+
module Asterisk
|
3
|
+
module Utils
|
4
|
+
# Borrowed from activesupport-3.0.4
|
5
|
+
def self.camelize(lower_case_and_underscored_word, first_letter_in_uppercase = true)
|
6
|
+
if first_letter_in_uppercase
|
7
|
+
lower_case_and_underscored_word.to_s.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
|
8
|
+
else
|
9
|
+
lower_case_and_underscored_word.to_s[0].chr.downcase + camelize(lower_case_and_underscored_word)[1..-1]
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -1,43 +1,77 @@
|
|
1
|
+
# store top level for use during the tests
|
2
|
+
$top_level = self
|
3
|
+
|
1
4
|
require File.expand_path(__FILE__ + "/../../spec_helper.rb")
|
2
5
|
|
3
6
|
class Sinatra::Asterisk::TestApp < Sinatra::Application
|
4
|
-
|
7
|
+
include Sinatra::Asterisk
|
8
|
+
|
9
|
+
start_agi_server
|
5
10
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
request.helper_was_called
|
10
|
-
end
|
11
|
+
helpers do
|
12
|
+
def test_request_helper
|
13
|
+
request.helper_was_called
|
11
14
|
end
|
12
15
|
|
13
|
-
|
14
|
-
|
15
|
-
test_helper
|
16
|
+
def test_event_helper
|
17
|
+
event.helper_was_called
|
16
18
|
end
|
17
|
-
end
|
19
|
+
end
|
18
20
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
:requestURL => "agi://fake_test_host:1234/#{script}") #[?param1=value1¶m2=value2]. "
|
21
|
+
agi /^test/ do
|
22
|
+
request.block_was_called
|
23
|
+
test_request_helper
|
24
|
+
end
|
25
|
+
|
26
|
+
on_event :reload do
|
27
|
+
event.reload_event_block_was_called
|
28
|
+
end
|
29
|
+
|
30
|
+
on_event do
|
31
|
+
event.block_was_called
|
32
|
+
test_event_helper
|
32
33
|
end
|
33
|
-
@mock_request
|
34
34
|
end
|
35
35
|
|
36
36
|
describe Sinatra::Asterisk::TestApp do
|
37
|
-
|
38
|
-
|
39
|
-
|
37
|
+
describe "when receiving an AGI request" do
|
38
|
+
it "should access the request scope from an AGI" do
|
39
|
+
mock_request("test").should_receive(:block_was_called)
|
40
|
+
@mock_request.should_receive(:helper_was_called)
|
41
|
+
|
42
|
+
Sinatra::Asterisk::TestApp.instance_variable_get("@agi_script").service(@mock_request, nil)
|
43
|
+
end
|
40
44
|
|
41
|
-
|
45
|
+
it "should not call a handler for script 'not_test'" do
|
46
|
+
mock_request("not_test").should_not_receive(:block_was_called)
|
47
|
+
@mock_request.should_not_receive(:helper_was_called)
|
48
|
+
|
49
|
+
Sinatra::Asterisk::TestApp.instance_variable_get("@agi_script").service(@mock_request, nil)
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should access the request scope from a classical AGI" do
|
53
|
+
mock_request("test_top_level").should_receive(:block_was_called)
|
54
|
+
$top_level.send :agi, /^test_top_level$/ do
|
55
|
+
request.block_was_called
|
56
|
+
end
|
57
|
+
$top_level.send :start_agi_server, 4574
|
58
|
+
Sinatra::Application.instance_variable_get("@agi_script").service(@mock_request, nil)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
describe "when receiving a ManagerEvent" do
|
62
|
+
before do
|
63
|
+
manager_connection = mock("manager_connection")
|
64
|
+
manager_connection.should_receive(:addEventListener)
|
65
|
+
Sinatra::Asterisk::TestApp.class_eval do
|
66
|
+
initialize_manager_event_listener(manager_connection)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should call handler for ReloadEvent" do
|
71
|
+
ev = org.asteriskjava.manager.event.ReloadEvent::new("source")
|
72
|
+
ev.should_receive(:reload_event_block_was_called)
|
73
|
+
|
74
|
+
Sinatra::Asterisk::TestApp.instance_variable_get("@manager_event_listener").onManagerEvent(ev)
|
75
|
+
end
|
42
76
|
end
|
43
77
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1 +1,28 @@
|
|
1
|
+
|
1
2
|
require "sinatra/asterisk"
|
3
|
+
require "sinatra" # required for classical style testing
|
4
|
+
|
5
|
+
def mock_request(script, headers = {})
|
6
|
+
unless @mock_request
|
7
|
+
@mock_request = mock('MockAgiRequest')
|
8
|
+
@mock_request.stub!(
|
9
|
+
:extension => "test",
|
10
|
+
:priority => "1",
|
11
|
+
:context => "default",
|
12
|
+
:uniqueId => "123456789.7",
|
13
|
+
:language => "en",
|
14
|
+
:channel => "SIP/127.0.0.1-00000003",
|
15
|
+
:type => "SIP",
|
16
|
+
:script => script,
|
17
|
+
:requestURL => "agi://fake_test_host:1234/#{script}") #[?param1=value1¶m2=value2]. "
|
18
|
+
end
|
19
|
+
@mock_request
|
20
|
+
end
|
21
|
+
|
22
|
+
def mock_event()
|
23
|
+
unless @mock_event
|
24
|
+
@mock_event = mock('MockManagerEvent')
|
25
|
+
end
|
26
|
+
@mock_event
|
27
|
+
end
|
28
|
+
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: sinatra-asterisk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0.
|
5
|
+
version: 0.0.3
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Dominique BROEGLIN
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-04-
|
13
|
+
date: 2011-04-30 00:00:00 +02:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -64,6 +64,7 @@ files:
|
|
64
64
|
- Rakefile
|
65
65
|
- lib/sinatra/asterisk.rb
|
66
66
|
- lib/sinatra/asterisk/asterisk-java-1.0.0.M3.jar
|
67
|
+
- lib/sinatra/asterisk/utils.rb
|
67
68
|
- lib/sinatra/asterisk/version.rb
|
68
69
|
- sinatra-asterisk.gemspec
|
69
70
|
- spec/sinatra/asterisk_spec.rb
|