Client-facing validate method. Checks to see if the passed int opts
    argument is either a string or a namespace containing the attribute
    'wrapper' and runs validations on it accordingly.

    Note: this function currently does NOT support Unicode/Byte style strings,
    will need to do some work on Python 2/Python 3 compatibililty to add this
    in.

    :param opts: either a string or a namespace with the attribute 'extensions'
    :raises ValueError: if the value passed in is not a string or a namespace
        with the attribute 'wrapper'
    :raises ValidationException: if the wrapper fail validations
    :return: True if wrapper passes the validations

def validate(opts):
    """
    Client-facing validate method. Checks to see if the passed int opts
    argument is either a string or a namespace containing the attribute
    'wrapper' and runs validations on it accordingly.

    Note: this function currently does NOT support Unicode/Byte style strings,
    will need to do some work on Python 2/Python 3 compatibililty to add this
    in.

    :param opts: either a string or a namespace with the attribute 'extensions'
    :raises ValueError: if the value passed in is not a string or a namespace
        with the attribute 'wrapper'
    :raises ValidationException: if the wrapper fail validations
    :return: True if wrapper passes the validations
    """
    if hasattr(opts, 'wrapper') and isinstance(opts.wrapper, str):
        return _validate(opts.wrapper)
    elif isinstance(opts, str):
        return _validate(opts)
    else:
        raise ValueError("Argument passed into wrapper validation must either "
                         "be a single (non-Unicode) string, or a namespace "
                         "with an attribute of 'wrapper'")