Commit graph

1834 commits

Author SHA1 Message Date
Nathaniel Nicandro
1c154ca68d Re-work jupyter-request documentation
* jupyter-base.el: Do it.
2021-04-03 12:22:58 -05:00
Nathaniel Nicandro
c3fae7d7df jupyter-request-idle-received-p -> jupyter-request-idle-p
but first...

* jupyter-base.el: ...idle-received-p -> idle-p for jupyter-request objects

* jupyter-client.el: ...then, do it.

* test/jupyter-test.el: Do it.
2021-04-03 12:22:58 -05:00
Nathaniel Nicandro
7ca3344c1b Add syncing functions
These will be used in future commits.

* jupyter-client.el (jupyter-idle-sync)
(jupyter-add-idle-sync-hook): New functions.

* test/jupyter-test.el (jupyter-idle-sync): New test.
2021-04-03 12:22:58 -05:00
Nathaniel Nicandro
d6aced9e71 Rename internal functions for clarity
The following changes are made:

jupyter--run-handler-p -> jupyter--request-allows-handler-p
jupyter--handler-dispatch -> jupyter--run-handler

* jupyter-client.el: Do it.

* test/jupyter-test.el: Do it.
2021-04-03 12:22:58 -05:00
Nathaniel Nicandro
7786d30468 Refactor message sending/receiving
`jupyter-handle-*` methods now only take an argument list like

    (client req msg)

instead of each method being passed an expanded list of arguments
unpacked from a message contents. Not sure why the unpacking was done
in the first place. The strategy now is to use
`jupyter-with-message-contents` when accessing the contents of a
message.

* jupyter-client.el
(define-jupyter-client-handler)
(define--jupyter-client-sender): New macros.
(jupyter-send-execute-request)
(jupyter-send-inspect-request)
(jupyter-send-complete-request)
(jupyter-send-history-request)
(jupyter-send-is-complete-request)
(jupyter-send-comm-info-request)
(jupyter-send-comm-open)
(jupyter-send-comm-msg)
(jupyter-send-comm-close)
(jupyter-send-kernel-info-request)
(jupyter-send-shutdown-request): Use `define--jupyter-client-sender`.
(jupyter-handle-input-request)
(jupyter-handle-execute-reply)
(jupyter-handle-inspect-reply)
(jupyter-handle-complete-reply)
(jupyter-handle-history-reply)
(jupyter-handle-is-complete-reply)
(jupyter-handle-comm-info-reply)
(jupyter-handle-kernel-info-reply)
(jupyter-handle-shutdown-reply)
(jupyter-handle-comm-open)
(jupyter-handle-comm-close)
(jupyter-handle-stream)
(jupyter-handle-execute-input)
(jupyter-handle-execute-result)
(jupyter-handle-error)
(jupyter-handle-status)
(jupyter-handle-clear-output)
(jupyter-handle-display-data)
(jupyter-handle-update-display-data): Use
`define-jupyter-client-handler`.

* jupyter-org-client.el
(jupyter-handle-stream)
(jupyter-handle-error)
(jupyter-handle-execute-result)
(jupyter-handle-display-data)
(jupyter-handle-execute-reply): Update to take into account changes in
the argument lists of `jupyter-handle-*` methods.

* jupyter-python.el
(jupyter-handle-error): Ditto.

* jupyter-repl.el
(jupyter-handle-execute-reply)
(jupyter-handle-execute-result)
(jupyter-handle-clear-output)
(jupyter-handle-display-data)
(jupyter-handle-update-display-data)
(jupyter-handle-status)
(jupyter-handle-stream)
(jupyter-handle-error):
(jupyter-handle-history-reply)
(jupyter-handle-shutdown-reply): Ditto.

* jupyter-widget-client.el
(jupyter-handle-comm-open)
(jupyter-handle-comm-close)
(jupyter-handle-comm-msg): Ditto.
2021-04-03 12:22:58 -05:00
Nathaniel Nicandro
9205805935 Refactor jupyter-handle-message and related
Reduce the number of arguments `jupyter-handle-message` takes, by just
passing the message property list directly. Expanding out the
arguments just creates unnecessary work.  Make the
`jupyter-kernel-client' implementation of `jupyter-handle-message`
more readable. Remove the unnecessary and confusing handler method
dispatching. Document `jupyter-handle-message`.

* README.org: Update reference to `jupyter-handle-*` method.

* jupyter-client.el
(jupyter-dispatch-messages-cases): Remove.
(jupyter-run-hook-with-args-until-success): Remove.
(jupyter-handle-message-p): New function. Similar to the above except
its return value is negated.
(jupyter--client-handlers): New variable. Holds the table of message
handlers.
(jupyter--handler-dispatch): Use them.
(jupyter--run-callbacks): Change to `defsubst`
(jupyter--run-handler-maybe): Remove. Expand out at call sites, replace
`jupyter-handle-message` with `jupyter--handler-dispatch` at the sites.
(jupyter--handler-dispatch): New function. Unifies all the
`jupyter-handle-message` implementations for channels.
(jupyter--update-execution-state, jupyter--message-completes-request-p): New functions.
(jupyter-handle-message): Remove channel implementations.  Use the new
functions in the client implementation.
2021-04-03 12:22:44 -05:00
Yuri D. Lensky
9285480715 Update jupyter--encode for new Emacs JSON API.
The old Emacs JSON API (for versions <= 27.2 at time of commit) was
structured in a way that replacing the symbol-function of json-encode
worked to get custom encoding for certain object types used by
emacs-jupyter. In the later API, the function json--print plays the
recursive role of json-encode. The code here works in either version,
and is simplified so that future updates to the API are easier to
accomodate.
2021-04-02 21:04:13 -05:00
Nathaniel Nicandro
3f54271e40 Update Travis build 2021-04-02 15:12:20 -05:00
Nathaniel Nicandro
1a5ec3171f README Changes 2021-04-02 12:14:22 -05:00
Tim Quelch
6ce8d01e3a Fix minor typo (resourse -> resource) 2021-01-15 20:57:19 -06:00
Daniel Kraus
7372a11706 Require eieio for jupyter-channel defclass 2021-01-15 20:55:57 -06:00
Nathaniel Nicandro
360cae2c70 Update README 2020-08-02 12:46:52 -05:00
Nathaniel Nicandro
64dda221c0 Remove .github/FUNDING.yml 2020-07-31 17:34:34 -05:00
Nathaniel Nicandro
785edbbff6 Fix missing function
`jupyter-server-make-instance` is from another branch.

* ob-jupyter.el: Remove `jupyter-server-make-instance` declaration.
(org-babel-jupyter-initiate-client): Replace its use with `jupyter-server`.
2020-04-17 14:07:06 -05:00
Nathaniel Nicandro
62ad054001 Fix undefined variable
* jupyter-R.el (jupyter-org-result): Do it.
2020-04-15 19:37:28 -05:00
Nathaniel Nicandro
a9ae0bcef5 Replace jupyter-repl-cell-cond with jupyter-repl-map-cells
* jupyter-repl.el
(jupyter-repl-map-cells): New function.
(jupyter-repl-cell-cond): Remove. Update callers with new function.

* jupyter-julia.el: Ditto.

* test/jupyter-test.el
(jupyter-repl-map-cells): New test.
(jupyter-repl-cell-cond): Remove.
2020-04-14 17:18:38 -05:00
Nathaniel Nicandro
25270f7d3b Remove some method implementations
The `jupyter-kill-kernel` of a kernel manager serves no purpose, just
use `jupyter-shutdown-kernel`.

* jupyter-kernel-manager.el
(jupyter-kill-kernel) [jupyter-kernel-manager]: Remove.

* jupyter-server.el (jupyter-kill-kernel) [jupyter-server-kernel-manager]: Remove.
2020-04-14 17:05:28 -05:00
Nathaniel Nicandro
a7dbff9aa3 Refactor source block overriding mechanism
This commit adds the function `org-babel-jupyter--babel-map` and some
auxiliary functions to simplify the code for source block
overriding. The old implementation was very hard to follow, these
changes should hopefully make the code more readable.

* ob-jupyter.el (org-babel-jupyter--override-restore-header-args)
(org-babel-jupyter--override-restore-src-block): Remove.
(org-babel-jupyter--babel-vars): New variable.
(org-babel-jupyter--babel-op-symbol)
(org-babel-jupyter--babel-var-symbol)
(org-babel-jupyter--babel-map): New functions.
(org-babel-jupyter-override-src-block)
(org-babel-jupyter-restore-src-block)
(org-babel-jupyter-make-language-alias): Use them.
2020-04-14 17:05:28 -05:00
Nathaniel Nicandro
71789f7cfd Remove more jupyter-channels-running-p implementations
The implementations are really aliases of `jupyter-comm-alive-p` so
keep that one instead.  The `jupyter-channels-running-p` method is a
remnant of an older design, still used by `jupyter-kernel-client'
though.

* jupyter-channel-ioloop-comm.el: Do it.

* jupyter-server.el: Do it.
2020-04-14 17:05:28 -05:00
Nathaniel Nicandro
6baecc9a90 Reduce number of arguments of jupyter-org-result
This groups the DATA and METADATA argument of `jupyter-org-result`
into a CONTENT argument to finish up a change made in a previous
commit that removed `jupyter-loop-over-mime`.  The METADATA argument
is rarely if every used, so it doesn't make sense to have all those
method implementations have to provide it.

* jupyter-org-client.el
(jupyter-org--image-result): Change group DATA and METADATA into a
CONTENT argument.  Change argument ordering.  Update all callers.
Cleanup the documentation to reflect the changes.
(jupyter-org-result): Similarly, group those two arguments into the
one argument.  Update all callers in this file, also...

* README.org: ...here

* jupyter-R.el: ...here

* jupyter-python.el: ...and here
2020-04-14 17:05:28 -05:00
Nathaniel Nicandro
e400266ce1 Replace the jupyter-loop-over-mime macro
It is replaced with `jupyter-map-mime-bundle` which is a function.

* jupyter-base.el (jupyter-loop-over-mime): Remove.
(jupyter-map-mime-bundle): New function. Update call sites of the
removed function, with calls to this function.
(jupyter-normalize-data): Return a mime bundle, a property list with
:data and :metadata keys.  Update all callers.

* jupyter-mime.el (jupyter-insert): Updated to take into account the
  previously mentioned changes.

* jupyter-org-client.el (jupyter-org-result): Ditto.

* test/jupyter-test.el (jupyter-loop-over-mime): Rename to
  `jupyter-map-mime-bundle` and update the test to consider it.
2020-04-14 15:46:38 -05:00
Nathaniel Nicandro
90e0c06f2e Use and in one place
* jupyter-org-client.el (jupyter-org--append-stream-result-p): Do it.
2020-04-14 12:25:28 -05:00
Nathaniel Nicandro
7d61c82567 Do not delete a character that isn't expected
* jupyter-org-client.el (jupyter-org--append-to-example-block): Do it.
2020-04-14 12:25:08 -05:00
Nathaniel Nicandro
adcc853183 Use pcase in one place
* jupyter-org-client.el (jupyter-org--find-mime-types): Do it.
2020-04-14 12:24:42 -05:00
Nathaniel Nicandro
4a0617132f Use cl-callf2 in a few places
* jupyter-comm-layer
(jupyter-comm-add-handler, jupyter-comm-remove-handler): Do it.
2020-04-14 12:24:11 -05:00
Nathaniel Nicandro
91ca722b63 Remove unused code
The `jupyter-zmq-channel-comm.el` file was more of an experiment and
is unused.  It also causes failures on Emacs 27 due to missing
`thread-alive-p` function in 27.

* jupyter-zmq-channel-comm.el: Remove.

* test/jupyter-test.el: Remove the related `require`.  Re-work tests
  that used `jupyter-zmq-channel-comm` to not use it.
2020-04-14 12:23:51 -05:00
Nathaniel Nicandro
97c421a698 Fix regression
In `org-babel-jupyter-initiate-session-by-key`, the function to
disassociate a client from a :session was added to the
`current-buffer`s value of `kill-buffer-hook` but it should be added
to the REPL buffer's value of that hook.

fixes #240

* ob-jupyter.el
(org-babel-jupyter-initiate-session-by-key): Add to the local value of
`kill-buffer-hook` in the REPL's buffer.

* test/jupyter-test.el
(org-babel-jupyter-initiate-session-by-key): New test.
2020-04-14 11:36:40 -05:00
Nathaniel Nicandro
587ed4e029 Keep uppercase characters in kernel language names
Converting to lowercase was done arbitrarily.  So that one could write
`(jupyter-lang wolfram-language)` instead of
`(jupyter-lang Wolfram-Language)`.

fixes #241

* CHANGELOG.org: Add note.

* README.org: Update relevant sections.

* jupyter-base.el (jupyter-canonicalize-language-string): Do it.

* ob-jupyter.el (org-babel-jupyter-aliases-from-kernelspecs):
2020-04-09 11:33:57 -05:00
Nathaniel Nicandro
82f8fe691e Set back to dev 2020-04-07 15:43:10 -05:00
Nathaniel Nicandro
403c70c83c Bump version 2020-04-07 15:13:51 -05:00
Nathaniel Nicandro
4c9e616690 ob-jupyter.el: Add more documentation
* ob-jupyter.el: Do it.
2020-04-07 12:24:34 -05:00
Nathaniel Nicandro
a997e34001 Move kludge outside of org-babel-jupyter-make-language-alias
That function should just create the function aliases and define the necessary
variables if not already defined.  It should not also set the :kernel header
argument if it isn't present in the org-babel-default-header-args:jupyter-LANG
variable.

* ob-jupyter.el (org-babel-jupyter-make-language-alias): Remove setting of :kernel.
(org-babel-jupyter-aliases-from-kernelspecs): Set :kernel after creating a
language alias.
2020-04-07 12:11:59 -05:00
Nathaniel Nicandro
16ea58e59e Use pcase-let to reduce verbosity
* ob-jupyter.el
(org-babel-jupyter-initiate-client) [org-babel-jupyter-remote-session]: Do it.
2020-04-07 09:00:35 -05:00
Nathaniel Nicandro
8c840d42d3 Fix typo
* ob-jupyter.el (org-babel-jupyter-initiate-client): Do it.
2020-04-06 12:36:36 -05:00
Nathaniel Nicandro
dc8fc6767f Silence byte compiler 2020-04-04 21:17:37 -05:00
Nathaniel Nicandro
0c2531402e Fix wrong number of arguments
* ob-jupyter.el (org-babel-prep-session:jupyter)
(org-babel-load-session:jupyter): Fix number of arguments to
`org-babel-jupyter--insert-variable-assignments`.
2020-04-04 21:17:37 -05:00
Nathaniel Nicandro
d336cdcace Unify code waiting for kernel processes to be ready
* jupyter-kernel-process-manager.el
(jupyter--after-kernel-process-ready): New macro.
(jupyter-start-kernel [jupyter-command-kernel, jupyter-spec-kernel]): Use it.
(jupyter--block-until-conn-file-access): Remove.
2020-04-04 21:17:37 -05:00
Nathaniel Nicandro
02231066e1 Relocate jupyter-write-connection-file
The function writes to `jupyter-runtime-directory` and does not depend on
anything in`jupyter-kernel-process-manager.el` so it is more appropriate in
`jupyter-env.el`.

* jupyter-env.el (jupyter-write-connection-file): New function.

* jupyter-kernel-process-manager.el (jupyter-write-connection-file): Remove.
2020-04-04 20:54:02 -05:00
Nathaniel Nicandro
187cb479c2 Run test only on Emacs versions where a bug can be detected
The test for #219 isn't really testing the root cause of the bug, only a
symptom.  And it doesn't catch anything on Emacs < 27.

* test/jupyter-test.el (jupyter-repl-issue-219): Skip on Emacs < 27
2020-04-04 12:27:44 -05:00
Nathaniel Nicandro
3aa523ddf2 Add test for org-babel-jupyter-parse-session
* test/jupyter-test.el (org-babel-jupyter-parse-session): New test.
2020-04-04 08:52:15 -05:00
Nathaniel Nicandro
0281704e4d org-babel-jupyter-parse-session: Handle .json suffix more smoothly
If a Jupyter TRAMP remote file contains a .json suffix do not treat it as a
kernel connection file.  The connection information is already contained in the
TRAMP method!

* ob-jupyter.el (org-babel-jupyter-parse-session): Do it.
2020-04-04 08:52:15 -05:00
Nathaniel Nicandro
4ed5b2644f Fix typo
* ob-jupyter.el (org-babel-jupyter-parse-session): `:connect-repl` -> `:connect-repl-p`
2020-04-04 08:39:48 -05:00
Nathaniel Nicandro
e9899c65cd Add test to catch a symptom of #219
* test/jupyter-test.el: Do it.
2020-04-04 08:39:48 -05:00
Nathaniel Nicandro
db5d06faa6 Remove jupyter-repl-insert
It's main purpose was to not forget to add the `read-only` property to text
that needed it.  The code base is stable enough to where this is not an issue
anymore.

* jupyter-repl.el (jupyter-repl-insert): Remove. Update all callers.

* jupyter-python.el (jupyter-handle-error): Ditto.
2020-04-04 08:39:45 -05:00
Nathaniel Nicandro
4399d25cdb ob-jupyter.el: Update documentation
* ob-jupyter.el (org-babel-jupyter-session-clients)
(org-babel-jupyter-session-key)
(org-babel-edit-prep:jupyter)
(org-babel-jupyter-aliases-from-kernelspecs): Do it.
2020-04-03 18:53:11 -05:00
Nathaniel Nicandro
51b7ddc57a ob-jupyter.el: Remove stale declarations
* ob-jupyter.el: Do it.
2020-04-03 18:53:11 -05:00
Nathaniel Nicandro
ce08af0932 Refactor Org Babel :session handling
Introduce the `org-babel-jupyter-initiate-client` generic. Method
implementations return a `jupyter-org-client` depending on the type of :session
as returned by `org-babel-jupyter-parse-session`.

* ob-jupyter.el
(org-babel-jupyter--run-repl)
(org-babel-jupyter--server-repl): Remove.
(org-babel-jupyter-session, org-babel-jupyter-remote-session)
(org-babel-jupyter-server-session): New struct types.
(org-babel-jupyter-parse-session): New function.
(org-babel-jupyter-initiate-client): New generic.  Implement a method for each
new struct type based on the removed functions, with some tidying up.
(org-babel-jupyter-initiate-session-by-key): Replace client setting logic with
a call to `org-babel-jupyter-initiate-client`.  Move REPL buffer rename code to
an :around method of `org-babel-jupyter-initiate-client`.
2020-04-03 18:53:00 -05:00
Nathaniel Nicandro
4ce54a056b Add jupyter-server-has-kernelspec-p
* jupyter-server.el (jupyter-server-has-kernelspec-p): New method.

* ob-jupyter.el (org-babel-jupyter--server-repl): Use it.
2020-04-03 18:43:53 -05:00
Nathaniel Nicandro
44adef4bc0 org-babel-prep-session:jupyter: Remove optional argument
* ob-jupyter.el
(org-babel-jupyter--insert-variable-assignments): New function.
(org-babel-prep-session:jupyter, org-babel-load-session:jupyter): Use it.
(org-babel-prep-session:jupyter): Remove DELAY-EVAL argument.
2020-04-03 18:43:53 -05:00
Nathaniel Nicandro
6420e20646 org-babel-execute:jupyter: Update two comments
* ob-jupyter.el (org-babel-execute:jupyter): Do it.
2020-04-03 15:28:23 -05:00