From 5cf5e5a8eec2f7206e9b339430087009dd0597ae Mon Sep 17 00:00:00 2001 From: Karma Riuk Date: Fri, 16 May 2025 19:41:15 +0200 Subject: [PATCH] added enumchoiceaction for easier enum in argparse handling --- manual_selection.py | 11 ++++++----- utils.py | 22 ++++++++++++++++++++-- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/manual_selection.py b/manual_selection.py index 694ca2d..76a8e4f 100644 --- a/manual_selection.py +++ b/manual_selection.py @@ -2,7 +2,7 @@ from typing import Optional from dataset import Dataset, DatasetEntry, Selection import argparse, os, re, click from enum import Enum -from utils import prompt_yes_no +from utils import EnumChoicesAction, prompt_yes_no HUNK_HEADER_REGEX = re.compile(r'^@@ -\d+(?:,\d+)? \+\d+(?:,\d+)? @@') @@ -235,9 +235,10 @@ if __name__ == "__main__": parser.add_argument( "-m", "--mode", - choices=[mode.value for mode in ValidationMode], - default='comment', - help="Validation mode: 'comment' to only check if comments suggest changes, 'refinement' to check both comment suggestions and implementation. Default is 'comment'", + type=ValidationMode, + default=ValidationMode.COMMENT, + action=EnumChoicesAction, + help=f"Validation mode: '{ValidationMode.COMMENT.value}' to only check if comments suggest changes, '{ValidationMode.REFINEMENT.value}' to check both comment suggestions and implementation. Default is '{ValidationMode.COMMENT.value}'", ) parser.add_argument( "--check-diff-relevance", @@ -249,6 +250,6 @@ if __name__ == "__main__": args.dataset, args.output, overwrite=args.overwrite, - validation_mode=ValidationMode(args.mode), + validation_mode=args.mode, check_diff_relevance=args.check_diff_relevance, ) diff --git a/utils.py b/utils.py index 6c5b4d6..faa24b2 100644 --- a/utils.py +++ b/utils.py @@ -1,6 +1,7 @@ -import os, sys, logging, subprocess +import argparse +import os, enum, logging, subprocess from datetime import datetime -from typing import Optional +from typing import Optional, Any, Sequence, Type, Union from github.Commit import Commit from github.PaginatedList import PaginatedList from github.PullRequestComment import PullRequestComment @@ -182,3 +183,20 @@ def prompt_yes_no(prompt: str, *, default: Optional[bool] = None) -> bool: return default else: print("Please enter 'y' or 'n'.") + + +class EnumChoicesAction(argparse.Action): + def __init__(self, *args, type: Type[enum.Enum], **kwargs) -> None: + super().__init__(*args, **kwargs, choices=[e.value for e in type]) + self.enum = type + + def __call__( + self, + parser: argparse.ArgumentParser, + namespace: argparse.Namespace, + values: Union[str, Sequence[Any], None] = None, + option_string: Optional[str] = None, + ) -> None: + if not isinstance(values, str): + raise TypeError + setattr(namespace, self.dest, self.enum(values))