class CronZoneConverter::Converter

Attributes

base[R]
crons[R]
local_zone[R]
offset[R]
remote_zone[R]

Public Class Methods

new(line, local_zone = nil, remote_zone = nil) click to toggle source
# File lib/cron_zone_converter/converter.rb, line 8
def initialize(line, local_zone = nil, remote_zone = nil)
  @base = build_base line
  @local_zone = build_local_zone local_zone
  @remote_zone = build_remote_zone remote_zone
  @offset = build_offset
  @crons  = []
end

Public Instance Methods

convert() click to toggle source
# File lib/cron_zone_converter/converter.rb, line 16
def convert
  return [base.original] unless needs_changes?

  split_base
  apply_offset
  merge_similar
  final_lines
end

Private Instance Methods

apply_offset() click to toggle source
# File lib/cron_zone_converter/converter.rb, line 79
def apply_offset
  @crons.map! do |cron|
    day_diff = nil
    hour = (cron.hours.first - offset).to_i

    if hour < 0
      day_diff = -1
      hour     = 24 + hour
    elsif hour > 23
      day_diff = 1
      hour -= 24
    end

    Duplicator.change cron, hour: hour, day_diff: day_diff
  end
end
build_base(line) click to toggle source
# File lib/cron_zone_converter/converter.rb, line 29
def build_base(line)
  ::Fugit::Cron.new(line).tap { |x| raise Error, 'invalid cron line' if x.nil? }
rescue StandardError => e
  raise Error.new('invalid cron line', e)
end
build_local_zone(value) click to toggle source
# File lib/cron_zone_converter/converter.rb, line 35
def build_local_zone(value)
  return value if value.is_a?(ActiveSupport::TimeZone)

  build_string_zone(value) || build_other_zone
end
build_offset() click to toggle source
# File lib/cron_zone_converter/converter.rb, line 60
def build_offset
  # local_zone.now.utc_offset.to_f / 3600
  (local_zone.now.utc_offset.to_f - remote_zone.now.utc_offset.to_f) / 3600
end
build_other_zone() click to toggle source
# File lib/cron_zone_converter/converter.rb, line 53
def build_other_zone
  return ::Time.find_zone(base.timezone.name) if base.timezone
  return Time.zone if Time.zone

  raise Error, 'missing zone'
end
build_remote_zone(value) click to toggle source
# File lib/cron_zone_converter/converter.rb, line 41
def build_remote_zone(value)
  return value if value.is_a?(ActiveSupport::TimeZone)

  build_string_zone(value) || Time.find_zone('UTC')
end
build_string_zone(value) click to toggle source
# File lib/cron_zone_converter/converter.rb, line 47
def build_string_zone(value)
  return false unless value.is_a? String

  ::Time.find_zone(value).tap { |x| raise Error, 'invalid zone' if x.nil? }
end
final_lines() click to toggle source
# File lib/cron_zone_converter/converter.rb, line 100
def final_lines
  @crons.map(&:to_cron_s)
end
merge_similar() click to toggle source
# File lib/cron_zone_converter/converter.rb, line 96
def merge_similar
  @crons = Merger.merge crons
end
needs_changes?() click to toggle source
# File lib/cron_zone_converter/converter.rb, line 65
def needs_changes?
  return false if local_zone.name == remote_zone.name
  return false if base.hours.nil?
  return false if base.original.split(' ')[1] =~ %r{^\*/\d{1,2}$}

  true
end
split_base() click to toggle source
# File lib/cron_zone_converter/converter.rb, line 73
def split_base
  @crons = base.hours.map { |x| Duplicator.change base, hour: x }
  @crons = base.monthdays.map { |x| crons.map { |y| Duplicator.change y, dom: x } }.flatten unless base.monthdays.nil?
  @crons = base.weekdays.map { |x| crons.map { |y| Duplicator.change y, dow: x } }.flatten unless base.weekdays.nil?
end