"""Some utility functions for commands (e.g., for cmdline handling).""" # Authors: The MNE-Python contributors. # License: BSD-3-Clause # Copyright the MNE-Python contributors. import glob import importlib import os import os.path as op import sys from optparse import OptionParser import mne def _add_verbose_flag(parser): parser.add_option( "--verbose", dest="verbose", help="Enable verbose mode (printing of log messages).", default=None, action="store_true", ) def load_module(name, path): """Load module from .py/.pyc file. Parameters ---------- name : str Name of the module. path : str Path to .py/.pyc file. Returns ------- mod : module Imported module. """ from importlib.util import module_from_spec, spec_from_file_location spec = spec_from_file_location(name, path) mod = module_from_spec(spec) spec.loader.exec_module(mod) return mod def get_optparser(cmdpath, usage=None, prog_prefix="mne", version=None): """Create OptionParser with cmd specific settings (e.g., prog value).""" # Fetch description mod = load_module("__temp", cmdpath) if mod.__doc__: doc, description, epilog = mod.__doc__, None, None doc_lines = doc.split("\n") description = doc_lines[0] if len(doc_lines) > 1: epilog = "\n".join(doc_lines[1:]) # Get the name of the command command = os.path.basename(cmdpath) command, _ = os.path.splitext(command) command = command[len(prog_prefix) + 1 :] # +1 is for `_` character # Set prog prog = prog_prefix + f" {command}" # Set version if version is None: version = mne.__version__ # monkey patch OptionParser to not wrap epilog OptionParser.format_epilog = lambda self, formatter: self.epilog parser = OptionParser( prog=prog, version=version, description=description, epilog=epilog, usage=usage ) return parser def main(): """Entrypoint for mne usage.""" mne_bin_dir = op.dirname(op.dirname(__file__)) valid_commands = sorted(glob.glob(op.join(mne_bin_dir, "commands", "mne_*.py"))) valid_commands = [c.split(op.sep)[-1][4:-3] for c in valid_commands] def print_help(): # noqa print("Usage : mne command options\n") print("Accepted commands :\n") for c in valid_commands: print(f"\t- {c}") print("\nExample : mne browse_raw --raw sample_audvis_raw.fif") print("\nGetting help example : mne compute_proj_eog -h") if len(sys.argv) == 1 or "help" in sys.argv[1] or "-h" in sys.argv[1]: print_help() elif sys.argv[1] == "--version": print(f"MNE {mne.__version__}") elif sys.argv[1] not in valid_commands: print(f'Invalid command: "{sys.argv[1]}"\n') print_help() else: cmd = sys.argv[1] cmd = importlib.import_module(f".mne_{cmd}", "mne.commands") sys.argv = sys.argv[1:] cmd.run()