diff --git a/joj3_config_generator/create.py b/joj3_config_generator/create.py new file mode 100644 index 0000000..e603d3d --- /dev/null +++ b/joj3_config_generator/create.py @@ -0,0 +1,5 @@ +from joj3_config_generator.models import answer, task + + +def create(answers: answer.Answers) -> task.Config: + return task.Config(task=task.Task(name=answers.name, type_=answers.type_)) diff --git a/joj3_config_generator/load.py b/joj3_config_generator/load.py index 0139ff7..c3aaa44 100644 --- a/joj3_config_generator/load.py +++ b/joj3_config_generator/load.py @@ -1,23 +1,26 @@ from pathlib import Path -from typing import Dict, Tuple +from typing import Tuple import inquirer import rtoml import yaml -from joj3_config_generator.models import joj1, repo, task +from joj3_config_generator.models import answer, joj1, repo, task -def load_joj3_toml_answers() -> Dict[str, str]: +def load_joj3_task_toml_answers() -> answer.Answers: questions = [ - inquirer.List( - "size", - message="What size do you need?", - choices=["Jumbo", "Large", "Standard", "Medium", "Small", "Micro"], + inquirer.Text(name="name", message="What's the task name?"), + inquirer.Text(name="type", message="What's the task type?"), + inquirer.Checkbox( + "stages", + message="What kind of stages do you need?", + choices=[member.value for member in answer.StageEnum], + default=[answer.StageEnum.COMPILATION], ), ] answers = inquirer.prompt(questions) - return answers + return answer.Answers(**answers) def load_joj1_yaml(yaml_path: Path) -> joj1.Config: diff --git a/joj3_config_generator/main.py b/joj3_config_generator/main.py index 519b4e2..46adb77 100644 --- a/joj3_config_generator/main.py +++ b/joj3_config_generator/main.py @@ -7,10 +7,11 @@ from typing_extensions import Annotated 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.create import create as create_joj3_task_conf from joj3_config_generator.load import ( load_joj1_yaml, + load_joj3_task_toml_answers, load_joj3_toml, - load_joj3_toml_answers, ) from joj3_config_generator.models.const import JOJ3_CONFIG_ROOT from joj3_config_generator.utils.logger import logger @@ -21,18 +22,23 @@ app = typer.Typer(add_completion=False) @app.command() def create(toml_path: Path) -> None: """ - Create a new JOJ3 toml config file + Create a new JOJ3 task toml config file """ - logger.info(f"Creating toml file {toml_path}") - answers = load_joj3_toml_answers() - logger.debug(f"Got answers: {answers}") - toml_path.write_text(rtoml.dumps({})) + logger.info(f"Creating task toml file {toml_path}") + answers = load_joj3_task_toml_answers() + answers_dict = answers.model_dump(mode="json", by_alias=True) + logger.debug(f"Got answers: {answers_dict}") + task_model = create_joj3_task_conf(answers) + result_dict = task_model.model_dump( + mode="json", by_alias=True, exclude_none=True, exclude_unset=True + ) + toml_path.write_text(rtoml.dumps(result_dict)) @app.command() def convert_joj1(yaml_path: Path, toml_path: Path) -> None: """ - Convert a JOJ1 yaml config file to JOJ3 toml config file + Convert a JOJ1 yaml config file to JOJ3 task toml config file """ logger.info(f"Converting yaml file {yaml_path}") joj1_model = load_joj1_yaml(yaml_path) @@ -48,7 +54,7 @@ def convert( typer.Argument( help=f"root directory of config files, located at {JOJ3_CONFIG_ROOT} in JTC" ), - ] = Path(".") + ] = Path("."), ) -> None: """ Convert given dir of JOJ3 toml config files to JOJ3 json config files diff --git a/joj3_config_generator/models/answer.py b/joj3_config_generator/models/answer.py new file mode 100644 index 0000000..14d540b --- /dev/null +++ b/joj3_config_generator/models/answer.py @@ -0,0 +1,20 @@ +from enum import Enum +from typing import List + +from pydantic import AliasChoices, BaseModel, Field + + +class StageEnum(str, Enum): + COMPILATION = "Compilation" + CPPCHECK = "Cppcheck" + CPPLINT = "Cpplint" + CLANG_TIDY = "Clang-Tidy" + + +class Answers(BaseModel): + name: str + type_: str = Field( + serialization_alias="type", + validation_alias=AliasChoices("type_", "type"), + ) + stages: List[str] diff --git a/joj3_config_generator/models/task.py b/joj3_config_generator/models/task.py index 7e790a3..29673a6 100644 --- a/joj3_config_generator/models/task.py +++ b/joj3_config_generator/models/task.py @@ -3,7 +3,14 @@ from enum import Enum from pathlib import Path from typing import Any, Dict, List, Type -from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator +from pydantic import ( + AliasChoices, + BaseModel, + ConfigDict, + Field, + field_validator, + model_validator, +) from joj3_config_generator.models.common import Memory, Time from joj3_config_generator.models.const import ( @@ -141,7 +148,11 @@ class Release(BaseModel): class Task(BaseModel): - type_: str = Field("unknown", serialization_alias="type", validation_alias="type") + type_: str = Field( + "unknown", + serialization_alias="type", + validation_alias=AliasChoices("type_", "type"), + ) name: str = "unknown" diff --git a/tests/create/basic/answers.json b/tests/create/basic/answers.json new file mode 100644 index 0000000..a6eab37 --- /dev/null +++ b/tests/create/basic/answers.json @@ -0,0 +1,5 @@ +{ + "name": "hw7 ex2", + "type": "homework/h7/e2", + "stages": ["Compilation"] +} diff --git a/tests/create/basic/task.toml b/tests/create/basic/task.toml new file mode 100644 index 0000000..caf70a6 --- /dev/null +++ b/tests/create/basic/task.toml @@ -0,0 +1,3 @@ +[task] +name = "hw7 ex2" +type = "homework/h7/e2" diff --git a/tests/create/test_create_cases.py b/tests/create/test_create_cases.py new file mode 100644 index 0000000..16c276d --- /dev/null +++ b/tests/create/test_create_cases.py @@ -0,0 +1,5 @@ +from tests.create.utils import load_case + + +def test_basic() -> None: + load_case("basic") diff --git a/tests/create/utils.py b/tests/create/utils.py new file mode 100644 index 0000000..5f0783d --- /dev/null +++ b/tests/create/utils.py @@ -0,0 +1,22 @@ +import json +from pathlib import Path + +import rtoml + +from joj3_config_generator.create import create +from joj3_config_generator.models import answer + + +def load_case(case_name: str) -> None: + root = Path(__file__).resolve().parent + answers_json_path = root / case_name / "answers.json" + task_toml_path = root / case_name / "task.toml" + answers = answer.Answers(**json.loads(answers_json_path.read_text())) + print(answers) + expected_result = rtoml.loads(task_toml_path.read_text()) + result = create(answers).model_dump( + mode="json", by_alias=True, exclude_none=True, exclude_unset=True + ) + print(result) + print(expected_result) + assert result == expected_result