|
1 |
| -import importlib |
| 1 | +import contextlib |
| 2 | +import importlib.machinery |
| 3 | +import importlib.util |
| 4 | +import os |
| 5 | +import pathlib |
2 | 6 | import sys
|
| 7 | +import tempfile |
| 8 | +from unittest import mock |
3 | 9 |
|
4 | 10 | import matplotlib
|
5 | 11 | import numpy as np
|
6 |
| -import pkg_resources |
7 | 12 |
|
8 | 13 | from pandas import (
|
9 | 14 | DataFrame,
|
@@ -111,22 +116,49 @@ class BackendLoading:
|
111 | 116 | warmup_time = 0
|
112 | 117 |
|
113 | 118 | def setup(self):
|
114 |
| - dist = pkg_resources.get_distribution("pandas") |
115 |
| - spec = importlib.machinery.ModuleSpec("my_backend", None) |
116 |
| - mod = importlib.util.module_from_spec(spec) |
| 119 | + mod = importlib.util.module_from_spec( |
| 120 | + importlib.machinery.ModuleSpec("pandas_dummy_backend", None) |
| 121 | + ) |
117 | 122 | mod.plot = lambda *args, **kwargs: 1
|
118 | 123 |
|
119 |
| - backends = pkg_resources.get_entry_map("pandas") |
120 |
| - my_entrypoint = pkg_resources.EntryPoint( |
121 |
| - "pandas_plotting_backend", mod.__name__, dist=dist |
122 |
| - ) |
123 |
| - backends["pandas_plotting_backends"][mod.__name__] = my_entrypoint |
124 |
| - for i in range(10): |
125 |
| - backends["pandas_plotting_backends"][str(i)] = my_entrypoint |
126 |
| - sys.modules["my_backend"] = mod |
| 124 | + with contextlib.ExitStack() as stack: |
| 125 | + stack.enter_context( |
| 126 | + mock.patch.dict(sys.modules, {"pandas_dummy_backend": mod}) |
| 127 | + ) |
| 128 | + tmp_path = pathlib.Path(stack.enter_context(tempfile.TemporaryDirectory())) |
| 129 | + |
| 130 | + sys.path.insert(0, os.fsdecode(tmp_path)) |
| 131 | + stack.callback(sys.path.remove, os.fsdecode(tmp_path)) |
| 132 | + |
| 133 | + dist_info = tmp_path / "my_backend-0.0.0.dist-info" |
| 134 | + dist_info.mkdir() |
| 135 | + (dist_info / "entry_points.txt").write_bytes( |
| 136 | + b"[pandas_plotting_backends]\n" |
| 137 | + b"my_ep_backend = pandas_dummy_backend\n" |
| 138 | + b"my_ep_backend0 = pandas_dummy_backend\n" |
| 139 | + b"my_ep_backend1 = pandas_dummy_backend\n" |
| 140 | + b"my_ep_backend2 = pandas_dummy_backend\n" |
| 141 | + b"my_ep_backend3 = pandas_dummy_backend\n" |
| 142 | + b"my_ep_backend4 = pandas_dummy_backend\n" |
| 143 | + b"my_ep_backend5 = pandas_dummy_backend\n" |
| 144 | + b"my_ep_backend6 = pandas_dummy_backend\n" |
| 145 | + b"my_ep_backend7 = pandas_dummy_backend\n" |
| 146 | + b"my_ep_backend8 = pandas_dummy_backend\n" |
| 147 | + b"my_ep_backend9 = pandas_dummy_backend\n" |
| 148 | + ) |
| 149 | + self.stack = stack.pop_all() |
| 150 | + |
| 151 | + def teardown(self): |
| 152 | + self.stack.close() |
127 | 153 |
|
128 | 154 | def time_get_plot_backend(self):
|
129 |
| - _get_plot_backend("my_backend") |
| 155 | + # finds the first my_ep_backend |
| 156 | + _get_plot_backend("my_ep_backend") |
| 157 | + |
| 158 | + def time_get_plot_backend_fallback(self): |
| 159 | + # iterates through all the my_ep_backend[0-9] before falling back |
| 160 | + # to importlib.import_module |
| 161 | + _get_plot_backend("pandas_dummy_backend") |
130 | 162 |
|
131 | 163 |
|
132 | 164 | from .pandas_vb_common import setup # noqa: F401 isort:skip
|
0 commit comments