Skip to content

Commit 3117e43

Browse files
authored
Merge pull request #371 from dickmao/bug-issue-369
Fixes #369
2 parents 6d42e0e + 35ccc3d commit 3117e43

File tree

3 files changed

+69
-48
lines changed

3 files changed

+69
-48
lines changed

features/notebook.feature

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
@autosave
2+
Scenario: opened notebook
3+
Given old notebook "undo.ipynb"
4+
And I call "ein:notebook-enable-autosaves"
5+
And I switch to log expr "ein:log-all-buffer-name"
6+
Then I should see message "ein:notebook-autosave-frequency is 0"

features/step-definitions/ein-steps.el

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
(When "with no opened notebooks call \"\\(.+\\)\"$"
2+
(lambda (func)
3+
(cl-letf (((symbol-function 'ein:notebook-opened-buffer-names) #'ignore))
4+
(When (format "I call \"%s\"" func)))))
5+
16
(When "^I clear log expr \"\\(.+\\)\"$"
27
(lambda (log-expr)
38
(let ((buffer (get-buffer (symbol-value (intern log-expr)))))
@@ -129,19 +134,18 @@
129134

130135
(When "^old notebook \"\\(.+\\)\"$"
131136
(lambda (path)
132-
(let ((url-or-port (car (ein:jupyter-server-conn-info))))
137+
(lexical-let ((url-or-port (car (ein:jupyter-server-conn-info))) notebook)
133138
(with-current-buffer (ein:notebooklist-get-buffer url-or-port)
134-
(lexical-let (notebook)
135-
(ein:notebook-open url-or-port path nil
136-
(lambda (nb created) (setq notebook nb)))
137-
(ein:testing-wait-until (lambda () (and (not (null notebook))
138-
(ein:aand (ein:$notebook-kernel notebook)
139-
(ein:kernel-live-p it)))))
140-
(let ((buf-name (format ein:notebook-buffer-name-template
141-
(ein:$notebook-url-or-port notebook)
142-
(ein:$notebook-notebook-name notebook))))
143-
(switch-to-buffer buf-name)
144-
(Then "I should be in buffer \"%s\"" buf-name)))))))
139+
(ein:notebook-open url-or-port path nil
140+
(lambda (nb created) (setq notebook nb)))
141+
(ein:testing-wait-until (lambda () (and (not (null notebook))
142+
(ein:aand (ein:$notebook-kernel notebook)
143+
(ein:kernel-live-p it))))))
144+
(let ((buf-name (format ein:notebook-buffer-name-template
145+
(ein:$notebook-url-or-port notebook)
146+
(ein:$notebook-notebook-name notebook))))
147+
(switch-to-buffer buf-name)
148+
(Then "I should be in buffer \"%s\"" buf-name)))))
145149

146150
(When "^I dump buffer"
147151
(lambda () (message "%s" (buffer-string))))

lisp/ein-notebook.el

Lines changed: 47 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -303,12 +303,14 @@ will be updated with kernel's cwd."
303303
(with-current-buffer (ein:notebook-buffer notebook*)
304304
(ein:worksheet-focus-cell))
305305
(pop-to-buffer (ein:notebook-buffer notebook*))
306-
(ein:aif (ein:$notebook-kernelspec notebook*)
307-
(progn
308-
(setf (ein:$notebook-metadata notebook*)
309-
(plist-put (ein:$notebook-metadata notebook*)
310-
:kernelspec (ein:kernelspec-for-nb-metadata it)))
311-
(ein:notebook-save-notebook notebook*)))
306+
(when (null (plist-member (ein:$notebook-metadata notebook*)
307+
:kernelspec))
308+
(ein:aif (ein:$notebook-kernelspec notebook*)
309+
(progn
310+
(setf (ein:$notebook-metadata notebook*)
311+
(plist-put (ein:$notebook-metadata notebook*)
312+
:kernelspec (ein:kernelspec-for-nb-metadata it)))
313+
(ein:notebook-save-notebook notebook*))))
312314
(when callback*
313315
(funcall callback* notebook* created)))
314316
notebook (not existing) callback))
@@ -408,45 +410,54 @@ of minor mode."
408410
(defun ein:notebook-enable-autosaves (notebook)
409411
"Enable automatic, periodic saving for notebook."
410412
(interactive
411-
(let* ((notebook (or (ein:get-notebook)
412-
(completing-read
413-
"Select notebook [URL-OR-PORT/NAME]: "
414-
(ein:notebook-opened-buffer-names)))))
415-
(list notebook)))
416-
(if (stringp notebook)
417-
(error "Fix me!")) ;; FIXME
418-
(setf (ein:$notebook-autosave-timer notebook)
419-
(run-at-time 0 ein:notebook-autosave-frequency #'ein:notebook-maybe-save-notebook notebook 0))
420-
(ein:log 'verbose "Enabling autosaves for %s with frequency %s seconds."
421-
(ein:$notebook-notebook-name notebook)
422-
ein:notebook-autosave-frequency))
413+
(list (or (ein:get-notebook)
414+
(ein:aand (ein:notebook-opened-buffer-names)
415+
(with-current-buffer (ido-completing-read
416+
"Notebook: " it nil t)
417+
(ein:get-notebook))))))
418+
(if (> ein:notebook-autosave-frequency 0)
419+
(if notebook
420+
(progn (setf (ein:$notebook-autosave-timer notebook)
421+
(run-at-time ein:notebook-autosave-frequency
422+
ein:notebook-autosave-frequency
423+
#'ein:notebook-maybe-save-notebook
424+
notebook))
425+
(ein:log 'verbose "Enabling autosaves for %s with frequency %s seconds."
426+
(ein:$notebook-notebook-name notebook)
427+
ein:notebook-autosave-frequency))
428+
(message "Open notebook first"))
429+
(message "ein:notebook-autosave-frequency is %d" ein:notebook-autosave-frequency)))
423430

424431
(defun ein:notebook-disable-autosaves (notebook)
425432
"Disable automatic, periodic saving for current notebook."
426433
(interactive
427-
(let* ((notebook (or (ein:get-notebook)
428-
(completing-read
429-
"Select notebook [URL-OR-PORT/NAME]: "
430-
(ein:notebook-opened-buffer-names)))))
431-
(list notebook)))
432-
(when (ein:$notebook-autosave-timer notebook)
433-
(ein:log 'info "Disabling auto checkpoints for notebook %s" (ein:$notebook-notebook-name notebook))
434-
(cancel-timer (ein:$notebook-autosave-timer notebook))))
434+
(list (or (ein:get-notebook)
435+
(ein:aand (ein:notebook-opened-buffer-names)
436+
(with-current-buffer (ido-completing-read
437+
"Notebook: " it nil t)
438+
(ein:get-notebook))))))
439+
(if (and notebook (ein:$notebook-autosave-timer notebook))
440+
(progn
441+
(ein:log 'verbose "Disabling auto checkpoints for notebook %s" (ein:$notebook-notebook-name notebook))
442+
(cancel-timer (ein:$notebook-autosave-timer notebook)))))
435443

436444
(defun ein:notebook-update-autosave-frequency (new-frequency notebook)
437445
"Change the autosaves frequency for the current notebook, or
438446
for a notebook selected by the user if not currently inside a
439447
notebook buffer."
440-
(interactive)
441-
(let* ((new-frequency (read-number "New autosaves frequency (0 to disable): "))
442-
(notebook (or (ein:get-notebook)
443-
(completing-read
444-
"Select notebook [URL-OR-PORT/NAME]: "
445-
(ein:notebook-opened-buffer-names)))))
446-
(when notebook
447-
(setq ein:notebook-autosave-frequency new-frequency)
448-
(ein:notebook-disable-autosaves notebook)
449-
(ein:notebook-enable-autosaves notebook))))
448+
(interactive
449+
(list (read-number "New autosaves frequency (0 to disable): ")
450+
(or (ein:get-notebook)
451+
(ein:aand (ein:notebook-opened-buffer-names)
452+
(with-current-buffer (ido-completing-read
453+
"Notebook: " it nil t)
454+
(ein:get-notebook))))))
455+
(if notebook
456+
(progn
457+
(setq ein:notebook-autosave-frequency new-frequency)
458+
(ein:notebook-disable-autosaves notebook)
459+
(ein:notebook-enable-autosaves notebook))
460+
(message "Open notebook first")))
450461

451462
(defun ein:notebook-bind-events (notebook events)
452463
"Bind events related to PAGER to the event handler EVENTS."

0 commit comments

Comments
 (0)