shoryuken 4.0.2 → 4.0.3

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: 020543c4df213954780e2db9436ab1ff93d481c5
4
- data.tar.gz: fe7346621ec5e094ff5d13fcfb12591595ab678e
2
+ SHA256:
3
+ metadata.gz: bd77c85674d135c91607fd5d422af325a2eea48b6e6bd7039b0d2c63cd6f0094
4
+ data.tar.gz: 41909fd74b45cc2dbb3c1cfced6717299e0819e960210c741d3c468e8f4fa569
5
5
  SHA512:
6
- metadata.gz: f902d276c0255c23c2103375aac35f545fd8a3ad477e940a0f2628ed6d00874aa5dab09731f8c1554ebf1a9426b858075f16b20921c08536e54c26424f34de16
7
- data.tar.gz: b95c4a300b3df721c5a11a7871870b08d77068bdabb46773d276dc98d040f56a66407e5dc6a6cda08d843d5f69ccc1d953ce6e718e593a0950c8da344bc45ec7
6
+ metadata.gz: 1e10d6ca93d95bd1fccd6da3dd05df596db6fc5613a5a7d56c83ff6bb3db08202780939fd847d4a54db932f289a553706e8290ead58a174b982f036b524c8b46
7
+ data.tar.gz: 5abaac5fdd7c5c5ea1e512ee13757a25491da1c8999e3fc8001b9d5465023e511d7754224d684f1c7b16014c85d9019533bec86d1740fe0da54c7d9d4b97adab
data/.gitignore CHANGED
@@ -25,3 +25,4 @@ shoryuken.yml
25
25
  *.log
26
26
  .env
27
27
  rubocop.html
28
+ .byebug_history
@@ -1,3 +1,8 @@
1
+ ## [v4.0.3] - 2019-01-06
2
+
3
+ - Support delay per processing group
4
+ - [#543](https://github.com/phstc/shoryuken/pull/543)
5
+
1
6
  ## [v4.0.2] - 2018-11-26
2
7
 
3
8
  - Fix the delegated methods to public warning
@@ -122,7 +122,7 @@ module Shoryuken
122
122
 
123
123
  def parse_queues
124
124
  if Shoryuken.options[:queues].to_a.any?
125
- Shoryuken.add_group('default', Shoryuken.options.fetch(:concurrency, 25))
125
+ Shoryuken.add_group('default', Shoryuken.options[:concurrency])
126
126
 
127
127
  Shoryuken.options[:queues].to_a.each do |queue, weight|
128
128
  parse_queue(queue, weight, 'default')
@@ -130,7 +130,8 @@ module Shoryuken
130
130
  end
131
131
 
132
132
  Shoryuken.options[:groups].to_a.each do |group, options|
133
- Shoryuken.add_group(group, options.fetch(:concurrency, 25))
133
+ Shoryuken.add_group(group, options[:concurrency], delay: options[:delay])
134
+
134
135
  options[:queues].to_a.each do |queue, weight|
135
136
  parse_queue(queue, weight, group)
136
137
  end
@@ -72,7 +72,7 @@ module Shoryuken
72
72
  Shoryuken.groups.map do |group, options|
73
73
  Shoryuken::Manager.new(
74
74
  Shoryuken::Fetcher.new(group),
75
- Shoryuken.polling_strategy(group).new(options[:queues]),
75
+ Shoryuken.polling_strategy(group).new(options[:queues], Shoryuken::Options.delay(group)),
76
76
  options[:concurrency],
77
77
  executor
78
78
  )
@@ -4,7 +4,7 @@ module Shoryuken
4
4
  concurrency: 25,
5
5
  queues: [],
6
6
  aws: {},
7
- delay: 0,
7
+ delay: 0.0,
8
8
  timeout: 8,
9
9
  lifecycle_events: {
10
10
  startup: [],
@@ -30,9 +30,13 @@ module Shoryuken
30
30
  defined?(::ActiveJob)
31
31
  end
32
32
 
33
- def add_group(group, concurrency)
33
+ def add_group(group, concurrency = nil, delay: nil)
34
+ concurrency ||= options[:concurrency]
35
+ delay ||= options[:delay]
36
+
34
37
  groups[group] ||= {
35
38
  concurrency: concurrency,
39
+ delay: delay,
36
40
  queues: []
37
41
  }
38
42
  end
@@ -77,7 +81,6 @@ module Shoryuken
77
81
 
78
82
  def polling_strategy(group)
79
83
  strategy = (group == 'default' ? options : options[:groups].to_h[group]).to_h[:polling_strategy]
80
-
81
84
  case strategy
82
85
  when 'WeightedRoundRobin', nil # Default case
83
86
  Polling::WeightedRoundRobin
@@ -90,6 +93,10 @@ module Shoryuken
90
93
  end
91
94
  end
92
95
 
96
+ def delay(group)
97
+ groups[group].to_h.fetch(:delay, options[:delay]).to_f
98
+ end
99
+
93
100
  def start_callback
94
101
  @@start_callback
95
102
  end
@@ -57,10 +57,8 @@ module Shoryuken
57
57
  end
58
58
  end
59
59
 
60
- private
61
-
62
60
  def delay
63
- Shoryuken.options[:delay].to_f
61
+ @delay || Shoryuken.options[:delay].to_f
64
62
  end
65
63
  end
66
64
  end
@@ -1,7 +1,7 @@
1
1
  module Shoryuken
2
2
  module Polling
3
3
  class StrictPriority < BaseStrategy
4
- def initialize(queues)
4
+ def initialize(queues, delay = nil)
5
5
  # Priority ordering of the queues, highest priority first
6
6
  @queues = queues
7
7
  .group_by { |q| q }
@@ -12,6 +12,7 @@ module Shoryuken
12
12
  @paused_until = queues
13
13
  .each_with_object({}) { |queue, h| h[queue] = Time.at(0) }
14
14
 
15
+ @delay = delay
15
16
  # Start queues at 0
16
17
  reset_next_queue
17
18
  end
@@ -1,10 +1,11 @@
1
1
  module Shoryuken
2
2
  module Polling
3
3
  class WeightedRoundRobin < BaseStrategy
4
- def initialize(queues)
4
+ def initialize(queues, delay = nil)
5
5
  @initial_queues = queues
6
6
  @queues = queues.dup.uniq
7
7
  @paused_queues = []
8
+ @delay = delay
8
9
  end
9
10
 
10
11
  def next_queue
@@ -1,3 +1,3 @@
1
1
  module Shoryuken
2
- VERSION = '4.0.2'.freeze
2
+ VERSION = '4.0.3'.freeze
3
3
  end
@@ -4,7 +4,7 @@ require 'active_job'
4
4
  RSpec.describe Shoryuken::EnvironmentLoader do
5
5
  subject { described_class.new({}) }
6
6
 
7
- describe '#parse_queues' do
7
+ describe '#parse_queues loads default queues' do
8
8
  before do
9
9
  allow(subject).to receive(:load_rails)
10
10
  allow(subject).to receive(:prefix_active_job_queue_names)
@@ -22,6 +22,29 @@ RSpec.describe Shoryuken::EnvironmentLoader do
22
22
  end
23
23
  end
24
24
 
25
+ describe '#parse_queues includes delay per groups' do
26
+ before do
27
+ allow(subject).to receive(:load_rails)
28
+ allow(subject).to receive(:prefix_active_job_queue_names)
29
+ allow(subject).to receive(:require_workers)
30
+ allow(subject).to receive(:validate_queues)
31
+ allow(subject).to receive(:validate_workers)
32
+ allow(subject).to receive(:patch_deprecated_workers)
33
+ end
34
+
35
+ specify do
36
+ Shoryuken.options[:queues] = ['queue1', 'queue2'] # default queues
37
+ Shoryuken.options[:groups] = [[ 'custom', { queues: ['queue3'], delay: 25 }]]
38
+ subject.load
39
+
40
+ expect(Shoryuken.groups['default'][:queues]).to eq(%w[queue1 queue2])
41
+ expect(Shoryuken.groups['default'][:delay]).to eq(Shoryuken.options[:delay])
42
+ expect(Shoryuken.groups['custom'][:queues]).to eq(%w[queue3])
43
+ expect(Shoryuken.groups['custom'][:delay]).to eq(25)
44
+ end
45
+ end
46
+
47
+
25
48
  describe '#prefix_active_job_queue_names' do
26
49
  before do
27
50
  allow(subject).to receive(:load_rails)
@@ -1,19 +1,35 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  RSpec.describe Shoryuken::Options do
4
- describe '.add_group' do
4
+ describe '.add_group adds queues and optional delay' do
5
5
  before do
6
6
  Shoryuken.groups.clear
7
7
  Shoryuken.add_group('group1', 25)
8
8
  Shoryuken.add_group('group2', 25)
9
+ Shoryuken.add_group('group3', 25, delay: 5)
9
10
  end
10
11
 
11
12
  specify do
12
13
  described_class.add_queue('queue1', 1, 'group1')
13
14
  described_class.add_queue('queue2', 2, 'group2')
15
+ described_class.add_queue('queue3', 1, 'group3')
14
16
 
15
17
  expect(described_class.groups['group1'][:queues]).to eq(%w[queue1])
16
18
  expect(described_class.groups['group2'][:queues]).to eq(%w[queue2 queue2])
19
+ expect(described_class.groups['group3'][:queues]).to eq(%w[queue3])
20
+ expect(described_class.groups['group3'][:delay]).to eq(5)
21
+ end
22
+ end
23
+
24
+ describe '.delay works for each group' do
25
+ specify do
26
+ Shoryuken.add_group('group1', 25)
27
+ Shoryuken.add_group('group2', 25, delay: 5)
28
+ described_class.add_queue('queue1', 1, 'group1')
29
+ described_class.add_queue('queue2', 2, 'group2')
30
+
31
+ expect(described_class.delay('group1')).to eq(Shoryuken.options[:delay])
32
+ expect(described_class.delay('group2')).to eq(5.0)
17
33
  end
18
34
  end
19
35
 
@@ -86,6 +86,14 @@ RSpec.describe Shoryuken::Polling::StrictPriority do
86
86
  end
87
87
  end
88
88
 
89
+ describe '#delay' do
90
+ it 'sets delay based on group' do
91
+ delay_polling = Shoryuken::Polling::StrictPriority.new(queues, 25)
92
+ expect(delay_polling.delay).to eq(25.0)
93
+ expect(subject.delay).to eq(1.0)
94
+ end
95
+ end
96
+
89
97
  describe '#messages_found' do
90
98
  it 'pauses a queue if there are no messages found' do
91
99
  # [shoryuken, 2]
@@ -96,4 +96,12 @@ RSpec.describe Shoryuken::Polling::WeightedRoundRobin do
96
96
  expect(subject.instance_variable_get(:@queues)).to eq([queue1, queue2, queue1])
97
97
  end
98
98
  end
99
+
100
+ describe '#delay' do
101
+ it 'sets delay based on group' do
102
+ delay_polling = Shoryuken::Polling::WeightedRoundRobin.new(queues, 25)
103
+ expect(delay_polling.delay).to eq(25.0)
104
+ expect(subject.delay).to eq(1.0)
105
+ end
106
+ end
99
107
  end
@@ -43,7 +43,7 @@ RSpec.configure do |config|
43
43
  Shoryuken.groups.clear
44
44
 
45
45
  Shoryuken.options[:concurrency] = 1
46
- Shoryuken.options[:delay] = 1
46
+ Shoryuken.options[:delay] = 1.0
47
47
  Shoryuken.options[:timeout] = 1
48
48
  Shoryuken.options[:daemon] = nil
49
49
  Shoryuken.options[:logfile] = nil
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shoryuken
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.2
4
+ version: 4.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pablo Cantero
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-11-26 00:00:00.000000000 Z
11
+ date: 2019-01-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -227,8 +227,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
227
227
  - !ruby/object:Gem::Version
228
228
  version: '0'
229
229
  requirements: []
230
- rubyforge_project:
231
- rubygems_version: 2.5.2
230
+ rubygems_version: 3.0.1
232
231
  signing_key:
233
232
  specification_version: 4
234
233
  summary: Shoryuken is a super efficient AWS SQS thread based message processor