pose 0.2.6 → 0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. data/lib/pose.rb +12 -2
  2. data/lib/pose/version.rb +1 -1
  3. data/spec/pose_spec.rb +58 -31
  4. metadata +18 -18
@@ -29,7 +29,7 @@ module Pose
29
29
  end
30
30
 
31
31
  module InstanceMethods
32
-
32
+
33
33
  # Updates the associated words for this object in the database.
34
34
  def update_pose_index
35
35
  update_pose_words if perform_search?
@@ -62,6 +62,16 @@ module Pose
62
62
 
63
63
  class <<self
64
64
 
65
+ # Returns all words that begin with the given query string.
66
+ # This can be used for autocompletion functionality.
67
+ #
68
+ # @param [String]
69
+ # @return [Array<String>]
70
+ def autocomplete_words query
71
+ return [] if query.blank?
72
+ PoseWord.where('text LIKE ?', "#{Pose.root_word(query)[0]}%").map(&:text)
73
+ end
74
+
65
75
  # Returns all strings that are in new_words, but not in existing_words.
66
76
  # Helper method.
67
77
  #
@@ -96,7 +106,7 @@ module Pose
96
106
  rescue URI::InvalidURIError
97
107
  false
98
108
  end
99
-
109
+
100
110
  # Simplifies the given word to a generic search form.
101
111
  #
102
112
  # @param [String] raw_word The word to make searchable.
@@ -1,3 +1,3 @@
1
1
  module Pose
2
- VERSION = "0.2.6"
2
+ VERSION = "0.3"
3
3
  end
@@ -6,14 +6,14 @@ ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":me
6
6
 
7
7
  describe Pose do
8
8
  subject { PosableOne.new }
9
-
9
+
10
10
  before :each do
11
11
  PosableOne.delete_all
12
12
  PosableTwo.delete_all
13
13
  PoseAssignment.delete_all
14
14
  PoseWord.delete_all
15
15
  end
16
-
16
+
17
17
  describe 'associations' do
18
18
  it 'allows to access the associated words of a posable object directly' do
19
19
  subject.should have(0).pose_words
@@ -28,7 +28,7 @@ describe Pose do
28
28
  after :each do
29
29
  Pose::CONFIGURATION[:search_in_tests] = true
30
30
  end
31
-
31
+
32
32
  it "doesn't calls update_pose_words in tests if the test flag is not enabled" do
33
33
  Pose::CONFIGURATION[:search_in_tests] = false
34
34
  subject.should_not_receive :update_pose_words
@@ -41,17 +41,17 @@ describe Pose do
41
41
  subject.update_pose_index
42
42
  end
43
43
  end
44
-
44
+
45
45
  context "in the 'production' environment' do" do
46
46
  before :each do
47
47
  @old_env = Rails.env
48
48
  Rails.env = 'production'
49
49
  end
50
-
50
+
51
51
  after :each do
52
52
  Rails.env = @old_env
53
53
  end
54
-
54
+
55
55
  it "calls update_pose_words" do
56
56
  subject.should_receive :update_pose_words
57
57
  subject.update_pose_index
@@ -71,7 +71,7 @@ describe Pose do
71
71
  it 'updates the search index when the text is changed' do
72
72
  subject.text = 'foo'
73
73
  subject.save!
74
-
74
+
75
75
  subject.text = 'other text'
76
76
  subject.update_pose_words
77
77
 
@@ -189,7 +189,7 @@ describe Pose do
189
189
  Pose.root_word('one_one').should eql(['one'])
190
190
  Pose.root_word('one one').should eql(['one'])
191
191
  end
192
-
192
+
193
193
  it "splits up complex URLs" do
194
194
  Pose.root_word('books?id=p7uyWPcVGZsC&dq=closure%20definitive%20guide&pg=PP1#v=onepage&q&f=false').should eql([
195
195
  "book", "id", "p7uywpcvgzsc", "dq", "closure", "definitive", "guide", "pg", "pp1", "v", "onepage", "q", "f", "false"])
@@ -197,51 +197,51 @@ describe Pose do
197
197
  end
198
198
 
199
199
  describe 'search' do
200
-
200
+
201
201
  it 'works' do
202
202
  pos1 = PosableOne.create :text => 'one'
203
-
203
+
204
204
  result = Pose.search 'one', PosableOne
205
-
205
+
206
206
  result.should have(1).items
207
207
  result[PosableOne].should have(1).items
208
208
  result[PosableOne][0].should == pos1
209
209
  end
210
-
211
- context 'classes parameter' do
210
+
211
+ context 'classes parameter' do
212
212
  it 'returns all different classes by default' do
213
213
  pos1 = PosableOne.create :text => 'foo'
214
214
  pos2 = PosableTwo.create :text => 'foo'
215
-
215
+
216
216
  result = Pose.search 'foo', [PosableOne, PosableTwo]
217
-
217
+
218
218
  result.should have(2).items
219
219
  result[PosableOne].should == [pos1]
220
220
  result[PosableTwo].should == [pos2]
221
221
  end
222
-
222
+
223
223
  it 'allows to provide different classes to return' do
224
224
  pos1 = PosableOne.create :text => 'foo'
225
225
  pos2 = PosableTwo.create :text => 'foo'
226
-
226
+
227
227
  result = Pose.search 'foo', [PosableOne, PosableTwo]
228
-
228
+
229
229
  result.should have(2).items
230
230
  result[PosableOne].should == [pos1]
231
231
  result[PosableTwo].should == [pos2]
232
232
  end
233
-
233
+
234
234
  it 'returns only instances of the given classes' do
235
235
  pos1 = PosableOne.create :text => 'one'
236
236
  pos2 = PosableTwo.create :text => 'one'
237
-
237
+
238
238
  result = Pose.search 'one', PosableOne
239
-
239
+
240
240
  result.should have(1).items
241
241
  result[PosableOne].should == [pos1]
242
242
  end
243
243
  end
244
-
244
+
245
245
  context 'query parameter' do
246
246
 
247
247
  it 'returns an empty array if nothing matches' do
@@ -256,25 +256,25 @@ describe Pose do
256
256
  pos1 = PosableOne.create :text => 'one two'
257
257
  pos2 = PosableOne.create :text => 'one three'
258
258
  pos3 = PosableOne.create :text => 'two three'
259
-
259
+
260
260
  result = Pose.search 'two one', PosableOne
261
-
261
+
262
262
  result.should have(1).items
263
263
  result[PosableOne].should == [pos1]
264
264
  end
265
-
265
+
266
266
  it 'returns nothing if searching for a non-existing word' do
267
267
  pos1 = PosableOne.create :text => 'one two'
268
-
268
+
269
269
  result = Pose.search 'one zonk', PosableOne
270
-
270
+
271
271
  result.should have(1).items
272
272
  result[PosableOne].should == []
273
273
  end
274
274
  end
275
-
275
+
276
276
  context "'limit' parameter" do
277
-
277
+
278
278
  it 'works' do
279
279
  Factory :posable_one, :text => 'foo one'
280
280
  Factory :posable_one, :text => 'foo two'
@@ -282,10 +282,37 @@ describe Pose do
282
282
  Factory :posable_one, :text => 'foo four'
283
283
 
284
284
  result = Pose.search 'foo', PosableOne, 3
285
-
286
- puts result.inspect
285
+
287
286
  result[PosableOne].should have(3).items
288
287
  end
289
288
  end
290
289
  end
290
+
291
+ describe 'autocomplete_words' do
292
+
293
+ it 'returns words that start with the given phrase' do
294
+ PosableOne.create :text => 'great green pine tree'
295
+
296
+ result = Pose.autocomplete_words 'gr'
297
+
298
+ result.should have(2).words
299
+ result.should include('great')
300
+ result.should include('green')
301
+ end
302
+
303
+ it 'stems the search query' do
304
+ PosableOne.create :text => 'car'
305
+
306
+ result = Pose.autocomplete_words 'cars'
307
+
308
+ result.should have(1).words
309
+ result[0].should == 'car'
310
+ end
311
+
312
+ it 'returns nothing if the search query is empty' do
313
+ PosableOne.create :text => 'foo bar'
314
+ result = Pose.autocomplete_words ''
315
+ result.should have(0).words
316
+ end
317
+ end
291
318
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pose
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.6
4
+ version: '0.3'
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-02-07 00:00:00.000000000Z
12
+ date: 2012-02-08 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
16
- requirement: &70109869920940 !ruby/object:Gem::Requirement
16
+ requirement: &70254153851040 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 3.0.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70109869920940
24
+ version_requirements: *70254153851040
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rake
27
- requirement: &70109869913540 !ruby/object:Gem::Requirement
27
+ requirement: &70254153850260 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70109869913540
35
+ version_requirements: *70254153850260
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: ruby-progressbar
38
- requirement: &70109869912720 !ruby/object:Gem::Requirement
38
+ requirement: &70254153849780 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70109869912720
46
+ version_requirements: *70254153849780
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: factory_girl
49
- requirement: &70109869911980 !ruby/object:Gem::Requirement
49
+ requirement: &70254153848940 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70109869911980
57
+ version_requirements: *70254153848940
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: faker
60
- requirement: &70109869911200 !ruby/object:Gem::Requirement
60
+ requirement: &70254153848100 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70109869911200
68
+ version_requirements: *70254153848100
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: hashie
71
- requirement: &70109869909960 !ruby/object:Gem::Requirement
71
+ requirement: &70254153840100 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '0'
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *70109869909960
79
+ version_requirements: *70254153840100
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: rspec
82
- requirement: &70109869905840 !ruby/object:Gem::Requirement
82
+ requirement: &70254153839240 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '0'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *70109869905840
90
+ version_requirements: *70254153839240
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: sqlite3
93
- requirement: &70109869904020 !ruby/object:Gem::Requirement
93
+ requirement: &70254153838500 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ! '>='
@@ -98,7 +98,7 @@ dependencies:
98
98
  version: '0'
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *70109869904020
101
+ version_requirements: *70254153838500
102
102
  description: Pose ('Polymorphic Search') allows fulltext search for ActiveRecord objects.
103
103
  email:
104
104
  - kevin.goslar@gmail.com