fugit 1.1.3 → 1.1.4

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: cf9112604503de8154a134544a4a30a8a5faee5f
4
- data.tar.gz: 648f1f1215a0609b22afeed98849e9f2741f98d3
3
+ metadata.gz: d3a2d6e072a2ae0ce68473054ef7701ce45a4867
4
+ data.tar.gz: a1c5e3b9c36b2ee907d617943b5baff6de9005a4
5
5
  SHA512:
6
- metadata.gz: 0e0d0983c4bf016caf168a02a666f3de7ba516073e6610133bcf5324f6ddf37f3e48e410d439a8834c65af098c642e0e9ed45e11268ab00ac880abc789c35341
7
- data.tar.gz: b960fddc42f5ef1eabffac55a6f54b316e9eecc878d703a1a4b4248f2d3b381c18877b2896015f793dd4177a082ea6283835aa4bbf020029fc1682eb5f75da2f
6
+ metadata.gz: 2c1cc2399627c451105219913f9668dfbd55ea77259e8fad5a356da4d828bd136bb72de28446451bf77bbf7455f62c8a73ec25f59d3426b89cd438382ee2a973
7
+ data.tar.gz: bb30951b92097750810dc700fa0d5d80ade2bc80d5da398776b9f554db3e889e4086c52fd412ba33bacb5f2d66742b3726aa6a694f64653a12780e76970b0e30
@@ -2,6 +2,14 @@
2
2
  # fugit CHANGELOG.md
3
3
 
4
4
 
5
+ ## fugit 1.1.4 released 2018-07-20
6
+
7
+ * Add duration support for Fugit::Nat (@cristianbica gh-7)
8
+ * Fix Duration not correctly parsing minutes and seconds long format (@cristianbica gh-7)
9
+ * Add timezone support for Fugit::Nat (@cristianbica gh-7)
10
+ * Use timezone name when converting a Fugit::Cron to cron string (@cristianbica gh-7)
11
+
12
+
5
13
  ## fugit 1.1.3 released 2018-06-21
6
14
 
7
15
  * Silenced Ruby warnings (Utilum in gh-4)
data/CREDITS.md CHANGED
@@ -1,6 +1,8 @@
1
1
 
2
2
  # fugit credits
3
3
 
4
+ * jakemack https://github.com/jakemack issue when going out of DST, gh-6
5
+ * Cristian Bica https://github.com/cristianbica Nat improvements, gh-7
4
6
  * Utilum https://github.com/utilum silenced Ruby warnings
5
7
  * Tero Marttila https://github.com/SpComb added missing Cron#seconds
6
8
  * Harry Lascelles https://github.com/hlascelles timezone reminder
data/Makefile CHANGED
@@ -13,7 +13,7 @@ cl: count_lines
13
13
 
14
14
  gemspec_validate:
15
15
  @echo "---"
16
- ruby -e "s = eval(File.read(Dir['*.gemspec'].first)); s.validate"
16
+ ruby -e "s = eval(File.read(Dir['*.gemspec'].first)); p s.validate"
17
17
  @echo "---"
18
18
 
19
19
  name: gemspec_validate
@@ -30,6 +30,10 @@ build: gemspec_validate
30
30
  push: build
31
31
  gem push pkg/$(NAME)-$(VERSION).gem
32
32
 
33
+ spec:
34
+ bundle exec rspec
35
+ test: spec
33
36
 
34
- .PHONY: build push cw
37
+
38
+ .PHONY: count_lines gemspec_validate name cw build push spec
35
39
 
data/README.md CHANGED
@@ -8,7 +8,7 @@ Time tools for [flor](https://github.com/floraison/flor) and the floraison group
8
8
 
9
9
  It uses [et-orbi](https://github.com/floraison/et-orbi) to represent time instances and [raabro](https://github.com/floraison/raabro) as a basis for its parsers.
10
10
 
11
- Fugit will probably become the foundation for [rufus-scheduler](https://github.com/jmettraux/rufus-scheduler) 4.x
11
+ Fugit is a core dependency of [rufus-scheduler](https://github.com/jmettraux/rufus-scheduler) 3.5.x.
12
12
 
13
13
 
14
14
  ## Related projects
@@ -156,16 +156,22 @@ Fugit understand some kind of "natural" language:
156
156
 
157
157
  For example, those "every" get turned into `Fugit::Cron` instances:
158
158
  ```ruby
159
- Fugit::Nat.parse('every day at five') # ==> '0 5 * * *'
160
- Fugit::Nat.parse('every weekday at five') # ==> '0 5 * * 1,2,3,4,5'
161
- Fugit::Nat.parse('every day at 5 pm') # ==> '0 17 * * *'
162
- Fugit::Nat.parse('every tuesday at 5 pm') # ==> '0 17 * * 2'
163
- Fugit::Nat.parse('every wed at 5 pm') # ==> '0 17 * * 3'
164
- Fugit::Nat.parse('every day at 16:30') # ==> '30 16 * * *'
165
- Fugit::Nat.parse('every day at noon') # ==> '0 12 * * *'
166
- Fugit::Nat.parse('every day at midnight') # ==> '0 0 * * *'
167
- Fugit::Nat.parse('every tuesday and monday at 5pm') # ==> '0 17 * * 1,2'
168
- Fugit::Nat.parse('every wed or Monday at 5pm and 11') # ==> '0 11,17 * * 1,3'
159
+ Fugit::Nat.parse('every day at five') # ==> '0 5 * * *'
160
+ Fugit::Nat.parse('every weekday at five') # ==> '0 5 * * 1,2,3,4,5'
161
+ Fugit::Nat.parse('every day at 5 pm') # ==> '0 17 * * *'
162
+ Fugit::Nat.parse('every tuesday at 5 pm') # ==> '0 17 * * 2'
163
+ Fugit::Nat.parse('every wed at 5 pm') # ==> '0 17 * * 3'
164
+ Fugit::Nat.parse('every day at 16:30') # ==> '30 16 * * *'
165
+ Fugit::Nat.parse('every day at noon') # ==> '0 12 * * *'
166
+ Fugit::Nat.parse('every day at midnight') # ==> '0 0 * * *'
167
+ Fugit::Nat.parse('every tuesday and monday at 5pm') # ==> '0 17 * * 1,2'
168
+ Fugit::Nat.parse('every wed or Monday at 5pm and 11') # ==> '0 11,17 * * 1,3'
169
+ Fugit::Nat.parse('every day at 5 pm on America/Los_Angeles') # ==> '0 17 * * * America/Los_Angeles'
170
+ Fugit::Nat.parse('every day at 6 pm in Asia/Tokyo') # ==> '0 18 * * * Asia/Tokyo'
171
+ Fugit::Nat.parse('every 3 hours') # ==> '0 */3 * * *'
172
+ Fugit::Nat.parse('every 4 months') # ==> '0 0 1 */4 *'
173
+ Fugit::Nat.parse('every 5 minutes') # ==> '*/5 * * * *'
174
+ Fugit::Nat.parse('every 15s') # ==> '*/15 * * * * *'
169
175
  ```
170
176
 
171
177
  Directly with `Fugit.parse(s)` is OK too:
@@ -29,7 +29,7 @@ Time tools for flor and the floraison project. Cron parsing and occurrence compu
29
29
 
30
30
  #s.add_runtime_dependency 'tzinfo'
31
31
  s.add_runtime_dependency 'raabro', '~> 1.1'
32
- s.add_runtime_dependency 'et-orbi', '~> 1.1', '>= 1.1.1'
32
+ s.add_runtime_dependency 'et-orbi', '~> 1.1', '>= 1.1.3'
33
33
 
34
34
  s.add_development_dependency 'rspec', '~> 3.7'
35
35
 
@@ -1,7 +1,7 @@
1
1
 
2
2
  module Fugit
3
3
 
4
- VERSION = '1.1.3'
4
+ VERSION = '1.1.4'
5
5
  end
6
6
 
7
7
  require 'time'
@@ -3,14 +3,17 @@ module Fugit
3
3
 
4
4
  module At
5
5
 
6
- def self.parse(s)
6
+ class << self
7
7
 
8
- ::EtOrbi.make_time(s) rescue nil
9
- end
8
+ def parse(s)
9
+
10
+ ::EtOrbi.make_time(s) rescue nil
11
+ end
10
12
 
11
- def self.do_parse(s)
13
+ def do_parse(s)
12
14
 
13
- ::EtOrbi.make_time(s)
15
+ ::EtOrbi.make_time(s)
16
+ end
14
17
  end
15
18
  end
16
19
  end
@@ -57,7 +57,7 @@ module Fugit
57
57
  (@monthdays || [ '*' ]).join(','),
58
58
  (@months || [ '*' ]).join(','),
59
59
  (@weekdays || [ [ '*' ] ]).map { |d| d.compact.join('#') }.join(','),
60
- @timezone ? @timezone.to_s : nil
60
+ @timezone ? @timezone.name : nil
61
61
  ].compact.join(' ')
62
62
  end
63
63
  end
@@ -169,20 +169,35 @@ module Fugit
169
169
  def next_time(from=::EtOrbi::EoTime.now)
170
170
 
171
171
  from = ::EtOrbi.make_time(from)
172
+ sfrom = from.strftime('%F/%T')
173
+
172
174
  t = TimeCursor.new(from.translate(@timezone))
175
+ #
176
+ # the translation occurs in the timezone of
177
+ # this Fugit::Cron instance
173
178
 
174
179
  loop do
175
- #p [ :l, Fugit.time_to_s(t.time) ]
180
+
176
181
  (from.to_i == t.to_i) && (t.inc(1); next)
177
182
  month_match?(t) || (t.inc_month; next)
178
183
  day_match?(t) || (t.inc_day; next)
179
184
  hour_match?(t) || (t.inc_hour; next)
180
185
  min_match?(t) || (t.inc_min; next)
181
186
  sec_match?(t) || (t.inc_sec(@seconds); next)
187
+
188
+ st = t.time.strftime('%F/%T')
189
+ (from, sfrom = t.time, st; next) if st == sfrom
190
+ #
191
+ # when transitioning out of DST, this prevents #next_time from
192
+ # yielding the same literal time twice in a row, see gh-6
193
+
182
194
  break
183
195
  end
184
196
 
185
197
  t.time.translate(from.zone)
198
+ #
199
+ # the answer time is in the same timezone as the `from`
200
+ # starting point
186
201
  end
187
202
 
188
203
  def previous_time(from=::EtOrbi::EoTime.now)
@@ -5,40 +5,58 @@ module Fugit
5
5
 
6
6
  attr_reader :original, :h, :options
7
7
 
8
- def self.new(s)
8
+ class << self
9
9
 
10
- parse(s)
11
- end
10
+ def new(s)
11
+
12
+ parse(s)
13
+ end
12
14
 
13
- def self.parse(s, opts={})
15
+ def parse(s, opts={})
14
16
 
15
- return s if s.is_a?(self)
17
+ return s if s.is_a?(self)
16
18
 
17
- original = s
19
+ original = s
18
20
 
19
- s = "#{s}s" if s.is_a?(Numeric)
21
+ s = "#{s}s" if s.is_a?(Numeric)
20
22
 
21
- return nil unless s.is_a?(String)
23
+ return nil unless s.is_a?(String)
22
24
 
23
- s = s.strip
25
+ s = s.strip
24
26
  #p [ original, s ]; Raabro.pp(Parser.parse(s, debug: 3), colours: true)
25
27
 
26
- h =
27
- if opts[:iso]
28
- IsoParser.parse(opts[:stricter] ? s : s.upcase)
29
- elsif opts[:plain]
30
- Parser.parse(s)
31
- else
32
- Parser.parse(s) || IsoParser.parse(opts[:stricter] ? s : s.upcase)
33
- end
34
- #p h
28
+ h =
29
+ if opts[:iso]
30
+ IsoParser.parse(opts[:stricter] ? s : s.upcase)
31
+ elsif opts[:plain]
32
+ Parser.parse(s)
33
+ else
34
+ Parser.parse(s) || IsoParser.parse(opts[:stricter] ? s : s.upcase)
35
+ end
35
36
 
36
- h ? self.allocate.send(:init, original, opts, h) : nil
37
- end
37
+ h ? self.allocate.send(:init, original, opts, h) : nil
38
+ end
39
+
40
+ def do_parse(s, opts={})
41
+
42
+ parse(s, opts) ||
43
+ fail(ArgumentError.new("not a duration #{s.inspect}"))
44
+ end
38
45
 
39
- def self.do_parse(s, opts={})
46
+ def to_plain_s(o); do_parse(o).deflate.to_plain_s; end
47
+ def to_iso_s(o); do_parse(o).deflate.to_iso_s; end
48
+ def to_long_s(o, opts={}); do_parse(o).deflate.to_long_s(opts); end
40
49
 
41
- parse(s, opts) || fail(ArgumentError.new("not a duration #{s.inspect}"))
50
+ def common_rewrite_dur(t)
51
+
52
+ t
53
+ .subgather(nil)
54
+ .inject({}) { |h, tt|
55
+ v = tt.string; v = v.index('.') ? v.to_f : v.to_i
56
+ # drops ending ("y", "m", ...) by itself
57
+ h[tt.name] = (h[tt.name] || 0) + v
58
+ h }
59
+ end
42
60
  end
43
61
 
44
62
  KEYS = {
@@ -103,12 +121,6 @@ module Fugit
103
121
  s.string
104
122
  end
105
123
 
106
- class << self
107
- def to_plain_s(o); do_parse(o).deflate.to_plain_s; end
108
- def to_iso_s(o); do_parse(o).deflate.to_iso_s; end
109
- def to_long_s(o, opts={}); do_parse(o).deflate.to_long_s(opts); end
110
- end
111
-
112
124
  # For now, let's alias to #h
113
125
  #
114
126
  def to_h; h; end
@@ -308,18 +320,6 @@ module Fugit
308
320
  self
309
321
  end
310
322
 
311
- def self.common_rewrite_dur(t)
312
-
313
- t
314
- .subgather(nil)
315
- .inject({}) { |h, tt|
316
- v = tt.string; v = v.index('.') ? v.to_f : v.to_i
317
- # drops ending ("y", "m", ...) by itself
318
- h[tt.name] = (h[tt.name] || 0) + v
319
- h
320
- }
321
- end
322
-
323
323
  module Parser include Raabro
324
324
 
325
325
  # piece parsers bottom to top
@@ -328,12 +328,12 @@ module Fugit
328
328
 
329
329
  def yea(i); rex(:yea, i, /(\d+\.\d*|(\d*\.)?\d+) *y(ears?)?/i); end
330
330
  def mon(i); rex(:mon, i, /(\d+\.\d*|(\d*\.)?\d+) *(M|months?)/); end
331
- def wee(i); rex(:wee, i, /(\d+\.\d*|(\d*\.)?\d+) *(weeks?|w)/i); end
332
- def day(i); rex(:day, i, /(\d+\.\d*|(\d*\.)?\d+) *(days?|d)/i); end
333
- def hou(i); rex(:hou, i, /(\d+\.\d*|(\d*\.)?\d+) *(hours?|h)/i); end
334
- def min(i); rex(:min, i, /(\d+\.\d*|(\d*\.)?\d+) *(mins?|minutes?|m)/); end
331
+ def wee(i); rex(:wee, i, /(\d+\.\d*|(\d*\.)?\d+) *w(eeks?)?/i); end
332
+ def day(i); rex(:day, i, /(\d+\.\d*|(\d*\.)?\d+) *d(ays?)?/i); end
333
+ def hou(i); rex(:hou, i, /(\d+\.\d*|(\d*\.)?\d+) *h(ours?)?/i); end
334
+ def min(i); rex(:min, i, /(\d+\.\d*|(\d*\.)?\d+) *m(in(ute)?s?)?/); end
335
335
 
336
- def sec(i); rex(:sec, i, /(\d+\.\d*|(\d*\.)?\d+) *(secs?|seconds?|s)/i); end
336
+ def sec(i); rex(:sec, i, /(\d+\.\d*|(\d*\.)?\d+) *s(ec(ond)?)?s?/i); end
337
337
  def sek(i); rex(:sec, i, /(\d+\.\d*|\.\d+|\d+)$/); end
338
338
 
339
339
  def elt(i); alt(nil, i, :yea, :mon, :wee, :day, :hou, :min, :sec, :sek); end
@@ -1,32 +1,35 @@
1
1
 
2
2
  module Fugit
3
3
 
4
- def self.isostamp(show_date, show_time, show_usec, time)
4
+ class << self
5
5
 
6
- t = time || Time.now
7
- s = StringIO.new
6
+ def isostamp(show_date, show_time, show_usec, time)
8
7
 
9
- s << t.strftime('%Y-%m-%d') if show_date
10
- s << t.strftime('T%H:%M:%S') if show_time
11
- s << sprintf('.%06d', t.usec) if show_time && show_usec
12
- s << 'Z' if show_time && time.utc?
8
+ t = time || Time.now
9
+ s = StringIO.new
13
10
 
14
- s.string
15
- end
11
+ s << t.strftime('%Y-%m-%d') if show_date
12
+ s << t.strftime('T%H:%M:%S') if show_time
13
+ s << sprintf('.%06d', t.usec) if show_time && show_usec
14
+ s << 'Z' if show_time && time.utc?
16
15
 
17
- def self.time_to_s(t)
16
+ s.string
17
+ end
18
18
 
19
- isostamp(true, true, false, t)
20
- end
19
+ def time_to_s(t)
21
20
 
22
- def self.time_to_plain_s(t=Time.now, z=true)
21
+ isostamp(true, true, false, t)
22
+ end
23
23
 
24
- t.strftime('%Y-%m-%d %H:%M:%S') + (z && t.utc? ? ' Z' : '')
25
- end
24
+ def time_to_plain_s(t=Time.now, z=true)
25
+
26
+ t.strftime('%Y-%m-%d %H:%M:%S') + (z && t.utc? ? ' Z' : '')
27
+ end
26
28
 
27
- def self.time_to_zone_s(t=Time.now)
29
+ def time_to_zone_s(t=Time.now)
28
30
 
29
- t.strftime('%Y-%m-%d %H:%M:%S %Z %z')
31
+ t.strftime('%Y-%m-%d %H:%M:%S %Z %z')
32
+ end
30
33
  end
31
34
  end
32
35
 
@@ -6,52 +6,93 @@ module Fugit
6
6
  #
7
7
  module Nat
8
8
 
9
- def self.parse(s)
9
+ class << self
10
10
 
11
- return s if s.is_a?(Fugit::Cron) || s.is_a?(Fugit::Duration)
11
+ def parse(s)
12
12
 
13
- return nil unless s.is_a?(String)
13
+ return s if s.is_a?(Fugit::Cron) || s.is_a?(Fugit::Duration)
14
14
 
15
- #p s; Raabro.pp(Parser.parse(s, debug: 3))
16
- a = Parser.parse(s)
15
+ return nil unless s.is_a?(String)
17
16
 
18
- #p a
19
- return nil unless a
17
+ #p s; Raabro.pp(Parser.parse(s, debug: 3), colours: true)
18
+ a = Parser.parse(s)
20
19
 
21
- if a.include?([ :flag, 'every' ])
22
- parse_cron(a)
23
- else
24
- nil
20
+ if a && a.include?([ :flag, 'every' ])
21
+ parse_cron(a)
22
+ else
23
+ nil
24
+ end
25
25
  end
26
- end
27
26
 
28
- def self.do_parse(s)
27
+ def do_parse(s)
29
28
 
30
- parse(s) || fail(ArgumentError.new("could not parse a nat #{s.inspect}"))
31
- end
29
+ parse(s) ||
30
+ fail(ArgumentError.new("could not parse a nat #{s.inspect}"))
31
+ end
32
32
 
33
- def self.parse_cron(a)
34
-
35
- h = { min: nil, hou: [], dom: [ nil ], mon: [ nil ], dow: [ nil ] }
36
-
37
- a.each do |key, val|
38
- if key == :biz_day
39
- h[:dow] = [ [ 1, 5 ] ]
40
- elsif key == :simple_hour || key == :numeral_hour
41
- (h[:hou] ||= []) << [ val ]
42
- elsif key == :digital_hour
43
- h[:hou] = [ val[0, 1] ]
44
- h[:min] = [ val[1, 1] ]
45
- elsif key == :name_day
46
- (h[:dow] ||= []) << [ val ]
47
- elsif key == :flag && val == 'pm' && h[:hou]
48
- h[:hou][-1] = [ h[:hou][-1].first + 12 ]
33
+ def parse_cron(a)
34
+
35
+ h = { min: nil, hou: [], dom: [ nil ], mon: [ nil ], dow: [ nil ] }
36
+
37
+ a.each do |key, val|
38
+ if key == :biz_day
39
+ h[:dow] = [ [ 1, 5 ] ]
40
+ elsif key == :simple_hour || key == :numeral_hour
41
+ (h[:hou] ||= []) << [ val ]
42
+ elsif key == :digital_hour
43
+ h[:hou] = [ val[0, 1] ]
44
+ h[:min] = [ val[1, 1] ]
45
+ elsif key == :name_day
46
+ (h[:dow] ||= []) << [ val ]
47
+ elsif key == :flag && val == 'pm' && h[:hou]
48
+ h[:hou][-1] = [ h[:hou][-1].first + 12 ]
49
+ elsif key == :tz
50
+ h[:tz] = val
51
+ elsif key == :duration
52
+ process_duration(h, *val[0].to_h.first)
53
+ end
49
54
  end
55
+ h[:min] ||= [ 0 ]
56
+ h[:dow].sort_by! { |d, _| d || 0 }
57
+
58
+ Fugit::Cron.allocate.send(:init, nil, h)
59
+ end
60
+
61
+ def process_duration(h, interval, value)
62
+
63
+ send("process_duration_#{interval}", h, value)
50
64
  end
51
- h[:min] ||= [ 0 ]
52
- h[:dow].sort_by! { |d, _| d || 0 }
53
65
 
54
- Fugit::Cron.allocate.send(:init, nil, h)
66
+ def process_duration_mon(h, value)
67
+
68
+ h[:hou] = [ 0 ]
69
+ h[:dom] = [ 1 ]
70
+ h[:mon] = [ value == 1 ? '*' : "*/#{value}" ]
71
+ end
72
+
73
+ def process_duration_day(h, value)
74
+
75
+ h[:hou] = [ 0 ]
76
+ h[:dom] = [ value == 1 ? '*' : "*/#{value}" ]
77
+ end
78
+
79
+ def process_duration_hou(h, value)
80
+
81
+ h[:hou] = [ value == 1 ? '*' : "*/#{value}" ]
82
+ end
83
+
84
+ def process_duration_min(h, value)
85
+
86
+ h[:hou] = [ '*' ]
87
+ h[:min] = [ value == 1 ? '*' : "*/#{value}" ]
88
+ end
89
+
90
+ def process_duration_sec(h, value)
91
+
92
+ h[:hou] = [ '*' ]
93
+ h[:min] = [ '*' ]
94
+ h[:sec] = [ value == 1 ? '*' : "*/#{value}" ]
95
+ end
55
96
  end
56
97
 
57
98
  module Parser include Raabro
@@ -81,20 +122,37 @@ module Fugit
81
122
  def name_hour(i)
82
123
  rex(:name_hour, i, /(#{NHOURS.keys.join('|')})/i)
83
124
  end
84
- def hour(i)
85
- alt(nil, i, :numeral_hour, :name_hour, :digital_hour, :simple_hour);
86
- end
87
125
 
88
126
  def plain_day(i); rex(:plain_day, i, /day/i); end
89
127
  def biz_day(i); rex(:biz_day, i, /(biz|business|week) *day/i); end
90
128
  def name_day(i); rex(:name_day, i, /#{WEEKDAYS.reverse.join('|')}/i); end
91
129
 
92
- def flag(i); rex(:flag, i, /(every|day|at|after|am|pm)/i); end
130
+ def _tz_name(i)
131
+ rex(nil, i, /[A-Z][a-zA-Z0-9]+(\/[A-Z][a-zA-Z0-9\_]+){0,2}/)
132
+ end
133
+ def _tz_delta(i)
134
+ rex(nil, i, /[-+]([01][0-9]|2[0-4]):?(00|15|30|45)/)
135
+ end
136
+ def _tz(i); alt(:tz, i, :_tz_delta, :_tz_name); end
137
+
138
+ def duration(i)
139
+ rex(
140
+ :duration, i,
141
+ /
142
+ \d+
143
+ \s?
144
+ (mon(ths?)?|d(ays?)?|h(ours?)?|m(in(ute)?s?)?|s(ec(ond)?s?)?)
145
+ /ix)
146
+ end
147
+
148
+ def flag(i); rex(:flag, i, /(every|at|after|am|pm|on|in)/i); end
93
149
 
94
150
  def datum(i)
95
151
  alt(nil, i,
96
- :flag,
97
152
  :plain_day, :biz_day, :name_day,
153
+ :_tz,
154
+ :flag,
155
+ :duration,
98
156
  :name_hour, :numeral_hour, :digital_hour, :simple_hour)
99
157
  end
100
158
 
@@ -107,7 +165,7 @@ module Fugit
107
165
 
108
166
  def rewrite_nat(t)
109
167
 
110
- #Raabro.pp(t)
168
+ #Raabro.pp(t, colours: true)
111
169
  t
112
170
  .subgather(nil)
113
171
  .collect { |tt|
@@ -116,6 +174,10 @@ module Fugit
116
174
  v = tt.string.downcase
117
175
 
118
176
  case k
177
+ when :tz
178
+ [ k, [ tt.string.strip, EtOrbi.get_tzone(tt.string.strip) ] ]
179
+ when :duration
180
+ [ k, [ Fugit::Duration.parse(tt.string.strip) ] ]
119
181
  when :numeral_hour
120
182
  [ k, NUMS.index(v) ]
121
183
  when :simple_hour
@@ -129,8 +191,7 @@ module Fugit
129
191
  [ k, WEEKDAYS.index(v[0, 3]) ]
130
192
  else
131
193
  [ k, v ]
132
- end
133
- }
194
+ end }
134
195
  end
135
196
  end
136
197
  end
@@ -1,42 +1,45 @@
1
1
 
2
2
  module Fugit
3
3
 
4
- def self.parse_cron(s); ::Fugit::Cron.parse(s); end
5
- def self.parse_duration(s); ::Fugit::Duration.parse(s); end
6
- def self.parse_nat(s); ::Fugit::Nat.parse(s); end
7
- def self.parse_at(s); ::Fugit::At.parse(s); end
8
- def self.parse_in(s); parse_duration(s); end
9
-
10
- def self.do_parse_cron(s); ::Fugit::Cron.do_parse(s); end
11
- def self.do_parse_duration(s); ::Fugit::Duration.do_parse(s); end
12
- def self.do_parse_nat(s); ::Fugit::Nat.do_parse(s); end
13
- def self.do_parse_at(s); ::Fugit::At.do_parse(s); end
14
- def self.do_parse_in(s); do_parse_duration(s); end
15
-
16
- def self.parse(s, opts={})
17
-
18
- opts[:at] = opts[:in] if opts.has_key?(:in)
19
-
20
- (opts[:cron] != false && parse_cron(s)) ||
21
- (opts[:duration] != false && parse_duration(s)) ||
22
- (opts[:at] != false && parse_at(s)) ||
23
- (opts[:nat] != false && parse_nat(s)) ||
24
- nil
25
- end
4
+ class << self
26
5
 
27
- def self.do_parse(s, opts={})
6
+ def parse_cron(s); ::Fugit::Cron.parse(s); end
7
+ def parse_duration(s); ::Fugit::Duration.parse(s); end
8
+ def parse_nat(s); ::Fugit::Nat.parse(s); end
9
+ def parse_at(s); ::Fugit::At.parse(s); end
10
+ def parse_in(s); parse_duration(s); end
28
11
 
29
- parse(s, opts) ||
30
- fail(ArgumentError.new("found no time information in #{s.inspect}"))
31
- end
12
+ def do_parse_cron(s); ::Fugit::Cron.do_parse(s); end
13
+ def do_parse_duration(s); ::Fugit::Duration.do_parse(s); end
14
+ def do_parse_nat(s); ::Fugit::Nat.do_parse(s); end
15
+ def do_parse_at(s); ::Fugit::At.do_parse(s); end
16
+ def do_parse_in(s); do_parse_duration(s); end
17
+
18
+ def parse(s, opts={})
19
+
20
+ opts[:at] = opts[:in] if opts.has_key?(:in)
21
+
22
+ (opts[:cron] != false && parse_cron(s)) ||
23
+ (opts[:duration] != false && parse_duration(s)) ||
24
+ (opts[:at] != false && parse_at(s)) ||
25
+ (opts[:nat] != false && parse_nat(s)) ||
26
+ nil
27
+ end
28
+
29
+ def do_parse(s, opts={})
30
+
31
+ parse(s, opts) ||
32
+ fail(ArgumentError.new("found no time information in #{s.inspect}"))
33
+ end
32
34
 
33
- def self.determine_type(s)
35
+ def determine_type(s)
34
36
 
35
- case self.parse(s)
36
- when ::Fugit::Cron then 'cron'
37
- when ::Fugit::Duration then 'in'
38
- when ::Time, ::EtOrbi::EoTime then 'at'
39
- else nil
37
+ case self.parse(s)
38
+ when ::Fugit::Cron then 'cron'
39
+ when ::Fugit::Duration then 'in'
40
+ when ::Time, ::EtOrbi::EoTime then 'at'
41
+ else nil
42
+ end
40
43
  end
41
44
  end
42
45
  end
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: 1.1.3
4
+ version: 1.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Mettraux
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-06-21 00:00:00.000000000 Z
11
+ date: 2018-07-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: raabro
@@ -33,7 +33,7 @@ dependencies:
33
33
  version: '1.1'
34
34
  - - ">="
35
35
  - !ruby/object:Gem::Version
36
- version: 1.1.1
36
+ version: 1.1.3
37
37
  type: :runtime
38
38
  prerelease: false
39
39
  version_requirements: !ruby/object:Gem::Requirement
@@ -43,7 +43,7 @@ dependencies:
43
43
  version: '1.1'
44
44
  - - ">="
45
45
  - !ruby/object:Gem::Version
46
- version: 1.1.1
46
+ version: 1.1.3
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rspec
49
49
  requirement: !ruby/object:Gem::Requirement
@@ -99,7 +99,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
99
99
  version: '0'
100
100
  requirements: []
101
101
  rubyforge_project:
102
- rubygems_version: 2.5.2
102
+ rubygems_version: 2.5.2.3
103
103
  signing_key:
104
104
  specification_version: 4
105
105
  summary: time tools for flor