From f5bf26363578779f995a8fbdd7bea4daf5dc09a6 Mon Sep 17 00:00:00 2001 From: Brad Brown Date: Mon, 20 Jun 2022 10:33:49 -0500 Subject: [PATCH] data load improvements * support given date for pull * support load for user score not in game db yet --- wordlinator/app/__init__.py | 12 +++++++++++- wordlinator/utils/__init__.py | 9 +++++++++ wordlinator/utils/scores.py | 8 ++++++-- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/wordlinator/app/__init__.py b/wordlinator/app/__init__.py index 8c4216a..808c280 100644 --- a/wordlinator/app/__init__.py +++ b/wordlinator/app/__init__.py @@ -84,7 +84,9 @@ def _save_db_scores( db_holes = db.get_holes(game_no, ensure_all=True) db_scores = db.get_scores(game_no) - db_scores_by_user = wordlinator.utils.scores.ScoreMatrix(db_scores).by_user() + db_scores_by_user = wordlinator.utils.scores.ScoreMatrix(db_scores).by_user( + usernames=list(scores.keys()) + ) to_update = [] to_create = [] @@ -95,6 +97,7 @@ def _save_db_scores( continue db_user_match = [u for u in db_users if u.username == user] if not db_user_match: + rich.print(f"[yellow]User {user} not in database, cannot add scores.") continue db_user = db_user_match[0] twitter_score = twitter_scores.get(user, None) @@ -169,6 +172,11 @@ def _get_day(): days.add_argument( "--wordle-day", type=int, help="The wordle day number for the score report." ) + days.add_argument( + "--date", + type=wordlinator.utils.date_from_string, + help="a YYYY-MM-DD format date to pull a score report.", + ) args = parser.parse_args() wordle_day = wordlinator.utils.WORDLE_TODAY if args.wordle_day: @@ -177,6 +185,8 @@ def _get_day(): wordle_day = wordlinator.utils.WordleDay.from_wordle_no( wordle_day.wordle_no - args.days_ago ) + elif args.date: + wordle_day = wordlinator.utils.WordleDay.from_date(args.date) return wordle_day diff --git a/wordlinator/utils/__init__.py b/wordlinator/utils/__init__.py index b83d9da..231eec3 100644 --- a/wordlinator/utils/__init__.py +++ b/wordlinator/utils/__init__.py @@ -1,3 +1,4 @@ +import argparse import dataclasses import datetime import typing @@ -7,6 +8,14 @@ WORDLE_DAY_ZERO = datetime.date(2021, 6, 19) WORDLE_GOLF_ROUND_DATES = [datetime.date(2022, 5, 9), datetime.date(2022, 5, 31)] +def date_from_string(datestr: str): + try: + return datetime.date.fromisoformat(datestr) + except ValueError: + msg = "Invalid date string, expected format: YYYY-mm-DD" + raise argparse.ArgumentTypeError(msg) + + @dataclasses.dataclass class GolfHole: game_no: int diff --git a/wordlinator/utils/scores.py b/wordlinator/utils/scores.py index 5a03f17..cd3a96b 100644 --- a/wordlinator/utils/scores.py +++ b/wordlinator/utils/scores.py @@ -153,8 +153,12 @@ class UserRow(ScoreRow): class ScoreMatrix(ScoreContainer): - def by_user(self): - return self.dict_by("user_id.username", UserRow) + def by_user(self, usernames: typing.List[str] = []): + res = self.dict_by("user_id.username", UserRow) + for username in usernames: + if username not in res: + res[username] = UserRow([], username) + return res def for_user(self, username): user_scores = [s for s in self._scores if s.user_id.username == username]