queue_classic 3.1.0 → 3.2.0.RC1
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/.gitignore +9 -0
- data/.travis.yml +15 -0
- data/CONTRIBUTING.md +17 -0
- data/Gemfile +9 -0
- data/LICENSE.txt +20 -0
- data/README.md +35 -7
- data/Rakefile +14 -0
- data/changelog +146 -0
- data/lib/queue_classic.rb +45 -50
- data/lib/queue_classic/config.rb +85 -0
- data/lib/queue_classic/conn_adapter.rb +8 -1
- data/lib/queue_classic/queue.rb +13 -9
- data/lib/queue_classic/tasks.rb +1 -1
- data/lib/queue_classic/version.rb +3 -0
- data/lib/queue_classic/worker.rb +8 -7
- data/queue_classic.gemspec +24 -0
- data/sql/create_table.sql +6 -4
- data/test/benchmark_test.rb +13 -12
- data/test/config_test.rb +121 -0
- data/test/helper.rb +11 -4
- data/test/helper.sql +25 -0
- data/test/lib/queue_classic_rails_connection_test.rb +4 -4
- data/test/lib/queue_classic_test.rb +9 -2
- data/test/queue_test.rb +65 -2
- data/test/worker_test.rb +26 -34
- metadata +20 -5
data/test/helper.rb
CHANGED
@@ -1,12 +1,9 @@
|
|
1
|
-
$: << File.expand_path("lib")
|
2
|
-
$: << File.expand_path("test")
|
3
|
-
|
4
1
|
require "bundler"
|
5
2
|
Bundler.setup :default, :test
|
6
3
|
|
7
4
|
ENV["DATABASE_URL"] ||= "postgres:///queue_classic_test"
|
8
5
|
|
9
|
-
|
6
|
+
require_relative '../lib/queue_classic'
|
10
7
|
require "stringio"
|
11
8
|
require "minitest/autorun"
|
12
9
|
|
@@ -51,4 +48,14 @@ class QCTest < Minitest::Test
|
|
51
48
|
$stdout = original_stdout
|
52
49
|
end
|
53
50
|
|
51
|
+
def with_env(temporary_environment)
|
52
|
+
original_environment = {}
|
53
|
+
temporary_environment.each do |name, value|
|
54
|
+
original_environment[name] = ENV[name]
|
55
|
+
ENV[name] = value
|
56
|
+
end
|
57
|
+
yield
|
58
|
+
ensure
|
59
|
+
original_environment.each { |name, value| ENV[name] = value }
|
60
|
+
end
|
54
61
|
end
|
data/test/helper.sql
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
DO $$
|
2
|
+
-- Set initial sequence to a large number to test the entire toolchain
|
3
|
+
-- works on integers with higher bits set.
|
4
|
+
DECLARE
|
5
|
+
quoted_name text;
|
6
|
+
quoted_size text;
|
7
|
+
BEGIN
|
8
|
+
-- Find the name of the relevant sequence.
|
9
|
+
--
|
10
|
+
-- pg_get_serial_sequence quotes identifiers as part of its
|
11
|
+
-- behavior.
|
12
|
+
SELECT name
|
13
|
+
INTO STRICT quoted_name
|
14
|
+
FROM pg_get_serial_sequence('queue_classic_jobs', 'id') AS name;
|
15
|
+
|
16
|
+
-- Don't quote, because ALTER SEQUENCE RESTART doesn't like
|
17
|
+
-- general literals, only unquoted numeric literals.
|
18
|
+
SELECT pow(2, 34)::text AS size
|
19
|
+
INTO STRICT quoted_size;
|
20
|
+
|
21
|
+
EXECUTE 'ALTER SEQUENCE ' || quoted_name ||
|
22
|
+
' RESTART ' || quoted_size || ';';
|
23
|
+
END;
|
24
|
+
$$;
|
25
|
+
|
@@ -22,10 +22,10 @@ class QueueClassicRailsConnectionTest < QCTest
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def test_does_not_use_active_record_connection_if_env_var_set
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
25
|
+
with_env 'QC_RAILS_DATABASE' => 'false' do
|
26
|
+
connection = get_connection
|
27
|
+
assert_raises(MockExpectationError) { connection.verify }
|
28
|
+
end
|
29
29
|
end
|
30
30
|
|
31
31
|
private
|
@@ -1,6 +1,13 @@
|
|
1
1
|
require File.expand_path("../../helper.rb", __FILE__)
|
2
2
|
|
3
3
|
class QueueClassicTest < QCTest
|
4
|
+
def test_only_delegate_calls_to_queue_it_understands
|
5
|
+
e = assert_raises(NoMethodError) do
|
6
|
+
QC.probably_not
|
7
|
+
end
|
8
|
+
assert_match "undefined method `probably_not' for QC:Module", e.message
|
9
|
+
end
|
10
|
+
|
4
11
|
def test_default_conn_adapter_default_value
|
5
12
|
assert(QC.default_conn_adapter.is_a?(QC::ConnAdapter))
|
6
13
|
end
|
@@ -17,11 +24,11 @@ class QueueClassicTest < QCTest
|
|
17
24
|
def test_unlock_jobs_of_dead_workers
|
18
25
|
# Insert a locked job
|
19
26
|
adapter = QC::ConnAdapter.new
|
20
|
-
query = "INSERT INTO #{QC
|
27
|
+
query = "INSERT INTO #{QC.table_name} (q_name, method, args, locked_by, locked_at) VALUES ('whatever', 'Kernel.puts', '[\"ok?\"]', 0, (CURRENT_TIMESTAMP))"
|
21
28
|
adapter.execute(query)
|
22
29
|
|
23
30
|
# We should have no unlocked jobs
|
24
|
-
query_locked_jobs = "SELECT * FROM #{QC
|
31
|
+
query_locked_jobs = "SELECT * FROM #{QC.table_name} WHERE locked_at IS NULL"
|
25
32
|
res = adapter.connection.exec(query_locked_jobs)
|
26
33
|
assert_equal(0, res.count)
|
27
34
|
|
data/test/queue_test.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
require_relative 'helper'
|
2
2
|
|
3
3
|
class QueueTest < QCTest
|
4
4
|
|
@@ -28,12 +28,14 @@ class QueueTest < QCTest
|
|
28
28
|
end
|
29
29
|
|
30
30
|
def test_lock_with_future_job_with_enqueue_in
|
31
|
+
now = Time.now
|
31
32
|
QC.enqueue_in(2, "Klass.method")
|
32
33
|
assert_nil QC.lock
|
33
34
|
sleep 2
|
34
35
|
job = QC.lock
|
35
36
|
assert_equal("Klass.method", job[:method])
|
36
37
|
assert_equal([], job[:args])
|
38
|
+
assert_equal((now + 2).to_i, job[:scheduled_at].to_i)
|
37
39
|
end
|
38
40
|
|
39
41
|
def test_lock_with_future_job_with_enqueue_at_with_a_time_object
|
@@ -44,6 +46,7 @@ class QueueTest < QCTest
|
|
44
46
|
job = QC.lock
|
45
47
|
assert_equal("Klass.method", job[:method])
|
46
48
|
assert_equal([], job[:args])
|
49
|
+
assert_equal(future.to_i, job[:scheduled_at].to_i)
|
47
50
|
end
|
48
51
|
|
49
52
|
def test_lock_with_future_job_with_enqueue_at_with_a_float_timestamp
|
@@ -129,9 +132,50 @@ class QueueTest < QCTest
|
|
129
132
|
QC.default_queue = nil
|
130
133
|
end
|
131
134
|
|
135
|
+
def test_multi_threaded_server_can_specified_connection
|
136
|
+
adapter1 = QC::ConnAdapter.new
|
137
|
+
adapter2 = QC::ConnAdapter.new
|
138
|
+
q1 = q2 = nil
|
139
|
+
|
140
|
+
QC.default_conn_adapter = adapter1
|
141
|
+
|
142
|
+
t1 = Thread.new do
|
143
|
+
QC.default_conn_adapter = adapter1
|
144
|
+
q1 = QC::Queue.new('queue1').conn_adapter
|
145
|
+
end
|
146
|
+
|
147
|
+
t2 = Thread.new do
|
148
|
+
QC.default_conn_adapter = adapter2
|
149
|
+
q2 = QC::Queue.new('queue2').conn_adapter
|
150
|
+
end
|
151
|
+
|
152
|
+
t1.join
|
153
|
+
t2.join
|
154
|
+
|
155
|
+
assert_equal adapter1, q1
|
156
|
+
assert_equal adapter2, q2
|
157
|
+
end
|
158
|
+
|
159
|
+
def test_multi_threaded_server_each_thread_acquires_unique_connection
|
160
|
+
q1 = q2 = nil
|
161
|
+
|
162
|
+
t1 = Thread.new do
|
163
|
+
q1 = QC::Queue.new('queue1').conn_adapter
|
164
|
+
end
|
165
|
+
|
166
|
+
t2 = Thread.new do
|
167
|
+
q2 = QC::Queue.new('queue2').conn_adapter
|
168
|
+
end
|
169
|
+
|
170
|
+
t1.join
|
171
|
+
t2.join
|
172
|
+
|
173
|
+
refute_equal q1, q2
|
174
|
+
end
|
175
|
+
|
132
176
|
def test_enqueue_triggers_notify
|
133
177
|
adapter = QC.default_conn_adapter
|
134
|
-
adapter.execute('LISTEN "' + QC
|
178
|
+
adapter.execute('LISTEN "' + QC.queue + '"')
|
135
179
|
adapter.send(:drain_notify)
|
136
180
|
|
137
181
|
msgs = adapter.send(:wait_for_notify, 0.25)
|
@@ -142,4 +186,23 @@ class QueueTest < QCTest
|
|
142
186
|
assert_equal(1, msgs.length)
|
143
187
|
end
|
144
188
|
|
189
|
+
def test_enqueue_returns_job_id
|
190
|
+
enqueued_job = QC.enqueue("Klass.method")
|
191
|
+
locked_job = QC.lock
|
192
|
+
assert_equal enqueued_job, "id" => locked_job[:id]
|
193
|
+
end
|
194
|
+
|
195
|
+
def test_enqueue_in_returns_job_id
|
196
|
+
enqueued_job = QC.enqueue_in(1, "Klass.method")
|
197
|
+
sleep 1
|
198
|
+
locked_job = QC.lock
|
199
|
+
assert_equal enqueued_job, "id" => locked_job[:id]
|
200
|
+
end
|
201
|
+
|
202
|
+
def test_enqueue_at_returns_job_id
|
203
|
+
enqueued_job = QC.enqueue_at(Time.now + 1, "Klass.method")
|
204
|
+
sleep 1
|
205
|
+
locked_job = QC.lock
|
206
|
+
assert_equal enqueued_job, "id" => locked_job[:id]
|
207
|
+
end
|
145
208
|
end
|
data/test/worker_test.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
require_relative 'helper'
|
2
2
|
|
3
3
|
module TestObject
|
4
4
|
extend self
|
@@ -27,7 +27,6 @@ class TestWorker < QC::Worker
|
|
27
27
|
end
|
28
28
|
|
29
29
|
class WorkerTest < QCTest
|
30
|
-
|
31
30
|
def test_work
|
32
31
|
QC.enqueue("TestObject.no_args")
|
33
32
|
worker = TestWorker.new
|
@@ -122,7 +121,7 @@ class WorkerTest < QCTest
|
|
122
121
|
t.join
|
123
122
|
end
|
124
123
|
|
125
|
-
def
|
124
|
+
def test_worker_uses_one_conn
|
126
125
|
skip "This test is broken and needs to be fixed."
|
127
126
|
|
128
127
|
QC.enqueue("TestObject.no_args")
|
@@ -178,50 +177,43 @@ class WorkerTest < QCTest
|
|
178
177
|
end
|
179
178
|
|
180
179
|
def test_init_worker_with_arg
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
QC::Worker.new connection: conn
|
180
|
+
with_database 'postgres:///invalid' do
|
181
|
+
conn = PG::Connection.connect(dbname: 'queue_classic_test')
|
182
|
+
QC::Worker.new connection: conn
|
185
183
|
|
186
|
-
|
187
|
-
|
188
|
-
reset_database
|
184
|
+
conn.close
|
185
|
+
end
|
189
186
|
end
|
190
187
|
|
191
188
|
def test_init_worker_with_database_url
|
192
|
-
|
189
|
+
with_database ENV['DATABASE_URL'] || ENV['QC_DATABASE_URL'] do
|
190
|
+
worker = QC::Worker.new
|
191
|
+
QC.enqueue("TestObject.no_args")
|
192
|
+
worker.lock_job
|
193
193
|
|
194
|
-
|
195
|
-
|
196
|
-
worker.lock_job
|
197
|
-
|
198
|
-
QC.default_conn_adapter.disconnect
|
199
|
-
ensure
|
200
|
-
reset_database
|
194
|
+
QC.default_conn_adapter.disconnect
|
195
|
+
end
|
201
196
|
end
|
202
197
|
|
203
198
|
def test_init_worker_without_conn
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
ensure
|
209
|
-
reset_database
|
199
|
+
with_database nil do
|
200
|
+
assert_raises(ArgumentError) { QC::Worker.new }
|
201
|
+
end
|
210
202
|
end
|
211
203
|
|
212
204
|
private
|
213
205
|
|
214
|
-
def
|
215
|
-
|
216
|
-
|
206
|
+
def with_database(url)
|
207
|
+
original_conn_adapter = QC.default_conn_adapter
|
208
|
+
original_database_url = ENV['DATABASE_URL']
|
209
|
+
original_qc_database_url = ENV['QC_DATABASE_URL']
|
210
|
+
|
217
211
|
ENV['DATABASE_URL'] = ENV['QC_DATABASE_URL'] = url
|
218
|
-
@conn_adapter = QC.default_conn_adapter
|
219
212
|
QC.default_conn_adapter = nil
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
ENV['
|
224
|
-
|
225
|
-
QC.default_conn_adapter = @conn_adapter
|
213
|
+
yield
|
214
|
+
ensure
|
215
|
+
ENV['DATABASE_URL'] = original_database_url
|
216
|
+
ENV['QC_DATABASE_URL'] = original_qc_database_url
|
217
|
+
QC.default_conn_adapter = original_conn_adapter
|
226
218
|
end
|
227
219
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: queue_classic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.2.0.RC1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Smith (♠ ace hacker)
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-01-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pg
|
@@ -38,19 +38,29 @@ executables: []
|
|
38
38
|
extensions: []
|
39
39
|
extra_rdoc_files: []
|
40
40
|
files:
|
41
|
+
- ".gitignore"
|
42
|
+
- ".travis.yml"
|
43
|
+
- CONTRIBUTING.md
|
44
|
+
- Gemfile
|
45
|
+
- LICENSE.txt
|
41
46
|
- README.md
|
47
|
+
- Rakefile
|
48
|
+
- changelog
|
42
49
|
- lib/generators/queue_classic/install_generator.rb
|
43
50
|
- lib/generators/queue_classic/templates/add_queue_classic.rb
|
44
51
|
- lib/generators/queue_classic/templates/update_queue_classic_3_0_0.rb
|
45
52
|
- lib/generators/queue_classic/templates/update_queue_classic_3_0_2.rb
|
46
53
|
- lib/generators/queue_classic/templates/update_queue_classic_3_1_0.rb
|
47
54
|
- lib/queue_classic.rb
|
55
|
+
- lib/queue_classic/config.rb
|
48
56
|
- lib/queue_classic/conn_adapter.rb
|
49
57
|
- lib/queue_classic/queue.rb
|
50
58
|
- lib/queue_classic/railtie.rb
|
51
59
|
- lib/queue_classic/setup.rb
|
52
60
|
- lib/queue_classic/tasks.rb
|
61
|
+
- lib/queue_classic/version.rb
|
53
62
|
- lib/queue_classic/worker.rb
|
63
|
+
- queue_classic.gemspec
|
54
64
|
- sql/create_table.sql
|
55
65
|
- sql/ddl.sql
|
56
66
|
- sql/downgrade_from_3_0_0.sql
|
@@ -59,7 +69,9 @@ files:
|
|
59
69
|
- sql/update_to_3_0_0.sql
|
60
70
|
- sql/update_to_3_1_0.sql
|
61
71
|
- test/benchmark_test.rb
|
72
|
+
- test/config_test.rb
|
62
73
|
- test/helper.rb
|
74
|
+
- test/helper.sql
|
63
75
|
- test/lib/queue_classic_rails_connection_test.rb
|
64
76
|
- test/lib/queue_classic_test.rb
|
65
77
|
- test/queue_test.rb
|
@@ -79,17 +91,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
79
91
|
version: '0'
|
80
92
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
81
93
|
requirements:
|
82
|
-
- - "
|
94
|
+
- - ">"
|
83
95
|
- !ruby/object:Gem::Version
|
84
|
-
version:
|
96
|
+
version: 1.3.1
|
85
97
|
requirements: []
|
86
98
|
rubyforge_project:
|
87
|
-
rubygems_version: 2.4.5
|
99
|
+
rubygems_version: 2.4.5.1
|
88
100
|
signing_key:
|
89
101
|
specification_version: 4
|
90
102
|
summary: Simple, efficient worker queue for Ruby & PostgreSQL.
|
91
103
|
test_files:
|
92
104
|
- test/benchmark_test.rb
|
105
|
+
- test/config_test.rb
|
106
|
+
- test/helper.rb
|
107
|
+
- test/helper.sql
|
93
108
|
- test/lib/queue_classic_rails_connection_test.rb
|
94
109
|
- test/lib/queue_classic_test.rb
|
95
110
|
- test/queue_test.rb
|