Raise a warning with best-effort stacklevel adjustment.
()
| 48 | |
| 49 | |
| 50 | def _deprecated() -> None: |
| 51 | """ |
| 52 | Raise a warning with best-effort stacklevel adjustment. |
| 53 | """ |
| 54 | callsite = "" |
| 55 | |
| 56 | with contextlib.suppress(Exception): |
| 57 | f = sys._getframe() |
| 58 | callsite = f.f_back.f_back.f_globals[ # type: ignore[union-attr] |
| 59 | "__name__" |
| 60 | ] |
| 61 | |
| 62 | # Avoid double warnings if TL functions call themselves. |
| 63 | if callsite == "structlog.threadlocal": |
| 64 | return |
| 65 | |
| 66 | stacklevel = 3 |
| 67 | # If a function is used as a decorator, we need to add two stack levels. |
| 68 | # This logic will probably break eventually, but it's not worth any more |
| 69 | # complexity. |
| 70 | if callsite == "contextlib": |
| 71 | stacklevel += 2 |
| 72 | |
| 73 | warnings.warn( |
| 74 | "`structlog.threadlocal` is deprecated, please use " |
| 75 | "`structlog.contextvars` instead.", |
| 76 | DeprecationWarning, |
| 77 | stacklevel=stacklevel, |
| 78 | ) |
| 79 | |
| 80 | |
| 81 | def wrap_dict(dict_class: type[Context]) -> type[Context]: |
no test coverage detected
searching dependent graphs…