diff --git a/reviewstats/cmd/bugstats.py b/reviewstats/cmd/bugstats.py index e595e8c..2f2e200 100644 --- a/reviewstats/cmd/bugstats.py +++ b/reviewstats/cmd/bugstats.py @@ -14,7 +14,8 @@ from argparse import ArgumentParser import bisect -from datetime import datetime, timedelta +from datetime import datetime +from datetime import timedelta import prettytable import sys from textwrap import dedent @@ -37,7 +38,7 @@ offsets = { } -class Listener: +class Listener(object): def __init__(self, project_name, lp_projects): self.name = project_name @@ -171,7 +172,7 @@ def main(): for project in projects: lp_projects = project.get('lp_projects', []) if not lp_projects: - print "Please specify a project." + print("Please specify a project.") return 1 listener = Listener(project['name'], lp_projects) listeners.add(listener) diff --git a/reviewstats/cmd/openapproved.py b/reviewstats/cmd/openapproved.py index bc5d014..502e672 100755 --- a/reviewstats/cmd/openapproved.py +++ b/reviewstats/cmd/openapproved.py @@ -51,7 +51,7 @@ def main(argv=None): projects = utils.get_projects_info(options.project, options.all) if not projects: - print "Please specify a project." + print("Please specify a project.") sys.exit(1) changes = utils.get_changes(projects, options.user, options.key, @@ -76,8 +76,8 @@ def main(argv=None): change['subject'])) for x in approved_and_rebased: - print x - print "total %d" % len(approved_and_rebased) + print() + print("total %d" % len(approved_and_rebased)) def has_negative_feedback(patch_set): diff --git a/reviewstats/cmd/openreviews.py b/reviewstats/cmd/openreviews.py index 1ae3fe4..7f99474 100755 --- a/reviewstats/cmd/openreviews.py +++ b/reviewstats/cmd/openreviews.py @@ -21,6 +21,8 @@ import logging import optparse import sys +import six + from reviewstats import utils @@ -174,7 +176,7 @@ def print_stats_txt(stats, f=sys.stdout): print_item_txt(item, level) def print_item_txt(item, level): - if isinstance(item, basestring): + if isinstance(item, six.text_type): f.write('%s\n' % item.encode('utf-8')) elif isinstance(item, list): print_list_txt(item, level + 1) @@ -203,7 +205,7 @@ def print_stats_html(stats, f=sys.stdout): f.write('\n' % ('ul' if level == 1 else 'ol')) def print_item_html(item, level): - if isinstance(item, basestring): + if isinstance(item, six.text_type): f.write('%s' % item.encode('utf-8')) elif isinstance(item, list): print_list_html(item, level + 1) @@ -285,7 +287,7 @@ def main(argv=None): base_dir=options.projects_dir) if not projects: - print "Please specify a project." + print("Please specify a project.") sys.exit(1) changes = utils.get_changes(projects, options.user, options.key, diff --git a/reviewstats/cmd/reviewers.py b/reviewstats/cmd/reviewers.py index 1d8ad3b..2be584c 100755 --- a/reviewstats/cmd/reviewers.py +++ b/reviewstats/cmd/reviewers.py @@ -169,12 +169,12 @@ def write_pretty(reviewer_data, file_obj, options, reviewers, projects, file_obj.write( '\nTotal reviews: %d (%.1f/day)\n' % ( - totals['all'], float(totals['all']) / options.days)) - num_reviewers = len([r for r in reviewers if r[0]['total']]) + totals['all'], float(totals['all']) / options.days)) + num_reviewers = len([rev for rev in reviewers if rev[0]['total']]) file_obj.write( 'Total reviewers: %d (avg %.1f reviews/day)\n' % ( - num_reviewers, - float(totals['all']) / options.days / num_reviewers + num_reviewers, + float(totals['all']) / options.days / num_reviewers if num_reviewers else 0)) file_obj.write('Total reviews by core team: %d (%.1f/day)\n' % ( totals['core'], float(totals['core']) / options.days)) @@ -253,8 +253,8 @@ def main(argv=None): optparser.add_option( '-o', '--output', default='-', help='Where to write output. If - stdout is used and only one output ' - 'format may be given. Otherwise the output format is appended to ' - 'the output parameter to generate file names.') + 'format may be given. Otherwise the output format is appended to ' + 'the output parameter to generate file names.') optparser.add_option( '--outputs', default=['txt'], action='append', help='Select what outputs to generate. (txt,csv).') @@ -283,7 +283,7 @@ def main(argv=None): projects = utils.get_projects_info(options.project, options.all) if not projects: - print "Please specify a project." + print("Please specify a project.") sys.exit(1) reviewers = {} diff --git a/reviewstats/cmd/reviews_for_bugs.py b/reviewstats/cmd/reviews_for_bugs.py index 6330fc4..7c2f458 100755 --- a/reviewstats/cmd/reviews_for_bugs.py +++ b/reviewstats/cmd/reviews_for_bugs.py @@ -40,7 +40,7 @@ def main(): project_name = projects[0]['name'] if not projects: - print "Please specify a project." + print("Please specify a project.") return 1 launchpad = Launchpad.login_with('openstack-releasing', 'production') @@ -77,14 +77,14 @@ def main(): milestones.setdefault(milestone, []) milestones[milestone].append((change['url'], bugid)) - print 'Reviews for bugs grouped by milestone for project: %s\n' % ( - project_name) + print('Reviews for bugs grouped by milestone for project: %s\n' % ( + project_name)) for milestone, reviews in milestones.items(): if args.milestone and milestone != args.milestone: continue - print 'Milestone: %s' % milestone + print('Milestone: %s' % milestone) for review, bugid in reviews: - print '--> %s -- https://bugs.launchpad.net/%s/+bug/%s' \ - % (review, project_name, bugid) - print + print('--> %s -- https://bugs.launchpad.net/%s/+bug/%s' % + (review, project_name, bugid)) + print() diff --git a/reviewstats/tests/__init__.py b/reviewstats/tests/__init__.py index 19f5e72..e69de29 100644 --- a/reviewstats/tests/__init__.py +++ b/reviewstats/tests/__init__.py @@ -1,13 +0,0 @@ -# -*- coding: utf-8 -*- - -# 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. diff --git a/reviewstats/utils.py b/reviewstats/utils.py index 2a24d5a..8d1327c 100644 --- a/reviewstats/utils.py +++ b/reviewstats/utils.py @@ -1,4 +1,4 @@ -## -*- coding: utf-8 -*- +# -*- coding: utf-8 -*- # Copyright (C) 2011 - Soren Hansen # Copyright (C) 2013 - Red Hat, Inc. # @@ -14,21 +14,20 @@ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. -"""Utility functions module -""" +"""Utility functions module""" import glob import gzip import json import logging import os -import requests -import requests.auth -from six.moves import cPickle as pickle import time import yaml import paramiko +import requests +import requests.auth +from six.moves import cPickle as pickle from six.moves import cStringIO from six.moves import urllib diff --git a/test-requirements.txt b/test-requirements.txt index 2cb6ece..1b70fc4 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -1,4 +1,4 @@ -hacking>=0.5.6,<0.8 +hacking!=0.13.0,<0.14,>=0.12.0 # Apache-2.0 coverage>=3.6 fixtures>=0.3.14