from rich.console import Console from rich.style import Style from phi.utils.log import logger console = Console() ###################################################### ## Styles # Standard Colors: https://rich.readthedocs.io/en/stable/appendix/colors.html#appendix-colors ###################################################### heading_style = Style( color="green", bold=True, underline=True, ) subheading_style = Style( color="chartreuse3", bold=True, ) success_style = Style(color="chartreuse3") fail_style = Style(color="red") error_style = Style(color="red") info_style = Style() warn_style = Style(color="magenta") ###################################################### ## Print functions ###################################################### def print_heading(msg: str) -> None: console.print(msg, style=heading_style) def print_subheading(msg: str) -> None: console.print(msg, style=subheading_style) def print_horizontal_line() -> None: console.rule() def print_info(msg: str) -> None: console.print(msg, style=info_style) def log_config_not_available_msg() -> None: logger.error("phi not initialized, please run `phi init`") def log_active_workspace_not_available() -> None: logger.error("No active workspace. You can:") logger.error("- Run `phi ws create` to create a new workspace") logger.error("- OR Run `phi ws setup` from an existing directory to setup the workspace") logger.error("- OR Set an existing workspace as active using `phi set [ws_name]`") def print_available_workspaces(avl_ws_list) -> None: avl_ws_names = [w.ws_root_path.stem for w in avl_ws_list] if avl_ws_list else [] print_info("Available Workspaces:\n - {}".format("\n - ".join(avl_ws_names))) def log_phi_init_failed_msg() -> None: logger.error("phi initialization failed, please try again") def confirm_yes_no(question, default: str = "yes") -> bool: """Ask a yes/no question via raw_input(). "question" is a string that is presented to the user. "default" is the presumed answer if the user just hits . It must be "yes" (the default), "no" or None (meaning an answer is required of the user). The "answer" return value is True for "yes" or False for "no". """ inp_to_result_map = {"yes": True, "y": True, "ye": True, "no": False, "n": False} if default is None: prompt = " [y/n]: " elif default == "yes": prompt = " [Y/n]: " elif default == "no": prompt = " [y/N]: " else: raise ValueError(f"Invalid default answer: {default}") choice = console.input(prompt=(question + prompt)).lower() if default is not None and choice == "": return inp_to_result_map[default] elif choice in inp_to_result_map: return inp_to_result_map[choice] else: logger.error(f"{choice} invalid") return False