class Holidays::UseCase::Context::DatesDriverBuilder

Public Instance Methods

build(dates_driver = {}, date) click to toggle source
# File lib/holidays/use_case/context/dates_driver_builder.rb, line 18
def build(dates_driver = {}, date)
  raise ArgumentError unless dates_driver
  raise ArgumentError unless date
  dates_driver[date.year] = [] unless dates_driver[date.year]
  dates_driver[date.year] << date.month
  dates_driver = add_border_months(date, dates_driver)
end
call(start_date, end_date) click to toggle source
# File lib/holidays/use_case/context/dates_driver_builder.rb, line 11
def call(start_date, end_date)
  dates_driver = {}

  (start_date..end_date).map{|current_date|build(dates_driver, current_date)}
  clean(dates_driver)
end

Private Instance Methods

add_border_months(current_date, dates_driver) click to toggle source

As part of github.com/holidays/holidays/issues/146 I am returning additional months in an attempt to catch month-spanning date situations (i.e. dates falling on 2/1 but being observed on 1/31). By including the additional months we are increasing runtimes slightly but improving accuracy, which is more important to me at this stage.

# File lib/holidays/use_case/context/dates_driver_builder.rb, line 33
def add_border_months(current_date, dates_driver)
  if current_date.month == 1
    dates_driver[current_date.year] << 2

    prev_year = current_date.year - 1
    dates_driver[prev_year] = [] unless dates_driver[prev_year]
    dates_driver[prev_year] << 12
  elsif current_date.month == 12
    dates_driver[current_date.year] << 11

    next_year = current_date.year + 1
    dates_driver[next_year] = [] unless dates_driver[next_year]
    dates_driver[next_year] << 1
  else
    dates_driver[current_date.year] << current_date.month - 1 << current_date.month + 1
  end

  dates_driver
end
clean(dates_driver) click to toggle source
# File lib/holidays/use_case/context/dates_driver_builder.rb, line 53
def clean(dates_driver)
  dates_driver.each do |year, months|
    dates_driver[year] << 0 # Always add variable month '0' for proc calc purposes

    dates_driver[year].uniq!
    dates_driver[year].sort!
  end

  dates_driver
end