From 6971fa553b1232b8faa61cb9545ac0ead78782f6 Mon Sep 17 00:00:00 2001 From: emkael Date: Sat, 24 Feb 2018 00:54:16 +0100 Subject: Lots of lots of messages are being logged --- jfr_playoff/tournamentinfo.py | 95 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 79 insertions(+), 16 deletions(-) (limited to 'jfr_playoff/tournamentinfo.py') diff --git a/jfr_playoff/tournamentinfo.py b/jfr_playoff/tournamentinfo.py index ee96214..24440b3 100644 --- a/jfr_playoff/tournamentinfo.py +++ b/jfr_playoff/tournamentinfo.py @@ -3,8 +3,9 @@ import re import jfr_playoff.sql as p_sql from jfr_playoff.remote import RemoteUrl as p_remote +from jfr_playoff.logger import PlayoffLogger -SWISS_TIE_WARNING = 'WARNING: tie detected in swiss %s.' + \ +SWISS_TIE_WARNING = 'tie detected in swiss %s.' + \ ' Make sure to resolve the tie by arranging teams' + \ ' in configuration file.' @@ -19,7 +20,9 @@ class TournamentInfo: if 'link' not in self.settings: raise KeyError('link not configured') if not self.settings['link'].endswith('leaderb.html'): - raise ValueError('unable to determine tournament results') + raise ValueError('invalid link to tournament results') + PlayoffLogger.get('tournamentinfo').info( + 'fetching tournament results from leaderboard URL: %s', self.settings['link']) leaderboard = p_remote.fetch(self.settings['link']) result_links = [row.select('a[onmouseover]') for row in leaderboard.find_all('tr') if len(row.select('a[onmouseover]')) > 0] results = [None] * (len(result_links) * max([len(links) for links in result_links])) @@ -39,15 +42,23 @@ class TournamentInfo: if team_image is not None: team_info.append(team_image['src'].replace('images/', '')) teams.append(team_info) + PlayoffLogger.get('tournamentinfo').info( + 'read tournament results from leaderboard: %s', teams) for table in range(1, int(ceil(len(teams)/2.0))+1): table_url = self.get_results_link('1t%d-1.html' % (table)) table_content = p_remote.fetch(table_url) + PlayoffLogger.get('tournamentinfo').info( + 'reading team shortnames from traveller: %s', table_url) for link in table_content.select('a.br'): if link['href'] in team_links: for team in teams: if team[0] == team_links[link['href']]: team[1] = link.text.strip(u'\xa0') + PlayoffLogger.get('tournamentinfo').info( + 'shortname for %s: %s', team[0], team[1]) break + PlayoffLogger.get('tournamentinfo').info( + 'tournament results from HTML: %s', teams) return teams def __get_db_results(self): @@ -66,23 +77,44 @@ class TournamentInfo: swiss_results = sorted( swiss_results, key=lambda t: t[1], reverse=True) swiss_results = sorted(swiss_results, key=lambda team: team[2]) + PlayoffLogger.get('tournamentinfo').info( + 'fetched tournament results from database %s: %s', + self.settings['database'], swiss_results) prev_result = None for team in swiss_results: if prev_result == team[1]: - print SWISS_TIE_WARNING % (self.settings['database']) + PlayoffLogger.get('tournamentinfo').warning( + SWISS_TIE_WARNING, self.settings['database']) prev_result = team[1] db_teams = [[team[0], team[3], team[4]] for team in swiss_results] + PlayoffLogger.get('tournamentinfo').info( + 'fetched team list from database %s: %s', + self.settings['database'], db_teams) return db_teams def __get_html_finished(self): if 'link' not in self.settings: raise KeyError('link not configured') if not self.settings['link'].endswith('leaderb.html'): - raise ValueError('unable to determine tournament status') + raise ValueError('invalid tournament leaderboard link') + PlayoffLogger.get('tournamentinfo').info( + 'fetching tournament finished status from HTML: %s', + self.settings['link']) leaderboard = p_remote.fetch(self.settings['link']) leaderb_heading = leaderboard.select('td.bdnl12')[0].text + contains_digits = any(char.isdigit() for char in leaderb_heading) + PlayoffLogger.get('tournamentinfo').info( + 'tournament header from HTML: %s, %s', + leaderb_heading, 'contains digits' if contains_digits else "doesn't contain digits") non_zero_scores = [imps.text for imps in leaderboard.select('td.bdc small') if imps.text != '0-0'] - return (not any(char.isdigit() for char in leaderb_heading)) and (len(non_zero_scores) > 0) + PlayoffLogger.get('tournamentinfo').info( + 'tournament leaderboard from HTML: has %d non-zero scores', + len(non_zero_scores)) + finished = (not contains_digits) and (len(non_zero_scores) > 0) + PlayoffLogger.get('tournamentinfo').info( + 'tournament leaderboard from HTML indicates finished: %s', + finished) + return finished def __get_db_finished(self): if self.database is None: @@ -91,14 +123,21 @@ class TournamentInfo: raise KeyError('database not configured') finished = self.database.fetch( self.settings['database'], p_sql.SWISS_ENDED, {}) + PlayoffLogger.get('tournamentinfo').info( + 'fetching tournament finished status from DB %s: %s', + self.settings['database'], finished) return (len(finished) > 0) and (finished[0] > 0) def __get_html_link(self, suffix='leaderb.html'): if 'link' not in self.settings: raise KeyError('link not configured') if not self.settings['link'].endswith('leaderb.html'): - raise ValueError('unable to determine html link') - return re.sub(r'leaderb.html$', suffix, self.settings['link']) + raise ValueError('invalid tournament leaderboard link') + link = re.sub(r'leaderb.html$', suffix, self.settings['link']) + PlayoffLogger.get('tournamentinfo').info( + 'generating tournament-specific link from leaderboard link %s: %s -> %s', + self.settings['link'], suffix, link) + return link def __get_db_link(self, suffix='leaderb.html'): if self.database is None: @@ -109,19 +148,31 @@ class TournamentInfo: self.settings['database'], p_sql.PREFIX, ()) if row is not None: if len(row) > 0: - return row[0] + suffix + link = row[0] + suffix + PlayoffLogger.get('tournamentinfo').info( + 'generating tournament-specific link from DB %s prefix: %s -> %s', + self.settings['database'], suffix, link) + return link raise ValueError('unable to fetch db link') def get_tournament_results(self): teams = [] try: teams = self.__get_db_results() - except (IOError, TypeError, IndexError, KeyError): + except (IOError, TypeError, IndexError, KeyError) as e: + PlayoffLogger.get('tournamentinfo').warning( + 'cannot determine tournament results from DB: %s(%s)', + type(e).__name__, e.message) try: teams = self.__get_html_results() - except (TypeError, IndexError, KeyError, IOError, ValueError): - pass + except (TypeError, IndexError, KeyError, IOError, ValueError) as e: + PlayoffLogger.get('tournamentinfo').warning( + 'cannot determine tournament results from HTML: %s(%s)', + type(e).__name__, e.message) if self.is_finished() and 'final_positions' in self.settings: + PlayoffLogger.get('tournamentinfo').info( + 'setting final positions from tournament results: %s', + self.settings['final_positions']) for position in self.settings['final_positions']: if len(teams) >= position: teams[position-1].append(position) @@ -130,19 +181,31 @@ class TournamentInfo: def is_finished(self): try: return self.__get_db_finished() - except (IOError, TypeError, IndexError, KeyError): + except (IOError, TypeError, IndexError, KeyError) as e: + PlayoffLogger.get('tournamentinfo').warning( + 'cannot determine tournament finished status from DB: %s(%s)', + type(e).__name__, e.message) try: return self.__get_html_finished() - except (TypeError, IndexError, KeyError, IOError, ValueError): - pass + except (TypeError, IndexError, KeyError, IOError, ValueError) as e: + PlayoffLogger.get('tournamentinfo').warning( + 'cannot determine tournament finished status from HTML: %s(%s)', + type(e).__name__, e.message) + PlayoffLogger.get('tournamentinfo').info( + 'assuming tournament is finished') return True def get_results_link(self, suffix='leaderb.html'): try: return self.__get_db_link(suffix) - except (IOError, TypeError, IndexError, KeyError): + except (IOError, TypeError, IndexError, KeyError) as e: + PlayoffLogger.get('tournamentinfo').warning( + 'cannot determine tournament link from DB: %s(%s)', + type(e).__name__, e.message) try: return self.__get_html_link(suffix) except (KeyError, ValueError): - pass + PlayoffLogger.get('tournamentinfo').warning( + 'cannot determine tournament link from HTML: %s(%s)', + type(e).__name__, e.message) return None -- cgit v1.2.3 From 8c500a75a6eafd65b332d0f8346d9059d5293cbb Mon Sep 17 00:00:00 2001 From: emkael Date: Sat, 24 Feb 2018 11:04:11 +0100 Subject: Extracting text representation of an exception instead of explicit .message property --- jfr_playoff/matchinfo.py | 14 +++++++------- jfr_playoff/settings.py | 2 +- jfr_playoff/tournamentinfo.py | 12 ++++++------ 3 files changed, 14 insertions(+), 14 deletions(-) (limited to 'jfr_playoff/tournamentinfo.py') diff --git a/jfr_playoff/matchinfo.py b/jfr_playoff/matchinfo.py index db49b07..8132fe2 100644 --- a/jfr_playoff/matchinfo.py +++ b/jfr_playoff/matchinfo.py @@ -179,13 +179,13 @@ class MatchInfo: except (IOError, TypeError, IndexError, KeyError) as e: PlayoffLogger.get('matchinfo').warning( 'fetching DB scores for match #%d failed: %s(%s)', - self.info.id, type(e).__name__, e.message) + self.info.id, type(e).__name__, str(e)) self.info.teams = self.__get_html_teams( self.info.teams, not scores_fetched) except (TypeError, IndexError, KeyError, IOError, ValueError) as e: PlayoffLogger.get('matchinfo').warning( 'fetching HTML scores for match #%d failed: %s(%s)', - self.info.id, type(e).__name__, e.message) + self.info.id, type(e).__name__, str(e)) self.info.teams = self.__get_config_teams(self.info.teams) def __get_db_board_count(self): @@ -237,7 +237,7 @@ class MatchInfo: except IOError as e: PlayoffLogger.get('matchinfo').info( 'cannot fetch HTML played boards count for segment: %s(%s)', - self.info.id, type(e).__name__, e.message) + self.info.id, type(e).__name__, str(e)) return 0, False return 0, False @@ -288,13 +288,13 @@ class MatchInfo: except (IOError, TypeError, IndexError, KeyError) as e: PlayoffLogger.get('matchinfo').warning( 'fetching board count from DB for match #%d failed: %s(%s)', - self.info.id, type(e).__name__, e.message) + self.info.id, type(e).__name__, str(e)) try: boards_played, boards_to_play = self.__get_html_board_count() except (TypeError, IndexError, KeyError, IOError, ValueError) as e: PlayoffLogger.get('matchinfo').warning( 'fetching board count from HTML for match #%d failed: %s(%s)', - self.info.id, type(e).__name__, e.message) + self.info.id, type(e).__name__, str(e)) pass if boards_played > 0: self.info.running = -1 \ @@ -345,13 +345,13 @@ class MatchInfo: except (IOError, TypeError, IndexError, KeyError) as e: PlayoffLogger.get('matchinfo').warning( 'cannot determine running link from DB for match #%d: %s(%s)', - self.info.id, type(e).__name__, e.message) + self.info.id, type(e).__name__, str(e)) try: self.info.link = self.__get_html_running_link() except (TypeError, IndexError, KeyError, IOError, ValueError) as e: PlayoffLogger.get('matchinfo').warning( 'cannot determine running link from HTML for match #%d: %s(%s)', - self.info.id, type(e).__name__, e.message) + self.info.id, type(e).__name__, str(e)) def set_phase_link(self, phase_link): if self.info.link is None: diff --git a/jfr_playoff/settings.py b/jfr_playoff/settings.py index 181e19f..58de66c 100644 --- a/jfr_playoff/settings.py +++ b/jfr_playoff/settings.py @@ -35,7 +35,7 @@ class PlayoffSettings(object): except Exception as e: PlayoffLogger.get('settings').warning( 'unable to merge remote config %s: %s(%s)', - remote_url, type(e).__name__, e.message) + remote_url, type(e).__name__, str(e)) return base_config def load(self): diff --git a/jfr_playoff/tournamentinfo.py b/jfr_playoff/tournamentinfo.py index 24440b3..a646d4e 100644 --- a/jfr_playoff/tournamentinfo.py +++ b/jfr_playoff/tournamentinfo.py @@ -162,13 +162,13 @@ class TournamentInfo: except (IOError, TypeError, IndexError, KeyError) as e: PlayoffLogger.get('tournamentinfo').warning( 'cannot determine tournament results from DB: %s(%s)', - type(e).__name__, e.message) + type(e).__name__, str(e)) try: teams = self.__get_html_results() except (TypeError, IndexError, KeyError, IOError, ValueError) as e: PlayoffLogger.get('tournamentinfo').warning( 'cannot determine tournament results from HTML: %s(%s)', - type(e).__name__, e.message) + type(e).__name__, str(e)) if self.is_finished() and 'final_positions' in self.settings: PlayoffLogger.get('tournamentinfo').info( 'setting final positions from tournament results: %s', @@ -184,13 +184,13 @@ class TournamentInfo: except (IOError, TypeError, IndexError, KeyError) as e: PlayoffLogger.get('tournamentinfo').warning( 'cannot determine tournament finished status from DB: %s(%s)', - type(e).__name__, e.message) + type(e).__name__, str(e)) try: return self.__get_html_finished() except (TypeError, IndexError, KeyError, IOError, ValueError) as e: PlayoffLogger.get('tournamentinfo').warning( 'cannot determine tournament finished status from HTML: %s(%s)', - type(e).__name__, e.message) + type(e).__name__, str(e)) PlayoffLogger.get('tournamentinfo').info( 'assuming tournament is finished') return True @@ -201,11 +201,11 @@ class TournamentInfo: except (IOError, TypeError, IndexError, KeyError) as e: PlayoffLogger.get('tournamentinfo').warning( 'cannot determine tournament link from DB: %s(%s)', - type(e).__name__, e.message) + type(e).__name__, str(e)) try: return self.__get_html_link(suffix) except (KeyError, ValueError): PlayoffLogger.get('tournamentinfo').warning( 'cannot determine tournament link from HTML: %s(%s)', - type(e).__name__, e.message) + type(e).__name__, str(e)) return None -- cgit v1.2.3 From 72e52cf8c572f262d022acaa1eb1aa65bccb099e Mon Sep 17 00:00:00 2001 From: emkael Date: Fri, 28 Sep 2018 17:37:16 +0200 Subject: Refactoring of some config dictionary default value fetches --- jfr_playoff/data.py | 37 +++++++++++++------------------------ jfr_playoff/generator.py | 5 ++--- jfr_playoff/matchinfo.py | 5 +---- jfr_playoff/tournamentinfo.py | 7 ++++--- 4 files changed, 20 insertions(+), 34 deletions(-) (limited to 'jfr_playoff/tournamentinfo.py') diff --git a/jfr_playoff/data.py b/jfr_playoff/data.py index 9f9a0c2..6adf00c 100644 --- a/jfr_playoff/data.py +++ b/jfr_playoff/data.py @@ -36,18 +36,16 @@ class PlayoffData(object): def generate_phases(self): self.grid = [] for phase in self.phases: - phase_count = len(phase['matches']) - if 'dummies' in phase: - phase_count += len(phase['dummies']) + dummies = phase.get('dummies', []) + phase_count = len(phase['matches']) + len(dummies) phase_object = Phase() phase_object.title = phase['title'] - phase_object.link = phase['link'] if 'link' in phase else None + phase_object.link = phase.get('link', None) phase_object.matches = [None] * phase_count phase_pos = 0 for match in phase['matches']: - if 'dummies' in phase: - while phase_pos in phase['dummies']: - phase_pos += 1 + while phase_pos in dummies: + phase_pos += 1 phase_object.matches[phase_pos] = match['id'] phase_pos += 1 PlayoffLogger.get('data').info('phase object: %s', phase_object) @@ -73,8 +71,7 @@ class PlayoffData(object): def get_swiss_link(self, event): event_info = TournamentInfo(event, self.database) swiss_link = event_info.get_results_link() - if ('relative_path' in event) and ( - event['relative_path'] is not None): + if event.get('relative_path', None): swiss_link = '%s/%s' % (event['relative_path'], swiss_link) PlayoffLogger.get('data').info('swiss link: %s', swiss_link) return swiss_link @@ -94,16 +91,8 @@ class PlayoffData(object): event['ties'] = teams event_info = TournamentInfo(event, self.database) if event_info.is_finished(): - swiss_position = ( - event['swiss_position'] - if 'swiss_position' in event - else 1 - ) - position_limit = ( - event['position_to'] - if 'position_to' in event - else 9999 - ) + swiss_position = event.get('swiss_position', 1) + position_limit = event.get('position_to', 9999) place = 1 swiss_results = event_info.get_tournament_results() for team in swiss_results: @@ -156,7 +145,7 @@ class PlayoffData(object): swiss_info = [{ 'link': self.get_swiss_link(event), 'position': event['position'], - 'label': event['label'] if 'label' in event else None, + 'label': event.get('label', None), 'finished': TournamentInfo(event, self.database).is_finished() } for event in self.swiss] PlayoffLogger.get('data').info('swiss info: %s', swiss_info) @@ -166,10 +155,10 @@ class PlayoffData(object): dimensions = ( len(self.phases), max([ - len(phase['matches']) + len(phase['dummies']) - if 'dummies' in phase - else len(phase['matches']) - for phase in self.phases])) + len(phase['matches']) + len(phase.get('dummies', [])) + for phase in self.phases + ]) + ) PlayoffLogger.get('data').info('grid dimensions: %s', dimensions) return dimensions diff --git a/jfr_playoff/generator.py b/jfr_playoff/generator.py index 5dfed13..d358d86 100644 --- a/jfr_playoff/generator.py +++ b/jfr_playoff/generator.py @@ -57,8 +57,7 @@ class PlayoffGenerator(object): team_label = ' / '.join([ self.data.get_shortname(name) for name in team.name.split('
')]) - label_max_length = self.page['label_length_limit'] \ - if 'label_length_limit' in self.page else 0 + label_max_length = self.page.get('label_length_limit', 0) if label_max_length: team_label = team_label[:label_max_length] + (team_label[label_max_length:] and '(...)') team_html = self.p_temp.get( @@ -199,7 +198,7 @@ class PlayoffGenerator(object): info = [] for event in self.data.get_swiss_info(): event_label = self.p_temp.get('SWISS_DEFAULT_LABEL', event['position']) - if 'label' in event and event['label'] is not None: + if event.get('label', None): event_label = event['label'] info.append((self.p_temp.get('SWISS_LINK', event['link'], event_label) \ diff --git a/jfr_playoff/matchinfo.py b/jfr_playoff/matchinfo.py index dd2ee30..ab742d4 100644 --- a/jfr_playoff/matchinfo.py +++ b/jfr_playoff/matchinfo.py @@ -191,10 +191,7 @@ class MatchInfo: if scores_fetched: PlayoffLogger.get('matchinfo').info( 'pre-defined scores for match #%d fetched', self.info.id) - if 'running' in self.config: - self.info.running = int(self.config['running']) - else: - self.info.running = -1 + self.info.running = int(self.config.get('running', -1)) if not teams_fetched: try: try: diff --git a/jfr_playoff/tournamentinfo.py b/jfr_playoff/tournamentinfo.py index a646d4e..45a7752 100644 --- a/jfr_playoff/tournamentinfo.py +++ b/jfr_playoff/tournamentinfo.py @@ -169,11 +169,12 @@ class TournamentInfo: PlayoffLogger.get('tournamentinfo').warning( 'cannot determine tournament results from HTML: %s(%s)', type(e).__name__, str(e)) - if self.is_finished() and 'final_positions' in self.settings: + if self.is_finished(): + final_positions = self.settings.get('final_positions', []) PlayoffLogger.get('tournamentinfo').info( 'setting final positions from tournament results: %s', - self.settings['final_positions']) - for position in self.settings['final_positions']: + final_positions) + for position in final_positions: if len(teams) >= position: teams[position-1].append(position) return teams -- cgit v1.2.3