lib/search_lingo/parsers/mdy.rb in search_lingo-1.0.1 vs lib/search_lingo/parsers/mdy.rb in search_lingo-1.0.2
- old
+ new
@@ -1,23 +1,38 @@
require 'date'
module SearchLingo
- module Parsers
+ module Parsers # :nodoc:
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}?))?}
+ ##
+ # 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 expanded into a four-digit by
+ # +Date.parse+.
+ #
+ # 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.
+ #
+ # Available as both a class method and an instance method.
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]
day = Integer(m[:d])
month = Integer(m[:m])
- year = begin
- if month < relative_to.month || month == relative_to.month && day <= relative_to.day
- relative_to.year
- else
- relative_to.year - 1
- end
+ year = if month < relative_to.month || month == relative_to.month && day <= relative_to.day
+ relative_to.year
+ else
+ relative_to.year - 1
end
Date.new year, month, day
end
rescue ArgumentError