Skip to content

Commit

Permalink
Verify package data in setup.py installs all files (ansible#59537)
Browse files Browse the repository at this point in the history
* 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
  • Loading branch information
sivel authored Jul 24, 2019
1 parent 119f2b8 commit 95f4282
Show file tree
Hide file tree
Showing 6 changed files with 61 additions and 1 deletion.
5 changes: 5 additions & 0 deletions docs/docsite/rst/dev_guide/testing/sanity/package-data.rst
Original file line number Diff line number Diff line change
@@ -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``
1 change: 1 addition & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,7 @@ def get_dynamic_setup_params():
'galaxy/data/*/*/.*',
'galaxy/data/*/*/*.*',
'galaxy/data/*/tests/inventory',
'galaxy/data/*/role/tests/inventory',
'config/base.yml',
'config/module_defaults.yml',
],
Expand Down
1 change: 1 addition & 0 deletions test/sanity/code-smell/ansible-only.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,4 @@ deprecated-config.py
docs-build.py
test-constraints.py
update-bundled.py
package-data.py
5 changes: 5 additions & 0 deletions test/sanity/code-smell/package-data.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"disabled": true,
"always": true,
"output": "path-message"
}
48 changes: 48 additions & 0 deletions test/sanity/code-smell/package-data.py
Original file line number Diff line number Diff line change
@@ -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()
2 changes: 1 addition & 1 deletion test/utils/shippable/sanity.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 95f4282

Please sign in to comment.