sinatra-asterisk 0.0.2 → 0.0.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.
- 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
|