From c0a3c7af07fa3a31c691d4e1b7b0b7ab3bc3f2f6 Mon Sep 17 00:00:00 2001 From: Emily KL <4672118+emilykl@users.noreply.github.com> Date: Mon, 16 Mar 2026 18:09:44 -0400 Subject: [PATCH 1/9] migrate build system to hatchling from setuptools --- MANIFEST.in | 3 --- pyproject.toml | 64 +++++++++++++++----------------------------------- 2 files changed, 19 insertions(+), 48 deletions(-) delete mode 100644 MANIFEST.in diff --git a/MANIFEST.in b/MANIFEST.in deleted file mode 100644 index d079cf5bf8d..00000000000 --- a/MANIFEST.in +++ /dev/null @@ -1,3 +0,0 @@ -include LICENSE.txt -include README.md -include plotly/package_data/widgetbundle.js diff --git a/pyproject.toml b/pyproject.toml index 3e79096e4f8..db46888c69e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,11 +1,11 @@ [build-system] -requires = ["setuptools>=71"] -build-backend = "setuptools.build_meta" +requires = ["hatchling >= 1.26"] +build-backend = "hatchling.build" [project.urls] -"HomePage" = "https://plotly.com/python/" +"Homepage" = "https://plotly.com/python/" "Documentation" = "https://plotly.com/python/" -"Github" = "https://github.com/plotly/plotly.py" +"GitHub" = "https://github.com/plotly/plotly.py" "Changelog" = "https://github.com/plotly/plotly.py/blob/main/CHANGELOG.md" [project] @@ -18,7 +18,6 @@ maintainers = [ { name="Emily Kellison-Linn", email="emily@plot.ly" } ] description = "An open-source interactive data visualization library for Python" -readme = {file = "README.md", content-type = "text/markdown"} classifiers = [ "Development Status :: 5 - Production/Stable", "Programming Language :: Python :: 3.8", @@ -31,7 +30,8 @@ classifiers = [ "License :: OSI Approved :: MIT License" ] requires-python = ">=3.8" -license = {file="LICENSE.txt"} +license = "MIT" +license-files = ["LICENSE.txt"] version = "6.6.0" dependencies = [ "narwhals>=1.15.1", @@ -50,7 +50,7 @@ dev_core = [ dev_build = [ "plotly[dev_core]", "build", - "jupyter" + "jupyterlab" ] dev_optional = [ "plotly[dev_build]", @@ -61,6 +61,7 @@ dev_optional = [ "fiona<=1.9.6;python_version<='3.8'", "geopandas", "inflect", + "jupyter", "numpy", "orjson", "pandas", @@ -91,43 +92,16 @@ markers = [ "matplotlib: mark a test as matplotlib" ] -[tool.setuptools.packages.find] -where = ["."] -include = ["plotly*", "_plotly*"] -exclude = ["__pycache__*", "tests*"] - -[tool.setuptools.package-data] -plotly = [ - "package_data/*", - "package_data/templates/*", - "package_data/datasets/*", - "validators/_validators.json" -] - -[tool.jupyter-packaging.builder] -factory = "jupyter_packaging.npm_builder" -auto_data_files = true - -[tool.jupyter-packaging.build-args] -build_cmd = "build:prod" -npm = ["jlpm"] - -[tool.hatch.build.hooks.jupyter-builder] -editable-frontend = true - -[tool.hatch.build.hooks.jupyter-builder.editable-build-kwargs] -build_cmd = "build" -npm = ["jlpm"] -source_dir = "js" -build_dir = "plotly/labextension" -skip_symlink = true - -[tool.setuptools.data-files] -"share/jupyter/labextensions/jupyterlab-plotly" = [ - "plotly/labextension/package.json", - "js/install.json" +[tool.hatch.build] +include = [ + "/plotly*", + "/_plotly*", + "js/install.json", # used by Jupyter extension ] -"share/jupyter/labextensions/jupyterlab-plotly/static" = [ - "plotly/labextension/static/*.js" -] +[tool.hatch.build.targets.wheel.shared-data] +# Specify files from this package which will be copied to the user's system on install +# Left path is the path within this package +# Right path is the path on the user's system +"plotly/labextension" = "share/jupyter/labextensions/jupyterlab-plotly" +"js/install.json" = "share/jupyter/labextensions/jupyterlab-plotly/install.json" From c0d53827c2192f58ceb262c6c1047b983c574039 Mon Sep 17 00:00:00 2001 From: Emily KL <4672118+emilykl@users.noreply.github.com> Date: Mon, 16 Mar 2026 18:10:22 -0400 Subject: [PATCH 2/9] remove unused keys from install.json --- js/install.json | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/js/install.json b/js/install.json index 7420c284058..072a65f7a6e 100644 --- a/js/install.json +++ b/js/install.json @@ -1,9 +1,4 @@ { - "schemaVersion": 1, - "packageName": "jupyterlab-plotly", - "version": "6.0.1", - "packageManager": "python", - "jupyterlab": { - "mimeExtension": "lib/mimeExtension.js" - } + "packageName": "plotly", + "packageManager": "python" } \ No newline at end of file From 85b8b72f7b0ab90ee033df78802932bceb349c33 Mon Sep 17 00:00:00 2001 From: Emily KL <4672118+emilykl@users.noreply.github.com> Date: Mon, 16 Mar 2026 18:10:58 -0400 Subject: [PATCH 3/9] update version in js/package.json to match plotly.py version --- js/package-lock.json | 4 ++-- js/package.json | 2 +- plotly/labextension/package.json | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/js/package-lock.json b/js/package-lock.json index 3b9ef0407c7..4ba0537dd55 100644 --- a/js/package-lock.json +++ b/js/package-lock.json @@ -1,12 +1,12 @@ { "name": "jupyterlab-plotly", - "version": "6.0.1", + "version": "6.6.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "jupyterlab-plotly", - "version": "6.0.1", + "version": "6.6.1", "license": "MIT", "dependencies": { "@lumino/widgets": "~2.4.0", diff --git a/js/package.json b/js/package.json index 56af7ca22ce..1f855ec52c9 100644 --- a/js/package.json +++ b/js/package.json @@ -1,7 +1,7 @@ { "name": "jupyterlab-plotly", "main": "lib/mimeExtension.js", - "version": "6.0.1", + "version": "6.6.0", "repository": { "type": "git", "url": "https://github.com/plotly/plotly.py" diff --git a/plotly/labextension/package.json b/plotly/labextension/package.json index 039d991004c..6261cfbbb22 100644 --- a/plotly/labextension/package.json +++ b/plotly/labextension/package.json @@ -1,7 +1,7 @@ { "name": "jupyterlab-plotly", "main": "lib/mimeExtension.js", - "version": "6.0.1", + "version": "6.6.0", "repository": { "type": "git", "url": "https://github.com/plotly/plotly.py" @@ -32,7 +32,7 @@ "mimeExtension": true, "outputDir": "../plotly/labextension", "_build": { - "load": "static/remoteEntry.d9ed7f5a4589fd6764e9.js", + "load": "static/remoteEntry.6213e23b3bdd99ae0b34.js", "mimeExtension": "./mimeExtension" } } From 513dd6d33a0bbece32d23bdc173ae6a788bfdfe7 Mon Sep 17 00:00:00 2001 From: Emily KL <4672118+emilykl@users.noreply.github.com> Date: Mon, 16 Mar 2026 18:11:20 -0400 Subject: [PATCH 4/9] add instruction to update js/package.json version when bumping plotly.py version --- RELEASE.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/RELEASE.md b/RELEASE.md index 6f1715445a3..cf9a304373f 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -25,6 +25,8 @@ a link to the plotly.js CHANGELOG. - Manually update the versions to `X.Y.Z` in the files specified below: - `pyproject.toml` - update version + - `js/package.json` + - update version (`"version"` key at top of file) - `CHANGELOG.md` - update version and release date - finalize changelog entries according to instructions above From f5ce203755b882a95e76caf855fafaaf2b1fe7da Mon Sep 17 00:00:00 2001 From: Emily KL <4672118+emilykl@users.noreply.github.com> Date: Mon, 16 Mar 2026 18:11:52 -0400 Subject: [PATCH 5/9] update js build artifact --- ...d7f5a4589fd6764e9.js => remoteEntry.6213e23b3bdd99ae0b34.js} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename plotly/labextension/static/{remoteEntry.d9ed7f5a4589fd6764e9.js => remoteEntry.6213e23b3bdd99ae0b34.js} (94%) diff --git a/plotly/labextension/static/remoteEntry.d9ed7f5a4589fd6764e9.js b/plotly/labextension/static/remoteEntry.6213e23b3bdd99ae0b34.js similarity index 94% rename from plotly/labextension/static/remoteEntry.d9ed7f5a4589fd6764e9.js rename to plotly/labextension/static/remoteEntry.6213e23b3bdd99ae0b34.js index 2e6f62e6193..1f9002cc0e3 100644 --- a/plotly/labextension/static/remoteEntry.d9ed7f5a4589fd6764e9.js +++ b/plotly/labextension/static/remoteEntry.6213e23b3bdd99ae0b34.js @@ -1 +1 @@ -var _JUPYTERLAB;(()=>{"use strict";var e,r,t={681:(e,r,t)=>{var o={"./index":()=>t.e(340).then((()=>()=>t(340))),"./mimeExtension":()=>t.e(340).then((()=>()=>t(340)))},a=(e,r)=>(t.R=r,r=t.o(o,e)?o[e]():Promise.resolve().then((()=>{throw new Error('Module "'+e+'" does not exist in container.')})),t.R=void 0,r),n=(e,r)=>{if(t.S){var o="default",a=t.S[o];if(a&&a!==e)throw new Error("Container initialization failed as it has already been initialized with a different share scope");return t.S[o]=e,t.I(o,r)}};t.d(r,{get:()=>a,init:()=>n})}},o={};function a(e){var r=o[e];if(void 0!==r)return r.exports;var n=o[e]={exports:{}};return t[e](n,n.exports,a),n.exports}a.m=t,a.c=o,a.amdO={},a.d=(e,r)=>{for(var t in r)a.o(r,t)&&!a.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},a.f={},a.e=e=>Promise.all(Object.keys(a.f).reduce(((r,t)=>(a.f[t](e,r),r)),[])),a.u=e=>e+".330950829c5d59eca692.js?v=330950829c5d59eca692",a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),a.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),e={},r="jupyterlab-plotly:",a.l=(t,o,n,i)=>{if(e[t])e[t].push(o);else{var l,u;if(void 0!==n)for(var p=document.getElementsByTagName("script"),s=0;s{l.onerror=l.onload=null,clearTimeout(f);var a=e[t];if(delete e[t],l.parentNode&&l.parentNode.removeChild(l),a&&a.forEach((e=>e(o))),r)return r(o)},f=setTimeout(c.bind(null,void 0,{type:"timeout",target:l}),12e4);l.onerror=c.bind(null,l.onerror),l.onload=c.bind(null,l.onload),u&&document.head.appendChild(l)}},a.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{a.S={};var e={},r={};a.I=(t,o)=>{o||(o=[]);var n=r[t];if(n||(n=r[t]={}),!(o.indexOf(n)>=0)){if(o.push(n),e[t])return e[t];a.o(a.S,t)||(a.S[t]={});var i=a.S[t],l="jupyterlab-plotly",u=[];return"default"===t&&((e,r,t,o)=>{var n=i[e]=i[e]||{},u=n[r];(!u||!u.loaded&&(1!=!u.eager?o:l>u.from))&&(n[r]={get:()=>a.e(340).then((()=>()=>a(340))),from:l,eager:!1})})("jupyterlab-plotly","6.0.1"),e[t]=u.length?Promise.all(u).then((()=>e[t]=1)):1}}})(),(()=>{var e;a.g.importScripts&&(e=a.g.location+"");var r=a.g.document;if(!e&&r&&(r.currentScript&&"SCRIPT"===r.currentScript.tagName.toUpperCase()&&(e=r.currentScript.src),!e)){var t=r.getElementsByTagName("script");if(t.length)for(var o=t.length-1;o>-1&&(!e||!/^http(s?):/.test(e));)e=t[o--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/^blob:/,"").replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),a.p=e})(),(()=>{var e={80:0};a.f.j=(r,t)=>{var o=a.o(e,r)?e[r]:void 0;if(0!==o)if(o)t.push(o[2]);else{var n=new Promise(((t,a)=>o=e[r]=[t,a]));t.push(o[2]=n);var i=a.p+a.u(r),l=new Error;a.l(i,(t=>{if(a.o(e,r)&&(0!==(o=e[r])&&(e[r]=void 0),o)){var n=t&&("load"===t.type?"missing":t.type),i=t&&t.target&&t.target.src;l.message="Loading chunk "+r+" failed.\n("+n+": "+i+")",l.name="ChunkLoadError",l.type=n,l.request=i,o[1](l)}}),"chunk-"+r,r)}};var r=(r,t)=>{var o,n,[i,l,u]=t,p=0;if(i.some((r=>0!==e[r]))){for(o in l)a.o(l,o)&&(a.m[o]=l[o]);u&&u(a)}for(r&&r(t);p{"use strict";var e,r,t={435:(e,r,t)=>{var o={"./index":()=>t.e(340).then((()=>()=>t(340))),"./mimeExtension":()=>t.e(340).then((()=>()=>t(340)))},a=(e,r)=>(t.R=r,r=t.o(o,e)?o[e]():Promise.resolve().then((()=>{throw new Error('Module "'+e+'" does not exist in container.')})),t.R=void 0,r),n=(e,r)=>{if(t.S){var o="default",a=t.S[o];if(a&&a!==e)throw new Error("Container initialization failed as it has already been initialized with a different share scope");return t.S[o]=e,t.I(o,r)}};t.d(r,{get:()=>a,init:()=>n})}},o={};function a(e){var r=o[e];if(void 0!==r)return r.exports;var n=o[e]={exports:{}};return t[e](n,n.exports,a),n.exports}a.m=t,a.c=o,a.amdO={},a.d=(e,r)=>{for(var t in r)a.o(r,t)&&!a.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},a.f={},a.e=e=>Promise.all(Object.keys(a.f).reduce(((r,t)=>(a.f[t](e,r),r)),[])),a.u=e=>e+".330950829c5d59eca692.js?v=330950829c5d59eca692",a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),a.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),e={},r="jupyterlab-plotly:",a.l=(t,o,n,i)=>{if(e[t])e[t].push(o);else{var l,u;if(void 0!==n)for(var p=document.getElementsByTagName("script"),s=0;s{l.onerror=l.onload=null,clearTimeout(f);var a=e[t];if(delete e[t],l.parentNode&&l.parentNode.removeChild(l),a&&a.forEach((e=>e(o))),r)return r(o)},f=setTimeout(c.bind(null,void 0,{type:"timeout",target:l}),12e4);l.onerror=c.bind(null,l.onerror),l.onload=c.bind(null,l.onload),u&&document.head.appendChild(l)}},a.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{a.S={};var e={},r={};a.I=(t,o)=>{o||(o=[]);var n=r[t];if(n||(n=r[t]={}),!(o.indexOf(n)>=0)){if(o.push(n),e[t])return e[t];a.o(a.S,t)||(a.S[t]={});var i=a.S[t],l="jupyterlab-plotly",u=[];return"default"===t&&((e,r,t,o)=>{var n=i[e]=i[e]||{},u=n[r];(!u||!u.loaded&&(1!=!u.eager?o:l>u.from))&&(n[r]={get:()=>a.e(340).then((()=>()=>a(340))),from:l,eager:!1})})("jupyterlab-plotly","6.6.0"),e[t]=u.length?Promise.all(u).then((()=>e[t]=1)):1}}})(),(()=>{var e;a.g.importScripts&&(e=a.g.location+"");var r=a.g.document;if(!e&&r&&(r.currentScript&&"SCRIPT"===r.currentScript.tagName.toUpperCase()&&(e=r.currentScript.src),!e)){var t=r.getElementsByTagName("script");if(t.length)for(var o=t.length-1;o>-1&&(!e||!/^http(s?):/.test(e));)e=t[o--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/^blob:/,"").replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),a.p=e})(),(()=>{var e={80:0};a.f.j=(r,t)=>{var o=a.o(e,r)?e[r]:void 0;if(0!==o)if(o)t.push(o[2]);else{var n=new Promise(((t,a)=>o=e[r]=[t,a]));t.push(o[2]=n);var i=a.p+a.u(r),l=new Error;a.l(i,(t=>{if(a.o(e,r)&&(0!==(o=e[r])&&(e[r]=void 0),o)){var n=t&&("load"===t.type?"missing":t.type),i=t&&t.target&&t.target.src;l.message="Loading chunk "+r+" failed.\n("+n+": "+i+")",l.name="ChunkLoadError",l.type=n,l.request=i,o[1](l)}}),"chunk-"+r,r)}};var r=(r,t)=>{var o,n,[i,l,u]=t,p=0;if(i.some((r=>0!==e[r]))){for(o in l)a.o(l,o)&&(a.m[o]=l[o]);u&&u(a)}for(r&&r(t);p Date: Mon, 16 Mar 2026 18:20:12 -0400 Subject: [PATCH 6/9] remove jupyter from dev_optional since we already have jupyterlab under dev_build --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index db46888c69e..acad1d998ca 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -61,7 +61,6 @@ dev_optional = [ "fiona<=1.9.6;python_version<='3.8'", "geopandas", "inflect", - "jupyter", "numpy", "orjson", "pandas", @@ -101,6 +100,7 @@ include = [ [tool.hatch.build.targets.wheel.shared-data] # Specify files from this package which will be copied to the user's system on install +# This is how the jupyterlab extension gets installed # Left path is the path within this package # Right path is the path on the user's system "plotly/labextension" = "share/jupyter/labextensions/jupyterlab-plotly" From 2b6647049355082f86f2a5d615bfed8f87bc8b98 Mon Sep 17 00:00:00 2001 From: Emily KL <4672118+emilykl@users.noreply.github.com> Date: Mon, 16 Mar 2026 18:43:37 -0400 Subject: [PATCH 7/9] update uv lockfile --- uv.lock | 98 +++++---------------------------------------------------- 1 file changed, 8 insertions(+), 90 deletions(-) diff --git a/uv.lock b/uv.lock index 41cee9778dd..edd98735cc2 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 2 +revision = 3 requires-python = ">=3.8" resolution-markers = [ "python_full_version >= '3.12'", @@ -2213,25 +2213,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/01/0e/b27cdbaccf30b890c40ed1da9fd4a3593a5cf94dae54fb34f8a4b74fcd3f/jsonschema_specifications-2025.4.1-py3-none-any.whl", hash = "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af", size = 18437, upload-time = "2025-04-23T12:34:05.422Z" }, ] -[[package]] -name = "jupyter" -version = "1.1.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "ipykernel" }, - { name = "ipywidgets" }, - { name = "jupyter-console" }, - { name = "jupyterlab", version = "4.3.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, - { name = "jupyterlab", version = "4.4.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, - { name = "nbconvert" }, - { name = "notebook", version = "7.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, - { name = "notebook", version = "7.4.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/58/f3/af28ea964ab8bc1e472dba2e82627d36d470c51f5cd38c37502eeffaa25e/jupyter-1.1.1.tar.gz", hash = "sha256:d55467bceabdea49d7e3624af7e33d59c37fff53ed3a350e1ac957bed731de7a", size = 5714959, upload-time = "2024-08-30T07:15:48.299Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/38/64/285f20a31679bf547b75602702f7800e74dbabae36ef324f716c02804753/jupyter-1.1.1-py2.py3-none-any.whl", hash = "sha256:7a59533c22af65439b24bbe60373a4e95af8f16ac65a6c00820ad378e3f7cc83", size = 2657, upload-time = "2024-08-30T07:15:47.045Z" }, -] - [[package]] name = "jupyter-client" version = "8.6.3" @@ -2251,28 +2232,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f", size = 106105, upload-time = "2024-09-17T10:44:15.218Z" }, ] -[[package]] -name = "jupyter-console" -version = "6.6.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "ipykernel" }, - { name = "ipython", version = "8.12.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, - { name = "ipython", version = "8.18.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, - { name = "ipython", version = "8.37.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, - { name = "ipython", version = "9.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "jupyter-client" }, - { name = "jupyter-core" }, - { name = "prompt-toolkit" }, - { name = "pygments" }, - { name = "pyzmq" }, - { name = "traitlets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/bd/2d/e2fd31e2fc41c14e2bcb6c976ab732597e907523f6b2420305f9fc7fdbdb/jupyter_console-6.6.3.tar.gz", hash = "sha256:566a4bf31c87adbfadf22cdf846e3069b59a71ed5da71d6ba4d8aaad14a53539", size = 34363, upload-time = "2023-03-06T14:13:31.02Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ca/77/71d78d58f15c22db16328a476426f7ac4a60d3a5a7ba3b9627ee2f7903d4/jupyter_console-6.6.3-py3-none-any.whl", hash = "sha256:309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485", size = 24510, upload-time = "2023-03-06T14:13:28.229Z" }, -] - [[package]] name = "jupyter-core" version = "5.8.1" @@ -3295,50 +3254,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/eb/8d/776adee7bbf76365fdd7f2552710282c79a4ead5d2a46408c9043a2b70ba/networkx-3.5-py3-none-any.whl", hash = "sha256:0030d386a9a06dee3565298b4a734b68589749a544acbb6c412dc9e2489ec6ec", size = 2034406, upload-time = "2025-05-29T11:35:04.961Z" }, ] -[[package]] -name = "notebook" -version = "7.3.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' and python_full_version < '3.9' and sys_platform != 'win32'", - "python_full_version <= '3.8' and sys_platform != 'win32'", -] -dependencies = [ - { name = "jupyter-server", version = "2.14.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, - { name = "jupyterlab", version = "4.3.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, - { name = "jupyterlab-server", marker = "python_full_version < '3.9'" }, - { name = "notebook-shim", marker = "python_full_version < '3.9'" }, - { name = "tornado", version = "6.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/71/0f/7781fed05f79d1047c039dfd17fbd6e6670bcf5ad330baa997bcc62525b5/notebook-7.3.3.tar.gz", hash = "sha256:707a313fb882d35f921989eb3d204de942ed5132a44e4aa1fe0e8f24bb9dc25d", size = 12758099, upload-time = "2025-03-14T13:40:57.001Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f2/bf/5e5fcf79c559600b738d7577c8360bfd4cfa705400af06f23b3a049e44b6/notebook-7.3.3-py3-none-any.whl", hash = "sha256:b193df0878956562d5171c8e25c9252b8e86c9fcc16163b8ee3fe6c5e3f422f7", size = 13142886, upload-time = "2025-03-14T13:40:52.754Z" }, -] - -[[package]] -name = "notebook" -version = "7.4.3" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.12'", - "python_full_version == '3.11.*'", - "python_full_version == '3.10.*'", - "python_full_version == '3.9.*'", -] -dependencies = [ - { name = "jupyter-server", version = "2.16.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, - { name = "jupyterlab", version = "4.4.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, - { name = "jupyterlab-server", marker = "python_full_version >= '3.9'" }, - { name = "notebook-shim", marker = "python_full_version >= '3.9'" }, - { name = "tornado", version = "6.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/dc/21/4f83b15e483da4f4f63928edd0cb08b6e7d33f8a15c23b116a90c44c6235/notebook-7.4.3.tar.gz", hash = "sha256:a1567481cd3853f2610ee0ecf5dfa12bb508e878ee8f92152c134ef7f0568a76", size = 13881668, upload-time = "2025-05-26T14:27:21.656Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/76/1b/16c809d799e3ddd7a97c8b43734f79624b74ddef9707e7d92275a13777bc/notebook-7.4.3-py3-none-any.whl", hash = "sha256:9cdeee954e04101cadb195d90e2ab62b7c9286c1d4f858bf3bb54e40df16c0c3", size = 14286402, upload-time = "2025-05-26T14:27:17.339Z" }, -] - [[package]] name = "notebook-shim" version = "0.2.4" @@ -4295,7 +4210,8 @@ dev = [ { name = "geopandas", version = "1.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "inflect", version = "7.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, { name = "inflect", version = "7.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, - { name = "jupyter" }, + { name = "jupyterlab", version = "4.3.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "jupyterlab", version = "4.4.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, { name = "kaleido" }, { name = "numpy", version = "1.24.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, @@ -4336,7 +4252,8 @@ dev = [ ] dev-build = [ { name = "build" }, - { name = "jupyter" }, + { name = "jupyterlab", version = "4.3.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "jupyterlab", version = "4.4.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, { name = "pytest", version = "8.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, { name = "pytest", version = "8.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, { name = "requests" }, @@ -4358,7 +4275,8 @@ dev-optional = [ { name = "geopandas", version = "1.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "inflect", version = "7.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, { name = "inflect", version = "7.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, - { name = "jupyter" }, + { name = "jupyterlab", version = "4.3.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, + { name = "jupyterlab", version = "4.4.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, { name = "kaleido" }, { name = "numpy", version = "1.24.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, @@ -4415,7 +4333,7 @@ requires-dist = [ { name = "fiona", marker = "python_full_version < '3.9' and extra == 'dev-optional'", specifier = "<=1.9.6" }, { name = "geopandas", marker = "extra == 'dev-optional'" }, { name = "inflect", marker = "extra == 'dev-optional'" }, - { name = "jupyter", marker = "extra == 'dev-build'" }, + { name = "jupyterlab", marker = "extra == 'dev-build'" }, { name = "kaleido", marker = "extra == 'kaleido'", specifier = ">=1.1.0" }, { name = "narwhals", specifier = ">=1.15.1" }, { name = "numpy", marker = "extra == 'dev-optional'" }, From 6e7df7cc8ab5f86b6e1dcbbba594387cf30ac34e Mon Sep 17 00:00:00 2001 From: Emily KL <4672118+emilykl@users.noreply.github.com> Date: Tue, 17 Mar 2026 11:10:47 -0400 Subject: [PATCH 8/9] install jupyterlab instead of jupyter --- .github/workflows/check-js-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/check-js-build.yml b/.github/workflows/check-js-build.yml index e8b041f1c65..d8a7de56250 100644 --- a/.github/workflows/check-js-build.yml +++ b/.github/workflows/check-js-build.yml @@ -25,7 +25,7 @@ jobs: curl -LsSf https://astral.sh/uv/install.sh | sh uv venv source .venv/bin/activate - uv pip install jupyter + uv pip install jupyterlab cd js npm ci npm run build From 0a543ea78b231bd3242a114d2c5494eb2e15da1f Mon Sep 17 00:00:00 2001 From: Emily KL <4672118+emilykl@users.noreply.github.com> Date: Tue, 17 Mar 2026 11:11:25 -0400 Subject: [PATCH 9/9] try webpack config (experimental) --- js/package.json | 1 + js/webpack.config.js | 8 ++++++++ plotly/labextension/package.json | 1 + 3 files changed, 10 insertions(+) create mode 100644 js/webpack.config.js diff --git a/js/package.json b/js/package.json index 1f855ec52c9..eeb61db1581 100644 --- a/js/package.json +++ b/js/package.json @@ -30,6 +30,7 @@ }, "jupyterlab": { "mimeExtension": true, + "webpackConfig": "./webpack.config.js", "outputDir": "../plotly/labextension" } } diff --git a/js/webpack.config.js b/js/webpack.config.js new file mode 100644 index 00000000000..447094ecda2 --- /dev/null +++ b/js/webpack.config.js @@ -0,0 +1,8 @@ +module.exports = { + // Settings to make output files deterministic + optimization: { + moduleIds: 'deterministic', + chunkIds: 'deterministic', + realContentHash: true, + }, +}; \ No newline at end of file diff --git a/plotly/labextension/package.json b/plotly/labextension/package.json index 6261cfbbb22..1d66fa84019 100644 --- a/plotly/labextension/package.json +++ b/plotly/labextension/package.json @@ -30,6 +30,7 @@ }, "jupyterlab": { "mimeExtension": true, + "webpackConfig": "./webpack.config.js", "outputDir": "../plotly/labextension", "_build": { "load": "static/remoteEntry.6213e23b3bdd99ae0b34.js",