diff --git a/run.py b/run.py index 86a5aa0..dc14023 100755 --- a/run.py +++ b/run.py @@ -79,11 +79,21 @@ def _parse_range_string_list(str_list) -> list[int]: return list(result) -def _dispatch_target(target: str) -> tuple[str, str]: +def _dispatch_target(target: str) -> tuple[str, str, Language]: splited = target.split("/") if len(splited) != 2: - raise ValueError("Invalid target format. Expected format: /") - return splited[0], splited[1] + raise ValueError("Invalid target format. Expected format: /.") + + prob_parts = splited[1].rsplit(".", 1) + if len(prob_parts) != 2: + raise ValueError("Invalid target format. Expected format: /.") + + prob_name, ext = prob_parts + lang = Language.convert_ext(ext) + if lang is Language.UNDEFINED: + raise ValueError(f"Unknown language: {ext}") + + return splited[0], prob_name, lang @unique @@ -391,6 +401,27 @@ def register(location: str): storage_manager.register_location(location) click.echo(f"Location '{location}' registered successfully.") +@click.command(name="create") +@click.argument("target", type=str, nargs=1, required=True) +@click.option("--completed/--no-completed", "-c/-nc", default=False, help="Mark as completed") +def create(target: str, completed: bool): + """ + 지정된 target을 storage에 생성하는 명령어 + """ + loc, prob, lang = _dispatch_target(target) + storage_manager = StorageManager() + if not storage_manager.check_location(loc): + raise click.ClickException(f"Location '{loc}' is not registered. Please register it first.") + filename = prob + if storage_manager.check_location_lang(loc, lang): + existing_file = storage_manager.check_get_file(loc, lang, filename) + if existing_file: + click.echo(f"File '{filename}.{lang.value}' already exists in location '{loc}'.") + return + storage_manager.save_file(loc, lang.value, f"{filename}.{lang.value}", b"", completed) # create empty file + click.echo(f"Problem '{filename}.{lang.value}' created successfully in location '{loc}' with completed status: {completed}.") + + @click.command(name="run") @click.argument("target", type=str, nargs=1, required=True) @click.option("--testcase", "-t", default=["1"], multiple=True) @@ -399,10 +430,7 @@ def run(target: str, testcase: str, verbose: bool): """ 지정된 언어로 빌드 및 실행하는 명령어 """ - loc, prob = _dispatch_target(target) - - # Language 확인 - from_language: Language = Language.convert_name(from_) + loc, prob, from_language = _dispatch_target(target) if from_language is Language.UNDEFINED: raise click.ClickException("Undefined Language Exception") @@ -492,9 +520,7 @@ def run(target: str, testcase: str, verbose: bool): @click.option("--force", "-f", is_flag=True) def load(file: str, to: str, from_: str, force: bool): """ - 파일을 각 언어의 src-space로 이동시키는 명령어. - 이 명령어는 다음 과정을 수행함. - + Storage의 파일을 각 언어의 src-space로 이동시키는 명령. """ # 파일의 src-space가 어딘지 확인 @@ -994,6 +1020,8 @@ def fetchprob(target: str, force: bool): raise click.ClickException("fetchprob is currently disabled (BOJ closing)") +cli.add_command(register) +cli.add_command(create) cli.add_command(run) cli.add_command(load) cli.add_command(init)