rocketjob 3.0.3 → 3.0.4

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: ec9bde80b380f421336e84defb46c1367b1a7ead
4
- data.tar.gz: 34e4de3851b868ddb8e999e10d90c874ee12e839
3
+ metadata.gz: b6cc91f7e665fcbe24f0ff2fd388540e5dc04274
4
+ data.tar.gz: 2c7277a7216c799d0ad59c645a5d3100079bf8f9
5
5
  SHA512:
6
- metadata.gz: 55d9e58c078a3a0f8ee327356b54bd10d8164e4bcc57380e53fcb9d94072ab02bfc0b071371579d1795a291e14b18e149789a5ab5b06b5566fd74be0dac0e0fd
7
- data.tar.gz: 54ade8c803a098df3f809de92900371ca1ea0e68b07bae839ba94f22f50cf4d26530cc2193a6d9c583235e367c98a03621becaf28f11bbdeb606984ef061128c
6
+ metadata.gz: 69f216ca8f7b62df4fd72bae9f8ef5d4bfbdcff166df82ae494ca8986cd9cc0360e5fb1886334697a5144c3c70b34ce054e36ac0ccde66aa009aab6e71a5a727
7
+ data.tar.gz: c600c821b1c881c428930f4f9e9133413205ce87811cd001d3b0ceba8c27455bc131d3d7695582f3e1a802872646f1a34c985297847f55a9ecb2495d93a1bec4
data/Rakefile CHANGED
@@ -1,3 +1,7 @@
1
+ # Setup bundler to avoid having to run bundle exec all the time.
2
+ require 'rubygems'
3
+ require 'bundler/setup'
4
+
1
5
  require 'rake/testtask'
2
6
  require_relative 'lib/rocket_job/version'
3
7
 
@@ -18,4 +22,10 @@ Rake::TestTask.new(:test) do |t|
18
22
  t.warning = false
19
23
  end
20
24
 
21
- task default: :test
25
+ # By default run tests against all appraisals
26
+ if !ENV["APPRAISAL_INITIALIZED"] && !ENV["TRAVIS"]
27
+ require 'appraisal'
28
+ task default: :appraisal
29
+ else
30
+ task default: :test
31
+ end
@@ -78,7 +78,7 @@ module RocketJob
78
78
  # -> :failed -> :active
79
79
  # -> :disabled
80
80
  # -> :disabled -> :active
81
- aasm column: :state do
81
+ aasm column: :state, whiny_persistence: true do
82
82
  # DirmonEntry is `pending` until it is approved
83
83
  state :pending, initial: true
84
84
 
@@ -236,7 +236,7 @@ module RocketJob
236
236
  next if file_name.include?(self.class.default_archive_directory)
237
237
 
238
238
  # Security check?
239
- if (whitelist_paths.size > 0) && whitelist_paths.none? { |whitepath| file_name.start_with?(whitepath) }
239
+ if (whitelist_paths.size > 0) && whitelist_paths.none? { |whitepath| file_name.to_s.start_with?(whitepath) }
240
240
  logger.error "Skipping file: #{file_name} since it is not in any of the whitelisted paths: #{whitelist_paths.join(', ')}"
241
241
  next
242
242
  end
@@ -253,6 +253,12 @@ module RocketJob
253
253
  h
254
254
  end
255
255
 
256
+ # Returns [Boolean] whether the worker runs on a particular server.
257
+ def worker_on_server?(server_name)
258
+ return false unless worker_name.present? && server_name.present?
259
+ worker_name.start_with?(server_name)
260
+ end
261
+
256
262
  end
257
263
  end
258
264
  end
@@ -19,7 +19,7 @@ module RocketJob
19
19
  # -> :aborted
20
20
  # -> :queued (when a worker dies)
21
21
  # -> :aborted
22
- aasm column: :state do
22
+ aasm column: :state, whiny_persistence: true do
23
23
  # Job has been created and is queued for processing ( Initial state )
24
24
  state :queued, initial: true
25
25
 
@@ -76,7 +76,7 @@ module RocketJob
76
76
 
77
77
  event :requeue do
78
78
  transitions from: :running, to: :queued,
79
- if: -> server_name { worker_name.to_s.start_with?(server_name) },
79
+ if: -> server_name { worker_on_server?(server_name) },
80
80
  after: :rocket_job_clear_started_at
81
81
  end
82
82
  end
@@ -169,7 +169,7 @@ module RocketJob
169
169
 
170
170
  # Returns [Hash<String:[Array<ActiveWorker>]>] All servers actively working on this job
171
171
  def rocket_job_active_workers(server_name = nil)
172
- return [] if !running? || (server_name && !worker_name.start_with(server_name))
172
+ return [] if !running? || (server_name && !worker_on_server?(server_name))
173
173
  [ActiveWorker.new(worker_name, started_at, self)]
174
174
  end
175
175
 
@@ -85,7 +85,7 @@ module RocketJob::Plugins::Rufus
85
85
 
86
86
  fail ArgumentError.new(
87
87
  "invalid cronline: '#{line}'"
88
- ) if es && es.find { |e| ! e.is_a?(Fixnum) }
88
+ ) if es && es.find { |e| ! e.is_a?(Integer) }
89
89
  end
90
90
 
91
91
  if @days && @days.include?(0) # gh-221
@@ -517,4 +517,3 @@ module RocketJob::Plugins::Rufus
517
517
  end
518
518
  end
519
519
  end
520
-
@@ -39,7 +39,10 @@ module RocketJob::Plugins::Rufus
39
39
  fail ArgumentError.new(
40
40
  "cannot determine timezone from #{zone.inspect}" +
41
41
  " (etz:#{ENV['TZ'].inspect},tnz:#{Time.now.zone.inspect}," +
42
- "tzid:#{defined?(TZInfo::Data).inspect})"
42
+ "tzid:#{defined?(TZInfo::Data).inspect})\n" +
43
+ "Try setting `ENV['TZ'] = 'Continent/City'` in your script " +
44
+ "(see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)" +
45
+ (defined?(TZInfo::Data) ? '' : " and adding 'tzinfo-data' to your gems")
43
46
  ) unless @zone
44
47
 
45
48
  @time = nil # cache for #to_time result
@@ -277,6 +280,7 @@ module RocketJob::Plugins::Rufus
277
280
  end
278
281
 
279
282
  def self.get_tzone(str)
283
+
280
284
  return str if str.is_a?(::TZInfo::Timezone)
281
285
 
282
286
  # discard quickly when it's certainly not a timezone
@@ -284,10 +288,19 @@ module RocketJob::Plugins::Rufus
284
288
  return nil if str == nil
285
289
  return nil if str == '*'
286
290
 
291
+ ostr = str
292
+ str = :current if str == :local
293
+
294
+ # use Rails' zone by default if Rails is present
295
+
296
+ return Time.zone.tzinfo if (
297
+ ENV['TZ'].nil? && str == :current &&
298
+ Time.respond_to?(:zone) && Time.zone.respond_to?(:tzinfo)
299
+ )
300
+
287
301
  # ok, it's a timezone then
288
302
 
289
- ostr = str
290
- str = ENV['TZ'] || Time.now.zone if str == :current || str == :local
303
+ str = ENV['TZ'] || Time.now.zone if str == :current
291
304
 
292
305
  # utc_offset
293
306
 
@@ -298,7 +311,7 @@ module RocketJob::Plugins::Rufus
298
311
  str = (sc > 0 ? "%s%02d:%02d:%02d" : "%s%02d:%02d") % [ sn, hr, mn, sc ]
299
312
  end
300
313
 
301
- return nil if str.nil? || str.index('#')
314
+ return nil if str.index('#')
302
315
  # counters "sun#2", etc... On OSX would go all the way to true
303
316
 
304
317
  # vanilla time zones
@@ -363,11 +376,14 @@ module RocketJob::Plugins::Rufus
363
376
  ) if hr
364
377
  end
365
378
 
366
- # last try with ENV['TZ']
379
+ # try with ENV['TZ']
367
380
 
368
- z =
369
- (ostr == :local || ostr == :current) &&
370
- (::TZInfo::Timezone.get(ENV['TZ']) rescue nil)
381
+ z = ostr == :current && (::TZInfo::Timezone.get(ENV['TZ']) rescue nil)
382
+ return z if z
383
+
384
+ # ask the system
385
+
386
+ z = ostr == :current && (debian_tz || centos_tz || osx_tz)
371
387
  return z if z
372
388
 
373
389
  # so it's not a timezone.
@@ -375,6 +391,39 @@ module RocketJob::Plugins::Rufus
375
391
  nil
376
392
  end
377
393
 
394
+ def self.debian_tz
395
+
396
+ path = '/etc/timezone'
397
+
398
+ File.exist?(path) &&
399
+ (::TZInfo::Timezone.get(File.read(path).strip) rescue nil)
400
+ end
401
+
402
+ def self.centos_tz
403
+
404
+ path = '/etc/sysconfig/clock'
405
+
406
+ File.open(path, 'rb') do |f|
407
+ until f.eof?
408
+ m = f.readline.match(/ZONE="([^"]+)"/)
409
+ return (::TZInfo::Timezone.get(m[1]) rescue nil) if m
410
+ end
411
+ end if File.exist?(path)
412
+
413
+ nil
414
+ end
415
+
416
+ def self.osx_tz
417
+
418
+ path = '/etc/localtime'
419
+
420
+ return nil unless File.exist?(path)
421
+
422
+ ::TZInfo::Timezone.get(
423
+ File.readlink(path).split('/')[4..-1].join('/')
424
+ ) rescue nil
425
+ end
426
+
378
427
  def self.local_tzone
379
428
 
380
429
  get_tzone(:local)
@@ -61,7 +61,7 @@ module RocketJob
61
61
  # States
62
62
  # :starting -> :running -> :paused
63
63
  # -> :stopping
64
- aasm column: :state do
64
+ aasm column: :state, whiny_persistence: true do
65
65
  state :starting, initial: true
66
66
  state :running
67
67
  state :paused
@@ -1,3 +1,3 @@
1
1
  module RocketJob #:nodoc
2
- VERSION = '3.0.3'
2
+ VERSION = '3.0.4'
3
3
  end
@@ -40,7 +40,7 @@ module RocketJob
40
40
  @shutdown = false
41
41
  end
42
42
  @name = "#{server_name}:#{id}"
43
- @re_check_seconds = re_check_seconds || 60
43
+ @re_check_seconds = (re_check_seconds || 60).to_f
44
44
  @re_check_start = Time.now
45
45
  @filter = filter || {}
46
46
  @current_filter = @filter.dup
@@ -96,15 +96,12 @@ module RocketJob
96
96
  # Process the next available job
97
97
  # Returns [Boolean] whether any job was actually processed
98
98
  def process_available_jobs
99
- # Only clear out the current_filter after every `re_check_seconds`
100
- time = Time.now
101
- if (time - @re_check_start) > re_check_seconds.to_f
102
- @re_check_start = time
103
- self.current_filter = filter.dup
104
- end
105
-
106
99
  processed = false
107
- while (job = Job.rocket_job_next_job(name, current_filter)) && !shutdown?
100
+ while !shutdown?
101
+ reset_filter_if_expired
102
+ job = Job.rocket_job_next_job(name, current_filter)
103
+ break unless job
104
+
108
105
  logger.fast_tag("job:#{job.id}") do
109
106
  unless job.rocket_job_work(self, false, current_filter)
110
107
  processed = true
@@ -114,6 +111,16 @@ module RocketJob
114
111
  processed
115
112
  end
116
113
 
114
+ # Resets the current job filter if the relevant time interval has passed
115
+ def reset_filter_if_expired
116
+ # Only clear out the current_filter after every `re_check_seconds`
117
+ time = Time.now
118
+ if (time - @re_check_start) > re_check_seconds
119
+ @re_check_start = time
120
+ self.current_filter = filter.dup
121
+ end
122
+ end
123
+
117
124
  end
118
125
  end
119
126
 
@@ -12,7 +12,7 @@ module Plugins
12
12
  field :state, type: String
13
13
  validates_presence_of :name, :state
14
14
 
15
- aasm column: :state do
15
+ aasm column: :state, whiny_persistence: true do
16
16
  state :pending, initial: true
17
17
  state :enabled
18
18
 
@@ -31,19 +31,23 @@ module Plugins
31
31
  @doc.destroy if @doc && !@doc.new_record?
32
32
  end
33
33
 
34
- describe '#aasm_write_state' do
34
+ describe '#create!' do
35
35
  it 'raises an exception when a validation fails on create!' do
36
36
  assert_raises Mongoid::Errors::Validations do
37
37
  @doc = Test.create!
38
38
  end
39
39
  end
40
+ end
40
41
 
42
+ describe '#save!' do
41
43
  it 'raises an exception when a validation fails on save' do
42
44
  assert_raises Mongoid::Errors::Validations do
43
45
  @doc.save!
44
46
  end
45
47
  end
48
+ end
46
49
 
50
+ describe '#transition!' do
47
51
  it 'raises an exception when a validation fails on state transition with save' do
48
52
  assert_raises Mongoid::Errors::Validations do
49
53
  @doc.enable!
@@ -51,12 +55,13 @@ module Plugins
51
55
  assert @doc.pending?
52
56
  refute @doc.valid?
53
57
  end
58
+ end
54
59
 
60
+ describe '#transition' do
55
61
  it 'does not raise an exception when a validation fails on state transition without save' do
56
62
  @doc.enable
57
63
  assert @doc.enabled?
58
64
  end
59
-
60
65
  end
61
66
 
62
67
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rocketjob
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.3
4
+ version: 3.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Reid Morrison
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-03-02 00:00:00.000000000 Z
11
+ date: 2017-03-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby