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.
@@ -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
- require "queue_classic"
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
@@ -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
- ENV['QC_RAILS_DATABASE'] = 'false'
26
- connection = get_connection
27
- assert_raises(MockExpectationError) { connection.verify }
28
- ENV['QC_RAILS_DATABASE'] = 'true'
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::TABLE_NAME} (q_name, method, args, locked_by, locked_at) VALUES ('whatever', 'Kernel.puts', '[\"ok?\"]', 0, (CURRENT_TIMESTAMP))"
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::TABLE_NAME} WHERE locked_at IS NULL"
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
 
@@ -1,4 +1,4 @@
1
- require File.expand_path("../helper.rb", __FILE__)
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::QUEUE + '"')
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
@@ -1,4 +1,4 @@
1
- require File.expand_path("../helper.rb", __FILE__)
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 test_worker_ueses_one_conn
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
- set_database 'postgres:///invalid'
182
-
183
- conn = PG::Connection.connect(dbname: 'queue_classic_test')
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
- conn.close
187
- ensure
188
- reset_database
184
+ conn.close
185
+ end
189
186
  end
190
187
 
191
188
  def test_init_worker_with_database_url
192
- set_database ENV['DATABASE_URL'] || ENV['QC_DATABASE_URL']
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
- worker = QC::Worker.new
195
- QC.enqueue("TestObject.no_args")
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
- set_database nil
205
-
206
- assert_raises(ArgumentError) { QC::Worker.new }
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 set_database(url)
215
- @database_url = ENV['DATABASE_URL']
216
- @qc_database_url = ENV['QC_DATABASE_URL']
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
- end
221
-
222
- def reset_database
223
- ENV['DATABASE_URL'] = @database_url
224
- ENV['QC_DATABASE_URL'] = @qc_database_url
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.1.0
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: 2015-02-17 00:00:00.000000000 Z
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: '0'
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