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 +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
|