示例#1
0
    def _create_defaults_list(
        self,
        config_path: str,
        defaults: ListConfig,
    ) -> List[InputDefault]:
        def issue_deprecated_name_warning() -> None:
            # DEPRECATED: remove in 1.2
            url = "https://hydra.cc/docs/next/upgrades/1.0_to_1.1/changes_to_package_header"
            warnings.warn(
                category=UserWarning,
                message=dedent(f"""\
                    In {config_path}: Defaults List contains deprecated keyword _name_, see {url}
                    """),
            )

        res: List[InputDefault] = []
        for item in defaults._iter_ex(resolve=False):
            default: InputDefault
            if isinstance(item, DictConfig):
                old_optional = None
                if len(item) > 1:
                    if "optional" in item:
                        old_optional = item.pop("optional")
                keys = list(item.keys())

                if len(keys) > 1:
                    raise ValueError(
                        f"In {config_path}: Too many keys in default item {item}"
                    )
                if len(keys) == 0:
                    raise ValueError(
                        f"In {config_path}: Missing group name in {item}")

                key = keys[0]
                assert isinstance(key, str)
                config_group, package, _package2 = self._split_group(key)
                keywords = ConfigRepository.Keywords()
                self._extract_keywords_from_config_group(
                    config_group, keywords)

                if not keywords.optional and old_optional is not None:
                    keywords.optional = old_optional

                node = item._get_node(key)
                assert node is not None and isinstance(node, Node)
                config_value = node._value()

                if old_optional is not None:
                    # DEPRECATED: remove in 1.2
                    msg = dedent(f"""
                        In {config_path}: 'optional: true' is deprecated.
                        Use 'optional {key}: {config_value}' instead.
                        Support for the old style will be removed in Hydra 1.2"""
                                 )

                    warnings.warn(msg)

                if config_value is not None and not isinstance(
                        config_value, (str, list)):
                    raise ValueError(
                        f"Unsupported item value in defaults : {type(config_value).__name__}."
                        " Supported: string or list")

                if isinstance(config_value, list):
                    options = []
                    for v in config_value:
                        vv = v._value()
                        if not isinstance(vv, str):
                            raise ValueError(
                                f"Unsupported item value in defaults : {type(vv).__name__},"
                                " nested list items must be strings")
                        options.append(vv)
                    config_value = options

                if package is not None and "_name_" in package:
                    issue_deprecated_name_warning()

                default = GroupDefault(
                    group=keywords.group,
                    value=config_value,
                    package=package,
                    optional=keywords.optional,
                    override=keywords.override,
                )

            elif isinstance(item, str):
                path, package, _package2 = self._split_group(item)
                if package is not None and "_name_" in package:
                    issue_deprecated_name_warning()

                default = ConfigDefault(path=path, package=package)
            else:
                raise ValueError(
                    f"Unsupported type in defaults : {type(item).__name__}")
            res.append(default)
        return res
示例#2
0
    def _create_defaults_list(
        self,
        config_path: str,
        defaults: ListConfig,
    ) -> List[InputDefault]:
        res: List[InputDefault] = []
        for item in defaults._iter_ex(resolve=False):
            default: InputDefault
            if isinstance(item, DictConfig):
                old_optional = None
                if len(item) > 1:
                    if "optional" in item:
                        old_optional = item.pop("optional")
                keys = list(item.keys())

                if len(keys) > 1:
                    raise ValueError(
                        f"In {config_path}: Too many keys in default item {item}"
                    )
                if len(keys) == 0:
                    raise ValueError(
                        f"In {config_path}: Missing group name in {item}")

                key = keys[0]
                config_group, package, _package2 = self._split_group(key)
                keywords = ConfigRepository.Keywords()
                self._extract_keywords_from_config_group(
                    config_group, keywords)

                if not keywords.optional and old_optional is not None:
                    keywords.optional = old_optional

                node = item._get_node(key)
                assert node is not None
                config_name = node._value()

                if old_optional is not None:
                    # DEPRECATED: remove in 1.2
                    msg = dedent(f"""
                        In {config_path}: 'optional: true' is deprecated.
                        Use 'optional {key}: {config_name}' instead.
                        Support for the old style will be removed in Hydra 1.2"""
                                 )

                    warnings.warn(msg)

                default = GroupDefault(
                    group=keywords.group,
                    name=config_name,
                    package=package,
                    optional=keywords.optional,
                    override=keywords.override,
                )
            elif isinstance(item, str):
                path, package, _package2 = self._split_group(item)
                default = ConfigDefault(path=path, package=package)
            else:
                raise ValueError(
                    f"Unsupported type in defaults : {type(item).__name__}")
            res.append(default)
        return res