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.
- data/lib/pose.rb +12 -2
- data/lib/pose/version.rb +1 -1
- data/spec/pose_spec.rb +58 -31
- metadata +18 -18
data/lib/pose.rb
CHANGED
@@ -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.
|
data/lib/pose/version.rb
CHANGED
data/spec/pose_spec.rb
CHANGED
@@ -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.
|
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-
|
12
|
+
date: 2012-02-08 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
16
|
-
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: *
|
24
|
+
version_requirements: *70254153851040
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rake
|
27
|
-
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: *
|
35
|
+
version_requirements: *70254153850260
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: ruby-progressbar
|
38
|
-
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: *
|
46
|
+
version_requirements: *70254153849780
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: factory_girl
|
49
|
-
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: *
|
57
|
+
version_requirements: *70254153848940
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: faker
|
60
|
-
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: *
|
68
|
+
version_requirements: *70254153848100
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: hashie
|
71
|
-
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: *
|
79
|
+
version_requirements: *70254153840100
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: rspec
|
82
|
-
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: *
|
90
|
+
version_requirements: *70254153839240
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: sqlite3
|
93
|
-
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: *
|
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
|