hypernote 0.3.0__tar.gz → 0.4.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {hypernote-0.3.0 → hypernote-0.4.0}/AGENTS.md +1 -1
- {hypernote-0.3.0 → hypernote-0.4.0}/CHANGELOG.md +18 -0
- {hypernote-0.3.0 → hypernote-0.4.0}/CONTEXT.md +15 -0
- {hypernote-0.3.0 → hypernote-0.4.0}/PKG-INFO +3 -1
- {hypernote-0.3.0 → hypernote-0.4.0}/README.md +2 -0
- {hypernote-0.3.0 → hypernote-0.4.0}/SKILL.md +4 -0
- {hypernote-0.3.0 → hypernote-0.4.0}/dev/current-architecture.md +3 -0
- {hypernote-0.3.0 → hypernote-0.4.0}/dev/release.md +22 -0
- {hypernote-0.3.0 → hypernote-0.4.0}/docs/cli.md +1 -0
- {hypernote-0.3.0 → hypernote-0.4.0}/docs/getting-started.md +6 -0
- {hypernote-0.3.0 → hypernote-0.4.0}/docs/runtime-model.md +13 -0
- {hypernote-0.3.0 → hypernote-0.4.0}/pyproject.toml +1 -1
- {hypernote-0.3.0 → hypernote-0.4.0}/src/hypernote/cli/main.py +2 -0
- {hypernote-0.3.0 → hypernote-0.4.0}/tests/conftest.py +4 -5
- {hypernote-0.3.0 → hypernote-0.4.0}/tests/test_cli.py +4 -0
- {hypernote-0.3.0 → hypernote-0.4.0}/tests/test_live_server.py +15 -0
- {hypernote-0.3.0 → hypernote-0.4.0}/uv.lock +1 -1
- {hypernote-0.3.0 → hypernote-0.4.0}/.github/workflows/release.yml +0 -0
- {hypernote-0.3.0 → hypernote-0.4.0}/.gitignore +0 -0
- {hypernote-0.3.0 → hypernote-0.4.0}/CLAUDE.md +0 -0
- {hypernote-0.3.0 → hypernote-0.4.0}/dev/README.md +0 -0
- {hypernote-0.3.0 → hypernote-0.4.0}/dev/cli-agent-ergonomics-rollout.md +0 -0
- {hypernote-0.3.0 → hypernote-0.4.0}/dev/module-map.md +0 -0
- {hypernote-0.3.0 → hypernote-0.4.0}/dev/testing-and-verification.md +0 -0
- {hypernote-0.3.0 → hypernote-0.4.0}/docs/README.md +0 -0
- {hypernote-0.3.0 → hypernote-0.4.0}/docs/browser-regression-spec.md +0 -0
- {hypernote-0.3.0 → hypernote-0.4.0}/docs/sdk.md +0 -0
- {hypernote-0.3.0 → hypernote-0.4.0}/src/hypernote/__init__.py +0 -0
- {hypernote-0.3.0 → hypernote-0.4.0}/src/hypernote/actor_ledger.py +0 -0
- {hypernote-0.3.0 → hypernote-0.4.0}/src/hypernote/cli/__init__.py +0 -0
- {hypernote-0.3.0 → hypernote-0.4.0}/src/hypernote/errors.py +0 -0
- {hypernote-0.3.0 → hypernote-0.4.0}/src/hypernote/execution_orchestrator.py +0 -0
- {hypernote-0.3.0 → hypernote-0.4.0}/src/hypernote/runtime_manager.py +0 -0
- {hypernote-0.3.0 → hypernote-0.4.0}/src/hypernote/sdk.py +0 -0
- {hypernote-0.3.0 → hypernote-0.4.0}/src/hypernote/server/__init__.py +0 -0
- {hypernote-0.3.0 → hypernote-0.4.0}/src/hypernote/server/extension.py +0 -0
- {hypernote-0.3.0 → hypernote-0.4.0}/src/hypernote/server/handlers.py +0 -0
- {hypernote-0.3.0 → hypernote-0.4.0}/src/hypernote/server/subshell.py +0 -0
- {hypernote-0.3.0 → hypernote-0.4.0}/tests/__init__.py +0 -0
- {hypernote-0.3.0 → hypernote-0.4.0}/tests/helpers.py +0 -0
- {hypernote-0.3.0 → hypernote-0.4.0}/tests/test_actor_ledger.py +0 -0
- {hypernote-0.3.0 → hypernote-0.4.0}/tests/test_browser_regression.py +0 -0
- {hypernote-0.3.0 → hypernote-0.4.0}/tests/test_package_metadata.py +0 -0
- {hypernote-0.3.0 → hypernote-0.4.0}/tests/test_runtime_manager.py +0 -0
- {hypernote-0.3.0 → hypernote-0.4.0}/tests/test_sdk.py +0 -0
- {hypernote-0.3.0 → hypernote-0.4.0}/tests/test_server_extension.py +0 -0
- {hypernote-0.3.0 → hypernote-0.4.0}/tests/test_shared_notebook_accessor.py +0 -0
- {hypernote-0.3.0 → hypernote-0.4.0}/tests/test_subshell.py +0 -0
|
@@ -40,7 +40,7 @@ Hypernote owns a thin control plane:
|
|
|
40
40
|
|
|
41
41
|
Core rule: notebook edits and execution must operate on one logical document truth whether JupyterLab is closed, already open, or opened mid-run.
|
|
42
42
|
|
|
43
|
-
Lifecycle rule: notebook contents and outputs persist through Jupyter's `.ipynb` model, but Hypernote's runtime state, job records,
|
|
43
|
+
Lifecycle rule: notebook contents and outputs persist through Jupyter's `.ipynb` model, but Hypernote's runtime state, job records, cell attribution, and `setup serve` collaboration journal are intentionally ephemeral and notebook- or server-scoped.
|
|
44
44
|
|
|
45
45
|
Concurrent-actor rule: JupyterLab and Hypernote share one notebook session and one kernel. Hypernote-driven cells run in an ipykernel subshell so the kernel's main shell stays responsive to native Lab actions. Hypernote's extension overrides `/api/kernels/{id}/interrupt` and `/api/kernels/{id}/restart` so Lab's Stop and Restart toolbar buttons reach the subshell-routed cell or perform the right cleanup. See [dev/current-architecture.md](dev/current-architecture.md) for the full mechanism.
|
|
46
46
|
|
|
@@ -4,6 +4,24 @@ All notable changes to this project will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
## Unreleased
|
|
6
6
|
|
|
7
|
+
## 0.4.0 - 2026-05-10
|
|
8
|
+
|
|
9
|
+
Hypernote now treats Jupyter's real-time collaboration journal as temporary
|
|
10
|
+
server-local state for `setup serve`, keeping the `.ipynb` notebook file as the
|
|
11
|
+
only durable project artifact.
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
|
|
15
|
+
- `hypernote setup serve` now configures Jupyter RTC to use temporary
|
|
16
|
+
collaboration journal storage instead of Jupyter's default project-root
|
|
17
|
+
`.jupyter_ystore.db` SQLite database.
|
|
18
|
+
- Live-server and browser regression fixtures now launch with the same
|
|
19
|
+
temporary journal policy as `setup serve`, including coverage that notebook
|
|
20
|
+
execution does not create `.jupyter_ystore.db` in the server root.
|
|
21
|
+
- Project guidance now distinguishes the durable **Notebook File** from the
|
|
22
|
+
temporary **Collaboration Journal**, and documents the crash-recovery tradeoff
|
|
23
|
+
for unsaved live shared-document changes.
|
|
24
|
+
|
|
7
25
|
## 0.3.0 - 2026-05-10
|
|
8
26
|
|
|
9
27
|
Hypernote is now a JupyterLab-first integration: the default install carries the
|
|
@@ -9,6 +9,14 @@ server so agents and humans can work against one notebook truth.
|
|
|
9
9
|
The server-side notebook document that all Hypernote operations use as the live notebook truth.
|
|
10
10
|
_Avoid_: file-only notebook truth
|
|
11
11
|
|
|
12
|
+
**Notebook File**:
|
|
13
|
+
The `.ipynb` artifact that persists notebook contents and outputs after the Shared Document is saved.
|
|
14
|
+
_Avoid_: Hypernote database, collaboration store, job history
|
|
15
|
+
|
|
16
|
+
**Collaboration Journal**:
|
|
17
|
+
The Jupyter real-time collaboration update store used as recoverability cache for live Shared Document state.
|
|
18
|
+
_Avoid_: notebook primary storage, Hypernote job history, attribution store
|
|
19
|
+
|
|
12
20
|
**Hypernote JupyterLab Server**:
|
|
13
21
|
A JupyterLab server launched or verified with Hypernote's required server and collaboration extensions.
|
|
14
22
|
_Avoid_: plain Jupyter server, separate agent server
|
|
@@ -24,6 +32,8 @@ _Avoid_: separate runtime mode
|
|
|
24
32
|
## Relationships
|
|
25
33
|
|
|
26
34
|
- A **Hypernote JupyterLab Server** owns the **Shared Document**.
|
|
35
|
+
- A **Shared Document** saves durable notebook contents and outputs into one **Notebook File**.
|
|
36
|
+
- A **Collaboration Journal** is temporary server-local state; Hypernote does not make it a durable project artifact or product choice.
|
|
27
37
|
- An **Open Lab Tab** and **Agent Automation** must attach to the same **Hypernote JupyterLab Server**.
|
|
28
38
|
- **Agent Automation** does not require an **Open Lab Tab**, but it still requires the **Hypernote JupyterLab Server**.
|
|
29
39
|
|
|
@@ -31,8 +41,13 @@ _Avoid_: separate runtime mode
|
|
|
31
41
|
|
|
32
42
|
> **Dev:** "Can agents run notebooks without JupyterLab?"
|
|
33
43
|
> **Domain expert:** "No separate mode: agents use the **Hypernote JupyterLab Server** even if nobody has an **Open Lab Tab**."
|
|
44
|
+
>
|
|
45
|
+
> **Dev:** "Is the collaboration database part of Hypernote's durable state?"
|
|
46
|
+
> **Domain expert:** "No — durability means the **Shared Document** has saved back to the **Notebook File**."
|
|
34
47
|
|
|
35
48
|
## Flagged Ambiguities
|
|
36
49
|
|
|
37
50
|
- Agent work without an **Open Lab Tab** was previously described as a separate product mode; resolved: Hypernote only distinguishes whether an **Open Lab Tab** exists.
|
|
38
51
|
- "Jupyter server" was used broadly; resolved: the supported product server is a **Hypernote JupyterLab Server**.
|
|
52
|
+
- Jupyter's real-time collaboration store was treated as possible Hypernote state; resolved: it is a **Collaboration Journal**, not primary notebook storage or Hypernote job history.
|
|
53
|
+
- Persistent collaboration-store configuration was considered as a user-facing choice; resolved: Hypernote treats the **Collaboration Journal** as temporary server-local state only.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: hypernote
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.4.0
|
|
4
4
|
Summary: Thin control plane for Jupyter notebook execution with jobs, attribution, and runtime lifecycle
|
|
5
5
|
Project-URL: Homepage, https://github.com/gilad-rubin/hypernote
|
|
6
6
|
Project-URL: Repository, https://github.com/gilad-rubin/hypernote
|
|
@@ -29,6 +29,7 @@ Description-Content-Type: text/markdown
|
|
|
29
29
|
- **One notebook truth** - notebook edits, execution, and late-open JupyterLab views all operate on the same logical document.
|
|
30
30
|
- **Agent-first surface** - the Python SDK is primary, and the CLI is a thin shell over it.
|
|
31
31
|
- **Ephemeral control plane** - Jupyter owns durable `.ipynb` contents and outputs; Hypernote owns in-memory runtimes, jobs, and attribution.
|
|
32
|
+
- **Temporary collaboration journal** - `setup serve` keeps Jupyter RTC updates in server-local temp storage, not repo-root databases.
|
|
32
33
|
|
|
33
34
|
## What it ships
|
|
34
35
|
|
|
@@ -76,6 +77,7 @@ Jupyter owns:
|
|
|
76
77
|
|
|
77
78
|
- notebook persistence
|
|
78
79
|
- shared YDoc document state
|
|
80
|
+
- temporary collaboration journal state for live RTC updates
|
|
79
81
|
- kernel and session primitives
|
|
80
82
|
- notebook rendering in JupyterLab
|
|
81
83
|
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
- **One notebook truth** - notebook edits, execution, and late-open JupyterLab views all operate on the same logical document.
|
|
5
5
|
- **Agent-first surface** - the Python SDK is primary, and the CLI is a thin shell over it.
|
|
6
6
|
- **Ephemeral control plane** - Jupyter owns durable `.ipynb` contents and outputs; Hypernote owns in-memory runtimes, jobs, and attribution.
|
|
7
|
+
- **Temporary collaboration journal** - `setup serve` keeps Jupyter RTC updates in server-local temp storage, not repo-root databases.
|
|
7
8
|
|
|
8
9
|
## What it ships
|
|
9
10
|
|
|
@@ -51,6 +52,7 @@ Jupyter owns:
|
|
|
51
52
|
|
|
52
53
|
- notebook persistence
|
|
53
54
|
- shared YDoc document state
|
|
55
|
+
- temporary collaboration journal state for live RTC updates
|
|
54
56
|
- kernel and session primitives
|
|
55
57
|
- notebook rendering in JupyterLab
|
|
56
58
|
|
|
@@ -51,6 +51,10 @@ uv run hypernote setup serve --no-browser &
|
|
|
51
51
|
available. The default address is `http://127.0.0.1:8888`. Omit `--no-browser`
|
|
52
52
|
when you want setup to open JupyterLab immediately.
|
|
53
53
|
|
|
54
|
+
Servers launched by `setup serve` use temporary Jupyter collaboration journal storage.
|
|
55
|
+
Notebook contents and outputs still persist through the `.ipynb` file once the
|
|
56
|
+
shared document is saved.
|
|
57
|
+
|
|
54
58
|
**If the server is running but `default_kernel` points to the wrong Python** (e.g., a
|
|
55
59
|
different repo's `.venv`), stop the old server and start a new one with `setup serve`
|
|
56
60
|
from this repo. This is the only case where you should restart a running server.
|
|
@@ -21,6 +21,8 @@ Jupyter shared document + kernel/session primitives
|
|
|
21
21
|
- `setup serve` is the CLI bootstrap path for starting a local Hypernote-enabled JupyterLab server.
|
|
22
22
|
- Notebook reads and writes must go through the shared-document path.
|
|
23
23
|
- Execution must resolve cell source from the same document model the UI sees.
|
|
24
|
+
- Servers launched by `setup serve` use Jupyter's temporary RTC collaboration journal;
|
|
25
|
+
the `.ipynb` file is the durable notebook artifact.
|
|
24
26
|
- JupyterLab is the supported integration environment. Opening a Lab tab is optional,
|
|
25
27
|
but Hypernote still runs through the Hypernote-enabled JupyterLab server and shared
|
|
26
28
|
document path.
|
|
@@ -31,6 +33,7 @@ Jupyter shared document + kernel/session primitives
|
|
|
31
33
|
- open-tab and closed-tab behavior must match
|
|
32
34
|
- opening a notebook mid-run must show prior output and continue streaming
|
|
33
35
|
- persisted `.ipynb` output must converge with the live shared document
|
|
36
|
+
- unsaved shared-document state is not recovered through a project-local RTC database
|
|
34
37
|
- runtime creation must resolve the desired kernel from an explicit override, otherwise the
|
|
35
38
|
notebook metadata kernelspec, otherwise `python3`
|
|
36
39
|
- Hypernote must not silently reuse a live runtime if the notebook now targets a different kernel
|
|
@@ -63,11 +63,30 @@ Either way, the only change to `pyproject.toml` is the top-level
|
|
|
63
63
|
git add CHANGELOG.md pyproject.toml uv.lock
|
|
64
64
|
git commit -m "chore: prepare v$VERSION release"
|
|
65
65
|
git push -u origin release/v$VERSION
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
If the PR is **only** release bookkeeping, a generic release title is fine:
|
|
69
|
+
|
|
70
|
+
```bash
|
|
66
71
|
gh pr create \
|
|
67
72
|
--title "chore: prepare v$VERSION release" \
|
|
68
73
|
--body "Release prep for v$VERSION. CHANGELOG section moved, version bumped, lock refreshed. The release workflow runs automatically after merge."
|
|
69
74
|
```
|
|
70
75
|
|
|
76
|
+
If the release PR also contains a feature or fix, the PR title and body should
|
|
77
|
+
lead with that shipped change, not with the version bump. Include the target
|
|
78
|
+
version in the title so it is clear that merging to `master` releases it:
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
gh pr create \
|
|
82
|
+
--title "Use temporary collaboration journal for setup serve and release v$VERSION" \
|
|
83
|
+
--body "This PR ships the temporary collaboration journal change and prepares v$VERSION. Merging to master triggers the release workflow for v$VERSION."
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Release PRs should be ready for review when opened unless the implementation is
|
|
87
|
+
intentionally incomplete. Do not make a release PR draft just because it contains
|
|
88
|
+
the version bump.
|
|
89
|
+
|
|
71
90
|
```bash
|
|
72
91
|
# 5. wait for CI, address any review, merge into master
|
|
73
92
|
gh pr merge --merge # or --squash, depending on team preference
|
|
@@ -128,6 +147,9 @@ or replace it.
|
|
|
128
147
|
- **Do not edit a CHANGELOG entry after the corresponding version is published.** If you need to correct it, file a follow-up PR that adds a "Note" line under the next version explaining the correction.
|
|
129
148
|
- **Do not bump the version outside a release PR.** The checked-in version bump
|
|
130
149
|
is the automatic release trigger once the PR lands on `master`.
|
|
150
|
+
- **Do not hide a shipped behavior change behind a generic release title.** If
|
|
151
|
+
the PR includes a feature or fix, make that the title and explain that the
|
|
152
|
+
version bump releases it.
|
|
131
153
|
- **Do not include local-only work in the CHANGELOG.** If `git ls-tree origin/master` doesn't show the files, they are not shipping. Drop the line or commit the files first.
|
|
132
154
|
- **Do not skip the integration test step before opening the release PR.**
|
|
133
155
|
Browser tests catch the kernel-control regressions that unit tests cannot —
|
|
@@ -108,6 +108,7 @@ For command variants, prefer consistent structure over clever special cases. A m
|
|
|
108
108
|
- `hypernote setup serve`
|
|
109
109
|
- starts a Hypernote-enabled JupyterLab server in the current Python environment
|
|
110
110
|
- opens a browser tab by default; use `--no-browser` to keep the same server without opening a tab
|
|
111
|
+
- uses Jupyter's temporary real-time collaboration journal; the `.ipynb` remains the durable notebook artifact
|
|
111
112
|
- `hypernote --server http://127.0.0.1:8899 setup serve --root /path/to/repo`
|
|
112
113
|
- starts the server for another repo or port while keeping execution in that repo's environment
|
|
113
114
|
- if the JupyterLab integration stack is missing in the current env, `setup serve` fails with an install hint instead of a long module error
|
|
@@ -32,6 +32,11 @@ uv run hypernote setup serve
|
|
|
32
32
|
`setup serve` opens JupyterLab by default. Use `--no-browser` when you want the
|
|
33
33
|
same server without opening a Lab tab.
|
|
34
34
|
|
|
35
|
+
Servers launched by `setup serve` configure Jupyter's real-time collaboration journal as
|
|
36
|
+
temporary server-local state. Saved notebook contents and outputs still persist
|
|
37
|
+
in the `.ipynb`; unsaved live collaboration changes are not recovered through a
|
|
38
|
+
project-local database after a server crash.
|
|
39
|
+
|
|
35
40
|
If the notebook belongs to another repo, install Hypernote there (`uv add hypernote --dev`)
|
|
36
41
|
and run the same bootstrap command from that repo.
|
|
37
42
|
|
|
@@ -87,6 +92,7 @@ The notebook state, execution state, and outputs should still agree.
|
|
|
87
92
|
## Lifecycle expectation
|
|
88
93
|
|
|
89
94
|
- notebook contents and outputs persist in the `.ipynb` because Jupyter owns the document
|
|
95
|
+
- Jupyter's collaboration journal is temporary server-local state for servers launched by `setup serve`
|
|
90
96
|
- runtime state, jobs, and cell attribution are ephemeral Hypernote control-plane state
|
|
91
97
|
- stopping a runtime or restarting the server clears that control-plane state
|
|
92
98
|
- runtime creation resolves the requested kernel first, otherwise notebook metadata
|
|
@@ -6,6 +6,7 @@ Jupyter owns the notebook document and kernel primitives. Hypernote owns the con
|
|
|
6
6
|
|
|
7
7
|
- notebook persistence
|
|
8
8
|
- shared YDoc state
|
|
9
|
+
- real-time collaboration journal state
|
|
9
10
|
- kernel and session primitives
|
|
10
11
|
- notebook rendering in JupyterLab
|
|
11
12
|
|
|
@@ -26,6 +27,18 @@ Hypernote-owned control-plane state is intentionally ephemeral:
|
|
|
26
27
|
|
|
27
28
|
Notebook contents and outputs still persist because Jupyter owns the `.ipynb` document.
|
|
28
29
|
|
|
30
|
+
## Collaboration journal
|
|
31
|
+
|
|
32
|
+
Servers launched by `setup serve` configure Jupyter's real-time collaboration journal as
|
|
33
|
+
temporary server-local state. The journal helps the live shared document while
|
|
34
|
+
the server is running, but it is not a project artifact, job history, or
|
|
35
|
+
attribution store.
|
|
36
|
+
|
|
37
|
+
Durability begins when the shared document is saved into the `.ipynb` notebook
|
|
38
|
+
file. If a server crashes before an unsaved live change reaches the `.ipynb`,
|
|
39
|
+
Hypernote does not promise to recover that change from a persistent
|
|
40
|
+
collaboration database.
|
|
41
|
+
|
|
29
42
|
## Kernel selection
|
|
30
43
|
|
|
31
44
|
Runtime creation resolves the desired kernel in this order:
|
|
@@ -51,6 +51,7 @@ PROGRESS_CHOICES = click.Choice(["quiet", "events", "full"])
|
|
|
51
51
|
HYPERNOTE_EXTENSION_FLAGS = (
|
|
52
52
|
"{'hypernote': True, 'jupyter_server_nbmodel': True, 'jupyter_server_ydoc': True}"
|
|
53
53
|
)
|
|
54
|
+
HYPERNOTE_YSTORE_CLASS = "jupyter_server_ydoc.stores.TempFileYStore"
|
|
54
55
|
DEFAULT_SOURCE_PREVIEW_CHARS = 120
|
|
55
56
|
DEFAULT_OUTPUT_PREVIEW_CHARS = DEFAULT_READ_OUTPUT_CHARS
|
|
56
57
|
DEFAULT_TAIL_OUTPUT_CHARS = DEFAULT_READ_OUTPUT_CHARS
|
|
@@ -163,6 +164,7 @@ def _serve_command(
|
|
|
163
164
|
"--ServerApp.disable_check_xsrf=True",
|
|
164
165
|
f"--ServerApp.root_dir={root}",
|
|
165
166
|
f"--ServerApp.jpserver_extensions={HYPERNOTE_EXTENSION_FLAGS}",
|
|
167
|
+
f"--YDocExtension.ystore_class={HYPERNOTE_YSTORE_CLASS}",
|
|
166
168
|
]
|
|
167
169
|
)
|
|
168
170
|
return cmd
|
|
@@ -13,6 +13,7 @@ from pathlib import Path
|
|
|
13
13
|
import httpx
|
|
14
14
|
import pytest
|
|
15
15
|
|
|
16
|
+
from hypernote.cli.main import HYPERNOTE_EXTENSION_FLAGS, HYPERNOTE_YSTORE_CLASS
|
|
16
17
|
from tests.helpers import auth_headers, hypernote_headers
|
|
17
18
|
|
|
18
19
|
|
|
@@ -47,15 +48,13 @@ def live_server(tmp_path_factory: pytest.TempPathFactory) -> LiveServer:
|
|
|
47
48
|
"--ServerApp.password=",
|
|
48
49
|
"--ServerApp.disable_check_xsrf=True",
|
|
49
50
|
f"--ServerApp.root_dir={root_dir}",
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
"{'hypernote': True, 'jupyter_server_nbmodel': True, 'jupyter_server_ydoc': True}"
|
|
53
|
-
),
|
|
51
|
+
f"--ServerApp.jpserver_extensions={HYPERNOTE_EXTENSION_FLAGS}",
|
|
52
|
+
f"--YDocExtension.ystore_class={HYPERNOTE_YSTORE_CLASS}",
|
|
54
53
|
]
|
|
55
54
|
env = os.environ.copy()
|
|
56
55
|
process = subprocess.Popen(
|
|
57
56
|
cmd,
|
|
58
|
-
cwd=str(
|
|
57
|
+
cwd=str(root_dir),
|
|
59
58
|
env=env,
|
|
60
59
|
stdout=log_path.open("w"),
|
|
61
60
|
stderr=subprocess.STDOUT,
|
|
@@ -1212,6 +1212,10 @@ def test_setup_serve_launches_jupyterlab_with_browser_by_default(
|
|
|
1212
1212
|
assert (
|
|
1213
1213
|
f"--ServerApp.jpserver_extensions={cli_main.HYPERNOTE_EXTENSION_FLAGS}" in cmd
|
|
1214
1214
|
)
|
|
1215
|
+
assert (
|
|
1216
|
+
"--YDocExtension.ystore_class=jupyter_server_ydoc.stores.TempFileYStore"
|
|
1217
|
+
in cmd
|
|
1218
|
+
)
|
|
1215
1219
|
assert captured["cwd"] == str(tmp_path.resolve())
|
|
1216
1220
|
assert captured["check"] is False
|
|
1217
1221
|
|
|
@@ -50,6 +50,21 @@ async def test_execute_persists_output(
|
|
|
50
50
|
assert outputs, "Expected outputs to be persisted into the notebook"
|
|
51
51
|
|
|
52
52
|
|
|
53
|
+
async def test_execute_does_not_create_project_collaboration_database(
|
|
54
|
+
hypernote_api,
|
|
55
|
+
jupyter_api,
|
|
56
|
+
live_server: LiveServer,
|
|
57
|
+
):
|
|
58
|
+
notebook = await _create_live_notebook(jupyter_api, "hypernote-live-temp-journal")
|
|
59
|
+
quoted = urllib.parse.quote(notebook, safe="")
|
|
60
|
+
resp = await hypernote_api.post(f"/notebooks/{quoted}/execute", json={"cell_ids": ["cell-a"]})
|
|
61
|
+
resp.raise_for_status()
|
|
62
|
+
|
|
63
|
+
job = await await_job(hypernote_api, resp.json()["job_id"])
|
|
64
|
+
assert job["status"] == "succeeded"
|
|
65
|
+
assert not (live_server.root_dir / ".jupyter_ystore.db").exists()
|
|
66
|
+
|
|
67
|
+
|
|
53
68
|
async def test_execute_honors_notebook_kernelspec_instead_of_defaulting(
|
|
54
69
|
hypernote_api,
|
|
55
70
|
jupyter_api,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|