From e2dc0942634dbda59eca97ba61cd505bf3292a63 Mon Sep 17 00:00:00 2001 From: Boming Zhang Date: Thu, 19 Jun 2025 06:43:29 -0400 Subject: [PATCH] feat: support penalty config --- joj3_config_generator/models/task.py | 6 ++++++ joj3_config_generator/transformers/repo.py | 23 ++++++++++++++++++++++ tests/convert/basic/task.json | 10 ++++++++-- tests/convert/basic/task.toml | 4 ++++ 4 files changed, 41 insertions(+), 2 deletions(-) diff --git a/joj3_config_generator/models/task.py b/joj3_config_generator/models/task.py index ac0c149..7af9cdf 100644 --- a/joj3_config_generator/models/task.py +++ b/joj3_config_generator/models/task.py @@ -220,6 +220,11 @@ class Task(BaseModel): name: str = "unknown" +class Penalties(BaseModel): + hours: List[float] = [] + factors: List[float] = [] + + class Config(BaseModel): root: Path = Path(".") path: Path = Path("task.toml") @@ -228,6 +233,7 @@ class Config(BaseModel): release: Release = Release() # Release configuration stages: List[Stage] = [] # list of stage configurations groups: Groups = Groups() + penalties: Penalties = Penalties() max_total_score: Optional[int] = Field( None, validation_alias=AliasChoices("max-total-score", "max_total_score") ) diff --git a/joj3_config_generator/transformers/repo.py b/joj3_config_generator/transformers/repo.py index 53676db..691a7a8 100644 --- a/joj3_config_generator/transformers/repo.py +++ b/joj3_config_generator/transformers/repo.py @@ -41,6 +41,21 @@ def get_teapot_post_stage( ] if not repo_conf.submitter_in_issue_title: args.append("--no-submitter-in-issue-title") + if task_conf.time.end: + args.extend( + [ + "--end-time", + task_conf.time.end.strftime("%Y-%m-%dT%H:%M:%S"), + ] + ) + if task_conf.penalties.hours: + penalty_config = ",".join( + f"{hour}={factor}" + for hour, factor in zip( + task_conf.penalties.hours, task_conf.penalties.factors + ) + ) + args.extend(["--penalty-config", penalty_config]) stage_conf = result.StageDetail( name="teapot", @@ -118,6 +133,14 @@ def get_teapot_check_args(repo_conf: repo.Config, task_conf: task.Config) -> Lis res.extend(["--begin-time", task_conf.time.begin.strftime("%Y-%m-%dT%H:%M:%S")]) if task_conf.time.end: res.extend(["--end-time", task_conf.time.end.strftime("%Y-%m-%dT%H:%M:%S")]) + if task_conf.penalties.hours: + penalty_config = ",".join( + f"{hour}={factor}" + for hour, factor in zip( + task_conf.penalties.hours, task_conf.penalties.factors + ) + ) + res.extend(["--penalty-config", penalty_config]) return res diff --git a/tests/convert/basic/task.json b/tests/convert/basic/task.json index 9b28298..b124ea2 100644 --- a/tests/convert/basic/task.json +++ b/tests/convert/basic/task.json @@ -78,7 +78,9 @@ "--group-config", "Manuel=500:24,Boming=501:48,Nuvole=502:72", "--end-time", - "2024-12-30T23:59:59" + "2024-12-30T23:59:59", + "--penalty-config", + "24.0=0.5,48.0=0.25,72.0=0.1" ], "env": [ "REPOS_DIR=/home/tt/.cache", @@ -808,7 +810,11 @@ "--grading-repo-name", "ece280-joj", "--max-total-score", - "10245871" + "10245871", + "--end-time", + "2024-12-30T23:59:59", + "--penalty-config", + "24.0=0.5,48.0=0.25,72.0=0.1" ], "env": [ "REPOS_DIR=/home/tt/.cache", diff --git a/tests/convert/basic/task.toml b/tests/convert/basic/task.toml index 541a8be..533d50e 100644 --- a/tests/convert/basic/task.toml +++ b/tests/convert/basic/task.toml @@ -5,6 +5,10 @@ max-total-score = 10245871 time.end = 2024-12-30 23:59:59+08:00 release.begin-time = 2024-12-29 23:59:59+08:00 +[penalties] +hours = [ 24, 48, 72 ] +factors = [ 0.5, 0.25, 0.1 ] + [groups] name = ["Manuel", "Boming", "Nuvole"] max-count = [500, 501, 502]