diff --git a/.travis.yml b/.travis.yml index 532e05b7..4f7194cf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,37 +1,19 @@ language: python sudo: false +os: linux +dist: xenial matrix: include: - - os: linux - dist: xenial - python: "nightly" - - os: linux - dist: xenial - python: "3.8-dev" - - os: linux - dist: xenial - python: "3.8" - - os: linux - dist: xenial - python: "3.7-dev" - - os: linux - dist: xenial - python: "3.7" - - os: linux - dist: trusty - python: "3.6-dev" - - os: linux - dist: trusty - python: "3.6" - - os: linux - dist: trusty - python: "3.5" - - os: linux - dist: trusty - python: "3.4" - - os: linux - dist: trusty - python: "2.7" + - python: "nightly" + - python: "3.8-dev" + - python: "3.8" + - python: "3.7-dev" + - python: "3.7" + - python: "3.6-dev" + - python: "3.6" + - python: "3.5" + - python: "3.4" + - python: "2.7" - os: osx language: generic allow_failures: diff --git a/README.md b/README.md index 293a4783..1c8fe389 100644 --- a/README.md +++ b/README.md @@ -279,6 +279,7 @@ following rules are enabled by default: * `quotation_marks` – fixes uneven usage of `'` and `"` when containing args'; * `path_from_history` – replaces not found path with similar absolute path from history; * `react_native_command_unrecognized` – fixes unrecognized `react-native` commands; +* `remove_shell_prompt_literal` – remove leading shell prompt symbol `$`, common when copying commands from documentations; * `remove_trailing_cedilla` – remove trailing cedillas `รง`, a common typo for european keyboard layouts; * `rm_dir` – adds `-rf` when you try to remove a directory; * `scm_correction` – corrects wrong scm like `hg log` to `git log`; @@ -389,7 +390,7 @@ requires_output = True Several *The Fuck* parameters can be changed in the file `$XDG_CONFIG_HOME/thefuck/settings.py` (`$XDG_CONFIG_HOME` defaults to `~/.config`): -* `rules` – list of enabled rules, by default `thefuck.conf.DEFAULT_RULES`; +* `rules` – list of enabled rules, by default `thefuck.const.DEFAULT_RULES`; * `exclude_rules` – list of disabled rules, by default `[]`; * `require_confirmation` – requires confirmation before running new command, by default `True`; * `wait_command` – max amount of time in seconds for getting previous command output; diff --git a/tests/rules/test_remove_shell_prompt_literal.py b/tests/rules/test_remove_shell_prompt_literal.py new file mode 100644 index 00000000..37e0ef29 --- /dev/null +++ b/tests/rules/test_remove_shell_prompt_literal.py @@ -0,0 +1,38 @@ +import pytest +from thefuck.rules.remove_shell_prompt_literal import match, get_new_command +from thefuck.types import Command + + +@pytest.fixture +def output(): + return "$: command not found" + + +@pytest.mark.parametrize("script", ["$ cd newdir", " $ cd newdir"]) +def test_match(script, output): + assert match(Command(script, output)) + + +@pytest.mark.parametrize( + "command", + [ + Command("$", "$: command not found"), + Command(" $", "$: command not found"), + Command("$?", "127: command not found"), + Command(" $?", "127: command not found"), + Command("", ""), + ], +) +def test_not_match(command): + assert not match(command) + + +@pytest.mark.parametrize( + "script, new_command", + [ + ("$ cd newdir", "cd newdir"), + ("$ python3 -m virtualenv env", "python3 -m virtualenv env"), + ], +) +def test_get_new_command(script, new_command, output): + assert get_new_command(Command(script, output)) == new_command diff --git a/thefuck/rules/remove_shell_prompt_literal.py b/thefuck/rules/remove_shell_prompt_literal.py new file mode 100644 index 00000000..a2842949 --- /dev/null +++ b/thefuck/rules/remove_shell_prompt_literal.py @@ -0,0 +1,22 @@ +"""Fixes error for commands containing the shell prompt symbol '$'. + +This usually happens when commands are copied from documentations +including them in their code blocks. + +Example: +> $ git clone https://github.com/nvbn/thefuck.git +bash: $: command not found... +""" + +import re + + +def match(command): + return ( + "$: command not found" in command.output + and re.search(r"^[\s]*\$ [\S]+", command.script) is not None + ) + + +def get_new_command(command): + return command.script.replace("$", "", 1).strip() diff --git a/thefuck/shells/powershell.py b/thefuck/shells/powershell.py index 59b30ba2..95226d0d 100644 --- a/thefuck/shells/powershell.py +++ b/thefuck/shells/powershell.py @@ -24,9 +24,9 @@ class Powershell(Generic): def how_to_configure(self): return ShellConfiguration( - content=u'iex "thefuck --alias"', + content=u'iex "$(thefuck --alias)"', path='$profile', - reload='& $profile', + reload='. $profile', can_configure_automatically=False) def _get_version(self):