class Holidays::Finder::Rules::YearRange
Constants
- BETWEEN
- FROM
- LIMITED
- UNTIL
Public Class Methods
call(target_year, year_range_defs)
click to toggle source
# File lib/holidays/finder/rules/year_range.rb, line 11 def call(target_year, year_range_defs) validate!(target_year, year_range_defs) operator = year_range_defs.keys.first rule_value = year_range_defs[operator] case operator when UNTIL matched = target_year <= rule_value when FROM matched = target_year >= rule_value when LIMITED matched = rule_value.include?(target_year) when BETWEEN matched = rule_value.cover?(target_year) else matched = false end matched end
Private Class Methods
validate!(target_year, year_ranges)
click to toggle source
# File lib/holidays/finder/rules/year_range.rb, line 35 def validate!(target_year, year_ranges) raise ArgumentError.new("target_year must be a number") unless target_year.is_a?(Integer) raise ArgumentError.new("year_ranges cannot be missing") if year_ranges.nil? || year_ranges.empty? raise ArgumentError.new("year_ranges must contain a hash with a single operator") unless year_ranges.is_a?(Hash) && year_ranges.size == 1 operator = year_ranges.keys.first value = year_ranges[operator] raise ArgumentError.new("Invalid operator found: '#{operator}'") unless [UNTIL, FROM, LIMITED, BETWEEN].include?(operator) case operator when UNTIL, FROM raise ArgumentError.new("#{UNTIL} and #{FROM} operator value must be a number, received: '#{value}'") unless value.is_a?(Integer) when LIMITED raise ArgumentError.new(":limited operator value must be an array containing at least one integer value, received: '#{value}'") unless value.is_a?(Array) && value.size >= 1 && value.all? { |v| v.is_a?(Integer) } when BETWEEN raise ArgumentError.new(":between operator value must be a range, received: '#{value}'") unless value.is_a?(Range) end end