diff options
author | Matt Martz <matt@sivel.net> | 2018-09-25 10:31:41 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-09-25 10:31:41 -0500 |
commit | 49eb53b44db0c91e3bf749a14f32ea1fc301634e (patch) | |
tree | a96f40c2adf04d446ec2d650431589b4c76b49ca /hacking | |
parent | e7926cf9f450359e711ba545bec1cfb5f24be27b (diff) | |
download | ansible-49eb53b44db0c91e3bf749a14f32ea1fc301634e.tar.gz |
pylint plugin to catch due/past-due deprecated calls (#44143)
* Start of work on pylint plugin to catch due/past-due deprecated calls
* Improve deprecated pylint plugin
* Catch call to AnsibleModule.deprecate also
* Skip splatted kwargs, we can't infer that info
* Add error for invalid version in deprecation
* Skip version if it's a reference to a var
* Disable ansible-deprecated-no-version for displaying deprecated module info
* fix comments
* is None
* Force specifying a version, this can be disabled on a per case basis
* Disable ansible-deprecated-version by default
* Remove to look for 2.8 deprecated
* Revert "Remove to look for 2.8 deprecated"
This reverts commit 4e84034fd104879f429f0262ff0b2317e3d08deb.
* Add script and template used for creating issues for deprecated issues
* Fix underscore var
Diffstat (limited to 'hacking')
-rw-r--r-- | hacking/create_deprecated_issues.py | 106 | ||||
-rw-r--r-- | hacking/deprecated_issue_template.md | 34 |
2 files changed, 140 insertions, 0 deletions
diff --git a/hacking/create_deprecated_issues.py b/hacking/create_deprecated_issues.py new file mode 100644 index 0000000000..f5e3f30903 --- /dev/null +++ b/hacking/create_deprecated_issues.py @@ -0,0 +1,106 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# (c) 2017, Matt Martz <matt@sivel.net> +# +# This file is part of Ansible +# +# Ansible 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. +# +# Ansible 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 Ansible. If not, see <http://www.gnu.org/licenses/>. + +import argparse +import os +import time + +from collections import defaultdict + +from ansible.release import __version__ as ansible_version + +ansible_major_version = '.'.join(ansible_version.split('.')[:2]) + +try: + from github3 import GitHub +except ImportError: + raise SystemExit( + 'This script needs the github3.py library installed to work' + ) + +if not os.getenv('GITHUB_TOKEN'): + raise SystemExit( + 'Please set the GITHUB_TOKEN env var with your github oauth token' + ) + +deprecated = defaultdict(list) + + +parser = argparse.ArgumentParser() +parser.add_argument('--template', default='deprecated_issue_template.md', + type=argparse.FileType('r'), + help='Path to markdown file template to be used for issue ' + 'body. Default: %(default)s') +parser.add_argument('problems', nargs=1, type=argparse.FileType('r'), + help='Path to file containing pylint output for the ' + 'ansible-deprecated-version check') +args = parser.parse_args() + + +body_tmpl = args.template.read() +args.template.close() + +text = args.problems.read() +args.problems.close() + + +for line in text.splitlines(): + path, line, column, msg = line.split(':') + msg = msg.strip() + if path.endswith('__init__.py'): + component = os.path.basename(os.path.dirname(path)) + else: + component, ext_ = os.path.splitext(os.path.basename(path).lstrip('_')) + + title = ( + '%s contains deprecated call to be removed in %s' % + (component, ansible_major_version) + ) + deprecated[component].append( + dict(title=title, msg=msg, path=path, line=line, column=column) + ) + + +g = GitHub(token=os.getenv('GITHUB_TOKEN')) +repo = g.repository('ansible', 'ansible') + +# Not enabled by default, this fetches the column of a project, +# so that we can later add the issue to a project column +# You will need the project and column IDs for this to work +# and then update the below lines +# project = repo.project(1749241) +# column = project.column(3314029) + +for component, items in deprecated.items(): + title = items[0]['title'] + msg = '\n'.join(i['msg'] for i in items) + path = '\n'.join(i['path'] for i in items) + body = body_tmpl % dict(component=component, msg=msg, path=path, + line=line, column=column, + version=ansible_major_version) + + issue = repo.create_issue(title, body=body, labels=['deprecated']) + print(issue) + # Sleep a little, so that the API doesn't block us + time.sleep(0.5) + # Uncomment the next 2 lines if you want to add issues to a project + # Needs to be done in combination with the above code for selecting + # the project/column + # column.create_card_with_issue(issue) + # time.sleep(0.5) diff --git a/hacking/deprecated_issue_template.md b/hacking/deprecated_issue_template.md new file mode 100644 index 0000000000..e319fba794 --- /dev/null +++ b/hacking/deprecated_issue_template.md @@ -0,0 +1,34 @@ +##### SUMMARY +%(component)s contains call to Display.deprecated or AnsibleModule.deprecate and is scheduled for removal + +``` +%(path)s:%(line)s:%(column)s: %(msg)s +``` + +##### ISSUE TYPE + - Bug Report + +##### COMPONENT NAME +``` +%(path)s +``` + +##### ANSIBLE VERSION +``` +%(version)s +``` + +##### CONFIGURATION +N/A + +##### OS / ENVIRONMENT +N/A + +##### STEPS TO REPRODUCE +N/A + +##### EXPECTED RESULTS +N/A + +##### ACTUAL RESULTS +N/A |