JOJ3-config-generator/joj3_config_generator/models/answer.py
张泊明518370910136 df14ad801b
All checks were successful
build / build (push) Successful in 1m48s
feat: language specific create questions
2025-03-17 19:07:11 -04:00

125 lines
2.7 KiB
Python

from abc import ABC, abstractmethod
from enum import Enum
from typing import Any, ClassVar, Dict, List
import inquirer
from pydantic import BaseModel, ConfigDict
class LanguageInterface(ABC):
@abstractmethod
def __str__(self) -> str: ...
@abstractmethod
class Stage(str, Enum): ...
@abstractmethod
class Attribute(BaseModel): ...
stages: ClassVar[List[Enum]]
attribute: ClassVar[BaseModel]
@classmethod
def set_stages(cls, stages: List[str]) -> None:
cls.stages = [cls.Stage(stage) for stage in stages]
@classmethod
def set_attribute(cls, attribute_dict: Dict[str, Any]) -> None:
cls.attribute = cls.Attribute(**attribute_dict)
@classmethod
@abstractmethod
def get_attribute_questions(cls) -> List[Any]: ...
class Cpp(LanguageInterface):
def __str__(self) -> str:
return "C++"
class Stage(str, Enum):
COMPILATION = "Compilation"
CPPCHECK = "Cppcheck"
CPPLINT = "Cpplint"
CLANG_TIDY = "Clang-Tidy"
RUN = "Run"
class Attribute(BaseModel):
compile_command: str = "make"
run_command: str = "./a.out"
stages = []
attribute = Attribute()
@classmethod
def get_attribute_questions(cls) -> List[Any]:
return [
inquirer.Text(
name="compile_command",
message="Compile command",
default=cls.attribute.compile_command,
),
inquirer.Text(
name="run_command",
message="Run command",
default=cls.attribute.run_command,
),
]
class Python(LanguageInterface):
def __str__(self) -> str:
return "Python"
class Stage(str, Enum):
RUN = "Run"
class Attribute(BaseModel):
run_command: str = "python3 main.py"
stages = []
attribute = Attribute()
@classmethod
def get_attribute_questions(cls) -> List[Any]:
return [
inquirer.Text(
name="run_command",
message="Run command",
default=cls.attribute.run_command,
),
]
class Rust(LanguageInterface):
def __str__(self) -> str:
return "Rust"
class Stage(str, Enum):
COMPILATION = "Compilation"
CLIPPY = "Clippy"
RUN = "Run"
class Attribute(BaseModel):
pass
stages = []
attribute = Attribute()
@classmethod
def get_attribute_questions(cls) -> List[Any]:
return []
LANGUAGES = [
Cpp(),
Python(),
Rust(),
]
class Answers(BaseModel):
name: str
language: LanguageInterface
model_config = ConfigDict(arbitrary_types_allowed=True)