Example #1
0
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
Example #2
0
 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")
Example #3
0
 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')