mirror of
				https://github.com/nvbn/thefuck.git
				synced 2025-10-31 15:12:20 +00:00 
			
		
		
		
	Merge pull request #319 from scorphus/tsuru-not-command
Add a new `tsuru_not_command` rule
This commit is contained in:
		| @@ -188,6 +188,7 @@ using the matched rule and runs it. Rules enabled by default are as follows: | |||||||
| * `systemctl` – correctly orders parameters of confusing `systemctl`; | * `systemctl` – correctly orders parameters of confusing `systemctl`; | ||||||
| * `test.py` – runs `py.test` instead of `test.py`; | * `test.py` – runs `py.test` instead of `test.py`; | ||||||
| * `tsuru_login` – runs `tsuru login` if not authenticated or session expired; | * `tsuru_login` – runs `tsuru login` if not authenticated or session expired; | ||||||
|  | * `tsuru_not_command` – fixes wrong tsuru commands like `tsuru shell`; | ||||||
| * `tmux` – fixes `tmux` commands; | * `tmux` – fixes `tmux` commands; | ||||||
| * `whois` – fixes `whois` command. | * `whois` – fixes `whois` command. | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										90
									
								
								tests/rules/test_tsuru_not_command.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								tests/rules/test_tsuru_not_command.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,90 @@ | |||||||
|  | import pytest | ||||||
|  |  | ||||||
|  | from tests.utils import Command | ||||||
|  | from thefuck.rules.tsuru_not_command import match, get_new_command | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @pytest.mark.parametrize('command', [ | ||||||
|  |     Command('tsuru log', stderr=( | ||||||
|  |         'tsuru: "tchururu" is not a tsuru command. See "tsuru help".\n' | ||||||
|  |         '\nDid you mean?\n' | ||||||
|  |         '\tapp-log\n' | ||||||
|  |         '\tlogin\n' | ||||||
|  |         '\tlogout\n' | ||||||
|  |     )), | ||||||
|  |     Command('tsuru app-l', stderr=( | ||||||
|  |         'tsuru: "tchururu" is not a tsuru command. See "tsuru help".\n' | ||||||
|  |         '\nDid you mean?\n' | ||||||
|  |         '\tapp-list\n' | ||||||
|  |         '\tapp-log\n' | ||||||
|  |     )), | ||||||
|  |     Command('tsuru user-list', stderr=( | ||||||
|  |         'tsuru: "tchururu" is not a tsuru command. See "tsuru help".\n' | ||||||
|  |         '\nDid you mean?\n' | ||||||
|  |         '\tteam-user-list\n' | ||||||
|  |     )), | ||||||
|  |     Command('tsuru targetlist', stderr=( | ||||||
|  |         'tsuru: "tchururu" is not a tsuru command. See "tsuru help".\n' | ||||||
|  |         '\nDid you mean?\n' | ||||||
|  |         '\ttarget-list\n' | ||||||
|  |     )), | ||||||
|  | ]) | ||||||
|  | def test_match(command): | ||||||
|  |     assert match(command, None) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @pytest.mark.parametrize('command', [ | ||||||
|  |     Command('tsuru tchururu', stderr=( | ||||||
|  |         'tsuru: "tchururu" is not a tsuru command. See "tsuru help".\n' | ||||||
|  |         '\nDid you mean?\n' | ||||||
|  |     )), | ||||||
|  |     Command('tsuru version', stderr='tsuru version 0.16.0.'), | ||||||
|  |     Command('tsuru help', stderr=( | ||||||
|  |         'tsuru version 0.16.0.\n' | ||||||
|  |         '\nUsage: tsuru command [args]\n' | ||||||
|  |     )), | ||||||
|  |     Command('tsuru platform-list', stderr=( | ||||||
|  |         '- java\n' | ||||||
|  |         '- logstashgiro\n' | ||||||
|  |         '- newnode\n' | ||||||
|  |         '- nodejs\n' | ||||||
|  |         '- php\n' | ||||||
|  |         '- python\n' | ||||||
|  |         '- python3\n' | ||||||
|  |         '- ruby\n' | ||||||
|  |         '- ruby20\n' | ||||||
|  |         '- static\n' | ||||||
|  |     )), | ||||||
|  |     Command('tsuru env-get', stderr='Error: App thefuck not found.'), | ||||||
|  | ]) | ||||||
|  | def test_not_match(command): | ||||||
|  |     assert not match(command, None) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @pytest.mark.parametrize('command, new_command', [ | ||||||
|  |     (Command('tsuru log', stderr=( | ||||||
|  |         'tsuru: "log" is not a tsuru command. See "tsuru help".\n' | ||||||
|  |         '\nDid you mean?\n' | ||||||
|  |         '\tapp-log\n' | ||||||
|  |         '\tlogin\n' | ||||||
|  |         '\tlogout\n' | ||||||
|  |     )), 'tsuru login'), | ||||||
|  |     (Command('tsuru app-l', stderr=( | ||||||
|  |         'tsuru: "app-l" is not a tsuru command. See "tsuru help".\n' | ||||||
|  |         '\nDid you mean?\n' | ||||||
|  |         '\tapp-list\n' | ||||||
|  |         '\tapp-log\n' | ||||||
|  |     )), 'tsuru app-log'), | ||||||
|  |     (Command('tsuru user-list', stderr=( | ||||||
|  |         'tsuru: "user-list" is not a tsuru command. See "tsuru help".\n' | ||||||
|  |         '\nDid you mean?\n' | ||||||
|  |         '\tteam-user-list\n' | ||||||
|  |     )), 'tsuru team-user-list'), | ||||||
|  |     (Command('tsuru targetlist', stderr=( | ||||||
|  |         'tsuru: "targetlist" is not a tsuru command. See "tsuru help".\n' | ||||||
|  |         '\nDid you mean?\n' | ||||||
|  |         '\ttarget-list\n' | ||||||
|  |     )), 'tsuru target-list'), | ||||||
|  | ]) | ||||||
|  | def test_get_new_command(command, new_command): | ||||||
|  |     assert get_new_command(command, None) == new_command | ||||||
| @@ -1,7 +1,8 @@ | |||||||
| import pytest | import pytest | ||||||
| from mock import Mock | from mock import Mock | ||||||
| from thefuck.utils import git_support, sudo_support, wrap_settings,\ | from thefuck.utils import git_support, sudo_support, wrap_settings,\ | ||||||
|     memoize, get_closest, get_all_executables, replace_argument |     memoize, get_closest, get_all_executables, replace_argument, \ | ||||||
|  |     get_all_matched_commands | ||||||
| from thefuck.types import Settings | from thefuck.types import Settings | ||||||
| from tests.utils import Command | from tests.utils import Command | ||||||
|  |  | ||||||
| @@ -99,3 +100,32 @@ def test_get_all_callables(): | |||||||
|     (('git brnch', 'brnch', 'branch'), 'git branch')]) |     (('git brnch', 'brnch', 'branch'), 'git branch')]) | ||||||
| def test_replace_argument(args, result): | def test_replace_argument(args, result): | ||||||
|     assert replace_argument(*args) == result |     assert replace_argument(*args) == result | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @pytest.mark.parametrize('stderr, result', [ | ||||||
|  |     (("git: 'cone' is not a git command. See 'git --help'.\n" | ||||||
|  |       '\n' | ||||||
|  |       'Did you mean one of these?\n' | ||||||
|  |       '\tclone'), ['clone']), | ||||||
|  |     (("git: 're' is not a git command. See 'git --help'.\n" | ||||||
|  |       '\n' | ||||||
|  |       'Did you mean one of these?\n' | ||||||
|  |       '\trebase\n' | ||||||
|  |       '\treset\n' | ||||||
|  |       '\tgrep\n' | ||||||
|  |       '\trm'), ['rebase', 'reset', 'grep', 'rm']), | ||||||
|  |     (('tsuru: "target" is not a tsuru command. See "tsuru help".\n' | ||||||
|  |       '\n' | ||||||
|  |       'Did you mean one of these?\n' | ||||||
|  |       '\tservice-add\n' | ||||||
|  |       '\tservice-bind\n' | ||||||
|  |       '\tservice-doc\n' | ||||||
|  |       '\tservice-info\n' | ||||||
|  |       '\tservice-list\n' | ||||||
|  |       '\tservice-remove\n' | ||||||
|  |       '\tservice-status\n' | ||||||
|  |       '\tservice-unbind'), ['service-add', 'service-bind', 'service-doc', | ||||||
|  |                             'service-info', 'service-list', 'service-remove', | ||||||
|  |                             'service-status', 'service-unbind'])]) | ||||||
|  | def test_get_all_matched_commands(stderr, result): | ||||||
|  |     assert list(get_all_matched_commands(stderr)) == result | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| import re | import re | ||||||
| from thefuck.utils import get_closest, git_support, replace_argument | from thefuck.utils import (get_closest, git_support, replace_argument, | ||||||
|  |                            get_all_matched_commands) | ||||||
|  |  | ||||||
|  |  | ||||||
| @git_support | @git_support | ||||||
| @@ -8,20 +9,11 @@ def match(command, settings): | |||||||
|             and 'Did you mean' in command.stderr) |             and 'Did you mean' in command.stderr) | ||||||
|  |  | ||||||
|  |  | ||||||
| def _get_all_git_matched_commands(stderr): |  | ||||||
|     should_yield = False |  | ||||||
|     for line in stderr.split('\n'): |  | ||||||
|         if 'Did you mean' in line: |  | ||||||
|             should_yield = True |  | ||||||
|         elif should_yield and line: |  | ||||||
|             yield line.strip() |  | ||||||
|  |  | ||||||
|  |  | ||||||
| @git_support | @git_support | ||||||
| def get_new_command(command, settings): | def get_new_command(command, settings): | ||||||
|     broken_cmd = re.findall(r"git: '([^']*)' is not a git command", |     broken_cmd = re.findall(r"git: '([^']*)' is not a git command", | ||||||
|                             command.stderr)[0] |                             command.stderr)[0] | ||||||
|     new_cmd = get_closest(broken_cmd, |     new_cmd = get_closest(broken_cmd, | ||||||
|                           _get_all_git_matched_commands(command.stderr)) |                           get_all_matched_commands(command.stderr)) | ||||||
|     return replace_argument(command.script, broken_cmd, new_cmd) |     return replace_argument(command.script, broken_cmd, new_cmd) | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										18
									
								
								thefuck/rules/tsuru_not_command.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								thefuck/rules/tsuru_not_command.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | |||||||
|  | import re | ||||||
|  | from thefuck.utils import (get_closest, replace_argument, | ||||||
|  |                            get_all_matched_commands) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def match(command, settings): | ||||||
|  |     return (command.script.startswith('tsuru ') | ||||||
|  |             and ' is not a tsuru command. See "tsuru help".' in command.stderr | ||||||
|  |             and '\nDid you mean?\n\t' in command.stderr) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def get_new_command(command, settings): | ||||||
|  |     broken_cmd = re.findall(r'tsuru: "([^"]*)" is not a tsuru command', | ||||||
|  |                             command.stderr)[0] | ||||||
|  |     new_cmd = get_closest(broken_cmd, | ||||||
|  |                           get_all_matched_commands(command.stderr)) | ||||||
|  |     return replace_argument(command.script, broken_cmd, new_cmd) | ||||||
|  |  | ||||||
| @@ -159,3 +159,12 @@ def replace_argument(script, from_, to): | |||||||
|     else: |     else: | ||||||
|         return script.replace( |         return script.replace( | ||||||
|             u' {} '.format(from_), u' {} '.format(to), 1) |             u' {} '.format(from_), u' {} '.format(to), 1) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def get_all_matched_commands(stderr, separator='Did you mean'): | ||||||
|  |     should_yield = False | ||||||
|  |     for line in stderr.split('\n'): | ||||||
|  |         if separator in line: | ||||||
|  |             should_yield = True | ||||||
|  |         elif should_yield and line: | ||||||
|  |             yield line.strip() | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user