Beispiel #1
0
 def test_taf_line(self):
     """Tests converting TAF line data into into a single spoken string"""
     units = structs.Units(**static.core.NA_UNITS)
     line = {
         "altimeter": parse_altimeter("2992"),
         "clouds": [core.make_cloud("BKN015CB")],
         "end_time": core.make_timestamp("1206"),
         "icing": ["611005"],
         "other": [],
         "start_time": core.make_timestamp("1202"),
         "transition_start": None,
         "turbulence": ["540553"],
         "type": "FROM",
         "visibility": core.make_number("3"),
         "wind_direction": core.make_number("360"),
         "wind_gust": core.make_number("20"),
         "wind_shear": "WS020/07040KT",
         "wind_speed": core.make_number("12"),
         "wx_codes": get_wx_codes(["+RA"])[1],
     }
     line.update({
         k: None
         for k in ("flight_rules", "probability", "raw", "sanitized")
     })
     line = structs.TafLineData(**line)
     spoken = (
         "From 2 to 6 zulu, Winds three six zero at 12kt gusting to 20kt. "
         "Wind shear 2000ft from zero seven zero at 40kt. Visibility three miles. "
         "Altimeter two nine point nine two. Heavy Rain. "
         "Broken layer at 1500ft (Cumulonimbus). "
         "Occasional moderate turbulence in clouds from 5500ft to 8500ft. "
         "Light icing from 10000ft to 15000ft")
     ret = speech.taf_line(line, units)
     self.assertIsInstance(ret, str)
     self.assertEqual(ret, spoken)
Beispiel #2
0
 def test_taf(self):
     """
     Tests end-to-end TAF translation
     """
     units = structs.Units(**static.core.NA_UNITS)
     line_data = {
         "altimeter": core.make_number("29.92", "2992"),
         "clouds": [core.make_cloud("BKN015CB")],
         "icing": ["611005"],
         "other": [],
         "turbulence": ["540553"],
         "visibility": core.make_number("3"),
         "wind_direction": core.make_number("360"),
         "wind_gust": core.make_number("20"),
         "wind_shear": "WS020/07040KT",
         "wind_speed": core.make_number("12"),
         "wx_codes": get_wx_codes(["+RA"])[1],
     }
     line_data.update({
         k: ""
         for k in (
             "raw",
             "end_time",
             "start_time",
             "transition_start",
             "probability",
             "type",
             "flight_rules",
             "sanitized",
         )
     })
     data = {"max_temp": "TX20/1518Z", "min_temp": "TN00/00", "remarks": ""}
     data.update({
         k: ""
         for k in ("raw", "station", "time", "start_time", "end_time")
     })
     data = structs.TafData(forecast=[structs.TafLineData(**line_data)],
                            **data)
     line_trans = structs.TafLineTrans(
         altimeter="29.92 inHg (1013 hPa)",
         clouds="Broken layer at 1500ft (Cumulonimbus) - Reported AGL",
         icing="Light icing from 10000ft to 15000ft",
         turbulence=
         "Occasional moderate turbulence in clouds from 5500ft to 8500ft",
         visibility="3sm (4.8km)",
         wind_shear="Wind shear 2000ft from 070 at 40kt",
         wind="N-360 at 12kt gusting to 20kt",
         wx_codes="Heavy Rain",
     )
     trans = structs.TafTrans(
         forecast=[line_trans],
         max_temp="Maximum temperature of 20°C (68°F) at 15-18:00Z",
         min_temp="Minimum temperature of 0°C (32°F) at 00:00Z",
         remarks={},
     )
     translated = translate.taf.translate_taf(data, units)
     self.assertIsInstance(translated, structs.TafTrans)
     for line in translated.forecast:
         self.assertIsInstance(line, structs.TafLineTrans)
     self.assertEqual(translated, trans)
Beispiel #3
0
def _clouds(item: str) -> List[Cloud]:
    """Convert cloud element to a list of Clouds"""
    clouds = item.split()
    # BASES 004 TOPS 016
    if "BASES" in clouds and "TOPS" in clouds:
        base = clouds[clouds.index("BASES") + 1]
        top = clouds[clouds.index("TOPS") + 1]
        return [Cloud(item, base=base, top=top)]
    return [core.make_cloud(cloud) for cloud in clouds]
Beispiel #4
0
 def test_metar(self):
     """
     Tests end-to-end METAR translation
     """
     units = structs.Units(**static.core.NA_UNITS)
     data = {
         "altimeter":
         core.make_number("29.92", "2992"),
         "clouds": [core.make_cloud("BKN015CB")],
         "dewpoint":
         core.make_number("M01"),
         "other": [],
         "temperature":
         core.make_number("03"),
         "visibility":
         core.make_number("3"),
         "wind_direction":
         core.make_number("360"),
         "wind_gust":
         core.make_number("20"),
         "wind_speed":
         core.make_number("12"),
         "wind_variable_direction": [
             core.make_number("340"),
             core.make_number("020"),
         ],
         "wx_codes":
         get_wx_codes(["+RA"])[1],
     }
     data.update({
         k: ""
         for k in (
             "raw",
             "remarks",
             "station",
             "time",
             "flight_rules",
             "remarks_info",
             "runway_visibility",
             "sanitized",
         )
     })
     data = structs.MetarData(**data)
     trans = structs.MetarTrans(
         altimeter="29.92 inHg (1013 hPa)",
         clouds="Broken layer at 1500ft (Cumulonimbus) - Reported AGL",
         dewpoint="-1°C (30°F)",
         remarks={},
         temperature="3°C (37°F)",
         visibility="3sm (4.8km)",
         wind="N-360 (variable 340 to 020) at 12kt gusting to 20kt",
         wx_codes="Heavy Rain",
     )
     translated = translate.metar.translate_metar(data, units)
     self.assertIsInstance(translated, structs.MetarTrans)
     self.assertEqual(translated, trans)
Beispiel #5
0
 def test_metar(self):
     """
     Tests converting METAR data into into a single spoken string
     """
     units = structs.Units(**static.core.NA_UNITS)
     data = {
         "altimeter":
         parse_altimeter("2992"),
         "clouds": [core.make_cloud("BKN015CB")],
         "dewpoint":
         core.make_number("M01"),
         "other": [],
         "temperature":
         core.make_number("03"),
         "visibility":
         core.make_number("3"),
         "wind_direction":
         core.make_number("360"),
         "wind_gust":
         core.make_number("20"),
         "wind_speed":
         core.make_number("12"),
         "wind_variable_direction": [
             core.make_number("340"),
             core.make_number("020", speak="020"),
         ],
         "wx_codes":
         get_wx_codes(["+RA"])[1],
     }
     data.update({
         k: None
         for k in (
             "raw",
             "remarks",
             "station",
             "time",
             "flight_rules",
             "remarks_info",
             "runway_visibility",
             "sanitized",
         )
     })
     data = structs.MetarData(**data)
     spoken = (
         "Winds three six zero (variable three four zero to zero two zero) "
         "at 12kt gusting to 20kt. Visibility three miles. "
         "Temperature three degrees Celsius. Dew point minus one degree Celsius. "
         "Altimeter two nine point nine two. Heavy Rain. "
         "Broken layer at 1500ft (Cumulonimbus)")
     ret = speech.metar(data, units)
     self.assertIsInstance(ret, str)
     self.assertEqual(ret, spoken)
Beispiel #6
0
 def test_clouds(self):
     """Tests translating each cloud into a single string"""
     self.assertEqual(translate.base.clouds(None), "")
     self.assertEqual(translate.base.clouds([]), "Sky clear")
     for clouds, translation in (
         (["BKN", "FEW020"], "Few clouds at 2000ft"),
         (
             ["OVC030", "SCT100"],
             "Overcast layer at 3000ft, Scattered clouds at 10000ft",
         ),
         (["BKN015CB"], "Broken layer at 1500ft (Cumulonimbus)"),
     ):
         clouds = [core.make_cloud(cloud) for cloud in clouds]
         self.assertEqual(
             translate.base.clouds(clouds), translation + " - Reported AGL"
         )
Beispiel #7
0
 def test_shared(self):
     """Tests availability of shared values between the METAR and TAF translations"""
     units = structs.Units(**static.core.NA_UNITS)
     data = structs.SharedData(
         altimeter=core.make_number("2992"),
         clouds=[core.make_cloud("OVC060")],
         flight_rules="",
         other=[],
         sanitized="",
         visibility=core.make_number("10"),
         wind_direction=core.make_number("0"),
         wind_gust=core.make_number("0"),
         wind_speed=core.make_number("0"),
         wx_codes=get_wx_codes(["RA"])[1],
     )
     trans = translate.base.current_shared(data, units)
     self.assertIsInstance(trans, dict)
     for key in ("altimeter", "clouds", "visibility", "wx_codes"):
         self.assertIn(key, trans)
         self.assertTrue(bool(trans[key]))
Beispiel #8
0
 def test_make_cloud(self):
     """Tests helper function which returns a Cloud dataclass"""
     for cloud, out in (
         ("SCT060", ["SCT", 60, None, None]),
         ("FEWO03", ["FEW", 3, None, None]),
         ("BKNC015", ["BKN", 15, None, "C"]),
         ("OVC120TS", ["OVC", 120, None, "TS"]),
         ("VV002", ["VV", 2, None, None]),
         ("SCT", ["SCT", None, None, None]),
         ("FEW027///", ["FEW", 27, None, None]),
         ("FEW//////", ["FEW", None, None, None]),
         ("FEW///TS", ["FEW", None, None, "TS"]),
         ("OVC100-TOP110", ["OVC", 100, 110, None]),
         ("OVC065-TOPUNKN", ["OVC", 65, None, None]),
         ("SCT-BKN050-TOP100", ["SCT-BKN", 50, 100, None]),
     ):
         ret_cloud = core.make_cloud(cloud)
         self.assertIsInstance(ret_cloud, structs.Cloud)
         self.assertEqual(ret_cloud.repr, cloud)
         for i, key in enumerate(("type", "base", "top", "modifier")):
             self.assertEqual(getattr(ret_cloud, key), out[i])