From 5ef36f39d12315835d211c39ae5ff2357c06a70b Mon Sep 17 00:00:00 2001 From: Eric Larson Date: Tue, 11 Aug 2026 10:40:57 -0400 Subject: [PATCH 01/11] fix: make the sphinx-gallery scraper capture every shown figure --- CHANGELOG.md | 1 + plotly/io/_base_renderers.py | 40 +- plotly/io/_sg_scraper.py | 101 ++-- pyproject.toml | 1 + tests/test_io/test_renderers.py | 16 + tests/test_io/test_sg_scraper.py | 191 ++++++++ uv.lock | 767 +++++++++++++++++++++++++++++++ 7 files changed, 1054 insertions(+), 63 deletions(-) create mode 100644 tests/test_io/test_sg_scraper.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 4f4cc3ac0ed..c008cae7d06 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). ### Fixed - Fix `hex_to_rgb` parsing of 3-digit shorthand hexadecimal colors such as `#FFF` [[#5662](https://github.com/plotly/plotly.py/pull/5662)], with thanks to @genrichez for the contribution! - Add `` to the `to_html()` template to comply with modern web standards [[#5693](https://github.com/plotly/plotly.py/pull/5693)], with thanks to @mishrakushal for the contribution! +- Fix the sphinx-gallery scraper so that it generates thumbnails for figures shown with `fig.show()` and no longer scrapes files belonging to other examples during parallel builds [[#4722](https://github.com/plotly/plotly.py/issues/4722), [#4959](https://github.com/plotly/plotly.py/issues/4959)], with thanks to @larsoner for the contribution! ## [6.9.0] - 2026-07-09 diff --git a/plotly/io/_base_renderers.py b/plotly/io/_base_renderers.py index 25cadac4f1a..7204f3bc901 100644 --- a/plotly/io/_base_renderers.py +++ b/plotly/io/_base_renderers.py @@ -6,10 +6,9 @@ from os.path import isdir from plotly import optional_imports -from plotly.io import to_json, to_image, write_image, write_html +from plotly.io import to_json, to_image from plotly.io._utils import plotly_cdn_url from plotly.offline.offline import _get_jconfig, get_plotlyjs -from plotly.tools import return_figure_from_figure_or_data ipython_display = optional_imports.get_module("IPython.display") IPython = optional_imports.get_module("IPython") @@ -821,26 +820,21 @@ def to_mimebundle(self, fig_dict): return {"text/html": html} +# Figures shown with the "sphinx_gallery_png" renderer are queued here until +# plotly.io._sg_scraper.plotly_sg_scraper collects them, so the renderer itself +# does not need to know where sphinx-gallery wants the files to be written. +sphinx_gallery_figures = [] + + class SphinxGalleryOrcaRenderer(ExternalRenderer): + """Renderer used together with the sphinx-gallery image scraper. + + Instead of displaying the figure, this renderer queues it in + ``plotly.io._base_renderers.sphinx_gallery_figures``; + :func:`plotly.io._sg_scraper.plotly_sg_scraper` then writes each queued + figure to the gallery's image directory, both as an interactive HTML file + and as a static image used for the gallery thumbnail. + """ + def render(self, fig_dict): - stack = inspect.stack() - # Name of script from which plot function was called is retrieved - try: - filename = stack[3].filename # let's hope this is robust... - except Exception: # python 2 - filename = stack[3][1] - filename_root, _ = os.path.splitext(filename) - filename_html = filename_root + ".html" - filename_png = filename_root + ".png" - figure = return_figure_from_figure_or_data(fig_dict, True) - _ = write_html(fig_dict, file=filename_html, include_plotlyjs="cdn") - try: - write_image(figure, filename_png) - except (ValueError, ImportError): - raise ImportError( - "orca and psutil are required to use the `sphinx-gallery-orca` renderer. " - "See https://plotly.com/python/static-image-export/ for instructions on " - "how to install orca. Alternatively, you can use the `sphinx-gallery` " - "renderer (note that png thumbnails can only be generated with " - "the `sphinx-gallery-orca` renderer)." - ) + sphinx_gallery_figures.append(fig_dict) diff --git a/plotly/io/_sg_scraper.py b/plotly/io/_sg_scraper.py index af15b7d1c33..9402d24056f 100644 --- a/plotly/io/_sg_scraper.py +++ b/plotly/io/_sg_scraper.py @@ -1,11 +1,10 @@ # This module defines an image scraper for sphinx-gallery # https://sphinx-gallery.github.io/ # which can be used by projects using plotly in their documentation. -from glob import glob import os -import shutil import plotly +from plotly.io._base_renderers import sphinx_gallery_figures plotly.io.renderers.default = "sphinx_gallery_png" @@ -14,11 +13,15 @@ def plotly_sg_scraper(block, block_vars, gallery_conf, **kwargs): """Scrape Plotly figures for galleries of examples using sphinx-gallery. - Examples should use ``plotly.io.show()`` to display the figure with - the custom sphinx_gallery renderer. + Examples should use ``plotly.io.show()`` (or the equivalent + ``fig.show()``) to display the figure with the custom + ``sphinx_gallery_png`` renderer, which is made the default renderer as a + side effect of importing this module. - Since the sphinx_gallery renderer generates both html and static png - files, we simply crawl these files and give them the appropriate path. + Every figure shown that way is written to the gallery image directory + twice: once as an interactive HTML file, which is embedded in the page, + and once as a static image, which sphinx-gallery uses to generate the + thumbnail of the example. Parameters ---------- @@ -29,10 +32,9 @@ def plotly_sg_scraper(block, block_vars, gallery_conf, **kwargs): gallery_conf : dict Contains the configuration of Sphinx-Gallery **kwargs : dict - Additional keyword arguments to pass to - :meth:`~matplotlib.figure.Figure.savefig`, e.g. ``format='svg'``. - The ``format`` kwarg in particular is used to set the file extension - of the output file (currently only 'png' and 'svg' are supported). + Additional keyword arguments. + The ``format`` kwarg is used to set the file extension + of the static images (currently only 'png' and 'svg' are supported). Returns ------- @@ -44,54 +46,73 @@ def plotly_sg_scraper(block, block_vars, gallery_conf, **kwargs): ----- Add this function to the image scrapers """ - examples_dir = os.path.dirname(block_vars["src_file"]) - pngs = sorted(glob(os.path.join(examples_dir, "*.png"))) - htmls = sorted(glob(os.path.join(examples_dir, "*.html"))) + image_format = kwargs.get("format", "png") + if image_format not in ("png", "svg"): + raise ValueError(f"format must be one of 'png' or 'svg', got {image_format!r}") image_path_iterator = block_vars["image_path_iterator"] - image_names = list() - seen = set() - for html, png in zip(htmls, pngs): - if png not in seen: - seen |= set(png) - this_image_path_png = next(image_path_iterator) - this_image_path_html = os.path.splitext(this_image_path_png)[0] + ".html" - image_names.append(this_image_path_html) - shutil.move(png, this_image_path_png) - shutil.move(html, this_image_path_html) + html_names = [] + try: + for fig_dict, image_path in zip(sphinx_gallery_figures, image_path_iterator): + # sphinx-gallery hands out one path per image; the HTML file sits + # next to the image it is the interactive counterpart of. + path_root = os.path.splitext(image_path)[0] + _write_image(fig_dict, f"{path_root}.{image_format}", image_format) + plotly.io.write_html( + fig_dict, + file=f"{path_root}.html", + include_plotlyjs="cdn", + full_html=False, + default_width="100%", + default_height=525, + validate=False, + ) + html_names.append(f"{path_root}.html") + finally: + # Don't let figures leak into the next block if writing one failed. + del sphinx_gallery_figures[:] # Use the `figure_rst` helper function to generate rST for image files - return figure_rst(image_names, gallery_conf["src_dir"]) + return figure_rst(html_names, gallery_conf["src_dir"]) + + +def _write_image(fig_dict, file, image_format): + """Write a static image, with a helpful message if that is not possible.""" + try: + plotly.io.write_image(fig_dict, file, format=image_format, validate=False) + except Exception as exc: + raise RuntimeError( + f"Kaleido and a compatible browser are required to use the " + f"`sphinx_gallery_png` renderer, but writing {file} failed with: " + f"{type(exc).__name__}: {exc}\n" + "See https://plotly.com/python/static-image-export/ for " + "installation instructions. Alternatively, you can use the " + "`sphinx_gallery` renderer without this scraper (note that " + "thumbnails can only be generated with the `sphinx_gallery_png` " + "renderer)." + ) from exc def figure_rst(figure_list, sources_dir): - """Generate RST for a list of PNG filenames. - - Depending on whether we have one or more figures, we use a - single rst call to 'image' or a horizontal list. + """Generate RST for a list of HTML filenames. Parameters ---------- figure_list : list List of strings of the figures' absolute paths. sources_dir : str - absolute path of Sphinx documentation sources + absolute path of Sphinx documentation sources (unused, kept for + compatibility with the equivalent sphinx-gallery helper) Returns ------- images_rst : str rst code to embed the images in the document """ - - figure_paths = [ - os.path.relpath(figure_path, sources_dir).replace(os.sep, "/").lstrip("/") + # The HTML files live in the "images" directory next to the document that + # includes them, so the paths are relative to that document. + return "".join( + SINGLE_HTML % ("images/" + os.path.basename(figure_path)) for figure_path in figure_list - ] - images_rst = "" - if not figure_paths: - return images_rst - figure_name = figure_paths[0] - figure_path = os.path.join("images", os.path.basename(figure_name)) - images_rst = SINGLE_HTML % figure_path - return images_rst + ) SINGLE_HTML = """ diff --git a/pyproject.toml b/pyproject.toml index 629f74e32d3..ac8b0578945 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -76,6 +76,7 @@ dev_optional = [ "scikit-image", "scipy", "shapely", + "sphinx-gallery", "statsmodels", "vaex;python_version<='3.9'", "xarray" diff --git a/tests/test_io/test_renderers.py b/tests/test_io/test_renderers.py index b1019b82499..6f265e01057 100644 --- a/tests/test_io/test_renderers.py +++ b/tests/test_io/test_renderers.py @@ -270,6 +270,22 @@ def open_url(url, new=0, autoraise=True): assert_offline(html) +# Sphinx-Gallery +# -------------- +@pytest.mark.parametrize("show", [lambda fig: pio.show(fig), lambda fig: fig.show()]) +def test_sphinx_gallery_png_renderer_show(fig1, show): + """Figures must be queued for the scraper however `show` was called.""" + from plotly.io._base_renderers import sphinx_gallery_figures + + pio.renderers.default = "sphinx_gallery_png" + del sphinx_gallery_figures[:] + try: + show(fig1) + assert sphinx_gallery_figures == [fig1.to_dict()] + finally: + del sphinx_gallery_figures[:] + + # Validation # ---------- @pytest.mark.parametrize("renderer", ["bogus", "json+bogus", "bogus+chrome"]) diff --git a/tests/test_io/test_sg_scraper.py b/tests/test_io/test_sg_scraper.py new file mode 100644 index 00000000000..8340a943db1 --- /dev/null +++ b/tests/test_io/test_sg_scraper.py @@ -0,0 +1,191 @@ +"""Tests for the sphinx-gallery image scraper. + +The scraper implements the interface described at +https://sphinx-gallery.github.io/stable/advanced.html#write-a-custom-image-scraper +so these tests drive it through sphinx-gallery itself rather than through a +copy of that interface. +""" + +import functools +import importlib +import os +from pathlib import Path +from types import SimpleNamespace + +import plotly.graph_objects as go +import plotly.io as pio +import pytest + +pytest.importorskip("sphinx_gallery") + +# The color of each successive image written during one test, so that the +# figure an image or thumbnail came from can be identified. +COLORS = ["red", "blue"] + + +def dummy_image_writer(): + """Return a pio.write_image stand-in, so the tests do not need Kaleido.""" + colors = iter(COLORS) + + def write_dummy_image(fig, file, format="png", **kwargs): + color = next(colors) + if format == "svg": + with open(file, "w") as f: + f.write(f'') + else: + from PIL import Image + + Image.new("RGB", (16, 16), color).save(file) + + return write_dummy_image + + +def assert_image_color(path, color, image_format): + """Assert an image came from the figure that was written in `color`.""" + if image_format == "svg": + assert f'fill="{color}"' in path.read_text() + else: + from PIL import Image, ImageColor + + # Sphinx-gallery pads thumbnails onto a white canvas, so only the + # center is guaranteed to come from the scraped image. + image = Image.open(path).convert("RGB") + center = image.getpixel((image.width // 2, image.height // 2)) + assert center == ImageColor.getrgb(color) + + +@pytest.fixture +def gallery(tmp_path, monkeypatch): + """Emulate a sphinx-gallery build of a single example. + + Calls into sphinx-gallery for everything that drives or consumes the + scraper, so that the tests exercise the real API. Images are written by a + stand-in for `pio.write_image`, so that the tests do not need Kaleido. + """ + from sphinx_gallery.gen_gallery import DEFAULT_GALLERY_CONF + from sphinx_gallery.gen_rst import save_thumbnail + from sphinx_gallery.scrapers import ImagePathIterator, save_figures + + from plotly.io._base_renderers import sphinx_gallery_figures + from plotly.io._sg_scraper import plotly_sg_scraper + + # Importing the scraper sets the renderer too, but only the first time it + # is imported, which may have happened in another test already. + monkeypatch.setattr(pio.renderers, "default", "sphinx_gallery_png") + monkeypatch.setattr(pio, "write_image", dummy_image_writer()) + + example_dir = tmp_path / "auto_examples" + thumb_dir = example_dir / "images" / "thumb" + thumb_dir.parent.mkdir(parents=True) + template = str(example_dir / "images" / "sphx_glr_plot_example_{0:03}.png") + src_file = str(example_dir / "plot_example.py") + conf = { + **DEFAULT_GALLERY_CONF, + "src_dir": str(tmp_path), + "image_scrapers": (plotly_sg_scraper,), + } + block_vars = { + "image_path_iterator": ImagePathIterator(template), + "src_file": src_file, + } + + def scrape(): + """Scrape one code block, as sphinx-gallery does after executing it.""" + return save_figures(("code", "", 1), block_vars, conf) + + def thumbnail(**file_conf): + """Generate the gallery thumbnail and return the one file produced.""" + save_thumbnail(template, src_file, block_vars, file_conf, conf) + (thumb,) = thumb_dir.iterdir() + return thumb + + yield SimpleNamespace( + conf=conf, + example_dir=example_dir, + paths=block_vars["image_path_iterator"].paths, + scraper=plotly_sg_scraper, + scrape=scrape, + thumbnail=thumbnail, + ) + del sphinx_gallery_figures[:] + + +@pytest.mark.parametrize("image_format", ["png", "svg"]) +def test_scraper(gallery, image_format): + """Each shown figure gets an image and an HTML file, and can be a thumbnail.""" + # Selecting a format by wrapping the scraper is the approach documented at + # https://sphinx-gallery.github.io/stable/advanced.html#example-3-matplotlib-with-svg-format + gallery.conf["image_scrapers"] = ( + functools.partial(gallery.scraper, format=image_format), + ) + fig = go.Figure(data=[go.Scatter(x=[1, 2, 3], y=[3, 2, 1])]) + pio.show(fig) + fig.show() # both ways of showing a figure must be scraped + + rst = gallery.scrape() + + assert len(gallery.paths) == 2 + for path, color in zip(gallery.paths, COLORS): + root = os.path.splitext(path)[0] + assert os.path.isfile(f"{root}.html") + assert f"images/{os.path.basename(root)}.html" in rst + assert_image_color(Path(f"{root}.{image_format}"), color, image_format) + assert rst.count(".. raw:: html") == 2 + + # The thumbnail must be a scraped figure rather than a "no image" default, + # and one image per figure in order is what makes `thumbnail_number` work + for number, color in enumerate(COLORS, start=1): + thumb = gallery.thumbnail(thumbnail_number=number) + assert thumb.name == f"sphx_glr_plot_example_thumb.{image_format}" + assert_image_color(thumb, color, image_format) + + # The figures have been consumed, so a block showing none scrapes nothing + assert gallery.scrape() == "" + assert len(gallery.paths) == 2 + + +def test_scraper_ignores_other_examples(gallery): + """Files belonging to another example must be left alone (issue #4959). + + Sphinx-gallery can execute examples in parallel, so the directory holding + the example being scraped may contain files from other examples. + """ + others = [gallery.example_dir / f"plot_other.{ext}" for ext in ("png", "html")] + for other in others: + other.write_text("another example") + pio.show(go.Figure()) + rst = gallery.scrape() + + for other in others: + assert other.read_text() == "another example", f"{other.name} was scraped" + assert len(gallery.paths) == 1 + assert rst.count(".. raw:: html") == 1 + + +def test_scraper_bad_format(gallery): + gallery.conf["image_scrapers"] = (functools.partial(gallery.scraper, format="pdf"),) + pio.show(go.Figure()) + with pytest.raises(ValueError, match="format must be one of"): + gallery.scrape() + + +def test_scraper_image_error(gallery, monkeypatch): + """A failure to write the image says how to fix it, and doesn't stick.""" + + def raise_no_browser(*args, **kwargs): + raise ValueError("no browser") + + monkeypatch.setattr(pio, "write_image", raise_no_browser) + pio.show(go.Figure()) + + with pytest.raises(RuntimeError, match="Kaleido"): + gallery.scrape() + + assert gallery.scrape() == "" # the failed figure is not scraped again + + +def test_import_sets_default_renderer(monkeypatch): + """Importing the scraper selects the renderer that it knows how to scrape.""" + monkeypatch.setattr(pio.renderers, "default", "browser") + importlib.reload(importlib.import_module("plotly.io._sg_scraper")) + assert pio.renderers.default == "sphinx_gallery_png" diff --git a/uv.lock b/uv.lock index bbadf184ddd..591c90d0824 100644 --- a/uv.lock +++ b/uv.lock @@ -69,6 +69,73 @@ exclude-newer-span = "PT72H" [options.exclude-newer-package] plotly = false +[[package]] +name = "alabaster" +version = "0.7.13" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version > '3.8' and python_full_version < '3.9' and sys_platform == 'win32'", + "python_full_version <= '3.8' and sys_platform == 'win32'", + "python_full_version >= '3.8.1' and python_full_version < '3.9' and sys_platform != 'win32'", + "python_full_version > '3.8' and python_full_version < '3.8.1' and sys_platform != 'win32'", + "python_full_version <= '3.8' and sys_platform != 'win32'", +] +sdist = { url = "https://files.pythonhosted.org/packages/94/71/a8ee96d1fd95ca04a0d2e2d9c4081dac4c2d2b12f7ddb899c8cb9bfd1532/alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2", size = 11454, upload-time = "2023-01-13T06:42:53.797Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/88/c7083fc61120ab661c5d0b82cb77079fc1429d3f913a456c1c82cf4658f7/alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3", size = 13857, upload-time = "2023-01-13T06:42:52.336Z" }, +] + +[[package]] +name = "alabaster" +version = "0.7.16" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*' and sys_platform == 'win32'", + "python_full_version == '3.9.*' and sys_platform != 'win32'", +] +sdist = { url = "https://files.pythonhosted.org/packages/c9/3e/13dd8e5ed9094e734ac430b5d0eb4f2bb001708a8b7856cbf8e084e001ba/alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65", size = 23776, upload-time = "2024-01-10T00:56:10.189Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/34/d4e1c02d3bee589efb5dfa17f88ea08bdb3e3eac12bc475462aec52ed223/alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92", size = 13511, upload-time = "2024-01-10T00:56:08.388Z" }, +] + +[[package]] +name = "alabaster" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.11.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.11.*' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.10.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.10.*' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.11.*' and sys_platform == 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.11.*' and sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.10.*' and sys_platform == 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.10.*' and sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.14' and sys_platform == 'emscripten' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.11.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.11.*' and sys_platform == 'emscripten' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.10.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.10.*' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", +] +sdist = { url = "https://files.pythonhosted.org/packages/a6/f8/d9c74d0daf3f742840fd818d69cfae176fa332022fd44e3469487d5a9420/alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e", size = 24210, upload-time = "2024-07-26T18:15:03.762Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b", size = 13929, upload-time = "2024-07-26T18:15:02.05Z" }, +] + [[package]] name = "annotated-doc" version = "0.0.4" @@ -1783,6 +1850,69 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604, upload-time = "2021-03-08T10:59:24.45Z" }, ] +[[package]] +name = "docutils" +version = "0.20.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version > '3.8' and python_full_version < '3.9' and sys_platform == 'win32'", + "python_full_version <= '3.8' and sys_platform == 'win32'", + "python_full_version >= '3.8.1' and python_full_version < '3.9' and sys_platform != 'win32'", + "python_full_version > '3.8' and python_full_version < '3.8.1' and sys_platform != 'win32'", + "python_full_version <= '3.8' and sys_platform != 'win32'", +] +sdist = { url = "https://files.pythonhosted.org/packages/1f/53/a5da4f2c5739cf66290fac1431ee52aff6851c7c8ffd8264f13affd7bcdd/docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b", size = 2058365, upload-time = "2023-05-16T23:39:19.748Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/87/f238c0670b94533ac0353a4e2a1a771a0cc73277b88bff23d3ae35a256c1/docutils-0.20.1-py3-none-any.whl", hash = "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6", size = 572666, upload-time = "2023-05-16T23:39:15.976Z" }, +] + +[[package]] +name = "docutils" +version = "0.21.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.10.*' and sys_platform == 'win32'", + "python_full_version == '3.10.*' and sys_platform != 'win32'", + "python_full_version == '3.9.*' and sys_platform == 'win32'", + "python_full_version == '3.9.*' and sys_platform != 'win32'", +] +sdist = { url = "https://files.pythonhosted.org/packages/ae/ed/aefcc8cd0ba62a0560c3c18c33925362d46c6075480bfa4df87b28e169a9/docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f", size = 2204444, upload-time = "2024-04-23T18:57:18.24Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", size = 587408, upload-time = "2024-04-23T18:57:14.835Z" }, +] + +[[package]] +name = "docutils" +version = "0.22.4" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.11.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.11.*' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.11.*' and sys_platform == 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.11.*' and sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.14' and sys_platform == 'emscripten' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.11.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.11.*' and sys_platform == 'emscripten' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", +] +sdist = { url = "https://files.pythonhosted.org/packages/ae/b6/03bb70946330e88ffec97aefd3ea75ba575cb2e762061e0e62a213befee8/docutils-0.22.4.tar.gz", hash = "sha256:4db53b1fde9abecbb74d91230d32ab626d94f6badfc575d6db9194a49df29968", size = 2291750, upload-time = "2025-12-18T19:00:26.443Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl", hash = "sha256:d0013f540772d1420576855455d050a2180186c91c15779301ac2ccb3eeb68de", size = 633196, upload-time = "2025-12-18T19:00:18.077Z" }, +] + [[package]] name = "exceptiongroup" version = "1.3.1" @@ -2590,6 +2720,62 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/49/fa/391e437a34e55095173dca5f24070d89cbc233ff85bf1c29c93248c6588d/imageio-2.37.3-py3-none-any.whl", hash = "sha256:46f5bb8522cd421c0f5ae104d8268f569d856b29eb1a13b92829d1970f32c9f0", size = 317646, upload-time = "2026-03-09T11:31:10.771Z" }, ] +[[package]] +name = "imagesize" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*' and sys_platform == 'win32'", + "python_full_version == '3.9.*' and sys_platform != 'win32'", + "python_full_version > '3.8' and python_full_version < '3.9' and sys_platform == 'win32'", + "python_full_version <= '3.8' and sys_platform == 'win32'", + "python_full_version >= '3.8.1' and python_full_version < '3.9' and sys_platform != 'win32'", + "python_full_version > '3.8' and python_full_version < '3.8.1' and sys_platform != 'win32'", + "python_full_version <= '3.8' and sys_platform != 'win32'", +] +sdist = { url = "https://files.pythonhosted.org/packages/cf/59/4b0dd64676aa6fb4986a755790cb6fc558559cf0084effad516820208ec3/imagesize-1.5.0.tar.gz", hash = "sha256:8bfc5363a7f2133a89f0098451e0bcb1cd71aba4dc02bbcecb39d99d40e1b94f", size = 1281127, upload-time = "2026-03-03T01:59:54.651Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/b1/a0662b03103c66cf77101a187f396ea91167cd9b7d5d3a2e465ad2c7ee9b/imagesize-1.5.0-py2.py3-none-any.whl", hash = "sha256:32677681b3f434c2cb496f00e89c5a291247b35b1f527589909e008057da5899", size = 5763, upload-time = "2026-03-03T01:59:52.343Z" }, +] + +[[package]] +name = "imagesize" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.11.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.11.*' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.10.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.10.*' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.11.*' and sys_platform == 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.11.*' and sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.10.*' and sys_platform == 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.10.*' and sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.14' and sys_platform == 'emscripten' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.11.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.11.*' and sys_platform == 'emscripten' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.10.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.10.*' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", +] +sdist = { url = "https://files.pythonhosted.org/packages/6c/e6/7bf14eeb8f8b7251141944835abd42eb20a658d89084b7e1f3e5fe394090/imagesize-2.0.0.tar.gz", hash = "sha256:8e8358c4a05c304f1fccf7ff96f036e7243a189e9e42e90851993c558cfe9ee3", size = 1773045, upload-time = "2026-03-03T14:18:29.941Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5f/53/fb7122b71361a0d121b669dcf3d31244ef75badbbb724af388948de543e2/imagesize-2.0.0-py2.py3-none-any.whl", hash = "sha256:5667c5bbb57ab3f1fa4bc366f4fbc971db3d5ed011fd2715fd8001f782718d96", size = 9441, upload-time = "2026-03-03T14:18:27.892Z" }, +] + [[package]] name = "importlib-metadata" version = "8.5.0" @@ -6827,6 +7013,8 @@ dev = [ { name = "scipy", version = "1.17.1", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.11' and extra != 'extra-6-plotly-dev-pandas1') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3')" }, { name = "shapely", version = "2.0.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, { name = "shapely", version = "2.1.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "sphinx-gallery", version = "0.19.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "sphinx-gallery", version = "0.21.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, { name = "statsmodels", version = "0.14.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, { name = "statsmodels", version = "0.14.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, { name = "vaex", version = "4.17.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, @@ -6918,6 +7106,8 @@ dev-optional = [ { name = "scipy", version = "1.17.1", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.11' and extra != 'extra-6-plotly-dev-pandas1') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3')" }, { name = "shapely", version = "2.0.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, { name = "shapely", version = "2.1.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "sphinx-gallery", version = "0.19.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "sphinx-gallery", version = "0.21.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, { name = "statsmodels", version = "0.14.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, { name = "statsmodels", version = "0.14.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, { name = "vaex", version = "4.17.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, @@ -6988,6 +7178,7 @@ requires-dist = [ { name = "scipy", marker = "extra == 'dev-optional'" }, { name = "setuptools", marker = "extra == 'dev-pandas1'", specifier = "<82" }, { name = "shapely", marker = "extra == 'dev-optional'" }, + { name = "sphinx-gallery", marker = "extra == 'dev-optional'" }, { name = "statsmodels", marker = "extra == 'dev-optional'" }, { name = "vaex", marker = "python_full_version < '3.10' and extra == 'dev-optional'" }, { name = "xarray", marker = "extra == 'dev-optional'" }, @@ -9441,6 +9632,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/14/25/b208c5683343959b670dc001595f2f3737e051da617f66c31f7c4fa93abc/rich-14.3.3-py3-none-any.whl", hash = "sha256:793431c1f8619afa7d3b52b2cdec859562b950ea0d4b6b505397612db8d5362d", size = 310458, upload-time = "2026-02-19T17:23:13.732Z" }, ] +[[package]] +name = "roman-numerals" +version = "4.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ae/f9/41dc953bbeb056c17d5f7a519f50fdf010bd0553be2d630bc69d1e022703/roman_numerals-4.1.0.tar.gz", hash = "sha256:1af8b147eb1405d5839e78aeb93131690495fe9da5c91856cb33ad55a7f1e5b2", size = 9077, upload-time = "2025-12-17T18:25:34.381Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl", hash = "sha256:647ba99caddc2cc1e55a51e4360689115551bf4476d90e8162cf8c345fe233c7", size = 7676, upload-time = "2025-12-17T18:25:33.098Z" }, +] + [[package]] name = "rpds-py" version = "0.20.1" @@ -10665,6 +10865,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, ] +[[package]] +name = "snowballstemmer" +version = "3.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/f8/0a71edf031f03c40db17503cb8ca78a69a171254e568e7db241b0ab57ea1/snowballstemmer-3.1.1.tar.gz", hash = "sha256:e07bbc54a0d798fe6010a12398422e62a8bfbba95c394fd0956ef58cb4d3e260", size = 123314, upload-time = "2026-06-03T00:56:40.194Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4c/07/2ebca9b11fb9be7340a818d8d6f63feaebb146be2c4afbd6061701d6df6e/snowballstemmer-3.1.1-py3-none-any.whl", hash = "sha256:7e207fa178741da09cdee59d3ecec3827ad5f92b1fc5c9ff3755b639f71f5752", size = 104164, upload-time = "2026-06-03T00:56:38.614Z" }, +] + [[package]] name = "soupsieve" version = "2.7" @@ -10725,6 +10934,564 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl", hash = "sha256:ed64f2ba4eebeab06cc4962affce381647455978ffc1e36bb79a545b91f45a95", size = 37016, upload-time = "2026-01-20T04:27:01.012Z" }, ] +[[package]] +name = "sphinx" +version = "7.1.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version > '3.8' and python_full_version < '3.9' and sys_platform == 'win32'", + "python_full_version <= '3.8' and sys_platform == 'win32'", + "python_full_version >= '3.8.1' and python_full_version < '3.9' and sys_platform != 'win32'", + "python_full_version > '3.8' and python_full_version < '3.8.1' and sys_platform != 'win32'", + "python_full_version <= '3.8' and sys_platform != 'win32'", +] +dependencies = [ + { name = "alabaster", version = "0.7.13", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "babel", marker = "python_full_version < '3.9' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "colorama", marker = "(python_full_version < '3.9' and sys_platform == 'win32') or (python_full_version >= '3.9' and extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (python_full_version >= '3.9' and extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (python_full_version >= '3.9' and extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3') or (sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "docutils", version = "0.20.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "imagesize", version = "1.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "importlib-metadata", version = "8.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "jinja2", marker = "python_full_version < '3.9' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "packaging", marker = "python_full_version < '3.9' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "pygments", version = "2.19.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "requests", version = "2.32.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "snowballstemmer", marker = "python_full_version < '3.9' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "sphinxcontrib-applehelp", version = "1.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "sphinxcontrib-devhelp", version = "1.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "sphinxcontrib-htmlhelp", version = "2.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "sphinxcontrib-jsmath", marker = "python_full_version < '3.9' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "sphinxcontrib-qthelp", version = "1.0.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "sphinxcontrib-serializinghtml", version = "1.1.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/dc/01/688bdf9282241dca09fe6e3a1110eda399fa9b10d0672db609e37c2e7a39/sphinx-7.1.2.tar.gz", hash = "sha256:780f4d32f1d7d1126576e0e5ecc19dc32ab76cd24e950228dcf7b1f6d3d9e22f", size = 6828258, upload-time = "2023-08-02T02:06:09.375Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/48/17/325cf6a257d84751a48ae90752b3d8fe0be8f9535b6253add61c49d0d9bc/sphinx-7.1.2-py3-none-any.whl", hash = "sha256:d170a81825b2fcacb6dfd5a0d7f578a053e45d3f2b153fecc948c37344eb4cbe", size = 3169543, upload-time = "2023-08-02T02:06:06.816Z" }, +] + +[[package]] +name = "sphinx" +version = "7.4.7" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*' and sys_platform == 'win32'", + "python_full_version == '3.9.*' and sys_platform != 'win32'", +] +dependencies = [ + { name = "alabaster", version = "0.7.16", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "babel", marker = "python_full_version == '3.9.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "colorama", marker = "(python_full_version == '3.9.*' and sys_platform == 'win32') or (python_full_version != '3.9.*' and extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (python_full_version != '3.9.*' and extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (python_full_version != '3.9.*' and extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3') or (sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "docutils", version = "0.21.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "imagesize", version = "1.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "importlib-metadata", version = "8.7.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "jinja2", marker = "python_full_version == '3.9.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "packaging", marker = "python_full_version == '3.9.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "pygments", version = "2.20.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "requests", version = "2.32.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "snowballstemmer", marker = "python_full_version == '3.9.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "sphinxcontrib-applehelp", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "sphinxcontrib-devhelp", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "sphinxcontrib-htmlhelp", version = "2.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "sphinxcontrib-jsmath", marker = "python_full_version == '3.9.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "sphinxcontrib-qthelp", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "sphinxcontrib-serializinghtml", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "tomli", marker = "python_full_version == '3.9.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5b/be/50e50cb4f2eff47df05673d361095cafd95521d2a22521b920c67a372dcb/sphinx-7.4.7.tar.gz", hash = "sha256:242f92a7ea7e6c5b406fdc2615413890ba9f699114a9c09192d7dfead2ee9cfe", size = 8067911, upload-time = "2024-07-20T14:46:56.059Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/ef/153f6803c5d5f8917dbb7f7fcf6d34a871ede3296fa89c2c703f5f8a6c8e/sphinx-7.4.7-py3-none-any.whl", hash = "sha256:c2419e2135d11f1951cd994d6eb18a1835bd8fdd8429f9ca375dc1f3281bd239", size = 3401624, upload-time = "2024-07-20T14:46:52.142Z" }, +] + +[[package]] +name = "sphinx" +version = "8.1.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.10.*' and sys_platform == 'win32'", + "python_full_version == '3.10.*' and sys_platform != 'win32'", +] +dependencies = [ + { name = "alabaster", version = "1.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "babel", marker = "python_full_version == '3.10.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "colorama", marker = "(python_full_version == '3.10.*' and sys_platform == 'win32') or (python_full_version != '3.10.*' and extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (python_full_version != '3.10.*' and extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (python_full_version != '3.10.*' and extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3') or (sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "docutils", version = "0.21.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "imagesize", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "jinja2", marker = "python_full_version == '3.10.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "packaging", marker = "python_full_version == '3.10.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "pygments", version = "2.20.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "requests", version = "2.33.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "snowballstemmer", marker = "python_full_version == '3.10.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "sphinxcontrib-applehelp", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "sphinxcontrib-devhelp", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "sphinxcontrib-htmlhelp", version = "2.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "sphinxcontrib-jsmath", marker = "python_full_version == '3.10.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "sphinxcontrib-qthelp", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "sphinxcontrib-serializinghtml", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "tomli", marker = "python_full_version == '3.10.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/be0b61178fe2cdcb67e2a92fc9ebb488e3c51c4f74a36a7824c0adf23425/sphinx-8.1.3.tar.gz", hash = "sha256:43c1911eecb0d3e161ad78611bc905d1ad0e523e4ddc202a58a821773dc4c927", size = 8184611, upload-time = "2024-10-13T20:27:13.93Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/60/1ddff83a56d33aaf6f10ec8ce84b4c007d9368b21008876fceda7e7381ef/sphinx-8.1.3-py3-none-any.whl", hash = "sha256:09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2", size = 3487125, upload-time = "2024-10-13T20:27:10.448Z" }, +] + +[[package]] +name = "sphinx" +version = "9.0.4" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.11.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.11.*' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.11.*' and sys_platform == 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.11.*' and sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.11.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.11.*' and sys_platform == 'emscripten' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", +] +dependencies = [ + { name = "alabaster", version = "1.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "babel", marker = "python_full_version == '3.11.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "colorama", marker = "(python_full_version == '3.11.*' and sys_platform == 'win32') or (python_full_version != '3.11.*' and extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (python_full_version != '3.11.*' and extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (python_full_version != '3.11.*' and extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3') or (sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "docutils", version = "0.22.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "imagesize", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "jinja2", marker = "python_full_version == '3.11.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "packaging", marker = "python_full_version == '3.11.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "pygments", version = "2.20.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "requests", version = "2.33.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "roman-numerals", marker = "python_full_version == '3.11.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "snowballstemmer", marker = "python_full_version == '3.11.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "sphinxcontrib-applehelp", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "sphinxcontrib-devhelp", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "sphinxcontrib-htmlhelp", version = "2.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "sphinxcontrib-jsmath", marker = "python_full_version == '3.11.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "sphinxcontrib-qthelp", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "sphinxcontrib-serializinghtml", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/50/a8c6ccc36d5eacdfd7913ddccd15a9cee03ecafc5ee2bc40e1f168d85022/sphinx-9.0.4.tar.gz", hash = "sha256:594ef59d042972abbc581d8baa577404abe4e6c3b04ef61bd7fc2acbd51f3fa3", size = 8710502, upload-time = "2025-12-04T07:45:27.343Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/3f/4bbd76424c393caead2e1eb89777f575dee5c8653e2d4b6afd7a564f5974/sphinx-9.0.4-py3-none-any.whl", hash = "sha256:5bebc595a5e943ea248b99c13814c1c5e10b3ece718976824ffa7959ff95fffb", size = 3917713, upload-time = "2025-12-04T07:45:24.944Z" }, +] + +[[package]] +name = "sphinx" +version = "9.1.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.14' and sys_platform == 'emscripten' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", +] +dependencies = [ + { name = "alabaster", version = "1.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "babel", marker = "python_full_version >= '3.12' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "colorama", marker = "(python_full_version >= '3.12' and sys_platform == 'win32') or (python_full_version < '3.12' and extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (python_full_version < '3.12' and extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (python_full_version < '3.12' and extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3') or (sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "docutils", version = "0.22.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "imagesize", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "jinja2", marker = "python_full_version >= '3.12' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "packaging", marker = "python_full_version >= '3.12' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "pygments", version = "2.20.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "requests", version = "2.33.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "roman-numerals", marker = "python_full_version >= '3.12' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "snowballstemmer", marker = "python_full_version >= '3.12' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "sphinxcontrib-applehelp", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "sphinxcontrib-devhelp", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "sphinxcontrib-htmlhelp", version = "2.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "sphinxcontrib-jsmath", marker = "python_full_version >= '3.12' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "sphinxcontrib-qthelp", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "sphinxcontrib-serializinghtml", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cd/bd/f08eb0f4eed5c83f1ba2a3bd18f7745a2b1525fad70660a1c00224ec468a/sphinx-9.1.0.tar.gz", hash = "sha256:7741722357dd75f8190766926071fed3bdc211c74dd2d7d4df5404da95930ddb", size = 8718324, upload-time = "2025-12-31T15:09:27.646Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/73/f7/b1884cb3188ab181fc81fa00c266699dab600f927a964df02ec3d5d1916a/sphinx-9.1.0-py3-none-any.whl", hash = "sha256:c84fdd4e782504495fe4f2c0b3413d6c2bf388589bb352d439b2a3bb99991978", size = 3921742, upload-time = "2025-12-31T15:09:25.561Z" }, +] + +[[package]] +name = "sphinx-gallery" +version = "0.19.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*' and sys_platform == 'win32'", + "python_full_version == '3.9.*' and sys_platform != 'win32'", + "python_full_version > '3.8' and python_full_version < '3.9' and sys_platform == 'win32'", + "python_full_version <= '3.8' and sys_platform == 'win32'", + "python_full_version >= '3.8.1' and python_full_version < '3.9' and sys_platform != 'win32'", + "python_full_version > '3.8' and python_full_version < '3.8.1' and sys_platform != 'win32'", + "python_full_version <= '3.8' and sys_platform != 'win32'", +] +dependencies = [ + { name = "pillow", version = "10.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "pillow", version = "11.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "sphinx", version = "7.1.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "sphinx", version = "7.4.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cd/e5/9ccd6ecd492043123adb465cba504217b9f0a82e2cb5b1d7249c648497c6/sphinx_gallery-0.19.0.tar.gz", hash = "sha256:8400cb5240ad642e28a612fdba0667f725d0505a9be0222d0243de60e8af2eb3", size = 471479, upload-time = "2025-02-13T03:24:50.081Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/c7/52b48aec16b26c52aba854d03a3a31e0681150301dac1bea2243645a69e7/sphinx_gallery-0.19.0-py3-none-any.whl", hash = "sha256:4c28751973f81769d5bbbf5e4ebaa0dc49dff8c48eb7f11131eb5f6e4aa25f0e", size = 455923, upload-time = "2025-02-13T03:24:47.697Z" }, +] + +[[package]] +name = "sphinx-gallery" +version = "0.21.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.11.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.11.*' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.10.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.10.*' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.11.*' and sys_platform == 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.11.*' and sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.10.*' and sys_platform == 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.10.*' and sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.14' and sys_platform == 'emscripten' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.11.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.11.*' and sys_platform == 'emscripten' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.10.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.10.*' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", +] +dependencies = [ + { name = "pillow", version = "12.2.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, + { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12' or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2') or (extra == 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas3') or (extra == 'extra-6-plotly-dev-pandas2' and extra == 'extra-6-plotly-dev-pandas3')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fb/9d/91334ba9370de74564c8a1e0c54ce1bc638b35e00177cc02cb25c9c14348/sphinx_gallery-0.21.0.tar.gz", hash = "sha256:72a7734ad9100878345b8b65c249148cc0f1cd0e274adf3e3900214e4c2c5bee", size = 483616, upload-time = "2026-04-24T03:09:28.173Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b8/dd/d95843947392524418aa9fc4e8d205e82b4261ab2d2fab4abce7a14ee7c0/sphinx_gallery-0.21.0-py3-none-any.whl", hash = "sha256:f37bea4012f1cd7439c7782081e4259945207cf179e79b81330a6db3b18bca8b", size = 466808, upload-time = "2026-04-24T03:09:25.992Z" }, +] + +[[package]] +name = "sphinxcontrib-applehelp" +version = "1.0.4" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version > '3.8' and python_full_version < '3.9' and sys_platform == 'win32'", + "python_full_version <= '3.8' and sys_platform == 'win32'", + "python_full_version >= '3.8.1' and python_full_version < '3.9' and sys_platform != 'win32'", + "python_full_version > '3.8' and python_full_version < '3.8.1' and sys_platform != 'win32'", + "python_full_version <= '3.8' and sys_platform != 'win32'", +] +sdist = { url = "https://files.pythonhosted.org/packages/32/df/45e827f4d7e7fcc84e853bcef1d836effd762d63ccb86f43ede4e98b478c/sphinxcontrib-applehelp-1.0.4.tar.gz", hash = "sha256:828f867945bbe39817c210a1abfd1bc4895c8b73fcaade56d45357a348a07d7e", size = 24766, upload-time = "2023-01-23T09:41:54.435Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/06/c1/5e2cafbd03105ce50d8500f9b4e8a6e8d02e22d0475b574c3b3e9451a15f/sphinxcontrib_applehelp-1.0.4-py3-none-any.whl", hash = "sha256:29d341f67fb0f6f586b23ad80e072c8e6ad0b48417db2bde114a4c9746feb228", size = 120601, upload-time = "2023-01-23T09:41:52.364Z" }, +] + +[[package]] +name = "sphinxcontrib-applehelp" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.11.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.11.*' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.10.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.10.*' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.9.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.9.*' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.11.*' and sys_platform == 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.11.*' and sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.10.*' and sys_platform == 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.10.*' and sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.9.*' and sys_platform == 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.9.*' and sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.14' and sys_platform == 'emscripten' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.11.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.11.*' and sys_platform == 'emscripten' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.10.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.10.*' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.9.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.9.*' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", +] +sdist = { url = "https://files.pythonhosted.org/packages/ba/6e/b837e84a1a704953c62ef8776d45c3e8d759876b4a84fe14eba2859106fe/sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1", size = 20053, upload-time = "2024-07-29T01:09:00.465Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5", size = 119300, upload-time = "2024-07-29T01:08:58.99Z" }, +] + +[[package]] +name = "sphinxcontrib-devhelp" +version = "1.0.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version > '3.8' and python_full_version < '3.9' and sys_platform == 'win32'", + "python_full_version <= '3.8' and sys_platform == 'win32'", + "python_full_version >= '3.8.1' and python_full_version < '3.9' and sys_platform != 'win32'", + "python_full_version > '3.8' and python_full_version < '3.8.1' and sys_platform != 'win32'", + "python_full_version <= '3.8' and sys_platform != 'win32'", +] +sdist = { url = "https://files.pythonhosted.org/packages/98/33/dc28393f16385f722c893cb55539c641c9aaec8d1bc1c15b69ce0ac2dbb3/sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4", size = 17398, upload-time = "2020-02-29T04:14:43.378Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/09/5de5ed43a521387f18bdf5f5af31d099605c992fd25372b2b9b825ce48ee/sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e", size = 84690, upload-time = "2020-02-29T04:14:40.765Z" }, +] + +[[package]] +name = "sphinxcontrib-devhelp" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.11.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.11.*' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.10.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.10.*' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.9.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.9.*' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.11.*' and sys_platform == 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.11.*' and sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.10.*' and sys_platform == 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.10.*' and sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.9.*' and sys_platform == 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.9.*' and sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.14' and sys_platform == 'emscripten' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.11.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.11.*' and sys_platform == 'emscripten' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.10.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.10.*' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.9.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.9.*' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", +] +sdist = { url = "https://files.pythonhosted.org/packages/f6/d2/5beee64d3e4e747f316bae86b55943f51e82bb86ecd325883ef65741e7da/sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad", size = 12967, upload-time = "2024-07-29T01:09:23.417Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2", size = 82530, upload-time = "2024-07-29T01:09:21.945Z" }, +] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.0.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version > '3.8' and python_full_version < '3.9' and sys_platform == 'win32'", + "python_full_version <= '3.8' and sys_platform == 'win32'", + "python_full_version >= '3.8.1' and python_full_version < '3.9' and sys_platform != 'win32'", + "python_full_version > '3.8' and python_full_version < '3.8.1' and sys_platform != 'win32'", + "python_full_version <= '3.8' and sys_platform != 'win32'", +] +sdist = { url = "https://files.pythonhosted.org/packages/b3/47/64cff68ea3aa450c373301e5bebfbb9fce0a3e70aca245fcadd4af06cd75/sphinxcontrib-htmlhelp-2.0.1.tar.gz", hash = "sha256:0cbdd302815330058422b98a113195c9249825d681e18f11e8b1f78a2f11efff", size = 27967, upload-time = "2023-01-31T17:29:20.935Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6e/ee/a1f5e39046cbb5f8bc8fba87d1ddf1c6643fbc9194e58d26e606de4b9074/sphinxcontrib_htmlhelp-2.0.1-py3-none-any.whl", hash = "sha256:c38cb46dccf316c79de6e5515e1770414b797162b23cd3d06e67020e1d2a6903", size = 99833, upload-time = "2023-01-31T17:29:18.489Z" }, +] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.11.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.11.*' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.10.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.10.*' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.9.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.9.*' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.11.*' and sys_platform == 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.11.*' and sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.10.*' and sys_platform == 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.10.*' and sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.9.*' and sys_platform == 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.9.*' and sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.14' and sys_platform == 'emscripten' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.11.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.11.*' and sys_platform == 'emscripten' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.10.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.10.*' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.9.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.9.*' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", +] +sdist = { url = "https://files.pythonhosted.org/packages/43/93/983afd9aa001e5201eab16b5a444ed5b9b0a7a010541e0ddfbbfd0b2470c/sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9", size = 22617, upload-time = "2024-07-29T01:09:37.889Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8", size = 98705, upload-time = "2024-07-29T01:09:36.407Z" }, +] + +[[package]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/e8/9ed3830aeed71f17c026a07a5097edcf44b692850ef215b161b8ad875729/sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8", size = 5787, upload-time = "2019-01-21T16:10:16.347Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", size = 5071, upload-time = "2019-01-21T16:10:14.333Z" }, +] + +[[package]] +name = "sphinxcontrib-qthelp" +version = "1.0.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version > '3.8' and python_full_version < '3.9' and sys_platform == 'win32'", + "python_full_version <= '3.8' and sys_platform == 'win32'", + "python_full_version >= '3.8.1' and python_full_version < '3.9' and sys_platform != 'win32'", + "python_full_version > '3.8' and python_full_version < '3.8.1' and sys_platform != 'win32'", + "python_full_version <= '3.8' and sys_platform != 'win32'", +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/8e/c4846e59f38a5f2b4a0e3b27af38f2fcf904d4bfd82095bf92de0b114ebd/sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72", size = 21658, upload-time = "2020-02-29T04:19:10.026Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2b/14/05f9206cf4e9cfca1afb5fd224c7cd434dcc3a433d6d9e4e0264d29c6cdb/sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6", size = 90609, upload-time = "2020-02-29T04:19:08.451Z" }, +] + +[[package]] +name = "sphinxcontrib-qthelp" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.11.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.11.*' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.10.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.10.*' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.9.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.9.*' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.11.*' and sys_platform == 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.11.*' and sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.10.*' and sys_platform == 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.10.*' and sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.9.*' and sys_platform == 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.9.*' and sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.14' and sys_platform == 'emscripten' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.11.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.11.*' and sys_platform == 'emscripten' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.10.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.10.*' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.9.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.9.*' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", +] +sdist = { url = "https://files.pythonhosted.org/packages/68/bc/9104308fc285eb3e0b31b67688235db556cd5b0ef31d96f30e45f2e51cae/sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab", size = 17165, upload-time = "2024-07-29T01:09:56.435Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb", size = 88743, upload-time = "2024-07-29T01:09:54.885Z" }, +] + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "1.1.5" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version > '3.8' and python_full_version < '3.9' and sys_platform == 'win32'", + "python_full_version <= '3.8' and sys_platform == 'win32'", + "python_full_version >= '3.8.1' and python_full_version < '3.9' and sys_platform != 'win32'", + "python_full_version > '3.8' and python_full_version < '3.8.1' and sys_platform != 'win32'", + "python_full_version <= '3.8' and sys_platform != 'win32'", +] +sdist = { url = "https://files.pythonhosted.org/packages/b5/72/835d6fadb9e5d02304cf39b18f93d227cd93abd3c41ebf58e6853eeb1455/sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952", size = 21019, upload-time = "2021-05-22T16:07:43.043Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/77/5464ec50dd0f1c1037e3c93249b040c8fc8078fdda97530eeb02424b6eea/sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd", size = 94021, upload-time = "2021-05-22T16:07:41.627Z" }, +] + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.11.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.11.*' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.10.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.10.*' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.9.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.9.*' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra == 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.11.*' and sys_platform == 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.11.*' and sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.10.*' and sys_platform == 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.10.*' and sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.9.*' and sys_platform == 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version == '3.9.*' and sys_platform != 'win32' and extra == 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2' and extra != 'extra-6-plotly-dev-pandas3'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.14' and sys_platform == 'emscripten' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.11.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.11.*' and sys_platform == 'emscripten' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.10.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.10.*' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.9.*' and sys_platform == 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", + "python_full_version == '3.9.*' and sys_platform != 'win32' and extra != 'extra-6-plotly-dev-pandas1' and extra != 'extra-6-plotly-dev-pandas2'", +] +sdist = { url = "https://files.pythonhosted.org/packages/3b/44/6716b257b0aa6bfd51a1b31665d1c205fb12cb5ad56de752dfa15657de2f/sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d", size = 16080, upload-time = "2024-07-29T01:10:09.332Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", size = 92072, upload-time = "2024-07-29T01:10:08.203Z" }, +] + [[package]] name = "stack-data" version = "0.6.3" From a933f1b6954033c5487756c05022edc3dd1824be Mon Sep 17 00:00:00 2001 From: Eric Larson Date: Wed, 12 Aug 2026 09:17:16 -0500 Subject: [PATCH 02/11] feat: thumbnails for repr-displayed figures and image_scrapers=("plotly",) --- CHANGELOG.md | 2 +- plotly/__init__.py | 14 +++++++++ plotly/io/_sg_scraper.py | 40 ++++++++++++++++++++++- tests/test_io/test_sg_scraper.py | 54 ++++++++++++++++++++++++++++++-- 4 files changed, 106 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c008cae7d06..48460fa6bf6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). ### Fixed - Fix `hex_to_rgb` parsing of 3-digit shorthand hexadecimal colors such as `#FFF` [[#5662](https://github.com/plotly/plotly.py/pull/5662)], with thanks to @genrichez for the contribution! - Add `` to the `to_html()` template to comply with modern web standards [[#5693](https://github.com/plotly/plotly.py/pull/5693)], with thanks to @mishrakushal for the contribution! -- Fix the sphinx-gallery scraper so that it generates thumbnails for figures shown with `fig.show()` and no longer scrapes files belonging to other examples during parallel builds [[#4722](https://github.com/plotly/plotly.py/issues/4722), [#4959](https://github.com/plotly/plotly.py/issues/4959)], with thanks to @larsoner for the contribution! +- Fix the sphinx-gallery scraper so that it generates thumbnails for figures shown with `fig.show()` or displayed as the last expression of a code block, and no longer scrapes files belonging to other examples during parallel builds [[#4722](https://github.com/plotly/plotly.py/issues/4722), [#4959](https://github.com/plotly/plotly.py/issues/4959)], with thanks to @larsoner for the contribution! ## [6.9.0] - 2026-07-09 diff --git a/plotly/__init__.py b/plotly/__init__.py index aae0a00b2af..9f18c1ab9dc 100644 --- a/plotly/__init__.py +++ b/plotly/__init__.py @@ -182,6 +182,20 @@ def hist_series(data_frame, **kwargs): return histogram(data_frame, **new_kwargs) +def _get_sg_image_scraper(): + """Called by sphinx-gallery when ``"plotly"`` is listed in ``image_scrapers``. + + See https://sphinx-gallery.github.io/stable/advanced.html#integrate-custom-scrapers-with-sphinx-gallery + """ + import plotly.io as pio + from plotly.io._sg_scraper import plotly_sg_scraper + + # Not left to the import side effect: sphinx-gallery resolves the scraper + # repeatedly, so this also undoes any later renderer change. + pio.renderers.default = "sphinx_gallery_png" + return plotly_sg_scraper + + def _jupyter_labextension_paths(): """Called by Jupyter Lab Server to detect if it is a valid labextension and to install the extension. diff --git a/plotly/io/_sg_scraper.py b/plotly/io/_sg_scraper.py index 9402d24056f..159c2433a9b 100644 --- a/plotly/io/_sg_scraper.py +++ b/plotly/io/_sg_scraper.py @@ -1,9 +1,11 @@ # This module defines an image scraper for sphinx-gallery # https://sphinx-gallery.github.io/ # which can be used by projects using plotly in their documentation. +import ast import os import plotly +from plotly.basedatatypes import BaseFigure from plotly.io._base_renderers import sphinx_gallery_figures plotly.io.renderers.default = "sphinx_gallery_png" @@ -23,6 +25,11 @@ def plotly_sg_scraper(block, block_vars, gallery_conf, **kwargs): and once as a static image, which sphinx-gallery uses to generate the thumbnail of the example. + A figure that is instead displayed by making it the last expression of a + code block (sphinx-gallery's repr capture) gets a static image too, so + that it can also serve as the thumbnail; its HTML is embedded by + sphinx-gallery itself. + Parameters ---------- block : tuple @@ -50,13 +57,24 @@ def plotly_sg_scraper(block, block_vars, gallery_conf, **kwargs): if image_format not in ("png", "svg"): raise ValueError(f"format must be one of 'png' or 'svg', got {image_format!r}") image_path_iterator = block_vars["image_path_iterator"] + figures = [(fig_dict, True) for fig_dict in sphinx_gallery_figures] + repr_figure = _trailing_repr_figure(block, block_vars) + if repr_figure is not None: + fig_dict = repr_figure.to_dict() + # A figure both shown and repr-displayed only needs one image. + if fig_dict not in sphinx_gallery_figures: + figures.append((fig_dict, False)) html_names = [] try: - for fig_dict, image_path in zip(sphinx_gallery_figures, image_path_iterator): + for (fig_dict, shown), image_path in zip(figures, image_path_iterator): # sphinx-gallery hands out one path per image; the HTML file sits # next to the image it is the interactive counterpart of. path_root = os.path.splitext(image_path)[0] _write_image(fig_dict, f"{path_root}.{image_format}", image_format) + if not shown: + # Repr-displayed: sphinx-gallery embeds the HTML itself, the + # static image only makes the figure available as a thumbnail. + continue plotly.io.write_html( fig_dict, file=f"{path_root}.html", @@ -74,6 +92,26 @@ def plotly_sg_scraper(block, block_vars, gallery_conf, **kwargs): return figure_rst(html_names, gallery_conf["src_dir"]) +def _trailing_repr_figure(block, block_vars): + """Return the figure displayed via repr capture in this block, if any. + + Sphinx-gallery stores a code block's trailing expression value as ``___`` + in the example globals so that its repr can be embedded in the page. + """ + figure = block_vars.get("example_globals", {}).get("___") + if not isinstance(figure, BaseFigure): + return None + try: + body = ast.parse(block[1]).body + except SyntaxError: + return None + # ``___`` survives blocks without a trailing expression, so require one to + # know the value was set by this block rather than an earlier one. + if not (body and isinstance(body[-1], ast.Expr)): + return None + return figure + + def _write_image(fig_dict, file, image_format): """Write a static image, with a helpful message if that is not possible.""" try: diff --git a/tests/test_io/test_sg_scraper.py b/tests/test_io/test_sg_scraper.py index 8340a943db1..f5273c9fadb 100644 --- a/tests/test_io/test_sg_scraper.py +++ b/tests/test_io/test_sg_scraper.py @@ -87,11 +87,12 @@ def gallery(tmp_path, monkeypatch): block_vars = { "image_path_iterator": ImagePathIterator(template), "src_file": src_file, + "example_globals": {}, } - def scrape(): + def scrape(content=""): """Scrape one code block, as sphinx-gallery does after executing it.""" - return save_figures(("code", "", 1), block_vars, conf) + return save_figures(("code", content, 1), block_vars, conf) def thumbnail(**file_conf): """Generate the gallery thumbnail and return the one file produced.""" @@ -102,6 +103,7 @@ def thumbnail(**file_conf): yield SimpleNamespace( conf=conf, example_dir=example_dir, + globals=block_vars["example_globals"], paths=block_vars["image_path_iterator"].paths, scraper=plotly_sg_scraper, scrape=scrape, @@ -162,6 +164,40 @@ def test_scraper_ignores_other_examples(gallery): assert rst.count(".. raw:: html") == 1 +def test_scraper_repr_figure(gallery): + """A figure displayed as a block's last expression still gets a thumbnail. + + Sphinx-gallery embeds the HTML of such figures itself (repr capture), so + the scraper must contribute only the static image. + """ + fig = go.Figure(data=[go.Scatter(x=[1, 2, 3], y=[3, 2, 1])]) + gallery.globals["___"] = fig # as sphinx-gallery's repr capture leaves it + rst = gallery.scrape("fig.update_layout(title='hi')\nfig") + + assert rst == "" + assert len(gallery.paths) == 1 + root = os.path.splitext(gallery.paths[0])[0] + assert not os.path.isfile(f"{root}.html") + assert_image_color(Path(f"{root}.png"), COLORS[0], "png") + assert_image_color(gallery.thumbnail(), COLORS[0], "png") + + # ``___`` survives into blocks without a trailing expression; the stale + # figure must not be scraped again + assert gallery.scrape("x = 1") == "" + assert len(gallery.paths) == 1 + + +def test_scraper_repr_of_shown_figure_not_duplicated(gallery): + """A figure that is both shown and the last expression is scraped once.""" + fig = go.Figure(data=[go.Scatter(x=[1, 2, 3], y=[3, 2, 1])]) + fig.show() + gallery.globals["___"] = fig + rst = gallery.scrape("fig.show()\nfig") + + assert rst.count(".. raw:: html") == 1 + assert len(gallery.paths) == 1 + + def test_scraper_bad_format(gallery): gallery.conf["image_scrapers"] = (functools.partial(gallery.scraper, format="pdf"),) pio.show(go.Figure()) @@ -184,6 +220,20 @@ def raise_no_browser(*args, **kwargs): assert gallery.scrape() == "" # the failed figure is not scraped again +def test_image_scrapers_by_name(monkeypatch): + """`image_scrapers=("plotly",)` must resolve through sphinx-gallery.""" + from sphinx_gallery.gen_rst import _get_callables + + from plotly.io._sg_scraper import plotly_sg_scraper + + monkeypatch.setattr(pio.renderers, "default", "browser") + (scraper,) = _get_callables({"image_scrapers": ("plotly",)}, "image_scrapers") + assert scraper is plotly_sg_scraper + # Resolving the scraper must select the renderer that it knows how to + # scrape, so that no other configuration is needed. + assert pio.renderers.default == "sphinx_gallery_png" + + def test_import_sets_default_renderer(monkeypatch): """Importing the scraper selects the renderer that it knows how to scrape.""" monkeypatch.setattr(pio.renderers, "default", "browser") From 020ee67d0f870f9265e7e3e0ed536dcabfac8e12 Mon Sep 17 00:00:00 2001 From: Eric Larson Date: Wed, 12 Aug 2026 09:40:20 -0500 Subject: [PATCH 03/11] feat: degrade gracefully when static image export is unavailable Probe Kaleido/browser availability once per build; when unavailable, emit a single sphinx warning (suppressible via suppress_warnings = ["plotly.sg_scraper"]), embed shown figures inline in the rst instead of via files (sphinx-gallery requires an image file for every image path consumed), and let examples fall back to placeholder thumbnails. Co-Authored-By: Claude Fable 5 --- CHANGELOG.md | 2 +- plotly/io/_sg_scraper.py | 77 +++++++++++++++++++++++++++----- tests/test_io/test_sg_scraper.py | 41 ++++++++++++++--- 3 files changed, 102 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 48460fa6bf6..f3a6b3cab2e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). ### Fixed - Fix `hex_to_rgb` parsing of 3-digit shorthand hexadecimal colors such as `#FFF` [[#5662](https://github.com/plotly/plotly.py/pull/5662)], with thanks to @genrichez for the contribution! - Add `` to the `to_html()` template to comply with modern web standards [[#5693](https://github.com/plotly/plotly.py/pull/5693)], with thanks to @mishrakushal for the contribution! -- Fix the sphinx-gallery scraper so that it generates thumbnails for figures shown with `fig.show()` or displayed as the last expression of a code block, and no longer scrapes files belonging to other examples during parallel builds [[#4722](https://github.com/plotly/plotly.py/issues/4722), [#4959](https://github.com/plotly/plotly.py/issues/4959)], with thanks to @larsoner for the contribution! +- Fix the sphinx-gallery scraper so that it generates thumbnails for figures shown with `fig.show()` or displayed as the last expression of a code block, warns once (instead of failing the build) when static image export is unavailable, and no longer scrapes files belonging to other examples during parallel builds [[#4722](https://github.com/plotly/plotly.py/issues/4722), [#4959](https://github.com/plotly/plotly.py/issues/4959)], with thanks to @larsoner for the contribution! ## [6.9.0] - 2026-07-09 diff --git a/plotly/io/_sg_scraper.py b/plotly/io/_sg_scraper.py index 159c2433a9b..8dcc5b341c4 100644 --- a/plotly/io/_sg_scraper.py +++ b/plotly/io/_sg_scraper.py @@ -2,7 +2,10 @@ # https://sphinx-gallery.github.io/ # which can be used by projects using plotly in their documentation. import ast +import functools +import logging import os +import textwrap import plotly from plotly.basedatatypes import BaseFigure @@ -30,6 +33,10 @@ def plotly_sg_scraper(block, block_vars, gallery_conf, **kwargs): that it can also serve as the thumbnail; its HTML is embedded by sphinx-gallery itself. + Static image export requires Kaleido and a Chromium-based browser; when + unavailable, a warning is emitted once per build and the examples fall + back to placeholder thumbnails, with the interactive figures unaffected. + Parameters ---------- block : tuple @@ -64,8 +71,15 @@ def plotly_sg_scraper(block, block_vars, gallery_conf, **kwargs): # A figure both shown and repr-displayed only needs one image. if fig_dict not in sphinx_gallery_figures: figures.append((fig_dict, False)) - html_names = [] try: + if not _static_export_available(): + # No images means no thumbnails, and sphinx-gallery requires an + # image for every path taken from the iterator, so embed shown + # figures inline instead of via files. + return "".join( + _inline_html(fig_dict) for fig_dict, shown in figures if shown + ) + html_names = [] for (fig_dict, shown), image_path in zip(figures, image_path_iterator): # sphinx-gallery hands out one path per image; the HTML file sits # next to the image it is the interactive counterpart of. @@ -85,11 +99,11 @@ def plotly_sg_scraper(block, block_vars, gallery_conf, **kwargs): validate=False, ) html_names.append(f"{path_root}.html") + # Use the `figure_rst` helper function to generate rST for image files + return figure_rst(html_names, gallery_conf["src_dir"]) finally: # Don't let figures leak into the next block if writing one failed. del sphinx_gallery_figures[:] - # Use the `figure_rst` helper function to generate rST for image files - return figure_rst(html_names, gallery_conf["src_dir"]) def _trailing_repr_figure(block, block_vars): @@ -112,20 +126,63 @@ def _trailing_repr_figure(block, block_vars): return figure +# Whether static image export works at all, probed on the first scrape so +# that a build without Kaleido or a browser warns once (per worker, for +# parallel sphinx-gallery builds) instead of once per figure. +_export_available = None + + +def _static_export_available(): + global _export_available + if _export_available is None: + try: + plotly.io.to_image({"data": []}, format="png", validate=False) + except Exception as exc: + _export_available = False + try: + from sphinx.util.logging import getLogger + + warn = functools.partial( + getLogger(__name__).warning, type="plotly", subtype="sg_scraper" + ) + except Exception: + warn = logging.getLogger(__name__).warning + warn( + "plotly static image export is unavailable, so example " + "thumbnails will fall back to a placeholder image. Static " + "export requires Kaleido and a Chromium-based browser; see " + "https://plotly.com/python/static-image-export/ for " + "installation instructions. The failure was: %s: %s", + type(exc).__name__, + exc, + ) + else: + _export_available = True + return _export_available + + +def _inline_html(fig_dict): + """Embed a figure into the rst directly, rather than via a file.""" + html = plotly.io.to_html( + fig_dict, + include_plotlyjs="cdn", + full_html=False, + default_width="100%", + default_height=525, + validate=False, + ) + return "\n.. raw:: html\n\n" + textwrap.indent(html, " ") + "\n" + + def _write_image(fig_dict, file, image_format): """Write a static image, with a helpful message if that is not possible.""" try: plotly.io.write_image(fig_dict, file, format=image_format, validate=False) except Exception as exc: raise RuntimeError( - f"Kaleido and a compatible browser are required to use the " - f"`sphinx_gallery_png` renderer, but writing {file} failed with: " - f"{type(exc).__name__}: {exc}\n" + f"Writing {file} failed with:\n{type(exc).__name__}: {exc}\n" "See https://plotly.com/python/static-image-export/ for " - "installation instructions. Alternatively, you can use the " - "`sphinx_gallery` renderer without this scraper (note that " - "thumbnails can only be generated with the `sphinx_gallery_png` " - "renderer)." + "requirements and installation instructions." ) from exc diff --git a/tests/test_io/test_sg_scraper.py b/tests/test_io/test_sg_scraper.py index f5273c9fadb..e9a7c2535ee 100644 --- a/tests/test_io/test_sg_scraper.py +++ b/tests/test_io/test_sg_scraper.py @@ -8,6 +8,7 @@ import functools import importlib +import logging import os from pathlib import Path from types import SimpleNamespace @@ -66,6 +67,7 @@ def gallery(tmp_path, monkeypatch): from sphinx_gallery.gen_rst import save_thumbnail from sphinx_gallery.scrapers import ImagePathIterator, save_figures + import plotly.io._sg_scraper as sg_scraper from plotly.io._base_renderers import sphinx_gallery_figures from plotly.io._sg_scraper import plotly_sg_scraper @@ -73,6 +75,8 @@ def gallery(tmp_path, monkeypatch): # is imported, which may have happened in another test already. monkeypatch.setattr(pio.renderers, "default", "sphinx_gallery_png") monkeypatch.setattr(pio, "write_image", dummy_image_writer()) + # Images come from the stand-in above, so skip the Kaleido probe. + monkeypatch.setattr(sg_scraper, "_export_available", True) example_dir = tmp_path / "auto_examples" thumb_dir = example_dir / "images" / "thumb" @@ -205,19 +209,42 @@ def test_scraper_bad_format(gallery): gallery.scrape() -def test_scraper_image_error(gallery, monkeypatch): - """A failure to write the image says how to fix it, and doesn't stick.""" +def test_scraper_no_static_export(gallery, monkeypatch, caplog): + """Without static export, warn once and keep the interactive figures. + + Sphinx-gallery requires an image file for every image path taken, so no + image paths may be consumed either; the examples then get sphinx-gallery's + placeholder thumbnail. + """ + import plotly.io._sg_scraper as sg_scraper def raise_no_browser(*args, **kwargs): raise ValueError("no browser") - monkeypatch.setattr(pio, "write_image", raise_no_browser) - pio.show(go.Figure()) + monkeypatch.setattr(pio, "to_image", raise_no_browser) + monkeypatch.setattr(sg_scraper, "_export_available", None) + fig = go.Figure(data=[go.Scatter(x=[1, 2, 3], y=[3, 2, 1])]) + pio.show(fig) + gallery.globals["___"] = fig - with pytest.raises(RuntimeError, match="Kaleido"): - gallery.scrape() + with caplog.at_level(logging.WARNING): + rst = gallery.scrape("fig.show()") - assert gallery.scrape() == "" # the failed figure is not scraped again + # The shown figure is embedded inline instead of via files + assert rst.count(".. raw:: html") == 1 + assert "Scatter" not in rst # inlined as HTML, not as a repr + assert "plotly-graph-div" in rst + assert gallery.paths == [] + warnings = [r for r in caplog.records if "Kaleido" in r.getMessage()] + assert len(warnings) == 1 + assert "no browser" in warnings[0].getMessage() + + # Only one warning per build, however many blocks follow; repr-displayed + # figures are embedded by sphinx-gallery itself so they scrape to nothing + with caplog.at_level(logging.WARNING): + assert gallery.scrape("fig") == "" + assert gallery.paths == [] + assert len([r for r in caplog.records if "Kaleido" in r.getMessage()]) == 1 def test_image_scrapers_by_name(monkeypatch): From 0795b264c2af5cdb08321bc47f97142455f22830 Mon Sep 17 00:00:00 2001 From: Eric Larson Date: Wed, 12 Aug 2026 09:54:42 -0500 Subject: [PATCH 04/11] refactor: cache the static-export probe instead of a module global Co-Authored-By: Claude Fable 5 --- plotly/io/_sg_scraper.py | 56 +++++++++++++++----------------- tests/test_io/test_sg_scraper.py | 8 +++-- 2 files changed, 31 insertions(+), 33 deletions(-) diff --git a/plotly/io/_sg_scraper.py b/plotly/io/_sg_scraper.py index 8dcc5b341c4..3646fe0c54b 100644 --- a/plotly/io/_sg_scraper.py +++ b/plotly/io/_sg_scraper.py @@ -126,39 +126,35 @@ def _trailing_repr_figure(block, block_vars): return figure -# Whether static image export works at all, probed on the first scrape so -# that a build without Kaleido or a browser warns once (per worker, for -# parallel sphinx-gallery builds) instead of once per figure. -_export_available = None - - +@functools.lru_cache(maxsize=None) # functools.cache needs Python 3.9 def _static_export_available(): - global _export_available - if _export_available is None: + """Whether static image export works, probed on the first scrape. + + Cached so that a build without Kaleido or a browser warns once (per + worker, for parallel sphinx-gallery builds) instead of once per figure. + """ + try: + plotly.io.to_image({"data": []}, format="png", validate=False) + except Exception as exc: try: - plotly.io.to_image({"data": []}, format="png", validate=False) - except Exception as exc: - _export_available = False - try: - from sphinx.util.logging import getLogger - - warn = functools.partial( - getLogger(__name__).warning, type="plotly", subtype="sg_scraper" - ) - except Exception: - warn = logging.getLogger(__name__).warning - warn( - "plotly static image export is unavailable, so example " - "thumbnails will fall back to a placeholder image. Static " - "export requires Kaleido and a Chromium-based browser; see " - "https://plotly.com/python/static-image-export/ for " - "installation instructions. The failure was: %s: %s", - type(exc).__name__, - exc, + from sphinx.util.logging import getLogger + + warn = functools.partial( + getLogger(__name__).warning, type="plotly", subtype="sg_scraper" ) - else: - _export_available = True - return _export_available + except Exception: + warn = logging.getLogger(__name__).warning + warn( + "plotly static image export is unavailable, so example " + "thumbnails will fall back to a placeholder image. Static " + "export requires Kaleido and a Chromium-based browser; see " + "https://plotly.com/python/static-image-export/ for " + "installation instructions. The failure was: %s: %s", + type(exc).__name__, + exc, + ) + return False + return True def _inline_html(fig_dict): diff --git a/tests/test_io/test_sg_scraper.py b/tests/test_io/test_sg_scraper.py index e9a7c2535ee..3ea1d347003 100644 --- a/tests/test_io/test_sg_scraper.py +++ b/tests/test_io/test_sg_scraper.py @@ -75,8 +75,9 @@ def gallery(tmp_path, monkeypatch): # is imported, which may have happened in another test already. monkeypatch.setattr(pio.renderers, "default", "sphinx_gallery_png") monkeypatch.setattr(pio, "write_image", dummy_image_writer()) - # Images come from the stand-in above, so skip the Kaleido probe. - monkeypatch.setattr(sg_scraper, "_export_available", True) + # Images come from the stand-in above, so the Kaleido probe must pass too + monkeypatch.setattr(pio, "to_image", lambda *args, **kwargs: b"") + sg_scraper._static_export_available.cache_clear() example_dir = tmp_path / "auto_examples" thumb_dir = example_dir / "images" / "thumb" @@ -114,6 +115,7 @@ def thumbnail(**file_conf): thumbnail=thumbnail, ) del sphinx_gallery_figures[:] + sg_scraper._static_export_available.cache_clear() @pytest.mark.parametrize("image_format", ["png", "svg"]) @@ -222,7 +224,7 @@ def raise_no_browser(*args, **kwargs): raise ValueError("no browser") monkeypatch.setattr(pio, "to_image", raise_no_browser) - monkeypatch.setattr(sg_scraper, "_export_available", None) + sg_scraper._static_export_available.cache_clear() fig = go.Figure(data=[go.Scatter(x=[1, 2, 3], y=[3, 2, 1])]) pio.show(fig) gallery.globals["___"] = fig From 76d3aaefe9d919d1234d7667021ca9dc9a27672e Mon Sep 17 00:00:00 2001 From: Eric Larson Date: Wed, 12 Aug 2026 10:36:48 -0500 Subject: [PATCH 05/11] fix: usable repr sizing and themable embeds for sphinx-gallery - The _repr_html_ fallback (hit when the default renderer is not a mimetype renderer, e.g. sphinx_gallery_png) now sizes like the html renderers (default_height=525) instead of height:100%, which collapses or overflows in containers with no set height. - The scraper now embeds shown figures inline in the rst, wrapped in the same output_subarea div sphinx-gallery wraps captured HTML reprs in, so themes can style both kinds of embed with one hook; it no longer writes .html files next to the images. Co-Authored-By: Claude Fable 5 --- plotly/basedatatypes.py | 9 +++- plotly/io/_sg_scraper.py | 89 ++++++++++---------------------- tests/test_io/test_sg_scraper.py | 20 +++++-- 3 files changed, 52 insertions(+), 66 deletions(-) diff --git a/plotly/basedatatypes.py b/plotly/basedatatypes.py index ec4038b7fa4..b7bb73fb3cb 100644 --- a/plotly/basedatatypes.py +++ b/plotly/basedatatypes.py @@ -825,7 +825,14 @@ def _repr_html_(self): if "text/html" in bundle: return bundle["text/html"] else: - return self.to_html(full_html=False, include_plotlyjs="cdn") + # Size like the html renderers do: "100%" height collapses or + # overflows in plain-HTML consumers such as sphinx-gallery. + return self.to_html( + full_html=False, + include_plotlyjs="cdn", + default_width="100%", + default_height=525, + ) def _repr_mimebundle_(self, include=None, exclude=None, validate=True, **kwargs): """ diff --git a/plotly/io/_sg_scraper.py b/plotly/io/_sg_scraper.py index 3646fe0c54b..ea334005f69 100644 --- a/plotly/io/_sg_scraper.py +++ b/plotly/io/_sg_scraper.py @@ -23,10 +23,9 @@ def plotly_sg_scraper(block, block_vars, gallery_conf, **kwargs): ``sphinx_gallery_png`` renderer, which is made the default renderer as a side effect of importing this module. - Every figure shown that way is written to the gallery image directory - twice: once as an interactive HTML file, which is embedded in the page, - and once as a static image, which sphinx-gallery uses to generate the - thumbnail of the example. + Every figure shown that way is embedded in the page as interactive HTML, + and written to the gallery image directory as a static image, which + sphinx-gallery uses to generate the thumbnail of the example. A figure that is instead displayed by making it the last expression of a code block (sphinx-gallery's repr capture) gets a static image too, so @@ -72,35 +71,20 @@ def plotly_sg_scraper(block, block_vars, gallery_conf, **kwargs): if fig_dict not in sphinx_gallery_figures: figures.append((fig_dict, False)) try: - if not _static_export_available(): - # No images means no thumbnails, and sphinx-gallery requires an - # image for every path taken from the iterator, so embed shown - # figures inline instead of via files. - return "".join( - _inline_html(fig_dict) for fig_dict, shown in figures if shown - ) - html_names = [] - for (fig_dict, shown), image_path in zip(figures, image_path_iterator): - # sphinx-gallery hands out one path per image; the HTML file sits - # next to the image it is the interactive counterpart of. - path_root = os.path.splitext(image_path)[0] - _write_image(fig_dict, f"{path_root}.{image_format}", image_format) - if not shown: - # Repr-displayed: sphinx-gallery embeds the HTML itself, the - # static image only makes the figure available as a thumbnail. - continue - plotly.io.write_html( - fig_dict, - file=f"{path_root}.html", - include_plotlyjs="cdn", - full_html=False, - default_width="100%", - default_height=525, - validate=False, - ) - html_names.append(f"{path_root}.html") - # Use the `figure_rst` helper function to generate rST for image files - return figure_rst(html_names, gallery_conf["src_dir"]) + export_available = _static_export_available() + rst = "" + for fig_dict, shown in figures: + if export_available: + # sphinx-gallery requires an image at every path taken from + # the iterator, so don't consume paths when export failed. + image_path = next(image_path_iterator) + path_root = os.path.splitext(image_path)[0] + _write_image(fig_dict, f"{path_root}.{image_format}", image_format) + if shown: + # Repr-displayed figures are embedded by sphinx-gallery + # itself; their static image only serves as the thumbnail. + rst += _inline_html(fig_dict) + return rst finally: # Don't let figures leak into the next block if writing one failed. del sphinx_gallery_figures[:] @@ -158,7 +142,11 @@ def _static_export_available(): def _inline_html(fig_dict): - """Embed a figure into the rst directly, rather than via a file.""" + """Embed a figure into the rst directly, rather than via a file. + + The figure is wrapped in the same div that sphinx-gallery wraps captured + HTML reprs in, so that themes can style both kinds of embed alike. + """ html = plotly.io.to_html( fig_dict, include_plotlyjs="cdn", @@ -167,6 +155,11 @@ def _inline_html(fig_dict): default_height=525, validate=False, ) + html = ( + '
\n' + f"{html}\n" + "
" + ) return "\n.. raw:: html\n\n" + textwrap.indent(html, " ") + "\n" @@ -182,31 +175,3 @@ def _write_image(fig_dict, file, image_format): ) from exc -def figure_rst(figure_list, sources_dir): - """Generate RST for a list of HTML filenames. - - Parameters - ---------- - figure_list : list - List of strings of the figures' absolute paths. - sources_dir : str - absolute path of Sphinx documentation sources (unused, kept for - compatibility with the equivalent sphinx-gallery helper) - - Returns - ------- - images_rst : str - rst code to embed the images in the document - """ - # The HTML files live in the "images" directory next to the document that - # includes them, so the paths are relative to that document. - return "".join( - SINGLE_HTML % ("images/" + os.path.basename(figure_path)) - for figure_path in figure_list - ) - - -SINGLE_HTML = """ -.. raw:: html - :file: %s -""" diff --git a/tests/test_io/test_sg_scraper.py b/tests/test_io/test_sg_scraper.py index 3ea1d347003..985c2216bdb 100644 --- a/tests/test_io/test_sg_scraper.py +++ b/tests/test_io/test_sg_scraper.py @@ -120,7 +120,7 @@ def thumbnail(**file_conf): @pytest.mark.parametrize("image_format", ["png", "svg"]) def test_scraper(gallery, image_format): - """Each shown figure gets an image and an HTML file, and can be a thumbnail.""" + """Each shown figure gets an embed and a static image, and can be a thumbnail.""" # Selecting a format by wrapping the scraper is the approach documented at # https://sphinx-gallery.github.io/stable/advanced.html#example-3-matplotlib-with-svg-format gallery.conf["image_scrapers"] = ( @@ -135,10 +135,11 @@ def test_scraper(gallery, image_format): assert len(gallery.paths) == 2 for path, color in zip(gallery.paths, COLORS): root = os.path.splitext(path)[0] - assert os.path.isfile(f"{root}.html") - assert f"images/{os.path.basename(root)}.html" in rst assert_image_color(Path(f"{root}.{image_format}"), color, image_format) assert rst.count(".. raw:: html") == 2 + assert rst.count("plotly-graph-div") == 2 + # The wrapper sphinx-gallery uses for HTML reprs, so themes can style both + assert rst.count('class="output_subarea') == 2 # The thumbnail must be a scraped figure rather than a "no image" default, # and one image per figure in order is what makes `thumbnail_number` work @@ -249,6 +250,19 @@ def raise_no_browser(*args, **kwargs): assert len([r for r in caplog.records if "Kaleido" in r.getMessage()]) == 1 +def test_repr_html_fallback_size(monkeypatch): + """The repr of a figure must have a usable pixel height, not "100%". + + With the (non-mimetype) sphinx_gallery_png renderer selected, sphinx- + gallery captures ``_repr_html_``, whose output ends up in a container + with no set height. + """ + monkeypatch.setattr(pio.renderers, "default", "sphinx_gallery_png") + assert 'style="height:525px; width:100%;"' in go.Figure()._repr_html_() + fig = go.Figure(layout={"height": 400}) + assert 'style="height:400px; width:100%;"' in fig._repr_html_() + + def test_image_scrapers_by_name(monkeypatch): """`image_scrapers=("plotly",)` must resolve through sphinx-gallery.""" from sphinx_gallery.gen_rst import _get_callables From 55bd2a3adb6796463a5a84b5828620d09f201a2a Mon Sep 17 00:00:00 2001 From: Eric Larson Date: Wed, 12 Aug 2026 11:22:33 -0500 Subject: [PATCH 06/11] fix: resize embedded figures once the page finishes loading A figure whose inline script draws while the page is still being parsed can be sized to a container whose width changes by the time loading finishes (e.g. pydata-sphinx-theme's secondary sidebar comes after the article in the DOM), leaving it clipped until a window resize. Append a per-figure script to the _repr_html_ fallback and the sphinx-gallery scraper embeds that calls Plotly.Plots.resize once on window load. Co-Authored-By: Claude Fable 5 --- plotly/basedatatypes.py | 8 +++++++- plotly/io/_sg_scraper.py | 7 +++++++ plotly/io/_utils.py | 19 +++++++++++++++++++ tests/test_io/test_sg_scraper.py | 7 ++++++- 4 files changed, 39 insertions(+), 2 deletions(-) diff --git a/plotly/basedatatypes.py b/plotly/basedatatypes.py index b7bb73fb3cb..6c5a7b10688 100644 --- a/plotly/basedatatypes.py +++ b/plotly/basedatatypes.py @@ -825,6 +825,11 @@ def _repr_html_(self): if "text/html" in bundle: return bundle["text/html"] else: + import uuid + + from plotly.io._utils import resize_after_load_script + + div_id = str(uuid.uuid4()) # Size like the html renderers do: "100%" height collapses or # overflows in plain-HTML consumers such as sphinx-gallery. return self.to_html( @@ -832,7 +837,8 @@ def _repr_html_(self): include_plotlyjs="cdn", default_width="100%", default_height=525, - ) + div_id=div_id, + ) + resize_after_load_script(div_id) def _repr_mimebundle_(self, include=None, exclude=None, validate=True, **kwargs): """ diff --git a/plotly/io/_sg_scraper.py b/plotly/io/_sg_scraper.py index ea334005f69..16fc338662a 100644 --- a/plotly/io/_sg_scraper.py +++ b/plotly/io/_sg_scraper.py @@ -6,10 +6,12 @@ import logging import os import textwrap +import uuid import plotly from plotly.basedatatypes import BaseFigure from plotly.io._base_renderers import sphinx_gallery_figures +from plotly.io._utils import resize_after_load_script plotly.io.renderers.default = "sphinx_gallery_png" @@ -147,6 +149,7 @@ def _inline_html(fig_dict): The figure is wrapped in the same div that sphinx-gallery wraps captured HTML reprs in, so that themes can style both kinds of embed alike. """ + div_id = str(uuid.uuid4()) html = plotly.io.to_html( fig_dict, include_plotlyjs="cdn", @@ -154,10 +157,14 @@ def _inline_html(fig_dict): default_width="100%", default_height=525, validate=False, + div_id=div_id, ) html = ( '
\n' f"{html}\n" + # The figure may draw before the page finishes laying out, ending up + # sized to a container whose width then changes. + f"{resize_after_load_script(div_id)}\n" "
" ) return "\n.. raw:: html\n\n" + textwrap.indent(html, " ") + "\n" diff --git a/plotly/io/_utils.py b/plotly/io/_utils.py index 4d27e0326c0..64d372cd44e 100644 --- a/plotly/io/_utils.py +++ b/plotly/io/_utils.py @@ -91,3 +91,22 @@ def plotly_cdn_url(cdn_ver=get_plotlyjs_version()): return "https://cdn.plot.ly/plotly-{cdn_ver}.min.js".format( cdn_ver=cdn_ver, ) + + +def resize_after_load_script(div_id): + """Script that resizes a plotly div once the page finishes loading. + + A figure drawn while its page is still loading (e.g. one embedded in a + sphinx-gallery page) can be sized to a container whose width changes by + the time loading finishes, so fix it up once afterwards. + """ + return ( + '" + ) diff --git a/tests/test_io/test_sg_scraper.py b/tests/test_io/test_sg_scraper.py index 985c2216bdb..c79f19ed2ea 100644 --- a/tests/test_io/test_sg_scraper.py +++ b/tests/test_io/test_sg_scraper.py @@ -140,6 +140,8 @@ def test_scraper(gallery, image_format): assert rst.count("plotly-graph-div") == 2 # The wrapper sphinx-gallery uses for HTML reprs, so themes can style both assert rst.count('class="output_subarea') == 2 + # Fixes up figures drawn while the page was still laying out + assert rst.count("Plotly.Plots.resize") == 2 # The thumbnail must be a scraped figure rather than a "no image" default, # and one image per figure in order is what makes `thumbnail_number` work @@ -258,7 +260,10 @@ def test_repr_html_fallback_size(monkeypatch): with no set height. """ monkeypatch.setattr(pio.renderers, "default", "sphinx_gallery_png") - assert 'style="height:525px; width:100%;"' in go.Figure()._repr_html_() + html = go.Figure()._repr_html_() + assert 'style="height:525px; width:100%;"' in html + # Fixes up figures drawn while the page was still laying out + assert "Plotly.Plots.resize" in html fig = go.Figure(layout={"height": 400}) assert 'style="height:400px; width:100%;"' in fig._repr_html_() From 4d3e3253f796f6d48d60c7c31b28407a1b50173d Mon Sep 17 00:00:00 2001 From: Eric Larson Date: Wed, 12 Aug 2026 11:32:01 -0500 Subject: [PATCH 07/11] feat: style embedded figures as a card on dark pages Move the dark-theme styling out of sphinx-gallery: sphinx-gallery should not carry plotly-specific CSS, so ship a scoped style with each embed (repr fallback and scraper) instead. The white padded card only shows on dark pages (data-theme toggles or OS preference); on light pages it is invisible. Co-Authored-By: Claude Fable 5 --- plotly/basedatatypes.py | 7 ++++--- plotly/io/_sg_scraper.py | 8 ++++---- plotly/io/_utils.py | 21 +++++++++++++++++++++ tests/test_io/test_sg_scraper.py | 4 ++++ 4 files changed, 33 insertions(+), 7 deletions(-) diff --git a/plotly/basedatatypes.py b/plotly/basedatatypes.py index 6c5a7b10688..2bfc2b92d90 100644 --- a/plotly/basedatatypes.py +++ b/plotly/basedatatypes.py @@ -827,18 +827,19 @@ def _repr_html_(self): else: import uuid - from plotly.io._utils import resize_after_load_script + from plotly.io._utils import embed_in_output_card, resize_after_load_script div_id = str(uuid.uuid4()) # Size like the html renderers do: "100%" height collapses or # overflows in plain-HTML consumers such as sphinx-gallery. - return self.to_html( + html = self.to_html( full_html=False, include_plotlyjs="cdn", default_width="100%", default_height=525, div_id=div_id, - ) + resize_after_load_script(div_id) + ) + return embed_in_output_card(html + resize_after_load_script(div_id)) def _repr_mimebundle_(self, include=None, exclude=None, validate=True, **kwargs): """ diff --git a/plotly/io/_sg_scraper.py b/plotly/io/_sg_scraper.py index 16fc338662a..6ae9927399b 100644 --- a/plotly/io/_sg_scraper.py +++ b/plotly/io/_sg_scraper.py @@ -11,7 +11,7 @@ import plotly from plotly.basedatatypes import BaseFigure from plotly.io._base_renderers import sphinx_gallery_figures -from plotly.io._utils import resize_after_load_script +from plotly.io._utils import embed_in_output_card, resize_after_load_script plotly.io.renderers.default = "sphinx_gallery_png" @@ -159,12 +159,12 @@ def _inline_html(fig_dict): validate=False, div_id=div_id, ) + # The figure may draw before the page finishes laying out, ending up + # sized to a container whose width then changes. + html = embed_in_output_card(html + resize_after_load_script(div_id)) html = ( '
\n' f"{html}\n" - # The figure may draw before the page finishes laying out, ending up - # sized to a container whose width then changes. - f"{resize_after_load_script(div_id)}\n" "
" ) return "\n.. raw:: html\n\n" + textwrap.indent(html, " ") + "\n" diff --git a/plotly/io/_utils.py b/plotly/io/_utils.py index 64d372cd44e..0593bf37ec1 100644 --- a/plotly/io/_utils.py +++ b/plotly/io/_utils.py @@ -110,3 +110,24 @@ def resize_after_load_script(div_id): 'else window.addEventListener("load", fit);' "})();" ) + + +def embed_in_output_card(html): + """Wrap embedded-figure HTML in a card that stays legible on dark pages. + + The figure keeps the light background baked into it, so on dark pages an + edge-to-edge white slab results; a white padded card reads as intentional + instead. Both dark selectors are needed: ``data-theme`` covers themes + with an explicit toggle, the media query covers theme-less pages under a + dark OS preference. On light pages the white-on-white card is invisible. + """ + card = "background:#fff;border-radius:0.25rem;padding:0.5rem" + return ( + "" + f'
{html}
' + ) diff --git a/tests/test_io/test_sg_scraper.py b/tests/test_io/test_sg_scraper.py index c79f19ed2ea..51ab5cd4688 100644 --- a/tests/test_io/test_sg_scraper.py +++ b/tests/test_io/test_sg_scraper.py @@ -142,6 +142,8 @@ def test_scraper(gallery, image_format): assert rst.count('class="output_subarea') == 2 # Fixes up figures drawn while the page was still laying out assert rst.count("Plotly.Plots.resize") == 2 + # Styled as a card so the light-background figure works on dark pages + assert rst.count('class="plotly-output-card"') == 2 # The thumbnail must be a scraped figure rather than a "no image" default, # and one image per figure in order is what makes `thumbnail_number` work @@ -264,6 +266,8 @@ def test_repr_html_fallback_size(monkeypatch): assert 'style="height:525px; width:100%;"' in html # Fixes up figures drawn while the page was still laying out assert "Plotly.Plots.resize" in html + # Styled as a card so the light-background figure works on dark pages + assert 'class="plotly-output-card"' in html fig = go.Figure(layout={"height": 400}) assert 'style="height:400px; width:100%;"' in fig._repr_html_() From 9b6cceb7bcea079b3fcc852457cacce788de7171 Mon Sep 17 00:00:00 2001 From: Eric Larson Date: Wed, 12 Aug 2026 11:45:34 -0500 Subject: [PATCH 08/11] test: compact the sphinx-gallery scraper tests Co-Authored-By: Claude Fable 5 --- plotly/io/_sg_scraper.py | 2 - plotly/io/_utils.py | 2 +- tests/test_io/test_sg_scraper.py | 105 +++++++++++++------------------ 3 files changed, 46 insertions(+), 63 deletions(-) diff --git a/plotly/io/_sg_scraper.py b/plotly/io/_sg_scraper.py index 6ae9927399b..94dbbd94cfa 100644 --- a/plotly/io/_sg_scraper.py +++ b/plotly/io/_sg_scraper.py @@ -180,5 +180,3 @@ def _write_image(fig_dict, file, image_format): "See https://plotly.com/python/static-image-export/ for " "requirements and installation instructions." ) from exc - - diff --git a/plotly/io/_utils.py b/plotly/io/_utils.py index 0593bf37ec1..6300ec34bf3 100644 --- a/plotly/io/_utils.py +++ b/plotly/io/_utils.py @@ -101,7 +101,7 @@ def resize_after_load_script(div_id): the time loading finishes, so fix it up once afterwards. """ return ( - '" +) + def plotly_sg_scraper(block, block_vars, gallery_conf, **kwargs): """Scrape Plotly figures for galleries of examples using @@ -86,6 +111,8 @@ def plotly_sg_scraper(block, block_vars, gallery_conf, **kwargs): # Repr-displayed figures are embedded by sphinx-gallery # itself; their static image only serves as the thumbnail. rst += _inline_html(fig_dict) + if figures: + rst += _raw_html_rst(_FIXUP_HTML) return rst finally: # Don't let figures leak into the next block if writing one failed. @@ -147,9 +174,8 @@ def _inline_html(fig_dict): """Embed a figure into the rst directly, rather than via a file. The figure is wrapped in the same div that sphinx-gallery wraps captured - HTML reprs in, so that themes can style both kinds of embed alike. + HTML reprs in, so that the fix-up markup applies to both kinds of embed. """ - div_id = str(uuid.uuid4()) html = plotly.io.to_html( fig_dict, include_plotlyjs="cdn", @@ -157,16 +183,16 @@ def _inline_html(fig_dict): default_width="100%", default_height=525, validate=False, - div_id=div_id, ) - # The figure may draw before the page finishes laying out, ending up - # sized to a container whose width then changes. - html = embed_in_output_card(html + resize_after_load_script(div_id)) html = ( '
\n' f"{html}\n" "
" ) + return _raw_html_rst(html) + + +def _raw_html_rst(html): return "\n.. raw:: html\n\n" + textwrap.indent(html, " ") + "\n" diff --git a/plotly/io/_utils.py b/plotly/io/_utils.py index 6300ec34bf3..4d27e0326c0 100644 --- a/plotly/io/_utils.py +++ b/plotly/io/_utils.py @@ -91,43 +91,3 @@ def plotly_cdn_url(cdn_ver=get_plotlyjs_version()): return "https://cdn.plot.ly/plotly-{cdn_ver}.min.js".format( cdn_ver=cdn_ver, ) - - -def resize_after_load_script(div_id): - """Script that resizes a plotly div once the page finishes loading. - - A figure drawn while its page is still loading (e.g. one embedded in a - sphinx-gallery page) can be sized to a container whose width changes by - the time loading finishes, so fix it up once afterwards. - """ - return ( - "" - ) - - -def embed_in_output_card(html): - """Wrap embedded-figure HTML in a card that stays legible on dark pages. - - The figure keeps the light background baked into it, so on dark pages an - edge-to-edge white slab results; a white padded card reads as intentional - instead. Both dark selectors are needed: ``data-theme`` covers themes - with an explicit toggle, the media query covers theme-less pages under a - dark OS preference. On light pages the white-on-white card is invisible. - """ - card = "background:#fff;border-radius:0.25rem;padding:0.5rem" - return ( - "" - f'
{html}
' - ) diff --git a/tests/test_io/test_sg_scraper.py b/tests/test_io/test_sg_scraper.py index 9d14ffbc804..6f8e695c3b8 100644 --- a/tests/test_io/test_sg_scraper.py +++ b/tests/test_io/test_sg_scraper.py @@ -129,18 +129,17 @@ def test_scraper(gallery, image_format): for path, color in zip(gallery.paths, COLORS): root = os.path.splitext(path)[0] assert_image_color(Path(f"{root}.{image_format}"), color, image_format) - # One interactive embed per figure: wrapped like sphinx-gallery wraps HTML - # reprs so themes can style both alike, resized once the page finishes - # laying out, and styled as a card so the light background works on dark - # pages. - for token in ( - ".. raw:: html", - "plotly-graph-div", - 'class="output_subarea', - "Plotly.Plots.resize", - 'class="plotly-output-card"', + # One interactive embed per figure, wrapped like sphinx-gallery wraps HTML + # reprs, plus one fix-up block styling the embeds as cards on dark pages + # and resizing them once the page finishes laying out. + for token, count in ( + (".. raw:: html", 3), + ('class="plotly-graph-div"', 2), + ('class="output_subarea', 2), + ("div.output_subarea:has(.plotly-graph-div)", 2), + ("Plotly.Plots.resize", 1), ): - assert rst.count(token) == 2, token + assert rst.count(token) == count, token # The thumbnail must be a scraped figure rather than a "no image" default, # and one image per figure in order is what makes `thumbnail_number` work @@ -169,7 +168,7 @@ def test_scraper_ignores_other_examples(gallery): for other in others: assert other.read_text() == "another example", f"{other.name} was scraped" assert len(gallery.paths) == 1 - assert rst.count(".. raw:: html") == 1 + assert rst.count('class="plotly-graph-div"') == 1 def test_scraper_repr_figure(gallery): @@ -180,7 +179,9 @@ def test_scraper_repr_figure(gallery): """ fig = go.Figure() gallery.globals["___"] = fig # as sphinx-gallery's repr capture leaves it - assert gallery.scrape("fig.update_layout(title='hi')\nfig") == "" + rst = gallery.scrape("fig.update_layout(title='hi')\nfig") + assert 'class="plotly-graph-div"' not in rst # sphinx-gallery embeds it + assert "Plotly.Plots.resize" in rst # but the fix-up block still applies assert len(gallery.paths) == 1 assert_image_color(Path(gallery.paths[0]), COLORS[0]) assert_image_color(gallery.thumbnail(), COLORS[0]) @@ -193,7 +194,7 @@ def test_scraper_repr_figure(gallery): # A figure both shown and repr-displayed is scraped once fig.show() rst = gallery.scrape("fig.show()\nfig") - assert rst.count(".. raw:: html") == 1 + assert rst.count('class="plotly-graph-div"') == 1 assert len(gallery.paths) == 2 @@ -227,14 +228,14 @@ def kaleido_warnings(): rst = gallery.scrape("fig.show()") # The shown figure is embedded inline instead of via files - assert rst.count("plotly-graph-div") == 1 + assert rst.count('class="plotly-graph-div"') == 1 assert gallery.paths == [] (warning,) = kaleido_warnings() assert "no browser" in warning.getMessage() # Only one warning per build, however many blocks follow; repr-displayed # figures are embedded by sphinx-gallery itself so they scrape to nothing - assert gallery.scrape("fig") == "" + assert 'class="plotly-graph-div"' not in gallery.scrape("fig") assert gallery.paths == [] assert len(kaleido_warnings()) == 1 @@ -249,10 +250,6 @@ def test_repr_html_fallback_size(monkeypatch): monkeypatch.setattr(pio.renderers, "default", "sphinx_gallery_png") html = go.Figure()._repr_html_() assert 'style="height:525px; width:100%;"' in html - # Fixes up figures drawn while the page was still laying out - assert "Plotly.Plots.resize" in html - # Styled as a card so the light-background figure works on dark pages - assert 'class="plotly-output-card"' in html fig = go.Figure(layout={"height": 400}) assert 'style="height:400px; width:100%;"' in fig._repr_html_() From b120480daf64d31387c6ff2945070d1f57e00438 Mon Sep 17 00:00:00 2001 From: Eric Larson Date: Thu, 13 Aug 2026 08:24:30 -0500 Subject: [PATCH 10/11] test: update the repr html template for the new fallback size The vnd.plotly mimetype renderers produce no text/html bundle, so _repr_html_ takes the fallback branch, which now sizes like the html renderers (525px default). Also point the no-static-export warning at the plotly_get_chrome command, which is the fix when kaleido is installed but no browser is available (e.g. on ReadTheDocs). Co-Authored-By: Claude Fable 5 --- plotly/io/_sg_scraper.py | 14 ++++++++------ tests/test_io/test_renderers.py | 3 ++- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/plotly/io/_sg_scraper.py b/plotly/io/_sg_scraper.py index 423beaa299d..c66ef210439 100644 --- a/plotly/io/_sg_scraper.py +++ b/plotly/io/_sg_scraper.py @@ -59,9 +59,10 @@ def plotly_sg_scraper(block, block_vars, gallery_conf, **kwargs): that it can also serve as the thumbnail; its HTML is embedded by sphinx-gallery itself. - Static image export requires Kaleido and a Chromium-based browser; when - unavailable, a warning is emitted once per build and the examples fall - back to placeholder thumbnails, with the interactive figures unaffected. + Static image export requires Kaleido and a Chromium-based browser (the + ``plotly_get_chrome`` command installs one); when unavailable, a warning + is emitted once per build and the examples fall back to placeholder + thumbnails, with the interactive figures unaffected. Parameters ---------- @@ -160,9 +161,10 @@ def _static_export_available(): warn( "plotly static image export is unavailable, so example " "thumbnails will fall back to a placeholder image. Static " - "export requires Kaleido and a Chromium-based browser; see " - "https://plotly.com/python/static-image-export/ for " - "installation instructions. The failure was: %s: %s", + "export requires Kaleido and a Chromium-based browser " + "(the `plotly_get_chrome` command installs one); see " + "https://plotly.com/python/static-image-export/ for details. " + "The failure was: %s: %s", type(exc).__name__, exc, ) diff --git a/tests/test_io/test_renderers.py b/tests/test_io/test_renderers.py index 6f265e01057..cd695af79d5 100644 --- a/tests/test_io/test_renderers.py +++ b/tests/test_io/test_renderers.py @@ -322,8 +322,9 @@ def test_repr_html(renderer): plotlyjs_content = get_plotlyjs() sri_hash = _generate_sri_hash(plotlyjs_content) + # The fallback sizes like the html renderers: layout height, else 525px template = ( - '
\n " '