Re: [Freeipa-devel] [PATCH] 6 Add lint script for static code analysis

2011-04-13 Thread Martin Kosek
On Mon, 2011-04-11 at 15:44 +0200, Jan Cholasta wrote:
 On 7.4.2011 17:00, Jan Cholasta wrote:
  This patch adds a script based on pylint for static code analysis during
  build.
 
  https://fedorahosted.org/freeipa/ticket/867
 
 
 
  ___
  Freeipa-devel mailing list
  Freeipa-devel@redhat.com
  https://www.redhat.com/mailman/listinfo/freeipa-devel
 
 Improved the script a little bit:
 
 - The script now exits with non-zero error code if errors were found. 
 This behavior can be suppressed with the --no-fail option.
 - Added --enable-noerror option to enable warnings and other non-error 
 messages.
 
 ___
 Freeipa-devel mailing list
 Freeipa-devel@redhat.com
 https://www.redhat.com/mailman/listinfo/freeipa-devel

ACK. Pushed to master, ipa-2-0.

Martin

___
Freeipa-devel mailing list
Freeipa-devel@redhat.com
https://www.redhat.com/mailman/listinfo/freeipa-devel


Re: [Freeipa-devel] [PATCH] 6 Add lint script for static code analysis

2011-04-11 Thread Martin Kosek
On Thu, 2011-04-07 at 17:00 +0200, Jan Cholasta wrote:
 This patch adds a script based on pylint for static code analysis during 
 build.
 
 https://fedorahosted.org/freeipa/ticket/867
 

Good work, works for me. Enabling static analysis for our IPA framework
will improve the code base and could identify some hard-to-find bugs - I
see that one has been already fixed.

I tested this along with the next patch dealing with false positives.

Martin

___
Freeipa-devel mailing list
Freeipa-devel@redhat.com
https://www.redhat.com/mailman/listinfo/freeipa-devel


Re: [Freeipa-devel] [PATCH] 6 Add lint script for static code analysis

2011-04-11 Thread Jan Cholasta

On 7.4.2011 17:00, Jan Cholasta wrote:

This patch adds a script based on pylint for static code analysis during
build.

https://fedorahosted.org/freeipa/ticket/867



___
Freeipa-devel mailing list
Freeipa-devel@redhat.com
https://www.redhat.com/mailman/listinfo/freeipa-devel


Improved the script a little bit:

- The script now exits with non-zero error code if errors were found. 
This behavior can be suppressed with the --no-fail option.
- Added --enable-noerror option to enable warnings and other non-error 
messages.


--
Jan Cholasta
From f35659c16f8f57022e8a76dd9c53356f22b8a509 Mon Sep 17 00:00:00 2001
From: Jan Cholasta jchol...@redhat.com
Date: Mon, 11 Apr 2011 15:39:38 +0200
Subject: [PATCH] Add lint script for static code analysis.

ticket 867
---
 Makefile  |3 +
 make-lint |  192 +
 2 files changed, 195 insertions(+), 0 deletions(-)
 create mode 100755 make-lint

diff --git a/Makefile b/Makefile
index 4cc9dea..f8f5987 100644
--- a/Makefile
+++ b/Makefile
@@ -72,6 +72,9 @@ client-install: client
 		python setup-client.py install --root $(DESTDIR); \
 	fi
 
+lint:
+	./make-lint
+
 test:
 	$(MAKE) -C install/po test_lang
 	./make-test
diff --git a/make-lint b/make-lint
new file mode 100755
index 000..9fb6642
--- /dev/null
+++ b/make-lint
@@ -0,0 +1,192 @@
+#!/usr/bin/python
+#
+# Authors:
+#   Jakub Hrozek jhro...@redhat.com
+#   Jan Cholasta jchol...@redhat.com
+#
+# Copyright (C) 2011  Red Hat
+# see file 'COPYING' for use and warranty information
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see http://www.gnu.org/licenses/.
+
+import os
+import sys
+from optparse import OptionParser
+from fnmatch import fnmatch, fnmatchcase
+
+from pylint import checkers
+from pylint.lint import PyLinter
+from pylint.reporters.text import ParseableTextReporter
+from pylint.checkers.typecheck import TypeChecker
+from logilab.astng import Class, Instance, InferenceError
+
+# File names to ignore when searching for python source files
+IGNORE_FILES = ('.*', '*~', '*.in', '*.pyc', '*.pyo')
+IGNORE_PATHS = ('build', 'tests')
+
+class IPATypeChecker(TypeChecker):
+# 'class': ('generated', 'properties',)
+ignore = {
+'ipalib.base.NameSpace': ('find',),
+'ipalib.cli.Collector': ('__options',),
+'ipalib.config.Env': ('*'),
+'ipalib.plugable.API': ('Command', 'Object', 'Method', 'Property',
+'Backend', 'log', 'plugins'),
+'ipalib.plugable.Plugin': ('Command', 'Object', 'Method', 'Property',
+'Backend', 'env', 'debug', 'info', 'warning', 'error', 'critical',
+'exception', 'context', 'log'),
+'ipalib.plugins.baseldap.CallbackInterface': ('pre_callback',
+'post_callback', 'exc_callback'),
+'ipalib.plugins.misc.env': ('env',),
+'ipalib.parameters.Param': ('cli_name', 'cli_short_name', 'label',
+'doc', 'required', 'multivalue', 'primary_key', 'normalizer',
+'default', 'default_from', 'create_default', 'autofill', 'query',
+'attribute', 'include', 'exclude', 'flags', 'hint', 'alwaysask'),
+'ipalib.parameters.Bool': ('truths', 'falsehoods'),
+'ipalib.parameters.Int': ('minvalue', 'maxvalue'),
+'ipalib.parameters.Float': ('minvalue', 'maxvalue'),
+'ipalib.parameters.Data': ('minlength', 'maxlength', 'length',
+'pattern', 'pattern_errmsg'),
+'ipalib.parameters.Enum': ('values',),
+'ipalib.parameters.List': ('separator', 'skipspace'),
+'ipalib.parameters.File': ('stdin_if_missing'),
+'urlparse.SplitResult': ('netloc',),
+}
+
+def _related_classes(self, klass):
+yield klass
+for base in klass.ancestors():
+yield base
+
+def _class_full_name(self, klass):
+return klass.root().name + '.' + klass.name
+
+def _find_ignored_attrs(self, owner):
+attrs = []
+for klass in self._related_classes(owner):
+name = self._class_full_name(klass)
+if name in self.ignore:
+attrs += self.ignore[name]
+return attrs
+
+def visit_getattr(self, node):
+try:
+infered = list(node.expr.infer())
+except InferenceError:
+return
+
+for owner in infered:
+if not isinstance(owner, Class)