mirror of
https://github.com/nvbn/thefuck.git
synced 2025-01-31 10:11:14 +00:00
76 lines
2.0 KiB
Python
76 lines
2.0 KiB
Python
from .conf import settings
|
|
from .types import Rule
|
|
from .system import Path
|
|
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)
|