예제 #1
0
def default_fused_keys_renamer(keys, max_fused_key_length=120):
    """Create new keys for ``fuse`` tasks.

    The optional parameter `max_fused_key_length` is used to limit the maximum string length for each renamed key. If
    this parameter is set to `None`, there is no limit.
    """
    it = reversed(keys)
    first_key = next(it)
    typ = type(first_key)

    if max_fused_key_length:  # Take into account size of hash suffix
        max_fused_key_length -= 5

    def _enforce_max_key_limit(key_name):
        if max_fused_key_length and len(key_name) > max_fused_key_length:
            name_hash = f"{hash(key_name):x}"[:4]
            key_name = f"{key_name[:max_fused_key_length]}-{name_hash}"
        return key_name

    if typ is str:
        first_name = key_split(first_key)
        names = {key_split(k) for k in it}
        names.discard(first_name)
        names = sorted(names)
        names.append(first_key)
        concatenated_name = "-".join(names)
        return _enforce_max_key_limit(concatenated_name)
    if typ is tuple and len(first_key) > 0 and isinstance(first_key[0], str):
        first_name = key_split(first_key)
        names = {key_split(k) for k in it}
        names.discard(first_name)
        names = sorted(names)
        names.append(first_key[0])
        concatenated_name = "-".join(names)
        return (_enforce_max_key_limit(concatenated_name), ) + first_key[1:]
예제 #2
0
def default_fused_linear_keys_renamer(keys):
    """Create new keys for fused tasks."""
    typ = type(keys[0])
    if typ is str:
        names = [key_split(x) for x in keys[:0:-1]]
        names.append(keys[0])
        return "-".join(names)
    if typ is tuple and len(keys[0]) > 0 and isinstance(keys[0][0], str):
        names = [key_split(x) for x in keys[:0:-1]]
        names.append(keys[0][0])
        return ("-".join(names), ) + keys[0][1:]
    return None