Bump hacking

hacking 3.0.x is too old. This also removes the note about old behavior
of pip which has been changed in recent versions.

Notes:
- A few errors newly detected are also fixed.

- This also fixes the compatibility with flake8 >= 3.0 because flake8
  is also bumped when we bump hacking.

- pretty_flake8 tool is removed because it's not commonly used but
  needs maintenance effort to keep it in sync with newer releases

Change-Id: I8e91b06199bfbed1d6e9f8d62ddf52fafd60b7f9
This commit is contained in:
Takashi Kajinami 2024-01-17 12:25:23 +09:00
parent 21b266b070
commit 7472f515a6
8 changed files with 20 additions and 122 deletions

View File

@ -15,6 +15,7 @@
# under the License. # under the License.
import argparse import argparse
import io
import logging import logging
import os import os
import re import re
@ -39,7 +40,7 @@ class Zone:
self.to_file(sys.stdout) self.to_file(sys.stdout)
def to_file(self, f): def to_file(self, f):
if type(f) == 'file': if isinstance(f, io.IOBase):
fd = f fd = f
elif type(f) is str: elif type(f) is str:
if os.path.isdir(f): if os.path.isdir(f):

View File

@ -15,7 +15,6 @@
import re import re
from hacking import core from hacking import core
import pycodestyle
# D701: Default parameter value is a mutable type # D701: Default parameter value is a mutable type
# D702: Log messages require translation # D702: Log messages require translation
@ -49,8 +48,8 @@ no_line_continuation_backslash_re = re.compile(r'.*(\\)\n')
@core.flake8ext @core.flake8ext
def mutable_default_arguments(physical_line, logical_line, filename): def mutable_default_arguments(logical_line, filename, noqa):
if pycodestyle.noqa(physical_line): if noqa:
return return
if mutable_default_argument_check.match(logical_line): if mutable_default_argument_check.match(logical_line):
@ -69,7 +68,7 @@ def no_translate_debug_logs(logical_line, filename):
N319 N319
""" """
if logical_line.startswith("LOG.debug(_("): if logical_line.startswith("LOG.debug(_("):
yield(0, "D706: Don't translate debug level logs") yield (0, "D706: Don't translate debug level logs")
@core.flake8ext @core.flake8ext
@ -90,7 +89,7 @@ def check_explicit_underscore_import(logical_line, filename):
UNDERSCORE_IMPORT_FILES.append(filename) UNDERSCORE_IMPORT_FILES.append(filename)
elif (translated_log.match(logical_line) or elif (translated_log.match(logical_line) or
string_translation.match(logical_line)): string_translation.match(logical_line)):
yield(0, "D703: Found use of _() without explicit import of _!") yield (0, "D703: Found use of _() without explicit import of _!")
@core.flake8ext @core.flake8ext
@ -109,7 +108,7 @@ def no_import_graduated_oslo_libraries(logical_line, filename):
matches = graduated_oslo_libraries_import_re.match(logical_line) matches = graduated_oslo_libraries_import_re.match(logical_line)
if matches: if matches:
yield(0, "D704: Found import of %s. This oslo library has been " yield (0, "D704: Found import of %s. This oslo library has been "
"graduated!" % matches.group(1)) "graduated!" % matches.group(1))
@ -133,13 +132,13 @@ def check_no_basestring(logical_line):
if re.search(r"\bbasestring\b", logical_line): if re.search(r"\bbasestring\b", logical_line):
msg = ("D707: basestring is not Python3-compatible, use " msg = ("D707: basestring is not Python3-compatible, use "
"str instead.") "str instead.")
yield(0, msg) yield (0, msg)
@core.flake8ext @core.flake8ext
def check_python3_xrange(logical_line): def check_python3_xrange(logical_line):
if re.search(r"\bxrange\s*\(", logical_line): if re.search(r"\bxrange\s*\(", logical_line):
yield(0, "D708: Do not use xrange. Use range for " yield (0, "D708: Do not use xrange. Use range for "
"large loops.") "large loops.")
@ -152,7 +151,7 @@ def check_no_log_audit(logical_line):
for OpenStack we can enforce not using it. for OpenStack we can enforce not using it.
""" """
if "LOG.audit(" in logical_line: if "LOG.audit(" in logical_line:
yield(0, "D709: LOG.audit is deprecated, please use LOG.info!") yield (0, "D709: LOG.audit is deprecated, please use LOG.info!")
@core.flake8ext @core.flake8ext
@ -162,7 +161,7 @@ def check_no_log_warn(logical_line):
D710 D710
""" """
if logical_line.startswith('LOG.warn('): if logical_line.startswith('LOG.warn('):
yield(0, "D710:Use LOG.warning() rather than LOG.warn()") yield (0, "D710:Use LOG.warning() rather than LOG.warn()")
@core.flake8ext @core.flake8ext

View File

@ -88,7 +88,7 @@ def sort_query(query, table, sort_keys, sort_dir=None, sort_dirs=None):
# the actual primary key, rather than assuming its id # the actual primary key, rather than assuming its id
LOG.warning('Id not in sort_keys; is sort_keys unique?') LOG.warning('Id not in sort_keys; is sort_keys unique?')
assert(not (sort_dir and sort_dirs)) assert (not (sort_dir and sort_dirs))
# Default the sort direction to ascending # Default the sort direction to ascending
if sort_dirs is None and sort_dir is None: if sort_dirs is None and sort_dir is None:
@ -98,7 +98,7 @@ def sort_query(query, table, sort_keys, sort_dir=None, sort_dirs=None):
if sort_dirs is None: if sort_dirs is None:
sort_dirs = [sort_dir for _sort_key in sort_keys] sort_dirs = [sort_dir for _sort_key in sort_keys]
assert(len(sort_dirs) == len(sort_keys)) assert (len(sort_dirs) == len(sort_keys))
for current_sort_key, current_sort_dir in zip(sort_keys, sort_dirs): for current_sort_key, current_sort_dir in zip(sort_keys, sort_dirs):
try: try:

View File

@ -1,10 +1,6 @@
# Requirements lower bounds listed here are our best effort to keep them up to # Requirements lower bounds listed here are our best effort to keep them up to
# date but we do not test them so no guarantee of having them all correct. If # date but we do not test them so no guarantee of having them all correct. If
# you find any incorrect lower bounds, let us know or propose a fix. # you find any incorrect lower bounds, let us know or propose a fix.
# The order of packages is significant, because pip processes them in the order
# of appearance. Changing the order has an impact on the overall integration
# process, which may cause wedges in the gate later.
alembic>=1.8.0 # MIT alembic>=1.8.0 # MIT
eventlet>=0.26.1 # MIT eventlet>=0.26.1 # MIT
Flask!=0.11,>=0.10 # BSD Flask!=0.11,>=0.10 # BSD

View File

@ -1,9 +1,5 @@
# The order of packages is significant, because pip processes them in the order
# of appearance. Changing the order has an impact on the overall integration
# process, which may cause wedges in the gate later.
# Hacking already pins down pep8, pyflakes and flake8 # Hacking already pins down pep8, pyflakes and flake8
hacking>=4.1.0,<4.2.0 # Apache-2.0 hacking>=6.1.0,<6.2.0 # Apache-2.0
coverage!=4.4,>=4.0 # Apache-2.0 coverage!=4.4,>=4.0 # Apache-2.0
fixtures>=3.0.0 # Apache-2.0/BSD fixtures>=3.0.0 # Apache-2.0/BSD
stestr>=2.0.0 # Apache-2.0 stestr>=2.0.0 # Apache-2.0

View File

@ -1,90 +0,0 @@
# Copyright 2015 Hewlett-Packard Development Company, L.P.
#
# 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.
import re
import sys
import linecache
from prettytable import PrettyTable
PEP8_LINE = r'^((?P<file>.*):(?P<line>\d*):(?P<col>\d*):) ' \
r'(?P<error>(?P<error_code>\w\d{1,3})(?P<error_desc>.*$))'
HTML = True
def main():
raw_errors = []
max_filename_len = 0
for line in sys.stdin:
m = re.match(PEP8_LINE, line)
if m:
m = m.groupdict()
raw_errors.append(m)
if len(m['file']) > max_filename_len:
max_filename_len = len(m['file'])
else:
print(line)
if len(raw_errors) > 0:
print('Flake8 Results')
ct = PrettyTable([
"File",
"Line",
"Column",
"Error Code",
"Error Message",
"Code"
])
ct.align["File"] = "l"
ct.align["Error Message"] = "l"
ct.align["Code"] = "l"
for line in raw_errors:
ct.add_row(format_dict(line))
print(ct)
with open('flake8_results.html', 'w') as f:
f.write('<html><head><style type="text/css">table a:link{color:#666;font-weight:700;text-decoration:none}table a:visited{color:#999;font-weight:700;text-decoration:none}table a:active,table a:hover{color:#bd5a35;text-decoration:underline}table{font-family:Arial,Helvetica,sans-serif;color:#666;font-size:12px;text-shadow:1px 1px 0 #fff;background:#eaebec;margin:20px;border:1px solid #ccc;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px #d1d1d1;-webkit-box-shadow:0 1px 2px #d1d1d1;box-shadow:0 1px 2px #d1d1d1}table th{padding:21px 25px 22px;border-top:1px solid #fafafa;border-bottom:1px solid #e0e0e0;background:#ededed;background:-webkit-gradient(linear,left top,left bottom,from(#ededed),to(#ebebeb));background:-moz-linear-gradient(top,#ededed,#ebebeb)}table th:first-child{text-align:left;padding-left:20px}table tr:first-child th:first-child{-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px}table tr:first-child th:last-child{-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px}table tr{text-align:left;padding-left:20px}table td:first-child{text-align:left;padding-left:20px;border-left:0}table td{padding:18px;border-top:1px solid #fff;border-bottom:1px solid #e0e0e0;border-left:1px solid #e0e0e0;background:#fafafa;background:-webkit-gradient(linear,left top,left bottom,from(#fbfbfb),to(#fafafa));background:-moz-linear-gradient(top,#fbfbfb,#fafafa)}table tr.even td{background:#f6f6f6;background:-webkit-gradient(linear,left top,left bottom,from(#f8f8f8),to(#f6f6f6));background:-moz-linear-gradient(top,#f8f8f8,#f6f6f6)}table tr:last-child td{border-bottom:0}table tr:last-child td:first-child{-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px}table tr:last-child td:last-child{-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px}table tr:hover td{background:#f2f2f2;background:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#f0f0f0));background:-moz-linear-gradient(top,#f2f2f2,#f0f0f0)}</style></head><body>%s</body</html>' % ct.get_html_string(attributes = {"cellspacing": 0})) # noqa
def format_dict(raw):
output = []
if raw['file'].startswith('./'):
output.append(raw['file'][2:])
else:
output.append(raw['file'])
output.append(raw['line'])
output.append(raw['col'])
output.append(raw['error_code'])
output.append(raw['error_desc'].lstrip())
code_string = linecache.getline(
output[0],
int(raw['line'])).lstrip().rstrip()
output.append(code_string)
return output
if __name__ == '__main__':
sys.exit(main())

View File

@ -1,6 +0,0 @@
#!/bin/sh
TESTARGS=$1
exec 3>&1
status=$(exec 4>&1 >&3; ( flake8 ; echo $? >&4 ) | python tools/pretty_flake8.py) && exit $status

View File

@ -82,12 +82,14 @@ commands = oslo_debug_helper -t designate/tests {posargs}
[testenv:flake8] [testenv:flake8]
deps = -r{toxinidir}/test-requirements.txt deps = -r{toxinidir}/test-requirements.txt
commands = sh tools/pretty_flake8.sh commands =
flake8
{[testenv:bandit]commands} {[testenv:bandit]commands}
[testenv:pep8] [testenv:pep8]
deps = -r{toxinidir}/test-requirements.txt deps = -r{toxinidir}/test-requirements.txt
commands = sh tools/pretty_flake8.sh commands =
flake8
{[testenv:bandit]commands} {[testenv:bandit]commands}
doc8 {posargs} doc8 {posargs}