def variantCombinations(items):
    """ Calculates variant combinations for given list of options. Each item in the items list represents
    unique value with it's variants.

    :param list items: list of values to be combined

    >>> c = variantCombinations([["1.1", "1.2"], ["2.1", "2.2"], ["3.1", "3.2"]])
    >>> len(c)
    8
    >>> for combination in c:print combination
    ['1.1', '2.1', '3.1']
    ['1.1', '2.1', '3.2']
    ['1.1', '2.2', '3.1']
    ['1.1', '2.2', '3.2']
    ['1.2', '2.1', '3.1']
    ['1.2', '2.1', '3.2']
    ['1.2', '2.2', '3.1']
    ['1.2', '2.2', '3.2']

    """
    assert isinstance(items, list) and list

    if len(items) == 1:
        result = items[0]
    else:
        result = []
        subItems = variantCombinations(items[1:])
        for masterItem in items[0]:
            for subItem in subItems:
                if isinstance(subItem, list):
                    item = [masterItem]
                    item.extend(subItem)
                    result.append(item)
                else:
                    result.append([masterItem, subItem])

    return result