Class: ParseDate

Inherits:
Object
  • Object
show all
Extended by:
IntFromString
Includes:
Singleton
Defined in:
lib/parse_date.rb,
lib/parse_date/version.rb,
lib/parse_date/int_from_string.rb

Defined Under Namespace

Modules: IntFromString Classes: Error

Constant Summary collapse

VERSION =
'0.4.1'

Class Method Summary collapse

Class Method Details

.earliest_year(date_str) ⇒ Object

class method delegation



29
30
31
# File 'lib/parse_date.rb', line 29

def self.earliest_year(date_str)
  ParseDate::IntFromString.earliest_year(date_str)
end

.latest_year(date_str) ⇒ Object



33
34
35
# File 'lib/parse_date.rb', line 33

def self.latest_year(date_str)
  ParseDate::IntFromString.latest_year(date_str)
end

.parse_range(date_str) ⇒ Array

Returns array of Integer year values from earliest year to latest year, inclusive.

Returns:

  • (Array)

    array of Integer year values from earliest year to latest year, inclusive



42
43
44
45
46
47
48
49
50
51
# File 'lib/parse_date.rb', line 42

def self.parse_range(date_str)
  first = earliest_year(date_str)
  last = latest_year(date_str)
  return nil unless first || last
  raise ParseDate::Error, "Unable to parse range from '#{date_str}'" unless year_range_valid?(first, last)

  range_array(first, last)
rescue StandardError => e
  raise ParseDate::Error, "Unable to parse range from '#{date_str}': #{e.message}"
end

.range_array(first_year, last_year) ⇒ Array

Returns array of Integer year values from first to last, inclusive.

Parameters:

  • first_year, (Integer, String)

    expecting integer or parseable string for .to_i

  • last_year, (Integer, String)

    expecting integer or parseable string for .to_i

Returns:

  • (Array)

    array of Integer year values from first to last, inclusive

Raises:

  • (StandardError)


68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/parse_date.rb', line 68

def self.range_array(first_year, last_year)
  first_year = first_year.to_i if first_year.is_a?(String) && first_year.match?(/^-?\d+$/)
  last_year = last_year.to_i if last_year.is_a?(String) && last_year.match?(/^-?\d+$/)

  return [] unless last_year || first_year
  return [first_year] if last_year.nil? && first_year
  return [last_year] if first_year.nil? && last_year
  raise(StandardError, "unable to create year range array from #{first_year}, #{last_year}") unless
    year_range_valid?(first_year, last_year)

  Range.new(first_year, last_year).to_a
end

.year_int_valid?(date_str) ⇒ Boolean

Returns:

  • (Boolean)


37
38
39
# File 'lib/parse_date.rb', line 37

def self.year_int_valid?(date_str)
  ParseDate::IntFromString.year_int_valid?(date_str)
end

.year_range_valid?(first_year, last_year) ⇒ Boolean

true if:

both years are not newer than (current year + 1)
first_year <= last_year

false otherwise

Returns:

  • (Boolean)


57
58
59
60
61
62
63
# File 'lib/parse_date.rb', line 57

def self.year_range_valid?(first_year, last_year)
  upper_bound = Date.today.year + 2
  return false if first_year > upper_bound || last_year > upper_bound
  return false if first_year > last_year

  true
end