Remove hacking check [N347] for config options.
The check for help texts (N347) can be better done by humans. This change removes it. Change-Id: I0861c94f764d559be8f188d3e4b54b2b8ad39ea5
This commit is contained in:
parent
04bc62e4a0
commit
0b0e7dacf5
@ -57,7 +57,6 @@ Nova Specific Commandments
|
|||||||
- [N344] Python 3: do not use dict.iteritems.
|
- [N344] Python 3: do not use dict.iteritems.
|
||||||
- [N345] Python 3: do not use dict.iterkeys.
|
- [N345] Python 3: do not use dict.iterkeys.
|
||||||
- [N346] Python 3: do not use dict.itervalues.
|
- [N346] Python 3: do not use dict.itervalues.
|
||||||
- [N347] Provide enough help text for config options
|
|
||||||
- [N348] Deprecated library function os.popen()
|
- [N348] Deprecated library function os.popen()
|
||||||
- [N349] Check for closures in tests which are not used
|
- [N349] Check for closures in tests which are not used
|
||||||
- [N350] Policy registration should be in the central location ``nova/policies/``
|
- [N350] Policy registration should be in the central location ``nova/policies/``
|
||||||
|
@ -108,8 +108,6 @@ contextlib_nested = re.compile(r"^with (contextlib\.)?nested\(")
|
|||||||
doubled_words_re = re.compile(
|
doubled_words_re = re.compile(
|
||||||
r"\b(then?|[iao]n|i[fst]|but|f?or|at|and|[dt]o)\s+\1\b")
|
r"\b(then?|[iao]n|i[fst]|but|f?or|at|and|[dt]o)\s+\1\b")
|
||||||
|
|
||||||
opt_help_text_min_char_count = 10
|
|
||||||
|
|
||||||
|
|
||||||
class BaseASTChecker(ast.NodeVisitor):
|
class BaseASTChecker(ast.NodeVisitor):
|
||||||
"""Provides a simple framework for writing AST-based checks.
|
"""Provides a simple framework for writing AST-based checks.
|
||||||
@ -732,75 +730,6 @@ def check_python3_no_itervalues(logical_line):
|
|||||||
yield(0, msg)
|
yield(0, msg)
|
||||||
|
|
||||||
|
|
||||||
def cfg_help_with_enough_text(logical_line, tokens):
|
|
||||||
# TODO(markus_z): The count of 10 chars is the *highest* number I could
|
|
||||||
# use to introduce this new check without breaking the gate. IOW, if I
|
|
||||||
# use a value of 15 for example, the gate checks will fail because we have
|
|
||||||
# a few config options which use fewer chars than 15 to explain their
|
|
||||||
# usage (for example the options "ca_file" and "cert").
|
|
||||||
# As soon as the implementation of bp centralize-config-options is
|
|
||||||
# finished, I wanted to increase that magic number to a higher (to be
|
|
||||||
# defined) value.
|
|
||||||
# This check is an attempt to programmatically check a part of the review
|
|
||||||
# guidelines http://docs.openstack.org/developer/nova/code-review.html
|
|
||||||
|
|
||||||
msg = ("N347: A config option is a public interface to the cloud admins "
|
|
||||||
"and should be properly documented. A part of that is to provide "
|
|
||||||
"enough help text to describe this option. Use at least %s chars "
|
|
||||||
"for that description. Is is likely that this minimum will be "
|
|
||||||
"increased in the future." % opt_help_text_min_char_count)
|
|
||||||
|
|
||||||
if not cfg_opt_re.match(logical_line):
|
|
||||||
return
|
|
||||||
|
|
||||||
# ignore DeprecatedOpt objects. They get mentioned in the release notes
|
|
||||||
# and don't need a lengthy help text anymore
|
|
||||||
if "DeprecatedOpt" in logical_line:
|
|
||||||
return
|
|
||||||
|
|
||||||
def get_token_value(idx):
|
|
||||||
return tokens[idx][1]
|
|
||||||
|
|
||||||
def get_token_values(start_index, length):
|
|
||||||
values = ""
|
|
||||||
for offset in range(length):
|
|
||||||
values += get_token_value(start_index + offset)
|
|
||||||
return values
|
|
||||||
|
|
||||||
def get_help_token_index():
|
|
||||||
for idx in range(len(tokens)):
|
|
||||||
if get_token_value(idx) == "help":
|
|
||||||
return idx
|
|
||||||
return -1
|
|
||||||
|
|
||||||
def has_help():
|
|
||||||
return get_help_token_index() >= 0
|
|
||||||
|
|
||||||
def get_trimmed_help_text(t):
|
|
||||||
txt = ""
|
|
||||||
# len(["help", "=", "_", "("]) ==> 4
|
|
||||||
if get_token_values(t, 4) == "help=_(":
|
|
||||||
txt = get_token_value(t + 4)
|
|
||||||
# len(["help", "=", "("]) ==> 3
|
|
||||||
elif get_token_values(t, 3) == "help=(":
|
|
||||||
txt = get_token_value(t + 3)
|
|
||||||
# len(["help", "="]) ==> 2
|
|
||||||
else:
|
|
||||||
txt = get_token_value(t + 2)
|
|
||||||
return " ".join(txt.strip('\"\'').split())
|
|
||||||
|
|
||||||
def has_enough_help_text(txt):
|
|
||||||
return len(txt) >= opt_help_text_min_char_count
|
|
||||||
|
|
||||||
if has_help():
|
|
||||||
t = get_help_token_index()
|
|
||||||
txt = get_trimmed_help_text(t)
|
|
||||||
if not has_enough_help_text(txt):
|
|
||||||
yield(0, msg)
|
|
||||||
else:
|
|
||||||
yield(0, msg)
|
|
||||||
|
|
||||||
|
|
||||||
def no_os_popen(logical_line):
|
def no_os_popen(logical_line):
|
||||||
"""Disallow 'os.popen('
|
"""Disallow 'os.popen('
|
||||||
|
|
||||||
@ -864,7 +793,6 @@ def factory(register):
|
|||||||
register(check_python3_no_iteritems)
|
register(check_python3_no_iteritems)
|
||||||
register(check_python3_no_iterkeys)
|
register(check_python3_no_iterkeys)
|
||||||
register(check_python3_no_itervalues)
|
register(check_python3_no_itervalues)
|
||||||
register(cfg_help_with_enough_text)
|
|
||||||
register(no_os_popen)
|
register(no_os_popen)
|
||||||
register(no_log_warn)
|
register(no_log_warn)
|
||||||
register(CheckForUncalledTestClosure)
|
register(CheckForUncalledTestClosure)
|
||||||
|
@ -657,78 +657,6 @@ class HackingTestCase(test.NoDBTestCase):
|
|||||||
self.assertEqual(0, len(list(checks.check_python3_no_itervalues(
|
self.assertEqual(0, len(list(checks.check_python3_no_itervalues(
|
||||||
"six.itervalues(ob))"))))
|
"six.itervalues(ob))"))))
|
||||||
|
|
||||||
def test_cfg_help_with_enough_text(self):
|
|
||||||
errors = [(1, 0, 'N347')]
|
|
||||||
|
|
||||||
# Doesn't have help text at all => should raise error
|
|
||||||
code1 = """
|
|
||||||
opt = cfg.StrOpt("opt1")
|
|
||||||
"""
|
|
||||||
self._assert_has_errors(code1, checks.cfg_help_with_enough_text,
|
|
||||||
expected_errors=errors)
|
|
||||||
|
|
||||||
# Explicitly sets an empty string => should raise error
|
|
||||||
code2 = """
|
|
||||||
opt = cfg.StrOpt("opt2", help="")
|
|
||||||
"""
|
|
||||||
self._assert_has_errors(code2, checks.cfg_help_with_enough_text,
|
|
||||||
expected_errors=errors)
|
|
||||||
|
|
||||||
# Has help text but too few characters => should raise error
|
|
||||||
code3 = """
|
|
||||||
opt = cfg.StrOpt("opt3", help="meh")
|
|
||||||
"""
|
|
||||||
self._assert_has_errors(code3, checks.cfg_help_with_enough_text,
|
|
||||||
expected_errors=errors)
|
|
||||||
|
|
||||||
# Has long enough help text => should *not* raise an error
|
|
||||||
code4 = """
|
|
||||||
opt = cfg.StrOpt("opt4", help="This option does stuff")
|
|
||||||
"""
|
|
||||||
self._assert_has_no_errors(code4, checks.cfg_help_with_enough_text)
|
|
||||||
|
|
||||||
# OptGroup objects help is optional => should *not* raise error
|
|
||||||
code5 = """
|
|
||||||
opt_group = cfg.OptGroup(name="group1", title="group title")
|
|
||||||
"""
|
|
||||||
self._assert_has_no_errors(code5, checks.cfg_help_with_enough_text)
|
|
||||||
|
|
||||||
# The help text gets translated
|
|
||||||
code6 = """
|
|
||||||
opt = cfg.StrOpt("opt6",
|
|
||||||
help=_("help with translation usage"))
|
|
||||||
"""
|
|
||||||
self._assert_has_no_errors(code6, checks.cfg_help_with_enough_text)
|
|
||||||
|
|
||||||
# The help text uses a parenthesis (weird, but produces a valid string)
|
|
||||||
code7 = """
|
|
||||||
opt = cfg.StrOpt("opt7",
|
|
||||||
help=("help text uses extra parenthesis"))
|
|
||||||
"""
|
|
||||||
self._assert_has_no_errors(code7, checks.cfg_help_with_enough_text)
|
|
||||||
|
|
||||||
# Ignore deprecated options. They should be in the release notes
|
|
||||||
code8 = """
|
|
||||||
opt = cfg.DeprecatedOpt('opt8')
|
|
||||||
"""
|
|
||||||
self._assert_has_no_errors(code8, checks.cfg_help_with_enough_text)
|
|
||||||
|
|
||||||
code9 = """
|
|
||||||
opt = cfg.StrOpt("opt9",
|
|
||||||
help=\"\"\"
|
|
||||||
This
|
|
||||||
|
|
||||||
is
|
|
||||||
|
|
||||||
multiline
|
|
||||||
|
|
||||||
help
|
|
||||||
|
|
||||||
text.
|
|
||||||
\"\"\")
|
|
||||||
"""
|
|
||||||
self._assert_has_no_errors(code9, checks.cfg_help_with_enough_text)
|
|
||||||
|
|
||||||
def test_no_os_popen(self):
|
def test_no_os_popen(self):
|
||||||
code = """
|
code = """
|
||||||
import os
|
import os
|
||||||
|
Loading…
x
Reference in New Issue
Block a user