blob: 1b4e7215981eb7c563fba68bd74c64776afc914f [file] [log] [blame] [edit]
# Copyright (C) 2024 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from typing import Dict, List, Union
class MapperException(Exception):
# Raised when the Mapper expectation equality fails.
pass
class Mapper:
"""
This will overwrite the value of the metadata field whose key is |dictionary_key|
with the value declared in |write_value|, before the overwrite happens, it
will check if the expected_value matches the value in the metadata field.
Passing None to the |expected_value| will expect that the key does not exist
at all in the metadata.
"""
def __init__(self, dictionary_key: str, expected_value, write_value):
self._key = dictionary_key
self._expected_value = expected_value
self._write_value = write_value
def write(self,
metadata: Dict[str, Union[str, List[str]]]) -> None:
"""
Writes the value |write_value| which is passed in the constructor of
the Mapper to the |metadata| provided. Before the write operation happens,
a check will occur to make sure that the value being overwritten matches
the |expected_value| that was passed in the constructor.
If |None| was passed as |expected_value| then the expectation is that
the |key| should not exist in metadata.keys().
:param metadata: A dictionary whose field with key |key| will be overwritten.
:raises: MapperException if the expectation check has failed.
"""
if self._expected_value is None and self._key in metadata:
# We expected the key not to exist but it existed.
raise MapperException(
f"Expected absence of key `{self._key}` but "
f"found {metadata[self._key]}")
if self._key not in metadata.keys() and self._expected_value:
# We expected a value but the key didn't exist, throw!
raise MapperException(f"Expected presence of key {self._key} but was"
f"not found.")
if self._key in metadata.keys() and metadata[
self._key] != self._expected_value:
# We expected the value to match but it didn't.
raise MapperException(
f"Expected \"{self._expected_value}\" but found"
f" {metadata[self._key]} in the README.chromium")
metadata[self._key] = self._write_value