chronic_between 0.2.3 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. data/lib/chronic_between.rb +150 -31
  2. metadata +2 -2
@@ -9,70 +9,189 @@ require 'app-routes'
9
9
  class ChronicBetween
10
10
  include AppRoutes
11
11
 
12
- def initialize(s)
13
- @s = s
12
+ def initialize(x)
13
+
14
+ @times = x.is_a?(String) ? x.split(/[,;&]/) : x
14
15
  @route = {}; @params = {}
15
16
  end
16
-
17
+
17
18
  def within?(date)
18
19
 
19
- dates = []
20
+ dates = []
20
21
 
21
22
  ranges(@params, date)
22
- dates = @s.split(',').map {|x| run_route(x.strip)}
23
- dates.any? {|d1, d2| date.between? d1, d2}
24
-
25
- end
26
-
23
+ negatives = '(not|except)\s+'
24
+ times, closed_times = @times.partition {|x| !x[/^#{negatives}/]}
25
+ closed_times.map!{|x| x[/^#{negatives}(.*)/,2]}
26
+
27
+ dates = build times
28
+ positive_flag = dates.any? {|d1, d2| date.between? d1, d2}
29
+ neg_dates = build closed_times
30
+ negative_flag = neg_dates.any? {|d1, d2| date.between? d1, d2}
31
+
32
+ positive_flag and not negative_flag
33
+ end
34
+
27
35
  private
28
36
 
29
37
  def ranges(params, date)
30
38
 
31
39
  # e.g. Mon-Fri 9:00-16:30
32
- get %r{(\w+)-(\w+)\s+(\d+:\d+)-(\d+:\d+)$} do
33
-
40
+ get %r{(\w+)-(\w+)\s+(\d[\w:]*)-(\d[\w:]*)$} do
34
41
  d1, d2, t1, t2 = params[:captures]
35
- cdate1, cdate2 = [d1,d2].map {|d| Chronic.parse(d)}
36
- n_days = (cdate2 - cdate1) / 86400
37
-
38
- 0.upto(n_days.to_i).map do |n|
39
- x = (cdate1.to_date + n).strftime("%d-%b-%y ")
40
- [DateTime.parse(x + t1), DateTime.parse(x + t2)]
41
- end
42
+ date_range_time_range(date, d1 ,d2, t1, t2)
42
43
  end
44
+
45
+ # e.g. Mon-Fri 9:00 to 16:30
46
+ get %r{(\w+)-(\w+)\s+(\d[\w:]*)\s+to\s+(\d[\w:]*)$} do
47
+ d1, d2, t1, t2 = params[:captures]
48
+ date_range_time_range(date, d1 ,d2, t1, t2)
49
+ end
50
+
51
+ # e.g. 9:00-16:30 Mon-Fri
52
+ get %r{(\d[\w:]*)-(\d[\w:]*)\s+(\w+)-(\w+)$} do
53
+ t1, t2, d1, d2 = params[:captures]
54
+ date_range_time_range(date, d1 ,d2, t1, t2)
55
+ end
56
+
57
+ # e.g. 9:00 to 16:30 Mon-Fri
58
+ get %r{(\d[\w:]*)\s+to\s+(\d[\w:]*)\s+(\w+)-(\w+)$} do
59
+ t1, t2, d1, d2 = params[:captures]
60
+ date_range_time_range(date, d1 ,d2, t1, t2)
61
+ end
43
62
 
44
63
  # e.g. Saturday
45
64
  get %r{^(\w+)$} do
46
65
  day = params[:captures].first
47
- cdate = Chronic.parse(day, :now => (date - 1))
48
- d1 = DateTime.parse(cdate.strftime("%d-%b-%y") + ' 00:00')
49
- d2 = d1 + 1
50
- [d1, d2]
66
+ cdate1 = Chronic.parse(day, :now => (date - 1))
67
+ date1 = DateTime.parse(cdate1.strftime("%d-%b-%y") + ' 00:00')
68
+ [date1, date1 + 1]
51
69
  end
52
70
 
53
71
  # e.g. 3:45-5:15
54
- get %r{^(\d+:\d+)-(\d+:\d+)$} do
72
+ get %r{^(\d[\w:]*)-(\d[\w:]*)(?=\s+(daily|every day))} do
55
73
  t1, t2 = params[:captures]
56
- [t1,t2].map {|t| DateTime.parse(t)}
74
+ time_range(t1, t2)
57
75
  end
76
+
77
+ # e.g. 3:45 to 5:15
78
+ get %r{^(\d[\w:]*)\s+to\s+(\d[\w:]*)(?=\s+(daily|every day))} do
79
+ t1, t2 = params[:captures]
80
+ time_range(t1, t2)
81
+ end
58
82
 
59
83
  # e.g. Mon 3:45-5:15
60
- get %r{^(\w+)\s+(\d+:\d+)-(\d+:\d+)$} do
61
- d, t1, t2 = params[:captures]
62
- x = Chronic.parse(d, :now => (date - 1)).strftime("%d-%b-%y ")
63
- [DateTime.parse(x + t1), DateTime.parse(x + t2)]
84
+ get %r{^(\w+)\s+(\d[\w:]*)-(\d[\w:]*)$} do
85
+ d1, t1, t2 = params[:captures]
86
+ date_with_time_range(date, d1, t1, t2)
87
+ end
88
+
89
+ # e.g. Mon 3:45 to 5:15
90
+ get %r{^(\w+)\s+(\d[\w:]*)\s+to\s+(\d[\w:]*)$} do
91
+ d1, t1, t2 = params[:captures]
92
+ date_with_time_range(date, d1, t1, t2)
93
+ end
94
+
95
+ # e.g. 3:45-5:15 Mon
96
+ get %r{^(\d[\w:]*)-(\d[\w:]*)\s+(\w+)$} do
97
+ t1, t2, d1 = params[:captures]
98
+ date_with_time_range(date, d1, t1, t2)
64
99
  end
100
+
101
+ # e.g. 3:45 to 5:15 Mon
102
+ get %r{^(\d[\w:]*)\s+to\s+(\d[\w:]*)\s+(\w+)$} do
103
+ t1, t2, d1 = params[:captures]
104
+ date_with_time_range(date, d1, t1, t2)
105
+ end
65
106
 
66
107
  # e.g. Mon-Wed
67
108
  get %r{^(\w+)-(\w+)$} do
109
+ d1, d2 = params[:captures]
110
+ cdate2, n_days = latest_date_and_ndays(date, d1, d2)
111
+
112
+ date2 = DateTime.parse(cdate2.strftime("%d-%b-%y") + ' 00:00')
113
+ [date2 - n_days, date2]
114
+ end
115
+
116
+ # e.g. after 6pm
117
+ get %r{^after\s+(\d[\w:]*)$} do
118
+ t1 = params[:captures].first
119
+ date1 = Chronic.parse(t1).to_datetime
120
+ date2 = DateTime.parse(date1.strftime("%d-%b-%y") + ' 00:00') + 1
121
+ [date1, date2]
122
+ end
123
+
124
+ # e.g. before 9pm
125
+ get %r{^before\s+(\d[\w:]*)$} do
126
+ t1 = params[:captures].first
127
+ date2 = Chronic.parse(t1).to_datetime
128
+ date1 = DateTime.parse(date2.strftime("%d-%b-%y") + ' 00:00') - 1
129
+ [date1, date2]
130
+ end
131
+
132
+ # e.g. April 2nd - April 5th 12:00-14:00
133
+ get %r{^(.*)\s+-\s+(.*)\s+(\d[\w:]*)-(\d[\w:]*)$} do
134
+ d1, d2, t1, t2 = params[:captures]
135
+ cdate1, cdate2 = [d1,d2].map {|d| Chronic.parse(d)}
136
+ n_days = ((cdate2 - cdate1) / 86400).to_i
137
+ dates = 0.upto(n_days).map do |n|
138
+ x = (cdate1.to_date + n).strftime("%d-%b-%y ")
139
+ datetime_range(x+t1, x+t2)
140
+ end
141
+ end
142
+
143
+ # e.g. April 5th - April 9th
144
+ get %r{^(.*)\s+-\s+(.*)$} do
68
145
  d1, d2 = params[:captures]
69
146
  cdate1, cdate2 = [d1,d2].map {|d| Chronic.parse(d)}
70
- n_days = (cdate2 - cdate1) / 86400
147
+ n_days = ((cdate2 - cdate1) / 86400).to_i
71
148
 
72
- date = DateTime.parse(cdate1.strftime("%d-%b-%y") + ' 00:00')
73
- [date, date + n_days.to_i]
149
+ date1 = DateTime.parse(cdate1.strftime("%d-%b-%y") + ' 00:00')
150
+ [date1, date1 + n_days]
74
151
  end
75
152
 
153
+ # e.g. April 5th
154
+ get %r{^(.*)$} do
155
+ day = params[:captures].first
156
+ cdate1 = Chronic.parse(day)
157
+ date1 = DateTime.parse(cdate1.strftime("%d-%b-%y") + ' 00:00')
158
+ [date1, date1 + 1]
159
+ end
76
160
  end
77
161
 
162
+ def build(times)
163
+ times.inject([]) do |result, x|
164
+ r = run_route(x.strip)
165
+ r.first.is_a?(Array) ? result + r : result << r
166
+ end
167
+ end
168
+
169
+ def date_range_time_range(date, d1, d2, t1, t2)
170
+ cdate2, n_days = latest_date_and_ndays(date, d1, d2)
171
+ dates = (n_days).downto(0).map do |n|
172
+ x = (cdate2.to_date - n).strftime("%d-%b-%y ")
173
+ datetime_range(x+t1, x+t2)
174
+ end
175
+ end
176
+
177
+ def date_with_time_range(date, d1, t1, t2)
178
+ x = Chronic.parse(d1, now: (date - 1)).strftime("%d-%b-%y ")
179
+ datetime_range(x+t1, x+t2)
180
+ end
181
+
182
+ def latest_date_and_ndays(date, d1, d2)
183
+ raw_date1, raw_date2 = [d1,d2].map {|d| Chronic.parse(d)}
184
+ cdate2 = Chronic.parse(d2, now: (date - 1))
185
+ n_days = ((raw_date2 - raw_date1) / 86400).to_i
186
+
187
+ [cdate2, n_days]
188
+ end
189
+
190
+ def time_range(t1, t2)
191
+ [t1,t2].map {|t| DateTime.parse(t)}
192
+ end
193
+
194
+ alias datetime_range time_range
195
+
196
+
78
197
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: chronic_between
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.2.3
5
+ version: 0.2.4
6
6
  platform: ruby
7
7
  authors: []
8
8
 
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-03-30 00:00:00 +01:00
13
+ date: 2011-04-01 00:00:00 +01:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency