class WorkingHours::Config
Constants
- DAYS_OF_WEEK
- MIDNIGHT
- TIME_FORMAT
Public Class Methods
holiday_hours()
click to toggle source
# File lib/working_hours/config.rb, line 62 def holiday_hours config[:holiday_hours] end
holiday_hours=(val)
click to toggle source
# File lib/working_hours/config.rb, line 66 def holiday_hours=(val) validate_holiday_hours! val config[:holiday_hours] = val global_config[:holiday_hours] = val config.delete :precompiled end
holidays()
click to toggle source
# File lib/working_hours/config.rb, line 51 def holidays config[:holidays] end
holidays=(val)
click to toggle source
# File lib/working_hours/config.rb, line 55 def holidays=(val) validate_holidays! val config[:holidays] = val global_config[:holidays] = val config.delete :precompiled end
new()
click to toggle source
# File lib/working_hours/config.rb, line 247 def initialize; end
precompiled()
click to toggle source
Returns an optimized for computing version
# File lib/working_hours/config.rb, line 74 def precompiled config_hash = [ config[:working_hours], config[:holiday_hours], config[:holidays], config[:time_zone] ].hash if config_hash != config[:config_hash] config[:config_hash] = config_hash config.delete :precompiled end config[:precompiled] ||= begin validate_working_hours! config[:working_hours] validate_holiday_hours! config[:holiday_hours] validate_holidays! config[:holidays] validate_time_zone! config[:time_zone] compiled = { working_hours: Array.new(7) { Hash.new }, holiday_hours: {} } working_hours.each do |day, hours| hours.each do |start, finish| compiled[:working_hours][DAYS_OF_WEEK.index(day)][compile_time(start)] = compile_time(finish) end end holiday_hours.each do |day, hours| compiled[:holiday_hours][day] = {} hours.each do |start, finish| compiled[:holiday_hours][day][compile_time(start)] = compile_time(finish) end end compiled[:holidays] = Set.new(holidays) compiled[:time_zone] = time_zone compiled end end
reset!()
click to toggle source
# File lib/working_hours/config.rb, line 121 def reset! Thread.current[:working_hours] = default_config end
time_zone()
click to toggle source
# File lib/working_hours/config.rb, line 110 def time_zone config[:time_zone] end
time_zone=(val)
click to toggle source
# File lib/working_hours/config.rb, line 114 def time_zone=(val) zone = validate_time_zone! val config[:time_zone] = zone global_config[:time_zone] = val config.delete :precompiled end
with_config(working_hours: nil, holiday_hours: nil, holidays: nil, time_zone: nil) { || ... }
click to toggle source
# File lib/working_hours/config.rb, line 125 def with_config(working_hours: nil, holiday_hours: nil, holidays: nil, time_zone: nil) original_working_hours = self.working_hours original_holiday_hours = self.holiday_hours original_holidays = self.holidays original_time_zone = self.time_zone self.working_hours = working_hours if working_hours self.holiday_hours = holiday_hours if holiday_hours self.holidays = holidays if holidays self.time_zone = time_zone if time_zone yield ensure self.working_hours = original_working_hours self.holiday_hours = original_holiday_hours self.holidays = original_holidays self.time_zone = original_time_zone end
working_hours()
click to toggle source
# File lib/working_hours/config.rb, line 40 def working_hours config[:working_hours] end
working_hours=(val)
click to toggle source
# File lib/working_hours/config.rb, line 44 def working_hours=(val) validate_working_hours! val config[:working_hours] = val global_config[:working_hours] = val config.delete :precompiled end
Private Class Methods
compile_time(time)
click to toggle source
# File lib/working_hours/config.rb, line 167 def compile_time time hour = time[TIME_FORMAT,1].to_i min = time[TIME_FORMAT,2].to_i sec = time[TIME_FORMAT,3].to_i time = hour * 3600 + min * 60 + sec # Converts 24:00 to 23:59:59.999999 return MIDNIGHT if time == 86400 time end
config()
click to toggle source
# File lib/working_hours/config.rb, line 144 def config Thread.current[:working_hours] ||= global_config.dup end
default_config()
click to toggle source
# File lib/working_hours/config.rb, line 152 def default_config { working_hours: { mon: {'09:00' => '17:00'}, tue: {'09:00' => '17:00'}, wed: {'09:00' => '17:00'}, thu: {'09:00' => '17:00'}, fri: {'09:00' => '17:00'} }, holiday_hours: {}, holidays: [], time_zone: ActiveSupport::TimeZone['UTC'] } end
global_config()
click to toggle source
# File lib/working_hours/config.rb, line 148 def global_config @@global_config ||= default_config end
validate_holiday_hours!(days)
click to toggle source
# File lib/working_hours/config.rb, line 212 def validate_holiday_hours! days if (invalid_keys = (days.keys.reject{ |day| day.is_a?(Date) })).any? raise InvalidConfiguration.new :invalid_holiday_keys, data: { invalid_keys: invalid_keys.join(', ') } end validate_hours!(days) end
validate_holidays!(holidays)
click to toggle source
# File lib/working_hours/config.rb, line 219 def validate_holidays! holidays if not holidays.respond_to?(:to_a) raise InvalidConfiguration.new :holidays_not_array, data: { holidays_class: holidays.class } end holidays.to_a.each do |day| if not day.is_a? Date raise InvalidConfiguration.new :holiday_not_date, data: { day: day } end end end
validate_hours!(dates)
click to toggle source
# File lib/working_hours/config.rb, line 177 def validate_hours! dates dates.each do |day, hours| if not hours.is_a? Hash raise InvalidConfiguration.new :invalid_type, data: { day: day, hours_class: hours.class } elsif hours.empty? raise InvalidConfiguration.new :empty_day, data: { day: day } end last_time = nil hours.sort.each do |start, finish| if not start =~ TIME_FORMAT raise InvalidConfiguration.new :invalid_format, data: { time: start } elsif not finish =~ TIME_FORMAT raise InvalidConfiguration.new :invalid_format, data: { time: finish } elsif compile_time(finish) >= 24 * 60 * 60 raise InvalidConfiguration.new :outside_of_day, data: { time: finish } elsif start >= finish raise InvalidConfiguration.new :wrong_order, data: { start: start, finish: finish } elsif last_time and start < last_time raise InvalidConfiguration.new :overlap, data: { start: start, finish: finish } end last_time = finish end end end
validate_time_zone!(zone)
click to toggle source
# File lib/working_hours/config.rb, line 230 def validate_time_zone! zone if zone.is_a? String res = ActiveSupport::TimeZone[zone] if res.nil? raise InvalidConfiguration.new :unknown_timezone, data: { zone: zone } end elsif zone.is_a? ActiveSupport::TimeZone res = zone else raise InvalidConfiguration.new :invalid_timezone, data: { zone: zone.inspect } end res end
validate_working_hours!(week)
click to toggle source
# File lib/working_hours/config.rb, line 202 def validate_working_hours! week if week.empty? raise InvalidConfiguration.new :empty end if (invalid_keys = (week.keys - DAYS_OF_WEEK)).any? raise InvalidConfiguration.new :invalid_day_keys, data: { invalid_keys: invalid_keys.join(', ') } end validate_hours!(week) end