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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6f1b50fd81f5356288f740d7d620466ce1b600fc
4
- data.tar.gz: 1010e21324ee9f681a76e266dfe171d03d9f2fd1
3
+ metadata.gz: ce16e76b1a7b611c0b82c3416e9282df1638df76
4
+ data.tar.gz: d41e59d6d13771a1b18a8c3e4e1edc42b4ab8b8d
5
5
  SHA512:
6
- metadata.gz: a0fb21373136426155b3b75951d9536ee93aa81003113ea2e519dbc8049b4f0279ffc048cf5f1c394b1056a035c241be42bb62e9f828a9b4d4ed515a0fe3614b
7
- data.tar.gz: a34e90fdf38d357d5dd5338897442603e0ae47a75668252c9460d5be66ab59e2c7e32fb72ee82dd0993b641db23033526385a249eab8469afce9c801d58128c9
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
- while !oh_rule_added && rule_index < rules.length
51
- if rules[rule_index].same_time?(oh_rule)
52
- begin
53
- for date_id in 0...oh_rule.date.length
54
- rules[rule_index].add_date(oh_rule.date[date_id])
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
- oh_rule_added = true
57
- rescue Exception => e
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
- end
66
+ end
86
67
 
87
- if !oh_rule_added
88
- rules << oh_rule
89
- end
68
+ if !oh_rule_added
69
+ rules << oh_rule
70
+ end
90
71
 
91
- if oh_rule_index == oh_rules.length - 1 && oh_rule.has_overwritten_weekday?
92
- oh_rule_over = OpeningHoursConverter::OpeningHoursRule.new
72
+ if oh_rule == oh_rules.last && oh_rule.has_overwritten_weekday?
73
+ oh_rule_over = OpeningHoursConverter::OpeningHoursRule.new
93
74
 
94
- oh_rule.date.each do |date|
95
- oh_rule_over.add_date(OpeningHoursConverter::OpeningHoursDate.new(date.wide, date.wide_type, date.weekdays_over))
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.get_time_selector, date_range.wide_interval.type, [-1])
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.get_time_selector, date_range.wide_interval.type, intervals)
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.get_time_selector,
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(time_selector, type, 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 do
297
+ for i in 0...7
315
298
  days << OpeningHoursConverter::OpeningHoursRule.new
316
- days[i].add_date(OpeningHoursConverter::OpeningHoursDate.new(time_selector, type, [ i ]))
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 do
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
@@ -17,7 +17,6 @@ module OpeningHoursConverter
17
17
  end
18
18
 
19
19
  def get_weekdays
20
-
21
20
  result = ""
22
21
  wd = @weekdays.concat(@weekdays_over).sort.uniq
23
22
 
@@ -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
- weekday_selector = weekday_selector.split(',')
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
- weeks = []
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.gsub(/\:$/, '').split('week')
125
- month_selector = wide_range_selector[0].strip
126
- if month_selector.length == 0
127
- month_selector = nil
128
- end
129
-
130
- if wide_range_selector.length > 1
131
- week_selector = wide_range_selector[1].strip
132
- if week_selector.length == 0
133
- week_selector = nil
134
- end
135
- else
136
- week_selector = nil
137
- end
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[:to_day][:day], month[:to_day][: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 weeks.length > 0
232
- weeks.each do |week|
233
- if !week[:to].nil?
234
- date_range = OpeningHoursConverter::WideInterval.new.week(week[:from], week[:to])
235
- else
236
- date_range = OpeningHoursConverter::WideInterval.new.week(week[:from])
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[:from]
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