:comms
key in the state atom.base-widget
and widgets update
and custom
methods to allow for creating widgets as a side-effect.docker
and conda
recipes.CLASSPATH
environment variable, making it possible
to run jupyter notebooks in the context of a clojure project managed by leiningen or clojure.clojupyter.kernel.comm-atom
namespace
comm-atom-proto
to three methods: sync-state
, close!
and send!
comm-msg-custom
.clojupyter.cmdline
interface.
cmdline
interface.clojupyter.misc.display
, clojupyter.kernel.version
, clojupyter.kernel.logo
clojupyter.misc.display
content moved to clojupyter.display
.clojupyter
namespace now contains logo
and version
and license
(Note the missing *earmuffs*, the vars are no longer dynamic)clojupyter.display/hiccup-html
renamed to hiccup
clojupyter.display/html
now only renders html string. To render hiccup data, use hiccup
vega
, vega-lite
, gif
, pdf
, json
deps.edn
. Clojure (the executable) does not work on Windows, so
relying on it to build the package breaks anyone interested in building on Windows.clojupyter.cmdline
(unintentionally dropped in transition to
tools.deps
build tool chain), in project.clj
jupyterlab
and qtconsole
to conda installmake install
(Imagemagick needed to install Clojupyter)" (functionalty removed)./docker
(for reference).beckon
:control_port
and one for :shell_port
with only
interrupts and shutdown messages being handled on :control_port
INTERRUPT_REQUEST
messages--icon-top
, --icon-top
, and --customize-icons
comm_atom
representing the state of COMM objects synchronized with the Jupyter COMM model
managercljsrv.clj
COMM
messages, necessary for interactive widget supportdeps.edn
, tools.deps
and lein-tools-deps
, update project.clj
and .travis.yml
accordinglyZContext
-based implementation using ZMQ$Socket
core.async
channelsio.pedestal.interceptor
gaining flexibility, higher degrees of pure functions, and
possibility of asynchronuous event handling. Remove middleware model.slf4j-timbre
to capture logging from interceptorsclojure.spec
make install
/ Imagemagick needed to
install Clojupyterconda install
of Clojupyter supporting installs on Linux, MacOS, and Windows
conda install -c simplect clojupyter
conda remove clojupyter
lein-jupyter
without dependency on Leiningenlein
but maintain compatibility./resources/clojupyter
to reduce risk of conflicts when Clojupyter is used
as a libraryclojupyter.install.*
): Side-effecting functions located in *_actions.clj
filesclojupyter.install.*
): io.simplect.compose.action
objects reify inspectable
actions, enabling property-based testing of logicproject.clj
: remove :keep-non-project-classes true
, does not appear we need it#83: Hanging after evaluating cell with syntax error
#84: Kernel dies on empty code string
#30: Dead kernel on startup (comm_info_request)
(don't terminate on unknown messages)#69: FileNotFoundException Could not locate... on classpath.
#76: add-javascript broken?
#58: AOT+old tools.reader causing problems using latest ClojureScript
#85: Consider the silent and store_history keys of an execute request
clojupyter
install artifact (call java directly)clojupyter-install
check-os-support
check-install-dir
update-version-edn
clojupyter
(instead of clojure
)make
targets
update-version-edn
install-version
(install plain icon)install-version-tag-icons
(install version-tagged icon, depends on convert
from imagemagick
package)README.md
: add tentative near-term roadmap[x] Introduce handler-based middleware structure similar to nREPL and Ring
[x] Enable higher degree of separation of concerns, thus enabling adding features in a modular fashion
[x] Introduce layered message handling: Incoming messages pass through a define sequence of middleware handlers with outbound message passing through the same set of handlers in reverse order, yielding a layered message-processing architecture
[x] Introduce handler
, middleware
, and transport
abstractions similar to those of
employed in nREPL, but adapted
to fit into the multichannel context of Jupyter (cf. send-stdin
, send-iopub
, and
send-req
in clojupyter.transport
)
[x] Convert existing functionality to middleware-based structure, messaging-handling is now defined
by core message handler (in clojupyter.middleware
):
(def wrap-base-handlers
(comp wrap-execute-request
wrap-comm-msg
wrap-comm-info
wrap-comm-open
wrap-is-complete-request
wrap-complete-request
wrap-kernel-info-request
wrap-inspect-request
wrap-history-request
wrap-shutdown-request))
(def wrap-jupyter-messaging
(comp wrapout-encode-jupyter-message
wrapout-construct-jupyter-message))
(def default-wrapper
(comp wrapin-verify-request-bindings
wrapin-bind-msgtype
wrap-print-messages
wrap-jupyter-messaging
wrap-busy-idle
wrap-base-handlers))
(def default-handler
(default-wrapper not-implemented-handler))
The modular structure will make it much easier to add functionality going forward.
[x] Reorganize code structure:
src
├── clojupyter
│ ├── display.clj
│ ├── javascript
│ │ └── alpha.clj
│ ├── kernel
│ │ ├── cljsrv
│ │ │ ├── nrepl_comm.clj
│ │ │ ├── nrepl_middleware.clj
│ │ │ └── nrepl_server.clj
│ │ ├── config.clj
│ │ ├── core.clj
│ │ ├── history.clj
│ │ ├── init.clj
│ │ ├── jupyter.clj
│ │ ├── logo.clj
│ │ ├── middleware
│ │ │ ├── base.clj
│ │ │ ├── comm.clj
│ │ │ ├── complete.clj
│ │ │ ├── execute.clj
│ │ │ ├── history.clj
│ │ │ ├── inspect.clj
│ │ │ └── log_traffic.clj
│ │ ├── middleware.clj
│ │ ├── spec.clj
│ │ ├── stacktrace.clj
│ │ ├── state.clj
│ │ ├── transport
│ │ │ └── zmq.clj
│ │ ├── transport.clj
│ │ ├── util.clj
│ │ └── version.clj
│ ├── misc
│ │ ├── display.clj
│ │ ├── helper.clj
│ │ ├── leiningen.clj
│ │ └── mime_convertible.clj
│ └── protocol
│ └── mime_convertible.clj
└── clojupyter.clj
8 directories, 32 files
~/Library/Preferences/clojupyter.edn
on MacOS and ~/.config/clojupyter.edn
on
Linux (per XDG Base Directory specification)~/Library/Caches
on MacOS and ~/.local/share
(per XDG Base
Directory specification)clj-time
with clojure.java-time
idents
in ZMQ messages to envelope
clojupyter.misc.jupyter
)zmq-comm
protocol - not needed:aot
only in uberajr
profile in project.clj
states
.Zmq_Comm
.
Accessor functions for stdin-socket
and iopub-socket
in passed-around map S
.async.core
- not used.core.clj
configure-shell-handler
and configure-control-handler
with make-handler
. Their
role is the same, the main difference that execution-counter
is incremented on the shell
socket. Why not simply use the same handler?run-kernel
based on above.nrepl-server
and Clojupyter middlerware into separate namespace:
clojupyter.misc.nrepl-server
.messages.clj
make-shell-handler
and make-control-handler
: Unify into one.handle-execute-request
into regular responding
function defined with defresponse
.with-debug-logging
status-content
and pyin-content
into point-of-use.nrepl_comm.clj
defrecord
into smaller functions, no change in logic.history.clj
nrepl_server.clj
(added)
nrepl
-related code from core.clj
.state.clj
states.clj
- add single atom for all of global state.zmq_comm.clj
util.clj
with-debug-logging
macro.reformat-form
. Very early experiment with auto-indent / auto-reformat of cells based on
Code Prettify
/ Autopep8. Very primitive / early cell reformatting
prototype appears to work (cf. ./nbextensions/code_prettify/autopep8.yaml
). More work needed (quite a bit),
but it looks like there's a fairly straightforward solution.user.clj
reformat-form
.Changes at revision 2913dc17
relative to Clojupyter master
latest commit per 15 February 2019 (994f680c
):
nrepl
-based access from interactive development environments such as CIDER/Cursive:
Leave :value
unchanged, add :mime-tagged-value
insteadnrepl
v0.5.3 and cider-nrepl
v0.20.0message-*
functions:private
core.clj
configure-{shell,control}-handler
to use multi-method instead (respond-to-message
)catching-exceptions
to improve code readabilityprocess-heartbeat
awaynrepl-server-addr
to retrieve nrepl
server port to enable connection from interactive
development environmentmessages.clj
respond-to-message
dispatching on request type to eliminate individually
named response functions such as input-request
, comm-open-reply
, kernel-info-reply
, etc.defresponse
to further reduce code sizeshutdown-reply
separating shutdown actions and responding to shutdown requestsend-message
and send-router-message
to reduce code redundancy and make code easier to followexecute-request-handler
a bit, add commentsget-message-{signer,checker}
to make-message-{signer,checker}
util.clj
middleware/mime_values.clj
:mime-tagged-value
to result of to-mime
(instead of mime-tagging :value
directly): Enables using the nrepl
server using regular clientsprotocol/mime_convertible.clj
nil
as nil
(instead of not printing anything)stacktrace.clj
cider-nrepl
occasionally triggers uncaught exceptions. Most likely linked to upgrade of
nrepl
and/or cider-nrepl
; the cause of the problem not understood as yet.core_test.clj
stderr
instead of stdout
->Class
-forms, e.g. ->HiccupHTML
instead of HiccupHTML.
, to allow interactive class updateslog/debug
here and therehtml-demo.ipynb
HEAD
of master
using Clojure 1.8)incanter-demo.ipynb
Can you improve this documentation? These fine people already did:
Klaus Harbo & Daniel CiumbericăEdit on GitHub
cljdoc is a website building & hosting documentation for Clojure/Script libraries
× close