def parse_in(txt: str) -> (MetarData, Units): """ Parser for the International METAR variant """ units = Units(**IN_UNITS) clean = core.sanitize_report_string(txt) wxresp = {'raw': txt, 'sanitized': clean} wxdata, wxresp['remarks'] = core.get_remarks(clean) wxdata, wxresp['runway_visibility'], _ = core.sanitize_report_list(wxdata) wxdata, wxresp['station'], wxresp['time'] = core.get_station_and_time( 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_sanitize_report_string(self): """ Tests a function which fixes common mistakes while the report is a string """ line = 'KJFK 36010 ? TSFEW004SCT012FEW///CBBKN080 C A V O K A2992' fixed = 'KJFK 36010 TS FEW004 SCT012 FEW///CB BKN080 CAVOK A2992' self.assertEqual(core.sanitize_report_string(line), fixed)
def parse_in(txt: str) -> {str: object}: """ Parser for the International METAR variant """ units = copy(IN_UNITS) wxresp = {} txt = core.sanitize_report_string(txt) wxdata, wxresp['Remarks'] = core.get_remarks(txt) wxdata, wxresp['Runway-Vis-List'], _ = core.sanitize_report_list(wxdata) wxdata, wxresp['Station'], wxresp['Time'] = core.get_station_and_time( wxdata) if 'CAVOK' not in wxdata: wxdata, wxresp['Cloud-List'] = core.get_clouds(wxdata) wxdata, units, wxresp['Wind-Direction'], wxresp['Wind-Speed'], \ wxresp['Wind-Gust'], wxresp['Wind-Variable-Dir'] = core.get_wind(wxdata, units) wxdata, units, wxresp['Altimeter'] = core.get_altimeter( wxdata, units, 'IN') if 'CAVOK' in wxdata: wxresp['Visibility'] = '9999' wxresp['Cloud-List'] = [] wxdata.remove('CAVOK') else: wxdata, units, wxresp['Visibility'] = core.get_visibility( wxdata, units) wxresp['Other-List'], wxresp['Temperature'], wxresp[ 'Dewpoint'] = core.get_temp_and_dew(wxdata) wxresp['Units'] = units condition = core.get_flight_rules(wxresp['Visibility'], core.get_ceiling(wxresp['Cloud-List'])) wxresp['Flight-Rules'] = FLIGHT_RULES[condition] wxresp['Remarks-Info'] = core.parse_remarks(wxresp['Remarks']) return wxresp
def test_sanitize_report_string(self): """ Tests a function which fixes common mistakes while the report is a string """ line = 'KJFK 36010 ? TSFEW004SCT012FEW///CBBKN080 C A V O K A2992' fixed = 'KJFK 36010 TS FEW004 SCT012 FEW///CB BKN080 CAVOK A2992' self.assertEqual(core.sanitize_report_string(line), fixed)
def parse_na(report: str) -> (MetarData, Units): """ Parser for the North American METAR variant """ units = Units(**NA_UNITS) clean = core.sanitize_report_string(report) wxresp = {'raw': report, 'sanitized': clean} wxdata, wxresp['remarks'] = core.get_remarks(clean) wxdata = core.dedupe(wxdata) wxdata, wxresp['runway_visibility'], _ = core.sanitize_report_list(wxdata) wxdata, wxresp['station'], wxresp['time'] = core.get_station_and_time( 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, 'NA') 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 parse(report: str) -> PirepData: """ Returns a PirepData object based on the given report """ if not report: return None clean = core.sanitize_report_string(report) wxdata, *_ = core.sanitize_report_list(clean.split()) sanitized = ' '.join(wxdata) wxresp = { 'raw': report, 'sanitized': sanitized, 'station': None, 'remarks': None } wxdata = sanitized.split('/') wxresp.update(_root(wxdata.pop(0).strip())) for item in wxdata: if not item or len(item) < 2: continue tag = item[:2] item = item[2:].strip() if tag in _handlers: key, handler = _handlers[tag] wxresp[key] = handler(item) elif tag in _dict_handlers: wxresp.update(_dict_handlers[tag](item)) return PirepData(**wxresp)
def parse(report: str) -> AirepData: """ """ if not report: return None clean = core.sanitize_report_string(report) wxdata, *_ = core.sanitize_report_list(clean.split()) wxresp = {'raw': report, 'sanitized': ' '.join(wxdata)} print(wxdata) print(wxresp) return None
def parse(report: str) -> AirepData: """ """ if not report: return None clean = core.sanitize_report_string(report) wxdata, *_ = core.sanitize_report_list(clean.split()) wxresp = {'raw': report, 'sanitized': ' '.join(wxdata)} print(wxdata) print(wxresp) return None
def parse(report: str) -> PirepData: """ Returns a PirepData object based on the given report """ if not report: return None clean = core.sanitize_report_string(report) wxdata, *_ = core.sanitize_report_list(clean.split()) sanitized = ' '.join(wxdata) wxresp = {'raw': report, 'sanitized': sanitized, 'station': None, 'remarks': None} wxdata = sanitized.split('/') wxresp.update(_root(wxdata.pop(0).strip())) for item in wxdata: if not item or len(item) < 2: continue tag = item[:2] item = item[2:].strip() if tag in _handlers: key, handler = _handlers[tag] wxresp[key] = handler(item) elif tag in _dict_handlers: wxresp.update(_dict_handlers[tag](item)) return PirepData(**wxresp)