diff --git a/docs/docsite/rst/dev_guide/testing/sanity/no-unwanted-files.rst b/docs/docsite/rst/dev_guide/testing/sanity/no-unwanted-files.rst new file mode 100644 index 00000000000..999ee7b4766 --- /dev/null +++ b/docs/docsite/rst/dev_guide/testing/sanity/no-unwanted-files.rst @@ -0,0 +1,13 @@ +Sanity Tests ยป no-unwanted-files +================================ + +Specific file types are allowed in certain directories: + +- ``lib`` - All content must reside in the ``lib/ansible`` directory. + +- ``lib/ansible`` - Only source code with one of the following extensions is allowed: + + - ``*.cs`` - C# + - ``*.ps1`` - PowerShell + - ``*.psm1`` - PowerShell + - ``*.py`` - Python diff --git a/test/sanity/code-smell/no-unwanted-files.json b/test/sanity/code-smell/no-unwanted-files.json new file mode 100644 index 00000000000..f508e3e18e6 --- /dev/null +++ b/test/sanity/code-smell/no-unwanted-files.json @@ -0,0 +1,6 @@ +{ + "prefixes": [ + "lib/" + ], + "output": "path-message" +} diff --git a/test/sanity/code-smell/no-unwanted-files.py b/test/sanity/code-smell/no-unwanted-files.py new file mode 100755 index 00000000000..fe0743d533d --- /dev/null +++ b/test/sanity/code-smell/no-unwanted-files.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python +"""Prevent unwanted files from being added to the source tree.""" +import os +import sys + + +def main(): + """Main entry point.""" + paths = sys.argv[1:] or sys.stdin.read().splitlines() + + allowed_extensions = ( + '.cs', + '.ps1', + '.psm1', + '.py', + ) + + skip = ( + # allowed special cases + 'lib/ansible/config/base.yml', + 'lib/ansible/config/module_defaults.yml', + # temporary skip, relocate these to docs + 'lib/ansible/modules/cloud/amazon/GUIDELINES.md', + 'lib/ansible/modules/cloud/openstack/README.md', + 'lib/ansible/modules/cloud/ovirt/README.rst', + ) + + skip_directories = ( + 'lib/ansible.egg-info/', + 'lib/ansible/galaxy/data/', + ) + + for path in paths: + if path in skip: + continue + + if any(path.startswith(skip_directory) for skip_directory in skip_directories): + continue + + if path.startswith('lib/') and not path.startswith('lib/ansible/'): + print('%s: all "lib" content must reside in the "lib/ansible" directory' % path) + continue + + ext = os.path.splitext(path)[1] + + if ext not in allowed_extensions: + print('%s: extension must be one of: %s' % (path, ', '.join(allowed_extensions))) + + +if __name__ == '__main__': + main()