diff options
Diffstat (limited to 'tools/pylint/plugins/allow_cmpi_logging.py')
-rw-r--r-- | tools/pylint/plugins/allow_cmpi_logging.py | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/tools/pylint/plugins/allow_cmpi_logging.py b/tools/pylint/plugins/allow_cmpi_logging.py new file mode 100644 index 0000000..4597301 --- /dev/null +++ b/tools/pylint/plugins/allow_cmpi_logging.py @@ -0,0 +1,90 @@ +# -*- encoding: utf-8 -*- +# Software Management Providers +# +# Copyright (C) 2012 Red Hat, Inc. All rights reserved. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Authors: Michal Minar <miminar@redhat.com> +""" +Pylint plugin supressing error concerning the use of cmpi_logging +facilities. +""" +from logilab.astng import scoped_nodes +from logilab.astng import MANAGER +from logilab.astng.builder import ASTNGBuilder +from pylint.interfaces import IASTNGChecker +from pylint.checkers import BaseChecker + +def logging_transform(module): + """ + Make the logging.RootLogger look, like it has following methods: + * trace_warn + * trace_info + * trace_verbose + These are actually defined in its subclass CMPILogger. + But pylint thinks, that RootLogger is used all the time. + """ + if module.name != 'logging' or 'RootLogger' not in module: + return + fake = ASTNGBuilder(MANAGER).string_build(''' + +def trace_warn(self, msg, *args, **kwargs): + print(self, msg, args, kwargs) + +def trace_info(self, msg, *args, **kwargs): + print(self, msg, args, kwargs) + +def trace_verbose(self, msg, *args, **kwargs): + print(self, msg, args, kwargs) + +''') + for level in ('warn', 'info', 'verbose'): + method_name = 'trace_' + level + for child in module.locals['RootLogger']: + if not isinstance(child, scoped_nodes.Class): + continue + child.locals[method_name] = fake.locals[method_name] + +class CMPILoggingChecker(BaseChecker): + """ + Checker that only disables some error messages of our custom + cmpi_logging facilities. + """ + + __implements__ = IASTNGChecker + + name = 'cmpi_logging' + # When we do have some real warning messages/reports, + # remote W9921. We need it just to get registered. + msgs = { 'W9921': ('Dummy', "This is a dummy message.")} + + def visit_class(self, node): + """ + This supresses some warnings for CMPILogger class. + """ + if ( isinstance(node.parent, scoped_nodes.Module) + and node.parent.name.split('.')[-1] == "cmpi_logging" + and node.name == "CMPILogger"): + # supress warning about too many methods defined + self.linter.disable('R0904', scope='module', line=node.lineno) + +def register(linter): + """ + Called when loaded by pylint --load-plugins. + Let's register our tranformation function and checker here. + """ + MANAGER.register_transformer(logging_transform) + linter.register_checker(CMPILoggingChecker(linter)) |