sidekiq-clutch 1.0.0 → 2.0.2

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
- SHA1:
3
- metadata.gz: ec75202216558f8f183a76de69109178e67ba9bb
4
- data.tar.gz: c49621ff95d0667e6d9b2394a1a783a740d240e0
2
+ SHA256:
3
+ metadata.gz: 796b85ff9627cc5bc227521ee81c318f38fc979a7e963df54c762ee174320564
4
+ data.tar.gz: 9196201e96688775de3dca64d1322a8709b9641ed9fbbeb9ccdae187e4e7b3b9
5
5
  SHA512:
6
- metadata.gz: 10eefa778032d53f29c65154057e7ac3f9a7d84c7dfd576da8cc788488f20a744953ea26fedfb2f93812b609b45a382380df77ce901591fc25001c7025219af5
7
- data.tar.gz: f1d72de39d77bd3ebc10034620a009bc8982492faf3188917023dbbeead5252fc36d39e62e5d491cdb477f66f48157fd07544016d28d6d357494036d11c41ee9
6
+ metadata.gz: 15b262b976dff8c5fd3034ec4368d8e7058bfb4879234e9ad881893fb00f08aa81c48c9c6b44044b84321606a7ccf6901165c395146fc07cddb0e0bdbece1edd
7
+ data.tar.gz: de761b630c42ec9d78f82f9281f442c05fc88fb3161522f7190765603129852afbd1675fb2d93a1bd79ec8f46a979b062f29346e7e5406200ae962847babfa6f
@@ -0,0 +1,12 @@
1
+ version: 2
2
+ jobs:
3
+ build:
4
+ parallelism: 1
5
+ docker:
6
+ - image: circleci/ruby:2.5
7
+ - image: redis:3.2
8
+ steps:
9
+ - checkout
10
+ - run: gem install bundler
11
+ - run: bundle install
12
+ - run: bundle exec rspec
data/.gitignore CHANGED
@@ -1,3 +1,4 @@
1
+ /*.gem
1
2
  /.bundle/
2
3
  .rspec_status
3
4
  Gemfile.lock
@@ -1,3 +1,6 @@
1
+ AllCops:
2
+ TargetRubyVersion: 2.3
3
+
1
4
  Metrics/LineLength:
2
5
  Max: 120
3
6
 
@@ -1,3 +1,25 @@
1
+ # 2.0.2 - Sep 24, 2020
2
+
3
+ * PERF: Delete keys based on known values, instead of a glob
4
+ * PERF: Don't bother enqueing a `:complete` callback if no `on_failure` is specified
5
+
6
+ # 2.0.1 - Jun 1, 2020
7
+
8
+ * CHORE: Bump development dependency versions
9
+ * CHORE: Add .ruby-version file for easier development
10
+
11
+ # 2.0.0 - Feb 5, 2020
12
+
13
+ * BREAKING: Treat each parallel block as a distinct step
14
+
15
+ # 1.1.0 - Feb 5, 2020
16
+
17
+ * FEAT: use Sidekiq's wrapped option for improved logging
18
+
19
+ # 1.0.1 - May 7, 2019
20
+
21
+ * FIX: don't look up previous results in Redis if the key is nil
22
+
1
23
  # 1.0.0 - Nov 5, 2018
2
24
 
3
25
  Initial release.
@@ -10,18 +10,18 @@ module Sidekiq
10
10
  @batch = batch || Sidekiq::Batch.new
11
11
  end
12
12
 
13
- attr_reader :batch, :queue
13
+ attr_reader :batch, :queue, :parallel_key
14
14
 
15
15
  attr_accessor :current_result_key, :on_failure
16
16
 
17
17
  def parallel
18
- @parallel = true
18
+ @parallel_key = SecureRandom.uuid
19
19
  yield
20
- @parallel = false
20
+ @parallel_key = nil
21
21
  end
22
22
 
23
23
  def parallel?
24
- @parallel == true
24
+ !!@parallel_key
25
25
  end
26
26
 
27
27
  def jobs
@@ -54,7 +54,8 @@ module Sidekiq
54
54
  return if step.nil?
55
55
  batch.callback_queue = queue if queue
56
56
  batch.on(:success, Sidekiq::Clutch, 'jobs' => jobs_queue.dup, 'result_key' => step['result_key'])
57
- batch.on(:complete, Sidekiq::Clutch, 'on_failure' => on_failure&.name)
57
+ on_failure_name = on_failure&.name
58
+ batch.on(:complete, Sidekiq::Clutch, 'on_failure' => on_failure_name) if on_failure_name
58
59
  batch.jobs do
59
60
  if step['series']
60
61
  series_step(step)
@@ -102,6 +103,7 @@ module Sidekiq
102
103
  options = {
103
104
  'class' => JobWrapper,
104
105
  'queue' => queue || job_options['queue'],
106
+ 'wrapped' => klass,
105
107
  'args' => [batch.bid, klass, params, current_result_key, result_key],
106
108
  'retry' => job_options['retry'],
107
109
  'backtrace' => job_options['backtrace']
@@ -111,8 +113,11 @@ module Sidekiq
111
113
 
112
114
  def clean_up_result_keys(key_base)
113
115
  Sidekiq.redis do |redis|
114
- redis.keys(key_base + '*').each do |key|
115
- redis.del(key)
116
+ result_key_index = 1
117
+ loop do
118
+ result = redis.del("#{key_base}-#{result_key_index}")
119
+ result_key_index += 1
120
+ break if result == 0
116
121
  end
117
122
  end
118
123
  end
@@ -21,9 +21,16 @@ module Sidekiq
21
21
 
22
22
  private
23
23
 
24
+ def lookup_last_result(key)
25
+ Sidekiq.redis do |client|
26
+ client.lrange(key, 0, -1)
27
+ end
28
+ end
29
+
24
30
  def assign_previous_results(job, last_result_key)
25
31
  return unless job.respond_to?(:previous_results=)
26
- job.previous_results = Sidekiq.redis { |c| c.lrange(last_result_key, 0, -1) }.map do |r|
32
+ return job.previous_results = [] if last_result_key.nil?
33
+ job.previous_results = lookup_last_result(last_result_key).map do |r|
27
34
  JSON.parse(r, quirks_mode: true) # quirks_mode allows a bare string or number
28
35
  end
29
36
  end
@@ -22,7 +22,7 @@ module Sidekiq
22
22
 
23
23
  def <<((klass, *params))
24
24
  if @service.parallel?
25
- @jobs << { 'parallel' => [], 'result_key' => next_result_key } unless @jobs.last && @jobs.last['parallel']
25
+ @jobs << new_parallel_step unless continue_existing_parallel_step?
26
26
  @jobs.last['parallel'] << [klass.name, params]
27
27
  else
28
28
  @jobs << { 'series' => [klass.name, params], 'result_key' => next_result_key }
@@ -33,6 +33,16 @@ module Sidekiq
33
33
  @result_key_index += 1
34
34
  "#{@result_key_prefix}-#{@result_key_index}"
35
35
  end
36
+
37
+ private
38
+
39
+ def new_parallel_step
40
+ { 'parallel' => [], 'result_key' => next_result_key, 'parallel_key' => @service.parallel_key }
41
+ end
42
+
43
+ def continue_existing_parallel_step?
44
+ @jobs.last && @jobs.last['parallel_key'] == @service.parallel_key
45
+ end
36
46
  end
37
47
  end
38
48
  end
@@ -1,5 +1,5 @@
1
1
  module Sidekiq
2
2
  class Clutch
3
- VERSION = "1.0.0"
3
+ VERSION = "2.0.2"
4
4
  end
5
5
  end
@@ -15,14 +15,13 @@ Gem::Specification.new do |spec|
15
15
  spec.license = 'MIT'
16
16
 
17
17
  spec.files = Dir.chdir(File.expand_path(__dir__)) do
18
- `git ls-files`.split("\n").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
+ `git ls-files`.split("\n").reject { |f| f.match(%r{^(spec|\.ruby-version)}) }
19
19
  end
20
20
  spec.require_paths = ['lib']
21
21
 
22
22
  spec.add_dependency 'sidekiq', '>= 5.0.0'
23
23
 
24
- spec.add_development_dependency 'pry'
25
- spec.add_development_dependency 'bundler', '~> 1.16'
26
- spec.add_development_dependency 'rake', '~> 10.0'
27
- spec.add_development_dependency 'rspec', '~> 3.0'
24
+ spec.add_development_dependency 'bundler', '~> 2.1.4'
25
+ spec.add_development_dependency 'rake', '~> 13.0.1'
26
+ spec.add_development_dependency 'rspec', '~> 3.9.0'
28
27
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq-clutch
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 2.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tim Morgan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-11-06 00:00:00.000000000 Z
11
+ date: 2020-09-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sidekiq
@@ -24,62 +24,48 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: 5.0.0
27
- - !ruby/object:Gem::Dependency
28
- name: pry
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: '0'
41
27
  - !ruby/object:Gem::Dependency
42
28
  name: bundler
43
29
  requirement: !ruby/object:Gem::Requirement
44
30
  requirements:
45
31
  - - "~>"
46
32
  - !ruby/object:Gem::Version
47
- version: '1.16'
33
+ version: 2.1.4
48
34
  type: :development
49
35
  prerelease: false
50
36
  version_requirements: !ruby/object:Gem::Requirement
51
37
  requirements:
52
38
  - - "~>"
53
39
  - !ruby/object:Gem::Version
54
- version: '1.16'
40
+ version: 2.1.4
55
41
  - !ruby/object:Gem::Dependency
56
42
  name: rake
57
43
  requirement: !ruby/object:Gem::Requirement
58
44
  requirements:
59
45
  - - "~>"
60
46
  - !ruby/object:Gem::Version
61
- version: '10.0'
47
+ version: 13.0.1
62
48
  type: :development
63
49
  prerelease: false
64
50
  version_requirements: !ruby/object:Gem::Requirement
65
51
  requirements:
66
52
  - - "~>"
67
53
  - !ruby/object:Gem::Version
68
- version: '10.0'
54
+ version: 13.0.1
69
55
  - !ruby/object:Gem::Dependency
70
56
  name: rspec
71
57
  requirement: !ruby/object:Gem::Requirement
72
58
  requirements:
73
59
  - - "~>"
74
60
  - !ruby/object:Gem::Version
75
- version: '3.0'
61
+ version: 3.9.0
76
62
  type: :development
77
63
  prerelease: false
78
64
  version_requirements: !ruby/object:Gem::Requirement
79
65
  requirements:
80
66
  - - "~>"
81
67
  - !ruby/object:Gem::Version
82
- version: '3.0'
68
+ version: 3.9.0
83
69
  description: Sidekiq::Clutch provides an ergonomic wrapper API for Sidekiq Batches
84
70
  so you can easily manage serial and parallel jobs.
85
71
  email:
@@ -88,6 +74,7 @@ executables: []
88
74
  extensions: []
89
75
  extra_rdoc_files: []
90
76
  files:
77
+ - ".circleci/config.yml"
91
78
  - ".gitignore"
92
79
  - ".rspec"
93
80
  - ".rubocop.yml"
@@ -121,8 +108,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
121
108
  - !ruby/object:Gem::Version
122
109
  version: '0'
123
110
  requirements: []
124
- rubyforge_project:
125
- rubygems_version: 2.5.2.3
111
+ rubygems_version: 3.0.3
126
112
  signing_key:
127
113
  specification_version: 4
128
114
  summary: An ergonomic wrapper API for Sidekiq Batches