Exemplo n.º 1
0
 def test_find_missing_taf_times(self):
     """
     Tests that missing forecast times can be interpretted by 
     """
     good_lines = [{
         'type': 'FROM',
         'start_time': '3021',
         'end_time': '3023'
     }, {
         'type': 'FROM',
         'start_time': '3023',
         'end_time': '0105'
     }, {
         'type': 'FROM',
         'start_time': '0105',
         'end_time': '0108'
     }, {
         'type': 'FROM',
         'start_time': '0108',
         'end_time': '0114'
     }]
     for line in good_lines:
         for key in ('start_time', 'end_time'):
             line[key] = _core.make_timestamp(line[key])
     bad_lines = deepcopy(good_lines)
     bad_lines[0]['start_time'] = None
     bad_lines[1]['start_time'] = None
     bad_lines[2]['end_time'] = None
     bad_lines[3]['end_time'] = None
     start, end = good_lines[0]['start_time'], good_lines[-1]['end_time']
     self.assertEqual(_core.find_missing_taf_times(bad_lines, start, end),
                      good_lines)
Exemplo n.º 2
0
def parse(station: str, report: str) -> (TafData, Units):
    """
    Returns TafData and Units dataclasses with parsed data and their associated units
    """
    if not report:
        return None, None
    valid_station(station)
    while len(report) > 3 and report[:4] in ("TAF ", "AMD ", "COR "):
        report = report[4:]
    retwx = {
        "end_time": None,
        "raw": report,
        "remarks": None,
        "start_time": None
    }
    report = _core.sanitize_report_string(report)
    _, station, time = _core.get_station_and_time(report[:20].split())
    retwx["station"] = station
    retwx["time"] = _core.make_timestamp(time)
    report = report.replace(station, "")
    if time:
        report = report.replace(time, "").strip()
    if uses_na_format(station):
        use_na = True
        units = Units(**NA_UNITS)
    else:
        use_na = False
        units = Units(**IN_UNITS)
    # Find and remove remarks
    report, retwx["remarks"] = _core.get_taf_remarks(report)
    # Split and parse each line
    lines = _core.split_taf(report)
    parsed_lines = parse_lines(lines, units, use_na)
    # Perform additional info extract and corrections
    if parsed_lines:
        parsed_lines[-1]["other"], retwx["max_temp"], retwx[
            "min_temp"] = _core.get_temp_min_and_max(parsed_lines[-1]["other"])
        if not (retwx["max_temp"] or retwx["min_temp"]):
            parsed_lines[0]["other"], retwx["max_temp"], retwx[
                "min_temp"] = _core.get_temp_min_and_max(
                    parsed_lines[0]["other"])
        # Set start and end times based on the first line
        start, end = parsed_lines[0]["start_time"], parsed_lines[0]["end_time"]
        parsed_lines[0]["end_time"] = None
        retwx["start_time"], retwx["end_time"] = start, end
        parsed_lines = _core.find_missing_taf_times(parsed_lines, start, end)
        parsed_lines = _core.get_taf_flight_rules(parsed_lines)
    # Extract Oceania-specific data
    if retwx["station"][0] == "A":
        parsed_lines[-1]["other"], retwx["alts"], retwx[
            "temps"] = _core.get_oceania_temp_and_alt(
                parsed_lines[-1]["other"])
    # Convert to dataclass
    retwx["forecast"] = [TafLineData(**line) for line in parsed_lines]
    return TafData(**retwx), units
Exemplo n.º 3
0
 def test_find_missing_taf_times(self):
     """
     Tests that missing forecast times can be interpretted by 
     """
     good_lines = [
         {
             "type": "FROM",
             "start_time": "3021",
             "end_time": "3023"
         },
         {
             "type": "FROM",
             "start_time": "3023",
             "end_time": "0105"
         },
         {
             "type": "FROM",
             "start_time": "0105",
             "end_time": "0108"
         },
         {
             "type": "FROM",
             "start_time": "0108",
             "end_time": "0114"
         },
     ]
     for line in good_lines:
         for key in ("start_time", "end_time"):
             line[key] = _core.make_timestamp(line[key])
     bad_lines = deepcopy(good_lines)
     bad_lines[0]["start_time"] = None
     bad_lines[1]["start_time"] = None
     bad_lines[2]["end_time"] = None
     bad_lines[3]["end_time"] = None
     start, end = good_lines[0]["start_time"], good_lines[-1]["end_time"]
     self.assertEqual(_core.find_missing_taf_times(bad_lines, start, end),
                      good_lines)