>>> make_url("https://host/api", "users", "user-name", "projects", token="api_token")
    'https://host/api/users/user-name/projects?token=api_token'
    >>> make_url("https://host/api", "users", "user-name", "projects/", token="api_token")
    'https://host/api/users/user-name/projects/?token=api_token'
    >>> make_url("https://host/api", "users", "user-name", "projects", "/", token="api_token")
    'https://host/api/users/user-name/projects/?token=api_token'
    >>> make_url("https://host/api", "users", "user-name", "projects", [("token", "api_token"), ("aaa", "bbb")])
    'https://host/api/users/user-name/projects?token=api_token&aaa=bbb'
    >>> make_url("https://host/api", "users", "user-name", "projects/", [("token", "api_token"), ("aaa", "bbb")])
    'https://host/api/users/user-name/projects/?token=api_token&aaa=bbb'
    >>> make_url("https://host/api", "users", "user-name", "projects", [("token", "api_token"), ("aaa", "bbb")], other="value")
    'https://host/api/users/user-name/projects?token=api_token&aaa=bbb&other=value'
    >>> make_url("https://host/api", "users", "user-name", "projects/", [("token", "api_token"), ("aaa", "bbb")], other="value")
    'https://host/api/users/user-name/projects/?token=api_token&aaa=bbb&other=value'
    >>> make_url("https://host/api")
    'https://host/api'
    >>> make_url("https://host/api/")
    'https://host/api/'
    >>> make_url("https://host/api", "users", "user-name", "projects")
    'https://host/api/users/user-name/projects'
    >>> make_url("https://host/api", "users", "user-name", "projects/")
    'https://host/api/users/user-name/projects/'
    >>> make_url("https://host/api", "users", "user-name", "projects", 12345)
    'https://host/api/users/user-name/projects/12345'
    >>> make_url("https://host/api", "users", "user-name", "projects", 12345, "/")
    'https://host/api/users/user-name/projects/12345/'

def make_url(*args, **kwargs):
    """
    >>> make_url("https://host/api", "users", "user-name", "projects", token="api_token")
    'https://host/api/users/user-name/projects?token=api_token'
    >>> make_url("https://host/api", "users", "user-name", "projects/", token="api_token")
    'https://host/api/users/user-name/projects/?token=api_token'
    >>> make_url("https://host/api", "users", "user-name", "projects", "/", token="api_token")
    'https://host/api/users/user-name/projects/?token=api_token'
    >>> make_url("https://host/api", "users", "user-name", "projects", [("token", "api_token"), ("aaa", "bbb")])
    'https://host/api/users/user-name/projects?token=api_token&aaa=bbb'
    >>> make_url("https://host/api", "users", "user-name", "projects/", [("token", "api_token"), ("aaa", "bbb")])
    'https://host/api/users/user-name/projects/?token=api_token&aaa=bbb'
    >>> make_url("https://host/api", "users", "user-name", "projects", [("token", "api_token"), ("aaa", "bbb")], other="value")
    'https://host/api/users/user-name/projects?token=api_token&aaa=bbb&other=value'
    >>> make_url("https://host/api", "users", "user-name", "projects/", [("token", "api_token"), ("aaa", "bbb")], other="value")
    'https://host/api/users/user-name/projects/?token=api_token&aaa=bbb&other=value'
    >>> make_url("https://host/api")
    'https://host/api'
    >>> make_url("https://host/api/")
    'https://host/api/'
    >>> make_url("https://host/api", "users", "user-name", "projects")
    'https://host/api/users/user-name/projects'
    >>> make_url("https://host/api", "users", "user-name", "projects/")
    'https://host/api/users/user-name/projects/'
    >>> make_url("https://host/api", "users", "user-name", "projects", 12345)
    'https://host/api/users/user-name/projects/12345'
    >>> make_url("https://host/api", "users", "user-name", "projects", 12345, "/")
    'https://host/api/users/user-name/projects/12345/'
    """
    if len(args) == 1 and len(kwargs) == 0:
        # Return a single string unaltered
        return args[0]

    temp_args = unpack_args(*args)
    temp_arg_count = len(temp_args)

    # Handle list of tuples as last of array arguments
    if temp_arg_count > 1 and isinstance(temp_args[-1], list):
        path_fragments = temp_args[0 : -1]
        query_string = urllib.urlencode(temp_args[-1] + kwargs.items())
    elif temp_arg_count > 1 and isinstance(temp_args[-1], dict):
        path_fragments = temp_args[0 : -1]
        query_string = urllib.urlencode(temp_args[-1].items() + kwargs.items())
    else:
        path_fragments = temp_args
        query_string = urllib.urlencode(kwargs)

    path_fragments = map(str, path_fragments)
    has_trailing_slash = path_fragments[-1].endswith("/")
    path_fragments = filter(lambda f: len(f) > 0, map(lambda f: f.strip("/"), path_fragments))
    base_url = "/".join(path_fragments)

    if has_trailing_slash:
        base_url += "/"

    parts = list(urlparse.urlparse(base_url))
    parts[4] = query_string
    return urlparse.urlunparse(parts)