@ -29,7 +29,7 @@ from ansible.module_utils.common.text.converters import to_bytes, to_text, to_na
from ansible . module_utils . six import string_types
from ansible . parsing . utils . yaml import from_yaml
from ansible . parsing . yaml . loader import AnsibleLoader
from ansible . plugins import get_plugin_class , MODULE_CACHE , PATH_CACHE , PLUGIN_PATH_CACHE
from ansible . plugins import get_plugin_class , MODULE_CACHE , PATH_CACHE , PLUGIN_PATH_CACHE , PY_FILES
from ansible . utils . collection_loader import AnsibleCollectionConfig , AnsibleCollectionRef
from ansible . utils . collection_loader . _collection_finder import _AnsibleCollectionFinder , _get_collection_metadata
from ansible . utils . display import Display
@ -229,6 +229,8 @@ class PluginLoader:
PATH_CACHE [ class_name ] = None
if class_name not in PLUGIN_PATH_CACHE :
PLUGIN_PATH_CACHE [ class_name ] = defaultdict ( dict )
if class_name not in PY_FILES :
PY_FILES [ class_name ] = { }
# hold dirs added at runtime outside of config
self . _extra_dirs = [ ]
@ -236,6 +238,7 @@ class PluginLoader:
# caches
self . _module_cache = MODULE_CACHE [ class_name ]
self . _paths = PATH_CACHE [ class_name ]
self . _py_files = PY_FILES [ class_name ]
self . _plugin_path_cache = PLUGIN_PATH_CACHE [ class_name ]
self . _plugin_instance_cache = { } if self . subdir == ' vars_plugins ' else None
@ -257,12 +260,14 @@ class PluginLoader:
MODULE_CACHE [ self . class_name ] = { }
PATH_CACHE [ self . class_name ] = None
PLUGIN_PATH_CACHE [ self . class_name ] = defaultdict ( dict )
PY_FILES [ self . class_name ] = { }
# reset internal caches
self . _module_cache = MODULE_CACHE [ self . class_name ]
self . _paths = PATH_CACHE [ self . class_name ]
self . _plugin_path_cache = PLUGIN_PATH_CACHE [ self . class_name ]
self . _plugin_instance_cache = { } if self . subdir == ' vars_plugins ' else None
self . _py_files = PY_FILES [ self . class_name ]
self . _searched_paths = set ( )
def __setstate__ ( self , data ) :
@ -279,6 +284,7 @@ class PluginLoader:
PATH_CACHE [ class_name ] = data . get ( ' PATH_CACHE ' )
PLUGIN_PATH_CACHE [ class_name ] = data . get ( ' PLUGIN_PATH_CACHE ' )
PY_FILES [ class_name ] = data . get ( ' PY_FILES ' )
self . __init__ ( class_name , package , config , subdir , aliases , base_class )
self . _extra_dirs = data . get ( ' _extra_dirs ' , [ ] )
@ -300,6 +306,7 @@ class PluginLoader:
_searched_paths = self . _searched_paths ,
PATH_CACHE = PATH_CACHE [ self . class_name ] ,
PLUGIN_PATH_CACHE = PLUGIN_PATH_CACHE [ self . class_name ] ,
PY_FILES = PY_FILES [ self . class_name ] ,
)
def format_paths ( self , paths ) :
@ -950,6 +957,11 @@ class PluginLoader:
display . debug ( msg )
def _get_py_files ( self , path ) :
if path not in self . _py_files :
self . _py_files [ path ] = glob . glob ( to_native ( os . path . join ( path , " *.py " ) ) )
return self . _py_files [ path ]
def all ( self , * args , * * kwargs ) :
'''
Iterate through all plugins of this type , in configured paths ( no collections )
@ -996,7 +1008,7 @@ class PluginLoader:
legacy_excluding_builtin = set ( )
for path_with_context in self . _get_paths_with_context ( ) :
matches = glob . glob ( to_native ( os . path . join ( path_with_context . path , " *.py " ) ) )
matches = self . _get_py_files ( path_with_context . path )
if not path_with_context . internal :
legacy_excluding_builtin . update ( matches )
# we sort within each path, but keep path precedence from config