toiler 0.4.1 → 0.4.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
2
  SHA1:
3
- metadata.gz: 5147089083d760568e0f9c58442bac5f37e0c313
4
- data.tar.gz: 087b505c5d9643f04fce1989c7014dc3b96ddad4
3
+ metadata.gz: a2db74f11b3d29deb51e673e5bbb317b087da26b
4
+ data.tar.gz: b40560d3d2fbc5e0781154eb509988ca2bbb93c9
5
5
  SHA512:
6
- metadata.gz: 64b2d544c5178bfa61a66a03620b1a0d29c71de424ebc60874b87fb2259095d6d01faec7b049fe2e23536968d0ba23c74129cb57caa5948fe06ff7ef785e43f5
7
- data.tar.gz: bf2e185000f5086fd0cb97fc657eb0a3c888e0279e88cd93438634407f59cea9bce22b340fc5c2a9489fd1519c90e728e01238b53b933d2f47d7bef0d12112d7
6
+ metadata.gz: afaa74f96f030f0e521bdb8cb6948a4839772428c4bb427da62fac78a0c2bfa87aa72506080ae1c25c57b6b659f324c4c99b19b6acb8a70b52508eb69036d601
7
+ data.tar.gz: a6deb6ab20852811f794d3b4f97abd3c7d6b5ab9e0aa5f3578d01bc0f3dfee9a588fed13b8c8cf95c46f1165000830d4d9a9520bb052750d360e05b883cfa231
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/Gemfile CHANGED
@@ -7,3 +7,6 @@ gem 'aws-sdk', '~> 2.2'
7
7
  group :development do
8
8
  gem 'rubocop'
9
9
  end
10
+ group :test do
11
+ gem 'rspec'
12
+ end
data/Gemfile.lock CHANGED
@@ -11,6 +11,7 @@ GEM
11
11
  concurrent-ruby (1.0.2)
12
12
  concurrent-ruby-edge (0.2.2)
13
13
  concurrent-ruby (~> 1.0.2)
14
+ diff-lcs (1.2.5)
14
15
  jmespath (1.2.4)
15
16
  json_pure (>= 1.8.1)
16
17
  json_pure (1.8.3)
@@ -18,6 +19,19 @@ GEM
18
19
  ast (~> 2.2)
19
20
  powerpack (0.1.1)
20
21
  rainbow (2.1.0)
22
+ rspec (3.5.0)
23
+ rspec-core (~> 3.5.0)
24
+ rspec-expectations (~> 3.5.0)
25
+ rspec-mocks (~> 3.5.0)
26
+ rspec-core (3.5.2)
27
+ rspec-support (~> 3.5.0)
28
+ rspec-expectations (3.5.0)
29
+ diff-lcs (>= 1.2.0, < 2.0)
30
+ rspec-support (~> 3.5.0)
31
+ rspec-mocks (3.5.0)
32
+ diff-lcs (>= 1.2.0, < 2.0)
33
+ rspec-support (~> 3.5.0)
34
+ rspec-support (3.5.0)
21
35
  rubocop (0.40.0)
22
36
  parser (>= 2.3.1.0, < 3.0)
23
37
  powerpack (~> 0.1)
@@ -35,6 +49,7 @@ DEPENDENCIES
35
49
  aws-sdk (~> 2.2)
36
50
  concurrent-ruby (~> 1.0.0)
37
51
  concurrent-ruby-edge (~> 0.2.0)
52
+ rspec
38
53
  rubocop
39
54
 
40
55
  BUNDLED WITH
data/README.md CHANGED
@@ -101,6 +101,7 @@ toiler --help
101
101
 
102
102
  -d, --daemon Daemonize process
103
103
  -r, --require [PATH|DIR] Location of the worker
104
+ -q, --queue QUEUE1,QUEUE2,... Queues to process
104
105
  -C, --config PATH Path to YAML config file
105
106
  -R, --rails Load Rails
106
107
  -L, --logfile PATH Path to writable logfile
data/lib/toiler.rb CHANGED
@@ -28,6 +28,22 @@ module Toiler
28
28
  worker_class_registry.keys
29
29
  end
30
30
 
31
+ def active_worker_class_registry
32
+ active_queues = options[:active_queues]
33
+ if active_queues
34
+ active_queues.each_with_object({}) do |q, registry|
35
+ worker = @worker_class_registry[q]
36
+ if worker.nil?
37
+ logger.warn "No worker assigned to queue: #{q}"
38
+ else
39
+ registry[q] = worker
40
+ end
41
+ end
42
+ else
43
+ @worker_class_registry
44
+ end
45
+ end
46
+
31
47
  def fetcher(queue)
32
48
  fetchers["fetcher_#{queue}".to_sym]
33
49
  end
@@ -52,4 +68,12 @@ module Toiler
52
68
  batch: false
53
69
  }
54
70
  end
71
+
72
+ def register_worker(queue, worker)
73
+ @worker_class_registry[queue] = worker
74
+ end
75
+
76
+ def worker_class_registry=(val)
77
+ @worker_class_registry = val
78
+ end
55
79
  end
@@ -19,12 +19,8 @@ module Toiler
19
19
  pass
20
20
  end
21
21
 
22
- def queues
23
- Toiler.worker_class_registry
24
- end
25
-
26
22
  def spawn_fetchers
27
- queues.each do |queue, _klass|
23
+ Toiler.active_worker_class_registry.each do |queue, _klass|
28
24
  begin
29
25
  fetcher = Actor::Fetcher.spawn! name: "fetcher_#{queue}".to_sym,
30
26
  supervise: true, args: [queue, client]
@@ -36,7 +32,7 @@ module Toiler
36
32
  end
37
33
 
38
34
  def spawn_processors
39
- queues.each do |queue, klass|
35
+ Toiler.active_worker_class_registry.each do |queue, klass|
40
36
  name = "processor_pool_#{queue}".to_sym
41
37
  count = klass.concurrency
42
38
  begin
@@ -16,7 +16,7 @@ module Toiler
16
16
  end
17
17
 
18
18
  def warn(msg)
19
- log Logger::Severity::WARN, smsg
19
+ log Logger::Severity::WARN, msg
20
20
  end
21
21
 
22
22
  def fatal(msg)
@@ -12,6 +12,10 @@ module Toiler
12
12
  opts[:daemon] = arg
13
13
  end
14
14
 
15
+ o.on '-q', '--queue QUEUE1,QUEUE2,...', 'Queues to process' do |arg|
16
+ opts[:active_queues] = arg.split(',')
17
+ end
18
+
15
19
  o.on '-r', '--require [PATH|DIR]', 'Location of the worker' do |arg|
16
20
  opts[:require] = arg
17
21
  end
@@ -1,4 +1,4 @@
1
1
  # Toiler Version
2
2
  module Toiler
3
- VERSION = '0.4.1'.freeze
3
+ VERSION = '0.4.2'.freeze
4
4
  end
data/lib/toiler/worker.rb CHANGED
@@ -34,7 +34,7 @@ module Toiler
34
34
  module ClassMethods
35
35
  def toiler_options(options = {})
36
36
  return class_variable_get(:@@toiler_options) if options.empty?
37
- Toiler.worker_class_registry[options[:queue]] = self if options[:queue]
37
+ Toiler.register_worker(options[:queue], self) if options[:queue]
38
38
  class_variable_get(:@@toiler_options).merge! options
39
39
  end
40
40
 
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ require 'toiler/actor/fetcher'
4
+ RSpec.describe Toiler::Actor::Fetcher, type: :model do
5
+ let(:queue) { 'default' }
6
+ let(:client) { double(:aws_sqs_client) }
7
+
8
+ before do
9
+ allow_any_instance_of(Toiler::Actor::Fetcher).to receive(:log).and_return(true)
10
+ allow_any_instance_of(Toiler::Aws::Queue).to receive(:visibility_timeout).and_return(100)
11
+ allow(client).to receive(:get_queue_url).with(queue_name: 'default').and_return double(:queue, queue_url: 'http://aws.fake/queue')
12
+ end
13
+
14
+ describe "#new" do
15
+ it 'completes sucessfully' do
16
+ fetcher = described_class.new(queue, client)
17
+ expect(fetcher.polling?).to eq(false)
18
+ expect(fetcher.executing?).to eq(false)
19
+ expect(fetcher.scheduled?).to eq(false)
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ require 'toiler/actor/processor'
4
+ RSpec.describe Toiler::Actor::Processor, type: :model do
5
+ let(:fetcher) { double(:fetcher) }
6
+
7
+ describe "#new" do
8
+ it 'initializes properly' do
9
+ allow(Toiler).to receive(:fetcher).and_return(fetcher)
10
+ expect(fetcher).to receive(:tell).with(:processor_finished)
11
+ processor = described_class.new('default')
12
+ expect(processor.executing?).to eq(false)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ require 'toiler/actor/supervisor'
4
+ RSpec.describe Toiler::Actor::Supervisor, type: :model do
5
+ let(:sqs_client) { double(:client) }
6
+ describe "#new" do
7
+ it 'only spawns fetchers for active workers' do
8
+ class InactiveWorker
9
+ include Toiler::Worker
10
+ toiler_options queue: 'inactive_queue'
11
+ def perform(sqs_message, body); end
12
+ end
13
+
14
+ Toiler.options.merge!(active_queues: ['default'])
15
+ expect(::Aws::SQS::Client).to receive(:new).and_return(sqs_client)
16
+ expect(Toiler::Actor::Fetcher).to receive(:spawn!).with(name: :fetcher_default, supervise: true, args: ['default', sqs_client])
17
+ expect(Concurrent::Actor::Utils::Pool).to receive(:spawn!).with(:processor_pool_default, 1)
18
+ supervisor = described_class.new
19
+ end
20
+
21
+ it 'warns when a queue is missing' do
22
+ Toiler.options.merge!(active_queues: ['missing'])
23
+ expect(Toiler::Utils::Logging.logger).to receive(:warn).with("No worker assigned to queue: missing")
24
+ Toiler.active_worker_class_registry
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ require 'toiler/worker'
4
+ RSpec.describe Toiler::Worker, type: :model do
5
+ describe "loading class" do
6
+ it "adds the class to the worker registry, under the queue name" do
7
+ class FakeWorker
8
+ include Toiler::Worker
9
+ toiler_options queue: 'test_queue'
10
+
11
+ def perform(sqs_message, body); end
12
+ end
13
+
14
+ expect(Toiler.worker_class_registry['test_queue']).to eq(FakeWorker)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,23 @@
1
+ require 'bundler/setup'
2
+ Bundler.setup
3
+
4
+ require 'concurrent'
5
+ require 'concurrent-edge'
6
+ Concurrent.use_stdlib_logger Logger::FATAL
7
+
8
+ require 'toiler'
9
+ class TestWorker
10
+ include Toiler::Worker
11
+
12
+ toiler_options queue: 'default'
13
+
14
+ def perform(sqs_message, body); end
15
+ end
16
+
17
+ require 'rspec'
18
+ RSpec.configure do |config|
19
+ config.before do
20
+ Toiler.worker_class_registry = {}
21
+ Toiler.register_worker('default', TestWorker)
22
+ end
23
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: toiler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sebastian Schepens
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-08-09 00:00:00.000000000 Z
11
+ date: 2016-09-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -164,6 +164,7 @@ extra_rdoc_files: []
164
164
  files:
165
165
  - ".gitignore"
166
166
  - ".gitmodules"
167
+ - ".rspec"
167
168
  - ".ruby-version"
168
169
  - Gemfile
169
170
  - Gemfile.lock
@@ -184,6 +185,11 @@ files:
184
185
  - lib/toiler/utils/logging.rb
185
186
  - lib/toiler/version.rb
186
187
  - lib/toiler/worker.rb
188
+ - spec/models/fetcher_spec.rb
189
+ - spec/models/processor_spec.rb
190
+ - spec/models/supervisor_spec.rb
191
+ - spec/models/worker_spec.rb
192
+ - spec/spec_helper.rb
187
193
  - toiler.gemspec
188
194
  homepage: https://github.com/sschepens/toiler
189
195
  licenses:
@@ -209,4 +215,9 @@ rubygems_version: 2.5.1
209
215
  signing_key:
210
216
  specification_version: 4
211
217
  summary: Toiler is a super efficient AWS SQS thread based message processor
212
- test_files: []
218
+ test_files:
219
+ - spec/models/fetcher_spec.rb
220
+ - spec/models/processor_spec.rb
221
+ - spec/models/supervisor_spec.rb
222
+ - spec/models/worker_spec.rb
223
+ - spec/spec_helper.rb