[{"id":14340,"web_url":"https://patchwork.libcamera.org/comment/14340/","msgid":"<X+hiH70y71h9iUc5@wyvern>","date":"2020-12-27T10:29:51","subject":"Re: [libcamera-devel] [PATCH 2/8] utils: checkstyle.py: Factor out\n\tautomatic class registry","submitter":{"id":5,"url":"https://patchwork.libcamera.org/api/people/5/","name":"Niklas Söderlund","email":"niklas.soderlund@ragnatech.se"},"content":"Hi Laurent,\n\nThanks for your work.\n\nOn 2020-12-24 14:28:49 +0200, Laurent Pinchart wrote:\n> The style checkers and formatters duplicate automatic class registry\n> code. Factor it out to a common ClassRegistry helper class. The list of\n> subclasses is moved to a class member variable of the auto-registered\n> base class type.\n> \n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\nReviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n\n> ---\n>  utils/checkstyle.py | 45 ++++++++++++++++++++-------------------------\n>  1 file changed, 20 insertions(+), 25 deletions(-)\n> \n> diff --git a/utils/checkstyle.py b/utils/checkstyle.py\n> index c04bf3850dcd..76267d5ea764 100755\n> --- a/utils/checkstyle.py\n> +++ b/utils/checkstyle.py\n> @@ -190,21 +190,25 @@ def parse_diff(diff):\n>      return hunks\n>  \n>  \n> +# ------------------------------------------------------------------------------\n> +# Helpers\n> +#\n> +\n> +class ClassRegistry(type):\n> +    def __new__(cls, clsname, bases, attrs):\n> +        newclass = super().__new__(cls, clsname, bases, attrs)\n> +        if bases:\n> +            bases[0].subclasses.append(newclass)\n> +        return newclass\n> +\n> +\n>  # ------------------------------------------------------------------------------\n>  # Style Checkers\n>  #\n>  \n> -_style_checkers = []\n> +class StyleChecker(metaclass=ClassRegistry):\n> +    subclasses = []\n>  \n> -class StyleCheckerRegistry(type):\n> -    def __new__(cls, clsname, bases, attrs):\n> -        newclass = super().__new__(cls, clsname, bases, attrs)\n> -        if clsname != 'StyleChecker':\n> -            _style_checkers.append(newclass)\n> -        return newclass\n> -\n> -\n> -class StyleChecker(metaclass=StyleCheckerRegistry):\n>      def __init__(self):\n>          pass\n>  \n> @@ -213,7 +217,7 @@ class StyleChecker(metaclass=StyleCheckerRegistry):\n>      #\n>      @classmethod\n>      def checkers(cls, filename):\n> -        for checker in _style_checkers:\n> +        for checker in cls.subclasses:\n>              if checker.supports(filename):\n>                  yield checker\n>  \n> @@ -227,7 +231,7 @@ class StyleChecker(metaclass=StyleCheckerRegistry):\n>      @classmethod\n>      def all_patterns(cls):\n>          patterns = set()\n> -        for checker in _style_checkers:\n> +        for checker in cls.subclasses:\n>              patterns.update(checker.patterns)\n>  \n>          return patterns\n> @@ -383,18 +387,9 @@ class ShellChecker(StyleChecker):\n>  # Formatters\n>  #\n>  \n> -_formatters = []\n> -\n> -class FormatterRegistry(type):\n> -    def __new__(cls, clsname, bases, attrs):\n> -        newclass = super().__new__(cls, clsname, bases, attrs)\n> -        if clsname != 'Formatter':\n> -            _formatters.append(newclass)\n> -        return newclass\n> -\n> -\n> -class Formatter(metaclass=FormatterRegistry):\n> +class Formatter(metaclass=ClassRegistry):\n>      enabled = True\n> +    subclasses = []\n>  \n>      def __init__(self):\n>          pass\n> @@ -404,7 +399,7 @@ class Formatter(metaclass=FormatterRegistry):\n>      #\n>      @classmethod\n>      def formatters(cls, filename):\n> -        for formatter in _formatters:\n> +        for formatter in cls.subclasses:\n>              if not cls.enabled:\n>                  continue\n>              if formatter.supports(filename):\n> @@ -422,7 +417,7 @@ class Formatter(metaclass=FormatterRegistry):\n>      @classmethod\n>      def all_patterns(cls):\n>          patterns = set()\n> -        for formatter in _formatters:\n> +        for formatter in cls.subclasses:\n>              if not cls.enabled:\n>                  continue\n>              patterns.update(formatter.patterns)\n> -- \n> Regards,\n> \n> Laurent Pinchart\n> \n> _______________________________________________\n> libcamera-devel mailing list\n> libcamera-devel@lists.libcamera.org\n> https://lists.libcamera.org/listinfo/libcamera-devel","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 035C4C0F1B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tSun, 27 Dec 2020 10:30:00 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 838FF615B0;\n\tSun, 27 Dec 2020 11:29:59 +0100 (CET)","from mail-lf1-x143.google.com (mail-lf1-x143.google.com\n\t[IPv6:2a00:1450:4864:20::143])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id BB3E0615AC\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 27 Dec 2020 11:29:57 +0100 (CET)","by mail-lf1-x143.google.com with SMTP id a12so17966882lfl.6\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 27 Dec 2020 02:29:57 -0800 (PST)","from localhost ([185.224.57.161]) by smtp.gmail.com with ESMTPSA id\n\tb207sm4946071lfg.94.2020.12.27.02.29.55\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tSun, 27 Dec 2020 02:29:56 -0800 (PST)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=ragnatech-se.20150623.gappssmtp.com\n\theader.i=@ragnatech-se.20150623.gappssmtp.com\n\theader.b=\"RKAgDMSY\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=ragnatech-se.20150623.gappssmtp.com; s=20150623;\n\th=date:from:to:cc:subject:message-id:references:mime-version\n\t:content-disposition:content-transfer-encoding:in-reply-to;\n\tbh=ujx4k+EShU76aU0iW4JMRtJC+Fe6Katbm7KTpPFnuHY=;\n\tb=RKAgDMSY97+SFqlUXZ5ZTToihn0nc2S8/xSa4Nd3sXx5v47sLVB2EOzLKObrwEOJKc\n\tzRqwCwQl9cXh2urH7ybs+D+GqEIri9yT62Nqf4EiPU+dLkb55MpiG+Le93NP6F/QNHeF\n\tAnE7HD96AmeconvgFP3/bud6FuvpACdht3mryr9ou+ljDp1NzfsJLYeu7++JNOevCaLF\n\tXsl9od/jAo7yn8nojHPeJooYc/3dL034dN8zXYHHB090pMiZATWSg6usVWqOdesClETu\n\tjtbuCYRSJhGErdAKKJtl1t1PZIVTJFVphkhxDRTH6BUz0KP1Et1H/UhFjereev1lJnso\n\tY+dg==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:date:from:to:cc:subject:message-id:references\n\t:mime-version:content-disposition:content-transfer-encoding\n\t:in-reply-to;\n\tbh=ujx4k+EShU76aU0iW4JMRtJC+Fe6Katbm7KTpPFnuHY=;\n\tb=KxQiE+dEzmfaIBUVRPJpkCr/xS4k7fYcVWQusKDNcJA+bnsImRgsl5pIFbeCEKN4nB\n\tzY9AWXJx3QoG8K5JYY16WgxiSfN+QQEWW3jhbDua7Sr17wXP1tHQ5MaF8xG1kZDQB0Mt\n\tBEgdu6q9pY8viLhHxPueRAxB4iSU4GsQPbiqFUz0blqddEobXAId3okvqYnVG3vKD1+y\n\tK8IzyVvESOAeUhVANX+JBZ6LDxBGYV0mjoCngfpiZQLXhRJFvdXczdwbb7MRFhizGEGU\n\tf3EfF5Th7UdDSbEPkQMSe6LUOQF0ObhVIUzTaISMct2WSvwC4b7I9/q7ppgkgnpi/08p\n\tB4XA==","X-Gm-Message-State":"AOAM530yv5/wD5H79sMjQQF7Z6hSbHG9bCyVlEp7trMYFRdDjJXDByPv\n\t8QIuZjK8jNy84/5NzMYrE1eYAw==","X-Google-Smtp-Source":"ABdhPJx/060lnkHPp+JHO9mpSWaRUyazPSyDZ6Jpv1+ugm70t9l4Lo7XugrwonnNAnawpW1wc83mmQ==","X-Received":"by 2002:a19:2254:: with SMTP id\n\ti81mr17830769lfi.422.1609064997174; \n\tSun, 27 Dec 2020 02:29:57 -0800 (PST)","Date":"Sun, 27 Dec 2020 11:29:51 +0100","From":"Niklas =?iso-8859-1?q?S=F6derlund?= <niklas.soderlund@ragnatech.se>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Message-ID":"<X+hiH70y71h9iUc5@wyvern>","References":"<20201224122855.22200-1-laurent.pinchart@ideasonboard.com>\n\t<20201224122855.22200-3-laurent.pinchart@ideasonboard.com>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<20201224122855.22200-3-laurent.pinchart@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH 2/8] utils: checkstyle.py: Factor out\n\tautomatic class registry","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Cc":"libcamera-devel@lists.libcamera.org","Content-Type":"text/plain; charset=\"iso-8859-1\"","Content-Transfer-Encoding":"quoted-printable","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]