Switch to hacking 2.x
This bumps the version of flake8 and pycodestyle to something much newer, which resolves a long-standing warning about nested sets and allows us to use new fangled features like f-strings if we so choose. Change-Id: I0bb9077f1cea2243b7945e87cfa140f9cf89d558 Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
This commit is contained in:
parent
b44b540fc7
commit
e3da87a45d
@ -28,7 +28,7 @@ repos:
|
|||||||
- id: flake8
|
- id: flake8
|
||||||
name: flake8
|
name: flake8
|
||||||
additional_dependencies:
|
additional_dependencies:
|
||||||
- hacking>=1.1.0,<1.2.0
|
- hacking>=2.0,<3.0
|
||||||
language: python
|
language: python
|
||||||
entry: flake8
|
entry: flake8
|
||||||
files: '^.*\.py$'
|
files: '^.*\.py$'
|
||||||
|
@ -26,14 +26,14 @@ eventlet==0.20.0
|
|||||||
extras==1.0.0
|
extras==1.0.0
|
||||||
fasteners==0.14.1
|
fasteners==0.14.1
|
||||||
fixtures==3.0.0
|
fixtures==3.0.0
|
||||||
flake8==2.5.5
|
flake8==3.6.0
|
||||||
future==0.16.0
|
future==0.16.0
|
||||||
futurist==1.8.0
|
futurist==1.8.0
|
||||||
gabbi==1.35.0
|
gabbi==1.35.0
|
||||||
gitdb2==2.0.3
|
gitdb2==2.0.3
|
||||||
GitPython==2.1.8
|
GitPython==2.1.8
|
||||||
greenlet==0.4.10
|
greenlet==0.4.10
|
||||||
hacking==0.12.0
|
hacking==2.0
|
||||||
idna==2.6
|
idna==2.6
|
||||||
iso8601==0.1.11
|
iso8601==0.1.11
|
||||||
Jinja2==2.10
|
Jinja2==2.10
|
||||||
@ -50,7 +50,7 @@ linecache2==1.0.0
|
|||||||
lxml==3.4.1
|
lxml==3.4.1
|
||||||
Mako==1.0.7
|
Mako==1.0.7
|
||||||
MarkupSafe==1.0
|
MarkupSafe==1.0
|
||||||
mccabe==0.2.1
|
mccabe==0.6.0
|
||||||
microversion-parse==0.2.1
|
microversion-parse==0.2.1
|
||||||
mock==3.0.0
|
mock==3.0.0
|
||||||
monotonic==1.4
|
monotonic==1.4
|
||||||
@ -109,8 +109,8 @@ pyasn1==0.4.2
|
|||||||
pyasn1-modules==0.2.1
|
pyasn1-modules==0.2.1
|
||||||
pycadf==2.7.0
|
pycadf==2.7.0
|
||||||
pycparser==2.18
|
pycparser==2.18
|
||||||
pyflakes==0.8.1
|
pyflakes==2.0.0
|
||||||
pycodestyle==2.0.0
|
pycodestyle==2.4.0
|
||||||
pyinotify==0.9.6
|
pyinotify==0.9.6
|
||||||
pyroute2==0.5.4
|
pyroute2==0.5.4
|
||||||
PyJWT==1.7.0
|
PyJWT==1.7.0
|
||||||
|
@ -13,12 +13,6 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
import ast
|
|
||||||
import os
|
|
||||||
import re
|
|
||||||
|
|
||||||
import six
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Guidelines for writing new hacking checks
|
Guidelines for writing new hacking checks
|
||||||
|
|
||||||
@ -33,6 +27,14 @@ Guidelines for writing new hacking checks
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import ast
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
|
||||||
|
from hacking import core
|
||||||
|
import six
|
||||||
|
|
||||||
|
|
||||||
UNDERSCORE_IMPORT_FILES = []
|
UNDERSCORE_IMPORT_FILES = []
|
||||||
|
|
||||||
session_check = re.compile(r"\w*def [a-zA-Z0-9].*[(].*session.*[)]")
|
session_check = re.compile(r"\w*def [a-zA-Z0-9].*[(].*session.*[)]")
|
||||||
@ -173,6 +175,7 @@ class BaseASTChecker(ast.NodeVisitor):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
@core.flake8ext
|
||||||
def import_no_db_in_virt(logical_line, filename):
|
def import_no_db_in_virt(logical_line, filename):
|
||||||
"""Check for db calls from nova/virt
|
"""Check for db calls from nova/virt
|
||||||
|
|
||||||
@ -186,12 +189,14 @@ def import_no_db_in_virt(logical_line, filename):
|
|||||||
yield (0, "N307: nova.db.api import not allowed in nova/virt/*")
|
yield (0, "N307: nova.db.api import not allowed in nova/virt/*")
|
||||||
|
|
||||||
|
|
||||||
|
@core.flake8ext
|
||||||
def no_db_session_in_public_api(logical_line, filename):
|
def no_db_session_in_public_api(logical_line, filename):
|
||||||
if "db/api.py" in filename:
|
if "db/api.py" in filename:
|
||||||
if session_check.match(logical_line):
|
if session_check.match(logical_line):
|
||||||
yield (0, "N309: public db api methods may not accept session")
|
yield (0, "N309: public db api methods may not accept session")
|
||||||
|
|
||||||
|
|
||||||
|
@core.flake8ext
|
||||||
def use_timeutils_utcnow(logical_line, filename):
|
def use_timeutils_utcnow(logical_line, filename):
|
||||||
# tools are OK to use the standard datetime module
|
# tools are OK to use the standard datetime module
|
||||||
if "/tools/" in filename:
|
if "/tools/" in filename:
|
||||||
@ -218,6 +223,7 @@ def _get_virt_name(regex, data):
|
|||||||
return driver
|
return driver
|
||||||
|
|
||||||
|
|
||||||
|
@core.flake8ext
|
||||||
def import_no_virt_driver_import_deps(physical_line, filename):
|
def import_no_virt_driver_import_deps(physical_line, filename):
|
||||||
"""Check virt drivers' modules aren't imported by other drivers
|
"""Check virt drivers' modules aren't imported by other drivers
|
||||||
|
|
||||||
@ -237,6 +243,7 @@ def import_no_virt_driver_import_deps(physical_line, filename):
|
|||||||
return (0, "N311: importing code from other virt drivers forbidden")
|
return (0, "N311: importing code from other virt drivers forbidden")
|
||||||
|
|
||||||
|
|
||||||
|
@core.flake8ext
|
||||||
def import_no_virt_driver_config_deps(physical_line, filename):
|
def import_no_virt_driver_config_deps(physical_line, filename):
|
||||||
"""Check virt drivers' config vars aren't used by other drivers
|
"""Check virt drivers' config vars aren't used by other drivers
|
||||||
|
|
||||||
@ -255,6 +262,7 @@ def import_no_virt_driver_config_deps(physical_line, filename):
|
|||||||
return (0, "N312: using config vars from other virt drivers forbidden")
|
return (0, "N312: using config vars from other virt drivers forbidden")
|
||||||
|
|
||||||
|
|
||||||
|
@core.flake8ext
|
||||||
def capital_cfg_help(logical_line, tokens):
|
def capital_cfg_help(logical_line, tokens):
|
||||||
msg = "N313: capitalize help string"
|
msg = "N313: capitalize help string"
|
||||||
|
|
||||||
@ -266,6 +274,7 @@ def capital_cfg_help(logical_line, tokens):
|
|||||||
yield (0, msg)
|
yield (0, msg)
|
||||||
|
|
||||||
|
|
||||||
|
@core.flake8ext
|
||||||
def assert_true_instance(logical_line):
|
def assert_true_instance(logical_line):
|
||||||
"""Check for assertTrue(isinstance(a, b)) sentences
|
"""Check for assertTrue(isinstance(a, b)) sentences
|
||||||
|
|
||||||
@ -275,6 +284,7 @@ def assert_true_instance(logical_line):
|
|||||||
yield (0, "N316: assertTrue(isinstance(a, b)) sentences not allowed")
|
yield (0, "N316: assertTrue(isinstance(a, b)) sentences not allowed")
|
||||||
|
|
||||||
|
|
||||||
|
@core.flake8ext
|
||||||
def assert_equal_type(logical_line):
|
def assert_equal_type(logical_line):
|
||||||
"""Check for assertEqual(type(A), B) sentences
|
"""Check for assertEqual(type(A), B) sentences
|
||||||
|
|
||||||
@ -284,12 +294,14 @@ def assert_equal_type(logical_line):
|
|||||||
yield (0, "N317: assertEqual(type(A), B) sentences not allowed")
|
yield (0, "N317: assertEqual(type(A), B) sentences not allowed")
|
||||||
|
|
||||||
|
|
||||||
|
@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, "N327: Do not use xrange(). 'xrange()' is not compatible "
|
yield (0, "N327: Do not use xrange(). 'xrange()' is not compatible "
|
||||||
"with Python 3. Use range() or six.moves.range() instead.")
|
"with Python 3. Use range() or six.moves.range() instead.")
|
||||||
|
|
||||||
|
|
||||||
|
@core.flake8ext
|
||||||
def no_translate_debug_logs(logical_line, filename):
|
def no_translate_debug_logs(logical_line, filename):
|
||||||
"""Check for 'LOG.debug(_('
|
"""Check for 'LOG.debug(_('
|
||||||
|
|
||||||
@ -307,6 +319,7 @@ def no_translate_debug_logs(logical_line, filename):
|
|||||||
yield (0, "N319 Don't translate debug level logs")
|
yield (0, "N319 Don't translate debug level logs")
|
||||||
|
|
||||||
|
|
||||||
|
@core.flake8ext
|
||||||
def no_import_translation_in_tests(logical_line, filename):
|
def no_import_translation_in_tests(logical_line, filename):
|
||||||
"""Check for 'from nova.i18n import _'
|
"""Check for 'from nova.i18n import _'
|
||||||
N337
|
N337
|
||||||
@ -317,6 +330,7 @@ def no_import_translation_in_tests(logical_line, filename):
|
|||||||
yield (0, "N337 Don't import translation in tests")
|
yield (0, "N337 Don't import translation in tests")
|
||||||
|
|
||||||
|
|
||||||
|
@core.flake8ext
|
||||||
def no_setting_conf_directly_in_tests(logical_line, filename):
|
def no_setting_conf_directly_in_tests(logical_line, filename):
|
||||||
"""Check for setting CONF.* attributes directly in tests
|
"""Check for setting CONF.* attributes directly in tests
|
||||||
|
|
||||||
@ -333,12 +347,14 @@ def no_setting_conf_directly_in_tests(logical_line, filename):
|
|||||||
"forbidden. Use self.flags(option=value) instead")
|
"forbidden. Use self.flags(option=value) instead")
|
||||||
|
|
||||||
|
|
||||||
|
@core.flake8ext
|
||||||
def no_mutable_default_args(logical_line):
|
def no_mutable_default_args(logical_line):
|
||||||
msg = "N322: Method's default argument shouldn't be mutable!"
|
msg = "N322: Method's default argument shouldn't be mutable!"
|
||||||
if mutable_default_args.match(logical_line):
|
if mutable_default_args.match(logical_line):
|
||||||
yield (0, msg)
|
yield (0, msg)
|
||||||
|
|
||||||
|
|
||||||
|
@core.flake8ext
|
||||||
def check_explicit_underscore_import(logical_line, filename):
|
def check_explicit_underscore_import(logical_line, filename):
|
||||||
"""Check for explicit import of the _ function
|
"""Check for explicit import of the _ function
|
||||||
|
|
||||||
@ -360,6 +376,7 @@ def check_explicit_underscore_import(logical_line, filename):
|
|||||||
yield (0, "N323: Found use of _() without explicit import of _ !")
|
yield (0, "N323: Found use of _() without explicit import of _ !")
|
||||||
|
|
||||||
|
|
||||||
|
@core.flake8ext
|
||||||
def use_jsonutils(logical_line, filename):
|
def use_jsonutils(logical_line, filename):
|
||||||
# the code below that path is not meant to be executed from neutron
|
# the code below that path is not meant to be executed from neutron
|
||||||
# tree where jsonutils module is present, so don't enforce its usage
|
# tree where jsonutils module is present, so don't enforce its usage
|
||||||
@ -381,6 +398,7 @@ def use_jsonutils(logical_line, filename):
|
|||||||
yield (pos, msg % {'fun': f[:-1]})
|
yield (pos, msg % {'fun': f[:-1]})
|
||||||
|
|
||||||
|
|
||||||
|
@core.flake8ext
|
||||||
def check_api_version_decorator(logical_line, previous_logical, blank_before,
|
def check_api_version_decorator(logical_line, previous_logical, blank_before,
|
||||||
filename):
|
filename):
|
||||||
msg = ("N332: the api_version decorator must be the first decorator"
|
msg = ("N332: the api_version decorator must be the first decorator"
|
||||||
@ -400,6 +418,9 @@ class CheckForStrUnicodeExc(BaseASTChecker):
|
|||||||
catch it.
|
catch it.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
name = 'check_for_string_unicode_exc'
|
||||||
|
version = '1.0'
|
||||||
|
|
||||||
CHECK_DESC = ('N325 str() and unicode() cannot be used on an '
|
CHECK_DESC = ('N325 str() and unicode() cannot be used on an '
|
||||||
'exception. Remove or use six.text_type()')
|
'exception. Remove or use six.text_type()')
|
||||||
|
|
||||||
@ -447,6 +468,9 @@ class CheckForTransAdd(BaseASTChecker):
|
|||||||
string to give the translators the most information.
|
string to give the translators the most information.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
name = 'check_for_trans_add'
|
||||||
|
version = '0.1'
|
||||||
|
|
||||||
CHECK_DESC = ('N326 Translated messages cannot be concatenated. '
|
CHECK_DESC = ('N326 Translated messages cannot be concatenated. '
|
||||||
'String should be included in translated message.')
|
'String should be included in translated message.')
|
||||||
|
|
||||||
@ -504,6 +528,9 @@ class CheckForUncalledTestClosure(BaseASTChecker):
|
|||||||
N349
|
N349
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
name = 'check_for_uncalled_test_closure'
|
||||||
|
version = '0.1'
|
||||||
|
|
||||||
def __init__(self, tree, filename):
|
def __init__(self, tree, filename):
|
||||||
super(CheckForUncalledTestClosure, self).__init__(tree, filename)
|
super(CheckForUncalledTestClosure, self).__init__(tree, filename)
|
||||||
self._filename = filename
|
self._filename = filename
|
||||||
@ -532,6 +559,7 @@ class CheckForUncalledTestClosure(BaseASTChecker):
|
|||||||
% ','.join(missed))
|
% ','.join(missed))
|
||||||
|
|
||||||
|
|
||||||
|
@core.flake8ext
|
||||||
def assert_true_or_false_with_in(logical_line):
|
def assert_true_or_false_with_in(logical_line):
|
||||||
"""Check for assertTrue/False(A in B), assertTrue/False(A not in B),
|
"""Check for assertTrue/False(A in B), assertTrue/False(A not in B),
|
||||||
assertTrue/False(A in B, message) or assertTrue/False(A not in B, message)
|
assertTrue/False(A in B, message) or assertTrue/False(A not in B, message)
|
||||||
@ -547,6 +575,7 @@ def assert_true_or_false_with_in(logical_line):
|
|||||||
"contents.")
|
"contents.")
|
||||||
|
|
||||||
|
|
||||||
|
@core.flake8ext
|
||||||
def assert_raises_regexp(logical_line):
|
def assert_raises_regexp(logical_line):
|
||||||
"""Check for usage of deprecated assertRaisesRegexp
|
"""Check for usage of deprecated assertRaisesRegexp
|
||||||
|
|
||||||
@ -558,6 +587,7 @@ def assert_raises_regexp(logical_line):
|
|||||||
"of assertRaisesRegexp")
|
"of assertRaisesRegexp")
|
||||||
|
|
||||||
|
|
||||||
|
@core.flake8ext
|
||||||
def dict_constructor_with_list_copy(logical_line):
|
def dict_constructor_with_list_copy(logical_line):
|
||||||
msg = ("N336: Must use a dict comprehension instead of a dict constructor"
|
msg = ("N336: Must use a dict comprehension instead of a dict constructor"
|
||||||
" with a sequence of key-value pairs."
|
" with a sequence of key-value pairs."
|
||||||
@ -566,6 +596,7 @@ def dict_constructor_with_list_copy(logical_line):
|
|||||||
yield (0, msg)
|
yield (0, msg)
|
||||||
|
|
||||||
|
|
||||||
|
@core.flake8ext
|
||||||
def assert_equal_in(logical_line):
|
def assert_equal_in(logical_line):
|
||||||
"""Check for assertEqual(A in B, True), assertEqual(True, A in B),
|
"""Check for assertEqual(A in B, True), assertEqual(True, A in B),
|
||||||
assertEqual(A in B, False) or assertEqual(False, A in B) sentences
|
assertEqual(A in B, False) or assertEqual(False, A in B) sentences
|
||||||
@ -580,7 +611,8 @@ def assert_equal_in(logical_line):
|
|||||||
"contents.")
|
"contents.")
|
||||||
|
|
||||||
|
|
||||||
def check_http_not_implemented(logical_line, physical_line, filename, noqa):
|
@core.flake8ext
|
||||||
|
def check_http_not_implemented(logical_line, filename, noqa):
|
||||||
msg = ("N339: HTTPNotImplemented response must be implemented with"
|
msg = ("N339: HTTPNotImplemented response must be implemented with"
|
||||||
" common raise_feature_not_supported().")
|
" common raise_feature_not_supported().")
|
||||||
if noqa:
|
if noqa:
|
||||||
@ -591,7 +623,8 @@ def check_http_not_implemented(logical_line, physical_line, filename, noqa):
|
|||||||
yield (0, msg)
|
yield (0, msg)
|
||||||
|
|
||||||
|
|
||||||
def check_greenthread_spawns(logical_line, physical_line, filename):
|
@core.flake8ext
|
||||||
|
def check_greenthread_spawns(logical_line, filename):
|
||||||
"""Check for use of greenthread.spawn(), greenthread.spawn_n(),
|
"""Check for use of greenthread.spawn(), greenthread.spawn_n(),
|
||||||
eventlet.spawn(), and eventlet.spawn_n()
|
eventlet.spawn(), and eventlet.spawn_n()
|
||||||
|
|
||||||
@ -608,6 +641,7 @@ def check_greenthread_spawns(logical_line, physical_line, filename):
|
|||||||
yield (0, msg % {'spawn': match.group('spawn_part')})
|
yield (0, msg % {'spawn': match.group('spawn_part')})
|
||||||
|
|
||||||
|
|
||||||
|
@core.flake8ext
|
||||||
def check_no_contextlib_nested(logical_line, filename):
|
def check_no_contextlib_nested(logical_line, filename):
|
||||||
msg = ("N341: contextlib.nested is deprecated. With Python 2.7 and later "
|
msg = ("N341: contextlib.nested is deprecated. With Python 2.7 and later "
|
||||||
"the with-statement supports multiple nested objects. See https://"
|
"the with-statement supports multiple nested objects. See https://"
|
||||||
@ -618,6 +652,7 @@ def check_no_contextlib_nested(logical_line, filename):
|
|||||||
yield (0, msg)
|
yield (0, msg)
|
||||||
|
|
||||||
|
|
||||||
|
@core.flake8ext
|
||||||
def check_config_option_in_central_place(logical_line, filename):
|
def check_config_option_in_central_place(logical_line, filename):
|
||||||
msg = ("N342: Config options should be in the central location "
|
msg = ("N342: Config options should be in the central location "
|
||||||
"'/nova/conf/*'. Do not declare new config options outside "
|
"'/nova/conf/*'. Do not declare new config options outside "
|
||||||
@ -647,6 +682,7 @@ def check_config_option_in_central_place(logical_line, filename):
|
|||||||
yield (0, msg)
|
yield (0, msg)
|
||||||
|
|
||||||
|
|
||||||
|
@core.flake8ext
|
||||||
def check_policy_registration_in_central_place(logical_line, filename):
|
def check_policy_registration_in_central_place(logical_line, filename):
|
||||||
msg = ('N350: Policy registration should be in the central location(s) '
|
msg = ('N350: Policy registration should be in the central location(s) '
|
||||||
'"/nova/policies/*"')
|
'"/nova/policies/*"')
|
||||||
@ -661,6 +697,7 @@ def check_policy_registration_in_central_place(logical_line, filename):
|
|||||||
yield (0, msg)
|
yield (0, msg)
|
||||||
|
|
||||||
|
|
||||||
|
@core.flake8ext
|
||||||
def check_policy_enforce(logical_line, filename):
|
def check_policy_enforce(logical_line, filename):
|
||||||
"""Look for uses of nova.policy._ENFORCER.enforce()
|
"""Look for uses of nova.policy._ENFORCER.enforce()
|
||||||
|
|
||||||
@ -679,6 +716,7 @@ def check_policy_enforce(logical_line, filename):
|
|||||||
yield (0, msg)
|
yield (0, msg)
|
||||||
|
|
||||||
|
|
||||||
|
@core.flake8ext
|
||||||
def check_doubled_words(physical_line, filename):
|
def check_doubled_words(physical_line, filename):
|
||||||
"""Check for the common doubled-word typos
|
"""Check for the common doubled-word typos
|
||||||
|
|
||||||
@ -692,6 +730,7 @@ def check_doubled_words(physical_line, filename):
|
|||||||
return (0, msg % {'word': match.group(1)})
|
return (0, msg % {'word': match.group(1)})
|
||||||
|
|
||||||
|
|
||||||
|
@core.flake8ext
|
||||||
def check_python3_no_iteritems(logical_line):
|
def check_python3_no_iteritems(logical_line):
|
||||||
msg = ("N344: Use items() instead of dict.iteritems().")
|
msg = ("N344: Use items() instead of dict.iteritems().")
|
||||||
|
|
||||||
@ -699,6 +738,7 @@ def check_python3_no_iteritems(logical_line):
|
|||||||
yield (0, msg)
|
yield (0, msg)
|
||||||
|
|
||||||
|
|
||||||
|
@core.flake8ext
|
||||||
def check_python3_no_iterkeys(logical_line):
|
def check_python3_no_iterkeys(logical_line):
|
||||||
msg = ("N345: Use six.iterkeys() instead of dict.iterkeys().")
|
msg = ("N345: Use six.iterkeys() instead of dict.iterkeys().")
|
||||||
|
|
||||||
@ -706,6 +746,7 @@ def check_python3_no_iterkeys(logical_line):
|
|||||||
yield (0, msg)
|
yield (0, msg)
|
||||||
|
|
||||||
|
|
||||||
|
@core.flake8ext
|
||||||
def check_python3_no_itervalues(logical_line):
|
def check_python3_no_itervalues(logical_line):
|
||||||
msg = ("N346: Use six.itervalues() instead of dict.itervalues().")
|
msg = ("N346: Use six.itervalues() instead of dict.itervalues().")
|
||||||
|
|
||||||
@ -713,6 +754,7 @@ def check_python3_no_itervalues(logical_line):
|
|||||||
yield (0, msg)
|
yield (0, msg)
|
||||||
|
|
||||||
|
|
||||||
|
@core.flake8ext
|
||||||
def no_os_popen(logical_line):
|
def no_os_popen(logical_line):
|
||||||
"""Disallow 'os.popen('
|
"""Disallow 'os.popen('
|
||||||
|
|
||||||
@ -727,6 +769,7 @@ def no_os_popen(logical_line):
|
|||||||
'Replace it using subprocess module. ')
|
'Replace it using subprocess module. ')
|
||||||
|
|
||||||
|
|
||||||
|
@core.flake8ext
|
||||||
def no_log_warn(logical_line):
|
def no_log_warn(logical_line):
|
||||||
"""Disallow 'LOG.warn('
|
"""Disallow 'LOG.warn('
|
||||||
|
|
||||||
@ -741,7 +784,8 @@ def no_log_warn(logical_line):
|
|||||||
yield (0, msg)
|
yield (0, msg)
|
||||||
|
|
||||||
|
|
||||||
def check_context_log(logical_line, physical_line, filename, noqa):
|
@core.flake8ext
|
||||||
|
def check_context_log(logical_line, filename, noqa):
|
||||||
"""check whether context is being passed to the logs
|
"""check whether context is being passed to the logs
|
||||||
|
|
||||||
Not correct: LOG.info(_LI("Rebooting instance"), context=context)
|
Not correct: LOG.info(_LI("Rebooting instance"), context=context)
|
||||||
@ -764,6 +808,7 @@ def check_context_log(logical_line, physical_line, filename, noqa):
|
|||||||
"kwarg.")
|
"kwarg.")
|
||||||
|
|
||||||
|
|
||||||
|
@core.flake8ext
|
||||||
def no_assert_equal_true_false(logical_line):
|
def no_assert_equal_true_false(logical_line):
|
||||||
"""Enforce use of assertTrue/assertFalse.
|
"""Enforce use of assertTrue/assertFalse.
|
||||||
|
|
||||||
@ -782,6 +827,7 @@ def no_assert_equal_true_false(logical_line):
|
|||||||
"Use assertTrue(A) or assertFalse(A) instead")
|
"Use assertTrue(A) or assertFalse(A) instead")
|
||||||
|
|
||||||
|
|
||||||
|
@core.flake8ext
|
||||||
def no_assert_true_false_is_not(logical_line):
|
def no_assert_true_false_is_not(logical_line):
|
||||||
"""Enforce use of assertIs/assertIsNot.
|
"""Enforce use of assertIs/assertIsNot.
|
||||||
|
|
||||||
@ -797,6 +843,7 @@ def no_assert_true_false_is_not(logical_line):
|
|||||||
"Use assertIs(A, B) or assertIsNot(A, B) instead")
|
"Use assertIs(A, B) or assertIsNot(A, B) instead")
|
||||||
|
|
||||||
|
|
||||||
|
@core.flake8ext
|
||||||
def check_uuid4(logical_line):
|
def check_uuid4(logical_line):
|
||||||
"""Generating UUID
|
"""Generating UUID
|
||||||
|
|
||||||
@ -813,6 +860,7 @@ def check_uuid4(logical_line):
|
|||||||
yield (0, msg)
|
yield (0, msg)
|
||||||
|
|
||||||
|
|
||||||
|
@core.flake8ext
|
||||||
def return_followed_by_space(logical_line):
|
def return_followed_by_space(logical_line):
|
||||||
"""Return should be followed by a space.
|
"""Return should be followed by a space.
|
||||||
|
|
||||||
@ -830,6 +878,7 @@ def return_followed_by_space(logical_line):
|
|||||||
"N358: Return keyword should be followed by a space.")
|
"N358: Return keyword should be followed by a space.")
|
||||||
|
|
||||||
|
|
||||||
|
@core.flake8ext
|
||||||
def no_redundant_import_alias(logical_line):
|
def no_redundant_import_alias(logical_line):
|
||||||
"""Check for redundant import aliases.
|
"""Check for redundant import aliases.
|
||||||
|
|
||||||
@ -845,6 +894,7 @@ def no_redundant_import_alias(logical_line):
|
|||||||
yield (0, "N359: Import alias should not be redundant.")
|
yield (0, "N359: Import alias should not be redundant.")
|
||||||
|
|
||||||
|
|
||||||
|
@core.flake8ext
|
||||||
def yield_followed_by_space(logical_line):
|
def yield_followed_by_space(logical_line):
|
||||||
"""Yield should be followed by a space.
|
"""Yield should be followed by a space.
|
||||||
|
|
||||||
@ -862,6 +912,7 @@ def yield_followed_by_space(logical_line):
|
|||||||
"N360: Yield keyword should be followed by a space.")
|
"N360: Yield keyword should be followed by a space.")
|
||||||
|
|
||||||
|
|
||||||
|
@core.flake8ext
|
||||||
def assert_regexpmatches(logical_line):
|
def assert_regexpmatches(logical_line):
|
||||||
"""Check for usage of deprecated assertRegexpMatches/assertNotRegexpMatches
|
"""Check for usage of deprecated assertRegexpMatches/assertNotRegexpMatches
|
||||||
|
|
||||||
@ -873,6 +924,7 @@ def assert_regexpmatches(logical_line):
|
|||||||
"of assertRegexpMatches/assertNotRegexpMatches.")
|
"of assertRegexpMatches/assertNotRegexpMatches.")
|
||||||
|
|
||||||
|
|
||||||
|
@core.flake8ext
|
||||||
def privsep_imports_not_aliased(logical_line, filename):
|
def privsep_imports_not_aliased(logical_line, filename):
|
||||||
"""Do not abbreviate or alias privsep module imports.
|
"""Do not abbreviate or alias privsep module imports.
|
||||||
|
|
||||||
@ -901,6 +953,7 @@ def privsep_imports_not_aliased(logical_line, filename):
|
|||||||
"'from nova.privsep import path'.")
|
"'from nova.privsep import path'.")
|
||||||
|
|
||||||
|
|
||||||
|
@core.flake8ext
|
||||||
def did_you_mean_tuple(logical_line):
|
def did_you_mean_tuple(logical_line):
|
||||||
"""Disallow ``(not_a_tuple)`` because you meant ``(a_tuple_of_one,)``.
|
"""Disallow ``(not_a_tuple)`` because you meant ``(a_tuple_of_one,)``.
|
||||||
|
|
||||||
@ -911,6 +964,7 @@ def did_you_mean_tuple(logical_line):
|
|||||||
"certainly meant ``in (a_tuple_of_one,)``.")
|
"certainly meant ``in (a_tuple_of_one,)``.")
|
||||||
|
|
||||||
|
|
||||||
|
@core.flake8ext
|
||||||
def nonexistent_assertion_methods_and_attributes(logical_line, filename):
|
def nonexistent_assertion_methods_and_attributes(logical_line, filename):
|
||||||
"""Check non-existent mock assertion methods and attributes.
|
"""Check non-existent mock assertion methods and attributes.
|
||||||
|
|
||||||
@ -944,6 +998,7 @@ def nonexistent_assertion_methods_and_attributes(logical_line, filename):
|
|||||||
yield (0, msg % match.group(1))
|
yield (0, msg % match.group(1))
|
||||||
|
|
||||||
|
|
||||||
|
@core.flake8ext
|
||||||
def useless_assertion(logical_line, filename):
|
def useless_assertion(logical_line, filename):
|
||||||
"""Check useless assertions in tests.
|
"""Check useless assertions in tests.
|
||||||
|
|
||||||
@ -964,53 +1019,3 @@ def useless_assertion(logical_line, filename):
|
|||||||
match = useless_assertion_re.search(logical_line)
|
match = useless_assertion_re.search(logical_line)
|
||||||
if match:
|
if match:
|
||||||
yield (0, msg % (match.group(2) or match.group(3)))
|
yield (0, msg % (match.group(2) or match.group(3)))
|
||||||
|
|
||||||
|
|
||||||
def factory(register):
|
|
||||||
register(import_no_db_in_virt)
|
|
||||||
register(no_db_session_in_public_api)
|
|
||||||
register(use_timeutils_utcnow)
|
|
||||||
register(import_no_virt_driver_import_deps)
|
|
||||||
register(import_no_virt_driver_config_deps)
|
|
||||||
register(capital_cfg_help)
|
|
||||||
register(no_import_translation_in_tests)
|
|
||||||
register(assert_true_instance)
|
|
||||||
register(assert_equal_type)
|
|
||||||
register(assert_raises_regexp)
|
|
||||||
register(no_translate_debug_logs)
|
|
||||||
register(no_setting_conf_directly_in_tests)
|
|
||||||
register(no_mutable_default_args)
|
|
||||||
register(check_explicit_underscore_import)
|
|
||||||
register(use_jsonutils)
|
|
||||||
register(check_api_version_decorator)
|
|
||||||
register(CheckForStrUnicodeExc)
|
|
||||||
register(CheckForTransAdd)
|
|
||||||
register(assert_true_or_false_with_in)
|
|
||||||
register(dict_constructor_with_list_copy)
|
|
||||||
register(assert_equal_in)
|
|
||||||
register(check_http_not_implemented)
|
|
||||||
register(check_no_contextlib_nested)
|
|
||||||
register(check_greenthread_spawns)
|
|
||||||
register(check_config_option_in_central_place)
|
|
||||||
register(check_policy_registration_in_central_place)
|
|
||||||
register(check_policy_enforce)
|
|
||||||
register(check_doubled_words)
|
|
||||||
register(check_python3_no_iteritems)
|
|
||||||
register(check_python3_no_iterkeys)
|
|
||||||
register(check_python3_no_itervalues)
|
|
||||||
register(check_python3_xrange)
|
|
||||||
register(no_os_popen)
|
|
||||||
register(no_log_warn)
|
|
||||||
register(CheckForUncalledTestClosure)
|
|
||||||
register(check_context_log)
|
|
||||||
register(no_assert_equal_true_false)
|
|
||||||
register(no_assert_true_false_is_not)
|
|
||||||
register(check_uuid4)
|
|
||||||
register(return_followed_by_space)
|
|
||||||
register(no_redundant_import_alias)
|
|
||||||
register(yield_followed_by_space)
|
|
||||||
register(assert_regexpmatches)
|
|
||||||
register(privsep_imports_not_aliased)
|
|
||||||
register(did_you_mean_tuple)
|
|
||||||
register(nonexistent_assertion_methods_and_attributes)
|
|
||||||
register(useless_assertion)
|
|
||||||
|
@ -17,6 +17,7 @@ import fractions
|
|||||||
import itertools
|
import itertools
|
||||||
import math
|
import math
|
||||||
import re
|
import re
|
||||||
|
from typing import List, Optional, Set, Tuple
|
||||||
|
|
||||||
import os_resource_classes as orc
|
import os_resource_classes as orc
|
||||||
import os_traits
|
import os_traits
|
||||||
|
@ -2,14 +2,13 @@
|
|||||||
# of appearance. Changing the order has an impact on the overall integration
|
# of appearance. Changing the order has an impact on the overall integration
|
||||||
# process, which may cause wedges in the gate later.
|
# process, which may cause wedges in the gate later.
|
||||||
|
|
||||||
hacking>=1.1.0,<1.2.0 # Apache-2.0
|
hacking>=2.0<3.0
|
||||||
coverage!=4.4,>=4.0 # Apache-2.0
|
coverage!=4.4,>=4.0 # Apache-2.0
|
||||||
ddt>=1.0.1 # MIT
|
ddt>=1.0.1 # MIT
|
||||||
fixtures>=3.0.0 # Apache-2.0/BSD
|
fixtures>=3.0.0 # Apache-2.0/BSD
|
||||||
mock>=3.0.0 # BSD
|
mock>=3.0.0 # BSD
|
||||||
psycopg2>=2.7 # LGPL/ZPL
|
psycopg2>=2.7 # LGPL/ZPL
|
||||||
PyMySQL>=0.7.6 # MIT License
|
PyMySQL>=0.7.6 # MIT License
|
||||||
pycodestyle>=2.0.0 # MIT License
|
|
||||||
python-barbicanclient>=4.5.2 # Apache-2.0
|
python-barbicanclient>=4.5.2 # Apache-2.0
|
||||||
python-ironicclient!=2.7.1,>=2.7.0 # Apache-2.0
|
python-ironicclient!=2.7.1,>=2.7.0 # Apache-2.0
|
||||||
requests-mock>=1.2.0 # Apache-2.0
|
requests-mock>=1.2.0 # Apache-2.0
|
||||||
|
55
tox.ini
55
tox.ini
@ -247,8 +247,59 @@ exclude = .venv,.git,.tox,dist,*lib/python*,*egg,build,tools/xenserver*,release
|
|||||||
max-complexity=40
|
max-complexity=40
|
||||||
|
|
||||||
[hacking]
|
[hacking]
|
||||||
local-check-factory = nova.hacking.checks.factory
|
import_exceptions = typing,nova.i18n
|
||||||
import_exceptions = nova.i18n
|
|
||||||
|
[flake8:local-plugins]
|
||||||
|
extension =
|
||||||
|
N307 = checks:import_no_db_in_virt
|
||||||
|
N309 = checks:no_db_session_in_public_api
|
||||||
|
N310 = checks:use_timeutils_utcnow
|
||||||
|
N311 = checks:import_no_virt_driver_import_deps
|
||||||
|
N312 = checks:import_no_virt_driver_config_deps
|
||||||
|
N313 = checks:capital_cfg_help
|
||||||
|
N316 = checks:assert_true_instance
|
||||||
|
N317 = checks:assert_equal_type
|
||||||
|
N335 = checks:assert_raises_regexp
|
||||||
|
N319 = checks:no_translate_debug_logs
|
||||||
|
N337 = checks:no_import_translation_in_tests
|
||||||
|
N320 = checks:no_setting_conf_directly_in_tests
|
||||||
|
N322 = checks:no_mutable_default_args
|
||||||
|
N323 = checks:check_explicit_underscore_import
|
||||||
|
N324 = checks:use_jsonutils
|
||||||
|
N332 = checks:check_api_version_decorator
|
||||||
|
N325 = checks:CheckForStrUnicodeExc
|
||||||
|
N326 = checks:CheckForTransAdd
|
||||||
|
N334 = checks:assert_true_or_false_with_in
|
||||||
|
N336 = checks:dict_constructor_with_list_copy
|
||||||
|
N338 = checks:assert_equal_in
|
||||||
|
N339 = checks:check_http_not_implemented
|
||||||
|
N340 = checks:check_greenthread_spawns
|
||||||
|
N341 = checks:check_no_contextlib_nested
|
||||||
|
N342 = checks:check_config_option_in_central_place
|
||||||
|
N350 = checks:check_policy_registration_in_central_place
|
||||||
|
N351 = checks:check_policy_enforce
|
||||||
|
N343 = checks:check_doubled_words
|
||||||
|
N344 = checks:check_python3_no_iteritems
|
||||||
|
N345 = checks:check_python3_no_iterkeys
|
||||||
|
N346 = checks:check_python3_no_itervalues
|
||||||
|
N327 = checks:check_python3_xrange
|
||||||
|
N348 = checks:no_os_popen
|
||||||
|
N352 = checks:no_log_warn
|
||||||
|
N349 = checks:CheckForUncalledTestClosure
|
||||||
|
N353 = checks:check_context_log
|
||||||
|
N355 = checks:no_assert_equal_true_false
|
||||||
|
N356 = checks:no_assert_true_false_is_not
|
||||||
|
N357 = checks:check_uuid4
|
||||||
|
N358 = checks:return_followed_by_space
|
||||||
|
N359 = checks:no_redundant_import_alias
|
||||||
|
N360 = checks:yield_followed_by_space
|
||||||
|
N361 = checks:assert_regexpmatches
|
||||||
|
N362 = checks:privsep_imports_not_aliased
|
||||||
|
N363 = checks:did_you_mean_tuple
|
||||||
|
N364 = checks:nonexistent_assertion_methods_and_attributes
|
||||||
|
N365 = checks:useless_assertion
|
||||||
|
paths =
|
||||||
|
./nova/hacking
|
||||||
|
|
||||||
[testenv:bindep]
|
[testenv:bindep]
|
||||||
# Do not install any requirements. We want this to be fast and work even if
|
# Do not install any requirements. We want this to be fast and work even if
|
||||||
|
Loading…
x
Reference in New Issue
Block a user