Module: Fugit::Nat

Defined in:
lib/fugit/nat.rb

Overview

A natural language set of parsers for fugit. Focuses on cron expressions. The rest is better left to Chronic and friends.

Defined Under Namespace

Modules: Parser

Class Method Summary collapse

Class Method Details

.do_parse(s) ⇒ Object



27
28
29
30
31
# File 'lib/fugit/nat.rb', line 27

def do_parse(s)

  parse(s) ||
  fail(ArgumentError.new("could not parse a nat #{s.inspect}"))
end

.parse(s) ⇒ Object



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/fugit/nat.rb', line 11

def parse(s)

  return s if s.is_a?(Fugit::Cron) || s.is_a?(Fugit::Duration)

  return nil unless s.is_a?(String)

#p s; Raabro.pp(Parser.parse(s, debug: 3), colours: true)
  a = Parser.parse(s)

  if a && a.include?([ :flag, 'every' ])
    parse_cron(a)
  else
    nil
  end
end

.parse_cron(a) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/fugit/nat.rb', line 33

def parse_cron(a)

  h = { min: nil, hou: [], dom: [ nil ], mon: [ nil ], dow: [ nil ] }

  a.each do |key, val|
    if key == :biz_day
      h[:dow] = [ [ 1, 5 ] ]
    elsif key == :simple_hour || key == :numeral_hour
      (h[:hou] ||= []) << [ val ]
    elsif key == :digital_hour
      h[:hou] = [ val[0, 1] ]
      h[:min] = [ val[1, 1] ]
    elsif key == :name_day
      (h[:dow] ||= []) << [ val ]
    elsif key == :flag && val == 'pm' && h[:hou]
      h[:hou][-1] =  [ h[:hou][-1].first + 12 ]
    elsif key == :tz
      h[:tz] = val
    elsif key == :duration
      process_duration(h, *val[0].to_h.first)
    end
  end
  h[:min] ||= [ 0 ]
  h[:dow].sort_by! { |d, _| d || 0 }

  Fugit::Cron.allocate.send(:init, nil, h)
end

.process_duration(h, interval, value) ⇒ Object



61
62
63
64
# File 'lib/fugit/nat.rb', line 61

def process_duration(h, interval, value)

  send("process_duration_#{interval}", h, value)
end

.process_duration_day(h, value) ⇒ Object



73
74
75
76
77
# File 'lib/fugit/nat.rb', line 73

def process_duration_day(h, value)

  h[:hou] = [ 0 ]
  h[:dom] = [ value == 1 ? '*' : "*/#{value}" ]
end

.process_duration_hou(h, value) ⇒ Object



79
80
81
82
# File 'lib/fugit/nat.rb', line 79

def process_duration_hou(h, value)

  h[:hou] = [ value == 1 ? '*' : "*/#{value}" ]
end

.process_duration_min(h, value) ⇒ Object



84
85
86
87
88
# File 'lib/fugit/nat.rb', line 84

def process_duration_min(h, value)

  h[:hou] = [ '*' ]
  h[:min] = [ value == 1 ? '*' : "*/#{value}" ]
end

.process_duration_mon(h, value) ⇒ Object



66
67
68
69
70
71
# File 'lib/fugit/nat.rb', line 66

def process_duration_mon(h, value)

  h[:hou] = [ 0 ]
  h[:dom] = [ 1 ]
  h[:mon] = [ value == 1 ? '*' : "*/#{value}" ]
end

.process_duration_sec(h, value) ⇒ Object



90
91
92
93
94
95
# File 'lib/fugit/nat.rb', line 90

def process_duration_sec(h, value)

  h[:hou] = [ '*' ]
  h[:min] = [ '*' ]
  h[:sec] = [ value == 1 ? '*' : "*/#{value}" ]
end