Class: FlycalCli::DateTimeParser

Inherits:
Object
  • Object
show all
Defined in:
lib/flycal_cli/date_time_parser.rb

Overview

Parses CLI date/time arguments in a locale-aware way.

Always accepts ISO-like forms:

YYYY-MM-DD, YYYY/MM/DD
YYYY-MM-DDTHH:MM, YYYY-MM-DD HH:MM(:SS)

Relative forms (en + it):

now, today/oggi, tomorrow/domani, yesterday/ieri
monday / lunedi, next monday / prossimo lunedi, last friday / scorso venerdi

With locale it: DD-MM-YYYY / DD/MM/YYYY (+ optional time) With locale en (default): MM-DD-YYYY / MM/DD/YYYY (+ optional time)

Constant Summary collapse

TIME_SUFFIX =
'(?:\s+|T)(\d{1,2}):(\d{2})(?::(\d{2}))?'.freeze
WEEKDAYS =

Ruby Date#wday: 0=Sunday ... 6=Saturday

{
  "sunday" => 0, "sun" => 0, "domenica" => 0, "dom" => 0,
  "monday" => 1, "mon" => 1, "lunedi" => 1, "lunedì" => 1, "lun" => 1,
  "tuesday" => 2, "tue" => 2, "martedi" => 2, "martedì" => 2, "mar" => 2,
  "wednesday" => 3, "wed" => 3, "mercoledi" => 3, "mercoledì" => 3, "mer" => 3,
  "thursday" => 4, "thu" => 4, "giovedi" => 4, "giovedì" => 4, "gio" => 4,
  "friday" => 5, "fri" => 5, "venerdi" => 5, "venerdì" => 5, "ven" => 5,
  "saturday" => 6, "sat" => 6, "sabato" => 6, "sab" => 6
}.freeze
NEXT_WORDS =
%w[next prossimo prossima].freeze
LAST_WORDS =
%w[last scorso scorsa].freeze
THIS_WORDS =
%w[this questo questa].freeze

Class Method Summary collapse

Class Method Details

.parse(str, end_of_day: false, locale: nil) ⇒ Object

Raises:



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/flycal_cli/date_time_parser.rb', line 40

def parse(str, end_of_day: false, locale: nil)
  value = str.to_s.strip
  raise FlycalCli::Error, invalid_message(str) if value.empty?

  relative = parse_relative(value, end_of_day: end_of_day)
  return relative if relative

  loc = (locale || Locale.current_locale).to_s
  formats = formats_for(loc)

  formats.each do |pattern, order|
    match = value.match(pattern)
    next unless match

    year, month, day, hour, min, sec = extract_parts(match, order)
    return build_time(year, month, day, hour, min, sec, end_of_day: end_of_day)
  end

  begin
    return Time.iso8601(value)
  rescue ArgumentError
    # fall through
  end

  begin
    parsed = Time.parse(value)
    return end_of_day && !time_component?(value) ? end_of_day_for(parsed.to_date) : parsed
  rescue ArgumentError
    raise FlycalCli::Error, invalid_message(str)
  end
end

.parse_or_default(str, default: Time.now, end_of_day: false, locale: nil) ⇒ Object



72
73
74
75
76
# File 'lib/flycal_cli/date_time_parser.rb', line 72

def parse_or_default(str, default: Time.now, end_of_day: false, locale: nil)
  return default if str.nil? || str.to_s.strip.empty?

  parse(str, end_of_day: end_of_day, locale: locale)
end