Source code for lwe.plugins.examples

import os
import shutil

from lwe.core.plugin import Plugin
import lwe.core.util as util

TYPES = [
    "presets",
    "templates",
    "workflows",
    "tools",
]


[docs] class Examples(Plugin): """ Easily install example configuration files """
[docs] def default_config(self): return { "confirm_overwrite": True, "default_types": TYPES, }
[docs] def setup(self): self.profile_dir = self.config.config_profile_dir self.examples_root = os.path.join( os.path.dirname(util.get_package_root(self.config)), "lwe", "examples" ) self.default_types = self.config.get("plugins.examples.default_types") self.confirm_overwrite = self.config.get("plugins.examples.confirm_overwrite") self.log.info( f"This is the examples plugin, running with profile dir: {self.profile_dir}, examples root: {self.examples_root}, default types: {self.default_types}, confirm overwrite: {self.confirm_overwrite}" )
[docs] def get_shell_completions(self, _base_shell_completions): """Example of provided shell completions.""" commands = {} commands[util.command_with_leader("examples")] = util.list_to_completion_hash( ["list"] + TYPES ) return commands
[docs] def get_examples(self, example_type): example_type_dir = f"{self.examples_root}/{example_type}" examples = [] for root, dirs, files in os.walk(example_type_dir): # Exclude directories that start with an underscore dirs[:] = [d for d in dirs if not d.startswith("_")] for file in files: file_path = os.path.join(root, file) if os.path.isfile(file_path): examples.append(os.path.relpath(file_path, example_type_dir)) return examples
[docs] def install_example_file(self, example_type, example_file): """Helper method to install a single example file.""" source_file = os.path.join(self.examples_root, example_type, example_file) dest_dir = os.path.join(self.profile_dir, example_type) dest_file = os.path.join(dest_dir, example_file) if not os.path.exists(dest_dir): os.makedirs(dest_dir) if os.path.exists(dest_file) and self.confirm_overwrite: confirm = input(f"File {dest_file} already exists. Overwrite? (y/n): ") if confirm.lower() != "y": message = f"Skipping file {example_file}" util.print_status_message(True, message, "bold blue") self.log.info(message) return try: shutil.copy(source_file, dest_file) util.print_status_message(True, f"Installed {example_file} to {dest_file}", "bold blue") self.log.info(f"Installed {example_file} to {dest_file}") except Exception as e: util.print_status_message(False, str(e)) self.log.error(f"Error installing {example_file}: {str(e)}")
[docs] def confirm_install(self, example_types): confirm = input( f"Are you sure you want to install examples for the following types? {', '.join(example_types)} (y/n): " ) if confirm.lower() not in ["yes", "y"]: message = "Skipping installation" util.print_status_message(False, message) self.log.info(message) return False return True
[docs] def install_examples_confirm(self, example_type=None): example_types = [example_type] if example_type else self.default_types if not self.confirm_install(example_types): return self.install_examples(example_type)
[docs] def install_examples(self, example_type=None): """Install example files.""" try: example_types = [example_type] if example_type else self.default_types for example_type in example_types: message = f"Installing examples for: {example_type}" util.print_status_message(True, message) self.log.info(message) for example_file in self.get_examples(example_type): self.install_example_file(example_type, example_file) message = "Finished installing examples" util.print_status_message(True, message) self.log.info(message) except Exception as e: util.print_status_message(False, str(e)) self.log.error(f"Error installing examples: {str(e)}")
[docs] def command_examples(self, arg): """ List or install example files The example files that come with the package can be listed and optionally installed in the currently running profile configuration. Arguments: list: List all example files, and where they will be installed. type: The type of example files to install (default is all configured types). Examples: {COMMAND} list {COMMAND} presets """ if arg: if arg in self.default_types: self.log.info(f"Installing examples for: {arg}") self.install_examples_confirm(arg) elif arg == "list": for t in self.default_types: self.log.debug(f"Listing examples for: {t}") install_dir = f"{self.profile_dir}/{t}" file_list = "\n".join([f"* {f}" for f in sorted(self.get_examples(t))]) util.print_markdown("## %s\nInstall to: %s\n%s" % (t, install_dir, file_list)) else: return False, arg, "Invalid example type" else: self.log.info(f"Installing examples for: {', '.join(self.default_types)}") self.install_examples_confirm()