From 35ea4dce71f2b67c3c8c74acf6b75ab326bfa971 Mon Sep 17 00:00:00 2001 From: Joseph Frazier <1212jtraceur@gmail.com> Date: Fri, 10 Mar 2017 12:54:15 -0500 Subject: [PATCH] Add `yarn_help` rule Yarn likes to keep its documentation online, rather than in `yarn help` output. For example, `yarn help clean` doesn't tell you anything about the `clean` subcommand. Instead, it points you towards https://yarnpkg.com/en/docs/cli/clean This rule detects when that happens, and suggests opening the URL. One caveat is the currently only OSX is supported, as Linux uses `xdg-open` instead of `open`. --- README.md | 1 + tests/rules/test_yarn_help.py | 55 +++++++++++++++++++++++++++++++++++ thefuck/rules/yarn_help.py | 13 +++++++++ 3 files changed, 69 insertions(+) create mode 100644 tests/rules/test_yarn_help.py create mode 100644 thefuck/rules/yarn_help.py diff --git a/README.md b/README.md index 3e84a35a..b4b8b5a5 100644 --- a/README.md +++ b/README.md @@ -250,6 +250,7 @@ using the matched rule and runs it. Rules enabled by default are as follows: * `workon_doesnt_exists` – fixes `virtualenvwrapper` env name os suggests to create new. * `yarn_alias` – fixes aliased `yarn` commands like `yarn ls`; * `yarn_command_not_found` – fixes misspelled `yarn` commands; +* `yarn_help` – makes it easier to open `yarn` documentation; Enabled by default only on specific platforms: diff --git a/tests/rules/test_yarn_help.py b/tests/rules/test_yarn_help.py new file mode 100644 index 00000000..499528f0 --- /dev/null +++ b/tests/rules/test_yarn_help.py @@ -0,0 +1,55 @@ +import pytest +from thefuck.rules.yarn_help import match, get_new_command +from tests.utils import Command + + +stdout_clean = ''' + + Usage: yarn [command] [flags] + + Options: + + -h, --help output usage information + -V, --version output the version number + --verbose output verbose messages on internal operations + --offline trigger an error if any required dependencies are not available in local cache + --prefer-offline use network only if dependencies are not available in local cache + --strict-semver + --json + --ignore-scripts don't run lifecycle scripts + --har save HAR output of network traffic + --ignore-platform ignore platform checks + --ignore-engines ignore engines check + --ignore-optional ignore optional dependencies + --force ignore all caches + --no-bin-links don't generate bin links when setting up packages + --flat only allow one version of a package + --prod, --production [prod] + --no-lockfile don't read or generate a lockfile + --pure-lockfile don't generate a lockfile + --frozen-lockfile don't generate a lockfile and fail if an update is needed + --link-duplicates create hardlinks to the repeated modules in node_modules + --global-folder + --modules-folder rather than installing modules into the node_modules folder relative to the cwd, output them here + --cache-folder specify a custom folder to store the yarn cache + --mutex [:specifier] use a mutex to ensure only one yarn instance is executing + --no-emoji disable emoji in output + --proxy + --https-proxy + --no-progress disable progress bar + --network-concurrency maximum number of concurrent network requests + + Visit https://yarnpkg.com/en/docs/cli/clean for documentation about this command. +''' # noqa + + +@pytest.mark.parametrize('command', [ + Command(script='yarn help clean', stdout=stdout_clean)]) +def test_match(command): + assert match(command) + + +@pytest.mark.parametrize('command, new_command', [ + (Command('yarn help clean', stdout=stdout_clean), 'open https://yarnpkg.com/en/docs/cli/clean')]) +def test_get_new_command(command, new_command): + assert get_new_command(command) == new_command diff --git a/thefuck/rules/yarn_help.py b/thefuck/rules/yarn_help.py new file mode 100644 index 00000000..7fb8280f --- /dev/null +++ b/thefuck/rules/yarn_help.py @@ -0,0 +1,13 @@ +import re +from thefuck.utils import for_app + + +@for_app('yarn', at_least=2) +def match(command): + return command.script_parts[1] == 'help' and ('for documentation about this command.' in command.stdout) + + +def get_new_command(command): + fix = re.findall(r'Visit ([^ ]*) for documentation about this command.', command.stdout)[0] + + return 'open ' + fix