def parse_in_line(line: str, units: Units) -> {str: str}: """ Parser for the International TAF forcast variant """ wxdata = _core.dedupe(line.split()) wxdata = _core.sanitize_report_list(wxdata) retwx = {"sanitized": " ".join(wxdata)} ( wxdata, retwx["type"], retwx["start_time"], retwx["end_time"], ) = _core.get_type_and_times(wxdata) wxdata, retwx["wind_shear"] = _core.get_wind_shear(wxdata) ( wxdata, retwx["wind_direction"], retwx["wind_speed"], retwx["wind_gust"], _, ) = _core.get_wind(wxdata, units) if "CAVOK" in wxdata: retwx["visibility"] = _core.make_number("CAVOK") retwx["clouds"] = [] wxdata.pop(wxdata.index("CAVOK")) else: wxdata, retwx["visibility"] = _core.get_visibility(wxdata, units) wxdata, retwx["clouds"] = _core.get_clouds(wxdata) ( retwx["other"], retwx["altimeter"], retwx["icing"], retwx["turbulence"], ) = _core.get_taf_alt_ice_turb(wxdata) return retwx
def parse_na_line(line: str, units: Units) -> {str: str}: """ Parser for the North American TAF forcast variant """ wxdata = _core.dedupe(line.split()) wxdata = _core.sanitize_report_list(wxdata) retwx = {"sanitized": " ".join(wxdata)} ( wxdata, retwx["type"], retwx["start_time"], retwx["end_time"], ) = _core.get_type_and_times(wxdata) wxdata, retwx["wind_shear"] = _core.get_wind_shear(wxdata) ( wxdata, retwx["wind_direction"], retwx["wind_speed"], retwx["wind_gust"], _, ) = _core.get_wind(wxdata, units) wxdata, retwx["visibility"] = _core.get_visibility(wxdata, units) wxdata, retwx["clouds"] = _core.get_clouds(wxdata) ( retwx["other"], retwx["altimeter"], retwx["icing"], retwx["turbulence"], ) = _core.get_taf_alt_ice_turb(wxdata) return retwx
def parse_in(report: str) -> (MetarData, Units): """ Parser for the International METAR variant """ units = Units(**IN_UNITS) wxresp = {"raw": report} clean = _core.sanitize_report_string(report) wxdata, wxresp["remarks"] = _core.get_remarks(clean) wxdata = _core.dedupe(wxdata) wxdata = _core.sanitize_report_list(wxdata) wxresp["sanitized"] = " ".join(wxdata + [wxresp["remarks"]]) wxdata, wxresp["station"], wxresp["time"] = _core.get_station_and_time(wxdata) wxdata, wxresp["runway_visibility"] = _core.get_runway_visibility(wxdata) if "CAVOK" not in wxdata: wxdata, wxresp["clouds"] = _core.get_clouds(wxdata) wxdata, wxresp["wind_direction"], wxresp["wind_speed"], wxresp["wind_gust"], wxresp[ "wind_variable_direction" ] = _core.get_wind(wxdata, units) wxdata, wxresp["altimeter"] = _core.get_altimeter(wxdata, units, "IN") if "CAVOK" in wxdata: wxresp["visibility"] = _core.make_number("CAVOK") wxresp["clouds"] = [] wxdata.remove("CAVOK") else: wxdata, wxresp["visibility"] = _core.get_visibility(wxdata, units) wxresp["other"], wxresp["temperature"], wxresp["dewpoint"] = _core.get_temp_and_dew( wxdata ) condition = _core.get_flight_rules( wxresp["visibility"], _core.get_ceiling(wxresp["clouds"]) ) wxresp["flight_rules"] = FLIGHT_RULES[condition] wxresp["remarks_info"] = remarks.parse(wxresp["remarks"]) wxresp["time"] = _core.make_timestamp(wxresp["time"]) return MetarData(**wxresp), units
def _wx(item: str) -> dict: """ Parses remaining weather elements """ ret = {"wx": []} items = item.split() for item in items: if len(item) > 2 and item.startswith("FV"): _, ret["flight_visibility"] = _core.get_visibility([item[2:]], _units) else: ret["wx"].append(item) return ret
def test_get_visibility(self): """ Tests that the visibility item(s) gets removed and cleaned """ for wx, unit, visibility in ( (["1"], "sm", (None, )), (["05SM", "1"], "sm", ("5", 5)), (["10SM", "1"], "sm", ("10", 10)), (["P6SM", "1"], "sm", ("P6", )), (["M1/4SM", "1"], "sm", ("M1/4", )), (["1/2SM", "1"], "sm", ("1/2", 0.5)), (["2", "1/2SM", "1"], "sm", ("5/2", 2.5)), (["1000", "1"], "m", ("1000", 1000)), (["1000E", "1"], "m", ("1000", 1000)), (["1000NDV", "1"], "m", ("1000", 1000)), (["M1000", "1"], "m", ("1000", 1000)), (["2KM", "1"], "m", ("2000", 2000)), ): units = structs.Units(**static.NA_UNITS) wx, vis = _core.get_visibility(wx, units) self.assertEqual(wx, ["1"]) self.assert_number(vis, *visibility) self.assertEqual(units.visibility, unit)
def test_get_visibility(self): """ Tests that the visibility item(s) gets removed and cleaned """ for wx, unit, visibility in ( (['1'], 'sm', (None, )), (['05SM', '1'], 'sm', ('5', 5)), (['10SM', '1'], 'sm', ('10', 10)), (['P6SM', '1'], 'sm', ('P6', )), (['M1/4SM', '1'], 'sm', ('M1/4', )), (['1/2SM', '1'], 'sm', ('1/2', 0.5)), (['2', '1/2SM', '1'], 'sm', ('5/2', 2.5)), (['1000', '1'], 'm', ('1000', 1000)), (['1000E', '1'], 'm', ('1000', 1000)), (['1000NDV', '1'], 'm', ('1000', 1000)), (['M1000', '1'], 'm', ('1000', 1000)), (['2KM', '1'], 'm', ('2000', 2000)), ): units = structs.Units(**static.NA_UNITS) wx, vis = _core.get_visibility(wx, units) self.assertEqual(wx, ['1']) self.assert_number(vis, *visibility) self.assertEqual(units.visibility, unit)