From 58f2b4781413a47b336b61d0913113883d31f3a8 Mon Sep 17 00:00:00 2001
From: Sean McGinnis <sean.mcginnis@gmail.com>
Date: Fri, 26 Apr 2019 08:56:43 -0500
Subject: [PATCH] Raise hacking version and fix pep8 errors

Various issues hit when switching to using stestr to run tests.
Presumably from other pulled in dependencies. This raises hacking to a
version that fixes a pyflakes issue [0] and addresses other pep8
violations that are then identified.

[0] https://github.com/PyCQA/pyflakes/pull/80

Change-Id: I9d8637d50067d6618aa408f4dbd9c736956099ed
Signed-off-by: Sean McGinnis <sean.mcginnis@gmail.com>
---
 reviewstats/cmd/bugstats.py         |  7 ++++---
 reviewstats/cmd/openapproved.py     |  6 +++---
 reviewstats/cmd/openreviews.py      |  8 +++++---
 reviewstats/cmd/reviewers.py        | 14 +++++++-------
 reviewstats/cmd/reviews_for_bugs.py | 14 +++++++-------
 reviewstats/tests/__init__.py       | 13 -------------
 reviewstats/utils.py                | 11 +++++------
 test-requirements.txt               |  2 +-
 8 files changed, 32 insertions(+), 43 deletions(-)

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('</%s>\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