metar-parser 0.9.11 → 0.9.12
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +15 -9
- data/Rakefile +23 -14
- data/bin/download_raw.rb +0 -2
- data/lib/metar/data.rb +84 -73
- data/lib/metar/parser.rb +2 -8
- data/lib/metar/raw.rb +1 -5
- data/lib/metar/report.rb +22 -48
- data/lib/metar/station.rb +16 -63
- data/lib/metar/version.rb +1 -1
- data/locales/en.yml +8 -2
- data/locales/it.yml +6 -0
- data/spec/spec_helper.rb +5 -0
- data/spec/unit/distance_spec.rb +85 -0
- data/spec/unit/parser_spec.rb +234 -0
- data/spec/unit/pressure_spec.rb +32 -0
- data/spec/unit/raw_spec.rb +196 -0
- data/spec/unit/report_spec.rb +187 -0
- data/spec/unit/runway_visible_range_spec.rb +88 -0
- data/spec/unit/sky_condition_spec.rb +73 -0
- data/spec/unit/speed_spec.rb +50 -0
- data/spec/unit/station_spec.rb +254 -0
- data/spec/unit/temperature_spec.rb +47 -0
- data/spec/unit/variable_wind_spec.rb +34 -0
- data/spec/unit/vertical_visibility_spec.rb +37 -0
- data/spec/unit/visibility_spec.rb +84 -0
- data/spec/unit/weather_phenomenon_spec.rb +68 -0
- data/spec/unit/wind_spec.rb +99 -0
- metadata +85 -18
- data/test/all_tests.rb +0 -6
- data/test/metar_test_helper.rb +0 -33
- data/test/unit/data_test.rb +0 -376
- data/test/unit/parser_test.rb +0 -144
- data/test/unit/raw_test.rb +0 -37
- data/test/unit/report_test.rb +0 -105
- data/test/unit/station_test.rb +0 -88
data/lib/metar/station.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'rubygems' if RUBY_VERSION < '1.9'
|
2
1
|
require 'open-uri'
|
3
2
|
require 'set'
|
4
3
|
|
@@ -14,7 +13,6 @@ module Metar
|
|
14
13
|
class << self
|
15
14
|
|
16
15
|
@nsd_cccc = nil # Contains the text of the station list
|
17
|
-
attr_accessor :nsd_cccc # Allow tests to run from local file
|
18
16
|
|
19
17
|
def download_local
|
20
18
|
nsd_cccc = Metar::Station.download_stations
|
@@ -33,7 +31,7 @@ module Metar
|
|
33
31
|
end
|
34
32
|
|
35
33
|
def countries
|
36
|
-
all_structures.reduce( Set.new ) { |a, s| a.add( s[ :country ] )
|
34
|
+
all_structures.reduce( Set.new ) { |a, s| a.add( s[ :country ] ) }.to_a.sort
|
37
35
|
end
|
38
36
|
|
39
37
|
def all
|
@@ -44,6 +42,10 @@ module Metar
|
|
44
42
|
end
|
45
43
|
end
|
46
44
|
|
45
|
+
def find_by_cccc(cccc)
|
46
|
+
all.find { |station| station.cccc == cccc }
|
47
|
+
end
|
48
|
+
|
47
49
|
# Does the given CCCC code exist?
|
48
50
|
def exist?(cccc)
|
49
51
|
not find_data_by_cccc(cccc).nil?
|
@@ -53,10 +55,6 @@ module Metar
|
|
53
55
|
all.select { | s | s.country == country }
|
54
56
|
end
|
55
57
|
|
56
|
-
def find_by_cccc(cccc)
|
57
|
-
all.find { |station| station.cccc == cccc }
|
58
|
-
end
|
59
|
-
|
60
58
|
def to_longitude(s)
|
61
59
|
s =~ /^(\d+)-(\d+)([EW])/ or return nil
|
62
60
|
($3 == 'E' ? 1.0 : -1.0) * ($1.to_f + $2.to_f / 60.0)
|
@@ -68,64 +66,23 @@ module Metar
|
|
68
66
|
end
|
69
67
|
end
|
70
68
|
|
71
|
-
attr_reader :cccc, :
|
69
|
+
attr_reader :cccc, :name, :state, :country, :longitude, :latitude, :raw
|
72
70
|
alias :code :cccc
|
73
|
-
# loaded? indicates whether the data has been collected from the Web
|
74
|
-
alias :loaded? :loaded
|
75
71
|
|
76
72
|
# No check is made on the existence of the station
|
77
|
-
def initialize(cccc,
|
78
|
-
raise "Station identifier must not be nil"
|
79
|
-
raise "Station identifier must be
|
80
|
-
@cccc
|
81
|
-
|
82
|
-
@state = options[:state]
|
83
|
-
@country = options[:country]
|
84
|
-
@longitude = options[:longitude]
|
85
|
-
@latitude = options[:latitude]
|
86
|
-
@raw = options[:raw]
|
87
|
-
@loaded = false
|
73
|
+
def initialize( cccc, noaa_data )
|
74
|
+
raise "Station identifier must not be nil" if cccc.nil?
|
75
|
+
raise "Station identifier must not be empty" if cccc.to_s == ''
|
76
|
+
@cccc = cccc
|
77
|
+
load! noaa_data
|
88
78
|
end
|
89
79
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
load! if not @loaded
|
94
|
-
@name
|
95
|
-
end
|
96
|
-
|
97
|
-
def state
|
98
|
-
load! if not @loaded
|
99
|
-
@state
|
100
|
-
end
|
101
|
-
|
102
|
-
def country
|
103
|
-
load! if not @loaded
|
104
|
-
@country
|
105
|
-
end
|
106
|
-
|
107
|
-
def latitude
|
108
|
-
load! if not @loaded
|
109
|
-
@latitude
|
110
|
-
end
|
111
|
-
|
112
|
-
def longitude
|
113
|
-
load! if not @loaded
|
114
|
-
@longitude
|
115
|
-
end
|
116
|
-
|
117
|
-
def raw
|
118
|
-
load! if not @loaded
|
119
|
-
@raw
|
120
|
-
end
|
121
|
-
|
122
|
-
def exist?
|
123
|
-
Station.exist?(@cccc)
|
80
|
+
def parser
|
81
|
+
raw = Metar::Raw.new( @cccc )
|
82
|
+
Metar::Parser.new( raw )
|
124
83
|
end
|
125
84
|
|
126
85
|
def report
|
127
|
-
raw = Metar::Raw.new( @cccc )
|
128
|
-
parser = Metar::Parser.new( raw )
|
129
86
|
Metar::Report.new( parser )
|
130
87
|
end
|
131
88
|
|
@@ -172,20 +129,16 @@ module Metar
|
|
172
129
|
|
173
130
|
end
|
174
131
|
|
175
|
-
|
176
|
-
def load!
|
177
|
-
noaa_data = Station.find_data_by_cccc(@cccc)
|
178
|
-
raise "Station identifier '#{ @cccc }' not found" if noaa_data.nil?
|
132
|
+
def load!( noaa_data )
|
179
133
|
@name = noaa_data[:name]
|
180
134
|
@state = noaa_data[:state]
|
181
135
|
@country = noaa_data[:country]
|
182
136
|
@longitude = Station.to_longitude(noaa_data[:longitude])
|
183
137
|
@latitude = Station.to_latitude(noaa_data[:latitude])
|
184
138
|
@raw = noaa_data[:raw]
|
185
|
-
@loaded = true
|
186
|
-
self
|
187
139
|
end
|
188
140
|
|
189
141
|
end
|
190
142
|
|
191
143
|
end
|
144
|
+
|
data/lib/metar/version.rb
CHANGED
data/locales/en.yml
CHANGED
@@ -6,6 +6,10 @@ en:
|
|
6
6
|
comparison:
|
7
7
|
more_than: more than
|
8
8
|
less_than: less than
|
9
|
+
tendency:
|
10
|
+
no_change: no change
|
11
|
+
improving: improving
|
12
|
+
worsening: worsening
|
9
13
|
units:
|
10
14
|
pressure:
|
11
15
|
bar:
|
@@ -34,6 +38,7 @@ en:
|
|
34
38
|
variable_direction: variable direction
|
35
39
|
unknown_direction: unknown direction
|
36
40
|
unknown_speed: unknown speed
|
41
|
+
gusts: gusts
|
37
42
|
variable_wind:
|
38
43
|
title: wind variation
|
39
44
|
visibility:
|
@@ -147,6 +152,7 @@ en:
|
|
147
152
|
temperature:
|
148
153
|
title: temperature
|
149
154
|
dew_point:
|
150
|
-
title:
|
155
|
+
title: dew point
|
151
156
|
remarks:
|
152
|
-
title:
|
157
|
+
title: remarks
|
158
|
+
|
data/locales/it.yml
CHANGED
@@ -6,6 +6,10 @@ it:
|
|
6
6
|
comparison:
|
7
7
|
more_than: piú di
|
8
8
|
less_than: meno di
|
9
|
+
tendency:
|
10
|
+
no_change: invariato
|
11
|
+
improving: in miglioramento
|
12
|
+
worsening: tendente a peggiorare
|
9
13
|
units:
|
10
14
|
pressure:
|
11
15
|
bar:
|
@@ -34,6 +38,7 @@ it:
|
|
34
38
|
variable_direction: direzione variabile
|
35
39
|
unknown_direction: direzione sconosciuta
|
36
40
|
unknown_speed: velocità sconosciuta
|
41
|
+
gusts: folate di
|
37
42
|
variable_wind:
|
38
43
|
title: variazione del vento
|
39
44
|
visibility:
|
@@ -150,3 +155,4 @@ it:
|
|
150
155
|
title: punto di rugiada
|
151
156
|
remarks:
|
152
157
|
title: annotazioni
|
158
|
+
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
load File.expand_path( '../spec_helper.rb', File.dirname(__FILE__) )
|
2
|
+
|
3
|
+
describe Metar::Distance do
|
4
|
+
|
5
|
+
context '#value' do
|
6
|
+
|
7
|
+
it 'should treat the parameter as meters' do
|
8
|
+
@distance = Metar::Distance.new( 12345.67 )
|
9
|
+
|
10
|
+
@distance.units. should == :meters
|
11
|
+
@distance.value. should == 12345.67
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
context '#to_s' do
|
17
|
+
|
18
|
+
it 'should default to meters' do
|
19
|
+
@distance = Metar::Distance.new( rand * 1000.0 )
|
20
|
+
|
21
|
+
@distance.to_s. should =~ %r(^\d+m)
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should round down to the nearest meter' do
|
25
|
+
@distance = Metar::Distance.new( 12.345 )
|
26
|
+
|
27
|
+
@distance.to_s. should == '12m'
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should round up to meters' do
|
31
|
+
@distance = Metar::Distance.new( 8.750 )
|
32
|
+
|
33
|
+
@distance.to_s. should == '9m'
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'should allow units overrides' do
|
37
|
+
@distance = Metar::Distance.new( 12345.67 )
|
38
|
+
|
39
|
+
@distance.to_s( :units => :kilometers ).
|
40
|
+
should == '12km'
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should allow precision overrides' do
|
44
|
+
@distance = Metar::Distance.new( 12.34567 )
|
45
|
+
|
46
|
+
@distance.to_s( :precision => 1 ).
|
47
|
+
should == '12.3m'
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'should handle nil' do
|
51
|
+
@distance = Metar::Distance.new( nil )
|
52
|
+
|
53
|
+
@distance.to_s. should == 'unknown'
|
54
|
+
end
|
55
|
+
|
56
|
+
context 'translated' do
|
57
|
+
|
58
|
+
before :each do
|
59
|
+
@locale = I18n.locale
|
60
|
+
I18n.locale = :it
|
61
|
+
end
|
62
|
+
|
63
|
+
after :each do
|
64
|
+
I18n.locale = @locale
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'should allow precision overrides' do
|
68
|
+
@distance = Metar::Distance.new( 12.34567 )
|
69
|
+
|
70
|
+
@distance.to_s( :precision => 1 ).
|
71
|
+
should == '12,3m'
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'should handle nil' do
|
75
|
+
@distance = Metar::Distance.new( nil )
|
76
|
+
|
77
|
+
@distance.to_s. should == 'sconosciuto'
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
|
@@ -0,0 +1,234 @@
|
|
1
|
+
load File.expand_path( '../spec_helper.rb', File.dirname(__FILE__) )
|
2
|
+
# encoding: utf-8
|
3
|
+
|
4
|
+
describe Metar::Parser do
|
5
|
+
|
6
|
+
context '.for_cccc' do
|
7
|
+
|
8
|
+
it 'returns a loaded parser' do
|
9
|
+
station = stub( 'station' )
|
10
|
+
raw = stub( 'raw', :metar => "XXXX 061610Z 24006KT 1 3/4SM -SN BKN016 OVC030 M17/M20 A2910 RMK AO2 P0000",
|
11
|
+
:time => '2010/02/06 16:10' )
|
12
|
+
Metar::Station.stub!( :new => station )
|
13
|
+
Metar::Raw.stub!( :new => raw )
|
14
|
+
|
15
|
+
parser = Metar::Parser.for_cccc( 'XXXX' )
|
16
|
+
|
17
|
+
parser. should be_a( Metar::Parser )
|
18
|
+
parser.station_code. should == 'XXXX'
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'attributes' do
|
24
|
+
|
25
|
+
it '.location missing' do
|
26
|
+
expect do
|
27
|
+
setup_parser('PAIL', "2010/02/06 16:10\nFUBAR 24006KT 1 3/4SM -SN BKN016 OVC030 M17/M20 A2910 RMK AO2 P0000")
|
28
|
+
end. to raise_error( Metar::ParseError, /Expecting location/ )
|
29
|
+
end
|
30
|
+
|
31
|
+
it '.time missing' do
|
32
|
+
expect do
|
33
|
+
setup_parser('PAIL', "2010/02/06 16:10\nPAIL 24006KT 1 3/4SM -SN BKN016 OVC030 M17/M20 A2910 RMK AO2 P0000")
|
34
|
+
end. to raise_error( Metar::ParseError, /Expecting datetime/ )
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'date' do
|
38
|
+
parser = setup_parser('PAIL', "2010/02/06 16:10\nPAIL 061610Z 24006KT 1 3/4SM -SN BKN016 OVC030 M17/M20 A2910 RMK AO2 P0000")
|
39
|
+
parser.date. should == Date.new(2010, 2, 6)
|
40
|
+
end
|
41
|
+
|
42
|
+
context '.observer' do
|
43
|
+
|
44
|
+
it 'real' do
|
45
|
+
parser = setup_parser('PAIL', "2010/02/06 16:10\nPAIL 061610Z 24006KT 1 3/4SM -SN BKN016 OVC030 M17/M20 A2910 RMK AO2 P0000")
|
46
|
+
parser.observer. should == :real
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'auto' do
|
50
|
+
parser = setup_parser('CYXS', "2010/02/15 10:34\nCYXS 151034Z AUTO 09003KT 1/8SM FZFG VV001 M03/M03 A3019 RMK SLP263 ICG")
|
51
|
+
|
52
|
+
parser.observer. should == :auto
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'corrected' do
|
56
|
+
parser = setup_parser('PAIL', "2010/02/06 16:10\nPAIL 061610Z COR 24006KT 1 3/4SM -SN BKN016 OVC030 M17/M20 A2910 RMK AO2 P0000")
|
57
|
+
parser.observer. should == :corrected
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'wind' do
|
63
|
+
parser = setup_parser('PAIL', "2010/02/06 16:10\nPAIL 061610Z 24006KT 1 3/4SM -SN BKN016 OVC030 M17/M20 A2910 RMK AO2 P0000")
|
64
|
+
parser.wind.direction.value. should be_within( 0.0001 ).of( 240 )
|
65
|
+
parser.wind.speed.to_knots. should be_within( 0.0001 ).of( 6 )
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'variable_wind' do
|
69
|
+
parser = setup_parser('LIRQ', "2010/02/06 15:20\nLIRQ 061520Z 01007KT 350V050 9999 SCT035 BKN080 08/02 Q1005")
|
70
|
+
parser.variable_wind.direction1.value.should be_within( 0.0001 ).of( 350 )
|
71
|
+
parser.variable_wind.direction2.value.should be_within( 0.0001 ).of( 50 )
|
72
|
+
end
|
73
|
+
|
74
|
+
context '.visibility' do
|
75
|
+
it 'CAVOK' do
|
76
|
+
parser = setup_parser('PAIL', "2010/02/06 16:10\nPAIL 061610Z 24006KT CAVOK M17/M20 A2910 RMK AO2 P0000")
|
77
|
+
|
78
|
+
parser.visibility.distance.value.
|
79
|
+
should be_within( 0.01 ).of( 10000.00 )
|
80
|
+
parser.visibility.comparator.
|
81
|
+
should == :more_than
|
82
|
+
parser.present_weather.size.
|
83
|
+
should == 1
|
84
|
+
parser.present_weather[ 0 ].phenomenon.
|
85
|
+
should == 'No significant weather'
|
86
|
+
parser.sky_conditions.size.
|
87
|
+
should == 1
|
88
|
+
parser.sky_conditions[ 0 ].type.
|
89
|
+
should == nil
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'visibility_miles_and_fractions' do
|
93
|
+
parser = setup_parser('PAIL', "2010/02/06 16:10\nPAIL 061610Z 24006KT 1 3/4SM -SN BKN016 OVC030 M17/M20 A2910 RMK AO2 P0000")
|
94
|
+
|
95
|
+
parser.visibility.distance.to_miles.
|
96
|
+
should be_within( 0.01 ).of( 1.75 )
|
97
|
+
end
|
98
|
+
|
99
|
+
it '//// with automatic observer' do
|
100
|
+
parser = setup_parser('CYXS', "2010/02/15 10:34\nCYXS 151034Z AUTO 09003KT //// FZFG VV001 M03/M03 A3019 RMK SLP263 ICG")
|
101
|
+
|
102
|
+
parser.visibility. should be_nil
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
it 'runway_visible_range' do
|
107
|
+
parser = setup_parser('ESSB', "2010/02/15 10:20\nESSB 151020Z 26003KT 2000 R12/1000N R30/1500N VV002 M07/M07 Q1013 1271//55")
|
108
|
+
parser.runway_visible_range.length. should == 2
|
109
|
+
parser.runway_visible_range[0].designator. should == '12'
|
110
|
+
parser.runway_visible_range[0].visibility1.distance.value. should == 1000
|
111
|
+
parser.runway_visible_range[0].tendency. should == :no_change
|
112
|
+
end
|
113
|
+
|
114
|
+
it 'runway_visible_range_defaults_to_empty_array' do
|
115
|
+
parser = setup_parser('PAIL', "2010/02/06 16:10\nPAIL 061610Z 24006KT 1 3/4SM -SN BKN016 OVC030 M17/M20 A2910 RMK AO2 P0000")
|
116
|
+
parser.runway_visible_range.length. should == 0
|
117
|
+
end
|
118
|
+
|
119
|
+
it 'runway_visible_range_variable' do
|
120
|
+
parser = setup_parser('KPDX', "2010/02/15 11:08\nKPDX 151108Z 11006KT 1/4SM R10R/1600VP6000FT FG OVC002 05/05 A3022 RMK AO2")
|
121
|
+
|
122
|
+
parser.runway_visible_range[0].visibility1.distance.to_feet. should == 1600.0
|
123
|
+
parser.runway_visible_range[0].visibility2.distance.to_feet. should == 6000.0
|
124
|
+
end
|
125
|
+
|
126
|
+
context '.present_weather' do
|
127
|
+
|
128
|
+
it 'normal' do
|
129
|
+
parser = setup_parser('PAIL', "2010/02/06 16:10\nPAIL 061610Z 24006KT 1 3/4SM -SN BKN016 OVC030 M17/M20 A2910 RMK AO2 P0000")
|
130
|
+
|
131
|
+
parser.present_weather.size.
|
132
|
+
should == 1
|
133
|
+
parser.present_weather[0].modifier.
|
134
|
+
should == 'light'
|
135
|
+
parser.present_weather[0].phenomenon.
|
136
|
+
should == 'snow'
|
137
|
+
end
|
138
|
+
|
139
|
+
it 'auto + //' do
|
140
|
+
parser = setup_parser('PAIL', "2010/02/06 16:10\nPAIL 061610Z AUTO 24006KT 1 3/4SM // BKN016 OVC030 M17/M20 A2910 RMK AO2 P0000")
|
141
|
+
|
142
|
+
parser.present_weather.size.
|
143
|
+
should == 1
|
144
|
+
parser.present_weather[0].phenomenon.
|
145
|
+
should == 'not observed'
|
146
|
+
end
|
147
|
+
|
148
|
+
end
|
149
|
+
|
150
|
+
it 'present_weather_defaults_to_empty_array' do
|
151
|
+
parser = setup_parser('PAIL', "2010/02/06 16:10\nPAIL 061610Z 24006KT 1 3/4SM BKN016 OVC030 M17/M20 A2910 RMK AO2 P0000")
|
152
|
+
parser.present_weather.length. should == 0
|
153
|
+
end
|
154
|
+
|
155
|
+
context '.sky_conditions' do
|
156
|
+
|
157
|
+
it 'normal' do
|
158
|
+
parser = setup_parser('PAIL', "2010/02/06 16:10\nPAIL 061610Z 24006KT 1 3/4SM -SN BKN016 OVC030 M17/M20 A2910 RMK AO2 P0000")
|
159
|
+
|
160
|
+
parser.sky_conditions.size.
|
161
|
+
should == 2
|
162
|
+
parser.sky_conditions[0].quantity.
|
163
|
+
should == 'broken'
|
164
|
+
parser.sky_conditions[0].height.value.
|
165
|
+
should == 480
|
166
|
+
parser.sky_conditions[1].quantity.
|
167
|
+
should == 'overcast'
|
168
|
+
parser.sky_conditions[1].height.value.
|
169
|
+
should == 900
|
170
|
+
end
|
171
|
+
|
172
|
+
it 'auto + ///' do
|
173
|
+
parser = setup_parser('PAIL', "2010/02/06 16:10\nPAIL 061610Z AUTO 24006KT 1 3/4SM /// M17/M20 A2910 RMK AO2 P0000")
|
174
|
+
|
175
|
+
parser.sky_conditions.size.
|
176
|
+
should == 0
|
177
|
+
end
|
178
|
+
|
179
|
+
end
|
180
|
+
|
181
|
+
it 'sky_conditions_defaults_to_empty_array' do
|
182
|
+
parser = setup_parser('PAIL', "2010/02/06 16:10\nPAIL 061610Z 24006KT 1 3/4SM -SN M17/M20 A2910 RMK AO2 P0000")
|
183
|
+
parser.sky_conditions.length. should == 0
|
184
|
+
end
|
185
|
+
|
186
|
+
it 'vertical_visibility' do
|
187
|
+
parser = setup_parser('CYXS', "2010/02/15 10:34\nCYXS 151034Z AUTO 09003KT 1/8SM FZFG VV001 M03/M03 A3019 RMK SLP263 ICG")
|
188
|
+
parser.vertical_visibility.value. should == 30
|
189
|
+
end
|
190
|
+
|
191
|
+
it 'temperature_obligatory' do
|
192
|
+
expect do
|
193
|
+
setup_parser('PAIL', "2010/02/06 16:10\nPAIL 061610Z 24006KT 1 3/4SM -SN BKN016 OVC030 A2910 RMK AO2 P0000")
|
194
|
+
end. to raise_error( Metar::ParseError )
|
195
|
+
end
|
196
|
+
|
197
|
+
it 'temperature' do
|
198
|
+
parser = setup_parser('PAIL', "2010/02/06 16:10\nPAIL 061610Z 24006KT 1 3/4SM -SN BKN016 OVC030 M17/M20 A2910 RMK AO2 P0000")
|
199
|
+
parser.temperature.value. should == -17
|
200
|
+
end
|
201
|
+
|
202
|
+
it 'dew_point' do
|
203
|
+
parser = setup_parser('PAIL', "2010/02/06 16:10\nPAIL 061610Z 24006KT 1 3/4SM -SN BKN016 OVC030 M17/M20 A2910 RMK AO2 P0000")
|
204
|
+
parser.dew_point.value. should == -20
|
205
|
+
end
|
206
|
+
|
207
|
+
it 'sea_level_pressure' do
|
208
|
+
parser = setup_parser('PAIL', "2010/02/06 16:10\nPAIL 061610Z 24006KT 1 3/4SM -SN BKN016 OVC030 M17/M20 A2910 RMK AO2 P0000")
|
209
|
+
parser.sea_level_pressure.to_inches_of_mercury. should == 29.10
|
210
|
+
end
|
211
|
+
|
212
|
+
it 'remarks' do
|
213
|
+
parser = setup_parser('PAIL', "2010/02/06 16:10\nPAIL 061610Z 24006KT 1 3/4SM -SN BKN016 OVC030 M17/M20 A2910 RMK AO2 P0000")
|
214
|
+
parser.remarks. should be_a Array
|
215
|
+
parser.remarks.length. should == 2
|
216
|
+
parser.remarks[0]. should == 'AO2'
|
217
|
+
parser.remarks[1]. should == 'P0000'
|
218
|
+
end
|
219
|
+
|
220
|
+
it 'remarks_defaults_to_empty_array' do
|
221
|
+
parser = setup_parser('PAIL', "2010/02/06 16:10\nPAIL 061610Z 24006KT 1 3/4SM -SN BKN016 OVC030 M17/M20 A2910")
|
222
|
+
parser.remarks. should be_a Array
|
223
|
+
parser.remarks.length. should == 0
|
224
|
+
end
|
225
|
+
|
226
|
+
def setup_parser( cccc, metar )
|
227
|
+
raw = Metar::Raw.new( cccc, metar )
|
228
|
+
Metar::Parser.new( raw )
|
229
|
+
end
|
230
|
+
|
231
|
+
end
|
232
|
+
|
233
|
+
end
|
234
|
+
|