Repository navigation
Release 0.15.0: complete plotly.js 3.7 trace coverage, remove kaleido/EPS, dependency security bumps - #442
Open
jqnatividad wants to merge 17 commits into
Open
Release 0.15.0: complete plotly.js 3.7 trace coverage, remove kaleido/EPS, dependency security bumps#442jqnatividad wants to merge 17 commits into
jqnatividad wants to merge 17 commits into
Conversation
Both were deprecated in 0.13.0 with removal announced for 0.15.0. - Drop the plotly_kaleido crate from the workspace, the `kaleido` and `kaleido_download` features, and the kaleido-gated Plot methods. - Drop `ImageFormat::EPS` from plotly_static and the `#![allow(deprecated)]` that was waiting on 0.15.0. - Remove the kaleido example, its CI matrix entries, the publish_plotly_kaleido workflow and the release publish step; run the semver check against `static_export_chromedriver` instead. - Remove kaleido/EPS sections from README and the book, and point the install snippets at 0.15. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- plotly_static: remove the `zip` build-dependency, which build.rs never used; bump `dirs` 6 -> 7. - plotly_derive: bump `darling` 0.23 -> 0.24 together with `syn` 2 -> 3, since darling 0.24 is built on syn 3. No macro code changes needed. - examples: bump reqwest 0.11 -> 0.13, env_logger 0.10 -> 0.11, itertools 0.12 -> 0.15, ndarray 0.15 -> 0.17 and rand/rand_chacha 0.8/0.3 -> 0.10, adapting to `RngExt::random` and dropping the deprecated `into_raw_vec`. zip 8.x is still pulled in transitively by webdriver-downloader 0.17 (`zip ^8`) until ik1ne/webdriver-downloader#67 is released. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- plotly 0.14.1 -> 0.15.0, plotly_derive 0.14.1 -> 0.15.0 - plotly_static 0.1.0 -> 0.2.0 (EPS removal is breaking; also carries the plotly.js 3.7.0 bundle) - Promote [Unreleased] to [0.15.0] in the CHANGELOG, add Removed and Security sections, and drop duplicated Funnel/Waterfall entries. Last release on plotly.js 3.x; plotly.js 4.x follows in 0.16.0 (plotly#437). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A pinned `release-type: minor` is applied verbatim, without the 0.y.z promotion, so the intentional removals in 0.15.0 (kaleido features and methods, `ImageFormat::EPS`) would fail as major-level changes. Inferring from the version bump treats 0.14.1 -> 0.15.0 as major, while unchanged versions during development still default to a minor-level check. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The trace loop used `0..=num_steps`, creating 52 traces (frequencies 0.0-5.1) while each slider step's visibility mask has 51 entries, so step 0 also showed the stray 5.1 curve. Use `0..num_steps` to match. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The current nightly rustfmt re-wraps comments under the repo's `wrap_comments` setting, which fails the Rustfmt CI job. Formatting only; no code changes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Address clippy::missing_panics_doc, missing_errors_doc, doc_markdown, non_std_lazy_statics and cargo::redundant_homepage: - Add `# Errors` / `# Panics` sections to public fallible APIs, including the wasm-only bindings and callbacks. - Backtick identifiers in docs and fix unbalanced backticks; add clippy.toml whitelisting WebDriver, MapLibre, GeoJSON, MathJax and ModeBar as product names. - Switch theme statics to std::sync::LazyLock and drop once_cell. - Remove `homepage` fields duplicating `repository`. Also fix Plot::add_frames adding every frame twice when the plot had no frames yet, with a regression test. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
jqnatividad
added a commit
to dathere/qsv
that referenced
this pull request
Oct 17, 2026
) * deps: use plotly.rs 0.15.0 release branch (plotly/plotly.rs#442); regenerate viz gallery Point the plotly [patch] at the 0.15.0 release-prep PR head (dathere/plotly@a21da1f) and bump the plotly requirement to 0.15 so the patch applies. This pulls in plotly_derive 0.15.0 and plotly_static 0.2.0, and drops darling 0.23 and lzma-rust2 (via plotly's removed zip build-dependency). qsv does not use the removed Kaleido backend or ImageFormat::EPS. The embedded plotly.js bundle is unchanged (3.7.0). Regenerated the viz gallery with gen_gallery.py: gallery.html is byte-identical; 14 smart dashboards pick up the 25.0.0 compile stamp, and two map pages (smart_us_choropleth, smart_world_events) get richer hover place names from the 25.0.0 geocode index. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs(changelog): note plotly.rs 0.15.0 (#4836) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
jqnatividad
marked this pull request as draft
October 18, 2026 11:43
- BarPolar: bars on a polar subplot (wind roses). Adds per-subplot `LayoutPolar::bar_mode`/`bar_gap` (`PolarBarMode`), which plotly.js reads from `layout.polar`, and `ThetaUnit::Gradians`. - FunnelArea: pie-like funnel with `FunnelAreaTitle`; adds the `funnelareacolorway`, `extendfunnelareacolors` and `hiddenlabels` layout attributes. - Wind rose and funnel area examples plus book recipe pages. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tly#422) - Cone and StreamTube for 3D vector fields; IsoSurface and Volume for 3D scalar fields, sharing the Caps/Slices/SpaceFrame/IsoSurfaceSurface sub-structs. Volume adds an `OpacityScale`. - All four reuse `mesh3d::Lighting` and `mesh3d::LightPosition`. - BREAKING: `mesh3d::LightPosition` x/y/z are now `f64` instead of `Vec<f64>`. plotly.js expects a single number per coordinate and silently ignored the arrays, so Mesh3D light positions never took effect. - Vector field and volume examples plus book recipe pages. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Parallel coordinates with a numeric `Dimension` (range, multiselect and a `ConstraintRange` for single or multiple brushed intervals), a `ParcoordsLine` color scale and `Unselected` line styling. Includes an example and book recipe page. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…plotly#422) - New ternary subplot: `LayoutTernary` with `TernaryAxis` for the a/b/c axes, replacing the commented-out `ternary` stub on `Layout`. - New Smith chart subplot: `LayoutSmith` with `RealAxis` and `ImaginaryAxis`. - ScatterTernary and ScatterSmith traces on those subplots. - Ternary and Smith chart examples plus book recipe pages. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tly#422) - Carpet: an a/b coordinate system on cartesian axes, styled with `CarpetAxis`. x/y accept 1D or 2D data via `CarpetCoordinates`. - ScatterCarpet and ContourCarpet are drawn on a carpet referenced by its `carpet` id; ContourCarpet reuses `contour::Contours`. - Carpet examples plus a book recipe page. This completes plotly.js 3.7 trace-type coverage. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Record the plotly#422 trace types, ternary/Smith subplots and the breaking mesh3d `LightPosition` fix, add a highlights summary, and move the release date to 2026-10-18. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- TernaryAxis, RealAxis, ImaginaryAxis and CarpetAxis: `label_alias` is now a `HashMap<String, String>`. plotly.js deletes `labelalias` unless it is a plain object, so the previous string values were ignored. - StreamTube: correct the documented default starting positions (the x-z plane at the lowest y, not the lowest x). - Book: show the `grid_3d` helper used by the vector field and volume recipes, so the examples are reproducible. - FunnelArea example: use `percent` in `text_info`; funnelarea does not support `percent initial`. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`PlotType::Histogram2dContour` existed, but no trace could emit it, so plotly.js's `histogram2dcontour` was unreachable. The new trace shares Histogram2d's binning API, adds the contour attributes (`autocontour`, `ncontours`, `contours` reusing `contour::Contours`, and `line`), and exposes `ids`, `coloraxis` and the bin-group attributes. Includes an example, a section on the 2D histograms book page, and the CHANGELOG update (27 trace types new since 0.14.1). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Contributor
Author
|
Hi @andrei-ng , I did the plotly.js 3.7 as v15.0.0 release prep as discussed (#437), and decided to go the stretch goal of completing trace coverage :) #426 Doing so should make for comprehensive plotly.js 3.7 coverage on 15.x, and put us in a good position to upgrade to plotly.js 4.x in 16.x. |
jqnatividad
marked this pull request as ready for review
October 18, 2026 12:56
Collaborator
|
@jqnatividad , thanks for the work and the PR! I had a quick look and in general it looks spot on. I'll review it properly by the end of the week and merge it. |
…ing null LayoutPolar, RadialAxis, AngularAxis, PolarAxisAttributes, PolarAxisTicks, AutoRangeOptions, PolarTickMode and geo Rotation lacked skip_serializing_none, so every unset field went out as `null`. plotly.js applies a layout template only to absent attributes, so the nulls overrode the theme: a polar subplot on plotly_dark drew a white background (`bgcolor` resolved to #fff). Adds serialization tests asserting unset fields are omitted. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PLOTLY_DARK had no polar or ternary section, so plotly.js fell back to its white defaults and drew a white disc/triangle on the dark paper (e.g. a ScatterPolar radar or BarPolar wind rose). Add both, matching plotly.py's plotly_dark: rgb(17,17,17) background, #506784 grid and axis lines, no tick marks. Also reword the 0.15.0 changelog entry for 43a4ee4: omitting null fields is a cleanup, not the cause of the white background. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
jqnatividad
added a commit
to dathere/qsv
that referenced
this pull request
Oct 18, 2026
… 3.7 traces) (#4838) * deps: pin plotly.rs fork to plotly/plotly.rs#442 head (full plotly.js 3.7 traces) Moves the dathere/plotly pin from a21da1f to 55555b2, the final commit of the 0.15.0 release branch. The new commits add the remaining 13 plotly.js 3.7 trace types; the only breaking change (mesh3d::LightPosition) is not used by qsv. Only plotly, plotly_derive and plotly_static move in Cargo.lock. Verified: viz unit + integration suites pass, qsvmcp (viz_static) builds, and a full gallery regen differs only in per-run timestamps. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs(changelog): cite #4838 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Release prep for plotly.rs 0.15.0, the last release on plotly.js 3.x. Per the discussion in #437, the plotly.js 4.x upgrade will be the basis for 0.16.0.
0.15.0 ships everything currently under
[Unreleased](plotly.js 3.0.1 → 3.7.0, the new trace types and the 3.7 attribute backfill), plus:Complete trace-type coverage for plotly.js 3.7 (Tracking: trace types not yet exposed in plotly.rs (plotly.js 3.7.0 parity) #422): adds the last 13 trace types, so every non-deprecated plotly.js 3.7 trace type is exposed. With them come the ternary and Smith chart subplots.
Removes the deprecated Kaleido backend and
ImageFormat::EPS, as announced for 0.15.0 in the 0.13.0 deprecation notices.Security / dependencies: drops the unused
zipbuild-dependency and bumpsdarling/syn,dirsand the examples' dependencies.Versions:
plotly0.15.0,plotly_derive0.15.0,plotly_static0.2.0 (breaking: EPS removed; also carries the plotly.js 3.7.0 bundle).plotly0.15.0 depends onplotly_static = "0.2", andrelease.ymldoes not publishplotly_static(it goes throughpublish_plotly_static.yml). Publish in this order:plotly_static0.2.0plotly_derive0.15.0plotly0.15.0Changes
Kaleido / EPS removal (
03a5dc4)plotly_kaleidofrom the workspace; removed thekaleidoandkaleido_downloadfeatures and the kaleido-gatedPlot::{write_image, to_base64, to_svg}implementations.ImageFormat::EPSand the#![allow(deprecated)]inplotly_staticthat was waiting on 0.15.0.0.15, and the README WASM snippet's CDN link now points at plotly.js 3.7.0.Dependencies (
f1d5d06)plotly_static: removed thezipbuild-dependency (build.rsnever used it);dirs6 → 7.plotly_derive:darling0.23 → 0.24 together withsyn2 → 3 (darling 0.24 is built on syn 3). No macro code changes needed.reqwest0.13,env_logger0.11,itertools0.15,ndarray0.17,rand/rand_chacha0.10, with small API adaptations (RngExt::random, dropping the deprecatedinto_raw_vec).Example fix (
48b387b): thecustom_controlssinusoidal slider built 52 traces (0..=num_steps) for 51 slider steps, so step 0 also showed a stray 5.1-frequency curve. It now builds 51.Lints and an
add_framesfix (a21da1f)Fixes
Plot::add_frames, which added every frame twice when the plot had no frames yet. Adds a regression test.Theme statics in
plotly::layout::themes(DEFAULT,PLOTLY_WHITE, …) are nowstd::sync::LazyLock<Template>instead ofonce_cell::sync::Lazy<Template>, and theonce_celldependency is dropped. This changes the type of public items. It only affects code that callsLazy::forceon them, and it lands in a release that is already breaking. It needs Rust 1.80+; no MSRV is declared.Addresses clippy's pedantic
missing_errors_doc,missing_panics_docanddoc_markdown, pluscargo::redundant_homepage:# Errors/# Panicssections to public fallible APIs, including the wasm-only bindings and callbacks;homepagefields that duplicatedrepository.A new
clippy.tomltreats WebDriver, MapLibre, GeoJSON, MathJax and ModeBar as product names rather than identifiers. CI doesn't enforce pedantic lints; this is cleanup.Complete trace-type coverage (#422), one commit per group:
7a4a297:BarPolarandFunnelArea. AddsLayoutPolar::bar_mode/bar_gap(PolarBarMode; plotly.js reads these per polar subplot),ThetaUnit::Gradians, and thefunnelareacolorway/extendfunnelareacolors/hiddenlabelslayout attributes.4479979:Cone,StreamTube,IsoSurfaceandVolume, sharingmesh3d::Lighting/LightPosition. Breaking:mesh3d::LightPositionx/y/z are nowf64instead ofVec<f64>. plotly.js expects one number per coordinate and silently ignored the arrays, so Mesh3D light positions never took effect.9abed12:Parcoords, with a numericDimensionandConstraintRange.00fde49:ScatterTernaryandScatterSmith, plus the newLayoutTernary/TernaryAxisandLayoutSmith/RealAxis/ImaginaryAxissubplots.7dec22b:Carpet(withCarpetAxis),ScatterCarpetandContourCarpet.0f87192: CHANGELOG[0.15.0]entries for the above, a highlights summary, and the release date moved to 2026-10-18.b7ab67c: fixes from the automated review of the commits above.label_aliason the new ternary, Smith and carpet axes is now a map, because plotly.js discards non-object values. Also corrects the StreamTube default-start docs, shows thegrid_3dhelper in the book, and fixes an unsupportedtext_infoflag in the funnel area example.55555b2:Histogram2dContour.PlotType::Histogram2dContourexisted, but no trace could emit it. Tracking: trace types not yet exposed in plotly.rs (plotly.js 3.7.0 parity) #422 had wrongly listed it as already exposed; the review of the CHANGELOG commit caught this.Each commit includes examples and an mdBook recipe page for its traces. The book's index tables use text links rather than thumbnails for the new pages; PNG thumbnails can be added later.
Forward compatibility with 0.16.0: I checked every new struct, including nested sub-structs, key by key against both the plotly.js 3.7.0 and 4.1.2
plot-schema.json. All 13 traces exist in 4.1.2 with no new attributes. They deliberately omit the Chart Studio*srcattributes, which plotly.js 4 removes, so they should carry over to the v4 upgrade unchanged.Release (
5d68616): version bumps and the CHANGELOG[0.15.0]section. Also removes the Funnel/Waterfall changelog entries that duplicated the #432 entry.CI changes (please review)
build.yml: removed the kaleido entries from the matrices, lint steps and test excludes; the semver job now checksstatic_export_chromedriverinstead ofkaleido.build.yml(16b30fb): dropped the pinnedrelease-type: minorfrom the semver job. An explicit release type is applied verbatim, without the 0.y.z → major promotion, so the intentional removals would fail as major changes. Inferring from the version treats 0.14.1 → 0.15.0 as major, and during normal development (version unchanged) it still defaults to a minor-level check.publish_plotly_kaleido.ymland theplotly_kaleidopublish step inrelease.yml. The already-publishedplotly_kaleidocrate on crates.io is unaffected.Known issue: transitive
zip8.xcargo auditstill reports RUSTSEC-2026-0367/0368/0369 forzip8.6.0. After this PR,zipcomes only fromwebdriver-downloader0.17 (zip ^8), a build-time dependency ofplotly_staticthat fetches chromedriver/geckodriver.ZipArchive::extract()(symlinks and permissions).webdriver-downloaderdoesn't callextract(); it reads the driver entry withby_name+io::copy.webdriver-downloader.[patch.crates-io]wasn't used because it doesn't reach downstream users of the published crate.The other advisories
cargo auditreports against older lockfiles (rustls, quinn-proto, h2, crossbeam-epoch) are semver-compatible and resolve with a freshcargo update.Cargo.lockisn't tracked, so this PR doesn't change them.For the maintainer
#432also appears under the already-released[0.14.1] - Fixed("mdBook table of contents ordering"). That may be the wrong PR number; I left it unchanged.ea7c2bfis a formatting-only commit. Nightly rustfmt 2026-10-16 re-wraps comments underwrap_comments, which was failing the Rustfmt job on about 10 files (it would fail onmaintoo). It contains no code changes.RUSTDOCFLAGS="-D warnings" cargo doc --features allstill fails on pre-existing issues that this PR leaves unchanged:ExporterSyncExt/ExporterAsyncExt) inplot.rs, which date back to fd36405;unclosed HTML tag <n>errors.Test plan
cargo clippy --features all --all-targets -- -D warnings(no longer needs-A deprecated)cargo clippy -p plotly_static --features geckodriver,webdriver_download -- -D warningscargo clippy --package plotly --target wasm32-unknown-unknown -- -D warningscargo test -p plotly --features all --lib: 379 pass. The 8 browser-dependent export tests couldn't run locally (chromedriver 153 vs Chrome 155); CI installs a matched pair.cargo test -p plotly --features all --doc(38 pass),cargo test -p plotly_static --doc --features chromedriver(20 pass)cd examples && cargo clippy --workspace -- -D warningscargo clippy --workspace --all-targets --features all -- -A clippy::all -W clippy::missing_panics_doc -W clippy::missing_errors_doc -W clippy::non_std_lazy_statics -W clippy::doc_markdown(also withstatic_export_geckodriverand--target wasm32-unknown-unknown): cleantyposcargo audit: only the transitivezip8.6.0 advisories described above remaincargo test --workspace --features plotly_ndarray,plotly_image,static_export_default,debug --exclude plotly_kaleido -- --test-threads=1passes (418 lib tests). Every commit passes theplotlytests, native clippy, nightly fmt and a build of its example crates. wasm32 clippy,typosand the full examples workspace build are clean on the final commit.cargo-semver-checks(my local version can't read this toolchain's rustdoc format; relying on the CI job). Expected breaking items: newPlotTypeandThetaUnitvariants and theLightPositionfield types.🤖 Generated with Claude Code