chewy_kiqqer 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b46e354039335e662d5a2703dfefede25e6eb3ae
4
- data.tar.gz: c274a92f28b5123db90522739df092eb0bdf0488
3
+ metadata.gz: 56d8782dbf31ea522b3949701611734c73d7c719
4
+ data.tar.gz: ab2aca5b6fd3414b9bd28ecbd44c34d80364ae7e
5
5
  SHA512:
6
- metadata.gz: 093e22e868d55e03a0a508b48aee199ee5887664a5ae09ca9decb533ad7c8ba2f7ebf0c90a03d5383cd29b7969950e8f2e22ae16aaea924d3e31a7006f8aef1a
7
- data.tar.gz: 60a94f08eca01d4b087cdcb48da86949ade028aeaf4aa6479d79763b5a21156aef966ebc8ed3f12bba8a4784095f5c36e283fd12cd2f17c4ee13a6356135cb0c
6
+ metadata.gz: d7495bbdf62b2a67264c7a6dd0af12bec1381264b0a41b6210f817da6e2ea72d995c4425d15229bf6baa5b0aca7332eefac6955ab16d2118b663d893c059da80
7
+ data.tar.gz: 20573650635ad47f0c1ed8b6031f8e82462673ad3a47e9abc97ca221711718743c0b569bdb11ae71da56ad3df15273d7226d9d446fc5949f447e2f5a567c8102
data/README.md CHANGED
@@ -2,7 +2,9 @@
2
2
 
3
3
  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
4
 
5
- Unlike the standard update_index mechnism it will **always** use the record's index for updates (at this time at least). If you need to do bulk updates, just use chewy's built-in mechanisms.
5
+ You can pass backrefs like with the standard chewy mechanism, but the job itself will always receive an array of ids.
6
+
7
+ It is possible to install more multiple update hooks.
6
8
 
7
9
  ## Installation
8
10
 
@@ -25,7 +27,7 @@ Just add the module and set it up:
25
27
  class User < ActiveRecord::Base
26
28
  include ChewyKiqqer::Mixin
27
29
 
28
- async_update_index index: 'users#user', queue: :other_than_default
30
+ async_update_index index: 'users#user', queue: :other_than_default, backref: :something
29
31
  end
30
32
 
31
33
  You can also include the mixin into ActiveRecord::Base in an initializer if it should be generally available.
@@ -33,6 +35,16 @@ The queue name is optional. You can also set a default queue name for your appli
33
35
 
34
36
  ChewyKiqqer.default_queue = :my_queue
35
37
 
38
+ Giving a backref is also optional (also check the chewy docs for the concept). The backref is the element
39
+ which will be indexed. The default is to use the current record.
40
+
41
+ # use the current record for the backref
42
+ ... backref: :self
43
+ # call a method on the current record to get the backref
44
+ ... backref: :some_method
45
+ # Pass a proc. It will be called with the current record to get the backref
46
+ ... backref: -> (rec) { |rec| rec.do_something }
47
+
36
48
  ## Contributing
37
49
 
38
50
  1. Fork it
data/lib/chewy_kiqqer.rb CHANGED
@@ -1,3 +1,4 @@
1
1
  require "chewy_kiqqer/version"
2
2
  require "chewy_kiqqer/mixin"
3
3
  require "chewy_kiqqer/worker"
4
+ require "chewy_kiqqer/index"
@@ -0,0 +1,27 @@
1
+ module ChewyKiqqer
2
+
3
+ class Index
4
+
5
+ def initialize(backref: :self, index: nil, queue: ChewyKiqqer.default_queue)
6
+ @index_name = index
7
+ @backref_method = backref
8
+ @queue = queue
9
+ end
10
+
11
+ def enqueue(object)
12
+ Sidekiq::Client.push(queue: @queue, class: ChewyKiqqer::Worker, args: [@index_name, backref_ids(object)])
13
+ end
14
+
15
+ def backref(object)
16
+ return @backref_method.call(object) if @backref_method.respond_to?(:call)
17
+ return object if @backref_method.to_s == 'self'
18
+ object.send(@backref_method)
19
+ end
20
+
21
+ def backref_ids(object)
22
+ Array.wrap(backref(object)).map { |object| object.respond_to?(:id) ? object.id : object.to_i }
23
+ end
24
+
25
+ end
26
+
27
+ end
@@ -1,4 +1,5 @@
1
1
  require 'active_support/concern'
2
+ require 'active_support/core_ext/array/wrap'
2
3
 
3
4
  module ChewyKiqqer
4
5
 
@@ -16,19 +17,27 @@ module ChewyKiqqer
16
17
 
17
18
  module ClassMethods
18
19
 
19
- attr_reader :index_name
20
+ attr_reader :indexers
20
21
 
21
- def async_update_index(index: nil, queue: ChewyKiqqer::default_queue)
22
- @index_name = index
22
+ def async_update_index(index: nil, queue: ChewyKiqqer::default_queue, backref: :self)
23
+ @indexers ||= []
24
+ install_chewy_hooks if @indexers.empty?
25
+ @indexers << ChewyKiqqer::Index.new(index: index, queue: queue, backref: backref)
26
+ end
27
+
28
+ def reset_async_chewy
29
+ @indexers and @indexers.clear
30
+ end
31
+
32
+ def install_chewy_hooks
23
33
  after_save :queue_chewy_job
24
34
  after_destroy :queue_chewy_job
25
- ChewyKiqqer::Worker.sidekiq_options queue: queue
26
35
  end
27
-
28
36
  end
29
37
 
30
- def queue_chewy_job
31
- ChewyKiqqer::Worker.perform_async(self.class.index_name, id)
38
+ def queue_chewy_jobs
39
+ self.class.indexers or return
40
+ self.class.indexers.each { |idx| idx.enqueue(self) }
32
41
  end
33
42
  end
34
43
  end
@@ -1,3 +1,3 @@
1
1
  module ChewyKiqqer
2
- VERSION = "0.0.2"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -0,0 +1,66 @@
1
+ require 'chewy_kiqqer'
2
+
3
+ describe ChewyKiqqer::Index do
4
+
5
+ context 'compute the backref' do
6
+
7
+ it 'defaults to the corresponding object' do
8
+ object = Object.new
9
+ idx = ChewyKiqqer::Index.new
10
+ idx.backref(object).should eq object
11
+ end
12
+
13
+ it 'can run a random method' do
14
+ object = double(foobar: :backref)
15
+ idx = ChewyKiqqer::Index.new(backref: :foobar)
16
+ idx.backref(object).should eq :backref
17
+ end
18
+
19
+ it 'can use a proc' do
20
+ object = double(foobar: :my_backref)
21
+ idx = ChewyKiqqer::Index.new(backref: -> (r) { r.foobar })
22
+ idx.backref(object).should eq :my_backref
23
+ end
24
+
25
+ context 'turning backrefs into ids' do
26
+ let(:idx) { ChewyKiqqer::Index.new }
27
+
28
+ it 'uses the ids of the objects' do
29
+ idx.backref_ids([double(id: 3), double(id: 6)]).should eq [3, 6]
30
+ end
31
+
32
+ it 'turns everything else into ints' do
33
+ idx.backref_ids([3, '6']).should eq [3, 6]
34
+ end
35
+
36
+ end
37
+
38
+ context 'queue the job' do
39
+ it 'queues the job with the settings from the index' do
40
+ object = double(id: 24)
41
+ idx = ChewyKiqqer::Index.new index: 'foo#bar',
42
+ queue: 'hello'
43
+
44
+ Sidekiq::Client.should_receive(:push)
45
+ .with(queue: 'hello',
46
+ class: ChewyKiqqer::Worker,
47
+ args: ['foo#bar', [24]])
48
+ idx.enqueue object
49
+ end
50
+
51
+ it 'queues the job on the chewy default queue if not told otherwise' do
52
+ object = double(id: 24)
53
+ ChewyKiqqer.default_queue = :my_default
54
+ idx = ChewyKiqqer::Index.new index: 'foo#bar'
55
+
56
+ Sidekiq::Client.should_receive(:push)
57
+ .with(queue: :my_default,
58
+ class: ChewyKiqqer::Worker,
59
+ args: ['foo#bar', [24]])
60
+ idx.enqueue object
61
+ end
62
+ end
63
+
64
+ end
65
+
66
+ end
data/spec/mixin_spec.rb CHANGED
@@ -5,44 +5,55 @@ class Gummi
5
5
 
6
6
  def self.after_save(*args) ; end
7
7
  def self.after_destroy(*args) ; end
8
- def id ; 17 ; end
9
8
 
10
9
  end
11
10
 
12
11
  describe ChewyKiqqer::Mixin do
13
12
 
14
- context 'class methods' do
15
- it 'installs the hooks' do
16
- Gummi.should_receive(:after_save).with(:queue_chewy_job)
17
- Gummi.should_receive(:after_destroy).with(:queue_chewy_job)
13
+ before(:each) { Gummi.reset_async_chewy }
14
+
15
+ context '#update_index' do
16
+
17
+ it 'installs the hooks if nothing was installed yet' do
18
+ Gummi.should_receive(:install_chewy_hooks)
18
19
  Gummi.async_update_index(index: 'xxx')
19
20
  end
20
21
 
21
- it 'knows the index_name' do
22
- Gummi.async_update_index(index: 'bar#foo')
23
- Gummi.index_name.should eq 'bar#foo'
22
+ it 'does not install the hooks twice' do
23
+ Gummi.should_receive(:install_chewy_hooks).once
24
+ Gummi.async_update_index(index: 'xxx')
25
+ Gummi.async_update_index(index: 'xxx')
24
26
  end
25
27
 
26
- it 'sets the queue name' do
27
- ChewyKiqqer::Worker.should_receive(:sidekiq_options).with(queue: :some_queue)
28
- Gummi.async_update_index(index: 'xxx', queue: :some_queue)
28
+ it 'installs the indexer' do
29
+ ChewyKiqqer::Index.should_receive(:new)
30
+ .with(index: 'some#thing', queue: :medium, backref: :foobar)
31
+ .and_return(:idx)
32
+ Gummi.async_update_index(index: 'some#thing', queue: :medium, backref: :foobar)
33
+ Gummi.indexers.should eq [:idx]
29
34
  end
30
35
 
31
- it 'uses the default queue if none was specified' do
32
- ChewyKiqqer::Worker.should_receive(:sidekiq_options).with(queue: :default3)
33
- ChewyKiqqer.default_queue = :default3
34
- Gummi.async_update_index(index: 'xxx')
36
+ end
37
+
38
+ context '#install hooks' do
39
+
40
+ it 'installs the hooks' do
41
+ Gummi.should_receive(:after_save).with(:queue_chewy_job)
42
+ Gummi.should_receive(:after_destroy).with(:queue_chewy_job)
43
+ Gummi.install_chewy_hooks
35
44
  end
45
+
36
46
  end
37
47
 
38
- context '#queue_job' do
48
+ context '#queue_chewy_jobs' do
39
49
 
40
50
  let(:record) { Gummi.new }
41
51
 
42
52
  it 'queues the job' do
43
- Gummi.async_update_index index: 'foo#bar'
44
- ChewyKiqqer::Worker.should_receive(:perform_async).with('foo#bar', 17)
45
- record.queue_chewy_job
53
+ idx = double
54
+ idx.should_receive(:enqueue).with(record)
55
+ Gummi.stub(indexers: [idx])
56
+ record.queue_chewy_jobs
46
57
  end
47
58
 
48
59
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chewy_kiqqer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Hahn
@@ -108,9 +108,11 @@ files:
108
108
  - Rakefile
109
109
  - chewy_kiqqer.gemspec
110
110
  - lib/chewy_kiqqer.rb
111
+ - lib/chewy_kiqqer/index.rb
111
112
  - lib/chewy_kiqqer/mixin.rb
112
113
  - lib/chewy_kiqqer/version.rb
113
114
  - lib/chewy_kiqqer/worker.rb
115
+ - spec/index_spec.rb
114
116
  - spec/mixin_spec.rb
115
117
  - spec/worker.spec.rb
116
118
  homepage: ''
@@ -139,5 +141,6 @@ specification_version: 4
139
141
  summary: Small helper gem that allows you to automatically run all chewy index updates
140
142
  in sidekiq
141
143
  test_files:
144
+ - spec/index_spec.rb
142
145
  - spec/mixin_spec.rb
143
146
  - spec/worker.spec.rb