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 CHANGED
@@ -1,4 +1,4 @@
1
- # Pose
1
+ # Pose [![Build Status](https://secure.travis-ci.org/kevgo/pose.png)](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
@@ -6,5 +6,5 @@ require 'pose/static_helpers'
6
6
  require 'pose/base_additions'
7
7
  require 'pose/model_additions'
8
8
  require 'pose/railtie' if defined? Rails
9
- require 'pose_assignment'
10
- require 'pose_word'
9
+ require 'pose/models/pose_assignment'
10
+ require 'pose/models/pose_word'
@@ -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 = block_given? ? block : :pose_content.to_proc
7
+ self.pose_content = block
7
8
  end
8
9
 
9
10
  end
File without changes
@@ -90,10 +90,10 @@ module Pose
90
90
  #
91
91
  # @param [String] query
92
92
  # @param (Class|[Array<Class>]) classes
93
- # @param [Number?] limit Optional limit.
93
+ # @param [Hash?] options Additional options.
94
94
  #
95
95
  # @return [Hash<Class, ActiveRecord::Relation>]
96
- def search query, classes, limit = nil
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.posable_type] << pose_assignment.posable_id
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 :id => ids
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
@@ -1,3 +1,3 @@
1
1
  module Pose
2
- VERSION = "1.0.0"
2
+ VERSION = "1.1.0"
3
3
  end
@@ -9,8 +9,8 @@ describe PoseAssignment do
9
9
  describe "delete_class_index" do
10
10
 
11
11
  before :each do
12
- Factory :pose_assignment, :posable_id => 1, :posable_type => 'PosableOne'
13
- Factory :pose_assignment, :posable_id => 2, :posable_type => 'PosableTwo'
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
- Factory :pose_assignment, :posable_id => 2, :posable_type => 'PosableOne'
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 = Factory :pose_assignment, :pose_word => nil, :pose_word_id => 27
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 = Factory :pose_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
- context 'classes parameter' do
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
- context 'query parameter' do
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
- context "'limit' parameter" do
276
+ describe "'limit' parameter" do
277
277
 
278
278
  it 'works' do
279
- Factory :posable_one, :text => 'foo one'
280
- Factory :posable_one, :text => 'foo two'
281
- Factory :posable_one, :text => 'foo three'
282
- Factory :posable_one, :text => 'foo four'
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
@@ -9,13 +9,13 @@ describe PoseWord do
9
9
  describe 'remove_unused_words' do
10
10
 
11
11
  it 'removes unused words' do
12
- Factory :pose_word
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 = Factory :posable_one
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.0.0
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-03-02 00:00:00.000000000 Z
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: &70121989270460 !ruby/object:Gem::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: *70121989270460
24
+ version_requirements: *70182202899340
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rake
27
- requirement: &70121989278420 !ruby/object:Gem::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: *70121989278420
35
+ version_requirements: *70182202897100
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: ruby-progressbar
38
- requirement: &70121993362680 !ruby/object:Gem::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: *70121993362680
46
+ version_requirements: *70182202895340
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: factory_girl
49
- requirement: &70121993370180 !ruby/object:Gem::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: *70121993370180
57
+ version_requirements: *70182202890340
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: faker
60
- requirement: &70121993367740 !ruby/object:Gem::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: *70121993367740
68
+ version_requirements: *70182202708040
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: hashie
71
- requirement: &70121993380460 !ruby/object:Gem::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: *70121993380460
79
+ version_requirements: *70182202704860
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: rspec
82
- requirement: &70121993397120 !ruby/object:Gem::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: *70121993397120
90
+ version_requirements: *70182202700960
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: sqlite3
93
- requirement: &70121993395560 !ruby/object:Gem::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: *70121993395560
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.10
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.