lib/search_lingo/parsers/mdy.rb in search_lingo-2.0.0 vs lib/search_lingo/parsers/mdy.rb in search_lingo-3.0.0.pre1

- old
+ new

@@ -3,54 +3,55 @@ require 'date' module SearchLingo module Parsers # :nodoc: ## - # MDY provides a parser for dates that adhere to the MDY format used in the - # US. + # MDY provides a parser for dates that adhere to the M/D/Y format used in + # the US. module MDY ## # Pattern for matching US-formatted date strings. # # The year may be two or four digits, or it may be omitted. - US_DATE = %r{(?<m>\d{1,2})/(?<d>\d{1,2})(?:/(?<y>\d{2}\d{2}?))?} + US_DATE = %r{(?<m>\d{1,2})/(?<d>\d{1,2})(?:/(?<y>\d{2}\d{2}?))?}.freeze + module_function + ## # Returns a +Date+ object for the date represented by +term+. Returns # +nil+ if +term+ can not be parsed. # # If the year has two digits, it will be implicitly expanded into a # four-digit year by +Date.parse+. Otherwise it will be used as is. # # If the year is omitted, it will be inferred using +relative_to+ as a # reference date. In this scenario, the resulting date will always be # less than or equal to the reference date. If +relative_to+ omitted, it - # defaults to today's date. + # defaults to +Date.today+. # # Available as both a class method and an instance method. - # rubocop:disable Metrics/MethodLength def parse(term, relative_to: Date.today) term.match(/\A#{US_DATE}\z/) do |m| - return Date.parse "#{m[:y]}/#{m[:m]}/#{m[:d]}" if m[:y] - - ref = relative_to - month = Integer m[:m] - day = Integer m[:d] - year = if month < ref.month || month == ref.month && day <= ref.day - ref.year - else - ref.year - 1 - end - Date.new year, month, day + date = reformat_date m, relative_to + Date.parse date end rescue ArgumentError # Fail if Date.parse or Date.new raise ArgumentError. nil end - # rubocop:enable Metrics/MethodLength - # rubocop:disable Style/AccessModifierDeclarations: - module_function :parse - # rubocop:enable Style/AccessModifierDeclarations: + def reformat_date(match, today) # :nodoc: + return match.values_at(:y, :m, :d).join('/') if match[:y] + + month = Integer match[:m] + day = Integer match[:d] + year = if month < today.month || (month == today.month && day <= today.day) + today.year + else + today.year - 1 + end + + "#{year}/#{month}/#{day}" + end end end end