feat: cases data reading for diff
This commit is contained in:
		
							parent
							
								
									3f8a6e9066
								
							
						
					
					
						commit
						ec8dc49f21
					
				|  | @ -1,5 +1,10 @@ | ||||||
| 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, | ||||||
|  | @ -16,7 +21,8 @@ from joj3_config_generator.models import ( | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| # FIXME: LLM generated convert function, only for demostration | # FIXME: LLM generated convert function, only for demostration | ||||||
| def convert(repo_conf: repo.Config, task_conf: task.Config) -> result.Config: | def convert(repo_conf: Repo, task_conf: Task) -> ResultConfig: | ||||||
|  |     print(task_conf) | ||||||
|     # Create the base ResultConf object |     # Create the base ResultConf object | ||||||
|     # FIXME: wrap things in functions |     # FIXME: wrap things in functions | ||||||
|     result_conf = ResultConfig( |     result_conf = ResultConfig( | ||||||
|  | @ -54,9 +60,12 @@ def convert(repo_conf: repo.Config, task_conf: task.Config) -> result.Config: | ||||||
|             and (task_stage.files is not None) |             and (task_stage.files is not None) | ||||||
|             else [] |             else [] | ||||||
|         ) |         ) | ||||||
|  |         # TODO: the global limit field | ||||||
|         executor_with_config = ExecutorWithConfig( |         executor_with_config = ExecutorWithConfig( | ||||||
|             default=Cmd( |             default=Cmd( | ||||||
|                 args=task_stage.command.split(), |                 args=( | ||||||
|  |                     task_stage.command.split() if task_stage.command is not None else [] | ||||||
|  |                 ), | ||||||
|                 copy_in={ |                 copy_in={ | ||||||
|                     file: CmdFile(src=f"/home/tt/.config/joj/{file}") |                     file: CmdFile(src=f"/home/tt/.config/joj/{file}") | ||||||
|                     for file in copy_in_files |                     for file in copy_in_files | ||||||
|  | @ -71,22 +80,28 @@ def convert(repo_conf: repo.Config, task_conf: task.Config) -> result.Config: | ||||||
|                 if file not in cached: |                 if file not in cached: | ||||||
|                     cached.append(file) |                     cached.append(file) | ||||||
|         conf_stage = Stage( |         conf_stage = Stage( | ||||||
|             name=task_stage.name, |             name=task_stage.name if task_stage.name is not None else "", | ||||||
|             # TODO: we may have cq in future |             # TODO: we may have cq in future | ||||||
|             group="joj" if "judge" in task_stage.name else None, |             group=( | ||||||
|  |                 "joj" | ||||||
|  |                 if (task_stage.name is not None) and ("judge" in task_stage.name) | ||||||
|  |                 else None | ||||||
|  |             ), | ||||||
|             executor=ExecutorConfig( |             executor=ExecutorConfig( | ||||||
|                 name="sandbox", |                 name="sandbox", | ||||||
|                 with_=executor_with_config, |                 with_=executor_with_config, | ||||||
|             ), |             ), | ||||||
|             parsers=[ |             parsers=( | ||||||
|                 ParserConfig(name=parser, with_={}) for parser in task_stage.parsers |                 [ParserConfig(name=parser, with_={}) for parser in task_stage.parsers] | ||||||
|             ], |                 if task_stage.parsers is not None | ||||||
|  |                 else [] | ||||||
|  |             ), | ||||||
|         ) |         ) | ||||||
|         conf_stage = fix_result_detail(task_stage, conf_stage) |         conf_stage = fix_result_detail(task_stage, conf_stage) | ||||||
|         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,12 +1,17 @@ | ||||||
|  | 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 | ||||||
|  |     if task_stage.parsers is not None: | ||||||
|         for parser in task_stage.parsers: |         for parser in task_stage.parsers: | ||||||
|             if parser in keyword_parser: |             if parser in keyword_parser: | ||||||
|             keyword_parser_ = next(p for p in conf_stage.parsers if p.name == parser) |                 keyword_parser_ = next( | ||||||
|  |                     p for p in conf_stage.parsers if p.name == parser | ||||||
|  |                 ) | ||||||
|                 keyword_weight = [] |                 keyword_weight = [] | ||||||
|                 if getattr(task_stage, parser, None) is not None: |                 if getattr(task_stage, parser, None) is not None: | ||||||
|                     for _, keyword in enumerate(getattr(task_stage, parser).keyword): |                     for _, keyword in enumerate(getattr(task_stage, parser).keyword): | ||||||
|  | @ -21,7 +26,7 @@ def fix_keyword(task_stage: TaskStage, conf_stage: ResultStage) -> ResultStage: | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 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,9 +62,12 @@ 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 | ||||||
|  |     if task_stage.parsers is not None: | ||||||
|         for parser in task_stage.parsers: |         for parser in task_stage.parsers: | ||||||
|             if parser in comment_parser: |             if parser in comment_parser: | ||||||
|             comment_parser_ = next(p for p in conf_stage.parsers if p.name == 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: |                 if getattr(task_stage, parser.replace("-", "_"), None) is not None: | ||||||
|                     comment_parser_.with_.update( |                     comment_parser_.with_.update( | ||||||
|                         getattr(task_stage, parser.replace("-", "_")) |                         getattr(task_stage, parser.replace("-", "_")) | ||||||
|  | @ -67,3 +75,8 @@ def fix_comment(task_stage: TaskStage, conf_stage: ResultStage) -> ResultStage: | ||||||
|             else: |             else: | ||||||
|                 continue |                 continue | ||||||
|     return conf_stage |     return conf_stage | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def fix_diff(task_stage: TaskStage, conf_stage: ResultStage) -> ResultStage: | ||||||
|  | 
 | ||||||
|  |     return conf_stage | ||||||
|  |  | ||||||
|  | @ -8,9 +8,9 @@ import typer | ||||||
| import yaml | import yaml | ||||||
| 
 | 
 | ||||||
| from joj3_config_generator.convert import convert as convert_conf | from joj3_config_generator.convert import convert as convert_conf | ||||||
| from joj3_config_generator.convert import convert_joj1 as convert_joj1_conf | 
 | ||||||
| from joj3_config_generator.lib.task import remove_nulls | # from joj3_config_generator.lib.task import get_processed_task_obj | ||||||
| from joj3_config_generator.models import joj1, repo, result, task | from joj3_config_generator.models import Repo, Task | ||||||
| from joj3_config_generator.utils.logger import logger | from joj3_config_generator.utils.logger import logger | ||||||
| 
 | 
 | ||||||
| app = typer.Typer(add_completion=False) | app = typer.Typer(add_completion=False) | ||||||
|  |  | ||||||
|  | @ -1,8 +1,7 @@ | ||||||
| from datetime import datetime | from datetime import datetime | ||||||
| from typing import Any, Dict, List, Optional, Type | from typing import Any, Dict, Optional, Type | ||||||
| 
 | 
 | ||||||
| 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): | ||||||
|  | @ -22,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([], alias="import") |     import_: Optional[list[str]] = Field([], alias="import") | ||||||
|     export: Optional[list[str]] = [] |     export: Optional[list[str]] = [] | ||||||
|  | @ -35,11 +45,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 +62,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): | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user