sunspot-queue 0.10.0 → 0.10.1

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/History.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Sunspot Queue Changelog
2
2
 
3
+ ## 0.11.1
4
+ * Allow without_proxy to work with SessionProxy subclasses
5
+ * Added missing requires in sidekiq jobs
6
+
7
+ ## 0.11.0
8
+ * Delayed Job support
9
+
3
10
  ## 0.10.0
4
11
  * Sidekiq support
5
12
  * SessionProxy now takes a backend as a second required option
data/README.md CHANGED
@@ -54,6 +54,30 @@ Start Sidekiq
54
54
  $ sidekiq -q sunspot
55
55
  ```
56
56
 
57
+ ## Usage with Rails and Delayed::Job
58
+
59
+ In your Gemfile
60
+
61
+ ```ruby
62
+ gem "sunspot-queue"
63
+ gem "delayed_job"
64
+ gem "delayed_job_active_record" # or choose another backend
65
+ ```
66
+
67
+ In config/initializers/sunspot.rb
68
+
69
+ ```ruby
70
+ require "sunspot/queue/delayed_job"
71
+ backend = Sunspot::Queue::DelayedJob::Backend.new
72
+ Sunspot.session = Sunspot::Queue::SessionProxy.new(Sunspot.session, backend)
73
+ ```
74
+
75
+ Start Delayed::Job
76
+
77
+ ```console
78
+ $ rake jobs:work
79
+ ```
80
+
57
81
  ## Configuring Sunspot Queue
58
82
 
59
83
  In config/initializers/sunspot.rb
@@ -0,0 +1,9 @@
1
+ require "sunspot/queue"
2
+
3
+ module Sunspot::Queue
4
+ module DelayedJob
5
+ require "sunspot/queue/delayed_job/backend"
6
+ require "sunspot/queue/delayed_job/index_job"
7
+ require "sunspot/queue/delayed_job/removal_job"
8
+ end
9
+ end
@@ -0,0 +1,35 @@
1
+ require "delayed_job"
2
+ require "sunspot/queue/delayed_job/index_job"
3
+ require "sunspot/queue/delayed_job/removal_job"
4
+
5
+ module Sunspot::Queue::DelayedJob
6
+ class Backend
7
+ attr_reader :configuration
8
+
9
+ def initialize(configuration = Sunspot::Queue.configuration)
10
+ @configuration = configuration
11
+ end
12
+
13
+ def enqueue(job)
14
+ Delayed::Job.enqueue(job)
15
+ end
16
+
17
+ def index(klass, id)
18
+ enqueue(index_job.new(klass, id))
19
+ end
20
+
21
+ def remove(klass, id)
22
+ enqueue(removal_job.new(klass, id))
23
+ end
24
+
25
+ private
26
+
27
+ def index_job
28
+ configuration.index_job || ::Sunspot::Queue::DelayedJob::IndexJob
29
+ end
30
+
31
+ def removal_job
32
+ configuration.removal_job || ::Sunspot::Queue::DelayedJob::RemovalJob
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,13 @@
1
+ require "sunspot/queue/helpers"
2
+
3
+ module Sunspot::Queue::DelayedJob
4
+ class IndexJob < Struct.new(:klass, :id)
5
+ include ::Sunspot::Queue::Helpers
6
+
7
+ def perform
8
+ without_proxy do
9
+ constantize(klass).find(id).solr_index
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ require "sunspot/queue/helpers"
2
+
3
+ module Sunspot::Queue::DelayedJob
4
+ class RemovalJob < Struct.new(:klass, :id)
5
+ include ::Sunspot::Queue::Helpers
6
+
7
+ def perform
8
+ without_proxy do
9
+ ::Sunspot.remove_by_id(klass, id)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -7,7 +7,7 @@ module Sunspot::Queue
7
7
 
8
8
  # Pop off the queueing proxy for the block if it's in place so we don't
9
9
  # requeue the same job multiple times.
10
- if Sunspot.session.instance_of?(SessionProxy)
10
+ if Sunspot.session.is_a?(SessionProxy)
11
11
  proxy = Sunspot.session
12
12
  Sunspot.session = proxy.session
13
13
  end
@@ -1,4 +1,5 @@
1
1
  require "sidekiq/worker"
2
+ require "sunspot/queue/helpers"
2
3
 
3
4
  module Sunspot::Queue::Sidekiq
4
5
  class IndexJob
@@ -1,4 +1,5 @@
1
1
  require "sidekiq/worker"
2
+ require "sunspot/queue/helpers"
2
3
 
3
4
  module Sunspot::Queue::Sidekiq
4
5
  class RemovalJob
@@ -1,5 +1,5 @@
1
1
  module Sunspot
2
2
  module Queue
3
- VERSION = "0.10.0"
3
+ VERSION = "0.10.1"
4
4
  end
5
5
  end
@@ -0,0 +1,54 @@
1
+ require "spec_helper"
2
+
3
+ describe Sunspot::Queue::DelayedJob::Backend do
4
+
5
+ # Mock DelayedJobJob
6
+ class CustomDelayedJobJob < Struct.new(:klass, :id)
7
+ def perform
8
+ end
9
+ end
10
+
11
+ subject(:backend) { described_class.new(configuration) }
12
+
13
+ let(:configuration) { ::Sunspot::Queue::Configuration.new }
14
+
15
+ describe "#index" do
16
+ it "uses the index job set in the global configuration" do
17
+ configuration.index_job = CustomDelayedJobJob
18
+
19
+ Delayed::Job.should_receive(:enqueue) do |args|
20
+ args.first.is_a? CustomDelayedJobJob
21
+ end
22
+
23
+ backend.index(Person, 3)
24
+ end
25
+
26
+ it "uses the default index job if one is not configured" do
27
+ Delayed::Job.should_receive(:enqueue) do |args|
28
+ args.first.is_a? Sunspot::Queue::DelayedJob::IndexJob
29
+ end
30
+
31
+ backend.index(Person, 12)
32
+ end
33
+ end
34
+
35
+ describe "#remove" do
36
+ it "uses the removal job set in the global configuration" do
37
+ configuration.removal_job = CustomDelayedJobJob
38
+
39
+ Delayed::Job.should_receive(:enqueue) do |args|
40
+ args.first.is_a? CustomDelayedJobJob
41
+ end
42
+
43
+ backend.remove(Person, 3)
44
+ end
45
+
46
+ it "uses the default index job if one is not configured" do
47
+ Delayed::Job.should_receive(:enqueue) do |args|
48
+ args.first.is_a? Sunspot::Queue::DelayedJob::RemovalJob
49
+ end
50
+
51
+ backend.remove(Person, 12)
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,49 @@
1
+ require "spec_helper"
2
+
3
+ describe Sunspot::Queue::DelayedJob::IndexJob do
4
+ context "ActiveRecord" do
5
+
6
+ it "indexes an ActiveRecord model" do
7
+ person = Person.create(:name => "The Grandson")
8
+ job = Sunspot::Queue::DelayedJob::IndexJob.new(Person, person.id)
9
+
10
+ # This will queue a job but we'll just ignore it to isolate the job
11
+ expect do
12
+ job.perform
13
+ commit
14
+ end.to change { Person.search.hits.size }.by(1)
15
+
16
+ results = Person.search { fulltext "grandson" }.results
17
+ results.first.should == person
18
+ end
19
+
20
+ it "raises an error if the record could not be found" do
21
+ job = Sunspot::Queue::DelayedJob::IndexJob.new(Person, 404)
22
+
23
+ expect do
24
+ job.perform
25
+ end.to raise_error(ActiveRecord::RecordNotFound)
26
+ end
27
+
28
+ it "maintains the existing proxy if there was an error" do
29
+ job = Sunspot::Queue::DelayedJob::IndexJob.new(Person, 404)
30
+
31
+ expect do
32
+ job.perform rescue nil
33
+ end.to_not change { Sunspot.session }
34
+ end
35
+
36
+ it "does not commit changes to the index" do
37
+ person = Person.create(:name => "The Grandson")
38
+ job = Sunspot::Queue::DelayedJob::IndexJob.new(Person, person.id)
39
+
40
+ expect do
41
+ job.perform
42
+ end.to_not change { Person.search.hits.size }
43
+
44
+ expect do
45
+ commit
46
+ end.to change { Person.search.hits.size }
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,21 @@
1
+ require "spec_helper"
2
+ require "sunspot/queue/delayed_job"
3
+ require "sunspot/queue/helpers"
4
+
5
+ describe Sunspot::Queue::DelayedJob::RemovalJob do
6
+ it "removes a job from the search index" do
7
+ person =
8
+ without_proxy do
9
+ Person.create(:name => "The Albino")
10
+ end
11
+ commit
12
+
13
+ Person.search.hits.size.should == 1
14
+
15
+ job = Sunspot::Queue::DelayedJob::RemovalJob.new(Person, person.id)
16
+ expect do
17
+ job.perform
18
+ commit
19
+ end.to change { Person.search.hits.size }.by(-1)
20
+ end
21
+ end
@@ -11,6 +11,7 @@ require "resque_spec"
11
11
  # Neither is required when loading sunspot/queue
12
12
  require "sunspot/queue/resque"
13
13
  require "sunspot/queue/sidekiq"
14
+ require "sunspot/queue/delayed_job"
14
15
 
15
16
  # Sidekiq
16
17
  require "sidekiq"
@@ -82,6 +83,14 @@ RSpec.configure do |config|
82
83
  Sunspot.session = Sunspot::Queue::SessionProxy.new(session, backend)
83
84
  end
84
85
 
86
+ config.before(:each, :backend => :delayed_job) do
87
+ Delayed::Worker.delay_jobs = false
88
+
89
+ require "sunspot/queue/delayed_job"
90
+ backend = Sunspot::Queue::DelayedJob::Backend.new
91
+ Sunspot.session = Sunspot::Queue::SessionProxy.new(session, backend)
92
+ end
93
+
85
94
  config.before(:each, :backend => :inline) do
86
95
  backend = Sunspot::Queue::Inline::Backend.new
87
96
  Sunspot.session = Sunspot::Queue::SessionProxy.new(session, backend)
@@ -100,8 +109,8 @@ RSpec.configure do |config|
100
109
 
101
110
  at_exit { Process.kill("TERM", solr_pid) }
102
111
 
103
- # Wait for up to 5 seconds for Solr to boot
104
- 10.times do
112
+ # Wait up to 30 seconds for Solr to boot
113
+ 60.times do
105
114
  begin
106
115
  TCPSocket.new("localhost", 8983)
107
116
  break
@@ -0,0 +1,2 @@
1
+ # Fake Delayed::Job persistence backend
2
+ class Delayed::Job ; end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sunspot-queue
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.0
4
+ version: 0.10.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-01-23 00:00:00.000000000 Z
12
+ date: 2013-07-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: sunspot_rails
@@ -59,6 +59,22 @@ dependencies:
59
59
  - - ! '>='
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: delayed_job
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
62
78
  - !ruby/object:Gem::Dependency
63
79
  name: rake
64
80
  requirement: !ruby/object:Gem::Requirement
@@ -211,6 +227,10 @@ extensions: []
211
227
  extra_rdoc_files: []
212
228
  files:
213
229
  - lib/sunspot/queue/configuration.rb
230
+ - lib/sunspot/queue/delayed_job/backend.rb
231
+ - lib/sunspot/queue/delayed_job/index_job.rb
232
+ - lib/sunspot/queue/delayed_job/removal_job.rb
233
+ - lib/sunspot/queue/delayed_job.rb
214
234
  - lib/sunspot/queue/helpers.rb
215
235
  - lib/sunspot/queue/inline/backend.rb
216
236
  - lib/sunspot/queue/inline.rb
@@ -227,6 +247,9 @@ files:
227
247
  - lib/sunspot/queue.rb
228
248
  - lib/sunspot-queue.rb
229
249
  - spec/configuration_spec.rb
250
+ - spec/delayed_job/backend_spec.rb
251
+ - spec/delayed_job/index_job_spec.rb
252
+ - spec/delayed_job/removal_job_spec.rb
230
253
  - spec/inline/backend_spec.rb
231
254
  - spec/integration/indexing_spec.rb
232
255
  - spec/integration/sidekiq_spec.rb
@@ -239,6 +262,7 @@ files:
239
262
  - spec/sidekiq/index_job_spec.rb
240
263
  - spec/sidekiq/removal_job.rb
241
264
  - spec/spec_helper.rb
265
+ - spec/support/delayed_job.rb
242
266
  - spec/support/sidekiq.rb
243
267
  - LICENSE
244
268
  - README.md
@@ -257,7 +281,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
257
281
  version: '0'
258
282
  segments:
259
283
  - 0
260
- hash: -2557787847468836943
284
+ hash: -2562861309914958961
261
285
  required_rubygems_version: !ruby/object:Gem::Requirement
262
286
  none: false
263
287
  requirements:
@@ -266,10 +290,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
266
290
  version: '0'
267
291
  segments:
268
292
  - 0
269
- hash: -2557787847468836943
293
+ hash: -2562861309914958961
270
294
  requirements: []
271
295
  rubyforge_project:
272
- rubygems_version: 1.8.24
296
+ rubygems_version: 1.8.25
273
297
  signing_key:
274
298
  specification_version: 3
275
299
  summary: Background search indexing using existing worker systems.