Skip to content

Commit

Permalink
feat(fixers): implement fixer for logging error
Browse files Browse the repository at this point in the history
  • Loading branch information
guilatrova committed Sep 12, 2021
1 parent 825794c commit f488cee
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 3 deletions.
23 changes: 23 additions & 0 deletions src/tests/fixers_test.py
Expand Up @@ -4,11 +4,18 @@
from unittest.mock import MagicMock

from tryceratops.fixers import RaiseWithoutCauseFixer, VerboseReraiseFixer
from tryceratops.fixers.exception_block import LoggerErrorFixer
from tryceratops.violations import RaiseWithoutCauseViolation, VerboseReraiseViolation, codes
from tryceratops.violations.violations import Violation

from .analyzer_helpers import read_sample_lines


def create_violation(code: Tuple[str, str], line: int):
node_mock = MagicMock(spec=ast.Raise, lineno=line)
return Violation(code[0], line, 0, code[1], "filename", node_mock)


def create_verbose_reraise_violation(code: Tuple[str, str], line: int):
node_mock = MagicMock(spec=ast.Raise, lineno=line)
return VerboseReraiseViolation(code[0], line, 0, "", "", node_mock, "ex")
Expand Down Expand Up @@ -43,6 +50,22 @@ def test_verbose_fixer():
assert results[expected_modified_offset].endswith("raise # This is verbose\n")


def test_logger_error_fixer():
fixer = LoggerErrorFixer()
lines = read_sample_lines("log_error")
expected_modified_line = 15
expected_modified_offset = expected_modified_line - 1
violation = create_violation(codes.USE_LOGGING_EXCEPTION, expected_modified_line)

results = fixer.perform_fix(lines, violation)

assert_ast_is_valid(results)
assert_unmodified_lines(lines, results, expected_modified_offset)
assert results[expected_modified_offset].endswith(
"logger.exception(\"I'm using 'error', but should be using 'exception'\")\n"
)


class TestReraiseWithoutCauseFixer:
@pytest.fixture(autouse=True)
def setup(self):
Expand Down
8 changes: 6 additions & 2 deletions src/tryceratops/fixers/__init__.py
Expand Up @@ -3,12 +3,16 @@
from typing import TYPE_CHECKING, Set, Type

from .base import BaseFixer
from .exception_block import RaiseWithoutCauseFixer, VerboseReraiseFixer
from .exception_block import LoggerErrorFixer, RaiseWithoutCauseFixer, VerboseReraiseFixer

if TYPE_CHECKING:
from tryceratops.filters import GlobalFilter

FIXER_CLASSES: Set[Type[BaseFixer]] = {RaiseWithoutCauseFixer, VerboseReraiseFixer}
FIXER_CLASSES: Set[Type[BaseFixer]] = {
RaiseWithoutCauseFixer,
VerboseReraiseFixer,
LoggerErrorFixer,
}


def get_fixers_chain(global_filter: GlobalFilter) -> Set[BaseFixer]:
Expand Down
19 changes: 18 additions & 1 deletion src/tryceratops/fixers/exception_block.py
Expand Up @@ -3,7 +3,11 @@
from typing import List

from tryceratops.violations import codes
from tryceratops.violations.violations import RaiseWithoutCauseViolation, VerboseReraiseViolation
from tryceratops.violations.violations import (
RaiseWithoutCauseViolation,
VerboseReraiseViolation,
Violation,
)

from .base import BaseFixer

Expand Down Expand Up @@ -63,3 +67,16 @@ def perform_fix(self, lines: List[str], violation: RaiseWithoutCauseViolation) -
self._fix_raise_no_cause(all_lines, violation, exception_name)

return all_lines


class LoggerErrorFixer(BaseFixer[Violation]):
violation_code = codes.USE_LOGGING_EXCEPTION

def perform_fix(self, lines: List[str], violation: Violation) -> List[str]:
all_lines = lines[:]

guilty_line = all_lines[violation.line - 1]
new_line = guilty_line.replace(".error(", ".exception(")
all_lines[violation.line - 1] = new_line

return all_lines

0 comments on commit f488cee

Please sign in to comment.