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.
@@ -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 :request do
30
- request
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
- @agi_script.sinatra_app = self
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,5 +1,5 @@
1
1
  module Sinatra
2
2
  module Asterisk
3
- VERSION = "0.0.2"
3
+ VERSION = "0.0.3"
4
4
  end
5
5
  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
- include Sinatra::Asterisk
7
+ include Sinatra::Asterisk
8
+
9
+ start_agi_server
5
10
 
6
- start_agi_server
7
- helpers do
8
- def test_helper
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
- agi /^test/ do
14
- request.block_was_called
15
- test_helper
16
+ def test_event_helper
17
+ event.helper_was_called
16
18
  end
17
- end
19
+ end
18
20
 
19
- def mock_request(script, headers = {})
20
- unless @mock_request
21
- @mock_request = mock('MockAgiRequest')
22
- @mock_request.stub!(
23
- :extension => "test",
24
- :priority => "1",
25
- :context => "default",
26
- :uniqueId => "123456789.7",
27
- :language => "en",
28
- :channel => "SIP/127.0.0.1-00000003",
29
- :type => "SIP",
30
- :script => script,
31
- :requestURL => "agi://fake_test_host:1234/#{script}") #[?param1=value1&param2=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
- it "should call the block" do
38
- mock_request("test").should_receive(:block_was_called)
39
- @mock_request.should_receive(:helper_was_called)
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
- Sinatra::Asterisk::TestApp.instance_variable_get("@agi_script").service(@mock_request, nil)
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
@@ -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&param2=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.2
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-24 00:00:00 +02:00
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