class TimeWindowParser attr_reader :now HUMAN_NAMES_BY_VALUE = { "today" => "Today", "yesterday" => "Yesterday", "thisweek" => "This week", "thismonth" => "This month", "thisyear" => "This year", "lastweek" => "Last week", "lastmonth" => "Last month", "lastyear" => "Last year" } VALUES = HUMAN_NAMES_BY_VALUE.keys class << self def parse(string) new.parse(string) end def human_name_for(value) HUMAN_NAMES_BY_VALUE[value] end end def initialize(now: Time.current) @now = now end def parse(string) case normalize(string) when "today" now.beginning_of_day..now.end_of_day when "yesterday" (now - 1.day).beginning_of_day..(now - 1.day).end_of_day when "thisweek" now.beginning_of_week..now.end_of_week when "thismonth" now.beginning_of_month..now.end_of_month when "thisyear" now.beginning_of_year..now.end_of_year when "lastweek" (now - 1.week).beginning_of_week..(now - 1.week).end_of_week when "lastmonth" (now - 1.month).beginning_of_month..(now - 1.month).end_of_month when "lastyear" (now - 1.year).beginning_of_year..(now - 1.year).end_of_year end end private def normalize(string) if string string.downcase.gsub(/[\s_\-]/, "") end end end