in hydra/plugins/completion_plugin.py [0:0]
def _get_matches(config: Container, word: str) -> List[str]:
def str_rep(in_key: Any, in_value: Any) -> str:
if OmegaConf.is_config(in_value):
return f"{in_key}."
else:
return f"{in_key}="
if config is None:
return []
elif OmegaConf.is_config(config):
matches = []
if word.endswith(".") or word.endswith("="):
exact_key = word[0:-1]
try:
conf_node = OmegaConf.select(
config, exact_key, throw_on_missing=True
)
except MissingMandatoryValue:
conf_node = ""
if conf_node is not None:
if OmegaConf.is_config(conf_node):
key_matches = CompletionPlugin._get_matches(conf_node, "")
else:
# primitive
if isinstance(conf_node, bool):
conf_node = str(conf_node).lower()
key_matches = [conf_node]
else:
key_matches = []
matches.extend([f"{word}{match}" for match in key_matches])
else:
last_dot = word.rfind(".")
if last_dot != -1:
base_key = word[0:last_dot]
partial_key = word[last_dot + 1 :]
conf_node = OmegaConf.select(config, base_key)
key_matches = CompletionPlugin._get_matches(conf_node, partial_key)
matches.extend([f"{base_key}.{match}" for match in key_matches])
else:
if isinstance(config, DictConfig):
for key, value in config.items_ex(resolve=False):
str_key = str(key)
if str_key.startswith(word):
matches.append(str_rep(key, value))
elif OmegaConf.is_list(config):
assert isinstance(config, ListConfig)
for idx in range(len(config)):
try:
value = config[idx]
if str(idx).startswith(word):
matches.append(str_rep(idx, value))
except MissingMandatoryValue:
matches.append(str_rep(idx, ""))
else:
assert False, f"Object is not an instance of config : {type(config)}"
return matches