class MySQLYearweek

Constants

MAX_TESTED_DATE
MIN_ALLOWED_DATE

Public Class Methods

mode_seven(date) click to toggle source
# File lib/mysql_yearweek.rb, line 118
def self.mode_seven(date)
  mode_five(date)
end
yearweek(date, mode=4) click to toggle source
# File lib/mysql_yearweek.rb, line 9
def self.yearweek(date, mode=4)
  raise TypeError unless date.is_a?(Date)
  if (date < MIN_ALLOWED_DATE)
    raise ArgumentError, "Dates before #{MIN_ALLOWED_DATE} are not allowed"
  end

  case mode
  when 0
    return mode_zero(date)
  when 1
    return mode_one(date)
  when 2
    return mode_two(date)
  when 3
    return mode_three(date)
  when 4
    return mode_four(date)
  when 5
    return mode_five(date)
  when 6
    return mode_six(date)
  when 7
    return mode_seven(date)
  else
    raise ArgumentError, 'Valid modes are from 0 to 7'
  end
end

Private Class Methods

last_week_of_year_has_monday(year) click to toggle source
# File lib/mysql_yearweek.rb, line 131
def self.last_week_of_year_has_monday(year)
  Date.new(year, 12, 29).monday? or
  Date.new(year, 12, 30).monday? or
  Date.new(year, 12, 31).monday?
end
last_week_of_year_has_sunday(year) click to toggle source
# File lib/mysql_yearweek.rb, line 123
def self.last_week_of_year_has_sunday(year)
  Date.new(year, 12, 28).sunday? or
  Date.new(year, 12, 29).sunday? or
  Date.new(year, 12, 30).sunday? or
  Date.new(year, 12, 31).sunday?
end
mode_five(date) click to toggle source
# File lib/mysql_yearweek.rb, line 94
def self.mode_five(date)
  if (last_week_of_year_has_monday(date.cwyear - 1))
    if (last_week_of_year_has_monday(date.cwyear - 2))
      last_week_of_prev_year = 52
    else 
      last_week_of_prev_year = 53
    end
    year = date.cweek > 1 ? date.cwyear : date.cwyear - 1
    week = date.cweek > 1 ? date.cweek - 1 : last_week_of_prev_year

    yearweek = "%04d%02d" % [year, week]
  else
    yearweek = "%04d%02d" % [date.cwyear, date.cweek]
  end

  yearweek
end
mode_four(date) click to toggle source
# File lib/mysql_yearweek.rb, line 76
def self.mode_four(date)
  if (date.sunday?)
    date += 1
  end

  if (Date.new(date.cwyear, 1, 1).thursday?)
    week = date.cweek > 1 ? date.cweek - 1 : 53
    year = week == 53 ? date.cwyear - 1 : date.cwyear

    yearweek = "%04d%02d" % [year, week]
  else
    yearweek = "%04d%02d" % [date.cwyear, date.cweek]
  end

  yearweek
end
mode_one(date) click to toggle source
# File lib/mysql_yearweek.rb, line 61
def self.mode_one(date)
  yearweek = "%04d%02d" % [date.cwyear, date.cweek]
end
mode_six(date) click to toggle source
# File lib/mysql_yearweek.rb, line 113
def self.mode_six(date)
  mode_four(date)
end
mode_three(date) click to toggle source
# File lib/mysql_yearweek.rb, line 71
def self.mode_three(date)
  mode_one(date)
end
mode_two(date) click to toggle source
# File lib/mysql_yearweek.rb, line 66
def self.mode_two(date)
  mode_zero(date)
end
mode_zero(date) click to toggle source
# File lib/mysql_yearweek.rb, line 37
def self.mode_zero(date)
  if (date.sunday?)
    date += 1
  end

  if (last_week_of_year_has_sunday(date.cwyear - 1))
    if (last_week_of_year_has_sunday(date.cwyear - 2))
      last_week_of_prev_year = 52
    else 
      last_week_of_prev_year = 53
    end
    year = date.cweek > 1 ? date.cwyear : date.cwyear - 1
    week = date.cweek > 1 ? date.cweek - 1 : last_week_of_prev_year

    yearweek = "%04d%02d" % [year, week]
  else
    yearweek = "%04d%02d" % [date.cwyear, date.cweek]
  end
 
  yearweek
end