sneakers 2.2.0 → 2.2.1
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/.travis.yml +5 -0
- data/README.md +16 -14
- data/lib/sneakers/configuration.rb +1 -1
- data/lib/sneakers/version.rb +1 -1
- data/sneakers.gemspec +4 -0
- data/spec/fixtures/integration_worker.rb +15 -0
- data/spec/sneakers/integration_spec.rb +107 -0
- data/spec/sneakers/runner_spec.rb +27 -6
- metadata +34 -3
- data/CHANGELOG.md +0 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 562f562a5bb003fdf3d00ae2a37eaf8e3201f80c
|
4
|
+
data.tar.gz: 922e09184bfd33fd91aac65f3ca109a98f85ad46
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5261d1b94c18d35bd051313865eec1612a74cfa1b4b5d340f942eec951f3f8fc0cf1f5f169c47ac48a57ef9bbd5aee62baffcdef8eb18741542fe64ce1beaa14
|
7
|
+
data.tar.gz: fbcb6831ef3fa9f5fd28a6ac12c1ef8a83e12aed46e0834a128fc43e752c6bc7f435dfc51fa5cd3307b168ca7b130bc6be0dd702738ceda8e00390d8488e9cf7
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -54,7 +54,11 @@ gem 'json'
|
|
54
54
|
gem 'redis'
|
55
55
|
```
|
56
56
|
|
57
|
-
|
57
|
+
How do we add a worker? Firstly create a file and name it as `boot.rb`
|
58
|
+
then create a worker named as `Processor`.
|
59
|
+
|
60
|
+
> touch boot.rb
|
61
|
+
|
58
62
|
|
59
63
|
```ruby
|
60
64
|
require 'sneakers'
|
@@ -79,17 +83,6 @@ class Processor
|
|
79
83
|
end
|
80
84
|
```
|
81
85
|
|
82
|
-
We'll count errors and error types with Redis. As an example, make a message that looks like this:
|
83
|
-
|
84
|
-
```javascript
|
85
|
-
{
|
86
|
-
"type": "error",
|
87
|
-
"message": "HALP!",
|
88
|
-
"error": "CODE001"
|
89
|
-
}
|
90
|
-
```
|
91
|
-
|
92
|
-
|
93
86
|
Let's test it out quickly from the command line:
|
94
87
|
|
95
88
|
|
@@ -99,8 +92,17 @@ $ sneakers work Processor --require boot.rb
|
|
99
92
|
|
100
93
|
We just told Sneakers to spawn a worker named `Processor`, but first `--require` a file that we dedicate to setting up environment, including workers and what-not.
|
101
94
|
|
102
|
-
If you go to your RabbitMQ admin now, you'll see a new queue named `logs` was created. Push a couple messages
|
95
|
+
If you go to your RabbitMQ admin now, you'll see a new queue named `logs` was created. Push a couple messages like below:
|
96
|
+
|
97
|
+
```javascript
|
98
|
+
{
|
99
|
+
"type": "error",
|
100
|
+
"message": "HALP!",
|
101
|
+
"error": "CODE001"
|
102
|
+
}
|
103
|
+
```
|
103
104
|
|
105
|
+
And this is the output you should see at your terminal.
|
104
106
|
|
105
107
|
```
|
106
108
|
2013-10-11T19:26:36Z p-4718 t-ovqgyb31o DEBUG: [worker-logs:1:213mmy][#<Thread:0x007fae6b05cc58>][logs][{:prefetch=>10, :durable=>true, :ack=>true, :heartbeat_interval=>2, :exchange=>"sneakers"}] Working off: log log
|
@@ -109,8 +111,8 @@ If you go to your RabbitMQ admin now, you'll see a new queue named `logs` was cr
|
|
109
111
|
2013-10-11T19:26:40Z p-4719 t-ovqgyrx8g INFO: log log
|
110
112
|
```
|
111
113
|
|
112
|
-
And redis will show this:
|
113
114
|
|
115
|
+
We'll count errors and error types with Redis.
|
114
116
|
|
115
117
|
``` shell-session
|
116
118
|
$ redis-cli monitor
|
@@ -77,7 +77,7 @@ module Sneakers
|
|
77
77
|
redacted.merge! to_hash
|
78
78
|
|
79
79
|
# redact passwords
|
80
|
-
redacted[:amqp] = redacted[:amqp].sub(/(?<=\Aamqp:\/)[^@]+(?=@)/, "<redacted>")
|
80
|
+
redacted[:amqp] = redacted[:amqp].sub(/(?<=\Aamqp:\/)[^@]+(?=@)/, "<redacted>") if redacted.has_key?(:amqp)
|
81
81
|
return redacted.inspect_without_redaction
|
82
82
|
end
|
83
83
|
alias_method :inspect_without_redaction, :inspect
|
data/lib/sneakers/version.rb
CHANGED
data/sneakers.gemspec
CHANGED
@@ -22,6 +22,10 @@ Gem::Specification.new do |gem|
|
|
22
22
|
gem.add_dependency 'thread', '~> 0.1.7'
|
23
23
|
gem.add_dependency 'thor'
|
24
24
|
|
25
|
+
# for integration environment (see .travis.yml and integration_spec)
|
26
|
+
gem.add_development_dependency 'rabbitmq_http_api_client'
|
27
|
+
gem.add_development_dependency 'redis'
|
28
|
+
|
25
29
|
gem.add_development_dependency 'rr'
|
26
30
|
gem.add_development_dependency 'ruby-prof'
|
27
31
|
gem.add_development_dependency 'nokogiri'
|
@@ -0,0 +1,107 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'sneakers'
|
3
|
+
require 'sneakers/runner'
|
4
|
+
require 'fixtures/integration_worker'
|
5
|
+
|
6
|
+
require "rabbitmq/http/client"
|
7
|
+
|
8
|
+
|
9
|
+
describe "integration" do
|
10
|
+
describe 'first' do
|
11
|
+
before :each do
|
12
|
+
skip unless ENV['INTEGRATION']
|
13
|
+
prepare
|
14
|
+
end
|
15
|
+
|
16
|
+
def integration_log(msg)
|
17
|
+
puts msg if ENV['INTEGRATION_LOG']
|
18
|
+
end
|
19
|
+
|
20
|
+
def prepare
|
21
|
+
# clean up all integration queues; admin interface must be installed
|
22
|
+
# in integration env
|
23
|
+
begin
|
24
|
+
admin = RabbitMQ::HTTP::Client.new("http://127.0.0.1:15672/", username: "guest", password: "guest")
|
25
|
+
qs = admin.list_queues
|
26
|
+
qs.each do |q|
|
27
|
+
name = q.name
|
28
|
+
if name.start_with? 'integration_'
|
29
|
+
admin.delete_queue('/', name)
|
30
|
+
integration_log "cleaning up #{name}."
|
31
|
+
end
|
32
|
+
end
|
33
|
+
rescue
|
34
|
+
puts "Rabbitmq admin seems to not exist? you better be running this on Travis or Docker. proceeding.\n#{$!}"
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
Sneakers.configure
|
39
|
+
Sneakers.logger.level = Logger::ERROR
|
40
|
+
|
41
|
+
# configure integration worker on a random generated queue
|
42
|
+
random_queue = "integration_#{rand(10**36).to_s(36)}"
|
43
|
+
|
44
|
+
@redis = Redis.new
|
45
|
+
@redis.del(random_queue)
|
46
|
+
IntegrationWorker.from_queue(random_queue)
|
47
|
+
end
|
48
|
+
|
49
|
+
def assert_all_accounted_for(opts)
|
50
|
+
integration_log 'waiting for publishes to stabilize (5s).'
|
51
|
+
sleep 5
|
52
|
+
|
53
|
+
integration_log "polling for changes (max #{opts[:within_sec]}s)."
|
54
|
+
pid = opts[:pid]
|
55
|
+
opts[:within_sec].times do
|
56
|
+
sleep 1
|
57
|
+
count = @redis.get(opts[:queue]).to_i
|
58
|
+
if count == opts[:jobs]
|
59
|
+
integration_log "#{count} jobs accounted for successfully."
|
60
|
+
Process.kill("TERM", pid)
|
61
|
+
sleep 1
|
62
|
+
return
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
integration_log "failed test. killing off workers."
|
67
|
+
Process.kill("TERM", pid)
|
68
|
+
sleep 1
|
69
|
+
fail "incomplete!"
|
70
|
+
end
|
71
|
+
|
72
|
+
def start_worker(w)
|
73
|
+
integration_log "starting workers."
|
74
|
+
r = Sneakers::Runner.new([w])
|
75
|
+
pid = fork {
|
76
|
+
r.run
|
77
|
+
}
|
78
|
+
|
79
|
+
integration_log "waiting for workers to stabilize (5s)."
|
80
|
+
sleep 5
|
81
|
+
|
82
|
+
pid
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'should pull down 100 jobs from a real queue' do
|
86
|
+
job_count = 100
|
87
|
+
|
88
|
+
pid = start_worker(IntegrationWorker)
|
89
|
+
|
90
|
+
integration_log "publishing..."
|
91
|
+
p = Sneakers::Publisher.new
|
92
|
+
job_count.times do |i|
|
93
|
+
p.publish("m #{i}", to_queue: IntegrationWorker.queue_name)
|
94
|
+
end
|
95
|
+
|
96
|
+
assert_all_accounted_for(
|
97
|
+
queue: IntegrationWorker.queue_name,
|
98
|
+
pid: pid,
|
99
|
+
within_sec: 15,
|
100
|
+
jobs: job_count,
|
101
|
+
)
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
|
@@ -29,16 +29,37 @@ describe Sneakers::RunnerConfig do
|
|
29
29
|
let(:logger) { Logger.new("logtest.log") }
|
30
30
|
let(:runner_config) { Sneakers::Runner.new([]).instance_variable_get("@runnerconfig") }
|
31
31
|
|
32
|
-
before { Sneakers.configure(log: logger) }
|
33
32
|
|
34
33
|
|
35
|
-
describe "
|
36
|
-
|
37
|
-
|
34
|
+
describe "with a connection" do
|
35
|
+
before { Sneakers.configure(log: logger, connection: Object.new) }
|
36
|
+
|
37
|
+
describe "#reload_config!" do
|
38
|
+
it "does not throw exception" do
|
39
|
+
runner_config.reload_config!
|
40
|
+
end
|
41
|
+
|
42
|
+
it "must not have :log key" do
|
43
|
+
runner_config.reload_config!.has_key?(:log).must_equal false
|
44
|
+
end
|
45
|
+
|
46
|
+
it "must have :logger key as an instance of Logger" do
|
47
|
+
runner_config.reload_config![:logger].is_a?(Logger).must_equal true
|
48
|
+
end
|
38
49
|
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe "without a connection" do
|
53
|
+
before { Sneakers.configure(log: logger) }
|
39
54
|
|
40
|
-
|
41
|
-
|
55
|
+
describe "#reload_config!" do
|
56
|
+
it "must not have :log key" do
|
57
|
+
runner_config.reload_config!.has_key?(:log).must_equal false
|
58
|
+
end
|
59
|
+
|
60
|
+
it "must have :logger key as an instance of Logger" do
|
61
|
+
runner_config.reload_config![:logger].is_a?(Logger).must_equal true
|
62
|
+
end
|
42
63
|
end
|
43
64
|
end
|
44
65
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sneakers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.2.
|
4
|
+
version: 2.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dotan Nahum
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-09-
|
11
|
+
date: 2015-09-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: serverengine
|
@@ -66,6 +66,34 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rabbitmq_http_api_client
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: redis
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
69
97
|
- !ruby/object:Gem::Dependency
|
70
98
|
name: rr
|
71
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -216,7 +244,6 @@ extra_rdoc_files: []
|
|
216
244
|
files:
|
217
245
|
- ".gitignore"
|
218
246
|
- ".travis.yml"
|
219
|
-
- CHANGELOG.md
|
220
247
|
- Gemfile
|
221
248
|
- Guardfile
|
222
249
|
- LICENSE.txt
|
@@ -254,11 +281,13 @@ files:
|
|
254
281
|
- lib/sneakers/worker.rb
|
255
282
|
- lib/sneakers/workergroup.rb
|
256
283
|
- sneakers.gemspec
|
284
|
+
- spec/fixtures/integration_worker.rb
|
257
285
|
- spec/fixtures/require_worker.rb
|
258
286
|
- spec/sneakers/cli_spec.rb
|
259
287
|
- spec/sneakers/concerns/logging_spec.rb
|
260
288
|
- spec/sneakers/concerns/metrics_spec.rb
|
261
289
|
- spec/sneakers/configuration_spec.rb
|
290
|
+
- spec/sneakers/integration_spec.rb
|
262
291
|
- spec/sneakers/publisher_spec.rb
|
263
292
|
- spec/sneakers/queue_spec.rb
|
264
293
|
- spec/sneakers/runner_spec.rb
|
@@ -291,11 +320,13 @@ signing_key:
|
|
291
320
|
specification_version: 4
|
292
321
|
summary: Fast background processing framework for Ruby and RabbitMQ
|
293
322
|
test_files:
|
323
|
+
- spec/fixtures/integration_worker.rb
|
294
324
|
- spec/fixtures/require_worker.rb
|
295
325
|
- spec/sneakers/cli_spec.rb
|
296
326
|
- spec/sneakers/concerns/logging_spec.rb
|
297
327
|
- spec/sneakers/concerns/metrics_spec.rb
|
298
328
|
- spec/sneakers/configuration_spec.rb
|
329
|
+
- spec/sneakers/integration_spec.rb
|
299
330
|
- spec/sneakers/publisher_spec.rb
|
300
331
|
- spec/sneakers/queue_spec.rb
|
301
332
|
- spec/sneakers/runner_spec.rb
|
data/CHANGELOG.md
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
# 0.1.0, Not released yet
|
2
|
-
|
3
|
-
+ Added newrelic stats reporter (@arielze)
|
4
|
-
+ Added explicit routing_key at queue (@arielze)
|
5
|
-
+ Depracating self-daemonization (@jondot)
|
6
|
-
+ updating bunny (@michaelklishin)
|
7
|
-
+ Fix reference in publisher (@sergei-matheson)
|
8
|
-
+ Allow binding of multiple routing keys (@SebastianEdwards)
|
9
|
-
+ added work_with_params for advanced handling of work items with amqp
|
10
|
-
headers. (#12)
|
11
|
-
+ Sneakers.not_environmental! will no disable auto-environment discovery.
|
12
|
-
(#15)
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
# 0.0.7
|
18
|
-
|
19
|
-
+ Sneakers core.
|
20
|
-
|