Source code for mmdesigner.cli

import os
import click
from mmdesigner import __version__


[docs]class Environment: """Context class holding state for cli commands""" def __init__(self): self.cwd = os.getcwd() self.part_count = 0 self.assembly_count = 0 self.model_path = "tests/test_data" self.model_name = "model" self.debug = False
pass_environment = click.make_pass_decorator(Environment, ensure=True) cmd_folder = os.path.abspath(os.path.join(os.path.dirname(__file__), "commands"))
[docs]class CLI(click.MultiCommand): """Modular CLI class""" def list_commands(self, ctx): """scan command directory and list all cli commands""" rv = [] for filename in os.listdir(cmd_folder): if filename.endswith(".py") and filename.startswith("cmd_"): rv.append(filename[4:-3]) rv.sort() return rv def get_command(self, ctx, name): """import cli command file on demand""" try: mod = __import__(f"mmdesigner.commands.cmd_{name}", None, None, ["cli"]) except ImportError: # pragma: no cover return return mod.cli
@click.version_option(__version__, "-v", "--version") @click.command(cls=CLI) @click.option("--debug", is_flag=True, help="Enable debug output") @click.option("--model_path", help="Path to model directory") @click.option("--model_name", help="Name of model within model_path") @pass_environment def cli(ctx, debug, model_path, model_name): """primary CLI interface""" ctx.debug = debug if not model_path is None: ctx.model_path = model_path if not model_name is None: ctx.model_name = model_name