opening_hours_converter 0.0.6 → 1.0.0
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.
- 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
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ce16e76b1a7b611c0b82c3416e9282df1638df76
|
4
|
+
data.tar.gz: d41e59d6d13771a1b18a8c3e4e1edc42b4ab8b8d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 834a523ad7ebe902b4a857a9f77641cf8bad74f58a4188839c9a956f5ac73c780eefcf98bc2123af5542269f8e66d73e5d9e1a807e7140d395b21bf7c4f09fce
|
7
|
+
data.tar.gz: f91a6e6b1051a74c727676c7359801070a70bd9b6d551fa9a8ec323b1bd763121959b22bcdb621d844903feb9b36ddc211e141e7021963fd548a1d21348e20a3
|
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'date'
|
1
2
|
module OpeningHoursConverter
|
2
3
|
module Constants
|
3
4
|
DAYS = {
|
@@ -18,5 +19,7 @@ module OpeningHoursConverter
|
|
18
19
|
MINUTES_MAX = 1440
|
19
20
|
DAYS_MAX = 6
|
20
21
|
YEAR_DAYS_MAX = 365
|
22
|
+
YEAR_MIN = DateTime.now.year - 1
|
23
|
+
YEAR_MAX = DateTime.now.year + 5
|
21
24
|
end
|
22
25
|
end
|
@@ -27,11 +27,7 @@ module OpeningHoursConverter
|
|
27
27
|
else
|
28
28
|
@typical = OpeningHoursConverter::Week.new
|
29
29
|
end
|
30
|
-
when "week"
|
31
|
-
@typical = OpeningHoursConverter::Week.new
|
32
|
-
when "month"
|
33
|
-
@typical = OpeningHoursConverter::Week.new
|
34
|
-
when "always"
|
30
|
+
when "week", "month", "year", "always"
|
35
31
|
@typical = OpeningHoursConverter::Week.new
|
36
32
|
end
|
37
33
|
end
|
@@ -27,7 +27,7 @@ module OpeningHoursConverter
|
|
27
27
|
end
|
28
28
|
range_general_id -= 1
|
29
29
|
end
|
30
|
-
|
30
|
+
# binding.pry
|
31
31
|
if date_range_index == 0 || range_general.nil?
|
32
32
|
if date_range.defines_typical_week?
|
33
33
|
if !range_general_for.nil?
|
@@ -38,72 +38,53 @@ module OpeningHoursConverter
|
|
38
38
|
else
|
39
39
|
oh_rules = build_day(date_range)
|
40
40
|
end
|
41
|
-
end
|
42
|
-
|
43
|
-
oh_rule_index = 0
|
44
|
-
|
45
|
-
while oh_rule_index < oh_rules.length
|
46
|
-
oh_rule = oh_rules[oh_rule_index]
|
47
|
-
oh_rule_added = false
|
48
|
-
rule_index = 0
|
49
41
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
42
|
+
# oh_rule_index = 0
|
43
|
+
# for oh_rule_index in 0...oh_rules.length
|
44
|
+
oh_rules.map do |oh_rule|
|
45
|
+
# while oh_rule_index < oh_rules.length
|
46
|
+
|
47
|
+
# oh_rule = oh_rules[oh_rule_index]
|
48
|
+
oh_rule_added = false
|
49
|
+
rule_index = 0
|
50
|
+
|
51
|
+
while !oh_rule_added && rule_index < rules.length
|
52
|
+
if rules[rule_index].same_time?(oh_rule) && !rules[rule_index].equals(oh_rule)
|
53
|
+
begin
|
54
|
+
for date_id in 0...oh_rule.date.length
|
55
|
+
rules[rule_index].add_date(oh_rule.date[date_id])
|
56
|
+
end
|
57
|
+
oh_rule_added = true
|
58
|
+
rescue Exception => e
|
59
|
+
puts e
|
60
|
+
rule_index += 1
|
55
61
|
end
|
56
|
-
|
57
|
-
|
58
|
-
puts e
|
59
|
-
# if(
|
60
|
-
# ohrule.getDate()[0].getWideType() == "holiday"
|
61
|
-
# && ohrule.getDate()[0].getWideValue() == "PH"
|
62
|
-
# && rules[ruleId].getDate()[0].getWideType() == "always"
|
63
|
-
# ) {
|
64
|
-
# rules[ruleId].addPhOpeningHoursConverter::Weekday();
|
65
|
-
# ohruleAdded = true;
|
66
|
-
# }
|
67
|
-
# else if(
|
68
|
-
# rules[ruleId].getDate()[0].getWideType() == "holiday"
|
69
|
-
# && rules[ruleId].getDate()[0].getWideValue() == "PH"
|
70
|
-
# && ohrule.getDate()[0].getWideType() == "always"
|
71
|
-
# ) {
|
72
|
-
# ohrule.addPhOpeningHoursConverter::Weekday();
|
73
|
-
# rules[ruleId] = ohrule;
|
74
|
-
# ohruleAdded = true;
|
75
|
-
# }
|
76
|
-
# else {
|
77
|
-
# ruleId++;
|
78
|
-
# }
|
79
|
-
rule_index += 1
|
62
|
+
else
|
63
|
+
rule_index+=1
|
80
64
|
end
|
81
|
-
else
|
82
|
-
rule_index+=1
|
83
|
-
end
|
84
65
|
|
85
|
-
|
66
|
+
end
|
86
67
|
|
87
|
-
|
88
|
-
|
89
|
-
|
68
|
+
if !oh_rule_added
|
69
|
+
rules << oh_rule
|
70
|
+
end
|
90
71
|
|
91
|
-
|
92
|
-
|
72
|
+
if oh_rule == oh_rules.last && oh_rule.has_overwritten_weekday?
|
73
|
+
oh_rule_over = OpeningHoursConverter::OpeningHoursRule.new
|
93
74
|
|
94
|
-
|
95
|
-
|
75
|
+
oh_rule.date.each do |date|
|
76
|
+
oh_rule_over.add_date(OpeningHoursConverter::OpeningHoursDate.new(date.wide, date.wide_type, date.weekdays_over))
|
77
|
+
end
|
78
|
+
oh_rule_over.add_time(OpeningHoursConverter::OpeningHoursTime.new)
|
79
|
+
oh_rules << oh_rule_over
|
96
80
|
end
|
97
|
-
oh_rule_over.add_time(OpeningHoursConverter::OpeningHoursTime.new)
|
98
|
-
oh_rules << oh_rule_over
|
99
|
-
oh_rule_index += 1
|
100
|
-
else
|
101
|
-
oh_rule_index += 1
|
102
81
|
end
|
103
82
|
end
|
104
83
|
end
|
105
84
|
end
|
106
85
|
|
86
|
+
# binding.pry
|
87
|
+
|
107
88
|
|
108
89
|
result = ""
|
109
90
|
rules.each_with_index do |rule, rule_index|
|
@@ -120,7 +101,7 @@ module OpeningHoursConverter
|
|
120
101
|
intervals = date_range.typical.get_intervals(true)
|
121
102
|
|
122
103
|
rule = OpeningHoursConverter::OpeningHoursRule.new
|
123
|
-
date = OpeningHoursConverter::OpeningHoursDate.new(date_range.wide_interval
|
104
|
+
date = OpeningHoursConverter::OpeningHoursDate.new(date_range.wide_interval, date_range.wide_interval.type, [-1])
|
124
105
|
rule.add_date(date)
|
125
106
|
|
126
107
|
intervals.each do |interval|
|
@@ -133,9 +114,10 @@ module OpeningHoursConverter
|
|
133
114
|
end
|
134
115
|
|
135
116
|
def build_week(date_range)
|
117
|
+
# binding.pry
|
136
118
|
result = []
|
137
119
|
intervals = date_range.typical.get_intervals(true)
|
138
|
-
time_intervals = create_time_intervals(date_range.wide_interval
|
120
|
+
time_intervals = create_time_intervals(date_range.wide_interval, date_range.wide_interval.type, intervals)
|
139
121
|
|
140
122
|
monday0 = time_intervals[0]
|
141
123
|
sunday24 = time_intervals[1]
|
@@ -203,7 +185,7 @@ module OpeningHoursConverter
|
|
203
185
|
intervals = date_range.typical.get_intervals_diff(general_date_range.typical)
|
204
186
|
|
205
187
|
time_intervals = create_time_intervals(
|
206
|
-
date_range.wide_interval
|
188
|
+
date_range.wide_interval,
|
207
189
|
date_range.wide_interval.type,
|
208
190
|
intervals[:open])
|
209
191
|
monday0 = time_intervals[0]
|
@@ -306,14 +288,15 @@ module OpeningHoursConverter
|
|
306
288
|
return result
|
307
289
|
end
|
308
290
|
|
309
|
-
def create_time_intervals(
|
291
|
+
def create_time_intervals(wide_interval, type, intervals)
|
292
|
+
# binding.pry
|
310
293
|
monday0 = -1
|
311
294
|
sunday24 = -1
|
312
295
|
|
313
296
|
days = []
|
314
|
-
for i in 0...7
|
297
|
+
for i in 0...7
|
315
298
|
days << OpeningHoursConverter::OpeningHoursRule.new
|
316
|
-
days[i].add_date(OpeningHoursConverter::OpeningHoursDate.new(
|
299
|
+
days[i].add_date(OpeningHoursConverter::OpeningHoursDate.new(wide_interval, type, [ i ]))
|
317
300
|
end
|
318
301
|
|
319
302
|
intervals.each do |interval|
|
@@ -335,7 +318,7 @@ module OpeningHoursConverter
|
|
335
318
|
days[interval.day_end].add_time(OpeningHoursConverter::OpeningHoursTime.new(0, interval.end))
|
336
319
|
end
|
337
320
|
else
|
338
|
-
for j in interval.day_start..interval.day_end
|
321
|
+
for j in interval.day_start..interval.day_end
|
339
322
|
if j == interval.day_start
|
340
323
|
days[j].add_time(OpeningHoursConverter::OpeningHoursTime.new(interval.start, MINUTES_MAX))
|
341
324
|
elsif j == interval.day_end
|
@@ -14,6 +14,9 @@ module OpeningHoursConverter
|
|
14
14
|
@RGX_WEEKDAY = /^(((Mo|Tu|We|Th|Fr|Sa|Su)(\-(Mo|Tu|We|Th|Fr|Sa|Su))?)|(PH|SH|easter))(,(((Mo|Tu|We|Th|Fr|Sa|Su)(\-(Mo|Tu|We|Th|Fr|Sa|Su))?)|(PH|SH|easter)))*$/
|
15
15
|
@RGX_HOLIDAY = /^(PH|SH|easter)$/
|
16
16
|
@RGX_WD = /^(Mo|Tu|We|Th|Fr|Sa|Su)(\-(Mo|Tu|We|Th|Fr|Sa|Su))?$/
|
17
|
+
@RGX_YEAR = /^(\d{4})(\-(\d{4}))?$/
|
18
|
+
@RGX_YEAR_MONTH_DAY = /^(\d{4}) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ([012]?[0-9]|3[01])(\-((\d{4}) )?((Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) )?([012]?[0-9]|3[01]))?\:?$/
|
19
|
+
@RGX_YEAR_MONTH = /^(\d{4}) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)(\-((\d{4}) )?((Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)))?\:?$/
|
17
20
|
end
|
18
21
|
|
19
22
|
def parse(oh)
|
@@ -30,18 +33,7 @@ module OpeningHoursConverter
|
|
30
33
|
weekdays = nil
|
31
34
|
weeks = nil
|
32
35
|
months = nil
|
33
|
-
|
34
|
-
single_time = nil
|
35
|
-
from = nil
|
36
|
-
to = nil
|
37
|
-
|
38
|
-
single_month = nil
|
39
|
-
month_from = nil
|
40
|
-
month_to = nil
|
41
|
-
|
42
|
-
single_week = nil
|
43
|
-
week_from = nil
|
44
|
-
week_to = nil
|
36
|
+
years = nil
|
45
37
|
|
46
38
|
date_ranges = nil
|
47
39
|
date_range = nil
|
@@ -61,29 +53,10 @@ module OpeningHoursConverter
|
|
61
53
|
current_token -= 1
|
62
54
|
end
|
63
55
|
|
64
|
-
|
65
|
-
# get time selector
|
66
|
-
from = nil
|
67
|
-
to = nil
|
68
56
|
times = []
|
69
57
|
if current_token >= 0 && is_time?(tokens[current_token])
|
70
58
|
time_selector = tokens[current_token]
|
71
|
-
|
72
|
-
if time_selector == "24/7"
|
73
|
-
times << {from: 0, to: 24*60}
|
74
|
-
else
|
75
|
-
time_selector = time_selector.split(',')
|
76
|
-
time_selector.each do |ts|
|
77
|
-
single_time = ts.split('-')
|
78
|
-
from = as_minutes(single_time[0])
|
79
|
-
if single_time.length > 1
|
80
|
-
to = as_minutes(single_time[1])
|
81
|
-
else
|
82
|
-
to = from
|
83
|
-
end
|
84
|
-
times << {from: from, to: to}
|
85
|
-
end
|
86
|
-
end
|
59
|
+
times = get_times(time_selector)
|
87
60
|
current_token -= 1
|
88
61
|
end
|
89
62
|
|
@@ -93,147 +66,108 @@ module OpeningHoursConverter
|
|
93
66
|
weekdays << {from: 0, to: 6}
|
94
67
|
elsif current_token >= 0 && is_weekday?(tokens[current_token])
|
95
68
|
weekday_selector = tokens[current_token]
|
96
|
-
|
97
|
-
weekday_selector.each do |wd|
|
98
|
-
if !(@RGX_HOLIDAY =~ wd).nil?
|
99
|
-
elsif !(@RGX_WD =~ wd).nil?
|
100
|
-
single_weekday = wd.split('-')
|
101
|
-
wd_from = OSM_DAYS.find_index(single_weekday[0])
|
102
|
-
if single_weekday.length > 1
|
103
|
-
wd_to = OSM_DAYS.find_index(single_weekday[1])
|
104
|
-
else
|
105
|
-
wd_to = wd_from
|
106
|
-
end
|
107
|
-
|
108
|
-
weekdays << {from: wd_from, to: wd_to}
|
109
|
-
else
|
110
|
-
raise ArgumentError, "Invalid weekday interval : #{wd}"
|
111
|
-
end
|
112
|
-
end
|
69
|
+
weekdays = get_weekdays(weekday_selector)
|
113
70
|
current_token -= 1
|
114
71
|
end
|
115
72
|
|
116
|
-
|
73
|
+
# years = []
|
74
|
+
# if current_token >= 0 && is_year?(tokens[current_token])
|
75
|
+
# year_selector = tokens[current_token]
|
76
|
+
# year_selector = year_selector.split(',')
|
77
|
+
# year_selector.each do |y|
|
78
|
+
# single_year = y.gsub(/\:$/, '').split('-')
|
79
|
+
# year_from = single_year[0]
|
80
|
+
# if single_year.length > 1
|
81
|
+
# year_to = single_year[1]
|
82
|
+
# else
|
83
|
+
# year_to = year_from
|
84
|
+
# end
|
85
|
+
|
86
|
+
# years << {from: year_from, to: year_to}
|
87
|
+
# end
|
88
|
+
# current_token -= 1
|
89
|
+
# end
|
90
|
+
|
117
91
|
months = []
|
92
|
+
years = []
|
118
93
|
if current_token >= 0
|
94
|
+
|
119
95
|
wide_range_selector = tokens[0]
|
120
96
|
for i in 1..current_token
|
121
97
|
wide_range_selector += " #{tokens[i]}"
|
122
98
|
end
|
123
99
|
if wide_range_selector.length > 0
|
124
|
-
wide_range_selector = wide_range_selector.
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
if (!month_selector.nil? && !week_selector.nil?)
|
140
|
-
raise ArgumentError, "unsupported simultaneous month and week selector"
|
141
|
-
elsif !month_selector.nil?
|
142
|
-
month_selector = month_selector.split(',')
|
143
|
-
|
144
|
-
month_selector.each do |ms|
|
145
|
-
if ms == "SH"
|
146
|
-
elsif !(@RGX_MONTH =~ ms).nil?
|
147
|
-
single_month = ms.split('-')
|
148
|
-
month_from = OSM_MONTHS.find_index(single_month[0]) + 1
|
149
|
-
if month_from < 1
|
150
|
-
raise ArgumentError, "Invalid month : #{single_month[0]}"
|
151
|
-
end
|
152
|
-
|
153
|
-
if single_month.length > 1
|
154
|
-
month_to = OSM_MONTHS.find_index(single_month[1]) + 1
|
155
|
-
if month_to < 1
|
156
|
-
raise ArgumentError, "Invalid month : #{single_month[1]}"
|
157
|
-
end
|
158
|
-
else
|
159
|
-
month_to = month_from
|
160
|
-
end
|
161
|
-
months << {from: month_from, to: month_to}
|
162
|
-
elsif !(@RGX_MONTHDAY =~ ms).nil?
|
163
|
-
single_month = ms.gsub(/\:$/, '').split('-')
|
164
|
-
|
165
|
-
month_from = single_month[0].split(' ')
|
166
|
-
month_from = { day: month_from[1].to_i, month: OSM_MONTHS.find_index(month_from[0]) + 1 }
|
167
|
-
if month_from[:month] < 1
|
168
|
-
raise ArgumentError, "Invalid month : #{month_from.inspect}"
|
169
|
-
end
|
170
|
-
|
171
|
-
if single_month.length > 1
|
172
|
-
month_to = single_month[1].split(' ')
|
173
|
-
month_to = { day: month_to[1].to_i, month: OSM_MONTHS.find_index(month_to[0]) + 1 }
|
174
|
-
if month_to[:month] < 1
|
175
|
-
raise ArgumentError, "Invalid month : #{month_to.inspect}"
|
176
|
-
end
|
177
|
-
else
|
178
|
-
month_to = nil
|
179
|
-
end
|
180
|
-
months << {from_day: month_from, to_day: month_to}
|
181
|
-
else
|
182
|
-
raise ArgumentError, "Unsupported month selector #{ms}"
|
183
|
-
end
|
184
|
-
end
|
185
|
-
elsif !week_selector.nil?
|
186
|
-
week_selector = week_selector.split(',')
|
187
|
-
week_selector.each do |ws|
|
188
|
-
single_week = ws.split('-')
|
189
|
-
week_from = single_week[0].to_i
|
190
|
-
if single_week.length > 1
|
191
|
-
week_to = single_week[1].to_i
|
192
|
-
else
|
193
|
-
week_to = nil
|
194
|
-
end
|
195
|
-
weeks << {from: week_from, to: week_to}
|
100
|
+
wide_range_selector = wide_range_selector.strip
|
101
|
+
wide_range_selector = wide_range_selector.split(',')
|
102
|
+
wide_range_selector.each do |wrs|
|
103
|
+
if !(@RGX_YEAR_MONTH_DAY =~ wrs).nil?
|
104
|
+
years << get_year_month_day(wrs)
|
105
|
+
elsif !(@RGX_YEAR_MONTH =~ wrs).nil?
|
106
|
+
years << get_year_month(wrs)
|
107
|
+
elsif !(@RGX_MONTHDAY =~ wrs).nil?
|
108
|
+
months << get_month_day(wrs)
|
109
|
+
elsif !(@RGX_MONTH =~ wrs).nil?
|
110
|
+
months << get_month(wrs)
|
111
|
+
elsif !(@RGX_YEAR =~ wrs).nil?
|
112
|
+
years << get_year(wrs)
|
113
|
+
else
|
114
|
+
raise ArgumentError, "Unsupported selector #{wrs}"
|
196
115
|
end
|
197
|
-
else
|
198
|
-
raise ArgumentError, "Invalid date selector"
|
199
116
|
end
|
200
117
|
end
|
201
118
|
end
|
119
|
+
|
202
120
|
if current_token == tokens.length - 1
|
203
121
|
raise ArgumentError, "Unreadable string"
|
204
122
|
end
|
205
123
|
# puts "months : #{months}"
|
206
|
-
# puts "weeks : #{weeks}"
|
207
124
|
# puts "weekdays : #{weekdays}"
|
208
125
|
# puts "times : #{times}"
|
126
|
+
# puts "years : #{years}"
|
209
127
|
# puts "rule_modifier : #{rule_modifier}"
|
210
128
|
|
211
129
|
date_ranges = []
|
212
|
-
|
213
130
|
if months.length > 0
|
214
131
|
months.each do |month|
|
215
132
|
if !month[:from_day].nil?
|
216
133
|
if !month[:to_day].nil?
|
217
|
-
date_range = OpeningHoursConverter::WideInterval.new.day(month[:from_day][:day], month[:from_day][:month], month[:
|
134
|
+
date_range = OpeningHoursConverter::WideInterval.new.day(month[:from_day][:day], month[:from_day][:month], month[:from_day][:year],
|
135
|
+
month[:to_day][:day], month[:to_day][:month], month[:to_day][:year])
|
218
136
|
else
|
219
|
-
date_range = OpeningHoursConverter::WideInterval.new.day(month[:from_day][:day], month[:from_day][:month])
|
137
|
+
date_range = OpeningHoursConverter::WideInterval.new.day(month[:from_day][:day], month[:from_day][:month], month[:from_day][:year])
|
220
138
|
end
|
221
139
|
date_ranges << date_range
|
222
140
|
else
|
223
141
|
if !month[:to].nil?
|
224
|
-
date_range = OpeningHoursConverter::WideInterval.new.month(month[:from], month[:to])
|
142
|
+
date_range = OpeningHoursConverter::WideInterval.new.month(month[:from], nil, month[:to])
|
225
143
|
else
|
226
144
|
date_range = OpeningHoursConverter::WideInterval.new.month(month[:from])
|
227
145
|
end
|
228
146
|
date_ranges << date_range
|
229
147
|
end
|
230
148
|
end
|
231
|
-
elsif
|
232
|
-
|
233
|
-
if !
|
234
|
-
|
235
|
-
|
236
|
-
|
149
|
+
elsif years.length > 0
|
150
|
+
years.each do |year|
|
151
|
+
if !year[:from_day].nil?
|
152
|
+
if !year[:to_day].nil?
|
153
|
+
date_range = OpeningHoursConverter::WideInterval.new.day(year[:from_day][:day], year[:from_day][:month], year[:from_day][:year],
|
154
|
+
year[:to_day][:day], year[:to_day][:month], year[:to_day][:year])
|
155
|
+
else
|
156
|
+
date_range = OpeningHoursConverter::WideInterval.new.day(year[:from_day][:day], year[:from_day][:month], year[:from_day][:year])
|
157
|
+
end
|
158
|
+
elsif !year[:from_month].nil?
|
159
|
+
if !year[:to_month].nil?
|
160
|
+
date_range = OpeningHoursConverter::WideInterval.new.month(year[:from_month][:month], year[:from_month][:year],
|
161
|
+
year[:to_month][:month], year[:to_month][:year])
|
162
|
+
else
|
163
|
+
date_range = OpeningHoursConverter::WideInterval.new.month(year[:from_month][:month], year[:from_month][:year])
|
164
|
+
end
|
165
|
+
elsif !year[:from].nil?
|
166
|
+
if !year[:to].nil?
|
167
|
+
date_range = OpeningHoursConverter::WideInterval.new.year(year[:from], year[:to])
|
168
|
+
else
|
169
|
+
date_range = OpeningHoursConverter::WideInterval.new.year(year[:from])
|
170
|
+
end
|
237
171
|
end
|
238
172
|
date_ranges << date_range
|
239
173
|
end
|
@@ -318,6 +252,168 @@ module OpeningHoursConverter
|
|
318
252
|
return result
|
319
253
|
end
|
320
254
|
|
255
|
+
def get_year(wrs)
|
256
|
+
single_year = wrs.gsub(/\:$/, '').split('-')
|
257
|
+
year_from = single_year[0].to_i
|
258
|
+
if year_from < 1
|
259
|
+
raise ArgumentError, "Invalid year : #{single_year[0]}"
|
260
|
+
end
|
261
|
+
|
262
|
+
if single_year.length > 1
|
263
|
+
year_to = single_year[1].to_i
|
264
|
+
if year_to < 1
|
265
|
+
raise ArgumentError, "Invalid year : #{single_year[1]}"
|
266
|
+
end
|
267
|
+
else
|
268
|
+
year_to = nil
|
269
|
+
end
|
270
|
+
{ from: year_from, to: year_to }
|
271
|
+
end
|
272
|
+
|
273
|
+
def get_month(wrs)
|
274
|
+
single_month = wrs.gsub(/\:$/, '').split('-')
|
275
|
+
month_from = OSM_MONTHS.find_index(single_month[0]) + 1
|
276
|
+
if month_from < 1
|
277
|
+
raise ArgumentError, "Invalid month : #{single_month[0]}"
|
278
|
+
end
|
279
|
+
|
280
|
+
if single_month.length > 1
|
281
|
+
month_to = OSM_MONTHS.find_index(single_month[1]) + 1
|
282
|
+
if month_to < 1
|
283
|
+
raise ArgumentError, "Invalid month : #{single_month[1]}"
|
284
|
+
end
|
285
|
+
else
|
286
|
+
month_to = month_from
|
287
|
+
end
|
288
|
+
{ from: month_from, to: month_to}
|
289
|
+
end
|
290
|
+
|
291
|
+
def get_month_day(wrs)
|
292
|
+
single_month = wrs.gsub(/\:$/, '').split('-')
|
293
|
+
|
294
|
+
month_from = single_month[0].split(' ')
|
295
|
+
month_from = { day: month_from[1].to_i, month: OSM_MONTHS.find_index(month_from[0]) + 1 }
|
296
|
+
if month_from[:month] < 1
|
297
|
+
raise ArgumentError, "Invalid month : #{month_from.inspect}"
|
298
|
+
end
|
299
|
+
|
300
|
+
if single_month.length > 1
|
301
|
+
month_to = single_month[1].split(' ')
|
302
|
+
month_to = { day: month_to[1].to_i, month: OSM_MONTHS.find_index(month_to[0]) + 1 }
|
303
|
+
if month_to[:month] < 1
|
304
|
+
raise ArgumentError, "Invalid month : #{month_to.inspect}"
|
305
|
+
end
|
306
|
+
else
|
307
|
+
month_to = nil
|
308
|
+
end
|
309
|
+
{ from_day: month_from, to_day: month_to }
|
310
|
+
end
|
311
|
+
|
312
|
+
def get_year_month(wrs)
|
313
|
+
single_year_month = wrs.gsub(/\:$/, '').split('-')
|
314
|
+
year_month_from = single_year_month[0].split(' ')
|
315
|
+
year_month_from = { month: OSM_MONTHS.find_index(year_month_from[1]) + 1, year: year_month_from[0].to_i }
|
316
|
+
if year_month_from.length < 1
|
317
|
+
raise ArgumentError, "Invalid year_month : #{year_month_from.inspect}"
|
318
|
+
end
|
319
|
+
if single_year_month.length > 1
|
320
|
+
year_month_to = single_year_month[1].split(' ')
|
321
|
+
if year_month_to.length == 2
|
322
|
+
year_month_to = { month: OSM_MONTHS.find_index(year_month_to[1]) + 1, year: year_month_to[0].to_i }
|
323
|
+
elsif year_month_to.length == 1
|
324
|
+
year_month_to = { month: OSM_MONTHS.find_index(year_month_to[0]) + 1, year: year_month_from[:year] }
|
325
|
+
end
|
326
|
+
if year_month_to.length < 1
|
327
|
+
raise ArgumentError, "Invalid year_month : #{year_month_to.inspect}"
|
328
|
+
end
|
329
|
+
else
|
330
|
+
year_month_to = nil
|
331
|
+
end
|
332
|
+
{ from_month: year_month_from, to_month: year_month_to }
|
333
|
+
end
|
334
|
+
|
335
|
+
def get_year_month_day(wrs)
|
336
|
+
single_year_month_day = wrs.gsub(/\:$/, '').split('-')
|
337
|
+
year_month_day_from = single_year_month_day[0].split(' ')
|
338
|
+
year_month_day_from = { day: year_month_day_from[2].to_i,
|
339
|
+
month: OSM_MONTHS.find_index(year_month_day_from[1]) + 1,
|
340
|
+
year: year_month_day_from[0].to_i }
|
341
|
+
if year_month_day_from.length < 1
|
342
|
+
raise ArgumentError, "Invalid year_month_day : #{year_month_day_from.inspect}"
|
343
|
+
end
|
344
|
+
if single_year_month_day.length > 1
|
345
|
+
year_month_day_to = single_year_month_day[1].split(' ')
|
346
|
+
if year_month_day_to.length == 3
|
347
|
+
year_month_day_to = { day: year_month_day_to[2].to_i,
|
348
|
+
month: OSM_MONTHS.find_index(year_month_day_to[1]) + 1,
|
349
|
+
year: year_month_day_to[0].to_i }
|
350
|
+
elsif year_month_day_to.length == 2
|
351
|
+
year_month_day_to = { day: year_month_day_to[1].to_i,
|
352
|
+
month: OSM_MONTHS.find_index(year_month_day_to[0]) + 1,
|
353
|
+
year: year_month_day_from[:year] }
|
354
|
+
elsif year_month_day_to.length == 1
|
355
|
+
year_month_day_to = { day: year_month_day_to[0].to_i,
|
356
|
+
month: year_month_day_from[:month],
|
357
|
+
year: year_month_day_from[:year] }
|
358
|
+
end
|
359
|
+
if year_month_day_to.length < 1
|
360
|
+
raise ArgumentError, "Invalid year_month_day : #{year_month_day_to.inspect}"
|
361
|
+
end
|
362
|
+
else
|
363
|
+
year_month_day_to = nil
|
364
|
+
end
|
365
|
+
|
366
|
+
{ from_day: year_month_day_from, to_day: year_month_day_to }
|
367
|
+
end
|
368
|
+
|
369
|
+
def get_times(time_selector)
|
370
|
+
times = []
|
371
|
+
from = nil
|
372
|
+
to = nil
|
373
|
+
if time_selector == "24/7"
|
374
|
+
times << {from: 0, to: 24*60}
|
375
|
+
else
|
376
|
+
time_selector = time_selector.split(',')
|
377
|
+
time_selector.each do |ts|
|
378
|
+
single_time = ts.split('-')
|
379
|
+
from = as_minutes(single_time[0])
|
380
|
+
if single_time.length > 1
|
381
|
+
to = as_minutes(single_time[1])
|
382
|
+
else
|
383
|
+
to = from
|
384
|
+
end
|
385
|
+
times << {from: from, to: to}
|
386
|
+
end
|
387
|
+
end
|
388
|
+
times
|
389
|
+
end
|
390
|
+
|
391
|
+
def get_weekdays(weekday_selector)
|
392
|
+
weekdays = []
|
393
|
+
wd_from = nil
|
394
|
+
wd_to = nil
|
395
|
+
|
396
|
+
weekday_selector = weekday_selector.split(',')
|
397
|
+
weekday_selector.each do |wd|
|
398
|
+
if !(@RGX_HOLIDAY =~ wd).nil?
|
399
|
+
elsif !(@RGX_WD =~ wd).nil?
|
400
|
+
single_weekday = wd.split('-')
|
401
|
+
wd_from = OSM_DAYS.find_index(single_weekday[0])
|
402
|
+
if single_weekday.length > 1
|
403
|
+
wd_to = OSM_DAYS.find_index(single_weekday[1])
|
404
|
+
else
|
405
|
+
wd_to = wd_from
|
406
|
+
end
|
407
|
+
|
408
|
+
weekdays << {from: wd_from, to: wd_to}
|
409
|
+
else
|
410
|
+
raise ArgumentError, "Invalid weekday interval : #{wd}"
|
411
|
+
end
|
412
|
+
end
|
413
|
+
|
414
|
+
weekdays
|
415
|
+
end
|
416
|
+
|
321
417
|
def remove_interval(typical, weekdays, times)
|
322
418
|
if weekdays[:from] <= weekdays[:to]
|
323
419
|
for wd in weekdays[:from]..weekdays[:to]
|
@@ -327,7 +423,7 @@ module OpeningHoursConverter
|
|
327
423
|
for wd in weekdays[:from]..6
|
328
424
|
typical.remove_intervals_during_day(wd)
|
329
425
|
end
|
330
|
-
for wd in 0..weekdays[:
|
426
|
+
for wd in 0..weekdays[:to]
|
331
427
|
typical.remove_intervals_during_day(wd)
|
332
428
|
end
|
333
429
|
end
|
@@ -404,5 +500,8 @@ module OpeningHoursConverter
|
|
404
500
|
def is_weekday?(token)
|
405
501
|
!(@RGX_WEEKDAY =~ token).nil?
|
406
502
|
end
|
503
|
+
def is_year?(token)
|
504
|
+
!(@RGX_YEAR =~ token).nil?
|
505
|
+
end
|
407
506
|
end
|
408
507
|
end
|