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 test_get_altimeter(self): """ Tests that the correct alimeter item gets removed from the end of the wx list """ # North American default units = structs.Units(**static.NA_UNITS) for wx, alt in ( (["1", "2"], (None, )), (["1", "2", "A2992"], ("2992", 29.92)), (["1", "2", "2992"], ("2992", 29.92)), (["1", "2", "A2992", "Q1000"], ("2992", 29.92)), (["1", "2", "Q1000", "A2992"], ("2992", 29.92)), (["1", "2", "Q1000"], ("1000", 1000)), ): self.assertEqual(units.altimeter, "inHg") retwx, ret_alt = _core.get_altimeter(wx, units) self.assertEqual(retwx, ["1", "2"]) self.assert_number(ret_alt, *alt) # The last one should have changed the unit self.assertEqual(units.altimeter, "hPa") # International units = structs.Units(**static.IN_UNITS) for wx, alt in ( (["1", "2"], (None, )), (["1", "2", "Q.1000"], ("1000", 1000)), (["1", "2", "Q1000/10"], ("1000", 1000)), (["1", "2", "A2992", "Q1000"], ("1000", 1000)), (["1", "2", "Q1000", "A2992"], ("1000", 1000)), (["1", "2", "A2992"], ("2992", 29.92)), ): self.assertEqual(units.altimeter, "hPa") retwx, ret_alt = _core.get_altimeter(wx, units, "IN") self.assertEqual(retwx, ["1", "2"]) self.assert_number(ret_alt, *alt) # The last one should have changed the unit self.assertEqual(units.altimeter, "inHg")
def test_get_altimeter(self): """ Tests that the correct alimeter item gets removed from the end of the wx list """ # North American default units = structs.Units(**static.NA_UNITS) for wx, alt in ( (['1', '2'], (None, )), (['1', '2', 'A2992'], ('2992', 29.92)), (['1', '2', '2992'], ('2992', 29.92)), (['1', '2', 'A2992', 'Q1000'], ('2992', 29.92)), (['1', '2', 'Q1000', 'A2992'], ('2992', 29.92)), (['1', '2', 'Q1000'], ('1000', 1000)), ): self.assertEqual(units.altimeter, 'inHg') retwx, ret_alt = _core.get_altimeter(wx, units) self.assertEqual(retwx, ['1', '2']) self.assert_number(ret_alt, *alt) # The last one should have changed the unit self.assertEqual(units.altimeter, 'hPa') # International units = structs.Units(**static.IN_UNITS) for wx, alt in ( (['1', '2'], (None, )), (['1', '2', 'Q.1000'], ('1000', 1000)), (['1', '2', 'Q1000/10'], ('1000', 1000)), (['1', '2', 'A2992', 'Q1000'], ('1000', 1000)), (['1', '2', 'Q1000', 'A2992'], ('1000', 1000)), (['1', '2', 'A2992'], ('2992', 29.92)), ): self.assertEqual(units.altimeter, 'hPa') retwx, ret_alt = _core.get_altimeter(wx, units, 'IN') self.assertEqual(retwx, ['1', '2']) self.assert_number(ret_alt, *alt) # The last one should have changed the unit self.assertEqual(units.altimeter, 'inHg')