Client-facing validate method. Checks to see if the passed in opts
    argument is either a list or a namespace containing the attribute
    'extensions' and runs validations on it accordingly. If opts is neither
    of those things, this will raise a ValueError

    :param opts: either a list of strings or a namespace with the attribute
        'extensions'
    :raises ValueError: if the value passed in is not a list or a namespace
        with the attribute 'extensions'
    :raises ValidationException: if the extensions fail validations
    :return: True if extensions pass the validations

def validate(opts):
    """
    Client-facing validate method. Checks to see if the passed in opts
    argument is either a list or a namespace containing the attribute
    'extensions' and runs validations on it accordingly. If opts is neither
    of those things, this will raise a ValueError

    :param opts: either a list of strings or a namespace with the attribute
        'extensions'
    :raises ValueError: if the value passed in is not a list or a namespace
        with the attribute 'extensions'
    :raises ValidationException: if the extensions fail validations
    :return: True if extensions pass the validations
    """
    if hasattr(opts, 'extensions'):
        return _validate(opts.extensions)
    elif isinstance(opts, list):
        return _validate(opts)
    else:
        raise ValueError("Value passed into extension validation must either "
                         "be a list of strings or a namespace with an "
                         "attribute of 'extensions'")