metar-parser 1.2.1 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/metar/data/base.rb +15 -0
- data/lib/metar/data/density_altitude.rb +15 -0
- data/lib/metar/data/direction.rb +9 -0
- data/lib/metar/data/distance.rb +27 -0
- data/lib/metar/data/lightning.rb +61 -0
- data/lib/metar/data/observer.rb +24 -0
- data/lib/metar/data/pressure.rb +23 -0
- data/lib/metar/data/remark.rb +98 -0
- data/lib/metar/data/runway_visible_range.rb +85 -0
- data/lib/metar/data/sky_condition.rb +61 -0
- data/lib/metar/data/speed.rb +22 -0
- data/lib/metar/data/station_code.rb +7 -0
- data/lib/metar/data/temperature.rb +21 -0
- data/lib/metar/data/temperature_and_dew_point.rb +18 -0
- data/lib/metar/data/time.rb +54 -0
- data/lib/metar/data/variable_wind.rb +25 -0
- data/lib/metar/data/vertical_visibility.rb +26 -0
- data/lib/metar/data/visibility.rb +71 -0
- data/lib/metar/data/visibility_remark.rb +8 -0
- data/lib/metar/data/weather_phenomenon.rb +86 -0
- data/lib/metar/data/wind.rb +82 -0
- data/lib/metar/data.rb +22 -636
- data/lib/metar/i18n.rb +6 -0
- data/lib/metar/parser.rb +165 -120
- data/lib/metar/report.rb +1 -1
- data/lib/metar/version.rb +2 -2
- data/lib/metar.rb +7 -6
- data/locales/de.yml +1 -0
- data/locales/en.yml +1 -0
- data/locales/it.yml +2 -1
- data/locales/pt-BR.yml +1 -0
- data/spec/data/density_altitude_spec.rb +12 -0
- data/spec/{distance_spec.rb → data/distance_spec.rb} +1 -1
- data/spec/data/lightning_spec.rb +49 -0
- data/spec/data/pressure_spec.rb +22 -0
- data/spec/data/remark_spec.rb +99 -0
- data/spec/data/runway_visible_range_spec.rb +92 -0
- data/spec/{sky_condition_spec.rb → data/sky_condition_spec.rb} +10 -6
- data/spec/data/speed_spec.rb +45 -0
- data/spec/data/temperature_spec.rb +36 -0
- data/spec/{variable_wind_spec.rb → data/variable_wind_spec.rb} +6 -6
- data/spec/{vertical_visibility_spec.rb → data/vertical_visibility_spec.rb} +2 -2
- data/spec/{data_spec.rb → data/visibility_remark_spec.rb} +1 -11
- data/spec/{visibility_spec.rb → data/visibility_spec.rb} +9 -7
- data/spec/{weather_phenomenon_spec.rb → data/weather_phenomenon_spec.rb} +7 -3
- data/spec/{wind_spec.rb → data/wind_spec.rb} +10 -7
- data/spec/parser_spec.rb +107 -13
- data/spec/report_spec.rb +12 -1
- data/spec/spec_helper.rb +1 -1
- data/spec/station_spec.rb +2 -1
- metadata +56 -31
- data/spec/pressure_spec.rb +0 -22
- data/spec/remark_spec.rb +0 -147
- data/spec/runway_visible_range_spec.rb +0 -81
- data/spec/speed_spec.rb +0 -45
- data/spec/temperature_spec.rb +0 -36
@@ -0,0 +1,99 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Metar::Data::Remark do
|
4
|
+
context '.parse' do
|
5
|
+
it 'delegate to subclasses' do
|
6
|
+
expect(described_class.parse('21012')).to be_a(Metar::Data::TemperatureExtreme)
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'returns nil for unrecognised' do
|
10
|
+
expect(described_class.parse('FOO')).to be_nil
|
11
|
+
end
|
12
|
+
|
13
|
+
context '6-hour maximum or minimum' do
|
14
|
+
[
|
15
|
+
['positive maximum', '10046', [:maximum, 4.6]],
|
16
|
+
['negative maximum', '11012', [:maximum, -1.2]],
|
17
|
+
['positive minimum', '20046', [:minimum, 4.6]],
|
18
|
+
['negative minimum', '21012', [:minimum, -1.2]],
|
19
|
+
].each do |docstring, raw, expected|
|
20
|
+
example docstring do
|
21
|
+
expect(described_class.parse(raw)).to be_temperature_extreme(*expected)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
context '24-hour maximum and minimum' do
|
27
|
+
it 'returns minimum and maximum' do
|
28
|
+
max, min = described_class.parse('400461006')
|
29
|
+
|
30
|
+
expect(max).to be_temperature_extreme(:maximum, 4.6)
|
31
|
+
expect(min).to be_temperature_extreme(:minimum, -0.6)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'pressure tendency' do
|
36
|
+
it 'steady_then_decreasing' do
|
37
|
+
pt = described_class.parse('58033')
|
38
|
+
|
39
|
+
expect(pt).to be_a(Metar::Data::PressureTendency)
|
40
|
+
expect(pt.character).to eq(:steady_then_decreasing)
|
41
|
+
expect(pt.value).to eq(3.3)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context '3-hour and 6-hour precipitation' do
|
46
|
+
it '60009' do
|
47
|
+
pr = described_class.parse('60009')
|
48
|
+
|
49
|
+
expect(pr).to be_a(Metar::Data::Precipitation)
|
50
|
+
expect(pr.period).to eq(3)
|
51
|
+
expect(pr.amount.value).to eq(0.002286)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context '24-hour precipitation' do
|
56
|
+
it '70015' do
|
57
|
+
pr = described_class.parse('70015')
|
58
|
+
|
59
|
+
expect(pr).to be_a(Metar::Data::Precipitation)
|
60
|
+
expect(pr.period).to eq(24)
|
61
|
+
expect(pr.amount.value).to eq(0.003810)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
context 'automated station' do
|
66
|
+
|
67
|
+
[
|
68
|
+
['with precipitation dicriminator', 'AO1', [Metar::Data::AutomatedStationType, :with_precipitation_discriminator]],
|
69
|
+
['without precipitation dicriminator', 'AO2', [Metar::Data::AutomatedStationType, :without_precipitation_discriminator]],
|
70
|
+
].each do |docstring, raw, expected|
|
71
|
+
example docstring do
|
72
|
+
aut = described_class.parse(raw)
|
73
|
+
|
74
|
+
expect(aut).to be_a(expected[0])
|
75
|
+
expect(aut.type).to eq(expected[1])
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
context 'sea-level pressure' do
|
81
|
+
it 'SLP125' do
|
82
|
+
slp = described_class.parse('SLP125')
|
83
|
+
|
84
|
+
expect(slp).to be_a(Metar::Data::SeaLevelPressure)
|
85
|
+
expect(slp.pressure.value).to eq(0.0125)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
context 'hourly temperature and dew point' do
|
90
|
+
it 'T00640036' do
|
91
|
+
htm = described_class.parse('T00641036')
|
92
|
+
|
93
|
+
expect(htm).to be_a(Metar::Data::HourlyTemperatureAndDewPoint)
|
94
|
+
expect(htm.temperature.value).to eq(6.4)
|
95
|
+
expect(htm.dew_point.value).to eq(-3.6)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "spec_helper"
|
3
|
+
|
4
|
+
RSpec::Matchers.define :be_runway_visible_range do |designator, visibility1, visibility2, tendency|
|
5
|
+
match do |rvr|
|
6
|
+
if rvr.nil? && designator.nil?
|
7
|
+
true
|
8
|
+
elsif rvr.nil? != designator.nil?
|
9
|
+
false
|
10
|
+
elsif rvr.visibility1.nil? != visibility1.nil?
|
11
|
+
false
|
12
|
+
elsif rvr.visibility2.nil? != visibility2.nil?
|
13
|
+
false
|
14
|
+
elsif rvr.tendency.nil? != tendency.nil?
|
15
|
+
false
|
16
|
+
elsif ! visibility1.nil? &&
|
17
|
+
((rvr.visibility1.distance.value - visibility1[0]).abs > 0.01 ||
|
18
|
+
rvr.visibility1.comparator != visibility1[ 2 ])
|
19
|
+
false
|
20
|
+
elsif ! visibility2.nil? &&
|
21
|
+
((rvr.visibility2.distance.value - visibility2[0]).abs > 0.02 ||
|
22
|
+
rvr.visibility2.comparator != visibility2[2])
|
23
|
+
false
|
24
|
+
elsif tendency != rvr.tendency
|
25
|
+
false
|
26
|
+
else
|
27
|
+
true
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe Metar::Data::RunwayVisibleRange do
|
33
|
+
context '.parse' do
|
34
|
+
[
|
35
|
+
['understands R + nn + / + nnnn', 'R12/3400', ['12', [3400.00, nil, nil], nil, nil]],
|
36
|
+
['understands runway positions: RLC', 'R12L/3400', ['12L', [3400.00, nil, nil], nil, nil]],
|
37
|
+
['understands comparators: PM', 'R12/P3400', ['12', [3400.00, nil, :more_than], nil, nil]],
|
38
|
+
['understands tendencies: NUD', 'R12/3400U', ['12', [3400.00, nil, nil], nil, :improving]],
|
39
|
+
['understands feet', 'R12/3400FT', ['12', [1036.32, nil, nil], nil, nil]],
|
40
|
+
['understands second visibilities (m)', 'R26/0750V1200U', ['12', [ 750.0, nil, nil], [1200.0, nil, nil], :improving]],
|
41
|
+
['understands second visibilities (ft)', 'R12/1800V3400FT', ['12', [548.64, nil, nil], [1036.32, nil, nil], nil]],
|
42
|
+
['understands second RVR (ft) w/ tendency', 'R29/1800V3400FT/U', ['29', [548.64, nil, nil], [1036.32, nil, nil], :improving]],
|
43
|
+
['returns nil for nil', nil, [nil, nil, nil, nil]],
|
44
|
+
].each do |docstring, raw, expected|
|
45
|
+
example docstring do
|
46
|
+
expect(described_class.parse(raw)).to be_runway_visible_range(*expected)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
context '#to_s' do
|
52
|
+
before :all do
|
53
|
+
@locale = I18n.locale
|
54
|
+
I18n.locale = :it
|
55
|
+
end
|
56
|
+
|
57
|
+
after :all do
|
58
|
+
I18n.locale = @locale
|
59
|
+
end
|
60
|
+
|
61
|
+
[
|
62
|
+
['v1', :en, [[3400.00, nil, nil], nil, nil], 'runway 14: 3400m'],
|
63
|
+
['v1 and v2', :en, [[3400.00, nil, nil], [1900.00, nil, nil], nil ], 'runway 14: from 3400m to 1900m'],
|
64
|
+
['v1 and tendency', :en, [[3400.00, nil, nil], nil, :improving ], 'runway 14: 3400m improving'],
|
65
|
+
].each do |docstring, locale, (visibility1, visibility2, tendency), expected|
|
66
|
+
d1 = Metar::Data::Distance.new(visibility1[0])
|
67
|
+
v1 = Metar::Data::Visibility.new(
|
68
|
+
nil, distance: d1, direction: visibility1[1], comparator: visibility1[2]
|
69
|
+
)
|
70
|
+
v2 =
|
71
|
+
if ! visibility2.nil?
|
72
|
+
d2 = Metar::Data::Distance.new(visibility2[0])
|
73
|
+
Metar::Data::Visibility.new(
|
74
|
+
nil,
|
75
|
+
distance: d2, direction: visibility2[1], comparator: visibility2[2]
|
76
|
+
)
|
77
|
+
else
|
78
|
+
nil
|
79
|
+
end
|
80
|
+
|
81
|
+
example docstring + " (#{locale})" do
|
82
|
+
I18n.locale = locale
|
83
|
+
subject = described_class.new(
|
84
|
+
nil,
|
85
|
+
designator: '14',
|
86
|
+
visibility1: v1, visibility2: v2, tendency: tendency
|
87
|
+
)
|
88
|
+
expect(subject.to_s).to eq(expected)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -9,7 +9,7 @@ RSpec::Matchers.define :be_sky_condition do |quantity, height, type|
|
|
9
9
|
false
|
10
10
|
elsif sk.quantity != quantity
|
11
11
|
false
|
12
|
-
elsif sk.height.is_a?(Metar::Distance) && sk.height.value != height
|
12
|
+
elsif sk.height.is_a?(Metar::Data::Distance) && sk.height.value != height
|
13
13
|
false
|
14
14
|
elsif sk.type != type
|
15
15
|
false
|
@@ -19,7 +19,7 @@ RSpec::Matchers.define :be_sky_condition do |quantity, height, type|
|
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
-
describe Metar::SkyCondition do
|
22
|
+
describe Metar::Data::SkyCondition do
|
23
23
|
context '.parse' do
|
24
24
|
[
|
25
25
|
['understands clear skies codes', 'NSC', [nil, nil, nil]],
|
@@ -31,7 +31,7 @@ describe Metar::SkyCondition do
|
|
31
31
|
['returns nil for unmatched', 'FUBAR', [:expect_nil, nil, nil]],
|
32
32
|
].each do |docstring, raw, expected|
|
33
33
|
example docstring do
|
34
|
-
expect(
|
34
|
+
expect(described_class.parse(raw)).to be_sky_condition(*expected)
|
35
35
|
end
|
36
36
|
end
|
37
37
|
end
|
@@ -48,7 +48,9 @@ describe Metar::SkyCondition do
|
|
48
48
|
after { I18n.locale = @old_locale }
|
49
49
|
|
50
50
|
example "#{docstring} - #{locale}" do
|
51
|
-
condition =
|
51
|
+
condition = described_class.new(
|
52
|
+
nil, quantity: quantity, height: height, type: type
|
53
|
+
)
|
52
54
|
I18n.locale = locale
|
53
55
|
expect(condition.to_summary).to eq(expected)
|
54
56
|
end
|
@@ -62,8 +64,10 @@ describe Metar::SkyCondition do
|
|
62
64
|
['quantity + type', ['broken', 360, 'cumulonimbus'], 'broken cumulonimbus at 360'],
|
63
65
|
].each do |docstring, (quantity, height, type), expected|
|
64
66
|
example docstring do
|
65
|
-
|
66
|
-
|
67
|
+
subject = described_class.new(
|
68
|
+
nil, quantity: quantity, height: height, type: type
|
69
|
+
)
|
70
|
+
expect(subject.to_s).to eq(expected)
|
67
71
|
end
|
68
72
|
end
|
69
73
|
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Metar::Data::Speed do
|
4
|
+
context ".parse" do
|
5
|
+
it "returns nil for nil" do
|
6
|
+
speed = described_class.parse(nil)
|
7
|
+
|
8
|
+
expect(speed).to be_nil
|
9
|
+
end
|
10
|
+
|
11
|
+
it "parses knots" do
|
12
|
+
speed = described_class.parse("5KT")
|
13
|
+
|
14
|
+
expect(speed).to be_a(described_class)
|
15
|
+
expect(speed.value).to be_within(0.01).of(2.57)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "parses meters per second" do
|
19
|
+
speed = described_class.parse("7MPS")
|
20
|
+
|
21
|
+
expect(speed).to be_a(described_class)
|
22
|
+
expect(speed.value).to be_within(0.01).of(7.00)
|
23
|
+
end
|
24
|
+
|
25
|
+
it "parses kilometers per hour" do
|
26
|
+
speed = described_class.parse("14KMH")
|
27
|
+
|
28
|
+
expect(speed).to be_a(described_class)
|
29
|
+
expect(speed.value).to be_within(0.01).of(3.89)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "treats straight numbers as kilomters per hour" do
|
33
|
+
speed = described_class.parse("14")
|
34
|
+
|
35
|
+
expect(speed).to be_a(described_class)
|
36
|
+
expect(speed.value).to be_within(0.01).of(3.89)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "returns nil for other strings" do
|
40
|
+
speed = described_class.parse("")
|
41
|
+
|
42
|
+
expect(speed).to be_nil
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "spec_helper"
|
3
|
+
|
4
|
+
describe Metar::Data::Temperature do
|
5
|
+
context ".parse" do
|
6
|
+
it "understands numbers" do
|
7
|
+
t = described_class.parse("5")
|
8
|
+
|
9
|
+
expect(t.value).to be_within(0.01).of(5.0)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "treats an M-prefix as a negative indicator" do
|
13
|
+
t = described_class.parse("M5")
|
14
|
+
|
15
|
+
expect(t.value).to be_within(0.01).of(-5.0)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "returns nil for other values" do
|
19
|
+
expect(described_class.parse("")).to be_nil
|
20
|
+
expect(described_class.parse("aaa")).to be_nil
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context "#to_s" do
|
25
|
+
it "abbreviates the units" do
|
26
|
+
t = described_class.new(5)
|
27
|
+
|
28
|
+
expect(t.to_s).to eq("5°C")
|
29
|
+
end
|
30
|
+
|
31
|
+
it "rounds to the nearest degree" do
|
32
|
+
expect(described_class.new(5.1).to_s).to eq("5°C")
|
33
|
+
expect(described_class.new(5.5).to_s).to eq("6°C")
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -1,30 +1,30 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
|
-
describe Metar::VariableWind do
|
3
|
+
describe Metar::Data::VariableWind do
|
4
4
|
context '.parse' do
|
5
5
|
it 'understands nnn + V + nnn' do
|
6
|
-
vw =
|
6
|
+
vw = described_class.parse('090V180')
|
7
7
|
|
8
8
|
expect(vw.direction1.value).to eq(90.0)
|
9
9
|
expect(vw.direction2.value).to eq(180.0)
|
10
10
|
end
|
11
11
|
|
12
12
|
it 'accepts 360, rounding to 0 - 1' do
|
13
|
-
vw =
|
13
|
+
vw = described_class.parse('360V090')
|
14
14
|
|
15
15
|
expect(vw.direction1.value).to eq(0.0)
|
16
16
|
expect(vw.direction2.value).to eq(90.0)
|
17
17
|
end
|
18
18
|
|
19
19
|
it 'accepts 360, rounding to 0 - 2' do
|
20
|
-
vw =
|
20
|
+
vw = described_class.parse('090V360')
|
21
21
|
|
22
22
|
expect(vw.direction1.value).to eq(90.0)
|
23
23
|
expect(vw.direction2.value).to eq(0.0)
|
24
24
|
end
|
25
25
|
|
26
26
|
it 'returns nil for other' do
|
27
|
-
vw =
|
27
|
+
vw = described_class.parse('XXX')
|
28
28
|
|
29
29
|
expect(vw).to be_nil
|
30
30
|
end
|
@@ -32,7 +32,7 @@ describe Metar::VariableWind do
|
|
32
32
|
|
33
33
|
context '#to_s' do
|
34
34
|
it 'renders compatible values as compass directions' do
|
35
|
-
vw =
|
35
|
+
vw = described_class.parse('090V180')
|
36
36
|
|
37
37
|
expect(vw.to_s).to eq('E - S')
|
38
38
|
end
|
@@ -16,7 +16,7 @@ RSpec::Matchers.define :be_distance do |expected|
|
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
-
describe Metar::VerticalVisibility do
|
19
|
+
describe Metar::Data::VerticalVisibility do
|
20
20
|
context '.parse' do
|
21
21
|
[
|
22
22
|
['VV + nnn', 'VV300', 9144],
|
@@ -24,7 +24,7 @@ describe Metar::VerticalVisibility do
|
|
24
24
|
['returns nil for unmatched', 'FUBAR', :expect_nil],
|
25
25
|
].each do |docstring, raw, expected|
|
26
26
|
example docstring do
|
27
|
-
expect(
|
27
|
+
expect(described_class.parse(raw)).to be_distance(expected)
|
28
28
|
end
|
29
29
|
end
|
30
30
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require "spec_helper"
|
3
3
|
|
4
|
-
|
4
|
+
describe Metar::Data::VisibilityRemark do
|
5
5
|
describe ".parse" do
|
6
6
|
subject { described_class.parse("2000W") }
|
7
7
|
|
@@ -14,13 +14,3 @@ RSpec.describe Metar::VisibilityRemark do
|
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
17
|
-
|
18
|
-
RSpec.describe Metar::DensityAltitude do
|
19
|
-
describe ".parse" do
|
20
|
-
subject { described_class.parse("50FT") }
|
21
|
-
|
22
|
-
it "interprets the value as feet" do
|
23
|
-
expect(subject.height.to_feet).to eq(50)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
@@ -13,9 +13,9 @@ RSpec::Matchers.define :be_visibility do |distance, direction, comparator|
|
|
13
13
|
false
|
14
14
|
elsif visibility.comparator.nil? != comparator.nil?
|
15
15
|
false
|
16
|
-
elsif visibility.distance.is_a?(Metar::Distance)&& (visibility.distance.value - distance).abs > 0.01
|
16
|
+
elsif visibility.distance.is_a?(Metar::Data::Distance) && (visibility.distance.value - distance).abs > 0.01
|
17
17
|
false
|
18
|
-
elsif visibility.direction.is_a?(M9t::Direction)&& (visibility.direction.value - direction).abs > 0.01
|
18
|
+
elsif visibility.direction.is_a?(M9t::Direction) && (visibility.direction.value - direction).abs > 0.01
|
19
19
|
false
|
20
20
|
elsif comparator.is_a?(Symbol) && visibility.comparator != comparator
|
21
21
|
false
|
@@ -25,7 +25,7 @@ RSpec::Matchers.define :be_visibility do |distance, direction, comparator|
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
-
describe Metar::Visibility do
|
28
|
+
describe Metar::Data::Visibility do
|
29
29
|
context '.parse' do
|
30
30
|
[
|
31
31
|
['understands 9999', '9999', [10000.00, nil, :more_than]],
|
@@ -41,7 +41,7 @@ describe Metar::Visibility do
|
|
41
41
|
['returns nil for unmatched', 'FUBAR', [ nil, nil, nil]],
|
42
42
|
].each do |docstring, raw, expected|
|
43
43
|
example docstring do
|
44
|
-
expect(
|
44
|
+
expect(described_class.parse(raw)).to be_visibility(*expected)
|
45
45
|
end
|
46
46
|
end
|
47
47
|
end
|
@@ -64,14 +64,16 @@ describe Metar::Visibility do
|
|
64
64
|
['with distance and direction', :it, [ :set, :set, nil ], '4km ESE'],
|
65
65
|
['with distance, direction and comparator', :it, [ :set, :set, :more_than ], 'piú di 4km ESE'],
|
66
66
|
].each do |docstring, locale, (distance, direction, comparator), expected|
|
67
|
-
distance = Metar::Distance.new(4321) if distance == :set
|
67
|
+
distance = Metar::Data::Distance.new(4321) if distance == :set
|
68
68
|
direction = M9t::Direction.new(123) if direction == :set
|
69
69
|
|
70
70
|
example docstring + " (#{locale})" do
|
71
71
|
I18n.locale = locale
|
72
|
-
|
72
|
+
subject = described_class.new(
|
73
|
+
nil, distance: distance, direction: direction, comparator: comparator
|
74
|
+
)
|
73
75
|
|
74
|
-
expect(
|
76
|
+
expect(subject.to_s).to eq(expected)
|
75
77
|
end
|
76
78
|
end
|
77
79
|
end
|
@@ -19,7 +19,7 @@ RSpec::Matchers.define :be_weather_phenomenon do |modifier, descriptor, phenomen
|
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
-
describe Metar::WeatherPhenomenon do
|
22
|
+
describe Metar::Data::WeatherPhenomenon do
|
23
23
|
context '.parse' do
|
24
24
|
[
|
25
25
|
['simple phenomenon', 'BR', [nil, nil, 'mist']],
|
@@ -33,7 +33,7 @@ describe Metar::WeatherPhenomenon do
|
|
33
33
|
['returns nil for unmatched', 'FUBAR', [nil, nil, nil]],
|
34
34
|
].each do |docstring, raw, expected|
|
35
35
|
example docstring do
|
36
|
-
expect(
|
36
|
+
expect(described_class.parse(raw)).to be_weather_phenomenon(*expected)
|
37
37
|
end
|
38
38
|
end
|
39
39
|
end
|
@@ -58,7 +58,11 @@ describe Metar::WeatherPhenomenon do
|
|
58
58
|
].each do |docstring, locale, (modifier, descriptor, phenomenon), expected|
|
59
59
|
example docstring + " (#{locale})" do
|
60
60
|
I18n.locale = locale
|
61
|
-
|
61
|
+
subject = described_class.new(
|
62
|
+
nil,
|
63
|
+
phenomenon: phenomenon, modifier: modifier, descriptor: descriptor
|
64
|
+
)
|
65
|
+
expect(subject.to_s).to eq(expected)
|
62
66
|
end
|
63
67
|
end
|
64
68
|
end
|
@@ -19,7 +19,7 @@ RSpec::Matchers.define :be_wind do |direction, speed, gusts|
|
|
19
19
|
false
|
20
20
|
elsif speed.is_a?(Symbol) && wind.speed != speed
|
21
21
|
false
|
22
|
-
elsif speed.is_a?(Metar::Speed) && (wind.speed.value - speed).abs > 0.01
|
22
|
+
elsif speed.is_a?(Metar::Data::Speed) && (wind.speed.value - speed).abs > 0.01
|
23
23
|
false
|
24
24
|
elsif !wind.gusts.nil? && (wind.gusts.value - gusts).abs > 0.01
|
25
25
|
false
|
@@ -29,7 +29,7 @@ RSpec::Matchers.define :be_wind do |direction, speed, gusts|
|
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
-
describe Metar::Wind do
|
32
|
+
describe Metar::Data::Wind do
|
33
33
|
context '.parse' do
|
34
34
|
[
|
35
35
|
# Direction and speed
|
@@ -66,7 +66,7 @@ describe Metar::Wind do
|
|
66
66
|
['returns nil for nil', nil, [nil, nil, nil]],
|
67
67
|
].each do |docstring, raw, expected|
|
68
68
|
example docstring do
|
69
|
-
expect(
|
69
|
+
expect(described_class.parse(raw)).to be_wind(*expected)
|
70
70
|
end
|
71
71
|
end
|
72
72
|
end
|
@@ -86,19 +86,22 @@ describe Metar::Wind do
|
|
86
86
|
['handles variable_direction', :en, [:variable_direction, nil, nil ], '443km/h variable direction' ],
|
87
87
|
['handles unknown_direction', :en, [:unknown_direction, nil, nil ], '443km/h unknown direction' ],
|
88
88
|
['handles unknown_speed', :en, [nil, :unknown_speed, nil ], 'unknown speed ESE' ],
|
89
|
-
['includes gusts', :en, [nil, nil, Metar::Speed.new(123)], '443km/h ESE gusts 443km/h' ],
|
89
|
+
['includes gusts', :en, [nil, nil, Metar::Data::Speed.new(123)], '443km/h ESE gusts 443km/h' ],
|
90
90
|
['formats speed and direction', :it, [nil, nil, nil ], '443km/h ESE' ],
|
91
91
|
['handles variable_direction', :it, [:variable_direction, nil, nil ], '443km/h direzione variabile' ],
|
92
92
|
['handles unknown_direction', :it, [:unknown_direction, nil, nil ], '443km/h direzione sconosciuta'],
|
93
93
|
['handles unknown_speed', :it, [nil, :unknown_speed, nil ], 'velocità sconosciuta ESE' ],
|
94
|
-
['includes gusts', :it, [nil, nil, Metar::Speed.new(123)], '443km/h ESE folate di 443km/h'],
|
94
|
+
['includes gusts', :it, [nil, nil, Metar::Data::Speed.new(123)], '443km/h ESE folate di 443km/h'],
|
95
95
|
].each do |docstring, locale, (direction, speed, gusts), expected|
|
96
96
|
direction ||= M9t::Direction.new(123)
|
97
|
-
speed ||= Metar::Speed.new(123)
|
97
|
+
speed ||= Metar::Data::Speed.new(123)
|
98
98
|
|
99
99
|
example docstring + " (#{locale})" do
|
100
100
|
I18n.locale = locale
|
101
|
-
|
101
|
+
subject = described_class.new(
|
102
|
+
"chunk", direction: direction, speed: speed, gusts: gusts
|
103
|
+
)
|
104
|
+
expect(subject.to_s).to eq(expected)
|
102
105
|
end
|
103
106
|
end
|
104
107
|
end
|