diff --git a/joj3_config_generator/transformers/task.py b/joj3_config_generator/transformers/task.py index 26adb53..25d16fd 100644 --- a/joj3_config_generator/transformers/task.py +++ b/joj3_config_generator/transformers/task.py @@ -2,7 +2,9 @@ import re import shlex from functools import partial from pathlib import Path, PurePosixPath -from typing import Any, Callable, Dict, List, Optional, Tuple, Union +from typing import Any, Callable, Dict, List, Optional, Set, Tuple, Union + +from natsort import natsorted from joj3_config_generator.models import result, task from joj3_config_generator.models.common import StrictBaseModel @@ -216,10 +218,12 @@ def fix_diff( task_root, task_path, case_base_dir, task_stage.cases ) # cases specified in toml config but not skipped - specified_cases = [(case, task_stage.cases[case]) for case in task_stage.cases] + specified_cases = task_stage.cases stage_cases = [] parser_cases = [] - for case_name, case in specified_cases: + collected_cases = [] + for case_name in specified_cases: + case = task_stage.cases[case_name] stdin, stdout = get_stdin_stdout( task_root, task_path, case_base_dir, case_name, case ) @@ -248,7 +252,6 @@ def fix_diff( cmd.memory_limit = None if cmd.proc_limit == executor.with_.default.proc_limit: cmd.proc_limit = None - stage_cases.append(cmd) def get_diff_attribute(attribute_name: str) -> Any: if case.diff and attribute_name in case.diff.model_fields_set: @@ -270,12 +273,11 @@ def fix_diff( ) ] ) - parser_cases.append(parser_case) + collected_cases.append((case_name, cmd, parser_case)) for case_name in unspecified_cases: cmd = result.OptionalCmd( stdin=result.LocalFile(src=str(base_dir / f"{case_name}.in")), ) - stage_cases.append(cmd) parser_case = result.DiffCasesConfig( outputs=[ result.DiffOutputConfig( @@ -291,14 +293,17 @@ def fix_diff( ) ] ) - parser_cases.append(parser_case) + collected_cases.append((case_name, cmd, parser_case)) + sorted_collected_cases = natsorted(collected_cases, key=lambda x: x[0]) + stage_cases = [x[1] for x in sorted_collected_cases] + parser_cases = [x[2] for x in sorted_collected_cases] executor.with_.cases = stage_cases diff_parser.with_ = result.DiffConfig(name="diff", cases=parser_cases) def get_unspecified_cases( task_root: Path, task_path: Path, case_base_dir: Path, cases: Dict[str, task.Case] -) -> List[str]: +) -> Set[str]: testcases = set() for testcases_path in ((task_root / task_path).parent / case_base_dir).glob( "**/*.in" @@ -317,14 +322,8 @@ def get_unspecified_cases( ) ).removesuffix(".in") ) - return sorted( - testcases.difference( - [ - casei - for casei in testcases - if any(casei.endswith(casej) for casej in cases) - ] - ) + return testcases.difference( + casei for casei in testcases if any(casei.endswith(casej) for casej in cases) ) diff --git a/pdm.lock b/pdm.lock index cd62142..d87b46c 100644 --- a/pdm.lock +++ b/pdm.lock @@ -5,7 +5,7 @@ groups = ["default", "dev", "lint", "test"] strategy = ["inherit_metadata"] lock_version = "4.5.0" -content_hash = "sha256:0d342f3006bcf50ba9bf77ee49f2b03705b001e9e558d401ef66d24f74610b92" +content_hash = "sha256:4e3b17128a8476ddabd32870991976c85a00b63c7a3d5e9d3f58d892375370d5" [[metadata.targets]] requires_python = ">=3.9" @@ -494,6 +494,17 @@ files = [ {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, ] +[[package]] +name = "natsort" +version = "8.4.0" +requires_python = ">=3.7" +summary = "Simple yet flexible natural sorting in Python." +groups = ["default"] +files = [ + {file = "natsort-8.4.0-py3-none-any.whl", hash = "sha256:4732914fb471f56b5cce04d7bae6f164a592c7712e1c85f9ef585e197299521c"}, + {file = "natsort-8.4.0.tar.gz", hash = "sha256:45312c4a0e5507593da193dedd04abb1469253b601ecaf63445ad80f0a1ea581"}, +] + [[package]] name = "nodeenv" version = "1.9.1" diff --git a/pyproject.toml b/pyproject.toml index 2ba99a2..1d282cb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,6 +15,7 @@ dependencies = [ "tomlkit>=0.13.2", "tomli>=2.2.1", "setuptools-scm>=9.2.0", + "natsort>=8.4.0", ] requires-python = ">=3.9" authors = [{ name = "JOJ3-dev", email = "joj3@focs.ji.sjtu.edu.cn" }] diff --git a/tests/convert/diff/task.json b/tests/convert/diff/task.json index ee76498..b2a9f9a 100644 --- a/tests/convert/diff/task.json +++ b/tests/convert/diff/task.json @@ -87,17 +87,7 @@ }, { "stdin": { - "src": "/home/tt/.config/joj/diff/case9.in" - } - }, - { - "stdin": { - "src": "/home/tt/.config/joj/diff/task1/subtask1/case11.in" - } - }, - { - "stdin": { - "src": "/home/tt/.config/joj/diff/task1/subtask1/case10.in" + "src": "/home/tt/.config/joj/diff/case2.in" } }, { @@ -107,7 +97,17 @@ }, { "stdin": { - "src": "/home/tt/.config/joj/diff/case2.in" + "src": "/home/tt/.config/joj/diff/case9.in" + } + }, + { + "stdin": { + "src": "/home/tt/.config/joj/diff/task1/subtask1/case10.in" + } + }, + { + "stdin": { + "src": "/home/tt/.config/joj/diff/task1/subtask1/case11.in" } }, { @@ -172,39 +172,9 @@ { "outputs": [ { - "score": 1232131, + "score": 100, "filename": "stdout", - "answerPath": "/home/tt/.config/joj/diff/case9.out", - "compareSpace": false, - "alwaysHide": false, - "forceQuitOnDiff": false, - "maxDiffLength": 2048, - "maxDiffLines": 50, - "hideCommonPrefix": false - } - ] - }, - { - "outputs": [ - { - "score": 92321, - "filename": "stdout", - "answerPath": "/home/tt/.config/joj/diff/task1/subtask1/case11.out", - "compareSpace": false, - "alwaysHide": false, - "forceQuitOnDiff": false, - "maxDiffLength": 2048, - "maxDiffLines": 50, - "hideCommonPrefix": false - } - ] - }, - { - "outputs": [ - { - "score": 823131, - "filename": "stdout", - "answerPath": "/home/tt/.config/joj/diff/task1/subtask1/case10.out", + "answerPath": "/home/tt/.config/joj/diff/case2.out", "compareSpace": false, "alwaysHide": false, "forceQuitOnDiff": false, @@ -232,9 +202,39 @@ { "outputs": [ { - "score": 100, + "score": 1232131, "filename": "stdout", - "answerPath": "/home/tt/.config/joj/diff/case2.out", + "answerPath": "/home/tt/.config/joj/diff/case9.out", + "compareSpace": false, + "alwaysHide": false, + "forceQuitOnDiff": false, + "maxDiffLength": 2048, + "maxDiffLines": 50, + "hideCommonPrefix": false + } + ] + }, + { + "outputs": [ + { + "score": 823131, + "filename": "stdout", + "answerPath": "/home/tt/.config/joj/diff/task1/subtask1/case10.out", + "compareSpace": false, + "alwaysHide": false, + "forceQuitOnDiff": false, + "maxDiffLength": 2048, + "maxDiffLines": 50, + "hideCommonPrefix": false + } + ] + }, + { + "outputs": [ + { + "score": 92321, + "filename": "stdout", + "answerPath": "/home/tt/.config/joj/diff/task1/subtask1/case11.out", "compareSpace": false, "alwaysHide": false, "forceQuitOnDiff": false,