xref: /aosp_15_r20/external/pytorch/torchgen/yaml_utils.py (revision da0073e96a02ea20f0ac840b70461e3646d07c45)
1*da0073e9SAndroid Build Coastguard Worker# Safely load fast C Yaml loader/dumper if they are available
2*da0073e9SAndroid Build Coastguard Workertry:
3*da0073e9SAndroid Build Coastguard Worker    from yaml import CSafeLoader as Loader
4*da0073e9SAndroid Build Coastguard Workerexcept ImportError:
5*da0073e9SAndroid Build Coastguard Worker    from yaml import SafeLoader as Loader  # type: ignore[assignment, misc]
6*da0073e9SAndroid Build Coastguard Worker
7*da0073e9SAndroid Build Coastguard Workertry:
8*da0073e9SAndroid Build Coastguard Worker    from yaml import CSafeDumper as Dumper
9*da0073e9SAndroid Build Coastguard Workerexcept ImportError:
10*da0073e9SAndroid Build Coastguard Worker    from yaml import SafeDumper as Dumper  # type: ignore[assignment, misc]
11*da0073e9SAndroid Build Coastguard WorkerYamlDumper = Dumper
12*da0073e9SAndroid Build Coastguard Worker
13*da0073e9SAndroid Build Coastguard Worker
14*da0073e9SAndroid Build Coastguard Worker# A custom loader for YAML that errors on duplicate keys.
15*da0073e9SAndroid Build Coastguard Worker# This doesn't happen by default: see https://github.com/yaml/pyyaml/issues/165
16*da0073e9SAndroid Build Coastguard Workerclass YamlLoader(Loader):
17*da0073e9SAndroid Build Coastguard Worker    def construct_mapping(self, node, deep=False):  # type: ignore[no-untyped-def]
18*da0073e9SAndroid Build Coastguard Worker        mapping = []
19*da0073e9SAndroid Build Coastguard Worker        for key_node, value_node in node.value:
20*da0073e9SAndroid Build Coastguard Worker            key = self.construct_object(key_node, deep=deep)  # type: ignore[no-untyped-call]
21*da0073e9SAndroid Build Coastguard Worker            assert (
22*da0073e9SAndroid Build Coastguard Worker                key not in mapping
23*da0073e9SAndroid Build Coastguard Worker            ), f"Found a duplicate key in the yaml. key={key}, line={node.start_mark.line}"
24*da0073e9SAndroid Build Coastguard Worker            mapping.append(key)
25*da0073e9SAndroid Build Coastguard Worker        mapping = super().construct_mapping(node, deep=deep)  # type: ignore[no-untyped-call]
26*da0073e9SAndroid Build Coastguard Worker        return mapping
27