Source code for aiida.cmdline.utils.pluginable

# -*- coding: utf-8 -*-
###########################################################################
# Copyright (c), The AiiDA team. All rights reserved.                     #
# This file is part of the AiiDA code.                                    #
#                                                                         #
# The code is hosted on GitHub at https://github.com/aiidateam/aiida-core #
# For further information on the license, see the LICENSE.txt file        #
# For further information please visit http://www.aiida.net               #
###########################################################################
"""Plugin aware click command Group."""
import click

from aiida.common import exceptions
from aiida.plugins.entry_point import load_entry_point, get_entry_point_names


[docs]class Pluginable(click.Group): """A click command group that finds and loads plugin commands lazily."""
[docs] def __init__(self, *args, **kwargs): """Initialize with entry point group.""" self._exclude_external_plugins = False # Default behavior is of course to include external plugins self._entry_point_group = kwargs.pop('entry_point_group') super().__init__(*args, **kwargs)
[docs] def list_commands(self, ctx): """Add entry point names of available plugins to the command list.""" subcommands = super().list_commands(ctx) if not self._exclude_external_plugins: subcommands.extend(get_entry_point_names(self._entry_point_group)) return subcommands
[docs] def get_command(self, ctx, name): # pylint: disable=arguments-differ """Try to load a subcommand from entry points, else defer to super.""" command = None if not self._exclude_external_plugins: try: command = load_entry_point(self._entry_point_group, name) except exceptions.EntryPointError: command = super().get_command(ctx, name) else: command = super().get_command(ctx, name) return command
[docs] def set_exclude_external_plugins(self, exclude_external_plugins): """Set whether external plugins should be excluded. If `exclude_external_plugins` is set to `True`, the plugins that belong to the `entry_point_group` defined for this `click.Group` will not be discoverable. This is useful to limit the available commands to only those provided by `aiida-core` (excluding those provided by plugins). :param exclude_external_plugins: bool, when True, external plugins will not be discoverable """ self._exclude_external_plugins = exclude_external_plugins