module TimezoneParser::TZInfo

TZInfo module

Constants

LastTimestamp

Max Timestamp

TZDataPath

Extracted TZData path

TZDataSource

TZData source location

TZInfoData

TZInfo data path

Public Class Methods

download(source = TZDataSource, location = TZDataPath, target = TZInfoData) click to toggle source
# File lib/timezone_parser/data/tzinfo.rb, line 31
def self.download(source = TZDataSource, location = TZDataPath, target = TZInfoData)
    URI.parse(source).open do |tempfile|
        FileUtils.mkdir_p(location)
        tar = Gem::Package::TarReader.new(Zlib::GzipReader.open(tempfile.path))
        tar.each do |entry|
            path = location + entry.full_name
            FileUtils.mkdir_p(path.dirname)
            if entry.file?
                File.open(path, 'wb') do |file|
                    file.write(entry.read)
                end
            end
        end
        tar.close
    end
    parser = ::TZInfo::Data::TZDataParser.new(location, target)
    parser.execute
    getVersion(location)
end
getAbbreviations() click to toggle source
# File lib/timezone_parser/data/tzinfo.rb, line 89
def self.getAbbreviations
    transitionData = {}
    ::TZInfo::Timezone.all_data_zone_identifiers.each do |name|
        zone = ::TZInfo::Timezone.get(name)
        zone_transitions = zone.transitions_up_to(Time.at(LastTimestamp))
        zone_transitions.each_index do |i|
            offset = zone_transitions[i].offset
            next if offset.abbreviation == :LMT or offset.abbreviation == :zzz
            abbr = offset.abbreviation.to_s
            transitionData[abbr] = [] unless transitionData[abbr]
            period = ::TZInfo::TimezonePeriod.new(zone_transitions[i], zone_transitions[i+1])
            transitionData[abbr] << { :name => name, :period => period }
        end
    end
    timezoneData = {}
    transitionData.keys.sort.each do |name|
        transitions = []
        transitionData[name].each do |transition|
            period_start = transition[:period].utc_start
            period_start = period_start.to_s
            period_end = transition[:period].utc_end
            period_end = period_end.to_s if period_end
            timezone = transition[:name]
            countries = getTimezoneCountries[timezone]
            countries = countries.dup if countries
            data = { 'Offset' => transition[:period].utc_total_offset,  'Timezones' => [timezone], 'Countries' => countries, 'From' => period_start }
            data['To'] = period_end if period_end
            transitions << data
        end
        transitions.sort_by! { |data| [data['To'] ? data['To'] : 'zzzz', data['From']] }

        abbreviationData = []
        abbreviationData << transitions.shift
        transitions.each do |data|
            current = abbreviationData.last
            if data['Offset'] == current['Offset'] and (current['Timezones'].sort == data['Timezones'].sort || (data['From'] == current['From'] and data['To'] == current['To']))
                current['Timezones'] += data['Timezones']
                current['Timezones'].uniq!
                current['Timezones'].sort!
                if data['Countries']
                    current['Countries'] = current['Countries'].to_a + data['Countries']
                    current['Countries'].uniq!
                    current['Countries'].sort!
                end
                current['To'] = data['To']
                current.delete('To') unless current['To']
            else
                abbreviationData << data
            end
        end
        previous = nil
        abbreviationData.delete_if do |item|
            if previous.nil?
                previous = item
                false
            elsif previous['Offset'] == item['Offset'] and previous['Timezones'] == item['Timezones']
                previous['To'] = item['To']
                previous.delete('To') unless previous['To']
                true
            else
                previous = item
                false
            end
        end
        timezoneData[name] = abbreviationData
    end
    timezoneData
end
getTimezoneCountries() click to toggle source
# File lib/timezone_parser/data/tzinfo.rb, line 68
def self.getTimezoneCountries
    unless @@TimezoneCountries
        @@TimezoneCountries = {}
        ::TZInfo::Country.all.each do |countryData|
            countryData.zone_identifiers.each do |timezone|
                @@TimezoneCountries[timezone] ||= []
                @@TimezoneCountries[timezone] << countryData.code
                @@TimezoneCountries[timezone].uniq!
                @@TimezoneCountries[timezone].sort!
            end
        end
        ::TZInfo::Timezone.all_linked_zones.each do |zone|
            timezone = zone.identifier
            actual_timezone = zone.canonical_zone.identifier
            @@TimezoneCountries[timezone] = @@TimezoneCountries[actual_timezone].dup unless @@TimezoneCountries[actual_timezone].nil?
        end
        @@TimezoneCountries = Hash[@@TimezoneCountries.to_a.sort_by { |pair| pair.first }]
    end
    @@TimezoneCountries
end
getTimezones() click to toggle source
# File lib/timezone_parser/data/tzinfo.rb, line 61
def self.getTimezones
    unless @@Timezones
        @@Timezones = ::TZInfo::Timezone.all_identifiers
    end
    @@Timezones
end
getVersion(source = TZDataPath) click to toggle source
# File lib/timezone_parser/data/tzinfo.rb, line 51
def self.getVersion(source = TZDataPath)
    return @@Version if @@Version
    @@Version = File.read(source + 'version', { :mode => 'r', :encoding => 'UTF-8:UTF-8' }).strip
    @@Version
end
init() click to toggle source
# File lib/timezone_parser/data/tzinfo.rb, line 57
def self.init
    ::TZInfo::DataSource.set(:ruby, TZInfoData)
end