Source code for toil.lib.compatibility

import functools
import warnings
from typing import Any, Callable, Union


[docs] def deprecated(new_function_name: str) -> Callable[..., Any]: def decorate(func: Callable[..., Any]) -> Callable[..., Any]: @functools.wraps(func) def call(*args: Any, **kwargs: Any) -> Any: warnings.warn(f'WARNING: "{func.__name__}()" is deprecated. Please use "{new_function_name}()" instead.', DeprecationWarning) return func(*args, **kwargs) return call return decorate
[docs] def compat_bytes(s: Union[bytes, str]) -> str: return s.decode('utf-8') if isinstance(s, bytes) else s
# MyPy can't yet support the recursive type we would need to say "we go through # any structure of dicts, tuples, lists, and sets and convert all bytes types # in the keys and values to strings". I also can't work out how to make a # TypeVar T that represents a generic where I could say wer go from T[bytes] -> # T[str].
[docs] def compat_bytes_recursive(data: Any) -> Any: """ Convert a tree of objects over bytes to objects over strings. """ if isinstance(data, dict): # Keyed collection return type(data)((compat_bytes_recursive(i) for i in data.items())) elif isinstance(data, (tuple, list, set)): # Flat collection return type(data)((compat_bytes_recursive(i) for i in data)) elif isinstance(data, bytes): # Leaf bytes return data.decode('utf-8') else: # Leaf non-bytes return data