mirror of
https://github.com/nvbn/thefuck.git
synced 2025-01-31 02:01:13 +00:00
Support for yum invalid commands. (#968)
* - Add skeleton code for yum_invalid_operation.py - Add test for rule/yum_invalid_operation * Add: mocker for subprocess.Popen. * Fix: invalid yum_operations. * Fix: Added missing fixtures. * Add: yum_invalid_operation implementation. * Add: enabled_by_default variable for rules/yum_invalid_operation. * Update Readme.
This commit is contained in:
parent
581a292797
commit
0ccb34bde8
@ -322,6 +322,7 @@ The following rules are enabled by default on specific platforms only:
|
|||||||
* `nixos_cmd_not_found` – installs apps on NixOS;
|
* `nixos_cmd_not_found` – installs apps on NixOS;
|
||||||
* `pacman` – installs app with `pacman` if it is not installed (uses `yay` or `yaourt` if available);
|
* `pacman` – installs app with `pacman` if it is not installed (uses `yay` or `yaourt` if available);
|
||||||
* `pacman_not_found` – fixes package name with `pacman`, `yay` or `yaourt`.
|
* `pacman_not_found` – fixes package name with `pacman`, `yay` or `yaourt`.
|
||||||
|
* `yum_invalid_operation` – fixes invalid `yum` calls, like `yum isntall vim`;
|
||||||
|
|
||||||
The following commands are bundled with *The Fuck*, but are not enabled by
|
The following commands are bundled with *The Fuck*, but are not enabled by
|
||||||
default:
|
default:
|
||||||
|
173
tests/rules/test_yum_invalid_operation.py
Normal file
173
tests/rules/test_yum_invalid_operation.py
Normal file
@ -0,0 +1,173 @@
|
|||||||
|
from io import BytesIO
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
from thefuck.rules.yum_invalid_operation import match, get_new_command, _get_operations
|
||||||
|
from thefuck.types import Command
|
||||||
|
|
||||||
|
yum_help_text = '''Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
|
||||||
|
Usage: yum [options] COMMAND
|
||||||
|
|
||||||
|
List of Commands:
|
||||||
|
|
||||||
|
check Check for problems in the rpmdb
|
||||||
|
check-update Check for available package updates
|
||||||
|
clean Remove cached data
|
||||||
|
deplist List a package's dependencies
|
||||||
|
distribution-synchronization Synchronize installed packages to the latest available versions
|
||||||
|
downgrade downgrade a package
|
||||||
|
erase Remove a package or packages from your system
|
||||||
|
fs Acts on the filesystem data of the host, mainly for removing docs/lanuages for minimal hosts.
|
||||||
|
fssnapshot Creates filesystem snapshots, or lists/deletes current snapshots.
|
||||||
|
groups Display, or use, the groups information
|
||||||
|
help Display a helpful usage message
|
||||||
|
history Display, or use, the transaction history
|
||||||
|
info Display details about a package or group of packages
|
||||||
|
install Install a package or packages on your system
|
||||||
|
langavailable Check available languages
|
||||||
|
langinfo List languages information
|
||||||
|
langinstall Install appropriate language packs for a language
|
||||||
|
langlist List installed languages
|
||||||
|
langremove Remove installed language packs for a language
|
||||||
|
list List a package or groups of packages
|
||||||
|
load-transaction load a saved transaction from filename
|
||||||
|
makecache Generate the metadata cache
|
||||||
|
provides Find what package provides the given value
|
||||||
|
reinstall reinstall a package
|
||||||
|
repo-pkgs Treat a repo. as a group of packages, so we can install/remove all of them
|
||||||
|
repolist Display the configured software repositories
|
||||||
|
search Search package details for the given string
|
||||||
|
shell Run an interactive yum shell
|
||||||
|
swap Simple way to swap packages, instead of using shell
|
||||||
|
update Update a package or packages on your system
|
||||||
|
update-minimal Works like upgrade, but goes to the 'newest' package match which fixes a problem that affects your system
|
||||||
|
updateinfo Acts on repository update information
|
||||||
|
upgrade Update packages taking obsoletes into account
|
||||||
|
version Display a version for the machine and/or available repos.
|
||||||
|
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-h, --help show this help message and exit
|
||||||
|
-t, --tolerant be tolerant of errors
|
||||||
|
-C, --cacheonly run entirely from system cache, don't update cache
|
||||||
|
-c [config file], --config=[config file]
|
||||||
|
config file location
|
||||||
|
-R [minutes], --randomwait=[minutes]
|
||||||
|
maximum command wait time
|
||||||
|
-d [debug level], --debuglevel=[debug level]
|
||||||
|
debugging output level
|
||||||
|
--showduplicates show duplicates, in repos, in list/search commands
|
||||||
|
-e [error level], --errorlevel=[error level]
|
||||||
|
error output level
|
||||||
|
--rpmverbosity=[debug level name]
|
||||||
|
debugging output level for rpm
|
||||||
|
-q, --quiet quiet operation
|
||||||
|
-v, --verbose verbose operation
|
||||||
|
-y, --assumeyes answer yes for all questions
|
||||||
|
--assumeno answer no for all questions
|
||||||
|
--version show Yum version and exit
|
||||||
|
--installroot=[path] set install root
|
||||||
|
--enablerepo=[repo] enable one or more repositories (wildcards allowed)
|
||||||
|
--disablerepo=[repo] disable one or more repositories (wildcards allowed)
|
||||||
|
-x [package], --exclude=[package]
|
||||||
|
exclude package(s) by name or glob
|
||||||
|
--disableexcludes=[repo]
|
||||||
|
disable exclude from main, for a repo or for
|
||||||
|
everything
|
||||||
|
--disableincludes=[repo]
|
||||||
|
disable includepkgs for a repo or for everything
|
||||||
|
--obsoletes enable obsoletes processing during updates
|
||||||
|
--noplugins disable Yum plugins
|
||||||
|
--nogpgcheck disable gpg signature checking
|
||||||
|
--disableplugin=[plugin]
|
||||||
|
disable plugins by name
|
||||||
|
--enableplugin=[plugin]
|
||||||
|
enable plugins by name
|
||||||
|
--skip-broken skip packages with depsolving problems
|
||||||
|
--color=COLOR control whether color is used
|
||||||
|
--releasever=RELEASEVER
|
||||||
|
set value of $releasever in yum config and repo files
|
||||||
|
--downloadonly don't update, just download
|
||||||
|
--downloaddir=DLDIR specifies an alternate directory to store packages
|
||||||
|
--setopt=SETOPTS set arbitrary config and repo options
|
||||||
|
--bugfix Include bugfix relevant packages, in updates
|
||||||
|
--security Include security relevant packages, in updates
|
||||||
|
--advisory=ADVS, --advisories=ADVS
|
||||||
|
Include packages needed to fix the given advisory, in
|
||||||
|
updates
|
||||||
|
--bzs=BZS Include packages needed to fix the given BZ, in
|
||||||
|
updates
|
||||||
|
--cves=CVES Include packages needed to fix the given CVE, in
|
||||||
|
updates
|
||||||
|
--sec-severity=SEVS, --secseverity=SEVS
|
||||||
|
Include security relevant packages matching the
|
||||||
|
severity, in updates
|
||||||
|
|
||||||
|
Plugin Options:
|
||||||
|
--samearch-priorities
|
||||||
|
Priority-exclude packages based on name + arch
|
||||||
|
'''
|
||||||
|
yum_unsuccessful_search_text = '''Warning: No matches found for: {}
|
||||||
|
No matches found
|
||||||
|
'''
|
||||||
|
yum_successful_vim_search_text = '''================================================== N/S matched: vim ===================================================
|
||||||
|
protobuf-vim.x86_64 : Vim syntax highlighting for Google Protocol Buffers descriptions
|
||||||
|
vim-X11.x86_64 : The VIM version of the vi editor for the X Window System - GVim
|
||||||
|
vim-common.x86_64 : The common files needed by any version of the VIM editor
|
||||||
|
vim-enhanced.x86_64 : A version of the VIM editor which includes recent enhancements
|
||||||
|
vim-filesystem.x86_64 : VIM filesystem layout
|
||||||
|
vim-filesystem.noarch : VIM filesystem layout
|
||||||
|
vim-minimal.x86_64 : A minimal version of the VIM editor
|
||||||
|
|
||||||
|
Name and summary matches only, use "search all" for everything.
|
||||||
|
'''
|
||||||
|
|
||||||
|
yum_invalid_op_text = '''Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
|
||||||
|
No such command: {}. Please use /usr/bin/yum --help
|
||||||
|
'''
|
||||||
|
|
||||||
|
yum_operations = [
|
||||||
|
'check', 'check-update', 'clean', 'deplist', 'distribution-synchronization', 'downgrade', 'erase', 'fs',
|
||||||
|
'fssnapshot', 'groups', 'help', 'history', 'info', 'install', 'langavailable', 'langinfo', 'langinstall',
|
||||||
|
'langlist', 'langremove', 'list', 'load-transaction', 'makecache', 'provides', 'reinstall', 'repo-pkgs', 'repolist',
|
||||||
|
'search', 'shell', 'swap', 'update', 'update-minimal', 'updateinfo', 'upgrade', 'version', ]
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('command', [
|
||||||
|
'saerch', 'uninstall',
|
||||||
|
])
|
||||||
|
def test_match(command):
|
||||||
|
assert match(Command('yum {}'.format(command), yum_invalid_op_text.format(command)))
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('command, output', [
|
||||||
|
('vim', ''),
|
||||||
|
('yum', yum_help_text,),
|
||||||
|
('yum help', yum_help_text,),
|
||||||
|
('yum search asdf', yum_unsuccessful_search_text.format('asdf'),),
|
||||||
|
('yum search vim', yum_successful_vim_search_text)
|
||||||
|
])
|
||||||
|
def test_not_match(command, output):
|
||||||
|
assert not match(Command(command, output))
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def yum_help(mocker):
|
||||||
|
mock = mocker.patch('subprocess.Popen')
|
||||||
|
mock.return_value.stdout = BytesIO(bytes(yum_help_text.encode('utf-8')))
|
||||||
|
return mock
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.usefixtures('no_memoize', 'yum_help')
|
||||||
|
def test_get_operations():
|
||||||
|
assert _get_operations() == yum_operations
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.usefixtures('no_memoize', 'yum_help')
|
||||||
|
@pytest.mark.parametrize('script, output, result', [
|
||||||
|
('yum uninstall', yum_invalid_op_text.format('uninstall'), 'yum remove',),
|
||||||
|
('yum saerch asdf', yum_invalid_op_text.format('saerch'), 'yum search asdf',),
|
||||||
|
('yum hlep', yum_invalid_op_text.format('hlep'), 'yum help',),
|
||||||
|
])
|
||||||
|
def test_get_new_command(script, output, result):
|
||||||
|
assert get_new_command(Command(script, output))[0] == result
|
39
thefuck/rules/yum_invalid_operation.py
Normal file
39
thefuck/rules/yum_invalid_operation.py
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
import subprocess
|
||||||
|
from itertools import dropwhile, islice, takewhile
|
||||||
|
|
||||||
|
from thefuck.specific.sudo import sudo_support
|
||||||
|
from thefuck.specific.yum import yum_available
|
||||||
|
from thefuck.utils import for_app, replace_command, which, cache
|
||||||
|
|
||||||
|
enabled_by_default = yum_available
|
||||||
|
|
||||||
|
|
||||||
|
@sudo_support
|
||||||
|
@for_app('yum')
|
||||||
|
def match(command):
|
||||||
|
return 'No such command: ' in command.output
|
||||||
|
|
||||||
|
|
||||||
|
def _get_operations():
|
||||||
|
proc = subprocess.Popen('yum', stdout=subprocess.PIPE)
|
||||||
|
|
||||||
|
lines = proc.stdout.readlines()
|
||||||
|
lines = [line.decode('utf-8') for line in lines]
|
||||||
|
lines = dropwhile(lambda line: not line.startswith("List of Commands:"), lines)
|
||||||
|
lines = islice(lines, 2, None)
|
||||||
|
lines = list(takewhile(lambda line: line.strip(), lines))
|
||||||
|
return [line.strip().split(' ')[0] for line in lines]
|
||||||
|
|
||||||
|
|
||||||
|
if which('yum'):
|
||||||
|
_get_operations = cache(which('yum'))(_get_operations)
|
||||||
|
|
||||||
|
|
||||||
|
@sudo_support
|
||||||
|
def get_new_command(command):
|
||||||
|
invalid_operation = command.script_parts[1]
|
||||||
|
|
||||||
|
if invalid_operation == 'uninstall':
|
||||||
|
return [command.script.replace('uninstall', 'remove')]
|
||||||
|
|
||||||
|
return replace_command(command, invalid_operation, _get_operations())
|
3
thefuck/specific/yum.py
Normal file
3
thefuck/specific/yum.py
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
from thefuck.utils import which
|
||||||
|
|
||||||
|
yum_available = bool(which('yum'))
|
Loading…
x
Reference in New Issue
Block a user