Skip to content

Commit ab8a910

Browse files
committed
extract function to libkernelbot
1 parent 0d0476a commit ab8a910

4 files changed

Lines changed: 90 additions & 38 deletions

File tree

src/kernelbot/cogs/leaderboard_cog.py

Lines changed: 2 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,9 @@
1919
from libkernelbot.leaderboard_db import (
2020
LeaderboardItem,
2121
LeaderboardRankedEntry,
22-
RunItem,
2322
SubmissionItem,
2423
)
25-
from libkernelbot.submission import SubmissionRequest, prepare_submission
24+
from libkernelbot.submission import SubmissionRequest, generate_run_verdict, prepare_submission
2625
from libkernelbot.utils import format_time, setup_logging
2726

2827
if TYPE_CHECKING:
@@ -57,38 +56,6 @@ async def select_gpu_view(
5756
await view.wait()
5857
return view
5958

60-
def generate_run_verdict(self, run: RunItem, sub_data: SubmissionItem):
61-
medals = {1: "🥇 First", 2: "🥈 Second", 3: "🥉 Third"}
62-
63-
# get the competition
64-
with self.bot.leaderboard_db as db:
65-
competition = db.get_leaderboard_submissions(
66-
sub_data["leaderboard_name"], run["runner"]
67-
)
68-
# compare against the competition
69-
other_by_user = False
70-
run_time = float(run["score"])
71-
score_text = format_time(run_time * 1e9)
72-
73-
for entry in competition:
74-
# can we find our own run? Only if it is the fastest submission by this user
75-
if entry["submission_id"] == sub_data["submission_id"]:
76-
rank = entry["rank"]
77-
if 1 <= rank <= 3:
78-
return f"> {medals[rank]} place on {run['runner']}: {score_text}"
79-
elif rank <= 10:
80-
return f"> {rank}th place on {run['runner']}: {score_text}"
81-
else:
82-
return f"> Personal best on {run['runner']}: {score_text}"
83-
elif entry["user_id"] == sub_data["user_id"]:
84-
other_by_user = True
85-
if other_by_user:
86-
# User already has a submission that is faster
87-
return f"> Successful on {run['runner']}: {score_text}"
88-
else:
89-
# no submission by the user exists
90-
return f"> 🍾 First successful submission on {run['runner']}: {score_text}"
91-
9259
async def post_submit_hook(self, interaction: discord.Interaction, sub_id: int):
9360
with self.bot.leaderboard_db as db:
9461
sub_data: SubmissionItem = db.get_submission_by_id(sub_id)
@@ -100,7 +67,7 @@ async def post_submit_hook(self, interaction: discord.Interaction, sub_id: int):
10067
and run["mode"] == SubmissionMode.LEADERBOARD.value
10168
and run["passed"]
10269
):
103-
result_lines.append(self.generate_run_verdict(run, sub_data))
70+
result_lines.append(generate_run_verdict(self.bot.backend, run, sub_data))
10471

10572
if len(result_lines) > 0:
10673
await send_discord_message(

src/libkernelbot/submission.py

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@
88
from better_profanity import profanity
99

1010
from libkernelbot.consts import RankCriterion
11+
from libkernelbot.db_types import RunItem, SubmissionItem
1112
from libkernelbot.leaderboard_db import LeaderboardDB, LeaderboardItem
1213
from libkernelbot.run_eval import FullResult
1314
from libkernelbot.task import LeaderboardTask
14-
from libkernelbot.utils import KernelBotError, setup_logging
15+
from libkernelbot.utils import KernelBotError, format_time, setup_logging
1516

1617
if typing.TYPE_CHECKING:
1718
from backend import KernelBackend
@@ -194,3 +195,34 @@ def compute_score(result: FullResult, task: LeaderboardTask, submission_id: int)
194195
raise KernelBotError(f"Invalid ranking criterion {task.ranking_by}")
195196

196197
return score
198+
199+
200+
def generate_run_verdict(backend: "KernelBackend", run: RunItem, sub_data: SubmissionItem):
201+
medals = {1: "🥇 First", 2: "🥈 Second", 3: "🥉 Third"}
202+
203+
# get the competition
204+
with backend.db as db:
205+
competition = db.get_leaderboard_submissions(sub_data["leaderboard_name"], run["runner"])
206+
# compare against the competition
207+
other_by_user = False
208+
run_time = float(run["score"])
209+
score_text = format_time(run_time * 1e9)
210+
211+
for entry in competition:
212+
# can we find our own run? Only if it is the fastest submission by this user
213+
if entry["submission_id"] == sub_data["submission_id"]:
214+
rank = entry["rank"]
215+
if 1 <= rank <= 3:
216+
return f"> {medals[rank]} place on {run['runner']}: {score_text}"
217+
elif rank <= 10:
218+
return f"> {rank}th place on {run['runner']}: {score_text}"
219+
else:
220+
return f"> Personal best on {run['runner']}: {score_text}"
221+
elif entry["user_id"] == sub_data["user_id"]:
222+
other_by_user = True
223+
if other_by_user:
224+
# User already has a submission that is faster
225+
return f"> Successful on {run['runner']}: {score_text}"
226+
else:
227+
# no submission by the user exists
228+
return f"> 🍾 First successful submission on {run['runner']}: {score_text}"

unit-tests/test_report.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ def sample_run_result(mode="test") -> RunResult:
6262
"benchmark.0.worst": "1.8",
6363
}
6464
else:
65-
assert False, f"Invalid mode: {mode}"
65+
raise AssertionError(f"Invalid mode: {mode}")
6666

6767
return RunResult(
6868
success=True,

unit-tests/test_submission.py

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
from libkernelbot import submission
88
from libkernelbot.consts import RankCriterion
9-
from libkernelbot.db_types import LeaderboardItem
9+
from libkernelbot.db_types import LeaderboardItem, RunItem, SubmissionItem
1010
from libkernelbot.utils import KernelBotError
1111

1212

@@ -344,3 +344,56 @@ def test_compute_score():
344344
mock_task.ranking_by = "WRONG"
345345
with pytest.raises(KernelBotError, match="Invalid ranking criterion WRONG"):
346346
submission.compute_score(mock_result, mock_task, 1)
347+
348+
349+
def test_generate_run_verdict(mock_backend):
350+
"""Test generate_run_verdict function with various ranking scenarios."""
351+
from libkernelbot.submission import generate_run_verdict
352+
353+
# Mock run and submission data
354+
run_item: RunItem = {"score": 1.5, "runner": "A100"}
355+
356+
sub_data: SubmissionItem = {
357+
"submission_id": 123,
358+
"leaderboard_name": "test_board",
359+
"user_id": 42,
360+
}
361+
362+
# Test first place
363+
mock_backend.db.get_leaderboard_submissions.return_value = [
364+
{"submission_id": 123, "user_id": 42, "rank": 1},
365+
{"submission_id": 542, "user_id": 44, "rank": 2},
366+
]
367+
result = generate_run_verdict(mock_backend, run_item, sub_data)
368+
assert result == "> 🥇 First place on A100: 1500 ms"
369+
370+
# Test 5th place
371+
mock_backend.db.get_leaderboard_submissions.return_value = [
372+
{"submission_id": 652, "user_id": 41, "rank": 4},
373+
{"submission_id": 123, "user_id": 42, "rank": 5},
374+
]
375+
result = generate_run_verdict(mock_backend, run_item, sub_data)
376+
assert result == "> 5th place on A100: 1500 ms"
377+
378+
# Test personal best (rank > 10)
379+
mock_backend.db.get_leaderboard_submissions.return_value = [
380+
{"submission_id": 123, "user_id": 42, "rank": 15}
381+
]
382+
result = generate_run_verdict(mock_backend, run_item, sub_data)
383+
assert result == "> Personal best on A100: 1500 ms"
384+
385+
# This user already has a faster submission
386+
mock_backend.db.get_leaderboard_submissions.return_value = [
387+
{"submission_id": 999, "user_id": 42, "rank": 3},
388+
{"submission_id": 256, "user_id": 41, "rank": 2},
389+
]
390+
result = generate_run_verdict(mock_backend, run_item, sub_data)
391+
assert result == "> Successful on A100: 1500 ms"
392+
393+
# Test first submission by user
394+
mock_backend.db.get_leaderboard_submissions.return_value = [
395+
{"submission_id": 256, "user_id": 41, "rank": 2},
396+
{"submission_id": 999, "user_id": 999, "rank": 999},
397+
]
398+
result = generate_run_verdict(mock_backend, run_item, sub_data)
399+
assert result == "> 🍾 First successful submission on A100: 1500 ms"

0 commit comments

Comments
 (0)