diff options
author | Alan Fregtman <941331+darkvertex@users.noreply.github.com> | 2021-06-30 01:15:18 -0400 |
---|---|---|
committer | Alan Fregtman <941331+darkvertex@users.noreply.github.com> | 2021-06-30 01:15:18 -0400 |
commit | 36b4820f519d93bad998302141ae6de2cb15191c (patch) | |
tree | 3b2f12b454f27de4d837f106885216ea89d28347 /setuptools/config.py | |
parent | 2234e88b7b820c40f29d7ddadc182b0f130eaa1d (diff) | |
download | python-setuptools-git-36b4820f519d93bad998302141ae6de2cb15191c.tar.gz |
Implement "glob:" directive for declarative "data_files" option.
Diffstat (limited to 'setuptools/config.py')
-rw-r--r-- | setuptools/config.py | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/setuptools/config.py b/setuptools/config.py index 44de7cf5..47109dad 100644 --- a/setuptools/config.py +++ b/setuptools/config.py @@ -9,6 +9,7 @@ import importlib from collections import defaultdict from functools import partial from functools import wraps +from glob import iglob import contextlib from distutils.errors import DistutilsOptionError, DistutilsFileError @@ -256,6 +257,33 @@ class ConfigHandler: return [chunk.strip() for chunk in value if chunk.strip()] @classmethod + def _parse_list_glob(cls, value, separator=','): + """Equivalent to _parse_list() but expands 'glob:' directives using glob(). + + However, unlike glob(), the resolved results stay relative paths. + + :param value: + :param separator: List items separator character. + :rtype: list + """ + directive = 'glob:' + values = cls._parse_list(value, separator=separator) + expanded_values = [] + for value in values: + trimmed_value = value.strip() + if trimmed_value.startswith(directive): + # take what is after "glob:" + value = trimmed_value.split(directive, 1)[-1].strip() + value = os.path.abspath(value) + # and expand it while keeping as a relative path: + value = sorted(os.path.relpath(path, os.getcwd()) for path in iglob(value)) + expanded_values.extend(value) + else: + expanded_values.append(value) + + return expanded_values + + @classmethod def _parse_dict(cls, value): """Represents value as a dict. @@ -711,5 +739,5 @@ class ConfigOptionsHandler(ConfigHandler): :param dict section_options: """ - parsed = self._parse_section_to_dict(section_options, self._parse_list) + parsed = self._parse_section_to_dict(section_options, self._parse_list_glob) self['data_files'] = [(k, v) for k, v in parsed.items()] |