From d63ade55f5cc2a9ecf21ea2b43cfac80149c4c29 Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Tue, 11 Aug 2015 19:51:43 +0200 Subject: Move pylint-build-scan.py to scripts directory Move internal helper and its configuration out of the project's root directory into scripts/. Also use re instead of fnmatch to find the upgrade scriptlets. --- scripts/compose_functions | 2 +- scripts/dogtag.pylintrc | 270 +++++++++++++++++++++++++++++++++++++++++++ scripts/pylint-build-scan.py | 134 +++++++++++++++++++++ 3 files changed, 405 insertions(+), 1 deletion(-) create mode 100644 scripts/dogtag.pylintrc create mode 100755 scripts/pylint-build-scan.py (limited to 'scripts') diff --git a/scripts/compose_functions b/scripts/compose_functions index c9b0de36a..c4ae173e4 100644 --- a/scripts/compose_functions +++ b/scripts/compose_functions @@ -42,7 +42,7 @@ export PKI_DOGTAG_DIR PKI_REDHAT_DIR="${PKI_DIR}/redhat" export PKI_REDHAT_DIR -PKI_FILE_LIST="CMakeLists.txt COPYING CPackConfig.cmake ConfigureChecks.cmake DefineOptions.cmake README cmake_uninstall.cmake.in config.h.cmake pylint-build-scan.py dogtag.pylintrc" +PKI_FILE_LIST="CMakeLists.txt COPYING CPackConfig.cmake ConfigureChecks.cmake DefineOptions.cmake README cmake_uninstall.cmake.in config.h.cmake scripts/pylint-build-scan.py scripts/dogtag.pylintrc" export PKI_FILE_LIST PKI_CMAKE_DIR="cmake" diff --git a/scripts/dogtag.pylintrc b/scripts/dogtag.pylintrc new file mode 100644 index 000000000..3ffb1ab71 --- /dev/null +++ b/scripts/dogtag.pylintrc @@ -0,0 +1,270 @@ +[MASTER] + +# Specify a configuration file. +#rcfile= + +# Python code to execute, usually for sys.path manipulation such as +# pygtk.require(). +#init-hook= + +# Profiled execution. +profile=no + +# Add files or directories to the blacklist. They should be base names, not +# paths. +ignore=CVS + +# Pickle collected data for later comparisons. +persistent=yes + +# List of plugins (as comma separated values of python modules names) to load, +# usually to register additional checkers. +load-plugins= + +# A comma-separated list of package or module names from where C extensions may +# be loaded. Extensions are loading into the active Python interpreter and may +# run arbitrary code +extension-pkg-whitelist=ldap,lxml,nss + + +[MESSAGES CONTROL] + +# Enable the message, report, category or checker with the given id(s). You can +# either give multiple identifier separated by comma (,) or put this option +# multiple time. +#enable= + +# Disable the message, report, category or checker with the given id(s). You +# can either give multiple identifier separated by comma (,) or put this option +# multiple time (only on the command line, not in the configuration file where +# it should appear only once). +# W0105 (pointless-string-statement): +# String statement has no effect Used when a string is used as a statement (which of course has no effect). This is a particular case of W0104 with its own message so you can easily disable it if you’re # using those strings as documentation, instead of comments. +# W0511 (fixme): Used when a warning note as FIXME or XXX is detected. +# W0142: Used when a function or method is called using *args or **kwargs to dispatch arguments. This doesn't improve readability and should be used with care. +# +# C and R messages are disabled by default. To clean up the code, enable C and +# R messages temporarily. +disable=W0511,W0105,W0142,C,R + + +[REPORTS] + +# Set the output format. Available formats are text, parseable, colorized, msvs +# (visual studio) and html. You can also give a reporter class, eg +# mypackage.mymodule.MyReporterClass. +output-format=text + +# Put messages in a separate file for each module / package specified on the +# command line instead of printing them on stdout. Reports (if any) will be +# written in a file name "pylint_global.[txt|html]". +files-output=no + +# Tells whether to display a full report or only the messages +reports=yes + +# Python expression which should return a note less than 10 (10 is the highest +# note). You have access to the variables errors warning, statement which +# respectively contain the number of errors / warnings messages and the total +# number of statements analyzed. This is used by the global evaluation report +# (RP0004). +evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) + +# Add a comment according to your evaluation note. This is used by the global +# evaluation report (RP0004). +comment=no + + +[FORMAT] + +# Maximum number of characters on a single line. +max-line-length=100 + +# Maximum number of lines in a module +max-module-lines=1000 + +# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 +# tab). +indent-string=' ' + + +[MISCELLANEOUS] + +# List of note tags to take in consideration, separated by a comma. +notes=FIXME,XXX,TODO + + +[VARIABLES] + +# Tells whether we should check for unused import in __init__ files. +init-import=no + +# A regular expression matching the beginning of the name of dummy variables +# (i.e. not used). +dummy-variables-rgx=_|dummy + +# List of additional names supposed to be defined in builtins. Remember that +# you should avoid to define new builtins when possible. +additional-builtins= + + +[SIMILARITIES] + +# Minimum lines number of a similarity. +min-similarity-lines=4 + +# Ignore comments when computing similarities. +ignore-comments=yes + +# Ignore docstrings when computing similarities. +ignore-docstrings=yes + +# Ignore imports when computing similarities. +ignore-imports=no + + +[TYPECHECK] + +# Tells whether missing members accessed in mixin class should be ignored. A +# mixin class is detected if its name ends with "mixin" (case insensitive). +ignore-mixin-members=yes + +# List of module names for which member attributes should not be checked +# (useful for modules/projects where namespaces are manipulated during runtime +# and thus existing member attributes cannot be deduced by static analysis +ignored-modules=ldap + +# List of classes names for which member attributes should not be checked +# (useful for classes with attributes dynamically set). +ignored-classes=SQLObject + +# When zope mode is activated, add a predefined set of Zope acquired attributes +# to generated-members. +zope=no + +# List of members which are set dynamically and missed by pylint inference +# system, and so shouldn't trigger E0201 when accessed. Python regular +# expressions are accepted. +generated-members=REQUEST,acl_users,aq_parent + + +[BASIC] + +# Required attributes for module, separated by a comma +required-attributes= + +# List of builtins function names that should not be used, separated by a comma +bad-functions=map,filter,apply,input + +# Regular expression which should only match correct module names +module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ + +# Regular expression which should only match correct module level names +const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$ + +# Regular expression which should only match correct class names +class-rgx=[A-Z_][a-zA-Z0-9]+$ + +# Regular expression which should only match correct function names +function-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression which should only match correct method names +method-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression which should only match correct instance attribute names +attr-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression which should only match correct argument names +argument-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression which should only match correct variable names +variable-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression which should only match correct list comprehension / +# generator expression variable names +inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ + +# Good variable names which should always be accepted, separated by a comma +good-names=i,j,k,ex,Run,rv,_ + +# Bad variable names which should always be refused, separated by a comma +bad-names=foo,bar,baz,toto,tutu,tata + +# Regular expression which should only match functions or classes name which do +# not require a docstring +no-docstring-rgx=__.*__ + + +[DESIGN] + +# Maximum number of arguments for function / method +max-args=5 + +# Argument names that match this expression will be ignored. Default to name +# with leading underscore +ignored-argument-names=_.* + +# Maximum number of locals for function / method body +max-locals=15 + +# Maximum number of return / yield for function / method body +max-returns=6 + +# Maximum number of branch for function / method body +max-branchs=12 + +# Maximum number of statements in function / method body +max-statements=50 + +# Maximum number of parents for a class (see R0901). +max-parents=7 + +# Maximum number of attributes for a class (see R0902). +max-attributes=7 + +# Minimum number of public methods for a class (see R0903). +min-public-methods=2 + +# Maximum number of public methods for a class (see R0904). +max-public-methods=20 + + +[CLASSES] + +# List of interface methods to ignore, separated by a comma. This is used for +# instance to not check methods defines in Zope's Interface base class. +ignore-iface-methods=isImplementedBy,deferred,extends,names,namesAndDescriptions,queryDescriptionFor,getBases,getDescriptionFor,getDoc,getName,getTaggedValue,getTaggedValueTags,isEqualOrExtendedBy,setTaggedValue,isImplementedByInstancesOf,adaptWith,is_implemented_by + +# List of method names used to declare (i.e. assign) instance attributes. +defining-attr-methods=__init__,__new__,setUp + +# List of valid names for the first argument in a class method. +valid-classmethod-first-arg=cls + +# List of valid names for the first argument in a metaclass class method. +valid-metaclass-classmethod-first-arg=mcs + + +[IMPORTS] + +# Deprecated modules which should not be used, separated by a comma +deprecated-modules=regsub,TERMIOS,Bastion,rexec + +# Create a graph of every (i.e. internal and external) dependencies in the +# given file (report RP0402 must not be disabled) +import-graph= + +# Create a graph of external dependencies in the given file (report RP0402 must +# not be disabled) +ext-import-graph= + +# Create a graph of internal dependencies in the given file (report RP0402 must +# not be disabled) +int-import-graph= + + +[EXCEPTIONS] + +# Exceptions that will emit a warning when being caught. Defaults to +# "Exception" +overgeneral-exceptions=Exception diff --git a/scripts/pylint-build-scan.py b/scripts/pylint-build-scan.py new file mode 100755 index 000000000..be036088f --- /dev/null +++ b/scripts/pylint-build-scan.py @@ -0,0 +1,134 @@ +#!/usr/bin/python + +# Authors: +# Christian Heimes +# +# 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; version 2 of the License. +# +# 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, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Copyright (C) 2015 Red Hat, Inc. +# All rights reserved. + +from __future__ import print_function, unicode_literals + +import argparse +import os +import pprint +import re +import subprocess +import sys + +from distutils.sysconfig import get_python_lib # pylint: disable=F0401 + + +SCRIPTPATH = os.path.dirname(os.path.abspath(__file__)) +PYLINTRC = os.path.join(SCRIPTPATH, 'dogtag.pylintrc') +FILENAMES = [ + os.path.abspath(__file__), + '{sitepackages}/pki', + '{bin}/pki', + '{sbin}/pkispawn', + '{sbin}/pkidestroy', + '{sbin}/pki-upgrade', + '{sbin}/pki-server', + '{sbin}/pki-server-upgrade', +] +UPGRADE_SCRIPT = re.compile('^[0-9]+-.*') + + +def tox_env(args): + """Paths for tox environment""" + prefix = args.prefix + env = { + 'bin': os.path.join(prefix, 'bin'), + 'sbin': os.path.join(prefix, 'bin'), + 'sharepki': os.path.join(prefix, 'share', 'pki'), + 'sitepackages': get_python_lib() + } + return env + + +def rpm_env(args): + """Paths for RPM build environment""" + prefix = args.prefix + relative = get_python_lib().lstrip(os.sep) + env = { + 'bin': os.path.join(prefix, 'usr', 'bin'), + 'sbin': os.path.join(prefix, 'usr', 'sbin'), + 'sharepki': os.path.join(prefix, 'usr', 'share', 'pki'), + 'sitepackages': os.path.join(prefix, relative), + } + return env + + +def find_upgrades(root): + """Find upgrade scripts""" + for dirpath, _, filenames in os.walk(root): + for filename in filenames: + if UPGRADE_SCRIPT.match(filename): + yield os.path.join(dirpath, filename) + + +def main(): + """Dogtag pylint script""" + parser = argparse.ArgumentParser( + description=main.__doc__, + epilog="Additional arguments can be passed to pylint with: " + "'-- --arg1 --arg2 ...'", + ) + parser.add_argument('--verbose', action='store_true') + subparsers = parser.add_subparsers(dest='command') + subparsers.required = True + + toxparser = subparsers.add_parser('tox', help='tox in-tree tests') + toxparser.add_argument('--prefix', dest='prefix', default=sys.prefix) + toxparser.add_argument('pylint_args', nargs=argparse.REMAINDER) + toxparser.set_defaults(get_env=tox_env) + + rpmparser = subparsers.add_parser('rpm', help='RPM source tree tests') + rpmparser.add_argument('--prefix', dest='prefix', required=True) + rpmparser.add_argument('pylint_args', nargs=argparse.REMAINDER) + rpmparser.set_defaults(get_env=rpm_env) + + args = parser.parse_args() + env = args.get_env(args) + if args.verbose: + pprint.pprint(env) + # sanity check + for key, path in env.items(): + if not os.path.exists(path): + raise RuntimeError('{} ({}) does not exist'.format(key, path)) + + if args.pylint_args and args.pylint_args[0] == '--': + extra_args = args.pylint_args[1:] + else: + extra_args = args.pylint_args + + if not os.path.isfile(PYLINTRC): + raise IOError('{} not found'.format(PYLINTRC)) + + pylint = [ + 'pylint', + '--rcfile={}'.format(PYLINTRC) + ] + pylint.extend(extra_args) + pylint.extend(filename.format(**env) for filename in FILENAMES) + pylint.extend(find_upgrades('{sharepki}/upgrade'.format(**env))) + pylint.extend(find_upgrades('{sharepki}/server/upgrade'.format(**env))) + if args.verbose: + pprint.pprint(pylint) + + return subprocess.call(pylint, cwd=env['sitepackages']) + +if __name__ == '__main__': + sys.exit(main()) -- cgit