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 +4 -4
- data/.rspec +1 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +15 -0
- data/README.md +1 -0
- data/lib/toiler.rb +24 -0
- data/lib/toiler/actor/supervisor.rb +2 -6
- data/lib/toiler/actor/utils/actor_logging.rb +1 -1
- data/lib/toiler/utils/argument_parser.rb +4 -0
- data/lib/toiler/version.rb +1 -1
- data/lib/toiler/worker.rb +1 -1
- data/spec/models/fetcher_spec.rb +22 -0
- data/spec/models/processor_spec.rb +15 -0
- data/spec/models/supervisor_spec.rb +27 -0
- data/spec/models/worker_spec.rb +17 -0
- data/spec/spec_helper.rb +23 -0
- metadata +14 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a2db74f11b3d29deb51e673e5bbb317b087da26b
|
4
|
+
data.tar.gz: b40560d3d2fbc5e0781154eb509988ca2bbb93c9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: afaa74f96f030f0e521bdb8cb6948a4839772428c4bb427da62fac78a0c2bfa87aa72506080ae1c25c57b6b659f324c4c99b19b6acb8a70b52508eb69036d601
|
7
|
+
data.tar.gz: a6deb6ab20852811f794d3b4f97abd3c7d6b5ab9e0aa5f3578d01bc0f3dfee9a588fed13b8c8cf95c46f1165000830d4d9a9520bb052750d360e05b883cfa231
|
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/Gemfile
CHANGED
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
|
-
|
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
|
-
|
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
|
@@ -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
|
data/lib/toiler/version.rb
CHANGED
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.
|
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
|
data/spec/spec_helper.rb
ADDED
@@ -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.
|
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-
|
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
|