WIP: dev #6
|
@ -2,7 +2,12 @@ from typing import List
|
|||
|
||||
from joj3_config_generator.models import joj1, repo, result, task
|
||||
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 (
|
||||
Cmd,
|
||||
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_keyword(task_stage, conf_stage)
|
||||
# TODO: fix diff parser here
|
||||
|
||||
conf_stage = fix_diff(task_stage, conf_stage)
|
||||
result_conf.stage.stages.append(conf_stage)
|
||||
|
||||
return result_conf
|
||||
|
|
|
@ -1,27 +1,32 @@
|
|||
import rtoml
|
||||
|
||||
from joj3_config_generator.models.result import Stage as ResultStage
|
||||
from joj3_config_generator.models.task import Stage as TaskStage
|
||||
|
||||
|
||||
def fix_keyword(task_stage: TaskStage, conf_stage: ResultStage) -> ResultStage:
|
||||
keyword_parser = ["clangtidy", "keyword", "cppcheck"] # TODO: may add cpplint
|
||||
for parser in task_stage.parsers:
|
||||
if parser in keyword_parser:
|
||||
keyword_parser_ = next(p for p in conf_stage.parsers if p.name == parser)
|
||||
keyword_weight = []
|
||||
if getattr(task_stage, parser, None) is not None:
|
||||
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
|
||||
if task_stage.parsers is not None:
|
||||
for parser in task_stage.parsers:
|
||||
|
||||
if parser in keyword_parser:
|
||||
keyword_parser_ = next(
|
||||
p for p in conf_stage.parsers if p.name == parser
|
||||
)
|
||||
keyword_weight = []
|
||||
if getattr(task_stage, parser, None) is not None:
|
||||
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})
|
||||
else:
|
||||
continue
|
||||
keyword_parser_.with_.update({"match": keyword_weight})
|
||||
else:
|
||||
continue
|
||||
return conf_stage
|
||||
|
||||
|
||||
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(
|
||||
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",
|
||||
"cpplint",
|
||||
] # FIXME: determine where cpplint should be
|
||||
for parser in task_stage.parsers:
|
||||
if parser in comment_parser:
|
||||
comment_parser_ = next(p for p in conf_stage.parsers if p.name == parser)
|
||||
if getattr(task_stage, parser.replace("-", "_"), None) is not None:
|
||||
comment_parser_.with_.update(
|
||||
getattr(task_stage, parser.replace("-", "_"))
|
||||
if task_stage.parsers is not None:
|
||||
for parser in task_stage.parsers:
|
||||
if parser in comment_parser:
|
||||
comment_parser_ = next(
|
||||
p for p in conf_stage.parsers if p.name == parser
|
||||
)
|
||||
else:
|
||||
continue
|
||||
if getattr(task_stage, parser.replace("-", "_"), None) is not None:
|
||||
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
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
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):
|
||||
|
@ -21,6 +21,17 @@ class ParserKeyword(BaseModel):
|
|||
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):
|
||||
import_: Optional[List[str]] = Field(serialization_alias="import", validation_alias="import")
|
||||
export: Optional[List[str]]
|
||||
|
@ -35,11 +46,11 @@ class Limit(BaseModel):
|
|||
|
||||
|
||||
class Stage(BaseModel):
|
||||
name: str # Stage name
|
||||
command: str # Command to run
|
||||
name: Optional[str] = None # Stage name
|
||||
command: Optional[str] = None # Command to run
|
||||
files: Optional[Files] = None
|
||||
score: Optional[int] = 0
|
||||
parsers: list[str] # list of parsers
|
||||
parsers: Optional[list[str]] = [] # list of parsers
|
||||
limit: Optional[Limit] = None
|
||||
dummy: Optional[ParserDummy] = ParserDummy()
|
||||
result_status: Optional[ParserDummy] = Field(ParserDummy(), alias="result-status")
|
||||
|
@ -52,6 +63,20 @@ class Stage(BaseModel):
|
|||
result_detail: Optional[ParserResultDetail] = Field(
|
||||
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):
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "Homework 1 exercise 2",
|
||||
"logPath": "Homework-1-exercise-2.log",
|
||||
"name": "h4 ex1",
|
||||
"logPath": "h4-ex1.log",
|
||||
"expireUnixTimestamp": 1728748740,
|
||||
"stage": {
|
||||
"sandboxExecServer": "172.17.0.1:5051",
|
||||
|
@ -18,7 +18,7 @@
|
|||
"/<function",
|
||||
"get_temp_directory",
|
||||
"at",
|
||||
"0x7fd3bed4f1a0>/repo-health-checker",
|
||||
"0x7f932c5e31a0>/repo-health-checker",
|
||||
"-root=.",
|
||||
"-repoSize=50.5",
|
||||
"-meta=main.py",
|
||||
|
@ -71,8 +71,8 @@
|
|||
"cpuRateLimit": 0,
|
||||
"cpuSetLimit": "",
|
||||
"copyIn": {
|
||||
"//tmp/repo-checker-9z61g608/repo-health-checker": {
|
||||
"src": "//tmp/repo-checker-19d98f6u/repo-health-checker",
|
||||
"//tmp/repo-checker-tw0902sa/repo-health-checker": {
|
||||
"src": "//tmp/repo-checker-4sy3g0ro/repo-health-checker",
|
||||
"content": null,
|
||||
"fileId": null,
|
||||
"name": null,
|
||||
|
@ -234,11 +234,6 @@
|
|||
{
|
||||
"name": "result-detail",
|
||||
"with": {
|
||||
"time": false,
|
||||
"mem": false,
|
||||
"stdout": false,
|
||||
"stderr": true,
|
||||
"exitstatus": true,
|
||||
"score": 0,
|
||||
"comment": "",
|
||||
"showFiles": [
|
||||
|
@ -379,11 +374,6 @@
|
|||
{
|
||||
"name": "result-detail",
|
||||
"with": {
|
||||
"time": false,
|
||||
"mem": false,
|
||||
"stdout": false,
|
||||
"stderr": true,
|
||||
"exitstatus": false,
|
||||
"score": 0,
|
||||
"comment": "",
|
||||
"showFiles": [
|
||||
|
@ -571,11 +561,6 @@
|
|||
{
|
||||
"name": "result-detail",
|
||||
"with": {
|
||||
"time": false,
|
||||
"mem": false,
|
||||
"stdout": true,
|
||||
"stderr": false,
|
||||
"exitstatus": true,
|
||||
"score": 0,
|
||||
"comment": "",
|
||||
"showFiles": [
|
||||
|
@ -713,11 +698,6 @@
|
|||
{
|
||||
"name": "result-detail",
|
||||
"with": {
|
||||
"time": false,
|
||||
"mem": false,
|
||||
"stdout": false,
|
||||
"stderr": true,
|
||||
"exitstatus": true,
|
||||
"score": 0,
|
||||
"comment": "",
|
||||
"showFiles": [
|
||||
|
@ -820,11 +800,6 @@
|
|||
{
|
||||
"name": "result-detail",
|
||||
"with": {
|
||||
"time": false,
|
||||
"mem": false,
|
||||
"stdout": true,
|
||||
"stderr": false,
|
||||
"exitstatus": true,
|
||||
"score": 0,
|
||||
"comment": "",
|
||||
"showFiles": [
|
||||
|
@ -921,11 +896,6 @@
|
|||
{
|
||||
"name": "result-detail",
|
||||
"with": {
|
||||
"time": true,
|
||||
"mem": true,
|
||||
"stdout": false,
|
||||
"stderr": true,
|
||||
"exitstatus": true,
|
||||
"score": 0,
|
||||
"comment": "",
|
||||
"showFiles": [
|
||||
|
@ -1022,11 +992,6 @@
|
|||
{
|
||||
"name": "result-detail",
|
||||
"with": {
|
||||
"time": true,
|
||||
"mem": true,
|
||||
"stdout": false,
|
||||
"stderr": true,
|
||||
"exitstatus": true,
|
||||
"score": 0,
|
||||
"comment": "",
|
||||
"showFiles": [
|
||||
|
@ -1042,9 +1007,9 @@
|
|||
]
|
||||
},
|
||||
"teapot": {
|
||||
"logPath": "Homework-1-exercise-2-joint-teapot-debug.log",
|
||||
"scoreboardPath": "Homework-1-exercise-2-scoreboard.csv",
|
||||
"failedTablePath": "Homework-1-exercise-2-failed-table.md",
|
||||
"logPath": "h4-ex1-joint-teapot-debug.log",
|
||||
"scoreboardPath": "h4-ex1-scoreboard.csv",
|
||||
"failedTablePath": "h4-ex1-failed-table.md",
|
||||
"gradingRepoName": "engr151-joj",
|
||||
"skipIssue": false,
|
||||
"skipScoreboard": false,
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
# general task configuration
|
||||
张泊明518370910136
commented
make this basic test as simple as possible, and create new test cases for each kind of stage make this basic test as simple as possible, and create new test cases for each kind of stage
|
||||
task="Homework 1 exercise 2" # task name
|
||||
task="h4 ex1" # task name
|
||||
|
||||
release.deadline = 2024-10-12 23:59:00+08:00
|
||||
release.stages = [ "compile" ]
|
||||
|
|
Loading…
Reference in New Issue
Block a user
Why it can be in different types as the type annotation says it is
result.Config
?Sorry about this, I was still debugging on it last time I was on it. Will fix that.