bbqueue 0.0.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.
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
@@ -0,0 +1,11 @@
1
+
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.0.0
5
+ - 2.1.1
6
+
7
+ install:
8
+ - "travis_retry bundle install"
9
+
10
+ script: "bundle exec rake test"
11
+
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in bbqueue.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Benjamin Vetter
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,130 @@
1
+ # BBQueue
2
+
3
+ [![Build Status](https://secure.travis-ci.org/mrkamel/bbqueue.png?branch=master)](http://travis-ci.org/mrkamel/bbqueue)
4
+ [![Code Quality](https://codeclimate.com/github/mrkamel/bbqueue.png)](https://codeclimate.com/github/mrkamel/bbqueue)
5
+ [![Still Maintained](http://stillmaintained.com/mrkamel/bbqueue.png)](http://stillmaintained.com/mrkamel/bbqueue)
6
+ [![Dependency Status](https://gemnasium.com/mrkamel/bbqueue.png?travis)](https://gemnasium.com/mrkamel/bbqueue)
7
+
8
+ BBQueue is an opinionated ruby gem to queue and process background jobs. Other
9
+ gems for this purpose usually don't work with ruby objects and serialize only
10
+ method arguments. Instead, BBQueue jobs are simple ruby objects:
11
+
12
+ ```ruby
13
+ MyQueue.enqueue MyJob.new
14
+ ```
15
+
16
+ BBQueue jobs need to fulfill the following interface:
17
+
18
+ 1. The object contains an instance method `#work` without any arguments
19
+ 2. The object must be serializable via `Marshal.dump` and `Marshal.load`
20
+
21
+ ## Installation
22
+
23
+ Add this line to your application's Gemfile:
24
+
25
+ ```ruby
26
+ gem 'bbqueue'
27
+ ```
28
+
29
+ And then execute:
30
+
31
+ $ bundle
32
+
33
+ Or install it yourself as:
34
+
35
+ $ gem install bbqueue
36
+
37
+ ## Usage
38
+
39
+ BBQueue is currently built on top of the `stalking` gem. Therefore, you have to
40
+ install beanstalkd.
41
+
42
+ ### Producer
43
+
44
+ To enqueue a job, first create a queue, aka Producer:
45
+
46
+ ```ruby
47
+ SomeQueue = BBQueue::Producer.new("default")
48
+ ```
49
+
50
+ where `default` is the queue name. You can pass `stalking`-specific options via:
51
+
52
+ ```ruby
53
+ AnotherQueue = BBQueue::Producer.new("another", :logger => ..., :delay => ..., :servers => ..., :ttr => ..., ...)
54
+ ```
55
+
56
+ Then enqueue a job:
57
+
58
+ ```ruby
59
+ SomeQueue.enqueue MyJob.new("Some argument")
60
+ ```
61
+
62
+ You can pass `stalking`-specific options here as well:
63
+
64
+ ```ruby
65
+ SomeQueue.enqueue MyJob.new("Some argument"), :delay => 5, ...
66
+ ```
67
+
68
+ where `MyJob` looks like:
69
+
70
+ ```ruby
71
+ class MyJob
72
+ attr_accessor :argument
73
+
74
+ def initialize(argument)
75
+ self.argument = argument
76
+ end
77
+
78
+ def work
79
+ # Do some work
80
+ end
81
+ end
82
+ ```
83
+
84
+ ### Consumer
85
+
86
+ To process the enqueued jobs, create a file, e.g. jobs.rb:
87
+
88
+ ```ruby
89
+ require "bbqueue"
90
+
91
+ BBQueue::Consumer.new "default"
92
+ ```
93
+
94
+ and run it via:
95
+
96
+ $ bbqueue jobs.rb
97
+
98
+ BBQueue will loop through all the jobs, run them, and will then wait for new
99
+ ones. You can pass multiple queue names and `stalking`-specific options:
100
+
101
+ ```ruby
102
+ BBQueue.new ["default", "important"], :logger => ..., :servers => ...
103
+ ```
104
+
105
+ By using a separate file like `jobs.rb`, you can load your environment or do
106
+ other fancy things before finally calling `BBQueue::Consumer.new`. You can e.g.
107
+ load your rails environment:
108
+
109
+ ```ruby
110
+ require File.expand_path("../environment", __FILE__)
111
+
112
+ Rails.application.eager_load!
113
+
114
+ SomeLogger.info "jobs booted into #{Rails.env.inspect} environment"
115
+
116
+ BBQueue::Consumer.new "background", :logger => SomeLogger
117
+ ```
118
+
119
+ ## Graceful Termination
120
+
121
+ Like for the `stalking` gem, you can stop a worker gracefully by sending a QUIT
122
+ signal to it. The worker will finish its current job and terminate afterwards.
123
+
124
+ ## Contributing
125
+
126
+ 1. Fork it ( https://github.com/[my-github-username]/bbqueue/fork )
127
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
128
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
129
+ 4. Push to the branch (`git push origin my-new-feature`)
130
+ 5. Create a new Pull Request
@@ -0,0 +1,9 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << "lib"
6
+ t.pattern = "test/**/*_test.rb"
7
+ t.verbose = true
8
+ end
9
+
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'bbqueue/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "bbqueue"
8
+ spec.version = BBQueue::VERSION
9
+ spec.authors = ["Benjamin Vetter"]
10
+ spec.email = ["vetter@plainpicture.de"]
11
+ spec.summary = %q{Queue and process ruby job objects in the background}
12
+ spec.description = %q{Queue and process ruby job objects in the background}
13
+ spec.homepage = "https://github.com/mrkamel/bbqueue"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "minitest"
24
+
25
+ spec.add_dependency "stalking"
26
+ end
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift File.expand_path("../../lib", __FILE__)
4
+
5
+ require "bbqueue"
6
+
7
+ file = ARGV.shift or abort("Usage: bbqueue [file]")
8
+ file = "./#{file}" unless file.match(/^[\/.]/)
9
+
10
+ load file
11
+
@@ -0,0 +1,12 @@
1
+
2
+ require "stalking"
3
+
4
+ require "bbqueue/version"
5
+ require "bbqueue/serializer"
6
+ require "bbqueue/null_logger"
7
+ require "bbqueue/fatal_logger"
8
+ require "bbqueue/producer"
9
+ require "bbqueue/consumer"
10
+
11
+ module BBQueue; end
12
+
@@ -0,0 +1,30 @@
1
+
2
+ module BBQueue
3
+ class Consumer
4
+ def initialize(queue_names, options = {})
5
+ logger = options[:logger] || BBQueue::NullLogger.new
6
+
7
+ Stalking::Consumer.new options.merge(:logger => BBQueue::FatalLogger.new(logger)) do
8
+ Array(queue_names).each do |queue_name|
9
+ job queue_name do |args|
10
+ BBQueue::Serializer.load(args["object"]).work
11
+ end
12
+ end
13
+
14
+ before do |queue_name, args|
15
+ logger.info "Job #{BBQueue::Serializer.load(args["object"]).inspect} on #{queue_name.inspect} started"
16
+ end
17
+
18
+ after do |queue_name, args|
19
+ logger.info "Job #{BBQueue::Serializer.load(args["object"]).inspect} on #{queue_name.inspect} finished"
20
+ end
21
+
22
+ error do |e, queue_name, args|
23
+ logger.error "Job #{BBQueue::Serializer.load(args["object"]).inspect} on #{queue_name.inspect} failed"
24
+ logger.error e
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+
@@ -0,0 +1,18 @@
1
+
2
+ module BBQueue
3
+ class FatalLogger
4
+ def initialize(logger)
5
+ @logger = logger
6
+ end
7
+
8
+ def debug(*args); end
9
+ def info(*args); end
10
+ def warn(*args); end
11
+ def error(*args); end
12
+
13
+ def fatal(*args)
14
+ @logger.error(*args)
15
+ end
16
+ end
17
+ end
18
+
@@ -0,0 +1,11 @@
1
+
2
+ module BBQueue
3
+ class NullLogger
4
+ def debug(*args); end
5
+ def info(*args); end
6
+ def warn(*args); end
7
+ def error(*args); end
8
+ def fatal(*args); end
9
+ end
10
+ end
11
+
@@ -0,0 +1,27 @@
1
+
2
+ module BBQueue
3
+ class Producer
4
+ attr_accessor :queue_name, :logger, :stalking
5
+
6
+ def initialize(queue_name, options = {})
7
+ self.queue_name = queue_name
8
+ self.logger = options[:logger] || BBQueue::NullLogger.new
9
+ self.stalking = Stalking::Producer.new(options.merge(:logger => BBQueue::FatalLogger.new(logger)))
10
+ end
11
+
12
+ def enqueue(object, options = {})
13
+ logger.info "Enqueue #{object.inspect} with #{options.inspect} on #{queue_name.inspect}"
14
+
15
+ obj = BBQueue::Serializer.dump(object)
16
+
17
+ unless stalking.enqueue(queue_name, { "object" => obj }, options)
18
+ logger.error "Enqueue #{obj.inspect} with #{options.inspect} on #{queue_name.inspect} failed"
19
+
20
+ return false
21
+ end
22
+
23
+ true
24
+ end
25
+ end
26
+ end
27
+
@@ -0,0 +1,15 @@
1
+
2
+ require "base64"
3
+
4
+ module BBQueue
5
+ module Serializer
6
+ def self.dump(object)
7
+ Base64.strict_encode64 Marshal.dump(object)
8
+ end
9
+
10
+ def self.load(object)
11
+ Marshal.load Base64.strict_decode64(object)
12
+ end
13
+ end
14
+ end
15
+
@@ -0,0 +1,3 @@
1
+ module BBQueue
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,38 @@
1
+
2
+ require File.expand_path("../../test_helper", __FILE__)
3
+
4
+ class BBQueue::ConsumerTest < MiniTest::Test
5
+ def test_job
6
+ consumer = BBQueue::Consumer.new("default")
7
+
8
+ assert_equal 3, Stalking::Consumer.instances.last.run_job("default", { "object" => BBQueue::Serializer.dump(BBQueue::TestJob.new(1, 2)) })
9
+ end
10
+
11
+ def test_error
12
+ logger = BBQueue::TestLogger.new
13
+ consumer = BBQueue::Consumer.new("default", :logger => logger)
14
+
15
+ assert_difference "logger.count", 2 do
16
+ Stalking::Consumer.instances.last.run_error("Error", "default", { "object" => BBQueue::Serializer.dump(BBQueue::TestJob.new(1, 2)) })
17
+ end
18
+ end
19
+
20
+ def test_before
21
+ logger = BBQueue::TestLogger.new
22
+ consumer = BBQueue::Consumer.new("default", :logger => logger)
23
+
24
+ assert_difference "logger.count" do
25
+ Stalking::Consumer.instances.last.run_before("default", { "object" => BBQueue::Serializer.dump(BBQueue::TestJob.new(1, 2)) })
26
+ end
27
+ end
28
+
29
+ def test_after
30
+ logger = BBQueue::TestLogger.new
31
+ consumer = BBQueue::Consumer.new("default", :logger => logger)
32
+
33
+ assert_difference "logger.count" do
34
+ Stalking::Consumer.instances.last.run_after("default", { "object" => BBQueue::Serializer.dump(BBQueue::TestJob.new(1, 2)) })
35
+ end
36
+ end
37
+ end
38
+
@@ -0,0 +1,29 @@
1
+
2
+ require File.expand_path("../../test_helper", __FILE__)
3
+
4
+ class BBQueue::FatalLoggerTest < MiniTest::Test
5
+ def setup
6
+ @logger = BBQueue::FatalLogger.new(BBQueue::NullLogger.new)
7
+ end
8
+
9
+ def test_debug
10
+ assert_nothing_raised { @logger.debug "Debug" }
11
+ end
12
+
13
+ def test_info
14
+ assert_nothing_raised { @logger.info "Info" }
15
+ end
16
+
17
+ def test_warn
18
+ assert_nothing_raised { @logger.warn "Warn" }
19
+ end
20
+
21
+ def test_error
22
+ assert_nothing_raised { @logger.error "Error" }
23
+ end
24
+
25
+ def test_fatal
26
+ assert_nothing_raised { @logger.fatal "Fatal" }
27
+ end
28
+ end
29
+
@@ -0,0 +1,29 @@
1
+
2
+ require File.expand_path("../../test_helper", __FILE__)
3
+
4
+ class BBQueue::NullLoggerTest < MiniTest::Test
5
+ def setup
6
+ @logger = BBQueue::NullLogger.new
7
+ end
8
+
9
+ def test_debug
10
+ assert_nothing_raised { @logger.debug "Debug" }
11
+ end
12
+
13
+ def test_info
14
+ assert_nothing_raised { @logger.info "Info" }
15
+ end
16
+
17
+ def test_warn
18
+ assert_nothing_raised { @logger.warn "Warn" }
19
+ end
20
+
21
+ def test_error
22
+ assert_nothing_raised { @logger.error "Error" }
23
+ end
24
+
25
+ def test_fatal
26
+ assert_nothing_raised { @logger.fatal "Fatal" }
27
+ end
28
+ end
29
+
@@ -0,0 +1,14 @@
1
+
2
+ require File.expand_path("../../test_helper", __FILE__)
3
+
4
+ class BBQueue::ProducerTest < MiniTest::Test
5
+ def test_enqueue
6
+ test_job = BBQueue::TestJob.new(1, 2)
7
+
8
+ producer = BBQueue::Producer.new("queue")
9
+ producer.enqueue test_job, :delay => 10
10
+
11
+ assert_equal ["queue", { "object" => BBQueue::Serializer.dump(test_job) }, { :delay => 10 }], producer.stalking.queue.last
12
+ end
13
+ end
14
+
@@ -0,0 +1,11 @@
1
+
2
+ require File.expand_path("../../test_helper", __FILE__)
3
+
4
+ class BBQueue::SerializerTest < MiniTest::Test
5
+ def test_dump_and_load
6
+ test_job = BBQueue::TestJob.new(1, 2)
7
+
8
+ assert_equal test_job, BBQueue::Serializer.load(BBQueue::Serializer.dump(test_job))
9
+ end
10
+ end
11
+
@@ -0,0 +1,78 @@
1
+
2
+ module Stalking
3
+ class Consumer
4
+ class Handlers
5
+ attr_accessor :job_handlers, :error_handlers, :before_handlers, :after_handlers
6
+
7
+ def initialize
8
+ self.job_handlers = {}
9
+
10
+ self.error_handlers = []
11
+ self.before_handlers = []
12
+ self.after_handlers = []
13
+ end
14
+
15
+ def job(name, &block)
16
+ self.job_handlers[name] = block
17
+ end
18
+
19
+ def error(&block)
20
+ self.error_handlers.push block
21
+ end
22
+
23
+ def before(&block)
24
+ self.before_handlers.push block
25
+ end
26
+
27
+ def after(&block)
28
+ self.after_handlers.push block
29
+ end
30
+ end
31
+
32
+ def self.instances=(instances)
33
+ @instances = instances
34
+ end
35
+
36
+ def self.instances
37
+ @instances
38
+ end
39
+
40
+ self.instances = []
41
+
42
+ def initialize(options = {}, &block)
43
+ @handlers = Handlers.new
44
+ @handlers.instance_exec(&block)
45
+
46
+ self.class.instances.push self
47
+ end
48
+
49
+ def run_job(name, args)
50
+ @handlers.job_handlers[name].call(args)
51
+ end
52
+
53
+ def run_error(e, name, args)
54
+ @handlers.error_handlers.each { |error| error.call e, name, args }
55
+ end
56
+
57
+ def run_before(name, args)
58
+ @handlers.before_handlers.each { |before| before.call name, args }
59
+ end
60
+
61
+ def run_after(name, args)
62
+ @handlers.after_handlers.each { |after| after.call name, args }
63
+ end
64
+ end
65
+
66
+ class Producer
67
+ attr_accessor :queue
68
+
69
+ def initialize(options = {})
70
+ self.queue = []
71
+ end
72
+
73
+ def enqueue(name, args = {}, options = {})
74
+ queue.push [name, args, options]
75
+ end
76
+ end
77
+ end
78
+
@@ -0,0 +1,19 @@
1
+
2
+ class BBQueue::TestJob
3
+ attr_accessor :x, :y
4
+
5
+ def initialize(x, y)
6
+ self.x = x
7
+ self.y = y
8
+ end
9
+
10
+ def ==(test_object)
11
+ [self.x, self.y] == [test_object.x, test_object.y]
12
+ end
13
+
14
+ def work
15
+ x + y
16
+ end
17
+ end
18
+
19
+
@@ -0,0 +1,31 @@
1
+
2
+ class BBQueue::TestLogger
3
+ def initialize
4
+ @messages = []
5
+ end
6
+
7
+ def debug(object)
8
+ @messages.push object
9
+ end
10
+
11
+ def info(object)
12
+ @messages.push object
13
+ end
14
+
15
+ def warn(object)
16
+ @messages.push object
17
+ end
18
+
19
+ def error(object)
20
+ @messages.push object
21
+ end
22
+
23
+ def fatal(object)
24
+ @messages.push object
25
+ end
26
+
27
+ def count
28
+ @messages.size
29
+ end
30
+ end
31
+
@@ -0,0 +1,34 @@
1
+
2
+ require "bbqueue"
3
+ require "minitest"
4
+ require "minitest/autorun"
5
+
6
+ require File.expand_path("../bbqueue/stalking", __FILE__)
7
+ require File.expand_path("../bbqueue/test_job", __FILE__)
8
+ require File.expand_path("../bbqueue/test_logger", __FILE__)
9
+
10
+ class MiniTest::Test
11
+ def assert_nothing_raised
12
+ yield
13
+ rescue => e
14
+ raise "Exception #{e.message} should be raised"
15
+ end
16
+
17
+ def assert_difference(expression, difference = 1, message = nil, &block)
18
+ expressions = Array(expression)
19
+
20
+ exps = expressions.map { |e|
21
+ e.respond_to?(:call) ? e : lambda { eval(e, block.binding) }
22
+ }
23
+ before = exps.map { |e| e.call }
24
+
25
+ yield
26
+
27
+ expressions.zip(exps).each_with_index do |(code, e), i|
28
+ error = "#{code.inspect} didn't change by #{difference}"
29
+ error = "#{message}.\n#{error}" if message
30
+ assert_equal(before[i] + difference, e.call, error)
31
+ end
32
+ end
33
+ end
34
+
metadata ADDED
@@ -0,0 +1,144 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bbqueue
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Benjamin Vetter
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-08-06 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rake
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: minitest
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: stalking
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
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'
78
+ description: Queue and process ruby job objects in the background
79
+ email:
80
+ - vetter@plainpicture.de
81
+ executables:
82
+ - bbqueue
83
+ extensions: []
84
+ extra_rdoc_files: []
85
+ files:
86
+ - .gitignore
87
+ - .travis.yml
88
+ - Gemfile
89
+ - LICENSE.txt
90
+ - README.md
91
+ - Rakefile
92
+ - bbqueue.gemspec
93
+ - bin/bbqueue
94
+ - lib/bbqueue.rb
95
+ - lib/bbqueue/consumer.rb
96
+ - lib/bbqueue/fatal_logger.rb
97
+ - lib/bbqueue/null_logger.rb
98
+ - lib/bbqueue/producer.rb
99
+ - lib/bbqueue/serializer.rb
100
+ - lib/bbqueue/version.rb
101
+ - test/bbqueue/consumer_test.rb
102
+ - test/bbqueue/fatal_logger_test.rb
103
+ - test/bbqueue/null_logger_test.rb
104
+ - test/bbqueue/producer_test.rb
105
+ - test/bbqueue/serializer_test.rb
106
+ - test/bbqueue/stalking.rb
107
+ - test/bbqueue/test_job.rb
108
+ - test/bbqueue/test_logger.rb
109
+ - test/test_helper.rb
110
+ homepage: https://github.com/mrkamel/bbqueue
111
+ licenses:
112
+ - MIT
113
+ post_install_message:
114
+ rdoc_options: []
115
+ require_paths:
116
+ - lib
117
+ required_ruby_version: !ruby/object:Gem::Requirement
118
+ none: false
119
+ requirements:
120
+ - - ! '>='
121
+ - !ruby/object:Gem::Version
122
+ version: '0'
123
+ required_rubygems_version: !ruby/object:Gem::Requirement
124
+ none: false
125
+ requirements:
126
+ - - ! '>='
127
+ - !ruby/object:Gem::Version
128
+ version: '0'
129
+ requirements: []
130
+ rubyforge_project:
131
+ rubygems_version: 1.8.23
132
+ signing_key:
133
+ specification_version: 3
134
+ summary: Queue and process ruby job objects in the background
135
+ test_files:
136
+ - test/bbqueue/consumer_test.rb
137
+ - test/bbqueue/fatal_logger_test.rb
138
+ - test/bbqueue/null_logger_test.rb
139
+ - test/bbqueue/producer_test.rb
140
+ - test/bbqueue/serializer_test.rb
141
+ - test/bbqueue/stalking.rb
142
+ - test/bbqueue/test_job.rb
143
+ - test/bbqueue/test_logger.rb
144
+ - test/test_helper.rb