def METHOD_NAME(
    fs,
    input_file: GTFSScheduleFeedFileHourly,
    gtfs_filename: str,
) -> GTFSScheduleParseOutcome:
    logging.info(f"Processing {input_file.path}")
    field_names = None
    try:
        with fs.open(input_file.path, newline="", mode="r", encoding="utf-8-sig") as f:
            contents = f.read()
        lines, field_names, dialect = parse_csv_str(contents)
        num_lines = len(lines)
        jsonl_content = gzip.compress(
            "\n".join(json.dumps(line) for line in lines).encode()
        )
        del lines
        jsonl_file = GTFSScheduleFeedJSONL(
            ts=input_file.ts,
            extract_config=input_file.extract_config,
            filename=gtfs_filename + ".jsonl.gz",
            gtfs_filename=gtfs_filename,
            csv_dialect=dialect,
            num_lines=num_lines,
        )
        jsonl_file.save_content(content=jsonl_content, fs=fs)
        del jsonl_content
    except Exception as e:
        logging.warn(f"Failed to process {input_file.path}: {traceback.format_exc()}")
        return GTFSScheduleParseOutcome(
            success=False,
            exception=e,
            feed_file=input_file,
            fields=field_names,
        )
    logging.info(f"Parsed {input_file.path}")
    return GTFSScheduleParseOutcome(
        success=True,
        feed_file=input_file,
        fields=field_names,
        parsed_file=jsonl_file,
    )