Class: TZInfo::TZDataParser

### Home Classes Methods

### In Files

- lib/tzinfo/tzdataparser.rb

### Parent

Object

### Methods

- ::new
- ::parse_month
- ::parse_offset
- ::quote_str
- #execute

### Files

- CHANGES
- README

### Class/Module Index

Quicksearch

- TZInfo
- TZInfo::AmbiguousTime
- TZInfo::Country
- TZInfo::CountryTimezone
- TZInfo::InvalidCountryCode
- TZInfo::InvalidTimezoneIdentifier
- TZInfo::NoOffsetsDefined
- TZInfo::PeriodNotFound
- TZInfo::TZDataParser
- TZInfo::Timezone
- TZInfo::TimezonePeriod
- TZInfo::TimezoneProxy
- TZInfo::UnknownTimezone

No matching classes.

# TZInfo::TZDataParser

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.

### Constants

MAX_YEAR

  Maximum year that will be considered.

MIN_YEAR

  Minimum 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

new(input_dir, output_dir) click to toggle source

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).

    # 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

parse_month(month) click to toggle source

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

    # File lib/tzinfo/tzdataparser.rb, line 117
    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

parse_offset(offset) click to toggle source

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

    # File lib/tzinfo/tzdataparser.rb, line 150
    def self.parse_offset(offset)
      raise "Invalid time: #{offset}" if offset !~ /^(-)?(?:([0-9]+)(?::([0-9]+)(?::([0-9]+))?)?)?$/

      negative = !$1.nil?
      hour = $2.nil? ? 0 : $2.to_i
      minute = $3.nil? ? 0 : $3.to_i
      second = $4.nil? ? 0 : $4.to_i

      seconds = hour
      seconds = seconds * 60
      seconds = seconds + minute
      seconds = seconds * 60
      seconds = seconds + second
      seconds = -seconds if negative
      seconds
    end

quote_str(str) click to toggle source

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

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

### Public Instance Methods

execute() click to toggle source

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

    # File lib/tzinfo/tzdataparser.rb, line 75
    def execute
      # Note that the backzone file is ignored. backzone contains alternative
      # definitions of certain zones, primarily for pre-1970 data. It is not
      # recommended for ordinary use and the tzdata Makefile does not
      # install its entries by default.

      files = Dir.entries(@input_dir).select do |file|
        file =~ /\A[^\.]+\z/ &&
          !%(backzone checktab.awk leapseconds leapseconds.awk leap-seconds.list CONTRIBUTING Makefile NEWS README SOURCE Theory zoneinfo2tdf.pl).include?(file) &&
          File.file?(File.join(@input_dir, file))
      end

      files.each {|file| load_rules(file) }
      files.each {|file| load_zones(file) }
      files.each {|file| load_links(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]

Generated with the Darkfish Rdoc Generator 2.