mirror of
				https://github.com/nvbn/thefuck.git
				synced 2025-10-30 22:54:14 +00:00 
			
		
		
		
	git push origin masterMerge branch 'mlk-35_mvn'
This commit is contained in:
		| @@ -181,6 +181,8 @@ using the matched rule and runs it. Rules enabled by default are as follows: | |||||||
| * `man_no_space` – fixes man commands without spaces, for example `mandiff`; | * `man_no_space` – fixes man commands without spaces, for example `mandiff`; | ||||||
| * `mercurial` – fixes wrong `hg` commands; | * `mercurial` – fixes wrong `hg` commands; | ||||||
| * `mkdir_p` – adds `-p` when you trying to create directory without parent; | * `mkdir_p` – adds `-p` when you trying to create directory without parent; | ||||||
|  | * `mvn_no_command` – adds `clean package` to `mvn`; | ||||||
|  | * `mvn_unknown_lifecycle_phase` – fixes miss spelt lifecycle phases with `mvn`; | ||||||
| * `no_command` – fixes wrong console commands, for example `vom/vim`; | * `no_command` – fixes wrong console commands, for example `vom/vim`; | ||||||
| * `no_such_file` – creates missing directories with `mv` and `cp` commands; | * `no_such_file` – creates missing directories with `mv` and `cp` commands; | ||||||
| * `open` – prepends `http` to address passed to `open`; | * `open` – prepends `http` to address passed to `open`; | ||||||
|   | |||||||
							
								
								
									
										40
									
								
								tests/rules/test_mvn_no_command.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								tests/rules/test_mvn_no_command.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | |||||||
|  | import pytest | ||||||
|  | from thefuck.rules.mvn_no_command import match, get_new_command | ||||||
|  | from tests.utils import Command | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @pytest.mark.parametrize('command', [ | ||||||
|  |     Command(script='mvn', stdout='[ERROR] No goals have been specified for this build. You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>. Available lifecycle phases are: validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy, pre-clean, clean, post-clean, pre-site, site, post-site, site-deploy. -> [Help 1]')]) | ||||||
|  | def test_match(command): | ||||||
|  |     assert match(command, None) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @pytest.mark.parametrize('command', [ | ||||||
|  |     Command(script='mvn clean', stdout=""" | ||||||
|  | [INFO] Scanning for projects...[INFO]                                                                          | ||||||
|  | [INFO] ------------------------------------------------------------------------ | ||||||
|  | [INFO] Building test 0.2 | ||||||
|  | [INFO] ------------------------------------------------------------------------ | ||||||
|  | [INFO]  | ||||||
|  | [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ test --- | ||||||
|  | [INFO] Deleting /home/mlk/code/test/target | ||||||
|  | [INFO] ------------------------------------------------------------------------ | ||||||
|  | [INFO] BUILD SUCCESS | ||||||
|  | [INFO] ------------------------------------------------------------------------ | ||||||
|  | [INFO] Total time: 0.477s | ||||||
|  | [INFO] Finished at: Wed Aug 26 13:05:47 BST 2015 | ||||||
|  | [INFO] Final Memory: 6M/240M | ||||||
|  | [INFO] ------------------------------------------------------------------------ | ||||||
|  | """), | ||||||
|  |     Command(script='mvn --help'), | ||||||
|  |     Command(script='mvn -v') | ||||||
|  | ]) | ||||||
|  | def test_not_match(command): | ||||||
|  |     assert not match(command, None) | ||||||
|  |  | ||||||
|  | @pytest.mark.parametrize('command, new_command', [ | ||||||
|  |     (Command(script='mvn', stdout='[ERROR] No goals have been specified for this build. You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>. Available lifecycle phases are: validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy, pre-clean, clean, post-clean, pre-site, site, post-site, site-deploy. -> [Help 1]'), ['mvn clean package', 'mvn clean install']), | ||||||
|  |     (Command(script='mvn -N', stdout='[ERROR] No goals have been specified for this build. You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>. Available lifecycle phases are: validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy, pre-clean, clean, post-clean, pre-site, site, post-site, site-deploy. -> [Help 1]'), ['mvn -N clean package', 'mvn -N clean install'])]) | ||||||
|  | def test_get_new_command(command, new_command): | ||||||
|  |     assert get_new_command(command, None) == new_command | ||||||
|  |  | ||||||
							
								
								
									
										40
									
								
								tests/rules/test_mvn_unknown_lifecycle_phase.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								tests/rules/test_mvn_unknown_lifecycle_phase.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | |||||||
|  | import pytest | ||||||
|  | from thefuck.rules.mvn_unknown_lifecycle_phase import match, get_new_command | ||||||
|  | from tests.utils import Command | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @pytest.mark.parametrize('command', [ | ||||||
|  |     Command(script='mvn cle', stdout='[ERROR] Unknown lifecycle phase "cle". You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>. Available lifecycle phases are: validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy, pre-clean, clean, post-clean, pre-site, site, post-site, site-deploy. -> [Help 1]')]) | ||||||
|  | def test_match(command): | ||||||
|  |     assert match(command, None) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @pytest.mark.parametrize('command', [ | ||||||
|  |     Command(script='mvn clean', stdout=""" | ||||||
|  | [INFO] Scanning for projects...[INFO]                                                                          | ||||||
|  | [INFO] ------------------------------------------------------------------------ | ||||||
|  | [INFO] Building test 0.2 | ||||||
|  | [INFO] ------------------------------------------------------------------------ | ||||||
|  | [INFO]  | ||||||
|  | [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ test --- | ||||||
|  | [INFO] Deleting /home/mlk/code/test/target | ||||||
|  | [INFO] ------------------------------------------------------------------------ | ||||||
|  | [INFO] BUILD SUCCESS | ||||||
|  | [INFO] ------------------------------------------------------------------------ | ||||||
|  | [INFO] Total time: 0.477s | ||||||
|  | [INFO] Finished at: Wed Aug 26 13:05:47 BST 2015 | ||||||
|  | [INFO] Final Memory: 6M/240M | ||||||
|  | [INFO] ------------------------------------------------------------------------ | ||||||
|  | """), | ||||||
|  |     Command(script='mvn --help'), | ||||||
|  |     Command(script='mvn -v') | ||||||
|  | ]) | ||||||
|  | def test_not_match(command): | ||||||
|  |     assert not match(command, None) | ||||||
|  |  | ||||||
|  | @pytest.mark.parametrize('command, new_command', [ | ||||||
|  |     (Command(script='mvn cle', stdout='[ERROR] Unknown lifecycle phase "cle". You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>. Available lifecycle phases are: validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy, pre-clean, clean, post-clean, pre-site, site, post-site, site-deploy. -> [Help 1]'), ['mvn clean', 'mvn compile']), | ||||||
|  |     (Command(script='mvn claen package', stdout='[ERROR] Unknown lifecycle phase "claen". You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>. Available lifecycle phases are: validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy, pre-clean, clean, post-clean, pre-site, site, post-site, site-deploy. -> [Help 1]'), ['mvn clean package'])]) | ||||||
|  | def test_get_new_command(command, new_command): | ||||||
|  |     assert get_new_command(command, None) == new_command | ||||||
|  |  | ||||||
| @@ -2,8 +2,9 @@ import pytest | |||||||
| from mock import Mock | from mock import Mock | ||||||
| from thefuck.utils import wrap_settings,\ | from thefuck.utils import wrap_settings,\ | ||||||
|     memoize, get_closest, get_all_executables, replace_argument, \ |     memoize, get_closest, get_all_executables, replace_argument, \ | ||||||
|     get_all_matched_commands |     get_all_matched_commands, is_app, for_app | ||||||
| from thefuck.types import Settings | from thefuck.types import Settings | ||||||
|  | from tests.utils import Command | ||||||
|  |  | ||||||
|  |  | ||||||
| @pytest.mark.parametrize('override, old, new', [ | @pytest.mark.parametrize('override, old, new', [ | ||||||
| @@ -93,3 +94,25 @@ def test_replace_argument(args, result): | |||||||
|                             'service-status', 'service-unbind'])]) |                             'service-status', 'service-unbind'])]) | ||||||
| def test_get_all_matched_commands(stderr, result): | def test_get_all_matched_commands(stderr, result): | ||||||
|     assert list(get_all_matched_commands(stderr)) == result |     assert list(get_all_matched_commands(stderr)) == result | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @pytest.mark.usefixtures('no_memoize') | ||||||
|  | @pytest.mark.parametrize('script, names, result', [ | ||||||
|  |     ('git diff', ['git', 'hub'], True), | ||||||
|  |     ('hub diff', ['git', 'hub'], True), | ||||||
|  |     ('hg diff', ['git', 'hub'], False)]) | ||||||
|  | def test_is_app(script, names, result): | ||||||
|  |     assert is_app(Command(script), *names) == result | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @pytest.mark.usefixtures('no_memoize') | ||||||
|  | @pytest.mark.parametrize('script, names, result', [ | ||||||
|  |     ('git diff', ['git', 'hub'], True), | ||||||
|  |     ('hub diff', ['git', 'hub'], True), | ||||||
|  |     ('hg diff', ['git', 'hub'], False)]) | ||||||
|  | def test_for_app(script, names, result): | ||||||
|  |     @for_app(*names) | ||||||
|  |     def match(command, settings): | ||||||
|  |         return True | ||||||
|  |  | ||||||
|  |     assert match(Command(script), None) == result | ||||||
|   | |||||||
							
								
								
									
										11
									
								
								thefuck/rules/mvn_no_command.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								thefuck/rules/mvn_no_command.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | |||||||
|  | from thefuck.utils import for_app | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @for_app('mvn') | ||||||
|  | def match(command, settings): | ||||||
|  |     return 'No goals have been specified for this build' in command.stdout | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def get_new_command(command, settings): | ||||||
|  |     return [command.script + ' clean package', | ||||||
|  |             command.script + ' clean install'] | ||||||
							
								
								
									
										32
									
								
								thefuck/rules/mvn_unknown_lifecycle_phase.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								thefuck/rules/mvn_unknown_lifecycle_phase.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | |||||||
|  | from thefuck.utils import replace_command, for_app | ||||||
|  | from difflib import get_close_matches | ||||||
|  | import re | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def _get_failed_lifecycle(command): | ||||||
|  |     return re.search(r'\[ERROR\] Unknown lifecycle phase "(.+)"', | ||||||
|  |                      command.stdout) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def _getavailable_lifecycles(command): | ||||||
|  |     return re.search( | ||||||
|  |         r'Available lifecycle phases are: (.+) -> \[Help 1\]', command.stdout) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @for_app('mvn') | ||||||
|  | def match(command, settings): | ||||||
|  |     failed_lifecycle = _get_failed_lifecycle(command) | ||||||
|  |     available_lifecycles = _getavailable_lifecycles(command) | ||||||
|  |     return available_lifecycles and failed_lifecycle | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def get_new_command(command, settings): | ||||||
|  |     failed_lifecycle = _get_failed_lifecycle(command) | ||||||
|  |     available_lifecycles = _getavailable_lifecycles(command) | ||||||
|  |     if available_lifecycles and failed_lifecycle: | ||||||
|  |         selected_lifecycle = get_close_matches( | ||||||
|  |             failed_lifecycle.group(1), available_lifecycles.group(1).split(", "), | ||||||
|  |             3, 0.6) | ||||||
|  |         return replace_command(command, failed_lifecycle.group(1), selected_lifecycle) | ||||||
|  |     else: | ||||||
|  |         return [] | ||||||
| @@ -132,3 +132,27 @@ def replace_command(command, broken, matched): | |||||||
|     new_cmds = get_close_matches(broken, matched, cutoff=0.1) |     new_cmds = get_close_matches(broken, matched, cutoff=0.1) | ||||||
|     return [replace_argument(command.script, broken, new_cmd.strip()) |     return [replace_argument(command.script, broken, new_cmd.strip()) | ||||||
|             for new_cmd in new_cmds] |             for new_cmd in new_cmds] | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @memoize | ||||||
|  | def is_app(command, *app_names): | ||||||
|  |     """Returns `True` if command is call to one of passed app names.""" | ||||||
|  |     for name in app_names: | ||||||
|  |         if command.script == name \ | ||||||
|  |                 or command.script.startswith(u'{} '.format(name)): | ||||||
|  |             return True | ||||||
|  |     return False | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def for_app(*app_names): | ||||||
|  |     """Specifies that matching script is for on of app names.""" | ||||||
|  |     def decorator(fn): | ||||||
|  |         @wraps(fn) | ||||||
|  |         def wrapper(command, settings): | ||||||
|  |             if is_app(command, *app_names): | ||||||
|  |                 return fn(command, settings) | ||||||
|  |             else: | ||||||
|  |                 return False | ||||||
|  |  | ||||||
|  |         return wrapper | ||||||
|  |     return decorator | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user