From 54253027e3f5a186fd5ed9ce712c583b104a39b2 Mon Sep 17 00:00:00 2001 From: Divy Jain Date: Thu, 1 Jul 2021 02:40:06 +0530 Subject: [PATCH] #1123: Update composer_not_command rule (#1135) Fix #1123 --- tests/rules/test_composer_not_command.py | 14 ++++++++++++-- thefuck/rules/composer_not_command.py | 18 ++++++++++++------ 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/tests/rules/test_composer_not_command.py b/tests/rules/test_composer_not_command.py index 33823cfc..2bae920c 100644 --- a/tests/rules/test_composer_not_command.py +++ b/tests/rules/test_composer_not_command.py @@ -39,18 +39,28 @@ def composer_not_command_one_of_this(): ) -def test_match(composer_not_command, composer_not_command_one_of_this): +@pytest.fixture +def composer_require_instead_of_install(): + return 'Invalid argument package. Use "composer require package" instead to add packages to your composer.json.' + + +def test_match(composer_not_command, composer_not_command_one_of_this, composer_require_instead_of_install): assert match(Command('composer udpate', composer_not_command)) assert match(Command('composer pdate', composer_not_command_one_of_this)) + assert match(Command('composer install package', + composer_require_instead_of_install)) assert not match(Command('ls update', composer_not_command)) -def test_get_new_command(composer_not_command, composer_not_command_one_of_this): +def test_get_new_command(composer_not_command, composer_not_command_one_of_this, composer_require_instead_of_install): assert (get_new_command(Command('composer udpate', composer_not_command)) == 'composer update') assert (get_new_command(Command('composer pdate', composer_not_command_one_of_this)) == 'composer selfupdate') + assert (get_new_command(Command('composer install package', + composer_require_instead_of_install)) + == 'composer require package') diff --git a/thefuck/rules/composer_not_command.py b/thefuck/rules/composer_not_command.py index bfe4c5a4..b6788009 100644 --- a/thefuck/rules/composer_not_command.py +++ b/thefuck/rules/composer_not_command.py @@ -5,12 +5,18 @@ from thefuck.utils import replace_argument, for_app @for_app('composer') def match(command): return (('did you mean this?' in command.output.lower() - or 'did you mean one of these?' in command.output.lower())) + or 'did you mean one of these?' in command.output.lower())) or ( + "install" in command.script_parts and "composer require" in command.output.lower() + ) def get_new_command(command): - broken_cmd = re.findall(r"Command \"([^']*)\" is not defined", command.output)[0] - new_cmd = re.findall(r'Did you mean this\?[^\n]*\n\s*([^\n]*)', command.output) - if not new_cmd: - new_cmd = re.findall(r'Did you mean one of these\?[^\n]*\n\s*([^\n]*)', command.output) - return replace_argument(command.script, broken_cmd, new_cmd[0].strip()) + if "install" in command.script_parts and "composer require" in command.output.lower(): + broken_cmd, new_cmd = "install", "require" + else: + broken_cmd = re.findall(r"Command \"([^']*)\" is not defined", command.output)[0] + new_cmd = re.findall(r'Did you mean this\?[^\n]*\n\s*([^\n]*)', command.output) + if not new_cmd: + new_cmd = re.findall(r'Did you mean one of these\?[^\n]*\n\s*([^\n]*)', command.output) + new_cmd = new_cmd[0].strip() + return replace_argument(command.script, broken_cmd, new_cmd)