mirror of
https://github.com/nvbn/thefuck.git
synced 2025-01-31 10:11:14 +00:00
#N/A: Add grunt_task_not_found
rule
This commit is contained in:
parent
a2693bd737
commit
844d3af8ae
@ -186,6 +186,7 @@ using the matched rule and runs it. Rules enabled by default are as follows:
|
|||||||
* `gradle_wrapper` – replaces `gradle` with `./gradlew`;
|
* `gradle_wrapper` – replaces `gradle` with `./gradlew`;
|
||||||
* `grep_arguments_order` – fixes grep arguments order for situations like `grep -lir . test`;
|
* `grep_arguments_order` – fixes grep arguments order for situations like `grep -lir . test`;
|
||||||
* `grep_recursive` – adds `-r` when you trying to `grep` directory;
|
* `grep_recursive` – adds `-r` when you trying to `grep` directory;
|
||||||
|
* `grunt_task_not_found` – fixes misspelled `grunt` commands;
|
||||||
* `gulp_not_task` – fixes misspelled `gulp` tasks;
|
* `gulp_not_task` – fixes misspelled `gulp` tasks;
|
||||||
* `has_exists_script` – prepends `./` when script/binary exists;
|
* `has_exists_script` – prepends `./` when script/binary exists;
|
||||||
* `heroku_not_command` – fixes wrong `heroku` commands like `heroku log`;
|
* `heroku_not_command` – fixes wrong `heroku` commands like `heroku log`;
|
||||||
|
127
tests/rules/test_grunt_task_not_found.py
Normal file
127
tests/rules/test_grunt_task_not_found.py
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
from io import BytesIO
|
||||||
|
import pytest
|
||||||
|
from tests.utils import Command
|
||||||
|
from thefuck.rules.grunt_task_not_found import match, get_new_command
|
||||||
|
|
||||||
|
stdout = '''
|
||||||
|
Warning: Task "{}" not found. Use --force to continue.
|
||||||
|
|
||||||
|
Aborted due to warnings.
|
||||||
|
|
||||||
|
|
||||||
|
Execution Time (2016-08-13 21:01:40 UTC+3)
|
||||||
|
loading tasks 11ms ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ 92%
|
||||||
|
Total 12ms
|
||||||
|
|
||||||
|
'''.format
|
||||||
|
|
||||||
|
grunt_help_stdout = b'''
|
||||||
|
Grunt: The JavaScript Task Runner (v0.4.5)
|
||||||
|
|
||||||
|
Usage
|
||||||
|
grunt [options] [task [task ...]]
|
||||||
|
|
||||||
|
Options
|
||||||
|
--help, -h Display this help text.
|
||||||
|
--base Specify an alternate base path. By default, all file paths are
|
||||||
|
relative to the Gruntfile. (grunt.file.setBase) *
|
||||||
|
--no-color Disable colored output.
|
||||||
|
--gruntfile Specify an alternate Gruntfile. By default, grunt looks in the
|
||||||
|
current or parent directories for the nearest Gruntfile.js or
|
||||||
|
Gruntfile.coffee file.
|
||||||
|
--debug, -d Enable debugging mode for tasks that support it.
|
||||||
|
--stack Print a stack trace when exiting with a warning or fatal error.
|
||||||
|
--force, -f A way to force your way past warnings. Want a suggestion? Don't
|
||||||
|
use this option, fix your code.
|
||||||
|
--tasks Additional directory paths to scan for task and "extra" files.
|
||||||
|
(grunt.loadTasks) *
|
||||||
|
--npm Npm-installed grunt plugins to scan for task and "extra" files.
|
||||||
|
(grunt.loadNpmTasks) *
|
||||||
|
--no-write Disable writing files (dry run).
|
||||||
|
--verbose, -v Verbose mode. A lot more information output.
|
||||||
|
--version, -V Print the grunt version. Combine with --verbose for more info.
|
||||||
|
--completion Output shell auto-completion rules. See the grunt-cli
|
||||||
|
documentation for more information.
|
||||||
|
|
||||||
|
Options marked with * have methods exposed via the grunt API and should instead
|
||||||
|
be specified inside the Gruntfile wherever possible.
|
||||||
|
|
||||||
|
Available tasks
|
||||||
|
autoprefixer Prefix CSS files. *
|
||||||
|
concurrent Run grunt tasks concurrently *
|
||||||
|
clean Clean files and folders. *
|
||||||
|
compass Compile Sass to CSS using Compass *
|
||||||
|
concat Concatenate files. *
|
||||||
|
connect Start a connect web server. *
|
||||||
|
copy Copy files. *
|
||||||
|
cssmin Minify CSS *
|
||||||
|
htmlmin Minify HTML *
|
||||||
|
imagemin Minify PNG, JPEG, GIF and SVG images *
|
||||||
|
jshint Validate files with JSHint. *
|
||||||
|
uglify Minify files with UglifyJS. *
|
||||||
|
watch Run predefined tasks whenever watched files change.
|
||||||
|
filerev File revisioning based on content hashing *
|
||||||
|
cdnify Replace scripts with refs to the Google CDN *
|
||||||
|
karma run karma. *
|
||||||
|
newer Run a task with only those source files that have been modified
|
||||||
|
since the last successful run.
|
||||||
|
any-newer DEPRECATED TASK. Use the "newer" task instead
|
||||||
|
newer-postrun Internal task.
|
||||||
|
newer-clean Remove cached timestamps.
|
||||||
|
ngAnnotate Add, remove and rebuild AngularJS dependency injection
|
||||||
|
annotations *
|
||||||
|
ngconstant Dynamic angular constant generator task. *
|
||||||
|
svgmin Minify SVG *
|
||||||
|
usemin Replaces references to non-minified scripts / stylesheets *
|
||||||
|
useminPrepare Using HTML markup as the primary source of information *
|
||||||
|
wiredep Inject Bower components into your source code. *
|
||||||
|
serve Compile then start a connect web server
|
||||||
|
server DEPRECATED TASK. Use the "serve" task instead
|
||||||
|
test Alias for "clean:server", "ngconstant:test", "wiredep",
|
||||||
|
"concurrent:test", "autoprefixer", "connect:test", "karma"
|
||||||
|
tasks.
|
||||||
|
build Alias for "ngconstant:production", "clean:dist", "wiredep",
|
||||||
|
"useminPrepare", "concurrent:dist", "autoprefixer", "concat",
|
||||||
|
"ngAnnotate", "copy:dist", "cdnify", "cssmin", "uglify",
|
||||||
|
"filerev", "usemin", "htmlmin" tasks.
|
||||||
|
default Alias for "newer:jshint", "test", "build" tasks.
|
||||||
|
|
||||||
|
Tasks run in the order specified. Arguments may be passed to tasks that accept
|
||||||
|
them by using colons, like "lint:files". Tasks marked with * are "multi tasks"
|
||||||
|
and will iterate over all sub-targets if no argument is specified.
|
||||||
|
|
||||||
|
The list of available tasks may change based on tasks directories or grunt
|
||||||
|
plugins specified in the Gruntfile or via command-line options.
|
||||||
|
|
||||||
|
For more information, see http://gruntjs.com/
|
||||||
|
'''
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(autouse=True)
|
||||||
|
def grunt_help(mocker):
|
||||||
|
patch = mocker.patch('thefuck.rules.grunt_task_not_found.Popen')
|
||||||
|
patch.return_value.stdout = BytesIO(grunt_help_stdout)
|
||||||
|
return patch
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('command', [
|
||||||
|
Command('grunt defualt', stdout('defualt')),
|
||||||
|
Command('grunt buld:css', stdout('buld:css'))])
|
||||||
|
def test_match(command):
|
||||||
|
assert match(command)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('command', [
|
||||||
|
Command('npm nuild', stdout('nuild')),
|
||||||
|
Command('grunt rm')])
|
||||||
|
def test_not_match(command):
|
||||||
|
assert not match(command)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('command, result', [
|
||||||
|
(Command('grunt defualt', stdout('defualt')), 'grunt default'),
|
||||||
|
(Command('grunt cmpass:all', stdout('cmpass:all')), 'grunt compass:all'),
|
||||||
|
(Command('grunt cmpass:all --color', stdout('cmpass:all')),
|
||||||
|
'grunt compass:all --color')])
|
||||||
|
def test_get_new_command(command, result):
|
||||||
|
assert get_new_command(command) == result
|
@ -2,10 +2,12 @@ import re
|
|||||||
from subprocess import Popen, PIPE
|
from subprocess import Popen, PIPE
|
||||||
from thefuck.utils import for_app, eager, replace_command
|
from thefuck.utils import for_app, eager, replace_command
|
||||||
|
|
||||||
|
regex = re.compile(r"Task '(.*)' (is ambiguous|not found)")
|
||||||
|
|
||||||
|
|
||||||
@for_app('gradle', './gradlew')
|
@for_app('gradle', './gradlew')
|
||||||
def match(command):
|
def match(command):
|
||||||
return re.findall(r"Task '(.*)' (is ambiguous|not found)", command.stderr)
|
return regex.findall(command.stderr)
|
||||||
|
|
||||||
|
|
||||||
@eager
|
@eager
|
||||||
@ -27,7 +29,6 @@ def _get_all_tasks(gradle):
|
|||||||
|
|
||||||
|
|
||||||
def get_new_command(command):
|
def get_new_command(command):
|
||||||
wrong_task = re.findall(r"Task '(.*)' (is ambiguous|not found)",
|
wrong_task = regex.findall(command.stderr)[0][0]
|
||||||
command.stderr)[0][0]
|
|
||||||
all_tasks = _get_all_tasks(command.script_parts[0])
|
all_tasks = _get_all_tasks(command.script_parts[0])
|
||||||
return replace_command(command, wrong_task, all_tasks)
|
return replace_command(command, wrong_task, all_tasks)
|
||||||
|
36
thefuck/rules/grunt_task_not_found.py
Normal file
36
thefuck/rules/grunt_task_not_found.py
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
import re
|
||||||
|
from subprocess import Popen, PIPE
|
||||||
|
from thefuck.utils import for_app, eager, get_closest
|
||||||
|
|
||||||
|
regex = re.compile(r'Warning: Task "(.*)" not found.')
|
||||||
|
|
||||||
|
|
||||||
|
@for_app('grunt')
|
||||||
|
def match(command):
|
||||||
|
return regex.findall(command.stdout)
|
||||||
|
|
||||||
|
|
||||||
|
@eager
|
||||||
|
def _get_all_tasks():
|
||||||
|
proc = Popen(['grunt', '--help'], stdout=PIPE)
|
||||||
|
should_yield = False
|
||||||
|
for line in proc.stdout.readlines():
|
||||||
|
line = line.decode().strip()
|
||||||
|
|
||||||
|
if 'Available tasks' in line:
|
||||||
|
should_yield = True
|
||||||
|
continue
|
||||||
|
|
||||||
|
if should_yield and not line:
|
||||||
|
return
|
||||||
|
|
||||||
|
if ' ' in line:
|
||||||
|
yield line.split(' ')[0]
|
||||||
|
|
||||||
|
|
||||||
|
def get_new_command(command):
|
||||||
|
misspelled_task = regex.findall(command.stdout)[0].split(':')[0]
|
||||||
|
tasks = _get_all_tasks()
|
||||||
|
fixed = get_closest(misspelled_task, tasks)
|
||||||
|
return command.script.replace(' {}'.format(misspelled_task),
|
||||||
|
' {}'.format(fixed))
|
Loading…
x
Reference in New Issue
Block a user