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