Source code for scilpy.io.deprecator

# -*- coding: utf-8 -*-

from dipy.utils.deprecator import cmp_pkg_version, ExpiredDeprecationError
from functools import wraps
from packaging.version import parse
import warnings

from scilpy import version


[docs] class ScilpyExpiredDeprecation(ExpiredDeprecationError): pass
DEFAULT_SEPARATOR = "=" DEFAULT_DEPRECATION_WINDOW = 2 # Wait for 2 minor releases before rasing error DEPRECATION_HEADER = """ !!! WARNING !!! THIS SCRIPT IS DEPRECATED !!! """ DEPRECATION_FOOTER = """ AS OF VERSION {EXP_VERSION}, CALLING THIS SCRIPT WILL RAISE {EXP_ERROR} """ EXPIRATION_FOOTER = """ SCRIPT {SCRIPT_NAME} HAS BEEN REMOVED SINCE {EXP_VERSION} """ SEPARATOR_BLOCK = """ {UP_SEPARATOR} {MESSAGE} {LOW_SEPARATOR} """ def _block(_msg, _sep_len=80): _sep = f"{DEFAULT_SEPARATOR * _sep_len}" return SEPARATOR_BLOCK.format( UP_SEPARATOR=_sep, MESSAGE=_msg, LOW_SEPARATOR=_sep) def _header(_msg, _sep_len=80): _sep = f"{DEFAULT_SEPARATOR * _sep_len}" return SEPARATOR_BLOCK.format( UP_SEPARATOR=_sep, MESSAGE=_msg, LOW_SEPARATOR="").rstrip("\n") def _raise_warning(header, footer, func, *args, **kwargs): warnings.simplefilter('always', DeprecationWarning) warnings.warn(header, DeprecationWarning, stacklevel=4) try: return func(*args, **kwargs) finally: print("") warnings.warn(footer, DeprecationWarning, stacklevel=4)
[docs] def deprecate_script(script, message, from_version): from_version = parse(from_version) expiration_minor = from_version.minor + DEFAULT_DEPRECATION_WINDOW expiration_version = f"{from_version.major}.{expiration_minor}" current_version = f"{version._version_major}.{version._version_minor}" def _deprecation_decorator(func): @wraps(func) def _wrapper(*args, **kwargs): if cmp_pkg_version(current_version, expiration_version) >= 0: footer = f"""\ {message} {EXPIRATION_FOOTER.format( SCRIPT_NAME=script, EXP_VERSION=expiration_version)}\ """ raise ScilpyExpiredDeprecation(f"""\ {_header(DEPRECATION_HEADER)} {_block(footer)} """) else: header = DEPRECATION_HEADER footer = f"""\ {message} {DEPRECATION_FOOTER.format( EXP_VERSION=expiration_version, EXP_ERROR=ScilpyExpiredDeprecation)}\ """ msg_length = max( len(_l) for _l in (header + footer).splitlines()) return _raise_warning(_block(header, msg_length), _block(footer, msg_length), func, *args, **kwargs) return _wrapper return _deprecation_decorator