Class: Metar::Data::RunwayVisibleRange

Inherits:
Base
  • Object
show all
Defined in:
lib/metar/data/runway_visible_range.rb

Constant Summary collapse

TENDENCY =
{
  '' => nil,
  'N' => :no_change,
  'U' => :improving,
  'D' => :worsening
}.freeze
COMPARATOR =
{'' => nil, 'P' => :more_than, 'M' => :less_than}.freeze
UNITS =
{'' => :meters, 'FT' => :feet}.freeze

Instance Attribute Summary collapse

Attributes inherited from Base

#raw

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Base

#value

Constructor Details

#initialize(raw, designator:, visibility1:, visibility2: nil, tendency: nil, units: :meters) ⇒ RunwayVisibleRange

Returns a new instance of RunwayVisibleRange.

[View source]

68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/metar/data/runway_visible_range.rb', line 68

def initialize(
  raw,
  designator:,
  visibility1:,
  visibility2: nil,
  tendency: nil,
  units: :meters
)
  @raw = raw
  @designator = designator
  @visibility1 = visibility1
  @visibility2 = visibility2
  @tendency = tendency
  @units = units
end

Instance Attribute Details

#designatorObject (readonly)

Returns the value of attribute designator.


66
67
68
# File 'lib/metar/data/runway_visible_range.rb', line 66

def designator
  @designator
end

#tendencyObject (readonly)

Returns the value of attribute tendency.


66
67
68
# File 'lib/metar/data/runway_visible_range.rb', line 66

def tendency
  @tendency
end

#visibility1Object (readonly)

Returns the value of attribute visibility1.


66
67
68
# File 'lib/metar/data/runway_visible_range.rb', line 66

def visibility1
  @visibility1
end

#visibility2Object (readonly)

Returns the value of attribute visibility2.


66
67
68
# File 'lib/metar/data/runway_visible_range.rb', line 66

def visibility2
  @visibility2
end

Class Method Details

.parse(raw) ⇒ Object

[View source]

16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/metar/data/runway_visible_range.rb', line 16

def self.parse(raw)
  return nil if raw.nil?

  m1 = raw.match(%r{^R(\d+[RLC]?)/(P|M|)(\d{4})(FT|)/?(N|U|D|)$})
  if m1
    designator = m1[1]
    comparator = COMPARATOR[m1[2]]
    count      = m1[3].to_f
    units      = UNITS[m1[4]]
    tendency   = TENDENCY[m1[5]]
    distance   = Metar::Data::Distance.send(units, count)
    visibility = Metar::Data::Visibility.new(
      nil, distance: distance, comparator: comparator
    )
    return new(
      raw,
      designator: designator, visibility1: visibility, tendency: tendency
    )
  end

  m2 = raw.match(
    %r{^R(\d+[RLC]?)/(P|M|)(\d{4})V(P|M|)(\d{4})(FT|)/?(N|U|D)?$}
  )
  if m2
    designator  = m2[1]
    comparator1 = COMPARATOR[m2[2]]
    count1      = m2[3].to_f
    comparator2 = COMPARATOR[m2[4]]
    count2      = m2[5].to_f
    units       = UNITS[m2[6]]
    tendency    = TENDENCY[m2[7]]
    distance1   = Metar::Data::Distance.send(units, count1)
    distance2   = Metar::Data::Distance.send(units, count2)
    visibility1 = Metar::Data::Visibility.new(
      nil, distance: distance1, comparator: comparator1
    )
    visibility2 = Metar::Data::Visibility.new(
      nil, distance: distance2, comparator: comparator2
    )
    return new(
      raw,
      designator: designator,
      visibility1: visibility1, visibility2: visibility2,
      tendency: tendency, units: units
    )
  end

  nil
end

Instance Method Details

#to_sObject

[View source]

84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/metar/data/runway_visible_range.rb', line 84

def to_s
  distance_options = {
    abbreviated: true,
    precision: 0,
    units: @units
  }
  s =
    if @visibility2.nil?
      I18n.t('metar.runway_visible_range.runway') +
        ' '  + @designator +
        ': ' + @visibility1.to_s(distance_options)
    else
      I18n.t('metar.runway_visible_range.runway') +
        ' '  + @designator +
        ': ' + I18n.t('metar.runway_visible_range.from') +
        ' '  + @visibility1.to_s(distance_options) +
        ' '  + I18n.t('metar.runway_visible_range.to') +
        ' '  + @visibility2.to_s(distance_options)
    end

  s += ' ' + I18n.t("tendency.#{tendency}") if !tendency.nil?

  s
end