resque-integration 3.5.1 → 3.7.1

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
2
  SHA1:
3
- metadata.gz: e62432e7f9261fd9fb81ee4d5e92a6ea5f943c0e
4
- data.tar.gz: 8afc080e74ec136b0fe8bcc4d981e16738cf7422
3
+ metadata.gz: 412dbc6bf78abf735849d6df4910d260fa75be50
4
+ data.tar.gz: 23b9cab284dee3fdb8ecec03d80a3553d7c0263b
5
5
  SHA512:
6
- metadata.gz: f82ef7f730abf7720a1f58f08f275afbfe15cc9a6eb2ae00425bc25581b4e6a5e7095c818ba9f8585be5364bd887620f6ae1cdc4d5e66dbb39d6a6b7187be94c
7
- data.tar.gz: 978439e799b2d95d12b01f14111fc974c314f9e0c5f9112936d301fa66c877629f7ecd275f04358aec4910f61fd970f9f06df0c50040c9409cd5244a576d2af2
6
+ metadata.gz: bfd8b6370f0b85c13527ed1e52d96dea2a6def920c88721c0230f099b8298c994aa5b121cd5e7eacaa158759388930fac8f48131124526bbaeef82c0b83d4e0c
7
+ data.tar.gz: bcf2010e8a02e6499cd0f7e200f54dcee6abec5f9775847071341a37eb60ef73221c0d64311d3d67719f5a361c73a52deb441bf7b2ab76817e1e283c896f7a3a
data/.drone.yml CHANGED
@@ -1,28 +1,74 @@
1
- build:
2
- test:
3
- image: abakpress/dind-testing
4
- pull: true
5
- privileged: true
6
- volumes:
7
- - /home/data/drone/images:/images
8
- - /home/data/drone/gems:/bundle
1
+ name: build
2
+
3
+ kind: pipeline
4
+ type: docker
5
+
6
+ volumes:
7
+ - name: images
8
+ host:
9
+ path: /home/data/drone/images
10
+ - name: bundle
11
+ host:
12
+ path: /home/data/drone/gems
13
+ - name: rubygems
14
+ host:
15
+ path: /home/data/drone/rubygems
16
+
17
+ spec_step_common: &spec_step_common
18
+ image: abakpress/dind-testing:1.0.3
19
+ pull: if-not-exists
20
+ privileged: true
21
+ volumes:
22
+ - name: images
23
+ path: /images
24
+ - name: bundle
25
+ path: /bundle
26
+ commands:
27
+ - prepare-build
28
+
29
+ - fetch-images
30
+ --image abakpress/ruby-app:$RUBY_IMAGE_TAG
31
+ --image redis:$REDIS_IMAGE_TAG
32
+ - dip provision
33
+ - dip rspec
34
+
35
+ steps:
36
+ - name: Tests Ruby 2.2
9
37
  environment:
10
- - COMPOSE_FILE_EXT=drone
11
- - RUBY_IMAGE_TAG=2.2-latest
12
- commands:
13
- - prepare-build
38
+ COMPOSE_FILE_EXT: drone
39
+ DOCKER_RUBY_VERSION: 2.2
40
+ RUBY_IMAGE_TAG: 2.2-latest
41
+ REDIS_IMAGE_TAG: 4-alpine
42
+ RAILS_ENV: test
43
+ <<: *spec_step_common
14
44
 
15
- - fetch-images --image abakpress/ruby-app:$RUBY_IMAGE_TAG
16
- - dip provision
17
- - dip rspec
45
+ - name: Tests Ruby 2.3
46
+ environment:
47
+ COMPOSE_FILE_EXT: drone
48
+ DOCKER_RUBY_VERSION: 2.3
49
+ RUBY_IMAGE_TAG: 2.3-latest
50
+ REDIS_IMAGE_TAG: 4-alpine
51
+ RAILS_ENV: test
52
+ <<: *spec_step_common
53
+
54
+ - name: Tests Ruby 2.4
55
+ environment:
56
+ COMPOSE_FILE_EXT: drone
57
+ DOCKER_RUBY_VERSION: 2.4
58
+ RUBY_IMAGE_TAG: 2.4-latest
59
+ REDIS_IMAGE_TAG: 4-alpine
60
+ RAILS_ENV: test
61
+ <<: *spec_step_common
18
62
 
19
- release:
20
- image: abakpress/gem-publication
21
- pull: true
63
+ - name: release
64
+ image: abakpress/gem-publication:latest
65
+ pull: if-not-exists
22
66
  when:
23
67
  event: push
24
68
  branch: master
69
+ status: success
25
70
  volumes:
26
- - /home/data/drone/rubygems:/root/.gem
71
+ - name: rubygems
72
+ path: /root/.gem
27
73
  commands:
28
74
  - release-gem --public
data/Appraisals CHANGED
@@ -1,13 +1,15 @@
1
- appraise 'rails3.2' do
2
- gem 'rails', '~> 3.2.0'
3
- end
1
+ if RUBY_VERSION < '2.4'
2
+ appraise 'rails3.2' do
3
+ gem 'rails', '~> 3.2.0'
4
+ end
4
5
 
5
- appraise 'rails4.0' do
6
- gem 'rails', '~> 4.0.13'
7
- end
6
+ appraise 'rails4.0' do
7
+ gem 'rails', '~> 4.0.13'
8
+ end
8
9
 
9
- appraise 'rails4.1' do
10
- gem 'rails', '~> 4.1.16'
10
+ appraise 'rails4.1' do
11
+ gem 'rails', '~> 4.1.16'
12
+ end
11
13
  end
12
14
 
13
15
  appraise 'rails4.2' do
@@ -23,5 +25,6 @@ appraise 'rails5.1' do
23
25
  end
24
26
 
25
27
  appraise 'rails5.2' do
26
- gem 'rails', '~> 5.2.0'
28
+ gem 'rails', '~> 5.2.0', '< 5.2.4.1'
29
+ gem 'mimemagic', '<= 0.3.9' if RUBY_VERSION < '2.3'
27
30
  end
data/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
- # v3.5.1
2
-
1
+ # v3.7.1
2
+
3
+ * 2021-07-22 [0caf11c](../../commit/0caf11c) - __(TamarinEA)__ chore: fetch redis image and add rubygems volume
4
+ * 2021-07-21 [7b94d0e](../../commit/7b94d0e) - __(TamarinEA)__ chore: release public gem
5
+ * 2021-07-20 [c51d9ab](../../commit/c51d9ab) - __(TamarinEA)__ chore: lock mimemagic for ruby 2.2
6
+ * 2021-07-20 [843c787](../../commit/843c787) - __(TamarinEA)__ Release 3.7.1
7
+ * 2021-07-20 [933115d](../../commit/933115d) - __(TamarinEA)__ chore: use redis image istead of mock
8
+ * 2021-07-20 [21aa6ba](../../commit/21aa6ba) - __(TamarinEA)__ chore: add ruby 2.4 support
9
+ * 2020-10-05 [05e046b](../../commit/05e046b) - __(TamarinEA)__ Relesae 3.7.0
10
+ * 2020-10-05 [6f12054](../../commit/6f12054) - __(Andrew N. Shalaev)__ Release v3.6.0
11
+ * 2020-09-04 [ee6104e](../../commit/ee6104e) - __(Zhidkov Denis)__ fix: change resque restart command to avoid unwatched workers appearance
12
+ https://jira.railsc.ru/browse/BPC-17334
13
+
14
+ * 2020-08-30 [7676652](../../commit/7676652) - __(TamarinEA)__ feature: add ordered queue check
15
+ https://jira.railsc.ru/browse/GOODS-2471
16
+
17
+ * 2020-04-20 [d36e4b2](../../commit/d36e4b2) - __(TamarinEA)__ chore: use drone 1.6
18
+ * 2020-04-19 [e33faa6](../../commit/e33faa6) - __(TamarinEA)__ Release 3.5.2
19
+ * 2020-04-16 [35eafa2](../../commit/35eafa2) - __(TamarinEA)__ fix: reload ordered meta before save
20
+ https://jira.railsc.ru/browse/GOODS-2326
21
+
22
+ * 2020-04-16 [0c53eef](../../commit/0c53eef) - __(TamarinEA)__ chore: lock gems for support ruby 2.2
3
23
  * 2018-12-21 [c2b890d](../../commit/c2b890d) - __(Andrew N. Shalaev)__ Release v3.5.1
4
24
  * 2018-12-21 [d7478c2](../../commit/d7478c2) - __(Andrew N. Shalaev)__ fix: add support for redis >= v4
5
25
  * 2018-09-06 [49717a5](../../commit/49717a5) - __(Mikhail Nelaev)__ Release 3.5.0
data/Gemfile CHANGED
@@ -2,3 +2,5 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in resque-integration.gemspec
4
4
  gemspec
5
+
6
+ gem 'pry', '< 0.13.0', require: false
data/dip.yml CHANGED
@@ -1,8 +1,9 @@
1
1
  version: '1'
2
2
 
3
3
  environment:
4
- DOCKER_RUBY_VERSION: '2.2'
5
- RUBY_IMAGE_TAG: 2.2-latest
4
+ DOCKER_RUBY_VERSION: 2.3
5
+ RUBY_IMAGE_TAG: 2.3-latest
6
+ REDIS_IMAGE_TAG: 4-alpine
6
7
  COMPOSE_FILE_EXT: development
7
8
  RAILS_ENV: test
8
9
  APRESS_GEMS_CREDENTIALS: ""
data/docker-compose.yml CHANGED
@@ -5,6 +5,13 @@ services:
5
5
  image: abakpress/ruby-app:$RUBY_IMAGE_TAG
6
6
  environment:
7
7
  - BUNDLE_PATH=/bundle/$DOCKER_RUBY_VERSION
8
+ - TEST_REDIS_HOST=redis
8
9
  command: bash
9
10
  volumes:
10
11
  - .:/app
12
+ depends_on:
13
+ - redis
14
+
15
+ redis:
16
+ image: redis:$REDIS_IMAGE_TAG
17
+ command: 'redis-server --bind 0.0.0.0'
@@ -112,12 +112,14 @@ module Resque
112
112
  begin
113
113
  execute(ordered_meta, *job_args)
114
114
  rescue Exception
115
+ ordered_meta.reload!
115
116
  ordered_meta.fail!
116
117
  raise
117
118
  ensure
118
119
  uniqueness.remove(meta_id, job_args) if uniqueness
119
120
  end
120
121
 
122
+ ordered_meta.reload!
121
123
  ordered_meta.finish!
122
124
 
123
125
  i += 1
@@ -137,6 +139,31 @@ module Resque
137
139
  def ordered_meta_id(args)
138
140
  Digest::SHA1.hexdigest([Time.now.to_f, rand, self, args].join)
139
141
  end
142
+
143
+ def in_ordered_queue?(*args)
144
+ meta = enqueued?(*args)
145
+ return false unless meta
146
+
147
+ decoded_args = Resque.decode(Resque.encode(args))
148
+
149
+ args_key = ordered_queue_key(meta.meta_id)
150
+
151
+ args_meta_id = nil
152
+
153
+ ::Resque.redis.lrange(args_key, 0, -1).each do |job_args|
154
+ job_args = ::Resque.decode(job_args)
155
+ meta_id = job_args.shift
156
+
157
+ if job_args == decoded_args
158
+ args_meta_id = meta_id
159
+ break
160
+ end
161
+ end
162
+
163
+ return false unless args_meta_id
164
+
165
+ get_meta(args_meta_id)
166
+ end
140
167
  end
141
168
  end
142
169
  end
@@ -20,7 +20,7 @@ namespace :resque do
20
20
  if god_stopped?
21
21
  Rake::Task['resque:start'].invoke
22
22
  else
23
- puts `#{god} load #{Resque.config.config_file} stop && #{god} restart resque`
23
+ puts `#{god} stop resque && #{god} load #{Resque.config.config_file} stop && #{god} start resque`
24
24
  end
25
25
  end
26
26
 
@@ -1,5 +1,5 @@
1
1
  module Resque
2
2
  module Integration
3
- VERSION = '3.5.1'.freeze
3
+ VERSION = '3.7.1'.freeze
4
4
  end
5
5
  end
@@ -34,7 +34,6 @@ Gem::Specification.new do |gem|
34
34
  gem.add_development_dependency 'simplecov'
35
35
  gem.add_development_dependency 'appraisal', '>= 1.0.2'
36
36
  gem.add_development_dependency 'combustion', '>= 0.5.5'
37
- gem.add_development_dependency 'mock_redis'
38
37
  gem.add_development_dependency 'timecop'
39
38
  gem.add_development_dependency 'pry-byebug'
40
39
  end
@@ -6,6 +6,15 @@ describe Resque::Integration::Ordered do
6
6
 
7
7
  unique { |company_id, param1| [company_id] }
8
8
  ordered max_iterations: 2
9
+
10
+ def self.execute(ordered_meta, arg1, arg2)
11
+ old_meta = @meta_id
12
+ @meta_id = ordered_meta.meta_id
13
+
14
+ at(arg1, arg2, 'some message')
15
+
16
+ @meta_id = old_meta
17
+ end
9
18
  end
10
19
 
11
20
  class UniqueTestJob
@@ -62,6 +71,16 @@ describe Resque::Integration::Ordered do
62
71
  expect(TestJob.ordered_queue_size(meta_id)).to eq 2
63
72
  end
64
73
 
74
+ it 'save ordered meta' do
75
+ ordered_meta_id = TestJob.enqueue(1, 10).meta_id
76
+ meta_id = TestJob.meta_id(1, 10)
77
+ TestJob.perform(meta_id)
78
+ ordered_meta = TestJob.get_meta(ordered_meta_id)
79
+
80
+ expect(ordered_meta).to be_finished
81
+ expect(ordered_meta.progress).to eq(num: 1, total: 10, percent: 10, message: 'some message')
82
+ end
83
+
65
84
  context 'uniqueness' do
66
85
  it 'perform with unique args only once' do
67
86
  UniqueTestJob.enqueue(1, 10)
@@ -84,4 +103,42 @@ describe Resque::Integration::Ordered do
84
103
  expect(meta.meta_id).to_not eq UniqueTestJob.enqueue(1, 20).meta_id
85
104
  end
86
105
  end
106
+
107
+ describe '#in_ordered_queue?' do
108
+ before do
109
+ allow(TestJob).to receive(:rand).and_return(123)
110
+
111
+ Timecop.freeze
112
+ end
113
+
114
+ it do
115
+ TestJob.enqueue(1, 10)
116
+ TestJob.enqueue(1, 20)
117
+
118
+ expect(TestJob.in_ordered_queue?(1, 10)).to be_instance_of(Resque::Plugins::Meta::Metadata)
119
+ expect(TestJob.in_ordered_queue?(1, 10).meta_id).to eq TestJob.ordered_meta_id([1, 10])
120
+ expect(TestJob.in_ordered_queue?(1, 20)).to be_instance_of(Resque::Plugins::Meta::Metadata)
121
+ expect(TestJob.in_ordered_queue?(1, 20).meta_id).to eq TestJob.ordered_meta_id([1, 20])
122
+ expect(TestJob.in_ordered_queue?(1, 30)).to be_falsey
123
+ end
124
+
125
+ context 'when some complex arg' do
126
+ let(:complex_arg) { [Integer, {a: 1, 'b' => '2'}, 10] }
127
+
128
+ it do
129
+ expect(TestJob.in_ordered_queue?(1, complex_arg)).to be_falsey
130
+
131
+ TestJob.enqueue(1, complex_arg)
132
+
133
+ expect(TestJob.in_ordered_queue?(1, complex_arg)).to be_instance_of(Resque::Plugins::Meta::Metadata)
134
+ expect(TestJob.in_ordered_queue?(1, complex_arg).meta_id).to eq TestJob.ordered_meta_id([1, complex_arg])
135
+
136
+ TestJob.perform(TestJob.meta_id(1, complex_arg))
137
+
138
+ expect(TestJob.in_ordered_queue?(1, complex_arg)).to be_falsey
139
+ end
140
+ end
141
+
142
+ after { Timecop.return }
143
+ end
87
144
  end
@@ -37,34 +37,49 @@ RSpec.describe Resque::Integration do
37
37
  end
38
38
  end
39
39
 
40
- it 'enqueues only one job' do
41
- UniqueJob.enqueue(1, param: 'one')
40
+ let(:redis) { Resque.redis }
41
+ let(:travel_redis) do
42
+ ->(time) do
43
+ redis.keys.each do |key|
44
+ ttl = redis.ttl(key)
45
+ next if ttl <= 0
46
+
47
+ redis.expire(key, ttl - time.to_i)
48
+ end
49
+ end
50
+ end
42
51
 
43
- Timecop.travel(10.hours.since) do
52
+ context 'when enqueues only one job' do
53
+ before do
44
54
  UniqueJob.enqueue(1, param: 'one')
45
55
 
46
- expect(Resque.peek(:test, 0, 100).size).to eq(1)
56
+ travel_redis.call(10.hours)
57
+
58
+ UniqueJob.enqueue(1, param: 'one')
47
59
  end
48
- end
49
60
 
50
- it 'enqueues two jobs with differ args' do
51
- UniqueJob.enqueue(1, param: 'one')
61
+ it { expect(Resque.peek(:test, 0, 100).size).to eq(1) }
62
+ end
52
63
 
53
- Timecop.travel(10.hours.since) do
64
+ context 'when enqueues two jobs with differ args' do
65
+ before do
66
+ UniqueJob.enqueue(1, param: 'one')
54
67
  UniqueJob.enqueue(1, param: 'two')
55
-
56
- expect(Resque.peek(:test, 0, 100).size).to eq(2)
57
68
  end
58
- end
59
69
 
60
- it 'enqueues two jobs after expire lock timeout' do
61
- UniqueJob.enqueue(1, param: 'one')
70
+ it { expect(Resque.peek(:test, 0, 100).size).to eq(2) }
71
+ end
62
72
 
63
- Timecop.travel(4.days.since) do
73
+ context 'when enqueues two jobs after expire lock timeout' do
74
+ before do
64
75
  UniqueJob.enqueue(1, param: 'one')
65
76
 
66
- expect(Resque.peek(:test, 0, 100).size).to eq(2)
77
+ travel_redis.call(4.days)
78
+
79
+ UniqueJob.enqueue(1, param: 'one')
67
80
  end
81
+
82
+ it { expect(Resque.peek(:test, 0, 100).size).to eq(2) }
68
83
  end
69
84
 
70
85
  describe 'unlock' do
data/spec/spec_helper.rb CHANGED
@@ -4,12 +4,13 @@ require 'rspec'
4
4
  require 'rspec/its'
5
5
  require 'resque'
6
6
  require 'simplecov'
7
- require 'mock_redis'
8
7
  require 'timecop'
9
8
  require 'pry-byebug'
10
9
  require 'combustion'
11
10
 
12
- Resque.redis = MockRedis.new
11
+ redis = Redis.new(host: ENV['TEST_REDIS_HOST'])
12
+ Redis.current = redis
13
+ Resque.redis = redis
13
14
 
14
15
  SimpleCov.start
15
16
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: resque-integration
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.5.1
4
+ version: 3.7.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexei Mikhailov
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-12-26 00:00:00.000000000 Z
12
+ date: 2021-07-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: resque
@@ -249,20 +249,6 @@ dependencies:
249
249
  - - ">="
250
250
  - !ruby/object:Gem::Version
251
251
  version: 0.5.5
252
- - !ruby/object:Gem::Dependency
253
- name: mock_redis
254
- requirement: !ruby/object:Gem::Requirement
255
- requirements:
256
- - - ">="
257
- - !ruby/object:Gem::Version
258
- version: '0'
259
- type: :development
260
- prerelease: false
261
- version_requirements: !ruby/object:Gem::Requirement
262
- requirements:
263
- - - ">="
264
- - !ruby/object:Gem::Version
265
- version: '0'
266
252
  - !ruby/object:Gem::Dependency
267
253
  name: timecop
268
254
  requirement: !ruby/object:Gem::Requirement