fugit 0.9.2 → 0.9.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 93a36077d24c8226afdf974f4054779549fb4ba8
4
- data.tar.gz: 38f18eac702bda2136ccd787dee4ca3db41251a3
3
+ metadata.gz: db0fd5566944d325bda3692e5ca32819d7f0b8d8
4
+ data.tar.gz: 226e4f9ad3e97a40c17619e9be38f2b2ff408c83
5
5
  SHA512:
6
- metadata.gz: 0ba8e3e2a0d4e1e07a52f5f6c994c8b1d7b4f28513114c0582a19d8420ea62acdc8a8e934a5473f26ee93e0780ae88faba3faaad9218fbbd8dcea3b7ba08b8dc
7
- data.tar.gz: 7ea6c821a417e0e951c00959f9b7800ac7833ff8d0f1ea1bb2505f823dbb50ca5e55b2644d57530c4f2614ab33f694ac3f81647d670eebd623666c007fb24060
6
+ metadata.gz: 6af1fa57a2484c9c62a3a7f73a65be6d12b579501efdb3c479f8e1868d73afab2b8e544d9d7904834558bab5d6f93e2ce53588ba4a46e2c64868fe4255d77634
7
+ data.tar.gz: b3be693935fd379a0e9270194600bcfe2210b2bf3b969596b2f476285632729bf3f0e320029c8e398d1f524c240432acc5f15899d6ad1365c0cddd63297fa82f
@@ -2,6 +2,11 @@
2
2
  # fugit CHANGELOG.md
3
3
 
4
4
 
5
+ ## fugit 0.9.3 released 2017-01-05
6
+
7
+ * First version of Fugit::Nat
8
+
9
+
5
10
  ## fugit 0.9.2 released 2017-01-04
6
11
 
7
12
  * Accept decimal places for duration seconds
@@ -25,7 +25,7 @@
25
25
 
26
26
  module Fugit
27
27
 
28
- VERSION = '0.9.2'
28
+ VERSION = '0.9.3'
29
29
  end
30
30
 
31
31
  require 'time'
@@ -37,4 +37,5 @@ require 'fugit/core'
37
37
  require 'fugit/misc'
38
38
  require 'fugit/cron'
39
39
  require 'fugit/duration'
40
+ require 'fugit/nat'
40
41
 
@@ -61,7 +61,7 @@ module Fugit
61
61
 
62
62
  def self.parse(s)
63
63
 
64
- parse_duration(s) || parse_at(s) || parse_cron(s)
64
+ parse_cron(s) || parse_duration(s) || parse_at(s)
65
65
  end
66
66
 
67
67
  def self.do_parse(s)
@@ -264,6 +264,8 @@ module Fugit
264
264
 
265
265
  @original = original
266
266
 
267
+ h ||= {}
268
+
267
269
  determine_minutes(h[:min])
268
270
  determine_hours(h[:hou])
269
271
  determine_monthdays(h[:dom])
@@ -302,28 +304,34 @@ module Fugit
302
304
  end
303
305
 
304
306
  def determine_minutes(mins)
307
+ return @minutes = nil unless mins
305
308
  @minutes = mins.inject([]) { |a, r| a.concat(expand(0, 59, r)) }
306
309
  compact(:@minutes)
307
310
  end
308
311
 
309
312
  def determine_hours(hous)
313
+ return @hours = nil unless hous
310
314
  @hours = hous.inject([]) { |a, r| a.concat(expand(0, 23, r)) }
311
315
  @hours = @hours.collect { |h| h == 24 ? 0 : h }
312
316
  compact(:@hours)
313
317
  end
314
318
 
315
319
  def determine_monthdays(doms)
320
+ return @monthdays = nil unless doms
316
321
  @monthdays = doms.inject([]) { |a, r| a.concat(expand(1, 31, r)) }
317
322
  compact(:@monthdays)
318
323
  end
319
324
 
320
325
  def determine_months(mons)
326
+ return @months = nil unless mons
321
327
  @months = mons.inject([]) { |a, r| a.concat(expand(1, 12, r)) }
322
328
  compact(:@months)
323
329
  end
324
330
 
325
331
  def determine_weekdays(dows)
326
332
 
333
+ return @weekdays = nil unless dows
334
+
327
335
  @weekdays = dows.inject([]) { |a, r|
328
336
  aa = expand(0, 7, r)
329
337
  if hsh = r[3]
@@ -346,7 +354,9 @@ module Fugit
346
354
 
347
355
  module Parser include Raabro
348
356
 
349
- WEEKDAYS = %w[ sun mon tue wed thu fri sat ]
357
+ WEEKDAYS = %w[ sunday monday tuesday wednesday thursday friday saturday ]
358
+ WEEKDS = WEEKDAYS.collect { |d| d[0, 3] }
359
+
350
360
  MONTHS = %w[ - jan feb mar apr may jun jul aug sep oct nov dec ]
351
361
 
352
362
  # piece parsers bottom to top
@@ -362,7 +372,7 @@ module Fugit
362
372
  def core_hou(i); rex(:hou, i, /(2[0-4]|[01]?[0-9])/); end
363
373
  def core_dom(i); rex(:dom, i, /(-?(3[01]|[012]?[0-9])|last|l)/i); end
364
374
  def core_mon(i); rex(:mon, i, /(1[0-2]|0?[0-9]|#{MONTHS[1..-1].join('|')})/i); end
365
- def core_dow(i); rex(:dow, i, /([0-7]|#{WEEKDAYS.join('|')})/i); end
375
+ def core_dow(i); rex(:dow, i, /([0-7]|#{WEEKDS.join('|')})/i); end
366
376
 
367
377
  def dow_hash(i); rex(:hash, i, /#(-?[1-5]|last|l)/i); end
368
378
 
@@ -424,7 +434,7 @@ module Fugit
424
434
  s = t.string.downcase
425
435
 
426
436
  (k == :mon && MONTHS.index(s)) ||
427
- (k == :dow && WEEKDAYS.index(s)) ||
437
+ (k == :dow && WEEKDS.index(s)) ||
428
438
  (k == :dom && s[0, 1] == 'l' && -1) || # L, l, last
429
439
  s.to_i
430
440
  end
@@ -251,6 +251,11 @@ module Fugit
251
251
  @h.hash
252
252
  end
253
253
 
254
+ def next_time(from=Time.now)
255
+
256
+ add(from)
257
+ end
258
+
254
259
  protected
255
260
 
256
261
  def init(original, h)
@@ -0,0 +1,152 @@
1
+ #--
2
+ # Copyright (c) 2017-2017, John Mettraux, jmettraux+flor@gmail.com
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ # of this software and associated documentation files (the "Software"), to deal
6
+ # in the Software without restriction, including without limitation the rights
7
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ # copies of the Software, and to permit persons to whom the Software is
9
+ # furnished to do so, subject to the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be included in
12
+ # all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
+ # THE SOFTWARE.
21
+ #
22
+ # Made in Japan.
23
+ #++
24
+
25
+
26
+ module Fugit
27
+
28
+ # A natural language set of parsers for fugit.
29
+ # Focuses on cron expressions. The rest is better left to Chronic and friends.
30
+ #
31
+ module Nat
32
+
33
+ def self.parse(s)
34
+
35
+ #p s; Raabro.pp(Parser.parse(s, debug: 3))
36
+ a = Parser.parse(s)
37
+
38
+ #p a
39
+ return nil unless a
40
+
41
+ if a.include?([ :flag, 'every' ])
42
+ parse_cron(a)
43
+ else
44
+ nil
45
+ end
46
+ end
47
+
48
+ def self.parse_cron(a)
49
+
50
+ h = { min: nil, hou: nil, dom: nil, mon: nil, dow: nil }
51
+
52
+ a.each do |key, val|
53
+ if key == :biz_day
54
+ h[:dow] = (1..5).to_a.collect { |wd| [ wd ] }
55
+ elsif key == :simple_hour || key == :numeral_hour
56
+ (h[:hou] ||= []) << val
57
+ elsif key == :digital_hour
58
+ h[:hou] = val[0, 1]
59
+ h[:min] = val[1, 1]
60
+ elsif key == :name_day
61
+ (h[:dow] ||= []) << [ val ]
62
+ elsif key == :flag && val == 'pm' && h[:hou]
63
+ h[:hou][-1] = h[:hou][-1] + 12
64
+ end
65
+ end
66
+ h[:min] ||= [ 0 ]
67
+
68
+ Fugit::Cron.allocate.send(:init, nil, h)
69
+ end
70
+
71
+ module Parser include Raabro
72
+
73
+ NUMS = %w[
74
+ zero
75
+ one two three four five six seven eight nine
76
+ ten eleven twelve ]
77
+
78
+ WEEKDAYS =
79
+ Fugit::Cron::Parser::WEEKDS + Fugit::Cron::Parser::WEEKDAYS
80
+
81
+ NHOURS =
82
+ { 'noon' => [ 12, 0 ], 'midnight' => [ 0, 0 ] }
83
+
84
+ # piece parsers bottom to top
85
+
86
+ def digital_hour(i)
87
+ rex(:digital_hour, i, /(2[0-4]|[01][0-9]):?[0-5]\d/)
88
+ end
89
+ def simple_hour(i)
90
+ rex(:simple_hour, i, /(2[0-4]|[01]?[0-9])/)
91
+ end
92
+ def numeral_hour(i)
93
+ rex(:numeral_hour, i, /(#{NUMS.join('|')})/i)
94
+ end
95
+ def name_hour(i)
96
+ rex(:name_hour, i, /(#{NHOURS.keys.join('|')})/i)
97
+ end
98
+ def hour(i)
99
+ alt(nil, i, :numeral_hour, :name_hour, :digital_hour, :simple_hour);
100
+ end
101
+
102
+ def plain_day(i); rex(:plain_day, i, /day/i); end
103
+ def biz_day(i); rex(:biz_day, i, /(biz|business|week) *day/i); end
104
+ def name_day(i); rex(:name_day, i, /#{WEEKDAYS.reverse.join('|')}/i); end
105
+
106
+ def flag(i); rex(:flag, i, /(every|day|at|after|am|pm)/i); end
107
+
108
+ def datum(i)
109
+ alt(nil, i,
110
+ :flag,
111
+ :plain_day, :biz_day, :name_day,
112
+ :name_hour, :numeral_hour, :digital_hour, :simple_hour)
113
+ end
114
+
115
+ def sugar(i); rex(nil, i, /(and|or|[, \t]+)/i); end
116
+
117
+ def elt(i); alt(nil, i, :sugar, :datum); end
118
+ def nat(i); rep(:nat, i, :elt, 1); end
119
+
120
+ # rewrite parsed tree
121
+
122
+ def rewrite_nat(t)
123
+
124
+ #Raabro.pp(t)
125
+ t
126
+ .subgather(nil)
127
+ .collect { |tt|
128
+
129
+ k = tt.name
130
+ v = tt.string.downcase
131
+
132
+ case k
133
+ when :numeral_hour
134
+ [ k, NUMS.index(v) ]
135
+ when :simple_hour
136
+ [ k, v.to_i ]
137
+ when :digital_hour
138
+ v = v.gsub(/:/, '')
139
+ [ k, [ v[0, 2], v[2, 2] ] ]
140
+ when :name_hour
141
+ [ :digital_hour, NHOURS[v] ]
142
+ when :name_day
143
+ [ k, WEEKDAYS.index(v[0, 3]) ]
144
+ else
145
+ [ k, v ]
146
+ end
147
+ }
148
+ end
149
+ end
150
+ end
151
+ end
152
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fugit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.2
4
+ version: 0.9.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Mettraux
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-01-03 00:00:00.000000000 Z
11
+ date: 2017-01-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: raabro
@@ -57,6 +57,7 @@ files:
57
57
  - lib/fugit/cron.rb
58
58
  - lib/fugit/duration.rb
59
59
  - lib/fugit/misc.rb
60
+ - lib/fugit/nat.rb
60
61
  homepage: http://github.com/floraison/fugit
61
62
  licenses:
62
63
  - MIT