sneakers 1.0.1 → 1.0.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: 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