mirror of
				https://github.com/nvbn/thefuck.git
				synced 2025-10-31 07:04:12 +00:00 
			
		
		
		
	Move rule-related code to Rule
				
					
				
			This commit is contained in:
		| @@ -2,7 +2,6 @@ import pytest | ||||
| import os | ||||
| from thefuck.rules.fix_file import match, get_new_command | ||||
| from tests.utils import Command | ||||
| from thefuck.types import Settings | ||||
|  | ||||
|  | ||||
| # (script, file, line, col (or None), stdout, stderr) | ||||
|   | ||||
| @@ -1,42 +1,8 @@ | ||||
| import pytest | ||||
| from pathlib import PosixPath, Path | ||||
| from mock import Mock | ||||
| from pathlib import PosixPath | ||||
| from thefuck import corrector, conf | ||||
| from tests.utils import Rule, Command, CorrectedCommand | ||||
| from thefuck.corrector import make_corrected_commands, get_corrected_commands,\ | ||||
|     is_rule_enabled, organize_commands | ||||
|  | ||||
|  | ||||
| def test_load_rule(mocker): | ||||
|     match = object() | ||||
|     get_new_command = object() | ||||
|     load_source = mocker.patch( | ||||
|         'thefuck.corrector.load_source', | ||||
|         return_value=Mock(match=match, | ||||
|                           get_new_command=get_new_command, | ||||
|                           enabled_by_default=True, | ||||
|                           priority=900, | ||||
|                           requires_output=True)) | ||||
|     assert corrector.load_rule(Path('/rules/bash.py')) \ | ||||
|            == Rule('bash', match, get_new_command, priority=900) | ||||
|     load_source.assert_called_once_with('bash', '/rules/bash.py') | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('rules, exclude_rules, rule, is_enabled', [ | ||||
|     (conf.DEFAULT_RULES, [], Rule('git', enabled_by_default=True), True), | ||||
|     (conf.DEFAULT_RULES, [], Rule('git', enabled_by_default=False), False), | ||||
|     ([], [], Rule('git', enabled_by_default=False), False), | ||||
|     ([], [], Rule('git', enabled_by_default=True), False), | ||||
|     (conf.DEFAULT_RULES + ['git'], [], Rule('git', enabled_by_default=False), True), | ||||
|     (['git'], [], Rule('git', enabled_by_default=False), True), | ||||
|     (conf.DEFAULT_RULES, ['git'], Rule('git', enabled_by_default=True), False), | ||||
|     (conf.DEFAULT_RULES, ['git'], Rule('git', enabled_by_default=False), False), | ||||
|     ([], ['git'], Rule('git', enabled_by_default=True), False), | ||||
|     ([], ['git'], Rule('git', enabled_by_default=False), False)]) | ||||
| def test_is_rule_enabled(settings, rules, exclude_rules, rule, is_enabled): | ||||
|     settings.update(rules=rules, | ||||
|                     exclude_rules=exclude_rules) | ||||
|     assert is_rule_enabled(rule) == is_enabled | ||||
| from thefuck.corrector import get_corrected_commands, organize_commands | ||||
|  | ||||
|  | ||||
| class TestGetRules(object): | ||||
| @@ -49,7 +15,7 @@ class TestGetRules(object): | ||||
|  | ||||
|     @pytest.fixture(autouse=True) | ||||
|     def load_source(self, monkeypatch): | ||||
|         monkeypatch.setattr('thefuck.corrector.load_source', | ||||
|         monkeypatch.setattr('thefuck.types.load_source', | ||||
|                             lambda x, _: Rule(x)) | ||||
|  | ||||
|     def _compare_names(self, rules, names): | ||||
| @@ -70,37 +36,6 @@ class TestGetRules(object): | ||||
|         self._compare_names(rules, loaded_rules) | ||||
|  | ||||
|  | ||||
| class TestIsRuleMatch(object): | ||||
|     def test_no_match(self): | ||||
|         assert not corrector.is_rule_match( | ||||
|             Command('ls'), Rule('', lambda _: False)) | ||||
|  | ||||
|     def test_match(self): | ||||
|         rule = Rule('', lambda x: x.script == 'cd ..') | ||||
|         assert corrector.is_rule_match(Command('cd ..'), rule) | ||||
|  | ||||
|     @pytest.mark.usefixtures('no_colors') | ||||
|     def test_when_rule_failed(self, capsys): | ||||
|         rule = Rule('test', Mock(side_effect=OSError('Denied')), | ||||
|                     requires_output=False) | ||||
|         assert not corrector.is_rule_match(Command('ls'), rule) | ||||
|         assert capsys.readouterr()[1].split('\n')[0] == '[WARN] Rule test:' | ||||
|  | ||||
|  | ||||
| class TestMakeCorrectedCommands(object): | ||||
|     def test_with_rule_returns_list(self): | ||||
|         rule = Rule(get_new_command=lambda x: [x.script + '!', x.script + '@'], | ||||
|                     priority=100) | ||||
|         assert list(make_corrected_commands(Command(script='test'), rule)) \ | ||||
|                == [CorrectedCommand(script='test!', priority=100), | ||||
|                    CorrectedCommand(script='test@', priority=200)] | ||||
|  | ||||
|     def test_with_rule_returns_command(self): | ||||
|         rule = Rule(get_new_command=lambda x: x.script + '!', | ||||
|                     priority=100) | ||||
|         assert list(make_corrected_commands(Command(script='test'), rule)) \ | ||||
|                == [CorrectedCommand(script='test!', priority=100)] | ||||
|  | ||||
| def test_get_corrected_commands(mocker): | ||||
|     command = Command('test', 'test', 'test') | ||||
|     rules = [Rule(match=lambda _: False), | ||||
|   | ||||
| @@ -1,4 +1,8 @@ | ||||
| from tests.utils import CorrectedCommand | ||||
| from mock import Mock | ||||
| from pathlib import Path | ||||
| import pytest | ||||
| from tests.utils import CorrectedCommand, Rule, Command | ||||
| from thefuck import conf | ||||
|  | ||||
|  | ||||
| class TestCorrectedCommand(object): | ||||
| @@ -12,3 +16,63 @@ class TestCorrectedCommand(object): | ||||
|     def test_hashable(self): | ||||
|         assert {CorrectedCommand('ls', None, 100), | ||||
|                 CorrectedCommand('ls', None, 200)} == {CorrectedCommand('ls')} | ||||
|  | ||||
|  | ||||
| class TestRule(object): | ||||
|     def test_from_path(self, mocker): | ||||
|         match = object() | ||||
|         get_new_command = object() | ||||
|         load_source = mocker.patch( | ||||
|             'thefuck.types.load_source', | ||||
|             return_value=Mock(match=match, | ||||
|                               get_new_command=get_new_command, | ||||
|                               enabled_by_default=True, | ||||
|                               priority=900, | ||||
|                               requires_output=True)) | ||||
|         assert Rule.from_path(Path('/rules/bash.py')) \ | ||||
|                == Rule('bash', match, get_new_command, priority=900) | ||||
|         load_source.assert_called_once_with('bash', '/rules/bash.py') | ||||
|  | ||||
|     @pytest.mark.parametrize('rules, exclude_rules, rule, is_enabled', [ | ||||
|         (conf.DEFAULT_RULES, [], Rule('git', enabled_by_default=True), True), | ||||
|         (conf.DEFAULT_RULES, [], Rule('git', enabled_by_default=False), False), | ||||
|         ([], [], Rule('git', enabled_by_default=False), False), | ||||
|         ([], [], Rule('git', enabled_by_default=True), False), | ||||
|         (conf.DEFAULT_RULES + ['git'], [], Rule('git', enabled_by_default=False), True), | ||||
|         (['git'], [], Rule('git', enabled_by_default=False), True), | ||||
|         (conf.DEFAULT_RULES, ['git'], Rule('git', enabled_by_default=True), False), | ||||
|         (conf.DEFAULT_RULES, ['git'], Rule('git', enabled_by_default=False), False), | ||||
|         ([], ['git'], Rule('git', enabled_by_default=True), False), | ||||
|         ([], ['git'], Rule('git', enabled_by_default=False), False)]) | ||||
|     def test_is_enabled(self, settings, rules, exclude_rules, rule, is_enabled): | ||||
|         settings.update(rules=rules, | ||||
|                         exclude_rules=exclude_rules) | ||||
|         assert rule.is_enabled == is_enabled | ||||
|  | ||||
|     def test_isnt_match(self): | ||||
|         assert not Rule('', lambda _: False).is_match( | ||||
|             Command('ls')) | ||||
|  | ||||
|     def test_is_match(self): | ||||
|         rule = Rule('', lambda x: x.script == 'cd ..') | ||||
|         assert rule.is_match(Command('cd ..')) | ||||
|  | ||||
|     @pytest.mark.usefixtures('no_colors') | ||||
|     def test_isnt_match_when_rule_failed(self, capsys): | ||||
|         rule = Rule('test', Mock(side_effect=OSError('Denied')), | ||||
|                     requires_output=False) | ||||
|         assert not rule.is_match(Command('ls')) | ||||
|         assert capsys.readouterr()[1].split('\n')[0] == '[WARN] Rule test:' | ||||
|  | ||||
|     def test_get_corrected_commands_with_rule_returns_list(self): | ||||
|         rule = Rule(get_new_command=lambda x: [x.script + '!', x.script + '@'], | ||||
|                     priority=100) | ||||
|         assert list(rule.get_corrected_commands(Command(script='test'))) \ | ||||
|                == [CorrectedCommand(script='test!', priority=100), | ||||
|                    CorrectedCommand(script='test@', priority=200)] | ||||
|  | ||||
|     def test_get_corrected_commands_with_rule_returns_command(self): | ||||
|         rule = Rule(get_new_command=lambda x: x.script + '!', | ||||
|                     priority=100) | ||||
|         assert list(rule.get_corrected_commands(Command(script='test'))) \ | ||||
|                == [CorrectedCommand(script='test!', priority=100)] | ||||
|   | ||||
| @@ -7,19 +7,22 @@ def Command(script='', stdout='', stderr=''): | ||||
|     return types.Command(script, stdout, stderr) | ||||
|  | ||||
|  | ||||
| def Rule(name='', match=lambda *_: True, | ||||
|          get_new_command=lambda *_: '', | ||||
|          enabled_by_default=True, | ||||
|          side_effect=None, | ||||
|          priority=DEFAULT_PRIORITY, | ||||
|          requires_output=True): | ||||
|     return types.Rule(name, match, get_new_command, | ||||
|                       enabled_by_default, side_effect, | ||||
|                       priority, requires_output) | ||||
| class Rule(types.Rule): | ||||
|     def __init__(self, name='', match=lambda *_: True, | ||||
|                  get_new_command=lambda *_: '', | ||||
|                  enabled_by_default=True, | ||||
|                  side_effect=None, | ||||
|                  priority=DEFAULT_PRIORITY, | ||||
|                  requires_output=True): | ||||
|         super(Rule, self).__init__(name, match, get_new_command, | ||||
|                                    enabled_by_default, side_effect, | ||||
|                                    priority, requires_output) | ||||
|  | ||||
|  | ||||
| def CorrectedCommand(script='', side_effect=None, priority=DEFAULT_PRIORITY): | ||||
|     return types.CorrectedCommand(script, side_effect, priority) | ||||
| class CorrectedCommand(types.CorrectedCommand): | ||||
|     def __init__(self, script='', side_effect=None, priority=DEFAULT_PRIORITY): | ||||
|         super(CorrectedCommand, self).__init__( | ||||
|             script, side_effect, priority) | ||||
|  | ||||
|  | ||||
| root = Path(__file__).parent.parent.resolve() | ||||
|   | ||||
		Reference in New Issue
	
	Block a user