diff --git a/joj3_config_generator/convert.py b/joj3_config_generator/convert.py index 98ea255..ca222b0 100644 --- a/joj3_config_generator/convert.py +++ b/joj3_config_generator/convert.py @@ -4,6 +4,8 @@ from joj3_config_generator.lib.task import ( fix_diff, fix_keyword, fix_result_detail, + get_conf_stage, + get_executorWithConfig, ) from joj3_config_generator.models import ( Cmd, @@ -22,7 +24,6 @@ from joj3_config_generator.models import ( def convert(repo_conf: Repo, task_conf: Task) -> ResultConfig: # Create the base ResultConf object - # FIXME: wrap things in functions result_conf = ResultConfig( name=task_conf.task, # TODO: specify the exact folder difference @@ -39,62 +40,11 @@ def convert(repo_conf: Repo, task_conf: Task) -> ResultConfig: # Construct healthcheck stage healthcheck_stage = getHealthcheckConfig(repo_conf, task_conf) result_conf.stage.stages.append(healthcheck_stage) - cached = [] + cached: list[str] = [] # Convert each stage in the task configuration for task_stage in task_conf.stages: - file_import = ( - task_stage.files.import_ - if hasattr(task_stage, "files") - and hasattr(task_stage.files, "import_") - and (task_stage.files is not None) - and (task_stage.files.import_ is not None) - else [] - ) - copy_in_files = [file for file in file_import if (file not in cached)] - file_export = ( - task_stage.files.export - if hasattr(task_stage, "files") - and hasattr(task_stage.files, "export") - and (task_stage.files is not None) - else [] - ) - # TODO: the global limit field - executor_with_config = ExecutorWithConfig( - default=Cmd( - args=( - task_stage.command.split() if task_stage.command is not None else [] - ), - copy_in={ - file: CmdFile(src=f"/home/tt/.config/joj/{file}") - for file in copy_in_files - }, - copy_in_cached={file: file for file in copy_in_files}, - copy_out_cached=file_export if file_export is not None else [], - ), - cases=[], # You can add cases if needed - ) - if file_export is not None: - for file in file_export: - if file not in cached: - cached.append(file) - conf_stage = Stage( - name=task_stage.name if task_stage.name is not None else "", - # TODO: we may have cq in future - group=( - "joj" - if (task_stage.name is not None) and ("judge" in task_stage.name) - else None - ), - executor=ExecutorConfig( - name="sandbox", - with_=executor_with_config, - ), - parsers=( - [ParserConfig(name=parser, with_={}) for parser in task_stage.parsers] - if task_stage.parsers is not None - else [] - ), - ) + executor_with_config, cached = get_executorWithConfig(task_stage, cached) + conf_stage = get_conf_stage(task_stage, executor_with_config) conf_stage = fix_result_detail(task_stage, conf_stage) conf_stage = fix_comment(task_stage, conf_stage) conf_stage = fix_keyword(task_stage, conf_stage) diff --git a/joj3_config_generator/lib/task.py b/joj3_config_generator/lib/task.py index 35aa92b..6ff56d7 100644 --- a/joj3_config_generator/lib/task.py +++ b/joj3_config_generator/lib/task.py @@ -1,10 +1,112 @@ +from typing import Tuple + import rtoml -from joj3_config_generator.models.result import CmdFile, OptionalCmd +from joj3_config_generator.models import ( + ExecutorConfig, + ExecutorWithConfig, + ParserConfig, +) +from joj3_config_generator.models.result import Cmd, CmdFile, OptionalCmd from joj3_config_generator.models.result import Stage as ResultStage from joj3_config_generator.models.task import Stage as TaskStage +def get_conf_stage( + task_stage: TaskStage, executor_with_config: ExecutorWithConfig +) -> ResultStage: + conf_stage = ResultStage( + name=task_stage.name if task_stage.name is not None else "", + # TODO: we may have cq in future + group=( + "joj" + if (task_stage.name is not None) and ("judge" in task_stage.name) + else None + ), + executor=ExecutorConfig( + name="sandbox", + with_=executor_with_config, + ), + parsers=( + [ParserConfig(name=parser, with_={}) for parser in task_stage.parsers] + if task_stage.parsers is not None + else [] + ), + ) + return conf_stage + + +def get_executorWithConfig( + task_stage: TaskStage, cached: list[str] +) -> Tuple[ExecutorWithConfig, list[str]]: + file_import = ( + task_stage.files.import_ + if hasattr(task_stage, "files") + and hasattr(task_stage.files, "import_") + and (task_stage.files is not None) + and (task_stage.files.import_ is not None) + else [] + ) + copy_in_files = [file for file in file_import if (file not in cached)] + file_export = ( + task_stage.files.export + if hasattr(task_stage, "files") + and hasattr(task_stage.files, "export") + and (task_stage.files is not None) + else [] + ) + executor_with_config = ExecutorWithConfig( + default=Cmd( + args=(task_stage.command.split() if task_stage.command is not None else []), + copy_in={ + file: CmdFile(src=f"/home/tt/.config/joj/{file}") + for file in copy_in_files + }, + copy_in_cached={file: file for file in copy_in_files}, + copy_out_cached=file_export if file_export is not None else [], + cpu_limit=( + task_stage.limit.cpu * 1_000_000_000 + if task_stage.limit is not None and task_stage.limit.cpu is not None + else 4 * 1_000_000_000 + ), + clock_limit=( + 2 * task_stage.limit.cpu * 1_000_000_000 + if task_stage.limit is not None and task_stage.limit.cpu is not None + else 8 * 1_000_000_000 + ), + memory_limit=( + task_stage.limit.mem * 1_024 * 1_024 + if task_stage.limit is not None and task_stage.limit.mem is not None + else 4 * 1_024 * 1_024 + ), + stderr=CmdFile( + name="stderr", + max=( + task_stage.limit.stderr * 1_000_000_000 + if task_stage.limit is not None + and task_stage.limit.stderr is not None + else 4 * 1_024 * 1_024 + ), + ), + stdout=CmdFile( + name="stdout", + max=( + task_stage.limit.stdout * 1_000_000_000 + if task_stage.limit is not None + and task_stage.limit.stdout is not None + else 4 * 1_024 * 1_024 + ), + ), + ), + cases=[], # You can add cases if needed + ) + if file_export is not None: + for file in file_export: + if file not in cached: + cached.append(file) + return (executor_with_config, cached) + + def fix_keyword(task_stage: TaskStage, conf_stage: ResultStage) -> ResultStage: keyword_parser = ["clangtidy", "keyword", "cppcheck"] # TODO: may add cpplint if task_stage.parsers is not None: