poliqarpr 0.1.1 → 0.1.6

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/changelog.txt CHANGED
@@ -1,3 +1,16 @@
1
+ 0.1.5
2
+ - Raises exception if failed to open corpus
3
+ - New PoliqarpException class as a base for all Poliqarp exception
4
+
5
+ 0.1.4
6
+ - The logger data is automatically flushed.
7
+
8
+ 0.1.3
9
+ - Alternative logger for debug
10
+
11
+ 0.1.2
12
+ - IndexOutOfBounds includes info about index
13
+
1
14
  0.1.1
2
15
  - remove messy debug message
3
16
  - raise IndexOutOfBounds exception when the excerpt index is larger than the
@@ -6,9 +6,12 @@ module Poliqarp
6
6
  # This class is the implementation of the Poliqarp server client.
7
7
  class Client
8
8
  # If debug is turned on, the communication between server and client
9
- # is logged to standard output.
9
+ # is logged to logger.
10
10
  attr_writer :debug
11
11
 
12
+ # Logger used for debugging. STDOUT by default.
13
+ attr_accessor :logger
14
+
12
15
  # The configuration of the client.
13
16
  attr_reader :config
14
17
 
@@ -21,7 +24,8 @@ module Poliqarp
21
24
  def initialize(session_name="RUBY", debug=false)
22
25
  @session_name = session_name
23
26
  @debug = debug
24
- @connector = Connector.new(debug)
27
+ @logger = STDOUT
28
+ @connector = Connector.new(self)
25
29
  @config = Config.new(self,500000)
26
30
  @answer_queue = Queue.new
27
31
  @waiting_mutext = Mutex.new
@@ -64,6 +68,19 @@ module Poliqarp
64
68
  talk "CLOSE"
65
69
  end
66
70
 
71
+ # Prints the debug +msg+ to the logger if debugging is turned on.
72
+ # Accepts both regular message and block with message. The second
73
+ # form is provided for messages which aren't cheep to build.
74
+ def debug(msg=nil)
75
+ if @debug
76
+ if block_given?
77
+ msg = yield
78
+ end
79
+ logger.puts msg
80
+ logger.flush
81
+ end
82
+ end
83
+
67
84
  # *Asynchronous* Opens the corpus given as +path+. To open the default
68
85
  # corpus pass +:default+ as the argument.
69
86
  #
@@ -73,7 +90,12 @@ module Poliqarp
73
90
  if path == :default
74
91
  open_corpus(DEFAULT_CORPUS, &handler)
75
92
  else
76
- talk("OPEN #{path}", :async, &handler)
93
+ result = talk("OPEN #{path}", :async, &handler)
94
+ if result == "OPENED"
95
+ result
96
+ else
97
+ raise PoliqarpException.new(result)
98
+ end
77
99
  end
78
100
  end
79
101
 
@@ -210,7 +232,7 @@ protected
210
232
  def left_context=(value)
211
233
  result = talk("SET left-context-width #{value}")
212
234
  unless result =~ /^OK/
213
- raise "Failed to set left context to #{value}: #{result}"
235
+ raise PoliqarpException.new("Failed to set left context to #{value}: #{result}")
214
236
  end
215
237
  end
216
238
 
@@ -218,7 +240,7 @@ protected
218
240
  def right_context=(value)
219
241
  result = talk("SET right-context-width #{value}")
220
242
  unless result =~ /^OK/
221
- raise "Failed to set right context to #{value}: #{result}"
243
+ raise PoliqarpException.new("Failed to set right context to #{value}: #{result}")
222
244
  end
223
245
  end
224
246
 
@@ -241,7 +263,6 @@ protected
241
263
  # * +handler+ the handler of the assynchronous message.
242
264
  # It is ignored when the mode is set to :sync.
243
265
  def talk(msg, mode = :sync, &handler)
244
- puts msg if @debug
245
266
  if mode == :sync
246
267
  @connector.send_message(msg, mode, &handler)
247
268
  else
@@ -297,6 +318,10 @@ protected
297
318
  # * +index+ the index of the answer to be retrieved
298
319
  def find_one(query,index)
299
320
  make_async_query(query,index)
321
+ loop do
322
+ break unless should_wait?
323
+ sleep 0.01
324
+ end
300
325
  talk("GET-RESULTS #{index} #{index}")
301
326
  fetch_result(index,query)
302
327
  end
@@ -383,7 +408,7 @@ protected
383
408
  def do_wait
384
409
  loop {
385
410
  break unless should_wait?
386
- puts "WAITING" if @debug
411
+ debug("WAITING")
387
412
  sleep 0.1
388
413
  }
389
414
  @answer_queue.shift
@@ -394,7 +419,7 @@ protected
394
419
  @waiting_mutext.synchronize {
395
420
  @should_wait = false
396
421
  }
397
- puts "WAITING stopped" if @debug
422
+ debug("WAITING stopped")
398
423
  end
399
424
 
400
425
  # Check if the thread should still wait for the answer.
@@ -411,11 +436,11 @@ protected
411
436
  @waiting_mutext.synchronize {
412
437
  @should_wait = true
413
438
  }
414
- puts "WAITING started" if @debug
439
+ debug("WAITING started")
415
440
  end
416
441
 
417
442
  def make_async_query(query,answer_offset)
418
- raise IndexOutOfBounds if answer_offset > config.buffer_size
443
+ raise IndexOutOfBounds.new(answer_offset) if answer_offset > config.buffer_size
419
444
  start_waiting
420
445
  # we access the result count through BUFFER-STATE call
421
446
  make_query(query){|msg| stop_waiting}
@@ -25,7 +25,7 @@ module Poliqarp
25
25
  @client.send(:left_context=,value)
26
26
  @left_context_size = value
27
27
  else
28
- raise "Invalid argument: #{value}. It must be fixnum greater than 0."
28
+ raise PoliqarpException.new("Invalid argument: #{value}. It must be fixnum greater than 0.")
29
29
  end
30
30
  end
31
31
 
@@ -39,7 +39,7 @@ module Poliqarp
39
39
  @client.send(:right_context=,value)
40
40
  @right_context_size = value
41
41
  else
42
- raise "Invalid argument: #{value}. It must be fixnum greater than 0."
42
+ raise PoliqarpException.new("Invalid argument: #{value}. It must be fixnum greater than 0.")
43
43
  end
44
44
  end
45
45
 
@@ -37,11 +37,11 @@ module Poliqarp
37
37
  UTF8 = "utf-8"
38
38
 
39
39
  # Creates new connector
40
- def initialize(debug)
40
+ def initialize(client)
41
41
  @message_queue = Queue.new
42
42
  @socket_mutex = Mutex.new
43
43
  @loop_mutex = Mutex.new
44
- @debug = debug
44
+ @client = client
45
45
  end
46
46
 
47
47
  # Opens connection with poliqarp server which runs
@@ -66,7 +66,7 @@ module Poliqarp
66
66
  # * +mode+ synchronous (+:sync:) or asynchronous (+:async+)
67
67
  # * +handler+ the handler of the asynchronous message
68
68
  def send_message(message, mode, &handler)
69
- puts "send #{mode} #{message}" if @debug
69
+ @client.debug{"send #{mode} #{message}"}
70
70
  if ruby19?
71
71
  massage = message.encode(UTF8)
72
72
  end
@@ -87,10 +87,8 @@ module Poliqarp
87
87
  case code
88
88
  when 15
89
89
  raise JobInProgress.new()
90
- when 17
91
- raise IndexOutOfBounds.new()
92
90
  else
93
- raise RuntimeError.new("Poliqarp Error: "+ERRORS[code])
91
+ raise PoliqarpException.new("Poliqarp Error: "+ERRORS[code])
94
92
  end
95
93
  else
96
94
  message
@@ -123,12 +121,12 @@ private
123
121
  end
124
122
 
125
123
  def receive_sync(message)
126
- puts "receive sync: #{message}" if @debug
124
+ @client.debug{"receive sync: #{message}"}
127
125
  @message_queue << message
128
126
  end
129
127
 
130
128
  def receive_async(message)
131
- puts "receive async: #{message}" if @debug
129
+ @client.debug{"receive async: #{message}"}
132
130
  Thread.new{
133
131
  @handler.call(message)
134
132
  }
@@ -1,13 +1,25 @@
1
1
  module Poliqarp
2
2
  # Author:: Aleksander Pohl (mailto:apohllo@o2.pl)
3
3
  # License:: MIT License
4
+
5
+ # Base for all poliqarp exceptions.
6
+ class PoliqarpException < Exception; end
4
7
 
5
8
  # The JobInProgress exception is raised if there was asynchronous call
6
9
  # to the server which haven't finished, which is interrupted by another
7
10
  # asynchronous call.
8
- class JobInProgress < Exception; end
11
+ class JobInProgress < PoliqarpException; end
9
12
 
10
13
  # The IndexOutOfBounds exception is raised if the index of given excerpt
11
14
  # is larger than the size of query buffer.
12
- class IndexOutOfBounds < Exception; end
15
+ class IndexOutOfBounds < PoliqarpException
16
+ def initialize(index)
17
+ super
18
+ @index = index
19
+ end
20
+
21
+ def to_s
22
+ "Poliqarp::IndexOutOfBounds(#{@index})"
23
+ end
24
+ end
13
25
  end
data/poliqarpr.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "poliqarpr"
3
- s.version = "0.1.1"
3
+ s.version = "0.1.6"
4
4
  s.date = Time.now.strftime("%Y-%m-%d")
5
5
  s.summary = "Ruby client for Poliqarp"
6
6
  s.email = "apohllo@o2.pl"
data/spec/client.rb CHANGED
@@ -28,6 +28,32 @@ describe Poliqarp::Client do
28
28
  @client.version.should_not == nil
29
29
  end
30
30
 
31
+ it "should work with debug turned on" do
32
+ @client.debug = true
33
+ (proc do
34
+ @client.ping
35
+ end).should_not raise_error(Exception)
36
+ end
37
+
38
+ it "should work with alternative logger" do
39
+ logger = ""
40
+ def logger.puts(str)
41
+ self << str
42
+ end
43
+ def logger.flush
44
+ end
45
+ @client.debug = true
46
+ @client.logger = logger
47
+ @client.ping
48
+ logger.size.should > 0
49
+ end
50
+
51
+ it "should raise error if failed to open corpus" do
52
+ (proc do
53
+ @client.open_corpus("")
54
+ end).should raise_error(Poliqarp::PoliqarpException)
55
+ end
56
+
31
57
  end
32
58
 
33
59
  describe "(with 'sample' corpus)" do
@@ -48,13 +74,13 @@ describe Poliqarp::Client do
48
74
  it "should raise error if the size of right context is not number" do
49
75
  (proc do
50
76
  @client.config.right_context_size = "a"
51
- end).should raise_error(RuntimeError)
77
+ end).should raise_error(Poliqarp::PoliqarpException)
52
78
  end
53
79
 
54
80
  it "should rais error if the size of right context is less or equal 0" do
55
81
  (proc do
56
82
  @client.config.right_context_size = 0
57
- end).should raise_error(RuntimeError)
83
+ end).should raise_error(Poliqarp::PoliqarpException)
58
84
  end
59
85
 
60
86
  it "should allow to set and get the left context size" do
@@ -65,13 +91,13 @@ describe Poliqarp::Client do
65
91
  it "should raise error if the size of left context is not number" do
66
92
  (lambda do
67
93
  @client.config.left_context_size = "a"
68
- end).should raise_error(RuntimeError)
94
+ end).should raise_error(Poliqarp::PoliqarpException)
69
95
  end
70
96
 
71
97
  it "should rais error if the size of left context is less or equal 0" do
72
98
  (lambda do
73
99
  @client.config.left_context_size = 0
74
- end).should raise_error(RuntimeError)
100
+ end).should raise_error(Poliqarp::PoliqarpException)
75
101
  end
76
102
 
77
103
  it "should return corpus statistics" do
@@ -147,11 +173,11 @@ describe Poliqarp::Client do
147
173
  @result.to_s.should == @client.find("nachalny")[0].to_s
148
174
  end
149
175
 
150
- it "should raise IndexOutOfBounds if the index is larger than the results count" do
176
+ it "should raise poliqarp error if the index is larger than the results count" do
151
177
  count = @client.count("nachalny")
152
178
  (proc do
153
179
  @client.find("nachalny",:index => count+1)
154
- end).should raise_error(Poliqarp::IndexOutOfBounds)
180
+ end).should raise_error(Poliqarp::PoliqarpException)
155
181
  end
156
182
 
157
183
  it "should raise IndexOutOfBounds error if the index is larger than the buffer size" do
metadata CHANGED
@@ -1,12 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: poliqarpr
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 1
8
- - 1
9
- version: 0.1.1
4
+ prerelease:
5
+ version: 0.1.6
10
6
  platform: ruby
11
7
  authors:
12
8
  - Aleksander Pohl
@@ -14,7 +10,7 @@ autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
12
 
17
- date: 2011-01-18 00:00:00 +01:00
13
+ date: 2011-02-21 00:00:00 +01:00
18
14
  default_executable:
19
15
  dependencies: []
20
16
 
@@ -59,21 +55,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
59
55
  requirements:
60
56
  - - ">="
61
57
  - !ruby/object:Gem::Version
62
- segments:
63
- - 0
64
58
  version: "0"
65
59
  required_rubygems_version: !ruby/object:Gem::Requirement
66
60
  none: false
67
61
  requirements:
68
62
  - - ">="
69
63
  - !ruby/object:Gem::Version
70
- segments:
71
- - 0
72
64
  version: "0"
73
65
  requirements: []
74
66
 
75
67
  rubyforge_project:
76
- rubygems_version: 1.3.7
68
+ rubygems_version: 1.5.2
77
69
  signing_key:
78
70
  specification_version: 3
79
71
  summary: Ruby client for Poliqarp