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