inst-jobs 0.11.10 → 0.12.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bdf2f15ca59c19c16c8b53114e75e5045bf1d99e
4
- data.tar.gz: 0c4a1922a47c1f8863fee40b07e8d7107cc40c39
3
+ metadata.gz: 6319beb67c1232acefb48870136662c958970b22
4
+ data.tar.gz: 0f4051eda72fa6fe638924b62a35ab6ff7714595
5
5
  SHA512:
6
- metadata.gz: 46668863017e11a8a23c1e4b4b9296544c822018e815bfe108b5fa966e5c517a62290599efff86fae10ce16eed3c84b434c46a35e94886fcaf1b18a44b7c42e6
7
- data.tar.gz: e2f327ea9c7a48258442c4b9c6c0c5907f98e6273e2e7b3c5fe1f1b13c9e58362ede45c62d68c8458a09c13908ff3370671db3ea86fb7c15019d1c7de0bc4fd2
6
+ metadata.gz: 8b69032f63bac4ef84c16812eab90e9ae7cea727545c4cdf3d276bd726715b7f7725f2f22d51e469a3d94815252147bc31263bda9ce9b085344ac63cbd956d06
7
+ data.tar.gz: beda3ba76d7e9314e19464a263ea2a05fdc66866c1672e8049c50e7c7402b38c0ccb1e9272041badf6ea4f7a06d8a789f33b2475037347c05237bdb8932d91fa
@@ -198,7 +198,7 @@ module Delayed
198
198
  end
199
199
  end
200
200
 
201
- def self.get_and_lock_next_available(worker_name,
201
+ def self.get_and_lock_next_available(worker_names,
202
202
  queue = Delayed::Settings.queue,
203
203
  min_priority = nil,
204
204
  max_priority = nil)
@@ -208,16 +208,31 @@ module Delayed
208
208
 
209
209
  loop do
210
210
  jobs = maybe_silence_periodic_log do
211
- find_available(Settings.fetch_batch_size, queue, min_priority, max_priority)
211
+ batch_size = Settings.fetch_batch_size
212
+ batch_size *= worker_names.length if worker_names.is_a?(Array)
213
+ find_available(batch_size, queue, min_priority, max_priority)
212
214
  end
213
215
  return nil if jobs.empty?
214
216
  if Settings.select_random_from_batch
215
217
  jobs = jobs.sort_by { rand }
216
218
  end
217
- job = jobs.detect do |job|
218
- job.send(:lock_exclusively!, worker_name)
219
+ if worker_names.is_a?(Array)
220
+ result = {}
221
+ jobs.each do |job|
222
+ break if worker_names.empty?
223
+ worker_name = worker_names.first
224
+ if job.send(:lock_exclusively!, worker_name)
225
+ result[worker_name] = job
226
+ worker_names.shift
227
+ end
228
+ end
229
+ return result
230
+ else
231
+ job = jobs.detect do |job|
232
+ job.send(:lock_exclusively!, worker_names)
233
+ end
234
+ return job if job
219
235
  end
220
- return job if job
221
236
  end
222
237
  end
223
238
 
@@ -225,11 +225,17 @@ class Job
225
225
 
226
226
  check_queue(queue)
227
227
  check_priorities(min_priority, max_priority)
228
+ if worker_name.is_a?(Array)
229
+ multiple_workers = true
230
+ worker_name = worker_name.first
231
+ end
228
232
 
229
233
  # as an optimization this lua function returns the hash of job attributes,
230
234
  # rather than just a job id, saving a round trip
231
235
  job_attrs = functions.get_and_lock_next_available(worker_name, queue, min_priority, max_priority, db_time_now)
232
- instantiate_from_attrs(job_attrs) # will return nil if the attrs are blank
236
+ job = instantiate_from_attrs(job_attrs) # will return nil if the attrs are blank
237
+ job = { worker_name => job } if multiple_workers
238
+ job
233
239
  end
234
240
 
235
241
  def self.find_available(limit,
@@ -10,7 +10,7 @@ module Delayed
10
10
  :loop => [:worker],
11
11
  :perform => [:worker, :job],
12
12
  :pop => [:worker],
13
- :work_queue_pop => [:work_queue, :worker_name, :worker_config],
13
+ :work_queue_pop => [:work_queue, :worker_config],
14
14
  }
15
15
 
16
16
  def initialize
@@ -1,3 +1,3 @@
1
1
  module Delayed
2
- VERSION = "0.11.10"
2
+ VERSION = "0.12.0"
3
3
  end
@@ -4,7 +4,7 @@ module WorkQueue
4
4
  # queries the queue inline.
5
5
  class InProcess
6
6
  def get_and_lock_next_available(worker_name, worker_config)
7
- Delayed::Worker.lifecycle.run_callbacks(:work_queue_pop, self, worker_name, worker_config) do
7
+ Delayed::Worker.lifecycle.run_callbacks(:work_queue_pop, self, worker_config) do
8
8
  Delayed::Job.get_and_lock_next_available(
9
9
  worker_name,
10
10
  worker_config[:queue],
@@ -81,6 +81,7 @@ class ParentProcess
81
81
  @listen_socket = listen_socket
82
82
  @parent_pid = parent_pid
83
83
  @clients = {}
84
+ @waiting_clients = {}
84
85
  end
85
86
 
86
87
  def connected_clients
@@ -115,10 +116,12 @@ class ParentProcess
115
116
 
116
117
  def run_once
117
118
  handles = @clients.keys + [@listen_socket]
118
- readable, _, _ = IO.select(handles, nil, nil, 1)
119
+ timeout = Settings.sleep_delay + (rand * Settings.sleep_delay_stagger)
120
+ readable, _, _ = IO.select(handles, nil, nil, timeout)
119
121
  if readable
120
122
  readable.each { |s| handle_read(s) }
121
123
  end
124
+ check_for_work
122
125
  end
123
126
 
124
127
  def handle_read(socket)
@@ -132,9 +135,9 @@ class ParentProcess
132
135
  # Any error on the listen socket other than WaitReadable will bubble up
133
136
  # and terminate the work queue process, to be restarted by the parent daemon.
134
137
  def handle_accept
135
- client, _addr = @listen_socket.accept_nonblock
136
- if client
137
- @clients[client] = ClientState.new(false)
138
+ socket, _addr = @listen_socket.accept_nonblock
139
+ if socket
140
+ @clients[socket] = ClientState.new(false, socket)
138
141
  end
139
142
  rescue IO::WaitReadable
140
143
  # ignore and just try accepting again next time through the loop
@@ -146,17 +149,40 @@ class ParentProcess
146
149
  # here forever. This is only a reasonable assumption because we control
147
150
  # the client.
148
151
  worker_name, worker_config = client_timeout { Marshal.load(socket) }
149
- response = nil
150
- Delayed::Worker.lifecycle.run_callbacks(:work_queue_pop, self, worker_name, worker_config) do
151
- response = Delayed::Job.get_and_lock_next_available(
152
- worker_name,
153
- worker_config[:queue],
154
- worker_config[:min_priority],
155
- worker_config[:max_priority])
156
- @clients[socket].working = !response.nil?
157
- end
158
- client_timeout { Marshal.dump(response, socket) }
152
+ client = @clients[socket]
153
+ client.name = worker_name
154
+ client.working = false
155
+ (@waiting_clients[worker_config] ||= []) << client
156
+
159
157
  rescue SystemCallError, IOError, Timeout::Error
158
+ drop_socket(socket)
159
+ end
160
+
161
+ def check_for_work
162
+ @waiting_clients.each do |(worker_config, workers)|
163
+ next if workers.empty?
164
+
165
+ Delayed::Worker.lifecycle.run_callbacks(:work_queue_pop, self, worker_config) do
166
+ response = Delayed::Job.get_and_lock_next_available(
167
+ workers.map(&:name),
168
+ worker_config[:queue],
169
+ worker_config[:min_priority],
170
+ worker_config[:max_priority])
171
+ response.each do |(worker_name, job)|
172
+ client = workers.find { |worker| worker.name == worker_name }
173
+ client.working = true
174
+ @waiting_clients[worker_config].delete(client)
175
+ begin
176
+ client_timeout { Marshal.dump(job, client.socket) }
177
+ rescue SystemCallError, IOError, Timeout::Error
178
+ drop_socket(client.socket)
179
+ end
180
+ end
181
+ end
182
+ end
183
+ end
184
+
185
+ def drop_socket(socket)
160
186
  # this socket went away
161
187
  begin
162
188
  socket.close
@@ -177,7 +203,7 @@ class ParentProcess
177
203
  Timeout.timeout(Settings.parent_process_client_timeout) { yield }
178
204
  end
179
205
 
180
- ClientState = Struct.new(:working)
206
+ ClientState = Struct.new(:working, :socket, :name)
181
207
  end
182
208
  end
183
209
  end
@@ -106,6 +106,7 @@ class Worker
106
106
 
107
107
  def run
108
108
  self.class.lifecycle.run_callbacks(:loop, self) do
109
+ set_process_name("pop:#{Settings.worker_procname_prefix}#{@queue_name}:#{min_priority || 0}:#{max_priority || 'max'}")
109
110
  job = self.class.lifecycle.run_callbacks(:pop, self) do
110
111
  work_queue.get_and_lock_next_available(name, config)
111
112
  end
@@ -243,4 +243,13 @@ describe 'Delayed::Backed::ActiveRecord::Job' do
243
243
  end
244
244
  end
245
245
  end
246
+
247
+ it "allows fetching multiple jobs at once" do
248
+ jobs = 3.times.map { Delayed::Job.create :payload_object => SimpleJob.new }
249
+ locked_jobs = Delayed::Job.get_and_lock_next_available(['worker1', 'worker2'])
250
+ locked_jobs.length.should == 2
251
+ locked_jobs.keys.should == ['worker1', 'worker2']
252
+ locked_jobs.values.should == jobs[0..1]
253
+ jobs.map(&:reload).map(&:locked_by).should == ['worker1', 'worker2', nil]
254
+ end
246
255
  end
@@ -16,7 +16,7 @@ RSpec.describe Delayed::WorkQueue::ParentProcess do
16
16
  let(:subject) { described_class.new }
17
17
  let(:worker_config) { { queue: "queue_name", min_priority: 1, max_priority: 2 } }
18
18
  let(:args) { ["worker_name", worker_config] }
19
- let(:job_args) { ["worker_name", "queue_name", 1, 2] }
19
+ let(:job_args) { [["worker_name"], "queue_name", 1, 2] }
20
20
 
21
21
  it 'generates a server listening on a valid unix socket' do
22
22
  server = subject.server
@@ -90,9 +90,45 @@ RSpec.describe Delayed::WorkQueue::ParentProcess do
90
90
  client = Socket.unix(subject.listen_socket.local_address.unix_path)
91
91
  subject.run_once
92
92
 
93
- expect(Delayed::Job).to receive(:get_and_lock_next_available).with(*job_args).and_return(job)
93
+ expect(Delayed::Job).to receive(:get_and_lock_next_available).with(*job_args).and_return('worker_name' => job)
94
94
  Marshal.dump(args, client)
95
95
  subject.run_once
96
+ expect(client).to be_ready
97
+ expect(Marshal.load(client)).to eq(job)
98
+ end
99
+
100
+ it 'can pop multiple jobs at once' do
101
+ client1 = Socket.unix(subject.listen_socket.local_address.unix_path)
102
+ subject.run_once
103
+ client2 = Socket.unix(subject.listen_socket.local_address.unix_path)
104
+ subject.run_once
105
+
106
+ job_args = [["worker_name1", "worker_name2"], "queue_name", 1, 2]
107
+ jobs = { 'worker_name1' => :job1, 'worker_name2' => :job2 }
108
+
109
+ expect(Delayed::Job).to receive(:get_and_lock_next_available).with(*job_args).and_return(jobs)
110
+ Marshal.dump(["worker_name1", worker_config], client1)
111
+ Marshal.dump(["worker_name2", worker_config], client2)
112
+ subject.run_once
113
+ expect(Marshal.load(client1)).to eq(:job1)
114
+ expect(Marshal.load(client2)).to eq(:job2)
115
+ end
116
+
117
+ it "doesn't respond immediately if there are no jobs available" do
118
+ client = Socket.unix(subject.listen_socket.local_address.unix_path)
119
+ subject.run_once
120
+
121
+ expect(Delayed::Job).to receive(:get_and_lock_next_available).with(*job_args).and_return({}).ordered
122
+ Marshal.dump(args, client)
123
+ subject.run_once
124
+ expect(client).not_to be_ready
125
+
126
+ # next time around, return the result
127
+ expect(Delayed::Job).to receive(:get_and_lock_next_available).with(*job_args).and_return('worker_name' => job).ordered
128
+ allow(Delayed::Settings).to receive(:sleep_delay).and_return(0)
129
+ allow(Delayed::Settings).to receive(:sleep_delay_stagger).and_return(0)
130
+ subject.run_once
131
+ expect(client).to be_ready
96
132
  expect(Marshal.load(client)).to eq(job)
97
133
  end
98
134
 
@@ -124,12 +160,12 @@ RSpec.describe Delayed::WorkQueue::ParentProcess do
124
160
  subject.run_once
125
161
  expect(subject.all_workers_idle?).to be(true)
126
162
 
127
- expect(Delayed::Job).to receive(:get_and_lock_next_available).with(*job_args).and_return(job)
163
+ expect(Delayed::Job).to receive(:get_and_lock_next_available).with(*job_args).and_return('worker_name' => job)
128
164
  Marshal.dump(args, client)
129
165
  subject.run_once
130
166
  expect(subject.all_workers_idle?).to be(false)
131
167
 
132
- expect(Delayed::Job).to receive(:get_and_lock_next_available).with(*job_args).and_return(nil)
168
+ expect(Delayed::Job).to receive(:get_and_lock_next_available).with(*job_args).and_return({})
133
169
  Marshal.dump(args, client)
134
170
  subject.run_once
135
171
  expect(subject.all_workers_idle?).to be(true)
@@ -143,7 +179,7 @@ RSpec.describe Delayed::WorkQueue::ParentProcess do
143
179
  Delayed::Worker.lifecycle.around(:work_queue_pop) do |queue, &cb|
144
180
  expect(subject.all_workers_idle?).to be(true)
145
181
  expect(queue).to eq(subject)
146
- expect(Delayed::Job).to receive(:get_and_lock_next_available).with(*job_args).and_return(job)
182
+ expect(Delayed::Job).to receive(:get_and_lock_next_available).with(*job_args).and_return('worker_name' => job)
147
183
  called = true
148
184
  res = cb.call(queue)
149
185
  expect(subject.all_workers_idle?).to be(false)
@@ -137,4 +137,14 @@ describe 'Delayed::Backend::Redis::Job' do
137
137
  end
138
138
  end
139
139
  end
140
+
141
+ it "allows the API for fetching multiple jobs at once" do
142
+ jobs = 3.times.map { Delayed::Job.create :payload_object => SimpleJob.new }
143
+ locked_jobs = Delayed::Job.get_and_lock_next_available(['worker1', 'worker2'])
144
+ locked_jobs.length.should == 1
145
+ locked_jobs.keys.should == ['worker1']
146
+ jobs.map(&:id).should be_include(locked_jobs.values.first.id)
147
+ jobs.map { |j| Delayed::Job.find(j.id).locked_by }.compact.should == ['worker1']
148
+ end
149
+
140
150
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: inst-jobs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.10
4
+ version: 0.12.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tobias Luetke
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-01-25 00:00:00.000000000 Z
12
+ date: 2017-02-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: after_transaction_commit
@@ -31,14 +31,14 @@ dependencies:
31
31
  requirements:
32
32
  - - ">="
33
33
  - !ruby/object:Gem::Version
34
- version: '3.2'
34
+ version: '4.2'
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
39
  - - ">="
40
40
  - !ruby/object:Gem::Version
41
- version: '3.2'
41
+ version: '4.2'
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: rufus-scheduler
44
44
  requirement: !ruby/object:Gem::Requirement
@@ -341,12 +341,6 @@ files:
341
341
  - spec/delayed/work_queue/in_process_spec.rb
342
342
  - spec/delayed/work_queue/parent_process_spec.rb
343
343
  - spec/delayed/worker_spec.rb
344
- - spec/gemfiles/32.gemfile
345
- - spec/gemfiles/32.gemfile.lock
346
- - spec/gemfiles/40.gemfile
347
- - spec/gemfiles/40.gemfile.lock
348
- - spec/gemfiles/41.gemfile
349
- - spec/gemfiles/41.gemfile.lock
350
344
  - spec/gemfiles/42.gemfile
351
345
  - spec/gemfiles/42.gemfile.lock
352
346
  - spec/gemfiles/50.gemfile
@@ -373,7 +367,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
373
367
  requirements:
374
368
  - - ">="
375
369
  - !ruby/object:Gem::Version
376
- version: '2.0'
370
+ version: '2.3'
377
371
  required_rubygems_version: !ruby/object:Gem::Requirement
378
372
  requirements:
379
373
  - - ">="
@@ -394,12 +388,6 @@ test_files:
394
388
  - spec/delayed/work_queue/in_process_spec.rb
395
389
  - spec/delayed/work_queue/parent_process_spec.rb
396
390
  - spec/delayed/worker_spec.rb
397
- - spec/gemfiles/32.gemfile
398
- - spec/gemfiles/32.gemfile.lock
399
- - spec/gemfiles/40.gemfile
400
- - spec/gemfiles/40.gemfile.lock
401
- - spec/gemfiles/41.gemfile
402
- - spec/gemfiles/41.gemfile.lock
403
391
  - spec/gemfiles/42.gemfile
404
392
  - spec/gemfiles/42.gemfile.lock
405
393
  - spec/gemfiles/50.gemfile
@@ -1,6 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- gemspec :path=>"../../"
4
-
5
- gem "rails", "~> 3.2.19"
6
-
@@ -1,160 +0,0 @@
1
- PATH
2
- remote: ../..
3
- specs:
4
- inst-jobs (0.11.9)
5
- after_transaction_commit (~> 1.0)
6
- rails (>= 3.2)
7
- redis (> 3.0)
8
- redis-scripting (~> 1.0.1)
9
- rufus-scheduler (~> 3.3.2)
10
-
11
- GEM
12
- remote: https://rubygems.org/
13
- specs:
14
- actionmailer (3.2.22.5)
15
- actionpack (= 3.2.22.5)
16
- mail (~> 2.5.4)
17
- actionpack (3.2.22.5)
18
- activemodel (= 3.2.22.5)
19
- activesupport (= 3.2.22.5)
20
- builder (~> 3.0.0)
21
- erubis (~> 2.7.0)
22
- journey (~> 1.0.4)
23
- rack (~> 1.4.5)
24
- rack-cache (~> 1.2)
25
- rack-test (~> 0.6.1)
26
- sprockets (~> 2.2.1)
27
- activemodel (3.2.22.5)
28
- activesupport (= 3.2.22.5)
29
- builder (~> 3.0.0)
30
- activerecord (3.2.22.5)
31
- activemodel (= 3.2.22.5)
32
- activesupport (= 3.2.22.5)
33
- arel (~> 3.0.2)
34
- tzinfo (~> 0.3.29)
35
- activeresource (3.2.22.5)
36
- activemodel (= 3.2.22.5)
37
- activesupport (= 3.2.22.5)
38
- activesupport (3.2.22.5)
39
- i18n (~> 0.6, >= 0.6.4)
40
- multi_json (~> 1.0)
41
- after_transaction_commit (1.0.1)
42
- activerecord (>= 3.2)
43
- arel (3.0.3)
44
- backports (3.6.8)
45
- builder (3.0.4)
46
- bump (0.5.3)
47
- coderay (1.1.1)
48
- database_cleaner (1.3.0)
49
- diff-lcs (1.3)
50
- erubis (2.7.0)
51
- hike (1.2.3)
52
- i18n (0.7.0)
53
- journey (1.0.4)
54
- json (1.8.6)
55
- mail (2.5.4)
56
- mime-types (~> 1.16)
57
- treetop (~> 1.4.8)
58
- method_source (0.8.2)
59
- mime-types (1.25.1)
60
- multi_json (1.12.1)
61
- pg (0.19.0)
62
- polyglot (0.3.5)
63
- pry (0.10.4)
64
- coderay (~> 1.1.0)
65
- method_source (~> 0.8.1)
66
- slop (~> 3.4)
67
- rack (1.4.7)
68
- rack-cache (1.7.0)
69
- rack (>= 0.4)
70
- rack-protection (1.5.3)
71
- rack
72
- rack-ssl (1.3.4)
73
- rack
74
- rack-test (0.6.3)
75
- rack (>= 1.0)
76
- rails (3.2.22.5)
77
- actionmailer (= 3.2.22.5)
78
- actionpack (= 3.2.22.5)
79
- activerecord (= 3.2.22.5)
80
- activeresource (= 3.2.22.5)
81
- activesupport (= 3.2.22.5)
82
- bundler (~> 1.0)
83
- railties (= 3.2.22.5)
84
- railties (3.2.22.5)
85
- actionpack (= 3.2.22.5)
86
- activesupport (= 3.2.22.5)
87
- rack-ssl (~> 1.3.2)
88
- rake (>= 0.8.7)
89
- rdoc (~> 3.4)
90
- thor (>= 0.14.6, < 2.0)
91
- rake (12.0.0)
92
- rdoc (3.12.2)
93
- json (~> 1.4)
94
- redis (3.3.3)
95
- redis-scripting (1.0.1)
96
- redis (>= 3.0)
97
- rspec (3.4.0)
98
- rspec-core (~> 3.4.0)
99
- rspec-expectations (~> 3.4.0)
100
- rspec-mocks (~> 3.4.0)
101
- rspec-core (3.4.4)
102
- rspec-support (~> 3.4.0)
103
- rspec-expectations (3.4.0)
104
- diff-lcs (>= 1.2.0, < 2.0)
105
- rspec-support (~> 3.4.0)
106
- rspec-mocks (3.4.1)
107
- diff-lcs (>= 1.2.0, < 2.0)
108
- rspec-support (~> 3.4.0)
109
- rspec-support (3.4.1)
110
- rufus-scheduler (3.3.2)
111
- tzinfo
112
- sinatra (1.4.6)
113
- rack (~> 1.4)
114
- rack-protection (~> 1.4)
115
- tilt (>= 1.3, < 3)
116
- sinatra-contrib (1.4.7)
117
- backports (>= 2.0)
118
- multi_json
119
- rack-protection
120
- rack-test
121
- sinatra (~> 1.4.0)
122
- tilt (>= 1.3, < 3)
123
- slop (3.6.0)
124
- sprockets (2.2.3)
125
- hike (~> 1.2)
126
- multi_json (~> 1.0)
127
- rack (~> 1.0)
128
- tilt (~> 1.1, != 1.3.0)
129
- test_after_commit (0.4.1)
130
- activerecord (>= 3.2)
131
- thor (0.19.4)
132
- tilt (1.4.1)
133
- timecop (0.7.1)
134
- treetop (1.4.15)
135
- polyglot
136
- polyglot (>= 0.3.1)
137
- tzinfo (0.3.52)
138
- wwtd (1.3.0)
139
-
140
- PLATFORMS
141
- ruby
142
-
143
- DEPENDENCIES
144
- bump
145
- database_cleaner (= 1.3.0)
146
- inst-jobs!
147
- pg
148
- pry
149
- rack-test
150
- rails (~> 3.2.19)
151
- rake
152
- rspec (= 3.4.0)
153
- sinatra
154
- sinatra-contrib
155
- test_after_commit (= 0.4.1)
156
- timecop (= 0.7.1)
157
- wwtd (~> 1.3.0)
158
-
159
- BUNDLED WITH
160
- 1.14.3
@@ -1,5 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- gemspec :path=>"../../"
4
-
5
- gem "rails", "~> 4.0.10"
@@ -1,147 +0,0 @@
1
- PATH
2
- remote: ../..
3
- specs:
4
- inst-jobs (0.11.6)
5
- after_transaction_commit (~> 1.0)
6
- rails (>= 3.2)
7
- redis (> 3.0)
8
- redis-scripting (~> 1.0.1)
9
- rufus-scheduler (~> 3.2.0)
10
-
11
- GEM
12
- remote: https://rubygems.org/
13
- specs:
14
- actionmailer (4.0.13)
15
- actionpack (= 4.0.13)
16
- mail (~> 2.5, >= 2.5.4)
17
- actionpack (4.0.13)
18
- activesupport (= 4.0.13)
19
- builder (~> 3.1.0)
20
- erubis (~> 2.7.0)
21
- rack (~> 1.5.2)
22
- rack-test (~> 0.6.2)
23
- activemodel (4.0.13)
24
- activesupport (= 4.0.13)
25
- builder (~> 3.1.0)
26
- activerecord (4.0.13)
27
- activemodel (= 4.0.13)
28
- activerecord-deprecated_finders (~> 1.0.2)
29
- activesupport (= 4.0.13)
30
- arel (~> 4.0.0)
31
- activerecord-deprecated_finders (1.0.4)
32
- activesupport (4.0.13)
33
- i18n (~> 0.6, >= 0.6.9)
34
- minitest (~> 4.2)
35
- multi_json (~> 1.3)
36
- thread_safe (~> 0.1)
37
- tzinfo (~> 0.3.37)
38
- after_transaction_commit (1.1.0)
39
- activerecord (>= 4.0)
40
- arel (4.0.2)
41
- backports (3.6.8)
42
- builder (3.1.4)
43
- bump (0.5.3)
44
- coderay (1.1.1)
45
- concurrent-ruby (1.0.4)
46
- database_cleaner (1.3.0)
47
- diff-lcs (1.3)
48
- erubis (2.7.0)
49
- i18n (0.7.0)
50
- mail (2.6.4)
51
- mime-types (>= 1.16, < 4)
52
- method_source (0.8.2)
53
- mime-types (3.1)
54
- mime-types-data (~> 3.2015)
55
- mime-types-data (3.2016.0521)
56
- minitest (4.7.5)
57
- multi_json (1.12.1)
58
- pg (0.19.0)
59
- pry (0.10.4)
60
- coderay (~> 1.1.0)
61
- method_source (~> 0.8.1)
62
- slop (~> 3.4)
63
- rack (1.5.5)
64
- rack-protection (1.5.3)
65
- rack
66
- rack-test (0.6.3)
67
- rack (>= 1.0)
68
- rails (4.0.13)
69
- actionmailer (= 4.0.13)
70
- actionpack (= 4.0.13)
71
- activerecord (= 4.0.13)
72
- activesupport (= 4.0.13)
73
- bundler (>= 1.3.0, < 2.0)
74
- railties (= 4.0.13)
75
- sprockets-rails (~> 2.0)
76
- railties (4.0.13)
77
- actionpack (= 4.0.13)
78
- activesupport (= 4.0.13)
79
- rake (>= 0.8.7)
80
- thor (>= 0.18.1, < 2.0)
81
- rake (12.0.0)
82
- redis (3.3.3)
83
- redis-scripting (1.0.1)
84
- redis (>= 3.0)
85
- rspec (3.4.0)
86
- rspec-core (~> 3.4.0)
87
- rspec-expectations (~> 3.4.0)
88
- rspec-mocks (~> 3.4.0)
89
- rspec-core (3.4.4)
90
- rspec-support (~> 3.4.0)
91
- rspec-expectations (3.4.0)
92
- diff-lcs (>= 1.2.0, < 2.0)
93
- rspec-support (~> 3.4.0)
94
- rspec-mocks (3.4.1)
95
- diff-lcs (>= 1.2.0, < 2.0)
96
- rspec-support (~> 3.4.0)
97
- rspec-support (3.4.1)
98
- rufus-scheduler (3.2.2)
99
- sinatra (1.4.7)
100
- rack (~> 1.5)
101
- rack-protection (~> 1.4)
102
- tilt (>= 1.3, < 3)
103
- sinatra-contrib (1.4.7)
104
- backports (>= 2.0)
105
- multi_json
106
- rack-protection
107
- rack-test
108
- sinatra (~> 1.4.0)
109
- tilt (>= 1.3, < 3)
110
- slop (3.6.0)
111
- sprockets (3.7.1)
112
- concurrent-ruby (~> 1.0)
113
- rack (> 1, < 3)
114
- sprockets-rails (2.3.3)
115
- actionpack (>= 3.0)
116
- activesupport (>= 3.0)
117
- sprockets (>= 2.8, < 4.0)
118
- test_after_commit (0.4.1)
119
- activerecord (>= 3.2)
120
- thor (0.19.4)
121
- thread_safe (0.3.5)
122
- tilt (2.0.5)
123
- timecop (0.7.1)
124
- tzinfo (0.3.52)
125
- wwtd (1.3.0)
126
-
127
- PLATFORMS
128
- ruby
129
-
130
- DEPENDENCIES
131
- bump
132
- database_cleaner (= 1.3.0)
133
- inst-jobs!
134
- pg
135
- pry
136
- rack-test
137
- rails (~> 4.0.10)
138
- rake
139
- rspec (= 3.4.0)
140
- sinatra
141
- sinatra-contrib
142
- test_after_commit (= 0.4.1)
143
- timecop (= 0.7.1)
144
- wwtd (~> 1.3.0)
145
-
146
- BUNDLED WITH
147
- 1.14.3
@@ -1,5 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- gemspec :path=>"../../"
4
-
5
- gem "rails", "~> 4.1.6"
@@ -1,153 +0,0 @@
1
- PATH
2
- remote: ../..
3
- specs:
4
- inst-jobs (0.11.6)
5
- after_transaction_commit (~> 1.0)
6
- rails (>= 3.2)
7
- redis (> 3.0)
8
- redis-scripting (~> 1.0.1)
9
- rufus-scheduler (~> 3.2.0)
10
-
11
- GEM
12
- remote: https://rubygems.org/
13
- specs:
14
- actionmailer (4.1.16)
15
- actionpack (= 4.1.16)
16
- actionview (= 4.1.16)
17
- mail (~> 2.5, >= 2.5.4)
18
- actionpack (4.1.16)
19
- actionview (= 4.1.16)
20
- activesupport (= 4.1.16)
21
- rack (~> 1.5.2)
22
- rack-test (~> 0.6.2)
23
- actionview (4.1.16)
24
- activesupport (= 4.1.16)
25
- builder (~> 3.1)
26
- erubis (~> 2.7.0)
27
- activemodel (4.1.16)
28
- activesupport (= 4.1.16)
29
- builder (~> 3.1)
30
- activerecord (4.1.16)
31
- activemodel (= 4.1.16)
32
- activesupport (= 4.1.16)
33
- arel (~> 5.0.0)
34
- activesupport (4.1.16)
35
- i18n (~> 0.6, >= 0.6.9)
36
- json (~> 1.7, >= 1.7.7)
37
- minitest (~> 5.1)
38
- thread_safe (~> 0.1)
39
- tzinfo (~> 1.1)
40
- after_transaction_commit (1.1.0)
41
- activerecord (>= 4.0)
42
- arel (5.0.1.20140414130214)
43
- backports (3.6.8)
44
- builder (3.2.3)
45
- bump (0.5.3)
46
- coderay (1.1.1)
47
- concurrent-ruby (1.0.4)
48
- database_cleaner (1.3.0)
49
- diff-lcs (1.3)
50
- erubis (2.7.0)
51
- i18n (0.7.0)
52
- json (1.8.6)
53
- mail (2.6.4)
54
- mime-types (>= 1.16, < 4)
55
- method_source (0.8.2)
56
- mime-types (3.1)
57
- mime-types-data (~> 3.2015)
58
- mime-types-data (3.2016.0521)
59
- minitest (5.10.1)
60
- multi_json (1.12.1)
61
- pg (0.19.0)
62
- pry (0.10.4)
63
- coderay (~> 1.1.0)
64
- method_source (~> 0.8.1)
65
- slop (~> 3.4)
66
- rack (1.5.5)
67
- rack-protection (1.5.3)
68
- rack
69
- rack-test (0.6.3)
70
- rack (>= 1.0)
71
- rails (4.1.16)
72
- actionmailer (= 4.1.16)
73
- actionpack (= 4.1.16)
74
- actionview (= 4.1.16)
75
- activemodel (= 4.1.16)
76
- activerecord (= 4.1.16)
77
- activesupport (= 4.1.16)
78
- bundler (>= 1.3.0, < 2.0)
79
- railties (= 4.1.16)
80
- sprockets-rails (~> 2.0)
81
- railties (4.1.16)
82
- actionpack (= 4.1.16)
83
- activesupport (= 4.1.16)
84
- rake (>= 0.8.7)
85
- thor (>= 0.18.1, < 2.0)
86
- rake (12.0.0)
87
- redis (3.3.3)
88
- redis-scripting (1.0.1)
89
- redis (>= 3.0)
90
- rspec (3.4.0)
91
- rspec-core (~> 3.4.0)
92
- rspec-expectations (~> 3.4.0)
93
- rspec-mocks (~> 3.4.0)
94
- rspec-core (3.4.4)
95
- rspec-support (~> 3.4.0)
96
- rspec-expectations (3.4.0)
97
- diff-lcs (>= 1.2.0, < 2.0)
98
- rspec-support (~> 3.4.0)
99
- rspec-mocks (3.4.1)
100
- diff-lcs (>= 1.2.0, < 2.0)
101
- rspec-support (~> 3.4.0)
102
- rspec-support (3.4.1)
103
- rufus-scheduler (3.2.2)
104
- sinatra (1.4.7)
105
- rack (~> 1.5)
106
- rack-protection (~> 1.4)
107
- tilt (>= 1.3, < 3)
108
- sinatra-contrib (1.4.7)
109
- backports (>= 2.0)
110
- multi_json
111
- rack-protection
112
- rack-test
113
- sinatra (~> 1.4.0)
114
- tilt (>= 1.3, < 3)
115
- slop (3.6.0)
116
- sprockets (3.7.1)
117
- concurrent-ruby (~> 1.0)
118
- rack (> 1, < 3)
119
- sprockets-rails (2.3.3)
120
- actionpack (>= 3.0)
121
- activesupport (>= 3.0)
122
- sprockets (>= 2.8, < 4.0)
123
- test_after_commit (0.4.1)
124
- activerecord (>= 3.2)
125
- thor (0.19.4)
126
- thread_safe (0.3.5)
127
- tilt (2.0.5)
128
- timecop (0.7.1)
129
- tzinfo (1.2.2)
130
- thread_safe (~> 0.1)
131
- wwtd (1.3.0)
132
-
133
- PLATFORMS
134
- ruby
135
-
136
- DEPENDENCIES
137
- bump
138
- database_cleaner (= 1.3.0)
139
- inst-jobs!
140
- pg
141
- pry
142
- rack-test
143
- rails (~> 4.1.6)
144
- rake
145
- rspec (= 3.4.0)
146
- sinatra
147
- sinatra-contrib
148
- test_after_commit (= 0.4.1)
149
- timecop (= 0.7.1)
150
- wwtd (~> 1.3.0)
151
-
152
- BUNDLED WITH
153
- 1.14.3