--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Pydantic/PydanticChecker.py Thu Feb 27 09:22:15 2025 +0100 +++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Pydantic/PydanticChecker.py Thu Feb 27 14:42:39 2025 +0100 @@ -7,24 +7,24 @@ Module implementing a checker for pydantic related issues. """ -import copy +from CodeStyleTopicChecker import CodeStyleTopicChecker -class PydanticChecker: +class PydanticChecker(CodeStyleTopicChecker): """ Class implementing a checker for pydantic related issues. """ Codes = [ - "PYD001", - "PYD002", - "PYD003", - "PYD004", - "PYD005", - "PYD006", - "PYD010", + "PYD-001", + "PYD-002", + "PYD-003", + "PYD-004", + "PYD-005", + "PYD-006", + "PYD-010", ] - Prefix = "PYD" + Category = "PYD" def __init__(self, source, filename, tree, select, ignore, expected, repeat, args): """ @@ -47,106 +47,33 @@ @param args dictionary of arguments for the various checks @type dict """ - self.__select = tuple(x for x in select if x.startswith(PydanticChecker.Prefix)) - self.__ignore = tuple(x for x in ignore if x.startswith(PydanticChecker.Prefix)) - self.__expected = expected[:] - self.__repeat = repeat - self.__filename = filename - self.__source = source[:] - self.__tree = copy.deepcopy(tree) - self.__args = args - - # statistics counters - self.counters = {} - - # collection of detected errors - self.errors = [] + super().__init__( + PydanticChecker.Category, + source, + filename, + tree, + select, + ignore, + expected, + repeat, + args, + ) checkersWithCodes = [ ( self.__checkPydantic, ( - "PYD001", - "PYD002", - "PYD003", - "PYD004", - "PYD005", - "PYD006", - "PYD010", + "PYD-001", + "PYD-002", + "PYD-003", + "PYD-004", + "PYD-005", + "PYD-006", + "PYD-010", ), ), ] - - self.__checkers = [] - for checker, codes in checkersWithCodes: - if any(not (code and self.__ignoreCode(code)) for code in codes): - self.__checkers.append(checker) - - def __ignoreCode(self, code): - """ - Private method to check if the message code should be ignored. - - @param code message code to check for - @type str - @return flag indicating to ignore the given code - @rtype bool - """ - return code in self.__ignore or ( - code.startswith(self.__ignore) and not code.startswith(self.__select) - ) - - def __error(self, lineNumber, offset, code, *args): - """ - Private method to record an issue. - - @param lineNumber line number of the issue - @type int - @param offset position within line of the issue - @type int - @param code message code - @type str - @param args arguments for the message - @type list - """ - if self.__ignoreCode(code): - return - - if code in self.counters: - self.counters[code] += 1 - else: - self.counters[code] = 1 - - # Don't care about expected codes - if code in self.__expected: - return - - if code and (self.counters[code] == 1 or self.__repeat): - # record the issue with one based line number - self.errors.append( - { - "file": self.__filename, - "line": lineNumber + 1, - "offset": offset, - "code": code, - "args": args, - } - ) - - def run(self): - """ - Public method to check the given source against miscellaneous - conditions. - """ - if not self.__filename: - # don't do anything, if essential data is missing - return - - if not self.__checkers: - # don't do anything, if no codes were selected - return - - for check in self.__checkers: - check() + self._initializeCheckers(checkersWithCodes) def __checkPydantic(self): """ @@ -154,5 +81,5 @@ """ from .PydanticVisitor import PydanticVisitor - visitor = PydanticVisitor(errorCallback=self.__error) - visitor.visit(self.__tree) + visitor = PydanticVisitor(errorCallback=self.addErrorFromNode) + visitor.visit(self.tree)