def release_string(d_release):
    """ Produces a string describing a release

    Args:
        d_release (dict): dictonary containing the release data

    Returns:
        (string): representing the release

    Raises:
        (KeyError):
            if the data does not contain the field
            "basic_information".

            >>> release_string({'id': 1}) # doctest: +NORMALIZE_WHITESPACE
            Traceback (most recent call last):
            ...
            KeyError: "Your release 1 doesn't contain the field 'basic_information'"

    Example:
        >>> with open('discogs_finder/tests/test.json', 'r') as f:
        ...    r = json.load(f)
        >>> release_string(r) # doctest: +NORMALIZE_WHITESPACE
        u'Keith Jarrett: Shades (3318191)'
    """
    release_id = d_release['id']
    basics = d_release.get('basic_information', None)
    if not basics:
        raise KeyError("Your release %d doesn't contain"
                       " the field 'basic_information'" % release_id)
    artists = basics.get('artists', None)
    if len(artists):
        j = artists[0]['join']
        if j == ',':
            j = '%s ' % j
        else:
            j = ' %s ' % j
        arts = j.join((a['name'] for a in artists))
    else:
        arts = None

    title = basics.get('title', None)

    return u'{arts}: {title} ({release_id})'.format(arts=arts,
                                                    title=title,
                                                    release_id=release_id)