def descend(path, data):
    """
    Gets a dot separated YAML path and a data structure. Attempt to descend the data structure following the keys
    and return the value associated with the leaf or None on any kind of mismatch or missing data.
    :param path: a dot-separated YAML path. Example: 'level_one.level_two.level_three'
    :param data: a recursive map
    :return: the value associated with the leaf, after recursively navigating the data structure, or None
    """
    if not data or not type(data) is dict:
        return None
    toks = path.split('.')
    if len(toks) > 1:
        return descend('.'.join(toks[1:]), data.get(toks[0]))
    else:
        return data.get(path)