azdev/operations/statistics/util.py (38 lines of code) (raw):
# --------------------------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for license information.
# --------------------------------------------------------------------------------------------
import copy
from knack.log import get_logger
from azdev.utilities import get_name_index
logger = get_logger(__name__)
def filter_modules(command_loader, modules=None, exclude=False, include_whl_extensions=False):
modules = modules or []
# command tables and help entries must be copied to allow for seperate linter scope
command_table = command_loader.command_table.copy()
command_group_table = command_loader.command_group_table.copy()
command_loader = copy.copy(command_loader)
command_loader.command_table = command_table
command_loader.command_group_table = command_group_table
name_index = get_name_index(include_whl_extensions=include_whl_extensions)
for command_name in list(command_loader.command_table.keys()):
try:
source_name, _ = _get_command_source(command_name, command_loader.command_table)
except ValueError as ex:
# command is unrecognized
logger.warning(ex)
source_name = None
try:
long_name = name_index[source_name]
is_specified = source_name in modules or long_name in modules
except KeyError:
is_specified = False
if is_specified == exclude:
# brute force method of ignoring commands from a module or extension
command_loader.command_table.pop(command_name, None)
# Remove unneeded command groups
retained_command_groups = {' '.join(x.split(' ')[:-1]) for x in command_loader.command_table}
excluded_command_groups = set(command_loader.command_group_table.keys()) - retained_command_groups
for group_name in excluded_command_groups:
command_loader.command_group_table.pop(group_name, None)
return command_loader
def _get_command_source(command_name, command_table):
from azure.cli.core.commands import ExtensionCommandSource # pylint: disable=import-error
command = command_table.get(command_name)
# see if command is from an extension
if isinstance(command.command_source, ExtensionCommandSource):
return command.command_source.extension_name, True
if command.command_source is None:
raise ValueError('Command: `%s`, has no command source.' % command_name)
# command is from module
return command.command_source, False