opening_hours_converter 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []