line_up 0.1.2 → 0.1.4
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 +5 -5
- data/README.md +1 -5
- data/lib/line_up/version.rb +1 -1
- data/lib/line_up.rb +0 -31
- data/spec/lib/line_up/configuration_spec.rb +7 -11
- data/spec/lib/line_up_spec.rb +14 -102
- data/spec/spec_helper.rb +0 -24
- metadata +3 -46
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: ce18ce8d73e695503b1817970a0f7c134a716f9bfc6c040e0572f9ef5df9a26f
|
4
|
+
data.tar.gz: b6ffe2e2f83caef827038c9b2d0015a0c9561f03f711ba008105116605d6560c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 278311aa84959ea1d7fd8148c273eef5420494699070a9dd80ec42498d27ab2157ea63c5a73b436d016b0e7a3e38082e3ab11d3b0a18e65a937d8de2c13901e3
|
7
|
+
data.tar.gz: 9fcd63dd92472f090fe8e168b36442daf14cd673d617ea2aa2c4d8f5a75989256594776d633d9c2c464e007d8bc9c5fa1d746888b220f99f2b4d407e414f5627
|
data/README.md
CHANGED
@@ -41,11 +41,7 @@ With the setup above, Resque lies in the `myapp:resque`-namespace. So you can en
|
|
41
41
|
This is how you can enqueue a job for another applications:
|
42
42
|
|
43
43
|
```ruby
|
44
|
-
|
45
|
-
# Yey, everything went well
|
46
|
-
else
|
47
|
-
# The "Trouble"-gem, has been notified and I can process the failure if I like
|
48
|
-
end
|
44
|
+
LineUp.push :otherApp, :SomeJob, 12345, some: thing
|
49
45
|
```
|
50
46
|
|
51
47
|
This will enqueue to `other_app:resque:some_job` with arguments `[12345, { 'some' => 'thing' }]` and make sure that the `other_app:resque:queues` Set references the queue List.
|
data/lib/line_up/version.rb
CHANGED
data/lib/line_up.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'trouble'
|
2
|
-
|
3
1
|
require 'line_up/configuration'
|
4
2
|
require 'line_up/job'
|
5
3
|
|
@@ -13,10 +11,6 @@ module LineUp
|
|
13
11
|
redis.rpush "queue:#{job.queue_name}", job.encode
|
14
12
|
end
|
15
13
|
log caller, application, jobclass, *args
|
16
|
-
true
|
17
|
-
rescue Exception => exception
|
18
|
-
Trouble.notify exception, caller: caller[1], message: "LineUp could not enqueue a Job", code: :enqueue_failed, redis: config.redis.inspect, application: application.inspect, job: jobclass.inspect, args: args.inspect
|
19
|
-
false
|
20
14
|
end
|
21
15
|
|
22
16
|
def self.ensure(application, jobclass, *args)
|
@@ -25,39 +19,15 @@ module LineUp
|
|
25
19
|
end
|
26
20
|
end
|
27
21
|
|
28
|
-
def self.push_throttled(application, jobclass, *args)
|
29
|
-
job = Job.new jobclass, *args
|
30
|
-
unless recent? application, job
|
31
|
-
push(application, jobclass, *args)
|
32
|
-
recent! application, job
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
22
|
def self.queue_length(application, jobclass)
|
37
23
|
redis_for application do |r|
|
38
24
|
job = Job.new jobclass
|
39
25
|
return r.llen "queue:#{job.queue_name}"
|
40
26
|
end
|
41
|
-
rescue Exception => e
|
42
|
-
Trouble.notify e, caller: caller[1], message: "LineUp could not get the queue length", code: :getting_queue_length_failed, redis: config.redis.inspect, application: application.inspect, job: jobclass.inspect
|
43
|
-
false
|
44
27
|
end
|
45
28
|
|
46
29
|
private
|
47
30
|
|
48
|
-
def self.recent?(application, job)
|
49
|
-
redis_for application do |r|
|
50
|
-
return true if r.exists "throttled:#{job.checksum}"
|
51
|
-
end
|
52
|
-
false
|
53
|
-
end
|
54
|
-
|
55
|
-
def self.recent!(application, job)
|
56
|
-
redis_for application do |r|
|
57
|
-
r.setex "throttled:#{job.checksum}", config.recency_ttl, "true"
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
31
|
def self.redis_for(application, &block)
|
62
32
|
config.redis.namespace [StringExtensions.underscore(application), :resque].compact.join(':'), &block
|
63
33
|
end
|
@@ -66,5 +36,4 @@ module LineUp
|
|
66
36
|
return unless config.logger
|
67
37
|
config.logger.debug "LINEUP ENQUEUED JOB #{jobclass.inspect} for #{application.inspect} at #{caller.first} with arguments #{args.inspect}"
|
68
38
|
end
|
69
|
-
|
70
39
|
end
|
@@ -2,8 +2,8 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe LineUp do
|
4
4
|
|
5
|
-
let(:
|
6
|
-
|
5
|
+
let(:rails) { Module.new }
|
6
|
+
let(:logger) { double(:logger) }
|
7
7
|
let(:lineup) { LineUp }
|
8
8
|
|
9
9
|
describe '.config' do
|
@@ -12,22 +12,18 @@ describe LineUp do
|
|
12
12
|
end
|
13
13
|
|
14
14
|
it 'is an STDOUT logger' do
|
15
|
-
Logger.
|
16
|
-
lineup.config.logger.
|
15
|
+
expect(Logger).to receive(:new).with(STDOUT).and_return logger
|
16
|
+
expect(lineup.config.logger).to eq(logger)
|
17
17
|
end
|
18
18
|
|
19
19
|
context 'with Rails' do
|
20
20
|
before do
|
21
|
-
|
22
|
-
Rails
|
23
|
-
end
|
24
|
-
|
25
|
-
after do
|
26
|
-
Object.send(:remove_const, :Rails)
|
21
|
+
allow(rails).to receive(:logger).and_return(logger)
|
22
|
+
stub_const("Rails", rails)
|
27
23
|
end
|
28
24
|
|
29
25
|
it 'is the Rails logger' do
|
30
|
-
lineup.config.logger.
|
26
|
+
expect(lineup.config.logger).to eq(Rails.logger)
|
31
27
|
end
|
32
28
|
end
|
33
29
|
end
|
data/spec/lib/line_up_spec.rb
CHANGED
@@ -6,26 +6,22 @@ describe LineUp do
|
|
6
6
|
let(:job) { :SendEmail }
|
7
7
|
let(:args) { [123, some: :thing] }
|
8
8
|
let(:redis) { $raw_redis }
|
9
|
-
let(:logger) {
|
9
|
+
let(:logger) { double(:logger) }
|
10
10
|
let(:lineup_job) { LineUp::Job.new job, *args }
|
11
11
|
|
12
12
|
let(:lineup) { LineUp }
|
13
13
|
|
14
14
|
describe '.push' do
|
15
|
-
it 'returns true if successful' do
|
16
|
-
lineup.push(application, job, *args).should be_true
|
17
|
-
end
|
18
|
-
|
19
15
|
it 'registers the queue' do
|
20
16
|
lineup.push application, job, *args
|
21
|
-
|
17
|
+
expect(redis.smembers('other_app:resque:queues')).to eq(%w{ send_email })
|
22
18
|
end
|
23
19
|
|
24
20
|
it 'enqueues the job' do
|
25
21
|
lineup.push application, job, *args
|
26
22
|
jobs = redis.lrange('other_app:resque:queue:send_email', 0, -1)
|
27
|
-
jobs.size.
|
28
|
-
MultiJson.load(jobs.first).
|
23
|
+
expect(jobs.size).to eq(1)
|
24
|
+
expect(MultiJson.load(jobs.first)).to eq({ 'class' => 'SendEmail', 'args' => [123, 'some' => 'thing'] })
|
29
25
|
end
|
30
26
|
|
31
27
|
context 'with a Logger' do
|
@@ -34,120 +30,36 @@ describe LineUp do
|
|
34
30
|
end
|
35
31
|
|
36
32
|
it 'logs the enqueueing and returns true' do
|
37
|
-
logger.
|
38
|
-
string.
|
39
|
-
string.
|
40
|
-
string.
|
41
|
-
string.
|
42
|
-
string.
|
43
|
-
end
|
44
|
-
lineup.push(application, job, *args).should be_true
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
context 'when the key for the Queue Set is occupied by the wrong data format' do
|
49
|
-
before do
|
50
|
-
redis.set 'other_app:resque:queues', :anything_but_a_list
|
51
|
-
end
|
52
|
-
|
53
|
-
it 'catches the error and returns false' do
|
54
|
-
Trouble.should_receive(:notify) do |exception, metadata|
|
55
|
-
exception.should be_instance_of Redis::CommandError
|
56
|
-
metadata[:code].should == :enqueue_failed
|
57
|
-
metadata[:application].should == ':otherApp'
|
58
|
-
metadata[:job].should == ':SendEmail'
|
59
|
-
metadata[:args].should == '[123, {:some=>:thing}]'
|
60
|
-
metadata[:caller].should include('line_up_spec.rb')
|
33
|
+
expect(logger).to receive(:debug) do |string|
|
34
|
+
expect(string).to include('LINEUP ENQUEUED')
|
35
|
+
expect(string).to include('line_up_spec.rb')
|
36
|
+
expect(string).to include(':otherApp')
|
37
|
+
expect(string).to include(':SendEmail')
|
38
|
+
expect(string).to include('[123, {:some=>:thing}]')
|
61
39
|
end
|
62
|
-
lineup.push
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
context 'when the key for the List Job Queue is occupied by the wrong data format' do
|
67
|
-
before do
|
68
|
-
redis.set 'other_app:resque:queue:send_email', :anything_but_a_list
|
69
|
-
end
|
70
|
-
|
71
|
-
it 'catches the error and returns false' do
|
72
|
-
Trouble.should_receive(:notify) do |exception, metadata|
|
73
|
-
exception.should be_instance_of Redis::CommandError
|
74
|
-
metadata[:code].should == :enqueue_failed
|
75
|
-
metadata[:application].should == ':otherApp'
|
76
|
-
metadata[:job].should == ':SendEmail'
|
77
|
-
metadata[:args].should == '[123, {:some=>:thing}]'
|
78
|
-
metadata[:caller].should include('line_up_spec.rb')
|
79
|
-
end
|
80
|
-
lineup.push(application, job, *args).should be_false
|
40
|
+
lineup.push application, job, *args
|
81
41
|
end
|
82
42
|
end
|
83
43
|
end
|
84
44
|
|
85
45
|
describe ".queue_length" do
|
86
|
-
|
87
46
|
it "returns the length of the given queue in the given application" do
|
88
47
|
lineup.push(application, job, 1)
|
89
48
|
lineup.push(application, job, 2)
|
90
|
-
lineup.queue_length(application, job).
|
91
|
-
end
|
92
|
-
|
93
|
-
context 'when the key for the List Job Queue is occupied by the wrong data format' do
|
94
|
-
before do
|
95
|
-
redis.set 'other_app:resque:queue:send_email', :anything_but_a_list
|
96
|
-
end
|
97
|
-
|
98
|
-
it 'logs the error' do
|
99
|
-
Trouble.should_receive(:notify) do |exception, metadata|
|
100
|
-
exception.should be_instance_of Redis::CommandError
|
101
|
-
metadata[:code].should == :getting_queue_length_failed
|
102
|
-
metadata[:application].should == ':otherApp'
|
103
|
-
metadata[:job].should == ':SendEmail'
|
104
|
-
metadata[:caller].should include('line_up_spec.rb')
|
105
|
-
end
|
106
|
-
lineup.queue_length(application, job)
|
107
|
-
end
|
108
|
-
|
109
|
-
it "returns false" do
|
110
|
-
lineup.queue_length(application, job).should be_false
|
111
|
-
end
|
49
|
+
expect(lineup.queue_length(application, job)).to eq(2)
|
112
50
|
end
|
113
51
|
end
|
114
52
|
|
115
53
|
describe ".ensure" do
|
116
|
-
|
117
54
|
it "pushes the job if the queue is empty" do
|
118
|
-
lineup.
|
55
|
+
expect(lineup).to receive(:push).with(application, job, *args)
|
119
56
|
lineup.ensure application, job, *args
|
120
57
|
end
|
121
58
|
|
122
59
|
it "does not push the job if the queue already has a job with the same name" do
|
123
60
|
lineup.push application, job, *args
|
124
|
-
lineup.
|
61
|
+
expect(lineup).not_to receive(:push)
|
125
62
|
lineup.ensure application, job, *args
|
126
63
|
end
|
127
64
|
end
|
128
|
-
|
129
|
-
describe ".push_throttled" do
|
130
|
-
|
131
|
-
it "pushes same consecutive job just once" do
|
132
|
-
lineup.should_receive(:push).once
|
133
|
-
lineup.push_throttled application, job, *args
|
134
|
-
lineup.push_throttled application, job, *args
|
135
|
-
end
|
136
|
-
|
137
|
-
it "pushes again when previous identical job has expired" do
|
138
|
-
lineup.should_receive(:push).twice
|
139
|
-
|
140
|
-
lineup.push_throttled application, job, *args
|
141
|
-
redis.del "other_app:resque:throttled:#{lineup_job.checksum}"
|
142
|
-
lineup.push_throttled application, job, *args
|
143
|
-
end
|
144
|
-
|
145
|
-
it "stores throttle with configured ttl" do
|
146
|
-
lineup.push_throttled application, job, *args
|
147
|
-
ttl = redis.ttl "other_app:resque:throttled:#{lineup_job.checksum}"
|
148
|
-
ttl.should == lineup.config.recency_ttl
|
149
|
-
end
|
150
|
-
|
151
|
-
end
|
152
|
-
|
153
65
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,40 +1,16 @@
|
|
1
1
|
require 'redis-namespace'
|
2
2
|
require 'line_up'
|
3
3
|
|
4
|
-
def ensure_class_or_module(full_name, class_or_module)
|
5
|
-
full_name.to_s.split(/::/).inject(Object) do |context, name|
|
6
|
-
begin
|
7
|
-
context.const_get(name)
|
8
|
-
rescue NameError
|
9
|
-
if class_or_module == :class
|
10
|
-
context.const_set(name, Class.new)
|
11
|
-
else
|
12
|
-
context.const_set(name, Module.new)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
def ensure_module(name)
|
19
|
-
ensure_class_or_module(name, :module)
|
20
|
-
end
|
21
|
-
|
22
|
-
def ensure_class(name)
|
23
|
-
ensure_class_or_module(name, :class)
|
24
|
-
end
|
25
|
-
|
26
4
|
RSpec.configure do |config|
|
27
5
|
|
28
6
|
config.before do
|
29
7
|
$raw_redis = Redis.new(db: 14)
|
30
8
|
LineUp.config.redis = Redis::Namespace.new :myapp, redis: $raw_redis
|
31
9
|
LineUp.config.logger = nil
|
32
|
-
Trouble.stub!(:notify)
|
33
10
|
end
|
34
11
|
|
35
12
|
config.after do
|
36
13
|
$raw_redis.flushdb
|
37
14
|
LineUp.reset!
|
38
15
|
end
|
39
|
-
|
40
16
|
end
|
metadata
CHANGED
@@ -1,29 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: line_up
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- bukowskis
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-01-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: trouble
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ">="
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - ">="
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: multi_json
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -66,34 +52,6 @@ dependencies:
|
|
66
52
|
- - ">="
|
67
53
|
- !ruby/object:Gem::Version
|
68
54
|
version: '0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: guard-rspec
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - ">="
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '0'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - ">="
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '0'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: rb-fsevent
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - ">="
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '0'
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - ">="
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '0'
|
97
55
|
description: No more need to maintain two separate redis connections when using namespaces.
|
98
56
|
LineUp does not even need Resque itself.
|
99
57
|
email:
|
@@ -132,8 +90,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
132
90
|
- !ruby/object:Gem::Version
|
133
91
|
version: '0'
|
134
92
|
requirements: []
|
135
|
-
|
136
|
-
rubygems_version: 2.2.2
|
93
|
+
rubygems_version: 3.0.3.1
|
137
94
|
signing_key:
|
138
95
|
specification_version: 4
|
139
96
|
summary: Enqueue Resque Jobs directly via Redis so that you can choose the namespace
|