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