sneakers 1.0.1 → 1.0.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: 744fa79ca6538fa2d298872ca0c3ba1e147836b7
4
- data.tar.gz: f8ad9f24e1c5e48f5aa3a3f2cda8f012d339ace0
3
+ metadata.gz: 955c1e3e788a76c97ae9b89ee240a9a2d3f4aaf8
4
+ data.tar.gz: 28a4049a67567ba36e434a471e280ba0f5fe20b2
5
5
  SHA512:
6
- metadata.gz: f26dac85d301da3434f8ecb547df39db7d1bfe757802a1d3dc3409dfd2c39182e2191463a599bc0cc3d54dbeb89e0504a2e9836f150abeb46cb107dab3318990
7
- data.tar.gz: b0135a4c5e81f06f02477b4ae08d8c8f2724e82f966d73fd8c421f009196d14826f9ca40348131382eeccd5a7899bd7905a023efe412677861b360ae138cff2d
6
+ metadata.gz: 9405f6a0baf93ddf0211f7437138228e6bdeb76247d64675a8211775f540654bb89efe44497f5502d1582cf7855bae5d38c45986a167c3e39cd580ac2c98d24b
7
+ data.tar.gz: 11b4a380a5b3a3e596f294d7406c8afed06a7d9e5679dd12907bc543e00580e05f18cb71331ef16c24e6b1881cadb8df90d29317e4ed8573b0d8de946c877ab3
data/.travis.yml ADDED
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.0
4
+ - 2.1.0
5
+ - 2.0.0
6
+ - 1.9.3
data/README.md CHANGED
@@ -20,6 +20,9 @@ Visit the [wiki](https://github.com/jondot/sneakers/wiki) for
20
20
  complete docs.
21
21
 
22
22
 
23
+ [![Build Status](https://travis-ci.org/jondot/sneakers.svg?branch=master)](https://travis-ci.org/jondot/sneakers)
24
+
25
+
23
26
  ## Installation
24
27
 
25
28
  Add this line to your application's Gemfile:
@@ -153,17 +156,13 @@ Fork, implement, add tests, pull request, get my everlasting thanks and a respec
153
156
 
154
157
  ### Thanks:
155
158
 
156
- * Michael Klishin - @michaelklishin
157
- * Ariel Zerahia - @arielze
158
- * @sergei-matheson
159
- * Sebastian Edwards - @SebastianEdwards
160
- * Tor Ivry - @torkale
159
+ To all Sneakers [Contributors](https://github.com/jondot/sneakers/graphs/contributors) - you make this happen, thanks!
161
160
 
162
161
 
163
162
 
164
163
  # Copyright
165
164
 
166
- Copyright (c) 2013 [Dotan Nahum](http://gplus.to/dotan) [@jondot](http://twitter.com/jondot). See MIT-LICENSE for further details.
165
+ Copyright (c) 2015 [Dotan Nahum](http://gplus.to/dotan) [@jondot](http://twitter.com/jondot). See MIT-LICENSE for further details.
167
166
 
168
167
 
169
168
 
@@ -141,6 +141,7 @@ module Sneakers
141
141
  }.tap do |hash|
142
142
  if reason.is_a?(Exception)
143
143
  hash[:error_class] = reason.class
144
+ hash[:error_message] = "#{reason}"
144
145
  if reason.backtrace
145
146
  hash[:backtrace] = reason.backtrace.take(10).join(', ')
146
147
  end
@@ -46,7 +46,7 @@ class Sneakers::Queue
46
46
  handler_klass = worker.opts[:handler] || Sneakers::CONFIG[:handler]
47
47
  handler = handler_klass.new(@channel, queue, worker.opts)
48
48
 
49
- @consumer = queue.subscribe(:block => false, :ack => @opts[:ack]) do | delivery_info, metadata, msg |
49
+ @consumer = queue.subscribe(:block => false, :manual_ack => @opts[:ack]) do | delivery_info, metadata, msg |
50
50
  worker.do_work(delivery_info, metadata, msg, handler)
51
51
  end
52
52
  nil
@@ -4,7 +4,7 @@ require 'sneakers/workergroup'
4
4
  module Sneakers
5
5
  class Runner
6
6
  def initialize(worker_classes, opts={})
7
- @runnerconfig = RunnerConfig.new(worker_classes)
7
+ @runnerconfig = RunnerConfig.new(worker_classes, opts)
8
8
  end
9
9
 
10
10
  def run
@@ -29,9 +29,9 @@ module Sneakers
29
29
  end
30
30
  end
31
31
 
32
- def initialize(worker_classes)
32
+ def initialize(worker_classes, opts)
33
33
  @worker_classes = worker_classes
34
- @conf = {}
34
+ @conf = opts
35
35
  end
36
36
 
37
37
  def to_h
@@ -0,0 +1,27 @@
1
+ require 'yaml'
2
+
3
+ module Sneakers
4
+ class Spawner
5
+
6
+ def self.spawn
7
+ worker_group_config_file = ENV['WORKER_GROUP_CONFIG'] || "./config/sneaker_worker_groups.yml"
8
+ unless File.exists?(worker_group_config_file)
9
+ puts "No worker group file found."
10
+ puts "Specify via ENV 'WORKER_GROUP_CONFIG' or by convention ./config/sneaker_worker_groups.yml"
11
+ end
12
+ @pids = []
13
+ @exec_string = "bundle exec rake sneakers:run"
14
+ worker_config = YAML.load(File.read(worker_group_config_file))
15
+ worker_config.keys.each do |group_name|
16
+ @pids << fork do
17
+ @exec_hash = {"WORKERS"=> worker_config[group_name]['classes'], "WORKER_COUNT" => worker_config[group_name]["workers"].to_s}
18
+ Kernel.exec(@exec_hash, @exec_string)
19
+ end
20
+ end
21
+ ["TERM", "USR1", "HUP", "USR2"].each do |signal|
22
+ Signal.trap(signal){ @pids.each{|pid| Process.kill(signal, pid) } }
23
+ end
24
+ Process.waitall
25
+ end
26
+ end
27
+ end
@@ -26,8 +26,8 @@ Please set the classes of the workers you want to run like so:
26
26
  EOF
27
27
  exit(1)
28
28
  end
29
-
30
- r = Sneakers::Runner.new(workers)
29
+ opts = (ENV['WORKER_COUNT'].present? ? {:workers => ENV['WORKER_COUNT'].to_i} : {})
30
+ r = Sneakers::Runner.new(workers, opts)
31
31
 
32
32
  r.run
33
33
  end
@@ -1,3 +1,3 @@
1
1
  module Sneakers
2
- VERSION = "1.0.1"
2
+ VERSION = "1.0.2"
3
3
  end
@@ -28,7 +28,7 @@ module Sneakers
28
28
  # end per worker
29
29
  #
30
30
  until @stop_flag.wait_for_set(10.0)
31
- Sneakers.logger.info("Heartbeat: running threads [#{Thread.list.count}]")
31
+ Sneakers.logger.debug("Heartbeat: running threads [#{Thread.list.count}]")
32
32
  # report aggregated stats?
33
33
  end
34
34
 
data/sneakers.gemspec CHANGED
@@ -17,7 +17,7 @@ Gem::Specification.new do |gem|
17
17
  gem.test_files = gem.files.grep(/^(test|spec|features)\//)
18
18
  gem.require_paths = ['lib']
19
19
  gem.add_dependency 'serverengine'
20
- gem.add_dependency 'bunny', '~> 1.6.3'
20
+ gem.add_dependency 'bunny', '~> 1.7.0'
21
21
  gem.add_dependency 'thread'
22
22
  gem.add_dependency 'thor'
23
23
 
@@ -29,5 +29,6 @@ Gem::Specification.new do |gem|
29
29
  gem.add_development_dependency 'simplecov'
30
30
  gem.add_development_dependency 'simplecov-rcov-text'
31
31
  gem.add_development_dependency 'rake'
32
+ gem.add_development_dependency 'minitest'
32
33
  end
33
34
 
@@ -3,6 +3,11 @@ require 'sneakers'
3
3
 
4
4
  describe Sneakers::Publisher do
5
5
  describe '#publish' do
6
+ before do
7
+ Sneakers.clear!
8
+ Sneakers.configure(:log => 'sneakers.log')
9
+ end
10
+
6
11
  it 'should publish a message to an exchange' do
7
12
  xchg = Object.new
8
13
  mock(xchg).publish('test msg', routing_key: 'downloads')
@@ -44,7 +44,7 @@ describe Sneakers::Queue do
44
44
  q = Sneakers::Queue.new("downloads", queue_vars)
45
45
 
46
46
  mock(@mkqueue).bind(@mkex, :routing_key => "downloads")
47
- mock(@mkqueue).subscribe(:block => false, :ack => true)
47
+ mock(@mkqueue).subscribe(:block => false, :manual_ack => true)
48
48
 
49
49
  q.subscribe(@mkworker)
50
50
  end
@@ -56,7 +56,7 @@ describe Sneakers::Queue do
56
56
 
57
57
  mock(@mkqueue).bind(@mkex, :routing_key => "alpha")
58
58
  mock(@mkqueue).bind(@mkex, :routing_key => "beta")
59
- mock(@mkqueue).subscribe(:block => false, :ack => true)
59
+ mock(@mkqueue).subscribe(:block => false, :manual_ack => true)
60
60
 
61
61
  q.subscribe(@mkworker)
62
62
  end
@@ -80,7 +80,7 @@ describe Sneakers::Queue do
80
80
  q = Sneakers::Queue.new("test_nondurable", queue_vars)
81
81
 
82
82
  mock(@mkqueue_nondurable).bind(@mkex, :routing_key => "test_nondurable")
83
- mock(@mkqueue_nondurable).subscribe(:block => false, :ack => true)
83
+ mock(@mkqueue_nondurable).subscribe(:block => false, :manual_ack => true)
84
84
 
85
85
  q.subscribe(@mkworker)
86
86
  myqueue = q.instance_variable_get(:@queue)
@@ -131,6 +131,7 @@ describe Sneakers::Worker do
131
131
  stub(@queue).opts { {} }
132
132
  stub(@queue).exchange { @exchange }
133
133
 
134
+ Sneakers.clear!
134
135
  Sneakers.configure(:daemonize => true, :log => 'sneakers.log')
135
136
  Sneakers::Worker.configure_metrics
136
137
  end
@@ -160,14 +161,50 @@ describe Sneakers::Worker do
160
161
  it "should build a queue with correct configuration given defaults" do
161
162
  @defaults_q.name.must_equal('defaults')
162
163
  @defaults_q.opts.to_hash.must_equal(
163
- {:runner_config_file=>nil, :metrics=>nil, :daemonize=>true, :start_worker_delay=>0.2, :workers=>4, :log=>"sneakers.log", :pid_path=>"sneakers.pid", :timeout_job_after=>5, :prefetch=>10, :threads=>10, :durable=>true, :ack=>true, :amqp=>"amqp://guest:guest@localhost:5672", :vhost=>"/", :exchange=>"sneakers", :exchange_type=>:direct, :hooks=>{}, :handler=>Sneakers::Handlers::Oneshot, :heartbeat => 2}
164
+ :runner_config_file => nil,
165
+ :metrics => nil,
166
+ :daemonize => true,
167
+ :start_worker_delay => 0.2,
168
+ :workers => 4,
169
+ :log => "sneakers.log",
170
+ :pid_path => "sneakers.pid",
171
+ :timeout_job_after => 5,
172
+ :prefetch => 10,
173
+ :threads => 10,
174
+ :durable => true,
175
+ :ack => true,
176
+ :amqp => "amqp://guest:guest@localhost:5672",
177
+ :vhost => "/",
178
+ :exchange => "sneakers",
179
+ :exchange_type => :direct,
180
+ :hooks => {},
181
+ :handler => Sneakers::Handlers::Oneshot,
182
+ :heartbeat => 2
164
183
  )
165
184
  end
166
185
 
167
186
  it "should build a queue with given configuration" do
168
187
  @dummy_q.name.must_equal('downloads')
169
188
  @dummy_q.opts.to_hash.must_equal(
170
- {:runner_config_file=>nil, :metrics=>nil, :daemonize=>true, :start_worker_delay=>0.2, :workers=>4, :log=>"sneakers.log", :pid_path=>"sneakers.pid", :timeout_job_after=>1, :prefetch=>40, :threads=>50, :durable=>false, :ack=>false, :amqp=>"amqp://guest:guest@localhost:5672", :vhost=>"/", :exchange=>"dummy", :exchange_type=>:direct, :hooks=>{}, :handler=>Sneakers::Handlers::Oneshot, :heartbeat =>5}
189
+ :runner_config_file => nil,
190
+ :metrics => nil,
191
+ :daemonize => true,
192
+ :start_worker_delay => 0.2,
193
+ :workers => 4,
194
+ :log => "sneakers.log",
195
+ :pid_path => "sneakers.pid",
196
+ :timeout_job_after => 1,
197
+ :prefetch => 40,
198
+ :threads => 50,
199
+ :durable => false,
200
+ :ack => false,
201
+ :amqp => "amqp://guest:guest@localhost:5672",
202
+ :vhost => "/",
203
+ :exchange => "dummy",
204
+ :exchange_type => :direct,
205
+ :hooks => {},
206
+ :handler => Sneakers::Handlers::Oneshot,
207
+ :heartbeat => 5
171
208
  )
172
209
  end
173
210
  end
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,4 @@
1
+ require 'bundler/setup'
1
2
  require 'simplecov'
2
3
  SimpleCov.start do
3
4
  add_filter "/spec/"
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: 1.0.1
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dotan Nahum
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-06 00:00:00.000000000 Z
11
+ date: 2015-02-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: serverengine
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 1.6.3
33
+ version: 1.7.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 1.6.3
40
+ version: 1.7.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: thread
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -178,6 +178,20 @@ dependencies:
178
178
  - - ">="
179
179
  - !ruby/object:Gem::Version
180
180
  version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: minitest
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
181
195
  description: " Fast background processing framework for Ruby and RabbitMQ "
182
196
  email:
183
197
  - jondotan@gmail.com
@@ -187,6 +201,7 @@ extensions: []
187
201
  extra_rdoc_files: []
188
202
  files:
189
203
  - ".gitignore"
204
+ - ".travis.yml"
190
205
  - CHANGELOG.md
191
206
  - Gemfile
192
207
  - Guardfile
@@ -217,6 +232,7 @@ files:
217
232
  - lib/sneakers/publisher.rb
218
233
  - lib/sneakers/queue.rb
219
234
  - lib/sneakers/runner.rb
235
+ - lib/sneakers/spawner.rb
220
236
  - lib/sneakers/support/production_formatter.rb
221
237
  - lib/sneakers/support/utils.rb
222
238
  - lib/sneakers/tasks.rb
@@ -255,7 +271,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
255
271
  version: '0'
256
272
  requirements: []
257
273
  rubyforge_project:
258
- rubygems_version: 2.2.2
274
+ rubygems_version: 2.4.5
259
275
  signing_key:
260
276
  specification_version: 4
261
277
  summary: Fast background processing framework for Ruby and RabbitMQ