pose 0.2.6 → 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.
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