mirror of
https://github.com/vale981/emacs-jupyter
synced 2025-03-04 23:41:37 -05:00
Update documentation, cleanup comments
This commit is contained in:
parent
ce3d9a377c
commit
22b1e809a0
6 changed files with 47 additions and 40 deletions
|
@ -178,11 +178,17 @@ from the kernel.")
|
||||||
(id (jupyter-new-uuid))
|
(id (jupyter-new-uuid))
|
||||||
(key nil))))
|
(key nil))))
|
||||||
"A `jupyter-session' holds the information needed to
|
"A `jupyter-session' holds the information needed to
|
||||||
authenticate messages. Each `jupyter-session' should have a
|
authenticate messages. A `jupyter-session' contains the following
|
||||||
unique ID which is used as the `zmq-ROUTING-ID' for every
|
fields:
|
||||||
`jupyter-channel' socket that utilizes the session object. The
|
|
||||||
KEY of a `jupyter-session' is used for message signing. Message
|
- CONN-INFO :: The connection info. property list of the kernel
|
||||||
signing is not done if the KEY of a `jupyter-session' is empty."
|
this session is used to sign messages for.
|
||||||
|
|
||||||
|
- ID :: A string of bytes used as the `zmq-ROUTING-ID' for every
|
||||||
|
`jupyter-channel' that utilizes the sessiong object.
|
||||||
|
|
||||||
|
- KEY :: The key used when signing messages. If KEY is nil,
|
||||||
|
message signing is not performed."
|
||||||
(conn-info nil :read-only t)
|
(conn-info nil :read-only t)
|
||||||
(id nil :read-only t)
|
(id nil :read-only t)
|
||||||
(key nil :read-only t))
|
(key nil :read-only t))
|
||||||
|
|
|
@ -111,10 +111,6 @@ initialization.")
|
||||||
:documentation "If this client was initialized using a
|
:documentation "If this client was initialized using a
|
||||||
`jupyter-kernel-manager' this slot will hold the manager which
|
`jupyter-kernel-manager' this slot will hold the manager which
|
||||||
initialized the client.")
|
initialized the client.")
|
||||||
;; TODO: Periodically cleanup these buffers when the object they point to
|
|
||||||
;; are no longer in use. How can we determine if an object has no more
|
|
||||||
;; references? Maybe do something with `post-gc-hook'? Or require explicit
|
|
||||||
;; cleanup?
|
|
||||||
(-buffer
|
(-buffer
|
||||||
:type buffer
|
:type buffer
|
||||||
:documentation "An internal buffer used to store client local
|
:documentation "An internal buffer used to store client local
|
||||||
|
@ -762,6 +758,7 @@ received for it and it is not the most recently sent request."
|
||||||
(remhash (jupyter-request-id req) requests)))
|
(remhash (jupyter-request-id req) requests)))
|
||||||
|
|
||||||
(defun jupyter--run-handler-maybe (client channel req msg)
|
(defun jupyter--run-handler-maybe (client channel req msg)
|
||||||
|
"Possibly run CLIENT's CHANNEL handler on REQ's received MSG."
|
||||||
(let ((inhibited-handlers (and req (jupyter-request-inhibited-handlers req))))
|
(let ((inhibited-handlers (and req (jupyter-request-inhibited-handlers req))))
|
||||||
(unless (or (eq inhibited-handlers t)
|
(unless (or (eq inhibited-handlers t)
|
||||||
(memq (jupyter-message-type msg) inhibited-handlers))
|
(memq (jupyter-message-type msg) inhibited-handlers))
|
||||||
|
|
|
@ -323,8 +323,8 @@ class is CLIENT-CLASS. The client is connected to the kernel with
|
||||||
all channels listening for messages and the heartbeat channel
|
all channels listening for messages and the heartbeat channel
|
||||||
unpaused. Note that the client's `manager' slot will also be set
|
unpaused. Note that the client's `manager' slot will also be set
|
||||||
to the kernel manager instance, see `jupyter-make-client'.
|
to the kernel manager instance, see `jupyter-make-client'.
|
||||||
Finally, INFO is the kernel info plist obtained from a
|
Finally, INFO is the kernel info plist obtained from an initial
|
||||||
`:kernel-info-request'."
|
`:kernel-info-request' sent to the kernel using KC."
|
||||||
(or client-class (setq client-class 'jupyter-kernel-client))
|
(or client-class (setq client-class 'jupyter-kernel-client))
|
||||||
(unless (child-of-class-p client-class 'jupyter-kernel-client)
|
(unless (child-of-class-p client-class 'jupyter-kernel-client)
|
||||||
(signal 'wrong-type-argument
|
(signal 'wrong-type-argument
|
||||||
|
|
|
@ -118,15 +118,32 @@ timeout, the built-in is-complete handler is used."
|
||||||
;;; Implementation
|
;;; Implementation
|
||||||
|
|
||||||
(defclass jupyter-repl-client (jupyter-widget-client)
|
(defclass jupyter-repl-client (jupyter-widget-client)
|
||||||
((buffer :type buffer)
|
((buffer
|
||||||
|
:type (or null buffer)
|
||||||
|
:initform nil
|
||||||
|
:documentation "The REPL buffer whose
|
||||||
|
`jupyter-repl-current-client' is this client.")
|
||||||
(wait-to-clear
|
(wait-to-clear
|
||||||
:type boolean :initform nil
|
:type boolean :initform nil
|
||||||
:documentation "Whether or not we should wait to clear the
|
:documentation "Whether or not we should wait to clear the
|
||||||
current output of the cell. Set when the kernel sends a
|
current output of the cell. Set when the kernel sends a
|
||||||
`:clear-output' message.")
|
`:clear-output' message.")
|
||||||
(kernel-info :type json-plist :initform nil)
|
(kernel-info
|
||||||
(execution-state :type string :initform "idle")
|
:type json-plist
|
||||||
(execution-count :type integer :initform 1)))
|
:initform nil
|
||||||
|
:documentation "The saved kernel info created when first
|
||||||
|
initializing this client. This is the plist returned from the the
|
||||||
|
call to `jupyter-start-new-kernel' when this client was
|
||||||
|
created.")
|
||||||
|
(execution-state
|
||||||
|
:type string
|
||||||
|
:initform "idle"
|
||||||
|
:documentation "The current state of the kernel. Can be
|
||||||
|
either \"idle\", \"busy\", or \"starting\".")
|
||||||
|
(execution-count
|
||||||
|
:type integer
|
||||||
|
:initform 1
|
||||||
|
:documentation "The current execution count of the kernel.")))
|
||||||
|
|
||||||
(defvar jupyter-repl-lang-buffer nil
|
(defvar jupyter-repl-lang-buffer nil
|
||||||
"A buffer with the `major-mode' set to the REPL language's `major-mode'.")
|
"A buffer with the `major-mode' set to the REPL language's `major-mode'.")
|
||||||
|
@ -147,7 +164,7 @@ current output of the cell. Set when the kernel sends a
|
||||||
See `jupyter-repl-fontify-according-to-mode'.")
|
See `jupyter-repl-fontify-according-to-mode'.")
|
||||||
|
|
||||||
(defvar jupyter-repl-use-builtin-is-complete nil
|
(defvar jupyter-repl-use-builtin-is-complete nil
|
||||||
"Whether or not to send is_complete_request's to a kernel.
|
"Whether or not to send `:is-complete-request's to a kernel.
|
||||||
If a Jupyter kernel does not respond to an is_complete_request,
|
If a Jupyter kernel does not respond to an is_complete_request,
|
||||||
the buffer local value of this variable is set to t and code in a
|
the buffer local value of this variable is set to t and code in a
|
||||||
cell is considered complete if the last line in a code cell is a
|
cell is considered complete if the last line in a code cell is a
|
||||||
|
@ -159,8 +176,9 @@ Display IDs are implemented by setting the text property,
|
||||||
`jupyter-display', to the display ID requested by a
|
`jupyter-display', to the display ID requested by a
|
||||||
`:display-data' message. When a display is updated from an
|
`:display-data' message. When a display is updated from an
|
||||||
`:update-display-data' message, the display ID from the initial
|
`:update-display-data' message, the display ID from the initial
|
||||||
`:display-data' is retrieved from this table and used to find the
|
`:display-data' message is retrieved from this table and used to
|
||||||
display in the REPL buffer. See `jupyter-repl-update-display'.")
|
find the display in the REPL buffer. See
|
||||||
|
`jupyter-repl-update-display'.")
|
||||||
|
|
||||||
;;; Macros
|
;;; Macros
|
||||||
|
|
||||||
|
@ -299,7 +317,7 @@ for the property."
|
||||||
|
|
||||||
;; Adapted from `org-src-font-lock-fontify-block'
|
;; Adapted from `org-src-font-lock-fontify-block'
|
||||||
(defun jupyter-repl-fixup-font-lock-properties ()
|
(defun jupyter-repl-fixup-font-lock-properties ()
|
||||||
"Fixup the text properties in the `curren-buffer'.
|
"Fixup the text properties in the `current-buffer'.
|
||||||
Fixing the text properties of the current buffer involves
|
Fixing the text properties of the current buffer involves
|
||||||
substituting any `face' property with `font-lock-face' for
|
substituting any `face' property with `font-lock-face' for
|
||||||
insertion into the REPL buffer and adding
|
insertion into the REPL buffer and adding
|
||||||
|
@ -958,7 +976,6 @@ Finalizing a cell involves the following steps:
|
||||||
(remove-text-properties beg (point) '(rear-nonsticky))
|
(remove-text-properties beg (point) '(rear-nonsticky))
|
||||||
;; font-lock-multiline to avoid improper syntactic elements from
|
;; font-lock-multiline to avoid improper syntactic elements from
|
||||||
;; spilling over to the rest of the buffer.
|
;; spilling over to the rest of the buffer.
|
||||||
;; TODO: I don't think this is a proper use of this text property
|
|
||||||
(add-text-properties beg (point) '(read-only t font-lock-multiline t))))
|
(add-text-properties beg (point) '(read-only t font-lock-multiline t))))
|
||||||
|
|
||||||
(defun jupyter-repl-replace-cell-code (new-code)
|
(defun jupyter-repl-replace-cell-code (new-code)
|
||||||
|
@ -1177,7 +1194,7 @@ found."
|
||||||
(cl-defmethod jupyter-handle-clear-output ((client jupyter-repl-client)
|
(cl-defmethod jupyter-handle-clear-output ((client jupyter-repl-client)
|
||||||
req
|
req
|
||||||
wait)
|
wait)
|
||||||
;; TODO: Tale into account json-false elsewhere
|
;; TODO: Take into account json-false elsewhere
|
||||||
(unless (oset client wait-to-clear (eq wait t))
|
(unless (oset client wait-to-clear (eq wait t))
|
||||||
(cond
|
(cond
|
||||||
((eq (jupyter-message-parent-type
|
((eq (jupyter-message-parent-type
|
||||||
|
@ -1215,8 +1232,6 @@ buffer to display TEXT."
|
||||||
|
|
||||||
(cl-defmethod jupyter-handle-stream ((client jupyter-repl-client) req name text)
|
(cl-defmethod jupyter-handle-stream ((client jupyter-repl-client) req name text)
|
||||||
(if (null req)
|
(if (null req)
|
||||||
;; Otherwise the stream request is due to someone else, pop up a buffer.
|
|
||||||
;; TODO: Make this configurable so that we can just ignore output.
|
|
||||||
(jupyter-repl-display-other-output client name text)
|
(jupyter-repl-display-other-output client name text)
|
||||||
(cond
|
(cond
|
||||||
((eq (jupyter-message-parent-type
|
((eq (jupyter-message-parent-type
|
||||||
|
@ -1602,8 +1617,6 @@ is used for completion."
|
||||||
|
|
||||||
))
|
))
|
||||||
;; When a type is supplied add it as an annotation
|
;; When a type is supplied add it as an annotation
|
||||||
;; TODO: Customize annotation types, when an annotation type "function"
|
|
||||||
;; appears, substitute "λ".
|
|
||||||
(when types
|
(when types
|
||||||
(let ((max-len (apply #'max (mapcar #'length matches))))
|
(let ((max-len (apply #'max (mapcar #'length matches))))
|
||||||
(cl-mapc
|
(cl-mapc
|
||||||
|
@ -2258,14 +2271,14 @@ purposes and SYNTAX-TABLE is the syntax table of MODE."
|
||||||
|
|
||||||
(defun jupyter-repl--new-repl (client)
|
(defun jupyter-repl--new-repl (client)
|
||||||
"Initialize a new REPL buffer based on CLIENT.
|
"Initialize a new REPL buffer based on CLIENT.
|
||||||
CLIENT is a `jupyter-repl-client' already connected to its
|
CLIENT is a `jupyter-repl-client' already connected to its kernel
|
||||||
kernel and should have a non-nil kernel-info slot.
|
and has a non-nil kernel-info slot.
|
||||||
|
|
||||||
A new REPL buffer communicating with CLIENT's kernel is created
|
A new REPL buffer communicating with CLIENT's kernel is created
|
||||||
and set as CLIENT'sthis case, if MANAGER will be the buffer slot.
|
and set as CLIENT's buffer slot. If CLIENT already has a non-nil
|
||||||
If CLIENT already has a non-nil buffer slot, raise an error."
|
buffer slot, raise an error."
|
||||||
(if (slot-boundp client 'buffer) (error "Client already has a REPL buffer")
|
(if (slot-boundp client 'buffer) (error "Client already has a REPL buffer")
|
||||||
(unless (ignore-errors (oref client kernel-info))
|
(unless (oref client kernel-info)
|
||||||
(error "Client needs to have valid kernel-info"))
|
(error "Client needs to have valid kernel-info"))
|
||||||
(cl-destructuring-bind (&key language_info
|
(cl-destructuring-bind (&key language_info
|
||||||
banner
|
banner
|
||||||
|
@ -2306,8 +2319,6 @@ Otherwise, in a non-interactive call, return the
|
||||||
(setq kernel-name (caar (jupyter-find-kernelspecs kernel-name))))
|
(setq kernel-name (caar (jupyter-find-kernelspecs kernel-name))))
|
||||||
(unless kernel-name
|
(unless kernel-name
|
||||||
(error "No kernel found for prefix (%s)" kernel-name))
|
(error "No kernel found for prefix (%s)" kernel-name))
|
||||||
;; The manager is set as the client's manager slot in
|
|
||||||
;; `jupyter-start-new-kernel'
|
|
||||||
(cl-destructuring-bind (_manager client info)
|
(cl-destructuring-bind (_manager client info)
|
||||||
(jupyter-start-new-kernel kernel-name 'jupyter-repl-client)
|
(jupyter-start-new-kernel kernel-name 'jupyter-repl-client)
|
||||||
(oset client kernel-info info)
|
(oset client kernel-info info)
|
||||||
|
|
|
@ -236,15 +236,8 @@ Return the cons cell (\"file\" . FILE), see
|
||||||
|
|
||||||
(defun org-babel-jupyter-prepare-result (data metadata params)
|
(defun org-babel-jupyter-prepare-result (data metadata params)
|
||||||
"Return the rendered DATA.
|
"Return the rendered DATA.
|
||||||
DATA is converted into a representation suitable for display in
|
|
||||||
an `org-mode' buffer depending on
|
|
||||||
|
|
||||||
DATA is a plist, (:mimetype1 value1 ...), containing the
|
DATA is a plist, (:mimetype1 value1 ...), containing the
|
||||||
different representations of a result returned by a kernel.
|
different representations of a result returned by a kernel.
|
||||||
Preparing a result
|
|
||||||
|
|
||||||
which is used to render
|
|
||||||
a result which can be passed to `org-babel-insert-result'.
|
|
||||||
|
|
||||||
METADATA is the metadata plist used to render DATA with, as
|
METADATA is the metadata plist used to render DATA with, as
|
||||||
returned by the Jupyter kernel. This plist typically contains
|
returned by the Jupyter kernel. This plist typically contains
|
||||||
|
|
|
@ -11,8 +11,8 @@
|
||||||
</style>
|
</style>
|
||||||
<script type="application/javascript">
|
<script type="application/javascript">
|
||||||
var kernel;
|
var kernel;
|
||||||
// TODO: May not be available everywhere
|
|
||||||
document.addEventListener("DOMContentLoaded", function(event) {
|
document.addEventListener("DOMContentLoaded", function(event) {
|
||||||
|
// TODO: May not be available everywhere
|
||||||
var p = new URLSearchParams(window.location.search);
|
var p = new URLSearchParams(window.location.search);
|
||||||
var kernel = new EmacsJupyter({username: p.get('username'),
|
var kernel = new EmacsJupyter({username: p.get('username'),
|
||||||
clientId: p.get('clientId')},
|
clientId: p.get('clientId')},
|
||||||
|
|
Loading…
Add table
Reference in a new issue