|
2 | 2 | import datetime |
3 | 3 | import json |
4 | 4 | import logging |
5 | | -from typing import List, Optional |
| 5 | +from typing import List, NotRequired, Optional, TypedDict |
6 | 6 |
|
7 | 7 | import psycopg2 |
8 | 8 | from run_eval import CompileResult, RunResult, SystemInfo |
9 | 9 | from task import LeaderboardTask |
10 | 10 | from utils import ( |
11 | 11 | KernelBotError, |
12 | | - LeaderboardItem, |
13 | | - LeaderboardRankedEntry, |
14 | 12 | LRUCache, |
15 | | - RunItem, |
16 | | - SubmissionItem, |
17 | 13 | setup_logging, |
18 | 14 | ) |
19 | 15 |
|
@@ -79,7 +75,7 @@ def __exit__(self, exc_type, exc_val, exc_tb): |
79 | 75 | if self.refcount == 0: |
80 | 76 | self.disconnect() |
81 | 77 |
|
82 | | - def create_leaderboard(self, leaderboard: LeaderboardItem) -> int: |
| 78 | + def create_leaderboard(self, leaderboard: "LeaderboardItem") -> int: |
83 | 79 | try: |
84 | 80 | self.cursor.execute( |
85 | 81 | """ |
@@ -342,7 +338,7 @@ def get_leaderboard_names(self) -> list[str]: |
342 | 338 | self.cursor.execute("SELECT name FROM leaderboard.leaderboard") |
343 | 339 | return [x[0] for x in self.cursor.fetchall()] |
344 | 340 |
|
345 | | - def get_leaderboards(self) -> list[LeaderboardItem]: |
| 341 | + def get_leaderboards(self) -> list["LeaderboardItem"]: |
346 | 342 | self.cursor.execute( |
347 | 343 | """ |
348 | 344 | SELECT id, name, deadline, task, creator_id |
@@ -393,7 +389,7 @@ def get_leaderboard_gpu_types(self, leaderboard_name: str) -> List[str] | None: |
393 | 389 | else: |
394 | 390 | return None |
395 | 391 |
|
396 | | - def get_leaderboard(self, leaderboard_name: str) -> LeaderboardItem | None: |
| 392 | + def get_leaderboard(self, leaderboard_name: str) -> "LeaderboardItem | None": |
397 | 393 | self.cursor.execute( |
398 | 394 | """ |
399 | 395 | SELECT id, name, deadline, task, creator_id, forum_id, secret_seed |
@@ -427,7 +423,7 @@ def get_leaderboard_submissions( |
427 | 423 | user_id: Optional[str] = None, |
428 | 424 | limit: int = None, |
429 | 425 | offset: int = 0, |
430 | | - ) -> list[LeaderboardRankedEntry]: |
| 426 | + ) -> list["LeaderboardRankedEntry"]: |
431 | 427 | # separate cases, for personal we want all submissions, for general we want best per user |
432 | 428 | if user_id: |
433 | 429 | # Query all if user_id (means called from show-personal) |
@@ -642,7 +638,7 @@ def delete_submission(self, submission_id: int): |
642 | 638 | logger.exception("Could not delete submission %s.", submission_id, exc_info=e) |
643 | 639 | raise KernelBotError(f"Could not delete submission {submission_id}!") from e |
644 | 640 |
|
645 | | - def get_submission_by_id(self, submission_id: int) -> Optional[SubmissionItem]: |
| 641 | + def get_submission_by_id(self, submission_id: int) -> Optional["SubmissionItem"]: |
646 | 642 | query = """ |
647 | 643 | SELECT s.leaderboard_id, lb.name, s.file_name, s.user_id, |
648 | 644 | s.submission_time, s.done, c.code |
@@ -893,3 +889,52 @@ def validate_cli_id(self, cli_id: str) -> Optional[dict[str, str]]: |
893 | 889 | self.connection.rollback() |
894 | 890 | logger.exception("Error validating CLI ID %s", cli_id, exc_info=e) |
895 | 891 | raise KernelBotError("Error validating CLI ID") from e |
| 892 | + |
| 893 | + |
| 894 | +class LeaderboardItem(TypedDict): |
| 895 | + id: int |
| 896 | + name: str |
| 897 | + creator_id: int |
| 898 | + deadline: datetime.datetime |
| 899 | + task: "LeaderboardTask" |
| 900 | + gpu_types: List[str] |
| 901 | + forum_id: int |
| 902 | + secret_seed: NotRequired[int] |
| 903 | + |
| 904 | + |
| 905 | +class LeaderboardRankedEntry(TypedDict): |
| 906 | + submission_id: int |
| 907 | + rank: int |
| 908 | + submission_name: str |
| 909 | + submission_time: datetime.datetime |
| 910 | + submission_score: float |
| 911 | + leaderboard_name: str |
| 912 | + user_id: int |
| 913 | + user_name: str |
| 914 | + gpu_type: str |
| 915 | + |
| 916 | + |
| 917 | +class RunItem(TypedDict): |
| 918 | + start_time: datetime.datetime |
| 919 | + end_time: datetime.datetime |
| 920 | + mode: str |
| 921 | + secret: bool |
| 922 | + runner: str |
| 923 | + score: Optional[float] |
| 924 | + passed: bool |
| 925 | + compilation: dict |
| 926 | + meta: dict |
| 927 | + result: dict |
| 928 | + system: dict |
| 929 | + |
| 930 | + |
| 931 | +class SubmissionItem(TypedDict): |
| 932 | + submission_id: int |
| 933 | + leaderboard_id: int |
| 934 | + leaderboard_name: str |
| 935 | + file_name: str |
| 936 | + user_id: int |
| 937 | + submission_time: datetime.datetime |
| 938 | + done: bool |
| 939 | + code: str |
| 940 | + runs: List[RunItem] |
0 commit comments