From 3246944e541652f2e1316904d690e726a17e620d Mon Sep 17 00:00:00 2001 From: juk0de Date: Fri, 29 Sep 2023 06:59:46 +0200 Subject: [PATCH] hist_cmd: implemented '--convert' option --- chatmastermind/commands/hist.py | 51 +++++++++++++++++++++++++++++++-- chatmastermind/main.py | 9 ++++-- 2 files changed, 54 insertions(+), 6 deletions(-) diff --git a/chatmastermind/commands/hist.py b/chatmastermind/commands/hist.py index 5b14bd2..ab1462d 100644 --- a/chatmastermind/commands/hist.py +++ b/chatmastermind/commands/hist.py @@ -1,13 +1,48 @@ +import sys import argparse from pathlib import Path from ..configuration import Config from ..chat import ChatDB -from ..message import MessageFilter +from ..message import MessageFilter, Message -def hist_cmd(args: argparse.Namespace, config: Config) -> None: +msg_suffix = Message.file_suffix_write + + +def convert_messages(args: argparse.Namespace, config: Config) -> None: """ - Handler for the 'hist' command. + Convert messages to a new format. Also used to change the suffix, + to the latest default message file suffix. + """ + chat = ChatDB.from_dir(Path(config.cache), + Path(config.db)) + # read all known message files + msgs = chat.msg_gather(loc='disk', glob='*.*') + # make a set of all message IDs + msg_ids = set([m.msg_id() for m in msgs]) + # set requested format and write all messages + chat.set_msg_format(args.convert) + chat.msg_write(msgs) + # read all messages with the current default suffix + msgs = chat.msg_gather(loc='disk', glob='*{msg_suffix}') + # make sure we converted all of the original messages + for mid in msg_ids: + if not any(mid == m.msg_id() for m in msgs): + print(f"Message '{mid}' has not been found after conversion. Aborting.") + sys.exit(1) + # delete messages with old suffix + msgs = chat.msg_gather(loc='disk', glob='*.*') + for m in msgs: + if m.file_path and m.file_path.suffix != msg_suffix: + m.rm_file() + print(f"Successfully converted {len(msg_ids)} messages.") + if len(msgs): + print(f"Deleted {len(msgs)} messages with deprecated suffixes.") + + +def print_chat(args: argparse.Namespace, config: Config) -> None: + """ + Print the DB chat history. """ mfilter = MessageFilter(tags_or=args.or_tags, @@ -21,3 +56,13 @@ def hist_cmd(args: argparse.Namespace, config: Config) -> None: chat.print(args.source_code_only, args.with_tags, args.with_files) + + +def hist_cmd(args: argparse.Namespace, config: Config) -> None: + """ + Handler for the 'hist' command. + """ + if args.print: + print_chat(args, config) + elif args.convert: + convert_messages(args, config) diff --git a/chatmastermind/main.py b/chatmastermind/main.py index ac4f7cc..a803d0e 100755 --- a/chatmastermind/main.py +++ b/chatmastermind/main.py @@ -73,17 +73,20 @@ def create_parser() -> argparse.ArgumentParser: # 'hist' command parser hist_cmd_parser = cmdparser.add_parser('hist', parents=[tag_parser], - help="Print chat history.", + help="Print and manage chat history.", aliases=['h']) hist_cmd_parser.set_defaults(func=hist_cmd) + hist_group = hist_cmd_parser.add_mutually_exclusive_group(required=True) + hist_group.add_argument('-p', '--print', help='Print the DB chat history', action='store_true') + hist_group.add_argument('-c', '--convert', help='Convert all message files to the given format [txt|yaml]', metavar='FORMAT') hist_cmd_parser.add_argument('-w', '--with-tags', help="Print chat history with tags.", action='store_true') hist_cmd_parser.add_argument('-W', '--with-files', help="Print chat history with filenames.", action='store_true') hist_cmd_parser.add_argument('-S', '--source-code-only', help='Only print embedded source code', action='store_true') - hist_cmd_parser.add_argument('-A', '--answer', help='Search for answer substring', metavar='SUBSTRING') - hist_cmd_parser.add_argument('-Q', '--question', help='Search for question substring', metavar='SUBSTRING') + hist_cmd_parser.add_argument('-A', '--answer', help='Print only answers with given substring', metavar='SUBSTRING') + hist_cmd_parser.add_argument('-Q', '--question', help='Print only questions with given substring', metavar='SUBSTRING') # 'tags' command parser tags_cmd_parser = cmdparser.add_parser('tags',