opening_hours_converter 0.0.2

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.
@@ -0,0 +1,196 @@
1
+ require 'opening_hours_converter/constants'
2
+
3
+ module OpeningHoursConverter
4
+ class Week
5
+ include Constants
6
+ attr_accessor :intervals
7
+
8
+ def initialize
9
+ @intervals = []
10
+ end
11
+
12
+ def get_as_minute_array
13
+ minute_array = Array.new(DAYS_MAX + 1) { Array.new(MINUTES_MAX + 1, false) }
14
+
15
+ @intervals.each do |interval|
16
+ if !interval.nil?
17
+ for day in interval.day_start..interval.day_end
18
+ start_minute = (day == interval.day_start) ? interval.start : 0
19
+ end_minute = (day == interval.day_end) ? interval.end : MINUTES_MAX
20
+ if start_minute && end_minute
21
+ for minute in start_minute..end_minute
22
+ minute_array[day][minute] = true
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ minute_array
29
+ end
30
+
31
+ def get_intervals(clean=false)
32
+ if clean
33
+ minute_array = get_as_minute_array
34
+ intervals = []
35
+ day_start = -1
36
+ minute_start = -1
37
+ minute_end = nil
38
+
39
+
40
+ minute_array.each_with_index do |day, day_index|
41
+ day.each_with_index do |minute, minute_index|
42
+ if day_index == 0 && minute_index == 0
43
+ if minute
44
+ day_start = day_index
45
+ minute_start = minute_index
46
+ end
47
+ elsif day_index == DAYS_MAX && minute_index == day.length - 1
48
+ if day_start >= 0 && minute
49
+ intervals << OpeningHoursConverter::Interval.new(day_start, minute_start, day_index, minute_index)
50
+ end
51
+ else
52
+ if minute && day_start < 0
53
+ day_start = day_index
54
+ minute_start = minute_index
55
+ elsif !minute && day_start >= 0
56
+ if minute_index == 0
57
+ intervals << OpeningHoursConverter::Interval.new(day_start, minute_start, day_index - 1, MINUTES_MAX)
58
+ else
59
+ intervals << OpeningHoursConverter::Interval.new(day_start, minute_start, day_index, minute_index - 1)
60
+ end
61
+ day_start = -1
62
+ minute_start = - 1
63
+ end
64
+ end
65
+ end
66
+ end
67
+ return intervals
68
+ else
69
+ return @intervals
70
+ end
71
+ end
72
+
73
+ def get_intervals_diff(week)
74
+ self_minutes_array = get_as_minute_array
75
+ other_minutes_array = week.get_as_minute_array
76
+
77
+ intervals = { open: [], closed: [] }
78
+ day_start = -1
79
+ min_start = -1
80
+
81
+
82
+ for d in 0..DAYS_MAX
83
+ diff_day = false
84
+ m = 0
85
+ intervals_length = intervals[:open].length
86
+ while m <= MINUTES_MAX
87
+ # Copy entire day
88
+ if diff_day
89
+ # first minute of monday
90
+ if d == 0 && m == 0
91
+ if self_minutes_array[d][m]
92
+ day_start = d
93
+ min_start = m
94
+ end
95
+ # last minute of sunday
96
+ elsif d == DAYS_MAX && m == MINUTES_MAX
97
+ if day_start >= 0 && self_minutes_array[d][m]
98
+ intervals[:open] << OpeningHoursConverter::Interval.new(day_start, min_start, d, m)
99
+ end
100
+ # other days and minutes
101
+ else
102
+ # new interval
103
+ if self_minutes_array[d][m] && day_start < 0
104
+ day_start = d
105
+ min_start = m
106
+ # end interval
107
+ elsif !self_minutes_array[d][m] && day_start >= 0
108
+ if m == 0
109
+ intervals[:open] << OpeningHoursConverter::Interval.new(day_start, min_start, d - 1, MINUTES_MAX)
110
+ else
111
+ intervals[:open] << OpeningHoursConverter::Interval.new(day_start, min_start, d, m - 1)
112
+ end
113
+ day_start = -1
114
+ min_start = -1
115
+ end
116
+ end
117
+ m += 1
118
+ # check diff
119
+ else
120
+ diff_day = self_minutes_array[d][m] ? !other_minutes_array[d][m] : other_minutes_array[d][m]
121
+ if diff_day
122
+ m = 0
123
+ else
124
+ m += 1
125
+ end
126
+ end
127
+ end
128
+ if !diff_day && day_start > -1
129
+ intervals[:open] << OpeningHoursConverter::Interval.new(day_start, min_start, d-1, MINUTES_MAX)
130
+ day_start = -1
131
+ min_start = -1
132
+ end
133
+ if diff_day && day_start == -1 && intervals_length == intervals[:open].length
134
+ if intervals[:closed].length > 0 && intervals[:closed][intervals[:closed].length - 1].day_end == d - 1
135
+ intervals[:closed][intervals[:closed].length - 1] = OpeningHoursConverter::Interval.new(intervals[:closed][intervals[:closed].length - 1].day_start, 0, d, MINUTES_MAX)
136
+ else
137
+ intervals[:closed] << OpeningHoursConverter::Interval.new(d, 0, d, MINUTES_MAX)
138
+ end
139
+ end
140
+ end
141
+ return intervals
142
+ end
143
+
144
+ def add_interval(interval)
145
+ @intervals << interval
146
+ return @intervals.length - 1
147
+ end
148
+
149
+ def edit_interval(id, interval)
150
+ @intervals[id] = interval
151
+ end
152
+
153
+ def remove_interval(id)
154
+ @intervals[id] = nil
155
+ end
156
+
157
+ def remove_intervals_during_day(day)
158
+ @intervals.each_with_index do |interval, i|
159
+ unless interval.nil?
160
+ if interval.day_start <= day && interval.day_end >= day
161
+ day_diff = interval.day_end - interval.day_start
162
+
163
+ if day_diff > 1 || day_diff == 0 || interval.day_start == day || interval.start <= interval.end
164
+ if interval.day_end - interval.day_start >= 1 && interval.start <= interval.end
165
+ if interval.day_start < day
166
+ add_interval(OpeningHoursConverter::Interval.new(interval.day_start, interval.start, day - 1, 24*60))
167
+ end
168
+ if interval.day_end > day
169
+ add_interval(OpeningHoursConverter::Interval.new(day + 1, 0, interval.day_end, interval.end))
170
+ end
171
+ end
172
+ remove_interval(i)
173
+ end
174
+ end
175
+ end
176
+ end
177
+ end
178
+
179
+ def clear_intervals
180
+ @intervals = []
181
+ end
182
+
183
+ def copy_intervals(intervals)
184
+ @intervals = []
185
+ intervals.each do |interval|
186
+ unless interval.nil?
187
+ @intervals << interval.dup
188
+ end
189
+ end
190
+ end
191
+
192
+ def same_as?(week)
193
+ week.get_as_minute_array == get_as_minute_array
194
+ end
195
+ end
196
+ end
@@ -0,0 +1,264 @@
1
+ require 'opening_hours_converter/constants'
2
+
3
+ module OpeningHoursConverter
4
+ class WideInterval
5
+ include Constants
6
+ attr_accessor :start, :end, :type
7
+
8
+ def initialize
9
+ @start = nil
10
+ @end = nil
11
+ @type = nil
12
+ end
13
+
14
+ def get_time_selector
15
+ result = ""
16
+
17
+ case @type
18
+ when "day"
19
+ result = "#{OSM_MONTHS[@start[:month]-1]} #{@start[:day] < 10 ? "0" : ""}#{@start[:day]}"
20
+ if !@end.nil?
21
+ if @start[:month] == @end[:month]
22
+ result += "-#{@end[:day] < 10 ? "0" : ""}#{@end[:day]}"
23
+ else
24
+ result += "-#{OSM_MONTHS[@end[:month]-1]} #{@end[:day] < 10 ? "0" : ""}#{@end[:day]}"
25
+ end
26
+ end
27
+ when "week"
28
+ result = "week #{@start[:week] < 10 ? "0" : ""}#{@start[:week]}"
29
+ if !@end.nil?
30
+ result += "-#{@end[:week] < 10 ? "0" : ""}#{@end[:week]}"
31
+ end
32
+ when "month"
33
+ result = "#{OSM_MONTHS[@start[:month]-1]}"
34
+ if !@end.nil?
35
+ result += "-#{OSM_MONTHS[@end[:month]-1]}"
36
+ end
37
+ when "always"
38
+ result = ""
39
+ else
40
+ result = ""
41
+ end
42
+ result
43
+ end
44
+
45
+ def get_time_for_humans
46
+ result = ""
47
+
48
+ case @type
49
+ when "day"
50
+ if !@end.nil?
51
+ result = "toutes les semaines du #{@start[:day]} #{IRL_MONTHS[@start[:month] - 1]}"
52
+ if @start[:month] != @end[:month]
53
+ result += " au #{@end[:day]} #{IRL_MONTHS[@end[:month] - 1]}"
54
+ end
55
+ else
56
+ result = "le #{@start[:day]} #{IRL_MONTHS[@start[:month] - 1]}"
57
+ 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
+ when "month"
65
+ if !@end.nil?
66
+ result = "toutes les semaines de #{IRL_MONTHS[@start[:month] - 1]} à #{IRL_MONTHS[@endd[:month] - 1]}"
67
+ else
68
+ result = "toutes les semaines de #{IRL_MONTHS[@start[:month] - 1]}"
69
+ end
70
+ when "always"
71
+ result = "toutes les semaines"
72
+ end
73
+ return result
74
+ end
75
+
76
+ def day(start_day, start_month, end_day=nil, end_month=nil)
77
+ if start_day.nil? || start_month.nil?
78
+ raise(ArgumentError, "start_day and start_month are required")
79
+ 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 }
83
+ end
84
+ @type = "day"
85
+ self
86
+ end
87
+
88
+ def week(start_week, end_week=nil)
89
+ if start_week.nil?
90
+ raise(ArgumentError, "start_week is required")
91
+ end
92
+ @start = { week: start_week }
93
+ unless end_week.nil? || end_week == start_week
94
+ @end = { week: end_week }
95
+ end
96
+ @type = "week"
97
+ self
98
+ end
99
+
100
+ def month(start_month, end_month=nil)
101
+ if start_month.nil?
102
+ raise(ArgumentError, "start_month is required")
103
+ end
104
+ @start = { month: start_month }
105
+ unless end_month.nil? || end_month == start_month
106
+ @end = { month: end_month }
107
+ end
108
+ @type = "month"
109
+ self
110
+ end
111
+
112
+ def always
113
+ @start = nil
114
+ @end = nil
115
+ @type = "always"
116
+ self
117
+ end
118
+
119
+ def is_full_month?
120
+ if @type == "month" && @end.nil?
121
+ true
122
+ elsif @type == "day"
123
+ @start[:day] == 1 && !@end.nil? && @start[:month] == @end[:month] &&
124
+ !@end[:day].nil? && @end[:day] == MONTH_END_DAY[@end[:month] - 1]
125
+ else
126
+ false
127
+ end
128
+ end
129
+
130
+ def starts_month?
131
+ @type == "month" || @type == "always" || (@type == "day" && @start[:day] == 1)
132
+ end
133
+
134
+ def ends_month?
135
+ @type == "month" || @type == "always" || (@type == "day" && !@end.nil? && @end[:day] == MONTH_END_DAY[@end[:month] - 1])
136
+ end
137
+
138
+ def contains?(o)
139
+ result = false
140
+ if self.equals(o)
141
+ result = false
142
+ elsif @type == "always"
143
+ result = true
144
+ elsif @type == "day"
145
+ if o.type == "day"
146
+ if o.start[:month] > @start[:month] || (o.start[:month] == @start[:month] && o.start[:day] >= @start[:day])
147
+
148
+ if !o.end.nil?
149
+ if !@end.nil? && (o.end[:month] < @end[:month] || (o.end[:month] == @end[:month] && o.end[:day] <= @end[:day]))
150
+ result = true
151
+ end
152
+ else
153
+ if !@end.nil? && (o.start[:month] < @end[:month] || (o.start[:month] == @end[:month] && o.start[:day] <= @end[:day]))
154
+ result = true
155
+ end
156
+ end
157
+
158
+ end
159
+ elsif o.type == "month"
160
+ if o.start[:month] > @start[:month] || (o.start[:month] == @start[:month] && @start[:day] == 1)
161
+ if !o.end.nil? && !@end.nil? && (o.end[:month] < @end[:month] || (o.end[:month] == @end[:month] && @end[:day] == MONTH_END_DAY[@end.month-1]))
162
+ result = true
163
+ elsif o.end.nil? && (!@end.nil? && o.start[:month] < @end[:month])
164
+ result = true
165
+ end
166
+ end
167
+ end
168
+ elsif @type == "week"
169
+ if o.type == "week"
170
+ if o.start[:week] >= @start[:week]
171
+ if !o.end.nil? && !@end.nil? && o.end[:week] <= @end[:week]
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
177
+ end
178
+ elsif @type == "month"
179
+ if o.type == "month"
180
+ if o.start[:month] >= @start[:month]
181
+ if !o.end.nil? && !@end.nil? && o.end[:month] <= @end[:month]
182
+ result = true
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
218
+ end
219
+ end
220
+ return result
221
+ end
222
+
223
+ def equals(o)
224
+ return false unless o.instance_of?(OpeningHoursConverter::WideInterval)
225
+ return @type == "always" if o.type == "always"
226
+
227
+ result = false
228
+ case @type
229
+ when "always"
230
+ result = o.start.nil?
231
+ when "day"
232
+ result = ((o.type == "day" &&
233
+ o.start[:month] == @start[:month] &&
234
+ o.start[:day] == @start[:day] &&
235
+ ((o.end.nil? && @end.nil?) ||
236
+ (!o.end.nil? && !@end.nil? &&
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])))
250
+ when "month"
251
+ result = (o.type == "day" &&
252
+ o.start[:month] == @start[:month] &&
253
+ (o.starts_month? &&
254
+ (!o.end.nil? && @end.nil? && o.end[:month] == @start[:month] && o.ends_month?) ||
255
+ (!o.end.nil? && !@end.nil? && o.end[:month] == @end[:month] && o.ends_month?))) ||
256
+ (o.type == "month" &&
257
+ o.start[:month] == @start[:month] &&
258
+ ((o.end.nil? && @end.nil?) ||
259
+ (!o.end.nil? && !@end.nil? && o.end[:month] == @end[:month])))
260
+ end
261
+ result
262
+ end
263
+ end
264
+ end
@@ -0,0 +1,12 @@
1
+ module OpeningHoursConverter
2
+ require_relative './opening_hours_converter/date_range'
3
+ require_relative './opening_hours_converter/day'
4
+ require_relative './opening_hours_converter/interval'
5
+ require_relative './opening_hours_converter/opening_hours_builder'
6
+ require_relative './opening_hours_converter/opening_hours_date'
7
+ require_relative './opening_hours_converter/opening_hours_parser'
8
+ require_relative './opening_hours_converter/opening_hours_rule'
9
+ require_relative './opening_hours_converter/opening_hours_time'
10
+ require_relative './opening_hours_converter/week'
11
+ require_relative './opening_hours_converter/wide_interval'
12
+ end
metadata ADDED
@@ -0,0 +1,55 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: opening_hours_converter
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Ziserman Martin
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-10-06 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Datetime range to openinghours, openinghours to datetime range
14
+ email: martinziserman@gmail.com
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - lib/opening_hours_converter.rb
20
+ - lib/opening_hours_converter/constants.rb
21
+ - lib/opening_hours_converter/date_range.rb
22
+ - lib/opening_hours_converter/day.rb
23
+ - lib/opening_hours_converter/interval.rb
24
+ - lib/opening_hours_converter/opening_hours_builder.rb
25
+ - lib/opening_hours_converter/opening_hours_date.rb
26
+ - lib/opening_hours_converter/opening_hours_parser.rb
27
+ - lib/opening_hours_converter/opening_hours_rule.rb
28
+ - lib/opening_hours_converter/opening_hours_time.rb
29
+ - lib/opening_hours_converter/week.rb
30
+ - lib/opening_hours_converter/wide_interval.rb
31
+ homepage: http://rubygems.org/gems/opening_hours_converter
32
+ licenses:
33
+ - MIT
34
+ metadata: {}
35
+ post_install_message:
36
+ rdoc_options: []
37
+ require_paths:
38
+ - lib
39
+ required_ruby_version: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ required_rubygems_version: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ requirements: []
50
+ rubyforge_project:
51
+ rubygems_version: 2.6.13
52
+ signing_key:
53
+ specification_version: 4
54
+ summary: Datetime range to openinghours, openinghours to datetime range
55
+ test_files: []