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 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