Tries to fetch a variable from the config and expects it to be a truthy value. This could be a string ("1", "Y")
        or an actual boolean. This is because we use the strtobool function in the case we find a string. The function
        strtobool expects values of the form ("1", "Y", "YES", "true", "True", "t") and so forth for truthy values. The
        variables populated from os env will always be strings, but we should make sure that we set expected boolean
        variables to either truthy/falsy strings conforming to the pattern above or actual boolean values.
        :param key: Variable to look for
        :param optional: Whether to raise ConfigKeyNotFoundError if key was not found.
        :return: bool

def get_boolean(self, key, optional=False):
        """
        Tries to fetch a variable from the config and expects it to be a truthy value. This could be a string ("1", "Y")
        or an actual boolean. This is because we use the strtobool function in the case we find a string. The function
        strtobool expects values of the form ("1", "Y", "YES", "true", "True", "t") and so forth for truthy values. The
        variables populated from os env will always be strings, but we should make sure that we set expected boolean
        variables to either truthy/falsy strings conforming to the pattern above or actual boolean values.
        :param key: Variable to look for
        :param optional: Whether to raise ConfigKeyNotFoundError if key was not found.
        :return: bool
        """
        return self._get_typed_value(key, bool, lambda x: bool(util.strtobool(x)), optional)