sneakers 0.0.6 → 0.0.7

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.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- sneakers (0.0.5)
4
+ sneakers (0.0.6)
5
5
  bunny (>= 0.10.0)
6
6
  serverengine
7
7
  thor
data/README.md CHANGED
@@ -84,13 +84,11 @@ Let's test it out quickly from the command line:
84
84
 
85
85
 
86
86
  ```bash
87
- sneakers work Processor --require boot.rb --front
87
+ sneakers work Processor --require boot.rb
88
88
  ```
89
89
 
90
90
  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.
91
91
 
92
- For simplicity, we also told Sneakers to *not* daemonize and work at the `--front`.
93
-
94
92
  If you go to your RabbitMQ admin now, you'll see a new queue named `logs` was created. Push a couple messages, and this is the output you should see at your terminal.
95
93
 
96
94
 
data/lib/sneakers.rb CHANGED
@@ -20,14 +20,14 @@ require 'sneakers/publisher'
20
20
 
21
21
  module Sneakers
22
22
 
23
- Config = {
23
+ DEFAULTS = {
24
24
  # runner
25
25
  :runner_config_file => nil,
26
26
  :metrics => nil,
27
- :daemonize => true,
27
+ :daemonize => false,
28
28
  :start_worker_delay => 0.2,
29
29
  :workers => 4,
30
- :log => 'sneakers.log',
30
+ :log => STDOUT,
31
31
  :pid_path => 'sneakers.pid',
32
32
 
33
33
  #workers
@@ -43,7 +43,9 @@ module Sneakers
43
43
  :exchange => 'sneakers',
44
44
  :exchange_type => :direct,
45
45
  :hooks => {}
46
- }
46
+ }.freeze
47
+
48
+ Config = DEFAULTS.dup
47
49
 
48
50
  def self.configure(opts={})
49
51
  # worker > userland > defaults
@@ -55,6 +57,21 @@ module Sneakers
55
57
  @configured = true
56
58
  end
57
59
 
60
+ def self.clear!
61
+ Config.clear
62
+ Config.merge!(DEFAULTS.dup)
63
+ @logger = nil
64
+ @publisher = nil
65
+ @configured = false
66
+ end
67
+
68
+ def self.daemonize!(loglevel=Logger::INFO)
69
+ Config[:log] = 'sneakers.log'
70
+ Config[:daemonize] = true
71
+ setup_general_logger!
72
+ logger.level = loglevel
73
+ end
74
+
58
75
  def self.logger
59
76
  @logger
60
77
  end
@@ -71,8 +88,12 @@ module Sneakers
71
88
  private
72
89
 
73
90
  def self.setup_general_logger!
74
- @logger = Logger.new(Config[:log])
75
- @logger.formatter = Sneakers::Support::ProductionFormatter
91
+ if [:info, :debug, :error, :warn].all?{ |meth| Config[:log].respond_to?(meth) }
92
+ @logger = Config[:log]
93
+ else
94
+ @logger = Logger.new(Config[:log])
95
+ @logger.formatter = Sneakers::Support::ProductionFormatter
96
+ end
76
97
  end
77
98
 
78
99
  def self.setup_worker_concerns!
data/lib/sneakers/cli.rb CHANGED
@@ -24,20 +24,19 @@ module Sneakers
24
24
  BANNER = SNEAKERS
25
25
 
26
26
  method_option :debug
27
- method_option :front
27
+ method_option :daemonize
28
28
  method_option :require
29
29
 
30
30
  desc "work FirstWorker,SecondWorker ... ,NthWorker", "Run workers"
31
31
  def work(workers)
32
32
  opts = {
33
- :daemonize => !options[:front]
33
+ :daemonize => !!options[:daemonize]
34
34
  }
35
- unless opts[:daemonize]
36
- opts[:log] = STDOUT
37
- end
35
+
36
+ opts[:log] = opts[:daemonize] ? 'sneakers.log' : STDOUT
37
+
38
38
 
39
39
  Sneakers.configure(opts)
40
- puts Sneakers::Config
41
40
 
42
41
  require_boot File.expand_path(options[:require]) if options[:require]
43
42
 
@@ -1,6 +1,5 @@
1
1
  require 'serverengine'
2
2
  require 'sneakers/workergroup'
3
- require 'sneakers/runner_config'
4
3
 
5
4
  module Sneakers
6
5
  class Runner
@@ -17,4 +16,60 @@ module Sneakers
17
16
  @se.stop
18
17
  end
19
18
  end
19
+
20
+
21
+ class RunnerConfig
22
+ def method_missing(meth, *args, &block)
23
+ if %w{ before_fork after_fork }.include? meth.to_s
24
+ @conf[meth] = block
25
+ elsif %w{ workers start_worker_delay amqp }.include? meth.to_s
26
+ @conf[meth] = args.first
27
+ else
28
+ super
29
+ end
30
+ end
31
+
32
+ def initialize(worker_classes)
33
+ @worker_classes = worker_classes
34
+ @conf = {}
35
+ end
36
+
37
+ def to_h
38
+ @conf
39
+ end
40
+
41
+
42
+ def reload_config!
43
+ Sneakers.logger.warn("Loading runner configuration...")
44
+ config_file = Sneakers::Config[:runner_config_file]
45
+
46
+ if config_file
47
+ begin
48
+ instance_eval(File.read(config_file), config_file)
49
+ Sneakers.logger.info("Loading config with file: #{config_file}")
50
+ rescue
51
+ Sneakers.logger.error("Cannot load from file '#{config_file}', #{$!}")
52
+ end
53
+ end
54
+
55
+ config = make_serverengine_config
56
+
57
+ [:before_fork, :after_fork].each do | hook |
58
+ Sneakers::Config[:hooks][hook] = config.delete(hook) if config[hook]
59
+ end
60
+
61
+
62
+ Sneakers.logger.info("New configuration: #{config.inspect}")
63
+ config
64
+ end
65
+
66
+ private
67
+ def make_serverengine_config
68
+ Sneakers::Config.merge(@conf).merge({
69
+ :worker_type => 'process',
70
+ :worker_classes => @worker_classes
71
+ })
72
+ end
73
+ end
74
+
20
75
  end
@@ -1,3 +1,3 @@
1
1
  module Sneakers
2
- VERSION = "0.0.6"
2
+ VERSION = "0.0.7"
3
3
  end
@@ -35,12 +35,22 @@ describe Sneakers::CLI do
35
35
  out = capture_io{ Sneakers::CLI.start [
36
36
  'work',
37
37
  "TitleScraper",
38
- "--front",
39
38
  "--require=#{File.expand_path('../fixtures/require_worker.rb', File.dirname(__FILE__))}"
40
39
  ]}.join ''
41
40
 
42
41
  out.must_match(/Log.*Console/)
43
42
  end
43
+
44
+ it "should be able to run as daemonized process" do
45
+ out = capture_io{ Sneakers::CLI.start [
46
+ 'work',
47
+ "TitleScraper",
48
+ "--daemonize",
49
+ "--require=#{File.expand_path('../fixtures/require_worker.rb', File.dirname(__FILE__))}"
50
+ ]}.join ''
51
+
52
+ out.must_match(/sneakers.log/)
53
+ end
44
54
  end
45
55
 
46
56
  it "should fail when no workers found" do
@@ -0,0 +1,66 @@
1
+ require 'spec_helper'
2
+ require 'sneakers'
3
+
4
+
5
+
6
+ describe Sneakers do
7
+ before do
8
+ Sneakers.clear!
9
+ end
10
+
11
+ describe 'self' do
12
+ it 'should have defaults set up' do
13
+ Sneakers::Config[:log].must_equal(STDOUT)
14
+ end
15
+
16
+ it 'should configure itself' do
17
+ Sneakers.configure
18
+ Sneakers.logger.wont_be_nil
19
+ end
20
+ end
21
+
22
+ describe '.daemonize!' do
23
+ it 'should set a logger to a default info level and not daemonize' do
24
+ Sneakers.daemonize!
25
+ Sneakers::Config[:log].must_equal('sneakers.log')
26
+ Sneakers::Config[:daemonize].must_equal(true)
27
+ Sneakers.logger.level.must_equal(Logger::INFO)
28
+ end
29
+
30
+ it 'should set a logger to a level given that level' do
31
+ Sneakers.daemonize!(Logger::DEBUG)
32
+ Sneakers.logger.level.must_equal(Logger::DEBUG)
33
+ end
34
+ end
35
+
36
+ describe '.clear!' do
37
+ it 'must reset dirty configuration to default' do
38
+ Sneakers::Config[:log].must_equal(STDOUT)
39
+ Sneakers.configure(:log => 'foobar.log')
40
+ Sneakers::Config[:log].must_equal('foobar.log')
41
+ Sneakers.clear!
42
+ Sneakers::Config[:log].must_equal(STDOUT)
43
+ end
44
+ end
45
+
46
+
47
+ describe '#setup_general_logger' do
48
+ it 'should detect a string and configure a logger' do
49
+ Sneakers.configure(:log => 'sneakers.log')
50
+ Sneakers.logger.kind_of?(Logger).must_equal(true)
51
+ end
52
+
53
+ it 'should detect a file-like thing and configure a logger' do
54
+ Sneakers.configure(:log => STDOUT)
55
+ Sneakers.logger.kind_of?(Logger).must_equal(true)
56
+ end
57
+
58
+ it 'should detect an actual logger and configure it' do
59
+ logger = Logger.new(STDOUT)
60
+ Sneakers.configure(:log => logger)
61
+ Sneakers.logger.must_equal(logger)
62
+ end
63
+ end
64
+
65
+ end
66
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sneakers
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-10-20 00:00:00.000000000 Z
12
+ date: 2013-11-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: serverengine
@@ -236,7 +236,6 @@ files:
236
236
  - lib/sneakers/publisher.rb
237
237
  - lib/sneakers/queue.rb
238
238
  - lib/sneakers/runner.rb
239
- - lib/sneakers/runner_config.rb
240
239
  - lib/sneakers/support/production_formatter.rb
241
240
  - lib/sneakers/support/queue_name.rb
242
241
  - lib/sneakers/support/utils.rb
@@ -251,6 +250,7 @@ files:
251
250
  - spec/sneakers/concerns/metrics.rb
252
251
  - spec/sneakers/publisher_spec.rb
253
252
  - spec/sneakers/queue_spec.rb
253
+ - spec/sneakers/sneakers_spec.rb
254
254
  - spec/sneakers/worker_spec.rb
255
255
  - spec/spec_helper.rb
256
256
  homepage: ''
@@ -284,6 +284,6 @@ test_files:
284
284
  - spec/sneakers/concerns/metrics.rb
285
285
  - spec/sneakers/publisher_spec.rb
286
286
  - spec/sneakers/queue_spec.rb
287
+ - spec/sneakers/sneakers_spec.rb
287
288
  - spec/sneakers/worker_spec.rb
288
289
  - spec/spec_helper.rb
289
- has_rdoc:
@@ -1,55 +0,0 @@
1
- module Sneakers
2
- class RunnerConfig
3
- def method_missing(meth, *args, &block)
4
- if %w{ before_fork after_fork }.include? meth.to_s
5
- @conf[meth] = block
6
- elsif %w{ workers start_worker_delay amqp }.include? meth.to_s
7
- @conf[meth] = args.first
8
- else
9
- super
10
- end
11
- end
12
-
13
- def initialize(worker_classes)
14
- @worker_classes = worker_classes
15
- @conf = {}
16
- end
17
-
18
- def to_h
19
- @conf
20
- end
21
-
22
-
23
- def reload_config!
24
- Sneakers.logger.warn("Loading runner configuration...")
25
- config_file = Sneakers::Config[:runner_config_file]
26
-
27
- if config_file
28
- begin
29
- instance_eval(File.read(config_file), config_file)
30
- Sneakers.logger.info("Loading config with file: #{config_file}")
31
- rescue
32
- Sneakers.logger.error("Cannot load from file '#{config_file}', #{$!}")
33
- end
34
- end
35
-
36
- config = make_serverengine_config
37
-
38
- [:before_fork, :after_fork].each do | hook |
39
- Sneakers::Config[:hooks][hook] = config.delete(hook) if config[hook]
40
- end
41
-
42
-
43
- Sneakers.logger.info("New configuration: #{config.inspect}")
44
- config
45
- end
46
-
47
- private
48
- def make_serverengine_config
49
- Sneakers::Config.merge(@conf).merge({
50
- :worker_type => 'process',
51
- :worker_classes => @worker_classes
52
- })
53
- end
54
- end
55
- end