def __init__(self, logger=Logger()):
     self.logger = logger
     self.error_message_text = {
         "color": "",
         "color_space_in": "",
         "color_space_out": ""
     }
     self.color_space_in = "RGB"
     self.color_space_out = "RGB"
     self.color_in = ['0', '0', '0']
     self.color_out = ['', '', '']
     self.button_convert_state = "enabled"
     self.converter = ColorSpaceConverter()
 def __init__(self):
     self.error_message_text = {"color": "", "color_space_in": "", "color_space_out": ""}
     self.color_space_in = "RGB"
     self.color_space_out = "RGB"
     self.color_in = ['0', '0', '0']
     self.color_out = ['', '', '']
     self.button_convert_state = "enabled"
     self.converter = ColorSpaceConverter()
class ViewModel:
    @staticmethod
    def is_correct(color):
        return map(operator.methodcaller("isdigit"), color) == [True] * 3

    @staticmethod
    def is_in_range(color, lower, upper):
        return len(color) == len(
            [val for val in map(int, color) if lower <= val <= upper])

    def __init__(self, logger=Logger()):
        self.logger = logger
        self.error_message_text = {
            "color": "",
            "color_space_in": "",
            "color_space_out": ""
        }
        self.color_space_in = "RGB"
        self.color_space_out = "RGB"
        self.color_in = ['0', '0', '0']
        self.color_out = ['', '', '']
        self.button_convert_state = "enabled"
        self.converter = ColorSpaceConverter()

    def get_button_convert_state(self):
        return self.button_convert_state

    def set_button_convert_state(self, state):
        self.button_convert_state = state

    def check_color_space(self, color_space, type):
        self.error_message_text[type] = ""
        if color_space not in ColorSpace.SUPPORTED_COLOR_SPACES:
            self.error_message_text[type] = "Unsupported color space."
            self.set_button_convert_state("disabled")

    def check_color(self, color):
        self.error_message_text["color"] = ""
        if ViewModel.is_correct(color):
            if ViewModel.is_in_range(color, 0, 255):
                self.set_button_convert_state("enabled")
                return
            else:
                self.error_message_text[
                    "color"] = "Input values should be in range 0-255."
        else:
            self.error_message_text["color"] = "Incorrect values."

        self.set_button_convert_state("disabled")

    def set_color_space_in(self, color_space):
        self.color_space_in = color_space
        self.check_color_space(color_space, "color_space_in")
        self.logger.log("Input color space: " + str(color_space))

    def set_color_space_out(self, color_space):
        self.color_space_out = color_space
        self.check_color_space(color_space, "color_space_out")
        self.logger.log("Output color space: " + str(self.color_space_out))

    def set_color_in(self, color):
        self.color_in = color
        self.check_color(color)
        self.logger.log("Input color: " + str(color))

    def get_color_space_out(self):
        return self.color_space_out

    def get_color_space_in(self):
        return self.color_space_in

    def get_color_out(self):
        return self.color_out

    def get_color_in(self):
        return self.color_in

    def convert(self):
        color = Color(ColorSpace(self.color_space_in),
                      np.array(map(int, self.color_in)))
        converted_color = self.converter.convert(
            color, ColorSpace(self.color_space_out))
        self.color_out = map(str, converted_color.value.tolist())
        self.logger.log("Input color: " + str(color) + " --> " +
                        "Output color: " + str(converted_color))

    def get_error_message(self):
        return "".join(self.error_message_text.values())
class ViewModel:
    @staticmethod
    def is_correct(color):
        return map(operator.methodcaller("isdigit"), color) == [True] * 3

    @staticmethod
    def is_in_range(color, lower, upper):
        return len(color) == len([val for val in map(int, color) if lower <= val <= upper])

    def __init__(self):
        self.error_message_text = {"color": "", "color_space_in": "", "color_space_out": ""}
        self.color_space_in = "RGB"
        self.color_space_out = "RGB"
        self.color_in = ['0', '0', '0']
        self.color_out = ['', '', '']
        self.button_convert_state = "enabled"
        self.converter = ColorSpaceConverter()

    def get_button_convert_state(self):
        return self.button_convert_state

    def set_button_convert_state(self, state):
        self.button_convert_state = state

    def check_color_space(self, color_space, type):
        self.error_message_text[type] = ""
        if color_space not in ColorSpace.SUPPORTED_COLOR_SPACES:
            self.error_message_text[type] = "Unsupported color space."
            self.set_button_convert_state("disabled")

    def check_color(self, color):
        self.error_message_text["color"] = ""
        if ViewModel.is_correct(color):
            if ViewModel.is_in_range(color, 0, 255):
                self.set_button_convert_state("enabled")
                return
            else:
                self.error_message_text["color"] = "Input values should be in range 0-255."
        else:
            self.error_message_text["color"] = "Incorrect values."

        self.set_button_convert_state("disabled")

    def set_color_space_in(self, color_space):
        self.color_space_in = color_space
        self.check_color_space(color_space, "color_space_in")

    def set_color_space_out(self, color_space):
        self.color_space_out = color_space
        self.check_color_space(color_space, "color_space_out")

    def set_color_in(self, color):
        self.color_in = color
        self.check_color(color)

    def get_color_space_out(self):
        return self.color_space_out

    def get_color_space_in(self):
        return self.color_space_in

    def get_color_out(self):
        return self.color_out

    def get_color_in(self):
        return self.color_in

    def convert(self):
        color = Color(ColorSpace(self.color_space_in), np.array(map(int, self.color_in)))
        converted_color = self.converter.convert(color, ColorSpace(self.color_space_out))
        self.color_out = map(str, converted_color.value.tolist())

    def get_error_message(self):
        return "".join(self.error_message_text.values())