From a5a569806aefcf7ececc6ee7911caef7ccd33a40 Mon Sep 17 00:00:00 2001 From: Matt Martz Date: Mon, 16 Jun 2025 10:59:07 -0500 Subject: [PATCH] align functionality with the current state of py3.12+ loaders --- .../collection_loader/_collection_finder.py | 13 ++----------- .../test_collection_loader.py | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/lib/ansible/utils/collection_loader/_collection_finder.py b/lib/ansible/utils/collection_loader/_collection_finder.py index 81d3becc5e1..30d5386aa91 100644 --- a/lib/ansible/utils/collection_loader/_collection_finder.py +++ b/lib/ansible/utils/collection_loader/_collection_finder.py @@ -47,8 +47,7 @@ if sys.version_info >= (3, 10): else: # deprecated: description='reliable importlib.resources.files' python_version='3.10' def files(name): - spec = find_spec(name) - if spec is None: + if (spec := find_spec(name)) is None: raise ImportError(name) origin = pathlib.Path(spec.origin) return origin.parent @@ -144,7 +143,7 @@ class _AnsibleTraversableResources(TraversableResources): def _get_package(self, package): try: # spec - return package.__parent__ + return package.parent except AttributeError: # module return package.__package__ @@ -168,13 +167,6 @@ class _AnsibleTraversableResources(TraversableResources): module_filename = os.path.basename(origin) return module_filename in {'__synthetic__', '__init__.py'} - def _ensure_package(self, package): - if self._is_ansible_ns_package(package): - # Short circuit our loaders - return - if self._get_package(package) != package.__name__: - raise TypeError('%r is not a package' % package.__name__) - def files(self): package = self._package parts = package.split('.') @@ -191,7 +183,6 @@ class _AnsibleTraversableResources(TraversableResources): elif not isinstance(package, ModuleType): raise TypeError('Expected string or module, got %r' % package.__class__.__name__) - self._ensure_package(package) if is_ns: return _AnsibleNSTraversable(*package.submodule_search_locations) return pathlib.Path(self._get_path(package)).parent diff --git a/test/units/utils/collection_loader/test_collection_loader.py b/test/units/utils/collection_loader/test_collection_loader.py index 8c973ae1e2f..5ff4642c1e1 100644 --- a/test/units/utils/collection_loader/test_collection_loader.py +++ b/test/units/utils/collection_loader/test_collection_loader.py @@ -892,6 +892,24 @@ def test_importlib_resources(): assert next(module_utils.glob('__init__.py')) == nestcoll_mu_init +@pytest.mark.skipif(sys.version_info < (3, 12), reason='Testing Python 3.12+ codepath that returns package when provided module') +def test_importlib_resources_module(): + from importlib.resources import files + from pathlib import Path + + f = get_default_finder() + reset_collections_loader_state(f) + + module_utils = files('ansible_collections.testns.testcoll.plugins.module_utils') + my_util = files('ansible_collections.testns.testcoll.plugins.module_utils.my_util') + assert isinstance(module_utils, Path) + assert isinstance(my_util, Path) + + assert module_utils.is_dir() + assert my_util.is_dir() + assert module_utils == my_util + + # BEGIN TEST SUPPORT default_test_collection_paths = [