kopia lustrzana https://github.com/deathbeds/ipydrawio
Bump to drawio 19.0.3 (#96)
rodzic
5169c41765
commit
b22d82ec7f
|
@ -60,7 +60,7 @@ dependencies:
|
||||||
- sphinx-jsonschema
|
- sphinx-jsonschema
|
||||||
- sphinxext-rediraffe
|
- sphinxext-rediraffe
|
||||||
- pip:
|
- pip:
|
||||||
- jupyterlite ==0.1.0b7
|
- jupyterlite ==0.1.0b8
|
||||||
|
|
||||||
### ipydrawio-docs-deps ###
|
### ipydrawio-docs-deps ###
|
||||||
|
|
||||||
|
|
|
@ -10,9 +10,9 @@
|
||||||
|
|
||||||
#### @deathbeds/ipydrawio-notebook 1.2.1
|
#### @deathbeds/ipydrawio-notebook 1.2.1
|
||||||
|
|
||||||
#### @deathbeds/ipydrawio-webpack 18.0.400
|
#### @deathbeds/ipydrawio-webpack 19.0.300
|
||||||
|
|
||||||
- updates to drawio v18.0.4
|
- updates to drawio v19.0.3
|
||||||
|
|
||||||
#### @deathbeds/ipydrawio-jupyter-templates 1.2.1
|
#### @deathbeds/ipydrawio-jupyter-templates 1.2.1
|
||||||
|
|
||||||
|
|
|
@ -2,14 +2,14 @@
|
||||||
"LiteBuildConfig": {
|
"LiteBuildConfig": {
|
||||||
"federated_extensions": [
|
"federated_extensions": [
|
||||||
"../py_packages/ipydrawio/dist/ipydrawio-1.2.1-py3-none-any.whl",
|
"../py_packages/ipydrawio/dist/ipydrawio-1.2.1-py3-none-any.whl",
|
||||||
"https://github.com/conda-forge/releases/releases/download/noarch/bqplot-0.12.33-pyhd8ed1ab_0.tar.bz2/bqplot-0.12.33-pyhd8ed1ab_0.tar.bz2",
|
"https://conda.anaconda.org/conda-forge/noarch/bqplot-0.12.33-pyhd8ed1ab_0.tar.bz2",
|
||||||
"https://github.com/conda-forge/releases/releases/download/noarch/jupyterlab-tour-3.1.4-pyhd8ed1ab_0.tar.bz2/jupyterlab-tour-3.1.4-pyhd8ed1ab_0.tar.bz2",
|
"https://conda.anaconda.org/conda-forge/noarch/jupyterlab-tour-3.1.4-pyhd8ed1ab_0.tar.bz2",
|
||||||
"https://github.com/conda-forge/releases/releases/download/noarch/jupyterlab-webrtc-docprovider-0.1.1-pyhd8ed1ab_0.tar.bz2/jupyterlab-webrtc-docprovider-0.1.1-pyhd8ed1ab_0.tar.bz2",
|
"https://conda.anaconda.org/conda-forge/noarch/jupyterlab-webrtc-docprovider-0.1.1-pyhd8ed1ab_0.tar.bz2",
|
||||||
"https://github.com/conda-forge/releases/releases/download/noarch/jupyterlab_widgets-1.1.0-pyhd8ed1ab_0.tar.bz2/jupyterlab_widgets-1.1.0-pyhd8ed1ab_0.tar.bz2",
|
"https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-1.1.0-pyhd8ed1ab_0.tar.bz2",
|
||||||
"https://github.com/conda-forge/releases/releases/download/noarch/wxyz_datagrid-0.5.1-pyhd8ed1ab_0.tar.bz2/wxyz_datagrid-0.5.1-pyhd8ed1ab_0.tar.bz2",
|
"https://conda.anaconda.org/conda-forge/noarch/wxyz_datagrid-0.5.1-pyhd8ed1ab_0.tar.bz2",
|
||||||
"https://github.com/conda-forge/releases/releases/download/noarch/wxyz_json_schema_form-0.5.1-pyhd8ed1ab_0.tar.bz2/wxyz_json_schema_form-0.5.1-pyhd8ed1ab_0.tar.bz2",
|
"https://conda.anaconda.org/conda-forge/noarch/wxyz_json_schema_form-0.5.1-pyhd8ed1ab_0.tar.bz2",
|
||||||
"https://github.com/conda-forge/releases/releases/download/noarch/wxyz_lab-0.5.1-pyhd8ed1ab_0.tar.bz2/wxyz_lab-0.5.1-pyhd8ed1ab_0.tar.bz2",
|
"https://conda.anaconda.org/conda-forge/noarch/wxyz_lab-0.5.1-pyhd8ed1ab_0.tar.bz2",
|
||||||
"https://github.com/conda-forge/releases/releases/download/noarch/wxyz_svg-0.5.1-pyhd8ed1ab_0.tar.bz2/wxyz_svg-0.5.1-pyhd8ed1ab_0.tar.bz2"
|
"https://conda.anaconda.org/conda-forge/noarch/wxyz_svg-0.5.1-pyhd8ed1ab_0.tar.bz2"
|
||||||
],
|
],
|
||||||
"ignore_sys_prefix": true,
|
"ignore_sys_prefix": true,
|
||||||
"lite_dir": ".",
|
"lite_dir": ".",
|
||||||
|
|
|
@ -32,7 +32,7 @@ dependencies:
|
||||||
- sphinx-jsonschema
|
- sphinx-jsonschema
|
||||||
- sphinxext-rediraffe
|
- sphinxext-rediraffe
|
||||||
- pip:
|
- pip:
|
||||||
- jupyterlite ==0.1.0b7
|
- jupyterlite ==0.1.0b8
|
||||||
|
|
||||||
### ipydrawio-docs-deps ###
|
### ipydrawio-docs-deps ###
|
||||||
|
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit 4deecee18191f67e242422abf3ca304e19e49687
|
Subproject commit bf41618c37f9918078303e3a875961187b86f86b
|
|
@ -1768,7 +1768,7 @@ import '!!file-loader?name=[path][name].[ext]&context=.!../dio/js/grapheditor/Sh
|
||||||
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/js/grapheditor/Sidebar.js';
|
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/js/grapheditor/Sidebar.js';
|
||||||
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/js/grapheditor/Toolbar.js';
|
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/js/grapheditor/Toolbar.js';
|
||||||
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/js/integrate.min.js';
|
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/js/integrate.min.js';
|
||||||
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/js/jquery/jquery-3.3.1.min.js';
|
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/js/jquery/jquery-3.6.0.min.js';
|
||||||
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/js/jscolor/jscolor.js';
|
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/js/jscolor/jscolor.js';
|
||||||
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/js/jszip/jszip.min.js';
|
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/js/jszip/jszip.min.js';
|
||||||
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/js/math-print.js';
|
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/js/math-print.js';
|
||||||
|
@ -2805,8 +2805,12 @@ import '!!file-loader?name=[path][name].[ext]&context=.!../dio/templates/wirefra
|
||||||
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/vsdxImporter.html';
|
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/vsdxImporter.html';
|
||||||
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/workbox-12cca165.js';
|
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/workbox-12cca165.js';
|
||||||
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/workbox-12cca165.js.map';
|
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/workbox-12cca165.js.map';
|
||||||
|
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/workbox-50a29d49.js';
|
||||||
|
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/workbox-50a29d49.js.map';
|
||||||
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/workbox-5490a1bd.js';
|
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/workbox-5490a1bd.js';
|
||||||
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/workbox-5490a1bd.js.map';
|
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/workbox-5490a1bd.js.map';
|
||||||
|
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/workbox-7a2a8380.js';
|
||||||
|
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/workbox-7a2a8380.js.map';
|
||||||
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/workbox-9fe249eb.js';
|
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/workbox-9fe249eb.js';
|
||||||
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/workbox-9fe249eb.js.map';
|
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/workbox-9fe249eb.js.map';
|
||||||
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/workbox-bed83ea8.js';
|
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/workbox-bed83ea8.js';
|
||||||
|
@ -2816,4 +2820,6 @@ import '!!file-loader?name=[path][name].[ext]&context=.!../dio/workbox-d4d5b410.
|
||||||
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/workbox-dfbb910f.js';
|
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/workbox-dfbb910f.js';
|
||||||
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/workbox-dfbb910f.js.map';
|
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/workbox-dfbb910f.js.map';
|
||||||
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/workbox-f163abaa.js';
|
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/workbox-f163abaa.js';
|
||||||
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/workbox-f163abaa.js.map';
|
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/workbox-f163abaa.js.map';
|
||||||
|
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/workbox-fa8c4ce5.js';
|
||||||
|
import '!!file-loader?name=[path][name].[ext]&context=.!../dio/workbox-fa8c4ce5.js.map';
|
|
@ -43,5 +43,5 @@
|
||||||
"build:pre": "python scripts/patch.py && python scripts/static.py"
|
"build:pre": "python scripts/patch.py && python scripts/static.py"
|
||||||
},
|
},
|
||||||
"types": "lib/index.d.ts",
|
"types": "lib/index.d.ts",
|
||||||
"version": "18.0.400"
|
"version": "19.0.300"
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
"@jupyterlab/application": "^3.1.0",
|
"@jupyterlab/application": "^3.1.0",
|
||||||
"@jupyterlab/launcher": "^3.1.0",
|
"@jupyterlab/launcher": "^3.1.0",
|
||||||
"@jupyterlab/mainmenu": "^3.1.0",
|
"@jupyterlab/mainmenu": "^3.1.0",
|
||||||
"@deathbeds/ipydrawio-webpack": "^18.0.400"
|
"@deathbeds/ipydrawio-webpack": "^19.0.300"
|
||||||
},
|
},
|
||||||
"description": "A JupyterLab extension for embedding interactive drawio / mxgraph diagrams.",
|
"description": "A JupyterLab extension for embedding interactive drawio / mxgraph diagrams.",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|
|
@ -32,13 +32,21 @@ from pathlib import Path
|
||||||
import lxml.etree as E
|
import lxml.etree as E
|
||||||
from jupyterlab.commands import get_app_dir
|
from jupyterlab.commands import get_app_dir
|
||||||
from PIL import Image
|
from PIL import Image
|
||||||
from PyPDF2 import PdfFileMerger, PdfFileReader, PdfFileWriter
|
|
||||||
from requests import Session
|
from requests import Session
|
||||||
from requests_cache import CachedSession
|
from requests_cache import CachedSession
|
||||||
from tornado.concurrent import run_on_executor
|
from tornado.concurrent import run_on_executor
|
||||||
from traitlets import Bool, Dict, Instance, Int, Unicode, default
|
from traitlets import Bool, Dict, Instance, Int, Unicode, default
|
||||||
from traitlets.config import LoggingConfigurable
|
from traitlets.config import LoggingConfigurable
|
||||||
|
|
||||||
|
try:
|
||||||
|
from PyPDF2 import PdfMerger, PdfReader, PdfWriter
|
||||||
|
except ImportError: # pragma: no cover
|
||||||
|
from PyPDF2 import (
|
||||||
|
PdfFileMerger as PdfMerger,
|
||||||
|
PdfFileReader as PdfReader,
|
||||||
|
PdfFileWriter as PdfWriter,
|
||||||
|
)
|
||||||
|
|
||||||
from .constants import (
|
from .constants import (
|
||||||
DRAWIO_APP,
|
DRAWIO_APP,
|
||||||
ENV_IPYDRAWIO_DATA_DIR,
|
ENV_IPYDRAWIO_DATA_DIR,
|
||||||
|
@ -208,8 +216,8 @@ class IPyDrawioExportManager(LoggingConfigurable):
|
||||||
output_pdf = tdp / "original.pdf"
|
output_pdf = tdp / "original.pdf"
|
||||||
output_pdf.write_bytes(b64decode(pdf_text))
|
output_pdf.write_bytes(b64decode(pdf_text))
|
||||||
final_pdf = tdp / "final.pdf"
|
final_pdf = tdp / "final.pdf"
|
||||||
final = PdfFileWriter()
|
final = PdfWriter()
|
||||||
final.appendPagesFromReader(PdfFileReader(str(output_pdf), "rb"))
|
final.appendPagesFromReader(PdfReader(str(output_pdf), "rb"))
|
||||||
xml = pdf_request["xml"]
|
xml = pdf_request["xml"]
|
||||||
if hasattr(xml, "encode"):
|
if hasattr(xml, "encode"):
|
||||||
xml = xml.encode("utf-8")
|
xml = xml.encode("utf-8")
|
||||||
|
@ -263,7 +271,7 @@ class IPyDrawioExportManager(LoggingConfigurable):
|
||||||
tree = E.fromstring("""<mxfile version="13.3.6"></mxfile>""")
|
tree = E.fromstring("""<mxfile version="13.3.6"></mxfile>""")
|
||||||
with tempfile.TemporaryDirectory() as td:
|
with tempfile.TemporaryDirectory() as td:
|
||||||
tdp = Path(td)
|
tdp = Path(td)
|
||||||
merger = PdfFileMerger()
|
merger = PdfMerger()
|
||||||
for i, pdf_request in enumerate(pdf_requests):
|
for i, pdf_request in enumerate(pdf_requests):
|
||||||
self.log.warning("adding page %s", i)
|
self.log.warning("adding page %s", i)
|
||||||
for diagram in self.extract_diagrams(pdf_request):
|
for diagram in self.extract_diagrams(pdf_request):
|
||||||
|
@ -273,13 +281,13 @@ class IPyDrawioExportManager(LoggingConfigurable):
|
||||||
raise ValueError("PDF request is empty")
|
raise ValueError("PDF request is empty")
|
||||||
wrote = next_pdf.write_bytes(b64decode(pdf_request["pdf"]))
|
wrote = next_pdf.write_bytes(b64decode(pdf_request["pdf"]))
|
||||||
if wrote:
|
if wrote:
|
||||||
merger.append(PdfFileReader(str(next_pdf)))
|
merger.append(PdfReader(str(next_pdf)))
|
||||||
output_pdf = tdp / "output.pdf"
|
output_pdf = tdp / "output.pdf"
|
||||||
final_pdf = tdp / "final.pdf"
|
final_pdf = tdp / "final.pdf"
|
||||||
merger.write(str(output_pdf))
|
merger.write(str(output_pdf))
|
||||||
composite_xml = E.tostring(tree).decode("utf-8")
|
composite_xml = E.tostring(tree).decode("utf-8")
|
||||||
final = PdfFileWriter()
|
final = PdfWriter()
|
||||||
final.appendPagesFromReader(PdfFileReader(str(output_pdf), "rb"))
|
final.appendPagesFromReader(PdfReader(str(output_pdf), "rb"))
|
||||||
if self.attach_xml:
|
if self.attach_xml:
|
||||||
final.addAttachment(self.attachment_name, composite_xml.encode("utf-8"))
|
final.addAttachment(self.attachment_name, composite_xml.encode("utf-8"))
|
||||||
with final_pdf.open("wb") as fpt:
|
with final_pdf.open("wb") as fpt:
|
||||||
|
@ -383,7 +391,7 @@ class IPyDrawioExportManager(LoggingConfigurable):
|
||||||
|
|
||||||
def attachments(self, pdf_path):
|
def attachments(self, pdf_path):
|
||||||
"""iterate over the name, attachment pairs in the PDF"""
|
"""iterate over the name, attachment pairs in the PDF"""
|
||||||
reader = PdfFileReader(str(pdf_path), "rb")
|
reader = PdfReader(str(pdf_path), "rb")
|
||||||
attachments = []
|
attachments = []
|
||||||
try:
|
try:
|
||||||
attachments = reader.trailer["/Root"]["/Names"]["/EmbeddedFiles"]["/Names"]
|
attachments = reader.trailer["/Root"]["/Names"]["/EmbeddedFiles"]["/Names"]
|
||||||
|
|
|
@ -18,6 +18,8 @@ import subprocess
|
||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
|
|
||||||
|
import lxml.etree as ET
|
||||||
|
|
||||||
from . import project as P
|
from . import project as P
|
||||||
|
|
||||||
PABOT_DEFAULTS = [
|
PABOT_DEFAULTS = [
|
||||||
|
@ -99,35 +101,47 @@ def run_tests(attempt=0, extra_args=None):
|
||||||
proc = subprocess.Popen(str_args, cwd=P.ATEST)
|
proc = subprocess.Popen(str_args, cwd=P.ATEST)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
return proc.wait()
|
proc.wait()
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
proc.kill()
|
proc.kill()
|
||||||
return proc.wait()
|
proc.wait()
|
||||||
|
|
||||||
|
out_xml = out_dir / "output.xml"
|
||||||
|
fail_count = -1
|
||||||
|
|
||||||
|
try:
|
||||||
|
root = ET.fromstring(out_xml.read_bytes())
|
||||||
|
stat = root.xpath("//total/stat")
|
||||||
|
fail_count = int(stat[0].attrib["fail"])
|
||||||
|
except Exception as err:
|
||||||
|
print(err)
|
||||||
|
|
||||||
|
return fail_count
|
||||||
|
|
||||||
|
|
||||||
def attempt_atest_with_retries(extra_args=None):
|
def attempt_atest_with_retries(extra_args=None):
|
||||||
"""retry the robot tests a number of times"""
|
"""retry the robot tests a number of times"""
|
||||||
extra_args = list(extra_args or [])
|
extra_args = list(extra_args or [])
|
||||||
attempt = 0
|
attempt = 0
|
||||||
error_count = -1
|
fail_count = -1
|
||||||
|
|
||||||
retries = P.ATEST_RETRIES
|
retries = P.ATEST_RETRIES
|
||||||
extra_args += P.ATEST_ARGS
|
extra_args += P.ATEST_ARGS
|
||||||
|
|
||||||
while error_count != 0 and attempt <= retries:
|
while fail_count != 0 and attempt <= retries:
|
||||||
attempt += 1
|
attempt += 1
|
||||||
print("attempt {} of {}...".format(attempt, retries + 1), flush=True)
|
print("attempt {} of {}...".format(attempt, retries + 1), flush=True)
|
||||||
start_time = time.time()
|
start_time = time.time()
|
||||||
error_count = run_tests(attempt=attempt, extra_args=extra_args)
|
fail_count = run_tests(attempt=attempt, extra_args=extra_args)
|
||||||
print(
|
print(
|
||||||
error_count,
|
fail_count,
|
||||||
"errors in",
|
"failed in",
|
||||||
int(time.time() - start_time),
|
int(time.time() - start_time),
|
||||||
"seconds",
|
"seconds",
|
||||||
flush=True,
|
flush=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
return error_count
|
return fail_count
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
|
@ -377,7 +377,7 @@ SERVER_EXT = {
|
||||||
|
|
||||||
# demo
|
# demo
|
||||||
RE_CONDA_FORGE_URL = r"/conda-forge/(.*/)?(noarch|linux-64|win-64|osx-64)/([^/]+)$"
|
RE_CONDA_FORGE_URL = r"/conda-forge/(.*/)?(noarch|linux-64|win-64|osx-64)/([^/]+)$"
|
||||||
CONDA_FORGE_RELEASE = "https://github.com/conda-forge/releases/releases/download"
|
CONDA_FORGE_RELEASE = "https://conda.anaconda.org/conda-forge"
|
||||||
FED_EXT_MARKER = "### FEDERATED EXTENSIONS ###"
|
FED_EXT_MARKER = "### FEDERATED EXTENSIONS ###"
|
||||||
DEMO = ROOT / "demo"
|
DEMO = ROOT / "demo"
|
||||||
DEMO_FILES = DEMO / "files"
|
DEMO_FILES = DEMO / "files"
|
||||||
|
@ -910,9 +910,7 @@ def _sync_lite_config(from_env, to_json, marker, extra_federated, extra_pyolite)
|
||||||
|
|
||||||
for ext in ext_packages:
|
for ext in ext_packages:
|
||||||
if pkg.startswith(ext):
|
if pkg.startswith(ext):
|
||||||
federated_extensions += [
|
federated_extensions += ["/".join([CONDA_FORGE_RELEASE, subdir, pkg])]
|
||||||
"/".join([CONDA_FORGE_RELEASE, subdir, pkg, pkg])
|
|
||||||
]
|
|
||||||
|
|
||||||
config = json.loads(to_json.read_text(**ENC))
|
config = json.loads(to_json.read_text(**ENC))
|
||||||
|
|
||||||
|
|
|
@ -99,14 +99,14 @@
|
||||||
"@jupyterlab/application" "^3.1.0"
|
"@jupyterlab/application" "^3.1.0"
|
||||||
|
|
||||||
"@deathbeds/ipydrawio-webpack@file:packages/ipydrawio-webpack":
|
"@deathbeds/ipydrawio-webpack@file:packages/ipydrawio-webpack":
|
||||||
version "18.0.400"
|
version "19.0.300"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@jupyterlab/application" "^3.1.0"
|
"@jupyterlab/application" "^3.1.0"
|
||||||
|
|
||||||
"@deathbeds/ipydrawio@file:packages/ipydrawio":
|
"@deathbeds/ipydrawio@file:packages/ipydrawio":
|
||||||
version "1.2.1"
|
version "1.2.1"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@deathbeds/ipydrawio-webpack" "^18.0.400"
|
"@deathbeds/ipydrawio-webpack" "^19.0.300"
|
||||||
"@jupyterlab/application" "^3.1.0"
|
"@jupyterlab/application" "^3.1.0"
|
||||||
"@jupyterlab/launcher" "^3.1.0"
|
"@jupyterlab/launcher" "^3.1.0"
|
||||||
"@jupyterlab/mainmenu" "^3.1.0"
|
"@jupyterlab/mainmenu" "^3.1.0"
|
||||||
|
|
Ładowanie…
Reference in New Issue