From 70440382d2f6e50959885a3893d5d7ba3baa7500 Mon Sep 17 00:00:00 2001 From: Boming Zhang Date: Tue, 3 Jun 2025 02:08:57 -0400 Subject: [PATCH] fix: alias --- joj3_config_generator/models/repo.py | 52 ++++++++++++++----- joj3_config_generator/models/result.py | 6 +-- joj3_config_generator/models/task.py | 71 +++++++++++++++++++------- 3 files changed, 94 insertions(+), 35 deletions(-) diff --git a/joj3_config_generator/models/repo.py b/joj3_config_generator/models/repo.py index 18adba6..63c074e 100644 --- a/joj3_config_generator/models/repo.py +++ b/joj3_config_generator/models/repo.py @@ -2,7 +2,7 @@ import socket from pathlib import Path from typing import List -from pydantic import BaseModel, Field +from pydantic import AliasChoices, BaseModel, Field class Files(BaseModel): @@ -12,24 +12,50 @@ class Files(BaseModel): class Groups(BaseModel): name: List[str] = [] - max_count: List[int] = Field([], alias="max-count") - time_period_hour: List[int] = Field([], alias="time-period-hour") + max_count: List[int] = Field( + [], validation_alias=AliasChoices("max-count", "max_count") + ) + time_period_hour: List[int] = Field( + [], validation_alias=AliasChoices("time-period-hour", "time_period_hour") + ) class Config(BaseModel): - max_size: float = Field(10, ge=0, alias="max-size") - files: Files = Files() - sandbox_token: str = Field("", alias="sandbox-token") - max_total_score: int = Field(100, alias="max-total-score") - force_skip_health_check_on_test: bool = Field( - False, alias="force-skip-health-check-on-test" + max_size: float = Field( + 10, ge=0, validation_alias=AliasChoices("max-size", "max_size") + ) + files: Files = Files() + sandbox_token: str = Field( + "", validation_alias=AliasChoices("sandbox-token", "sandbox_token") + ) + max_total_score: int = Field( + 100, validation_alias=AliasChoices("max-total-score", "max_total_score") + ) + force_skip_health_check_on_test: bool = Field( + False, + validation_alias=AliasChoices( + "force-skip-health-check-on-test", "force_skip_health_check_on_test" + ), + ) + force_skip_teapot_on_test: bool = Field( + False, + validation_alias=AliasChoices( + "force-skip-teapot-on-test", "force_skip_teapot_on_test" + ), ) - force_skip_teapot_on_test: bool = Field(False, alias="force-skip-teapot-on-test") groups: Groups = Groups() root: Path = Path(".") path: Path = Path("repo.toml") grading_repo_name: str = Field( - f"{socket.gethostname().split('-')[0]}-joj", alias="grading-repo-name" + f"{socket.gethostname().split('-')[0]}-joj", + validation_alias=AliasChoices("grading-repo-name", "grading_repo_name"), + ) + health_check_score: int = Field( + 0, validation_alias=AliasChoices("health-check-score", "health_check_score") + ) + submitter_in_issue_title: bool = Field( + True, + validation_alias=AliasChoices( + "submitter-in-issue-title", "submitter_in_issue_title" + ), ) - health_check_score: int = Field(0, alias="health-check-score") - submitter_in_issue_title: bool = Field(True, alias="submitter-in-issue-title") diff --git a/joj3_config_generator/models/result.py b/joj3_config_generator/models/result.py index 8c4f90f..028ba64 100644 --- a/joj3_config_generator/models/result.py +++ b/joj3_config_generator/models/result.py @@ -21,7 +21,7 @@ class MemoryFile(BaseModel): class PreparedFile(BaseModel): - file_id: str = Field(..., alias="fileId") + file_id: str = Field(..., serialization_alias="fileId") class Collector(BaseModel): @@ -35,11 +35,11 @@ class Symlink(BaseModel): class StreamIn(BaseModel): - stream_in: bool = Field(..., alias="streamIn") + stream_in: bool = Field(..., serialization_alias="streamIn") class StreamOut(BaseModel): - stream_out: bool = Field(..., alias="streamOut") + stream_out: bool = Field(..., serialization_alias="streamOut") InputFile = Union[LocalFile, MemoryFile, PreparedFile, Symlink] diff --git a/joj3_config_generator/models/task.py b/joj3_config_generator/models/task.py index be2da02..21bbecd 100644 --- a/joj3_config_generator/models/task.py +++ b/joj3_config_generator/models/task.py @@ -3,7 +3,14 @@ from enum import Enum from pathlib import Path from typing import Any, Dict, List, Type -from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator +from pydantic import ( + AliasChoices, + BaseModel, + ConfigDict, + Field, + field_validator, + model_validator, +) from joj3_config_generator.models.common import Memory, Time from joj3_config_generator.models.const import ( @@ -16,13 +23,19 @@ from joj3_config_generator.models.const import ( class ParserResultDetail(BaseModel): - cpu_time: bool = Field(True, alias="cpu-time") # Display CPU time + cpu_time: bool = Field( + True, validation_alias=AliasChoices("cpu-time", "cpu_time") + ) # Display CPU time time: bool = True # Display run time mem: bool = True # Display memory usage stdout: bool = False # Display stdout messages stderr: bool = False # Display stderr messages - exit_status: bool = Field(True, alias="exit-status") # Display exit status - proc_peak: bool = Field(False, alias="proc-peak") # Display peak process count + exit_status: bool = Field( + True, validation_alias=AliasChoices("exit-status", "exit_status") + ) # Display exit status + proc_peak: bool = Field( + False, validation_alias=AliasChoices("proc-peak", "proc_peak") + ) # Display peak process count error: bool = False # Display error messages @@ -39,7 +52,9 @@ class ParserLog(BaseModel): class ParserDummy(BaseModel): comment: str = "" score: int = 0 - force_quit: bool = Field(False, alias="force-quit") + force_quit: bool = Field( + False, validation_alias=AliasChoices("force-quit", "force_quit") + ) class ParserKeyword(BaseModel): @@ -49,21 +64,32 @@ class ParserKeyword(BaseModel): class ParserDiffOutputs(BaseModel): score: int = 0 - ignore_spaces: bool = Field(True, alias="ignore-spaces") + ignore_spaces: bool = Field( + True, validation_alias=AliasChoices("ignore-spaces", "ignore_spaces") + ) hide: bool = False - force_quit: bool = Field(False, alias="force-quit") - max_length: int = Field(2048, alias="max-length") - max_lines: int = Field(50, alias="max-lines") - hide_common_prefix: bool = Field(False, alias="hide-common-prefix") + force_quit: bool = Field( + False, validation_alias=AliasChoices("force-quit", "force_quit") + ) + max_length: int = Field( + 2048, validation_alias=AliasChoices("max-length", "max_length") + ) + max_lines: int = Field(50, validation_alias=AliasChoices("max-lines", "max_lines")) + hide_common_prefix: bool = Field( + False, validation_alias=AliasChoices("hide-common-prefix", "hide_common_prefix") + ) class ParserDiff(BaseModel): output: ParserDiffOutputs = ParserDiffOutputs() - default_score: int = Field(DEFAULT_CASE_SCORE, alias="default-score") + default_score: int = Field( + DEFAULT_CASE_SCORE, + validation_alias=AliasChoices("default-score", "default_score"), + ) class StageFiles(BaseModel): - import_: List[str] = Field([], alias="import") + import_: List[str] = Field([], validation_alias="import") export: List[str] = [] @@ -109,21 +135,26 @@ class Stage(BaseModel): env: List[str] = [] command: str = "" # Command to run files: StageFiles = StageFiles() - in_: str = Field("", alias="in") - out_: str = Field("", alias="out") - copy_in_cwd: bool = Field(True, alias="copy-in-cwd") + in_: str = Field("", validation_alias="in") + out_: str = Field("", validation_alias="out") + copy_in_cwd: bool = Field( + True, validation_alias=AliasChoices("copy-in-cwd", "copy_in_cwd") + ) score: int = 0 parsers: List[Parser] = [] # list of parsers limit: Limit = Limit() dummy: ParserDummy = ParserDummy() - result_status: ParserDummy = Field(ParserDummy(), alias="result-status") + result_status: ParserDummy = Field( + ParserDummy(), validation_alias=AliasChoices("result-status", "result_status") + ) keyword: ParserKeyword = ParserKeyword() clangtidy: ParserKeyword = ParserKeyword() cppcheck: ParserKeyword = ParserKeyword() cpplint: ParserKeyword = ParserKeyword() elf: ParserKeyword = ParserKeyword() result_detail: ParserResultDetail = Field( - ParserResultDetail(), alias="result-detail" + ParserResultDetail(), + validation_alias=AliasChoices("result-detail", "result_detail"), ) file: ParserFile = ParserFile() skip: List[str] = [] @@ -151,10 +182,12 @@ class Stage(BaseModel): class Release(BaseModel): end_time: datetime = Field( - datetime(1970, 1, 1, 0, 0, 0, tzinfo=timezone.utc), alias="end-time" + datetime(1970, 1, 1, 0, 0, 0, tzinfo=timezone.utc), + validation_alias=AliasChoices("end-time", "end_time"), ) # timestamp = 0, no end time begin_time: datetime = Field( - datetime(1970, 1, 1, 0, 0, 0, tzinfo=timezone.utc), alias="begin-time" + datetime(1970, 1, 1, 0, 0, 0, tzinfo=timezone.utc), + validation_alias=AliasChoices("begin-time", "begin_time"), ) # timestamp = 0, no begin time