Source code for danoan.perchance_tools.commands.convert_to_perchance_format

from danoan.perchance_tools.core import api, exception, model, utils

import argparse
import io
import logging
import pycountry
import sys
import yaml

from typing import Any, Dict, List

LOG_LEVEL = logging.INFO

logger = logging.getLogger(__file__)
logger.setLevel(LOG_LEVEL)
handler = logging.StreamHandler(sys.stderr)
handler.setLevel(LOG_LEVEL)
handler.setFormatter(logging.Formatter("%(levelname)s:%(name)s:%(message)s"))
logger.addHandler(handler)


[docs] def format_key_name(s): return s.lower().replace(",", " ").replace(" ", " ").replace(" ", "_")
def _key_path_to_perchance_dict(list_key_paths: List[Dict[str, Any]]): d: Dict[str, Any] = {"root": {}} for key_path in list_key_paths: current = d["root"] path = key_path["path"] words = key_path["words"] for key in path: perchance_key = format_key_name(key) if perchance_key not in current: current[perchance_key] = {"name": key.lower()} current = current[perchance_key] current["words"] = words return d def _translate_key_paths(word_dict: model.WordDict): for key_path in utils.collect_key_path(word_dict, "words"): kp = {"path": [], "words": key_path["words"]} categories = key_path["path"] for category in categories: if category == "root": continue from_language = pycountry.languages.get(name="French") to_language = pycountry.languages.get(name="English") try: response = api.translate(category, from_language.name, to_language.name) except exception.CacheNotConfiguredError: print( "The cache for LLM calls is not configured. Please setup", " the llm-assistant with llm-assistant setup before proceeding", ) exit(1) if not response: logger.info(f"Error processing: {categories}. Skipping.") continue kp["path"].append(response[0]) yield kp def __convert_to_perchance_format__(list_yml_filepath: List[str], *args, **kwargs): """ Convert one or more yml files containing a list of words in a perchance data structure. """ for filepath in list_yml_filepath: with open(filepath, "r") as f: T = yaml.load(f, Loader=yaml.Loader) word_dict = model.WordDict(T) d = _key_path_to_perchance_dict(list(_translate_key_paths(word_dict))) print(print_perchance_dict(d))
[docs] def extend_parser(subparser_action=None): command_name = "convert-to-perchance-format" description = __convert_to_perchance_format__.__doc__ help = description.split(".")[0] if description else "" if subparser_action: parser = subparser_action.add_parser( command_name, help=help, description=description, formatter_class=argparse.RawDescriptionHelpFormatter, ) else: parser = argparse.ArgumentParser( command_name, description=description, formatter_class=argparse.RawDescriptionHelpFormatter, ) parser.add_argument( "list_yml_filepath", metavar="yml_filepath", nargs="+", help="One or more path to yml file list of words.", ) parser.set_defaults( func=__convert_to_perchance_format__, subcommand_help=parser.print_help ) return parser
[docs] def main(): parser = extend_parser() args = parser.parse_args() if "func" in args: args.func(**vars(args)) elif "subcommand_help" in args: args.subcommand_help() else: parser.print_help()
if __name__ == "__main__": main()