metar-parser 1.2.1 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/lib/metar/data/base.rb +15 -0
  3. data/lib/metar/data/density_altitude.rb +15 -0
  4. data/lib/metar/data/direction.rb +9 -0
  5. data/lib/metar/data/distance.rb +27 -0
  6. data/lib/metar/data/lightning.rb +61 -0
  7. data/lib/metar/data/observer.rb +24 -0
  8. data/lib/metar/data/pressure.rb +23 -0
  9. data/lib/metar/data/remark.rb +98 -0
  10. data/lib/metar/data/runway_visible_range.rb +85 -0
  11. data/lib/metar/data/sky_condition.rb +61 -0
  12. data/lib/metar/data/speed.rb +22 -0
  13. data/lib/metar/data/station_code.rb +7 -0
  14. data/lib/metar/data/temperature.rb +21 -0
  15. data/lib/metar/data/temperature_and_dew_point.rb +18 -0
  16. data/lib/metar/data/time.rb +54 -0
  17. data/lib/metar/data/variable_wind.rb +25 -0
  18. data/lib/metar/data/vertical_visibility.rb +26 -0
  19. data/lib/metar/data/visibility.rb +71 -0
  20. data/lib/metar/data/visibility_remark.rb +8 -0
  21. data/lib/metar/data/weather_phenomenon.rb +86 -0
  22. data/lib/metar/data/wind.rb +82 -0
  23. data/lib/metar/data.rb +22 -636
  24. data/lib/metar/i18n.rb +6 -0
  25. data/lib/metar/parser.rb +165 -120
  26. data/lib/metar/report.rb +1 -1
  27. data/lib/metar/version.rb +2 -2
  28. data/lib/metar.rb +7 -6
  29. data/locales/de.yml +1 -0
  30. data/locales/en.yml +1 -0
  31. data/locales/it.yml +2 -1
  32. data/locales/pt-BR.yml +1 -0
  33. data/spec/data/density_altitude_spec.rb +12 -0
  34. data/spec/{distance_spec.rb → data/distance_spec.rb} +1 -1
  35. data/spec/data/lightning_spec.rb +49 -0
  36. data/spec/data/pressure_spec.rb +22 -0
  37. data/spec/data/remark_spec.rb +99 -0
  38. data/spec/data/runway_visible_range_spec.rb +92 -0
  39. data/spec/{sky_condition_spec.rb → data/sky_condition_spec.rb} +10 -6
  40. data/spec/data/speed_spec.rb +45 -0
  41. data/spec/data/temperature_spec.rb +36 -0
  42. data/spec/{variable_wind_spec.rb → data/variable_wind_spec.rb} +6 -6
  43. data/spec/{vertical_visibility_spec.rb → data/vertical_visibility_spec.rb} +2 -2
  44. data/spec/{data_spec.rb → data/visibility_remark_spec.rb} +1 -11
  45. data/spec/{visibility_spec.rb → data/visibility_spec.rb} +9 -7
  46. data/spec/{weather_phenomenon_spec.rb → data/weather_phenomenon_spec.rb} +7 -3
  47. data/spec/{wind_spec.rb → data/wind_spec.rb} +10 -7
  48. data/spec/parser_spec.rb +107 -13
  49. data/spec/report_spec.rb +12 -1
  50. data/spec/spec_helper.rb +1 -1
  51. data/spec/station_spec.rb +2 -1
  52. metadata +56 -31
  53. data/spec/pressure_spec.rb +0 -22
  54. data/spec/remark_spec.rb +0 -147
  55. data/spec/runway_visible_range_spec.rb +0 -81
  56. data/spec/speed_spec.rb +0 -45
  57. data/spec/temperature_spec.rb +0 -36
data/spec/parser_spec.rb CHANGED
@@ -12,7 +12,7 @@ describe Metar::Parser do
12
12
  let(:station) { double(Metar::Station) }
13
13
  let(:raw) { double(Metar::Raw::Noaa, metar: metar, time: time) }
14
14
  let(:metar) { "XXXX 061610Z 24006KT 1 3/4SM -SN BKN016 OVC030 M17/M20 A2910 RMK AO2 P0000" }
15
- let(:time) { '2010/02/06 16:10' }
15
+ let(:time) { Time.gm(2010, 02, 06) }
16
16
 
17
17
  before do
18
18
  allow(Metar::Station).to receive(:new) { station }
@@ -98,37 +98,37 @@ describe Metar::Parser do
98
98
  it 'real' do
99
99
  parser = setup_parser("PAIL 061610Z 24006KT 1 3/4SM -SN BKN016 OVC030 M17/M20 A2910 RMK AO2 P0000")
100
100
 
101
- expect(parser.observer).to eq(:real)
101
+ expect(parser.observer.value).to eq(:real)
102
102
  end
103
103
 
104
104
  it 'auto' do
105
105
  parser = setup_parser("CYXS 151034Z AUTO 09003KT 1/8SM FZFG VV001 M03/M03 A3019 RMK SLP263 ICG")
106
106
 
107
- expect(parser.observer).to eq(:auto)
107
+ expect(parser.observer.value).to eq(:auto)
108
108
  end
109
109
 
110
110
  it 'corrected' do
111
111
  parser = setup_parser("PAIL 061610Z COR 24006KT 1 3/4SM -SN BKN016 OVC030 M17/M20 A2910 RMK AO2 P0000")
112
112
 
113
- expect(parser.observer).to eq(:corrected)
113
+ expect(parser.observer.value).to eq(:corrected)
114
114
  end
115
115
 
116
116
  it 'corrected (Canadian, first correction)' do
117
117
  parser = setup_parser('CYZU 310100Z CCA 26004KT 15SM FEW009 BKN040TCU BKN100 OVC210 15/12 A2996 RETS RMK SF1TCU4AC2CI1 SLP149')
118
118
 
119
- expect(parser.observer).to eq(:corrected)
119
+ expect(parser.observer.value).to eq(:corrected)
120
120
  end
121
121
 
122
122
  it 'corrected (Canadian, second correction)' do
123
123
  parser = setup_parser('CYCX 052000Z CCB 30014G27KT 15SM DRSN SCT035 M02/M09 A2992 RMK SC4 SLP133')
124
124
 
125
- expect(parser.observer).to eq(:corrected)
125
+ expect(parser.observer.value).to eq(:corrected)
126
126
  end
127
127
 
128
128
  it 'corrected (Canadian, rare third correction)' do
129
129
  parser = setup_parser('CYEG 120000Z CCC 12005KT 15SM FEW110 BKN190 03/M01 A2980 RMK AC2AC3 SLP122')
130
130
 
131
- expect(parser.observer).to eq(:corrected)
131
+ expect(parser.observer.value).to eq(:corrected)
132
132
  end
133
133
  end
134
134
 
@@ -260,7 +260,7 @@ describe Metar::Parser do
260
260
 
261
261
  it 'sea_level_pressure' do
262
262
  parser = setup_parser("PAIL 061610Z 24006KT 1 3/4SM -SN BKN016 OVC030 M17/M20 A2910 RMK AO2 P0000")
263
- expect(parser.sea_level_pressure.to_inches_of_mercury).to eq(29.10)
263
+ expect(parser.sea_level_pressure.pressure.to_inches_of_mercury).to eq(29.10)
264
264
  end
265
265
 
266
266
  it 'recent weather' do
@@ -290,7 +290,7 @@ describe Metar::Parser do
290
290
  it 'parses sea level pressure' do
291
291
  parser = setup_parser('CYZT 052200Z 31010KT 20SM SKC 17/12 A3005 RMK SLP174 20046')
292
292
 
293
- expect(parser.remarks[0]).to be_a(Metar::SeaLevelPressure)
293
+ expect(parser.remarks[0]).to be_a(Metar::Data::SeaLevelPressure)
294
294
  end
295
295
 
296
296
  it 'parses extreme temperature' do
@@ -302,7 +302,7 @@ describe Metar::Parser do
302
302
  it 'parses density altitude' do
303
303
  parser = setup_parser('CYBW 010000Z AUTO VRB04KT 9SM SCT070 13/M01 A3028 RMK DENSITY ALT 4100FT=')
304
304
 
305
- expect(parser.remarks[0]).to be_a(Metar::DensityAltitude)
305
+ expect(parser.remarks[0]).to be_a(Metar::Data::DensityAltitude)
306
306
  expect(parser.remarks[0].height.value).to be_within(0.001).of(1249.68)
307
307
  end
308
308
  end
@@ -328,11 +328,105 @@ describe Metar::Parser do
328
328
  end
329
329
  end
330
330
  end
331
+ end
332
+
333
+ context "#raw_attributes" do
334
+ let(:parts) { [station_code, datetime] }
335
+ let(:metar) { parts.join(" ") }
336
+ let(:station_code) { "PAIL" }
337
+ let(:datetime) { "061610Z" }
338
+ let(:observer) { "COR" }
339
+ let(:wind) { "24006KT" }
340
+ let(:variable_wind) { "350V050" }
341
+ let(:visibility) { "1 3/4SM" }
342
+ let(:minimum_visibility) { "3/4SM" }
343
+ let(:runway_visible_range) { "R12/1000N R30/1500N" }
344
+ let(:present_weather) { "-SN" }
345
+ let(:sky_conditions) { "BKN016 OVC030" }
346
+ let(:vertical_visibility) { "VV001" }
347
+ let(:temperature_and_dew_point) { "33/22" }
348
+ let(:sea_level_pressure) { "A2910" }
349
+ let(:recent_weather) { "RETS" }
350
+ let(:remarks) { "RMK AO2 P0000" }
351
+ let(:result) { subject.raw_attributes }
352
+
353
+ subject { setup_parser(metar) }
354
+
355
+ it "returns a Hash" do
356
+ expect(subject.raw_attributes).to be_a(Hash)
357
+ end
358
+
359
+ [
360
+ [:metar, "is the raw METAR string"],
361
+ [:station_code, "the station code"],
362
+ [:datetime, "the date/time string"],
363
+ ].each do |attr, description|
364
+ context "#{attr}" do
365
+ specify ":#{attr} is #{description}" do
366
+ expect(result).to include(attr)
367
+ expect(result[attr]).to eq(self.send(attr))
368
+ end
369
+ end
370
+ end
371
+
372
+ [
373
+ [:observer, "an observer"],
374
+ [:wind, "wind"],
375
+ [:variable_wind, "variable wind"],
376
+ [:visibility, "visibility"],
377
+ [:runway_visible_range, "runway visible range"],
378
+ [:present_weather, "present weather"],
379
+ [:sky_conditions, "sky conditions"] ,
380
+ [:vertical_visibility, "vertical visibility"],
381
+ [:temperature_and_dew_point, "temperature and dew point"],
382
+ [:sea_level_pressure, "sea-level pressure"],
383
+ [:recent_weather, "recent weather"],
384
+ ].each do |attr, name|
385
+ context "with #{name}" do
386
+ let(:parts) { super() + [send(attr)] }
387
+
388
+ specify ":#{attr} is set" do
389
+ expect(result).to include(attr)
390
+ expect(result[attr]).to eq(send(attr))
391
+ end
392
+ end
393
+ end
331
394
 
332
- def setup_parser(metar)
333
- raw = Metar::Raw::Data.new(metar, Time.now)
334
- Metar::Parser.new(raw)
395
+ context "with wind and minimum visibility" do
396
+ let(:parts) { super() + [visibility, minimum_visibility] }
397
+
398
+ specify ":minimum_visibility is set" do
399
+ expect(result).to include(:minimum_visibility)
400
+ expect(result[:minimum_visibility]).to eq(minimum_visibility)
401
+ end
335
402
  end
403
+
404
+ context "with CAVOK" do
405
+ let(:parts) { super() + ["CAVOK"] }
406
+
407
+ specify ":cavok is set" do
408
+ expect(result).to include(:cavok)
409
+ expect(result[:cavok]).to eq("CAVOK")
410
+ end
411
+
412
+ %i(
413
+ visibility
414
+ minimum_visibility
415
+ runway_visible_range
416
+ present_weather
417
+ sky_conditions
418
+ ).each do |attr|
419
+ specify "#{attr} is not set" do
420
+ puts "attr: #{attr}"
421
+ expect(result).to_not include(attr)
422
+ end
423
+ end
424
+ end
425
+ end
426
+
427
+ def setup_parser(metar)
428
+ raw = Metar::Raw::Data.new(metar, Time.now)
429
+ Metar::Parser.new(raw)
336
430
  end
337
431
  end
338
432
 
data/spec/report_spec.rb CHANGED
@@ -83,7 +83,6 @@ describe Metar::Report do
83
83
  :vertical_visibility,
84
84
  :temperature,
85
85
  :dew_point,
86
- :sea_level_pressure,
87
86
  ].each do |attribute|
88
87
  example attribute do
89
88
  allow(parser).to receive(attribute) { attribute.to_s }
@@ -92,6 +91,18 @@ describe Metar::Report do
92
91
  end
93
92
  end
94
93
 
94
+ context "sea_level_pressure" do
95
+ let(:sea_level_pressure) do
96
+ double(Metar::Data::SeaLevelPressure, value: "slp")
97
+ end
98
+
99
+ it "returns the summary" do
100
+ allow(parser).to receive(:sea_level_pressure) { sea_level_pressure }
101
+
102
+ expect(subject.sea_level_pressure).to eq("slp")
103
+ end
104
+ end
105
+
95
106
  context "#sky_summary" do
96
107
  let(:conditions1) { double(to_summary: "skies1") }
97
108
 
data/spec/spec_helper.rb CHANGED
@@ -13,7 +13,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../lib/metar')
13
13
 
14
14
  RSpec::Matchers.define :be_temperature_extreme do |extreme, value|
15
15
  match do |remark|
16
- if not remark.is_a?(Metar::TemperatureExtreme)
16
+ if not remark.is_a?(Metar::Data::TemperatureExtreme)
17
17
  false
18
18
  elsif remark.extreme != extreme
19
19
  false
data/spec/station_spec.rb CHANGED
@@ -185,7 +185,8 @@ describe Metar::Station do
185
185
  let(:metar) do
186
186
  "PAIL 061610Z 24006KT 1 3/4SM -SN BKN016 OVC030 M17/M20 A2910"
187
187
  end
188
- let(:raw) { double(Metar::Raw, metar: metar, time: "2010/02/06 16:10") }
188
+ let(:time) { Date.new(2010, 02, 06) }
189
+ let(:raw) { double(Metar::Raw, metar: metar, time: time) }
189
190
 
190
191
  before do
191
192
  # TODO: hack - once parser returns station this can be removed
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: metar-parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joe Yates
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-05-01 00:00:00.000000000 Z
11
+ date: 2016-10-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -166,6 +166,28 @@ files:
166
166
  - Rakefile
167
167
  - lib/metar.rb
168
168
  - lib/metar/data.rb
169
+ - lib/metar/data/base.rb
170
+ - lib/metar/data/density_altitude.rb
171
+ - lib/metar/data/direction.rb
172
+ - lib/metar/data/distance.rb
173
+ - lib/metar/data/lightning.rb
174
+ - lib/metar/data/observer.rb
175
+ - lib/metar/data/pressure.rb
176
+ - lib/metar/data/remark.rb
177
+ - lib/metar/data/runway_visible_range.rb
178
+ - lib/metar/data/sky_condition.rb
179
+ - lib/metar/data/speed.rb
180
+ - lib/metar/data/station_code.rb
181
+ - lib/metar/data/temperature.rb
182
+ - lib/metar/data/temperature_and_dew_point.rb
183
+ - lib/metar/data/time.rb
184
+ - lib/metar/data/variable_wind.rb
185
+ - lib/metar/data/vertical_visibility.rb
186
+ - lib/metar/data/visibility.rb
187
+ - lib/metar/data/visibility_remark.rb
188
+ - lib/metar/data/weather_phenomenon.rb
189
+ - lib/metar/data/wind.rb
190
+ - lib/metar/i18n.rb
169
191
  - lib/metar/parser.rb
170
192
  - lib/metar/raw.rb
171
193
  - lib/metar/report.rb
@@ -175,26 +197,28 @@ files:
175
197
  - locales/en.yml
176
198
  - locales/it.yml
177
199
  - locales/pt-BR.yml
178
- - spec/data_spec.rb
179
- - spec/distance_spec.rb
200
+ - spec/data/density_altitude_spec.rb
201
+ - spec/data/distance_spec.rb
202
+ - spec/data/lightning_spec.rb
203
+ - spec/data/pressure_spec.rb
204
+ - spec/data/remark_spec.rb
205
+ - spec/data/runway_visible_range_spec.rb
206
+ - spec/data/sky_condition_spec.rb
207
+ - spec/data/speed_spec.rb
208
+ - spec/data/temperature_spec.rb
209
+ - spec/data/variable_wind_spec.rb
210
+ - spec/data/vertical_visibility_spec.rb
211
+ - spec/data/visibility_remark_spec.rb
212
+ - spec/data/visibility_spec.rb
213
+ - spec/data/weather_phenomenon_spec.rb
214
+ - spec/data/wind_spec.rb
180
215
  - spec/i18n_spec.rb
181
216
  - spec/parser_spec.rb
182
- - spec/pressure_spec.rb
183
217
  - spec/raw_spec.rb
184
- - spec/remark_spec.rb
185
218
  - spec/report_spec.rb
186
- - spec/runway_visible_range_spec.rb
187
- - spec/sky_condition_spec.rb
188
219
  - spec/spec_helper.rb
189
- - spec/speed_spec.rb
190
220
  - spec/station_spec.rb
191
- - spec/temperature_spec.rb
192
- - spec/variable_wind_spec.rb
193
- - spec/vertical_visibility_spec.rb
194
- - spec/visibility_spec.rb
195
- - spec/weather_phenomenon_spec.rb
196
- - spec/wind_spec.rb
197
- homepage: http://github.com/joeyates/metar-parser
221
+ homepage: https://github.com/joeyates/metar-parser
198
222
  licenses: []
199
223
  metadata: {}
200
224
  post_install_message:
@@ -205,7 +229,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
205
229
  requirements:
206
230
  - - ">="
207
231
  - !ruby/object:Gem::Version
208
- version: 1.9.3
232
+ version: 2.1.0
209
233
  required_rubygems_version: !ruby/object:Gem::Requirement
210
234
  requirements:
211
235
  - - ">="
@@ -218,22 +242,23 @@ signing_key:
218
242
  specification_version: 4
219
243
  summary: A Ruby gem for worldwide weather reports
220
244
  test_files:
221
- - spec/runway_visible_range_spec.rb
222
- - spec/weather_phenomenon_spec.rb
223
- - spec/temperature_spec.rb
224
245
  - spec/i18n_spec.rb
225
- - spec/pressure_spec.rb
226
- - spec/remark_spec.rb
227
- - spec/speed_spec.rb
228
- - spec/vertical_visibility_spec.rb
229
246
  - spec/parser_spec.rb
230
- - spec/visibility_spec.rb
231
- - spec/data_spec.rb
247
+ - spec/data/runway_visible_range_spec.rb
248
+ - spec/data/weather_phenomenon_spec.rb
249
+ - spec/data/temperature_spec.rb
250
+ - spec/data/pressure_spec.rb
251
+ - spec/data/remark_spec.rb
252
+ - spec/data/speed_spec.rb
253
+ - spec/data/vertical_visibility_spec.rb
254
+ - spec/data/visibility_remark_spec.rb
255
+ - spec/data/visibility_spec.rb
256
+ - spec/data/distance_spec.rb
257
+ - spec/data/wind_spec.rb
258
+ - spec/data/lightning_spec.rb
259
+ - spec/data/sky_condition_spec.rb
260
+ - spec/data/density_altitude_spec.rb
261
+ - spec/data/variable_wind_spec.rb
232
262
  - spec/report_spec.rb
233
263
  - spec/raw_spec.rb
234
- - spec/distance_spec.rb
235
- - spec/wind_spec.rb
236
- - spec/sky_condition_spec.rb
237
264
  - spec/station_spec.rb
238
- - spec/variable_wind_spec.rb
239
- has_rdoc:
@@ -1,22 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Metar::Pressure do
4
- context '.parse' do
5
- it 'interprets the Q prefix as hectopascals' do
6
- expect(Metar::Pressure.parse('Q1300').value).to be_within(0.01).of(1.3)
7
- end
8
-
9
- it 'interprets the A prefix as inches of mercury' do
10
- expect(Metar::Pressure.parse('A1234').value).to be_within(0.01).of(0.42)
11
- end
12
-
13
- it 'require 4 digits' do
14
- expect(Metar::Pressure.parse('Q12345')).to be_nil
15
- expect(Metar::Pressure.parse('A123')).to be_nil
16
- end
17
-
18
- it 'returns nil for nil' do
19
- expect(Metar::Pressure.parse(nil)).to be_nil
20
- end
21
- end
22
- end
data/spec/remark_spec.rb DELETED
@@ -1,147 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Metar::Remark do
4
- context '.parse' do
5
- it 'delegate to subclasses' do
6
- expect(Metar::Remark.parse('21012')).to be_a(Metar::TemperatureExtreme)
7
- end
8
-
9
- it 'returns nil for unrecognised' do
10
- expect(Metar::Remark.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(Metar::Remark.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 = Metar::Remark.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 = Metar::Remark.parse('58033')
38
-
39
- expect(pt).to be_a(Metar::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 = Metar::Remark.parse('60009')
48
-
49
- expect(pr).to be_a(Metar::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 = Metar::Remark.parse('70015')
58
-
59
- expect(pr).to be_a(Metar::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::AutomatedStationType, :with_precipitation_discriminator]],
69
- ['without precipitation dicriminator', 'AO2', [Metar::AutomatedStationType, :without_precipitation_discriminator]],
70
- ].each do |docstring, raw, expected|
71
- example docstring do
72
- aut = Metar::Remark.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 = Metar::Remark.parse('SLP125')
83
-
84
- expect(slp).to be_a(Metar::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 = Metar::Remark.parse('T00641036')
92
-
93
- expect(htm).to be_a(Metar::HourlyTemperaturAndDewPoint)
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
100
-
101
- describe Metar::Lightning do
102
- context '.parse_chunks' do
103
- [
104
- ['direction', 'LTG SE', [:default, nil, ['SE']]],
105
- ['distance direction', 'LTG DSNT SE', [:default, 16093.44, ['SE']]],
106
- ['distance direction and direction', 'LTG DSNT NE AND W', [:default, 16093.44, ['NE', 'W']]],
107
- ['distance direction-direction', 'LTG DSNT SE-SW', [:default, 16093.44, ['SE', 'SW']]],
108
- ['distance all quandrants', 'LTG DSNT ALQDS', [:default, 16093.44, ['N', 'E', 'S', 'W']]],
109
- ].each do |docstring, section, expected|
110
- example docstring do
111
- chunks = section.split(' ')
112
- r = Metar::Lightning.parse_chunks(chunks)
113
-
114
- expect(r).to be_a(Metar::Lightning)
115
- expect(r.type).to eq(expected[0])
116
- if expected[1]
117
- expect(r.distance.value).to eq(expected[1])
118
- else
119
- expect(r.distance).to be_nil
120
- end
121
- expect(r.directions).to eq(expected[2])
122
- end
123
- end
124
-
125
- it 'removes parsed chunks' do
126
- chunks = ['LTG', 'DSNT', 'SE', 'FOO']
127
-
128
- r = Metar::Lightning.parse_chunks(chunks)
129
-
130
- expect(chunks).to eq(['FOO'])
131
- end
132
-
133
- it 'fails if the first chunk is not LTGnnn' do
134
- expect do
135
- Metar::Lightning.parse_chunks(['FOO'])
136
- end.to raise_error(RuntimeError, /not lightning/)
137
- end
138
-
139
- it "doesn't not fail if all chunks are parsed" do
140
- chunks = ['LTG', 'DSNT', 'SE']
141
-
142
- r = Metar::Lightning.parse_chunks(chunks)
143
-
144
- expect(chunks).to eq([])
145
- end
146
- end
147
- end
@@ -1,81 +0,0 @@
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::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/3400V1800FT', ['12', [1036.32, nil, nil], [548.64, nil, nil], nil]],
42
- ['returns nil for nil', nil, [nil, nil, nil, nil]],
43
- ].each do |docstring, raw, expected|
44
- example docstring do
45
- expect(Metar::RunwayVisibleRange.parse(raw)).to be_runway_visible_range(*expected)
46
- end
47
- end
48
- end
49
-
50
- context '#to_s' do
51
- before :all do
52
- @locale = I18n.locale
53
- I18n.locale = :it
54
- end
55
-
56
- after :all do
57
- I18n.locale = @locale
58
- end
59
-
60
- [
61
- ['v1', :en, [[3400.00, nil, nil], nil, nil], 'runway 14: 3400m'],
62
- ['v1 and v2', :en, [[3400.00, nil, nil], [1900.00, nil, nil], nil ], 'runway 14: from 3400m to 1900m'],
63
- ['v1 and tendency', :en, [[3400.00, nil, nil], nil, :improving ], 'runway 14: 3400m improving'],
64
- ].each do |docstring, locale, (visibility1, visibility2, tendency), expected|
65
- d1 = Metar::Distance.new(visibility1[0])
66
- v1 = Metar::Visibility.new(d1, visibility1[1], visibility1[2])
67
- v2 =
68
- if ! visibility2.nil?
69
- d2 = Metar::Distance.new(visibility2[0])
70
- Metar::Visibility.new(d2, visibility2[1], visibility2[2])
71
- else
72
- nil
73
- end
74
-
75
- example docstring + " (#{locale})" do
76
- I18n.locale = locale
77
- expect(Metar::RunwayVisibleRange.new('14', v1, v2, tendency).to_s).to eq(expected)
78
- end
79
- end
80
- end
81
- end
data/spec/speed_spec.rb DELETED
@@ -1,45 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Metar::Speed do
4
- context '.parse' do
5
- it 'returns nil for nil' do
6
- speed = Metar::Speed.parse(nil)
7
-
8
- expect(speed).to be_nil
9
- end
10
-
11
- it 'parses knots' do
12
- speed = Metar::Speed.parse('5KT')
13
-
14
- expect(speed).to be_a(Metar::Speed)
15
- expect(speed.value).to be_within(0.01).of(2.57)
16
- end
17
-
18
- it 'parses meters per second' do
19
- speed = Metar::Speed.parse('7MPS')
20
-
21
- expect(speed).to be_a(Metar::Speed)
22
- expect(speed.value).to be_within(0.01).of(7.00)
23
- end
24
-
25
- it 'parses kilometers per hour' do
26
- speed = Metar::Speed.parse('14KMH')
27
-
28
- expect(speed).to be_a(Metar::Speed)
29
- expect(speed.value).to be_within(0.01).of(3.89)
30
- end
31
-
32
- it 'trates straight numbers as kilomters per hour' do
33
- speed = Metar::Speed.parse('14')
34
-
35
- expect(speed).to be_a(Metar::Speed)
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 = Metar::Speed.parse('')
41
-
42
- expect(speed).to be_nil
43
- end
44
- end
45
- end