module Timezone::Loader

Responsible for loading and parsing timezone data from files.

Constants

SOURCE_BIT
ZONE_FILE_PATH

Public Class Methods

load(name) click to toggle source
# File lib/timezone/loader.rb, line 14
def load(name)
  @rules.fetch(name) do
    raise ::Timezone::Error::InvalidZone unless valid?(name)

    @rules[name] = parse_zone_data(get_zone_data(name))
  end
end
names() click to toggle source
# File lib/timezone/loader.rb, line 22
def names
  @names ||= parse_zone_names
end
valid?(name) click to toggle source
# File lib/timezone/loader.rb, line 26
def valid?(name)
  names.include?(name)
end

Private Class Methods

get_zone_data(name) click to toggle source

Retrieve the data from a particular time zone

# File lib/timezone/loader.rb, line 58
def get_zone_data(name)
  File.read(File.join(ZONE_FILE_PATH, name))
end
parse_zone_data(data) click to toggle source
# File lib/timezone/loader.rb, line 42
def parse_zone_data(data)
  rules = []

  data.split("\n").each do |line|
    source, name, dst, offset = line.split(':')
    source = source.to_i
    dst = dst == '1'
    offset = offset.to_i
    source = rules.last[SOURCE_BIT] + source if rules.last
    rules << [source, name, dst, offset]
  end

  rules
end
parse_zone_names() click to toggle source
# File lib/timezone/loader.rb, line 32
def parse_zone_names
  files = Dir[File.join(ZONE_FILE_PATH, '**/*')].map do |file|
    next if File.directory?(file)

    file.sub("#{ZONE_FILE_PATH}/", '')
  end

  files.compact
end