picky-client 1.1.7 → 1.2.0

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.
@@ -1,16 +1,52 @@
1
+ # Ruby Search Client Frontend for the Picky search engine.
2
+ #
3
+ # === Usage
4
+ #
5
+ # ==== 1. Set up search clients.
6
+ #
7
+ # # Create search client instances e.g. in your development.rb, production.rb etc.
8
+ # #
9
+ # # Use the right host, port where your Picky server runs. Then, choose a URL path as defined
10
+ # # in your <tt>app/application.rb</tt> in the server.
11
+ # #
12
+ # FullBooks = Picky::Client::Full.new :host => 'localhost', :port => 8080, :path => '/books/full'
13
+ # LiveBooks = Picky::Client::Live.new :host => 'localhost', :port => 8080, :path => '/books/live'
14
+ #
15
+ # ==== 2. Get results.
16
+ #
17
+ # # Then, in your search methods, call #search.
18
+ # #
19
+ # # You will get back a Hash with categorized results.
20
+ # #
21
+ # results = FullBooks.search 'my query', :offset => 10
22
+ #
23
+ # ==== 3. Work with the results.
24
+ #
25
+ # # To make the Hash more useful, extend it with a few convenience methods.
26
+ # # See Picky::Convenience.
27
+ # #
28
+ # results.extend Picky::Convenience
29
+ #
30
+ # # One of the added Methods is:
31
+ # # populate_with(ModelThatSupportsFind, &optional_block_where_you_get_model_instance_and_you_can_render)
32
+ # # This adds the rendered models to the results Hash.
33
+ # #
34
+ # results.populate_with Book do |book|
35
+ # book.to_s
36
+ # end
37
+ #
38
+ # ==== 4. Last step is encoding it back into JSON.
39
+ #
40
+ # # Encode the results in JSON and return it to the Javascript Client (or your frontend).
41
+ # #
42
+ # ActiveSupport::JSON.encode results
43
+ #
44
+ # Note: The client might be rewritten such that instead of an http request it connects through tcp/0mq.
45
+ #
1
46
  require 'net/http'
2
47
 
3
48
  module Picky
4
- # Frontend for the search client.
5
- #
6
- # Configure a search by passing the options in the initializer:
7
- # * host
8
- # * port
9
- # * path
10
- #
11
- # TODO Rewrite such that instead of an http request we connect through tcp.
12
- # Or use EventMachine.
13
- #
49
+
14
50
  module Client
15
51
 
16
52
  class Base
@@ -52,10 +88,10 @@ module Picky
52
88
  #
53
89
  # Returns a hash. Extend with Convenience.
54
90
  #
55
- def search params = {}
56
- return {} unless params[:query] && !params[:query].empty?
91
+ def search query, params = {}
92
+ return {} unless query && !query.empty?
57
93
 
58
- send_search params
94
+ send_search params.merge :query => query
59
95
  end
60
96
 
61
97
  # Sends a search to the configured address.
@@ -1,5 +1,6 @@
1
1
  module Picky
2
- # Use this class to extend the hash the serializer returns.
2
+
3
+ # Use this class to extend the hash that the client returns.
3
4
  #
4
5
  module Convenience
5
6
 
@@ -8,42 +9,59 @@ module Picky
8
9
  def empty?
9
10
  allocations.empty?
10
11
  end
11
- # Returns the topmost limit results.
12
+
13
+ # Returns the topmost n results.
14
+ # (Note that not all ids are returned with the results. By default only maximally 20.)
15
+ #
16
+ # === Parameters
17
+ # * limit: The amount of ids to return. Default is 20.
12
18
  #
13
19
  def ids limit = 20
14
20
  ids = []
15
21
  allocations.each { |allocation| allocation[4].each { |id| break if ids.size > limit; ids << id } }
16
22
  ids
17
23
  end
18
- # Removes the ids from each allocation.
24
+
25
+ # Removes all ids of each allocation.
19
26
  #
20
27
  def clear_ids
21
28
  allocations.each { |allocation| allocation[4].clear }
22
29
  end
23
30
 
24
- # Caching readers.
31
+ # Returns the allocations.
25
32
  #
26
33
  def allocations
27
34
  @allocations || @allocations = self[:allocations]
28
35
  end
36
+ # Returns the number of allocations.
37
+ #
29
38
  def allocations_size
30
39
  @allocations_size || @allocations_size = allocations.size
31
40
  end
41
+ # Returns the total of results.
42
+ #
32
43
  def total
33
44
  @total || @total = self[:total]
34
45
  end
35
46
 
36
- # Populating the results.
47
+ # Populates the ids with (rendered) model instances.
37
48
  #
38
49
  # Give it an AR class and options for the find and it
39
50
  # will yield each found result for you to render.
40
51
  #
41
52
  # If you don't pass it a block, it will just use the AR results.
42
53
  #
43
- def populate_with klass, amount = 20, options = {}, &block
54
+ # === Parameters
55
+ # * model_class: The model to use for the results. Will call #find on the given class.
56
+ # * amount: Amount of results to populate. Default 20.
57
+ #
58
+ # === Options
59
+ # * options are directly passed through to the ModelClass.find(ids, options) method. Default is {}.
60
+ #
61
+ def populate_with model_class, amount = 20, options = {}, &block
44
62
  the_ids = ids amount
45
63
 
46
- objects = klass.find the_ids, options
64
+ objects = model_class.find the_ids, options
47
65
 
48
66
  # Put together a mapping.
49
67
  #
@@ -58,13 +76,18 @@ module Picky
58
76
 
59
77
  objects.collect! &block if block_given?
60
78
 
61
- replace_ids_with objects
79
+ amend_ids_with objects
62
80
  clear_ids
63
81
 
64
82
  objects
65
83
  end
66
- # The rendered results or AR instances if you
67
- # have populated the results.
84
+
85
+ # Returns either
86
+ # * the rendered entries, if you have used #populate_with _with_ a block
87
+ # OR
88
+ # * the model instances, if you have used #populate_with _without_ a block
89
+ #
90
+ # Or, if you haven't called #populate_with yet, you will get an empty array.
68
91
  #
69
92
  def entries limit = 20
70
93
  if block_given?
@@ -79,7 +102,7 @@ module Picky
79
102
 
80
103
  # The ids need to come in the order which the ids were returned by the ids method.
81
104
  #
82
- def replace_ids_with entries
105
+ def amend_ids_with entries # :nodoc:
83
106
  i = 0
84
107
  self.allocations.each do |allocation|
85
108
  allocation[5] = allocation[4].map do |_|
data/lib/picky-client.rb CHANGED
@@ -4,6 +4,6 @@ require 'rubygems'
4
4
  require 'yajl'
5
5
 
6
6
  dir = File.dirname __FILE__
7
- require File.expand_path('picky-client/engine', dir)
7
+ require File.expand_path('picky-client/client', dir)
8
8
  require File.expand_path('picky-client/convenience', dir)
9
9
  require File.expand_path('picky-client/helper', dir)
@@ -104,15 +104,32 @@ describe Picky::Client do
104
104
  end
105
105
 
106
106
  describe "search" do
107
+ describe 'ok search term given' do
108
+ it 'calls send_search correctly' do
109
+ @full.should_receive(:send_search).once.with :query => 'hello'
110
+
111
+ @full.search 'hello'
112
+ end
113
+ end
114
+ describe 'no search term given' do
115
+ it "should raise an ArgumentError" do
116
+ lambda { @full.search }.should raise_error(ArgumentError)
117
+ end
118
+ end
107
119
  describe "with nil as search term" do
108
120
  before(:each) do
109
121
  @query = nil
110
122
  end
111
- it "should return a Search::Results for bla" do
112
- @full.search(:query => @query).should be_kind_of(Hash)
123
+ it "should return a Search::Results" do
124
+ @full.search(@query).should be_kind_of(Hash)
113
125
  end
114
126
  it "should return an empty Search::Results" do
115
- @full.search(:query => @query).should be_empty
127
+ @full.search(@query).should be_empty
128
+ end
129
+ it 'calls send_search correctly' do
130
+ @full.should_receive(:send_search).never
131
+
132
+ @full.search @query
116
133
  end
117
134
  end
118
135
  describe "with '' as search term" do
@@ -120,10 +137,15 @@ describe Picky::Client do
120
137
  @query = ''
121
138
  end
122
139
  it "should return a Search::Results" do
123
- @full.search(:query => @query).should be_kind_of(Hash)
140
+ @full.search(@query).should be_kind_of(Hash)
124
141
  end
125
142
  it "should return an empty Search::Results" do
126
- @full.search(:query => @query).should be_empty
143
+ @full.search(@query).should be_empty
144
+ end
145
+ it 'calls send_search correctly' do
146
+ @full.should_receive(:send_search).never
147
+
148
+ @full.search @query
127
149
  end
128
150
  end
129
151
  end
@@ -170,15 +192,32 @@ describe Picky::Client do
170
192
  end
171
193
 
172
194
  describe "search" do
195
+ describe 'ok search term given' do
196
+ it 'calls send_search correctly' do
197
+ @live.should_receive(:send_search).once.with :query => 'hello'
198
+
199
+ @live.search 'hello'
200
+ end
201
+ end
202
+ describe 'no search term given' do
203
+ it "should raise an ArgumentError" do
204
+ lambda { @live.search }.should raise_error(ArgumentError)
205
+ end
206
+ end
173
207
  describe "with nil as search term" do
174
208
  before(:each) do
175
209
  @query = nil
176
210
  end
177
211
  it "should return a Search::Results" do
178
- @live.search(:query => @query).should be_kind_of(Hash)
212
+ @live.search(@query).should be_kind_of(Hash)
179
213
  end
180
214
  it "should return an empty Search::Results" do
181
- @live.search(:query => @query).should be_empty
215
+ @live.search(@query).should be_empty
216
+ end
217
+ it 'calls send_search correctly' do
218
+ @live.should_receive(:send_search).never
219
+
220
+ @live.search @query
182
221
  end
183
222
  end
184
223
  describe "with '' as search term" do
@@ -186,10 +225,15 @@ describe Picky::Client do
186
225
  @query = ''
187
226
  end
188
227
  it "should return a Search::Results" do
189
- @live.search(:query => @query).should be_kind_of(Hash)
228
+ @live.search(@query).should be_kind_of(Hash)
190
229
  end
191
230
  it "should return an empty Search::Results" do
192
- @live.search(:query => @query).should be_empty
231
+ @live.search(@query).should be_empty
232
+ end
233
+ it 'calls send_search correctly' do
234
+ @live.should_receive(:send_search).never
235
+
236
+ @live.search @query
193
237
  end
194
238
  end
195
239
  end
@@ -125,7 +125,7 @@ describe Picky::Convenience do
125
125
  end
126
126
  it 'should populate with the entries' do
127
127
  new_ids = (11..31).to_a # +10
128
- @results.replace_ids_with new_ids
128
+ @results.amend_ids_with new_ids
129
129
  @results.entries.should == (11..30).to_a
130
130
  end
131
131
  end
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 1
7
- - 1
8
- - 7
9
- version: 1.1.7
7
+ - 2
8
+ - 0
9
+ version: 1.2.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Florian Hanke
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-12-15 00:00:00 +01:00
17
+ date: 2010-12-17 00:00:00 +01:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -41,13 +41,13 @@ extensions: []
41
41
  extra_rdoc_files:
42
42
  - README.rdoc
43
43
  files:
44
+ - lib/picky-client/client.rb
44
45
  - lib/picky-client/convenience.rb
45
- - lib/picky-client/engine.rb
46
46
  - lib/picky-client/helper.rb
47
47
  - lib/picky-client.rb
48
48
  - README.rdoc
49
+ - spec/picky-client/client_spec.rb
49
50
  - spec/picky-client/convenience_spec.rb
50
- - spec/picky-client/engine_spec.rb
51
51
  - spec/picky-client/helper_spec.rb
52
52
  has_rdoc: false
53
53
  homepage: http://floere.github.com/picky
@@ -82,6 +82,6 @@ signing_key:
82
82
  specification_version: 3
83
83
  summary: picky Ruby Search Engine Client
84
84
  test_files:
85
+ - spec/picky-client/client_spec.rb
85
86
  - spec/picky-client/convenience_spec.rb
86
- - spec/picky-client/engine_spec.rb
87
87
  - spec/picky-client/helper_spec.rb