beanstalk-worker 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -4,6 +4,10 @@ source "http://rubygems.org"
4
4
  # gem "activesupport", ">= 2.3.5"
5
5
 
6
6
  gem 'beanstalk-client'
7
+ gem "mixlib-log", "~> 1.6.0"
8
+ gem "mixlib-config", "~> 1.1.2"
9
+ gem "mixlib-log-json", "~> 0.0.1"
10
+ gem "yajl-ruby", "~> 1.1.0"
7
11
 
8
12
  # Add dependencies to develop your gem here.
9
13
  # Include everything needed to run rake, tests, features, etc.
@@ -15,5 +19,5 @@ group :development do
15
19
  gem "bundler", "~> 1.3.5"
16
20
  gem "jeweler", "~> 1.8.4"
17
21
  gem "beanstalk-client-rspec", ">= 0"
18
- gem (RUBY_VERSION =~ /^1\.9/ ? "simplecov" : "rcov"), ">= 0"
22
+ gem (RUBY_VERSION.gsub('.', '').to_i >= 190 ? "simplecov" : "rcov"), ">= 0"
19
23
  end
data/Rakefile CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'rubygems'
4
4
  require 'bundler'
5
- require './lib/beanstalk-worker/version.rb'
5
+ require './lib/beanstalk-worker.rb'
6
6
 
7
7
  begin
8
8
  Bundler.setup(:default, :development)
@@ -17,7 +17,7 @@ require 'jeweler'
17
17
  Jeweler::Tasks.new do |gem|
18
18
  # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
19
19
  gem.name = "beanstalk-worker"
20
- gem.version = BeanStalk::Worker::Version::STRING
20
+ gem.version = BeanStalk::Worker::VERSION
21
21
  gem.homepage = "http://github.com/aia/beanstalk-worker"
22
22
  gem.license = "MIT"
23
23
  gem.summary = %Q{Beanstalkd Worker base class}
@@ -0,0 +1,104 @@
1
+ require 'mixlib/config'
2
+ require 'yajl'
3
+ require 'yaml'
4
+
5
+ # The configuration object for the gemindexer worker.
6
+ class BeanStalk::Worker
7
+ class Config
8
+ extend Mixlib::Config
9
+
10
+ # Return the configuration itself upon inspection.
11
+ def self.inspect
12
+ configuration.inspect
13
+ end
14
+
15
+ # Loads a given file and passes it to the appropriate parser.
16
+ #
17
+ # @raise [ IOError ] Any IO Exceptions that occur.
18
+ #
19
+ # @param [ String ] filename The filename to read.
20
+ # @param [ String ] parser The parser to use.
21
+ # @param [ String ] environment The environment to read config for.
22
+ def self.from_file(filename, parser="yaml", environment="development")
23
+ send("from_file_#{parser}".to_sym, filename, environment)
24
+ end
25
+
26
+ # Loads a given ruby file and runs instance_eval against it
27
+ # in the context of the current object.
28
+ #
29
+ # @raise [ IOError ] Any IO Exceptions that occur.
30
+ #
31
+ # @param [ String ] filename The file to read.
32
+ def self.from_file_ruby(filename, *args)
33
+ self.instance_eval(IO.read(filename), filename, 1)
34
+ end
35
+
36
+ # Loads a given yaml file and merges the current context
37
+ # configuration with the updated hash.
38
+ #
39
+ # @raise [ IOError ] Any IO Exceptions that occur.
40
+ # @raise [ Yajl::ParseError ] Raises Yajl Parsing error on improper json.
41
+ #
42
+ # @param [ String ] filename The file to read.
43
+ # @param [ String ] environment The environment to use.
44
+ def self.from_file_yaml(filename, environment)
45
+ configuration.merge!(YAML.load_file(filename)[environment])
46
+ end
47
+
48
+ # Loads a given json file and merges the current context
49
+ # configuration with the updated hash.
50
+ #
51
+ # @raise [ IOError ] Any IO Exceptions that occur.
52
+ # @raise [ Yajl::ParseError ] Raises Yajl Parsing error on improper json.
53
+ #
54
+ # @param [ String ] filename The file to read.
55
+ def self.from_file_json(filename, *args)
56
+ self.from_stream_json(IO.read(filename))
57
+ end
58
+
59
+ # Loads a given json input and merges the current context
60
+ # configuration with the updated hash.
61
+ #
62
+ # @raise [ IOError ] Any IO Exceptions that occur.
63
+ # @raise [ Yajl::ParseError ] Raises Yajl Parsing error on improper json.
64
+ #
65
+ # @param [ String ] input The json configuration input.
66
+ def self.from_stream_json(input, *args)
67
+ parser = Yajl::Parser.new(:symbolize_keys => true)
68
+ configuration.merge!(parser.parse(input))
69
+ end
70
+
71
+ # Helper method for generation the beanstalk uri
72
+ #
73
+ # @return [ String ] The beanstalk uri.
74
+ def self.beanstalk_uri
75
+ [self['beanstalk']['server'], self['beanstalk']['port']].join(":")
76
+ end
77
+
78
+ # When you are using ActiveSupport, they monkey-patch 'daemonize' into
79
+ # Kernel. So while this is basically identical to what method_missing
80
+ # would do, we pull it up here and get a real method written so that
81
+ # things get dispatched properly.
82
+ config_attr_writer :daemonize do |v|
83
+ configure do |c|
84
+ c[:daemonize] = v
85
+ end
86
+ end
87
+
88
+ # Enable debug
89
+ debug false
90
+
91
+ # Logging Settings
92
+ log_level :warn
93
+ log_location STDOUT
94
+ log_formatter :json
95
+
96
+ # Beanstalk config
97
+ beanstalk({
98
+ :server => '127.0.0.1',
99
+ :port => 11300,
100
+ :tube => 'worker1'
101
+ })
102
+
103
+ end
104
+ end
@@ -0,0 +1,42 @@
1
+ require 'logger'
2
+ require 'mixlib/log'
3
+ require 'mixlib/log/formatter'
4
+ require 'mixlib/log/jsonformatter'
5
+
6
+ # Beanstalk::Worker's internal logging facility.
7
+ # Standardized to provide a consistent log format.
8
+ module BeanStalk::Worker::Log
9
+ class << self
10
+ include Mixlib::Log
11
+
12
+ # Use Mixlib::Log.init when you want to set up the logger manually. Arguments to this method
13
+ # get passed directly to Logger.new, so check out the documentation for the standard Logger class
14
+ # to understand what to do here.
15
+ #
16
+ # If this method is called with no arguments, it will log to STDOUT at the :warn level.
17
+ #
18
+ # It also configures the Logger instance it creates to use the custom Mixlib::Log::Formatter class.
19
+ def init(*opts)
20
+ reset!
21
+ @logger = logger_for(BeanStalk::Worker::Config[:log_location])
22
+ if @logger.respond_to?(:formatter=)
23
+ if BeanStalk::Worker::Config[:log_formatter].eql?(:json)
24
+ @logger.formatter = Mixlib::Log::JSONFormatter.new()
25
+ else
26
+ @logger.formatter = Mixlib::Log::Formatter.new()
27
+ end
28
+ end
29
+ @logger.level = Logger.const_get(
30
+ BeanStalk::Worker::Config[:log_level].to_s.upcase)
31
+ @logger
32
+ end
33
+ end
34
+
35
+ # Monkeypatch Formatter to allow local show_time updates.
36
+ class Formatter
37
+ # Allow enabling and disabling of time with a singleton.
38
+ def self.show_time=(*args)
39
+ Mixlib::Log::Formatter.show_time = *args
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,52 @@
1
+ module BeanStalk
2
+ class Worker
3
+ module Version
4
+ include Comparable
5
+ attr_reader :major, :minor, :patch
6
+
7
+ def initialize(str="")
8
+ parse(str)
9
+ end
10
+
11
+ def inspect
12
+ "#{@major}.#{@minor}.#{@patch}"
13
+ end
14
+
15
+ def to_s
16
+ "#{@major}.#{@minor}.#{@patch}"
17
+ end
18
+
19
+ def <=>(v)
20
+ [:major, :minor, :patch].each do |method|
21
+ ans = (self.send(method) <=> v.send(method))
22
+ return ans if ans != 0
23
+ end
24
+ 0
25
+ end
26
+
27
+ def hash
28
+ to_s.hash
29
+ end
30
+
31
+ # For hash
32
+ def eql?(other)
33
+ other.is_a?(Version) && self == other
34
+ end
35
+
36
+ protected
37
+
38
+ def parse(str="")
39
+ @major, @minor, @patch =
40
+ case str.to_s
41
+ when /^(\d+)\.(\d+)\.(\d+)$/
42
+ [ $1.to_i, $2.to_i, $3.to_i ]
43
+ when /^(\d+)\.(\d+)$/
44
+ [ $1.to_i, $2.to_i, 0 ]
45
+ else
46
+ "'#{str.to_s}' does not match 'x.y.z' or 'x.y'"
47
+ end
48
+ end
49
+
50
+ end
51
+ end
52
+ end
@@ -1,90 +1,51 @@
1
- require 'logger'
2
1
  require 'beanstalk-client'
3
2
 
4
- module BeanStalk
5
- class Worker
6
- attr_accessor :config, :log, :beanstalk, :stats
3
+ class BeanStalk::Worker
4
+ attr_accessor :config, :log, :beanstalk, :stats
5
+
6
+ def initialize(config = {})
7
+ @config = BeanStalk::Worker::Config
8
+ @config.merge!(config || {})
9
+ @logger = BeanStalk::Worker::Log
10
+
11
+ @logger.info("Logging started")
7
12
 
8
- def initialize(config = {}, logger = nil)
9
- @config = {
10
- 'beanstalk' => {
11
- 'server' => "127.0.0.1",
12
- 'port' => "11300",
13
- 'tube' => "worker1"
14
- }
15
- }
16
-
17
- @config['beanstalk'].merge!(config['beanstalk'] || {})
18
-
19
- initialize_logger unless logger
20
-
21
- @log = logger if logger
22
-
23
- @log.error("Logging started")
24
-
25
- @stats = {
26
- 'received' => 0
27
- }
28
-
29
- initialize_beanstalk
30
- end
13
+ @stats = {
14
+ 'received' => 0
15
+ }
31
16
 
32
- def initialize_logger
33
- @config['log'] = {
34
- 'file' => $stdout,
35
- 'level' => 'INFO'
36
- }.merge(@config['log'] || {})
37
-
38
- log_initialize = [@config['log']['file']]
39
- log_initialize << @config['log']['shift_age'] if @config['log']['shift_age']
40
- log_initialize << @config['log']['shift_size'] if @config['log']['shift_size']
41
-
17
+ initialize_beanstalk
18
+ end
19
+
20
+ def initialize_beanstalk
21
+ @beanstalk = Beanstalk::Pool.new([
22
+ BeanStalk::Worker::Config.beanstalk_uri
23
+ ])
24
+
25
+ @beanstalk.watch(@config[:beanstalk][:tube])
26
+ @beanstalk.use(@config[:beanstalk][:tube])
27
+ @beanstalk.ignore('default')
28
+ end
29
+
30
+ def start(received = -1)
31
+ while (received == -1) || (@stats['received'] < received)
42
32
  begin
43
- @log = Logger.new(*log_initialize)
44
- @log.level = Logger.const_get(@config['log']['level'])
33
+ job = @beanstalk.reserve
34
+
35
+ @logger.debug("job #{job.inspect}")
36
+ @logger.debug("job #{job.body.inspect}")
37
+
38
+ @stats['received'] += 1
39
+
40
+ job.delete if work(job)
45
41
  rescue Exception => e
46
- @config['log'] = {
47
- 'file' => $stdout,
48
- 'level' => 'INFO'
49
- }
50
- @log = Logger.new(@config['log']['file'])
51
- @log.level = Logger.const_get(@config['log']['level'])
52
- @log.error("Caught a problem with log settings")
53
- @log.error("#{e.message}")
54
- @log.error("Setting log settings to defaults")
42
+ @logger.error("Caught exception #{e.to_s}")
43
+ exit
55
44
  end
56
45
  end
57
-
58
- def initialize_beanstalk
59
- @beanstalk = Beanstalk::Pool.new([
60
- [@config['beanstalk']['server'], @config['beanstalk']['port']].join(":")
61
- ])
62
-
63
- @beanstalk.watch(@config['beanstalk']['tube'])
64
- @beanstalk.use(@config['beanstalk']['tube'])
65
- @beanstalk.ignore('default')
66
- end
67
-
68
- def start(received = -1)
69
- while (received == -1) || (@stats['received'] < received)
70
- begin
71
- job = @beanstalk.reserve
72
-
73
- @log.info("job #{job.inspect}")
74
- @log.info("job #{job.body.inspect}")
75
-
76
- @stats['received'] += 1
77
-
78
- job.delete if work(job)
79
- rescue Exception => e
80
- @log.error("Caught exception #{e.to_s}")
81
- exit
82
- end
83
- end
84
- end
85
-
86
- def work(job)
87
- return true
88
- end
89
46
  end
90
- end
47
+
48
+ def work(job)
49
+ return true
50
+ end
51
+ end
@@ -1,4 +1,12 @@
1
1
  $LOAD_PATH.unshift(File.dirname(__FILE__))
2
2
 
3
- require 'beanstalk-worker/version'
4
- require 'beanstalk-worker/worker'
3
+ module BeanStalk
4
+ class Worker
5
+ VERSION = '0.0.2'
6
+ end
7
+ end
8
+
9
+ require 'beanstalk-worker/version_class'
10
+ require 'beanstalk-worker/config'
11
+ require 'beanstalk-worker/logger'
12
+ require 'beanstalk-worker/worker'
@@ -2,24 +2,19 @@ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
2
 
3
3
  require 'spec_helper'
4
4
  require 'beanstalk-client-rspec'
5
- require 'pp'
6
5
 
7
6
  describe "BeanStalk" do
8
7
  describe "Worker" do
9
8
  before(:each) do
10
- @default_config = {
11
- 'beanstalk' => {
12
- 'server' => "127.0.0.1",
13
- 'port' => "11300",
14
- 'tube' => "worker1"
15
- }
16
- }
9
+ BeanStalk::Worker::Config[:log_location] = '/dev/null'
10
+ BeanStalk::Worker::Log.init
11
+ BeanStalk::Worker::Log.reset!
17
12
 
18
13
  @test_config = {
19
- 'beanstalk' => {
20
- 'server' => '10.10.10.10',
21
- 'port' => '11111',
22
- 'tube' => 'testqueue'
14
+ :beanstalk => {
15
+ :server => '10.10.10.10',
16
+ :port => 11111,
17
+ :tube => 'testqueue'
23
18
  }
24
19
  }
25
20
 
@@ -29,39 +24,21 @@ describe "BeanStalk" do
29
24
  stub_const("Beanstalk::Pool", Beanstalk::MockPool)
30
25
  end
31
26
 
32
- it "should initialize with defaults" do
33
- @worker = BeanStalk::Worker.new
34
-
35
- @worker.config['beanstalk'].should eql @default_config['beanstalk']
36
- end
37
-
38
27
  it "should initialize with configuration" do
39
28
  @worker = BeanStalk::Worker.new(@test_config)
40
-
41
- @worker.config['beanstalk'].should eql @test_config['beanstalk']
29
+ @worker.config[:beanstalk].should eql @test_config[:beanstalk]
42
30
  end
43
31
 
44
32
  it "should receive queued messages" do
45
33
  @worker = BeanStalk::Worker.new(@test_config)
46
-
47
34
  @worker.beanstalk.put("foo")
48
-
49
35
  job = @worker.beanstalk.reserve
50
-
51
36
  job.body.should eql "foo"
52
37
  end
53
38
 
54
- it "should log messages" do
55
- logger = mock Logger
56
- logger.should_receive(:error).with("Logging started")
57
- @worker = BeanStalk::Worker.new(@test_config, logger)
58
- end
59
-
60
39
  it "should start" do
61
40
  @worker = BeanStalk::Worker.new(@test_config)
62
-
63
41
  @worker.beanstalk.put("foo")
64
-
65
42
  @worker.start(1)
66
43
  end
67
44
 
@@ -78,7 +55,6 @@ describe "BeanStalk" do
78
55
  @worker = BeanStalk::Worker.new(@test_config)
79
56
 
80
57
  3.times { @worker.beanstalk.put("foo") }
81
-
82
58
  expect {
83
59
  @worker.start(4)
84
60
  }.to raise_exception
@@ -89,8 +65,7 @@ describe "BeanStalk" do
89
65
  it "should start to receive undefined number of messages" do
90
66
  @worker = BeanStalk::Worker.new(@test_config)
91
67
 
92
- 3.times { @worker.beanstalk.put("foo") }
93
-
68
+ 3.times { @worker.beanstalk.put("foo") }
94
69
  expect {
95
70
  @worker.start(4)
96
71
  }.to raise_exception
@@ -98,4 +73,4 @@ describe "BeanStalk" do
98
73
  @worker.stats['received'].should eql 3
99
74
  end
100
75
  end
101
- end
76
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
2
  $LOAD_PATH.unshift(File.dirname(__FILE__))
3
3
 
4
- if RUBY_VERSION =~ /^1\.9/
4
+ if RUBY_VERSION.gsub('.', '').to_i >= 190
5
5
  require 'simplecov'
6
6
 
7
7
  module SimpleCov::Configuration
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: beanstalk-worker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
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-07-24 00:00:00.000000000 Z
12
+ date: 2013-08-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: beanstalk-client
@@ -27,6 +27,70 @@ dependencies:
27
27
  - - ! '>='
28
28
  - !ruby/object:Gem::Version
29
29
  version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: mixlib-log
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: 1.6.0
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 1.6.0
46
+ - !ruby/object:Gem::Dependency
47
+ name: mixlib-config
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: 1.1.2
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 1.1.2
62
+ - !ruby/object:Gem::Dependency
63
+ name: mixlib-log-json
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 0.0.1
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 0.0.1
78
+ - !ruby/object:Gem::Dependency
79
+ name: yajl-ruby
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
85
+ version: 1.1.0
86
+ type: :runtime
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: 1.1.0
30
94
  - !ruby/object:Gem::Dependency
31
95
  name: rspec
32
96
  requirement: !ruby/object:Gem::Requirement
@@ -173,7 +237,9 @@ files:
173
237
  - features/step_definitions/beanstalk-worker_steps.rb
174
238
  - features/support/env.rb
175
239
  - lib/beanstalk-worker.rb
176
- - lib/beanstalk-worker/version.rb
240
+ - lib/beanstalk-worker/config.rb
241
+ - lib/beanstalk-worker/logger.rb
242
+ - lib/beanstalk-worker/version_class.rb
177
243
  - lib/beanstalk-worker/worker.rb
178
244
  - spec/beanstalk-worker_spec.rb
179
245
  - spec/spec_helper.rb
@@ -192,7 +258,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
192
258
  version: '0'
193
259
  segments:
194
260
  - 0
195
- hash: -623351978344314384
261
+ hash: -3743712853818560544
196
262
  required_rubygems_version: !ruby/object:Gem::Requirement
197
263
  none: false
198
264
  requirements:
@@ -1,12 +0,0 @@
1
- module BeanStalk
2
- class Worker
3
- module Version
4
- MAJOR = 0
5
- MINOR = 0
6
- PATCH = 1
7
- BUILD = nil
8
-
9
- STRING = [MAJOR, MINOR, PATCH, BUILD].compact.join('.')
10
- end
11
- end
12
- end