mirror of
https://github.com/ansible-collections/community.general.git
synced 2025-07-02 14:40:19 -07:00
Allow loading dirs from role defaults/vars (#36357)
This commit moves code to look for vars files/dirs to a common place and uses it for loading role defaults/vars. This allows things such as 'defaults/main' or 'vars/main' being a directory in a role, allowing splitting of defaults/vars into multiple files. This commit also fixes the role loading unit tests for py3 when bytestrings are used for paths instead of utf8 strings. This fixes #14248 and #11639.
This commit is contained in:
parent
cc250156c4
commit
95ce00ff00
5 changed files with 151 additions and 84 deletions
|
@ -89,7 +89,7 @@ class VarsModule(BaseVarsPlugin):
|
|||
if os.path.exists(b_opath):
|
||||
if os.path.isdir(b_opath):
|
||||
self._display.debug("\tprocessing dir %s" % opath)
|
||||
found_files = self._find_vars_files(opath, entity.name)
|
||||
found_files = loader.find_vars_files(opath, entity.name)
|
||||
FOUND[key] = found_files
|
||||
else:
|
||||
self._display.warning("Found %s that is not a directory, skipping: %s" % (subdir, opath))
|
||||
|
@ -102,48 +102,3 @@ class VarsModule(BaseVarsPlugin):
|
|||
except Exception as e:
|
||||
raise AnsibleParserError(to_native(e))
|
||||
return data
|
||||
|
||||
def _find_vars_files(self, path, name):
|
||||
""" Find {group,host}_vars files """
|
||||
|
||||
b_path = to_bytes(os.path.join(path, name))
|
||||
found = []
|
||||
|
||||
# first look for w/o extensions
|
||||
if os.path.exists(b_path):
|
||||
if os.path.isdir(b_path):
|
||||
found.extend(self._get_dir_files(to_text(b_path)))
|
||||
else:
|
||||
found.append(b_path)
|
||||
else:
|
||||
# add valid extensions to name
|
||||
for ext in C.YAML_FILENAME_EXTENSIONS:
|
||||
|
||||
if '.' in ext:
|
||||
full_path = b_path + to_bytes(ext)
|
||||
elif ext:
|
||||
full_path = b'.'.join([b_path, to_bytes(ext)])
|
||||
else:
|
||||
full_path = b_path
|
||||
|
||||
if os.path.exists(full_path) and os.path.isfile(full_path):
|
||||
found.append(full_path)
|
||||
break
|
||||
return found
|
||||
|
||||
def _get_dir_files(self, path):
|
||||
|
||||
found = []
|
||||
for spath in sorted(os.listdir(path)):
|
||||
if not spath.startswith(u'.') and not spath.endswith(u'~'): # skip hidden and backups
|
||||
|
||||
ext = os.path.splitext(spath)[-1]
|
||||
full_spath = os.path.join(path, spath)
|
||||
|
||||
if os.path.isdir(full_spath) and not ext: # recursive search if dir
|
||||
found.extend(self._get_dir_files(full_spath))
|
||||
elif os.path.isfile(full_spath) and (not ext or to_text(ext) in C.YAML_FILENAME_EXTENSIONS):
|
||||
# only consider files with valid extensions or no extension
|
||||
found.append(full_spath)
|
||||
|
||||
return found
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue