From 95f4282c42cd5ffe4a19a1122685ae9c31876a12 Mon Sep 17 00:00:00 2001 From: Matt Martz Date: Wed, 24 Jul 2019 13:58:13 -0500 Subject: [PATCH] Verify package data in setup.py installs all files (#59537) * Add sanity test to ensure all non-py files are installed * Fix mode and regex * Fix role skel inventory package_data * Add docs * Update package_data for inventory files * Address pylint concerns * Another tweak to package_data * Address review feedback * Change index to 1 * add to ansible-only.txt --- .../dev_guide/testing/sanity/package-data.rst | 5 ++ setup.py | 1 + test/sanity/code-smell/ansible-only.txt | 1 + test/sanity/code-smell/package-data.json | 5 ++ test/sanity/code-smell/package-data.py | 48 +++++++++++++++++++ test/utils/shippable/sanity.sh | 2 +- 6 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 docs/docsite/rst/dev_guide/testing/sanity/package-data.rst create mode 100644 test/sanity/code-smell/package-data.json create mode 100755 test/sanity/code-smell/package-data.py diff --git a/docs/docsite/rst/dev_guide/testing/sanity/package-data.rst b/docs/docsite/rst/dev_guide/testing/sanity/package-data.rst new file mode 100644 index 00000000000..361dacbeb93 --- /dev/null +++ b/docs/docsite/rst/dev_guide/testing/sanity/package-data.rst @@ -0,0 +1,5 @@ +Sanity Tests ยป package-data +=========================== + +Verifies that the combination of ``MANIFEST.in`` and ``package_data`` from ``setup.py`` +properly installs data files from within ``lib/ansible`` diff --git a/setup.py b/setup.py index 5b4650e16e0..c607de5fa80 100644 --- a/setup.py +++ b/setup.py @@ -271,6 +271,7 @@ static_setup_params = dict( 'galaxy/data/*/*/.*', 'galaxy/data/*/*/*.*', 'galaxy/data/*/tests/inventory', + 'galaxy/data/*/role/tests/inventory', 'config/base.yml', 'config/module_defaults.yml', ], diff --git a/test/sanity/code-smell/ansible-only.txt b/test/sanity/code-smell/ansible-only.txt index d713d89f398..14c45f07994 100644 --- a/test/sanity/code-smell/ansible-only.txt +++ b/test/sanity/code-smell/ansible-only.txt @@ -6,3 +6,4 @@ deprecated-config.py docs-build.py test-constraints.py update-bundled.py +package-data.py diff --git a/test/sanity/code-smell/package-data.json b/test/sanity/code-smell/package-data.json new file mode 100644 index 00000000000..db6ca35c2a6 --- /dev/null +++ b/test/sanity/code-smell/package-data.json @@ -0,0 +1,5 @@ +{ + "disabled": true, + "always": true, + "output": "path-message" +} diff --git a/test/sanity/code-smell/package-data.py b/test/sanity/code-smell/package-data.py new file mode 100755 index 00000000000..e17059329e2 --- /dev/null +++ b/test/sanity/code-smell/package-data.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python +from __future__ import (absolute_import, division, print_function) +__metaclass__ = type + +import fnmatch +import os +import re +import tempfile +import subprocess + + +def main(): + ignore_files = frozenset(( + '*/.git_keep', + '*/galaxy/data/default/role/*/main.yml.j2', + '*/galaxy/data/default/role/*/test.yml.j2', + '*/galaxy/data/default/collection/plugins/README.md.j2', + )) + + non_py_files = [] + for root, _dummy, files in os.walk('lib/ansible/'): + for filename in files: + path = os.path.join(root, filename) + if os.path.splitext(path)[1] not in ('.py', '.pyc', '.pyo'): + add = True + for ignore in ignore_files: + if fnmatch.fnmatch(path, ignore): + add = False + if add: + non_py_files.append(os.path.relpath(path, 'lib/ansible')) + + with tempfile.TemporaryDirectory() as tmp_dir: + stdout, _dummy = subprocess.Popen( + ['python', 'setup.py', 'install', '--root=%s' % tmp_dir], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + universal_newlines=True, + ).communicate() + match = re.search('^creating (%s/.*?/(?:site|dist)-packages/ansible)$' % tmp_dir, stdout, flags=re.M) + + for filename in non_py_files: + path = os.path.join(match.group(1), filename) + if not os.path.exists(path): + print('%s: File not installed' % os.path.join('lib', 'ansible', filename)) + + +if __name__ == '__main__': + main() diff --git a/test/utils/shippable/sanity.sh b/test/utils/shippable/sanity.sh index 734d39c9917..09d859b3639 100755 --- a/test/utils/shippable/sanity.sh +++ b/test/utils/shippable/sanity.sh @@ -17,7 +17,7 @@ fi case "${group}" in 1) options=(--skip-test pylint --skip-test ansible-doc --skip-test docs-build) ;; - 2) options=(--test ansible-doc --test docs-build) ;; + 2) options=(--test ansible-doc --test docs-build --test package-data) ;; 3) options=(--test pylint --exclude test/units/ --exclude lib/ansible/module_utils/ --exclude lib/ansible/modules/network/) ;; 4) options=(--test pylint test/units/ lib/ansible/module_utils/ lib/ansible/modules/network/) ;; esac