class IceCube::InputAlignment

Attributes

rule[R]
rule_part[R]
value[R]

Public Class Methods

new(rule, value, rule_part) click to toggle source
# File lib/ice_cube/input_alignment.rb, line 4
def initialize(rule, value, rule_part)
  @rule = rule
  @value = value
  @rule_part = rule_part
end

Public Instance Methods

verify(freq, options={}, &block) click to toggle source
# File lib/ice_cube/input_alignment.rb, line 12
def verify(freq, options={}, &block)
  @rule.validations[:interval] or return

  case @rule
  when DailyRule
    verify_wday_alignment(freq, &block)
  when MonthlyRule
    verify_month_alignment(freq, &block)
  else
    verify_freq_alignment(freq, &block)
  end
end

Private Instance Methods

fixed_validations() click to toggle source
# File lib/ice_cube/input_alignment.rb, line 35
def fixed_validations
  @fixed_validations ||= @rule.validations.values.flatten.select { |v|
    interval_type = (v.type == :wday ? :day : v.type)
    v.class < Validations::FixedValue &&
      interval_type == rule.base_interval_validation.type
  }
end
interval_validation() click to toggle source
# File lib/ice_cube/input_alignment.rb, line 27
def interval_validation
  @interval_validation ||= @rule.validations[:interval].first
end
interval_value() click to toggle source
# File lib/ice_cube/input_alignment.rb, line 31
def interval_value
  @interval_value ||= (rule_part == :interval) ? value : interval_validation.interval
end
verify_freq_alignment(freq) { |argument_error| ... } click to toggle source
# File lib/ice_cube/input_alignment.rb, line 43
def verify_freq_alignment(freq)
  interval_validation.type == freq or return
  (last_validation = fixed_validations.min_by(&:value)) or return

  alignment = (value - last_validation.value) % interval_validation.interval
  return if alignment.zero?

  validation_values = fixed_validations.map(&:value).join(', ')
  if rule_part == :interval
    message = "interval(#{value}) " \
              "must be a multiple of " \
              "intervals in #{last_validation.key}(#{validation_values})"
  else
    message = "intervals in #{last_validation.key}(#{validation_values}, #{value}) " \
              "must be multiples of " \
              "interval(#{interval_validation.interval})"
  end

  yield ArgumentError.new(message)
end
verify_month_alignment(_freq) { |argument_error| ... } click to toggle source
# File lib/ice_cube/input_alignment.rb, line 64
def verify_month_alignment(_freq)
  return if interval_value == 1 || (interval_value % 12).zero?
  return if fixed_validations.empty?

  message = "month_of_year can only be used with interval(1) or multiples of interval(12)"

  yield ArgumentError.new(message)
end
verify_wday_alignment(freq) { |argument_error| ... } click to toggle source
# File lib/ice_cube/input_alignment.rb, line 73
def verify_wday_alignment(freq)
  return if interval_value == 1

  if freq == :wday
    return if (interval_value % 7).zero?
    return if Array(@rule.validations[:day]).empty?
    message = "day can only be used with multiples of interval(7)"
  else
    (fixed_validation = fixed_validations.first) or return
    message = "#{fixed_validation.key} can only be used with interval(1)"
  end

  yield ArgumentError.new(message)
end