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.
- data/.gitignore +14 -0
- data/.travis.yml +11 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +130 -0
- data/Rakefile +9 -0
- data/bbqueue.gemspec +26 -0
- data/bin/bbqueue +11 -0
- data/lib/bbqueue.rb +12 -0
- data/lib/bbqueue/consumer.rb +30 -0
- data/lib/bbqueue/fatal_logger.rb +18 -0
- data/lib/bbqueue/null_logger.rb +11 -0
- data/lib/bbqueue/producer.rb +27 -0
- data/lib/bbqueue/serializer.rb +15 -0
- data/lib/bbqueue/version.rb +3 -0
- data/test/bbqueue/consumer_test.rb +38 -0
- data/test/bbqueue/fatal_logger_test.rb +29 -0
- data/test/bbqueue/null_logger_test.rb +29 -0
- data/test/bbqueue/producer_test.rb +14 -0
- data/test/bbqueue/serializer_test.rb +11 -0
- data/test/bbqueue/stalking.rb +78 -0
- data/test/bbqueue/test_job.rb +19 -0
- data/test/bbqueue/test_logger.rb +31 -0
- data/test/test_helper.rb +34 -0
- metadata +144 -0
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -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.
|
data/README.md
ADDED
@@ -0,0 +1,130 @@
|
|
1
|
+
# BBQueue
|
2
|
+
|
3
|
+
[](http://travis-ci.org/mrkamel/bbqueue)
|
4
|
+
[](https://codeclimate.com/github/mrkamel/bbqueue)
|
5
|
+
[](http://stillmaintained.com/mrkamel/bbqueue)
|
6
|
+
[](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
|
data/Rakefile
ADDED
data/bbqueue.gemspec
ADDED
@@ -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
|
data/bin/bbqueue
ADDED
data/lib/bbqueue.rb
ADDED
@@ -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,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,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,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
|
+
|
data/test/test_helper.rb
ADDED
@@ -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
|