"""Logic for applying validations to an image.""" from PIL import Image from constants import errors from constants import image_standards from src import image_validator class InvalidImageError(Exception): """Exception class for image validation errors.""" def __init__(self, message, code): """Init.""" Exception.__init__(self, message) self._code = code @property def code(self): """Error code.""" return self._code def validate_image( *, file_contents ): """Validate the contents of an image. Args: file_contents (io.BytesIO): Image file contents. Returns: bool: True if validation is successful. Raises: Exception: If a validation fails. """ file_contents.seek(0) image = Image.open(file_contents) if not image_validator.validate_mode(image.mode): raise InvalidImageError( message=errors.ERROR_MESSAGES[errors.IMAGE_INVALID_MODE_CODE].format(mode=image.mode), code=errors.IMAGE_INVALID_MODE_CODE ) if not image_validator.validate_is_opaque(image): raise InvalidImageError( message=errors.ERROR_MESSAGES[errors.IMAGE_NOT_OPAQUE_CODE], code=errors.IMAGE_NOT_OPAQUE_CODE ) width, height = image.size validation_result = image_validator.validate_dimensions( width=width, height=height, ) if validation_result != image_standards.VALID_DIMENSIONS_CODE: raise InvalidImageError( message=errors.ERROR_MESSAGES[validation_result], code=validation_result ) return True