babelplot 2025.1__tar.gz → 2025.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. {babelplot-2025.1 → babelplot-2025.3}/PKG-INFO +14 -2
  2. {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/__init__.py +13 -0
  3. {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/backend/catalog/bokeh_.py +10 -5
  4. {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/backend/catalog/matplotlib_.py +32 -11
  5. {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/backend/catalog/plotly_.py +10 -5
  6. {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/backend/catalog/vedo_.py +10 -5
  7. {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/backend/helper/validation.py +2 -2
  8. {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/main.py +2 -2
  9. {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/specification/plot.py +10 -6
  10. {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/type/base.py +7 -5
  11. {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/type/figure.py +4 -4
  12. {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/type/frame.py +13 -3
  13. {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/version.py +1 -1
  14. {babelplot-2025.1 → babelplot-2025.3}/package/babelplot.egg-info/PKG-INFO +14 -2
  15. {babelplot-2025.1 → babelplot-2025.3}/MANIFEST.in +0 -0
  16. {babelplot-2025.1 → babelplot-2025.3}/README-COPYRIGHT-utf8.txt +0 -0
  17. {babelplot-2025.1 → babelplot-2025.3}/README-LICENCE-utf8.txt +0 -0
  18. {babelplot-2025.1 → babelplot-2025.3}/README.rst +0 -0
  19. {babelplot-2025.1 → babelplot-2025.3}/documentation/wiki/description.asciidoc +0 -0
  20. {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/backend/helper/creation.py +0 -0
  21. {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/backend/specification/backend.py +0 -0
  22. {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/backend/specification/runtime.py +0 -0
  23. {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/constant/backend.py +0 -0
  24. {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/constant/project.py +0 -0
  25. {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/extension/enum_.py +0 -0
  26. {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/help.py +0 -0
  27. {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/specification/dimension.py +0 -0
  28. {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/task/show_pyqt6.py +0 -0
  29. {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/type/plot.py +0 -0
  30. {babelplot-2025.1 → babelplot-2025.3}/package/babelplot.egg-info/SOURCES.txt +0 -0
  31. {babelplot-2025.1 → babelplot-2025.3}/package/babelplot.egg-info/dependency_links.txt +0 -0
  32. {babelplot-2025.1 → babelplot-2025.3}/package/babelplot.egg-info/requires.txt +0 -0
  33. {babelplot-2025.1 → babelplot-2025.3}/package/babelplot.egg-info/top_level.txt +0 -0
  34. {babelplot-2025.1 → babelplot-2025.3}/pyproject.toml +0 -0
  35. {babelplot-2025.1 → babelplot-2025.3}/requirements.txt +0 -0
  36. {babelplot-2025.1 → babelplot-2025.3}/setup.cfg +0 -0
  37. {babelplot-2025.1 → babelplot-2025.3}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: babelplot
3
- Version: 2025.1
3
+ Version: 2025.3
4
4
  Summary: A Meta Plotting Library That Speaks Several Backends
5
5
  Home-page: https://src.koda.cnrs.fr/eric.debreuve/babelplot/
6
6
  Author: Eric Debreuve
@@ -19,6 +19,18 @@ Description-Content-Type: text/x-rst
19
19
  Requires-Dist: numpy
20
20
  Requires-Dist: PyQt6
21
21
  Requires-Dist: scikit-image
22
+ Dynamic: author
23
+ Dynamic: author-email
24
+ Dynamic: classifier
25
+ Dynamic: description
26
+ Dynamic: description-content-type
27
+ Dynamic: home-page
28
+ Dynamic: keywords
29
+ Dynamic: license
30
+ Dynamic: project-url
31
+ Dynamic: requires-dist
32
+ Dynamic: requires-python
33
+ Dynamic: summary
22
34
 
23
35
  ..
24
36
  Copyright CNRS/Inria/UniCA
@@ -4,6 +4,19 @@ Contributor(s): Eric Debreuve (eric.debreuve@cnrs.fr) since 2022
4
4
  SEE COPYRIGHT NOTICE BELOW
5
5
  """
6
6
 
7
+ try:
8
+ from beartype.claw import beartype_this_package # noqa
9
+ except ModuleNotFoundError:
10
+ pass
11
+ else:
12
+ import site
13
+ from pathlib import Path as path_t
14
+
15
+ paths = site.getsitepackages() + [site.getusersitepackages()]
16
+ folder = path_t(__file__).parent
17
+ if folder not in paths:
18
+ beartype_this_package()
19
+
7
20
  from babelplot.backend.specification.backend import backend_e
8
21
  from babelplot.main import NewFigure, NewPlot
9
22
  from babelplot.specification.plot import plot_e
@@ -33,11 +33,16 @@ backend_frame_t = backend_figure_t
33
33
  def _NewPlot(
34
34
  frame: backend_frame_t,
35
35
  type_: plot_type_h | type[backend_plot_t],
36
- plot_function: h.Callable | None,
36
+ plot_function: (
37
+ type[backend_plot_t] | h.Callable[..., backend_plot_t | h.Any] | None
38
+ ),
37
39
  *args,
38
40
  title: str | None = None, # If _, then it is swallowed by kwargs!
39
41
  **kwargs,
40
- ) -> tuple[backend_plot_t, type[backend_plot_t]]:
42
+ ) -> tuple[
43
+ backend_plot_t | h.Any,
44
+ type[backend_plot_t] | h.Callable[..., backend_plot_t | h.Any],
45
+ ]:
41
46
  """"""
42
47
  if plot_function is None:
43
48
  if hasattr(backend_frame_t, type_):
@@ -88,15 +93,15 @@ def _AsHTML(figure: figure_t, /) -> str:
88
93
 
89
94
 
90
95
  # noinspection PyTypeChecker
91
- plot_t: base_plot_t = type("plot_t", (base_plot_t,), {})
96
+ plot_t: type[base_plot_t] = type("plot_t", (base_plot_t,), {})
92
97
  # noinspection PyTypeChecker
93
- frame_t: base_frame_t = type(
98
+ frame_t: type[base_frame_t] = type(
94
99
  "frame_t",
95
100
  (base_frame_t,),
96
101
  {"plot_class": plot_t, "NewBackendPlot": staticmethod(_NewPlot)},
97
102
  )
98
103
  # noinspection PyTypeChecker
99
- figure_t: base_figure_t = type(
104
+ figure_t: type[base_figure_t] = type(
100
105
  "figure_t",
101
106
  (base_figure_t,),
102
107
  {
@@ -18,7 +18,7 @@ from babelplot.type.base import backend_element_h, backend_plot_h
18
18
  from babelplot.type.figure import figure_t as base_figure_t
19
19
  from babelplot.type.frame import frame_t as base_frame_t
20
20
  from babelplot.type.plot import plot_t as base_plot_t
21
- from logger_36 import LOGGER
21
+ from logger_36 import L
22
22
  from matplotlib.artist import Artist as backend_plot_t # noqa
23
23
  from matplotlib.container import Container as backend_plots_t # noqa
24
24
  from matplotlib.gridspec import GridSpec as grid_spec_t # noqa
@@ -40,12 +40,17 @@ backend_frame_h = backend_frame_2d_t | backend_frame_3d_t
40
40
 
41
41
  def _NewPlot(
42
42
  frame: backend_frame_h,
43
- type_: plot_type_h | type[backend_plot_h],
44
- plot_function: h.Callable | None,
43
+ type_: plot_type_h | type[backend_plot_t],
44
+ plot_function: (
45
+ type[backend_plot_t] | h.Callable[..., backend_plot_t | h.Any] | None
46
+ ),
45
47
  *args,
46
48
  title: str | None = None, # /!\ If _, then it is swallowed by kwargs!
47
49
  **kwargs,
48
- ) -> tuple[h.Any, h.Callable]:
50
+ ) -> tuple[
51
+ backend_plot_t | h.Any,
52
+ type[backend_plot_t] | h.Callable[..., backend_plot_t | h.Any],
53
+ ]:
49
54
  """"""
50
55
  if plot_function is None:
51
56
  # Next, priority is given to 2-D plots... which might be a problem if a 2-D and
@@ -136,8 +141,19 @@ def _DefaultProperties(type_: h.Callable, /) -> dict[str, h.Any]:
136
141
  return {_key.replace(f"{name}.", ""): _vle for _key, _vle in properties.items()}
137
142
 
138
143
 
139
- def _SetProperty(element: backend_element_h, name: str, value: h.Any, /) -> None:
144
+ def _SetProperty(
145
+ element: backend_element_h | h.Sequence[backend_element_h],
146
+ name: str,
147
+ value: h.Any,
148
+ /,
149
+ ) -> None:
140
150
  """"""
151
+ if isinstance(element, h.Sequence):
152
+ elements = element
153
+ for element in elements:
154
+ _SetProperty(element, name, value)
155
+ return
156
+
141
157
  if name == "marker":
142
158
  new_marker = marker_style_t(value)
143
159
  element.set_paths((new_marker.get_path(),))
@@ -146,18 +162,23 @@ def _SetProperty(element: backend_element_h, name: str, value: h.Any, /) -> None
146
162
  try:
147
163
  pypl.setp(element, **property_)
148
164
  except AttributeError:
149
- LOGGER.error(
165
+ L.error(
150
166
  f'Property "{name}": Invalid property for element of type "{type(element).__name__}"'
151
167
  )
152
168
 
153
169
 
154
- def _Property(element: backend_element_h, name: str, /) -> h.Any:
170
+ def _Property(
171
+ element: backend_element_h | h.Sequence[backend_element_h], name: str, /
172
+ ) -> h.Any:
155
173
  """"""
174
+ if isinstance(element, h.Sequence):
175
+ return _Property(element[0], name)
176
+
156
177
  try:
157
178
  output = pypl.getp(element, property=name)
158
179
  except AttributeError:
159
180
  output = None
160
- LOGGER.error(
181
+ L.error(
161
182
  f'Property "{name}": Invalid property for element of type "{type(element).__name__}"'
162
183
  )
163
184
 
@@ -165,7 +186,7 @@ def _Property(element: backend_element_h, name: str, /) -> h.Any:
165
186
 
166
187
 
167
188
  # noinspection PyTypeChecker
168
- plot_t: base_plot_t = type(
189
+ plot_t: type[base_plot_t] = type(
169
190
  "plot_t",
170
191
  (base_plot_t,),
171
192
  {
@@ -175,7 +196,7 @@ plot_t: base_plot_t = type(
175
196
  },
176
197
  )
177
198
  # noinspection PyTypeChecker
178
- frame_t: base_frame_t = type(
199
+ frame_t: type[base_frame_t] = type(
179
200
  "frame_t",
180
201
  (base_frame_t,),
181
202
  {
@@ -186,7 +207,7 @@ frame_t: base_frame_t = type(
186
207
  },
187
208
  )
188
209
  # noinspection PyTypeChecker
189
- figure_t: base_figure_t = type(
210
+ figure_t: type[base_figure_t] = type(
190
211
  "figure_t",
191
212
  (base_figure_t,),
192
213
  {
@@ -47,11 +47,16 @@ _FIGURE_CONFIG = {
47
47
  def _NewPlot(
48
48
  _: backend_frame_h,
49
49
  type_: plot_type_h | type[backend_plot_t],
50
- plot_function: h.Callable | None,
50
+ plot_function: (
51
+ type[backend_plot_t] | h.Callable[..., backend_plot_t | h.Any] | None
52
+ ),
51
53
  *args,
52
54
  title: str | None = None, # If _, then it is swallowed by kwargs!
53
55
  **kwargs,
54
- ) -> tuple[backend_plot_t, type[backend_plot_t]]:
56
+ ) -> tuple[
57
+ backend_plot_t | h.Any,
58
+ type[backend_plot_t] | h.Callable[..., backend_plot_t | h.Any],
59
+ ]:
55
60
  """"""
56
61
  if plot_function is None:
57
62
  if hasattr(plly, type_):
@@ -125,15 +130,15 @@ def _AsHTML(figure: figure_t, /) -> str:
125
130
 
126
131
 
127
132
  # noinspection PyTypeChecker
128
- plot_t: base_plot_t = type("plot_t", (base_plot_t,), {})
133
+ plot_t: type[base_plot_t] = type("plot_t", (base_plot_t,), {})
129
134
  # noinspection PyTypeChecker
130
- frame_t: base_frame_t = type(
135
+ frame_t: type[base_frame_t] = type(
131
136
  "frame_t",
132
137
  (base_frame_t,),
133
138
  {"plot_class": plot_t, "NewBackendPlot": staticmethod(_NewPlot)},
134
139
  )
135
140
  # noinspection PyTypeChecker
136
- figure_t: base_figure_t = type(
141
+ figure_t: type[base_figure_t] = type(
137
142
  "figure_t",
138
143
  (base_figure_t,),
139
144
  {
@@ -30,11 +30,16 @@ backend_frame_t = backend_figure_t
30
30
  def _NewPlot(
31
31
  frame: backend_frame_t,
32
32
  type_: plot_type_h | type[backend_plot_h],
33
- plot_function: h.Callable | None,
33
+ plot_function: (
34
+ type[backend_plot_h] | h.Callable[..., backend_plot_h | h.Any] | None
35
+ ),
34
36
  *args,
35
37
  title: str | None = None, # If _, then it is swallowed by kwargs!
36
38
  **kwargs,
37
- ) -> tuple[backend_plot_h, type[backend_plot_h]]:
39
+ ) -> tuple[
40
+ backend_plot_h | h.Any,
41
+ type[backend_plot_h] | h.Callable[..., backend_plot_h | h.Any],
42
+ ]:
38
43
  """"""
39
44
  if plot_function is None:
40
45
  if hasattr(vedo, type_):
@@ -70,15 +75,15 @@ def _Show(
70
75
 
71
76
 
72
77
  # noinspection PyTypeChecker
73
- plot_t: base_plot_t = type("plot_t", (base_plot_t,), {})
78
+ plot_t: type[base_plot_t] = type("plot_t", (base_plot_t,), {})
74
79
  # noinspection PyTypeChecker
75
- frame_t: base_frame_t = type(
80
+ frame_t: type[base_frame_t] = type(
76
81
  "frame_t",
77
82
  (base_frame_t,),
78
83
  {"plot_class": plot_t, "NewBackendPlot": staticmethod(_NewPlot)},
79
84
  )
80
85
  # noinspection PyTypeChecker
81
- figure_t: base_figure_t = type(
86
+ figure_t: type[base_figure_t] = type(
82
87
  "figure_t",
83
88
  (base_figure_t,),
84
89
  {
@@ -14,7 +14,7 @@ from types import FunctionType as function_type_t
14
14
  from types import ModuleType as module_type_t
15
15
 
16
16
  from babelplot.specification.plot import plot_e
17
- from logger_36 import LOGGER
17
+ from logger_36 import L
18
18
 
19
19
  py_module_h = h.TypeVar("py_module_h", bound=str) # E.g. module.submodule.
20
20
  module_path_t = str
@@ -73,7 +73,7 @@ def DefinedBackendMethods(
73
73
  output = {}
74
74
 
75
75
  if not hasattr(imported, target_class):
76
- LOGGER.error(f'{module}: Does not define a "{target_class}" class')
76
+ L.error(f'{module}: Does not define a "{target_class}" class')
77
77
  return {}
78
78
 
79
79
  target_class = getattr(imported, target_class)
@@ -18,7 +18,7 @@ from babelplot.type.base import backend_plot_h
18
18
  from babelplot.type.figure import figure_t
19
19
  from babelplot.type.frame import frame_t
20
20
  from babelplot.type.plot import plot_t
21
- from logger_36 import LOGGER
21
+ from logger_36 import L
22
22
 
23
23
 
24
24
  def NewFigure(
@@ -48,7 +48,7 @@ def NewFigure(
48
48
  try:
49
49
  module = mprt.import_module(f"{BACKEND_FOLDER_PY}.{pbe.value}_")
50
50
  except ModuleNotFoundError:
51
- LOGGER.error(
51
+ L.error(
52
52
  f"{pbe.value}: Unusable backend. "
53
53
  f"Might be due to backend not being installed "
54
54
  f"or implementation error in backend."
@@ -11,7 +11,12 @@ from operator import itemgetter as ItemAt
11
11
 
12
12
  from babelplot.extension.enum_ import EnumMembers, EnumValues
13
13
 
14
- UNAVAILABLE_for_this_DIM = None
14
+
15
+ class _unavailable_for_this_dim:
16
+ pass
17
+
18
+
19
+ UNAVAILABLE_for_this_DIM = _unavailable_for_this_dim()
15
20
  UNDEFINED_PARAMETER = "__UNDEFINED_PARAMETER__"
16
21
 
17
22
 
@@ -62,7 +67,7 @@ class plot_e(enum_t):
62
67
  ):
63
68
  for d_idx, for_dim in enumerate(value):
64
69
  if isinstance(
65
- for_dim, (type(UNAVAILABLE_for_this_DIM), h.Callable)
70
+ for_dim, (_unavailable_for_this_dim, h.Callable)
66
71
  ):
67
72
  pass
68
73
  else:
@@ -139,7 +144,8 @@ KNOWN_PLOT_TYPES = EnumValues(plot_e)
139
144
 
140
145
 
141
146
  plot_type_h = str | plot_e
142
- backend_plots_per_type_h = tuple[type[UNAVAILABLE_for_this_DIM] | h.Callable, ...]
147
+ # List, and not tuple, to allow for population by backends.
148
+ backend_plots_per_type_h = list[_unavailable_for_this_dim | h.Callable]
143
149
  backend_plots_h = dict[plot_e, backend_plots_per_type_h]
144
150
 
145
151
 
@@ -285,9 +291,7 @@ PLOT_DESCRIPTION = {
285
291
  }
286
292
 
287
293
 
288
- def PlotsFromTemplate() -> (
289
- dict[plot_e, list[type[UNAVAILABLE_for_this_DIM] | h.Callable]]
290
- ):
294
+ def PlotsFromTemplate() -> dict[plot_e, list[_unavailable_for_this_dim | h.Callable]]:
291
295
  """"""
292
296
  return {_key: 3 * [UNAVAILABLE_for_this_DIM] for _key in PLOT_DESCRIPTION.keys()}
293
297
 
@@ -9,12 +9,12 @@ import typing as h
9
9
 
10
10
  from babelplot.backend.specification.runtime import BackendTranslations
11
11
  from babelplot.specification.plot import TranslatedArguments
12
- from logger_36 import LOGGER
12
+ from logger_36 import L
13
13
 
14
14
  backend_figure_h = h.TypeVar("backend_figure_h")
15
15
  backend_frame_h = h.TypeVar("backend_frame_h")
16
16
  backend_plot_h = h.TypeVar("backend_plot_h")
17
- backend_element_h = backend_figure_h | backend_frame_h | backend_plot_h
17
+ backend_element_h = backend_figure_h | backend_frame_h | backend_plot_h | h.Any
18
18
 
19
19
 
20
20
  @dtcl.dataclass(repr=False, eq=False)
@@ -25,6 +25,8 @@ class babelplot_element_t:
25
25
  they are stored here. E.g., how to retrieve the marker of a scatter plot in
26
26
  Matplotlib?
27
27
  /!\\ Do not forget to initialize it with kwargs during element instantiation.
28
+ backend: Certain plots of certain libraries might be composed of a list of plots,
29
+ not just a unique plot, or even richer outputs (e.g., with Matplotlib).
28
30
  """
29
31
 
30
32
  pbe: str | None = None
@@ -36,14 +38,14 @@ class babelplot_element_t:
36
38
  element: backend_element_h, name: str, value: h.Any, /
37
39
  ) -> None:
38
40
  """"""
39
- LOGGER.warning(
41
+ L.warning(
40
42
  f"{babelplot_element_t.BackendSetProperty.__name__}: Not provided by backend."
41
43
  )
42
44
 
43
45
  @staticmethod
44
46
  def BackendProperty(element: backend_element_h, name: str, /) -> h.Any:
45
47
  """"""
46
- LOGGER.warning(
48
+ L.warning(
47
49
  f"{babelplot_element_t.BackendProperty.__name__}: Not provided by backend."
48
50
  )
49
51
 
@@ -55,7 +57,7 @@ class babelplot_element_t:
55
57
 
56
58
  if (n_properties := args.__len__()) > 0:
57
59
  if (n_properties % 2) > 0:
58
- LOGGER.error(
60
+ L.error(
59
61
  f"N. argument(s)={n_properties}: Properties not passed in matching key-value pairs. "
60
62
  f"Expected=Even number."
61
63
  )
@@ -15,7 +15,7 @@ from babelplot.specification.plot import TranslatedArguments
15
15
  from babelplot.type.base import babelplot_element_t as base_figure_t
16
16
  from babelplot.type.base import backend_figure_h, backend_frame_h
17
17
  from babelplot.type.frame import frame_t
18
- from logger_36 import LOGGER
18
+ from logger_36 import L
19
19
 
20
20
  _un_shown_figures = []
21
21
  _shown_figures = []
@@ -57,10 +57,10 @@ class figure_t(base_figure_t):
57
57
  dim = dim_e.NewFromName(dim)
58
58
 
59
59
  if (where := (row, col)) in self.locations:
60
- LOGGER.error(f"{where}: Frame grid cell already filled")
60
+ L.error(f"{where}: Frame grid cell already filled")
61
61
  return None
62
62
  if (row < 0) and (col < 0):
63
- LOGGER.error(f"{where}: Grid coordinates cannot be both negative")
63
+ L.error(f"{where}: Grid coordinates cannot be both negative")
64
64
  return None
65
65
  if row < 0:
66
66
  row = self.shape[0]
@@ -89,7 +89,7 @@ class figure_t(base_figure_t):
89
89
  def LocationOfFrame(self, frame: frame_t, /) -> tuple[int, int] | None:
90
90
  """"""
91
91
  if frame not in self.frames:
92
- LOGGER.error(f"{frame}: Not a frame of the figure.")
92
+ L.error(f"{frame}: Not a frame of the figure.")
93
93
  return None
94
94
 
95
95
  where = self.frames.index(frame)
@@ -10,7 +10,11 @@ import typing as h
10
10
 
11
11
  from babelplot.backend.specification.runtime import BackendPlots, BackendTranslations
12
12
  from babelplot.specification.dimension import FRAME_DIM_FOR_DATA_DIM, dim_e
13
- from babelplot.specification.plot import KNOWN_PLOT_TYPES, TranslatedArguments, plot_type_h
13
+ from babelplot.specification.plot import (
14
+ KNOWN_PLOT_TYPES,
15
+ TranslatedArguments,
16
+ plot_type_h,
17
+ )
14
18
  from babelplot.type.base import babelplot_element_t as base_frame_t
15
19
  from babelplot.type.base import backend_frame_h, backend_plot_h
16
20
  from babelplot.type.plot import BackendPlotFromAny, plot_t
@@ -85,12 +89,18 @@ class frame_t(base_frame_t):
85
89
 
86
90
  def NewBackendPlot(
87
91
  self,
92
+ _: backend_frame_h,
88
93
  type_: plot_type_w_pbe_h,
89
- plot_function: h.Callable | None,
94
+ plot_function: (
95
+ type[backend_plot_h] | h.Callable[..., backend_plot_h | h.Any] | None
96
+ ),
90
97
  *args,
91
98
  title: str | None = None,
92
99
  **kwargs,
93
- ) -> tuple[h.Any, type[backend_plot_h]]:
100
+ ) -> tuple[
101
+ backend_plot_h | h.Any,
102
+ type[backend_plot_h] | h.Callable[..., backend_plot_h | h.Any],
103
+ ]:
94
104
  """
95
105
  The returned object should be backend_plot_h. However, some backends might not
96
106
  have a specific class for each plot type. For example, Matplotlib returns an
@@ -4,7 +4,7 @@ Contributor(s): Eric Debreuve (eric.debreuve@cnrs.fr) since 2022
4
4
  SEE COPYRIGHT NOTICE BELOW
5
5
  """
6
6
 
7
- __version__ = "2025.1"
7
+ __version__ = "2025.3"
8
8
 
9
9
  """
10
10
  COPYRIGHT NOTICE
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: babelplot
3
- Version: 2025.1
3
+ Version: 2025.3
4
4
  Summary: A Meta Plotting Library That Speaks Several Backends
5
5
  Home-page: https://src.koda.cnrs.fr/eric.debreuve/babelplot/
6
6
  Author: Eric Debreuve
@@ -19,6 +19,18 @@ Description-Content-Type: text/x-rst
19
19
  Requires-Dist: numpy
20
20
  Requires-Dist: PyQt6
21
21
  Requires-Dist: scikit-image
22
+ Dynamic: author
23
+ Dynamic: author-email
24
+ Dynamic: classifier
25
+ Dynamic: description
26
+ Dynamic: description-content-type
27
+ Dynamic: home-page
28
+ Dynamic: keywords
29
+ Dynamic: license
30
+ Dynamic: project-url
31
+ Dynamic: requires-dist
32
+ Dynamic: requires-python
33
+ Dynamic: summary
22
34
 
23
35
  ..
24
36
  Copyright CNRS/Inria/UniCA
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes