class CronZoneConverter::Duplicator

Attributes

base[R]
changes[R]
parts[R]

Public Class Methods

change(base, changes = {}) click to toggle source
# File lib/cron_zone_converter/duplicator.rb, line 5
def self.change(base, changes = {})
  new(base, changes).change
end
new(base, changes = {}) click to toggle source
# File lib/cron_zone_converter/duplicator.rb, line 9
def initialize(base, changes = {})
  @base    = ::Fugit::Cron.new base
  @changes = changes
  @parts   = @base.to_h
end

Public Instance Methods

change() click to toggle source
# File lib/cron_zone_converter/duplicator.rb, line 15
def change
  return base.dup if changes.empty?

  update_hours
  update_weekdays
  update_monthdays

  ::Fugit::Cron.new line
end

Private Instance Methods

line() click to toggle source
# File lib/cron_zone_converter/duplicator.rb, line 62
def line
  [
    parts[:seconds] == [0] ? nil : (parts[:seconds] || ['*']).join(','),
    (parts[:minutes] || ['*']).join(','),
    (parts[:hours] || ['*']).join(','),
    (parts[:monthdays] || ['*']).join(','),
    (parts[:months] || ['*']).join(','),
    (parts[:weekdays] || [['*']]).map { |d| d.compact.join('#') }.join(','),
    base.zone
  ].compact.join(' ')
end
update_hours() click to toggle source
# File lib/cron_zone_converter/duplicator.rb, line 29
def update_hours
  parts[:hours] = [changes[:hour]] if changes[:hour]
  parts[:hours] = changes[:hours] if changes[:hours]
  parts[:hours] = parts[:hours] + [changes[:add_hour]] if changes[:add_hour]
end
update_monthdays() click to toggle source
# File lib/cron_zone_converter/duplicator.rb, line 48
def update_monthdays
  parts[:monthdays] = [[changes[:dom]]] if changes[:dom]
  parts[:monthdays] = (parts[:monthdays] || []) + [changes[:add_dom]] if changes[:add_dom]
  return unless changes[:day_diff]

  parts[:monthdays]&.map! do |x|
    v = x + changes[:day_diff]
    raise Error, 'cannot change month' if v < 0

    v = 31 if v > 31
    v
  end
end
update_weekdays() click to toggle source
# File lib/cron_zone_converter/duplicator.rb, line 35
def update_weekdays
  parts[:weekdays] = [[changes[:dow]]] if changes[:dow]
  parts[:weekdays] = parts[:weekdays] + [[changes[:add_dow]]] if changes[:add_dow]
  return unless changes[:day_diff]

  parts[:weekdays]&.map! do |x|
    v = x.first + changes[:day_diff]
    v -= 6 if v > 6
    v = 6 + v if v < 0
    [v]
  end
end