|
12 | 12 |
|
13 | 13 | import functools
|
14 | 14 | import itertools
|
| 15 | +import pathlib |
15 | 16 | import re
|
16 | 17 | import sys
|
17 | 18 | import warnings
|
@@ -366,16 +367,25 @@ def warn_external(message, category=None):
|
366 | 367 | warnings.warn`` (or ``functools.partial(warnings.warn, stacklevel=2)``,
|
367 | 368 | etc.).
|
368 | 369 | """
|
369 |
| - frame = sys._getframe() |
370 |
| - for stacklevel in itertools.count(1): |
371 |
| - if frame is None: |
372 |
| - # when called in embedded context may hit frame is None |
373 |
| - break |
374 |
| - if not re.match(r"\A(matplotlib|mpl_toolkits)(\Z|\.(?!tests\.))", |
375 |
| - # Work around sphinx-gallery not setting __name__. |
376 |
| - frame.f_globals.get("__name__", "")): |
377 |
| - break |
378 |
| - frame = frame.f_back |
379 |
| - # preemptively break reference cycle between locals and the frame |
380 |
| - del frame |
381 |
| - warnings.warn(message, category, stacklevel) |
| 370 | + kwargs = {} |
| 371 | + if sys.version_info[:2] >= (3, 12): |
| 372 | + # Go to Python's `site-packages` or `lib` from an editable install. |
| 373 | + basedir = pathlib.Path(__file__).parents[2] |
| 374 | + kwargs['skip_file_prefixes'] = (str(basedir / 'matplotlib'), |
| 375 | + str(basedir / 'mpl_toolkits')) |
| 376 | + else: |
| 377 | + frame = sys._getframe() |
| 378 | + for stacklevel in itertools.count(1): |
| 379 | + if frame is None: |
| 380 | + # when called in embedded context may hit frame is None |
| 381 | + kwargs['stacklevel'] = stacklevel |
| 382 | + break |
| 383 | + if not re.match(r"\A(matplotlib|mpl_toolkits)(\Z|\.(?!tests\.))", |
| 384 | + # Work around sphinx-gallery not setting __name__. |
| 385 | + frame.f_globals.get("__name__", "")): |
| 386 | + kwargs['stacklevel'] = stacklevel |
| 387 | + break |
| 388 | + frame = frame.f_back |
| 389 | + # preemptively break reference cycle between locals and the frame |
| 390 | + del frame |
| 391 | + warnings.warn(message, category, **kwargs) |
0 commit comments