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
pull/26105/head
jctanner 7 years ago committed by John R Barker
parent a65f702155
commit b10d5f34ea

@ -70,6 +70,7 @@ Errors
``DOCUMENTATION``/``EXAMPLES``/``RETURN``/``ANSIBLE_METADATA`` ``DOCUMENTATION``/``EXAMPLES``/``RETURN``/``ANSIBLE_METADATA``
107 Imports should be directly below ``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 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** **2xx** **Imports**

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

@ -518,6 +518,30 @@ class ModuleValidator(Validator):
bodies.extend(if_bodies) bodies.extend(if_bodies)
for child in 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, ast.Expr):
if isinstance(child.value, ast.Call): if isinstance(child.value, ast.Call):
if (isinstance(child.value.func, ast.Name) and if (isinstance(child.value.func, ast.Name) and

Loading…
Cancel
Save