feat: cases data reading for diff

This commit is contained in:
李衍志523370910113 2024-10-26 13:49:07 +08:00
parent 4a32332781
commit 0f357c5d9e
5 changed files with 80 additions and 72 deletions

View File

@ -2,7 +2,12 @@ from typing import List
from joj3_config_generator.models import joj1, repo, result, task from joj3_config_generator.models import joj1, repo, result, task
from joj3_config_generator.lib.repo import getHealthcheckConfig, getTeapotConfig from joj3_config_generator.lib.repo import getHealthcheckConfig, getTeapotConfig
from joj3_config_generator.lib.task import fix_comment, fix_keyword, fix_result_detail from joj3_config_generator.lib.task import (
fix_comment,
fix_diff,
fix_keyword,
fix_result_detail,
)
from joj3_config_generator.models import ( from joj3_config_generator.models import (
Cmd, Cmd,
CmdFile, CmdFile,
@ -67,7 +72,7 @@ def convert(repo_conf: repo.Config, task_conf: task.Config) -> result.Config:
conf_stage = fix_comment(task_stage, conf_stage) conf_stage = fix_comment(task_stage, conf_stage)
conf_stage = fix_keyword(task_stage, conf_stage) conf_stage = fix_keyword(task_stage, conf_stage)
# TODO: fix diff parser here # TODO: fix diff parser here
conf_stage = fix_diff(task_stage, conf_stage)
result_conf.stage.stages.append(conf_stage) result_conf.stage.stages.append(conf_stage)
return result_conf return result_conf

View File

@ -1,27 +1,32 @@
import rtoml
from joj3_config_generator.models.result import Stage as ResultStage from joj3_config_generator.models.result import Stage as ResultStage
from joj3_config_generator.models.task import Stage as TaskStage from joj3_config_generator.models.task import Stage as TaskStage
def fix_keyword(task_stage: TaskStage, conf_stage: ResultStage) -> ResultStage: def fix_keyword(task_stage: TaskStage, conf_stage: ResultStage) -> ResultStage:
keyword_parser = ["clangtidy", "keyword", "cppcheck"] # TODO: may add cpplint keyword_parser = ["clangtidy", "keyword", "cppcheck"] # TODO: may add cpplint
for parser in task_stage.parsers: if task_stage.parsers is not None:
if parser in keyword_parser: for parser in task_stage.parsers:
keyword_parser_ = next(p for p in conf_stage.parsers if p.name == parser) if parser in keyword_parser:
keyword_weight = [] keyword_parser_ = next(
if getattr(task_stage, parser, None) is not None: p for p in conf_stage.parsers if p.name == parser
for _, keyword in enumerate(getattr(task_stage, parser).keyword): )
keyword_weight.append({"keyword": [keyword], "score": 0}) keyword_weight = []
for idx, weight in enumerate(getattr(task_stage, parser).weight): if getattr(task_stage, parser, None) is not None:
keyword_weight[idx]["score"] = weight for _, keyword in enumerate(getattr(task_stage, parser).keyword):
keyword_weight.append({"keyword": [keyword], "score": 0})
for idx, weight in enumerate(getattr(task_stage, parser).weight):
keyword_weight[idx]["score"] = weight
keyword_parser_.with_.update({"match": keyword_weight}) keyword_parser_.with_.update({"match": keyword_weight})
else: else:
continue continue
return conf_stage return conf_stage
def fix_result_detail(task_stage: TaskStage, conf_stage: ResultStage) -> ResultStage: def fix_result_detail(task_stage: TaskStage, conf_stage: ResultStage) -> ResultStage:
if "result-detail" in task_stage.parsers: if (task_stage.parsers is not None) and ("result-detail" in task_stage.parsers):
result_detail_parser = next( result_detail_parser = next(
p for p in conf_stage.parsers if p.name == "result-detail" p for p in conf_stage.parsers if p.name == "result-detail"
) )
@ -57,13 +62,21 @@ def fix_comment(task_stage: TaskStage, conf_stage: ResultStage) -> ResultStage:
"result-status", "result-status",
"cpplint", "cpplint",
] # FIXME: determine where cpplint should be ] # FIXME: determine where cpplint should be
for parser in task_stage.parsers: if task_stage.parsers is not None:
if parser in comment_parser: for parser in task_stage.parsers:
comment_parser_ = next(p for p in conf_stage.parsers if p.name == parser) if parser in comment_parser:
if getattr(task_stage, parser.replace("-", "_"), None) is not None: comment_parser_ = next(
comment_parser_.with_.update( p for p in conf_stage.parsers if p.name == parser
getattr(task_stage, parser.replace("-", "_"))
) )
else: if getattr(task_stage, parser.replace("-", "_"), None) is not None:
continue comment_parser_.with_.update(
getattr(task_stage, parser.replace("-", "_"))
)
else:
continue
return conf_stage
def fix_diff(task_stage: TaskStage, conf_stage: ResultStage) -> ResultStage:
return conf_stage return conf_stage

View File

@ -1,7 +1,7 @@
from datetime import datetime from datetime import datetime
from typing import List, Optional from typing import Any, Dict, Optional, Type, List
from pydantic import BaseModel, Field from pydantic import BaseModel, Field, root_validator
class ParserResultDetail(BaseModel): class ParserResultDetail(BaseModel):
@ -21,6 +21,17 @@ class ParserKeyword(BaseModel):
weight: Optional[list[int]] = [] weight: Optional[list[int]] = []
class Outputs(BaseModel):
score: Optional[int] = 0
ignorespaces: Optional[bool] = False
hide: Optional[bool] = False
forcequit: Optional[bool] = True
class ParserDiff(BaseModel):
output: Optional[Outputs] = Outputs()
class Files(BaseModel): class Files(BaseModel):
import_: Optional[List[str]] = Field(serialization_alias="import", validation_alias="import") import_: Optional[List[str]] = Field(serialization_alias="import", validation_alias="import")
export: Optional[List[str]] export: Optional[List[str]]
@ -35,11 +46,11 @@ class Limit(BaseModel):
class Stage(BaseModel): class Stage(BaseModel):
name: str # Stage name name: Optional[str] = None # Stage name
command: str # Command to run command: Optional[str] = None # Command to run
files: Optional[Files] = None files: Optional[Files] = None
score: Optional[int] = 0 score: Optional[int] = 0
parsers: list[str] # list of parsers parsers: Optional[list[str]] = [] # list of parsers
limit: Optional[Limit] = None limit: Optional[Limit] = None
dummy: Optional[ParserDummy] = ParserDummy() dummy: Optional[ParserDummy] = ParserDummy()
result_status: Optional[ParserDummy] = Field(ParserDummy(), alias="result-status") result_status: Optional[ParserDummy] = Field(ParserDummy(), alias="result-status")
@ -52,6 +63,20 @@ class Stage(BaseModel):
result_detail: Optional[ParserResultDetail] = Field( result_detail: Optional[ParserResultDetail] = Field(
ParserResultDetail(), alias="result-detail" ParserResultDetail(), alias="result-detail"
) )
skip: Optional[list[str]] = []
diff: Optional[ParserDiff] = ParserDiff()
cases: Optional[Dict[str, "Stage"]] = {}
class Config:
extra = "allow"
@root_validator(pre=True)
def gather_cases(cls: Type["Stage"], values: Dict[str, Any]) -> Dict[str, Any]:
cases = {k: v for k, v in values.items() if k.startswith("case")}
for key in cases:
values.pop(key)
values["cases"] = {k: Stage(**v) for k, v in cases.items()}
return values
class Release(BaseModel): class Release(BaseModel):

View File

@ -1,6 +1,6 @@
{ {
"name": "Homework 1 exercise 2", "name": "h4 ex1",
"logPath": "Homework-1-exercise-2.log", "logPath": "h4-ex1.log",
"expireUnixTimestamp": 1728748740, "expireUnixTimestamp": 1728748740,
"stage": { "stage": {
"sandboxExecServer": "172.17.0.1:5051", "sandboxExecServer": "172.17.0.1:5051",
@ -18,7 +18,7 @@
"/<function", "/<function",
"get_temp_directory", "get_temp_directory",
"at", "at",
"0x7fd3bed4f1a0>/repo-health-checker", "0x7f932c5e31a0>/repo-health-checker",
"-root=.", "-root=.",
"-repoSize=50.5", "-repoSize=50.5",
"-meta=main.py", "-meta=main.py",
@ -71,8 +71,8 @@
"cpuRateLimit": 0, "cpuRateLimit": 0,
"cpuSetLimit": "", "cpuSetLimit": "",
"copyIn": { "copyIn": {
"//tmp/repo-checker-9z61g608/repo-health-checker": { "//tmp/repo-checker-tw0902sa/repo-health-checker": {
"src": "//tmp/repo-checker-19d98f6u/repo-health-checker", "src": "//tmp/repo-checker-4sy3g0ro/repo-health-checker",
"content": null, "content": null,
"fileId": null, "fileId": null,
"name": null, "name": null,
@ -234,11 +234,6 @@
{ {
"name": "result-detail", "name": "result-detail",
"with": { "with": {
"time": false,
"mem": false,
"stdout": false,
"stderr": true,
"exitstatus": true,
"score": 0, "score": 0,
"comment": "", "comment": "",
"showFiles": [ "showFiles": [
@ -379,11 +374,6 @@
{ {
"name": "result-detail", "name": "result-detail",
"with": { "with": {
"time": false,
"mem": false,
"stdout": false,
"stderr": true,
"exitstatus": false,
"score": 0, "score": 0,
"comment": "", "comment": "",
"showFiles": [ "showFiles": [
@ -571,11 +561,6 @@
{ {
"name": "result-detail", "name": "result-detail",
"with": { "with": {
"time": false,
"mem": false,
"stdout": true,
"stderr": false,
"exitstatus": true,
"score": 0, "score": 0,
"comment": "", "comment": "",
"showFiles": [ "showFiles": [
@ -713,11 +698,6 @@
{ {
"name": "result-detail", "name": "result-detail",
"with": { "with": {
"time": false,
"mem": false,
"stdout": false,
"stderr": true,
"exitstatus": true,
"score": 0, "score": 0,
"comment": "", "comment": "",
"showFiles": [ "showFiles": [
@ -820,11 +800,6 @@
{ {
"name": "result-detail", "name": "result-detail",
"with": { "with": {
"time": false,
"mem": false,
"stdout": true,
"stderr": false,
"exitstatus": true,
"score": 0, "score": 0,
"comment": "", "comment": "",
"showFiles": [ "showFiles": [
@ -921,11 +896,6 @@
{ {
"name": "result-detail", "name": "result-detail",
"with": { "with": {
"time": true,
"mem": true,
"stdout": false,
"stderr": true,
"exitstatus": true,
"score": 0, "score": 0,
"comment": "", "comment": "",
"showFiles": [ "showFiles": [
@ -1022,11 +992,6 @@
{ {
"name": "result-detail", "name": "result-detail",
"with": { "with": {
"time": true,
"mem": true,
"stdout": false,
"stderr": true,
"exitstatus": true,
"score": 0, "score": 0,
"comment": "", "comment": "",
"showFiles": [ "showFiles": [
@ -1042,9 +1007,9 @@
] ]
}, },
"teapot": { "teapot": {
"logPath": "Homework-1-exercise-2-joint-teapot-debug.log", "logPath": "h4-ex1-joint-teapot-debug.log",
"scoreboardPath": "Homework-1-exercise-2-scoreboard.csv", "scoreboardPath": "h4-ex1-scoreboard.csv",
"failedTablePath": "Homework-1-exercise-2-failed-table.md", "failedTablePath": "h4-ex1-failed-table.md",
"gradingRepoName": "engr151-joj", "gradingRepoName": "engr151-joj",
"skipIssue": false, "skipIssue": false,
"skipScoreboard": false, "skipScoreboard": false,

View File

@ -1,5 +1,5 @@
# general task configuration # general task configuration
task="Homework 1 exercise 2" # task name task="h4 ex1" # task name
release.deadline = 2024-10-12 23:59:00+08:00 release.deadline = 2024-10-12 23:59:00+08:00
release.stages = [ "compile" ] release.stages = [ "compile" ]