opening_hours_converter 0.0.6 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/opening_hours_converter/constants.rb +3 -0
- data/lib/opening_hours_converter/date_range.rb +1 -5
- data/lib/opening_hours_converter/opening_hours_builder.rb +44 -61
- data/lib/opening_hours_converter/opening_hours_date.rb +0 -1
- data/lib/opening_hours_converter/opening_hours_parser.rb +235 -136
- data/lib/opening_hours_converter/opening_hours_rule.rb +505 -10
- data/lib/opening_hours_converter/wide_interval.rb +142 -143
- data/lib/opening_hours_converter.rb +1 -0
- metadata +4 -3
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'opening_hours_converter/constants'
|
2
|
+
require 'pry-nav'
|
2
3
|
|
3
4
|
module OpeningHoursConverter
|
4
5
|
class WideInterval
|
@@ -16,23 +17,23 @@ module OpeningHoursConverter
|
|
16
17
|
|
17
18
|
case @type
|
18
19
|
when "day"
|
19
|
-
result = "#{OSM_MONTHS[@start[:month]-1]} #{@start[:day] < 10 ? "0" : ""}#{@start[:day]}"
|
20
|
+
result = "#{@start[:year].nil? ? "" : "#{@start[:year]} "}#{OSM_MONTHS[@start[:month]-1]} #{@start[:day] < 10 ? "0" : ""}#{@start[:day]}"
|
20
21
|
if !@end.nil?
|
21
22
|
if @start[:month] == @end[:month]
|
22
|
-
result += "-#{@end[:day] < 10 ? "0" : ""}#{@end[:day]}"
|
23
|
+
result += "-#{@start[:year] == @end[:year] ? "" : "#{@end[:year]} "}#{@end[:day] < 10 ? "0" : ""}#{@end[:day]}"
|
23
24
|
else
|
24
|
-
result += "-#{OSM_MONTHS[@end[:month]-1]} #{@end[:day] < 10 ? "0" : ""}#{@end[:day]}"
|
25
|
+
result += "-#{@start[:year] == @end[:year] ? "" : "#{@end[:year]} "}#{OSM_MONTHS[@end[:month]-1]} #{@end[:day] < 10 ? "0" : ""}#{@end[:day]}"
|
25
26
|
end
|
26
27
|
end
|
27
|
-
when "
|
28
|
-
result = "
|
28
|
+
when "month"
|
29
|
+
result = "#{@start[:year].nil? ? "" : "#{@start[:year]} "}#{OSM_MONTHS[@start[:month]-1]}"
|
29
30
|
if !@end.nil?
|
30
|
-
result += "-#{@
|
31
|
+
result += "-#{@start[:year] == @end[:year] ? "" : "#{@end[:year]} "}#{OSM_MONTHS[@end[:month]-1]}"
|
31
32
|
end
|
32
|
-
when "
|
33
|
-
result = "#{
|
33
|
+
when "year"
|
34
|
+
result = "#{@start[:year]}"
|
34
35
|
if !@end.nil?
|
35
|
-
result += "-#{
|
36
|
+
result += "-#{@end[:year]}"
|
36
37
|
end
|
37
38
|
when "always"
|
38
39
|
result = ""
|
@@ -55,12 +56,6 @@ module OpeningHoursConverter
|
|
55
56
|
else
|
56
57
|
result = "le #{@start[:day]} #{IRL_MONTHS[@start[:month] - 1]}"
|
57
58
|
end
|
58
|
-
when "week"
|
59
|
-
if !@end.nil?
|
60
|
-
result = "toutes les semaines de la semaine #{@start[:week]} à la semaine #{@end[:week]}"
|
61
|
-
else
|
62
|
-
result = "la semaine #{@start[:week]}"
|
63
|
-
end
|
64
59
|
when "month"
|
65
60
|
if !@end.nil?
|
66
61
|
result = "toutes les semaines de #{IRL_MONTHS[@start[:month] - 1]} à #{IRL_MONTHS[@endd[:month] - 1]}"
|
@@ -73,39 +68,39 @@ module OpeningHoursConverter
|
|
73
68
|
return result
|
74
69
|
end
|
75
70
|
|
76
|
-
def day(start_day, start_month, end_day=nil, end_month=nil)
|
71
|
+
def day(start_day, start_month, start_year=nil, end_day=nil, end_month=nil, end_year=nil)
|
77
72
|
if start_day.nil? || start_month.nil?
|
78
|
-
raise(ArgumentError, "start_day and
|
73
|
+
raise(ArgumentError, "start_day, start_month and start_year are required")
|
79
74
|
end
|
80
|
-
@start = { day: start_day, month: start_month }
|
81
|
-
if (!end_day.nil? && !end_month.nil? && (end_day != start_day || end_month != start_month))
|
82
|
-
@end = { day: end_day, month: end_month }
|
75
|
+
@start = { day: start_day, month: start_month, year: start_year }
|
76
|
+
if (!end_day.nil? && !end_month.nil? && (end_day != start_day || end_month != start_month || (!start_year.nil? && !end_year.nil? && end_year != start_year)))
|
77
|
+
@end = { day: end_day, month: end_month, year: end_year }
|
83
78
|
end
|
84
79
|
@type = "day"
|
85
80
|
self
|
86
81
|
end
|
87
82
|
|
88
|
-
def
|
89
|
-
if
|
90
|
-
raise(ArgumentError, "
|
83
|
+
def month(start_month, start_year=nil, end_month=nil, end_year=nil)
|
84
|
+
if start_month.nil?
|
85
|
+
raise(ArgumentError, "start_month is required")
|
91
86
|
end
|
92
|
-
@start = {
|
93
|
-
|
94
|
-
@end = {
|
87
|
+
@start = { month: start_month, year: start_year }
|
88
|
+
if !end_month.nil? && (end_month != start_month || (!start_year.nil? && !end_year.nil? && end_year != start_year))
|
89
|
+
@end = { month: end_month, year: end_year }
|
95
90
|
end
|
96
|
-
@type = "
|
91
|
+
@type = "month"
|
97
92
|
self
|
98
93
|
end
|
99
94
|
|
100
|
-
def
|
101
|
-
if
|
102
|
-
raise(ArgumentError, "
|
95
|
+
def year(start_year, end_year=nil)
|
96
|
+
if start_year.nil?
|
97
|
+
raise(ArgumentError, "start_year is required")
|
103
98
|
end
|
104
|
-
@start = {
|
105
|
-
unless
|
106
|
-
@end = {
|
99
|
+
@start = { year: start_year }
|
100
|
+
unless end_year.nil? || end_year == start_year
|
101
|
+
@end = { year: end_year }
|
107
102
|
end
|
108
|
-
@type = "
|
103
|
+
@type = "year"
|
109
104
|
self
|
110
105
|
end
|
111
106
|
|
@@ -117,9 +112,10 @@ module OpeningHoursConverter
|
|
117
112
|
end
|
118
113
|
|
119
114
|
def is_full_month?
|
120
|
-
if @type == "month" && @end.nil?
|
121
|
-
|
122
|
-
|
115
|
+
return true if @type == "month" && @end.nil?
|
116
|
+
return false if @end.nil?
|
117
|
+
return false if !@start[:year].nil? && !@end[:year].nil? && @start[:year] != @end[:year]
|
118
|
+
if @type == "day"
|
123
119
|
@start[:day] == 1 && !@end.nil? && @start[:month] == @end[:month] &&
|
124
120
|
!@end[:day].nil? && @end[:day] == MONTH_END_DAY[@end[:month] - 1]
|
125
121
|
else
|
@@ -128,137 +124,140 @@ module OpeningHoursConverter
|
|
128
124
|
end
|
129
125
|
|
130
126
|
def starts_month?
|
131
|
-
@type == "month" || @type == "always" || (@type == "day" && @start[:day] == 1)
|
127
|
+
@type == "month" || @type == "always" || @type == "year" || (@type == "day" && @start[:day] == 1)
|
132
128
|
end
|
133
129
|
|
134
130
|
def ends_month?
|
135
|
-
@type == "month" || @type == "always" || (@type == "day" && !@end.nil? && @end[:day] == MONTH_END_DAY[@end[:month] - 1])
|
131
|
+
@type == "month" || @type == "always" || @type == "year" || (@type == "day" && !@end.nil? && @end[:day] == MONTH_END_DAY[@end[:month] - 1])
|
132
|
+
end
|
133
|
+
|
134
|
+
def is_full_year?
|
135
|
+
return true if @end.nil? && type == "year"
|
136
|
+
return false if @end.nil?
|
137
|
+
return false if !@start[:year].nil? && !@end[:year].nil? && @start[:year] != @end[:year]
|
138
|
+
if @type == "month"
|
139
|
+
@start[:month] == 1 && !@end.nil? && @start[:year] == @end[:year] && !@end[:month].nil? && @end[:month] == 12
|
140
|
+
elsif @type == "day"
|
141
|
+
@start[:day] == 1 && @start[:month] == 1 && !@end.nil? && !@start[:year].nil? && !@end[:year].nil? && @start[:year] == @end[:year] &&
|
142
|
+
!@end[:month].nil? && @end[:month] == 12 && !@end[:day].nil? && @end[:day] == MONTH_END_DAY[@end[:month] - 1]
|
143
|
+
else
|
144
|
+
false
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
def starts_year?
|
149
|
+
@type == "year" || @type == "always" || (@type == "day" && @start[:day] == 1 && @start[:month] == 1) || (@type == "month" && @start[:month] == 1)
|
150
|
+
end
|
151
|
+
|
152
|
+
def ends_year?
|
153
|
+
@type == "year" || @type == "always" || (@type == "day" && !@end.nil? && @end[:month] == 12 && @end[:day] == MONTH_END_DAY[@end[:month] - 1])
|
136
154
|
end
|
137
155
|
|
138
156
|
def contains?(o)
|
157
|
+
return false if o.type == "always"
|
139
158
|
result = false
|
140
159
|
if self.equals(o)
|
141
160
|
result = false
|
142
161
|
elsif @type == "always"
|
143
162
|
result = true
|
144
|
-
|
145
|
-
|
146
|
-
|
163
|
+
else
|
164
|
+
my = to_day
|
165
|
+
o = o.to_day
|
166
|
+
result = has_superior_or_equal_start_day?(my, o) && has_inferior_or_equal_end_day?(my, o)
|
167
|
+
end
|
168
|
+
return result
|
169
|
+
end
|
147
170
|
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
171
|
+
def has_superior_or_equal_start_day?(my, o)
|
172
|
+
result = false
|
173
|
+
if has_start_year?(o) && has_start_year?(my)
|
174
|
+
result = o.start[:year] > my.start[:year] || (o.start[:year] == my.start[:year] && has_superior_start_month?(my, o))
|
175
|
+
elsif !has_start_year?(o) && !has_start_year?(my)
|
176
|
+
result = has_superior_start_month?(my, o)
|
177
|
+
end
|
178
|
+
result
|
179
|
+
end
|
157
180
|
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
result = true
|
173
|
-
elsif o.end.nil? && ((!@end.nil? && o.start[:week] <= @end[:week]) || o.start[:week] == @start[:week])
|
174
|
-
result = true
|
175
|
-
end
|
176
|
-
end
|
181
|
+
def has_superior_start_month?(my, o)
|
182
|
+
(o.start[:month] > my.start[:month] ||
|
183
|
+
(o.start[:month] == my.start[:month] &&
|
184
|
+
o.start[:day] >= my.start[:day]))
|
185
|
+
end
|
186
|
+
|
187
|
+
def has_inferior_or_equal_end_day?(my, o)
|
188
|
+
result = false
|
189
|
+
return false if my.end.nil?
|
190
|
+
if !o.end.nil?
|
191
|
+
if has_end_year?(o) && has_end_year?(my)
|
192
|
+
result = o.end[:year] < my.end[:year] || (o.end[:year] == my.end[:year] && has_inferior_end_month?(my, o))
|
193
|
+
elsif !has_end_year?(o) && !has_end_year?(my)
|
194
|
+
result = has_inferior_end_month?(my, o)
|
177
195
|
end
|
178
|
-
|
179
|
-
if o
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
elsif o.end.nil? && ((!@end.nil? && o.start[:month] <= @end[:month]) || o.start[:month] == @start[:month])
|
184
|
-
result = true
|
185
|
-
end
|
186
|
-
end
|
187
|
-
elsif o.type == "day"
|
188
|
-
if !o.end.nil?
|
189
|
-
if @end.nil?
|
190
|
-
if o.start[:month] == @start[:month] &&
|
191
|
-
o.end[:month] == @start[:month] &&
|
192
|
-
((o.start[:day] >= 1 && o.end[:day] < MONTH_END_DAY[o.start[:month]-1]) ||
|
193
|
-
(o.start[:day] > 1 && o.end[:day] <= MONTH_END_DAY[o.start[:month]-1]))
|
194
|
-
result = true
|
195
|
-
end
|
196
|
-
else
|
197
|
-
if o.start[:month] >= @start[:month] && o.end[:month] <= @end[:month]
|
198
|
-
if ((o.start[:month] > @start[:month] && o.end[:month] < @end[:month]) ||
|
199
|
-
(o.start[:month] == @start[:month] && o.end[:month] < @end[:month] && o.start.day > 1) ||
|
200
|
-
(o.start[:month] > @start[:month] && o.end[:month] == @end[:month] && o.end[:day] < MONTH_END_DAY[o.end[:month]-1]) ||
|
201
|
-
(o.start[:day] >= 1 && o.end[:day] < MONTH_END_DAY[o.end[:month]-1]) ||
|
202
|
-
(o.start[:day] > 1 && o.end[:day] <= MONTH_END_DAY[o.end[:month]-1]))
|
203
|
-
result = true
|
204
|
-
end
|
205
|
-
end
|
206
|
-
end
|
207
|
-
else
|
208
|
-
if @end.nil?
|
209
|
-
if @start[:month] == o.start[:month]
|
210
|
-
result = true
|
211
|
-
end
|
212
|
-
else
|
213
|
-
if o.start[:month] >= @start[:month] && o.start[:month] <= @end[:month]
|
214
|
-
result = true
|
215
|
-
end
|
216
|
-
end
|
217
|
-
end
|
196
|
+
else
|
197
|
+
if has_start_year?(o) && has_end_year?(my)
|
198
|
+
result = o.start[:year] < my.end[:year] || (o.start[:year] == my.end[:year] && has_inferior_end_month?(my, o))
|
199
|
+
elsif !has_start_year?(o) && !has_end_year?(my)
|
200
|
+
result = has_inferior_end_month?(my, o)
|
218
201
|
end
|
219
202
|
end
|
220
|
-
|
203
|
+
|
204
|
+
result
|
205
|
+
end
|
206
|
+
|
207
|
+
def has_inferior_end_month?(my, o)
|
208
|
+
if !o.end.nil?
|
209
|
+
(o.end[:month] < my.end[:month] ||
|
210
|
+
(o.end[:month] == my.end[:month] &&
|
211
|
+
o.end[:day] <= my.end[:day]))
|
212
|
+
else
|
213
|
+
(o.start[:month] < my.end[:month] ||
|
214
|
+
(o.start[:month] == my.end[:month] &&
|
215
|
+
o.start[:day] <= my.end[:day]))
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
def has_start_year?(date)
|
220
|
+
!date.start[:year].nil?
|
221
|
+
end
|
222
|
+
def has_end_year?(date)
|
223
|
+
!date.end[:year].nil?
|
221
224
|
end
|
222
225
|
|
223
226
|
def equals(o)
|
224
227
|
return false unless o.instance_of?(OpeningHoursConverter::WideInterval)
|
225
228
|
return @type == "always" if o.type == "always"
|
226
|
-
|
227
|
-
|
229
|
+
return false if @type == "always"
|
230
|
+
self_to_day = to_day
|
231
|
+
o_to_day = o.to_day
|
232
|
+
return (self_to_day.start[:year] == o_to_day.start[:year] &&
|
233
|
+
self_to_day.start[:month] == o_to_day.start[:month] &&
|
234
|
+
self_to_day.start[:day] == o_to_day.start[:day]) &&
|
235
|
+
((self_to_day.end.nil? && o_to_day.end.nil?) || ((!self_to_day.end.nil? && !o_to_day.end.nil?) &&
|
236
|
+
(self_to_day.end[:year] == o_to_day.end[:year] &&
|
237
|
+
self_to_day.end[:month] == o_to_day.end[:month] &&
|
238
|
+
self_to_day.end[:day] == o_to_day.end[:day])))
|
239
|
+
end
|
240
|
+
def to_day
|
228
241
|
case @type
|
229
|
-
when "always"
|
230
|
-
result = o.start.nil?
|
231
242
|
when "day"
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
o.end[:month] == @end[:month] &&
|
238
|
-
o.end[:day] == @end[:day]))) ||
|
239
|
-
(o.type == "month" &&
|
240
|
-
o.start[:month] == @start[:month] &&
|
241
|
-
(o.is_full_month? && is_full_month?) ||
|
242
|
-
(!o.end.nil? && !@end.nil? &&
|
243
|
-
o.end[:month] == @end[:month] &&
|
244
|
-
o.ends_month? && ends_month?)))
|
245
|
-
when "week"
|
246
|
-
result = (o.type == "week" &&
|
247
|
-
o.start[:week] == @start[:week] &&
|
248
|
-
(o.end == @end ||
|
249
|
-
(!o.end.nil? && !@end.nil? && o.end[:week] == @end[:week])))
|
243
|
+
if @end.nil?
|
244
|
+
OpeningHoursConverter::WideInterval.new.day(@start[:day], @start[:month], @start[:year])
|
245
|
+
else
|
246
|
+
OpeningHoursConverter::WideInterval.new.day(@start[:day], @start[:month], @start[:year], @end[:day], @end[:month], @end[:year])
|
247
|
+
end
|
250
248
|
when "month"
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
249
|
+
if @end.nil?
|
250
|
+
OpeningHoursConverter::WideInterval.new.day(1, @start[:month], @start[:year], MONTH_END_DAY[@start[:month] - 1], @start[:month], @start[:year])
|
251
|
+
else
|
252
|
+
OpeningHoursConverter::WideInterval.new.day(1, @start[:month], @start[:year], MONTH_END_DAY[@end[:month] - 1], @end[:month], @end[:year])
|
253
|
+
end
|
254
|
+
when "year"
|
255
|
+
if @end.nil?
|
256
|
+
OpeningHoursConverter::WideInterval.new.day(1, 1, @start[:year], 31, 12, @start[:year])
|
257
|
+
else
|
258
|
+
OpeningHoursConverter::WideInterval.new.day(1, 1, @start[:year], 31, 12, @end[:year])
|
259
|
+
end
|
260
260
|
end
|
261
|
-
result
|
262
261
|
end
|
263
262
|
end
|
264
263
|
end
|
metadata
CHANGED
@@ -1,16 +1,17 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: opening_hours_converter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ziserman Martin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-10-
|
11
|
+
date: 2017-10-11 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
|
-
description: Datetime range to openinghours, openinghours to datetime range
|
13
|
+
description: Datetime range to openinghours, openinghours to datetime range. Very
|
14
|
+
strongly inspired by yohours.
|
14
15
|
email: tech@publidata.io
|
15
16
|
executables: []
|
16
17
|
extensions: []
|