class A0::TZMigration::TZVersion

Attributes

name[R]
version[R]

Public Class Methods

new(name, version) click to toggle source
# File lib/a0/tzmigration/tzversion.rb, line 8
def initialize(name, version)
  @name = name
  @version = version
end
timezones() click to toggle source
# File lib/a0/tzmigration/tzversion.rb, line 93
def self.timezones
  @timezones = Util.load_from_network('timezones/00-index.json')['timezones']
end
versions() click to toggle source
# File lib/a0/tzmigration/tzversion.rb, line 89
def self.versions
  @versions = Util.load_from_network('versions/00-index.json')['versions']
end

Public Instance Methods

changes(other) click to toggle source
# File lib/a0/tzmigration/tzversion.rb, line 73
def changes(other) # rubocop:disable Metrics/AbcSize
  timestamp_list = (timestamps + other.timestamps).sort.uniq

  list_a = Util.split_ranges(transition_ranges, timestamp_list)
  list_b = Util.split_ranges(other.transition_ranges, timestamp_list)

  changes = []
  list_a.each_with_index do |range_a, index|
    range_b = list_b[index]

    changes << Util.range_item(range_a[:ini], range_a[:fin], range_b[:off] - range_a[:off]) if range_a[:off] != range_b[:off]
  end

  Util.compact_ranges!(changes)
end
data() click to toggle source
# File lib/a0/tzmigration/tzversion.rb, line 13
def data
  return @data if defined? @data

  @data = Util.load_from_network("timezones/#{name}.json")
end
released_at() click to toggle source
# File lib/a0/tzmigration/tzversion.rb, line 32
def released_at
  return @released_at if defined? @released_at

  @released_at = version_data['released_at']
end
timestamps() click to toggle source
# File lib/a0/tzmigration/tzversion.rb, line 61
def timestamps
  return @timestamps if defined? @timestamps

  @timestamps = [-Float::INFINITY]
  transitions.each do |transition|
    @timestamps << transition['utc_timestamp']
  end
  @timestamps << +Float::INFINITY

  @timestamps
end
transition_ranges() click to toggle source
# File lib/a0/tzmigration/tzversion.rb, line 44
def transition_ranges # rubocop:disable Metrics/AbcSize
  return @transition_ranges if defined? @transition_ranges

  ini = -Float::INFINITY
  fin = +Float::INFINITY

  return @transition_ranges = [Util.range_item(ini, fin, 0)] if transitions.empty?

  @transition_ranges = transitions.map do |transition|
    Util.range_item(ini, (ini = transition['utc_timestamp']), transition['utc_prev_offset'])
  end

  @transition_ranges << Util.range_item(@transition_ranges.last[:fin], fin, transitions.last['utc_offset'])

  @transition_ranges
end
transitions() click to toggle source
# File lib/a0/tzmigration/tzversion.rb, line 38
def transitions
  return @transitions if defined? @transitions

  @transitions = version_data['transitions']
end
version_data() click to toggle source
# File lib/a0/tzmigration/tzversion.rb, line 19
def version_data
  return @version_data if defined? @version_data

  raise "Version #{@version} not found for #{@name}." unless (@version_data = data.dig('versions', @version))

  if @version_data['alias']
    @link = TZVersion.new(@version_data['alias'], @version)
    @version_data = @link.version_data
  end

  @version_data
end