From fa81365d16f8043f004a52556e8507d95108cb2a Mon Sep 17 00:00:00 2001 From: houk-ms Date: Wed, 4 Nov 2020 15:25:28 +0800 Subject: [PATCH 1/4] remove useless codes for ai-did-you-mean-this --- src/azure-cli-core/azure/cli/core/parser.py | 27 +-------------------- 1 file changed, 1 insertion(+), 26 deletions(-) diff --git a/src/azure-cli-core/azure/cli/core/parser.py b/src/azure-cli-core/azure/cli/core/parser.py index f18c4c47f96..7d52c676d74 100644 --- a/src/azure-cli-core/azure/cli/core/parser.py +++ b/src/azure-cli-core/azure/cli/core/parser.py @@ -5,7 +5,6 @@ from __future__ import print_function -import sys import difflib import argparse @@ -188,11 +187,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): @@ -289,25 +283,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 @@ -399,7 +380,6 @@ def _check_value(self, action, value): # pylint: disable=too-many-statements, t # use cli_ctx from cli_help which is not lost. cli_ctx = self.cli_ctx or (self.cli_help.cli_ctx if self.cli_help else None) - caused_by_extension_not_installed = False command_name_inferred = self.prog error_msg = None if not self.command_source: @@ -418,7 +398,6 @@ def _check_value(self, action, value): # pylint: disable=too-many-statements, t command_str = roughly_parse_command(cmd_list[1:]) ext_name = self._search_in_extension_commands(command_str) if ext_name: - caused_by_extension_not_installed = True telemetry.set_command_details(command_str, parameters=AzCliCommandInvoker._extract_parameter_names(cmd_list), # pylint: disable=protected-access extension_name=ext_name) @@ -482,7 +461,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() @@ -500,8 +479,4 @@ def _check_value(self, action, value): # pylint: disable=too-many-statements, t 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) self.exit(2) From fde035e0cd4d9eb269abf7fab2a07a9e3b1d1bc3 Mon Sep 17 00:00:00 2001 From: houk-ms Date: Thu, 5 Nov 2020 11:37:33 +0800 Subject: [PATCH 2/4] remove recommendation_provider --- src/azure-cli-core/azure/cli/core/parser.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/azure-cli-core/azure/cli/core/parser.py b/src/azure-cli-core/azure/cli/core/parser.py index 7d52c676d74..43b23e5e598 100644 --- a/src/azure-cli-core/azure/cli/core/parser.py +++ b/src/azure-cli-core/azure/cli/core/parser.py @@ -68,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 From 0bd1d8e56f9eb9927ab5637f0f0384fac04120cd Mon Sep 17 00:00:00 2001 From: houk-ms Date: Fri, 6 Nov 2020 17:47:30 +0800 Subject: [PATCH 3/4] suppress error message caused by extension not installed --- src/azure-cli-core/azure/cli/core/parser.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/azure-cli-core/azure/cli/core/parser.py b/src/azure-cli-core/azure/cli/core/parser.py index 43b23e5e598..dbe07f71bb0 100644 --- a/src/azure-cli-core/azure/cli/core/parser.py +++ b/src/azure-cli-core/azure/cli/core/parser.py @@ -374,6 +374,7 @@ def _check_value(self, action, value): # pylint: disable=too-many-statements, t # use cli_ctx from cli_help which is not lost. cli_ctx = self.cli_ctx or (self.cli_help.cli_ctx if self.cli_help else None) + caused_by_extension_not_installed = False command_name_inferred = self.prog error_msg = None if not self.command_source: @@ -392,6 +393,7 @@ def _check_value(self, action, value): # pylint: disable=too-many-statements, t command_str = roughly_parse_command(cmd_list[1:]) ext_name = self._search_in_extension_commands(command_str) if ext_name: + caused_by_extension_not_installed = True telemetry.set_command_details(command_str, parameters=AzCliCommandInvoker._extract_parameter_names(cmd_list), # pylint: disable=protected-access extension_name=ext_name) @@ -470,7 +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: + az_error.print_error() + az_error.send_telemetry() self.exit(2) From 6d50efbfa4effe6ab74d40d3a169160ea4b70bb6 Mon Sep 17 00:00:00 2001 From: houk-ms Date: Mon, 9 Nov 2020 13:38:03 +0800 Subject: [PATCH 4/4] no longer need failure recommendation test in parser --- .../azure/cli/core/tests/test_parser.py | 60 ------------------- 1 file changed, 60 deletions(-) diff --git a/src/azure-cli-core/azure/cli/core/tests/test_parser.py b/src/azure-cli-core/azure/cli/core/tests/test_parser.py index 1a5e837534a..0e2e43ffa76 100644 --- a/src/azure-cli-core/azure/cli/core/tests/test_parser.py +++ b/src/azure-cli-core/azure/cli/core/tests/test_parser.py @@ -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 @@ -337,8 +280,5 @@ def __call__(self, message): self.called = True -ExpectedParameters = namedtuple('ExpectedParameters', ['version', 'command', 'parameters', 'has_extension']) - - if __name__ == '__main__': unittest.main()