mirror of
https://github.com/nvbn/thefuck.git
synced 2025-02-22 12:58:33 +00:00
The pathlib backport module is no longer maintained. The development has moved to the pathlib2 module instead. Quoting from the pathlib's README: "Attention: this backport module isn't maintained anymore. If you want to report issues or contribute patches, please consider the pathlib2 project instead."
79 lines
2.0 KiB
Python
79 lines
2.0 KiB
Python
try:
|
|
from pathlib import Path
|
|
except ImportError:
|
|
from pathlib2 import Path
|
|
from .conf import settings
|
|
from .types import Rule
|
|
from . import logs
|
|
|
|
|
|
def get_loaded_rules(rules_paths):
|
|
"""Yields all available rules.
|
|
|
|
:type rules_paths: [Path]
|
|
:rtype: Iterable[Rule]
|
|
|
|
"""
|
|
for path in rules_paths:
|
|
if path.name != '__init__.py':
|
|
rule = Rule.from_path(path)
|
|
if rule.is_enabled:
|
|
yield rule
|
|
|
|
|
|
def get_rules():
|
|
"""Returns all enabled rules.
|
|
|
|
:rtype: [Rule]
|
|
|
|
"""
|
|
bundled = Path(__file__).parent \
|
|
.joinpath('rules') \
|
|
.glob('*.py')
|
|
user = settings.user_dir.joinpath('rules').glob('*.py')
|
|
return sorted(get_loaded_rules(sorted(bundled) + sorted(user)),
|
|
key=lambda rule: rule.priority)
|
|
|
|
|
|
def organize_commands(corrected_commands):
|
|
"""Yields sorted commands without duplicates.
|
|
|
|
:type corrected_commands: Iterable[thefuck.types.CorrectedCommand]
|
|
:rtype: Iterable[thefuck.types.CorrectedCommand]
|
|
|
|
"""
|
|
try:
|
|
first_command = next(corrected_commands)
|
|
yield first_command
|
|
except StopIteration:
|
|
return
|
|
|
|
without_duplicates = {
|
|
command for command in sorted(
|
|
corrected_commands, key=lambda command: command.priority)
|
|
if command != first_command}
|
|
|
|
sorted_commands = sorted(
|
|
without_duplicates,
|
|
key=lambda corrected_command: corrected_command.priority)
|
|
|
|
logs.debug('Corrected commands: '.format(
|
|
', '.join(u'{}'.format(cmd) for cmd in [first_command] + sorted_commands)))
|
|
|
|
for command in sorted_commands:
|
|
yield command
|
|
|
|
|
|
def get_corrected_commands(command):
|
|
"""Returns generator with sorted and unique corrected commands.
|
|
|
|
:type command: thefuck.types.Command
|
|
:rtype: Iterable[thefuck.types.CorrectedCommand]
|
|
|
|
"""
|
|
corrected_commands = (
|
|
corrected for rule in get_rules()
|
|
if rule.is_match(command)
|
|
for corrected in rule.get_corrected_commands(command))
|
|
return organize_commands(corrected_commands)
|