This function return the right configuration for the inspire_merge
    function in according to the given sources. Both parameters can not be None.

    Params:
        head(dict): the HEAD record
        update(dict): the UPDATE record
        head_source(string): the source of the HEAD record

    Returns:
        MergerConfigurationOperations: an object containing
        the rules needed to merge HEAD and UPDATE

def get_configuration(head, update, head_source=None):
    """
    This function return the right configuration for the inspire_merge
    function in according to the given sources. Both parameters can not be None.

    Params:
        head(dict): the HEAD record
        update(dict): the UPDATE record
        head_source(string): the source of the HEAD record

    Returns:
        MergerConfigurationOperations: an object containing
        the rules needed to merge HEAD and UPDATE
    """
    head_source = (head_source or get_head_source(head))
    update_source = get_acquisition_source(update)

    if not is_arxiv_and_publisher(head_source, update_source) and is_manual_merge(head, update):
        return ManualMergeOperations

    if head_source == 'arxiv':
        if update_source == 'arxiv':
            return ArxivOnArxivOperations
        else:
            return PublisherOnArxivOperations
    else:
        if update_source == 'arxiv':
            return ArxivOnPublisherOperations
        else:
            return PublisherOnPublisherOperations