fix: resolve 4 logic bugs found in code review
All checks were successful
CI / Lint (push) Successful in 5s
CI / Test (push) Successful in 5s
CI / Build & Push (push) Successful in 17s

- utc_to_eastern: use zoneinfo instead of hardcoded EDT offset (-4)
  so start times are correct in both EST and EDT
- standings: fetch before truncate so a failed API call doesn't wipe
  existing standings data
- routes: call parse_games() once per request instead of three times
- scheduler: wrap run_pending() in try/except so an unhandled exception
  doesn't kill the background thread

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-29 14:06:45 -04:00
parent 56feb0a5f2
commit 3169d1a1ff
7 changed files with 56 additions and 27 deletions

View File

@@ -1,9 +1,12 @@
import logging
import sqlite3
from datetime import datetime, timedelta
from datetime import datetime, timezone
from zoneinfo import ZoneInfo
from app.config import DB_PATH
EASTERN = ZoneInfo("America/New_York")
logger = logging.getLogger(__name__)
@@ -226,6 +229,5 @@ def get_team_standings(team_name):
def utc_to_eastern(utc_time):
utc_datetime = datetime.strptime(utc_time, "%Y-%m-%dT%H:%M:%SZ")
est_offset = timedelta(hours=-4)
est_datetime = utc_datetime + est_offset
return est_datetime.strftime("%I:%M %p")
eastern_datetime = utc_datetime.replace(tzinfo=timezone.utc).astimezone(EASTERN)
return eastern_datetime.strftime("%I:%M %p")

View File

@@ -25,24 +25,12 @@ def get_scoreboard():
)
if scoreboard_data:
live_games = [
game
for game in parse_games(scoreboard_data)
if game["Game State"] == "LIVE"
]
pre_games = [
game for game in parse_games(scoreboard_data) if game["Game State"] == "PRE"
]
final_games = [
game
for game in parse_games(scoreboard_data)
if game["Game State"] == "FINAL"
]
games = parse_games(scoreboard_data)
return jsonify(
{
"live_games": live_games,
"pre_games": pre_games,
"final_games": final_games,
"live_games": [g for g in games if g["Game State"] == "LIVE"],
"pre_games": [g for g in games if g["Game State"] == "PRE"],
"final_games": [g for g in games if g["Game State"] == "FINAL"],
}
)
else:

View File

@@ -14,5 +14,8 @@ def start_scheduler():
schedule.every(10).seconds.do(refresh_scores)
logger.info("Background scheduler started")
while True:
schedule.run_pending()
try:
schedule.run_pending()
except Exception:
logger.exception("Scheduler encountered an unexpected error")
time.sleep(1)

View File

@@ -67,8 +67,8 @@ def fetch_standings():
def refresh_standings():
conn = sqlite3.connect(DB_PATH)
create_standings_table(conn)
truncate_standings_table(conn)
standings = fetch_standings()
if standings:
truncate_standings_table(conn)
insert_standings(conn, standings)
conn.close()