Manual-commit notebook snapshot extension (JupyterLab 4):
Backend
- Storage adapter layer (Local + S3 via boto3, pip extra)
- Dumb put/get/list/delete contract; key validation
- S3Storage: lazy boto3 import, S3ConnectionError with friendly
messages + connectivity check at startup
- SnapshotStore
- Strip code outputs/execution_count, MD5 on cleaned JSON
- Gzipped envelope (id/timestamp/name/description/hash/size/notebook)
- Append-only manifest.json (rebuildable from version files)
- SnapshotUnchangedError when new hash matches most recent version
- REST API (commit / list / content) under /snapshot/ namespace
- traitlets config (storage_type, local_root, s3_* + S3_* env fallback)
Frontend
- snapshot:commit command (toolbar button + command palette)
- Dialog for name + description
- SnapshotPanel (left sidebar timeline) + DiffWidget (main area)
- Cell diff: id-match first, LCS fallback; jsdiff for line diff
- Restore via model.fromJSON() + context.save() (no refresh)
- All AGENTS.md hard conventions enforced
Tests: 33 backend pytest passing (storage + store + routes)
Docs: AGENTS.md, design.md, README.md synced with implementation.
Co-Authored-By: Claude <noreply@anthropic.com>
89 lines
2.7 KiB
Markdown
89 lines
2.7 KiB
Markdown
# Making a new release of snapshot
|
|
|
|
The extension can be published to `PyPI` and `npm` manually or using the [Jupyter Releaser](https://github.com/jupyter-server/jupyter_releaser).
|
|
|
|
## Manual release
|
|
|
|
### Python package
|
|
|
|
This extension can be distributed as Python packages. All of the Python
|
|
packaging instructions are in the `pyproject.toml` file to wrap your extension in a
|
|
Python package. Before generating a package, you first need to install some tools:
|
|
|
|
```bash
|
|
pip install build twine hatch
|
|
```
|
|
|
|
Bump the version using `hatch`. By default this will create a tag.
|
|
See the docs on [hatch-nodejs-version](https://github.com/agoose77/hatch-nodejs-version#semver) for details.
|
|
|
|
```bash
|
|
hatch version <new-version>
|
|
```
|
|
|
|
Make sure to clean up all the development files before building the package:
|
|
|
|
```bash
|
|
jlpm clean:all
|
|
```
|
|
|
|
You could also clean up the local git repository:
|
|
|
|
```bash
|
|
git clean -dfX
|
|
```
|
|
|
|
To create a Python source package (`.tar.gz`) and the binary package (`.whl`) in the `dist/` directory, do:
|
|
|
|
```bash
|
|
python -m build
|
|
```
|
|
|
|
> `python setup.py sdist bdist_wheel` is deprecated and will not work for this package.
|
|
|
|
Then to upload the package to PyPI, do:
|
|
|
|
```bash
|
|
twine upload dist/*
|
|
```
|
|
|
|
### NPM package
|
|
|
|
To publish the frontend part of the extension as a NPM package, do:
|
|
|
|
```bash
|
|
npm login
|
|
npm publish --access public
|
|
```
|
|
|
|
## Automated releases with the Jupyter Releaser
|
|
|
|
The extension repository should already be compatible with the Jupyter Releaser. But
|
|
the GitHub repository and the package managers need to be properly set up. Please
|
|
follow the instructions of the Jupyter Releaser [checklist](https://jupyter-releaser.readthedocs.io/en/latest/how_to_guides/convert_repo_from_repo.html).
|
|
|
|
For the release workflows in this repository, make sure GitHub is configured with:
|
|
|
|
- a `release` environment
|
|
- an `APP_PRIVATE_KEY` secret
|
|
- an `APP_ID` repository variable
|
|
|
|
When using [npm trusted publishing](https://docs.npmjs.com/trusted-publishers), `NPM_TOKEN` is not required (and trusted publishing is recommended). Configure `NPM_TOKEN` only if you are publishing without trusted publishers.
|
|
|
|
Here is a summary of the steps to cut a new release:
|
|
|
|
- Go to the Actions panel
|
|
- Run the "Step 1: Prep Release" workflow
|
|
- Check the draft changelog
|
|
- Run the "Step 2: Publish Release" workflow
|
|
|
|
> [!NOTE]
|
|
> Check out the [workflow documentation](https://jupyter-releaser.readthedocs.io/en/latest/get_started/making_release_from_repo.html)
|
|
> for more information.
|
|
|
|
## Publishing to `conda-forge`
|
|
|
|
If the package is not on conda forge yet, check the documentation to learn how to add it: https://conda-forge.org/docs/maintainer/adding_pkgs.html
|
|
|
|
Otherwise a bot should pick up the new version publish to PyPI, and open a new PR on the feedstock repository automatically.
|