feat: diff.output.xxx -> diff.xxx #26
|
@ -98,15 +98,39 @@ class ParserDiffOutputs(BaseModel):
|
||||||
|
|
||||||
|
|
||||||
class ParserDiff(BaseModel):
|
class ParserDiff(BaseModel):
|
||||||
|
score: int = DEFAULT_CASE_SCORE
|
||||||
|
ignore_spaces: bool = Field(
|
||||||
|
True, validation_alias=AliasChoices("ignore-spaces", "ignore_spaces")
|
||||||
|
)
|
||||||
|
hide: bool = False
|
||||||
|
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")
|
||||||
|
)
|
||||||
|
# remove below codes when migration is complete
|
||||||
output: ParserDiffOutputs = ParserDiffOutputs()
|
output: ParserDiffOutputs = ParserDiffOutputs()
|
||||||
|
|
||||||
|
|
||||||
class ParserDiffFull(ParserDiff):
|
|
||||||
default_score: int = Field(
|
default_score: int = Field(
|
||||||
DEFAULT_CASE_SCORE,
|
DEFAULT_CASE_SCORE,
|
||||||
validation_alias=AliasChoices("default-score", "default_score"),
|
validation_alias=AliasChoices("default-score", "default_score"),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@model_validator(mode="after")
|
||||||
|
def copy_output_fields(self) -> "ParserDiff":
|
||||||
|
if "default_score" in self.model_fields_set:
|
||||||
|
self.score = self.default_score
|
||||||
|
if not isinstance(self.output, ParserDiffOutputs):
|
||||||
|
return self
|
||||||
|
for field_name, field_value in self.output.model_dump().items():
|
||||||
|
if field_name in self.output.model_fields_set and hasattr(self, field_name):
|
||||||
|
setattr(self, field_name, field_value)
|
||||||
|
return self
|
||||||
|
|
||||||
|
|
||||||
class StageFiles(BaseModel):
|
class StageFiles(BaseModel):
|
||||||
import_: List[str] = Field([], validation_alias="import")
|
import_: List[str] = Field([], validation_alias="import")
|
||||||
|
@ -150,7 +174,7 @@ class Parser(str, Enum):
|
||||||
ELF = "elf"
|
ELF = "elf"
|
||||||
|
|
||||||
|
|
||||||
class CaseBase(BaseModel):
|
class Case(BaseModel):
|
||||||
env: List[str] = []
|
env: List[str] = []
|
||||||
command: str = "" # Command to run
|
command: str = "" # Command to run
|
||||||
files: StageFiles = StageFiles()
|
files: StageFiles = StageFiles()
|
||||||
|
@ -160,17 +184,10 @@ class CaseBase(BaseModel):
|
||||||
True, validation_alias=AliasChoices("copy-in-cwd", "copy_in_cwd")
|
True, validation_alias=AliasChoices("copy-in-cwd", "copy_in_cwd")
|
||||||
)
|
)
|
||||||
limit: Limit = Limit()
|
limit: Limit = Limit()
|
||||||
|
|
||||||
|
|
||||||
class StageCase(CaseBase):
|
|
||||||
diff: ParserDiffFull = ParserDiffFull()
|
|
||||||
|
|
||||||
|
|
||||||
class DictCase(CaseBase):
|
|
||||||
diff: ParserDiff = ParserDiff()
|
diff: ParserDiff = ParserDiff()
|
||||||
|
|
||||||
|
|
||||||
class Stage(StageCase):
|
class Stage(Case):
|
||||||
name: str = "" # stage name
|
name: str = "" # stage name
|
||||||
skip: List[str] = []
|
skip: List[str] = []
|
||||||
|
|
||||||
|
@ -190,8 +207,9 @@ class Stage(StageCase):
|
||||||
validation_alias=AliasChoices("result-detail", "result_detail"),
|
validation_alias=AliasChoices("result-detail", "result_detail"),
|
||||||
)
|
)
|
||||||
file: ParserFile = ParserFile()
|
file: ParserFile = ParserFile()
|
||||||
|
# diff: ParserDiff = ParserDiff() # inherited from Case
|
||||||
|
|
||||||
cases: Dict[str, DictCase] = {}
|
cases: Dict[str, Case] = {}
|
||||||
|
|
||||||
model_config = ConfigDict(extra="allow")
|
model_config = ConfigDict(extra="allow")
|
||||||
|
|
||||||
|
|
|
@ -182,7 +182,7 @@ def fix_file(file_parser_config: task.ParserFile, file_parser: result.Parser) ->
|
||||||
|
|
||||||
|
|
||||||
def fix_diff(
|
def fix_diff(
|
||||||
_: task.ParserDiffFull,
|
_: task.ParserDiff,
|
||||||
diff_parser: result.Parser,
|
diff_parser: result.Parser,
|
||||||
task_stage: task.Stage,
|
task_stage: task.Stage,
|
||||||
executor: result.Executor,
|
executor: result.Executor,
|
||||||
|
@ -228,22 +228,24 @@ def fix_diff(
|
||||||
if cmd.proc_limit == executor.with_.default.proc_limit:
|
if cmd.proc_limit == executor.with_.default.proc_limit:
|
||||||
cmd.proc_limit = None
|
cmd.proc_limit = None
|
||||||
stage_cases.append(cmd)
|
stage_cases.append(cmd)
|
||||||
|
|
||||||
|
def get_diff_attribute(attribute_name: str) -> Any:
|
||||||
|
if case.diff and attribute_name in case.diff.model_fields_set:
|
||||||
|
return getattr(case.diff, attribute_name)
|
||||||
|
return getattr(task_stage.diff, attribute_name)
|
||||||
|
|
||||||
parser_case = result.DiffCasesConfig(
|
parser_case = result.DiffCasesConfig(
|
||||||
outputs=[
|
outputs=[
|
||||||
result.DiffOutputConfig(
|
result.DiffOutputConfig(
|
||||||
score=(
|
score=get_diff_attribute("score"),
|
||||||
case.diff.output.score
|
|
||||||
if "score" in case.diff.output.model_fields_set
|
|
||||||
else task_stage.diff.default_score
|
|
||||||
),
|
|
||||||
filename="stdout",
|
filename="stdout",
|
||||||
answer_path=stdout,
|
answer_path=stdout,
|
||||||
force_quit_on_diff=case.diff.output.force_quit,
|
compare_space=not get_diff_attribute("ignore_spaces"),
|
||||||
always_hide=case.diff.output.hide,
|
always_hide=get_diff_attribute("hide"),
|
||||||
compare_space=not case.diff.output.ignore_spaces,
|
force_quit_on_diff=get_diff_attribute("force_quit"),
|
||||||
max_diff_length=case.diff.output.max_length,
|
max_diff_length=get_diff_attribute("max_length"),
|
||||||
max_diff_lines=case.diff.output.max_lines,
|
max_diff_lines=get_diff_attribute("max_lines"),
|
||||||
hide_common_prefix=case.diff.output.hide_common_prefix,
|
hide_common_prefix=get_diff_attribute("hide_common_prefix"),
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
@ -251,18 +253,20 @@ def fix_diff(
|
||||||
for case_name in unspecified_cases:
|
for case_name in unspecified_cases:
|
||||||
cmd = result.OptionalCmd(
|
cmd = result.OptionalCmd(
|
||||||
stdin=result.LocalFile(src=str(base_dir / f"{case_name}.in")),
|
stdin=result.LocalFile(src=str(base_dir / f"{case_name}.in")),
|
||||||
cpu_limit=None,
|
|
||||||
clock_limit=None,
|
|
||||||
memory_limit=None,
|
|
||||||
proc_limit=None,
|
|
||||||
)
|
)
|
||||||
stage_cases.append(cmd)
|
stage_cases.append(cmd)
|
||||||
parser_case = result.DiffCasesConfig(
|
parser_case = result.DiffCasesConfig(
|
||||||
outputs=[
|
outputs=[
|
||||||
result.DiffOutputConfig(
|
result.DiffOutputConfig(
|
||||||
score=task_stage.diff.default_score,
|
score=task_stage.diff.score,
|
||||||
filename="stdout",
|
filename="stdout",
|
||||||
answer_path=str(base_dir / f"{case_name}.out"),
|
answer_path=str(base_dir / f"{case_name}.out"),
|
||||||
|
compare_space=not task_stage.diff.ignore_spaces,
|
||||||
|
always_hide=task_stage.diff.hide,
|
||||||
|
force_quit_on_diff=task_stage.diff.force_quit,
|
||||||
|
max_diff_length=task_stage.diff.max_length,
|
||||||
|
max_diff_lines=task_stage.diff.max_lines,
|
||||||
|
hide_common_prefix=task_stage.diff.hide_common_prefix,
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
@ -272,7 +276,7 @@ def fix_diff(
|
||||||
|
|
||||||
|
|
||||||
def get_unspecified_cases(
|
def get_unspecified_cases(
|
||||||
task_root: Path, task_path: Path, cases: Dict[str, task.DictCase]
|
task_root: Path, task_path: Path, cases: Dict[str, task.Case]
|
||||||
) -> List[str]:
|
) -> List[str]:
|
||||||
testcases = set()
|
testcases = set()
|
||||||
for testcases_path in (task_root / task_path).parent.glob("**/*.in"):
|
for testcases_path in (task_root / task_path).parent.glob("**/*.in"):
|
||||||
|
@ -302,7 +306,7 @@ def get_unspecified_cases(
|
||||||
|
|
||||||
|
|
||||||
def get_stdin_stdout(
|
def get_stdin_stdout(
|
||||||
task_root: Path, task_path: Path, case_name: str, case: task.DictCase
|
task_root: Path, task_path: Path, case_name: str, case: task.Case
|
||||||
) -> Tuple[result.Stdin, Optional[str]]:
|
) -> Tuple[result.Stdin, Optional[str]]:
|
||||||
case_stdout_name = case.out_ if case.out_ else f"{case_name}.out"
|
case_stdout_name = case.out_ if case.out_ else f"{case_name}.out"
|
||||||
stdin: result.Stdin = result.MemoryFile(content="")
|
stdin: result.Stdin = result.MemoryFile(content="")
|
||||||
|
|
|
@ -92,7 +92,7 @@ copy-in-cwd = false
|
||||||
files.import = [ "h7/build/ex2-asan" ]
|
files.import = [ "h7/build/ex2-asan" ]
|
||||||
limit.mem = "128m"
|
limit.mem = "128m"
|
||||||
|
|
||||||
diff.default-score = 10
|
diff.score = 10
|
||||||
|
|
||||||
parsers = [ "diff", "result-detail" ]
|
parsers = [ "diff", "result-detail" ]
|
||||||
result-detail.exit-status = true
|
result-detail.exit-status = true
|
||||||
|
@ -101,17 +101,17 @@ result-detail.stderr = true
|
||||||
# will be removed as long as the name is fixed
|
# will be removed as long as the name is fixed
|
||||||
case0.limit.cpu = "0.5s"
|
case0.limit.cpu = "0.5s"
|
||||||
case0.limit.mem = "5m"
|
case0.limit.mem = "5m"
|
||||||
case0.diff.output.ignore-spaces = true
|
case0.diff.ignore-spaces = true
|
||||||
#case0.limit.stdout = 8
|
#case0.limit.stdout = 8
|
||||||
#case0.command = "./h7/build/ex2"
|
#case0.command = "./h7/build/ex2"
|
||||||
case0.in = "case0.in"
|
case0.in = "case0.in"
|
||||||
|
|
||||||
case1.diff.output.score = 5
|
case1.diff.score = 5
|
||||||
case1.limit.cpu = "1s"
|
case1.limit.cpu = "1s"
|
||||||
case1.limit.mem = "5m"
|
case1.limit.mem = "5m"
|
||||||
case1.diff.output.ignore-spaces = true
|
case1.diff.ignore-spaces = true
|
||||||
#case1.limit.stdout = 8
|
#case1.limit.stdout = 8
|
||||||
#case1.command = "./h7/build/ex2"
|
#case1.command = "./h7/build/ex2"
|
||||||
case1.in = "case1.in"
|
case1.in = "case1.in"
|
||||||
|
|
||||||
case2.diff.output.hide = true
|
case2.diff.hide = true
|
||||||
|
|
|
@ -17,26 +17,26 @@ parsers = [ "diff", "result-detail" ]
|
||||||
result-detail.exit-status = true
|
result-detail.exit-status = true
|
||||||
result-detail.stderr = true
|
result-detail.stderr = true
|
||||||
|
|
||||||
diff.default-score = 100
|
diff.score = 100
|
||||||
|
|
||||||
case0.diff.output.score = 5
|
case0.diff.score = 5
|
||||||
case0.limit.cpu = "1s"
|
case0.limit.cpu = "1s"
|
||||||
case0.limit.mem = "2m"
|
case0.limit.mem = "2m"
|
||||||
case0.diff.output.ignore-spaces = true
|
case0.diff.ignore-spaces = true
|
||||||
case0.command = "./h7/build/ex2"
|
case0.command = "./h7/build/ex2"
|
||||||
case0.in = "case0.in"
|
case0.in = "case0.in"
|
||||||
|
|
||||||
case1.diff.output.score = 123214122421
|
case1.diff.score = 123214122421
|
||||||
case1.limit.cpu = "2s"
|
case1.limit.cpu = "2s"
|
||||||
case1.limit.mem = "4m"
|
case1.limit.mem = "4m"
|
||||||
case1.diff.output.ignore-spaces = true
|
case1.diff.ignore-spaces = true
|
||||||
case1.command = "./h7/build/ex2"
|
case1.command = "./h7/build/ex2"
|
||||||
|
|
||||||
case9.diff.output.score = 1232131
|
case9.diff.score = 1232131
|
||||||
case9.limit.mem = "10m"
|
case9.limit.mem = "10m"
|
||||||
|
|
||||||
case11.diff.output.score = 92321
|
case11.diff.score = 92321
|
||||||
|
|
||||||
case10.diff.output.score = 823131
|
case10.diff.score = 823131
|
||||||
|
|
||||||
case5.diff.output.score = 2590
|
case5.diff.score = 2590
|
||||||
|
|
Loading…
Reference in New Issue
Block a user