Class: A0::TZMigration::TZVersion

Inherits:
Object
  • Object
show all
Defined in:
lib/a0/tzmigration/tzversion.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, version) ⇒ TZVersion

Returns a new instance of TZVersion.



8
9
10
11
# File 'lib/a0/tzmigration/tzversion.rb', line 8

def initialize(name, version)
  @name = name
  @version = version
end

Instance Attribute Details

#nameObject (readonly)

Returns the value of attribute name.



6
7
8
# File 'lib/a0/tzmigration/tzversion.rb', line 6

def name
  @name
end

#versionObject (readonly)

Returns the value of attribute version.



6
7
8
# File 'lib/a0/tzmigration/tzversion.rb', line 6

def version
  @version
end

Class Method Details

.timezonesObject



93
94
95
# File 'lib/a0/tzmigration/tzversion.rb', line 93

def self.timezones
  @timezones = Util.load_from_network('timezones/00-index.json')['timezones']
end

.versionsObject



89
90
91
# File 'lib/a0/tzmigration/tzversion.rb', line 89

def self.versions
  @versions = Util.load_from_network('versions/00-index.json')['versions']
end

Instance Method Details

#changes(other) ⇒ Object

rubocop:disable Metrics/AbcSize



73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# 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

#dataObject



13
14
15
16
17
# 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_atObject



32
33
34
35
36
# 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

#timestampsObject



61
62
63
64
65
66
67
68
69
70
71
# 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_rangesObject

rubocop:disable Metrics/AbcSize



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# 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

#transitionsObject



38
39
40
41
42
# File 'lib/a0/tzmigration/tzversion.rb', line 38

def transitions
  return @transitions if defined? @transitions

  @transitions = version_data['transitions']
end

#version_dataObject



19
20
21
22
23
24
25
26
27
28
29
30
# 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