pose 1.0.0 → 1.1.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.
- data/README.md +11 -1
- data/lib/pose.rb +2 -2
- data/lib/pose/base_additions.rb +2 -1
- data/lib/{pose_assignment.rb → pose/models/pose_assignment.rb} +0 -0
- data/lib/{pose_word.rb → pose/models/pose_word.rb} +0 -0
- data/lib/pose/static_helpers.rb +11 -6
- data/lib/pose/version.rb +1 -1
- data/spec/pose_assignment_spec.rb +5 -5
- data/spec/pose_spec.rb +29 -8
- data/spec/pose_word_spec.rb +2 -2
- metadata +21 -21
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Pose
|
1
|
+
# Pose [](http://travis-ci.org/#!/kevgo/pose)
|
2
2
|
|
3
3
|
Pose ("Polymorphic Search") allows fulltext search for ActiveRecord objects.
|
4
4
|
|
@@ -113,6 +113,16 @@ In this example, it found two results of type _MyClass_ and no results of type _
|
|
113
113
|
Happy searching! :)
|
114
114
|
|
115
115
|
|
116
|
+
## Search options
|
117
|
+
|
118
|
+
```ruby
|
119
|
+
result = Pose.search 'foo',
|
120
|
+
MyClass,
|
121
|
+
:limit => 3, # Limit the result count to 3.
|
122
|
+
:result_type => :ids # Don't load the resulting objects, return just their ids instead.
|
123
|
+
```
|
124
|
+
|
125
|
+
|
116
126
|
# Autocomplete support
|
117
127
|
|
118
128
|
Because the search index contains a list of all the words known to the search engine,
|
data/lib/pose.rb
CHANGED
data/lib/pose/base_additions.rb
CHANGED
@@ -2,8 +2,9 @@ module Pose
|
|
2
2
|
module BaseAdditions
|
3
3
|
|
4
4
|
def posify &block
|
5
|
+
raise "You must provide a block that returns the searchable content to 'posify'." unless block_given?
|
5
6
|
include Pose::ModelAdditions
|
6
|
-
self.pose_content =
|
7
|
+
self.pose_content = block
|
7
8
|
end
|
8
9
|
|
9
10
|
end
|
File without changes
|
File without changes
|
data/lib/pose/static_helpers.rb
CHANGED
@@ -90,10 +90,10 @@ module Pose
|
|
90
90
|
#
|
91
91
|
# @param [String] query
|
92
92
|
# @param (Class|[Array<Class>]) classes
|
93
|
-
# @param [
|
93
|
+
# @param [Hash?] options Additional options.
|
94
94
|
#
|
95
95
|
# @return [Hash<Class, ActiveRecord::Relation>]
|
96
|
-
def search query, classes,
|
96
|
+
def search query, classes, options = {}
|
97
97
|
|
98
98
|
# Turn 'classes' into an array.
|
99
99
|
classes = [classes].flatten
|
@@ -106,11 +106,16 @@ module Pose
|
|
106
106
|
current_word_classes_and_ids = {}
|
107
107
|
classes.each { |clazz| current_word_classes_and_ids[clazz.name] = [] }
|
108
108
|
query = PoseAssignment.joins(:pose_word) \
|
109
|
+
.select('pose_assignments.posable_id, pose_assignments.posable_type') \
|
109
110
|
.where('pose_words.text LIKE ?', "#{query_word}%") \
|
110
111
|
.where('posable_type IN (?)', classes_names)
|
111
|
-
query.each do |pose_assignment|
|
112
|
-
current_word_classes_and_ids[pose_assignment
|
112
|
+
PoseAssignment.connection.select_all(query.to_sql).each do |pose_assignment|
|
113
|
+
current_word_classes_and_ids[pose_assignment['posable_type']] << pose_assignment['posable_id']
|
113
114
|
end
|
115
|
+
# This is the old ActiveRecord way. Removed for performance reasons.
|
116
|
+
# query.each do |pose_assignment|
|
117
|
+
# current_word_classes_and_ids[pose_assignment.posable_type] << pose_assignment.posable_id
|
118
|
+
# end
|
114
119
|
|
115
120
|
current_word_classes_and_ids.each do |class_name, ids|
|
116
121
|
if result_classes_and_ids.has_key? class_name
|
@@ -127,8 +132,8 @@ module Pose
|
|
127
132
|
result_class = Kernel.const_get class_name
|
128
133
|
|
129
134
|
if ids.any? && classes.include?(result_class)
|
130
|
-
ids = ids.slice(0, limit) if limit
|
131
|
-
result[result_class] = result_class.where
|
135
|
+
ids = ids.slice(0, options[:limit]) if options[:limit]
|
136
|
+
result[result_class] = options[:result_type] == :ids ? ids : result_class.where(:id => ids)
|
132
137
|
else
|
133
138
|
result[result_class] = []
|
134
139
|
end
|
data/lib/pose/version.rb
CHANGED
@@ -9,8 +9,8 @@ describe PoseAssignment do
|
|
9
9
|
describe "delete_class_index" do
|
10
10
|
|
11
11
|
before :each do
|
12
|
-
|
13
|
-
|
12
|
+
FactoryGirl.create :pose_assignment, :posable_id => 1, :posable_type => 'PosableOne'
|
13
|
+
FactoryGirl.create :pose_assignment, :posable_id => 2, :posable_type => 'PosableTwo'
|
14
14
|
PoseAssignment.delete_class_index PosableOne
|
15
15
|
end
|
16
16
|
|
@@ -26,20 +26,20 @@ describe PoseAssignment do
|
|
26
26
|
describe "cleanup_orphaned_pose_assignments" do
|
27
27
|
|
28
28
|
it "deletes the assignment if the posable object doesn't exist" do
|
29
|
-
|
29
|
+
FactoryGirl.create :pose_assignment, :posable_id => 2, :posable_type => 'PosableOne'
|
30
30
|
PoseAssignment.count.should > 0
|
31
31
|
PoseAssignment.cleanup_orphaned_pose_assignments
|
32
32
|
PoseAssignment.should have(0).items
|
33
33
|
end
|
34
34
|
|
35
35
|
it "deletes the assignment if the pose_word doesn't exist" do
|
36
|
-
assignment =
|
36
|
+
assignment = FactoryGirl.create :pose_assignment, :pose_word => nil, :pose_word_id => 27
|
37
37
|
PoseAssignment.cleanup_orphaned_pose_assignments
|
38
38
|
PoseAssignment.find_by_id(assignment.id).should be_nil
|
39
39
|
end
|
40
40
|
|
41
41
|
it "doesn't delete the assignment if it is still used" do
|
42
|
-
assignment =
|
42
|
+
assignment = FactoryGirl.create :pose_assignment
|
43
43
|
PoseAssignment.cleanup_orphaned_pose_assignments
|
44
44
|
PoseAssignment.find_by_id(assignment.id).should_not be_nil
|
45
45
|
end
|
data/spec/pose_spec.rb
CHANGED
@@ -208,7 +208,7 @@ describe Pose do
|
|
208
208
|
result[PosableOne][0].should == pos1
|
209
209
|
end
|
210
210
|
|
211
|
-
|
211
|
+
describe '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'
|
@@ -242,7 +242,7 @@ describe Pose do
|
|
242
242
|
end
|
243
243
|
end
|
244
244
|
|
245
|
-
|
245
|
+
describe 'query parameter' do
|
246
246
|
|
247
247
|
it 'returns an empty array if nothing matches' do
|
248
248
|
pos1 = PosableOne.create :text => 'one'
|
@@ -273,19 +273,40 @@ describe Pose do
|
|
273
273
|
end
|
274
274
|
end
|
275
275
|
|
276
|
-
|
276
|
+
describe "'limit' parameter" do
|
277
277
|
|
278
278
|
it 'works' do
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
279
|
+
FactoryGirl.create :posable_one, :text => 'foo one'
|
280
|
+
FactoryGirl.create :posable_one, :text => 'foo two'
|
281
|
+
FactoryGirl.create :posable_one, :text => 'foo three'
|
282
|
+
FactoryGirl.create :posable_one, :text => 'foo four'
|
283
283
|
|
284
|
-
result = Pose.search 'foo', PosableOne, 3
|
284
|
+
result = Pose.search 'foo', PosableOne, :limit => 3
|
285
285
|
|
286
286
|
result[PosableOne].should have(3).items
|
287
287
|
end
|
288
288
|
end
|
289
|
+
|
290
|
+
describe "'result_type' parameter" do
|
291
|
+
|
292
|
+
before :each do
|
293
|
+
@foo_one = FactoryGirl.create :posable_one, :text => 'foo one'
|
294
|
+
end
|
295
|
+
|
296
|
+
describe 'default behavior' do
|
297
|
+
it 'returns full objects' do
|
298
|
+
result = Pose.search 'foo', PosableOne
|
299
|
+
result[PosableOne][0].should == @foo_one
|
300
|
+
end
|
301
|
+
end
|
302
|
+
|
303
|
+
context ':ids given' do
|
304
|
+
it 'returns ids instead of objects' do
|
305
|
+
result = Pose.search 'foo', PosableOne, :result_type => :ids
|
306
|
+
result[PosableOne][0].should == @foo_one.id
|
307
|
+
end
|
308
|
+
end
|
309
|
+
end
|
289
310
|
end
|
290
311
|
|
291
312
|
describe 'autocomplete_words' do
|
data/spec/pose_word_spec.rb
CHANGED
@@ -9,13 +9,13 @@ describe PoseWord do
|
|
9
9
|
describe 'remove_unused_words' do
|
10
10
|
|
11
11
|
it 'removes unused words' do
|
12
|
-
|
12
|
+
FactoryGirl.create :pose_word
|
13
13
|
PoseWord.remove_unused_words
|
14
14
|
PoseWord.count.should == 0
|
15
15
|
end
|
16
16
|
|
17
17
|
it "doesn't remove used words" do
|
18
|
-
snippet =
|
18
|
+
snippet = FactoryGirl.create :posable_one
|
19
19
|
PoseWord.remove_unused_words
|
20
20
|
PoseWord.count.should > 0
|
21
21
|
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: 1.
|
4
|
+
version: 1.1.0
|
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-
|
12
|
+
date: 2012-06-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
16
|
-
requirement: &
|
16
|
+
requirement: &70182202899340 !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: *70182202899340
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rake
|
27
|
-
requirement: &
|
27
|
+
requirement: &70182202897100 !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: *70182202897100
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: ruby-progressbar
|
38
|
-
requirement: &
|
38
|
+
requirement: &70182202895340 !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: *70182202895340
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: factory_girl
|
49
|
-
requirement: &
|
49
|
+
requirement: &70182202890340 !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: *70182202890340
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: faker
|
60
|
-
requirement: &
|
60
|
+
requirement: &70182202708040 !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: *70182202708040
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: hashie
|
71
|
-
requirement: &
|
71
|
+
requirement: &70182202704860 !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: *70182202704860
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: rspec
|
82
|
-
requirement: &
|
82
|
+
requirement: &70182202700960 !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: *70182202700960
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: sqlite3
|
93
|
-
requirement: &
|
93
|
+
requirement: &70182202696980 !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: *70182202696980
|
102
102
|
description: Pose ('Polymorphic Search') allows fulltext search for ActiveRecord objects.
|
103
103
|
email:
|
104
104
|
- kevin.goslar@gmail.com
|
@@ -129,12 +129,12 @@ files:
|
|
129
129
|
- lib/generators/templates/migration.rb
|
130
130
|
- lib/pose/base_additions.rb
|
131
131
|
- lib/pose/model_additions.rb
|
132
|
+
- lib/pose/models/pose_assignment.rb
|
133
|
+
- lib/pose/models/pose_word.rb
|
132
134
|
- lib/pose/railtie.rb
|
133
135
|
- lib/pose/static_helpers.rb
|
134
136
|
- lib/pose/version.rb
|
135
137
|
- lib/pose.rb
|
136
|
-
- lib/pose_assignment.rb
|
137
|
-
- lib/pose_word.rb
|
138
138
|
- lib/tasks/pose_tasks.rake
|
139
139
|
- MIT-LICENSE
|
140
140
|
- Rakefile
|
@@ -164,7 +164,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
164
164
|
version: '0'
|
165
165
|
requirements: []
|
166
166
|
rubyforge_project:
|
167
|
-
rubygems_version: 1.8.
|
167
|
+
rubygems_version: 1.8.15
|
168
168
|
signing_key:
|
169
169
|
specification_version: 3
|
170
170
|
summary: A polymorphic, storage-system independent search engine for Ruby on Rails.
|