def fetch_updates(alert, subject):
    """For a given alert and subject, finds any updated values.

    Returns:
        A list of dictionary mappings of attributes and their updated
        values, including the attribute, the old/new values, and the
        most recent author to update the value. Example:

            [(attribute, {'old_value': value_foo,
                          'new_value': value_bar,
                          'author': author_foo})]
    """
    if not (alert and subject):
        return []
    updated_attrs = []

    old_values = alert.dynamic_properties()
    for attribute in old_values:
        value = subject.get_value(attribute)
        author = subject.get_author_nickname(attribute)
        alert_val = getattr(alert, attribute)
        if value != alert_val:
            updated_attrs.append({'attribute': attribute,
                                  'old_value': alert_val,
                                  'new_value': value,
                                  'author': author})
    return updated_attrs