Skip to content

Commit 903ef9a

Browse files
committed
configuration parameters in config file and helpers in helper file. Some code refactoring and startup config default values changed
1 parent c4453e4 commit 903ef9a

9 files changed

+117
-120
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
tmp/*
22
models/*
3+
.loadpath
4+
.project

configure.rb

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
configure do
2+
set :environment, :development
3+
set :raise_errors, true
4+
set :dump_errors, true
5+
set :show_exceptions, false
6+
7+
$recognizer_pool = {:idle => []}
8+
CONFIG = {
9+
:nr_of_initial_recognizers => 4, #the number of recognizers initialized when server is started
10+
:max_idle_recognizers => 4, #number of recognizer instances that are allowed to be idle
11+
:max_recognizers => 4, #total amount of allowed recognizers
12+
:session_life_cycle => 10 * 60, #the amount of seconds the session result is kept in memory
13+
:max_session_open_time => 3 * 60, #amount of seconds during which the session is kept open and speech is received
14+
:timeout_in_seconds => 10, #session closed if after ending feed during 10 seconds no final result is given from recognizer
15+
:timeout_for_recognition_failure => 60 #session is closed by system if after 60 seconds no result is generated for session
16+
}
17+
18+
CONFIG[:nr_of_initial_recognizers].times do
19+
RecognizerPool.pool[:idle] << Recognizer.new
20+
end
21+
22+
scheduler = Rufus::Scheduler.start_new
23+
scheduler.every '120s' do
24+
RecognizerPool.organize_pool
25+
end
26+
end

helpers.rb

+58
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
helpers do
2+
3+
def render_error(message)
4+
if response_type == "application/json"
5+
error_to_json(message)
6+
else
7+
error_to_xml(message)
8+
end
9+
end
10+
11+
def error_to_json(message)
12+
{:error => {:message => message}}.to_json
13+
end
14+
15+
def error_to_xml(message)
16+
builder do |xml|
17+
xml.instruct! :xml, :version => '1.0'
18+
xml.error do
19+
xml.message message
20+
end
21+
end
22+
end
23+
24+
def set_headers
25+
headers "Content-Type"=>"text/xml;charset=utf-8;"
26+
end
27+
28+
def render_with_type(session)
29+
if response_type == "application/json"
30+
session.to_json
31+
else
32+
session.to_xml
33+
end
34+
end
35+
36+
def response_type
37+
env['HTTP_ACCEPT']
38+
end
39+
40+
def work_with_session(close = false)
41+
begin
42+
session = RecognizerPool.find_by_session_id(params[:id])
43+
if session
44+
if session.closed?
45+
render_error("Session with id #{params[:id]} is already closed")
46+
else
47+
close ? session.close! : session.recognize(request.body)
48+
render_with_type(session)
49+
end
50+
else
51+
render_error("Session with id #{params[:id]} not found")
52+
end
53+
rescue Exception => e
54+
render_error(e.message)
55+
end
56+
end
57+
58+
end

lib/recognizer_pool.rb

+7-13
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,4 @@
1-
module RecognizerPool
2-
MAX_IDLE_RECOGNIZERS = 2
3-
NUMBER_OF_INITIAL_RECOGNIZERS = 1
4-
MAX_RECOGNIZERS = 5
5-
LIFE_CYCLE_IN_SECONDS = 3 * 60
6-
MAX_OPEN_TIME_IN_SECONDS = 30
7-
1+
module RecognizerPool
82
def self.pool
93
$recognizer_pool
104
end
@@ -29,29 +23,29 @@ def self.add_new_to_active_pool(session)
2923
def self.get_recognizer
3024
if pool[:idle].size > 0
3125
pool[:idle].pop
32-
elsif (active_recognizers.size) < MAX_RECOGNIZERS
26+
elsif (active_recognizers.size) < CONFIG[:max_recognizers]
3327
Recognizer.new
3428
end
3529
end
3630

3731
def self.active_recognizers
3832
pool.collect do |session|
3933
if session[0] != :idle && !session[1].recognizer.nil?
40-
session[1].recognizer
34+
session[1].recognizer
4135
end
4236
end.compact
4337
end
4438

4539
def self.make_recognizer_idle_if_necessary(recognizer)
46-
pool[:idle] << recognizer if (pool[:idle].size < MAX_IDLE_RECOGNIZERS)
40+
pool[:idle] << recognizer if (pool[:idle].size < CONFIG[:max_idle_recognizers])
4741
end
4842

4943
def self.organize_pool
5044
pool.each_pair do |key, session|
5145
if key != :idle
52-
if (Time.now - session.created_at) > LIFE_CYCLE_IN_SECONDS
46+
if (Time.now - session.created_at) > CONFIG[:session_life_cycle]
5347
pool.delete(key)
54-
elsif !session.closed? && (Time.now - session.created_at) > MAX_OPEN_TIME_IN_SECONDS
48+
elsif !session.closed? && (Time.now - session.created_at) > CONFIG[:max_session_open_time]
5549
session.close!
5650
session.system_message = "Session time limit exceeded"
5751
elsif session.recognition_failing?
@@ -64,7 +58,7 @@ def self.organize_pool
6458
end
6559

6660
def self.add_new_recognizer_to_idle_pool_if_necessary
67-
if pool[:idle].empty? && ((active_recognizers.size) < MAX_RECOGNIZERS)
61+
if pool[:idle].empty? && ((active_recognizers.size) < CONFIG[:max_recognizers])
6862
pool[:idle] << Recognizer.new
6963
end
7064
end

lib/recognizer_session.rb

+5-5
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,13 @@ def close!(end_recognizer_feed = true)
3232
end
3333

3434
def recognition_failing?
35-
!closed? && ((Time.now - self.created_at) > TIMEOUT_FOR_RECOGNITION_FAILURE) && (self.result.nil? || self.result.size == 0)
35+
!closed? && ((Time.now - self.created_at) > CONFIG[:timeout_for_recognition_failure]) && (self.result.nil? || self.result.size == 0)
3636
end
3737

3838
def end_feed
3939
begin
40-
timeout(TIMEOUT_IN_SECONDS) {
41-
self.recognizer.end_feed
40+
timeout(CONFIG[:timeout_in_seconds]) {
41+
self.recognizer.end_feed
4242
}
4343
rescue Timeout::Error
4444
self.system_message = "execution expired"
@@ -49,8 +49,8 @@ def end_feed
4949

5050
def work_with_data(data)
5151
while buff = data.read(BUFFER_SIZE)
52-
self.recognizer.feed_data(buff)
53-
self.result = self.recognizer.result
52+
self.recognizer.feed_data(buff)
53+
self.result = self.recognizer.result
5454
end
5555
end
5656

recognizer_api.rb

+6-89
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,10 @@
11
$:.unshift(File.join(File.dirname(__FILE__), "lib"))
2-
%w(gst rubygems builder sinatra timeout recognizer bundler recognizer_pool recognizer_session rufus/scheduler json).each{|lib| require lib}
3-
Gst.init
4-
Bundler.require
5-
6-
configure do
7-
set :environment, :development
8-
set :raise_errors, true
9-
set :dump_errors, true
10-
set :show_exceptions, false
112

12-
$recognizer_pool = {:idle => []}
3+
%w(gst rubygems builder sinatra timeout recognizer bundler recognizer_pool
4+
recognizer_session rufus/scheduler json benchmark configure helpers).each{|lib| require lib}
135

14-
RecognizerPool::NUMBER_OF_INITIAL_RECOGNIZERS.times do
15-
RecognizerPool.pool[:idle] << Recognizer.new
16-
end
17-
18-
scheduler = Rufus::Scheduler.start_new
19-
scheduler.every '30s' do
20-
RecognizerPool.organize_pool
21-
end
22-
end
6+
Gst.init
7+
Bundler.require
238

249
post '/recognizer' do
2510
begin
@@ -32,39 +17,11 @@
3217
end
3318

3419
put '/recognizer/:id' do
35-
begin
36-
session = RecognizerPool.find_by_session_id(params[:id])
37-
if session
38-
if session.closed?
39-
render_error("Session with id #{params[:id]} is already closed")
40-
else
41-
session.recognize(request.body)
42-
render_with_type(session)
43-
end
44-
else
45-
render_error("Session with id #{params[:id]} not found")
46-
end
47-
rescue Exception => e
48-
render_error(e.message)
49-
end
20+
work_with_session
5021
end
5122

5223
put '/recognizer/:id/end' do
53-
begin
54-
session = RecognizerPool.find_by_session_id(params[:id])
55-
if session
56-
if session.closed?
57-
render_error("Session with id #{params[:id]} is already closed")
58-
else
59-
session.close!
60-
render_with_type(session)
61-
end
62-
else
63-
render_error("Session with id #{params[:id]} not found")
64-
end
65-
rescue Exception => e
66-
render_error(e.message)
67-
end
24+
work_with_session(true)
6825
end
6926

7027
get '/recognizer/:id' do
@@ -80,45 +37,5 @@
8037
end
8138
end
8239

83-
helpers do
84-
85-
def render_error(message)
86-
if response_type == "application/json"
87-
error_to_json(message)
88-
else
89-
error_to_xml(message)
90-
end
91-
end
92-
93-
def error_to_json(message)
94-
{:error => {:message => message}}.to_json
95-
end
96-
97-
def error_to_xml(message)
98-
builder do |xml|
99-
xml.instruct! :xml, :version => '1.0'
100-
xml.error do
101-
xml.message message
102-
end
103-
end
104-
end
105-
106-
def set_headers
107-
headers "Content-Type"=>"text/xml;charset=utf-8;"
108-
end
109-
110-
def render_with_type(session)
111-
if response_type == "application/json"
112-
session.to_json
113-
else
114-
session.to_xml
115-
end
116-
end
117-
118-
def response_type
119-
env['HTTP_ACCEPT']
120-
end
121-
end
122-
12340

12441

spec/lib/recognizer_pool_spec.rb

+10-10
Original file line numberDiff line numberDiff line change
@@ -50,19 +50,19 @@
5050

5151
it "should return nil if max recognizers exceeded" do
5252
$recognizer_pool = {:idle => []}
53-
RecognizerPool::MAX_RECOGNIZERS = 0
53+
CONFIG[:max_recognizers] = 0
5454
RecognizerPool.get_recognizer.should be_nil
5555
end
5656
end
5757

5858
describe "organize_pool" do
5959
before(:each) do
60-
RecognizerPool::MAX_RECOGNIZERS = 1
60+
CONFIG[:max_recognizers] = 1
6161
$recognizer_pool = {:idle => []}
6262
end
6363

6464
it "should close session if open time exceeded" do
65-
time = (Time.now - (RecognizerPool::MAX_OPEN_TIME_IN_SECONDS + 10))
65+
time = (Time.now - (CONFIG[:max_session_open_time] + 10))
6666
session = RecognizerSession.new
6767
session.stub!(:created_at).and_return(time)
6868
RecognizerPool.add_new_to_active_pool(session)
@@ -94,7 +94,7 @@
9494
end
9595

9696
it "should remove session if maximum life time exceeded" do
97-
time = (Time.now - (RecognizerPool::LIFE_CYCLE_IN_SECONDS + 10))
97+
time = (Time.now - (CONFIG[:session_life_cycle] + 10))
9898
session = RecognizerSession.new
9999
session.stub!(:created_at).and_return(time)
100100
RecognizerPool.add_new_to_active_pool(session)
@@ -137,7 +137,7 @@
137137
end
138138

139139
it "should not create new recognizer if max recognizers limit exceeded" do
140-
RecognizerPool::MAX_RECOGNIZERS = 2
140+
CONFIG[:max_recognizers] = 2
141141
$recognizer_pool = {:idle => []}
142142
current_idle_pool_size = RecognizerPool.pool[:idle].size
143143
RecognizerPool.should_receive(:active_recognizers).and_return([mock, mock])
@@ -156,10 +156,10 @@
156156
session_2 = RecognizerSession.new
157157
session_2.recognizer = recognizer_2
158158
$recognizer_pool = {
159-
"1" => session_1,
160-
"2" => session_2,
161-
"3" => RecognizerSession.new,
162-
:idle => [mock]}
159+
"1" => session_1,
160+
"2" => session_2,
161+
"3" => RecognizerSession.new,
162+
:idle => [mock]}
163163
active = RecognizerPool.active_recognizers
164164
active.size.should == 2
165165
active.include?(recognizer_1).should be_true
@@ -169,7 +169,7 @@
169169

170170
describe "make_recognizer_idle_if_necessary" do
171171
before(:each) do
172-
RecognizerPool::MAX_IDLE_RECOGNIZERS = 1
172+
CONFIG[:max_idle_recognizers] = 1
173173
end
174174

175175
it "should add to idle pool" do

spec/lib/recognizer_session_spec.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@
6464
describe "recognition_failing?" do
6565
it "should be true" do
6666
session = RecognizerSession.new
67-
time = (Time.now - (RecognizerSession::TIMEOUT_FOR_RECOGNITION_FAILURE + 10))
67+
time = (Time.now - (CONFIG[:timeout_for_recognition_failure] + 10))
6868
session.stub!(:created_at).and_return(time)
6969
session.recognition_failing?.should be_true
7070
end

spec/recognizer_api_spec.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@ def app
1010
describe "POST recognizer" do
1111
it "should be add active to recognizer pool" do
1212
RecognizerPool.pool.size.should == 1
13-
RecognizerPool.pool[:idle].size.should == RecognizerPool::NUMBER_OF_INITIAL_RECOGNIZERS
13+
RecognizerPool.pool[:idle].size.should == CONFIG[:nr_of_initial_recognizers]
1414
post '/recognizer'
1515
last_response.should be_ok
1616
RecognizerPool.pool.size.should == 2
17-
RecognizerPool.pool[:idle].size.should == (RecognizerPool::NUMBER_OF_INITIAL_RECOGNIZERS - 1)
17+
RecognizerPool.pool[:idle].size.should == (CONFIG[:nr_of_initial_recognizers] - 1)
1818
end
1919

2020
it "should be success" do

0 commit comments

Comments
 (0)