utils: checkstyle.py: Factor out automatic class registry

The style checkers and formatters duplicate automatic class registry
code. Factor it out to a common ClassRegistry helper class. The list of
subclasses is moved to a class member variable of the auto-registered
base class type.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
This commit is contained in:
Laurent Pinchart 2020-12-24 12:34:55 +02:00
parent b402734e5a
commit 86efa9c7e9

View file

@ -191,20 +191,24 @@ def parse_diff(diff):
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Style Checkers # Helpers
# #
_style_checkers = [] class ClassRegistry(type):
class StyleCheckerRegistry(type):
def __new__(cls, clsname, bases, attrs): def __new__(cls, clsname, bases, attrs):
newclass = super().__new__(cls, clsname, bases, attrs) newclass = super().__new__(cls, clsname, bases, attrs)
if clsname != 'StyleChecker': if bases:
_style_checkers.append(newclass) bases[0].subclasses.append(newclass)
return newclass return newclass
class StyleChecker(metaclass=StyleCheckerRegistry): # ------------------------------------------------------------------------------
# Style Checkers
#
class StyleChecker(metaclass=ClassRegistry):
subclasses = []
def __init__(self): def __init__(self):
pass pass
@ -213,7 +217,7 @@ class StyleChecker(metaclass=StyleCheckerRegistry):
# #
@classmethod @classmethod
def checkers(cls, filename): def checkers(cls, filename):
for checker in _style_checkers: for checker in cls.subclasses:
if checker.supports(filename): if checker.supports(filename):
yield checker yield checker
@ -227,7 +231,7 @@ class StyleChecker(metaclass=StyleCheckerRegistry):
@classmethod @classmethod
def all_patterns(cls): def all_patterns(cls):
patterns = set() patterns = set()
for checker in _style_checkers: for checker in cls.subclasses:
patterns.update(checker.patterns) patterns.update(checker.patterns)
return patterns return patterns
@ -383,18 +387,9 @@ class ShellChecker(StyleChecker):
# Formatters # Formatters
# #
_formatters = [] class Formatter(metaclass=ClassRegistry):
class FormatterRegistry(type):
def __new__(cls, clsname, bases, attrs):
newclass = super().__new__(cls, clsname, bases, attrs)
if clsname != 'Formatter':
_formatters.append(newclass)
return newclass
class Formatter(metaclass=FormatterRegistry):
enabled = True enabled = True
subclasses = []
def __init__(self): def __init__(self):
pass pass
@ -404,7 +399,7 @@ class Formatter(metaclass=FormatterRegistry):
# #
@classmethod @classmethod
def formatters(cls, filename): def formatters(cls, filename):
for formatter in _formatters: for formatter in cls.subclasses:
if not cls.enabled: if not cls.enabled:
continue continue
if formatter.supports(filename): if formatter.supports(filename):
@ -422,7 +417,7 @@ class Formatter(metaclass=FormatterRegistry):
@classmethod @classmethod
def all_patterns(cls): def all_patterns(cls):
patterns = set() patterns = set()
for formatter in _formatters: for formatter in cls.subclasses:
if not cls.enabled: if not cls.enabled:
continue continue
patterns.update(formatter.patterns) patterns.update(formatter.patterns)