chronic_between 0.2.3 → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
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