toiler 0.4.1 → 0.4.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
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