Source code for biogeme.deprecated

"""Decorators for deprecated functions and parameters

Michel Bierlaire
Mon Jun 17 20:50:19 2024
"""

import functools
import inspect
import logging
import os
from typing import Any, Callable

from biogeme.exceptions import BiogemeError

logger = logging.getLogger(__name__)

RAISE_EXCEPTION = False

if os.environ.get('TOX_ENV_NAME') is not None and RAISE_EXCEPTION:
    raise Exception(
        "Exception raised during testing with tox. Remove the exception raised by the deprecated functions"
    )


[docs] def deprecated( new_func: Callable[..., Any], ) -> Callable[[Callable[..., Any]], Callable[..., Any]]: """Decorator for deprecated functions. It calls the new version of the function :param new_func: :return: """ def decorator(old_func: Callable[..., Any]) -> Callable[..., Any]: @functools.wraps(old_func) def wrapper(*args, **kwargs) -> Any: msg = f"{old_func.__name__} is deprecated; use {new_func.__name__} instead." if RAISE_EXCEPTION: raise BiogemeError('Deprecated') logger.warning(msg) return new_func(*args, **kwargs) # Directly call the new function wrapper.__deprecated__ = True wrapper.__newname__ = new_func.__name__ return wrapper return decorator
[docs] def deprecated_parameters(obsolete_params: dict[str, str | None]): def decorator(func): func_signature = inspect.signature(func) @functools.wraps(func) def wrapper(*args, **kwargs): processed_kwargs = {} for name, value in list(kwargs.items()): if name in obsolete_params: new_name = obsolete_params[name] if new_name: msg = f"Parameter '{name}' is deprecated; use '{new_name}={value}' instead." logger.warning(msg) processed_kwargs[new_name] = value else: msg = ( f"Parameter '{name}' is deprecated and is ignored. " f"It will be removed in a future version.", ) logger.warning(msg) else: processed_kwargs[name] = value return func(*args, **processed_kwargs) return wrapper return decorator
[docs] def issue_deprecation_warning(text: str) -> None: logger.warning(text)