ansible/test/sanity/code-smell/action-plugin-docs.py
Matt Clay 3f2b766d10 Add future and metaclass boilerplate to test code.
Continue to ignore:

- test/integration/
- test/legacy/
- test/units/
2019-07-12 09:18:24 -07:00

82 lines
2.4 KiB
Python
Executable file

#!/usr/bin/env python
"""Test to verify action plugins have an associated module to provide documentation."""
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
import os
import sys
def main():
"""Main entry point."""
skip = set([
'__init__', # action plugin base class, not an actual action plugin
'net_base', # base class for other net_* action plugins which have a matching module
'normal', # default action plugin for modules without a dedicated action plugin
'network', # base class for network action plugins
# The following action plugins existed without modules to document them before this test was put in place.
# They should either be removed, have a module added to document them, or have the exception documented here.
'bigip',
'bigiq',
'ce_template',
# The following action plugins provide base classes for network platform specific modules to support `connection: local`.
# Once we fully deprecate the use of connection local, the base classes will go away.
'aireos',
'aruba',
'asa',
'ce',
'cnos',
'dellos10',
'dellos6',
'dellos9',
'enos',
'eos',
'ios',
'iosxr',
'ironware',
'junos',
'netconf',
'nxos',
'sros',
'vyos',
])
paths = sys.argv[1:] or sys.stdin.read().splitlines()
module_names = set()
for path in paths:
if not path.startswith('lib/ansible/modules/'):
continue
name = os.path.splitext(os.path.basename(path))[0]
if name != '__init__':
if name.startswith('_'):
name = name[1:]
module_names.add(name)
unused_skip = set(skip)
for path in paths:
if not path.startswith('lib/ansible/plugins/action/'):
continue
name = os.path.splitext(os.path.basename(path))[0]
if name not in module_names:
if name in skip:
unused_skip.remove(name)
continue
print('%s: action plugin has no matching module to provide documentation' % path)
for filename in sorted(unused_skip):
print("%s: remove '%s' from skip list since it does not exist" % ('test/sanity/code-smell/action-plugin-docs.py', filename))
if __name__ == '__main__':
main()