rubykiq 0.0.2 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +6 -14
- data/.gitignore +2 -3
- data/.rubocop.yml +24 -0
- data/.travis.yml +16 -5
- data/CONTRIBUTING.md +2 -4
- data/Gemfile +14 -25
- data/LICENSE.md +1 -1
- data/README.md +46 -26
- data/Rakefile +9 -19
- data/lib/rubykiq.rb +7 -8
- data/lib/rubykiq/client.rb +41 -52
- data/lib/rubykiq/connection.rb +7 -10
- data/lib/rubykiq/version.rb +2 -2
- data/rubykiq.gemspec +25 -22
- data/spec/spec_helper.rb +7 -17
- data/spec/support/pry.rb +3 -3
- data/spec/support/simplecov.rb +7 -13
- data/spec/support/timecop.rb +2 -2
- data/spec/unit/client_spec.rb +36 -36
- data/spec/unit/connection_spec.rb +9 -9
- data/spec/unit/rubykiq_spec.rb +4 -4
- metadata +15 -29
- data/.rspec +0 -3
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
metadata.gz: !binary |-
|
9
|
-
MGZhYWEwNzAwODRiZjExZmE4NGVmMjg0OTg2ZjVkOGQzNGY1YjE1NzJjNTk5
|
10
|
-
YWI0MWQxYzZhYzE4YjVlODUwMGE2ZDY4NWVjNDYyMjI1NjY3OThkNDkzMGQ1
|
11
|
-
MDdhMzJmOWM5YjcxMGY2NTkyZWJhYzdiYmJhMzhhZTA1ZmE3NTU=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
Y2VlNmY0OTRiYTIwM2Q0YjU1YmI5YWFkYjJkZDdmMTVmNjVjN2M0MGZiYmM4
|
14
|
-
MTZlYzIzYzdjYWY1MGJjZWQ3ZTBmN2ZkOTkwNDJhODZjMTc1NmI3NWRiNTA0
|
15
|
-
Y2ZjODM3NWYwZjE4ODlmMjIwM2ViYjc2ODJiOTkzZTM5YzI2Zjc=
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 696749fd11368ecd5319c9bf317c6b0ac04a14bd
|
4
|
+
data.tar.gz: fbea254bb5f399512e51992fbf0ada9e4e3d6e3f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 00c6ab314e85af8eb6cfc661fb5e22c1e3b5860a4a58cc33555dc717d60fbe2fc071485d79436aad0842dfcf7cb31505b034925d9d0a870e3dd256d6132975f9
|
7
|
+
data.tar.gz: 1f523fa4f43a80f8e7acfce5a3cb2d19b32c0bec3da160de1134744576518625daf47a5a1c3b1230f738e56ba6bc3ced6630c5c799688d96d23898d1a679bafc
|
data/.gitignore
CHANGED
data/.rubocop.yml
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
AllCops:
|
2
|
+
Includes:
|
3
|
+
- Rakefile
|
4
|
+
- Gemfile
|
5
|
+
Excludes:
|
6
|
+
- script/**
|
7
|
+
- vendor/**
|
8
|
+
- bin/**
|
9
|
+
LineLength:
|
10
|
+
Enabled: false
|
11
|
+
MethodLength:
|
12
|
+
Enabled: false
|
13
|
+
ClassLength:
|
14
|
+
Enabled: false
|
15
|
+
Documentation:
|
16
|
+
Enabled: false
|
17
|
+
Encoding:
|
18
|
+
Enabled: false
|
19
|
+
Blocks:
|
20
|
+
Enabled: false
|
21
|
+
AlignParameters:
|
22
|
+
Enabled: false
|
23
|
+
HashSyntax:
|
24
|
+
EnforcedStyle: ruby19
|
data/.travis.yml
CHANGED
@@ -1,10 +1,21 @@
|
|
1
|
-
bundler_args: --without development
|
2
1
|
language: ruby
|
2
|
+
cache: bundler
|
3
3
|
rvm:
|
4
|
+
- ruby-head
|
5
|
+
- jruby-head
|
6
|
+
- 2.1.0
|
7
|
+
- 2.0.0
|
8
|
+
- 1.9.3
|
4
9
|
- rbx-19mode
|
5
10
|
- jruby-19mode
|
6
|
-
- 1.9.2
|
7
|
-
- 1.9.3
|
8
|
-
- 2.0.0
|
9
11
|
services:
|
10
|
-
- redis-server
|
12
|
+
- redis-server
|
13
|
+
matrix:
|
14
|
+
fast_finish: true
|
15
|
+
allow_failures:
|
16
|
+
- rvm: ruby-head
|
17
|
+
- rvm: jruby-head
|
18
|
+
- rvm: rbx-19mode
|
19
|
+
- rvm: jruby-19mode
|
20
|
+
notifications:
|
21
|
+
email: false
|
data/CONTRIBUTING.md
CHANGED
@@ -36,10 +36,8 @@ Ideally, a bug report should include a pull request with failing specs.
|
|
36
36
|
4. Run `bundle exec rake spec`. If your specs pass, return to step 3.
|
37
37
|
5. Implement your feature or bug fix.
|
38
38
|
6. Run `bundle exec rake spec`. If your specs fail, return to step 5.
|
39
|
-
7.
|
40
|
-
|
41
|
-
8. Add, commit, and push your changes.
|
42
|
-
9. [Submit a pull request.][pr]
|
39
|
+
7. Add, commit, and push your changes.
|
40
|
+
8. [Submit a pull request.][pr]
|
43
41
|
|
44
42
|
[fork]: http://help.github.com/fork-a-repo/
|
45
43
|
[branch]: http://learn.github.com/p/branching.html
|
data/Gemfile
CHANGED
@@ -1,33 +1,22 @@
|
|
1
|
-
source
|
1
|
+
source 'https://rubygems.org'
|
2
2
|
|
3
|
-
gem
|
4
|
-
gem
|
5
|
-
|
6
|
-
|
7
|
-
# end
|
8
|
-
# platforms :ruby, :mswin, :mingw do
|
9
|
-
# end
|
10
|
-
# platforms :jruby do
|
11
|
-
# end
|
12
|
-
|
13
|
-
gem "hiredis", ">= 0.4.5", :require => false
|
14
|
-
gem "em-synchrony", :require => false
|
3
|
+
gem 'yard'
|
4
|
+
gem 'rake', '~> 10.0'
|
5
|
+
gem 'hiredis', '>= 0.4.5', require: false
|
6
|
+
gem 'em-synchrony', require: false
|
15
7
|
|
16
8
|
group :development do
|
17
|
-
gem
|
18
|
-
gem
|
19
|
-
gem
|
20
|
-
gem "awesome_print"
|
9
|
+
gem 'pry'
|
10
|
+
gem 'rubocop'
|
11
|
+
gem 'kramdown', '>= 0.14'
|
21
12
|
end
|
22
13
|
|
23
14
|
group :test do
|
24
|
-
gem
|
25
|
-
gem
|
26
|
-
gem
|
27
|
-
gem
|
28
|
-
gem
|
29
|
-
gem "coveralls", :require => false
|
30
|
-
gem "cane", :require => false, :platforms => :ruby_19
|
15
|
+
gem 'rspec'
|
16
|
+
gem 'timecop'
|
17
|
+
gem 'simplecov', require: false
|
18
|
+
gem 'coveralls', require: false
|
19
|
+
gem 'fakefs', '~> 0.4.3'
|
31
20
|
end
|
32
21
|
|
33
|
-
gemspec
|
22
|
+
gemspec
|
data/LICENSE.md
CHANGED
data/README.md
CHANGED
@@ -1,59 +1,78 @@
|
|
1
1
|
# Rubykiq
|
2
2
|
|
3
|
-
[Sidekiq] agnostic enqueuing using Redis.
|
3
|
+
[Sidekiq][sidekiq] agnostic enqueuing using Redis.
|
4
4
|
|
5
5
|
Sidekiq is a fantastic message processing library which has a simple and stable message format. `Rubykiq` aims to be a portable library to push jobs in to Sidekiq with as little overhead as possible whilst having feature parity on `Sidekiq::Client`'s conventions.
|
6
6
|
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
gem 'rubykiq', '~> 0.0.3'
|
11
|
+
```
|
12
|
+
|
13
|
+
```ruby
|
14
|
+
require 'rubykiq'
|
15
|
+
```
|
7
16
|
## Features / Usage Examples
|
8
17
|
|
9
|
-
* [Redis] has support for [alternative drivers](https://github.com/redis/redis-rb#alternate-drivers), Rubykiq is tested with these in mind. (
|
18
|
+
* [Redis] has support for [alternative drivers](https://github.com/redis/redis-rb#alternate-drivers), Rubykiq is tested with these in mind. (eg `:synchrony`)
|
19
|
+
* the `:class` parameter can be the Class or a String of the Class (eg push jobs to Sidekiq from anywhere, not just where Sidekiq has the classes loaded)
|
10
20
|
* The `:at` parameter supports `Time`, `Date` and any `Time.parse`-able strings.
|
11
|
-
* Pushing multiple and singular jobs has the same interface (
|
12
|
-
* Slightly less gem dependecies, and by that I mean `Sidekiq::Client` without `Celluloid` (
|
21
|
+
* Pushing multiple and singular jobs has the same interface (simply nest args)
|
22
|
+
* Slightly less gem dependecies, and by that I mean `Sidekiq::Client` without `Celluloid` (which is already very light!)
|
23
|
+
* Easier configuration (IMO)
|
13
24
|
|
14
25
|
```ruby
|
15
|
-
require "rubykiq"
|
16
26
|
|
17
27
|
# will also detect REDIS_URL, REDIS_PROVIDER and REDISTOGO_URL ENV variables
|
18
|
-
Rubykiq.url =
|
28
|
+
Rubykiq.url = 'redis://127.0.0.1:6379'
|
19
29
|
|
20
30
|
# alternative driver support ( :ruby, :hiredis, :synchrony )
|
21
31
|
Rubykiq.driver = :synchrony
|
22
32
|
|
23
33
|
# defaults to nil
|
24
|
-
Rubykiq.namespace =
|
34
|
+
Rubykiq.namespace = 'background'
|
25
35
|
|
26
|
-
# uses
|
27
|
-
Rubykiq.push(:class =>
|
36
|
+
# uses 'default' queue unless specified
|
37
|
+
Rubykiq.push(:class => 'Worker', :args => ['foo', 1, :bat => 'bar'])
|
28
38
|
|
29
39
|
# args are optionally set to empty
|
30
|
-
Rubykiq.push(:class =>
|
40
|
+
Rubykiq.push(:class => 'Scheduler', :queue => 'scheduler')
|
31
41
|
|
32
42
|
# will batch up multiple jobs
|
33
|
-
Rubykiq.push(:class =>
|
43
|
+
Rubykiq.push(:class => 'Worker', :args => [['foo'], ['bar']])
|
34
44
|
|
35
|
-
# at param can be a
|
36
|
-
Rubykiq.push(:class =>
|
37
|
-
Rubykiq.push(:class =>
|
38
|
-
Rubykiq.push(:class =>
|
45
|
+
# at param can be a 'Time', 'Date' or any 'Time.parse'-able strings
|
46
|
+
Rubykiq.push(:class => 'DelayedHourMailer', :at => Time.now + 3600)
|
47
|
+
Rubykiq.push(:class => 'DelayedDayMailer', :at => DateTime.now.next_day)
|
48
|
+
Rubykiq.push(:class => 'DelayedMailer', :at => '2013-01-01T09:00:00Z')
|
39
49
|
|
40
50
|
# alias based sugar
|
41
|
-
job = { :class =>
|
51
|
+
job = { :class => 'Worker' }
|
42
52
|
Rubykiq << job
|
53
|
+
|
54
|
+
# create multiple Rubykiq clients with their own drivers
|
55
|
+
ruby_client = Rubykiq::Client.new
|
56
|
+
hiredis_client = Rubykiq::Client.new(:driver => :hiredis)
|
57
|
+
|
58
|
+
# create multiple Rubykiq clients with their own namespaces
|
59
|
+
foo_client = Rubykiq::Client.new(:namespace => 'foo')
|
60
|
+
bar_client = Rubykiq::Client.new(:namespace => 'bar')
|
61
|
+
|
43
62
|
```
|
44
63
|
|
45
64
|
## Caveats
|
46
65
|
|
47
66
|
* It's advised that using [Sidekiq::Client's push](https://github.com/mperham/sidekiq/blob/master/lib/sidekiq/client.rb#L36) method when already a dependency is better in most everyday cases
|
48
|
-
* If you rely on any [Sidekiq Middleware](https://github.com/mperham/sidekiq/wiki/
|
67
|
+
* If you rely on any [Sidekiq Middleware](https://github.com/mperham/sidekiq/wiki/middleware), Rubykiq is not aware of them so defaults will not be applied to the job hash.
|
49
68
|
|
50
69
|
## Build & Dependency Status
|
51
70
|
|
52
71
|
[![Gem Version](https://badge.fury.io/rb/rubykiq.png)][gem]
|
53
72
|
[![Build Status](https://travis-ci.org/karlfreeman/rubykiq.png)][travis]
|
54
|
-
[![Dependency Status](https://gemnasium.com/karlfreeman/rubykiq.png?travis)][gemnasium]
|
55
73
|
[![Code Quality](https://codeclimate.com/github/karlfreeman/rubykiq.png)][codeclimate]
|
56
74
|
[![Coverage Status](https://coveralls.io/repos/karlfreeman/rubykiq/badge.png?branch=master)][coveralls]
|
75
|
+
[![Gittip](http://img.shields.io/gittip/karlfreeman.png)][gittip]
|
57
76
|
|
58
77
|
## Supported Redis Drivers
|
59
78
|
|
@@ -62,20 +81,21 @@ Rubykiq << job
|
|
62
81
|
* [Synchrony](https://github.com/igrigorik/em-synchrony)
|
63
82
|
|
64
83
|
## Supported Ruby Versions
|
84
|
+
|
65
85
|
This library aims to support and is [tested against][travis] the following Ruby
|
66
86
|
implementations:
|
67
87
|
|
68
|
-
* Ruby 1.
|
69
|
-
* Ruby 1.9.3 (drivers: ruby, hiredis, synchrony)
|
88
|
+
* Ruby 2.1.0 (drivers: ruby, hiredis, synchrony)
|
70
89
|
* Ruby 2.0.0 (drivers: ruby, hiredis, synchrony)
|
71
|
-
*
|
72
|
-
* [
|
90
|
+
* Ruby 1.9.3 (drivers: ruby, hiredis, synchrony)
|
91
|
+
* [JRuby][jruby] (drivers: ruby)
|
92
|
+
* [Rubinius][rubinius] (drivers: ruby)
|
73
93
|
|
74
94
|
# Credits
|
75
95
|
|
76
96
|
Inspiration:
|
77
97
|
|
78
|
-
- [Michael Grosser's Enqueue into Sidkiq post](http://grosser.it/2013/01/17/enqueue-into-sidekiq-via-pure-redis-without-loading-sidekiq
|
98
|
+
- [Michael Grosser's Enqueue into Sidkiq post](http://grosser.it/2013/01/17/enqueue-into-sidekiq-via-pure-redis-without-loading-sidekiq)
|
79
99
|
|
80
100
|
Cribbed:
|
81
101
|
|
@@ -83,13 +103,13 @@ Cribbed:
|
|
83
103
|
- [Sidekiq's internal redis class](https://github.com/mperham/sidekiq/blob/master/lib/sidekiq/redis_connection.rb)
|
84
104
|
- [Sidekiq's FAQ](https://github.com/mperham/sidekiq/wiki/FAQ)
|
85
105
|
|
86
|
-
[sidekiq]: http://mperham.github.com/sidekiq
|
87
|
-
[redis]: https://github.com/redis/redis-rb
|
88
106
|
[gem]: https://rubygems.org/gems/rubykiq
|
89
107
|
[travis]: http://travis-ci.org/karlfreeman/rubykiq
|
90
|
-
[gemnasium]: https://gemnasium.com/karlfreeman/rubykiq
|
91
108
|
[coveralls]: https://coveralls.io/r/karlfreeman/rubykiq
|
92
109
|
[codeclimate]: https://codeclimate.com/github/karlfreeman/rubykiq
|
110
|
+
[gittip]: https://www.gittip.com/karlfreeman
|
93
111
|
[jruby]: http://www.jruby.org
|
94
112
|
[rubinius]: http://rubini.us
|
95
113
|
|
114
|
+
[sidekiq]: http://mperham.github.com/sidekiq
|
115
|
+
[redis]: https://github.com/redis/redis-rb
|
data/Rakefile
CHANGED
@@ -1,27 +1,17 @@
|
|
1
|
-
require
|
1
|
+
require 'bundler'
|
2
2
|
Bundler.setup
|
3
3
|
Bundler::GemHelper.install_tasks
|
4
4
|
|
5
|
-
require
|
5
|
+
require 'yard'
|
6
6
|
YARD::Rake::YardocTask.new
|
7
7
|
|
8
|
-
require
|
9
|
-
desc
|
8
|
+
require 'rspec/core/rake_task'
|
9
|
+
desc 'Run all examples'
|
10
10
|
RSpec::Core::RakeTask.new(:spec)
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
desc "Analyze for code quality"
|
16
|
-
Cane::RakeTask.new(:quality) do |cane|
|
17
|
-
cane.abc_max = 27
|
18
|
-
cane.no_doc = true
|
19
|
-
cane.style_measure = 200
|
20
|
-
end
|
21
|
-
end
|
22
|
-
rescue LoadError
|
23
|
-
warn "Cane is not available, metric:quality task not provided."
|
24
|
-
end
|
12
|
+
require 'rubocop/rake_task'
|
13
|
+
desc 'Run rubocop'
|
14
|
+
Rubocop::RakeTask.new(:rubocop)
|
25
15
|
|
26
|
-
task :
|
27
|
-
task :
|
16
|
+
task default: :spec
|
17
|
+
task test: :spec
|
data/lib/rubykiq.rb
CHANGED
@@ -1,23 +1,22 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
1
|
+
require 'forwardable'
|
2
|
+
require 'rubykiq/client'
|
3
|
+
require 'rubykiq/connection'
|
4
4
|
|
5
5
|
module Rubykiq
|
6
6
|
extend SingleForwardable
|
7
7
|
|
8
|
-
def_delegators :client, :<<, :push, :connection_pool
|
8
|
+
def_delegators :client, :<<, :push, :connection_pool, :connection_pool=
|
9
9
|
|
10
10
|
# delegate all VALID_OPTIONS_KEYS accessors to the client
|
11
11
|
def_delegators :client, *Rubykiq::Client::VALID_OPTIONS_KEYS
|
12
12
|
|
13
13
|
# delegate all VALID_OPTIONS_KEYS setters to the client ( hacky I know... )
|
14
|
-
def_delegators :client, *(Rubykiq::Client::VALID_OPTIONS_KEYS.dup.
|
14
|
+
def_delegators :client, *(Rubykiq::Client::VALID_OPTIONS_KEYS.dup.map! do |key| "#{key}=".to_sym; end)
|
15
15
|
|
16
16
|
# Fetch the Rubykiq::Client
|
17
17
|
#
|
18
18
|
# @return [Rubykiq::Client]
|
19
|
-
def self.client(options={})
|
19
|
+
def self.client(options = {})
|
20
20
|
@client ||= Rubykiq::Client.new(options)
|
21
21
|
end
|
22
|
-
|
23
|
-
end
|
22
|
+
end
|
data/lib/rubykiq/client.rb
CHANGED
@@ -1,12 +1,10 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
1
|
+
require 'connection_pool'
|
2
|
+
require 'securerandom'
|
3
|
+
require 'multi_json'
|
4
|
+
require 'time'
|
5
5
|
|
6
6
|
module Rubykiq
|
7
|
-
|
8
7
|
class Client
|
9
|
-
|
10
8
|
# An array of valid keys in the options hash when configuring a `Rubykiq::Client`
|
11
9
|
VALID_OPTIONS_KEYS = [
|
12
10
|
:redis_pool_size,
|
@@ -20,13 +18,13 @@ module Rubykiq
|
|
20
18
|
|
21
19
|
# A hash of valid options and their default values
|
22
20
|
DEFAULT_OPTIONS = {
|
23
|
-
:
|
24
|
-
:
|
25
|
-
:
|
26
|
-
:
|
27
|
-
:
|
28
|
-
:
|
29
|
-
:
|
21
|
+
redis_pool_size: 1,
|
22
|
+
redis_pool_timeout: 1,
|
23
|
+
url: nil,
|
24
|
+
namespace: nil,
|
25
|
+
driver: :ruby,
|
26
|
+
retry: true,
|
27
|
+
queue: 'default'
|
30
28
|
}.freeze
|
31
29
|
|
32
30
|
# Bang open the valid options
|
@@ -42,13 +40,17 @@ module Rubykiq
|
|
42
40
|
end
|
43
41
|
end
|
44
42
|
|
43
|
+
def connection_pool=(val)
|
44
|
+
@connection_pool = val
|
45
|
+
end
|
46
|
+
|
45
47
|
# Fetch the ::ConnectionPool of Rubykiq::Connections
|
46
48
|
#
|
47
49
|
# @return [::ConnectionPool]
|
48
|
-
def connection_pool(options={}, &block)
|
50
|
+
def connection_pool(options = {}, &block)
|
49
51
|
options = valid_options.merge(options)
|
50
52
|
|
51
|
-
@connection_pool ||= ::ConnectionPool.new(:
|
53
|
+
@connection_pool ||= ::ConnectionPool.new(timeout: redis_pool_timeout, size: redis_pool_size) do
|
52
54
|
Rubykiq::Connection.new(options)
|
53
55
|
end
|
54
56
|
|
@@ -57,13 +59,12 @@ module Rubykiq
|
|
57
59
|
else
|
58
60
|
return @connection_pool
|
59
61
|
end
|
60
|
-
|
61
62
|
end
|
62
63
|
|
63
64
|
# Push a Sidekiq job to Redis. Accepts a number of options:
|
64
65
|
#
|
65
66
|
# :class - the worker class to call, required.
|
66
|
-
# :queue - the named queue to use, optional ( default:
|
67
|
+
# :queue - the named queue to use, optional ( default: 'default' )
|
67
68
|
# :args - an array of simple arguments to the perform method, must be JSON-serializable, optional ( default: [] )
|
68
69
|
# :retry - whether to retry this job if it fails, true or false, default true, optional ( default: true )
|
69
70
|
# :at - when the job should be executed. This can be a `Time`, `Date` or any `Time.parse`-able strings, optional.
|
@@ -72,31 +73,29 @@ module Rubykiq
|
|
72
73
|
# if multiple jobs are pushed the size of the jobs will be returned
|
73
74
|
#
|
74
75
|
# Example:
|
75
|
-
# Rubykiq.push(:class =>
|
76
|
-
# Rubykiq.push(:class =>
|
77
|
-
# Rubykiq.push(:class =>
|
78
|
-
# Rubykiq.push(:class =>
|
76
|
+
# Rubykiq.push(:class => 'Worker', :args => ['foo', 1, :bat => 'bar'])
|
77
|
+
# Rubykiq.push(:class => 'Scheduler', :queue => 'scheduler')
|
78
|
+
# Rubykiq.push(:class => 'DelayedMailer', :at => '2013-01-01T09:00:00Z')
|
79
|
+
# Rubykiq.push(:class => 'Worker', :args => [['foo'], ['bar']])
|
79
80
|
#
|
80
81
|
# @param items [Array]
|
81
82
|
def push(items)
|
82
|
-
|
83
|
-
|
83
|
+
fail(ArgumentError, 'Message must be a Hash') unless items.is_a?(Hash)
|
84
|
+
fail(ArgumentError, 'Message args must be an Array') if items[:args] && !items[:args].is_a?(Array)
|
84
85
|
|
85
86
|
# args are optional
|
86
87
|
items[:args] ||= []
|
87
88
|
|
88
89
|
# determine if this items arg's is a nested array
|
89
90
|
items[:args].first.is_a?(Array) ? push_many(items) : push_one(items)
|
90
|
-
|
91
91
|
end
|
92
92
|
alias_method :<<, :push
|
93
93
|
|
94
|
-
|
95
94
|
private
|
96
95
|
|
97
96
|
# Create a hash of options and their values
|
98
97
|
def valid_options
|
99
|
-
VALID_OPTIONS_KEYS.
|
98
|
+
VALID_OPTIONS_KEYS.reduce({}) { |o, k| o.merge!(k => send(k)) }
|
100
99
|
end
|
101
100
|
|
102
101
|
# Create a hash of the default options and their values
|
@@ -113,7 +112,6 @@ module Rubykiq
|
|
113
112
|
|
114
113
|
# when only one item is needed to persisted to redis
|
115
114
|
def push_one(item)
|
116
|
-
|
117
115
|
# we're expecting item to be a single item so simply normalize it
|
118
116
|
payload = normalize_item(item)
|
119
117
|
|
@@ -121,19 +119,17 @@ module Rubykiq
|
|
121
119
|
pushed = false
|
122
120
|
pushed = raw_push([payload]) if payload
|
123
121
|
pushed ? payload[:jid] : nil
|
124
|
-
|
125
122
|
end
|
126
123
|
|
127
124
|
# when multiple item's are needing to be persisted to redis
|
128
125
|
def push_many(items)
|
129
|
-
|
130
126
|
# we're expecting items to have an nested array of args, lets take each one and correctly normalize them
|
131
127
|
payloads = items[:args].map do |args|
|
132
|
-
|
133
|
-
# clone the original items (
|
128
|
+
fail ArgumentError, "Bulk arguments must be an Array of Arrays: [[:foo => 'bar'], [:foo => 'foo']]" unless args.is_a?(Array)
|
129
|
+
# clone the original items (for :queue, :class, etc..)
|
134
130
|
item = items.clone
|
135
|
-
# merge this item's args (
|
136
|
-
item.merge!(:
|
131
|
+
# merge this item's args (eg the nested `arg` array)
|
132
|
+
item.merge!(args: args) unless args.empty?
|
137
133
|
# normalize this individual item
|
138
134
|
item = normalize_item(item)
|
139
135
|
end.compact
|
@@ -142,20 +138,19 @@ module Rubykiq
|
|
142
138
|
pushed = false
|
143
139
|
pushed = raw_push(payloads) unless payloads.empty?
|
144
140
|
pushed ? payloads.size : nil
|
145
|
-
|
146
141
|
end
|
147
142
|
|
148
143
|
# persist the job message(s)
|
149
144
|
def raw_push(payloads)
|
150
145
|
pushed = false
|
151
|
-
|
146
|
+
connection_pool do |connection|
|
152
147
|
if payloads.first[:at]
|
153
|
-
pushed = connection.zadd(
|
148
|
+
pushed = connection.zadd('schedule', payloads.map { |item| [item[:at].to_s, ::MultiJson.encode(item)] })
|
154
149
|
else
|
155
150
|
q = payloads.first[:queue]
|
156
151
|
to_push = payloads.map { |item| ::MultiJson.encode(item) }
|
157
152
|
_, pushed = connection.multi do
|
158
|
-
connection.sadd(
|
153
|
+
connection.sadd('queues', q)
|
159
154
|
connection.lpush("queue:#{q}", to_push)
|
160
155
|
end
|
161
156
|
end
|
@@ -163,12 +158,11 @@ module Rubykiq
|
|
163
158
|
pushed
|
164
159
|
end
|
165
160
|
|
166
|
-
#
|
167
161
|
def normalize_item(item)
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
162
|
+
fail(ArgumentError, 'Message must be a Hash') unless item.is_a?(Hash)
|
163
|
+
fail(ArgumentError, "Message must include a class and set of arguments: #{item.inspect}") if !item[:class] || !item[:args]
|
164
|
+
fail(ArgumentError, 'Message args must be an Array') if item[:args] && !item[:args].is_a?(Array)
|
165
|
+
fail(ArgumentError, 'Message class must be a String representation of the class name') unless item[:class].is_a?(String)
|
172
166
|
|
173
167
|
# normalize the time
|
174
168
|
item[:at] = normalize_time(item[:at]) if item[:at]
|
@@ -179,19 +173,17 @@ module Rubykiq
|
|
179
173
|
|
180
174
|
# apply the default options
|
181
175
|
[:retry, :queue].each do |key|
|
182
|
-
pre_normalized_item[key] = send("#{key}") unless pre_normalized_item.
|
176
|
+
pre_normalized_item[key] = send("#{key}") unless pre_normalized_item.key?(key)
|
183
177
|
end
|
184
178
|
|
185
179
|
# provide a job ID
|
186
180
|
pre_normalized_item[:jid] = ::SecureRandom.hex(12)
|
187
181
|
|
188
|
-
|
189
|
-
|
182
|
+
pre_normalized_item
|
190
183
|
end
|
191
184
|
|
192
185
|
# Given an object meant to represent time, try to convert it intelligently to a float
|
193
186
|
def normalize_time(time)
|
194
|
-
|
195
187
|
# if the time param is a `Date` / `String` convert it to a `Time` object
|
196
188
|
if time.is_a?(Date)
|
197
189
|
normalized_time = time.to_time
|
@@ -201,13 +193,10 @@ module Rubykiq
|
|
201
193
|
normalized_time = time
|
202
194
|
end
|
203
195
|
|
204
|
-
# convert the `Time` object to a float (
|
196
|
+
# convert the `Time` object to a float (if necessary)
|
205
197
|
normalized_time = normalized_time.to_f unless normalized_time.is_a?(Numeric)
|
206
198
|
|
207
|
-
|
208
|
-
|
199
|
+
normalized_time
|
209
200
|
end
|
210
|
-
|
211
201
|
end
|
212
|
-
|
213
|
-
end
|
202
|
+
end
|
data/lib/rubykiq/connection.rb
CHANGED
@@ -1,10 +1,8 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require 'redis'
|
2
|
+
require 'redis/namespace'
|
3
3
|
|
4
4
|
module Rubykiq
|
5
|
-
|
6
5
|
class Connection
|
7
|
-
|
8
6
|
extend Forwardable
|
9
7
|
def_delegators :@redis_connection, :multi, :namespace, :sadd, :zadd, :lpush, :lpop, :lrange, :llen, :zcard, :zrange, :flushdb
|
10
8
|
def_delegators :@redis_client, :host, :port, :db, :password
|
@@ -18,21 +16,20 @@ module Rubykiq
|
|
18
16
|
driver = options.delete(:driver)
|
19
17
|
@redis_connection ||= build_conection(url, namespace, driver)
|
20
18
|
@redis_client ||= @redis_connection.client
|
21
|
-
|
19
|
+
@redis_connection
|
22
20
|
end
|
23
21
|
|
24
22
|
private
|
25
23
|
|
26
24
|
# lets try and fallback to another redis url
|
27
25
|
def determine_redis_provider
|
28
|
-
ENV[
|
26
|
+
ENV['REDISTOGO_URL'] || ENV['REDIS_PROVIDER'] || ENV['REDIS_URL'] || 'redis://localhost:6379/0'
|
29
27
|
end
|
30
28
|
|
31
29
|
# construct a namespaced redis connection
|
32
30
|
def build_conection(url, namespace, driver)
|
33
|
-
client = ::Redis.
|
34
|
-
|
31
|
+
client = ::Redis.new(url: url, driver: driver)
|
32
|
+
::Redis::Namespace.new(namespace, redis: client)
|
35
33
|
end
|
36
|
-
|
37
34
|
end
|
38
|
-
end
|
35
|
+
end
|
data/lib/rubykiq/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
1
|
module Rubykiq
|
2
|
-
VERSION =
|
3
|
-
end
|
2
|
+
VERSION = '0.0.4' unless defined?(Rubykiq::VERSION)
|
3
|
+
end
|
data/rubykiq.gemspec
CHANGED
@@ -1,23 +1,26 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'rubykiq/version'
|
4
5
|
|
5
|
-
Gem::Specification.new do |
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'rubykiq'
|
8
|
+
spec.version = Rubykiq::VERSION
|
9
|
+
spec.authors = ['Karl Freeman']
|
10
|
+
spec.email = ['karlfreeman@gmail.com']
|
11
|
+
spec.summary = %q{Sidekiq agnostic enqueuing using Redis}
|
12
|
+
spec.description = %q{Sidekiq agnostic enqueuing using Redis}
|
13
|
+
spec.homepage = 'https://github.com/karlfreeman/rubykiq'
|
14
|
+
spec.license = 'MIT'
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
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
|
+
spec.required_ruby_version = '>= 1.9.3'
|
21
|
+
|
22
|
+
spec.add_dependency 'redis', '>= 3.0'
|
23
|
+
spec.add_dependency 'redis-namespace', '>= 1.0'
|
24
|
+
spec.add_dependency 'multi_json', '>= 1.0'
|
25
|
+
spec.add_dependency 'connection_pool', '>= 1.0'
|
26
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,44 +1,34 @@
|
|
1
|
-
|
1
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
2
2
|
|
3
|
-
require
|
3
|
+
require 'bundler'
|
4
4
|
Bundler.setup
|
5
|
-
begin; require "awesome_print"; rescue LoadError; end
|
6
5
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
require "support/timecop"
|
11
|
-
require "support/simplecov"
|
6
|
+
%w(support).each do |dir|
|
7
|
+
Dir.glob(File.expand_path("../#{dir}/**/*.rb", __FILE__), &method(:require))
|
8
|
+
end
|
12
9
|
|
13
|
-
require
|
10
|
+
require 'rubykiq'
|
14
11
|
|
15
12
|
# used as a stupid mixin class
|
16
13
|
class DummyClass
|
17
14
|
end
|
18
15
|
|
19
|
-
#
|
20
16
|
RSpec.configure do |config|
|
21
17
|
|
22
|
-
#
|
23
18
|
config.expect_with :rspec do |c|
|
24
19
|
c.syntax = :expect
|
25
20
|
end
|
26
21
|
|
27
|
-
#
|
28
22
|
def jruby?
|
29
23
|
defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby'
|
30
24
|
end
|
31
25
|
|
32
|
-
#
|
33
26
|
def wrap_in_synchrony?(driver)
|
34
|
-
|
35
27
|
yield unless driver == :synchrony
|
36
|
-
|
37
28
|
EM.synchrony do
|
38
29
|
yield if block_given?
|
39
30
|
EM.stop
|
40
31
|
end
|
41
|
-
|
42
32
|
end
|
43
33
|
|
44
|
-
end
|
34
|
+
end
|
data/spec/support/pry.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
if !ENV[
|
2
|
-
require
|
3
|
-
end
|
1
|
+
if !ENV['CI'] && defined?(RUBY_ENGINE) && RUBY_ENGINE == 'ruby'
|
2
|
+
require 'pry'
|
3
|
+
end
|
data/spec/support/simplecov.rb
CHANGED
@@ -1,15 +1,9 @@
|
|
1
|
-
if defined?(RUBY_ENGINE) && RUBY_ENGINE ==
|
2
|
-
|
3
|
-
require
|
4
|
-
|
5
|
-
|
6
|
-
require "coveralls"
|
7
|
-
Coveralls.wear!
|
8
|
-
SimpleCov.formatter = Coveralls::SimpleCov::Formatter
|
9
|
-
end
|
10
|
-
|
1
|
+
if ENV['CI'] && defined?(RUBY_ENGINE) && RUBY_ENGINE == 'ruby'
|
2
|
+
require 'simplecov'
|
3
|
+
require 'coveralls'
|
4
|
+
Coveralls.wear!
|
5
|
+
SimpleCov.formatter = Coveralls::SimpleCov::Formatter
|
11
6
|
SimpleCov.start do
|
12
|
-
add_filter
|
7
|
+
add_filter 'vendor'
|
13
8
|
end
|
14
|
-
|
15
|
-
end
|
9
|
+
end
|
data/spec/support/timecop.rb
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
require
|
2
|
-
Timecop.freeze
|
1
|
+
require 'timecop'
|
2
|
+
Timecop.freeze
|
data/spec/unit/client_spec.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'hiredis'
|
3
|
+
require 'em-synchrony'
|
4
4
|
|
5
5
|
describe Rubykiq::Client do
|
6
6
|
|
@@ -12,9 +12,9 @@ describe Rubykiq::Client do
|
|
12
12
|
Timecop.return
|
13
13
|
end
|
14
14
|
|
15
|
-
let (:ruby_client) { Rubykiq::Client.new }
|
16
|
-
let (:hiredis_client) { Rubykiq::Client.new(:
|
17
|
-
let (:synchrony_client) { Rubykiq::Client.new(:
|
15
|
+
let (:ruby_client) { Rubykiq::Client.new(driver: :ruby, namespace: :ruby) }
|
16
|
+
let (:hiredis_client) { Rubykiq::Client.new(driver: :hiredis, namespace: :hiredis) }
|
17
|
+
let (:synchrony_client) { Rubykiq::Client.new(driver: :synchrony, namespace: :synchrony) }
|
18
18
|
|
19
19
|
# eg with a variety of drivers
|
20
20
|
[:ruby, :hiredis, :synchrony].each do |driver|
|
@@ -22,53 +22,53 @@ describe Rubykiq::Client do
|
|
22
22
|
# skip incompatible drivers when running in JRuby
|
23
23
|
next if jruby? && (driver == :hiredis || :synchrony)
|
24
24
|
|
25
|
-
context "
|
25
|
+
context "using driver '#{driver}'" do
|
26
26
|
|
27
27
|
# make sure the let is the current client being tested
|
28
|
-
let(:client) {
|
28
|
+
let(:client) { send("#{driver}_client") }
|
29
29
|
|
30
30
|
describe :defaults do
|
31
31
|
subject { client }
|
32
|
-
its(:namespace) { should
|
32
|
+
its(:namespace) { should eq driver }
|
33
33
|
its(:driver) { should be driver }
|
34
34
|
its(:retry) { should be_true }
|
35
|
-
its(:queue) { should eq
|
35
|
+
its(:queue) { should eq 'default' }
|
36
36
|
end
|
37
37
|
|
38
38
|
describe :push do
|
39
39
|
|
40
40
|
context :validations do
|
41
41
|
|
42
|
-
context
|
43
|
-
it
|
44
|
-
expect{ client.push([]) }.to raise_error(ArgumentError, /Message must be a Hash/)
|
45
|
-
expect{ client.push(
|
46
|
-
expect{ client.push(DummyClass.new) }.to raise_error(ArgumentError, /Message must be a Hash/)
|
42
|
+
context 'with an incorrect message type' do
|
43
|
+
it 'raises an ArgumentError' do
|
44
|
+
expect { client.push([]) }.to raise_error(ArgumentError, /Message must be a Hash/)
|
45
|
+
expect { client.push('{}') }.to raise_error(ArgumentError, /Message must be a Hash/)
|
46
|
+
expect { client.push(DummyClass.new) }.to raise_error(ArgumentError, /Message must be a Hash/)
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
-
context
|
51
|
-
it
|
52
|
-
expect{ client.push(:
|
50
|
+
context 'without a class' do
|
51
|
+
it 'raises an ArgumentError' do
|
52
|
+
expect { client.push(args: ['foo', 1, { bat: 'bar' }]) }.to raise_error(ArgumentError, /Message must include a class/)
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
|
-
context
|
57
|
-
it
|
58
|
-
expect{ client.push(:
|
56
|
+
context 'with an incorrect args type' do
|
57
|
+
it 'raises an ArgumentError' do
|
58
|
+
expect { client.push(class: 'MyWorker', args: { bat: 'bar' }) }.to raise_error(ArgumentError, /Message args must be an Array/)
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
62
|
-
context
|
63
|
-
it
|
64
|
-
expect{ client.push(:
|
62
|
+
context 'with an incorrect class type' do
|
63
|
+
it 'raises an ArgumentError' do
|
64
|
+
expect { client.push(class: DummyClass, args: ['foo', 1, { bat: 'bar' }]) }.to raise_error(ArgumentError, /Message class must be a String representation of the class name/)
|
65
65
|
end
|
66
66
|
end
|
67
67
|
|
68
68
|
end
|
69
69
|
|
70
70
|
# eg singular and batch
|
71
|
-
args = [[{:
|
71
|
+
args = [[{ bat: 'bar' }], [[{ bat: 'bar' }], [{ bat: 'foo' }]]]
|
72
72
|
args.each do |args|
|
73
73
|
|
74
74
|
context "with args #{args}" do
|
@@ -81,13 +81,13 @@ describe Rubykiq::Client do
|
|
81
81
|
connection.flushdb
|
82
82
|
end
|
83
83
|
|
84
|
-
expect { client.push(:
|
85
|
-
client.connection_pool do |connection| connection.llen(
|
84
|
+
expect { client.push(class: 'MyWorker', args: args) }.to change {
|
85
|
+
client.connection_pool do |connection| connection.llen('queue:default'); end
|
86
86
|
}.from(0).to(args.length)
|
87
87
|
|
88
|
-
raw_jobs = client.connection_pool do |connection| connection.lrange(
|
88
|
+
raw_jobs = client.connection_pool do |connection| connection.lrange('queue:default', 0, args.length); end
|
89
89
|
raw_jobs.each do |job|
|
90
|
-
job = MultiJson.decode(job, :
|
90
|
+
job = MultiJson.decode(job, symbolize_keys: true)
|
91
91
|
expect(job).to have_key(:jid)
|
92
92
|
end
|
93
93
|
|
@@ -96,10 +96,10 @@ describe Rubykiq::Client do
|
|
96
96
|
end
|
97
97
|
|
98
98
|
# eg with a variety of different time types
|
99
|
-
times = [
|
99
|
+
times = [Time.now, DateTime.now, Time.now.utc.iso8601, Time.now.to_f]
|
100
100
|
times.each do |time|
|
101
101
|
|
102
|
-
context "with time #{time} (
|
102
|
+
context "with time #{time} (#{time.class})" do
|
103
103
|
|
104
104
|
it "should create #{args.length} job(s)" do
|
105
105
|
|
@@ -109,13 +109,13 @@ describe Rubykiq::Client do
|
|
109
109
|
connection.flushdb
|
110
110
|
end
|
111
111
|
|
112
|
-
expect { client.push(:
|
113
|
-
client.connection_pool do |connection| connection.zcard(
|
112
|
+
expect { client.push(class: 'MyWorker', args: args, at: time) }.to change {
|
113
|
+
client.connection_pool do |connection| connection.zcard('schedule'); end
|
114
114
|
}.from(0).to(args.length)
|
115
115
|
|
116
|
-
raw_jobs = client.connection_pool do |connection| connection.zrange(
|
116
|
+
raw_jobs = client.connection_pool do |connection| connection.zrange('schedule', 0, args.length); end
|
117
117
|
raw_jobs.each do |job|
|
118
|
-
job = MultiJson.decode(job, :
|
118
|
+
job = MultiJson.decode(job, symbolize_keys: true)
|
119
119
|
expect(job).to have_key(:at)
|
120
120
|
expect(job[:at]).to be_within(1).of(Time.now.to_f)
|
121
121
|
end
|
@@ -138,4 +138,4 @@ describe Rubykiq::Client do
|
|
138
138
|
|
139
139
|
end
|
140
140
|
|
141
|
-
end
|
141
|
+
end
|
@@ -1,11 +1,11 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Rubykiq::Connection do
|
4
4
|
|
5
5
|
describe :defaults do
|
6
6
|
subject { Rubykiq::Connection.new }
|
7
7
|
its(:namespace) { should be_nil }
|
8
|
-
its(:host) { should eq
|
8
|
+
its(:host) { should eq 'localhost' }
|
9
9
|
its(:port) { should be 6379 }
|
10
10
|
its(:db) { should be 0 }
|
11
11
|
its(:password) { should be_nil }
|
@@ -14,15 +14,15 @@ describe Rubykiq::Connection do
|
|
14
14
|
describe :options do
|
15
15
|
|
16
16
|
context :custom do
|
17
|
-
subject { Rubykiq::Connection.new(:
|
18
|
-
its(:namespace) { should eq
|
17
|
+
subject { Rubykiq::Connection.new(namespace: 'yyy') }
|
18
|
+
its(:namespace) { should eq 'yyy' }
|
19
19
|
end
|
20
20
|
|
21
21
|
context :inherited_settings do
|
22
|
-
it
|
23
|
-
client = Rubykiq::Client.new(:
|
22
|
+
it 'should work' do
|
23
|
+
client = Rubykiq::Client.new(namespace: 'xxx')
|
24
24
|
client.connection_pool do |connection|
|
25
|
-
expect(connection.namespace).to eq
|
25
|
+
expect(connection.namespace).to eq 'xxx'
|
26
26
|
end
|
27
27
|
end
|
28
28
|
end
|
@@ -32,7 +32,7 @@ describe Rubykiq::Connection do
|
|
32
32
|
describe :env do
|
33
33
|
subject { Rubykiq::Connection.new }
|
34
34
|
|
35
|
-
[{:
|
35
|
+
[{ name: 'REDISTOGO_URL', value: 'redistogo' }, { name: 'REDIS_PROVIDER', value: 'redisprovider' }, { name: 'REDIS_URL', value: 'redisurl' }].each do | test_case |
|
36
36
|
context "with ENV[#{test_case[:name]}]" do
|
37
37
|
before do
|
38
38
|
ENV[test_case[:name]] = "redis://#{test_case[:value]}:6379/0"
|
@@ -46,4 +46,4 @@ describe Rubykiq::Connection do
|
|
46
46
|
|
47
47
|
end
|
48
48
|
|
49
|
-
end
|
49
|
+
end
|
data/spec/unit/rubykiq_spec.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Rubykiq do
|
4
4
|
|
@@ -22,10 +22,10 @@ describe Rubykiq do
|
|
22
22
|
|
23
23
|
describe key do
|
24
24
|
subject { Rubykiq }
|
25
|
-
it {should respond_to key }
|
26
|
-
it {should respond_to "#{key}=".to_sym }
|
25
|
+
it { should respond_to key }
|
26
|
+
it { should respond_to "#{key}=".to_sym }
|
27
27
|
end
|
28
28
|
|
29
29
|
end
|
30
30
|
|
31
|
-
end
|
31
|
+
end
|
metadata
CHANGED
@@ -1,83 +1,69 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubykiq
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Karl Freeman
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-02-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - '>='
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '3.0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - '>='
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '3.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: redis-namespace
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - '>='
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '1.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
40
|
version: '1.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: multi_json
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - '>='
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '1.0'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - '>='
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '1.0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: connection_pool
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - '>='
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '1.0'
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '1.0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: bundler
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - ! '>='
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '1.0'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - ! '>='
|
66
|
+
- - '>='
|
81
67
|
- !ruby/object:Gem::Version
|
82
68
|
version: '1.0'
|
83
69
|
description: Sidekiq agnostic enqueuing using Redis
|
@@ -89,7 +75,7 @@ extra_rdoc_files: []
|
|
89
75
|
files:
|
90
76
|
- .document
|
91
77
|
- .gitignore
|
92
|
-
- .
|
78
|
+
- .rubocop.yml
|
93
79
|
- .travis.yml
|
94
80
|
- .yardopts
|
95
81
|
- CHANGELOG.md
|
@@ -120,17 +106,17 @@ require_paths:
|
|
120
106
|
- lib
|
121
107
|
required_ruby_version: !ruby/object:Gem::Requirement
|
122
108
|
requirements:
|
123
|
-
- -
|
109
|
+
- - '>='
|
124
110
|
- !ruby/object:Gem::Version
|
125
|
-
version: 1.9.
|
111
|
+
version: 1.9.3
|
126
112
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
127
113
|
requirements:
|
128
|
-
- -
|
114
|
+
- - '>='
|
129
115
|
- !ruby/object:Gem::Version
|
130
116
|
version: '0'
|
131
117
|
requirements: []
|
132
118
|
rubyforge_project:
|
133
|
-
rubygems_version: 2.0.
|
119
|
+
rubygems_version: 2.0.14
|
134
120
|
signing_key:
|
135
121
|
specification_version: 4
|
136
122
|
summary: Sidekiq agnostic enqueuing using Redis
|
data/.rspec
DELETED