ts-resque-delta 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.
@@ -0,0 +1,38 @@
1
+ require 'thinking_sphinx/deltas/resque_delta'
2
+
3
+ class FlyingSphinx::ResqueDelta < ThinkingSphinx::Deltas::ResqueDelta
4
+ def self.job_types
5
+ [
6
+ FlyingSphinx::ResqueDelta::DeltaJob,
7
+ FlyingSphinx::ResqueDelta::FlagAsDeletedJob
8
+ ]
9
+ end
10
+
11
+ def self.job_prefix
12
+ 'fs-delta'
13
+ end
14
+
15
+ def index(model, instance = nil)
16
+ return true if skip?(instance)
17
+
18
+ model.delta_index_names.each do |delta|
19
+ next if self.class.locked?(delta)
20
+
21
+ Resque.enqueue(
22
+ FlyingSphinx::ResqueDelta::DeltaJob,
23
+ [delta]
24
+ )
25
+ end
26
+
27
+ Resque.enqueue(
28
+ FlyingSphinx::ResqueDelta::FlagAsDeletedJob,
29
+ model.core_index_names,
30
+ instance.sphinx_document_id
31
+ ) if instance
32
+
33
+ true
34
+ end
35
+ end
36
+
37
+ require 'flying_sphinx/resque_delta/delta_job'
38
+ require 'flying_sphinx/resque_delta/flag_as_deleted_job'
@@ -0,0 +1,14 @@
1
+ class FlyingSphinx::ResqueDelta::DeltaJob < ThinkingSphinx::Deltas::ResqueDelta::DeltaJob
2
+ @queue = :fs_delta
3
+
4
+ # Runs Sphinx's indexer tool to process the index. Currently assumes Sphinx
5
+ # is running.
6
+ #
7
+ # @param [String] index the name of the Sphinx index
8
+ #
9
+ def self.perform(indices)
10
+ return if skip?(indices)
11
+
12
+ FlyingSphinx::IndexRequest.new(indices).perform
13
+ end
14
+ end
@@ -0,0 +1,7 @@
1
+ class FlyingSphinx::ResqueDelta::FlagAsDeletedJob
2
+ @queue = :fs_delta
3
+
4
+ def self.perform(indices, document_id)
5
+ FlyingSphinx::FlagAsDeletedJob.new(indices, document_id).perform
6
+ end
7
+ end
@@ -12,29 +12,36 @@ require 'thinking_sphinx'
12
12
  # @see http://ts.freelancing-gods.com Thinking Sphinx
13
13
  #
14
14
  class ThinkingSphinx::Deltas::ResqueDelta < ThinkingSphinx::Deltas::DefaultDelta
15
-
16
- # LTRIM + LPOP deletes all items from the Resque queue without loading it
17
- # into client memory (unlike Resque.dequeue).
18
- def self.cancel_thinking_sphinx_jobs
15
+ def self.job_types
19
16
  [
20
17
  ThinkingSphinx::Deltas::ResqueDelta::DeltaJob,
21
18
  ThinkingSphinx::Deltas::ResqueDelta::FlagAsDeletedJob
22
- ].collect { |c| c.instance_variable_get(:@queue) }.uniq.each do |q|
19
+ ]
20
+ end
21
+
22
+ def self.job_prefix
23
+ 'ts-delta'
24
+ end
25
+
26
+ # LTRIM + LPOP deletes all items from the Resque queue without loading it
27
+ # into client memory (unlike Resque.dequeue).
28
+ def self.cancel_thinking_sphinx_jobs
29
+ job_types.collect { |c| c.instance_variable_get(:@queue) }.uniq.each do |q|
23
30
  Resque.redis.ltrim("queue:#{q}", 0, 0)
24
31
  Resque.redis.lpop("queue:#{q}")
25
32
  end
26
33
  end
27
34
 
28
35
  def self.lock(index_name)
29
- Resque.redis.set("ts-delta:index:#{index_name}:locked", 'true')
36
+ Resque.redis.set("#{job_prefix}:index:#{index_name}:locked", 'true')
30
37
  end
31
38
 
32
39
  def self.unlock(index_name)
33
- Resque.redis.del("ts-delta:index:#{index_name}:locked")
40
+ Resque.redis.del("#{job_prefix}:index:#{index_name}:locked")
34
41
  end
35
42
 
36
43
  def self.locked?(index_name)
37
- Resque.redis.get("ts-delta:index:#{index_name}:locked") == 'true'
44
+ Resque.redis.get("#{job_prefix}:index:#{index_name}:locked") == 'true'
38
45
  end
39
46
 
40
47
  # Adds a job to the queue for processing the given model's delta index. A job
@@ -1,7 +1,7 @@
1
1
  module ThinkingSphinx
2
2
  module Deltas
3
3
  class ResqueDeltaInfo
4
- VERSION = "1.0.0"
4
+ VERSION = "1.1.0"
5
5
  end
6
6
  end
7
7
  end
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ describe FlyingSphinx::ResqueDelta::DeltaJob do
4
+ describe '@queue' do
5
+ it "uses the fs_delta queue" do
6
+ FlyingSphinx::ResqueDelta::DeltaJob.instance_variable_get(:@queue).
7
+ should == :fs_delta
8
+ end
9
+ end
10
+
11
+ describe '.perform' do
12
+ it "doesn't create an index request when skipping" do
13
+ FlyingSphinx::ResqueDelta::DeltaJob.stub!(:skip? => true)
14
+
15
+ FlyingSphinx::IndexRequest.should_not_receive(:new)
16
+
17
+ FlyingSphinx::ResqueDelta::DeltaJob.perform ['foo_delta']
18
+ end
19
+
20
+ it "performs an index request when not skipping" do
21
+ request = double('index request', :perform => true)
22
+ FlyingSphinx::ResqueDelta::DeltaJob.stub!(:skip? => false)
23
+
24
+ FlyingSphinx::IndexRequest.should_receive(:new).
25
+ with(['foo_delta']).
26
+ and_return(request)
27
+ request.should_receive(:perform)
28
+
29
+ FlyingSphinx::ResqueDelta::DeltaJob.perform ['foo_delta']
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe FlyingSphinx::ResqueDelta::FlagAsDeletedJob do
4
+ describe '@queue' do
5
+ it "uses the fs_delta queue" do
6
+ FlyingSphinx::ResqueDelta::FlagAsDeletedJob.
7
+ instance_variable_get(:@queue).should == :fs_delta
8
+ end
9
+ end
10
+
11
+ describe '.perform' do
12
+ it "performs a flag-as-deleted job" do
13
+ job = double('flag as deleted job', :perform => true)
14
+
15
+ FlyingSphinx::FlagAsDeletedJob.should_receive(:new).
16
+ with(['foo_core'], 5).
17
+ and_return(job)
18
+ job.should_receive(:perform)
19
+
20
+ FlyingSphinx::ResqueDelta::FlagAsDeletedJob.perform ['foo_core'], 5
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,131 @@
1
+ require 'spec_helper'
2
+
3
+ describe FlyingSphinx::ResqueDelta do
4
+ describe '.job_types' do
5
+ it "contains just the Flying Sphinx delta and delete jobs" do
6
+ FlyingSphinx::ResqueDelta.job_types.should == [
7
+ FlyingSphinx::ResqueDelta::DeltaJob,
8
+ FlyingSphinx::ResqueDelta::FlagAsDeletedJob
9
+ ]
10
+ end
11
+ end
12
+
13
+ describe '.job_prefix' do
14
+ it "is fs-delta" do
15
+ FlyingSphinx::ResqueDelta.job_prefix.should == 'fs-delta'
16
+ end
17
+ end
18
+
19
+ describe '#index' do
20
+ before :each do
21
+ ThinkingSphinx.updates_enabled = true
22
+ ThinkingSphinx.deltas_enabled = true
23
+
24
+ Resque.stub(:enqueue => true)
25
+
26
+ @delayed_delta = FlyingSphinx::ResqueDelta.new(
27
+ stub('instance'), {}
28
+ )
29
+ @delayed_delta.stub(:toggled).and_return(true)
30
+
31
+ FlyingSphinx::ResqueDelta.stub(:lock)
32
+ FlyingSphinx::ResqueDelta.stub(:unlock)
33
+ FlyingSphinx::ResqueDelta.stub(:locked?).and_return(false)
34
+
35
+ @model = stub('foo')
36
+ @model.stub(:core_index_names => ['foo_core'])
37
+ @model.stub(:delta_index_names => ['foo_delta'])
38
+
39
+ @instance = stub('instance')
40
+ @instance.stub(:sphinx_document_id => 42)
41
+ end
42
+
43
+ context 'updates disabled' do
44
+ before :each do
45
+ ThinkingSphinx.updates_enabled = false
46
+ end
47
+
48
+ it "should not enqueue a delta job" do
49
+ Resque.should_not_receive(:enqueue)
50
+ @delayed_delta.index(@model)
51
+ end
52
+
53
+ it "should not enqueue a flag as deleted job" do
54
+ Resque.should_not_receive(:enqueue)
55
+ @delayed_delta.index(@model)
56
+ end
57
+ end
58
+
59
+ context 'deltas disabled' do
60
+ before :each do
61
+ ThinkingSphinx.deltas_enabled = false
62
+ end
63
+
64
+ it "should not enqueue a delta job" do
65
+ Resque.should_not_receive(:enqueue)
66
+ @delayed_delta.index(@model)
67
+ end
68
+
69
+ it "should not enqueue a flag as deleted job" do
70
+ Resque.should_not_receive(:enqueue)
71
+ @delayed_delta.index(@model)
72
+ end
73
+ end
74
+
75
+ context "instance isn't toggled" do
76
+ before :each do
77
+ @delayed_delta.stub(:toggled => false)
78
+ end
79
+
80
+ it "should not enqueue a delta job" do
81
+ Resque.should_not_receive(:enqueue)
82
+ @delayed_delta.index(@model, @instance)
83
+ end
84
+
85
+ it "should not enqueue a flag as deleted job" do
86
+ Resque.should_not_receive(:enqueue)
87
+ @delayed_delta.index(@model, @instance)
88
+ end
89
+ end
90
+
91
+ it "should enqueue a delta job" do
92
+ Resque.should_receive(:enqueue).at_least(:once).with(
93
+ FlyingSphinx::ResqueDelta::DeltaJob,
94
+ ['foo_delta']
95
+ )
96
+ @delayed_delta.index(@model)
97
+ end
98
+
99
+ it "should enqueue a flag-as-deleted job" do
100
+ Resque.should_receive(:enqueue).at_least(:once).with(
101
+ FlyingSphinx::ResqueDelta::FlagAsDeletedJob,
102
+ ['foo_core'],
103
+ 42
104
+ )
105
+ @delayed_delta.index(@model, @instance)
106
+ end
107
+
108
+ context "delta index is locked" do
109
+ before :each do
110
+ FlyingSphinx::ResqueDelta.stub(:locked?).and_return(true)
111
+ end
112
+
113
+ it "should not enqueue a delta job" do
114
+ Resque.should_not_receive(:enqueue).with(
115
+ FlyingSphinx::ResqueDelta::DeltaJob,
116
+ ['foo_delta']
117
+ )
118
+ @delayed_delta.index(@model, @instance)
119
+ end
120
+
121
+ it "should enqueue a flag-as-deleted job" do
122
+ Resque.should_receive(:enqueue).at_least(:once).with(
123
+ FlyingSphinx::ResqueDelta::FlagAsDeletedJob,
124
+ ['foo_core'],
125
+ 42
126
+ )
127
+ @delayed_delta.index(@model, @instance)
128
+ end
129
+ end
130
+ end
131
+ end
data/spec/spec_helper.rb CHANGED
@@ -5,3 +5,5 @@ require 'spec/autorun'
5
5
 
6
6
  require 'thinking_sphinx'
7
7
  require 'thinking_sphinx/deltas/resque_delta'
8
+ require 'flying_sphinx'
9
+ require 'flying_sphinx/resque_delta'
@@ -21,14 +21,15 @@ Gem::Specification.new do |s|
21
21
 
22
22
  s.add_dependency "thinking-sphinx", ">= 1.3.6"
23
23
  s.add_dependency "resque", "~> 1.10"
24
- s.add_dependency "resque-lock-timeout", "~> 0.2.1"
24
+ s.add_dependency "resque-lock-timeout", "~> 0.3.1"
25
25
 
26
26
  s.add_development_dependency "rspec", "~> 1"
27
27
  s.add_development_dependency "cucumber", ">= 0"
28
28
  s.add_development_dependency "database_cleaner", ">= 0.5.2"
29
- s.add_development_dependency "mysql"
29
+ s.add_development_dependency "mysql2", "~> 0.2.7"
30
30
  s.add_development_dependency "SystemTimer"
31
31
  s.add_development_dependency "rake", "0.8.7"
32
32
  s.add_development_dependency "ruby-debug"
33
33
  s.add_development_dependency "activerecord", "~> 2.3.11"
34
+ s.add_development_dependency "flying-sphinx", ">= 0.5.1"
34
35
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ts-resque-delta
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
4
+ hash: 19
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
+ - 1
8
9
  - 0
9
- - 0
10
- version: 1.0.0
10
+ version: 1.1.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Aaron Gibralter
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-05-31 00:00:00 Z
18
+ date: 2011-08-29 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: thinking-sphinx
@@ -56,12 +56,12 @@ dependencies:
56
56
  requirements:
57
57
  - - ~>
58
58
  - !ruby/object:Gem::Version
59
- hash: 21
59
+ hash: 17
60
60
  segments:
61
61
  - 0
62
- - 2
62
+ - 3
63
63
  - 1
64
- version: 0.2.1
64
+ version: 0.3.1
65
65
  type: :runtime
66
66
  version_requirements: *id003
67
67
  - !ruby/object:Gem::Dependency
@@ -109,17 +109,19 @@ dependencies:
109
109
  type: :development
110
110
  version_requirements: *id006
111
111
  - !ruby/object:Gem::Dependency
112
- name: mysql
112
+ name: mysql2
113
113
  prerelease: false
114
114
  requirement: &id007 !ruby/object:Gem::Requirement
115
115
  none: false
116
116
  requirements:
117
- - - ">="
117
+ - - ~>
118
118
  - !ruby/object:Gem::Version
119
- hash: 3
119
+ hash: 25
120
120
  segments:
121
121
  - 0
122
- version: "0"
122
+ - 2
123
+ - 7
124
+ version: 0.2.7
123
125
  type: :development
124
126
  version_requirements: *id007
125
127
  - !ruby/object:Gem::Dependency
@@ -182,6 +184,22 @@ dependencies:
182
184
  version: 2.3.11
183
185
  type: :development
184
186
  version_requirements: *id011
187
+ - !ruby/object:Gem::Dependency
188
+ name: flying-sphinx
189
+ prerelease: false
190
+ requirement: &id012 !ruby/object:Gem::Requirement
191
+ none: false
192
+ requirements:
193
+ - - ">="
194
+ - !ruby/object:Gem::Version
195
+ hash: 9
196
+ segments:
197
+ - 0
198
+ - 5
199
+ - 1
200
+ version: 0.5.1
201
+ type: :development
202
+ version_requirements: *id012
185
203
  description: Manage delta indexes via Resque for Thinking Sphinx
186
204
  email:
187
205
  - aaron.gibralter@gmail.com
@@ -206,11 +224,17 @@ files:
206
224
  - features/thinking_sphinx/database.example.yml
207
225
  - features/thinking_sphinx/db/migrations/create_delayed_betas.rb
208
226
  - features/thinking_sphinx/models/delayed_beta.rb
227
+ - lib/flying_sphinx/resque_delta.rb
228
+ - lib/flying_sphinx/resque_delta/delta_job.rb
229
+ - lib/flying_sphinx/resque_delta/flag_as_deleted_job.rb
209
230
  - lib/thinking_sphinx/deltas/resque_delta.rb
210
231
  - lib/thinking_sphinx/deltas/resque_delta/delta_job.rb
211
232
  - lib/thinking_sphinx/deltas/resque_delta/flag_as_deleted_job.rb
212
233
  - lib/thinking_sphinx/deltas/resque_delta/tasks.rb
213
234
  - lib/thinking_sphinx/deltas/resque_delta/version.rb
235
+ - spec/flying_sphinx/resque_delta/delta_job_spec.rb
236
+ - spec/flying_sphinx/resque_delta/flag_as_deleted_job_spec.rb
237
+ - spec/flying_sphinx/resque_delta_spec.rb
214
238
  - spec/spec.opts
215
239
  - spec/spec_helper.rb
216
240
  - spec/thinking_sphinx/deltas/resque_delta/delta_job_spec.rb
@@ -248,7 +272,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
248
272
  requirements: []
249
273
 
250
274
  rubyforge_project: ts-resque-delta
251
- rubygems_version: 1.7.2
275
+ rubygems_version: 1.8.9
252
276
  signing_key:
253
277
  specification_version: 3
254
278
  summary: Thinking Sphinx - Resque Deltas
@@ -261,9 +285,11 @@ test_files:
261
285
  - features/thinking_sphinx/database.example.yml
262
286
  - features/thinking_sphinx/db/migrations/create_delayed_betas.rb
263
287
  - features/thinking_sphinx/models/delayed_beta.rb
288
+ - spec/flying_sphinx/resque_delta/delta_job_spec.rb
289
+ - spec/flying_sphinx/resque_delta/flag_as_deleted_job_spec.rb
290
+ - spec/flying_sphinx/resque_delta_spec.rb
264
291
  - spec/spec.opts
265
292
  - spec/spec_helper.rb
266
293
  - spec/thinking_sphinx/deltas/resque_delta/delta_job_spec.rb
267
294
  - spec/thinking_sphinx/deltas/resque_delta/flag_as_deleted_job_spec.rb
268
295
  - spec/thinking_sphinx/deltas/resque_delta_spec.rb
269
- has_rdoc: