sidekiq-clutch 1.0.0 → 2.0.2

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 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