diff options
author | Jon Wayne Parrott <jonwayne@google.com> | 2017-04-12 15:33:15 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-04-12 15:33:15 -0700 |
commit | 7b45217601daf649f972df4bf01ea0974e9a442c (patch) | |
tree | 6e933874e5e604f4c24a16f93153487ce596990b /scripts | |
parent | ca1eabcdd3454cf6b970d6bd825d1eab443aaef1 (diff) | |
download | google-auth-library-python-7b45217601daf649f972df4bf01ea0974e9a442c.tar.gz |
Move run_pylint to gcp-devrel-py-tools (#153)
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/.gitignore | 3 | ||||
-rw-r--r-- | scripts/run_pylint.py | 260 | ||||
-rwxr-xr-x | scripts/travis.sh | 14 |
3 files changed, 0 insertions, 277 deletions
diff --git a/scripts/.gitignore b/scripts/.gitignore deleted file mode 100644 index 3596d32..0000000 --- a/scripts/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -# Generated files -pylintrc -pylintrc.test diff --git a/scripts/run_pylint.py b/scripts/run_pylint.py deleted file mode 100644 index c33a53e..0000000 --- a/scripts/run_pylint.py +++ /dev/null @@ -1,260 +0,0 @@ -# Copyright 2016 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""This script runs Pylint on the specified source. - -Before running Pylint, it generates a Pylint configuration on -the fly based on programmatic defaults. -""" - -from __future__ import print_function - -import argparse -import collections -import copy -import io -import os -import subprocess -import sys - -import six - - -_SCRIPTS_DIR = os.path.abspath(os.path.dirname(__file__)) -PRODUCTION_RC = os.path.join(_SCRIPTS_DIR, 'pylintrc') -TEST_RC = os.path.join(_SCRIPTS_DIR, 'pylintrc.test') - -_PRODUCTION_RC_ADDITIONS = { - 'MESSAGES CONTROL': { - 'disable': [ - 'I', - 'import-error', - 'no-member', - 'protected-access', - 'redefined-variable-type', - 'similarities', - 'no-else-return', - ], - }, -} -_PRODUCTION_RC_REPLACEMENTS = { - 'MASTER': { - 'ignore': ['CVS', '.git', '.cache', '.tox', '.nox'], - 'load-plugins': 'pylint.extensions.check_docs', - }, - 'REPORTS': { - 'reports': 'no', - }, - 'BASIC': { - 'method-rgx': '[a-z_][a-z0-9_]{2,40}$', - 'function-rgx': '[a-z_][a-z0-9_]{2,40}$', - }, - 'TYPECHECK': { - 'ignored-modules': ['six', 'google.protobuf'], - }, - 'DESIGN': { - 'min-public-methods': '0', - 'max-args': '10', - 'max-attributes': '15', - }, -} -_TEST_RC_ADDITIONS = copy.deepcopy(_PRODUCTION_RC_ADDITIONS) -_TEST_RC_ADDITIONS['MESSAGES CONTROL']['disable'].extend([ - 'missing-docstring', - 'no-self-use', - 'redefined-outer-name', - 'unused-argument', - 'no-name-in-module', -]) -_TEST_RC_REPLACEMENTS = copy.deepcopy(_PRODUCTION_RC_REPLACEMENTS) -_TEST_RC_REPLACEMENTS.setdefault('BASIC', {}) -_TEST_RC_REPLACEMENTS['BASIC'].update({ - 'good-names': ['i', 'j', 'k', 'ex', 'Run', '_', 'fh', 'pytestmark'], - 'method-rgx': '[a-z_][a-z0-9_]{2,80}$', - 'function-rgx': '[a-z_][a-z0-9_]{2,80}$', -}) -IGNORED_FILES = () - -_ERROR_TEMPLATE = 'Pylint failed on {} with status {:d}.' -_LINT_FILESET_MSG = ( - 'Keyword arguments rc_filename and description are both ' - 'required. No other keyword arguments are allowed.') - - -def get_default_config(): - """Get the default Pylint configuration. - - .. note:: - - The output of this function varies based on the current version of - Pylint installed. - - Returns: - str: The default Pylint configuration. - """ - # Swallow STDERR if it says - # "No config file found, using default configuration" - result = subprocess.check_output(['pylint', '--generate-rcfile'], - stderr=subprocess.PIPE) - # On Python 3, this returns bytes (from STDOUT), so we - # convert to a string. - return result.decode('utf-8') - - -def read_config(contents): - """Reads pylintrc config into native ConfigParser object. - - Args: - contents (str): The contents of the file containing the INI config. - - Returns - ConfigParser.ConfigParser: The parsed configuration. - """ - file_obj = io.StringIO(contents) - config = six.moves.configparser.ConfigParser() - config.readfp(file_obj) - return config - - -def _transform_opt(opt_val): - """Transform a config option value to a string. - - If already a string, do nothing. If an iterable, then - combine into a string by joining on ",". - - Args: - opt_val (Union[str, list]): A config option's value. - - Returns: - str: The option value converted to a string. - """ - if isinstance(opt_val, (list, tuple)): - return ','.join(opt_val) - else: - return opt_val - - -def lint_fileset(*dirnames, **kwargs): - """Lints a group of files using a given rcfile. - - Keyword arguments are - - * ``rc_filename`` (``str``): The name of the Pylint config RC file. - * ``description`` (``str``): A description of the files and configuration - currently being run. - - Args: - dirnames (tuple): Directories to run Pylint in. - kwargs: The keyword arguments. The only keyword arguments - are ``rc_filename`` and ``description`` and both - are required. - - Raises: - KeyError: If the wrong keyword arguments are used. - """ - try: - rc_filename = kwargs['rc_filename'] - description = kwargs['description'] - if len(kwargs) != 2: - raise KeyError - except KeyError: - raise KeyError(_LINT_FILESET_MSG) - - pylint_shell_command = ['pylint', '--rcfile', rc_filename] - pylint_shell_command.extend(dirnames) - status_code = subprocess.call(pylint_shell_command) - if status_code != 0: - error_message = _ERROR_TEMPLATE.format(description, status_code) - print(error_message, file=sys.stderr) - sys.exit(status_code) - - -def make_rc(base_cfg, target_filename, - additions=None, replacements=None): - """Combines a base rc and additions into single file. - - Args: - base_cfg (ConfigParser.ConfigParser): The configuration we are - merging into. - target_filename (str): The filename where the new configuration - will be saved. - additions (dict): (Optional) The values added to the configuration. - replacements (dict): (Optional) The wholesale replacements for - the new configuration. - - Raises: - KeyError: if one of the additions or replacements does not - already exist in the current config. - """ - # Set-up the mutable default values. - if additions is None: - additions = {} - if replacements is None: - replacements = {} - - # Create fresh config, which must extend the base one. - new_cfg = six.moves.configparser.ConfigParser() - # pylint: disable=protected-access - new_cfg._sections = copy.deepcopy(base_cfg._sections) - new_sections = new_cfg._sections - # pylint: enable=protected-access - - for section, opts in additions.items(): - curr_section = new_sections.setdefault( - section, collections.OrderedDict()) - for opt, opt_val in opts.items(): - curr_val = curr_section.get(opt) - if curr_val is None: - raise KeyError('Expected to be adding to existing option.') - curr_val = curr_val.rstrip(',') - opt_val = _transform_opt(opt_val) - curr_section[opt] = '%s, %s' % (curr_val, opt_val) - - for section, opts in replacements.items(): - curr_section = new_sections.setdefault( - section, collections.OrderedDict()) - for opt, opt_val in opts.items(): - curr_val = curr_section.get(opt) - if curr_val is None: - raise KeyError('Expected to be replacing existing option.') - opt_val = _transform_opt(opt_val) - curr_section[opt] = '%s' % (opt_val,) - - with open(target_filename, 'w') as file_obj: - new_cfg.write(file_obj) - - -def main(): - """Script entry point. Lints both sets of files.""" - parser = argparse.ArgumentParser() - parser.add_argument('--library-filesets', nargs='+', default=[]) - parser.add_argument('--test-filesets', nargs='+', default=[]) - - args = parser.parse_args() - - default_config = read_config(get_default_config()) - make_rc(default_config, PRODUCTION_RC, - additions=_PRODUCTION_RC_ADDITIONS, - replacements=_PRODUCTION_RC_REPLACEMENTS) - make_rc(default_config, TEST_RC, - additions=_TEST_RC_ADDITIONS, - replacements=_TEST_RC_REPLACEMENTS) - - lint_fileset(*args.library_filesets, rc_filename=PRODUCTION_RC, - description='Library') - lint_fileset(*args.test_filesets, rc_filename=TEST_RC, - description='Test') - -if __name__ == '__main__': - main() diff --git a/scripts/travis.sh b/scripts/travis.sh index 5acb4c2..28bf5fa 100755 --- a/scripts/travis.sh +++ b/scripts/travis.sh @@ -40,17 +40,3 @@ fi # Run tox. echo "Running tox..." tox - -# Run tox for sub-packages. -if [[ $TOXENV != "docs" && -z $SYSTEM_TEST ]]; then - echo "Running tox for google_auth_httplib2..." - cd additional_packages/google_auth_httplib2 - # --workdir is specified to avoid path names being too long, which - # causes subprocess calls to hit the execve character limit. - # See https://github.com/pypa/virtualenv/issues/596 - tox --workdir ~/.tox-httplib2 - cd $ROOT - echo "Running tox for google_auth_oauthlib..." - cd additional_packages/google_auth_oauthlib - tox --workdir ~/.tox-oauthlib -fi |