Compare commits
32 Commits
| Author | SHA1 | Date |
|---|---|---|
|
|
2530a940c9 | 9 years ago |
|
|
85aedbf5c0 | 9 years ago |
|
|
d0c955388a | 10 years ago |
|
|
b55157282a | 10 years ago |
|
|
6efb1145da | 10 years ago |
|
|
1c47294bcf | 10 years ago |
|
|
f5e3844787 | 10 years ago |
|
|
de0360d7d9 | 10 years ago |
|
|
729f9bb54e | 10 years ago |
|
|
131bdd55cf | 10 years ago |
|
|
0350c7f124 | 10 years ago |
|
|
3ccd254907 | 10 years ago |
|
|
c9937f8b38 | 10 years ago |
|
|
bf19b3cd0b | 10 years ago |
|
|
ce8ccf168c | 10 years ago |
|
|
9e63dd89b6 | 10 years ago |
|
|
9ed5848e82 | 11 years ago |
|
|
b05293408a | 11 years ago |
|
|
1bec1b9808 | 11 years ago |
|
|
0259d3df08 | 11 years ago |
|
|
dd9876381f | 11 years ago |
|
|
0600d6a5e6 | 11 years ago |
|
|
caea335a73 | 11 years ago |
|
|
930415df3b | 11 years ago |
|
|
d055356ebe | 11 years ago |
|
|
3e2bde6472 | 11 years ago |
|
|
c1c66c0021 | 11 years ago |
|
|
8080a798e0 | 11 years ago |
|
|
42bea203dc | 11 years ago |
|
|
8ef21fc474 | 11 years ago |
|
|
d404af9d16 | 11 years ago |
|
|
68759c84d0 | 11 years ago |
@ -1,13 +0,0 @@
|
||||
FROM mcr.microsoft.com/devcontainers/base:jammy
|
||||
|
||||
ARG PIXI_VERSION=v0.42.1
|
||||
|
||||
RUN curl -L -o /usr/local/bin/pixi -fsSL --compressed "https://github.com/prefix-dev/pixi/releases/download/${PIXI_VERSION}/pixi-$(uname -m)-unknown-linux-musl" \
|
||||
&& chmod +x /usr/local/bin/pixi \
|
||||
&& pixi info
|
||||
|
||||
# set some user and workdir settings to work nicely with vscode
|
||||
USER vscode
|
||||
WORKDIR /home/vscode
|
||||
|
||||
RUN echo 'eval "$(pixi completion -s bash)"' >> /home/vscode/.bashrc
|
||||
@ -1,21 +0,0 @@
|
||||
{
|
||||
"name": "Jupyter Notebook",
|
||||
"build": {
|
||||
"dockerfile": "Dockerfile",
|
||||
"context": ".."
|
||||
},
|
||||
"forwardPorts": [8888],
|
||||
"customizations": {
|
||||
"vscode": {
|
||||
"settings": {},
|
||||
"extensions": ["ms-python.python", "charliermarsh.ruff", "GitHub.copilot"]
|
||||
}
|
||||
},
|
||||
"features": {
|
||||
"ghcr.io/devcontainers/features/docker-in-docker:2": {}
|
||||
},
|
||||
"mounts": [
|
||||
"source=${localWorkspaceFolderBasename}-pixi,target=${containerWorkspaceFolder}/.pixi,type=volume"
|
||||
],
|
||||
"postCreateCommand": "sudo chown vscode .pixi && pixi install && pixi run develop && pixi run pre-commit install -f"
|
||||
}
|
||||
@ -1,23 +0,0 @@
|
||||
node_modules
|
||||
**/build
|
||||
**/lib
|
||||
**/node_modules
|
||||
**/mock_packages
|
||||
**/static
|
||||
**/typings
|
||||
**/schemas
|
||||
**/themes
|
||||
coverage
|
||||
*.map.js
|
||||
*.bundle.js
|
||||
app/index.template.js
|
||||
|
||||
# jetbrains IDE stuff
|
||||
.idea/
|
||||
|
||||
# ms IDE stuff
|
||||
.history/
|
||||
.vscode/
|
||||
|
||||
# Pixi environments
|
||||
.pixi
|
||||
@ -1,57 +0,0 @@
|
||||
module.exports = {
|
||||
env: {
|
||||
browser: true,
|
||||
es6: true,
|
||||
commonjs: true,
|
||||
node: true,
|
||||
'jest/globals': true,
|
||||
},
|
||||
root: true,
|
||||
extends: [
|
||||
'eslint:recommended',
|
||||
'plugin:@typescript-eslint/eslint-recommended',
|
||||
'plugin:@typescript-eslint/recommended',
|
||||
'plugin:prettier/recommended',
|
||||
'plugin:react/recommended',
|
||||
'plugin:jest/recommended',
|
||||
],
|
||||
parser: '@typescript-eslint/parser',
|
||||
parserOptions: {
|
||||
project: 'tsconfig.eslint.json',
|
||||
sourceType: 'module',
|
||||
},
|
||||
plugins: ['@typescript-eslint', 'jest'],
|
||||
rules: {
|
||||
'@typescript-eslint/naming-convention': [
|
||||
'error',
|
||||
{
|
||||
selector: 'interface',
|
||||
format: ['PascalCase'],
|
||||
custom: {
|
||||
regex: '^I[A-Z]',
|
||||
match: true,
|
||||
},
|
||||
},
|
||||
],
|
||||
'@typescript-eslint/no-unused-vars': ['warn', { args: 'none' }],
|
||||
'@typescript-eslint/no-explicit-any': 'off',
|
||||
'@typescript-eslint/no-namespace': 'off',
|
||||
'@typescript-eslint/no-var-requires': 'off',
|
||||
'@typescript-eslint/no-use-before-define': 'off',
|
||||
'@typescript-eslint/no-empty-interface': 'off',
|
||||
'@typescript-eslint/quotes': [
|
||||
'error',
|
||||
'single',
|
||||
{ avoidEscape: true, allowTemplateLiterals: false },
|
||||
],
|
||||
'jest/no-done-callback': 'off',
|
||||
curly: ['error', 'all'],
|
||||
eqeqeq: 'error',
|
||||
'prefer-arrow-callback': 'error',
|
||||
},
|
||||
settings: {
|
||||
react: {
|
||||
version: 'detect',
|
||||
},
|
||||
},
|
||||
};
|
||||
@ -1,13 +0,0 @@
|
||||
{
|
||||
"parserOptions": {
|
||||
"ecmaVersion": 6,
|
||||
"sourceType": "module"
|
||||
},
|
||||
"rules": {
|
||||
"semi": 1,
|
||||
"no-cond-assign": 2,
|
||||
"no-debugger": 2,
|
||||
"comma-dangle": 0,
|
||||
"no-unreachable": 2
|
||||
}
|
||||
}
|
||||
@ -1,2 +0,0 @@
|
||||
# Run auto-formatters: https://github.com/jupyter/notebook/pull/6335
|
||||
a7717d90f128368296fe3434deba5acd6031edab
|
||||
@ -1,2 +0,0 @@
|
||||
# SCM syntax highlighting & preventing 3-way merges
|
||||
pixi.lock merge=binary linguist-language=YAML linguist-generated=true
|
||||
@ -1,79 +0,0 @@
|
||||
---
|
||||
name: "\U0001F41B Bug report"
|
||||
about: Create a report to help us repair something that is currently broken
|
||||
labels: bug, status:Needs Triage
|
||||
---
|
||||
|
||||
<!-- Welcome! Thank you for contributing. These HTML comments will not render in the issue, but you can delete them once you've read them if you prefer! -->
|
||||
|
||||
<!--
|
||||
Right now, you're opening an issue to report a bug in Jupyter Notebook.
|
||||
|
||||
Please answer the following questions for yourself before submitting an issue
|
||||
- [ ] I checked the documentation and found no answer
|
||||
- [ ] I checked to make sure that this issue has not already been filed
|
||||
- [ ] I'm reporting the issue to the correct repository
|
||||
|
||||
If you have further questions after reading below, please visit the Jupyter Notebook discourse channel (https://discourse.jupyter.org/) and submit your questions there. There are many more people in the Jupyter community that engage on that channel.
|
||||
|
||||
NOTE:
|
||||
Jupyter Notebook 6.x development is in maintenance-only mode. Bugs found in Notebook 6.x and that don't reproduce in Notebook 7.x may not get fixed.
|
||||
|
||||
Work in this repository is focused on Jupyter Notebook 7.x, the former RetroLab project. The code base for Notebook 7.x is very different than Notebook 6.x. If you can, please try reproducing Notebook 6.x bugs with Notebook 7.x using the main branch of this repository.
|
||||
|
||||
We recommend that you check out JupyterLab (https://github.com/jupyterlab/jupyterlab), Jupyter's next generation Notebook interface.
|
||||
|
||||
Here, we're looking for specific bugs in the Jupyter Notebook codebase. If you think you've identified such a bug, you can continue opening your issue here. We'd appreciate if you include as much detail as possible, such as links to the offending code, snapshots of the UI issue, code blocks with your console logs, etc.
|
||||
-->
|
||||
|
||||
## Description
|
||||
|
||||
<!--Describe the bug clearly and concisely. Include screenshots if possible-->
|
||||
|
||||
## Reproduce
|
||||
|
||||
<!--Describe step-by-step instructions to reproduce the behavior-->
|
||||
|
||||
1. Go to '...'
|
||||
2. Click on '...'
|
||||
3. Scroll down to '...'
|
||||
4. See error '...'
|
||||
|
||||
<!--Describe how you diagnosed the issue. See the guidelines at
|
||||
https://jupyter-notebook.readthedocs.io/en/latest/troubleshooting.html -->
|
||||
|
||||
## Expected behavior
|
||||
|
||||
<!--Describe what you expected to happen-->
|
||||
|
||||
## Context
|
||||
|
||||
<!--Complete the following for context, and add any other relevant context-->
|
||||
|
||||
- Operating System and version: <!-- e.g. Linux Ubuntu 21.04 -->
|
||||
- Browser and version: <!-- e.g. Chrome 92 -->
|
||||
<!-- Please note the Notebook version you are working with. You can find this in the Help -> About Jupyter Notebook menu option or by running `jupyter --version` from your terminal -->
|
||||
- Jupyter Notebook version: <!-- e.g. 3.1.7 -->
|
||||
|
||||
<!--The more content you provide, the more we can help!-->
|
||||
|
||||
<details><summary>Troubleshoot Output</summary>
|
||||
<pre>
|
||||
Paste the output from running `jupyter troubleshoot` from the command line here.
|
||||
You may want to sanitize the paths in the output.
|
||||
</pre>
|
||||
</details>
|
||||
|
||||
<details><summary>Command Line Output</summary>
|
||||
<pre>
|
||||
Paste the output from your command line running `jupyter notebook` here, use `--debug` if possible.
|
||||
</pre>
|
||||
</details>
|
||||
|
||||
<details><summary>Browser Output</summary>
|
||||
<!--See https://webmasters.stackexchange.com/a/77337 for how to access the JavaScript console-->
|
||||
<pre>
|
||||
Paste the output from your browser Javascript console here, if applicable.
|
||||
|
||||
</pre>
|
||||
</details>
|
||||
@ -1,14 +0,0 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: Is this a common issue? See our Docs.
|
||||
url: https://jupyter-notebook.readthedocs.io/en/latest/troubleshooting.html#what-to-do-when-things-go-wrong
|
||||
about: Before opening an issue, make sure your issue hasn't already been addressed in the documentation.
|
||||
- name: 🤔 Support and all other questions, including if you're not sure what to do.
|
||||
url: https://discourse.jupyter.org/c/notebook/31
|
||||
about: If you have a question or you're having issues installing Jupyter Notebook, try posting on Discourse.
|
||||
- name: 💬 Chat with the devs
|
||||
url: https://jupyter.zulipchat.com/
|
||||
about: Ask short questions about using Jupyter Notebook
|
||||
- name: 📝 Do you have a feature request that may be applied upstream? See JupyterLab.
|
||||
url: https://github.com/jupyterlab/jupyterlab
|
||||
about: We recommend that you cross-reference JupyterLab for information when requesting new features and support for Notebook 7. We won't likely accept new features for Jupyter Notebook 6.x.
|
||||
@ -1,41 +0,0 @@
|
||||
---
|
||||
name: "\U0001F680 Feature Request"
|
||||
about: Suggest a new feature or a change
|
||||
labels: enhancement, status:Needs Triage
|
||||
---
|
||||
|
||||
<!-- Welcome! These HTML comments will not render in the issue, but you can delete them once you've read them if you prefer! -->
|
||||
|
||||
<!--
|
||||
Thanks for thinking of a way to improve Jupyter Notebook. If this solves a problem for you, then it probably solves that problem for lots of people! So the whole community will benefit from this request.
|
||||
|
||||
NOTE: Please note that Jupyter Notebook 6.x development is in maintenance-only mode.
|
||||
|
||||
Finally, please answer the following questions for yourself before submitting an issue.
|
||||
|
||||
- [ ] I checked to make sure that this issue has not already been filed
|
||||
- [ ] I'm reporting the issue to the correct repository
|
||||
|
||||
-->
|
||||
|
||||
### Problem
|
||||
|
||||
<!-- Provide a clear and concise description of what problem this feature will solve. For example:
|
||||
|
||||
* I'm always frustrated when [...] because [...]
|
||||
* I would like it if [...] happened when I [...] because [...]
|
||||
-->
|
||||
|
||||
### Proposed Solution
|
||||
|
||||
<!-- Provide a clear and concise description of a way to accomplish what you want. For example:
|
||||
|
||||
* Add an option so that when [...] [...] will happen
|
||||
-->
|
||||
|
||||
### Additional context
|
||||
|
||||
<!-- Add any other context or screenshots about the feature request here. You can also include links to examples of other programs that have something similar to your request. For example:
|
||||
|
||||
* Another project [...] solved this by [...]
|
||||
-->
|
||||
@ -1,44 +0,0 @@
|
||||
name: 'Build Jupyter Notebook'
|
||||
description: 'Build Jupyter Notebook from source'
|
||||
runs:
|
||||
using: 'composite'
|
||||
steps:
|
||||
- name: Base Setup
|
||||
uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1
|
||||
|
||||
- name: Install dependencies
|
||||
shell: bash
|
||||
run: |
|
||||
python -m pip install hatch
|
||||
|
||||
- name: Build pypi distributions
|
||||
shell: bash
|
||||
run: |
|
||||
hatch build
|
||||
|
||||
- name: Build npm distributions
|
||||
shell: bash
|
||||
run: |
|
||||
mkdir pkgs
|
||||
hatch run npm_pack
|
||||
cp packages/*/*.tgz pkgs
|
||||
|
||||
- name: Build checksum file
|
||||
shell: bash
|
||||
run: |
|
||||
cd dist
|
||||
sha256sum * | tee SHA256SUMS
|
||||
cd ../pkgs
|
||||
sha256sum * | tee SHA256SUMS
|
||||
|
||||
- name: Upload distributions
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: notebook-dist-${{ github.run_number }}
|
||||
path: ./dist
|
||||
|
||||
- name: Upload distributions
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: notebook-pkgs-${{ github.run_number }}
|
||||
path: ./pkgs
|
||||
@ -1,20 +0,0 @@
|
||||
# This action automatically schedules issues to be closed that have been
|
||||
# labeled as answered if there is no activity on them for 30 days. This takes
|
||||
# care of the common usecase of an issue being answered to the best of our
|
||||
# ability and no other follow-up from the submitter.
|
||||
name: 'Close answered issues'
|
||||
on:
|
||||
schedule:
|
||||
- cron: '30 1 * * *'
|
||||
|
||||
jobs:
|
||||
stale:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/stale@v3
|
||||
with:
|
||||
skip-stale-issue-message: true
|
||||
days-before-stale: 30
|
||||
days-before-close: 7
|
||||
stale-issue-label: 'status:Closing as Answered'
|
||||
only-issue-labels: 'status:Answered'
|
||||
@ -1,14 +0,0 @@
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: 'github-actions'
|
||||
directory: '/'
|
||||
schedule:
|
||||
interval: 'weekly'
|
||||
groups:
|
||||
actions:
|
||||
patterns:
|
||||
- "*"
|
||||
- package-ecosystem: 'pip'
|
||||
directory: '/'
|
||||
schedule:
|
||||
interval: 'weekly'
|
||||
@ -1,2 +0,0 @@
|
||||
addBinderLink: false
|
||||
triageLabel: 'status:Needs Triage'
|
||||
@ -1,17 +0,0 @@
|
||||
# https://github.com/marketplace/actions/auto-author-assign
|
||||
name: 'Auto Author Assign'
|
||||
|
||||
on:
|
||||
pull_request_target:
|
||||
types: [opened, reopened]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
assign-author:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
pull-requests: write
|
||||
steps:
|
||||
- uses: toshimaru/auto-author-assign@v2.1.1
|
||||
@ -1,18 +0,0 @@
|
||||
name: Binder Badge
|
||||
on:
|
||||
pull_request_target:
|
||||
types: [opened]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
binder:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
pull-requests: write
|
||||
steps:
|
||||
- uses: jupyterlab/maintainer-tools/.github/actions/binder-link@v1
|
||||
with:
|
||||
github_token: ${{ secrets.github_token }}
|
||||
url_path: tree
|
||||
@ -1,214 +0,0 @@
|
||||
name: Build
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: ['main']
|
||||
pull_request:
|
||||
schedule:
|
||||
- cron: '0 0 * * *'
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}
|
||||
cancel-in-progress: true
|
||||
|
||||
env:
|
||||
PIP_DISABLE_PIP_VERSION_CHECK: 1
|
||||
|
||||
defaults:
|
||||
run:
|
||||
shell: bash -eux {0}
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Build
|
||||
uses: ./.github/actions/build-dist
|
||||
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 20
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
# used by the jupyterlab/maintainer-tools base-setup action
|
||||
python-version: ['3.9', '3.10', '3.11', '3.12', '3.13']
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Base Setup
|
||||
uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1
|
||||
|
||||
- name: Test the package
|
||||
run: hatch run cov:test
|
||||
|
||||
- name: JavaScript tests
|
||||
run: |
|
||||
hatch run js_test
|
||||
|
||||
- name: Integration Tests
|
||||
run: |
|
||||
pip install .
|
||||
cd
|
||||
jupyter labextension list 2>&1 | grep -ie "@jupyter-notebook/lab-extension.*enabled.*ok" -
|
||||
jupyter server extension list 2>&1 | grep -ie "notebook.*enabled" -
|
||||
python -m jupyterlab.browser_check
|
||||
|
||||
- uses: jupyterlab/maintainer-tools/.github/actions/upload-coverage@v1
|
||||
|
||||
coverage:
|
||||
runs-on: ubuntu-latest
|
||||
needs:
|
||||
- test
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: jupyterlab/maintainer-tools/.github/actions/report-coverage@v1
|
||||
with:
|
||||
fail_under: 78
|
||||
|
||||
test_docs:
|
||||
name: Test Docs
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1
|
||||
- run: |
|
||||
sudo apt-get update
|
||||
sudo apt install enchant-2 # for spelling
|
||||
|
||||
# pandoc is not up to date in the ubuntu repos, so we install directly
|
||||
wget https://github.com/jgm/pandoc/releases/download/2.14.2/pandoc-2.14.2-1-amd64.deb && sudo dpkg -i pandoc-2.14.2-1-amd64.deb
|
||||
- run: hatch run docs:build
|
||||
|
||||
test_minimum_versions:
|
||||
name: Test Minimum Versions
|
||||
timeout-minutes: 20
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1
|
||||
with:
|
||||
dependency_type: minimum
|
||||
python_version: '3.10'
|
||||
- name: Run the unit tests
|
||||
run: |
|
||||
hatch run test:nowarn || hatch run test:nowarn --lf
|
||||
|
||||
test_prereleases:
|
||||
name: Test Prereleases
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 20
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1
|
||||
with:
|
||||
dependency_type: pre
|
||||
- name: Run the tests
|
||||
run: |
|
||||
hatch run test:nowarn || hatch run test:nowarn --lf
|
||||
|
||||
install:
|
||||
needs: [build]
|
||||
runs-on: ${{ matrix.os }}
|
||||
timeout-minutes: 15
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [ubuntu-latest, macos-latest, windows-latest]
|
||||
python: ['3.9', '3.11', '3.13']
|
||||
include:
|
||||
- python: '3.9'
|
||||
dist: 'notebook*.tar.gz'
|
||||
- python: '3.11'
|
||||
dist: 'notebook*.whl'
|
||||
- python: '3.13'
|
||||
dist: 'notebook*.whl'
|
||||
- os: windows-latest
|
||||
py_cmd: python
|
||||
- os: macos-latest
|
||||
py_cmd: python3
|
||||
- os: ubuntu-latest
|
||||
py_cmd: python
|
||||
steps:
|
||||
- name: Install Python
|
||||
uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version: ${{ matrix.python }}
|
||||
allow-prereleases: true
|
||||
- uses: actions/download-artifact@v6
|
||||
with:
|
||||
name: notebook-dist-${{ github.run_number }}
|
||||
path: ./dist
|
||||
- name: Install the prerequisites
|
||||
run: |
|
||||
${{ matrix.py_cmd }} -m pip install -U pip wheel
|
||||
- name: Install the package
|
||||
run: |
|
||||
cd dist
|
||||
${{ matrix.py_cmd }} -m pip install -vv ${{ matrix.dist }}
|
||||
- name: Validate environment
|
||||
run: |
|
||||
${{ matrix.py_cmd }} -m pip freeze
|
||||
${{ matrix.py_cmd }} -m pip check
|
||||
- name: Validate the install
|
||||
run: |
|
||||
jupyter labextension list
|
||||
jupyter labextension list 2>&1 | grep -ie "@jupyter-notebook/lab-extension.*enabled.*ok" -
|
||||
jupyter server extension list
|
||||
jupyter server extension list 2>&1 | grep -ie "notebook.*enabled" -
|
||||
jupyter notebook --version
|
||||
jupyter notebook --help
|
||||
|
||||
check_links:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 10
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1
|
||||
- uses: jupyterlab/maintainer-tools/.github/actions/check-links@v1
|
||||
with:
|
||||
ignore_links: 'https://playwright.dev/docs/test-cli/ https://blog.jupyter.org/.* https://mybinder.org/v2/gh/jupyter/notebook/main https://nbviewer.jupyter.org https://stackoverflow.com https://github.com/[^/]+/?$'
|
||||
ignore_glob: 'ui-tests/test/notebooks/*'
|
||||
|
||||
test_lint:
|
||||
name: Test Lint
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1
|
||||
- name: Run Linters
|
||||
run: |
|
||||
hatch run typing:test
|
||||
hatch run lint:build
|
||||
pipx run interrogate -v .
|
||||
pipx run doc8 --max-line-length=200 docs/source *.md
|
||||
npm install -g yarn
|
||||
yarn
|
||||
yarn eslint:check
|
||||
yarn prettier:check
|
||||
yarn build:utils
|
||||
yarn integrity
|
||||
|
||||
tests_check: # This job does nothing and is only used for the branch protection
|
||||
if: always()
|
||||
needs:
|
||||
- coverage
|
||||
- install
|
||||
- test_lint
|
||||
- test_docs
|
||||
- test_minimum_versions
|
||||
- test_prereleases
|
||||
- check_links
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Decide whether the needed jobs succeeded or failed
|
||||
uses: re-actors/alls-green@release/v1
|
||||
with:
|
||||
jobs: ${{ toJSON(needs) }}
|
||||
@ -1,84 +0,0 @@
|
||||
name: Build Utilities
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: ['main']
|
||||
pull_request:
|
||||
|
||||
defaults:
|
||||
run:
|
||||
shell: bash -l {0}
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
versioning:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 10
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Base Setup
|
||||
uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
python -m pip install -U "jupyterlab>=4.6.0a0,<4.7" hatch
|
||||
jlpm
|
||||
jlpm run build
|
||||
|
||||
- name: Configure git identity to commit
|
||||
run: |
|
||||
git config --global user.email "you@example.com"
|
||||
git config --global user.name "Your Name"
|
||||
|
||||
- name: Reset version
|
||||
run: |
|
||||
hatch version 9.8.7
|
||||
jlpm run lerna version 9.8.7 --no-push --force-publish --no-git-tag-version --yes
|
||||
git commit -am "Release 9.8.7"
|
||||
|
||||
- name: Patch Release
|
||||
run: |
|
||||
jlpm release:patch --force
|
||||
|
||||
- name: Minor Release
|
||||
run: |
|
||||
jlpm release:bump minor --force
|
||||
|
||||
- name: Release Cycle
|
||||
run: |
|
||||
# beta
|
||||
jlpm release:bump release --force
|
||||
# rc
|
||||
jlpm release:bump release --force
|
||||
# final
|
||||
jlpm release:bump release --force
|
||||
|
||||
- name: Major Release
|
||||
run: |
|
||||
jlpm release:bump major --force
|
||||
|
||||
npm:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Install Python
|
||||
uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version: '3.10'
|
||||
architecture: 'x64'
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
python -m pip install -U "jupyterlab>=4.6.0a0,<4.7" pip
|
||||
jlpm
|
||||
jlpm run build
|
||||
@ -1,33 +0,0 @@
|
||||
name: Check Release
|
||||
on:
|
||||
push:
|
||||
branches: ['main']
|
||||
pull_request:
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
check_release:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 30
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
- name: Base Setup
|
||||
uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1
|
||||
- name: Check Release
|
||||
uses: jupyter-server/jupyter_releaser/.github/actions/check-release@v2
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
version_spec: next
|
||||
|
||||
- name: Upload Distributions
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: notebook-jupyter-releaser-dist-${{ github.run_number }}
|
||||
path: .jupyter_releaser_checkout/dist
|
||||
@ -1,16 +0,0 @@
|
||||
name: Enforce PR label
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
types: [labeled, unlabeled, opened, edited, synchronize]
|
||||
jobs:
|
||||
enforce-label:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
pull-requests: write
|
||||
steps:
|
||||
- name: enforce-triage-label
|
||||
uses: jupyterlab/maintainer-tools/.github/actions/enforce-label@v1
|
||||
@ -1,23 +0,0 @@
|
||||
name: 'Lock Closed Threads'
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 0 * * *'
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
lock:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
issues: write
|
||||
pull-requests: write
|
||||
steps:
|
||||
- uses: dessant/lock-threads@v5
|
||||
with:
|
||||
github-token: ${{ github.token }}
|
||||
issue-lock-inactive-days: '180'
|
||||
issue-lock-labels: 'status:resolved-locked'
|
||||
pr-lock-inactive-days: '180'
|
||||
pr-lock-labels: 'status:resolved-locked'
|
||||
@ -1,117 +0,0 @@
|
||||
name: Update Playwright Snapshots
|
||||
|
||||
on:
|
||||
issue_comment:
|
||||
types: [created, edited]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
update-snapshots:
|
||||
if: >
|
||||
(
|
||||
github.event.issue.author_association == 'OWNER' ||
|
||||
github.event.issue.author_association == 'COLLABORATOR' ||
|
||||
github.event.issue.author_association == 'MEMBER' ||
|
||||
github.event.comment.author_association == 'OWNER' ||
|
||||
github.event.comment.author_association == 'COLLABORATOR' ||
|
||||
github.event.comment.author_association == 'MEMBER'
|
||||
) && github.event.issue.pull_request && (
|
||||
contains(github.event.comment.body, 'please update playwright snapshots') ||
|
||||
contains(github.event.comment.body, 'please update galata snapshots') ||
|
||||
contains(github.event.comment.body, 'please update snapshots')
|
||||
)
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
# Required by actions/update-snapshots
|
||||
contents: write
|
||||
pull-requests: write
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
browser: [firefox, chromium]
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: React to the triggering comment
|
||||
run: |
|
||||
gh api repos/${{ github.repository }}/issues/comments/${{ github.event.comment.id }}/reactions --raw-field 'content=+1'
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Configure git to use https
|
||||
run: git config --global hub.protocol https
|
||||
|
||||
- name: Get PR Info
|
||||
id: pr
|
||||
env:
|
||||
PR_NUMBER: ${{ github.event.issue.number }}
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
GH_REPO: ${{ github.repository }}
|
||||
COMMENT_AT: ${{ github.event.comment.created_at }}
|
||||
run: |
|
||||
pr="$(gh api /repos/${GH_REPO}/pulls/${PR_NUMBER})"
|
||||
head_sha="$(echo "$pr" | jq -r .head.sha)"
|
||||
pushed_at="$(echo "$pr" | jq -r .pushed_at)"
|
||||
|
||||
if [[ $(date -d "$pushed_at" +%s) -gt $(date -d "$COMMENT_AT" +%s) ]]; then
|
||||
echo "Updating is not allowed because the PR was pushed to (at $pushed_at) after the triggering comment was issued (at $COMMENT_AT)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "head_sha=$head_sha" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Checkout the branch from the PR that triggered the job
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: gh pr checkout ${{ github.event.issue.number }}
|
||||
|
||||
- name: Validate the fetched branch HEAD revision
|
||||
env:
|
||||
EXPECTED_SHA: ${{ steps.pr.outputs.head_sha }}
|
||||
run: |
|
||||
actual_sha="$(git rev-parse HEAD)"
|
||||
|
||||
if [[ "$actual_sha" != "$EXPECTED_SHA" ]]; then
|
||||
echo "The HEAD of the checked out branch ($actual_sha) differs from the HEAD commit available at the time when trigger comment was submitted ($EXPECTED_SHA)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- name: Base Setup
|
||||
uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1
|
||||
|
||||
- name: Build
|
||||
uses: ./.github/actions/build-dist
|
||||
|
||||
- uses: actions/download-artifact@v6
|
||||
with:
|
||||
name: notebook-dist-${{ github.run_number }}
|
||||
path: ./dist
|
||||
|
||||
- name: Install the package
|
||||
run: |
|
||||
cd dist
|
||||
python -m pip install -vv notebook*.whl
|
||||
|
||||
# disable git hooks
|
||||
git config core.hooksPath no-hooks
|
||||
|
||||
- name: Install the test dependencies
|
||||
run: |
|
||||
cd ui-tests
|
||||
jlpm
|
||||
jlpm playwright install
|
||||
|
||||
- name: Update snapshots
|
||||
uses: jupyterlab/maintainer-tools/.github/actions/update-snapshots@v1
|
||||
with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
npm_client: jlpm
|
||||
test_folder: ui-tests
|
||||
start_server_script: 'null'
|
||||
update_script: test:update --browser ${{ matrix.browser }}
|
||||
env:
|
||||
DEBUG: pw:webserver
|
||||
@ -1,49 +0,0 @@
|
||||
name: "Step 1: Prep Release"
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
version_spec:
|
||||
description: "New Version Specifier"
|
||||
default: "next"
|
||||
required: false
|
||||
branch:
|
||||
description: "The branch to target"
|
||||
required: false
|
||||
post_version_spec:
|
||||
description: "Post Version Specifier"
|
||||
required: false
|
||||
silent:
|
||||
description: "Set a placeholder in the changelog and don't publish the release."
|
||||
required: false
|
||||
type: boolean
|
||||
since:
|
||||
description: "Use PRs with activity since this date or git reference"
|
||||
required: false
|
||||
since_last_stable:
|
||||
description: "Use PRs with activity since the last stable git tag"
|
||||
required: false
|
||||
type: boolean
|
||||
jobs:
|
||||
prep_release:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: write
|
||||
steps:
|
||||
- uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1
|
||||
|
||||
- name: Prep Release
|
||||
id: prep-release
|
||||
uses: jupyter-server/jupyter_releaser/.github/actions/prep-release@v2
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
version_spec: ${{ github.event.inputs.version_spec }}
|
||||
silent: ${{ github.event.inputs.silent }}
|
||||
post_version_spec: ${{ github.event.inputs.post_version_spec }}
|
||||
target: ${{ github.event.inputs.target }}
|
||||
branch: ${{ github.event.inputs.branch }}
|
||||
since: ${{ github.event.inputs.since }}
|
||||
since_last_stable: ${{ github.event.inputs.since_last_stable }}
|
||||
|
||||
- name: "** Next Step **"
|
||||
run: |
|
||||
echo "Optional): Review Draft Release: ${{ steps.prep-release.outputs.release_url }}"
|
||||
@ -1,34 +0,0 @@
|
||||
name: "Publish Changelog"
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
branch:
|
||||
description: "The branch to target"
|
||||
required: false
|
||||
|
||||
jobs:
|
||||
publish_changelog:
|
||||
runs-on: ubuntu-latest
|
||||
environment: release
|
||||
steps:
|
||||
- uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1
|
||||
|
||||
- uses: actions/create-github-app-token@v2
|
||||
id: app-token
|
||||
with:
|
||||
app-id: ${{ vars.APP_ID }}
|
||||
private-key: ${{ secrets.APP_PRIVATE_KEY }}
|
||||
|
||||
- name: Publish changelog
|
||||
id: publish-changelog
|
||||
uses: jupyter-server/jupyter_releaser/.github/actions/publish-changelog@v2
|
||||
with:
|
||||
token: ${{ steps.app-token.outputs.token }}
|
||||
branch: ${{ github.event.inputs.branch }}
|
||||
|
||||
- name: "** Next Step **"
|
||||
run: |
|
||||
echo "Merge the changelog update PR: ${{ steps.publish-changelog.outputs.pr_url }}"
|
||||
@ -1,60 +0,0 @@
|
||||
name: "Step 2: Publish Release"
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
branch:
|
||||
description: "The target branch"
|
||||
required: false
|
||||
release_url:
|
||||
description: "The URL of the draft GitHub release"
|
||||
required: false
|
||||
steps_to_skip:
|
||||
description: "Comma separated list of steps to skip"
|
||||
required: false
|
||||
|
||||
jobs:
|
||||
publish_release:
|
||||
runs-on: ubuntu-latest
|
||||
environment: release
|
||||
permissions:
|
||||
id-token: write
|
||||
steps:
|
||||
- uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1
|
||||
with:
|
||||
node_version: '24'
|
||||
|
||||
- uses: actions/create-github-app-token@v2
|
||||
id: app-token
|
||||
with:
|
||||
app-id: ${{ vars.APP_ID }}
|
||||
private-key: ${{ secrets.APP_PRIVATE_KEY }}
|
||||
|
||||
- name: Populate Release
|
||||
id: populate-release
|
||||
uses: jupyter-server/jupyter_releaser/.github/actions/populate-release@v2
|
||||
with:
|
||||
token: ${{ steps.app-token.outputs.token }}
|
||||
branch: ${{ github.event.inputs.branch }}
|
||||
release_url: ${{ github.event.inputs.release_url }}
|
||||
steps_to_skip: ${{ github.event.inputs.steps_to_skip }}
|
||||
|
||||
- name: Finalize Release
|
||||
id: finalize-release
|
||||
env:
|
||||
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||
uses: jupyter-server/jupyter_releaser/.github/actions/finalize-release@v2
|
||||
with:
|
||||
token: ${{ steps.app-token.outputs.token }}
|
||||
release_url: ${{ steps.populate-release.outputs.release_url }}
|
||||
|
||||
- name: "** Next Step **"
|
||||
if: ${{ success() }}
|
||||
run: |
|
||||
echo "Verify the final release"
|
||||
echo ${{ steps.finalize-release.outputs.release_url }}
|
||||
|
||||
- name: "** Failure Message **"
|
||||
if: ${{ failure() }}
|
||||
run: |
|
||||
echo "Failed to Publish the Draft Release Url:"
|
||||
echo ${{ steps.populate-release.outputs.release_url }}
|
||||
@ -1,93 +0,0 @@
|
||||
name: UI Tests
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: ['main']
|
||||
pull_request:
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Build
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Build
|
||||
uses: ./.github/actions/build-dist
|
||||
|
||||
ui-tests:
|
||||
needs: [build]
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 20
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
browser: [firefox, chromium]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Base Setup
|
||||
uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1
|
||||
|
||||
- uses: actions/download-artifact@v6
|
||||
with:
|
||||
name: notebook-dist-${{ github.run_number }}
|
||||
path: ./dist
|
||||
|
||||
- name: Install the package
|
||||
run: |
|
||||
cd dist
|
||||
python -m pip install -vv notebook*.whl
|
||||
|
||||
- name: Install the test dependencies
|
||||
run: |
|
||||
cd ui-tests
|
||||
jlpm
|
||||
jlpm playwright install
|
||||
|
||||
- name: Test
|
||||
run: |
|
||||
cd ui-tests
|
||||
jlpm test --browser ${{ matrix.browser }}
|
||||
|
||||
- name: Upload Playwright Test assets
|
||||
if: always()
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: notebook-${{ matrix.browser }}-test-assets
|
||||
path: |
|
||||
ui-tests/test-results
|
||||
|
||||
- name: Upload Playwright Test report
|
||||
if: always()
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: notebook-${{ matrix.browser }}-test-report
|
||||
path: |
|
||||
ui-tests/playwright-report
|
||||
|
||||
- name: Update snapshots
|
||||
if: failure()
|
||||
run: |
|
||||
cd ui-tests
|
||||
# remove previous snapshots from other browser
|
||||
jlpm rimraf "test/**/*-snapshots/*.png"
|
||||
# generate new snapshots
|
||||
jlpm run test:update --browser ${{ matrix.browser }}
|
||||
|
||||
- name: Upload updated snapshots
|
||||
if: failure()
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: notebook-${{ matrix.browser }}-updated-snapshots
|
||||
path: ui-tests/test
|
||||
@ -1,128 +0,0 @@
|
||||
name: Check for latest JupyterLab releases
|
||||
|
||||
on:
|
||||
# schedule:
|
||||
# - cron: 30 17 * * *
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
version:
|
||||
description: 'JupyterLab version'
|
||||
default: latest
|
||||
required: true
|
||||
type: string
|
||||
branch:
|
||||
description: 'The branch to target'
|
||||
default: main
|
||||
required: false
|
||||
type: string
|
||||
target_repo:
|
||||
description: 'Target repository'
|
||||
required: false
|
||||
default: jupyter/notebook
|
||||
type: string
|
||||
|
||||
env:
|
||||
version_tag: 'latest'
|
||||
|
||||
permissions:
|
||||
actions: write
|
||||
contents: write
|
||||
pull-requests: write
|
||||
|
||||
jobs:
|
||||
check_for_lab_updates:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
ref: ${{ inputs.branch || 'main' }}
|
||||
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version: '3.11'
|
||||
|
||||
- name: Install Node
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: '20.x'
|
||||
|
||||
- name: Install npm dependencies and build buildutils
|
||||
run: |
|
||||
python -m pip install -e ".[dev]"
|
||||
|
||||
jlpm
|
||||
jlpm run build:utils
|
||||
|
||||
- name: Check for new releases and update
|
||||
shell: bash
|
||||
run: |
|
||||
set -eux
|
||||
for version in ${{ inputs.version || env.version_tag }}
|
||||
do
|
||||
if [[ "${version}" == "latest" ]]; then
|
||||
export LATEST=$(jlpm run get:lab:version --set-version ${version})
|
||||
else
|
||||
export LATEST=${version}
|
||||
fi
|
||||
done
|
||||
|
||||
echo "latest=${LATEST}" >> $GITHUB_ENV
|
||||
jlpm upgrade:lab:dependencies --set-version ${LATEST}
|
||||
if [[ ! -z "$(git status --porcelain package.json)" ]]; then
|
||||
jlpm
|
||||
jlpm deduplicate
|
||||
|
||||
cd ui-tests
|
||||
jlpm
|
||||
jlpm deduplicate
|
||||
fi
|
||||
- uses: prefix-dev/setup-pixi@v0.9.3
|
||||
with:
|
||||
pixi-version: v0.41.4
|
||||
manifest-path: pyproject.toml
|
||||
locked: false
|
||||
|
||||
- name: Update pixi.lock
|
||||
run: pixi install
|
||||
|
||||
- name: Create a PR
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.PERSONAL_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
set -eux
|
||||
|
||||
export LATEST=${{ env.latest }}
|
||||
export BRANCH_NAME=update-to-v${LATEST}
|
||||
|
||||
# if resulted in any change:
|
||||
if [[ ! -z "$(git status --porcelain package.json)" ]]; then
|
||||
# if branch already exists.
|
||||
if git ls-remote --heads origin | grep "refs/heads/${BRANCH_NAME}$" > /dev/null; then
|
||||
echo "Branch '${BRANCH_NAME}' exists."
|
||||
else
|
||||
# new branch is created
|
||||
git checkout -b "${BRANCH_NAME}"
|
||||
git config user.name "github-actions[bot]"
|
||||
git config user.email 'github-actions[bot]@users.noreply.github.com'
|
||||
|
||||
git commit . -m "Update to JupyterLab v${LATEST}"
|
||||
|
||||
git push --set-upstream origin "${BRANCH_NAME}"
|
||||
|
||||
PR_ARGS=(
|
||||
--base "${{ inputs.branch || 'main' }}"
|
||||
--title "Update to JupyterLab v${LATEST}"
|
||||
--body "New JupyterLab release [v${LATEST}](https://github.com/jupyterlab/jupyterlab/releases/tag/v${LATEST}) is available. Please review the lock file carefully."
|
||||
)
|
||||
|
||||
# Add --repo flag only if target_repo is specified
|
||||
if [[ -n "${{ inputs.target_repo }}" ]]; then
|
||||
PR_ARGS+=(--repo "${{ inputs.target_repo }}")
|
||||
fi
|
||||
|
||||
gh pr create "${PR_ARGS[@]}"
|
||||
fi
|
||||
fi
|
||||
@ -1,150 +1,27 @@
|
||||
*.bundle.*
|
||||
lib/
|
||||
node_modules/
|
||||
*.egg-info/
|
||||
.ipynb_checkpoints
|
||||
*.tsbuildinfo
|
||||
|
||||
# Created by https://www.gitignore.io/api/python
|
||||
# Edit at https://www.gitignore.io/?templates=python
|
||||
|
||||
### Python ###
|
||||
# Byte-compiled / optimized / DLL files
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
*$py.class
|
||||
|
||||
# C extensions
|
||||
*.so
|
||||
|
||||
# Distribution / packaging
|
||||
.Python
|
||||
build/
|
||||
develop-eggs/
|
||||
dist/
|
||||
downloads/
|
||||
eggs/
|
||||
.eggs/
|
||||
lib/
|
||||
lib64/
|
||||
parts/
|
||||
sdist/
|
||||
var/
|
||||
wheels/
|
||||
pip-wheel-metadata/
|
||||
share/python-wheels/
|
||||
.installed.cfg
|
||||
*.egg
|
||||
MANIFEST
|
||||
|
||||
# PyInstaller
|
||||
# Usually these files are written by a python script from a template
|
||||
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
||||
*.manifest
|
||||
*.spec
|
||||
|
||||
# Installer logs
|
||||
pip-log.txt
|
||||
pip-delete-this-directory.txt
|
||||
|
||||
# Unit test / coverage reports
|
||||
htmlcov/
|
||||
.tox/
|
||||
.nox/
|
||||
.coverage
|
||||
.coverage.*
|
||||
.cache
|
||||
nosetests.xml
|
||||
coverage.xml
|
||||
*.cover
|
||||
.hypothesis/
|
||||
.pytest_cache/
|
||||
|
||||
# Translations
|
||||
*.mo
|
||||
*.pot
|
||||
|
||||
# Scrapy stuff:
|
||||
.scrapy
|
||||
|
||||
# Sphinx documentation
|
||||
docs/_build/
|
||||
|
||||
# PyBuilder
|
||||
target/
|
||||
|
||||
# pyenv
|
||||
.python-version
|
||||
|
||||
# celery beat schedule file
|
||||
celerybeat-schedule
|
||||
|
||||
# SageMath parsed files
|
||||
*.sage.py
|
||||
|
||||
# Spyder project settings
|
||||
.spyderproject
|
||||
.spyproject
|
||||
|
||||
# Rope project settings
|
||||
.ropeproject
|
||||
|
||||
# Mr Developer
|
||||
.mr.developer.cfg
|
||||
.project
|
||||
.pydevproject
|
||||
|
||||
# mkdocs documentation
|
||||
/site
|
||||
|
||||
# mypy
|
||||
.mypy_cache/
|
||||
.dmypy.json
|
||||
dmypy.json
|
||||
|
||||
# Pyre type checker
|
||||
.pyre/
|
||||
|
||||
# OS X stuff
|
||||
*.DS_Store
|
||||
|
||||
# End of https://www.gitignore.io/api/python
|
||||
|
||||
_temp_extension
|
||||
junit.xml
|
||||
[uU]ntitled*
|
||||
notebook/static/*
|
||||
!notebook/static/favicons
|
||||
notebook/labextension
|
||||
notebook/schemas
|
||||
docs/source/changelog.md
|
||||
docs/source/contributing.md
|
||||
|
||||
# playwright
|
||||
ui-tests/test-results
|
||||
ui-tests/playwright-report
|
||||
|
||||
# VSCode
|
||||
.vscode
|
||||
|
||||
# RTC
|
||||
.jupyter_ystore.db
|
||||
|
||||
# yarn >=2.x local files
|
||||
.yarn/*
|
||||
.pnp.*
|
||||
ui-tests/.yarn/*
|
||||
ui-tests/.pnp.*
|
||||
|
||||
# keep potential upstream patches
|
||||
!.yarn/patches
|
||||
|
||||
# generated html
|
||||
notebook/templates/*.html
|
||||
|
||||
# pixi environments
|
||||
.pixi
|
||||
build
|
||||
dist
|
||||
_build
|
||||
docs/man/*.gz
|
||||
docs/source/api/generated
|
||||
docs/source/config.rst
|
||||
docs/gh-pages
|
||||
notebook/static/components
|
||||
notebook/static/style/*.min.css*
|
||||
notebook/static/*/js/main.min.js*
|
||||
node_modules
|
||||
*.py[co]
|
||||
__pycache__
|
||||
*.egg-info
|
||||
*~
|
||||
*.bak
|
||||
.ipynb_checkpoints
|
||||
.tox
|
||||
.DS_Store
|
||||
\#*#
|
||||
.#*
|
||||
.coverage
|
||||
src
|
||||
|
||||
# Temporary files used for testing
|
||||
tmp/
|
||||
*.swp
|
||||
*.map
|
||||
|
||||
@ -0,0 +1,149 @@
|
||||
A. J. Holyoake <a.j.holyoake@gmail.com> ajholyoake <a.j.holyoake@gmail.com>
|
||||
Aaron Culich <aculich@gmail.com> Aaron Culich <aculich@eecs.berkeley.edu>
|
||||
Aron Ahmadia <aron@ahmadia.net> ahmadia <aron@ahmadia.net>
|
||||
Benjamin Ragan-Kelley <benjaminrk@gmail.com> <minrk@Mercury.local>
|
||||
Benjamin Ragan-Kelley <benjaminrk@gmail.com> Min RK
|
||||
Benjamin Ragan-Kelley <benjaminrk@gmail.com> MinRK <benjaminrk@gmail.com>
|
||||
Barry Wark <barrywark@gmail.com> Barry Wark <barrywarkatgmaildotcom>
|
||||
Ben Edwards <bedwards@cs.unm.edu> Ben Edwards <bedwards@sausage.(none)>
|
||||
Bradley M. Froehle <brad.froehle@gmail.com> Bradley M. Froehle <bfroehle@math.berkeley.edu>
|
||||
Bradley M. Froehle <brad.froehle@gmail.com> Bradley Froehle <brad.froehle@gmail.com>
|
||||
Brandon Parsons <brandon@parsonstx.com> Brandon Parsons <brandon.parsons@hp.com>
|
||||
Brian E. Granger <ellisonbg@gmail.com> Brian Granger
|
||||
Brian E. Granger <ellisonbg@gmail.com> Brian Granger <>
|
||||
Brian E. Granger <ellisonbg@gmail.com> bgranger <>
|
||||
Brian E. Granger <ellisonbg@gmail.com> bgranger <bgranger@red>
|
||||
Christoph Gohlke <cgohlke@uci.edu> cgohlke <cgohlke@uci.edu>
|
||||
Cyrille Rossant <cyrille.rossant@gmail.com> rossant <rossant@github>
|
||||
Damián Avila <damianavila82@yahoo.com.ar> damianavila <damianavila82@yahoo.com.ar>
|
||||
Damián Avila <damianavila82@yahoo.com.ar> damianavila <damianavila@gmail.com>
|
||||
Damon Allen <damontallen@gmail.com> damontallen <damontallen@gmail.com>
|
||||
Darren Dale <dsdale24@gmail.com> darren.dale <>
|
||||
Darren Dale <dsdale24@gmail.com> Darren Dale <>
|
||||
Dav Clark <davclark@berkeley.edu> Dav Clark <>
|
||||
Dav Clark <davclark@berkeley.edu> Dav Clark <davclark@gmail.com>
|
||||
David Hirschfeld <david.hirschfeld@gazprom-mt.com> dhirschfeld <david.hirschfeld@gazprom-mt.com>
|
||||
David P. Sanders <dpsanders@gmail.com> David P. Sanders <dpsanders@ciencias.unam.mx>
|
||||
David Warde-Farley <wardefar@iro.umontreal.ca> David Warde-Farley <>
|
||||
Doug Blank <dblank@cs.brynmawr.edu> Doug Blank <doug.blank@gmail.com>
|
||||
Eugene Van den Bulke <eugene.van-den-bulke@gmail.com> Eugene Van den Bulke <eugene.vandenbulke@gmail.com>
|
||||
Evan Patterson <epatters@enthought.com> <epatters@EPattersons-MacBook-Pro.local>
|
||||
Evan Patterson <epatters@enthought.com> <epatters@evan-laptop.localdomain>
|
||||
Evan Patterson <epatters@enthought.com> <epatters@caltech.edu>
|
||||
Evan Patterson <epatters@enthought.com> <ejpatters@gmail.com>
|
||||
Evan Patterson <epatters@enthought.com> epatters <ejpatters@gmail.com>
|
||||
Evan Patterson <epatters@enthought.com> epatters <epatters@enthought.com>
|
||||
Ernie French <ernestfrench@gmail.com> Ernie French <ernie@gqpbj.com>
|
||||
Ernie French <ernestfrench@gmail.com> ernie french <ernestfrench@gmail.com>
|
||||
Ernie French <ernestfrench@gmail.com> ernop <ernestfrench@gmail.com>
|
||||
Fernando Perez <Fernando.Perez@berkeley.edu> <fperez.net@gmail.com>
|
||||
Fernando Perez <Fernando.Perez@berkeley.edu> Fernando Perez <fernando.perez@berkeley.edu>
|
||||
Fernando Perez <Fernando.Perez@berkeley.edu> fperez <>
|
||||
Fernando Perez <Fernando.Perez@berkeley.edu> fptest <>
|
||||
Fernando Perez <Fernando.Perez@berkeley.edu> fptest1 <>
|
||||
Fernando Perez <Fernando.Perez@berkeley.edu> Fernando Perez <fernando.perez@berkeley.edu>
|
||||
Fernando Perez <fernando.perez@berkeley.edu> Fernando Perez <>
|
||||
Fernando Perez <fernando.perez@berkeley.edu> Fernando Perez <fperez@maqroll>
|
||||
Frank Murphy <fpmurphy@mtu.edu> Frank Murphy <fmurphy@arbor.net>
|
||||
Gabriel Becker <gmbecker@ucdavis.edu> gmbecker <gmbecker@ucdavis.edu>
|
||||
Gael Varoquaux <gael.varoquaux@normalesup.org> gael.varoquaux <>
|
||||
Gael Varoquaux <gael.varoquaux@normalesup.org> gvaroquaux <gvaroquaux@gvaroquaux-desktop>
|
||||
Gael Varoquaux <gael.varoquaux@normalesup.org> Gael Varoquaux <>
|
||||
Ingolf Becker <ingolf.becker@googlemail.com> watercrossing <ingolf.becker@googlemail.com>
|
||||
Jake Vanderplas <jakevdp@gmail.com> Jake Vanderplas <vanderplas@astro.washington.edu>
|
||||
Jakob Gager <jakob.gager@gmail.com> jakobgager <jakob.gager@gmail.com>
|
||||
Jakob Gager <jakob.gager@gmail.com> jakobgager <gager@ilsb.tuwien.ac.at>
|
||||
Jakob Gager <jakob.gager@gmail.com> jakobgager <jakobgager@hotmail.com>
|
||||
Jason Grout <jgrout6@bloomberg.net> <jason.grout@drake.edu>
|
||||
Jason Grout <jgrout6@bloomberg.net> <jason-github@creativetrax.com>
|
||||
Jason Gors <jason.gors.work@gmail.com> jason gors <jason.gors.work@gmail.com>
|
||||
Jason Gors <jason.gors.work@gmail.com> jgors <jason.gors.work@gmail.com>
|
||||
Jens Hedegaard Nielsen <jenshnielsen@gmail.com> Jens Hedegaard Nielsen <jhn@jhn-Znote.(none)>
|
||||
Jens Hedegaard Nielsen <jenshnielsen@gmail.com> Jens H Nielsen <jenshnielsen@gmail.com>
|
||||
Jens Hedegaard Nielsen <jenshnielsen@gmail.com> Jens H. Nielsen <jenshnielsen@gmail.com>
|
||||
Jez Ng <jezreel@gmail.com> Jez Ng <me@jezng.com>
|
||||
Jonathan Frederic <jdfreder@calpoly.edu> Jonathan Frederic <jonathan@LifebookMint.(none)>
|
||||
Jonathan Frederic <jdfreder@calpoly.edu> Jonathan Frederic <jon.freder@gmail.com>
|
||||
Jonathan Frederic <jdfreder@calpoly.edu> Jonathan Frederic <xh3xx.goose@gmail.com>
|
||||
Jonathan Frederic <jdfreder@calpoly.edu> jon <jon.freder@gmail.com>
|
||||
Jonathan Frederic <jdfreder@calpoly.edu> U-Jon-PC\Jon <Jon@Jon-PC.(none)>
|
||||
Jonathan March <jmarch@enthought.com> Jonathan March <JDM@MarchRay.net>
|
||||
Jonathan March <jmarch@enthought.com> jdmarch <JDM@marchRay.net>
|
||||
Jörgen Stenarson <jorgen.stenarson@kroywen.se> Jörgen Stenarson <jorgen.stenarson@bostream.nu>
|
||||
Jörgen Stenarson <jorgen.stenarson@kroywen.se> Jorgen Stenarson <jorgen.stenarson@bostream.nu>
|
||||
Jörgen Stenarson <jorgen.stenarson@kroywen.se> Jorgen Stenarson <>
|
||||
Jörgen Stenarson <jorgen.stenarson@kroywen.se> jstenar <jorgen.stenarson@bostream.nu>
|
||||
Jörgen Stenarson <jorgen.stenarson@kroywen.se> jstenar <>
|
||||
Jörgen Stenarson <jorgen.stenarson@kroywen.se> Jörgen Stenarson <jorgen.stenarson@kroywen.se>
|
||||
Juergen Hasch <python@elbonia.de> juhasch <python@elbonia.de>
|
||||
Juergen Hasch <python@elbonia.de> juhasch <hasch@VMBOX.fritz.box>
|
||||
Julia Evans <julia@jvns.ca> Julia Evans <julia@stripe.com>
|
||||
Kester Tong <kestert@google.com> KesterTong <kestert@google.com>
|
||||
Kyle Kelley <rgbkrk@gmail.com> Kyle Kelley <kyle.kelley@rackspace.com>
|
||||
Kyle Kelley <rgbkrk@gmail.com> rgbkrk <rgbkrk@gmail.com>
|
||||
Laurent Dufréchou <laurent.dufrechou@gmail.com> <laurent.dufrechou@gmail.com>
|
||||
Laurent Dufréchou <laurent.dufrechou@gmail.com> <laurent@Pep>
|
||||
Laurent Dufréchou <laurent.dufrechou@gmail.com> laurent dufrechou <>
|
||||
Laurent Dufréchou <laurent.dufrechou@gmail.com> laurent.dufrechou <>
|
||||
Laurent Dufréchou <laurent.dufrechou@gmail.com> Laurent Dufrechou <>
|
||||
Laurent Dufréchou <laurent.dufrechou@gmail.com> laurent.dufrechou@gmail.com <>
|
||||
Laurent Dufréchou <laurent.dufrechou@gmail.com> ldufrechou <ldufrechou@PEP>
|
||||
Lorena Pantano <lorena.pantano@gmail.com> Lorena <lorena.pantano@gmail.com>
|
||||
Luis Pedro Coelho <luis@luispedro.org> Luis Pedro Coelho <lpc@cmu.edu>
|
||||
Marc Molla <marcmolla@gmail.com> marcmolla <marcmolla@gmail.com>
|
||||
Martín Gaitán <gaitan@gmail.com> Martín Gaitán <gaitan@phasety.com>
|
||||
Matthias Bussonnier <bussonniermatthias@gmail.com> Matthias BUSSONNIER <bussonniermatthias@gmail.com>
|
||||
Matthias Bussonnier <bussonniermatthias@gmail.com> Bussonnier Matthias <bussonniermatthias@gmail.com>
|
||||
Matthias Bussonnier <bussonniermatthias@gmail.com> Matthias BUSSONNIER <bussonniermatthias@umr168-curn-1-24x-6561.curie.fr>
|
||||
Matthias Bussonnier <bussonniermatthias@gmail.com> Matthias Bussonnier <carreau@Aspire.(none)>
|
||||
Michael Droettboom <mdboom@gmail.com> Michael Droettboom <mdroe@stsci.edu>
|
||||
Nicholas Bollweg <nick.bollweg@gmail.com> Nicholas Bollweg (Nick) <nick.bollweg@gmail.com>
|
||||
Nicolas Rougier <Nicolas.Rougier@inria.fr> <Nicolas.rougier@inria.fr>
|
||||
Nikolay Koldunov <koldunovn@gmail.com> Nikolay Koldunov <nikolay.koldunov@zmaw.de>
|
||||
Omar Andrés Zapata Mesa <andresete.chaos@gmail.com> Omar Andres Zapata Mesa <andresete.chaos@gmail.com>
|
||||
Omar Andrés Zapata Mesa <andresete.chaos@gmail.com> Omar Andres Zapata Mesa <omazapa@tuxhome>
|
||||
Pankaj Pandey <pankaj86@gmail.com> Pankaj Pandey <pankaj@enthought.com>
|
||||
Pascal Schetelat <pascal.schetelat@gmail.com> pascal-schetelat <pascal.schetelat@gmail.com>
|
||||
Paul Ivanov <pi@berkeley.edu> Paul Ivanov <pivanov314@gmail.com>
|
||||
Pauli Virtanen <pauli.virtanen@iki.fi> Pauli Virtanen <>
|
||||
Pauli Virtanen <pauli.virtanen@iki.fi> Pauli Virtanen <pav@iki.fi>
|
||||
Pierre Gerold <pierre.gerold@laposte.net> Pierre Gerold <gerold@crans.org>
|
||||
Pietro Berkes <pberkes@enthought.com> Pietro Berkes <pietro.berkes@googlemail.com>
|
||||
Piti Ongmongkolkul <piti118@gmail.com> piti118 <piti118@gmail.com>
|
||||
Prabhu Ramachandran <prabhu@enthought.com> Prabhu Ramachandran <>
|
||||
Puneeth Chaganti <punchagan@gmail.com> Puneeth Chaganti <punchagan@muse-amuse.in>
|
||||
Robert Kern <robert.kern@gmail.com> rkern <>
|
||||
Robert Kern <robert.kern@gmail.com> Robert Kern <rkern@enthought.com>
|
||||
Robert Kern <robert.kern@gmail.com> Robert Kern <rkern@Sacrilege.local>
|
||||
Robert Kern <robert.kern@gmail.com> Robert Kern <>
|
||||
Robert Marchman <bo.marchman@gmail.com> Robert Marchman <robert.l.marchman@dartmouth.edu>
|
||||
Satrajit Ghosh <satra@mit.edu> Satrajit Ghosh <satra@ba5.mit.edu>
|
||||
Satrajit Ghosh <satra@mit.edu> Satrajit Ghosh <satrajit.ghosh@gmail.com>
|
||||
Scott Sanderson <scoutoss@gmail.com> Scott Sanderson <ssanderson@quantopian.com>
|
||||
smithj1 <smithj1@LMC-022896.local> smithj1 <smithj1@LMC-022896.swisscom.com>
|
||||
smithj1 <smithj1@LMC-022896.local> smithj1 <smithj1@lmc-022896.local>
|
||||
Steven Johnson <steven.johnson@drake.edu> stevenJohnson <steven.johnson@drake.edu>
|
||||
Steven Silvester <steven.silvester@ieee.org> blink1073 <steven.silvester@ieee.org>
|
||||
S. Weber <s8weber@c4.usr.sh> s8weber <s8weber@c5.usr.sh>
|
||||
Stefan van der Walt <stefan@sun.ac.za> Stefan van der Walt <bzr@mentat.za.net>
|
||||
Silvia Vinyes <silvia.vinyes@gmail.com> Silvia <silvia@silvia-U44SG.(none)>
|
||||
Silvia Vinyes <silvia.vinyes@gmail.com> silviav12 <silvia.vinyes@gmail.com>
|
||||
Sylvain Corlay <scorlay@bloomberg.net> <sylvain.corlay@gmail.com>
|
||||
Sylvain Corlay <scorlay@bloomberg.net> sylvain.corlay <sylvain.corlay@gmail.com>
|
||||
Ted Drain <ted.drain@gmail.com> TD22057 <ted.drain@gmail.com>
|
||||
Théophile Studer <theo.studer@gmail.com> Théophile Studer <studer@users.noreply.github.com>
|
||||
Thomas Kluyver <takowl@gmail.com> Thomas <takowl@gmail.com>
|
||||
Thomas Spura <tomspur@fedoraproject.org> Thomas Spura <thomas.spura@gmail.com>
|
||||
Timo Paulssen <timonator@perpetuum-immobile.de> timo <timonator@perpetuum-immobile.de>
|
||||
vds <vds@VIVIAN> vds2212 <vds2212@VIVIAN>
|
||||
vds <vds@VIVIAN> vds <vds@vivian>
|
||||
Ville M. Vainio <vivainio@gmail.com> <vivainio2@WN-W0941>
|
||||
Ville M. Vainio <vivainio@gmail.com> ville <ville@VILLE-PC>
|
||||
Ville M. Vainio <vivainio@gmail.com> ville <ville@ville-desktop>
|
||||
Ville M. Vainio <vivainio@gmail.com> vivainio <>
|
||||
Ville M. Vainio <vivainio@gmail.com> Ville M. Vainio <vivainio@villev>
|
||||
Ville M. Vainio <vivainio@gmail.com> Ville M. Vainio <vivainio@ville_vmw>
|
||||
Walter Doerwald <walter@livinglogic.de> walter.doerwald <>
|
||||
Walter Doerwald <walter@livinglogic.de> Walter Doerwald <>
|
||||
W. Trevor King <wking@tremily.us> W. Trevor King <wking@drexel.edu>
|
||||
Yoval P. <yoval@gmx.com> y-p <yoval@gmx.com>
|
||||
@ -1,86 +0,0 @@
|
||||
ci:
|
||||
autoupdate_schedule: monthly
|
||||
autoupdate_commit_msg: 'chore: update pre-commit hooks'
|
||||
|
||||
repos:
|
||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||
rev: v5.0.0
|
||||
hooks:
|
||||
- id: check-case-conflict
|
||||
- id: check-ast
|
||||
- id: check-docstring-first
|
||||
- id: check-executables-have-shebangs
|
||||
- id: check-added-large-files
|
||||
- id: check-case-conflict
|
||||
- id: check-merge-conflict
|
||||
- id: check-json
|
||||
- id: check-toml
|
||||
- id: check-yaml
|
||||
- id: debug-statements
|
||||
- id: end-of-file-fixer
|
||||
- id: trailing-whitespace
|
||||
|
||||
- repo: https://github.com/python-jsonschema/check-jsonschema
|
||||
rev: 0.30.0
|
||||
hooks:
|
||||
- id: check-github-workflows
|
||||
|
||||
- repo: https://github.com/codespell-project/codespell
|
||||
rev: 'v2.3.0'
|
||||
hooks:
|
||||
- id: codespell
|
||||
args: ['-L', 'hart,noteable', '--skip', "*.spec.ts"]
|
||||
exclude: |
|
||||
(?x)^(
|
||||
yarn.lock|
|
||||
pixi.lock|
|
||||
binder/example.ipynb|
|
||||
docs/source/examples/images/FrontendKernel.graffle/data.plist|
|
||||
)$
|
||||
|
||||
- repo: https://github.com/pre-commit/mirrors-mypy
|
||||
rev: "v1.14.1"
|
||||
hooks:
|
||||
- id: mypy
|
||||
files: "^notebook"
|
||||
stages: [manual]
|
||||
args: ["--install-types", "--non-interactive"]
|
||||
additional_dependencies: ["traitlets>=5.13", "tornado", "jupyter_server>=2.10", "jupyterlab_server>=2.25", "jupyterlab>=4.6.0a0,<4.7"]
|
||||
|
||||
- repo: https://github.com/pre-commit/pygrep-hooks
|
||||
rev: 'v1.10.0'
|
||||
hooks:
|
||||
- id: rst-backticks
|
||||
- id: rst-directive-colons
|
||||
- id: rst-inline-touching-normal
|
||||
|
||||
- repo: https://github.com/astral-sh/ruff-pre-commit
|
||||
rev: v0.8.6
|
||||
hooks:
|
||||
- id: ruff
|
||||
types_or: [ python, jupyter ]
|
||||
exclude: '^docs/source/examples/Notebook/Importing Notebooks.ipynb'
|
||||
args: ['--fix', '--show-fixes']
|
||||
- id: ruff-format
|
||||
types_or: [ python, jupyter ]
|
||||
exclude: '^docs/source/examples/Notebook/Importing Notebooks.ipynb'
|
||||
|
||||
- repo: https://github.com/scientific-python/cookie
|
||||
rev: '2024.08.19'
|
||||
hooks:
|
||||
- id: sp-repo-review
|
||||
additional_dependencies: ['repo-review[cli]']
|
||||
|
||||
- repo: local
|
||||
hooks:
|
||||
- id: prettier
|
||||
name: prettier
|
||||
entry: 'npm run prettier:files'
|
||||
language: node
|
||||
types_or: [json, ts, tsx, javascript, jsx, css, markdown]
|
||||
stages: [manual]
|
||||
- id: integrity
|
||||
name: integrity
|
||||
entry: 'npm run integrity --force'
|
||||
language: node
|
||||
stages: [pre-push]
|
||||
@ -1,12 +0,0 @@
|
||||
node_modules
|
||||
.mypy_cache
|
||||
.ruff_cache
|
||||
**/node_modules
|
||||
**/lib
|
||||
**/package.json
|
||||
**/static
|
||||
**/labextension
|
||||
build
|
||||
CHANGELOG.md
|
||||
app/index.template.js
|
||||
.pixi
|
||||
@ -1,3 +0,0 @@
|
||||
{
|
||||
"singleQuote": true
|
||||
}
|
||||
@ -1,13 +0,0 @@
|
||||
version: 2
|
||||
sphinx:
|
||||
configuration: docs/source/conf.py
|
||||
build:
|
||||
os: ubuntu-22.04
|
||||
tools:
|
||||
python: '3.9'
|
||||
nodejs: '16'
|
||||
python:
|
||||
install:
|
||||
# install notebook itself
|
||||
- method: pip
|
||||
path: '.[docs]'
|
||||
@ -0,0 +1,33 @@
|
||||
# http://travis-ci.org/#!/ipython/ipython
|
||||
language: python
|
||||
cache:
|
||||
directories:
|
||||
- ~/.cache/bower
|
||||
python:
|
||||
- 3.4
|
||||
- 2.7
|
||||
sudo: false
|
||||
env:
|
||||
global:
|
||||
- PATH=$TRAVIS_BUILD_DIR/pandoc:$PATH
|
||||
matrix:
|
||||
- GROUP=python
|
||||
- GROUP=js/base
|
||||
- GROUP=js/notebook
|
||||
- GROUP=js/services
|
||||
- GROUP=js/tree
|
||||
before_install:
|
||||
- 'if [[ $GROUP == js* ]]; then npm install -g casperjs; fi'
|
||||
- git clone --quiet --depth 1 https://github.com/minrk/travis-wheels travis-wheels
|
||||
install:
|
||||
- pip install -f travis-wheels/wheelhouse --pre file://$PWD#egg=notebook[test] coveralls
|
||||
script:
|
||||
- 'if [[ $GROUP == js* ]]; then python -m notebook.jstest ${GROUP:3}; fi'
|
||||
- 'if [[ $GROUP == python ]]; then nosetests --with-coverage --cover-package=notebook notebook; fi'
|
||||
matrix:
|
||||
include:
|
||||
- python: 3.3
|
||||
env: GROUP=python
|
||||
|
||||
after_success:
|
||||
- coveralls
|
||||
@ -1,5 +0,0 @@
|
||||
enableImmutableInstalls: false
|
||||
enableInlineBuilds: false
|
||||
enableTelemetry: false
|
||||
httpTimeout: 60000
|
||||
nodeLinker: node-modules
|
||||
@ -1,247 +1,3 @@
|
||||
# Contributing to Jupyter Notebook
|
||||
# Contributing
|
||||
|
||||
Thanks for contributing to Jupyter Notebook!
|
||||
|
||||
Make sure to follow [Project Jupyter's Code of Conduct](https://jupyter.org/governance/conduct/code-of-conduct)
|
||||
for a friendly and welcoming collaborative environment.
|
||||
|
||||
## Setting up a development environment
|
||||
|
||||
Note: You will need NodeJS to build the extension package.
|
||||
|
||||
The `jlpm` command is JupyterLab's pinned version of [yarn](https://yarnpkg.com/) that is installed with JupyterLab. You may use
|
||||
`yarn` or `npm` in lieu of `jlpm` below.
|
||||
|
||||
**Note**: we recommend using `mamba` to speed up the creation of the environment.
|
||||
|
||||
```bash
|
||||
# create a new environment
|
||||
mamba create -n notebook -c conda-forge python nodejs -y
|
||||
|
||||
# activate the environment
|
||||
mamba activate notebook
|
||||
|
||||
# Install package in development mode
|
||||
pip install -e ".[dev,docs,test]"
|
||||
|
||||
# Install dependencies and build packages
|
||||
jlpm
|
||||
jlpm build
|
||||
|
||||
# Link the notebook extension and @jupyter-notebook schemas
|
||||
jlpm develop
|
||||
|
||||
# Enable the server extension
|
||||
jupyter server extension enable notebook
|
||||
```
|
||||
|
||||
`notebook` follows a monorepo structure. To build all the packages at once:
|
||||
|
||||
```bash
|
||||
jlpm build
|
||||
```
|
||||
|
||||
There is also a `watch` script to watch for changes and rebuild the app automatically:
|
||||
|
||||
```bash
|
||||
jlpm watch
|
||||
```
|
||||
|
||||
To make sure the `notebook` server extension is installed:
|
||||
|
||||
```bash
|
||||
$ jupyter server extension list
|
||||
Config dir: /home/username/.jupyter
|
||||
|
||||
Config dir: /home/username/miniforge3/envs/notebook/etc/jupyter
|
||||
jupyterlab enabled
|
||||
- Validating jupyterlab...
|
||||
jupyterlab 3.0.0 OK
|
||||
notebook enabled
|
||||
- Validating notebook...
|
||||
notebook 7.0.0a0 OK
|
||||
|
||||
Config dir: /usr/local/etc/jupyter
|
||||
```
|
||||
|
||||
Then start Jupyter Notebook with:
|
||||
|
||||
```bash
|
||||
jupyter notebook
|
||||
```
|
||||
|
||||
### Local changes in Notebook dependencies
|
||||
|
||||
The development installation described above fetches JavaScript dependencies from `npm`.
|
||||
according to the versions in the _package.json_ file.
|
||||
However, it is sometimes useful to be able to test changes in Notebook, with dependencies (e.g. `@jupyterlab` packages) that have not yet
|
||||
been published.
|
||||
|
||||
[yalc](https://github.com/wclr/yalc) can help you use local JavaScript packages when building Notebook, acting as a local package repository.
|
||||
|
||||
- Install yalc globally in your environment:
|
||||
`npm install -g yalc`
|
||||
- Publish your dependency package:\
|
||||
`yalc publish`, from the package root directory.\
|
||||
For instance, if you are developing on _@jupyterlab/ui-components_, this command must be executed from
|
||||
_path_to_jupyterlab/packages/ui-components_.
|
||||
- Depend on this local repository in Notebook:
|
||||
- from the Notebook root directory:\
|
||||
`yalc add your_package` : this will create a _dependencies_ entry in the main _package.json_ file.\
|
||||
With the previous example, it would be `yalc add @jupyterlab/ui-components`.
|
||||
- Notebook is a monorepo, so we want this dependency to be 'linked' as a resolution (for all sub-packages) instead
|
||||
of a dependency.\
|
||||
The easiest way is to manually move the new entry in _package.json_ from _dependencies_ to _resolutions_.
|
||||
- Build Notebook with the local dependency:\
|
||||
`jlpm install && jlpm build`
|
||||
|
||||
Changes in the dependency must then be built and pushed using `jlpm build && yalc push` (from the package root directory),
|
||||
and fetched from Notebook using `yarn install`.
|
||||
|
||||
**Warning**: you need to make sure that the dependencies of Notebook and the local package match correctly,
|
||||
otherwise there will be errors with webpack during build.\
|
||||
In the previous example, both _@jupyterlab/ui-components_ and Notebook depend on _@jupyterlab/coreutils_. We
|
||||
strongly advise you to depend on the same version.
|
||||
|
||||
## Running Tests
|
||||
|
||||
To run the tests:
|
||||
|
||||
```bash
|
||||
jlpm run build:test
|
||||
jlpm run test
|
||||
```
|
||||
|
||||
There are also end to end tests to cover higher level user interactions, located in the `ui-tests` folder. To run these tests:
|
||||
|
||||
```bash
|
||||
cd ui-tests
|
||||
#install required packages for jlpm
|
||||
jlpm
|
||||
|
||||
#install playwright
|
||||
jlpm playwright install
|
||||
|
||||
# start a new Jupyter server in a terminal
|
||||
jlpm start
|
||||
|
||||
# in a new terminal, run the tests
|
||||
jlpm test
|
||||
```
|
||||
|
||||
The `test` script calls the Playwright test runner. You can pass additional arguments to `playwright` by appending parameters to the command. For example to run the test in headed mode, `jlpm test --headed`.
|
||||
|
||||
Check out the [Playwright Command Line Reference](https://playwright.dev/docs/test-cli/) for more information about the available command line options.
|
||||
|
||||
Running the end to end tests in headful mode will trigger something like the following:
|
||||
|
||||

|
||||
|
||||
## Tasks caching
|
||||
|
||||
The repository is configured to use the Lerna caching system (via `nx`) for some of the development scripts.
|
||||
|
||||
This helps speed up rebuilds when running `jlpm run build` multiple times to avoid rebuilding packages that have not changed on disk.
|
||||
|
||||
You can generate a graph to have a better idea of the dependencies between all the packages using the following command:
|
||||
|
||||
```
|
||||
npx nx graph
|
||||
```
|
||||
|
||||
Running the command will open a browser tab by default with a graph that looks like the following:
|
||||
|
||||

|
||||
|
||||
To learn more about Lerna caching:
|
||||
|
||||
- https://lerna.js.org/docs/features/cache-tasks
|
||||
- https://nx.dev/features/cache-task-results
|
||||
|
||||
### Updating reference snapshots
|
||||
|
||||
Often a PR might make changes to the user interface, which can cause the visual regression tests to fail.
|
||||
|
||||
If you want to update the reference snapshots while working on a PR you can post the following sentence as a GitHub comment:
|
||||
|
||||
```
|
||||
bot please update playwright snapshots
|
||||
```
|
||||
|
||||
This will trigger a GitHub Action that will run the UI tests automatically and push new commits to the branch if the reference snapshots have changed.
|
||||
|
||||
## Code Styling
|
||||
|
||||
All non-python source code is formatted using [prettier](https://prettier.io) and python source code is formatted using [black](https://github.com/psf/black).
|
||||
When code is modified and committed, all staged files will be
|
||||
automatically formatted using pre-commit git hooks (with help from
|
||||
[pre-commit](https://github.com/pre-commit/pre-commit). The benefit of
|
||||
using code formatters like `prettier` and `black` is that it removes the topic of
|
||||
code style from the conversation when reviewing pull requests, thereby
|
||||
speeding up the review process.
|
||||
|
||||
As long as your code is valid,
|
||||
the pre-commit hook should take care of how it should look.
|
||||
`pre-commit` and its associated hooks will automatically be installed when
|
||||
you run `pip install -e ".[dev,test]"`
|
||||
|
||||
To install `pre-commit` manually, run the following:
|
||||
|
||||
```shell
|
||||
pip install pre-commit
|
||||
pre-commit install
|
||||
```
|
||||
|
||||
You can invoke the pre-commit hook by hand at any time with:
|
||||
|
||||
```shell
|
||||
pre-commit run
|
||||
```
|
||||
|
||||
which should run any autoformatting on your code
|
||||
and tell you about any errors it couldn't fix automatically.
|
||||
You may also install [black integration](https://github.com/psf/black#editor-integration)
|
||||
into your text editor to format code automatically.
|
||||
|
||||
If you have already committed files before setting up the pre-commit
|
||||
hook with `pre-commit install`, you can fix everything up using
|
||||
`pre-commit run --all-files`. You need to make the fixing commit
|
||||
yourself after that.
|
||||
|
||||
You may also use the prettier npm script (e.g. `npm run prettier` or
|
||||
`yarn prettier` or `jlpm prettier`) to format the entire code base.
|
||||
We recommend installing a prettier extension for your code editor and
|
||||
configuring it to format your code with a keyboard shortcut, or
|
||||
automatically on save.
|
||||
|
||||
Some of the hooks only run on CI by default, but you can invoke them by
|
||||
running with the `--hook-stage manual` argument.
|
||||
|
||||
## Documentation
|
||||
|
||||
First make sure you have set up a development environment as described above.
|
||||
|
||||
Then run the following command to build the docs:
|
||||
|
||||
```shell
|
||||
hatch run docs:build
|
||||
```
|
||||
|
||||
In a separate terminal window, run the following command to serve the documentation:
|
||||
|
||||
```shell
|
||||
hatch run docs:serve
|
||||
```
|
||||
|
||||
Now open a web browser and navigate to `http://localhost:8000` to access the documentation.
|
||||
|
||||
## Contributing from the browser
|
||||
|
||||
Alternatively you can also contribute to Jupyter Notebook without setting up a local environment, directly from a web browser:
|
||||
|
||||
- [GitHub CodeSpaces](https://github.com/codespaces) is directly integrated into GitHub. This repository uses the [pixi](https://pixi.sh/) package manager to set up the development environment. To contribute after the Codespace is started:
|
||||
- Run `pixi shell` in a terminal to activate the development environment
|
||||
- Use the commands above for building the extension and running the tests, for example: `jlpm build`
|
||||
- To start the application: `pixi run start`. A popup should appear with a button to open the Jupyter Notebook in a new browser tab. If the popup does not appear, you can navigate to the "Forwarded ports" panel to find the URL to the application.
|
||||
- GitHub's [built-in editor](https://docs.github.com/en/repositories/working-with-files/managing-files/editing-files) is suitable for contributing small fixes.
|
||||
- A more advanced [github.dev](https://docs.github.com/en/codespaces/the-githubdev-web-based-editor) editor can be accessed by pressing the dot (.) key while in the Jupyter Notebook GitHub repository
|
||||
We follow the [IPython Contributing Guide](https://github.com/ipython/ipython/blob/master/CONTRIBUTING.md).
|
||||
|
||||
@ -0,0 +1,60 @@
|
||||
# Licensing terms
|
||||
|
||||
This project is licensed under the terms of the Modified BSD License
|
||||
(also known as New or Revised or 3-Clause BSD), as follows:
|
||||
|
||||
- Copyright (c) 2001-2015, IPython Development Team
|
||||
- Copyright (c) 2015-, Jupyter Development Team
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
Redistributions in binary form must reproduce the above copyright notice, this
|
||||
list of conditions and the following disclaimer in the documentation and/or
|
||||
other materials provided with the distribution.
|
||||
|
||||
Neither the name of the Jupyter Development Team nor the names of its
|
||||
contributors may be used to endorse or promote products derived from this
|
||||
software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
## About the Jupyter Development Team
|
||||
|
||||
The Jupyter Development Team is the set of all contributors to the Jupyter project.
|
||||
This includes all of the Jupyter subprojects.
|
||||
|
||||
The core team that coordinates development on GitHub can be found here:
|
||||
https://github.com/jupyter/.
|
||||
|
||||
## Our Copyright Policy
|
||||
|
||||
Jupyter uses a shared copyright model. Each contributor maintains copyright
|
||||
over their contributions to Jupyter. But, it is important to note that these
|
||||
contributions are typically only changes to the repositories. Thus, the Jupyter
|
||||
source code, in its entirety is not the copyright of any single person or
|
||||
institution. Instead, it is the collective copyright of the entire Jupyter
|
||||
Development Team. If individual contributors want to maintain a record of what
|
||||
changes/contributions they have specific copyright on, they should indicate
|
||||
their copyright in the commit message of the change, when they commit the
|
||||
change to one of the Jupyter repositories.
|
||||
|
||||
With this in mind, the following banner should be used in any source code file
|
||||
to indicate the copyright and license terms:
|
||||
|
||||
# Copyright (c) Jupyter Development Team.
|
||||
# Distributed under the terms of the Modified BSD License.
|
||||
@ -0,0 +1,66 @@
|
||||
# Installs Jupyter Notebook and IPython kernel from the current branch
|
||||
# Another Docker container should inherit with `FROM jupyter/notebook`
|
||||
# to run actual services.
|
||||
|
||||
FROM ubuntu:14.04
|
||||
|
||||
MAINTAINER Project Jupyter <jupyter@googlegroups.com>
|
||||
|
||||
ENV DEBIAN_FRONTEND noninteractive
|
||||
|
||||
# Not essential, but wise to set the lang
|
||||
# Note: Users with other languages should set this in their derivative image
|
||||
RUN apt-get update && apt-get install -y language-pack-en
|
||||
ENV LANGUAGE en_US.UTF-8
|
||||
ENV LANG en_US.UTF-8
|
||||
ENV LC_ALL en_US.UTF-8
|
||||
|
||||
RUN locale-gen en_US.UTF-8
|
||||
RUN dpkg-reconfigure locales
|
||||
|
||||
# Python binary dependencies, developer tools
|
||||
RUN apt-get update && apt-get install -y -q \
|
||||
build-essential \
|
||||
make \
|
||||
gcc \
|
||||
zlib1g-dev \
|
||||
git \
|
||||
python \
|
||||
python-dev \
|
||||
python-pip \
|
||||
python3-dev \
|
||||
python3-pip \
|
||||
python-sphinx \
|
||||
python3-sphinx \
|
||||
libzmq3-dev \
|
||||
sqlite3 \
|
||||
libsqlite3-dev \
|
||||
pandoc \
|
||||
libcurl4-openssl-dev \
|
||||
nodejs \
|
||||
nodejs-legacy \
|
||||
npm
|
||||
|
||||
RUN pip2 install --upgrade setuptools pip
|
||||
RUN pip3 install --upgrade setuptools pip
|
||||
|
||||
RUN mkdir -p /srv/
|
||||
WORKDIR /srv/
|
||||
RUN git clone --depth 1 https://github.com/ipython/ipykernel /srv/ipykernel
|
||||
WORKDIR /srv/ipykernel
|
||||
RUN pip2 install --pre -e .
|
||||
RUN pip3 install --pre -e .
|
||||
|
||||
ADD . /srv/notebook
|
||||
WORKDIR /srv/notebook/
|
||||
RUN chmod -R +rX /srv/notebook
|
||||
|
||||
RUN pip3 install -e .[test]
|
||||
|
||||
# install kernels
|
||||
RUN python2 -m ipykernel.kernelspec
|
||||
RUN python3 -m ipykernel.kernelspec
|
||||
|
||||
WORKDIR /tmp/
|
||||
|
||||
RUN nosetests notebook
|
||||
@ -1,31 +0,0 @@
|
||||
BSD 3-Clause License
|
||||
|
||||
- Copyright (c) 2001-2015, IPython Development Team
|
||||
- Copyright (c) 2015-, Jupyter Development Team
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
3. Neither the name of the copyright holder nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
@ -0,0 +1,28 @@
|
||||
include COPYING.md
|
||||
include CONTRIBUTING.md
|
||||
include README.md
|
||||
include package.json
|
||||
include bower.json
|
||||
include .bowerrc
|
||||
include setupbase.py
|
||||
include Dockerfile
|
||||
graft tools
|
||||
|
||||
# Documentation
|
||||
graft docs
|
||||
exclude docs/\#*
|
||||
|
||||
# Examples
|
||||
graft examples
|
||||
|
||||
# docs subdirs we want to skip
|
||||
prune docs/build
|
||||
prune docs/gh-pages
|
||||
prune docs/dist
|
||||
|
||||
# Patterns to exclude from any directory
|
||||
global-exclude *~
|
||||
global-exclude *.pyc
|
||||
global-exclude *.pyo
|
||||
global-exclude .git
|
||||
global-exclude .ipynb_checkpoints
|
||||
@ -1,40 +0,0 @@
|
||||
# Releasing Jupyter Notebook
|
||||
|
||||
## Using `jupyter_releaser`
|
||||
|
||||
The recommended way to make a release is to use [`jupyter_releaser`](https://jupyter-releaser.readthedocs.io/en/latest/get_started/making_release_from_repo.html).
|
||||
|
||||
## Manual Release
|
||||
|
||||
To create a manual release, perform the following steps:
|
||||
|
||||
### Set up
|
||||
|
||||
```bash
|
||||
pip install hatch twine
|
||||
git pull origin $(git branch --show-current)
|
||||
git clean -dffx
|
||||
```
|
||||
|
||||
### Update the version and apply the tag
|
||||
|
||||
```bash
|
||||
echo "Enter new version"
|
||||
read new_version
|
||||
hatch version ${new_version}
|
||||
git tag -a ${new_version} -m "Release ${new_version}"
|
||||
```
|
||||
|
||||
### Build the artifacts
|
||||
|
||||
```bash
|
||||
rm -rf dist
|
||||
hatch build
|
||||
```
|
||||
|
||||
### Publish the artifacts to pypi
|
||||
|
||||
```bash
|
||||
twine check dist/*
|
||||
twine upload dist/*
|
||||
```
|
||||
@ -1,244 +0,0 @@
|
||||
// Copyright (c) Jupyter Development Team.
|
||||
// Distributed under the terms of the Modified BSD License.
|
||||
|
||||
// Inspired by: https://github.com/jupyterlab/jupyterlab/blob/master/dev_mode/index.js
|
||||
|
||||
import { PageConfig, URLExt } from '@jupyterlab/coreutils';
|
||||
|
||||
import { PluginRegistry } from '@lumino/coreutils';
|
||||
|
||||
require('./style.js');
|
||||
require('./extraStyle.js');
|
||||
|
||||
function loadScript(url) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const newScript = document.createElement('script');
|
||||
newScript.onerror = reject;
|
||||
newScript.onload = resolve;
|
||||
newScript.async = true;
|
||||
document.head.appendChild(newScript);
|
||||
newScript.src = url;
|
||||
});
|
||||
}
|
||||
async function loadComponent(url, scope) {
|
||||
await loadScript(url);
|
||||
|
||||
// From MIT-licensed https://github.com/module-federation/module-federation-examples/blob/af043acd6be1718ee195b2511adf6011fba4233c/advanced-api/dynamic-remotes/app1/src/App.js#L6-L12
|
||||
// eslint-disable-next-line no-undef
|
||||
await __webpack_init_sharing__('default');
|
||||
const container = window._JUPYTERLAB[scope];
|
||||
// Initialize the container, it may provide shared modules and may need ours
|
||||
// eslint-disable-next-line no-undef
|
||||
await container.init(__webpack_share_scopes__.default);
|
||||
}
|
||||
|
||||
async function createModule(scope, module) {
|
||||
try {
|
||||
const factory = await window._JUPYTERLAB[scope].get(module);
|
||||
const instance = factory();
|
||||
instance.__scope__ = scope;
|
||||
return instance;
|
||||
} catch (e) {
|
||||
console.warn(
|
||||
`Failed to create module: package: ${scope}; module: ${module}`
|
||||
);
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The main function
|
||||
*/
|
||||
async function main() {
|
||||
const mimeExtensionsMods = [
|
||||
{{#each notebook_mime_extensions}}
|
||||
require('{{ @key }}'),
|
||||
{{/each}}
|
||||
];
|
||||
const mimeExtensions = await Promise.all(mimeExtensionsMods);
|
||||
|
||||
// Load the base plugins available on all pages
|
||||
let baseMods = [
|
||||
{{#each notebook_plugins}}
|
||||
{{#if (ispage @key '/')}}
|
||||
{{{ list_plugins }}}
|
||||
{{/if}}
|
||||
{{/each}}
|
||||
];
|
||||
|
||||
const page = `/${PageConfig.getOption('notebookPage')}`;
|
||||
switch (page) {
|
||||
{{#each notebook_plugins}}
|
||||
{{#unless (ispage @key '/')}}
|
||||
// list all the other plugins grouped by page
|
||||
case '{{ @key }}': {
|
||||
baseMods = baseMods.concat([
|
||||
{{{ list_plugins }}}
|
||||
]);
|
||||
break;
|
||||
}
|
||||
{{/unless}}
|
||||
{{/each}}
|
||||
}
|
||||
|
||||
// populate the list of disabled extensions
|
||||
const disabled = [];
|
||||
const availablePlugins = [];
|
||||
|
||||
/**
|
||||
* Iterate over active plugins in an extension.
|
||||
*
|
||||
* #### Notes
|
||||
* This also populates the disabled
|
||||
*/
|
||||
function* activePlugins(extension) {
|
||||
// Handle commonjs or es2015 modules
|
||||
let exports;
|
||||
if (Object.prototype.hasOwnProperty.call(extension, '__esModule')) {
|
||||
exports = extension.default;
|
||||
} else {
|
||||
// CommonJS exports.
|
||||
exports = extension;
|
||||
}
|
||||
|
||||
let plugins = Array.isArray(exports) ? exports : [exports];
|
||||
for (let plugin of plugins) {
|
||||
const isDisabled = PageConfig.Extension.isDisabled(plugin.id);
|
||||
availablePlugins.push({
|
||||
id: plugin.id,
|
||||
description: plugin.description,
|
||||
requires: plugin.requires ?? [],
|
||||
optional: plugin.optional ?? [],
|
||||
provides: plugin.provides ?? null,
|
||||
autoStart: plugin.autoStart,
|
||||
enabled: !isDisabled,
|
||||
extension: extension.__scope__
|
||||
});
|
||||
if (isDisabled) {
|
||||
disabled.push(plugin.id);
|
||||
continue;
|
||||
}
|
||||
yield plugin;
|
||||
}
|
||||
}
|
||||
|
||||
const extension_data = JSON.parse(
|
||||
PageConfig.getOption('federated_extensions')
|
||||
);
|
||||
|
||||
const mods = [];
|
||||
const federatedExtensionPromises = [];
|
||||
const federatedMimeExtensionPromises = [];
|
||||
const federatedStylePromises = [];
|
||||
|
||||
const extensions = await Promise.allSettled(
|
||||
extension_data.map(async data => {
|
||||
await loadComponent(
|
||||
`${URLExt.join(
|
||||
PageConfig.getOption('fullLabextensionsUrl'),
|
||||
data.name,
|
||||
data.load
|
||||
)}`,
|
||||
data.name
|
||||
);
|
||||
return data;
|
||||
})
|
||||
);
|
||||
|
||||
extensions.forEach(p => {
|
||||
if (p.status === 'rejected') {
|
||||
// There was an error loading the component
|
||||
console.error(p.reason);
|
||||
return;
|
||||
}
|
||||
|
||||
const data = p.value;
|
||||
if (data.extension) {
|
||||
federatedExtensionPromises.push(createModule(data.name, data.extension));
|
||||
}
|
||||
if (data.mimeExtension) {
|
||||
federatedMimeExtensionPromises.push(
|
||||
createModule(data.name, data.mimeExtension)
|
||||
);
|
||||
}
|
||||
if (data.style && !PageConfig.Extension.isDisabled(data.name)) {
|
||||
federatedStylePromises.push(createModule(data.name, data.style));
|
||||
}
|
||||
});
|
||||
|
||||
// Add the base frontend extensions
|
||||
const baseFrontendMods = await Promise.all(baseMods);
|
||||
baseFrontendMods.forEach(p => {
|
||||
for (let plugin of activePlugins(p)) {
|
||||
mods.push(plugin);
|
||||
}
|
||||
});
|
||||
|
||||
// Add the federated extensions.
|
||||
const federatedExtensions = await Promise.allSettled(
|
||||
federatedExtensionPromises
|
||||
);
|
||||
federatedExtensions.forEach(p => {
|
||||
if (p.status === 'fulfilled') {
|
||||
for (let plugin of activePlugins(p.value)) {
|
||||
mods.push(plugin);
|
||||
}
|
||||
} else {
|
||||
console.error(p.reason);
|
||||
}
|
||||
});
|
||||
|
||||
// Add the federated mime extensions.
|
||||
const federatedMimeExtensions = await Promise.allSettled(
|
||||
federatedMimeExtensionPromises
|
||||
);
|
||||
federatedMimeExtensions.forEach(p => {
|
||||
if (p.status === 'fulfilled') {
|
||||
for (let plugin of activePlugins(p.value)) {
|
||||
mimeExtensions.push(plugin);
|
||||
}
|
||||
} else {
|
||||
console.error(p.reason);
|
||||
}
|
||||
});
|
||||
|
||||
// Load all federated component styles and log errors for any that do not
|
||||
(await Promise.allSettled(federatedStylePromises))
|
||||
.filter(({ status }) => status === 'rejected')
|
||||
.forEach(({ reason }) => {
|
||||
console.error(reason);
|
||||
});
|
||||
|
||||
// Set the list of base notebook multi-page plugins so the app is aware of all
|
||||
// its built-in plugins even if they are not loaded on the current page.
|
||||
// For example this is useful so the Settings Editor can list the debugger
|
||||
// plugin even if the debugger is only loaded on the notebook page.
|
||||
PageConfig.setOption('allPlugins', '{{{ json notebook_plugins }}}');
|
||||
|
||||
|
||||
const pluginRegistry = new PluginRegistry();
|
||||
const NotebookApp = require('@jupyter-notebook/application').NotebookApp;
|
||||
|
||||
pluginRegistry.registerPlugins(mods);
|
||||
const IServiceManager = require('@jupyterlab/services').IServiceManager;
|
||||
const serviceManager = await pluginRegistry.resolveRequiredService(IServiceManager);
|
||||
|
||||
const app = new NotebookApp({
|
||||
pluginRegistry,
|
||||
serviceManager,
|
||||
mimeExtensions,
|
||||
availablePlugins
|
||||
});
|
||||
|
||||
// Expose global app instance when in dev mode or when toggled explicitly.
|
||||
const exposeAppInBrowser =
|
||||
(PageConfig.getOption('exposeAppInBrowser') || '').toLowerCase() === 'true';
|
||||
|
||||
if (exposeAppInBrowser) {
|
||||
window.jupyterapp = app;
|
||||
}
|
||||
|
||||
await app.start();
|
||||
}
|
||||
|
||||
window.addEventListener('load', main);
|
||||
@ -1,443 +0,0 @@
|
||||
{
|
||||
"name": "@jupyter-notebook/app",
|
||||
"version": "7.6.0-alpha.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"build": "rspack",
|
||||
"build:prod": "rspack --config ./rspack.prod.config.js",
|
||||
"clean": "rimraf build && jlpm run clean:static",
|
||||
"clean:static": "rimraf -g \"../notebook/static/!(favicons)\"",
|
||||
"watch": "rspack --watch --config rspack.config.js"
|
||||
},
|
||||
"resolutions": {
|
||||
"@codemirror/state": "~6.5.2",
|
||||
"@codemirror/view": "~6.38.1",
|
||||
"@jupyter-notebook/application": "~7.6.0-alpha.0",
|
||||
"@jupyter-notebook/application-extension": "~7.6.0-alpha.0",
|
||||
"@jupyter-notebook/console-extension": "~7.6.0-alpha.0",
|
||||
"@jupyter-notebook/docmanager-extension": "~7.6.0-alpha.0",
|
||||
"@jupyter-notebook/documentsearch-extension": "~7.6.0-alpha.0",
|
||||
"@jupyter-notebook/help-extension": "~7.6.0-alpha.0",
|
||||
"@jupyter-notebook/notebook-extension": "~7.6.0-alpha.0",
|
||||
"@jupyter-notebook/terminal-extension": "~7.6.0-alpha.0",
|
||||
"@jupyter-notebook/tree": "~7.6.0-alpha.0",
|
||||
"@jupyter-notebook/tree-extension": "~7.6.0-alpha.0",
|
||||
"@jupyter-notebook/ui-components": "~7.6.0-alpha.0",
|
||||
"@jupyter/react-components": "~0.16.7",
|
||||
"@jupyter/web-components": "~0.16.7",
|
||||
"@jupyter/ydoc": "~3.1.0",
|
||||
"@jupyterlab/application": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/application-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/apputils": "~4.7.0-alpha.0",
|
||||
"@jupyterlab/apputils-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/attachments": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/audio-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/cell-toolbar": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/cell-toolbar-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/celltags-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/codeeditor": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/codemirror": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/codemirror-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/completer": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/completer-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/console": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/console-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/coreutils": "~6.6.0-alpha.0",
|
||||
"@jupyterlab/csvviewer-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/debugger": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/debugger-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/docmanager": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/docmanager-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/documentsearch": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/documentsearch-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/extensionmanager": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/extensionmanager-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/filebrowser": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/filebrowser-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/fileeditor": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/fileeditor-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/help-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/htmlviewer": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/htmlviewer-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/hub-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/imageviewer": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/imageviewer-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/javascript-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/json-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/logconsole-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/lsp": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/lsp-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/mainmenu": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/mainmenu-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/markdownviewer": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/markdownviewer-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/markedparser-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/mathjax-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/mermaid": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/mermaid-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/metadataform": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/metadataform-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/notebook": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/notebook-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/observables": "~5.6.0-alpha.0",
|
||||
"@jupyterlab/outputarea": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/pdf-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/pluginmanager-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/rendermime": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/rendermime-interfaces": "~3.14.0-alpha.0",
|
||||
"@jupyterlab/running-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/services": "~7.6.0-alpha.0",
|
||||
"@jupyterlab/services-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/settingeditor": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/settingeditor-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/settingregistry": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/shortcuts-extension": "~5.4.0-alpha.0",
|
||||
"@jupyterlab/statedb": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/statusbar": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/terminal": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/terminal-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/theme-dark-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/theme-dark-high-contrast-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/theme-light-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/toc-extension": "~6.6.0-alpha.0",
|
||||
"@jupyterlab/tooltip": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/tooltip-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/translation": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/translation-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/ui-components": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/ui-components-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/vega5-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/video-extension": "~4.6.0-alpha.0",
|
||||
"@lezer/common": "~1.2.1",
|
||||
"@lezer/highlight": "~1.2.0",
|
||||
"@lumino/algorithm": "~2.0.4",
|
||||
"@lumino/application": "~2.4.5",
|
||||
"@lumino/commands": "~2.3.3",
|
||||
"@lumino/coreutils": "~2.2.2",
|
||||
"@lumino/disposable": "~2.1.5",
|
||||
"@lumino/domutils": "~2.0.4",
|
||||
"@lumino/dragdrop": "~2.1.7",
|
||||
"@lumino/messaging": "~2.0.4",
|
||||
"@lumino/properties": "~2.0.4",
|
||||
"@lumino/signaling": "~2.1.5",
|
||||
"@lumino/virtualdom": "~2.0.4",
|
||||
"@lumino/widgets": "~2.7.2",
|
||||
"react": "~18.2.0",
|
||||
"react-dom": "~18.2.0",
|
||||
"yjs": "~13.6.8"
|
||||
},
|
||||
"dependencies": {
|
||||
"@jupyter-notebook/application": "^7.6.0-alpha.0",
|
||||
"@jupyter-notebook/application-extension": "^7.6.0-alpha.0",
|
||||
"@jupyter-notebook/console-extension": "^7.6.0-alpha.0",
|
||||
"@jupyter-notebook/docmanager-extension": "^7.6.0-alpha.0",
|
||||
"@jupyter-notebook/documentsearch-extension": "^7.6.0-alpha.0",
|
||||
"@jupyter-notebook/help-extension": "^7.6.0-alpha.0",
|
||||
"@jupyter-notebook/notebook-extension": "^7.6.0-alpha.0",
|
||||
"@jupyter-notebook/terminal-extension": "^7.6.0-alpha.0",
|
||||
"@jupyter-notebook/tree": "^7.6.0-alpha.0",
|
||||
"@jupyter-notebook/tree-extension": "^7.6.0-alpha.0",
|
||||
"@jupyter-notebook/ui-components": "^7.6.0-alpha.0",
|
||||
"@jupyterlab/application-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/apputils-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/attachments": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/audio-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/cell-toolbar-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/celltags-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/codemirror": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/codemirror-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/completer-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/console-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/coreutils": "~6.6.0-alpha.0",
|
||||
"@jupyterlab/csvviewer-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/debugger-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/docmanager-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/documentsearch-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/extensionmanager-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/filebrowser-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/fileeditor-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/help-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/htmlviewer-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/hub-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/imageviewer-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/javascript-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/json-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/logconsole-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/lsp": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/lsp-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/mainmenu-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/markdownviewer-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/markedparser-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/mathjax-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/mermaid-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/metadataform-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/notebook-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/pdf-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/pluginmanager-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/running-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/services-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/settingeditor": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/settingeditor-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/shortcuts-extension": "~5.4.0-alpha.0",
|
||||
"@jupyterlab/terminal-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/theme-dark-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/theme-dark-high-contrast-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/theme-light-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/toc-extension": "~6.6.0-alpha.0",
|
||||
"@jupyterlab/tooltip-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/translation-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/ui-components-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/vega5-extension": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/video-extension": "~4.6.0-alpha.0",
|
||||
"@lumino/coreutils": "~2.2.2",
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.2.0",
|
||||
"yjs": "^13.5.40"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@jupyterlab/builder": "~4.6.0-alpha.0",
|
||||
"@jupyterlab/buildutils": "~4.6.0-alpha.0",
|
||||
"@rspack/cli": "^1.1.8",
|
||||
"@rspack/core": "^1.1.8",
|
||||
"@types/rimraf": "^3.0.2",
|
||||
"fs-extra": "^8.1.0",
|
||||
"glob": "~7.1.6",
|
||||
"handlebars": "^4.7.7",
|
||||
"rimraf": "^3.0.2",
|
||||
"webpack-bundle-analyzer": "^4.8.0",
|
||||
"webpack-merge": "^5.8.0",
|
||||
"whatwg-fetch": "^3.0.0"
|
||||
},
|
||||
"jupyterlab": {
|
||||
"name": "Jupyter Notebook",
|
||||
"mimeExtensions": {
|
||||
"@jupyterlab/javascript-extension": true,
|
||||
"@jupyterlab/json-extension": true,
|
||||
"@jupyterlab/pdf-extension": true,
|
||||
"@jupyterlab/vega5-extension": true
|
||||
},
|
||||
"plugins": {
|
||||
"/": {
|
||||
"@jupyter-notebook/application-extension": true,
|
||||
"@jupyter-notebook/console-extension": true,
|
||||
"@jupyter-notebook/docmanager-extension": true,
|
||||
"@jupyter-notebook/documentsearch-extension": true,
|
||||
"@jupyter-notebook/help-extension": true,
|
||||
"@jupyter-notebook/notebook-extension": true,
|
||||
"@jupyter-notebook/terminal-extension": true,
|
||||
"@jupyterlab/application-extension": [
|
||||
"@jupyterlab/application-extension:commands",
|
||||
"@jupyterlab/application-extension:context-menu",
|
||||
"@jupyterlab/application-extension:faviconbusy",
|
||||
"@jupyterlab/application-extension:router",
|
||||
"@jupyterlab/application-extension:top-bar",
|
||||
"@jupyterlab/application-extension:top-spacer"
|
||||
],
|
||||
"@jupyterlab/apputils-extension": [
|
||||
"@jupyterlab/apputils-extension:kernels-settings",
|
||||
"@jupyterlab/apputils-extension:palette",
|
||||
"@jupyterlab/apputils-extension:notification",
|
||||
"@jupyterlab/apputils-extension:sanitizer",
|
||||
"@jupyterlab/apputils-extension:sessionDialogs",
|
||||
"@jupyterlab/apputils-extension:settings",
|
||||
"@jupyterlab/apputils-extension:state",
|
||||
"@jupyterlab/apputils-extension:themes",
|
||||
"@jupyterlab/apputils-extension:themes-palette-menu",
|
||||
"@jupyterlab/apputils-extension:toolbar-registry",
|
||||
"@jupyterlab/apputils-extension:utilityCommands"
|
||||
],
|
||||
"@jupyterlab/audio-extension": true,
|
||||
"@jupyterlab/codemirror-extension": true,
|
||||
"@jupyterlab/completer-extension": [
|
||||
"@jupyterlab/completer-extension:base-service",
|
||||
"@jupyterlab/completer-extension:inline-completer",
|
||||
"@jupyterlab/completer-extension:inline-completer-factory",
|
||||
"@jupyterlab/completer-extension:inline-history",
|
||||
"@jupyterlab/completer-extension:manager"
|
||||
],
|
||||
"@jupyterlab/console-extension": [
|
||||
"@jupyterlab/console-extension:cell-executor",
|
||||
"@jupyterlab/console-extension:completer",
|
||||
"@jupyterlab/console-extension:factory",
|
||||
"@jupyterlab/console-extension:foreign",
|
||||
"@jupyterlab/console-extension:tracker"
|
||||
],
|
||||
"@jupyterlab/csvviewer-extension": true,
|
||||
"@jupyterlab/docmanager-extension": [
|
||||
"@jupyterlab/docmanager-extension:plugin",
|
||||
"@jupyterlab/docmanager-extension:download",
|
||||
"@jupyterlab/docmanager-extension:contexts",
|
||||
"@jupyterlab/docmanager-extension:manager"
|
||||
],
|
||||
"@jupyterlab/documentsearch-extension": [
|
||||
"@jupyterlab/documentsearch-extension:plugin"
|
||||
],
|
||||
"@jupyterlab/filebrowser-extension": [
|
||||
"@jupyterlab/filebrowser-extension:factory",
|
||||
"@jupyterlab/filebrowser-extension:default-file-browser"
|
||||
],
|
||||
"@jupyterlab/fileeditor-extension": [
|
||||
"@jupyterlab/fileeditor-extension:plugin",
|
||||
"@jupyterlab/fileeditor-extension:widget-factory"
|
||||
],
|
||||
"@jupyterlab/help-extension": [
|
||||
"@jupyterlab/help-extension:resources"
|
||||
],
|
||||
"@jupyterlab/htmlviewer-extension": true,
|
||||
"@jupyterlab/hub-extension": true,
|
||||
"@jupyterlab/imageviewer-extension": true,
|
||||
"@jupyterlab/lsp-extension": true,
|
||||
"@jupyterlab/mainmenu-extension": [
|
||||
"@jupyterlab/mainmenu-extension:plugin"
|
||||
],
|
||||
"@jupyterlab/markedparser-extension": true,
|
||||
"@jupyterlab/mathjax-extension": true,
|
||||
"@jupyterlab/mermaid-extension": true,
|
||||
"@jupyterlab/notebook-extension": [
|
||||
"@jupyterlab/notebook-extension:cell-executor",
|
||||
"@jupyterlab/notebook-extension:code-console",
|
||||
"@jupyterlab/notebook-extension:export",
|
||||
"@jupyterlab/notebook-extension:factory",
|
||||
"@jupyterlab/notebook-extension:tracker",
|
||||
"@jupyterlab/notebook-extension:widget-factory"
|
||||
],
|
||||
"@jupyterlab/pluginmanager-extension": true,
|
||||
"@jupyterlab/services-extension": true,
|
||||
"@jupyterlab/shortcuts-extension": true,
|
||||
"@jupyterlab/terminal-extension": true,
|
||||
"@jupyterlab/theme-light-extension": true,
|
||||
"@jupyterlab/theme-dark-extension": true,
|
||||
"@jupyterlab/theme-dark-high-contrast-extension": true,
|
||||
"@jupyterlab/translation-extension": true,
|
||||
"@jupyterlab/ui-components-extension": true,
|
||||
"@jupyterlab/video-extension": true
|
||||
},
|
||||
"/tree": {
|
||||
"@jupyterlab/cell-toolbar-extension": true,
|
||||
"@jupyterlab/extensionmanager-extension": true,
|
||||
"@jupyterlab/filebrowser-extension": [
|
||||
"@jupyterlab/filebrowser-extension:browser",
|
||||
"@jupyterlab/filebrowser-extension:create-new-language-file",
|
||||
"@jupyterlab/filebrowser-extension:download",
|
||||
"@jupyterlab/filebrowser-extension:file-upload-status",
|
||||
"@jupyterlab/filebrowser-extension:open-with",
|
||||
"@jupyterlab/filebrowser-extension:search",
|
||||
"@jupyterlab/filebrowser-extension:share-file"
|
||||
],
|
||||
"@jupyter-notebook/tree-extension": true,
|
||||
"@jupyterlab/running-extension": [
|
||||
"@jupyterlab/running-extension:plugin"
|
||||
],
|
||||
"@jupyterlab/settingeditor-extension": true
|
||||
},
|
||||
"/notebooks": {
|
||||
"@jupyterlab/celltags-extension": true,
|
||||
"@jupyterlab/cell-toolbar-extension": true,
|
||||
"@jupyterlab/debugger-extension": [
|
||||
"@jupyterlab/debugger-extension:completions",
|
||||
"@jupyterlab/debugger-extension:config",
|
||||
"@jupyterlab/debugger-extension:debug-console",
|
||||
"@jupyterlab/debugger-extension:main",
|
||||
"@jupyterlab/debugger-extension:notebooks",
|
||||
"@jupyterlab/debugger-extension:service",
|
||||
"@jupyterlab/debugger-extension:sidebar",
|
||||
"@jupyterlab/debugger-extension:sources",
|
||||
"@jupyterlab/debugger-extension:display-registry"
|
||||
],
|
||||
"@jupyterlab/logconsole-extension": true,
|
||||
"@jupyterlab/metadataform-extension": true,
|
||||
"@jupyterlab/notebook-extension": [
|
||||
"@jupyterlab/notebook-extension:active-cell-tool",
|
||||
"@jupyterlab/notebook-extension:completer",
|
||||
"@jupyterlab/notebook-extension:copy-output",
|
||||
"@jupyterlab/notebook-extension:metadata-editor",
|
||||
"@jupyterlab/notebook-extension:search",
|
||||
"@jupyterlab/notebook-extension:toc",
|
||||
"@jupyterlab/notebook-extension:tools",
|
||||
"@jupyterlab/notebook-extension:update-raw-mimetype"
|
||||
],
|
||||
"@jupyterlab/toc-extension": [
|
||||
"@jupyterlab/toc-extension:registry",
|
||||
"@jupyterlab/toc-extension:tracker"
|
||||
],
|
||||
"@jupyterlab/tooltip-extension": [
|
||||
"@jupyterlab/tooltip-extension:manager",
|
||||
"@jupyterlab/tooltip-extension:notebooks"
|
||||
]
|
||||
},
|
||||
"/consoles": {
|
||||
"@jupyterlab/tooltip-extension": [
|
||||
"@jupyterlab/tooltip-extension:manager",
|
||||
"@jupyterlab/tooltip-extension:consoles"
|
||||
]
|
||||
},
|
||||
"/edit": {
|
||||
"@jupyterlab/fileeditor-extension": [
|
||||
"@jupyterlab/fileeditor-extension:completer",
|
||||
"@jupyterlab/fileeditor-extension:search"
|
||||
],
|
||||
"@jupyterlab/markdownviewer-extension": true
|
||||
}
|
||||
},
|
||||
"singletonPackages": [
|
||||
"@codemirror/state",
|
||||
"@codemirror/view",
|
||||
"@jupyter-notebook/tree",
|
||||
"@jupyter/react-components",
|
||||
"@jupyter/web-components",
|
||||
"@jupyter/ydoc",
|
||||
"@jupyterlab/application",
|
||||
"@jupyterlab/apputils",
|
||||
"@jupyterlab/cell-toolbar",
|
||||
"@jupyterlab/codeeditor",
|
||||
"@jupyterlab/codemirror",
|
||||
"@jupyterlab/completer",
|
||||
"@jupyterlab/console",
|
||||
"@jupyterlab/coreutils",
|
||||
"@jupyterlab/debugger",
|
||||
"@jupyterlab/docmanager",
|
||||
"@jupyterlab/documentsearch",
|
||||
"@jupyterlab/extensionmanager",
|
||||
"@jupyterlab/filebrowser",
|
||||
"@jupyterlab/fileeditor",
|
||||
"@jupyterlab/htmlviewer",
|
||||
"@jupyterlab/imageviewer",
|
||||
"@jupyterlab/lsp",
|
||||
"@jupyterlab/mainmenu",
|
||||
"@jupyterlab/markdownviewer",
|
||||
"@jupyterlab/mermaid",
|
||||
"@jupyterlab/metadataform",
|
||||
"@jupyterlab/notebook",
|
||||
"@jupyterlab/observables",
|
||||
"@jupyterlab/outputarea",
|
||||
"@jupyterlab/rendermime",
|
||||
"@jupyterlab/rendermime-interfaces",
|
||||
"@jupyterlab/services",
|
||||
"@jupyterlab/settingeditor",
|
||||
"@jupyterlab/settingregistry",
|
||||
"@jupyterlab/statedb",
|
||||
"@jupyterlab/statusbar",
|
||||
"@jupyterlab/terminal",
|
||||
"@jupyterlab/tooltip",
|
||||
"@jupyterlab/translation",
|
||||
"@jupyterlab/ui-components",
|
||||
"@lezer/common",
|
||||
"@lezer/highlight",
|
||||
"@lumino/algorithm",
|
||||
"@lumino/application",
|
||||
"@lumino/commands",
|
||||
"@lumino/coreutils",
|
||||
"@lumino/disposable",
|
||||
"@lumino/domutils",
|
||||
"@lumino/dragdrop",
|
||||
"@lumino/messaging",
|
||||
"@lumino/properties",
|
||||
"@lumino/signaling",
|
||||
"@lumino/virtualdom",
|
||||
"@lumino/widgets",
|
||||
"react",
|
||||
"react-dom",
|
||||
"yjs"
|
||||
]
|
||||
}
|
||||
}
|
||||
@ -1,37 +0,0 @@
|
||||
// Copyright (c) Jupyter Development Team.
|
||||
// Distributed under the terms of the Modified BSD License.
|
||||
|
||||
// We dynamically set the webpack public path based on the page config
|
||||
// settings from the JupyterLab app. We copy some of the pageconfig parsing
|
||||
// logic in @jupyterlab/coreutils below, since this must run before any other
|
||||
// files are loaded (including @jupyterlab/coreutils).
|
||||
|
||||
/**
|
||||
* Get global configuration data for the Jupyter application.
|
||||
*
|
||||
* @param name - The name of the configuration option.
|
||||
*
|
||||
* @returns The config value or an empty string if not found.
|
||||
*
|
||||
* #### Notes
|
||||
* All values are treated as strings.
|
||||
* For browser based applications, it is assumed that the page HTML
|
||||
* includes a script tag with the id `jupyter-config-data` containing the
|
||||
* configuration as valid JSON. In order to support the classic Notebook,
|
||||
* we fall back on checking for `body` data of the given `name`.
|
||||
*/
|
||||
function getOption(name) {
|
||||
let configData = Object.create(null);
|
||||
// Use script tag if available.
|
||||
if (typeof document !== 'undefined' && document) {
|
||||
const el = document.getElementById('jupyter-config-data');
|
||||
|
||||
if (el) {
|
||||
configData = JSON.parse(el.textContent || '{}');
|
||||
}
|
||||
}
|
||||
return configData[name] || '';
|
||||
}
|
||||
|
||||
// eslint-disable-next-line no-undef
|
||||
__webpack_public_path__ = getOption('fullStaticUrl') + '/';
|
||||
@ -1,274 +0,0 @@
|
||||
// Copyright (c) Jupyter Development Team.
|
||||
// Distributed under the terms of the Modified BSD License.
|
||||
|
||||
// Heavily inspired (and slightly tweaked) from:
|
||||
// https://github.com/jupyterlab/jupyterlab/blob/master/examples/federated/core_package/rspack.config.js
|
||||
|
||||
const fs = require('fs-extra');
|
||||
const path = require('path');
|
||||
const rspack = require('@rspack/core');
|
||||
const merge = require('webpack-merge').default;
|
||||
const Handlebars = require('handlebars');
|
||||
const { ModuleFederationPlugin } = rspack.container;
|
||||
const BundleAnalyzerPlugin =
|
||||
require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
|
||||
|
||||
const Build = require('@jupyterlab/builder').Build;
|
||||
const WPPlugin = require('@jupyterlab/builder').WPPlugin;
|
||||
const HtmlWebpackPlugin = require('html-webpack-plugin');
|
||||
const baseConfig = require('@jupyterlab/builder/lib/webpack.config.base');
|
||||
|
||||
const data = require('./package.json');
|
||||
|
||||
const names = Object.keys(data.dependencies).filter((name) => {
|
||||
const packageData = require(path.join(name, 'package.json'));
|
||||
return packageData.jupyterlab !== undefined;
|
||||
});
|
||||
|
||||
// Ensure a clear build directory.
|
||||
const buildDir = path.resolve(__dirname, 'build');
|
||||
if (fs.existsSync(buildDir)) {
|
||||
fs.removeSync(buildDir);
|
||||
}
|
||||
fs.ensureDirSync(buildDir);
|
||||
|
||||
// Handle the extensions.
|
||||
const { mimeExtensions, plugins } = data.jupyterlab;
|
||||
|
||||
// Create the list of extension packages from the package.json metadata
|
||||
const extensionPackages = new Set();
|
||||
Object.keys(plugins).forEach((page) => {
|
||||
const pagePlugins = plugins[page];
|
||||
Object.keys(pagePlugins).forEach((name) => {
|
||||
extensionPackages.add(name);
|
||||
});
|
||||
});
|
||||
|
||||
Handlebars.registerHelper('json', function (context) {
|
||||
return JSON.stringify(context);
|
||||
});
|
||||
|
||||
// custom help to check if a page corresponds to a value
|
||||
Handlebars.registerHelper('ispage', function (key, page) {
|
||||
return key === page;
|
||||
});
|
||||
|
||||
// custom helper to load the plugins on the index page
|
||||
Handlebars.registerHelper('list_plugins', function () {
|
||||
let str = '';
|
||||
const page = this;
|
||||
Object.keys(this).forEach((extension) => {
|
||||
const plugin = page[extension];
|
||||
if (plugin === true) {
|
||||
str += `require(\'${extension}\'),\n `;
|
||||
} else if (Array.isArray(plugin)) {
|
||||
const plugins = plugin.map((p) => `'${p}',`).join('\n');
|
||||
str += `
|
||||
require(\'${extension}\').default.filter(({id}) => [
|
||||
${plugins}
|
||||
].includes(id)),
|
||||
`;
|
||||
}
|
||||
});
|
||||
return str;
|
||||
});
|
||||
|
||||
// Create the entry point and other assets in build directory.
|
||||
const source = fs.readFileSync('index.template.js').toString();
|
||||
const template = Handlebars.compile(source);
|
||||
const extData = {
|
||||
notebook_plugins: plugins,
|
||||
notebook_mime_extensions: mimeExtensions,
|
||||
};
|
||||
const indexOut = template(extData);
|
||||
fs.writeFileSync(path.join(buildDir, 'index.js'), indexOut);
|
||||
|
||||
// Copy extra files
|
||||
const cssImports = path.resolve(__dirname, 'style.js');
|
||||
fs.copySync(cssImports, path.resolve(buildDir, 'extraStyle.js'));
|
||||
|
||||
const extras = Build.ensureAssets({
|
||||
packageNames: names,
|
||||
output: buildDir,
|
||||
schemaOutput: path.resolve(__dirname, '..', 'notebook'),
|
||||
});
|
||||
|
||||
/**
|
||||
* Create the rspack ``shared`` configuration
|
||||
*/
|
||||
function createShared(packageData) {
|
||||
// Set up module federation sharing config
|
||||
const shared = {};
|
||||
|
||||
// Make sure any resolutions are shared
|
||||
for (let [pkg, requiredVersion] of Object.entries(packageData.resolutions)) {
|
||||
shared[pkg] = { requiredVersion };
|
||||
}
|
||||
|
||||
// Add any extension packages that are not in resolutions (i.e., installed from npm)
|
||||
for (let pkg of extensionPackages) {
|
||||
if (!shared[pkg]) {
|
||||
shared[pkg] = {
|
||||
requiredVersion: require(`${pkg}/package.json`).version,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
// Add dependencies and sharedPackage config from extension packages if they
|
||||
// are not already in the shared config. This means that if there is a
|
||||
// conflict, the resolutions package version is the one that is shared.
|
||||
const extraShared = [];
|
||||
for (let pkg of extensionPackages) {
|
||||
let pkgShared = {};
|
||||
let {
|
||||
dependencies = {},
|
||||
jupyterlab: { sharedPackages = {} } = {},
|
||||
} = require(`${pkg}/package.json`);
|
||||
for (let [dep, requiredVersion] of Object.entries(dependencies)) {
|
||||
if (!shared[dep]) {
|
||||
pkgShared[dep] = { requiredVersion };
|
||||
}
|
||||
}
|
||||
|
||||
// Overwrite automatic dependency sharing with custom sharing config
|
||||
for (let [dep, config] of Object.entries(sharedPackages)) {
|
||||
if (config === false) {
|
||||
delete pkgShared[dep];
|
||||
} else {
|
||||
if ('bundled' in config) {
|
||||
config.import = config.bundled;
|
||||
delete config.bundled;
|
||||
}
|
||||
pkgShared[dep] = config;
|
||||
}
|
||||
}
|
||||
extraShared.push(pkgShared);
|
||||
}
|
||||
|
||||
// Now merge the extra shared config
|
||||
const mergedShare = {};
|
||||
for (let sharedConfig of extraShared) {
|
||||
for (let [pkg, config] of Object.entries(sharedConfig)) {
|
||||
// Do not override the basic share config from resolutions
|
||||
if (shared[pkg]) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Add if we haven't seen the config before
|
||||
if (!mergedShare[pkg]) {
|
||||
mergedShare[pkg] = config;
|
||||
continue;
|
||||
}
|
||||
|
||||
// Choose between the existing config and this new config. We do not try
|
||||
// to merge configs, which may yield a config no one wants
|
||||
let oldConfig = mergedShare[pkg];
|
||||
|
||||
// if the old one has import: false, use the new one
|
||||
if (oldConfig.import === false) {
|
||||
mergedShare[pkg] = config;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Object.assign(shared, mergedShare);
|
||||
|
||||
// Transform any file:// requiredVersion to the version number from the
|
||||
// imported package. This assumes (for simplicity) that the version we get
|
||||
// importing was installed from the file.
|
||||
for (let [pkg, { requiredVersion }] of Object.entries(shared)) {
|
||||
if (requiredVersion && requiredVersion.startsWith('file:')) {
|
||||
shared[pkg].requiredVersion = require(`${pkg}/package.json`).version;
|
||||
}
|
||||
}
|
||||
|
||||
// Add singleton package information
|
||||
for (let pkg of packageData.jupyterlab.singletonPackages) {
|
||||
if (shared[pkg]) {
|
||||
shared[pkg].singleton = true;
|
||||
}
|
||||
}
|
||||
|
||||
return shared;
|
||||
}
|
||||
|
||||
// Make a bootstrap entrypoint
|
||||
const entryPoint = path.join(buildDir, 'bootstrap.js');
|
||||
const bootstrap = 'import("./index.js");';
|
||||
fs.writeFileSync(entryPoint, bootstrap);
|
||||
|
||||
if (process.env.NODE_ENV === 'production') {
|
||||
baseConfig.mode = 'production';
|
||||
}
|
||||
|
||||
if (process.argv.includes('--analyze')) {
|
||||
extras.push(new BundleAnalyzerPlugin());
|
||||
}
|
||||
|
||||
const htmlPlugins = [];
|
||||
['consoles', 'edit', 'error', 'notebooks', 'terminals', 'tree'].forEach(
|
||||
(name) => {
|
||||
htmlPlugins.push(
|
||||
new HtmlWebpackPlugin({
|
||||
chunksSortMode: 'none',
|
||||
template: path.join(
|
||||
path.resolve('./templates'),
|
||||
`${name}_template.html`
|
||||
),
|
||||
title: name,
|
||||
filename: path.join(
|
||||
path.resolve(__dirname, '..', 'notebook/templates'),
|
||||
`${name}.html`
|
||||
),
|
||||
})
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
module.exports = [
|
||||
merge(baseConfig, {
|
||||
mode: 'development',
|
||||
entry: ['./publicpath.js', './' + path.relative(__dirname, entryPoint)],
|
||||
output: {
|
||||
path: path.resolve(__dirname, '..', 'notebook/static/'),
|
||||
publicPath: '{{page_config.fullStaticUrl}}/',
|
||||
library: {
|
||||
type: 'var',
|
||||
name: ['_JUPYTERLAB', 'CORE_OUTPUT'],
|
||||
},
|
||||
filename: '[name].[contenthash].js',
|
||||
},
|
||||
optimization: {
|
||||
splitChunks: {
|
||||
chunks: 'all',
|
||||
cacheGroups: {
|
||||
jlab_core: {
|
||||
test: /[\\/]node_modules[\\/]@(jupyterlab|jupyter-notebook|lumino(?!\/datagrid))[\\/]/,
|
||||
name: 'notebook_core',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
resolve: {
|
||||
fallback: { util: false },
|
||||
},
|
||||
plugins: [
|
||||
...htmlPlugins,
|
||||
new WPPlugin.JSONLicenseWebpackPlugin({
|
||||
excludedPackageTest: (packageName) =>
|
||||
packageName === '@jupyter-notebook/app',
|
||||
}),
|
||||
new ModuleFederationPlugin({
|
||||
library: {
|
||||
type: 'var',
|
||||
name: ['_JUPYTERLAB', 'CORE_LIBRARY_FEDERATION'],
|
||||
},
|
||||
name: 'CORE_FEDERATION',
|
||||
shared: createShared(data),
|
||||
}),
|
||||
],
|
||||
}),
|
||||
].concat(extras);
|
||||
|
||||
const logPath = path.join(buildDir, 'build_log.json');
|
||||
fs.writeFileSync(logPath, JSON.stringify(module.exports, null, ' '));
|
||||
@ -1,15 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) Jupyter Development Team.
|
||||
* Distributed under the terms of the Modified BSD License.
|
||||
*/
|
||||
|
||||
const base = require('./rspack.config');
|
||||
|
||||
module.exports = [
|
||||
{
|
||||
...base[0],
|
||||
bail: false,
|
||||
watch: true,
|
||||
},
|
||||
...base.slice(1),
|
||||
];
|
||||
@ -1,29 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) Jupyter Development Team.
|
||||
* Distributed under the terms of the Modified BSD License.
|
||||
*/
|
||||
|
||||
const merge = require('webpack-merge').default;
|
||||
const config = require('./rspack.config');
|
||||
const WPPlugin = require('@jupyterlab/builder').WPPlugin;
|
||||
|
||||
config[0] = merge(config[0], {
|
||||
mode: 'production',
|
||||
devtool: 'source-map',
|
||||
output: {
|
||||
// Add version argument when in production so the Jupyter server
|
||||
// allows caching of files (i.e., does not set the CacheControl header to no-cache to prevent caching static files)
|
||||
filename: '[name].[contenthash].js?v=[contenthash]',
|
||||
},
|
||||
optimization: {
|
||||
minimize: false,
|
||||
},
|
||||
plugins: [
|
||||
new WPPlugin.JSONLicenseWebpackPlugin({
|
||||
excludedPackageTest: (packageName) =>
|
||||
packageName === '@jupyter-notebook/app',
|
||||
}),
|
||||
],
|
||||
});
|
||||
|
||||
module.exports = config;
|
||||
@ -1,45 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<title>{{page_config['appName'] | e}} - Console</title>
|
||||
{% block favicon %}
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/x-icon"
|
||||
href="{{ page_config['fullStaticUrl'] | e }}/favicons/favicon-console.ico"
|
||||
class="favicon"
|
||||
/>
|
||||
{% endblock %} {% if custom_css %}
|
||||
<link
|
||||
rel="stylesheet"
|
||||
type="text/css"
|
||||
href="{{ base_url | escape }}custom/custom.css"
|
||||
/>
|
||||
{% endif %}
|
||||
</head>
|
||||
<body class="jp-ThemedContainer">
|
||||
{# Copy so we do not modify the page_config with updates. #} {% set
|
||||
page_config_full = page_config.copy() %} {# Set a dummy variable - we just
|
||||
want the side effect of the update. #} {% set _ =
|
||||
page_config_full.update(baseUrl=base_url, wsUrl=ws_url) %} {# Sentinel value
|
||||
to say that we are on the tree page #} {% set _ =
|
||||
page_config_full.update(notebookPage='consoles') %}
|
||||
|
||||
<script id="jupyter-config-data" type="application/json">
|
||||
{{ page_config_full | tojson }}
|
||||
</script>
|
||||
|
||||
<script type="text/javascript">
|
||||
/* Remove token from URL. */
|
||||
(function () {
|
||||
var parsedUrl = new URL(window.location.href);
|
||||
if (parsedUrl.searchParams.get('token')) {
|
||||
parsedUrl.searchParams.delete('token');
|
||||
window.history.replaceState({}, '', parsedUrl.href);
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@ -1,39 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<title>{{page_config['appName'] | e}} - Edit</title>
|
||||
{% block favicon %}
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/x-icon"
|
||||
href="{{ base_url | escape }}static/favicons/favicon-file.ico"
|
||||
class="favicon"
|
||||
/>
|
||||
{% endblock %}
|
||||
</head>
|
||||
<body class="jp-ThemedContainer" data-notebook="edit">
|
||||
{# Copy so we do not modify the page_config with updates. #} {% set
|
||||
page_config_full = page_config.copy() %} {# Set a dummy variable - we just
|
||||
want the side effect of the update. #} {% set _ =
|
||||
page_config_full.update(baseUrl=base_url, wsUrl=ws_url) %} {# Sentinel value
|
||||
to say that we are on the tree page #} {% set _ =
|
||||
page_config_full.update(notebookPage='edit') %}
|
||||
|
||||
<script id="jupyter-config-data" type="application/json">
|
||||
{{ page_config_full | tojson }}
|
||||
</script>
|
||||
|
||||
<script type="text/javascript">
|
||||
/* Remove token from URL. */
|
||||
(function () {
|
||||
var parsedUrl = new URL(window.location.href);
|
||||
if (parsedUrl.searchParams.get('token')) {
|
||||
parsedUrl.searchParams.delete('token');
|
||||
window.history.replaceState({}, '', parsedUrl.href);
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@ -1,59 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<!--
|
||||
Copyright (c) Jupyter Development Team.
|
||||
Distributed under the terms of the Modified BSD License.
|
||||
-->
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
|
||||
<title>{% block title %}{{page_title | e}}{% endblock %}</title>
|
||||
|
||||
{% block favicon %}<link rel="shortcut icon" type="image/x-icon" href="/static/favicons/favicon.ico">{% endblock %}
|
||||
|
||||
</head>
|
||||
|
||||
<body class="jp-ThemedContainer">
|
||||
|
||||
{% block stylesheet %}
|
||||
<style type="text/css">
|
||||
/* disable initial hide */
|
||||
div#header, div#site {
|
||||
display: block;
|
||||
}
|
||||
</style>
|
||||
{% endblock %}
|
||||
{% block site %}
|
||||
|
||||
<div class="error">
|
||||
{% block h1_error %}
|
||||
<h1>{{status_code | e}} : {{status_message | e}}</h1>
|
||||
{% endblock h1_error %}
|
||||
{% block error_detail %}
|
||||
{% if message %}
|
||||
<p>The error was:</p>
|
||||
<div class="traceback-wrapper">
|
||||
<pre class="traceback">{{message | e}}</pre>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
</header>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block script %}
|
||||
<script type='text/javascript'>
|
||||
window.onload = function () {
|
||||
var tb = document.getElementsByClassName('traceback')[0];
|
||||
tb.scrollTop = tb.scrollHeight;
|
||||
{% if message %}
|
||||
console.error("{{message | e}}")
|
||||
{% endif %}
|
||||
};
|
||||
</script>
|
||||
{% endblock script %}
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@ -1,45 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<title>{{page_config['appName'] | e}} - Notebook</title>
|
||||
{% block favicon %}
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/x-icon"
|
||||
href="{{ base_url | escape }}static/favicons/favicon-notebook.ico"
|
||||
class="favicon"
|
||||
/>
|
||||
{% endblock %} {% if custom_css %}
|
||||
<link
|
||||
rel="stylesheet"
|
||||
type="text/css"
|
||||
href="{{ base_url | escape }}custom/custom.css"
|
||||
/>
|
||||
{% endif %}
|
||||
</head>
|
||||
<body class="jp-ThemedContainer" data-notebook="notebooks">
|
||||
{# Copy so we do not modify the page_config with updates. #} {% set
|
||||
page_config_full = page_config.copy() %} {# Set a dummy variable - we just
|
||||
want the side effect of the update. #} {% set _ =
|
||||
page_config_full.update(baseUrl=base_url, wsUrl=ws_url) %} {# Sentinel value
|
||||
to say that we are on the tree page #} {% set _ =
|
||||
page_config_full.update(notebookPage='notebooks') %}
|
||||
|
||||
<script id="jupyter-config-data" type="application/json">
|
||||
{{ page_config_full | tojson }}
|
||||
</script>
|
||||
|
||||
<script type="text/javascript">
|
||||
/* Remove token from URL. */
|
||||
(function () {
|
||||
var parsedUrl = new URL(window.location.href);
|
||||
if (parsedUrl.searchParams.get('token')) {
|
||||
parsedUrl.searchParams.delete('token');
|
||||
window.history.replaceState({}, '', parsedUrl.href);
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@ -1,45 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<title>{{page_config['appName'] | e}} - Terminal</title>
|
||||
{% block favicon %}
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/x-icon"
|
||||
href="{{ base_url | escape }}static/favicons/favicon-terminal.ico"
|
||||
class="favicon"
|
||||
/>
|
||||
{% endblock %} {% if custom_css %}
|
||||
<link
|
||||
rel="stylesheet"
|
||||
type="text/css"
|
||||
href="{{ base_url | escape }}custom/custom.css"
|
||||
/>
|
||||
{% endif %}
|
||||
</head>
|
||||
<body class="jp-ThemedContainer">
|
||||
{# Copy so we do not modify the page_config with updates. #} {% set
|
||||
page_config_full = page_config.copy() %} {# Set a dummy variable - we just
|
||||
want the side effect of the update. #} {% set _ =
|
||||
page_config_full.update(baseUrl=base_url, wsUrl=ws_url) %} {# Sentinel value
|
||||
to say that we are on the tree page #} {% set _ =
|
||||
page_config_full.update(notebookPage='terminals') %}
|
||||
|
||||
<script id="jupyter-config-data" type="application/json">
|
||||
{{ page_config_full | tojson }}
|
||||
</script>
|
||||
|
||||
<script type="text/javascript">
|
||||
/* Remove token from URL. */
|
||||
(function () {
|
||||
var parsedUrl = new URL(window.location.href);
|
||||
if (parsedUrl.searchParams.get('token')) {
|
||||
parsedUrl.searchParams.delete('token');
|
||||
window.history.replaceState({}, '', parsedUrl.href);
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@ -1,45 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<title>Home</title>
|
||||
{% block favicon %}
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/x-icon"
|
||||
href="{{ base_url | escape }}static/favicons/favicon.ico"
|
||||
class="favicon"
|
||||
/>
|
||||
{% endblock %} {% if custom_css %}
|
||||
<link
|
||||
rel="stylesheet"
|
||||
type="text/css"
|
||||
href="{{ base_url | escape }}custom/custom.css"
|
||||
/>
|
||||
{% endif %}
|
||||
</head>
|
||||
<body class="jp-ThemedContainer">
|
||||
{# Copy so we do not modify the page_config with updates. #} {% set
|
||||
page_config_full = page_config.copy() %} {# Set a dummy variable - we just
|
||||
want the side effect of the update. #} {% set _ =
|
||||
page_config_full.update(baseUrl=base_url, wsUrl=ws_url) %} {# Sentinel value
|
||||
to say that we are on the tree page #} {% set _ =
|
||||
page_config_full.update(notebookPage='tree') %}
|
||||
|
||||
<script id="jupyter-config-data" type="application/json">
|
||||
{{ page_config_full | tojson }}
|
||||
</script>
|
||||
|
||||
<script type="text/javascript">
|
||||
/* Remove token from URL. */
|
||||
(function () {
|
||||
var parsedUrl = new URL(window.location.href);
|
||||
if (parsedUrl.searchParams.get('token')) {
|
||||
parsedUrl.searchParams.delete('token');
|
||||
window.history.replaceState({}, '', parsedUrl.href);
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@ -1,12 +0,0 @@
|
||||
name: notebook
|
||||
channels:
|
||||
- conda-forge
|
||||
dependencies:
|
||||
- ipywidgets=8
|
||||
- jupyterlab=4
|
||||
- jupyterlab-language-pack-fr-FR
|
||||
- matplotlib
|
||||
- numpy
|
||||
- nodejs=20
|
||||
- python >=3.10,<3.11
|
||||
- xeus-python
|
||||
@ -1,5 +0,0 @@
|
||||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
python -m pip install -e ".[dev,test]"
|
||||
jlpm develop
|
||||
@ -0,0 +1,22 @@
|
||||
{
|
||||
"name": "jupyter-notebook-deps",
|
||||
"version": "0.0.1",
|
||||
"dependencies": {
|
||||
"backbone": "components/backbone#~1.2",
|
||||
"bootstrap": "components/bootstrap#~3.3",
|
||||
"bootstrap-tour": "0.9.0",
|
||||
"codemirror": "~5.5",
|
||||
"es6-promise": "~1.0",
|
||||
"font-awesome": "components/font-awesome#~4.2.0",
|
||||
"google-caja": "5669",
|
||||
"jquery": "components/jquery#~2.0",
|
||||
"jquery-ui": "components/jqueryui#~1.10",
|
||||
"marked": "~0.3",
|
||||
"MathJax": "components/MathJax#~2.5",
|
||||
"moment": "~2.8.4",
|
||||
"requirejs": "~2.1",
|
||||
"term.js": "chjj/term.js#~0.0.4",
|
||||
"text-encoding": "~0.1",
|
||||
"underscore": "components/underscore#~1.5"
|
||||
}
|
||||
}
|
||||
@ -1,44 +0,0 @@
|
||||
{
|
||||
"name": "@jupyter-notebook/buildutils",
|
||||
"version": "7.6.0-alpha.0",
|
||||
"private": true,
|
||||
"description": "Jupyter Notebook - Build Utilities",
|
||||
"homepage": "https://github.com/jupyter/notebook",
|
||||
"bugs": {
|
||||
"url": "https://github.com/jupyter/notebook/issues"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/jupyter/notebook.git"
|
||||
},
|
||||
"license": "BSD-3-Clause",
|
||||
"author": "Project Jupyter",
|
||||
"main": "lib/index.js",
|
||||
"types": "lib/index.d.ts",
|
||||
"directories": {
|
||||
"lib": "lib/"
|
||||
},
|
||||
"files": [
|
||||
"lib/*.d.ts",
|
||||
"lib/*.js.map",
|
||||
"lib/*.js"
|
||||
],
|
||||
"scripts": {
|
||||
"build": "tsc",
|
||||
"clean": "rimraf lib && rimraf tsconfig.tsbuildinfo",
|
||||
"watch": "tsc -w --listEmittedFiles"
|
||||
},
|
||||
"dependencies": {
|
||||
"@jupyterlab/buildutils": "~4.6.0-alpha.0",
|
||||
"commander": "^6.2.0",
|
||||
"fs-extra": "^9.1.0",
|
||||
"semver": "^7.6.3",
|
||||
"typescript": "~5.5.4"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/fs-extra": "^9.0.10",
|
||||
"@types/node": "^22.13.4",
|
||||
"@types/semver": "^7.5.8",
|
||||
"rimraf": "^3.0.2"
|
||||
}
|
||||
}
|
||||
@ -1,56 +0,0 @@
|
||||
/* -----------------------------------------------------------------------------
|
||||
| Copyright (c) Jupyter Development Team.
|
||||
| Distributed under the terms of the Modified BSD License.
|
||||
|----------------------------------------------------------------------------*/
|
||||
|
||||
import commander from 'commander';
|
||||
|
||||
import fs from 'fs-extra';
|
||||
|
||||
import path from 'path';
|
||||
|
||||
import process from 'process';
|
||||
|
||||
import { run } from '@jupyterlab/buildutils';
|
||||
|
||||
commander
|
||||
.description('Setup the repository for develop mode')
|
||||
.option('--overwrite', 'Force linking the notebook schemas')
|
||||
.option('--source', 'The path to the notebook package')
|
||||
.action((options: any) => {
|
||||
const { overwrite } = options;
|
||||
const prefix = run(
|
||||
'python -c "import sys; print(sys.prefix)"',
|
||||
{
|
||||
stdio: 'pipe',
|
||||
},
|
||||
true
|
||||
);
|
||||
const source = path.resolve(options.source ?? process.cwd());
|
||||
const sourceDir = path.join(
|
||||
source,
|
||||
'notebook',
|
||||
'schemas',
|
||||
'@jupyter-notebook'
|
||||
);
|
||||
const destDir = path.join(
|
||||
prefix,
|
||||
'share',
|
||||
'jupyter',
|
||||
'lab',
|
||||
'schemas',
|
||||
'@jupyter-notebook'
|
||||
);
|
||||
if (overwrite) {
|
||||
try {
|
||||
fs.removeSync(destDir);
|
||||
console.log('Removed previous destination:', destDir);
|
||||
} catch (e) {
|
||||
console.info('Skip unlink', destDir);
|
||||
}
|
||||
}
|
||||
console.log('Symlinking:', sourceDir, destDir);
|
||||
fs.symlinkSync(sourceDir, destDir, 'dir');
|
||||
});
|
||||
|
||||
commander.parse(process.argv);
|
||||
@ -1,45 +0,0 @@
|
||||
import * as path from 'path';
|
||||
|
||||
import * as fs from 'fs-extra';
|
||||
|
||||
import { writePackageData } from '@jupyterlab/buildutils';
|
||||
|
||||
/**
|
||||
* Ensure the application package resolutions.
|
||||
*/
|
||||
function ensureResolutions(): string[] {
|
||||
const basePath = path.resolve('.');
|
||||
const corePath = path.join(basePath, 'app', 'package.json');
|
||||
const corePackage = fs.readJSONSync(corePath);
|
||||
|
||||
corePackage.resolutions = {};
|
||||
|
||||
const packages = Object.keys(corePackage.dependencies).concat(
|
||||
corePackage.jupyterlab.singletonPackages
|
||||
);
|
||||
|
||||
packages.forEach(async (name) => {
|
||||
let version = '';
|
||||
try {
|
||||
const data = require(`${name}/package.json`);
|
||||
version = data.version;
|
||||
} catch {
|
||||
const modulePath = require.resolve(name);
|
||||
const parentDir = path.dirname(path.dirname(modulePath));
|
||||
const data = require(path.join(parentDir, 'package.json'));
|
||||
version = data.version;
|
||||
}
|
||||
// Insist on a restricted version in the yarn resolution.
|
||||
corePackage.resolutions[name] = `~${version}`;
|
||||
});
|
||||
|
||||
// Write the package.json back to disk.
|
||||
if (writePackageData(corePath, corePackage)) {
|
||||
return ['Updated dev mode'];
|
||||
}
|
||||
return [];
|
||||
}
|
||||
|
||||
if (require.main === module) {
|
||||
void ensureResolutions();
|
||||
}
|
||||
@ -1,86 +0,0 @@
|
||||
import * as fs from 'fs-extra';
|
||||
import * as semver from 'semver';
|
||||
|
||||
function convertPythonVersion(version: string): string {
|
||||
return version
|
||||
.replace('a', '-alpha')
|
||||
.replace('b', '-beta')
|
||||
.replace('rc', '-rc');
|
||||
}
|
||||
|
||||
function extractVersionFromReleases(
|
||||
releases: any,
|
||||
versionTag: string,
|
||||
currentVersion: string
|
||||
): string | null {
|
||||
const npmCurrentVersion = convertPythonVersion(currentVersion);
|
||||
const isCurrentPreRelease = semver.prerelease(npmCurrentVersion) !== null;
|
||||
|
||||
if (versionTag === 'latest') {
|
||||
// Find first version that is newer than current and matches pre-release criteria
|
||||
const release = releases.find((r: any) => {
|
||||
const version = r['tag_name'].substring(1); // Remove 'v' prefix for semver
|
||||
const npmVersion = convertPythonVersion(version);
|
||||
return (
|
||||
(isCurrentPreRelease || !r['prerelease']) &&
|
||||
semver.gte(npmVersion, npmCurrentVersion)
|
||||
);
|
||||
});
|
||||
return release ? release['tag_name'] : null;
|
||||
} else {
|
||||
// Find exact version match
|
||||
const release = releases.find((r: any) => r['tag_name'] === versionTag);
|
||||
return release ? release['tag_name'] : null;
|
||||
}
|
||||
}
|
||||
|
||||
function extractCurrentJupyterLabVersion(): string {
|
||||
const toml = fs.readFileSync('pyproject.toml', 'utf8');
|
||||
const match = toml.match(/jupyterlab>=([^,]+)/);
|
||||
if (!match) {
|
||||
throw new Error('Could not find JupyterLab version in pyproject.toml');
|
||||
}
|
||||
return match[1];
|
||||
}
|
||||
|
||||
async function findVersion(versionTag: string): Promise<string> {
|
||||
const url = 'https://api.github.com/repos/jupyterlab/jupyterlab/releases';
|
||||
const response = await fetch(url);
|
||||
if (!response.ok) {
|
||||
const error_message = `Failed to fetch package.json from ${url}. HTTP status code: ${response.status}`;
|
||||
throw new Error(error_message);
|
||||
}
|
||||
|
||||
const currentVersion = extractCurrentJupyterLabVersion();
|
||||
|
||||
const releases: any = await response.json();
|
||||
const version: string | null = extractVersionFromReleases(
|
||||
releases,
|
||||
versionTag,
|
||||
currentVersion
|
||||
);
|
||||
if (version === null) {
|
||||
const error_message = 'Invalid release tag';
|
||||
throw new Error(error_message);
|
||||
}
|
||||
return version.substring(1);
|
||||
}
|
||||
|
||||
async function getLatestLabVersion(): Promise<void> {
|
||||
const args: string[] = process.argv.slice(2);
|
||||
if (args.length !== 2 || args[0] !== '--set-version') {
|
||||
console.error('Usage: node script.js --set-version <version>');
|
||||
process.exit(1);
|
||||
}
|
||||
const version_tag: string = args[1];
|
||||
|
||||
try {
|
||||
const result: string = await findVersion(version_tag);
|
||||
console.log(result);
|
||||
} catch (error: any) {
|
||||
console.error('Error:', error.message);
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
getLatestLabVersion();
|
||||
@ -1,148 +0,0 @@
|
||||
/* -----------------------------------------------------------------------------
|
||||
| Copyright (c) Jupyter Development Team.
|
||||
| Distributed under the terms of the Modified BSD License.
|
||||
|----------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Inspired by: https://github.com/jupyterlab/jupyterlab/blob/master/buildutils/src/bumpversion.ts
|
||||
*/
|
||||
|
||||
import * as utils from '@jupyterlab/buildutils';
|
||||
|
||||
import commander from 'commander';
|
||||
|
||||
import { getPythonVersion, postbump } from './utils';
|
||||
|
||||
// Specify the program signature.
|
||||
commander
|
||||
.description('Update the version')
|
||||
.option('--dry-run', 'Dry run')
|
||||
.option('--force', 'Force the upgrade')
|
||||
.option('--skip-commit', 'Whether to skip commit changes')
|
||||
.arguments('<spec>')
|
||||
.action((spec: any, opts: any) => {
|
||||
// Get the previous version.
|
||||
const prev = getPythonVersion();
|
||||
const isFinal = /\d+\.\d+\.\d+$/.test(prev);
|
||||
|
||||
// Whether to commit after bumping
|
||||
const commit = opts.skipCommit !== true;
|
||||
|
||||
// for "next", determine whether to use "patch" or "build"
|
||||
if (spec === 'next') {
|
||||
spec = isFinal ? 'patch' : 'build';
|
||||
}
|
||||
|
||||
// For patch, defer to `patch:release` command
|
||||
if (spec === 'patch') {
|
||||
let cmd = 'jlpm run release:patch';
|
||||
if (opts.force) {
|
||||
cmd += ' --force';
|
||||
}
|
||||
if (!commit) {
|
||||
cmd += ' --skip-commit';
|
||||
}
|
||||
utils.run(cmd);
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
// Make sure we have a valid version spec.
|
||||
const options = ['major', 'minor', 'release', 'build'];
|
||||
if (options.indexOf(spec) === -1) {
|
||||
throw new Error(`Version spec must be one of: ${options}`);
|
||||
}
|
||||
if (isFinal && spec === 'build') {
|
||||
throw new Error('Cannot increment a build on a final release');
|
||||
}
|
||||
|
||||
// Run pre-bump script.
|
||||
utils.prebump();
|
||||
|
||||
// Handle dry runs.
|
||||
if (opts.dryRun) {
|
||||
return;
|
||||
}
|
||||
|
||||
// If this is a major release during the alpha cycle, bump
|
||||
// just the Python version.
|
||||
if (prev.indexOf('a') !== -1 && spec === 'major') {
|
||||
// Bump the version.
|
||||
utils.run(`hatch version ${spec}`);
|
||||
|
||||
// Run the post-bump script.
|
||||
postbump(commit);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Determine the version spec to use for lerna.
|
||||
let lernaVersion = 'preminor';
|
||||
if (spec === 'build') {
|
||||
lernaVersion = 'prerelease';
|
||||
// a -> b
|
||||
} else if (spec === 'release' && prev.indexOf('a') !== -1) {
|
||||
lernaVersion = 'prerelease --preid=beta';
|
||||
// b -> rc
|
||||
} else if (spec === 'release' && prev.indexOf('b') !== -1) {
|
||||
lernaVersion = 'prerelease --preid=rc';
|
||||
// rc -> final
|
||||
} else if (spec === 'release' && prev.indexOf('rc') !== -1) {
|
||||
lernaVersion = 'patch';
|
||||
}
|
||||
if (lernaVersion === 'preminor') {
|
||||
lernaVersion += ' --preid=alpha';
|
||||
}
|
||||
|
||||
let cmd = `jlpm run lerna version --force-publish --no-push --no-git-tag-version ${lernaVersion}`;
|
||||
if (opts.force) {
|
||||
cmd += ' --yes';
|
||||
}
|
||||
// For a preminor release, we bump 10 minor versions so that we do
|
||||
// not conflict with versions during minor releases of the top
|
||||
// level package.
|
||||
if (lernaVersion === 'preminor') {
|
||||
for (let i = 0; i < 10; i++) {
|
||||
utils.run(cmd);
|
||||
}
|
||||
} else {
|
||||
utils.run(cmd);
|
||||
}
|
||||
|
||||
// Bump the version.
|
||||
let pySpec = spec;
|
||||
if (spec === 'release') {
|
||||
if (prev.indexOf('a') !== -1) {
|
||||
pySpec = 'beta';
|
||||
} else if (prev.indexOf('b') !== -1) {
|
||||
pySpec = 'rc';
|
||||
} else if (prev.indexOf('rc') !== -1) {
|
||||
pySpec = 'release';
|
||||
} else {
|
||||
pySpec = 'alpha';
|
||||
}
|
||||
} else if (spec === 'build') {
|
||||
if (prev.indexOf('a') !== -1) {
|
||||
pySpec = 'a';
|
||||
} else if (prev.indexOf('b') !== -1) {
|
||||
pySpec = 'b';
|
||||
} else if (prev.indexOf('rc') !== -1) {
|
||||
pySpec = 'rc';
|
||||
}
|
||||
} else if (spec === 'major' || spec === 'minor') {
|
||||
if (prev.indexOf('a') !== -1) {
|
||||
pySpec = `${spec},beta`;
|
||||
} else if (prev.indexOf('b') !== -1) {
|
||||
pySpec = `${spec},rc`;
|
||||
} else if (prev.indexOf('rc') !== -1) {
|
||||
pySpec = `${spec},release`;
|
||||
} else {
|
||||
pySpec = `${spec},alpha`;
|
||||
}
|
||||
}
|
||||
utils.run(`hatch version ${pySpec}`);
|
||||
|
||||
// Run the post-bump script.
|
||||
postbump(commit);
|
||||
});
|
||||
|
||||
commander.parse(process.argv);
|
||||
@ -1,51 +0,0 @@
|
||||
/* -----------------------------------------------------------------------------
|
||||
| Copyright (c) Jupyter Development Team.
|
||||
| Distributed under the terms of the Modified BSD License.
|
||||
|----------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Inspired by: https://github.com/jupyterlab/jupyterlab/blob/master/buildutils/src/patch-release.ts
|
||||
*/
|
||||
|
||||
import * as utils from '@jupyterlab/buildutils';
|
||||
|
||||
import commander from 'commander';
|
||||
|
||||
import { getPythonVersion, postbump } from './utils';
|
||||
|
||||
// Specify the program signature.
|
||||
commander
|
||||
.description('Create a patch release')
|
||||
.option('--force', 'Force the upgrade')
|
||||
.option('--skip-commit', 'Whether to skip commit changes')
|
||||
.action((options: any) => {
|
||||
// Make sure we can patch release.
|
||||
const pyVersion = getPythonVersion();
|
||||
if (
|
||||
pyVersion.includes('a') ||
|
||||
pyVersion.includes('b') ||
|
||||
pyVersion.includes('rc')
|
||||
) {
|
||||
throw new Error('Can only make a patch release from a final version');
|
||||
}
|
||||
|
||||
// Run pre-bump actions.
|
||||
utils.prebump();
|
||||
|
||||
// Patch the python version
|
||||
utils.run('hatch version patch');
|
||||
|
||||
// Version the changed
|
||||
let cmd =
|
||||
'jlpm run lerna version patch --no-push --force-publish --no-git-tag-version';
|
||||
if (options.force) {
|
||||
cmd += ' --yes';
|
||||
}
|
||||
utils.run(cmd);
|
||||
|
||||
// Whether to commit after bumping
|
||||
const commit = options.skipCommit !== true;
|
||||
postbump(commit);
|
||||
});
|
||||
|
||||
commander.parse(process.argv);
|
||||
@ -1,170 +0,0 @@
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
|
||||
const PACKAGE_JSON_PATHS: string[] = [
|
||||
'app/package.json',
|
||||
'buildutils/package.json',
|
||||
'package.json',
|
||||
'packages/application-extension/package.json',
|
||||
'packages/application/package.json',
|
||||
'packages/console-extension/package.json',
|
||||
'packages/docmanager-extension/package.json',
|
||||
'packages/documentsearch-extension/package.json',
|
||||
'packages/help-extension/package.json',
|
||||
'packages/lab-extension/package.json',
|
||||
'packages/notebook-extension/package.json',
|
||||
'packages/terminal-extension/package.json',
|
||||
'packages/tree-extension/package.json',
|
||||
'packages/tree/package.json',
|
||||
'packages/ui-components/package.json',
|
||||
'ui-tests/package.json',
|
||||
];
|
||||
|
||||
const DEPENDENCY_GROUP = '@jupyterlab';
|
||||
|
||||
interface IVersion {
|
||||
major: number;
|
||||
minor: number;
|
||||
patch: number;
|
||||
preRelease?: string;
|
||||
}
|
||||
|
||||
function parseVersion(version: string): IVersion {
|
||||
const match = version.match(/^(\d+)\.(\d+)\.(\d+)(?:(a|b|rc)(\d+))?$/);
|
||||
if (!match) {
|
||||
throw new Error(`Invalid version format: ${version}`);
|
||||
}
|
||||
|
||||
const [, major, minor, patch, type, preVersion] = match;
|
||||
const baseVersion = {
|
||||
major: parseInt(major, 10),
|
||||
minor: parseInt(minor, 10),
|
||||
patch: parseInt(patch, 10),
|
||||
};
|
||||
|
||||
if (type && preVersion) {
|
||||
return {
|
||||
...baseVersion,
|
||||
preRelease: `${type}${preVersion}`,
|
||||
};
|
||||
}
|
||||
|
||||
return baseVersion;
|
||||
}
|
||||
|
||||
function getVersionRange(version: IVersion): string {
|
||||
const baseVersion = `${version.major}.${version.minor}.${version.patch}${
|
||||
version.preRelease ?? ''
|
||||
}`;
|
||||
return `>=${baseVersion},<${version.major}.${version.minor + 1}`;
|
||||
}
|
||||
|
||||
function updateVersionInFile(
|
||||
filePath: string,
|
||||
pattern: RegExp,
|
||||
version: IVersion
|
||||
): void {
|
||||
const content = fs.readFileSync(filePath, 'utf-8');
|
||||
const versionRange = getVersionRange(version);
|
||||
const updatedContent = content.replace(pattern, `$1${versionRange}`);
|
||||
fs.writeFileSync(filePath, updatedContent);
|
||||
}
|
||||
|
||||
async function updatePackageJson(newVersion: string): Promise<void> {
|
||||
const url = `https://raw.githubusercontent.com/jupyterlab/jupyterlab/v${newVersion}/jupyterlab/staging/package.json`;
|
||||
const response = await fetch(url);
|
||||
|
||||
if (!response.ok) {
|
||||
const errorMessage = `Failed to fetch package.json from ${url}. HTTP status code: ${response.status}`;
|
||||
throw new Error(errorMessage);
|
||||
}
|
||||
|
||||
// fetch the new galata version
|
||||
const galataUrl = `https://raw.githubusercontent.com/jupyterlab/jupyterlab/v${newVersion}/galata/package.json`;
|
||||
const galataResponse = await fetch(galataUrl);
|
||||
if (!galataResponse.ok) {
|
||||
const errorMessage = `Failed to fetch galata/package.json from ${galataUrl}. HTTP status code: ${galataResponse.status}`;
|
||||
throw new Error(errorMessage);
|
||||
}
|
||||
|
||||
const newPackageJson = await response.json();
|
||||
const galataPackageJson = await galataResponse.json();
|
||||
|
||||
for (const packageJsonPath of PACKAGE_JSON_PATHS) {
|
||||
const filePath: string = path.resolve(packageJsonPath);
|
||||
const existingPackageJson = JSON.parse(fs.readFileSync(filePath, 'utf-8'));
|
||||
|
||||
const newDependencies = {
|
||||
...newPackageJson.devDependencies,
|
||||
...newPackageJson.resolutions,
|
||||
[galataPackageJson.name]: galataPackageJson.version,
|
||||
};
|
||||
|
||||
updateDependencyVersion(existingPackageJson, newDependencies);
|
||||
|
||||
fs.writeFileSync(
|
||||
filePath,
|
||||
JSON.stringify(existingPackageJson, null, 2) + '\n'
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
function updateDependencyVersion(existingJson: any, newJson: any): void {
|
||||
if (!existingJson) {
|
||||
return;
|
||||
}
|
||||
|
||||
const sectionPaths: string[] = [
|
||||
'resolutions',
|
||||
'dependencies',
|
||||
'devDependencies',
|
||||
];
|
||||
|
||||
for (const section of sectionPaths) {
|
||||
if (!existingJson[section]) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const updated = existingJson[section];
|
||||
|
||||
for (const [pkg, version] of Object.entries<string>(
|
||||
existingJson[section]
|
||||
)) {
|
||||
if (pkg.startsWith(DEPENDENCY_GROUP) && pkg in newJson) {
|
||||
if (version[0] === '^' || version[0] === '~') {
|
||||
updated[pkg] = version[0] + absoluteVersion(newJson[pkg]);
|
||||
} else {
|
||||
updated[pkg] = absoluteVersion(newJson[pkg]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function absoluteVersion(version: string): string {
|
||||
if (version.length > 0 && (version[0] === '^' || version[0] === '~')) {
|
||||
return version.substring(1);
|
||||
}
|
||||
return version;
|
||||
}
|
||||
|
||||
const versionPattern = /(jupyterlab)(>=[\d.]+(?:[a|b|rc]\d+)?,<[\d.]+)/g;
|
||||
|
||||
const FILES_TO_UPDATE = ['pyproject.toml', '.pre-commit-config.yaml'];
|
||||
|
||||
async function upgradeLabDependencies(): Promise<void> {
|
||||
const args: string[] = process.argv.slice(2);
|
||||
|
||||
if (args.length < 2) {
|
||||
throw new Error('Please provide the set-version flag and version');
|
||||
}
|
||||
|
||||
const version = parseVersion(args[1]);
|
||||
await updatePackageJson(args[1]); // Keep original string version for package.json
|
||||
|
||||
for (const file of FILES_TO_UPDATE) {
|
||||
updateVersionInFile(path.resolve(file), versionPattern, version);
|
||||
}
|
||||
}
|
||||
|
||||
upgradeLabDependencies();
|
||||
@ -1,23 +0,0 @@
|
||||
import { run } from '@jupyterlab/buildutils';
|
||||
|
||||
/**
|
||||
* Get the current version of notebook
|
||||
*/
|
||||
export function getPythonVersion(): string {
|
||||
const cmd = 'hatch version';
|
||||
const lines = run(cmd, { stdio: 'pipe' }, true).split('\n');
|
||||
return lines[lines.length - 1];
|
||||
}
|
||||
|
||||
export function postbump(commit = true): void {
|
||||
// run the integrity
|
||||
run('jlpm integrity');
|
||||
|
||||
const newPyVersion = getPythonVersion();
|
||||
|
||||
// Commit changes.
|
||||
if (commit) {
|
||||
run(`git commit -am "Release ${newPyVersion}"`);
|
||||
run(`git tag ${newPyVersion}`);
|
||||
}
|
||||
}
|
||||
@ -1,10 +0,0 @@
|
||||
{
|
||||
"extends": "../tsconfigbase",
|
||||
"compilerOptions": {
|
||||
"outDir": "lib",
|
||||
"rootDir": "src",
|
||||
"module": "commonjs"
|
||||
},
|
||||
"include": ["src/*"],
|
||||
"references": []
|
||||
}
|
||||
@ -0,0 +1,44 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
import os
|
||||
from notebook.notebookapp import NotebookApp
|
||||
|
||||
header = """\
|
||||
.. _config:
|
||||
|
||||
Config
|
||||
======
|
||||
|
||||
The notebook server can be run with a variety of command line arguments.
|
||||
A list of available options can be found below in the :ref:`options section
|
||||
<options>`.
|
||||
|
||||
Defaults for these options can also be set by creating a file named
|
||||
``jupyter_notebook_config.py`` in your Jupyter folder. The Jupyter
|
||||
folder is in your home directory, ``~/.jupyter``.
|
||||
|
||||
To create a ``jupyter_notebook_config.py`` file, with all the defaults
|
||||
commented out, you can use the following command line::
|
||||
|
||||
$ jupyter notebook --generate-config
|
||||
|
||||
|
||||
.. _options:
|
||||
|
||||
Options
|
||||
-------
|
||||
|
||||
This list of options can be generated by running the following and hitting
|
||||
enter::
|
||||
|
||||
$ jupyter notebook --help
|
||||
|
||||
"""
|
||||
try:
|
||||
destination = os.path.join(os.path.dirname(__file__), 'source/config.rst')
|
||||
except:
|
||||
destination = os.path.join(os.getcwd(), 'config.rst')
|
||||
|
||||
with open(destination, 'w') as f:
|
||||
f.write(header)
|
||||
f.write(NotebookApp().document_config_options())
|
||||
@ -1,16 +1,21 @@
|
||||
{
|
||||
"markdown": {
|
||||
"parser": "gfm"
|
||||
},
|
||||
"plugins": ["plugins/markdown", "jsdoc_plugin.js"],
|
||||
"source": {
|
||||
"include": ["../notebook/static/notebook/js/notebook.js"]
|
||||
},
|
||||
"tags": {
|
||||
"allowUnknownTags": true
|
||||
},
|
||||
"templates": {
|
||||
"cleverLinks": false,
|
||||
"monospaceLinks": false
|
||||
}
|
||||
"markdown": {
|
||||
"parser": "gfm"
|
||||
},
|
||||
"plugins": [
|
||||
"plugins/markdown" ,
|
||||
"jsdoc_plugin.js"
|
||||
],
|
||||
"source": {
|
||||
"include": [
|
||||
"../notebook/static/notebook/js/notebook.js"
|
||||
]
|
||||
},
|
||||
"tags": {
|
||||
"allowUnknownTags": true
|
||||
},
|
||||
"templates": {
|
||||
"cleverLinks": false,
|
||||
"monospaceLinks": false
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,14 +1,12 @@
|
||||
exports.handlers = {
|
||||
newDoclet: function (e) {
|
||||
// e.doclet will refer to the newly created doclet
|
||||
// you can read and modify properties of that doclet if you wish
|
||||
if (typeof e.doclet.name === 'string') {
|
||||
if (e.doclet.name[0] === '_') {
|
||||
console.log(
|
||||
'Private method "' + e.doclet.longname + '" not documented.'
|
||||
);
|
||||
e.doclet.memberof = '<anonymous>';
|
||||
}
|
||||
newDoclet: function(e) {
|
||||
// e.doclet will refer to the newly created doclet
|
||||
// you can read and modify properties of that doclet if you wish
|
||||
if (typeof e.doclet.name === 'string') {
|
||||
if (e.doclet.name[0] == '_') {
|
||||
console.log('Private method "' + e.doclet.longname + '" not documented.');
|
||||
e.doclet.memberof = '<anonymous>';
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
};
|
||||
};
|
||||
@ -0,0 +1,9 @@
|
||||
jinja2
|
||||
tornado
|
||||
-e git+https://github.com/ipython/ipython_genutils.git#egg=ipython_genutils
|
||||
-e git+https://github.com/ipython/traitlets.git#egg=traitlets
|
||||
-e git+https://github.com/jupyter/jupyter_core.git#egg=jupyter_core
|
||||
-e git+https://github.com/jupyter/nbformat.git#egg=nbformat
|
||||
-e git+https://github.com/jupyter/jupyter_client.git#egg=jupyter_client
|
||||
-e git+https://github.com/ipython/ipython.git#egg=ipython
|
||||
-e git+https://github.com/ipython/ipykernel.git#egg=ipykernel
|
||||
|
Before Width: | Height: | Size: 940 KiB |
|
Before Width: | Height: | Size: 124 KiB |
|
Before Width: | Height: | Size: 272 KiB |
|
Before Width: | Height: | Size: 87 KiB |
|
Before Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 102 KiB |
|
Before Width: | Height: | Size: 88 KiB |
|
Before Width: | Height: | Size: 104 KiB |
|
Before Width: | Height: | Size: 940 KiB |
|
Before Width: | Height: | Size: 155 KiB |
|
Before Width: | Height: | Size: 149 KiB |
|
Before Width: | Height: | Size: 174 KiB |
|
Before Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 5.8 KiB |
|
Before Width: | Height: | Size: 5.8 KiB |
|
After Width: | Height: | Size: 9.0 KiB |
@ -0,0 +1,46 @@
|
||||
.. _changelog:
|
||||
|
||||
Jupyter notebook changelog
|
||||
==========================
|
||||
|
||||
A summary of changes in the Jupyter notebook.
|
||||
For more detailed information, see `GitHub <https://github.com/jupyter/notebook>`__.
|
||||
|
||||
4.0.x
|
||||
-----
|
||||
|
||||
4.0.6
|
||||
*****
|
||||
|
||||
- fix installation of mathjax support files
|
||||
- fix some double-escape regressions in 4.0.5
|
||||
- fix a couple of cases where errors could prevent opening a notebook
|
||||
|
||||
4.0.5
|
||||
*****
|
||||
|
||||
Security fixes for maliciously crafted files.
|
||||
|
||||
- `CVE-2015-6938 <http://www.openwall.com/lists/oss-security/2015/09/02/3>`__: malicious filenames
|
||||
- `CVE-2015-7337 <http://www.openwall.com/lists/oss-security/2015/09/16/3>`__: malicious binary files in text editor.
|
||||
|
||||
Thanks to Jonathan Kamens at Quantopian and Juan Broullón for the reports.
|
||||
|
||||
|
||||
4.0.4
|
||||
*****
|
||||
|
||||
- Fix inclusion of mathjax-safe extension
|
||||
|
||||
4.0.2
|
||||
*****
|
||||
|
||||
- Fix launching the notebook on Windows
|
||||
- Fix the path searched for frontend config
|
||||
- Fix nbextension-install on Python 2
|
||||
|
||||
|
||||
4.0.0
|
||||
*****
|
||||
|
||||
First release of the notebook as a standalone package.
|
||||
@ -1,10 +0,0 @@
|
||||
# Configuration
|
||||
|
||||
```{toctree}
|
||||
:caption: Configuration
|
||||
:maxdepth: 1
|
||||
|
||||
configuring/config_overview
|
||||
Security <https://jupyter-server.readthedocs.io/en/stable/operators/security.html>
|
||||
extending/index.rst
|
||||
```
|
||||
@ -1,62 +0,0 @@
|
||||
# Interface Customization
|
||||
|
||||
Multiple elements in the Notebook interface can be customized via the Settings Editor.
|
||||
|
||||
## Layout
|
||||
|
||||
By default some widgets are displayed in pre-defined parts of the user interface, which are often called "areas" or "regions".
|
||||
For example the table of contents will be displayed in the `left` area by default, while the debugger will be displayed in the `right` area.
|
||||
|
||||
However the positioning of some of these components can also be customized via the Settings Editor. Below are a few examples of how to do this.
|
||||
|
||||
### Open the Markdown Preview on the left
|
||||
|
||||
It is often useful to be able to see a rendered preview of a Markdown document while editing it.
|
||||
|
||||
By default the Markdown Preview opens on the right side of the application. However it is also possible to open it on the left side by changing the Notebook Shell settings in the Advanced Settings Editor:
|
||||
|
||||
```json
|
||||
{
|
||||
"layout": {
|
||||
"Markdown Preview": {
|
||||
"area": "left"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||

|
||||
|
||||
### Configuring a third-party widget
|
||||
|
||||
Third-party extensions can also add widgets to the application shell. This is for example the case with the [Voila extension](https://github.com/voila-dashboards/voila), which adds a preview widget to visualize a notebook as a dashboard.
|
||||
|
||||
By default in JupyterLab the Voila Preview is added to the `main` area next to the corresponding notebook. With Notebook 7 it is possible to move the Voila Preview to the `right` area by changing the Notebook Shell setting in the Advanced Settings Editor as follows:
|
||||
|
||||
```json
|
||||
{
|
||||
"layout": {
|
||||
"Voila Preview": {
|
||||
"area": "right"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||

|
||||
|
||||
```{note}
|
||||
Refer to the [JupyterLab Layout Documentation](https://jupyterlab.readthedocs.io/en/latest/user/interface_customization.html#layout)
|
||||
to learn more about the default positioning of other UI elements.
|
||||
```
|
||||
|
||||
## Toolbars, Menu bar and Context Menu
|
||||
|
||||
It is also possible to customize toolbars, menus and context menu entries via the Settings Editor.
|
||||
|
||||
For example the items of the notebook toolbar can be reordered, or some menu entries can be hidden.
|
||||
|
||||
```{note}
|
||||
Refer to the [JupyterLab Documentation](https://jupyterlab.readthedocs.io/en/latest/user/interface_customization.html)
|
||||
to learn more about general interface customization via the settings editor.
|
||||
```
|
||||
@ -1,21 +0,0 @@
|
||||
# Managing plugins
|
||||
|
||||
Notebook 7 uses the same extension system as JupyterLab. An extension can provide multiple plugins.
|
||||
|
||||
```{note}
|
||||
See the [JupyterLab documentation](https://jupyterlab.readthedocs.io/en/latest/user/extensions.html) to learn more about the extension system.
|
||||
```
|
||||
|
||||
## Examples
|
||||
|
||||
### Disabling the download button
|
||||
|
||||
By default Notebook 7 provides a way to download files from the file browser. This functionality consists of a context menu entry and a main menu entry. They are provided by an application plugin that can be disabled.
|
||||
|
||||
To disable the download entry of file browser context menus, open a terminal and run the following command:
|
||||
|
||||
```text
|
||||
jupyter labextension disable @jupyterlab/filebrowser-extension:download
|
||||
```
|
||||
|
||||
Then restart the application and refresh the page.
|
||||