diff --git a/chatmastermind/commands/question.py b/chatmastermind/commands/question.py index bc4a8c4..ba522ab 100644 --- a/chatmastermind/commands/question.py +++ b/chatmastermind/commands/question.py @@ -151,13 +151,34 @@ def repeat_messages(messages: list[Message], chat: ChatDB, args: argparse.Namesp make_request(ai, chat, message, args) +def modify_tag_args(args: argparse.Namespace) -> None: + """ + Changes the semantics of the tags for this command: + * not tags specified -> no tags are selected + * empty tags specified -> all tags are selected + """ + if args.or_tags is None: + args.or_tags = set() + elif len(args.or_tags) == 0: + args.or_tags = None + if args.and_tags is None: + args.and_tags = set() + elif len(args.and_tags) == 0: + args.and_tags = None + if args.exclude_tags is None: + args.exclude_tags = set() + elif len(args.exclude_tags) == 0: + args.exclude_tags = None + + def question_cmd(args: argparse.Namespace, config: Config) -> None: """ Handler for the 'question' command. """ - mfilter = MessageFilter(tags_or=args.or_tags if args.or_tags is not None else set(), - tags_and=args.and_tags if args.and_tags is not None else set(), - tags_not=args.exclude_tags if args.exclude_tags is not None else set()) + modify_tag_args(args) + mfilter = MessageFilter(tags_or=args.or_tags, + tags_and=args.and_tags, + tags_not=args.exclude_tags) chat = ChatDB.from_dir(cache_path=Path(config.cache), db_path=Path(config.db), mfilter=mfilter) diff --git a/chatmastermind/main.py b/chatmastermind/main.py index 62c4539..ac4f7cc 100755 --- a/chatmastermind/main.py +++ b/chatmastermind/main.py @@ -34,13 +34,13 @@ def create_parser() -> argparse.ArgumentParser: # a parent parser for all commands that support tag selection tag_parser = argparse.ArgumentParser(add_help=False) - tag_arg = tag_parser.add_argument('-t', '--or-tags', nargs='+', + tag_arg = tag_parser.add_argument('-t', '--or-tags', nargs='*', help='List of tags (one must match)', metavar='OTAGS') tag_arg.completer = tags_completer # type: ignore - atag_arg = tag_parser.add_argument('-k', '--and-tags', nargs='+', + atag_arg = tag_parser.add_argument('-k', '--and-tags', nargs='*', help='List of tags (all must match)', metavar='ATAGS') atag_arg.completer = tags_completer # type: ignore - etag_arg = tag_parser.add_argument('-x', '--exclude-tags', nargs='+', + etag_arg = tag_parser.add_argument('-x', '--exclude-tags', nargs='*', help='List of tags to exclude', metavar='XTAGS') etag_arg.completer = tags_completer # type: ignore otag_arg = tag_parser.add_argument('-o', '--output-tags', nargs='+',