Source code for bokeh.util.warnings

#-----------------------------------------------------------------------------
# Copyright (c) 2012 - 2022, Anaconda, Inc., and Bokeh Contributors.
# All rights reserved.
#
# The full license is in the file LICENSE.txt, distributed with this software.
#-----------------------------------------------------------------------------
''' Provide Bokeh-specific warning subclasses.

The primary use of these subclasses to to force them to be unconditionally
displayed to users by default.

'''

#-----------------------------------------------------------------------------
# Boilerplate
#-----------------------------------------------------------------------------
from __future__ import annotations

import logging # isort:skip
log = logging.getLogger(__name__)

#-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------

# Standard library imports
import inspect
import os
import warnings  # lgtm [py/import-and-import-from]
from typing import TYPE_CHECKING

if TYPE_CHECKING:
    from typing_extensions import Type


#-----------------------------------------------------------------------------
# Globals and constants
#-----------------------------------------------------------------------------

__all__ = (
    'BokehDeprecationWarning',
    'BokehUserWarning',
    'find_stack_level',
    'warn',
)

#-----------------------------------------------------------------------------
# General API
#-----------------------------------------------------------------------------

[docs]class BokehDeprecationWarning(DeprecationWarning): ''' A Bokeh-specific ``DeprecationWarning`` subclass. Used to selectively filter Bokeh deprecations for unconditional display. '''
[docs]class BokehUserWarning(UserWarning): ''' A Bokeh-specific ``UserWarning`` subclass. Used to selectively filter Bokeh warnings for unconditional display. '''
def warn(message: str, category: Type[Warning] | None = None, stacklevel: int | None = None) -> None: if stacklevel is None: stacklevel = find_stack_level() warnings.warn(message, category, stacklevel=stacklevel)
[docs]def find_stack_level() -> int: """Find the first place in the stack that is not inside Bokeh. Inspired by: pandas.util._exceptions.find_stack_level """ import bokeh pkg_dir = os.path.dirname(bokeh.__file__) # https://stackoverflow.com/questions/17407119/python-inspect-stack-is-slow frame = inspect.currentframe() n = 0 while frame: fname = inspect.getfile(frame) if fname.startswith(pkg_dir): frame = frame.f_back n += 1 else: break return n
#----------------------------------------------------------------------------- # Dev API #----------------------------------------------------------------------------- #----------------------------------------------------------------------------- # Private API #----------------------------------------------------------------------------- #----------------------------------------------------------------------------- # Code #-----------------------------------------------------------------------------