in knack/config.py [0:0]
def items(self, section):
import re
# Only allow valid env vars, in all caps: CLI_SECTION_TEST_OPTION, CLI_SECTION__TEST_OPTION
pattern = self.env_var_name(section, '([0-9A-Z_]+)')
env_entries = []
for k in os.environ:
# Must be a full match, otherwise CLI_SECTION_T part in CLI_MYSECTION_Test_Option will match
matched = re.fullmatch(pattern, k)
if matched:
# (name, value, ENV_VAR_NAME)
item = (matched.group(1).lower(), os.environ[k], k)
env_entries.append(item)
# Prepare result with env entries first
result = {c[0]: c for c in env_entries}
# Add entries from config files if they do not exist yet
for config in self._config_file_chain if self.use_local_config else self._config_file_chain[-1:]:
try:
entries = config.items(section)
for name, value in entries:
if name not in result:
result[name] = (name, value, config.config_path)
except (configparser.NoSectionError, configparser.NoOptionError):
pass
return [{'name': name, 'value': value, 'source': source} for name, value, source in result.values()]