mirror of
				https://github.com/nvbn/thefuck.git
				synced 2025-10-30 06:34:09 +00:00 
			
		
		
		
	| @@ -281,6 +281,7 @@ Enabled by default only on specific platforms: | ||||
| * `brew_uninstall` – adds `--force` to `brew uninstall` if multiple versions were installed; | ||||
| * `brew_unknown_command` – fixes wrong brew commands, for example `brew docto/brew doctor`; | ||||
| * `brew_update_formula` – turns `brew update <formula>` into `brew upgrade <formula>`; | ||||
| * `dnf_no_such_command` – fixes mistyped DNF commands; | ||||
| * `pacman` – installs app with `pacman` if it is not installed (uses `yaourt` if available); | ||||
| * `pacman_not_found` – fixes package name with `pacman` or `yaourt`. | ||||
|  | ||||
|   | ||||
							
								
								
									
										190
									
								
								tests/rules/test_dnf_no_such_command.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										190
									
								
								tests/rules/test_dnf_no_such_command.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,190 @@ | ||||
| from io import BytesIO | ||||
| import pytest | ||||
| from thefuck.types import Command | ||||
| from thefuck.rules.dnf_no_such_command import match, get_new_command, _get_operations | ||||
|  | ||||
|  | ||||
| help_text = b'''usage: dnf [options] COMMAND | ||||
|  | ||||
| List of Main Commands: | ||||
|  | ||||
| autoremove                remove all unneeded packages that were originally installed as dependencies | ||||
| check                     check for problems in the packagedb | ||||
| check-update              check for available package upgrades | ||||
| clean                     remove cached data | ||||
| deplist                   List package's dependencies and what packages provide them | ||||
| distro-sync               synchronize installed packages to the latest available versions | ||||
| downgrade                 Downgrade a package | ||||
| group                     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 | ||||
| list                      list a package or groups of packages | ||||
| makecache                 generate the metadata cache | ||||
| mark                      mark or unmark installed packages as installed by user. | ||||
| provides                  find what package provides the given value | ||||
| reinstall                 reinstall a package | ||||
| remove                    remove a package or packages from your system | ||||
| repolist                  display the configured software repositories | ||||
| repoquery                 search for packages matching keyword | ||||
| repository-packages       run commands on top of all packages in given repository | ||||
| search                    search package details for the given string | ||||
| shell                     run an interactive DNF shell | ||||
| swap                      run an interactive dnf mod for remove and install one spec | ||||
| updateinfo                display advisories about packages | ||||
| upgrade                   upgrade a package or packages on your system | ||||
| upgrade-minimal           upgrade, but only 'newest' package match which fixes a problem that affects your system | ||||
|  | ||||
| List of Plugin Commands: | ||||
|  | ||||
| builddep                  Install build dependencies for package or spec file | ||||
| config-manager            manage dnf configuration options and repositories | ||||
| copr                      Interact with Copr repositories. | ||||
| debug-dump                dump information about installed rpm packages to file | ||||
| debug-restore             restore packages recorded in debug-dump file | ||||
| debuginfo-install         install debuginfo packages | ||||
| download                  Download package to current directory | ||||
| needs-restarting          determine updated binaries that need restarting | ||||
| playground                Interact with Playground repository. | ||||
| repoclosure               Display a list of unresolved dependencies for repositories | ||||
| repograph                 Output a full package dependency graph in dot format | ||||
| repomanage                Manage a directory of rpm packages | ||||
| reposync                  download all packages from remote repo | ||||
|  | ||||
| Optional arguments: | ||||
|   -c [config file], --config [config file] | ||||
|                         config file location | ||||
|   -q, --quiet           quiet operation | ||||
|   -v, --verbose         verbose operation | ||||
|   --version             show DNF version and exit | ||||
|   --installroot [path]  set install root | ||||
|   --nodocs              do not install documentations | ||||
|   --noplugins           disable all plugins | ||||
|   --enableplugin [plugin] | ||||
|                         enable plugins by name | ||||
|   --disableplugin [plugin] | ||||
|                         disable plugins by name | ||||
|   --releasever RELEASEVER | ||||
|                         override the value of $releasever in config and repo | ||||
|                         files | ||||
|   --setopt SETOPTS      set arbitrary config and repo options | ||||
|   --skip-broken         resolve depsolve problems by skipping packages | ||||
|   -h, --help, --help-cmd | ||||
|                         show command help | ||||
|   --allowerasing        allow erasing of installed packages to resolve | ||||
|                         dependencies | ||||
|   -b, --best            try the best available package versions in | ||||
|                         transactions. | ||||
|   -C, --cacheonly       run entirely from system cache, don't update cache | ||||
|   -R [minutes], --randomwait [minutes] | ||||
|                         maximum command wait time | ||||
|   -d [debug level], --debuglevel [debug level] | ||||
|                         debugging output level | ||||
|   --debugsolver         dumps detailed solving results into files | ||||
|   --showduplicates      show duplicates, in repos, in list/search commands | ||||
|   -e ERRORLEVEL, --errorlevel ERRORLEVEL | ||||
|                         error output level | ||||
|   --obsoletes           enables dnf's obsoletes processing logic for upgrade | ||||
|                         or display capabilities that the package obsoletes for | ||||
|                         info, list and repoquery | ||||
|   --rpmverbosity [debug level name] | ||||
|                         debugging output level for rpm | ||||
|   -y, --assumeyes       automatically answer yes for all questions | ||||
|   --assumeno            automatically answer no for all questions | ||||
|   --enablerepo [repo] | ||||
|   --disablerepo [repo] | ||||
|   --repo [repo], --repoid [repo] | ||||
|                         enable just specific repositories by an id or a glob, | ||||
|                         can be specified multiple times | ||||
|   -x [package], --exclude [package], --excludepkgs [package] | ||||
|                         exclude packages by name or glob | ||||
|   --disableexcludes [repo], --disableexcludepkgs [repo] | ||||
|                         disable excludepkgs | ||||
|   --repofrompath [repo,path] | ||||
|                         label and path to additional repository, can be | ||||
|                         specified multiple times. | ||||
|   --noautoremove        disable removal of dependencies that are no longer | ||||
|                         used | ||||
|   --nogpgcheck          disable gpg signature checking | ||||
|   --color COLOR         control whether colour is used | ||||
|   --refresh             set metadata as expired before running the command | ||||
|   -4                    resolve to IPv4 addresses only | ||||
|   -6                    resolve to IPv6 addresses only | ||||
|   --destdir DESTDIR, --downloaddir DESTDIR | ||||
|                         set directory to copy packages to | ||||
|   --downloadonly        only download packages | ||||
|   --bugfix              Include bugfix relevant packages, in updates | ||||
|   --enhancement         Include enhancement relevant packages, in updates | ||||
|   --newpackage          Include newpackage relevant packages, in updates | ||||
|   --security            Include security relevant packages, in updates | ||||
|   --advisory ADVISORY, --advisories ADVISORY | ||||
|                         Include packages needed to fix the given advisory, in | ||||
|                         updates | ||||
|   --bzs BUGZILLA        Include packages needed to fix the given BZ, in | ||||
|                         updates | ||||
|   --cves CVES           Include packages needed to fix the given CVE, in | ||||
|                         updates | ||||
|   --sec-severity {Critical,Important,Moderate,Low}, --secseverity {Critical,Important,Moderate,Low} | ||||
|                         Include security relevant packages matching the | ||||
|                         severity, in updates | ||||
|   --forcearch ARCH      Force the use of an architecture | ||||
| ''' | ||||
|  | ||||
| dnf_operations = ['autoremove', 'check', 'check-update', 'clean', 'deplist', | ||||
|                   'distro-sync', 'downgrade', 'group', 'help', 'history', | ||||
|                   'info', 'install', 'list', 'makecache', 'mark', 'provides', | ||||
|                   'reinstall', 'remove', 'repolist', 'repoquery', | ||||
|                   'repository-packages', 'search', 'shell', 'swap', 'updateinfo', | ||||
|                   'upgrade', 'upgrade-minimal', 'builddep', 'config-manager', | ||||
|                   'copr', 'debug-dump', 'debug-restore', 'debuginfo-install', | ||||
|                   'download', 'needs-restarting', 'playground', 'repoclosure', | ||||
|                   'repograph', 'repomanage', 'reposync'] | ||||
|  | ||||
|  | ||||
| def invalid_command(command): | ||||
|     return """No such command: %s. Please use /usr/bin/dnf --help | ||||
| It could be a DNF plugin command, try: "dnf install 'dnf-command(%s)'" | ||||
| """ % (command, command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('output', [ | ||||
|     (invalid_command('saerch')), | ||||
|     (invalid_command('isntall')) | ||||
| ]) | ||||
| def test_match(output): | ||||
|     assert match(Command('dnf', output)) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('script, output', [ | ||||
|     ('pip', invalid_command('isntall')), | ||||
|     ('vim', "") | ||||
| ]) | ||||
| def test_not_match(script, output): | ||||
|     assert not match(Command(script, output)) | ||||
|  | ||||
|  | ||||
| @pytest.fixture | ||||
| def set_help(mocker): | ||||
|     mock = mocker.patch('subprocess.Popen') | ||||
|  | ||||
|     def _set_text(text): | ||||
|         mock.return_value.stdout = BytesIO(text) | ||||
|  | ||||
|     return _set_text | ||||
|  | ||||
|  | ||||
| def test_get_operations(set_help): | ||||
|     set_help(help_text) | ||||
|     assert _get_operations() == dnf_operations | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('script, output, result', [ | ||||
|     ('dnf isntall vim', invalid_command('isntall'), | ||||
|      'dnf install vim'), | ||||
|     ('dnf saerch vim', invalid_command('saerch'), | ||||
|      'dnf search vim'), | ||||
| ]) | ||||
| def test_get_new_command(set_help, output, script, result): | ||||
|     set_help(help_text) | ||||
|     assert result in get_new_command(Command(script, output)) | ||||
							
								
								
									
										37
									
								
								thefuck/rules/dnf_no_such_command.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								thefuck/rules/dnf_no_such_command.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | ||||
| import subprocess | ||||
| import re | ||||
| from thefuck.specific.sudo import sudo_support | ||||
| from thefuck.utils import for_app, replace_command | ||||
| from thefuck.specific.dnf import dnf_available | ||||
|  | ||||
|  | ||||
| regex = re.compile(r'No such command: (.*)\.') | ||||
|  | ||||
|  | ||||
| @for_app('dnf') | ||||
| @sudo_support | ||||
| def match(command): | ||||
|     return 'no such command' in command.output.lower() | ||||
|  | ||||
|  | ||||
| def _parse_operations(help_text_lines): | ||||
|     operation_regex = re.compile(r'^([a-z-]+) +', re.MULTILINE) | ||||
|     return operation_regex.findall(help_text_lines) | ||||
|  | ||||
|  | ||||
| def _get_operations(): | ||||
|     proc = subprocess.Popen(["dnf", '--help'], | ||||
|                             stdout=subprocess.PIPE, | ||||
|                             stderr=subprocess.PIPE) | ||||
|     lines = proc.stdout.read().decode("utf-8") | ||||
|  | ||||
|     return _parse_operations(lines) | ||||
|  | ||||
|  | ||||
| @sudo_support | ||||
| def get_new_command(command): | ||||
|     misspelled_command = regex.findall(command.output)[0] | ||||
|     return replace_command(command, misspelled_command, _get_operations()) | ||||
|  | ||||
|  | ||||
| enabled_by_default = dnf_available | ||||
							
								
								
									
										3
									
								
								thefuck/specific/dnf.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								thefuck/specific/dnf.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| from thefuck.utils import which | ||||
|  | ||||
| dnf_available = bool(which('dnf')) | ||||
		Reference in New Issue
	
	Block a user