feat: cases data reading for diff
This commit is contained in:
		
							parent
							
								
									b1f5d4c953
								
							
						
					
					
						commit
						135c38f83b
					
				|  | @ -20,7 +20,12 @@ from joj3_config_generator.lib.task import ( | ||||||
| ) | ) | ||||||
| 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, | ||||||
|  | @ -87,7 +92,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 | ||||||
|  |  | ||||||
|  | @ -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 | ||||||
|  |  | ||||||
|  | @ -1,7 +1,8 @@ | ||||||
| from datetime import datetime | from datetime import datetime | ||||||
| from typing import Any, Dict, List, Optional, Type | from typing import Any, Dict, Optional, Type, List | ||||||
| 
 | 
 | ||||||
| from pydantic import BaseModel, Field, root_validator | from pydantic import BaseModel, Field, root_validator | ||||||
|  | from pydantic import BaseModel, Field, root_validator | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class ParserResultDetail(BaseModel): | class ParserResultDetail(BaseModel): | ||||||
|  | @ -21,6 +22,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 +47,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 +64,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): | ||||||
|  |  | ||||||
|  | @ -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, | ||||||
|  | @ -238,11 +238,6 @@ | ||||||
|                     { |                     { | ||||||
|                         "name": "result-status", |                         "name": "result-status", | ||||||
|                         "with": { |                         "with": { | ||||||
|                             "time": false, |  | ||||||
|                             "mem": false, |  | ||||||
|                             "stdout": false, |  | ||||||
|                             "stderr": true, |  | ||||||
|                             "exitstatus": true, |  | ||||||
|                             "score": 0, |                             "score": 0, | ||||||
|                             "comment": "", |                             "comment": "", | ||||||
|                             "showFiles": [ |                             "showFiles": [ | ||||||
|  | @ -386,11 +381,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": [ | ||||||
|  | @ -578,11 +568,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": [ | ||||||
|  | @ -720,11 +705,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": [ | ||||||
|  | @ -827,11 +807,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": [ | ||||||
|  | @ -928,11 +903,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": [ | ||||||
|  | @ -1029,11 +999,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": [ | ||||||
|  | @ -1049,9 +1014,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, | ||||||
|  |  | ||||||
|  | @ -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" ] | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user