Class TZInfo::TZDataParser
In: lib/tzinfo/tzdataparser.rb
Parent: Object

Parses tzdata from elsie.nci.nih.gov/pub/ and transforms it into a set of Ruby modules that can be used through Timezone and Country.

Normally, this class wouldn‘t be used. It is only run to update the timezone data and index modules.

Methods

Constants

MIN_YEAR = 1800   Minimum year that will be considered.
MAX_YEAR = 2050   Maximum year that will be considered.

Attributes

exclude_zones  [RW]  Zones to exclude from generation when not using only_zones (set to an array containing zone identifiers).
generate_countries  [RW]  Whether to generate country definitions (set to false to stop countries being generated).
generate_zones  [RW]  Whether to generate zone definitions (set to false to stop zones being generated).
only_zones  [RW]  Limit the set of zones to generate (set to an array containing zone identifiers).

Public Class methods

Initializes a new TZDataParser. input_dir must contain the extracted tzdata tarball. output_dir is the location to output the modules (in definitions and indexes directories).

[Source]

# File lib/tzinfo/tzdataparser.rb, line 59
    def initialize(input_dir, output_dir)
      super()
      @input_dir = input_dir
      @output_dir = output_dir      
      @rule_sets = {}
      @zones = {}
      @countries = {}
      @no_rules = TZDataNoRules.new
      @generate_zones = true
      @generate_countries = true
      @only_zones = []      
      @exclude_zones = []      
    end

Parses a month specified in the tz data and converts it to a number between 1 and 12 representing January to December.

[Source]

# File lib/tzinfo/tzdataparser.rb, line 114
    def self.parse_month(month)
      lower = month.downcase
      if lower =~ /^jan/
        @month = 1
      elsif lower =~ /^feb/
        @month = 2
      elsif lower =~ /^mar/
        @month = 3
      elsif lower =~ /^apr/
        @month = 4
      elsif lower =~ /^may/
        @month = 5
      elsif lower =~ /^jun/
        @month = 6
      elsif lower =~ /^jul/
        @month = 7
      elsif lower =~ /^aug/
        @month = 8
      elsif lower =~ /^sep/
        @month = 9
      elsif lower =~ /^oct/
        @month = 10
      elsif lower =~ /^nov/
        @month = 11
      elsif lower =~ /^dec/
        @month = 12
      else
        raise "Invalid month: #{month}"
      end
    end

Parses an offset string [-]h:m:s (minutes and seconds are optional). Returns the offset in seconds.

[Source]

# File lib/tzinfo/tzdataparser.rb, line 147
    def self.parse_offset(offset)
      raise "Invalid time: #{offset}" if offset !~ /^(-)?([0-9]+)(:([0-9]+)(:([0-9]+))?)?$/
      
      negative = !$1.nil?      
      hour = $2.to_i
      minute = $4.nil? ? 0 : $4.to_i
      second = $6.nil? ? 0 : $6.to_i
      
      seconds = hour
      seconds = seconds * 60
      seconds = seconds + minute
      seconds = seconds * 60
      seconds = seconds + second
      seconds = -seconds if negative
      seconds
    end

Encloses the string in single quotes and escapes any single quotes in the content.

[Source]

# File lib/tzinfo/tzdataparser.rb, line 166
    def self.quote_str(str)
      "'#{str.gsub('\'', '\\\\\'')}'"
    end

Public Instance methods

Reads the tzdata source and generates the classes. Takes a long time to run. Currently outputs debugging information to standard out.

[Source]

# File lib/tzinfo/tzdataparser.rb, line 75
    def execute
      Dir.foreach(@input_dir) {|file|
        load_rules(file) if file =~ /^[^\.]+$/        
      }  
      
      Dir.foreach(@input_dir) {|file|
        load_zones(file) if file =~ /^[^\.]+$/        
      }
      
      Dir.foreach(@input_dir) {|file|
        load_links(file) if file =~ /^[^\.]+$/        
      }
      
      load_countries
      
      if @generate_zones
        modules = []
        
        if @only_zones.nil? || @only_zones.empty?
          @zones.each_value {|zone|
            zone.write_module(@output_dir) unless @exclude_zones.include?(zone.name)
          }
        else
          @only_zones.each {|id|
            zone = @zones[id]
            zone.write_module(@output_dir)            
          }          
        end
        
        write_timezones_index
      end
      
      if @generate_countries        
        write_countries_index
      end
    end

[Validate]