class Cyclical::YearlyRule

holds daily rule configuration

Public Instance Methods

aligned?(time, base) click to toggle source

check if time is aligned to a base time, including interval check

# File lib/cyclical/rules/yearly_rule.rb, line 8
def aligned?(time, base)
  return false unless (base.year - time.year).to_i % @interval == 0
  return false unless [time.hour, time.min, time.sec] == [base.hour, base.min, base.sec] # the shortest filter we support is for days
  return false unless time.day == base.day || filters(:weekdays) || filters(:monthdays) || filters(:yeardays)
  return false unless time.month == base.month || filters(:yeardays) || filters(:weeks) || filters(:months)

  # wow, passed every test
  true
end
step() click to toggle source

default step of the rule

# File lib/cyclical/rules/yearly_rule.rb, line 19
def step
  @interval.years
end

Private Instance Methods

align(time, base) click to toggle source
# File lib/cyclical/rules/yearly_rule.rb, line 44
def align(time, base)
  day = (day_filters ? time.day : base.day)
  mon = (month_filters ? time.mon : base.mon)

  time = time.beginning_of_year + (mon - 1).months + (day - 1).days

  # compensate crossing DST barrier (oh my...)
  offset = time.beginning_of_day.utc_offset
  time = time.beginning_of_day + base.hour.hours + base.min.minutes + base.sec.seconds
  time += (offset - time.utc_offset)

  time
end
day_filters() click to toggle source
# File lib/cyclical/rules/yearly_rule.rb, line 58
def day_filters
  filters(:weekdays) || filters(:monthdays) || filters(:yeardays)
end
month_filters() click to toggle source
# File lib/cyclical/rules/yearly_rule.rb, line 62
def month_filters
  filters(:weekdays) || filters(:yeardays) || filters(:weeks) || filters(:months)
end
potential_next(current, base) click to toggle source

closest valid date

Calls superclass method Cyclical::Rule#potential_next
# File lib/cyclical/rules/yearly_rule.rb, line 26
def potential_next(current, base)
  candidate = super(current, base)
  return candidate if (base.year - candidate.year).to_i % @interval == 0

  years = ((base.year - candidate.year).to_i % @interval)

  (candidate + years.years).beginning_of_year
end
potential_previous(current, base) click to toggle source
Calls superclass method Cyclical::Rule#potential_previous
# File lib/cyclical/rules/yearly_rule.rb, line 35
def potential_previous(current, base)
  candidate = super(current, base)
  return candidate if (base.year - candidate.year).to_i % @interval == 0

  years = ((base.year - candidate.year).to_i % @interval)

  (candidate + (years - @interval).years).end_of_year
end