rubykiq 1.0.0 → 1.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.
- checksums.yaml +4 -4
- data/README.md +12 -12
- data/lib/rubykiq.rb +11 -1
- data/lib/rubykiq/client.rb +13 -5
- data/lib/rubykiq/connection.rb +4 -5
- data/lib/rubykiq/version.rb +1 -1
- data/spec/unit/client_spec.rb +0 -28
- data/spec/unit/connection_spec.rb +0 -6
- data/spec/unit/rubykiq_spec.rb +17 -10
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fe8a63e0620e49a3abee5a4b793f6a47de9d2134
|
4
|
+
data.tar.gz: 538763a88753b76a2d0647b0a66efba79da5db4f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 61192efb893a6bbe6d0d094e3c672a56ae4cea8e1e6d65dbcdc7c21762423f49fcfd6f6e54d311c7852844af4bafeee5a069342a2e9fe4188bae1109a72bedfd
|
7
|
+
data.tar.gz: 000c33af26dfd8edb0342f35265f2e85284affbd2e49338af480af75fee90db40b38abb08618981510d761136443da1d25513cb0ce8e559ec2fb391b56b9f79e
|
data/README.md
CHANGED
@@ -16,9 +16,9 @@ require 'rubykiq'
|
|
16
16
|
## Features / Usage Examples
|
17
17
|
|
18
18
|
* [Redis](http://redis.io) 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
|
19
|
+
* the `:class` parameter can be a `Class` or a `String` of a Class (eg push jobs to Sidekiq from anywhere, not just where you have Sidekiq classes loaded)
|
20
20
|
* The `:at` parameter supports `Time`, `Date` and any `Time.parse`-able strings.
|
21
|
-
* Pushing multiple and singular jobs
|
21
|
+
* Pushing multiple and singular jobs have the same interface (simply nest args)
|
22
22
|
* Slightly less gem dependecies, and by that I mean `Sidekiq::Client` without `Celluloid` (which is already very light!)
|
23
23
|
* Easier configuration (IMO)
|
24
24
|
|
@@ -33,30 +33,30 @@ Rubykiq.driver = :synchrony
|
|
33
33
|
Rubykiq.namespace = 'background'
|
34
34
|
|
35
35
|
# uses 'default' queue unless specified
|
36
|
-
Rubykiq.push(:
|
36
|
+
Rubykiq.push(class: 'Worker', args: ['foo', 1, bat: 'bar'])
|
37
37
|
|
38
38
|
# args are optionally set to empty
|
39
|
-
Rubykiq.push(:
|
39
|
+
Rubykiq.push(class: 'Scheduler', queue: 'scheduler')
|
40
40
|
|
41
41
|
# will batch up multiple jobs
|
42
|
-
Rubykiq.push(:
|
42
|
+
Rubykiq.push(class: 'Worker', args: [['foo'], ['bar']])
|
43
43
|
|
44
44
|
# at param can be a 'Time', 'Date' or any 'Time.parse'-able strings
|
45
|
-
Rubykiq.push(:
|
46
|
-
Rubykiq.push(:
|
47
|
-
Rubykiq.push(:
|
45
|
+
Rubykiq.push(class: 'DelayedHourMailer', at: Time.now + 3600)
|
46
|
+
Rubykiq.push(class: 'DelayedDayMailer', at: DateTime.now.next_day)
|
47
|
+
Rubykiq.push(class: 'DelayedMailer', at: '2013-01-01T09:00:00Z')
|
48
48
|
|
49
49
|
# alias based sugar
|
50
|
-
job = { :
|
50
|
+
job = { class: 'Worker' }
|
51
51
|
Rubykiq << job
|
52
52
|
|
53
53
|
# create multiple Rubykiq clients with their own drivers
|
54
54
|
ruby_client = Rubykiq::Client.new
|
55
|
-
hiredis_client = Rubykiq::Client.new(:
|
55
|
+
hiredis_client = Rubykiq::Client.new(driver: :hiredis)
|
56
56
|
|
57
57
|
# create multiple Rubykiq clients with their own namespaces
|
58
|
-
foo_client = Rubykiq::Client.new(:
|
59
|
-
bar_client = Rubykiq::Client.new(:
|
58
|
+
foo_client = Rubykiq::Client.new(namespace: 'foo')
|
59
|
+
bar_client = Rubykiq::Client.new(namespace: 'bar')
|
60
60
|
```
|
61
61
|
|
62
62
|
## Caveats
|
data/lib/rubykiq.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'thread'
|
1
2
|
require 'forwardable'
|
2
3
|
require 'rubykiq/client'
|
3
4
|
require 'rubykiq/connection'
|
@@ -17,6 +18,15 @@ module Rubykiq
|
|
17
18
|
#
|
18
19
|
# @return [Rubykiq::Client]
|
19
20
|
def self.client(options = {})
|
20
|
-
|
21
|
+
initialize_client(options) unless defined?(@client)
|
22
|
+
@client
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def self.initialize_client(options = {})
|
28
|
+
Thread.exclusive do
|
29
|
+
@client = Rubykiq::Client.new(options)
|
30
|
+
end
|
21
31
|
end
|
22
32
|
end
|
data/lib/rubykiq/client.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'time'
|
2
|
+
require 'thread'
|
2
3
|
require 'multi_json'
|
3
4
|
require 'securerandom'
|
4
5
|
require 'connection_pool'
|
@@ -48,15 +49,12 @@ module Rubykiq
|
|
48
49
|
# @return [::ConnectionPool]
|
49
50
|
def connection_pool(options = {}, &block)
|
50
51
|
options = valid_options.merge(options)
|
51
|
-
|
52
|
-
@connection_pool ||= ::ConnectionPool.new(timeout: redis_pool_timeout, size: redis_pool_size) do
|
53
|
-
Rubykiq::Connection.new(options)
|
54
|
-
end
|
52
|
+
initialize_connection_pool(options) unless defined?(@connection_pool)
|
55
53
|
|
56
54
|
if block_given?
|
57
55
|
@connection_pool.with(&block)
|
58
56
|
else
|
59
|
-
|
57
|
+
@connection_pool
|
60
58
|
end
|
61
59
|
end
|
62
60
|
|
@@ -197,5 +195,15 @@ module Rubykiq
|
|
197
195
|
|
198
196
|
normalized_time
|
199
197
|
end
|
198
|
+
|
199
|
+
private
|
200
|
+
|
201
|
+
def initialize_connection_pool(options = {})
|
202
|
+
Thread.exclusive do
|
203
|
+
@connection_pool = ::ConnectionPool.new(timeout: redis_pool_timeout, size: redis_pool_size) do
|
204
|
+
Rubykiq::Connection.new(options)
|
205
|
+
end
|
206
|
+
end
|
207
|
+
end
|
200
208
|
end
|
201
209
|
end
|
data/lib/rubykiq/connection.rb
CHANGED
@@ -14,20 +14,19 @@ module Rubykiq
|
|
14
14
|
url = options.delete(:url) { determine_redis_provider }
|
15
15
|
namespace = options.delete(:namespace)
|
16
16
|
driver = options.delete(:driver)
|
17
|
-
@redis_connection
|
18
|
-
@redis_client
|
17
|
+
@redis_connection = initialize_conection(url, namespace, driver)
|
18
|
+
@redis_client = @redis_connection.client
|
19
19
|
@redis_connection
|
20
20
|
end
|
21
21
|
|
22
22
|
private
|
23
23
|
|
24
|
-
# lets try and fallback to another redis url
|
25
24
|
def determine_redis_provider
|
25
|
+
# lets try and fallback to another redis url
|
26
26
|
ENV['REDISTOGO_URL'] || ENV['REDIS_PROVIDER'] || ENV['REDIS_URL'] || 'redis://localhost:6379/0'
|
27
27
|
end
|
28
28
|
|
29
|
-
|
30
|
-
def build_conection(url, namespace, driver)
|
29
|
+
def initialize_conection(url, namespace, driver)
|
31
30
|
client = ::Redis.new(url: url, driver: driver)
|
32
31
|
::Redis::Namespace.new(namespace, redis: client)
|
33
32
|
end
|
data/lib/rubykiq/version.rb
CHANGED
data/spec/unit/client_spec.rb
CHANGED
@@ -3,7 +3,6 @@ require 'hiredis'
|
|
3
3
|
require 'em-synchrony'
|
4
4
|
|
5
5
|
describe Rubykiq::Client do
|
6
|
-
|
7
6
|
before(:all) { Timecop.freeze }
|
8
7
|
after(:all) { Timecop.return }
|
9
8
|
let(:ruby_client) { Rubykiq::Client.new(driver: :ruby, namespace: :ruby) }
|
@@ -12,15 +11,11 @@ describe Rubykiq::Client do
|
|
12
11
|
|
13
12
|
# eg with a variety of drivers
|
14
13
|
[:ruby, :hiredis, :synchrony].each do |driver|
|
15
|
-
|
16
14
|
# skip incompatible drivers when running in JRuby
|
17
15
|
next if jruby? && (driver == :hiredis || :synchrony)
|
18
|
-
|
19
16
|
context "using driver '#{driver}'" do
|
20
|
-
|
21
17
|
# make sure the let is the current client being tested
|
22
18
|
let(:client) { send("#{driver}_client") }
|
23
|
-
|
24
19
|
describe :defaults do
|
25
20
|
subject { client }
|
26
21
|
its(:namespace) { should eq driver }
|
@@ -30,9 +25,7 @@ describe Rubykiq::Client do
|
|
30
25
|
end
|
31
26
|
|
32
27
|
describe :push do
|
33
|
-
|
34
28
|
context :validations do
|
35
|
-
|
36
29
|
context 'with an incorrect message type' do
|
37
30
|
it 'raises an ArgumentError' do
|
38
31
|
expect { client.push([]) }.to raise_error(ArgumentError, /Message must be a Hash/)
|
@@ -58,19 +51,14 @@ describe Rubykiq::Client do
|
|
58
51
|
expect { client.push(class: Class, args: ['foo', 1, { bat: 'bar' }]) }.to raise_error(ArgumentError, /Message class must be a String representation of the class name/)
|
59
52
|
end
|
60
53
|
end
|
61
|
-
|
62
54
|
end
|
63
55
|
|
64
56
|
# eg singular and batch
|
65
57
|
arguments = [[{ bat: 'bar' }], [[{ bat: 'bar' }], [{ bat: 'foo' }]]]
|
66
58
|
arguments.each do |args|
|
67
|
-
|
68
59
|
context "with args #{args}" do
|
69
|
-
|
70
60
|
it "should create #{args.length} job(s)" do
|
71
|
-
|
72
61
|
wrap_in_synchrony?(driver) do
|
73
|
-
|
74
62
|
client.connection_pool do |connection|
|
75
63
|
connection.flushdb
|
76
64
|
end
|
@@ -84,21 +72,15 @@ describe Rubykiq::Client do
|
|
84
72
|
job = MultiJson.decode(job, symbolize_keys: true)
|
85
73
|
expect(job).to have_key(:jid)
|
86
74
|
end
|
87
|
-
|
88
75
|
end
|
89
|
-
|
90
76
|
end
|
91
77
|
|
92
78
|
# eg with a variety of different time types
|
93
79
|
times = [Time.now, DateTime.now, Time.now.utc.iso8601, Time.now.to_f]
|
94
80
|
times.each do |time|
|
95
|
-
|
96
81
|
context "with time #{time} (#{time.class})" do
|
97
|
-
|
98
82
|
it "should create #{args.length} job(s)" do
|
99
|
-
|
100
83
|
wrap_in_synchrony?(driver) do
|
101
|
-
|
102
84
|
client.connection_pool do |connection|
|
103
85
|
connection.flushdb
|
104
86
|
end
|
@@ -113,23 +95,13 @@ describe Rubykiq::Client do
|
|
113
95
|
expect(job).to have_key(:at)
|
114
96
|
expect(job[:at]).to be_within(1).of(Time.now.to_f)
|
115
97
|
end
|
116
|
-
|
117
98
|
end
|
118
|
-
|
119
99
|
end
|
120
|
-
|
121
100
|
end
|
122
|
-
|
123
101
|
end
|
124
|
-
|
125
102
|
end
|
126
|
-
|
127
103
|
end
|
128
|
-
|
129
104
|
end
|
130
|
-
|
131
105
|
end
|
132
|
-
|
133
106
|
end
|
134
|
-
|
135
107
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Rubykiq::Connection do
|
4
|
-
|
5
4
|
describe :defaults do
|
6
5
|
subject { Rubykiq::Connection.new }
|
7
6
|
its(:namespace) { should be_nil }
|
@@ -12,7 +11,6 @@ describe Rubykiq::Connection do
|
|
12
11
|
end
|
13
12
|
|
14
13
|
describe :options do
|
15
|
-
|
16
14
|
context :custom do
|
17
15
|
subject { Rubykiq::Connection.new(namespace: 'yyy') }
|
18
16
|
its(:namespace) { should eq 'yyy' }
|
@@ -26,12 +24,10 @@ describe Rubykiq::Connection do
|
|
26
24
|
end
|
27
25
|
end
|
28
26
|
end
|
29
|
-
|
30
27
|
end
|
31
28
|
|
32
29
|
describe :env do
|
33
30
|
subject { Rubykiq::Connection.new }
|
34
|
-
|
35
31
|
[{ name: 'REDISTOGO_URL', value: 'redistogo' }, { name: 'REDIS_PROVIDER', value: 'redisprovider' }, { name: 'REDIS_URL', value: 'redisurl' }].each do | test_case |
|
36
32
|
context "with ENV[#{test_case[:name]}]" do
|
37
33
|
before do
|
@@ -43,7 +39,5 @@ describe Rubykiq::Connection do
|
|
43
39
|
its(:host) { should eq test_case[:value] }
|
44
40
|
end
|
45
41
|
end
|
46
|
-
|
47
42
|
end
|
48
|
-
|
49
43
|
end
|
data/spec/unit/rubykiq_spec.rb
CHANGED
@@ -2,30 +2,37 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Rubykiq do
|
4
4
|
|
5
|
-
describe :version do
|
6
|
-
subject { Rubykiq::VERSION }
|
7
|
-
it { should be_kind_of(String) }
|
8
|
-
end
|
9
5
|
|
10
6
|
describe :client do
|
11
|
-
|
12
|
-
|
7
|
+
it 'should return a Client' do
|
8
|
+
expect(Rubykiq.client).to be_kind_of(Rubykiq::Client)
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'should be thread safe' do
|
12
|
+
t1 = Thread.new { client = Rubykiq.client; sleep 0.1; client }
|
13
|
+
t2 = Thread.new { Rubykiq.client }
|
14
|
+
expect(t1.value).to eql t2.value
|
15
|
+
end
|
13
16
|
end
|
14
17
|
|
15
18
|
describe :connection_pool do
|
16
|
-
|
17
|
-
|
19
|
+
it 'should return a ConnectionPool' do
|
20
|
+
expect(Rubykiq.connection_pool).to be_kind_of(::ConnectionPool)
|
21
|
+
end
|
22
|
+
it 'should be thread safe' do
|
23
|
+
t1 = Thread.new { connection_pool = Rubykiq.connection_pool; sleep 0.1; connection_pool }
|
24
|
+
t2 = Thread.new { Rubykiq.connection_pool }
|
25
|
+
expect(t1.value).to eql t2.value
|
26
|
+
end
|
18
27
|
end
|
19
28
|
|
20
29
|
# for every valid option
|
21
30
|
Rubykiq::Client::VALID_OPTIONS_KEYS.each do |key|
|
22
|
-
|
23
31
|
describe key do
|
24
32
|
subject { Rubykiq }
|
25
33
|
it { should respond_to key }
|
26
34
|
it { should respond_to "#{key}=".to_sym }
|
27
35
|
end
|
28
|
-
|
29
36
|
end
|
30
37
|
|
31
38
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubykiq
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Karl Freeman
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-03-
|
11
|
+
date: 2014-03-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis
|