[PATCH 1/4] utils: checkstyle.py: Factor out common code to new CheckerBase class

Kieran Bingham kieran.bingham at ideasonboard.com
Mon Oct 21 14:43:52 CEST 2024


Quoting Laurent Pinchart (2024-10-18 20:32:43)
> The CommitChecker, StyleChecker and Formatter classes duplicate code.
> Create a new CheckerBase class to factor out common code.
> 

I'm not sure if I'm the best reviewer here, but this looks fine to me.


Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>

> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---
>  utils/checkstyle.py | 140 ++++++++++++++++----------------------------
>  1 file changed, 51 insertions(+), 89 deletions(-)
> 
> diff --git a/utils/checkstyle.py b/utils/checkstyle.py
> index ab89c0a14fab..1de518953dcd 100755
> --- a/utils/checkstyle.py
> +++ b/utils/checkstyle.py
> @@ -334,37 +334,57 @@ class Amendment(Commit):
>  class ClassRegistry(type):
>      def __new__(cls, clsname, bases, attrs):
>          newclass = super().__new__(cls, clsname, bases, attrs)
> -        if bases:
> -            bases[0].subclasses.append(newclass)
> -            bases[0].subclasses.sort(key=lambda x: getattr(x, 'priority', 0),
> -                                     reverse=True)
> +        if bases and bases[0] != CheckerBase:
> +            base = bases[0]
> +
> +            if not hasattr(base, 'subclasses'):
> +                base.subclasses = []
> +            base.subclasses.append(newclass)
> +            base.subclasses.sort(key=lambda x: getattr(x, 'priority', 0),
> +                                 reverse=True)
>          return newclass
>  
>  
> +class CheckerBase(metaclass=ClassRegistry):
> +    #
> +    # Class methods
> +    #
> +    @classmethod
> +    def instances(cls, obj, names):
> +        for instance in cls.subclasses:
> +            if names and instance.__name__ not in names:
> +                continue
> +            if instance.supports(obj):
> +                yield instance
> +
> +    @classmethod
> +    def supports(cls, obj):
> +        if hasattr(cls, 'commit_types'):
> +            return type(obj) in cls.commit_types
> +
> +        if hasattr(cls, 'patterns'):
> +            for pattern in cls.patterns:
> +                if fnmatch.fnmatch(os.path.basename(obj), pattern):
> +                    return True
> +
> +        return False
> +
> +    @classmethod
> +    def all_patterns(cls):
> +        patterns = set()
> +        for instance in cls.subclasses:
> +            if hasattr(instance, 'patterns'):
> +                patterns.update(instance.patterns)
> +
> +        return patterns
> +
> +
>  # ------------------------------------------------------------------------------
>  # Commit Checkers
>  #
>  
> -class CommitChecker(metaclass=ClassRegistry):
> -    subclasses = []
> -
> -    def __init__(self):
> -        pass
> -
> -    #
> -    # Class methods
> -    #
> -    @classmethod
> -    def checkers(cls, commit, names):
> -        for checker in cls.subclasses:
> -            if names and checker.__name__ not in names:
> -                continue
> -            if checker.supports(commit):
> -                yield checker
> -
> -    @classmethod
> -    def supports(cls, commit):
> -        return type(commit) in cls.commit_types
> +class CommitChecker(CheckerBase):
> +    pass
>  
>  
>  class CommitIssue(object):
> @@ -561,37 +581,8 @@ class TrailersChecker(CommitChecker):
>  # Style Checkers
>  #
>  
> -class StyleChecker(metaclass=ClassRegistry):
> -    subclasses = []
> -
> -    def __init__(self):
> -        pass
> -
> -    #
> -    # Class methods
> -    #
> -    @classmethod
> -    def checkers(cls, filename, names):
> -        for checker in cls.subclasses:
> -            if names and checker.__name__ not in names:
> -                continue
> -            if checker.supports(filename):
> -                yield checker
> -
> -    @classmethod
> -    def supports(cls, filename):
> -        for pattern in cls.patterns:
> -            if fnmatch.fnmatch(os.path.basename(filename), pattern):
> -                return True
> -        return False
> -
> -    @classmethod
> -    def all_patterns(cls):
> -        patterns = set()
> -        for checker in cls.subclasses:
> -            patterns.update(checker.patterns)
> -
> -        return patterns
> +class StyleChecker(CheckerBase):
> +    pass
>  
>  
>  class StyleIssue(object):
> @@ -748,37 +739,8 @@ class ShellChecker(StyleChecker):
>  # Formatters
>  #
>  
> -class Formatter(metaclass=ClassRegistry):
> -    subclasses = []
> -
> -    def __init__(self):
> -        pass
> -
> -    #
> -    # Class methods
> -    #
> -    @classmethod
> -    def formatters(cls, filename, names):
> -        for formatter in cls.subclasses:
> -            if names and formatter.__name__ not in names:
> -                continue
> -            if formatter.supports(filename):
> -                yield formatter
> -
> -    @classmethod
> -    def supports(cls, filename):
> -        for pattern in cls.patterns:
> -            if fnmatch.fnmatch(os.path.basename(filename), pattern):
> -                return True
> -        return False
> -
> -    @classmethod
> -    def all_patterns(cls):
> -        patterns = set()
> -        for formatter in cls.subclasses:
> -            patterns.update(formatter.patterns)
> -
> -        return patterns
> +class Formatter(CheckerBase):
> +    pass
>  
>  
>  class CLangFormatter(Formatter):
> @@ -957,7 +919,7 @@ def check_file(top_level, commit, filename, checkers):
>      after = commit.get_file(filename)
>  
>      formatted = after
> -    for formatter in Formatter.formatters(filename, checkers):
> +    for formatter in Formatter.instances(filename, checkers):
>          formatted = formatter.format(filename, formatted)
>  
>      after = after.splitlines(True)
> @@ -971,7 +933,7 @@ def check_file(top_level, commit, filename, checkers):
>  
>      # Check for code issues not related to formatting.
>      issues = []
> -    for checker in StyleChecker.checkers(filename, checkers):
> +    for checker in StyleChecker.instances(filename, checkers):
>          checker = checker(after)
>          for hunk in commit_diff:
>              issues += checker.check(hunk.side('to').touched)
> @@ -1019,7 +981,7 @@ def check_style(top_level, commit, checkers):
>      issues = 0
>  
>      # Apply the commit checkers first.
> -    for checker in CommitChecker.checkers(commit, checkers):
> +    for checker in CommitChecker.instances(commit, checkers):
>          for issue in checker.check(commit, top_level):
>              print('%s%s%s' % (Colours.fg(Colours.Yellow), issue.msg, Colours.reset()))
>              issues += 1
> -- 
> Regards,
> 
> Laurent Pinchart
>


More information about the libcamera-devel mailing list