Merge branch 'main' into issue_7004

pull/7113/head
Jayesh Singh 2 years ago committed by GitHub
commit cd4150b39a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -32,13 +32,13 @@ runs:
sha256sum * | tee SHA256SUMS
- name: Upload distributions
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: notebook-dist-${{ github.run_number }}
path: ./dist
- name: Upload distributions
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: notebook-pkgs-${{ github.run_number }}
path: ./pkgs

@ -4,6 +4,10 @@ updates:
directory: '/'
schedule:
interval: 'weekly'
groups:
actions:
patterns:
- "*"
- package-ecosystem: 'pip'
directory: '/'
schedule:

@ -14,4 +14,4 @@ jobs:
permissions:
pull-requests: write
steps:
- uses: toshimaru/auto-author-assign@v2.0.1
- uses: toshimaru/auto-author-assign@v2.1.0

@ -138,12 +138,12 @@ jobs:
py_cmd: python
steps:
- name: Install Python
uses: actions/setup-python@v4
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python }}
architecture: 'x64'
allow-prereleases: true
- uses: actions/download-artifact@v3
- uses: actions/download-artifact@v4
with:
name: notebook-dist-${{ github.run_number }}
path: ./dist
@ -175,7 +175,7 @@ jobs:
- 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/the-big-split-9d7b88a031a7 https://blog.jupyter.org/jupyter-ascending-1bf5b362d97e https://mybinder.org/v2/gh/jupyter/notebook/main'
ignore_links: 'https://playwright.dev/docs/test-cli/ https://blog.jupyter.org/the-big-split-9d7b88a031a7 https://blog.jupyter.org/jupyter-ascending-1bf5b362d97e 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:
@ -187,13 +187,14 @@ jobs:
- name: Run Linters
run: |
hatch run typing:test
hatch run lint:style
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

@ -29,7 +29,7 @@ jobs:
- name: Install dependencies
run: |
python -m pip install -U "jupyterlab>=4.0.2,<5" hatch
python -m pip install -U "jupyterlab>=4.2.0b1,<4.3" hatch
jlpm
jlpm run build
@ -72,13 +72,13 @@ jobs:
uses: actions/checkout@v4
- name: Install Python
uses: actions/setup-python@v4
uses: actions/setup-python@v5
with:
python-version: '3.9'
architecture: 'x64'
- name: Install dependencies
run: |
python -m pip install -U "jupyterlab>=4.0.2,<5" pip
python -m pip install -U "jupyterlab>=4.2.0b1,<4.3" pip
jlpm
jlpm run build

@ -27,7 +27,7 @@ jobs:
version_spec: next
- name: Upload Distributions
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: notebook-jupyter-releaser-dist-${{ github.run_number }}
path: .jupyter_releaser_checkout/dist

@ -14,7 +14,7 @@ jobs:
issues: write
pull-requests: write
steps:
- uses: dessant/lock-threads@v4
- uses: dessant/lock-threads@v5
with:
github-token: ${{ github.token }}
issue-lock-inactive-days: '180'

@ -45,7 +45,7 @@ jobs:
- name: Build
uses: ./.github/actions/build-dist
- uses: actions/download-artifact@v3
- uses: actions/download-artifact@v4
with:
name: notebook-dist-${{ github.run_number }}
path: ./dist

@ -1,29 +1,33 @@
name: 'Step 1: Prep Release'
name: "Step 1: Prep Release"
on:
workflow_dispatch:
inputs:
version_spec:
description: 'New Version Specifier'
default: 'next'
description: "New Version Specifier"
default: "next"
required: false
branch:
description: 'The branch to target'
description: "The branch to target"
required: false
post_version_spec:
description: 'Post Version Specifier'
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'
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'
description: "Use PRs with activity since the last stable git tag"
required: false
type: boolean
permissions:
contents: read
jobs:
prep_release:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1
@ -31,14 +35,15 @@ jobs:
id: prep-release
uses: jupyter-server/jupyter_releaser/.github/actions/prep-release@v2
with:
token: ${{ secrets.ADMIN_GITHUB_TOKEN }}
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 **'
- name: "** Next Step **"
run: |
echo "Optional): Review Draft Release: ${{ steps.prep-release.outputs.release_url }}"

@ -0,0 +1,34 @@
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@v1
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,32 +1,37 @@
name: 'Step 2: Publish Release'
name: "Step 2: Publish Release"
on:
workflow_dispatch:
inputs:
branch:
description: 'The target branch'
description: "The target branch"
required: false
release_url:
description: 'The URL of the draft GitHub release'
description: "The URL of the draft GitHub release"
required: false
steps_to_skip:
description: 'Comma separated list of steps to skip'
description: "Comma separated list of steps to skip"
required: false
permissions:
contents: read
jobs:
publish_release:
runs-on: ubuntu-latest
environment: release
permissions:
id-token: write
steps:
- uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1
- uses: actions/create-github-app-token@v1
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: ${{ secrets.ADMIN_GITHUB_TOKEN }}
target: ${{ github.event.inputs.target }}
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 }}
@ -34,23 +39,19 @@ jobs:
- name: Finalize Release
id: finalize-release
env:
PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }}
PYPI_TOKEN_MAP: ${{ secrets.PYPI_TOKEN_MAP }}
TWINE_USERNAME: __token__
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
uses: jupyter-server/jupyter-releaser/.github/actions/finalize-release@v2
uses: jupyter-server/jupyter_releaser/.github/actions/finalize-release@v2
with:
token: ${{ secrets.ADMIN_GITHUB_TOKEN }}
target: ${{ github.event.inputs.target }}
token: ${{ steps.app-token.outputs.token }}
release_url: ${{ steps.populate-release.outputs.release_url }}
- name: '** Next Step **'
- name: "** Next Step **"
if: ${{ success() }}
run: |
echo "Verify the final release"
echo ${{ steps.finalize-release.outputs.release_url }}
- name: '** Failure Message **'
- name: "** Failure Message **"
if: ${{ failure() }}
run: |
echo "Failed to Publish the Draft Release Url:"

@ -39,7 +39,7 @@ jobs:
- name: Base Setup
uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1
- uses: actions/download-artifact@v3
- uses: actions/download-artifact@v4
with:
name: notebook-dist-${{ github.run_number }}
path: ./dist
@ -62,7 +62,7 @@ jobs:
- name: Upload Playwright Test assets
if: always()
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: notebook-${{ matrix.browser }}-test-assets
path: |
@ -70,7 +70,7 @@ jobs:
- name: Upload Playwright Test report
if: always()
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: notebook-${{ matrix.browser }}-test-report
path: |
@ -87,7 +87,7 @@ jobs:
- name: Upload updated snapshots
if: failure()
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: notebook-${{ matrix.browser }}-updated-snapshots
path: ui-tests/test

@ -4,7 +4,7 @@ ci:
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.4.0
rev: v4.5.0
hooks:
- id: check-case-conflict
- id: check-ast
@ -21,26 +21,15 @@ repos:
- id: trailing-whitespace
- repo: https://github.com/python-jsonschema/check-jsonschema
rev: 0.27.0
rev: 0.27.4
hooks:
- id: check-github-workflows
- repo: https://github.com/adamchainz/blacken-docs
rev: '1.16.0'
hooks:
- id: blacken-docs
additional_dependencies: [black==23.7.0]
- repo: https://github.com/psf/black-pre-commit-mirror
rev: 23.9.1
hooks:
- id: black
- repo: https://github.com/codespell-project/codespell
rev: 'v2.2.6'
hooks:
- id: codespell
args: ['-L', 'sur,nd']
args: ['-L', 'hart,noteable']
exclude: |
(?x)^(
yarn.lock|
@ -48,6 +37,15 @@ repos:
docs/source/examples/images/FrontendKernel.graffle/data.plist|
)$
- repo: https://github.com/pre-commit/mirrors-mypy
rev: "v1.8.0"
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.2.0b1,<4.3"]
- repo: https://github.com/pre-commit/pygrep-hooks
rev: 'v1.10.0'
hooks:
@ -56,13 +54,18 @@ repos:
- id: rst-inline-touching-normal
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.0.292
rev: v0.2.0
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: '2023.09.21'
rev: '2024.01.24'
hooks:
- id: sp-repo-review
additional_dependencies: ['repo-review[cli]']

@ -12,8 +12,434 @@ upgrading `notebook`.
Use `pip install pip --upgrade` to upgrade pip. Check pip version with
`pip --version`.
## v7.1
Jupyter Notebook 7.1 is based on JupyterLab 4.1, and includes a number of new features, bug fixes, and enhancements for extension developers. This release is compatible with extensions supporting JupyterLab 4.0. Extension authors are recommended to consult the [Extension Migration Guide](https://jupyterlab.readthedocs.io/en/latest/extension/extension_migration.html#jupyterlab-4-0-to-4-1) which lists deprecations and changes to the public API.
Below are a few highlights for this new release. Most of the new features and improvements come from the update to JupyterLab 4.1, although they are not all supported in Notebook 7.1.
For reference you may have a look at the JupyterLab 4.1 changelog to learn more: https://jupyterlab.readthedocs.io/en/latest/getting_started/changelog.html#v4-1
### Diagrams in Markdown
Matching GitHub-Flavoured Markdown, JupyterLab 4.1 now supports [Mermaid](https://github.com/mermaid-js/mermaid) diagrams.
To create a mermaid diagram use the `mermaid` language specifier for a code block in a markdown cell or document, for example:
~~~
```mermaid
flowchart LR
A[Hard] -->|Text| B(Round)
B --> C{Decision}
C -->|One| D[Result 1]
C -->|Two| E[Result 2]
```
~~~
which renders as:
<img alt="Rendered Mermaid diagram going from left to right with modern look; the diagram contains blueish square node with text Hard pointing to round square node with text Round; over the arrow connecting the two nodes there is a word Text; the second node further connects to a rhombus-shaped node with text Decision which then connects to two further nodes, Result 1 and Result 2." src="https://raw.githubusercontent.com/jupyterlab/jupyterlab/main/docs/source/getting_started/changelog_assets/4.1-merimad-diagram.png" class="jp-screenshot">
### Inline completer
JupyterLab now supports completion presented as ghost text in the cell and file editors,
allowing generative AI models to provide multi-line completions. This can now also be leveraged in Jupyter Notebook.
The suggestions are provided by plugins implementing the ``IInlineCompletionProvider`` API;
by default a single provider which uses kernel history is available.
<img alt="In a code cell with `def fac` content a ghost text containing a suggestion representing further code of factorial function is shown; over the code cell there is a floating widget allowing to accept the suggestion and iterate between alternative suggestions" src="https://raw.githubusercontent.com/jupyterlab/jupyterlab/main/docs/source/getting_started/changelog_assets/4.1-inline-completer.png" class="jp-screenshot">
The suggestions can be invoked as-you-type or manually using a configurable shortcut (by default <kbd>Alt</kbd> + <kbd>\\</kbd>).
The default keyboard shortcuts are displayed in the small widget shown when hovering over the ghost suggestion:
- <kbd>Alt</kbd> + <kbd>End</kbd> - accept suggestion
- <kbd>Alt</kbd> + <kbd>[</kbd> - previous suggestion
- <kbd>Alt</kbd> + <kbd>]</kbd> - next suggestion
To enable the inline suggestions based on the kernel history, go to Settings → Inline Completer → History provider → check the "enabled" checkbox.
In addition to the built-in history suggestions,
the [`jupyter-ai`](https://github.com/jupyterlab/jupyter-ai) extension will provide
suggestions from supported models.
Note that the Jupyter AI extension is not yet compatible with Jupyter Notebook 7.
### Keyboard navigation improvements
Numerous improvements to keyboard navigation with focus on accessibility and usability are included in this release:
- the notebook cells now retain focus
- the focus can now be moved beyond the active notebook
- the toolbars can now be navigated using arrow keys
For more details, see [this post on Jupyter Blog](https://blog.jupyter.org/recent-keyboard-navigation-improvements-in-jupyter-4df32f97628d).
### Execution history in notebook
The code from previously executed cells can be used to populate empty cells,
allowing to iterate on code from previous cells or even sessions
(depending on how a specific kernel stores history).
To cycle between history items press <kbd>Alt</kbd> + <kbd>Arrow Up</kbd> and <kbd>Alt</kbd> + <kbd>Arrow Down</kbd>.
To enable execution history, go to Settings → Notebook → check the "Kernel history access" checkbox.
This feature was already available in the console in previous releases; it only works with kernels supporting execution history requests.
To clear the execution history consult the documentation of the kernel you are using (e.g., IPython/ipykernel).
### Error indicator in the table of contents
When a cell fails during execution, an error indicator will be displayed by the corresponding heading,
increasing awareness of the notebook state and enabling users to quickly navigate to the cell which requires attention.
<img alt="Error indicator in the shape of a triangle with exclamation sign (using ⚠ UTF character) shown next to one of the headings in the table of contents panel" src="https://raw.githubusercontent.com/jupyterlab/jupyterlab/main/docs/source/getting_started/changelog_assets/4.1-toc-error-indicator.png" class="jp-screenshot">
### Search improvements
- The search box will now grow automatically to accommodate longer text
- Search in selection can now be toggled using <kbd>Alt</kbd> + <kbd>L</kbd> and automatic search in selection can be configured in settings
- Tooltips with shortcuts were added to the buttons in the search box to improve discoverability of the shortcuts
### Miscellaneous
- The current theme (dark/light) can now be synced with the browser/system preference (Settings menu → Theme → Synchronise with System Settings)
- A blue "read-only" status indicator is now displayed in the toolbar of documents which cannot be saved because their model is read-only.
- Native support for viewing jsonl/ndjson files was added
- Collapsing of breadcrumbs in the File Browser can be disabled in File Browser settings
<!-- <START NEW CHANGELOG ENTRY> -->
## 7.2.0b1
([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.2.0-beta.0...b45d666d5ee1ee053b55ac9cb6e9aecde5d53945))
### Enhancements made
- Add `@jupyterlab/theme-dark-high-contrast-extension` [#7331](https://github.com/jupyter/notebook/pull/7331) ([@jtpio](https://github.com/jtpio))
### Bugs fixed
- Force notebook windowing mode to `defer` [#7335](https://github.com/jupyter/notebook/pull/7335) ([@jtpio](https://github.com/jtpio))
- Fix scrollbar always showing up by default [#7327](https://github.com/jupyter/notebook/pull/7327) ([@jtpio](https://github.com/jtpio))
### Contributors to this release
([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2024-04-12&to=2024-04-19&type=c))
[@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2024-04-12..2024-04-19&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2024-04-12..2024-04-19&type=Issues) | [@RRosio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3ARRosio+updated%3A2024-04-12..2024-04-19&type=Issues)
<!-- <END NEW CHANGELOG ENTRY> -->
## 7.2.0b0
([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.2.0-alpha.0...09bcd99e6dfffce92acc9a7f9d11a2a2122131c0))
### Maintenance and upkeep improvements
- Update to JupyterLab `4.2.0b1` [#7319](https://github.com/jupyter/notebook/pull/7319) ([@jtpio](https://github.com/jtpio))
- Update to JupyterLab 4.2.0b0 [#7312](https://github.com/jupyter/notebook/pull/7312) ([@jtpio](https://github.com/jtpio))
### Contributors to this release
([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2024-03-29&to=2024-04-12&type=c))
[@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2024-03-29..2024-04-12&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2024-03-29..2024-04-12&type=Issues) | [@krassowski](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Akrassowski+updated%3A2024-03-29..2024-04-12&type=Issues)
## 7.2.0a0
([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.1.2...80b582bce69e33e36e936af2ea981bcb22a4d285))
### Enhancements made
- Update to JupyterLab 4.2.0a2 [#7307](https://github.com/jupyter/notebook/pull/7307) ([@jtpio](https://github.com/jtpio))
### Maintenance and upkeep improvements
- Ignore links to GitHub user and organisation profiles [#7308](https://github.com/jupyter/notebook/pull/7308) ([@jtpio](https://github.com/jtpio))
### Contributors to this release
([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2024-03-14&to=2024-03-29&type=c))
[@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2024-03-14..2024-03-29&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2024-03-14..2024-03-29&type=Issues)
## 7.1.2
([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.1.1...ca41222a9c8d75356c6d67d3bd36e34d71cce2d8))
### Maintenance and upkeep improvements
- Update Release Scripts [#7295](https://github.com/jupyter/notebook/pull/7295) ([@blink1073](https://github.com/blink1073))
- Fix jupyterlab install command in the releaser hook [#7294](https://github.com/jupyter/notebook/pull/7294) ([@jtpio](https://github.com/jtpio))
- Update to JupyterLab 4.1.5 packages [#7291](https://github.com/jupyter/notebook/pull/7291) ([@jtpio](https://github.com/jtpio))
### Documentation improvements
- Add a section to use local dependencies [#7292](https://github.com/jupyter/notebook/pull/7292) ([@brichet](https://github.com/brichet))
### Contributors to this release
([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2024-02-26&to=2024-03-14&type=c))
[@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ablink1073+updated%3A2024-02-26..2024-03-14&type=Issues) | [@brichet](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Abrichet+updated%3A2024-02-26..2024-03-14&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2024-02-26..2024-03-14&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2024-02-26..2024-03-14&type=Issues)
## 7.1.1
([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.1.0...da7b8d400e96ceff0eec834badd891bc5d5f154d))
### Bugs fixed
- Grayout "Edit Notebook Metadata" for other file formats. [#7265](https://github.com/jupyter/notebook/pull/7265) ([@itsmevichu](https://github.com/itsmevichu))
### Maintenance and upkeep improvements
- Fix flaky mobile UI tests [#7278](https://github.com/jupyter/notebook/pull/7278) ([@jtpio](https://github.com/jtpio))
- Update to JupyterLab 4.1.2 packages [#7277](https://github.com/jupyter/notebook/pull/7277) ([@jtpio](https://github.com/jtpio))
- Ignore stackoverflow link [#7274](https://github.com/jupyter/notebook/pull/7274) ([@jtpio](https://github.com/jtpio))
- Expose `version_info` [#7273](https://github.com/jupyter/notebook/pull/7273) ([@jtpio](https://github.com/jtpio))
- Bump ip from 2.0.0 to 2.0.1 in /ui-tests [#7268](https://github.com/jupyter/notebook/pull/7268) ([@dependabot](https://github.com/dependabot))
- Bump ip from 2.0.0 to 2.0.1 [#7267](https://github.com/jupyter/notebook/pull/7267) ([@dependabot](https://github.com/dependabot))
### Contributors to this release
([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2024-02-13&to=2024-02-26&type=c))
[@dependabot](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Adependabot+updated%3A2024-02-13..2024-02-26&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2024-02-13..2024-02-26&type=Issues) | [@itsmevichu](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aitsmevichu+updated%3A2024-02-13..2024-02-26&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2024-02-13..2024-02-26&type=Issues)
## 7.1.0
([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.0.6...b8ec7e4a8eda70a8d7dca19799acd3e96e019160))
### Enhancements made
- Create a new notebook with a specific kernel from the new dropdown [#7255](https://github.com/jupyter/notebook/pull/7255) ([@jtpio](https://github.com/jtpio))
- Add the plugin manager [#7198](https://github.com/jupyter/notebook/pull/7198) ([@jtpio](https://github.com/jtpio))
- Fix toggle functionality for widgets. [#7178](https://github.com/jupyter/notebook/pull/7178) ([@haok1402](https://github.com/haok1402))
- Bump to JupyterLab 4.1.0a4 bis [#7172](https://github.com/jupyter/notebook/pull/7172) ([@brichet](https://github.com/brichet))
- Update to JupyterLab `4.1.0a3` [#7161](https://github.com/jupyter/notebook/pull/7161) ([@jtpio](https://github.com/jtpio))
- Added Lumino Plugin Description (#7008) [#7127](https://github.com/jupyter/notebook/pull/7127) ([@Dilip-Jain](https://github.com/Dilip-Jain))
- Added Edit Notebook Metadata Option (#6402) [#7099](https://github.com/jupyter/notebook/pull/7099) ([@Dilip-Jain](https://github.com/Dilip-Jain))
- Update to JupyterLab 4.1 [#7096](https://github.com/jupyter/notebook/pull/7096) ([@jtpio](https://github.com/jtpio))
- Add the JupyterLab resources plugin [#6968](https://github.com/jupyter/notebook/pull/6968) ([@jtpio](https://github.com/jtpio))
### Bugs fixed
- Fix spurious kernel selection dialog on notebook creation [#7258](https://github.com/jupyter/notebook/pull/7258) ([@jtpio](https://github.com/jtpio))
- Workaround for the file browser tracker focus issue [#7224](https://github.com/jupyter/notebook/pull/7224) ([@jtpio](https://github.com/jtpio))
### Maintenance and upkeep improvements
- Update to JupyterLab 4.1.1 [#7256](https://github.com/jupyter/notebook/pull/7256) ([@jtpio](https://github.com/jtpio))
- Follow JupyterLab minor versions [#7250](https://github.com/jupyter/notebook/pull/7250) ([@jtpio](https://github.com/jtpio))
- chore: update pre-commit hooks [#7237](https://github.com/jupyter/notebook/pull/7237) ([@pre-commit-ci](https://github.com/pre-commit-ci))
- Update to JupyterLab 4.1.0 final [#7234](https://github.com/jupyter/notebook/pull/7234) ([@jtpio](https://github.com/jtpio))
- Update to JupyterLab 4.1.0rc1 [#7230](https://github.com/jupyter/notebook/pull/7230) ([@jtpio](https://github.com/jtpio))
- Update to JupyterLab 4.1.0rc0 [#7227](https://github.com/jupyter/notebook/pull/7227) ([@jtpio](https://github.com/jtpio))
- Update to JupyterLab 4.1.0b2 [#7222](https://github.com/jupyter/notebook/pull/7222) ([@jtpio](https://github.com/jtpio))
- Fix `check_links` on CI [#7219](https://github.com/jupyter/notebook/pull/7219) ([@jtpio](https://github.com/jtpio))
- Bump the actions group with 1 update [#7218](https://github.com/jupyter/notebook/pull/7218) ([@dependabot](https://github.com/dependabot))
- Bump the actions group with 2 updates [#7207](https://github.com/jupyter/notebook/pull/7207) ([@dependabot](https://github.com/dependabot))
- chore: update pre-commit hooks [#7206](https://github.com/jupyter/notebook/pull/7206) ([@pre-commit-ci](https://github.com/pre-commit-ci))
- Add nbviewer.jupyter.org to the ignore list [#7197](https://github.com/jupyter/notebook/pull/7197) ([@jtpio](https://github.com/jtpio))
- Update to JupyterLab 4.1.0b0 [#7196](https://github.com/jupyter/notebook/pull/7196) ([@jtpio](https://github.com/jtpio))
- Update ruff config [#7190](https://github.com/jupyter/notebook/pull/7190) ([@blink1073](https://github.com/blink1073))
- Bump @babel/traverse from 7.23.0 to 7.23.6 [#7187](https://github.com/jupyter/notebook/pull/7187) ([@dependabot](https://github.com/dependabot))
- Bump actions/setup-python from 4 to 5 [#7180](https://github.com/jupyter/notebook/pull/7180) ([@dependabot](https://github.com/dependabot))
- Update publish-release workflow for PyPI trusted publisher [#7176](https://github.com/jupyter/notebook/pull/7176) ([@jtpio](https://github.com/jtpio))
- chore: update pre-commit hooks [#7174](https://github.com/jupyter/notebook/pull/7174) ([@pre-commit-ci](https://github.com/pre-commit-ci))
- Update `yarn.lock` [#7170](https://github.com/jupyter/notebook/pull/7170) ([@jtpio](https://github.com/jtpio))
- Bump axios from 1.5.1 to 1.6.2 [#7165](https://github.com/jupyter/notebook/pull/7165) ([@dependabot](https://github.com/dependabot))
- Bump dessant/lock-threads from 4 to 5 [#7159](https://github.com/jupyter/notebook/pull/7159) ([@dependabot](https://github.com/dependabot))
- Update ruff config and typing [#7145](https://github.com/jupyter/notebook/pull/7145) ([@blink1073](https://github.com/blink1073))
- chore: update pre-commit hooks [#7143](https://github.com/jupyter/notebook/pull/7143) ([@pre-commit-ci](https://github.com/pre-commit-ci))
- Clean up lint handling [#7142](https://github.com/jupyter/notebook/pull/7142) ([@blink1073](https://github.com/blink1073))
- Adopt ruff format [#7132](https://github.com/jupyter/notebook/pull/7132) ([@blink1073](https://github.com/blink1073))
- Fix python bumping to `minor` [#7131](https://github.com/jupyter/notebook/pull/7131) ([@jtpio](https://github.com/jtpio))
- Add Python 3.12 classifier [#7111](https://github.com/jupyter/notebook/pull/7111) ([@jtpio](https://github.com/jtpio))
- Remove viewport workaround in the UI tests [#6887](https://github.com/jupyter/notebook/pull/6887) ([@jtpio](https://github.com/jtpio))
### Documentation improvements
- Add documentation for updating `notebook` imports [#7244](https://github.com/jupyter/notebook/pull/7244) ([@jtpio](https://github.com/jtpio))
- Fix link in `CONTRIBUTING.md` [#7235](https://github.com/jupyter/notebook/pull/7235) ([@jtpio](https://github.com/jtpio))
- Add user facing changelog for 7.1 [#7232](https://github.com/jupyter/notebook/pull/7232) ([@jtpio](https://github.com/jtpio))
- Clarify README about supported versions (post v7 release) [#7193](https://github.com/jupyter/notebook/pull/7193) ([@akx](https://github.com/akx))
- Set `navigation_with_keys` to `False` [#7129](https://github.com/jupyter/notebook/pull/7129) ([@jtpio](https://github.com/jtpio))
- Updated ui-tests Configuration in Contributing.md [#7124](https://github.com/jupyter/notebook/pull/7124) ([@jayeshsingh9767](https://github.com/jayeshsingh9767))
### Contributors to this release
([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2023-10-17&to=2024-02-13&type=c))
[@akx](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aakx+updated%3A2023-10-17..2024-02-13&type=Issues) | [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ablink1073+updated%3A2023-10-17..2024-02-13&type=Issues) | [@brichet](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Abrichet+updated%3A2023-10-17..2024-02-13&type=Issues) | [@d5423197](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ad5423197+updated%3A2023-10-17..2024-02-13&type=Issues) | [@dependabot](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Adependabot+updated%3A2023-10-17..2024-02-13&type=Issues) | [@Dilip-Jain](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3ADilip-Jain+updated%3A2023-10-17..2024-02-13&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2023-10-17..2024-02-13&type=Issues) | [@haok1402](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ahaok1402+updated%3A2023-10-17..2024-02-13&type=Issues) | [@jayeshsingh9767](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajayeshsingh9767+updated%3A2023-10-17..2024-02-13&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2023-10-17..2024-02-13&type=Issues) | [@krassowski](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Akrassowski+updated%3A2023-10-17..2024-02-13&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Apre-commit-ci+updated%3A2023-10-17..2024-02-13&type=Issues) | [@Zsailer](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3AZsailer+updated%3A2023-10-17..2024-02-13&type=Issues)
## 7.1.0rc1
([Full Changelog](https://github.com/jupyter/notebook/compare/v7.1.0rc0...376a2f97c883e6e91f321d0a676e1ee9ff3b8d87))
### Maintenance and upkeep improvements
- Follow JupyterLab minor versions [#7250](https://github.com/jupyter/notebook/pull/7250) ([@jtpio](https://github.com/jtpio))
### Documentation improvements
- Add documentation for updating `notebook` imports [#7244](https://github.com/jupyter/notebook/pull/7244) ([@jtpio](https://github.com/jtpio))
### Contributors to this release
([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2024-02-07&to=2024-02-09&type=c))
[@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2024-02-07..2024-02-09&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2024-02-07..2024-02-09&type=Issues)
## 7.1.0rc0
([Full Changelog](https://github.com/jupyter/notebook/compare/v7.1.0b0...2d717f5896a1d4310baa2499c7e6197d1914201d))
### Enhancements made
- Added Edit Notebook Metadata Option (#6402) [#7099](https://github.com/jupyter/notebook/pull/7099) ([@Dilip-Jain](https://github.com/Dilip-Jain))
### Maintenance and upkeep improvements
- chore: update pre-commit hooks [#7237](https://github.com/jupyter/notebook/pull/7237) ([@pre-commit-ci](https://github.com/pre-commit-ci))
- Update to JupyterLab 4.1.0 final [#7234](https://github.com/jupyter/notebook/pull/7234) ([@jtpio](https://github.com/jtpio))
- Update to JupyterLab 4.1.0rc1 [#7230](https://github.com/jupyter/notebook/pull/7230) ([@jtpio](https://github.com/jtpio))
- Update to JupyterLab 4.1.0rc0 [#7227](https://github.com/jupyter/notebook/pull/7227) ([@jtpio](https://github.com/jtpio))
### Documentation improvements
- Fix link in `CONTRIBUTING.md` [#7235](https://github.com/jupyter/notebook/pull/7235) ([@jtpio](https://github.com/jtpio))
- Add user facing changelog for 7.1 [#7232](https://github.com/jupyter/notebook/pull/7232) ([@jtpio](https://github.com/jtpio))
### Contributors to this release
([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2024-01-26&to=2024-02-07&type=c))
[@Dilip-Jain](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3ADilip-Jain+updated%3A2024-01-26..2024-02-07&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2024-01-26..2024-02-07&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2024-01-26..2024-02-07&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Apre-commit-ci+updated%3A2024-01-26..2024-02-07&type=Issues)
## 7.1.0b0
([Full Changelog](https://github.com/jupyter/notebook/compare/v7.1.0a2...5d265b90ed5f097af4ca22d283ecdc705229ff92))
### Bugs fixed
- Workaround for the file browser tracker focus issue [#7224](https://github.com/jupyter/notebook/pull/7224) ([@jtpio](https://github.com/jtpio))
### Maintenance and upkeep improvements
- Update to JupyterLab 4.1.0b2 [#7222](https://github.com/jupyter/notebook/pull/7222) ([@jtpio](https://github.com/jtpio))
- Fix `check_links` on CI [#7219](https://github.com/jupyter/notebook/pull/7219) ([@jtpio](https://github.com/jtpio))
- Bump the actions group with 1 update [#7218](https://github.com/jupyter/notebook/pull/7218) ([@dependabot](https://github.com/dependabot))
- Bump the actions group with 2 updates [#7207](https://github.com/jupyter/notebook/pull/7207) ([@dependabot](https://github.com/dependabot))
- chore: update pre-commit hooks [#7206](https://github.com/jupyter/notebook/pull/7206) ([@pre-commit-ci](https://github.com/pre-commit-ci))
### Contributors to this release
([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2023-12-27&to=2024-01-26&type=c))
[@dependabot](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Adependabot+updated%3A2023-12-27..2024-01-26&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2023-12-27..2024-01-26&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2023-12-27..2024-01-26&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Apre-commit-ci+updated%3A2023-12-27..2024-01-26&type=Issues) | [@Zsailer](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3AZsailer+updated%3A2023-12-27..2024-01-26&type=Issues)
## 7.1.0a2
([Full Changelog](https://github.com/jupyter/notebook/compare/v7.1.0a1...251e0e360603b6e63b280b3bd04a5406f7da28da))
### Enhancements made
- Add the plugin manager [#7198](https://github.com/jupyter/notebook/pull/7198) ([@jtpio](https://github.com/jtpio))
- Fix toggle functionality for widgets. [#7178](https://github.com/jupyter/notebook/pull/7178) ([@haok1402](https://github.com/haok1402))
### Maintenance and upkeep improvements
- Add nbviewer.jupyter.org to the ignore list [#7197](https://github.com/jupyter/notebook/pull/7197) ([@jtpio](https://github.com/jtpio))
- Update to JupyterLab 4.1.0b0 [#7196](https://github.com/jupyter/notebook/pull/7196) ([@jtpio](https://github.com/jtpio))
- Update ruff config [#7190](https://github.com/jupyter/notebook/pull/7190) ([@blink1073](https://github.com/blink1073))
- Bump @babel/traverse from 7.23.0 to 7.23.6 [#7187](https://github.com/jupyter/notebook/pull/7187) ([@dependabot](https://github.com/dependabot))
- Bump actions/setup-python from 4 to 5 [#7180](https://github.com/jupyter/notebook/pull/7180) ([@dependabot](https://github.com/dependabot))
- Update publish-release workflow for PyPI trusted publisher [#7176](https://github.com/jupyter/notebook/pull/7176) ([@jtpio](https://github.com/jtpio))
- chore: update pre-commit hooks [#7174](https://github.com/jupyter/notebook/pull/7174) ([@pre-commit-ci](https://github.com/pre-commit-ci))
- Remove viewport workaround in the UI tests [#6887](https://github.com/jupyter/notebook/pull/6887) ([@jtpio](https://github.com/jtpio))
### Documentation improvements
- Clarify README about supported versions (post v7 release) [#7193](https://github.com/jupyter/notebook/pull/7193) ([@akx](https://github.com/akx))
### Contributors to this release
([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2023-12-04&to=2023-12-27&type=c))
[@akx](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aakx+updated%3A2023-12-04..2023-12-27&type=Issues) | [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ablink1073+updated%3A2023-12-04..2023-12-27&type=Issues) | [@dependabot](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Adependabot+updated%3A2023-12-04..2023-12-27&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2023-12-04..2023-12-27&type=Issues) | [@haok1402](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ahaok1402+updated%3A2023-12-04..2023-12-27&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2023-12-04..2023-12-27&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Apre-commit-ci+updated%3A2023-12-04..2023-12-27&type=Issues)
## 7.1.0a1
([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.1.0-alpha.0...a74cd91871fcc6037d384fe59af8986557e783e5))
### Enhancements made
- Bump to JupyterLab 4.1.0a4 bis [#7172](https://github.com/jupyter/notebook/pull/7172) ([@brichet](https://github.com/brichet))
- Update to JupyterLab `4.1.0a3` [#7161](https://github.com/jupyter/notebook/pull/7161) ([@jtpio](https://github.com/jtpio))
- Add the JupyterLab resources plugin [#6968](https://github.com/jupyter/notebook/pull/6968) ([@jtpio](https://github.com/jtpio))
### Maintenance and upkeep improvements
- Update `yarn.lock` [#7170](https://github.com/jupyter/notebook/pull/7170) ([@jtpio](https://github.com/jtpio))
- Bump axios from 1.5.1 to 1.6.2 [#7165](https://github.com/jupyter/notebook/pull/7165) ([@dependabot](https://github.com/dependabot))
- Bump dessant/lock-threads from 4 to 5 [#7159](https://github.com/jupyter/notebook/pull/7159) ([@dependabot](https://github.com/dependabot))
- Update ruff config and typing [#7145](https://github.com/jupyter/notebook/pull/7145) ([@blink1073](https://github.com/blink1073))
- chore: update pre-commit hooks [#7143](https://github.com/jupyter/notebook/pull/7143) ([@pre-commit-ci](https://github.com/pre-commit-ci))
- Clean up lint handling [#7142](https://github.com/jupyter/notebook/pull/7142) ([@blink1073](https://github.com/blink1073))
- Adopt ruff format [#7132](https://github.com/jupyter/notebook/pull/7132) ([@blink1073](https://github.com/blink1073))
### Contributors to this release
([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2023-10-27&to=2023-12-04&type=c))
[@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ablink1073+updated%3A2023-10-27..2023-12-04&type=Issues) | [@brichet](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Abrichet+updated%3A2023-10-27..2023-12-04&type=Issues) | [@dependabot](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Adependabot+updated%3A2023-10-27..2023-12-04&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2023-10-27..2023-12-04&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2023-10-27..2023-12-04&type=Issues) | [@krassowski](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Akrassowski+updated%3A2023-10-27..2023-12-04&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Apre-commit-ci+updated%3A2023-10-27..2023-12-04&type=Issues)
## 7.1.0a0
([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.0.6...0cd6104b926a398b419f2433538cef437592796f))
### Enhancements made
- Added Lumino Plugin Description (#7008) [#7127](https://github.com/jupyter/notebook/pull/7127) ([@Dilip-Jain](https://github.com/Dilip-Jain))
- Update to JupyterLab 4.1 [#7096](https://github.com/jupyter/notebook/pull/7096) ([@jtpio](https://github.com/jtpio))
### Maintenance and upkeep improvements
- Fix python bumping to `minor` [#7131](https://github.com/jupyter/notebook/pull/7131) ([@jtpio](https://github.com/jtpio))
- Add Python 3.12 classifier [#7111](https://github.com/jupyter/notebook/pull/7111) ([@jtpio](https://github.com/jtpio))
### Documentation improvements
- Set `navigation_with_keys` to `False` [#7129](https://github.com/jupyter/notebook/pull/7129) ([@jtpio](https://github.com/jtpio))
- Updated ui-tests Configuration in Contributing.md [#7124](https://github.com/jupyter/notebook/pull/7124) ([@jayeshsingh9767](https://github.com/jayeshsingh9767))
### Contributors to this release
([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2023-10-17&to=2023-10-27&type=c))
[@Dilip-Jain](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3ADilip-Jain+updated%3A2023-10-17..2023-10-27&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2023-10-17..2023-10-27&type=Issues) | [@jayeshsingh9767](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajayeshsingh9767+updated%3A2023-10-17..2023-10-27&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2023-10-17..2023-10-27&type=Issues)
## v7.0
## 7.0.6
([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/app@7.0.5...c62caffb02856737870cbc79a2cdb43b3e89c363))
### Bugs fixed
- Updated fav-icon Base URL from JupyterLab PageConfig. [#7109](https://github.com/jupyter/notebook/pull/7109) ([@jayeshsingh9767](https://github.com/jayeshsingh9767))
### Maintenance and upkeep improvements
- Fix typings [#7110](https://github.com/jupyter/notebook/pull/7110) ([@jtpio](https://github.com/jtpio))
- Bump postcss from 8.4.27 to 8.4.31 [#7089](https://github.com/jupyter/notebook/pull/7089) ([@dependabot](https://github.com/dependabot))
### Contributors to this release
([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2023-10-12&to=2023-10-17&type=c))
[@dependabot](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Adependabot+updated%3A2023-10-12..2023-10-17&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2023-10-12..2023-10-17&type=Issues) | [@jayeshsingh9767](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajayeshsingh9767+updated%3A2023-10-12..2023-10-17&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2023-10-12..2023-10-17&type=Issues)
## 7.0.5
([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/app@7.0.4...839193d07f0780ded6f559892517f061f3776b02))
@ -48,8 +474,6 @@ Use `pip install pip --upgrade` to upgrade pip. Check pip version with
[@dependabot](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Adependabot+updated%3A2023-09-20..2023-10-12&type=Issues) | [@diogoteles08](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Adiogoteles08+updated%3A2023-09-20..2023-10-12&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2023-09-20..2023-10-12&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2023-09-20..2023-10-12&type=Issues) | [@krassowski](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Akrassowski+updated%3A2023-09-20..2023-10-12&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Apre-commit-ci+updated%3A2023-09-20..2023-10-12&type=Issues)
<!-- <END NEW CHANGELOG ENTRY> -->
## 7.0.4
([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/app@7.0.3...0e62386fc71ed4bd424c989f9d5493ca346f1d9a))
@ -437,7 +861,7 @@ Check out the [JupyterLab `4.0.0a37` release notes](https://github.com/jupyterla
### Maintenance and upkeep improvements
- Replace the use of `toArray` by `Array.from` [#6775](https://github.com/jupyter/notebook/pull/6775) ([@tarunsamanta2k20](https://github.com/tarunsamanta2k20))
- Replace the use of `toArray` by `Array.from` [#6775](https://github.com/jupyter/notebook/pull/6775) (`@tarunsamanta2k20`)
### Contributors to this release

@ -66,6 +66,40 @@ Then start Jupyter Notebook with:
jupyter notebook
```
### Local changes in Notebook dependencies
The development installation described above fetches JavaScript dependencies from [npmjs](https://www.npmjs.com/),
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 use local JavaScript packages in your build of
Notebook, acting as a local package repository.
- Install yalc globally in you environment:
`npm install -g yalc`
- Publish you dependency package:\
`yalc publish`, from the package root directory.\
For instance, if you have 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 monerepo, 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:
@ -79,6 +113,12 @@ There are also end to end tests to cover higher level user interactions, located
```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
@ -113,7 +153,7 @@ Running the command will open a browser tab by default with a graph that looks l
To learn more about Lerna caching:
- https://lerna.js.org/docs/features/cache-tasks
- https://nx.dev/core-features/cache-task-results
- https://nx.dev/features/cache-task-results
### Updating reference snapshots

@ -12,13 +12,12 @@ computing.
## Maintained versions
We maintain the **two most recently released major versions of Jupyter Notebook**, Notebook v5 and Classic Notebook v6. After Notebook v7.0 is released, we will no longer maintain Notebook v5. All Notebook v5 users are strongly advised to upgrade to Classic Notebook v6 as soon as possible.
We maintain the **two most recently released major versions of Jupyter Notebook**,
Classic Notebook v6 and Notebook v7. Notebook v5 is no longer maintained.
All Notebook v5 users are strongly advised to upgrade to Classic Notebook v6 as soon as possible.
The Jupyter Notebook project is currently undertaking a transition to a more modern code base built from the ground-up using JupyterLab components and extensions.
There is new stream of work which was submitted and then accepted as a Jupyter Enhancement Proposal (JEP) as part of the next version (v7): https://jupyter.org/enhancement-proposals/79-notebook-v7/notebook-v7.html
There is also a plan to continue maintaining Notebook v6 with bug and security fixes only, to ease the transition to Notebook v7: https://github.com/jupyter/notebook-team-compass/issues/5#issuecomment-1085254000
Upgrading to Notebook v7 may require more work, if you use custom extensions, as extensions written
for Notebook v5 or Classic Notebook v6 are not compatible with Notebook v7.
### Notebook v7
@ -33,9 +32,8 @@ To learn more about Notebook v7: https://jupyter.org/enhancement-proposals/79-no
### Classic Notebook v6
Maintenance and security-related issues are now being addressed in the [`6.4.x`](https://github.com/jupyter/notebook/tree/6.4.x) branch.
A `6.5.x` branch will be soon created and will depend on [`nbclassic`](https://github.com/jupyter/nbclassic) for the HTML/JavaScript/CSS assets.
Maintenance and security-related issues [only](https://github.com/jupyter/notebook-team-compass/issues/5#issuecomment-1085254000) are now being addressed in the [`6.5.x`](https://github.com/jupyter/notebook/tree/6.5.x) branch.
It depends on [`nbclassic`](https://github.com/jupyter/nbclassic) for the HTML/JavaScript/CSS assets.
New features and continuous improvement is now focused on Notebook v7 (see section above).

@ -33,7 +33,9 @@ async function loadComponent(url, scope) {
async function createModule(scope, module) {
try {
const factory = await window._JUPYTERLAB[scope].get(module);
return factory();
const instance = factory();
instance.__scope__ = scope;
return instance;
} catch (e) {
console.warn(
`Failed to create module: package: ${scope}; module: ${module}`
@ -79,6 +81,7 @@ async function main() {
// populate the list of disabled extensions
const disabled = [];
const availablePlugins = [];
/**
* Iterate over active plugins in an extension.
@ -98,7 +101,18 @@ async function main() {
let plugins = Array.isArray(exports) ? exports : [exports];
for (let plugin of plugins) {
if (PageConfig.Extension.isDisabled(plugin.id)) {
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;
}
@ -200,7 +214,7 @@ async function main() {
PageConfig.setOption('allPlugins', '{{{ json notebook_plugins }}}');
const NotebookApp = require('@jupyter-notebook/application').NotebookApp;
const app = new NotebookApp({ mimeExtensions });
const app = new NotebookApp({ mimeExtensions, availablePlugins });
app.registerPluginModules(mods);

@ -1,6 +1,6 @@
{
"name": "@jupyter-notebook/app",
"version": "7.0.5",
"version": "7.2.0-beta.1",
"private": true,
"scripts": {
"build": "webpack",
@ -10,173 +10,182 @@
"watch": "webpack --config ./webpack.config.watch.js"
},
"resolutions": {
"@codemirror/state": "~6.2.1",
"@codemirror/view": "~6.15.3",
"@jupyter-notebook/application": "~7.0.5",
"@jupyter-notebook/application-extension": "~7.0.5",
"@jupyter-notebook/console-extension": "~7.0.5",
"@jupyter-notebook/docmanager-extension": "~7.0.5",
"@jupyter-notebook/documentsearch-extension": "~7.0.5",
"@jupyter-notebook/help-extension": "~7.0.5",
"@jupyter-notebook/notebook-extension": "~7.0.5",
"@jupyter-notebook/terminal-extension": "~7.0.5",
"@jupyter-notebook/tree": "~7.0.5",
"@jupyter-notebook/tree-extension": "~7.0.5",
"@jupyter-notebook/ui-components": "~7.0.5",
"@jupyter/ydoc": "~1.0.2",
"@jupyterlab/application": "~4.0.7",
"@jupyterlab/application-extension": "~4.0.7",
"@jupyterlab/apputils": "~4.1.7",
"@jupyterlab/apputils-extension": "~4.0.7",
"@jupyterlab/attachments": "~4.0.7",
"@jupyterlab/cell-toolbar": "~4.0.7",
"@jupyterlab/cell-toolbar-extension": "~4.0.7",
"@jupyterlab/celltags-extension": "~4.0.7",
"@jupyterlab/codeeditor": "~4.0.7",
"@jupyterlab/codemirror": "~4.0.7",
"@jupyterlab/codemirror-extension": "~4.0.7",
"@jupyterlab/completer": "~4.0.7",
"@jupyterlab/completer-extension": "~4.0.7",
"@jupyterlab/console": "~4.0.7",
"@jupyterlab/console-extension": "~4.0.7",
"@jupyterlab/coreutils": "~6.0.7",
"@jupyterlab/csvviewer-extension": "~4.0.7",
"@jupyterlab/debugger": "~4.0.7",
"@jupyterlab/debugger-extension": "~4.0.7",
"@jupyterlab/docmanager": "~4.0.7",
"@jupyterlab/docmanager-extension": "~4.0.7",
"@jupyterlab/documentsearch": "~4.0.7",
"@jupyterlab/documentsearch-extension": "~4.0.7",
"@jupyterlab/extensionmanager": "~4.0.7",
"@jupyterlab/extensionmanager-extension": "~4.0.7",
"@jupyterlab/filebrowser": "~4.0.7",
"@jupyterlab/filebrowser-extension": "~4.0.7",
"@jupyterlab/fileeditor": "~4.0.7",
"@jupyterlab/fileeditor-extension": "~4.0.7",
"@jupyterlab/htmlviewer": "~4.0.7",
"@jupyterlab/htmlviewer-extension": "~4.0.7",
"@jupyterlab/hub-extension": "~4.0.7",
"@jupyterlab/imageviewer": "~4.0.7",
"@jupyterlab/imageviewer-extension": "~4.0.7",
"@jupyterlab/javascript-extension": "~4.0.7",
"@jupyterlab/json-extension": "~4.0.7",
"@jupyterlab/lsp": "~4.0.7",
"@jupyterlab/lsp-extension": "~4.0.7",
"@jupyterlab/mainmenu": "~4.0.7",
"@jupyterlab/mainmenu-extension": "~4.0.7",
"@jupyterlab/markdownviewer": "~4.0.7",
"@jupyterlab/markdownviewer-extension": "~4.0.7",
"@jupyterlab/markedparser-extension": "~4.0.7",
"@jupyterlab/mathjax-extension": "~4.0.7",
"@jupyterlab/metadataform": "~4.0.7",
"@jupyterlab/metadataform-extension": "~4.0.7",
"@jupyterlab/notebook": "~4.0.7",
"@jupyterlab/notebook-extension": "~4.0.7",
"@jupyterlab/observables": "~5.0.7",
"@jupyterlab/outputarea": "~4.0.7",
"@jupyterlab/pdf-extension": "~4.0.7",
"@jupyterlab/rendermime": "~4.0.7",
"@jupyterlab/rendermime-interfaces": "~3.8.7",
"@jupyterlab/running-extension": "~4.0.7",
"@jupyterlab/services": "~7.0.7",
"@jupyterlab/settingeditor": "~4.0.7",
"@jupyterlab/settingeditor-extension": "~4.0.7",
"@jupyterlab/settingregistry": "~4.0.7",
"@jupyterlab/shortcuts-extension": "~4.0.7",
"@jupyterlab/statedb": "~4.0.7",
"@jupyterlab/statusbar": "~4.0.7",
"@jupyterlab/terminal": "~4.0.7",
"@jupyterlab/terminal-extension": "~4.0.7",
"@jupyterlab/theme-dark-extension": "~4.0.7",
"@jupyterlab/theme-light-extension": "~4.0.7",
"@jupyterlab/toc-extension": "~6.0.7",
"@jupyterlab/tooltip": "~4.0.7",
"@jupyterlab/tooltip-extension": "~4.0.7",
"@jupyterlab/translation": "~4.0.7",
"@jupyterlab/translation-extension": "~4.0.7",
"@jupyterlab/ui-components": "~4.0.7",
"@jupyterlab/ui-components-extension": "~4.0.7",
"@jupyterlab/vega5-extension": "~4.0.7",
"@lezer/common": "~1.0.3",
"@lezer/highlight": "~1.1.6",
"@codemirror/state": "~6.4.1",
"@codemirror/view": "~6.26.1",
"@jupyter-notebook/application": "~7.2.0-beta.1",
"@jupyter-notebook/application-extension": "~7.2.0-beta.1",
"@jupyter-notebook/console-extension": "~7.2.0-beta.1",
"@jupyter-notebook/docmanager-extension": "~7.2.0-beta.1",
"@jupyter-notebook/documentsearch-extension": "~7.2.0-beta.1",
"@jupyter-notebook/help-extension": "~7.2.0-beta.1",
"@jupyter-notebook/notebook-extension": "~7.2.0-beta.1",
"@jupyter-notebook/terminal-extension": "~7.2.0-beta.1",
"@jupyter-notebook/tree": "~7.2.0-beta.1",
"@jupyter-notebook/tree-extension": "~7.2.0-beta.1",
"@jupyter-notebook/ui-components": "~7.2.0-beta.1",
"@jupyter/ydoc": "~2.0.1",
"@jupyterlab/application": "~4.2.0-beta.1",
"@jupyterlab/application-extension": "~4.2.0-beta.1",
"@jupyterlab/apputils": "~4.3.0-beta.1",
"@jupyterlab/apputils-extension": "~4.2.0-beta.1",
"@jupyterlab/attachments": "~4.2.0-beta.1",
"@jupyterlab/cell-toolbar": "~4.2.0-beta.1",
"@jupyterlab/cell-toolbar-extension": "~4.2.0-beta.1",
"@jupyterlab/celltags-extension": "~4.2.0-beta.1",
"@jupyterlab/codeeditor": "~4.2.0-beta.1",
"@jupyterlab/codemirror": "~4.2.0-beta.1",
"@jupyterlab/codemirror-extension": "~4.2.0-beta.1",
"@jupyterlab/completer": "~4.2.0-beta.1",
"@jupyterlab/completer-extension": "~4.2.0-beta.1",
"@jupyterlab/console": "~4.2.0-beta.1",
"@jupyterlab/console-extension": "~4.2.0-beta.1",
"@jupyterlab/coreutils": "~6.2.0-beta.1",
"@jupyterlab/csvviewer-extension": "~4.2.0-beta.1",
"@jupyterlab/debugger": "~4.2.0-beta.1",
"@jupyterlab/debugger-extension": "~4.2.0-beta.1",
"@jupyterlab/docmanager": "~4.2.0-beta.1",
"@jupyterlab/docmanager-extension": "~4.2.0-beta.1",
"@jupyterlab/documentsearch": "~4.2.0-beta.1",
"@jupyterlab/documentsearch-extension": "~4.2.0-beta.1",
"@jupyterlab/extensionmanager": "~4.2.0-beta.1",
"@jupyterlab/extensionmanager-extension": "~4.2.0-beta.1",
"@jupyterlab/filebrowser": "~4.2.0-beta.1",
"@jupyterlab/filebrowser-extension": "~4.2.0-beta.1",
"@jupyterlab/fileeditor": "~4.2.0-beta.1",
"@jupyterlab/fileeditor-extension": "~4.2.0-beta.1",
"@jupyterlab/help-extension": "~4.2.0-beta.1",
"@jupyterlab/htmlviewer": "~4.2.0-beta.1",
"@jupyterlab/htmlviewer-extension": "~4.2.0-beta.1",
"@jupyterlab/hub-extension": "~4.2.0-beta.1",
"@jupyterlab/imageviewer": "~4.2.0-beta.1",
"@jupyterlab/imageviewer-extension": "~4.2.0-beta.1",
"@jupyterlab/javascript-extension": "~4.2.0-beta.1",
"@jupyterlab/json-extension": "~4.2.0-beta.1",
"@jupyterlab/lsp": "~4.2.0-beta.1",
"@jupyterlab/lsp-extension": "~4.2.0-beta.1",
"@jupyterlab/mainmenu": "~4.2.0-beta.1",
"@jupyterlab/mainmenu-extension": "~4.2.0-beta.1",
"@jupyterlab/markdownviewer": "~4.2.0-beta.1",
"@jupyterlab/markdownviewer-extension": "~4.2.0-beta.1",
"@jupyterlab/markedparser-extension": "~4.2.0-beta.1",
"@jupyterlab/mathjax-extension": "~4.2.0-beta.1",
"@jupyterlab/mermaid": "~4.2.0-beta.1",
"@jupyterlab/mermaid-extension": "~4.2.0-beta.1",
"@jupyterlab/metadataform": "~4.2.0-beta.1",
"@jupyterlab/metadataform-extension": "~4.2.0-beta.1",
"@jupyterlab/notebook": "~4.2.0-beta.1",
"@jupyterlab/notebook-extension": "~4.2.0-beta.1",
"@jupyterlab/observables": "~5.2.0-beta.1",
"@jupyterlab/outputarea": "~4.2.0-beta.1",
"@jupyterlab/pdf-extension": "~4.2.0-beta.1",
"@jupyterlab/pluginmanager-extension": "~4.2.0-beta.1",
"@jupyterlab/rendermime": "~4.2.0-beta.1",
"@jupyterlab/rendermime-interfaces": "~3.10.0-beta.1",
"@jupyterlab/running-extension": "~4.2.0-beta.1",
"@jupyterlab/services": "~7.2.0-beta.1",
"@jupyterlab/settingeditor": "~4.2.0-beta.1",
"@jupyterlab/settingeditor-extension": "~4.2.0-beta.1",
"@jupyterlab/settingregistry": "~4.2.0-beta.1",
"@jupyterlab/shortcuts-extension": "~5.0.0-beta.1",
"@jupyterlab/statedb": "~4.2.0-beta.1",
"@jupyterlab/statusbar": "~4.2.0-beta.1",
"@jupyterlab/terminal": "~4.2.0-beta.1",
"@jupyterlab/terminal-extension": "~4.2.0-beta.1",
"@jupyterlab/theme-dark-extension": "~4.2.0-beta.1",
"@jupyterlab/theme-dark-high-contrast-extension": "~4.2.0-beta.1",
"@jupyterlab/theme-light-extension": "~4.2.0-beta.1",
"@jupyterlab/toc-extension": "~6.2.0-beta.1",
"@jupyterlab/tooltip": "~4.2.0-beta.1",
"@jupyterlab/tooltip-extension": "~4.2.0-beta.1",
"@jupyterlab/translation": "~4.2.0-beta.1",
"@jupyterlab/translation-extension": "~4.2.0-beta.1",
"@jupyterlab/ui-components": "~4.2.0-beta.1",
"@jupyterlab/ui-components-extension": "~4.2.0-beta.1",
"@jupyterlab/vega5-extension": "~4.2.0-beta.1",
"@lezer/common": "~1.2.1",
"@lezer/highlight": "~1.2.0",
"@lumino/algorithm": "~2.0.1",
"@lumino/application": "~2.2.1",
"@lumino/commands": "~2.1.3",
"@lumino/application": "~2.3.1",
"@lumino/commands": "~2.3.0",
"@lumino/coreutils": "~2.1.2",
"@lumino/disposable": "~2.1.2",
"@lumino/domutils": "~2.0.1",
"@lumino/dragdrop": "~2.1.3",
"@lumino/dragdrop": "~2.1.4",
"@lumino/messaging": "~2.0.1",
"@lumino/properties": "~2.0.1",
"@lumino/signaling": "~2.1.2",
"@lumino/virtualdom": "~2.0.1",
"@lumino/widgets": "~2.3.0",
"@lumino/widgets": "~2.3.2",
"react": "~18.2.0",
"react-dom": "~18.2.0",
"yjs": "~13.6.7"
"yjs": "~13.6.8"
},
"dependencies": {
"@jupyter-notebook/application": "^7.0.5",
"@jupyter-notebook/application-extension": "^7.0.5",
"@jupyter-notebook/console-extension": "^7.0.5",
"@jupyter-notebook/docmanager-extension": "^7.0.5",
"@jupyter-notebook/documentsearch-extension": "^7.0.5",
"@jupyter-notebook/help-extension": "^7.0.5",
"@jupyter-notebook/notebook-extension": "^7.0.5",
"@jupyter-notebook/terminal-extension": "^7.0.5",
"@jupyter-notebook/tree": "^7.0.5",
"@jupyter-notebook/tree-extension": "^7.0.5",
"@jupyter-notebook/ui-components": "^7.0.5",
"@jupyterlab/application-extension": "^4.0.7",
"@jupyterlab/apputils-extension": "^4.0.7",
"@jupyterlab/attachments": "^4.0.7",
"@jupyterlab/cell-toolbar-extension": "^4.0.7",
"@jupyterlab/celltags-extension": "^4.0.7",
"@jupyterlab/codemirror": "^4.0.7",
"@jupyterlab/codemirror-extension": "^4.0.7",
"@jupyterlab/completer-extension": "^4.0.7",
"@jupyterlab/console-extension": "^4.0.7",
"@jupyterlab/coreutils": "^6.0.7",
"@jupyterlab/csvviewer-extension": "^4.0.7",
"@jupyterlab/debugger-extension": "^4.0.7",
"@jupyterlab/docmanager-extension": "^4.0.7",
"@jupyterlab/documentsearch-extension": "^4.0.7",
"@jupyterlab/extensionmanager-extension": "^4.0.7",
"@jupyterlab/filebrowser-extension": "^4.0.7",
"@jupyterlab/fileeditor-extension": "^4.0.7",
"@jupyterlab/htmlviewer-extension": "^4.0.7",
"@jupyterlab/hub-extension": "^4.0.7",
"@jupyterlab/imageviewer-extension": "^4.0.7",
"@jupyterlab/javascript-extension": "^4.0.7",
"@jupyterlab/json-extension": "^4.0.7",
"@jupyterlab/lsp": "^4.0.7",
"@jupyterlab/lsp-extension": "^4.0.7",
"@jupyterlab/mainmenu-extension": "^4.0.7",
"@jupyterlab/markdownviewer-extension": "^4.0.7",
"@jupyterlab/markedparser-extension": "^4.0.7",
"@jupyterlab/mathjax-extension": "^4.0.7",
"@jupyterlab/metadataform-extension": "^4.0.7",
"@jupyterlab/notebook-extension": "^4.0.7",
"@jupyterlab/pdf-extension": "^4.0.7",
"@jupyterlab/running-extension": "^4.0.7",
"@jupyterlab/settingeditor": "^4.0.7",
"@jupyterlab/settingeditor-extension": "^4.0.7",
"@jupyterlab/shortcuts-extension": "^4.0.7",
"@jupyterlab/terminal-extension": "^4.0.7",
"@jupyterlab/theme-dark-extension": "^4.0.7",
"@jupyterlab/theme-light-extension": "^4.0.7",
"@jupyterlab/toc-extension": "^6.0.7",
"@jupyterlab/tooltip-extension": "^4.0.7",
"@jupyterlab/translation-extension": "^4.0.7",
"@jupyterlab/ui-components-extension": "^4.0.7",
"@jupyterlab/vega5-extension": "^4.0.7",
"@jupyter-notebook/application": "^7.2.0-beta.1",
"@jupyter-notebook/application-extension": "^7.2.0-beta.1",
"@jupyter-notebook/console-extension": "^7.2.0-beta.1",
"@jupyter-notebook/docmanager-extension": "^7.2.0-beta.1",
"@jupyter-notebook/documentsearch-extension": "^7.2.0-beta.1",
"@jupyter-notebook/help-extension": "^7.2.0-beta.1",
"@jupyter-notebook/notebook-extension": "^7.2.0-beta.1",
"@jupyter-notebook/terminal-extension": "^7.2.0-beta.1",
"@jupyter-notebook/tree": "^7.2.0-beta.1",
"@jupyter-notebook/tree-extension": "^7.2.0-beta.1",
"@jupyter-notebook/ui-components": "^7.2.0-beta.1",
"@jupyterlab/application-extension": "~4.2.0-beta.1",
"@jupyterlab/apputils-extension": "~4.2.0-beta.1",
"@jupyterlab/attachments": "~4.2.0-beta.1",
"@jupyterlab/cell-toolbar-extension": "~4.2.0-beta.1",
"@jupyterlab/celltags-extension": "~4.2.0-beta.1",
"@jupyterlab/codemirror": "~4.2.0-beta.1",
"@jupyterlab/codemirror-extension": "~4.2.0-beta.1",
"@jupyterlab/completer-extension": "~4.2.0-beta.1",
"@jupyterlab/console-extension": "~4.2.0-beta.1",
"@jupyterlab/coreutils": "~6.2.0-beta.1",
"@jupyterlab/csvviewer-extension": "~4.2.0-beta.1",
"@jupyterlab/debugger-extension": "~4.2.0-beta.1",
"@jupyterlab/docmanager-extension": "~4.2.0-beta.1",
"@jupyterlab/documentsearch-extension": "~4.2.0-beta.1",
"@jupyterlab/extensionmanager-extension": "~4.2.0-beta.1",
"@jupyterlab/filebrowser-extension": "~4.2.0-beta.1",
"@jupyterlab/fileeditor-extension": "~4.2.0-beta.1",
"@jupyterlab/help-extension": "~4.2.0-beta.1",
"@jupyterlab/htmlviewer-extension": "~4.2.0-beta.1",
"@jupyterlab/hub-extension": "~4.2.0-beta.1",
"@jupyterlab/imageviewer-extension": "~4.2.0-beta.1",
"@jupyterlab/javascript-extension": "~4.2.0-beta.1",
"@jupyterlab/json-extension": "~4.2.0-beta.1",
"@jupyterlab/lsp": "~4.2.0-beta.1",
"@jupyterlab/lsp-extension": "~4.2.0-beta.1",
"@jupyterlab/mainmenu-extension": "~4.2.0-beta.1",
"@jupyterlab/markdownviewer-extension": "~4.2.0-beta.1",
"@jupyterlab/markedparser-extension": "~4.2.0-beta.1",
"@jupyterlab/mathjax-extension": "~4.2.0-beta.1",
"@jupyterlab/mermaid-extension": "~4.2.0-beta.1",
"@jupyterlab/metadataform-extension": "~4.2.0-beta.1",
"@jupyterlab/notebook-extension": "~4.2.0-beta.1",
"@jupyterlab/pdf-extension": "~4.2.0-beta.1",
"@jupyterlab/pluginmanager-extension": "~4.2.0-beta.1",
"@jupyterlab/running-extension": "~4.2.0-beta.1",
"@jupyterlab/settingeditor": "~4.2.0-beta.1",
"@jupyterlab/settingeditor-extension": "~4.2.0-beta.1",
"@jupyterlab/shortcuts-extension": "~5.0.0-beta.1",
"@jupyterlab/terminal-extension": "~4.2.0-beta.1",
"@jupyterlab/theme-dark-extension": "~4.2.0-beta.1",
"@jupyterlab/theme-dark-high-contrast-extension": "~4.2.0-beta.1",
"@jupyterlab/theme-light-extension": "~4.2.0-beta.1",
"@jupyterlab/toc-extension": "~6.2.0-beta.1",
"@jupyterlab/tooltip-extension": "~4.2.0-beta.1",
"@jupyterlab/translation-extension": "~4.2.0-beta.1",
"@jupyterlab/ui-components-extension": "~4.2.0-beta.1",
"@jupyterlab/vega5-extension": "~4.2.0-beta.1",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"yjs": "^13.5.40"
},
"devDependencies": {
"@jupyterlab/builder": "^4.0.7",
"@jupyterlab/buildutils": "^4.0.7",
"@jupyterlab/builder": "~4.2.0-beta.1",
"@jupyterlab/buildutils": "~4.2.0-beta.1",
"@types/rimraf": "^3.0.2",
"css-loader": "~5.0.1",
"extra-watch-webpack-plugin": "^1.0.3",
@ -234,9 +243,13 @@
"@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",
@ -259,23 +272,32 @@
"@jupyterlab/fileeditor-extension": [
"@jupyterlab/fileeditor-extension:plugin"
],
"@jupyterlab/help-extension": [
"@jupyterlab/help-extension:resources"
],
"@jupyterlab/htmlviewer-extension": true,
"@jupyterlab/imageviewer-extension": true,
"@jupyterlab/lsp-extension": true,
"@jupyterlab/mainmenu-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/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/hub-extension": true
@ -291,7 +313,9 @@
"@jupyterlab/filebrowser-extension:share-file"
],
"@jupyter-notebook/tree-extension": true,
"@jupyterlab/running-extension": true,
"@jupyterlab/running-extension": [
"@jupyterlab/running-extension:plugin"
],
"@jupyterlab/settingeditor-extension": true
},
"/notebooks": {
@ -362,6 +386,7 @@
"@jupyterlab/lsp",
"@jupyterlab/mainmenu",
"@jupyterlab/markdownviewer",
"@jupyterlab/mermaid",
"@jupyterlab/metadataform",
"@jupyterlab/notebook",
"@jupyterlab/observables",

@ -235,7 +235,7 @@
"\\nabla \\times \\vec{\\mathbf{B}} -\\, \\frac1c\\, \\frac{\\partial\\vec{\\mathbf{E}}}{\\partial t} & = \\frac{4\\pi}{c}\\vec{\\mathbf{j}} \\\\\n",
"\\nabla \\cdot \\vec{\\mathbf{E}} & = 4 \\pi \\rho \\\\\n",
"\\nabla \\times \\vec{\\mathbf{E}}\\, +\\, \\frac1c\\, \\frac{\\partial\\vec{\\mathbf{B}}}{\\partial t} & = \\vec{\\mathbf{0}} \\\\\n",
"\\nabla \\cdot \\vec{\\mathbf{B}} & = 0 \n",
"\\nabla \\cdot \\vec{\\mathbf{B}} & = 0\n",
"\\end{eqnarray}\"\"\"\n",
")"
]
@ -277,8 +277,7 @@
"metadata": {},
"outputs": [],
"source": [
"from IPython.display import HTML\n",
"from IPython.display import display\n",
"from IPython.display import HTML, display\n",
"\n",
"s = \"\"\"<table>\n",
"<tr>\n",

@ -1,6 +1,6 @@
{
"name": "@jupyter-notebook/buildutils",
"version": "7.0.5",
"version": "7.2.0-beta.1",
"private": true,
"description": "Jupyter Notebook - Build Utilities",
"homepage": "https://github.com/jupyter/notebook",
@ -29,7 +29,7 @@
"watch": "tsc -w --listEmittedFiles"
},
"dependencies": {
"@jupyterlab/buildutils": "^4.0.7",
"@jupyterlab/buildutils": "~4.2.0-beta.1",
"commander": "^6.2.0",
"fs-extra": "^9.1.0",
"typescript": "~5.0.2"

@ -128,6 +128,16 @@ commander
} 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}`);

@ -1,5 +1,3 @@
#!/usr/bin/env python3
#
# Jupyter Notebook documentation build configuration file, created by
# sphinx-quickstart on Mon Apr 13 09:51:11 2015.
#
@ -73,7 +71,7 @@ extensions = [
]
try:
import enchant # type:ignore # noqa
import enchant # noqa: F401
extensions += ["sphinxcontrib.spelling"]
except ImportError:
@ -97,7 +95,7 @@ master_doc = "index"
# General information about the project.
project = "Jupyter Notebook"
copyright = "2015, Jupyter Team, https://jupyter.org" # noqa
copyright = "2015, Jupyter Team, https://jupyter.org"
author = "The Jupyter Team"
# ghissue config
@ -109,7 +107,7 @@ github_project_url = "https://github.com/jupyter/notebook"
#
_version_py = os.path.join(here, "../../notebook/_version.py")
version_ns = {}
exec(compile(open(_version_py).read(), _version_py, "exec"), version_ns) # noqa
exec(compile(open(_version_py).read(), _version_py, "exec"), version_ns) # noqa: S102, SIM115
# The short X.Y version.
version = "%i.%i" % version_ns["version_info"][:2]
# The full version, including alpha/beta/rc tags.
@ -203,6 +201,7 @@ html_theme_options = {
"image_dark": "_static/logo-rectangle-dark.svg",
},
"use_edit_page_button": True,
"navigation_with_keys": False,
}
# Output for github to be used in links

@ -52,6 +52,12 @@ front-end Notebook client (i.e. the familiar notebook interface).
> - Related: [Configuring a language kernel](https://ipython.readthedocs.io/en/latest/install/kernel_install.html)
> to run in the Jupyter Server enables your server to run other languages, like R or Julia.
```{warning}
Jupyter Notebook 7 is now based on Jupyter Server. This may break some previous `notebook` imports you may have been using, such as `notebook.auth` or `notebook.notebookapp`.
Check out the [migration guide](../migrating/server-imports.md) to learn more on how to update these server imports.
```
(configure-nbextensions)=
## Notebook extensions

@ -185,7 +185,7 @@
"source": [
"The first idea of mouse based navigation is that **cells can be selected by clicking on them.** The currently selected cell gets a grey or green border depending on whether the notebook is in edit or command mode. If you click inside a cell's editor area, you will enter edit mode. If you click on the prompt or output area of a cell you will enter command mode.\n",
"\n",
"If you are running this notebook in a live session (not on http://nbviewer.jupyter.org) try selecting different cells and going between edit and command mode. Try typing into a cell."
"If you are running this notebook in a live session (not on https://nbviewer.jupyter.org) try selecting different cells and going between edit and command mode. Try typing into a cell."
]
},
{

@ -124,7 +124,6 @@
"outputs": [],
"source": [
"import sys\n",
"from ctypes import CDLL\n",
"\n",
"# This will crash a Linux or Mac system\n",
"# equivalent calls can be made on Windows\n",
@ -225,9 +224,7 @@
}
],
"source": [
"from __future__ import print_function\n",
"\n",
"print('hi, stderr', file=sys.stderr)"
"print(\"hi, stderr\", file=sys.stderr)"
]
},
{
@ -270,7 +267,8 @@
}
],
"source": [
"import time, sys\n",
"import sys\n",
"import time\n",
"\n",
"for i in range(8):\n",
" print(i)\n",

@ -73,6 +73,7 @@ notebook_7_features.md
migrating/frontend-extensions.md
migrating/server-extensions.md
migrating/server-imports.md
migrating/custom-themes.md
migrating/multiple-interfaces.md
```

@ -0,0 +1,33 @@
# Server Imports in Notebook 7
Notebook 7 is now based on Jupyter Server, which lets users run multiple Jupyter frontends (e.g. Notebook, JupyterLab, NBClassic, etc.) on the same server.
Prior to Notebook 7, the Classic Notebook server included the server modules in the `notebook` package. This means it was possible to import the server modules from the `notebook` package, for example:
```python
from notebook.auth import passwd
passwd("foo")
```
Or:
```python
from notebook import notebookapp
notebookapp.list_running_servers()
```
In Notebook 7, these server modules are now exposed by the `jupyter_server` package. The code snippets above should be updated to:
```python
from jupyter_server.auth import passwd
passwd("foo")
```
And:
```python
from jupyter_server import serverapp
serverapp.list_running_servers()
```
These are just examples, so you may have to adjust your use of `notebook` imports based on the specific server modules you were using.

@ -2,7 +2,7 @@ from __future__ import annotations
from typing import Any
from ._version import __version__ # noqa
from ._version import __version__, version_info # noqa: F401
def _jupyter_server_extension_paths() -> list[dict[str, str]]:

@ -5,7 +5,7 @@ import re
from collections import namedtuple
# Use "hatch version xx.yy.zz" to handle version changes
__version__ = "7.0.5"
__version__ = "7.2.0b1"
# PEP440 version parser
_version_regex = re.compile(
@ -23,7 +23,7 @@ _version_regex = re.compile(
_version_fields = _version_regex.match(__version__).groupdict() # type:ignore[union-attr]
VersionInfo = namedtuple("VersionInfo", ["major", "minor", "micro", "releaselevel", "serial"])
VersionInfo = namedtuple("VersionInfo", ["major", "minor", "micro", "releaselevel", "serial"]) # noqa: PYI024
version_info = VersionInfo(
*[

@ -4,7 +4,7 @@ from __future__ import annotations
import os
import re
import typing as t
from os.path import join as pjoin
from pathlib import Path
from jupyter_client.utils import ensure_async # type:ignore[attr-defined]
from jupyter_core.application import base_aliases
@ -36,11 +36,11 @@ from traitlets.config.loader import Config
from ._version import __version__
HERE = os.path.dirname(__file__)
HERE = Path(__file__).parent.resolve()
Flags = t.Dict[t.Union[str, t.Tuple[str, ...]], t.Tuple[t.Union[t.Dict[str, t.Any], Config], str]]
app_dir = get_app_dir()
app_dir = Path(get_app_dir())
version = __version__
# mypy: disable-error-code="no-untyped-call"
@ -56,8 +56,8 @@ class NotebookBaseHandler(ExtensionHandlerJinjaMixin, ExtensionHandlerMixin, Jup
def get_page_config(self) -> dict[str, t.Any]:
"""Get the page config."""
config = LabConfig()
app = self.extensionapp
base_url = self.settings.get("base_url")
app: JupyterNotebookApp = self.extensionapp # type:ignore[assignment]
base_url = self.settings.get("base_url", "/")
page_config_data = self.settings.setdefault("page_config_data", {})
page_config = {
**page_config_data,
@ -72,7 +72,7 @@ class NotebookBaseHandler(ExtensionHandlerJinjaMixin, ExtensionHandlerMixin, Jup
server_root = self.settings.get("server_root_dir", "")
server_root = server_root.replace(os.sep, "/")
server_root = os.path.normpath(os.path.expanduser(server_root))
server_root = os.path.normpath(Path(server_root).expanduser())
try:
# Remove the server_root from pref dir
if self.serverapp.preferred_dir != server_root:
@ -149,7 +149,7 @@ class TreeHandler(NotebookBaseHandler):
tpl = self.render_template("tree.html", page_config=page_config)
return self.write(tpl)
elif await ensure_async(cm.file_exists(path)):
if await ensure_async(cm.file_exists(path)):
# it's not a directory, we have redirecting to do
model = await ensure_async(cm.get(path, content=False))
if model["type"] == "notebook":
@ -159,15 +159,15 @@ class TreeHandler(NotebookBaseHandler):
url = ujoin(self.base_url, "files", url_escape(path))
self.log.debug("Redirecting %s to %s", self.request.path, url)
self.redirect(url)
else:
raise web.HTTPError(404)
return None
raise web.HTTPError(404)
class ConsoleHandler(NotebookBaseHandler):
"""A console page handler."""
@web.authenticated
def get(self, path: str | None = None) -> t.Any:
def get(self, path: str | None = None) -> t.Any: # noqa: ARG002
"""Get the console page."""
tpl = self.render_template("consoles.html", page_config=self.get_page_config())
return self.write(tpl)
@ -177,7 +177,7 @@ class TerminalHandler(NotebookBaseHandler):
"""A terminal page handler."""
@web.authenticated
def get(self, path: str | None = None) -> t.Any:
def get(self, path: str | None = None) -> t.Any: # noqa: ARG002
"""Get the terminal page."""
tpl = self.render_template("terminals.html", page_config=self.get_page_config())
return self.write(tpl)
@ -187,7 +187,7 @@ class FileHandler(NotebookBaseHandler):
"""A file page handler."""
@web.authenticated
def get(self, path: str | None = None) -> t.Any:
def get(self, path: str | None = None) -> t.Any: # noqa: ARG002
"""Get the file page."""
tpl = self.render_template("edit.html", page_config=self.get_page_config())
return self.write(tpl)
@ -197,7 +197,7 @@ class NotebookHandler(NotebookBaseHandler):
"""A notebook page handler."""
@web.authenticated
def get(self, path: str | None = None) -> t.Any:
def get(self, path: str | None = None) -> t.Any: # noqa: ARG002
"""Get the notebook page."""
tpl = self.render_template("notebooks.html", page_config=self.get_page_config())
return self.write(tpl)
@ -210,17 +210,17 @@ class CustomCssHandler(NotebookBaseHandler):
def get(self) -> t.Any:
"""Get the custom css file."""
self.set_header("Content-Type", 'text/css')
self.set_header("Content-Type", "text/css")
page_config = self.get_page_config()
custom_css_file = f"{page_config['jupyterConfigDir']}/custom/custom.css"
if not os.path.isfile(custom_css_file):
static_path_root = re.match('^(.*?)static', page_config['staticDir'])
if not Path(custom_css_file).is_file():
static_path_root = re.match("^(.*?)static", page_config["staticDir"])
if static_path_root is not None:
custom_dir = static_path_root.groups()[0]
custom_css_file = f"{custom_dir}custom/custom.css"
with open(custom_css_file) as css_f:
with Path(custom_css_file).open() as css_f:
return self.write(css_f.read())
@ -269,23 +269,23 @@ class JupyterNotebookApp(NotebookConfigShimMixin, LabServerApp): # type:ignore[
@default("static_dir")
def _default_static_dir(self) -> str:
return os.path.join(HERE, "static")
return str(HERE / "static")
@default("templates_dir")
def _default_templates_dir(self) -> str:
return os.path.join(HERE, "templates")
return str(HERE / "templates")
@default("app_settings_dir")
def _default_app_settings_dir(self) -> str:
return pjoin(app_dir, "settings")
return str(app_dir / "settings")
@default("schemas_dir")
def _default_schemas_dir(self) -> str:
return pjoin(app_dir, "schemas")
return str(app_dir / "schemas")
@default("themes_dir")
def _default_themes_dir(self) -> str:
return pjoin(app_dir, "themes")
return str(app_dir / "themes")
@default("user_settings_dir")
def _default_user_settings_dir(self) -> str:
@ -301,6 +301,8 @@ class JupyterNotebookApp(NotebookConfigShimMixin, LabServerApp): # type:ignore[
def server_extension_is_enabled(self, extension: str) -> bool:
"""Check if server extension is enabled."""
if self.serverapp is None:
return False
try:
extension_enabled = (
self.serverapp.extension_manager.extensions[extension].enabled is True
@ -311,6 +313,7 @@ class JupyterNotebookApp(NotebookConfigShimMixin, LabServerApp): # type:ignore[
def initialize_handlers(self) -> None:
"""Initialize handlers."""
assert self.serverapp is not None # noqa: S101
page_config = self.serverapp.web_app.settings.setdefault("page_config_data", {})
nbclassic_enabled = self.server_extension_is_enabled("nbclassic")
page_config["nbclassic_enabled"] = nbclassic_enabled
@ -340,7 +343,7 @@ class JupyterNotebookApp(NotebookConfigShimMixin, LabServerApp): # type:ignore[
self.handlers.append(("/custom/custom.css", CustomCssHandler))
super().initialize_handlers()
def initialize(self, argv: list[str] | None = None) -> None:
def initialize(self, argv: list[str] | None = None) -> None: # noqa: ARG002
"""Subclass because the ExtensionApp.initialize() method does not take arguments"""
super().initialize()

@ -49,7 +49,7 @@
"yjs": "^13.5.40"
},
"devDependencies": {
"@jupyterlab/buildutils": "^4.0.7",
"@jupyterlab/buildutils": "~4.2.0-beta.1",
"@typescript-eslint/eslint-plugin": "^5.55.0",
"@typescript-eslint/parser": "^5.55.0",
"eslint": "^8.36.0",

@ -1,6 +1,6 @@
{
"name": "@jupyter-notebook/metapackage",
"version": "7.0.5",
"version": "7.2.0-beta.1",
"private": true,
"description": "Jupyter Notebook - Metapackage",
"homepage": "https://github.com/jupyter/notebook",
@ -20,18 +20,18 @@
"watch": "tsc -b -w --preserveWatchOutput"
},
"dependencies": {
"@jupyter-notebook/application": "^7.0.5",
"@jupyter-notebook/application-extension": "^7.0.5",
"@jupyter-notebook/console-extension": "^7.0.5",
"@jupyter-notebook/docmanager-extension": "^7.0.5",
"@jupyter-notebook/documentsearch-extension": "^7.0.5",
"@jupyter-notebook/help-extension": "^7.0.5",
"@jupyter-notebook/lab-extension": "^7.0.5",
"@jupyter-notebook/notebook-extension": "^7.0.5",
"@jupyter-notebook/terminal-extension": "^7.0.5",
"@jupyter-notebook/tree": "^7.0.5",
"@jupyter-notebook/tree-extension": "^7.0.5",
"@jupyter-notebook/ui-components": "^7.0.5"
"@jupyter-notebook/application": "^7.2.0-beta.1",
"@jupyter-notebook/application-extension": "^7.2.0-beta.1",
"@jupyter-notebook/console-extension": "^7.2.0-beta.1",
"@jupyter-notebook/docmanager-extension": "^7.2.0-beta.1",
"@jupyter-notebook/documentsearch-extension": "^7.2.0-beta.1",
"@jupyter-notebook/help-extension": "^7.2.0-beta.1",
"@jupyter-notebook/lab-extension": "^7.2.0-beta.1",
"@jupyter-notebook/notebook-extension": "^7.2.0-beta.1",
"@jupyter-notebook/terminal-extension": "^7.2.0-beta.1",
"@jupyter-notebook/tree": "^7.2.0-beta.1",
"@jupyter-notebook/tree-extension": "^7.2.0-beta.1",
"@jupyter-notebook/ui-components": "^7.2.0-beta.1"
},
"devDependencies": {
"typescript": "~5.0.2"

@ -1,6 +1,6 @@
{
"name": "@jupyter-notebook/application-extension",
"version": "7.0.5",
"version": "7.2.0-beta.1",
"description": "Jupyter Notebook - Application Extension",
"homepage": "https://github.com/jupyter/notebook",
"bugs": {
@ -38,22 +38,22 @@
"watch": "tsc -b --watch"
},
"dependencies": {
"@jupyter-notebook/application": "^7.0.5",
"@jupyter-notebook/ui-components": "^7.0.5",
"@jupyterlab/application": "^4.0.7",
"@jupyterlab/apputils": "^4.1.7",
"@jupyterlab/codeeditor": "^4.0.7",
"@jupyterlab/console": "^4.0.7",
"@jupyterlab/coreutils": "^6.0.7",
"@jupyterlab/docmanager": "^4.0.7",
"@jupyterlab/docregistry": "^4.0.7",
"@jupyterlab/mainmenu": "^4.0.7",
"@jupyterlab/rendermime": "^4.0.7",
"@jupyterlab/settingregistry": "^4.0.7",
"@jupyterlab/translation": "^4.0.7",
"@jupyter-notebook/application": "^7.2.0-beta.1",
"@jupyter-notebook/ui-components": "^7.2.0-beta.1",
"@jupyterlab/application": "~4.2.0-beta.1",
"@jupyterlab/apputils": "~4.3.0-beta.1",
"@jupyterlab/codeeditor": "~4.2.0-beta.1",
"@jupyterlab/console": "~4.2.0-beta.1",
"@jupyterlab/coreutils": "~6.2.0-beta.1",
"@jupyterlab/docmanager": "~4.2.0-beta.1",
"@jupyterlab/docregistry": "~4.2.0-beta.1",
"@jupyterlab/mainmenu": "~4.2.0-beta.1",
"@jupyterlab/rendermime": "~4.2.0-beta.1",
"@jupyterlab/settingregistry": "~4.2.0-beta.1",
"@jupyterlab/translation": "~4.2.0-beta.1",
"@lumino/coreutils": "^2.1.2",
"@lumino/disposable": "^2.1.2",
"@lumino/widgets": "^2.3.0"
"@lumino/widgets": "^2.3.2"
},
"devDependencies": {
"rimraf": "^3.0.2",

@ -9,7 +9,8 @@
"title": "Customize shell widget positioning",
"description": "Overrides default widget position in the application layout",
"default": {
"Markdown Preview": { "area": "right" }
"Markdown Preview": { "area": "right" },
"Plugins": { "area": "left" }
}
}
},

@ -129,6 +129,8 @@ namespace CommandIDs {
*/
const dirty: JupyterFrontEndPlugin<void> = {
id: '@jupyter-notebook/application-extension:dirty',
description:
'Check if the application is dirty before closing the browser tab.',
autoStart: true,
requires: [ILabStatus, ITranslator],
activate: (
@ -157,6 +159,7 @@ const dirty: JupyterFrontEndPlugin<void> = {
*/
const logo: JupyterFrontEndPlugin<void> = {
id: '@jupyter-notebook/application-extension:logo',
description: 'The logo plugin.',
autoStart: true,
activate: (app: JupyterFrontEnd) => {
const baseUrl = PageConfig.getBaseUrl();
@ -185,6 +188,7 @@ const logo: JupyterFrontEndPlugin<void> = {
*/
const opener: JupyterFrontEndPlugin<void> = {
id: '@jupyter-notebook/application-extension:opener',
description: 'A plugin to open documents in the main area.',
autoStart: true,
requires: [IRouter, IDocumentManager],
optional: [ISettingRegistry],
@ -253,6 +257,7 @@ const opener: JupyterFrontEndPlugin<void> = {
*/
const menus: JupyterFrontEndPlugin<void> = {
id: '@jupyter-notebook/application-extension:menus',
description: 'A plugin to customize menus.',
requires: [IMainMenu],
autoStart: true,
activate: (app: JupyterFrontEnd, menu: IMainMenu) => {
@ -283,6 +288,7 @@ const menus: JupyterFrontEndPlugin<void> = {
*/
const menuSpacer: JupyterFrontEndPlugin<void> = {
id: '@jupyter-notebook/application-extension:menu-spacer',
description: 'A plugin to provide a spacer at rank 900 in the menu area.',
autoStart: true,
activate: (app: JupyterFrontEnd) => {
const menu = new Widget();
@ -297,6 +303,7 @@ const menuSpacer: JupyterFrontEndPlugin<void> = {
*/
const pages: JupyterFrontEndPlugin<void> = {
id: '@jupyter-notebook/application-extension:pages',
description: 'Add commands to open the tree and running pages.',
autoStart: true,
requires: [ITranslator],
optional: [ICommandPalette],
@ -339,6 +346,7 @@ const pages: JupyterFrontEndPlugin<void> = {
*/
const pathOpener: JupyterFrontEndPlugin<INotebookPathOpener> = {
id: '@jupyter-notebook/application-extension:path-opener',
description: 'A plugin to open paths in new browser tabs.',
autoStart: true,
provides: INotebookPathOpener,
activate: (app: JupyterFrontEnd): INotebookPathOpener => {
@ -351,6 +359,7 @@ const pathOpener: JupyterFrontEndPlugin<INotebookPathOpener> = {
*/
const paths: JupyterFrontEndPlugin<JupyterFrontEnd.IPaths> = {
id: '@jupyter-notebook/application-extension:paths',
description: 'The default paths for a Jupyter Notebook app.',
autoStart: true,
provides: JupyterFrontEnd.IPaths,
activate: (app: JupyterFrontEnd): JupyterFrontEnd.IPaths => {
@ -366,9 +375,9 @@ const paths: JupyterFrontEndPlugin<JupyterFrontEnd.IPaths> = {
*/
const rendermime: JupyterFrontEndPlugin<IRenderMimeRegistry> = {
id: '@jupyter-notebook/application-extension:rendermime',
description: 'A plugin providing a rendermime registry.',
autoStart: true,
provides: IRenderMimeRegistry,
description: 'Provides the render mime registry.',
optional: [
IDocumentManager,
ILatexTypesetter,
@ -439,6 +448,7 @@ const rendermime: JupyterFrontEndPlugin<IRenderMimeRegistry> = {
*/
const shell: JupyterFrontEndPlugin<INotebookShell> = {
id: '@jupyter-notebook/application-extension:shell',
description: 'The default Jupyter Notebook application shell.',
autoStart: true,
provides: INotebookShell,
optional: [ISettingRegistry],
@ -505,6 +515,7 @@ const splash: JupyterFrontEndPlugin<ISplashScreen> = {
*/
const status: JupyterFrontEndPlugin<ILabStatus> = {
id: '@jupyter-notebook/application-extension:status',
description: 'The default JupyterLab application status provider.',
autoStart: true,
provides: ILabStatus,
activate: (app: JupyterFrontEnd) => {
@ -520,6 +531,8 @@ const status: JupyterFrontEndPlugin<ILabStatus> = {
*/
const tabTitle: JupyterFrontEndPlugin<void> = {
id: '@jupyter-notebook/application-extension:tab-title',
description:
'A plugin to display the document title in the browser tab title.',
autoStart: true,
requires: [INotebookShell],
activate: (app: JupyterFrontEnd, shell: INotebookShell) => {
@ -556,6 +569,7 @@ const tabTitle: JupyterFrontEndPlugin<void> = {
*/
const title: JupyterFrontEndPlugin<void> = {
id: '@jupyter-notebook/application-extension:title',
description: 'A plugin to display and rename the title of a file.',
autoStart: true,
requires: [INotebookShell, ITranslator],
optional: [IDocumentManager, IRouter, IToolbarWidgetRegistry],
@ -654,6 +668,7 @@ const title: JupyterFrontEndPlugin<void> = {
*/
const topVisibility: JupyterFrontEndPlugin<void> = {
id: '@jupyter-notebook/application-extension:top',
description: 'Plugin to toggle the top header visibility.',
requires: [INotebookShell, ITranslator],
optional: [ISettingRegistry, ICommandPalette],
activate: (
@ -735,6 +750,7 @@ const topVisibility: JupyterFrontEndPlugin<void> = {
*/
const sidePanelVisibility: JupyterFrontEndPlugin<void> = {
id: '@jupyter-notebook/application-extension:sidepanel',
description: 'Plugin to toggle the visibility of left or right side panel.',
requires: [INotebookShell, ITranslator],
optional: [IMainMenu, ICommandPalette],
autoStart: true,
@ -950,6 +966,7 @@ const sidePanelVisibility: JupyterFrontEndPlugin<void> = {
*/
const tree: JupyterFrontEndPlugin<JupyterFrontEnd.ITreeResolver> = {
id: '@jupyter-notebook/application-extension:tree-resolver',
description: 'The default tree route resolver plugin.',
autoStart: true,
requires: [IRouter],
provides: JupyterFrontEnd.ITreeResolver,
@ -1007,8 +1024,12 @@ const tree: JupyterFrontEndPlugin<JupyterFrontEnd.ITreeResolver> = {
},
};
/**
* Plugin to update tree path.
*/
const treePathUpdater: JupyterFrontEndPlugin<ITreePathUpdater> = {
id: '@jupyter-notebook/application-extension:tree-updater',
description: 'Plugin to update tree path.',
requires: [IRouter],
provides: ITreePathUpdater,
activate: (app: JupyterFrontEnd, router: IRouter) => {
@ -1029,8 +1050,12 @@ const treePathUpdater: JupyterFrontEndPlugin<ITreePathUpdater> = {
autoStart: true,
};
/**
* Translator plugin
*/
const translator: JupyterFrontEndPlugin<void> = {
id: '@jupyter-notebook/application-extension:translator',
description: 'Translator plugin',
requires: [INotebookShell, ITranslator],
autoStart: true,
activate: (
@ -1047,6 +1072,7 @@ const translator: JupyterFrontEndPlugin<void> = {
*/
const zen: JupyterFrontEndPlugin<void> = {
id: '@jupyter-notebook/application-extension:zen',
description: 'Zen mode plugin.',
autoStart: true,
requires: [ITranslator],
optional: [ICommandPalette, INotebookShell],

@ -38,3 +38,8 @@
/* bring logo to the front so it is selectable by tab*/
z-index: 10;
}
/* Hide the notification status item */
.jp-Notification-Status {
display: none;
}

@ -1,6 +1,6 @@
{
"name": "@jupyter-notebook/application",
"version": "7.0.5",
"version": "7.2.0-beta.1",
"description": "Jupyter Notebook - Application",
"homepage": "https://github.com/jupyter/notebook",
"bugs": {
@ -42,22 +42,22 @@
"watch": "tsc -b --watch"
},
"dependencies": {
"@jupyterlab/application": "^4.0.7",
"@jupyterlab/coreutils": "^6.0.7",
"@jupyterlab/docregistry": "^4.0.7",
"@jupyterlab/rendermime-interfaces": "^3.8.7",
"@jupyterlab/ui-components": "^4.0.7",
"@jupyterlab/application": "~4.2.0-beta.1",
"@jupyterlab/coreutils": "~6.2.0-beta.1",
"@jupyterlab/docregistry": "~4.2.0-beta.1",
"@jupyterlab/rendermime-interfaces": "~3.10.0-beta.1",
"@jupyterlab/ui-components": "~4.2.0-beta.1",
"@lumino/algorithm": "^2.0.1",
"@lumino/coreutils": "^2.1.2",
"@lumino/messaging": "^2.0.1",
"@lumino/polling": "^2.1.2",
"@lumino/signaling": "^2.1.2",
"@lumino/widgets": "^2.3.0"
"@lumino/widgets": "^2.3.2"
},
"devDependencies": {
"@babel/core": "^7.11.6",
"@babel/preset-env": "^7.12.1",
"@jupyterlab/testutils": "^4.0.7",
"@jupyterlab/testutils": "~4.2.0-beta.1",
"@types/jest": "^29.2.5",
"jest": "^29.3.1",
"rimraf": "^3.0.2",

@ -2,6 +2,7 @@
// Distributed under the terms of the Modified BSD License.
import {
JupyterLab,
JupyterFrontEnd,
JupyterFrontEndPlugin,
} from '@jupyterlab/application';
@ -40,6 +41,17 @@ export class NotebookApp extends JupyterFrontEnd<INotebookShell> {
}
}
// Create an IInfo dictionary from the options to override the defaults.
const info = Object.keys(JupyterLab.defaultInfo).reduce((acc, val) => {
if (val in options) {
(acc as any)[val] = JSON.parse(JSON.stringify((options as any)[val]));
}
return acc;
}, {} as Partial<JupyterLab.IInfo>);
// Populate application info.
this._info = { ...JupyterLab.defaultInfo, ...info };
this.restored = this.shell.restored;
this.restored.then(() => this._formatter.invoke());
@ -71,6 +83,13 @@ export class NotebookApp extends JupyterFrontEnd<INotebookShell> {
readonly version = PageConfig.getOption('appVersion') ?? 'unknown';
/**
* The NotebookApp application information dictionary.
*/
get info(): JupyterLab.IInfo {
return this._info;
}
/**
* The JupyterLab application paths dictionary.
*/
@ -149,6 +168,7 @@ export class NotebookApp extends JupyterFrontEnd<INotebookShell> {
});
}
private _info: JupyterLab.IInfo = JupyterLab.defaultInfo;
private _formatter = new Throttler(() => {
Private.setFormat(this);
}, 250);
@ -173,6 +193,11 @@ export namespace NotebookApp {
* The mime renderer extensions.
*/
readonly mimeExtensions: IRenderMime.IExtensionModule[];
/**
* The information about available plugins.
*/
readonly availablePlugins: JupyterLab.IPluginInfo[];
}
/**

@ -165,17 +165,20 @@ export class SidePanelHandler extends PanelHandler {
* if there is no most recently used.
*/
expand(id?: string): void {
if (this._currentWidget) {
this.collapse();
}
if (id) {
this.activate(id);
} else {
const visibleWidget = this.currentWidget;
if (visibleWidget) {
this._currentWidget = visibleWidget;
this.activate(visibleWidget.id);
if (this._currentWidget && this._currentWidget.id === id) {
this.collapse();
this.hide();
} else {
this.collapse();
this.hide();
this.activate(id);
this.show();
}
} else if (this.currentWidget) {
this._currentWidget = this.currentWidget;
this.activate(this._currentWidget.id);
this.show();
}
}

@ -9,7 +9,13 @@ import { find } from '@lumino/algorithm';
import { JSONExt, PromiseDelegate, Token } from '@lumino/coreutils';
import { ISignal, Signal } from '@lumino/signaling';
import { BoxLayout, Panel, SplitPanel, Widget } from '@lumino/widgets';
import {
BoxLayout,
FocusTracker,
Panel,
SplitPanel,
Widget,
} from '@lumino/widgets';
import { PanelHandler, SidePanelHandler } from './panelhandler';
/**
@ -163,7 +169,10 @@ export class NotebookShell extends Widget implements JupyterFrontEnd.IShell {
/**
* A signal emitted when the current widget changes.
*/
get currentChanged(): ISignal<NotebookShell, void> {
get currentChanged(): ISignal<
JupyterFrontEnd.IShell,
FocusTracker.IChangedArgs<Widget>
> {
return this._currentChanged;
}
@ -314,16 +323,21 @@ export class NotebookShell extends Widget implements JupyterFrontEnd.IShell {
case 'menu':
return this._menuHandler.addWidget(widget, rank);
case 'main':
case undefined:
case undefined: {
if (this._main.widgets.length > 0) {
// do not add the widget if there is already one
return;
}
const previousWidget = this.currentWidget;
this._main.addWidget(widget);
this._main.update();
this._currentChanged.emit(void 0);
this._currentChanged.emit({
newValue: widget,
oldValue: previousWidget,
});
this._mainWidgetLoaded.resolve();
break;
}
case 'left':
return this._leftHandler.addWidget(widget, rank);
case 'right':
@ -429,7 +443,9 @@ export class NotebookShell extends Widget implements JupyterFrontEnd.IShell {
private _skipLinkWidgetHandler: Private.SkipLinkWidgetHandler;
private _main: Panel;
private _translator: ITranslator = nullTranslator;
private _currentChanged = new Signal<this, void>(this);
private _currentChanged = new Signal<this, FocusTracker.IChangedArgs<Widget>>(
this
);
private _mainWidgetLoaded = new PromiseDelegate<void>();
private _userLayout: INotebookShell.IUserLayout;
}

@ -1,6 +1,6 @@
{
"name": "@jupyter-notebook/console-extension",
"version": "7.0.5",
"version": "7.2.0-beta.1",
"description": "Jupyter Notebook - Console Extension",
"homepage": "https://github.com/jupyter/notebook",
"bugs": {
@ -38,10 +38,10 @@
"watch": "tsc -b --watch"
},
"dependencies": {
"@jupyter-notebook/application": "^7.0.5",
"@jupyterlab/application": "^4.0.7",
"@jupyterlab/console": "^4.0.7",
"@jupyterlab/coreutils": "^6.0.7",
"@jupyter-notebook/application": "^7.2.0-beta.1",
"@jupyterlab/application": "~4.2.0-beta.1",
"@jupyterlab/console": "~4.2.0-beta.1",
"@jupyterlab/coreutils": "~6.2.0-beta.1",
"@lumino/algorithm": "^2.0.1"
},
"devDependencies": {

@ -25,6 +25,7 @@ const opener: JupyterFrontEndPlugin<void> = {
id: '@jupyter-notebook/console-extension:opener',
requires: [IRouter],
autoStart: true,
description: 'A plugin to open consoles in a new tab',
activate: (app: JupyterFrontEnd, router: IRouter) => {
const { commands } = app;
const consolePattern = new RegExp('/consoles/(.*)');
@ -59,6 +60,7 @@ const redirect: JupyterFrontEndPlugin<void> = {
requires: [IConsoleTracker],
optional: [INotebookPathOpener],
autoStart: true,
description: 'Open consoles in a new tab',
activate: (
app: JupyterFrontEnd,
tracker: IConsoleTracker,

@ -1,6 +1,6 @@
{
"name": "@jupyter-notebook/docmanager-extension",
"version": "7.0.5",
"version": "7.2.0-beta.1",
"description": "Jupyter Notebook - Document Manager Extension",
"homepage": "https://github.com/jupyter/notebook",
"bugs": {
@ -38,12 +38,12 @@
"watch": "tsc -b --watch"
},
"dependencies": {
"@jupyter-notebook/application": "^7.0.5",
"@jupyterlab/application": "^4.0.7",
"@jupyterlab/coreutils": "^6.0.7",
"@jupyterlab/docmanager": "^4.0.7",
"@jupyterlab/docregistry": "^4.0.7",
"@jupyterlab/services": "^7.0.7",
"@jupyter-notebook/application": "^7.2.0-beta.1",
"@jupyterlab/application": "~4.2.0-beta.1",
"@jupyterlab/coreutils": "~6.2.0-beta.1",
"@jupyterlab/docmanager": "~4.2.0-beta.1",
"@jupyterlab/docregistry": "~4.2.0-beta.1",
"@jupyterlab/services": "~7.2.0-beta.1",
"@lumino/algorithm": "^2.0.1",
"@lumino/signaling": "^2.1.2"
},

@ -29,6 +29,7 @@ const opener: JupyterFrontEndPlugin<IDocumentWidgetOpener> = {
autoStart: true,
optional: [INotebookPathOpener, INotebookShell],
provides: IDocumentWidgetOpener,
description: 'Open documents in a new browser tab',
activate: (
app: JupyterFrontEnd,
notebookPathOpener: INotebookPathOpener,
@ -39,7 +40,10 @@ const opener: JupyterFrontEndPlugin<IDocumentWidgetOpener> = {
const pathOpener = notebookPathOpener ?? defaultNotebookPathOpener;
let id = 0;
return new (class {
open(widget: IDocumentWidget, options?: DocumentRegistry.IOpenOptions) {
async open(
widget: IDocumentWidget,
options?: DocumentRegistry.IOpenOptions
) {
const widgetName = options?.type ?? '';
const ref = options?.ref;
// check if there is an setting override and if it would add the widget in the main area
@ -53,6 +57,11 @@ const opener: JupyterFrontEndPlugin<IDocumentWidgetOpener> = {
(widgetName === 'default' && ext === '.ipynb') ||
widgetName.includes('Notebook')
) {
// make sure to save the notebook before opening it in a new tab
// so the kernel info is saved (if created from the New dropdown)
if (widget.context.sessionContext.kernelPreference.name) {
await widget.context.save();
}
route = 'notebooks';
}
// append ?factory only if it's not the default

@ -1,6 +1,6 @@
{
"name": "@jupyter-notebook/documentsearch-extension",
"version": "7.0.5",
"version": "7.2.0-beta.1",
"description": "Jupyter Notebook - Document Search Extension",
"homepage": "https://github.com/jupyter/notebook",
"bugs": {
@ -38,10 +38,10 @@
"watch": "tsc -b --watch"
},
"dependencies": {
"@jupyter-notebook/application": "^7.0.5",
"@jupyterlab/application": "^4.0.7",
"@jupyterlab/documentsearch": "^4.0.7",
"@lumino/widgets": "^2.3.0"
"@jupyter-notebook/application": "^7.2.0-beta.1",
"@jupyterlab/application": "~4.2.0-beta.1",
"@jupyterlab/documentsearch": "~4.2.0-beta.1",
"@lumino/widgets": "^2.3.2"
},
"devDependencies": {
"rimraf": "^3.0.2",

@ -18,6 +18,7 @@ const notebookShellWidgetListener: JupyterFrontEndPlugin<void> = {
id: '@jupyter-notebook/documentsearch-extension:notebookShellWidgetListener',
requires: [INotebookShell, ISearchProviderRegistry],
autoStart: true,
description: 'A plugin to add document search functionalities',
activate: (
app: JupyterFrontEnd,
notebookShell: INotebookShell,

@ -1,6 +1,6 @@
{
"name": "@jupyter-notebook/help-extension",
"version": "7.0.5",
"version": "7.2.0-beta.1",
"description": "Jupyter Notebook - Help Extension",
"homepage": "https://github.com/jupyter/notebook",
"bugs": {
@ -38,11 +38,11 @@
"watch": "tsc -b --watch"
},
"dependencies": {
"@jupyter-notebook/ui-components": "^7.0.5",
"@jupyterlab/application": "^4.0.7",
"@jupyterlab/apputils": "^4.1.7",
"@jupyterlab/mainmenu": "^4.0.7",
"@jupyterlab/translation": "^4.0.7",
"@jupyter-notebook/ui-components": "^7.2.0-beta.1",
"@jupyterlab/application": "~4.2.0-beta.1",
"@jupyterlab/apputils": "~4.3.0-beta.1",
"@jupyterlab/mainmenu": "~4.2.0-beta.1",
"@jupyterlab/translation": "~4.2.0-beta.1",
"react": "^18.2.0",
"react-dom": "^18.2.0"
},

@ -49,6 +49,7 @@ namespace CommandIDs {
const open: JupyterFrontEndPlugin<void> = {
id: '@jupyter-notebook/help-extension:open',
autoStart: true,
description: 'A plugin to open the about section with resources',
activate: (app: JupyterFrontEnd): void => {
const { commands } = app;
@ -70,6 +71,8 @@ const about: JupyterFrontEndPlugin<void> = {
autoStart: true,
requires: [ITranslator],
optional: [IMainMenu, ICommandPalette],
description:
'Plugin to add a command to show an About Jupyter Notebook and Markdown Reference',
activate: (
app: JupyterFrontEnd,
translator: ITranslator,

@ -1,6 +1,6 @@
{
"name": "@jupyter-notebook/lab-extension",
"version": "7.0.5",
"version": "7.2.0-beta.1",
"description": "Jupyter Notebook - Lab Extension",
"homepage": "https://github.com/jupyter/notebook",
"bugs": {
@ -43,19 +43,19 @@
"watch:src": "tsc -w"
},
"dependencies": {
"@jupyter-notebook/application": "^7.0.5",
"@jupyterlab/application": "^4.0.7",
"@jupyterlab/apputils": "^4.1.7",
"@jupyterlab/coreutils": "^6.0.7",
"@jupyterlab/docregistry": "^4.0.7",
"@jupyterlab/notebook": "^4.0.7",
"@jupyterlab/translation": "^4.0.7",
"@jupyterlab/ui-components": "^4.0.7",
"@lumino/commands": "^2.1.3",
"@jupyter-notebook/application": "^7.2.0-beta.1",
"@jupyterlab/application": "~4.2.0-beta.1",
"@jupyterlab/apputils": "~4.3.0-beta.1",
"@jupyterlab/coreutils": "~6.2.0-beta.1",
"@jupyterlab/docregistry": "~4.2.0-beta.1",
"@jupyterlab/notebook": "~4.2.0-beta.1",
"@jupyterlab/translation": "~4.2.0-beta.1",
"@jupyterlab/ui-components": "~4.2.0-beta.1",
"@lumino/commands": "^2.3.0",
"@lumino/disposable": "^2.1.2"
},
"devDependencies": {
"@jupyterlab/builder": "^4.0.7",
"@jupyterlab/builder": "~4.2.0-beta.1",
"rimraf": "^3.0.2",
"typescript": "~5.0.2"
},

@ -67,6 +67,7 @@ interface ISwitcherChoice {
*/
const interfaceSwitcher: JupyterFrontEndPlugin<void> = {
id: '@jupyter-notebook/lab-extension:interface-switcher',
description: 'A plugin to add custom toolbar items to the notebook page.',
autoStart: true,
requires: [ITranslator, INotebookTracker],
optional: [
@ -218,6 +219,7 @@ const interfaceSwitcher: JupyterFrontEndPlugin<void> = {
*/
const launchNotebookTree: JupyterFrontEndPlugin<void> = {
id: '@jupyter-notebook/lab-extension:launch-tree',
description: 'A plugin to add a command to open the Jupyter Notebook Tree.',
autoStart: true,
requires: [ITranslator],
optional: [ICommandPalette],

@ -14,12 +14,10 @@
vertical-align: sub;
}
.jp-nb-interface-switcher-button > .jp-ToolbarButtonComponent {
.jp-nb-interface-switcher-button > .jp-ToolbarButtonComponent::part(content) {
flex-direction: row-reverse;
}
.jp-nb-interface-switcher-button
> .jp-ToolbarButtonComponent
> .jp-ToolbarButtonComponent-icon {
.jp-nb-interface-switcher-button > .jp-ToolbarButtonComponent > svg {
padding-left: 3px;
}

@ -1,6 +1,6 @@
{
"name": "@jupyter-notebook/notebook-extension",
"version": "7.0.5",
"version": "7.2.0-beta.1",
"description": "Jupyter Notebook - Notebook Extension",
"homepage": "https://github.com/jupyter/notebook",
"bugs": {
@ -38,16 +38,16 @@
"watch": "tsc -b --watch"
},
"dependencies": {
"@jupyter-notebook/application": "^7.0.5",
"@jupyterlab/application": "^4.0.7",
"@jupyterlab/apputils": "^4.1.7",
"@jupyterlab/cells": "^4.0.7",
"@jupyterlab/docmanager": "^4.0.7",
"@jupyterlab/notebook": "^4.0.7",
"@jupyterlab/settingregistry": "^4.0.7",
"@jupyterlab/translation": "^4.0.7",
"@jupyter-notebook/application": "^7.2.0-beta.1",
"@jupyterlab/application": "~4.2.0-beta.1",
"@jupyterlab/apputils": "~4.3.0-beta.1",
"@jupyterlab/cells": "~4.2.0-beta.1",
"@jupyterlab/docmanager": "~4.2.0-beta.1",
"@jupyterlab/notebook": "~4.2.0-beta.1",
"@jupyterlab/settingregistry": "~4.2.0-beta.1",
"@jupyterlab/translation": "~4.2.0-beta.1",
"@lumino/polling": "^2.1.2",
"@lumino/widgets": "^2.3.0",
"@lumino/widgets": "^2.3.2",
"react": "^18.2.0",
"react-dom": "^18.2.0"
},

@ -0,0 +1,28 @@
{
"title": "Jupyter Notebook Menu Entries",
"description": "Jupyter Notebook Menu Entries",
"jupyter.lab.menus": {
"main": [
{
"id": "jp-mainmenu-edit",
"items": [
{
"type": "separator",
"rank": 8.5
},
{
"command": "notebook:edit-metadata",
"rank": 8.5
},
{
"type": "separator",
"rank": 8.5
}
]
}
]
},
"properties": {},
"additionalProperties": false,
"type": "object"
}

@ -10,11 +10,12 @@ import {
ISessionContext,
DOMUtils,
IToolbarWidgetRegistry,
ICommandPalette,
} from '@jupyterlab/apputils';
import { Cell, CodeCell } from '@jupyterlab/cells';
import { Text, Time } from '@jupyterlab/coreutils';
import { PageConfig, Text, Time, URLExt } from '@jupyterlab/coreutils';
import { IDocumentManager } from '@jupyterlab/docmanager';
@ -63,11 +64,22 @@ const KERNEL_STATUS_FADE_OUT_CLASS = 'jp-NotebookKernelStatus-fade';
*/
const SCROLLED_OUTPUTS_CLASS = 'jp-mod-outputsScrolled';
/**
* The command IDs used by the notebook plugins.
*/
namespace CommandIDs {
/**
* A command to open right sidebar for Editing Notebook Metadata
*/
export const openEditNotebookMetadata = 'notebook:edit-metadata';
}
/**
* A plugin for the checkpoint indicator
*/
const checkpoints: JupyterFrontEndPlugin<void> = {
id: '@jupyter-notebook/notebook-extension:checkpoints',
description: 'A plugin for the checkpoint indicator.',
autoStart: true,
requires: [IDocumentManager, ITranslator],
optional: [INotebookShell, IToolbarWidgetRegistry],
@ -133,6 +145,8 @@ const checkpoints: JupyterFrontEndPlugin<void> = {
*/
const closeTab: JupyterFrontEndPlugin<void> = {
id: '@jupyter-notebook/notebook-extension:close-tab',
description:
'Add a command to close the browser tab when clicking on "Close and Shut Down".',
autoStart: true,
requires: [IMainMenu],
optional: [ITranslator],
@ -167,6 +181,7 @@ const closeTab: JupyterFrontEndPlugin<void> = {
*/
const kernelLogo: JupyterFrontEndPlugin<void> = {
id: '@jupyter-notebook/notebook-extension:kernel-logo',
description: 'The kernel logo plugin.',
autoStart: true,
requires: [INotebookShell],
optional: [IToolbarWidgetRegistry],
@ -230,6 +245,7 @@ const kernelLogo: JupyterFrontEndPlugin<void> = {
*/
const kernelStatus: JupyterFrontEndPlugin<void> = {
id: '@jupyter-notebook/notebook-extension:kernel-status',
description: 'A plugin to display the kernel status.',
autoStart: true,
requires: [INotebookShell, ITranslator],
activate: (
@ -294,6 +310,7 @@ const kernelStatus: JupyterFrontEndPlugin<void> = {
*/
const scrollOutput: JupyterFrontEndPlugin<void> = {
id: '@jupyter-notebook/notebook-extension:scroll-output',
description: 'A plugin to enable scrolling for outputs by default.',
autoStart: true,
requires: [INotebookTracker],
optional: [ISettingRegistry],
@ -379,6 +396,7 @@ const scrollOutput: JupyterFrontEndPlugin<void> = {
*/
const notebookToolsWidget: JupyterFrontEndPlugin<void> = {
id: '@jupyter-notebook/notebook-extension:notebook-tools',
description: 'A plugin to add the NotebookTools to the side panel.',
autoStart: true,
requires: [INotebookShell],
optional: [INotebookTools],
@ -407,12 +425,17 @@ const notebookToolsWidget: JupyterFrontEndPlugin<void> = {
*/
const tabIcon: JupyterFrontEndPlugin<void> = {
id: '@jupyter-notebook/notebook-extension:tab-icon',
description: 'A plugin to update the tab icon based on the kernel status.',
autoStart: true,
requires: [INotebookTracker],
activate: (app: JupyterFrontEnd, tracker: INotebookTracker) => {
// the favicons are provided by Jupyter Server
const notebookIcon = ' /static/favicons/favicon-notebook.ico';
const busyIcon = ' /static/favicons/favicon-busy-1.ico';
const baseURL = PageConfig.getBaseUrl();
const notebookIcon = URLExt.join(
baseURL,
'static/favicons/favicon-notebook.ico'
);
const busyIcon = URLExt.join(baseURL, 'static/favicons/favicon-busy-1.ico');
const updateBrowserFavicon = (
status: ISessionContext.KernelDisplayStatus
@ -452,6 +475,7 @@ const tabIcon: JupyterFrontEndPlugin<void> = {
*/
const trusted: JupyterFrontEndPlugin<void> = {
id: '@jupyter-notebook/notebook-extension:trusted',
description: 'A plugin that adds a Trusted indicator to the menu area.',
autoStart: true,
requires: [INotebookShell, ITranslator],
activate: (
@ -478,18 +502,97 @@ const trusted: JupyterFrontEndPlugin<void> = {
},
};
/**
* Add a command to open right sidebar for Editing Notebook Metadata when clicking on "Edit Notebook Metadata" under Edit menu
*/
const editNotebookMetadata: JupyterFrontEndPlugin<void> = {
id: '@jupyter-notebook/notebook-extension:edit-notebook-metadata',
description:
'Add a command to open right sidebar for Editing Notebook Metadata when clicking on "Edit Notebook Metadata" under Edit menu',
autoStart: true,
optional: [ICommandPalette, ITranslator, INotebookTools],
activate: (
app: JupyterFrontEnd,
palette: ICommandPalette | null,
translator: ITranslator | null,
notebookTools: INotebookTools | null
) => {
const { commands, shell } = app;
translator = translator ?? nullTranslator;
const trans = translator.load('notebook');
commands.addCommand(CommandIDs.openEditNotebookMetadata, {
label: trans.__('Edit Notebook Metadata'),
execute: async () => {
const command = 'application:toggle-panel';
const args = {
side: 'right',
title: 'Show Notebook Tools',
id: 'notebook-tools',
};
// Check if Show Notebook Tools (Right Sidebar) is open (expanded)
if (!commands.isToggled(command, args)) {
await commands.execute(command, args).then((_) => {
// For expanding the 'Advanced Tools' section (default: collapsed)
if (notebookTools) {
const tools = (notebookTools?.layout as any).widgets;
tools.forEach((tool: any) => {
if (
tool.widget.title.label === trans.__('Advanced Tools') &&
tool.collapsed
) {
tool.toggle();
}
});
}
});
}
},
isVisible: () =>
shell.currentWidget !== null &&
shell.currentWidget instanceof NotebookPanel,
});
if (palette) {
palette.addItem({
command: CommandIDs.openEditNotebookMetadata,
category: 'Notebook Operations',
});
}
},
};
/**
* A plugin to set the default windowing mode to defer for the notebook
* TODO: remove?
*/
const windowing: JupyterFrontEndPlugin<void> = {
id: '@jupyter-notebook/notebook-extension:windowing',
autoStart: true,
requires: [INotebookTracker],
activate: (app: JupyterFrontEnd, notebookTracker: INotebookTracker): void => {
notebookTracker.widgetAdded.connect((sender, widget) => {
widget.content['_viewModel'].windowingActive = false;
widget.content.notebookConfig.windowingMode = 'defer';
});
},
};
/**
* Export the plugins as default.
*/
const plugins: JupyterFrontEndPlugin<any>[] = [
checkpoints,
closeTab,
editNotebookMetadata,
kernelLogo,
kernelStatus,
notebookToolsWidget,
scrollOutput,
tabIcon,
trusted,
windowing,
];
export default plugins;

@ -23,7 +23,7 @@ body[data-notebook='notebooks'] .jp-NotebookPanel-toolbar {
padding-right: calc(calc(100% - var(--jp-notebook-max-width)) * 0.5);
}
body[data-notebook='notebooks'] .jp-Notebook {
body[data-notebook='notebooks'] .jp-WindowedPanel-outer {
padding-top: unset;
padding-left: calc(calc(100% - var(--jp-notebook-max-width)) * 0.5);
padding-right: calc(
@ -45,13 +45,21 @@ body[data-notebook='notebooks'] .jp-Notebook-cell {
}
/* Empty space at the bottom of the notebook (similar to classic) */
body[data-notebook='notebooks'] .jp-Notebook.jp-mod-scrollPastEnd::after {
body[data-notebook='notebooks']
.jp-Notebook.jp-mod-scrollPastEnd
.jp-WindowedPanel-outer::after {
min-height: 100px;
}
/* Workaround for disabling the full windowing mode */
body[data-notebook='notebooks']
.jp-Toolbar-item[data-jp-item-name='scrollbar'] {
display: none;
}
/* Fix background colors */
body[data-notebook='notebooks'] .jp-Notebook > * {
body[data-notebook='notebooks'] .jp-WindowedPanel-outer > * {
background: var(--jp-layout-color0);
}
@ -69,7 +77,7 @@ body[data-notebook='notebooks']
padding-top: calc(2 * var(--jp-notebook-padding));
}
body[data-notebook='notebooks'] .jp-WindowedPanel-window > *:last-child {
body[data-notebook='notebooks'] .jp-WindowedPanel-viewport > *:last-child {
padding-bottom: calc(2 * var(--jp-notebook-padding));
}
@ -135,7 +143,7 @@ body[data-format='mobile'] .jp-NotebookCheckpoint {
display: none;
}
body[data-format='mobile'] .jp-Notebook > *:first-child {
body[data-format='mobile'] .jp-WindowedPanel-outer > *:first-child {
margin-top: 0;
}
@ -145,13 +153,16 @@ body[data-format='mobile'] .jp-ToolbarButton .jp-DebuggerBugButton {
/* Virtual Notebook fixes */
body[data-notebook='notebooks'] .jp-WindowedPanel-window {
body[data-notebook='notebooks'] .jp-WindowedPanel-viewport {
background: var(--jp-layout-color0);
padding: unset;
}
/* Notebook box shadow */
body[data-notebook='notebooks'] .jp-Notebook > *:first-child:not(:last-child) {
body[data-notebook='notebooks']
.jp-WindowedPanel-outer
> *:first-child:not(:last-child) {
box-shadow: var(--jp-elevation-z4);
}

@ -1,6 +1,6 @@
{
"name": "@jupyter-notebook/terminal-extension",
"version": "7.0.5",
"version": "7.2.0-beta.1",
"description": "Jupyter Notebook - Terminal Extension",
"homepage": "https://github.com/jupyter/notebook",
"bugs": {
@ -38,10 +38,10 @@
"watch": "tsc -b --watch"
},
"dependencies": {
"@jupyter-notebook/application": "^7.0.5",
"@jupyterlab/application": "^4.0.7",
"@jupyterlab/coreutils": "^6.0.7",
"@jupyterlab/terminal": "^4.0.7",
"@jupyter-notebook/application": "^7.2.0-beta.1",
"@jupyterlab/application": "~4.2.0-beta.1",
"@jupyterlab/coreutils": "~6.2.0-beta.1",
"@jupyterlab/terminal": "~4.2.0-beta.1",
"@lumino/algorithm": "^2.0.1"
},
"devDependencies": {

@ -23,6 +23,7 @@ import { find } from '@lumino/algorithm';
*/
const opener: JupyterFrontEndPlugin<void> = {
id: '@jupyter-notebook/terminal-extension:opener',
description: 'A plugin to open terminals in a new tab.',
requires: [IRouter, ITerminalTracker],
autoStart: true,
activate: (
@ -62,6 +63,7 @@ const opener: JupyterFrontEndPlugin<void> = {
*/
const redirect: JupyterFrontEndPlugin<void> = {
id: '@jupyter-notebook/terminal-extension:redirect',
description: 'Open terminals in a new tab.',
requires: [ITerminalTracker],
optional: [INotebookPathOpener],
autoStart: true,

@ -1,6 +1,6 @@
{
"name": "@jupyter-notebook/tree-extension",
"version": "7.0.5",
"version": "7.2.0-beta.1",
"description": "Jupyter Notebook - Tree Extension",
"homepage": "https://github.com/jupyter/notebook",
"bugs": {
@ -38,23 +38,23 @@
"watch": "tsc -b --watch"
},
"dependencies": {
"@jupyter-notebook/application": "^7.0.5",
"@jupyter-notebook/tree": "^7.0.5",
"@jupyterlab/application": "^4.0.7",
"@jupyterlab/apputils": "^4.1.7",
"@jupyterlab/coreutils": "^6.0.7",
"@jupyterlab/docmanager": "^4.0.7",
"@jupyterlab/filebrowser": "^4.0.7",
"@jupyterlab/mainmenu": "^4.0.7",
"@jupyterlab/services": "^7.0.7",
"@jupyterlab/settingeditor": "^4.0.7",
"@jupyterlab/settingregistry": "^4.0.7",
"@jupyterlab/statedb": "^4.0.7",
"@jupyterlab/translation": "^4.0.7",
"@jupyterlab/ui-components": "^4.0.7",
"@jupyter-notebook/application": "^7.2.0-beta.1",
"@jupyter-notebook/tree": "^7.2.0-beta.1",
"@jupyterlab/application": "~4.2.0-beta.1",
"@jupyterlab/apputils": "~4.3.0-beta.1",
"@jupyterlab/coreutils": "~6.2.0-beta.1",
"@jupyterlab/docmanager": "~4.2.0-beta.1",
"@jupyterlab/filebrowser": "~4.2.0-beta.1",
"@jupyterlab/mainmenu": "~4.2.0-beta.1",
"@jupyterlab/services": "~7.2.0-beta.1",
"@jupyterlab/settingeditor": "~4.2.0-beta.1",
"@jupyterlab/settingregistry": "~4.2.0-beta.1",
"@jupyterlab/statedb": "~4.2.0-beta.1",
"@jupyterlab/translation": "~4.2.0-beta.1",
"@jupyterlab/ui-components": "~4.2.0-beta.1",
"@lumino/algorithm": "^2.0.1",
"@lumino/commands": "^2.1.3",
"@lumino/widgets": "^2.3.0"
"@lumino/commands": "^2.3.0",
"@lumino/widgets": "^2.3.2"
},
"devDependencies": {
"rimraf": "^3.0.2",

@ -2,7 +2,14 @@
"title": "File Browser Widget - File Actions",
"description": "File Browser widget - File Actions settings.",
"jupyter.lab.toolbars": {
"FileBrowser": [{ "name": "fileActions", "rank": 0 }]
"FileBrowser": [
{ "name": "fileAction-placeholder", "rank": 0 },
{ "name": "fileAction-open", "rank": 1 },
{ "name": "fileAction-download", "rank": 2 },
{ "name": "fileAction-rename", "rank": 3 },
{ "name": "fileAction-duplicate", "rank": 4 },
{ "name": "fileAction-delete", "rank": 5 }
]
},
"properties": {},
"additionalProperties": false,

@ -4,7 +4,6 @@
import {
CommandToolbarButtonComponent,
ReactWidget,
UseSignal,
} from '@jupyterlab/apputils';
import { FileBrowser } from '@jupyterlab/filebrowser';
@ -17,113 +16,75 @@ import { ISignal } from '@lumino/signaling';
import React from 'react';
/**
* A React component to display the list of command toolbar buttons.
*
*/
const Commands = ({
commands,
browser,
translator,
}: {
commands: CommandRegistry;
browser: FileBrowser;
translator: ITranslator;
}): JSX.Element => {
const trans = translator.load('notebook');
const selection = Array.from(browser.selectedItems());
const oneFolder = selection.some((item) => item.type === 'directory');
const multipleFiles =
selection.filter((item) => item.type === 'file').length > 1;
if (selection.length === 0) {
return <div>{trans.__('Select items to perform actions on them.')}</div>;
} else {
const buttons = ['delete'];
if (!oneFolder) {
buttons.unshift('duplicate');
if (!multipleFiles) {
buttons.unshift('rename');
}
buttons.unshift('download');
buttons.unshift('open');
} else if (selection.length === 1) {
buttons.unshift('rename');
}
export class FilesActionButtons {
/**
* The constructor of FilesActionButtons.
* @param options
*/
constructor(options: {
commands: CommandRegistry;
browser: FileBrowser;
selectionChanged: ISignal<FileBrowser, void>;
translator: ITranslator;
}) {
this._browser = options.browser;
const { commands, selectionChanged, translator } = options;
const trans = translator.load('notebook');
return (
<>
{buttons.map((action) => (
<CommandToolbarButtonComponent
key={action}
commands={commands}
id={`filebrowser:${action}`}
args={{ toolbar: true }}
icon={undefined}
/>
))}
</>
// Placeholder, when no file is selected.
const placeholder = ReactWidget.create(
<div key={'placeholder'}>
{trans.__('Select items to perform actions on them.')}
</div>
);
}
};
placeholder.id = 'fileAction-placeholder';
this._widgets.set('placeholder', placeholder);
/**
* A React component to display the file action buttons in the file browser toolbar.
*
* @param translator The Translation service
*/
const FileActions = ({
commands,
browser,
selectionChanged,
translator,
}: {
commands: CommandRegistry;
browser: FileBrowser;
selectionChanged: ISignal<FileBrowser, void>;
translator: ITranslator;
}): JSX.Element => {
return (
<UseSignal signal={selectionChanged} shouldUpdate={() => true}>
{(): JSX.Element => (
<Commands
// The action buttons.
const actions = ['open', 'download', 'rename', 'duplicate', 'delete'];
actions.forEach((action) => {
const widget = ReactWidget.create(
<CommandToolbarButtonComponent
key={action}
commands={commands}
browser={browser}
translator={translator}
id={`filebrowser:${action}`}
args={{ toolbar: true }}
icon={undefined}
/>
)}
</UseSignal>
);
};
);
widget.id = `fileAction-${action}`;
widget.addClass('jp-ToolbarButton');
widget.addClass('jp-FileAction');
this._widgets.set(action, widget);
});
selectionChanged.connect(this._onSelectionChanged, this);
this._onSelectionChanged();
}
/**
* A namespace for FileActionsComponent static functions.
*/
export namespace FileActionsComponent {
/**
* Create a new FileActionsComponent
*
* @param translator The translator
* Return an iterator with all the action widgets.
*/
export const create = ({
commands,
browser,
selectionChanged,
translator,
}: {
commands: CommandRegistry;
browser: FileBrowser;
selectionChanged: ISignal<FileBrowser, void>;
translator: ITranslator;
}): ReactWidget => {
const widget = ReactWidget.create(
<FileActions
commands={commands}
browser={browser}
selectionChanged={selectionChanged}
translator={translator}
/>
);
widget.addClass('jp-FileActions');
return widget;
get widgets(): IterableIterator<ReactWidget> {
return this._widgets.values();
}
/**
* Triggered when the selection change in file browser.
*/
private _onSelectionChanged = () => {
const selectedItems = Array.from(this._browser.selectedItems());
const selection = selectedItems.length > 0;
const oneFolder = selectedItems.some((item) => item.type === 'directory');
this._widgets.get('placeholder')?.setHidden(selection);
this._widgets.get('delete')?.setHidden(!selection);
this._widgets.get('duplicate')?.setHidden(!selection || oneFolder);
this._widgets.get('download')?.setHidden(!selection || oneFolder);
this._widgets.get('open')?.setHidden(!selection || oneFolder);
this._widgets.get('rename')?.setHidden(selectedItems.length !== 1);
};
private _browser: FileBrowser;
private _widgets = new Map<string, ReactWidget>();
}

@ -18,6 +18,7 @@ import {
FileBrowser,
Uploader,
IDefaultFileBrowser,
IFileBrowserFactory,
} from '@jupyterlab/filebrowser';
import { ISettingRegistry } from '@jupyterlab/settingregistry';
@ -45,7 +46,7 @@ import { Menu, MenuBar } from '@lumino/widgets';
import { NotebookTreeWidget, INotebookTree } from '@jupyter-notebook/tree';
import { FileActionsComponent } from './fileactions';
import { FilesActionButtons } from './fileactions';
/**
* The file browser factory.
@ -76,6 +77,8 @@ namespace CommandIDs {
*/
const createNew: JupyterFrontEndPlugin<void> = {
id: '@jupyter-notebook/tree-extension:new',
description:
'Plugin to add extra commands to the file browser to create new notebooks, files, consoles and terminals.',
requires: [ITranslator],
optional: [IToolbarWidgetRegistry],
autoStart: true,
@ -84,7 +87,7 @@ const createNew: JupyterFrontEndPlugin<void> = {
translator: ITranslator,
toolbarRegistry: IToolbarWidgetRegistry | null
) => {
const { commands } = app;
const { commands, serviceManager } = app;
const trans = translator.load('notebook');
const overflowOptions = {
@ -96,18 +99,35 @@ const createNew: JupyterFrontEndPlugin<void> = {
newMenu.title.icon = caretDownIcon;
menubar.addMenu(newMenu);
const newCommands = [
'notebook:create-new',
'terminal:create-new',
'console:create',
'filebrowser:create-new-file',
'filebrowser:create-new-directory',
];
const populateNewMenu = () => {
// create an entry per kernel spec for creating a new notebook
const specs = serviceManager.kernelspecs?.specs?.kernelspecs;
for (const name in specs) {
newMenu.addItem({
args: { kernelName: name, isLauncher: true },
command: 'notebook:create-new',
});
}
const baseCommands = [
'terminal:create-new',
'console:create',
'filebrowser:create-new-file',
'filebrowser:create-new-directory',
];
baseCommands.forEach((command) => {
newMenu.addItem({ command });
});
};
newCommands.forEach((command) => {
newMenu.addItem({ command });
serviceManager.kernelspecs?.specsChanged.connect(() => {
newMenu.clearItems();
populateNewMenu();
});
populateNewMenu();
if (toolbarRegistry) {
toolbarRegistry.addFactory(
FILE_BROWSER_FACTORY,
@ -128,6 +148,8 @@ const createNew: JupyterFrontEndPlugin<void> = {
*/
const fileActions: JupyterFrontEndPlugin<void> = {
id: '@jupyter-notebook/tree-extension:file-actions',
description:
'A plugin to add file browser actions to the file browser toolbar.',
autoStart: true,
requires: [IDefaultFileBrowser, IToolbarWidgetRegistry, ITranslator],
activate: (
@ -154,20 +176,16 @@ const fileActions: JupyterFrontEndPlugin<void> = {
// Create a toolbar item that adds buttons to the file browser toolbar
// to perform actions on the files
toolbarRegistry.addFactory(
FILE_BROWSER_FACTORY,
'fileActions',
(browser: FileBrowser) => {
const { commands } = app;
const fileActions = FileActionsComponent.create({
commands,
browser,
selectionChanged,
translator,
});
return fileActions;
}
);
const { commands } = app;
const fileActions = new FilesActionButtons({
commands,
browser,
selectionChanged,
translator,
});
for (const widget of fileActions.widgets) {
toolbarRegistry.addFactory(FILE_BROWSER_FACTORY, widget.id, () => widget);
}
},
};
@ -177,6 +195,8 @@ const fileActions: JupyterFrontEndPlugin<void> = {
*/
const loadPlugins: JupyterFrontEndPlugin<void> = {
id: '@jupyter-notebook/tree-extension:load-plugins',
description:
'Plugin to load the default plugins that are loaded on all the Notebook pages (tree, edit, view, etc.) so they are visible in the settings editor.',
autoStart: true,
requires: [ISettingRegistry],
activate(app: JupyterFrontEnd, settingRegistry: ISettingRegistry) {
@ -233,6 +253,7 @@ const loadPlugins: JupyterFrontEndPlugin<void> = {
*/
const openFileBrowser: JupyterFrontEndPlugin<void> = {
id: '@jupyter-notebook/tree-extension:open-file-browser',
description: 'A plugin to add file browser commands for the tree view.',
requires: [INotebookTree, IDefaultFileBrowser],
autoStart: true,
activate: (
@ -254,11 +275,13 @@ const openFileBrowser: JupyterFrontEndPlugin<void> = {
*/
const notebookTreeWidget: JupyterFrontEndPlugin<INotebookTree> = {
id: '@jupyter-notebook/tree-extension:widget',
description: 'A plugin to add the file browser widget to an INotebookShell.',
requires: [
IDefaultFileBrowser,
ITranslator,
ISettingRegistry,
IToolbarWidgetRegistry,
IFileBrowserFactory,
],
optional: [
IRunningSessionManagers,
@ -273,6 +296,7 @@ const notebookTreeWidget: JupyterFrontEndPlugin<INotebookTree> = {
translator: ITranslator,
settingRegistry: ISettingRegistry,
toolbarRegistry: IToolbarWidgetRegistry,
factory: IFileBrowserFactory,
manager: IRunningSessionManagers | null,
settingEditorTracker: ISettingEditorTracker | null,
jsonSettingEditorTracker: IJSONSettingEditorTracker | null
@ -351,6 +375,7 @@ const notebookTreeWidget: JupyterFrontEndPlugin<INotebookTree> = {
'showFileCheckboxes',
'showFileSizeColumn',
'sortNotebooksFirst',
'showFullPath',
].forEach((setting) => {
if (settings.user[setting] === undefined) {
void settings.set(setting, true);
@ -376,6 +401,21 @@ const notebookTreeWidget: JupyterFrontEndPlugin<INotebookTree> = {
}
);
const { tracker } = factory;
// TODO: remove
// Workaround to force the focus on the default file browser
// See https://github.com/jupyterlab/jupyterlab/issues/15629 for more info
const setCurrentToDefaultBrower = () => {
tracker['_pool'].current = browser;
};
tracker.widgetAdded.connect((sender, widget) =>
setCurrentToDefaultBrower()
);
setCurrentToDefaultBrower();
return nbTreeWidget;
},
};

@ -12,10 +12,26 @@
padding: 0px;
}
.jp-FileBrowser-toolbar button.jp-ToolbarButtonComponent {
.jp-FileBrowser-toolbar > .jp-Toolbar-item.jp-ToolbarButton:hover,
.jp-FileBrowser-toolbar > .jp-Toolbar-item.jp-CommandToolbarButton:hover,
.jp-FileBrowser-toolbar > .jp-Toolbar-item.jp-DropdownMenu:hover {
background: var(--neutral-fill-stealth-hover);
}
.jp-FileBrowser-toolbar .lm-MenuBar-item {
height: var(--jp-private-toolbar-height);
display: inline-flex;
align-items: center;
}
.jp-FileBrowser-toolbar .jp-ToolbarButtonComponent {
height: var(--jp-flat-button-height);
}
.jp-FileBrowser-toolbar jp-button.jp-ToolbarButtonComponent:hover {
background: inherit;
}
.jp-FileBrowser-filterBox {
padding: 0;
flex: 0 0 auto;
@ -31,27 +47,22 @@
/* Action buttons */
.jp-FileBrowser-toolbar > .jp-FileActions.jp-Toolbar-item {
display: flex;
flex-direction: row;
}
.jp-FileActions .jp-ToolbarButtonComponent-icon {
.jp-FileBrowser-toolbar > .jp-FileAction > .jp-ToolbarButtonComponent > svg {
display: none;
}
.jp-FileActions .jp-ToolbarButtonComponent[data-command='filebrowser:delete'] {
.jp-FileBrowser-toolbar > #fileAction-delete {
background-color: var(--jp-error-color1);
}
.jp-FileActions
.jp-FileBrowser-toolbar
.jp-ToolbarButtonComponent[data-command='filebrowser:delete']
.jp-ToolbarButtonComponent-label {
color: var(--jp-ui-inverse-font-color1);
}
.jp-FileBrowser-toolbar .jp-FileActions .jp-ToolbarButtonComponent {
.jp-FileBrowser-toolbar .jp-FileAction {
border: solid 1px var(--jp-border-color2);
margin: 1px;
min-height: 100%;
min-height: var(--jp-private-toolbar-height);
}

@ -1,6 +1,6 @@
{
"name": "@jupyter-notebook/tree",
"version": "7.0.5",
"version": "7.2.0-beta.1",
"description": "Jupyter Notebook - Tree",
"homepage": "https://github.com/jupyter/notebook",
"bugs": {
@ -38,22 +38,22 @@
"watch": "tsc -b --watch"
},
"dependencies": {
"@jupyter-notebook/application": "^7.0.5",
"@jupyterlab/application": "^4.0.7",
"@jupyterlab/apputils": "^4.1.7",
"@jupyterlab/coreutils": "^6.0.7",
"@jupyterlab/docmanager": "^4.0.7",
"@jupyterlab/filebrowser": "^4.0.7",
"@jupyterlab/mainmenu": "^4.0.7",
"@jupyterlab/services": "^7.0.7",
"@jupyterlab/settingregistry": "^4.0.7",
"@jupyterlab/statedb": "^4.0.7",
"@jupyterlab/translation": "^4.0.7",
"@jupyterlab/ui-components": "^4.0.7",
"@jupyter-notebook/application": "^7.2.0-beta.1",
"@jupyterlab/application": "~4.2.0-beta.1",
"@jupyterlab/apputils": "~4.3.0-beta.1",
"@jupyterlab/coreutils": "~6.2.0-beta.1",
"@jupyterlab/docmanager": "~4.2.0-beta.1",
"@jupyterlab/filebrowser": "~4.2.0-beta.1",
"@jupyterlab/mainmenu": "~4.2.0-beta.1",
"@jupyterlab/services": "~7.2.0-beta.1",
"@jupyterlab/settingregistry": "~4.2.0-beta.1",
"@jupyterlab/statedb": "~4.2.0-beta.1",
"@jupyterlab/translation": "~4.2.0-beta.1",
"@jupyterlab/ui-components": "~4.2.0-beta.1",
"@lumino/algorithm": "^2.0.1",
"@lumino/commands": "^2.1.3",
"@lumino/commands": "^2.3.0",
"@lumino/coreutils": "^2.1.2",
"@lumino/widgets": "^2.3.0"
"@lumino/widgets": "^2.3.2"
},
"devDependencies": {
"rimraf": "^3.0.2",

@ -42,7 +42,7 @@
vertical-align: sub;
}
button[data-command='filebrowser:refresh'] .jp-ToolbarButtonComponent-label {
jp-button[data-command='filebrowser:refresh'] .jp-ToolbarButtonComponent-label {
display: none;
}

@ -1,6 +1,6 @@
{
"name": "@jupyter-notebook/ui-components",
"version": "7.0.5",
"version": "7.2.0-beta.1",
"description": "Jupyter Notebook - UI components",
"homepage": "https://github.com/jupyter/notebook",
"bugs": {
@ -42,14 +42,14 @@
"watch": "tsc -b --watch"
},
"dependencies": {
"@jupyterlab/ui-components": "^4.0.7",
"@jupyterlab/ui-components": "~4.2.0-beta.1",
"react": "^18.2.0",
"react-dom": "^18.2.0"
},
"devDependencies": {
"@babel/core": "^7.10.2",
"@babel/preset-env": "^7.10.2",
"@jupyterlab/testutils": "^4.0.7",
"@jupyterlab/testutils": "~4.2.0-beta.1",
"@types/jest": "^29.2.5",
"babel-loader": "^8.0.6",
"jest": "^29.3.1",

@ -1,5 +1,5 @@
[build-system]
requires = ["hatchling>=1.11", "jupyterlab>=4.0.2,<5"]
requires = ["hatchling>=1.11", "jupyterlab>=4.2.0b1,<4.3"]
build-backend = "hatchling.build"
[project]
@ -27,11 +27,12 @@ classifiers = [
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Typing :: Typed",
]
dependencies = [
"jupyter_server>=2.4.0,<3",
"jupyterlab>=4.0.2,<5",
"jupyterlab>=4.2.0b1,<4.3",
"jupyterlab_server>=2.22.1,<3",
"notebook_shim>=0.2,<0.3",
"tornado>=6.2.0",
@ -133,32 +134,21 @@ dependencies = ["coverage[toml]", "pytest-cov"]
test = "python -m pytest -vv --cov notebook --cov-branch --cov-report term-missing:skip-covered {args}"
nowarn = "test -W default {args}"
[tool.hatch.envs.typing]
features = ["test"]
dependencies = ["mypy>=1.5.1"]
[tool.hatch.envs.typing.scripts]
test = "mypy --install-types --non-interactive {args}"
[tool.hatch.envs.lint]
dependencies = [
"black[jupyter]==22.10.0",
"mdformat>0.7",
"mdformat-gfm>=0.3.5",
"ruff==0.0.276"
]
detached = true
dependencies = ["pre-commit"]
[tool.hatch.envs.lint.scripts]
style = [
"ruff {args:.}",
"black --check --diff {args:.}",
"mdformat --check {args:CHANGELOG.md}"
]
fmt = [
"black {args:.}",
"ruff --fix {args:.}",
"mdformat {args:CHANGELOG.md}"
build = [
"pre-commit run --all-files ruff",
"pre-commit run --all-files ruff-format"
]
[tool.hatch.envs.typing]
dependencies = [ "pre-commit"]
detached = true
[tool.hatch.envs.typing.scripts]
test = "pre-commit run --all-files --hook-stage manual mypy"
[tool.hatch.build.hooks.jupyter-builder]
dependencies = ["hatch-jupyter-builder>=0.5"]
build-function = "hatch_jupyter_builder.npm_builder"
@ -185,7 +175,7 @@ version-cmd = "jlpm run release:bump --force --skip-commit"
[tool.jupyter-releaser.hooks]
before-bump-version = [
"python -m pip install --pre -U jupyterlab",
"python -m pip install -U \"jupyterlab>=4.2.0b1,<4.3\"",
"jlpm",
"jlpm run build:utils",
"python -m pip install hatch"
@ -203,7 +193,7 @@ minversion = "6.0"
xfail_strict = true
log_cli_level = "info"
addopts = [
"-raXs", "--durations=10", "--color=yes", "--doctest-modules",
"-ra", "--durations=10", "--color=yes", "--doctest-modules",
"--showlocals", "--strict-markers", "--strict-config"
]
testpaths = [
@ -241,41 +231,52 @@ source = ["notebook"]
files = "notebook"
python_version = "3.8"
strict = true
show_error_codes = true
enable_error_code = ["ignore-without-code", "redundant-expr", "truthy-bool"]
warn_unreachable = true
[tool.black]
line-length = 100
target-version = ["py37"]
skip-string-normalization = true
[tool.ruff]
target-version = "py37"
line-length = 100
select = [
"A", "B", "C", "DTZ", "E", "EM", "F", "FBT", "I", "ICN", "ISC", "N",
"PLC", "PLE", "PLR", "PLW", "Q", "RUF", "S", "SIM", "T", "TID", "UP",
"W", "YTT",
[tool.ruff.format]
docstring-code-format = true
[tool.ruff.lint]
extend-select = [
"B", # flake8-bugbear
"I", # isort
"ARG", # flake8-unused-arguments
"C4", # flake8-comprehensions
"EM", # flake8-errmsg
"ICN", # flake8-import-conventions
"G", # flake8-logging-format
"PGH", # pygrep-hooks
"PIE", # flake8-pie
"PL", # pylint
"PTH", # flake8-use-pathlib
"PT", # flake8-pytest-style
"RET", # flake8-return
"RUF", # Ruff-specific
"SIM", # flake8-simplify
"T20", # flake8-print
"UP", # pyupgrade
"YTT", # flake8-2020
"EXE", # flake8-executable
"PYI", # flake8-pyi
"S", # flake8-bandit
]
ignore = [
# Q000 Single quotes found but double quotes preferred
"Q000",
# FBT001 Boolean positional arg in function definition
"FBT001", "FBT002", "FBT003",
# C408 Unnecessary `dict` call (rewrite as a literal)
"C408", "C416",
# RUF012 Mutable class attributes should be annotated with `typing.ClassVar`
"RUF012",
"PLR", # Design related pylint codes
"C408", "C416", # Unnecessary `dict` call (rewrite as a literal)
"RUF012", # Mutable class attributes should be annotated with `typing.ClassVar`
]
[tool.ruff.per-file-ignores]
[tool.ruff.lint.per-file-ignores]
# S101 Use of `assert` detected
# F841 Local variable `foo` is assigned to but never used
# PLR2004 Magic value used in comparison
"tests/*" = ["S101", "F841", "PLR2004"]
# undefined name 'c'
"tests/*" = ["S101", "F841", "ARG", "PTH"]
"docs/source/conf.py" = ["PTH"]
"ui-tests/test/jupyter_server_config.py" = ["F821"]
"*.ipynb" = ["E402", "B018", "E501", "T201", "RET"]
[tool.interrogate]
ignore-init-module=true
@ -288,7 +289,4 @@ fail-under=100
exclude = ["tests", "ui-tests", "docs", "node_modules", "setup.py"]
[tool.repo-review]
ignore = ["PY007", "PP308", "GH102", "PC140", "PC180"]
[tool.codespell]
ignore-words-list = "hart,noteable"
ignore = ["GH102", "PC180", "PC111"]

@ -32,8 +32,8 @@ workspaces_dir = pytest.fixture(lambda tmp_path: mkdir(tmp_path, "workspaces"))
labextensions_dir = pytest.fixture(lambda tmp_path: mkdir(tmp_path, "labextensions_dir"))
@pytest.fixture
def make_notebook_app( # noqa PLR0913
@pytest.fixture()
def make_notebook_app( # PLR0913
jp_root_dir,
jp_template_dir,
app_settings_dir,
@ -92,7 +92,7 @@ def make_notebook_app( # noqa PLR0913
)
# Copy the schema files.
test_data = str(files("jupyterlab_server.test_data")._paths[0]) # type: ignore
test_data = str(files("jupyterlab_server.test_data")._paths[0])
src = pathlib.PurePath(test_data, "schemas", "@jupyterlab")
dst = pathlib.PurePath(str(schemas_dir), "@jupyterlab")
if os.path.exists(dst):
@ -131,7 +131,7 @@ def make_notebook_app( # noqa PLR0913
return _make_notebook_app
@pytest.fixture
@pytest.fixture()
def notebookapp(jp_serverapp, make_notebook_app):
app = make_notebook_app()
app._link_jupyter_server_extension(jp_serverapp)

@ -6,7 +6,7 @@ from tornado.httpclient import HTTPClientError
from notebook.app import JupyterNotebookApp, TreeHandler
@pytest.fixture
@pytest.fixture()
def notebooks(jp_create_notebook, notebookapp):
nbpaths = (
"notebook1.ipynb",
@ -48,7 +48,7 @@ async def test_tree_handler(notebooks, notebookapp, jp_fetch):
nonlocal redirected_url
redirected_url = url
TreeHandler.redirect = redirect # type:ignore
TreeHandler.redirect = redirect
await jp_fetch("tree", "notebook1.ipynb")
assert redirected_url == "/a%40b/notebooks/notebook1.ipynb"

@ -15,7 +15,7 @@
"test:update": "playwright test --update-snapshots"
},
"dependencies": {
"@jupyterlab/galata": "~5.0.0",
"@jupyterlab/galata": "~5.2.0-beta.0",
"@playwright/test": "^1.33.0",
"rimraf": "^3.0.2"
}

@ -22,7 +22,7 @@ test.describe('File Browser', () => {
await page.getByText('folder1').last().click();
const toolbar = page.getByRole('navigation');
const toolbar = page.getByRole('toolbar');
expect(toolbar.getByText('Rename')).toBeVisible();
expect(toolbar.getByText('Delete')).toBeVisible();
@ -33,7 +33,7 @@ test.describe('File Browser', () => {
await page.getByText('empty.ipynb').last().click();
const toolbar = page.getByRole('navigation');
const toolbar = page.getByRole('toolbar');
['Rename', 'Delete', 'Open', 'Download', 'Delete'].forEach(async (text) => {
expect(toolbar.getByText(text)).toBeVisible();
@ -48,7 +48,7 @@ test.describe('File Browser', () => {
await page.getByText('folder2').last().click();
await page.getByText('empty.ipynb').last().click();
const toolbar = page.getByRole('navigation');
const toolbar = page.getByRole('toolbar');
expect(toolbar.getByText('Rename')).toBeHidden();
expect(toolbar.getByText('Open')).toBeHidden();
@ -67,7 +67,7 @@ test.describe('File Browser', () => {
await page.getByText('simple.ipynb').last().click();
await page.getByText('empty.ipynb').last().click();
const toolbar = page.getByRole('navigation');
const toolbar = page.getByRole('toolbar');
const [nb1, nb2] = await Promise.all([
page.waitForEvent('popup'),

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

@ -1,15 +1,13 @@
// Copyright (c) Jupyter Development Team.
// Distributed under the terms of the Modified BSD License.
import path from 'path';
import { expect } from '@playwright/test';
import { test } from './fixtures';
import { hideAddCellButton, waitForKernelReady } from './utils';
test.use({ autoGoto: false });
test.use({ autoGoto: false, viewport: { width: 524, height: 800 } });
test.describe('Mobile', () => {
test('The layout should be more compact on the file browser page', async ({
@ -18,10 +16,6 @@ test.describe('Mobile', () => {
}) => {
await page.goto(`tree/${tmpPath}`);
// temporary workaround to trigger a toolbar resize
// TODO: investigate in https://github.com/jupyter/notebook/issues/6553
await page.setViewportSize({ width: 524, height: 800 });
await page.waitForSelector('#top-panel-wrapper', { state: 'hidden' });
expect(await page.screenshot()).toMatchSnapshot('tree.png');
@ -32,30 +26,29 @@ test.describe('Mobile', () => {
tmpPath,
browserName,
}) => {
const notebook = 'empty.ipynb';
await page.contents.uploadFile(
path.resolve(__dirname, `./notebooks/${notebook}`),
`${tmpPath}/${notebook}`
);
await page.goto(`notebooks/${tmpPath}/${notebook}`);
await page.goto(`tree/${tmpPath}`);
// wait for the kernel status animations to be finished
await waitForKernelReady(page);
// Create a new notebook
const [notebook] = await Promise.all([
page.waitForEvent('popup'),
page.click('text="New"'),
page.click('text="Python 3 (ipykernel)"'),
]);
// temporary workaround to trigger a toolbar resize
// TODO: investigate in https://github.com/jupyter/notebook/issues/6553
await page.setViewportSize({ width: 524, height: 800 });
// wait for the kernel status animations to be finished
await waitForKernelReady(notebook);
// force switching back to command mode to avoid capturing the cursor in the screenshot
await page.evaluate(async () => {
await notebook.evaluate(async () => {
await window.jupyterapp.commands.execute('notebook:enter-command-mode');
});
// TODO: remove
if (browserName === 'firefox') {
await hideAddCellButton(page);
await hideAddCellButton(notebook);
}
expect(await page.screenshot()).toMatchSnapshot('notebook.png');
expect(await notebook.screenshot()).toMatchSnapshot('notebook.png');
await notebook.close();
});
});

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.9 KiB

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.1 KiB

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.1 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.3 KiB

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

@ -6,7 +6,9 @@
"id": "6f7028b9-4d2c-4fa2-96ee-bfa77bbee434",
"metadata": {},
"outputs": [],
"source": ["print('1\\n' * 200)"]
"source": [
"print(\"1\\n\" * 200)"
]
},
{
"cell_type": "code",
@ -14,7 +16,9 @@
"id": "6f7028b9-4d2c-4fa2-96ee-bfa77bbee434",
"metadata": {},
"outputs": [],
"source": ["print('1\\n' * 20)"]
"source": [
"print(\"1\\n\" * 20)"
]
}
],
"metadata": {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.2 KiB

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.7 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 39 KiB

@ -10,8 +10,8 @@ test.describe('Smoke', () => {
test('Tour', async ({ page, tmpPath }) => {
// Open the tree page
await page.goto(`tree/${tmpPath}`);
await page.click('text="Running"');
await page.click('text="Files"');
await page.locator('.jp-TreePanel >> text="Running"').click();
await page.locator('.jp-TreePanel >> text="Files"').click();
// Create a new console
await page.menu.clickMenuItem('New>Console');
@ -27,7 +27,7 @@ test.describe('Smoke', () => {
const [notebook] = await Promise.all([
page.waitForEvent('popup'),
page.click('text="New"'),
page.click('text="Notebook"'),
page.click('text="Python 3 (ipykernel)"'),
]);
try {
@ -71,8 +71,8 @@ math.pi`);
]);
// Shut down the kernels
await tree2.click('text="Running"');
await tree2.click('#main-panel button :text("Shut Down All")');
await tree2.locator('.jp-TreePanel >> text="Running"').click();
await tree2.click('#main-panel jp-button :text("Shut Down All")');
await tree2.press('.jp-Dialog', 'Enter');
// Close the pages

@ -39,7 +39,8 @@ test('should update url when navigating in filebrowser', async ({
test('Should activate file browser tab', async ({ page, tmpPath }) => {
await page.goto(`tree/${tmpPath}`);
await page.click('text="Running"');
await page.locator('.jp-TreePanel >> text="Running"').click();
await expect(
page.locator('#main-panel #jp-running-sessions-tree')
).toBeVisible();

@ -32,7 +32,9 @@ export async function waitForKernelReady(
}, true);
return finished;
});
await page.waitForSelector('.jp-DebuggerBugButton[aria-disabled="false"]');
if (page.viewportSize()?.width > 600) {
await page.waitForSelector('.jp-DebuggerBugButton[aria-disabled="false"]');
}
}
/**

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save