Skip to content

Commit

Permalink
testing: vars live in session-ns
Browse files Browse the repository at this point in the history
  • Loading branch information
mk committed Jul 12, 2023
1 parent 85f6fe8 commit da06369
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 8 deletions.
2 changes: 1 addition & 1 deletion notebooks/session.clj
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
(:require [nextjournal.clerk :as clerk]))

^{::clerk/sync true}
(defonce ^:dynamic !offset
(defonce !offset
(atom 0))

(clerk/col (clerk/with-viewer '(fn [_] [:div
Expand Down
16 changes: 12 additions & 4 deletions src/nextjournal/clerk/eval.clj
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,12 @@
(nippy/get-recorded-serializable-classes))

;; nippy tweaks
(alter-var-root #'nippy/*thaw-serializable-allowlist* (fn [_] (conj nippy/default-thaw-serializable-allowlist "java.io.File" "clojure.lang.Var" "clojure.lang.Namespace")))
(nippy/extend-freeze BufferedImage :java.awt.image.BufferedImage [x out] (ImageIO/write x "png" (ImageIO/createImageOutputStream out)))
(nippy/extend-thaw :java.awt.image.BufferedImage [in] (ImageIO/read in))

(defonce nippy-tweaks
(do
(alter-var-root #'nippy/*thaw-serializable-allowlist* (fn [_] (conj nippy/default-thaw-serializable-allowlist "java.io.File" "clojure.lang.Var" "clojure.lang.Namespace")))
(nippy/extend-freeze BufferedImage :java.awt.image.BufferedImage [x out] (ImageIO/write x "png" (ImageIO/createImageOutputStream out)))
(nippy/extend-thaw :java.awt.image.BufferedImage [in] (ImageIO/read in))))

#_(-> [(clojure.java.io/file "notebooks") (find-ns 'user)] nippy/freeze nippy/thaw)

Expand Down Expand Up @@ -192,7 +195,11 @@
(wrapped-with-metadata (:nextjournal/value cached-result-in-memory) hash))
(when (and cached-result? freezable?)
(lookup-cached-result (session/in-session-ns doc var) hash cas-hash))
(eval+cache! (assoc form-info :form form) hash digest-file))
(eval+cache! (-> form-info
(update :var (partial session/in-session-ns doc))
(assoc :form form))
hash
digest-file))
(seq opts-from-form-meta)
(merge opts-from-form-meta))))

Expand Down Expand Up @@ -298,3 +305,4 @@
(eval-doc in-memory-cache (parser/parse-clojure-string {:doc? true} code-string))))

#_(eval-string "(+ 39 3)")

14 changes: 11 additions & 3 deletions src/nextjournal/clerk/session.clj
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
(ns nextjournal.clerk.session
(:require [nextjournal.clerk.analyzer :as analyzer]))
(:require [clojure.string :as str]
[nextjournal.clerk.analyzer :as analyzer]))

(defn in-session-ns [{:keys [ns session-ns]} var]
(if (and var session-ns)
Expand All @@ -10,10 +11,17 @@
(def session-ns-prefix
"nextjournal.clerk.synthetic-session.")

(def session-ns-pattern
(re-pattern (str "^" session-ns-prefix "\\w+\\.")))

(defn session-ns-name [{:keys [ns session]}]
(symbol (str session-ns-prefix (ns-name ns) ".session=" (analyzer/valuehash session))))
(symbol (str session-ns-prefix (analyzer/valuehash session) "." (ns-name ns))))

#_(session-ns-name {:ns (create-ns 'scratch) :session 'foo})
(defn ->orignal-ns [sym]
(if (qualified-symbol? sym)
(symbol (str/replace (namespace sym) session-ns-pattern "")
(name sym))
sym))

(defn rewrite-ns-form [doc session-ns]
(update-in doc [:blocks 0 :form] (fn [ns-form]
Expand Down
25 changes: 25 additions & 0 deletions test/nextjournal/clerk/eval_test.clj
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
[nextjournal.clerk :as clerk]
[nextjournal.clerk.eval :as eval]
[nextjournal.clerk.parser :as parser]
[nextjournal.clerk.session :as session]
[nextjournal.clerk.view :as view]
[nextjournal.clerk.viewer :as viewer]))

Expand Down Expand Up @@ -206,6 +207,30 @@
(intern (create-ns 'existing-var) 'foo :bar)
(is (eval/eval-string "(in-ns 'existing-var) foo"))))

(defn eval-string-in-session [code-string session]
(eval/eval-doc (assoc (parser/parse-clojure-string {:doc? true} code-string) :session session)))

(deftest eval-in-session
(let [{:keys [blocks]} (eval-string-in-session "(ns my-session)
(defonce !offset (atom 0))
(defn get-offset [] @!offset)"
:foo)]
(testing "var-from-def is correctly assigned"
(is (-> blocks
peek
:result
viewer/->value
viewer/var-from-def?)))


(testing "vars live in session-ns"
(is (= #{(session/session-ns-name {:ns (create-ns 'my-session)
:session :foo})}
(into #{}
(map (comp symbol namespace symbol))
(keep (comp :nextjournal.clerk/var-from-def :nextjournal/value :result)
blocks)))))))

(clerk/defcached my-expansive-thing
(do (Thread/sleep 1 #_10000) 42))

Expand Down

0 comments on commit da06369

Please sign in to comment.