Extend validate-modules to check the next to last line (#34819)

* Add validation for the next to last line of a module

* Fix last error code

* Reduce to a single conditional

* Fix conditionals

* Move the final warnings statement to main() in mysql_replication
This commit is contained in:
jctanner 2018-01-15 10:49:35 -05:00 committed by John R Barker
parent a65f702155
commit b10d5f34ea
3 changed files with 27 additions and 1 deletions

View file

@ -70,6 +70,7 @@ Errors
``DOCUMENTATION``/``EXAMPLES``/``RETURN``/``ANSIBLE_METADATA``
107 Imports should be directly below ``DOCUMENTATION``/``EXAMPLES``/``RETURN``/``ANSIBLE_METADATA``
108 GPLv3 license header should be the :ref:`short form <copyright>` for new modules
109 Next to last line is not ``if __name__ == "__main__":``
..
--------- -------------------
**2xx** **Imports**

View file

@ -359,7 +359,8 @@ def main():
else:
module.exit_json(msg="Slave already reset", changed=False)
warnings.simplefilter("ignore")
if __name__ == '__main__':
main()
warnings.simplefilter("ignore")

View file

@ -518,6 +518,30 @@ class ModuleValidator(Validator):
bodies.extend(if_bodies)
for child in bodies:
# validate that the next to last line is 'if __name__ == "__main__"'
if child.lineno == (self.length - 1):
mainchecked = False
try:
if isinstance(child, ast.If) and \
child.test.left.id == '__name__' and \
len(child.test.ops) == 1 and \
isinstance(child.test.ops[0], ast.Eq) and \
child.test.comparators[0].s == '__main__':
mainchecked = True
except Exception:
pass
if not mainchecked:
self.reporter.error(
path=self.object_path,
code=109,
msg='Next to last line should be: if __name__ == "__main__":',
line=child.lineno
)
# validate that the final line is a call to main()
if isinstance(child, ast.Expr):
if isinstance(child.value, ast.Call):
if (isinstance(child.value.func, ast.Name) and