summaryrefslogtreecommitdiff
path: root/test/units/utils/collection_loader/test_collection_loader.py
diff options
context:
space:
mode:
authorMatt Martz <matt@sivel.net>2023-01-10 11:09:57 -0600
committerGitHub <noreply@github.com>2023-01-10 11:09:57 -0600
commit56d142350d62fb674e1c6874b3ace2cf5cb933a7 (patch)
tree1bf7c16181d41763b8a271ac31cf578d3e491d11 /test/units/utils/collection_loader/test_collection_loader.py
parente41d2874a67ade813ffaf2ebfff67987291d53c0 (diff)
downloadansible-56d142350d62fb674e1c6874b3ace2cf5cb933a7.tar.gz
Add support for importlib.resources (#78915)
* Add support for importlib.resources * Remove the importlib.resources imports * return the correct data * Some code comments, and re-order for consistency * Disallow traversing packages below an individual collection * Add a traversable class for namespaces * Re-use variable * Utilize itertools.chain.from_iterable Co-authored-by: Sviatoslav Sydorenko <wk.cvs.github@sydorenko.org.ua> * Simplify logic to check for packages from ansible loaders Co-authored-by: Sviatoslav Sydorenko <wk.cvs.github@sydorenko.org.ua> * Just a generator expression, instead of a generator * docstrings * Add comment about find_spec for our namespaces * Add some initial unit tests for importlib.resources * normalize * Utilize importlib.resources for listing collections * collections_path is already in config, just use config * install uses a different default for collections_path * Remove unused import * Remove duplicate __truediv__ * Bring back TraversableResources * Apply some small suggestions from code review Co-authored-by: Sviatoslav Sydorenko <wk.cvs.github@sydorenko.org.ua> Co-authored-by: Matt Davis <6775756+nitzmahone@users.noreply.github.com> * Remove cross contamination between plugin loader code and CLI code * Remove unused import Co-authored-by: Sviatoslav Sydorenko <wk.cvs.github@sydorenko.org.ua> Co-authored-by: Matt Davis <6775756+nitzmahone@users.noreply.github.com>
Diffstat (limited to 'test/units/utils/collection_loader/test_collection_loader.py')
-rw-r--r--test/units/utils/collection_loader/test_collection_loader.py48
1 files changed, 47 insertions, 1 deletions
diff --git a/test/units/utils/collection_loader/test_collection_loader.py b/test/units/utils/collection_loader/test_collection_loader.py
index f7050dcd6d..a8a31a3b01 100644
--- a/test/units/utils/collection_loader/test_collection_loader.py
+++ b/test/units/utils/collection_loader/test_collection_loader.py
@@ -13,7 +13,7 @@ from ansible.modules import ping as ping_module
from ansible.utils.collection_loader import AnsibleCollectionConfig, AnsibleCollectionRef
from ansible.utils.collection_loader._collection_finder import (
_AnsibleCollectionFinder, _AnsibleCollectionLoader, _AnsibleCollectionNSPkgLoader, _AnsibleCollectionPkgLoader,
- _AnsibleCollectionPkgLoaderBase, _AnsibleCollectionRootPkgLoader, _AnsiblePathHookFinder,
+ _AnsibleCollectionPkgLoaderBase, _AnsibleCollectionRootPkgLoader, _AnsibleNSTraversable, _AnsiblePathHookFinder,
_get_collection_name_from_path, _get_collection_role_path, _get_collection_metadata, _iter_modules_impl
)
from ansible.utils.collection_loader._collection_config import _EventSource
@@ -828,6 +828,52 @@ def test_collectionref_components_invalid(name, subdirs, resource, ref_type, exp
assert re.search(expected_error_expression, str(curerr.value))
+@pytest.mark.skipif(not PY3, reason='importlib.resources only supported for py3')
+def test_importlib_resources():
+ if sys.version_info < (3, 10):
+ from importlib_resources import files
+ else:
+ from importlib.resources import files
+ from pathlib import Path
+
+ f = get_default_finder()
+ reset_collections_loader_state(f)
+
+ ansible_collections_ns = files('ansible_collections')
+ ansible_ns = files('ansible_collections.ansible')
+ testns = files('ansible_collections.testns')
+ testcoll = files('ansible_collections.testns.testcoll')
+ testcoll2 = files('ansible_collections.testns.testcoll2')
+ module_utils = files('ansible_collections.testns.testcoll.plugins.module_utils')
+
+ assert isinstance(ansible_collections_ns, _AnsibleNSTraversable)
+ assert isinstance(ansible_ns, _AnsibleNSTraversable)
+ assert isinstance(testcoll, Path)
+ assert isinstance(module_utils, Path)
+
+ assert ansible_collections_ns.is_dir()
+ assert ansible_ns.is_dir()
+ assert testcoll.is_dir()
+ assert module_utils.is_dir()
+
+ first_path = Path(default_test_collection_paths[0])
+ second_path = Path(default_test_collection_paths[1])
+ testns_paths = []
+ ansible_ns_paths = []
+ for path in default_test_collection_paths[:2]:
+ ansible_ns_paths.append(Path(path) / 'ansible_collections' / 'ansible')
+ testns_paths.append(Path(path) / 'ansible_collections' / 'testns')
+
+ assert testns._paths == testns_paths
+ assert ansible_ns._paths == ansible_ns_paths
+ assert ansible_collections_ns._paths == [Path(p) / 'ansible_collections' for p in default_test_collection_paths[:2]]
+ assert testcoll2 == second_path / 'ansible_collections' / 'testns' / 'testcoll2'
+
+ assert {p.name for p in module_utils.glob('*.py')} == {'__init__.py', 'my_other_util.py', 'my_util.py'}
+ nestcoll_mu_init = first_path / 'ansible_collections' / 'testns' / 'testcoll' / 'plugins' / 'module_utils' / '__init__.py'
+ assert next(module_utils.glob('__init__.py')) == nestcoll_mu_init
+
+
# BEGIN TEST SUPPORT
default_test_collection_paths = [