Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 4 additions & 32 deletions src/azure-cli-core/azure/cli/core/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@

from __future__ import print_function

import sys
import difflib

import argparse
Expand Down Expand Up @@ -69,12 +68,6 @@ def _get_completions(self, comp_words, cword_prefix, cword_prequote, last_wordbr
class AzCliCommandParser(CLICommandParser):
"""ArgumentParser implementation specialized for the Azure CLI utility."""

@staticmethod
def recommendation_provider(version, command, parameters, extension): # pylint: disable=unused-argument
logger.debug("recommendation_provider: version: %s, command: %s, parameters: %s, extension: %s",
version, command, parameters, extension)
return []

def __init__(self, cli_ctx=None, cli_help=None, **kwargs):
self.command_source = kwargs.pop('_command_source', None)
self._raw_arguments = None
Expand Down Expand Up @@ -188,11 +181,6 @@ def error(self, message):
az_error.set_recommendation(OVERVIEW_REFERENCE.format(command=self.prog))
az_error.print_error()
az_error.send_telemetry()

# For ai-did-you-mean-this
failure_recovery_recommendations = self._get_failure_recovery_recommendations()
self._suggestion_msg.extend(failure_recovery_recommendations)
self._print_suggestion_msg(sys.stderr)
self.exit(2)

def format_help(self):
Expand Down Expand Up @@ -289,25 +277,12 @@ def has_extension_name(command_source):

return command, parameters, extension

def _get_failure_recovery_recommendations(self, action=None, **kwargs):
# Gets failure recovery recommendations
from azure.cli.core import __version__ as core_version
failure_recovery_arguments = self._get_failure_recovery_arguments(action)
recommendations = AzCliCommandParser.recommendation_provider(core_version,
*failure_recovery_arguments,
**kwargs)
return recommendations

def _get_values(self, action, arg_strings):
value = super(AzCliCommandParser, self)._get_values(action, arg_strings)
if action.dest and isinstance(action.dest, str) and not action.dest.startswith('_'):
self.specified_arguments.append(action.dest)
return value

def _print_suggestion_msg(self, file=None):
if self._suggestion_msg:
print('\n'.join(self._suggestion_msg), file=file)

def parse_known_args(self, args=None, namespace=None):
# retrieve the raw argument list in case parsing known arguments fails.
self._raw_arguments = args
Expand Down Expand Up @@ -482,7 +457,7 @@ def _check_value(self, action, value): # pylint: disable=too-many-statements, t
if candidates:
az_error.set_recommendation("Did you mean '{}' ?".format(candidates[0]))

# recommand a command for user
# recommend a command for user
recommender = CommandRecommender(*command_arguments, error_msg, cli_ctx)
recommender.set_help_examples(self.get_examples(command_name_inferred))
recommended_command = recommender.recommend_a_command()
Expand All @@ -497,11 +472,8 @@ def _check_value(self, action, value): # pylint: disable=too-many-statements, t

az_error.set_recommendation(OVERVIEW_REFERENCE.format(command=self.prog))

az_error.print_error()
az_error.send_telemetry()

if not caused_by_extension_not_installed:
failure_recovery_recommendations = self._get_failure_recovery_recommendations(action)
self._suggestion_msg.extend(failure_recovery_recommendations)
self._print_suggestion_msg(sys.stderr)
az_error.print_error()
az_error.send_telemetry()

self.exit(2)
60 changes: 0 additions & 60 deletions src/azure-cli-core/azure/cli/core/tests/test_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -266,63 +266,6 @@ def mock_add_extension(*args, **kwargs):
parser.parse_args('test new-ext reset pos1 pos2'.split()) # test positional args
self.assertIn("Extension another-ext-name installed. Please rerun your command.", logger_msgs[6])

@mock.patch('importlib.import_module', _mock_import_lib)
@mock.patch('pkgutil.iter_modules', _mock_iter_modules)
@mock.patch('azure.cli.core.commands._load_command_loader', _mock_load_command_loader)
@mock.patch('azure.cli.core.extension.get_extension_modname', _mock_extension_modname)
@mock.patch('azure.cli.core.extension.get_extensions', _mock_get_extensions)
def test_parser_failure_recovery_recommendations(self):
cli = DummyCli()
main_loader = MainCommandsLoader(cli)
cli.loader = main_loader

cli.loader.load_command_table(None)

parser = cli.parser_cls(cli)
parser.load_command_table(cli.loader)

recommendation_provider_parameters = []

version = cli.get_cli_version()
expected_recommendation_provider_parameters = [
# version, command, parameters, extension
ExpectedParameters(version, 'test module1', ['--opt'], False),
ExpectedParameters(version, 'test extension1', ['--opt'], False),
ExpectedParameters(version, 'foo_bar', ['--opt'], False),
ExpectedParameters(version, 'test module', ['--opt'], False),
ExpectedParameters(version, 'test extension', ['--opt'], True)
]

def mock_recommendation_provider(*args):
recommendation_provider_parameters.append(tuple(args))
return []

AzCliCommandParser.recommendation_provider = mock_recommendation_provider

faulty_cmd_args = [
'test module1 --opt enum_1',
'test extension1 --opt enum_1',
'test foo_bar --opt enum_3',
'test module --opt enum_3',
'test extension --opt enum_3'
]

for text in faulty_cmd_args:
with self.assertRaises(SystemExit):
parser.parse_args(text.split())

for i, parameters in enumerate(recommendation_provider_parameters):
version, command, parameters, extension = parameters
expected = expected_recommendation_provider_parameters[i]
self.assertEqual(expected.version, version)
self.assertIn(expected.command, command)
self.assertEqual(expected.parameters, parameters)

if expected.has_extension:
self.assertIsNotNone(extension)
else:
self.assertIsNone(extension)


class VerifyError(object): # pylint: disable=too-few-public-methods

Expand All @@ -337,8 +280,5 @@ def __call__(self, message):
self.called = True


ExpectedParameters = namedtuple('ExpectedParameters', ['version', 'command', 'parameters', 'has_extension'])


if __name__ == '__main__':
unittest.main()