Beispiel #1
0
    def test_aat_from_file(self):
        """
        Test if aat is correctly recognised and waypoint are correct
        file from: https://www.strepla.de/scs/Public/scoreDay.aspx?cId=451&idDay=7912, competitor 1 CX
        """

        file_path = os.path.join(os.path.dirname(__file__), '..', 'igc_files',
                                 'aat_strepla.igc')

        with open(file_path, 'r', encoding='utf-8') as f:
            parsed_igc_file = Reader().read(f)

        trace_errors, trace = parsed_igc_file['fix_records']

        self.assertEqual(len(trace_errors), 0)

        task, _, _ = get_info_from_comment_lines(parsed_igc_file)

        self.assertIsInstance(task, AAT)
        self.assertEqual(task.t_min, datetime.timedelta(hours=2, minutes=30))

        expected_waypoints = [
            ('AP3 Muellhalde', None),
            ('Loreley', 20000),
            ('Kusel', 40000),
            ('Loreley', 20000),
            ('ZP Anspach/Taunus', None),
        ]

        self.assertEqual(len(task.waypoints), len(expected_waypoints))

        for i, waypoint in enumerate(task.waypoints):
            expected_name, expected_r_max = expected_waypoints[i]
            self.assertEqual(waypoint.name, expected_name)
            if 0 < i < len(expected_waypoints) - 1:
                self.assertEqual(waypoint.r_max, expected_r_max)

        competitor = Competitor(trace, 'CX', 'Discus2b', 1, 'Karsten Leucker')
        competitor.analyse(task, 'pysoar')

        time_diff = seconds_time_difference(competitor.trip.refined_start_time,
                                            datetime.time(13, 22, 40))
        dist_diff = sum(competitor.trip.distances) - 283500
        self.assertLessEqual(abs(time_diff), 1)
        self.assertEqual(len(competitor.trip.fixes), len(expected_waypoints))
        self.assertLessEqual(abs(dist_diff), 1000)
Beispiel #2
0
    def generate_competition_day(self, target_directory: str, download_progress=None, start_time_buffer: int=0,
                                 include_hc_competitors: bool = True) -> CompetitionDay:

        # get info from website
        competition_name, date, plane_class = self._get_competition_day_info()
        competitors_info = self._get_competitors_info(include_hc_competitors)

        self.set_igc_directory(target_directory, competition_name, plane_class, date)

        competitors = list()
        tasks = list()
        files_downloaded = 0
        for competitor_info in competitors_info:
            competition_id = competitor_info['competition_id']
            igc_url = competitor_info['igc_url']
            ranking = competitor_info['ranking']

            # download files. skip if not valid
            try:
                file_path = self.download_flight(igc_url, competition_id)
            except URLError:
                print('{} is skipped because of invalid URL'.format(competition_id))
                continue

            files_downloaded += 1
            if download_progress is not None:
                download_progress(files_downloaded, len(competitors_info))

            try:
                try:  # try utf-8
                    with open(file_path, 'r', encoding='utf-8') as f:
                        parsed_igc_file = Reader().read(f)
                except UnicodeDecodeError:  # if not utf-8 use latin1
                    with open(file_path, 'r', encoding='latin1') as f:
                        parsed_igc_file = Reader().read(f)
            except Exception:
                print('{} is skipped because the file could not be parsed'.format(competition_id))
                continue

            trace_errors, trace = parsed_igc_file['fix_records']
            if len(trace_errors) != 0:
                print('{} is skipped because of invalid trace'.format(competition_id))
                continue

            # get info from file
            task, contest_information, competitor_information = get_info_from_comment_lines(parsed_igc_file, start_time_buffer)
            plane_model = competitor_information.get('plane_model', None)
            pilot_name = competitor_information.get('pilot_name', None)

            competitor = Competitor(trace, competition_id, plane_model, ranking, pilot_name)

            competitors.append(competitor)
            tasks.append(task)

        # Select task from tasks list
        task = self._select_task(tasks)

        return CompetitionDay(competition_name, date, plane_class, competitors, task)
Beispiel #3
0
    def generate_competition_day(self, target_directory: str, download_progress=None, start_time_buffer: int=0)\
            -> CompetitionDay:
        """

        :param target_directory: see super
        :param download_progress: see super
        :param start_time_buffer: see super
        :return:
        """

        # get info from website
        competition_name, date, plane_class = self._get_competition_day_info()
        table_info = self._get_table_info()

        self.set_igc_directory(target_directory, competition_name, plane_class,
                               date)

        competitors = list()
        tasks = list()
        files_downloaded = 0
        for table_entry in table_info:
            competition_id = table_entry['competition_id']
            igc_url = table_entry['igc_url']
            plane_model = table_entry['ranking']
            ranking = table_entry['plane_model']

            # download files
            file_path = self.download_flight(igc_url, competition_id)

            files_downloaded += 1
            if download_progress is not None:
                download_progress(files_downloaded, len(table_info))

            with open(file_path, 'r', encoding='utf-8') as f:
                parsed_igc_file = Reader().read(f)

            trace_errors, trace = parsed_igc_file['fix_records']

            # get info from file
            task, task_info, competitor_information = get_info_from_comment_lines(
                parsed_igc_file, start_time_buffer)
            pilot_name = competitor_information.get('pilot_name', None)

            competitor = Competitor(trace, competition_id, plane_model,
                                    ranking, pilot_name)

            competitors.append(competitor)
            tasks.append(task)

        # Select task from tasks list
        task = self._select_task(tasks)

        return CompetitionDay(competition_name, date, plane_class, competitors,
                              task)
Beispiel #4
0
    def generate_competition_day(self, target_directory: str, download_progress=None, start_time_buffer: int=0) -> CompetitionDay:
        """
        Generate a CompetitionDay for the specified SoaringSpot daily result page.
        Information is pulled from the overview table and from the igc files, which are automatically downloaded.

        :param target_directory: see super
        :param download_progress: see super
        :param start_time_buffer: see super
        :return:
        """

        # get info from website
        competition_name, date, plane_class = self._get_competition_day_info()
        competitors_info = self._get_competitors_info()

        self.set_igc_directory(target_directory, competition_name, plane_class, date)

        competitors = list()
        tasks = list()
        files_downloaded = 0
        for competitor_info in competitors_info:
            competition_id = competitor_info['competition_id']
            igc_url = competitor_info['igc_url']
            ranking = competitor_info['ranking']

            # download files
            file_path = self.download_flight(igc_url, competition_id)

            files_downloaded += 1
            if download_progress is not None:
                download_progress(files_downloaded, len(competitors_info))

            with open(file_path, 'r', encoding='utf-8') as f:
                parsed_igc_file = Reader().read(f)

            trace_errors, trace = parsed_igc_file['fix_records']

            # get info from file
            task, contest_information, competitor_information = get_info_from_comment_lines(parsed_igc_file, start_time_buffer)
            plane_model = competitor_information.get('plane_model', None)
            pilot_name = competitor_information.get('pilot_name', None)

            competitor = Competitor(trace, competition_id, plane_model, ranking, pilot_name)

            competitors.append(competitor)
            tasks.append(task)

        # Select task from tasks list
        task = self._select_task(tasks)

        return CompetitionDay(competition_name, date, plane_class, competitors, task)