chewy_kiqqer 0.1.4 → 0.2.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.
- checksums.yaml +4 -4
- data/.travis.yml +7 -0
- data/README.md +6 -0
- data/Rakefile +2 -0
- data/chewy_kiqqer.gemspec +3 -0
- data/lib/chewy_kiqqer.rb +8 -0
- data/lib/chewy_kiqqer/log_subscriber.rb +19 -0
- data/lib/chewy_kiqqer/logger.rb +13 -0
- data/lib/chewy_kiqqer/mixin.rb +4 -2
- data/lib/chewy_kiqqer/version.rb +1 -1
- data/lib/chewy_kiqqer/worker.rb +17 -1
- data/spec/index_spec.rb +8 -8
- data/spec/log_subscriber_spec.rb +30 -0
- data/spec/logger_spec.rb +14 -0
- data/spec/mixin_spec.rb +10 -8
- data/spec/spec_helper.rb +5 -0
- data/spec/worker_spec.rb +13 -4
- metadata +54 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 18f4132a1ead16bf52fdad2c82b2e2ad915847f8
|
4
|
+
data.tar.gz: d7c229850a348c5218eb79bbf7c60bb1a3da2671
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5b49b9869ccd87ae8c504d79fec9968465787a69ca00f2a17b38d26f3622de6e3d8be9c66853fe8775c605e07de1021bf592ddab5b4baaab507dd3ab7c1b5db5
|
7
|
+
data.tar.gz: d7cd065b06dfb7060cfea6eea902f37078f5dcb2db8644007d052cbc68359331cab904c9c5f8f92147d4058c6750291b756d92eeb423c4b74289d316185dc94c
|
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
# ChewyKiqqer
|
2
2
|
|
3
|
+
[](https://travis-ci.org/averell23/chewy_kiqqer)
|
4
|
+
[](https://codeclimate.com/github/averell23/chewy_kiqqer)
|
5
|
+
[](https://codeclimate.com/github/averell23/chewy_kiqqer)
|
6
|
+
|
3
7
|
This is an alternative udpate/callback mechanism for [Chewy](https://github.com/toptal/chewy). It queues the updates as [Sidekiq](https://github.com/mperham/sidekiq) jobs.
|
4
8
|
|
5
9
|
You can pass backrefs like with the standard chewy mechanism, but the job itself will always receive an array of ids.
|
@@ -45,6 +49,8 @@ which will be indexed. The default is to use the current record.
|
|
45
49
|
# Pass a proc. It will be called with the current record to get the backref
|
46
50
|
... backref: -> (rec) { |rec| rec.do_something }
|
47
51
|
|
52
|
+
## Update handling
|
53
|
+
|
48
54
|
## Contributing
|
49
55
|
|
50
56
|
1. Fork it
|
data/Rakefile
CHANGED
data/chewy_kiqqer.gemspec
CHANGED
@@ -20,9 +20,12 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.add_dependency 'sidekiq'
|
22
22
|
spec.add_dependency 'chewy'
|
23
|
+
spec.add_dependency 'sidekiq-lock'
|
24
|
+
spec.add_dependency 'activesupport', '>= 3.2.0'
|
23
25
|
|
24
26
|
spec.add_development_dependency "bundler", "~> 1.3"
|
25
27
|
spec.add_development_dependency "rake"
|
26
28
|
spec.add_development_dependency "kaminari"
|
27
29
|
spec.add_development_dependency "rspec"
|
30
|
+
spec.add_development_dependency "codeclimate-test-reporter"
|
28
31
|
end
|
data/lib/chewy_kiqqer.rb
CHANGED
@@ -1,4 +1,12 @@
|
|
1
|
+
require 'active_support/notifications'
|
2
|
+
require 'active_support/log_subscriber'
|
3
|
+
|
1
4
|
require "chewy_kiqqer/version"
|
2
5
|
require "chewy_kiqqer/mixin"
|
3
6
|
require "chewy_kiqqer/worker"
|
4
7
|
require "chewy_kiqqer/index"
|
8
|
+
require "chewy_kiqqer/logger"
|
9
|
+
require "chewy_kiqqer/log_subscriber"
|
10
|
+
|
11
|
+
|
12
|
+
ChewyKiqqer::LogSubscriber.attach_to 'chewy_kiqqer'
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module ChewyKiqqer
|
2
|
+
|
3
|
+
class LogSubscriber < ActiveSupport::LogSubscriber
|
4
|
+
|
5
|
+
def perform(event)
|
6
|
+
info "ChewyKiqqer performed on #{event.payload[:index_name]} with ids #{event.payload[:ids]} - duration #{event.duration}"
|
7
|
+
end
|
8
|
+
|
9
|
+
def queue_jobs(event)
|
10
|
+
debug "ChewyKiqqer queued jobs from #{event.payload[:class]} #{event.payload[:id]}"
|
11
|
+
end
|
12
|
+
|
13
|
+
def logger
|
14
|
+
ChewyKiqqer.logger
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
data/lib/chewy_kiqqer/mixin.rb
CHANGED
@@ -35,8 +35,10 @@ module ChewyKiqqer
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def queue_chewy_jobs
|
38
|
-
self.class.
|
39
|
-
|
38
|
+
ActiveSupport::Notifications.instrument('queue_jobs.chewy_kiqqer', class: self.class.name, id: self.id) do
|
39
|
+
self.class.indexers or return
|
40
|
+
self.class.indexers.each { |idx| idx.enqueue(self) }
|
41
|
+
end
|
40
42
|
end
|
41
43
|
end
|
42
44
|
end
|
data/lib/chewy_kiqqer/version.rb
CHANGED
data/lib/chewy_kiqqer/worker.rb
CHANGED
@@ -1,11 +1,27 @@
|
|
1
1
|
require 'sidekiq'
|
2
|
+
require 'sidekiq-lock'
|
2
3
|
|
3
4
|
module ChewyKiqqer
|
4
5
|
class Worker
|
6
|
+
|
7
|
+
class LockError < StandardError ; end
|
8
|
+
|
5
9
|
include Sidekiq::Worker
|
10
|
+
include Sidekiq::Lock::Worker
|
11
|
+
|
12
|
+
sidekiq_options lock: {
|
13
|
+
timeout: 3000,
|
14
|
+
name: ->(index_name, ids) { "lock:chewy_kiqqer:#{ids}-#{[ids].flatten.sort.join('-')}" }
|
15
|
+
}
|
16
|
+
|
6
17
|
|
7
18
|
def perform(index_name, ids)
|
8
|
-
|
19
|
+
lock.acquire! or raise LockError
|
20
|
+
ActiveSupport::Notifications.instrument('perform.chewy_kiqqer', index_name: index_name, ids: ids) do
|
21
|
+
Chewy.derive_type(index_name).import ids
|
22
|
+
end
|
23
|
+
ensure
|
24
|
+
lock.release!
|
9
25
|
end
|
10
26
|
end
|
11
27
|
end
|
data/spec/index_spec.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
describe ChewyKiqqer::Index do
|
4
4
|
|
@@ -7,30 +7,30 @@ describe ChewyKiqqer::Index do
|
|
7
7
|
it 'defaults to the corresponding object' do
|
8
8
|
object = Object.new
|
9
9
|
idx = ChewyKiqqer::Index.new
|
10
|
-
idx.backref(object).
|
10
|
+
expect(idx.backref(object)).to eq object
|
11
11
|
end
|
12
12
|
|
13
13
|
it 'can run a random method' do
|
14
14
|
object = double(foobar: :backref)
|
15
15
|
idx = ChewyKiqqer::Index.new(backref: :foobar)
|
16
|
-
idx.backref(object).
|
16
|
+
expect(idx.backref(object)).to eq :backref
|
17
17
|
end
|
18
18
|
|
19
19
|
it 'can use a proc' do
|
20
20
|
object = double(foobar: :my_backref)
|
21
21
|
idx = ChewyKiqqer::Index.new(backref: -> (r) { r.foobar })
|
22
|
-
idx.backref(object).
|
22
|
+
expect(idx.backref(object)).to eq :my_backref
|
23
23
|
end
|
24
24
|
|
25
25
|
context 'turning backrefs into ids' do
|
26
26
|
let(:idx) { ChewyKiqqer::Index.new }
|
27
27
|
|
28
28
|
it 'uses the ids of the objects' do
|
29
|
-
idx.backref_ids([double(id: 3), double(id: 6)]).
|
29
|
+
expect(idx.backref_ids([double(id: 3), double(id: 6)])).to eq [3, 6]
|
30
30
|
end
|
31
31
|
|
32
32
|
it 'turns everything else into ints' do
|
33
|
-
idx.backref_ids([3, '6']).
|
33
|
+
expect(idx.backref_ids([3, '6'])).to eq [3, 6]
|
34
34
|
end
|
35
35
|
|
36
36
|
end
|
@@ -41,7 +41,7 @@ describe ChewyKiqqer::Index do
|
|
41
41
|
idx = ChewyKiqqer::Index.new index: 'foo#bar',
|
42
42
|
queue: 'hello'
|
43
43
|
|
44
|
-
Sidekiq::Client.
|
44
|
+
expect(Sidekiq::Client).to receive(:push)
|
45
45
|
.with('queue' => 'hello',
|
46
46
|
'class' => ChewyKiqqer::Worker,
|
47
47
|
'args' => ['foo#bar', [24]])
|
@@ -53,7 +53,7 @@ describe ChewyKiqqer::Index do
|
|
53
53
|
ChewyKiqqer.default_queue = :my_default
|
54
54
|
idx = ChewyKiqqer::Index.new index: 'foo#bar'
|
55
55
|
|
56
|
-
Sidekiq::Client.
|
56
|
+
expect(Sidekiq::Client).to receive(:push)
|
57
57
|
.with('queue' => :my_default,
|
58
58
|
'class' => ChewyKiqqer::Worker,
|
59
59
|
'args' => ['foo#bar', [24]])
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ChewyKiqqer::LogSubscriber do
|
4
|
+
|
5
|
+
let(:subscriber) { ChewyKiqqer::LogSubscriber.new }
|
6
|
+
let(:logger) { Logger.new(nil) }
|
7
|
+
|
8
|
+
it 'logs a perform with the default logger' do
|
9
|
+
expect {
|
10
|
+
subscriber.perform(double(payload: { index_name: 'foo', ids: [1,2] }, duration: 0.2))
|
11
|
+
}.to_not raise_error
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'logs a perform event' do
|
15
|
+
allow(subscriber).to receive(:logger).and_return(logger)
|
16
|
+
expect(logger).to receive(:info)
|
17
|
+
expect {
|
18
|
+
subscriber.perform(double(payload: { index_name: 'foo', ids: [1,2] }, duration: 0.2))
|
19
|
+
}.to_not raise_error
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'log a queue_jobs event' do
|
23
|
+
allow(subscriber).to receive(:logger).and_return(logger)
|
24
|
+
expect(logger).to receive(:debug)
|
25
|
+
expect {
|
26
|
+
subscriber.queue_jobs(double(payload: { class: 'Huha', id: 123 }))
|
27
|
+
}.to_not raise_error
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
data/spec/logger_spec.rb
ADDED
data/spec/mixin_spec.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
|
-
require '
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
class Gummi
|
4
4
|
include ChewyKiqqer::Mixin
|
5
5
|
|
6
6
|
def self.after_commit(*args) ; end
|
7
7
|
|
8
|
+
def id ; 17 ; end
|
9
|
+
|
8
10
|
end
|
9
11
|
|
10
12
|
describe ChewyKiqqer::Mixin do
|
@@ -14,22 +16,22 @@ describe ChewyKiqqer::Mixin do
|
|
14
16
|
context '#update_index' do
|
15
17
|
|
16
18
|
it 'installs the hooks if nothing was installed yet' do
|
17
|
-
Gummi.
|
19
|
+
expect(Gummi).to receive(:install_chewy_hooks)
|
18
20
|
Gummi.async_update_index(index: 'xxx')
|
19
21
|
end
|
20
22
|
|
21
23
|
it 'does not install the hooks twice' do
|
22
|
-
Gummi.
|
24
|
+
expect(Gummi).to receive(:install_chewy_hooks).once
|
23
25
|
Gummi.async_update_index(index: 'xxx')
|
24
26
|
Gummi.async_update_index(index: 'xxx')
|
25
27
|
end
|
26
28
|
|
27
29
|
it 'installs the indexer' do
|
28
|
-
ChewyKiqqer::Index.
|
30
|
+
expect(ChewyKiqqer::Index).to receive(:new)
|
29
31
|
.with(index: 'some#thing', queue: :medium, backref: :foobar)
|
30
32
|
.and_return(:idx)
|
31
33
|
Gummi.async_update_index(index: 'some#thing', queue: :medium, backref: :foobar)
|
32
|
-
Gummi.indexers.
|
34
|
+
expect(Gummi.indexers).to eq [:idx]
|
33
35
|
end
|
34
36
|
|
35
37
|
end
|
@@ -37,7 +39,7 @@ describe ChewyKiqqer::Mixin do
|
|
37
39
|
context '#install hooks' do
|
38
40
|
|
39
41
|
it 'installs the hooks' do
|
40
|
-
Gummi.
|
42
|
+
expect(Gummi).to receive(:after_commit).with(:queue_chewy_jobs)
|
41
43
|
Gummi.install_chewy_hooks
|
42
44
|
end
|
43
45
|
|
@@ -49,8 +51,8 @@ describe ChewyKiqqer::Mixin do
|
|
49
51
|
|
50
52
|
it 'queues the job' do
|
51
53
|
idx = double
|
52
|
-
idx.
|
53
|
-
Gummi.
|
54
|
+
expect(idx).to receive(:enqueue).with(record)
|
55
|
+
allow(Gummi).to receive(:indexers).and_return([idx])
|
54
56
|
record.queue_chewy_jobs
|
55
57
|
end
|
56
58
|
|
data/spec/spec_helper.rb
ADDED
data/spec/worker_spec.rb
CHANGED
@@ -1,16 +1,25 @@
|
|
1
|
-
require '
|
2
|
-
require 'chewy'
|
1
|
+
require 'spec_helper'
|
3
2
|
|
4
3
|
describe ChewyKiqqer::Worker do
|
5
4
|
|
6
5
|
let(:worker) { ChewyKiqqer::Worker.new }
|
6
|
+
let(:lock) { double(acquire!: true, release!: true) }
|
7
|
+
|
8
|
+
before(:each) { allow(worker).to receive(:lock).and_return(lock) }
|
7
9
|
|
8
10
|
it 'calls the indexing with chewy' do
|
9
11
|
index = double
|
10
|
-
Chewy.
|
11
|
-
index.
|
12
|
+
expect(Chewy).to receive(:derive_type).with('foo#bar').and_return(index)
|
13
|
+
expect(index).to receive(:import).with([17])
|
12
14
|
|
13
15
|
worker.perform('foo#bar', [17])
|
14
16
|
end
|
15
17
|
|
18
|
+
it 'raises a lock error if the lock cannot be acquired' do
|
19
|
+
allow(lock).to receive(:acquire!).and_return(false)
|
20
|
+
expect {
|
21
|
+
worker.perform('foo#bar', [17])
|
22
|
+
}.to raise_error(ChewyKiqqer::Worker::LockError)
|
23
|
+
end
|
24
|
+
|
16
25
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chewy_kiqqer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Hahn
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-07-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sidekiq
|
@@ -38,6 +38,34 @@ dependencies:
|
|
38
38
|
- - '>='
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: sidekiq-lock
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: activesupport
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 3.2.0
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 3.2.0
|
41
69
|
- !ruby/object:Gem::Dependency
|
42
70
|
name: bundler
|
43
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -94,6 +122,20 @@ dependencies:
|
|
94
122
|
- - '>='
|
95
123
|
- !ruby/object:Gem::Version
|
96
124
|
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: codeclimate-test-reporter
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - '>='
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - '>='
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
97
139
|
description: Sidekiq integration for chewy and sidekiq
|
98
140
|
email:
|
99
141
|
- dha@betterplace.org
|
@@ -102,6 +144,7 @@ extensions: []
|
|
102
144
|
extra_rdoc_files: []
|
103
145
|
files:
|
104
146
|
- .gitignore
|
147
|
+
- .travis.yml
|
105
148
|
- Gemfile
|
106
149
|
- LICENSE.txt
|
107
150
|
- README.md
|
@@ -109,11 +152,16 @@ files:
|
|
109
152
|
- chewy_kiqqer.gemspec
|
110
153
|
- lib/chewy_kiqqer.rb
|
111
154
|
- lib/chewy_kiqqer/index.rb
|
155
|
+
- lib/chewy_kiqqer/log_subscriber.rb
|
156
|
+
- lib/chewy_kiqqer/logger.rb
|
112
157
|
- lib/chewy_kiqqer/mixin.rb
|
113
158
|
- lib/chewy_kiqqer/version.rb
|
114
159
|
- lib/chewy_kiqqer/worker.rb
|
115
160
|
- spec/index_spec.rb
|
161
|
+
- spec/log_subscriber_spec.rb
|
162
|
+
- spec/logger_spec.rb
|
116
163
|
- spec/mixin_spec.rb
|
164
|
+
- spec/spec_helper.rb
|
117
165
|
- spec/worker_spec.rb
|
118
166
|
homepage: ''
|
119
167
|
licenses:
|
@@ -135,12 +183,15 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
135
183
|
version: '0'
|
136
184
|
requirements: []
|
137
185
|
rubyforge_project:
|
138
|
-
rubygems_version: 2.0.
|
186
|
+
rubygems_version: 2.0.14
|
139
187
|
signing_key:
|
140
188
|
specification_version: 4
|
141
189
|
summary: Small helper gem that allows you to automatically run all chewy index updates
|
142
190
|
in sidekiq
|
143
191
|
test_files:
|
144
192
|
- spec/index_spec.rb
|
193
|
+
- spec/log_subscriber_spec.rb
|
194
|
+
- spec/logger_spec.rb
|
145
195
|
- spec/mixin_spec.rb
|
196
|
+
- spec/spec_helper.rb
|
146
197
|
- spec/worker_spec.rb
|