From b9308eddcc6ffa924349f103734121793e2725bd Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Wed, 4 Jan 2023 21:23:29 +0100 Subject: [PATCH] Fix #1456: allow dyn vars to be set in socket REPL (#1461) --- CHANGELOG.md | 2 +- src/babashka/impl/repl.clj | 73 +++++++++++++------------ test/babashka/impl/socket_repl_test.clj | 11 ++-- 3 files changed, 46 insertions(+), 40 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e6a37d2b..917ba86f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ A preview of the next release can be installed from ## Unreleased -... +- [#1456](https://github.com/babashka/babashka/issues/1456): allow `*warn-on-reflection*` and `*unchecked-math*` to be set in socket REPL and nREPL ([@axks](https://github.com/axks)) ## 1.0.169 (2023-01-03) diff --git a/src/babashka/impl/repl.clj b/src/babashka/impl/repl.clj index 11dcf370..0b279fe2 100644 --- a/src/babashka/impl/repl.clj +++ b/src/babashka/impl/repl.clj @@ -2,6 +2,7 @@ {:no-doc true} (:require [babashka.impl.clojure.main :as m] + [babashka.impl.clojure.core :as core-extras] [clojure.java.io :as io] [clojure.string :as str] [clojure.tools.reader.reader-types :as r] @@ -50,41 +51,43 @@ ([sci-ctx] (repl sci-ctx nil)) ([sci-ctx {:keys [:init :read :eval :need-prompt :prompt :flush :print :caught]}] (let [in @sci/in] - (m/repl - :init (or init - (fn [] - (sci/with-bindings {sci/out @sci/err} - (sio/println "Babashka" - (str "v" (str/trim (slurp (io/resource "BABASHKA_VERSION")))) - "REPL.") - (sio/println "Use :repl/quit or :repl/exit to quit the REPL.") - (sio/println "Clojure rocks, Bash reaches.") - (sio/println)) - (eval-form sci-ctx `(apply require (quote ~m/repl-requires))))) - :read (or read - (fn [_request-prompt request-exit] - (if (nil? (r/peek-char in)) - request-exit - (let [v (parser/parse-next sci-ctx in)] - (skip-if-eol in) - (if (or (identical? :repl/quit v) - (identical? :repl/exit v)) - request-exit - v))))) - :eval (or eval - (fn [expr] - (sci/with-bindings {sci/file "" - sci/*1 *1 - sci/*2 *2 - sci/*3 *3 - sci/*e *e} - (let [ret (eval-form sci-ctx expr)] - ret)))) - :need-prompt (or need-prompt (fn [] true)) - :prompt (or prompt #(sio/printf "%s=> " (utils/current-ns-name))) - :flush (or flush sio/flush) - :print (or print sio/prn) - :caught (or caught repl-caught))))) + (sci/binding [core-extras/warn-on-reflection @core-extras/warn-on-reflection + core-extras/unchecked-math @core-extras/unchecked-math] + (m/repl + :init (or init + (fn [] + (sci/with-bindings {sci/out @sci/err} + (sio/println "Babashka" + (str "v" (str/trim (slurp (io/resource "BABASHKA_VERSION")))) + "REPL.") + (sio/println "Use :repl/quit or :repl/exit to quit the REPL.") + (sio/println "Clojure rocks, Bash reaches.") + (sio/println)) + (eval-form sci-ctx `(apply require (quote ~m/repl-requires))))) + :read (or read + (fn [_request-prompt request-exit] + (if (nil? (r/peek-char in)) + request-exit + (let [v (parser/parse-next sci-ctx in)] + (skip-if-eol in) + (if (or (identical? :repl/quit v) + (identical? :repl/exit v)) + request-exit + v))))) + :eval (or eval + (fn [expr] + (sci/with-bindings {sci/file "" + sci/*1 *1 + sci/*2 *2 + sci/*3 *3 + sci/*e *e} + (let [ret (eval-form sci-ctx expr)] + ret)))) + :need-prompt (or need-prompt (fn [] true)) + :prompt (or prompt #(sio/printf "%s=> " (utils/current-ns-name))) + :flush (or flush sio/flush) + :print (or print sio/prn) + :caught (or caught repl-caught)))))) (defn start-repl! ([sci-ctx] (start-repl! sci-ctx nil)) diff --git a/test/babashka/impl/socket_repl_test.clj b/test/babashka/impl/socket_repl_test.clj index 5699b456..b0731755 100644 --- a/test/babashka/impl/socket_repl_test.clj +++ b/test/babashka/impl/socket_repl_test.clj @@ -1,8 +1,8 @@ (ns babashka.impl.socket-repl-test (:require - [babashka.impl.common :as common] [babashka.impl.server :refer [clojure-core-server-namespace]] [babashka.impl.socket-repl :refer [start-repl! stop-repl!]] + [babashka.main :as main] [babashka.process :as p] [babashka.test-utils :as tu] [babashka.wait :as w] @@ -15,7 +15,7 @@ (set! *warn-on-reflection* true) -(defn socket-command [expr expected] +(defn socket-command [expr expected & [log?]] (with-open [socket (java.net.Socket. "127.0.0.1" 1666) reader (io/reader socket) sw (java.io.StringWriter.) @@ -25,7 +25,8 @@ (loop [] (when-let [l (try (.readLine ^java.io.BufferedReader reader) (catch java.net.SocketException _ nil))] - ;; (prn :l l) + (when log? + (println "===" l)) (binding [*out* sw] (println l)) (let [s (str sw)] @@ -47,7 +48,7 @@ (when exec? (try (if tu/jvm? - (let [ctx (init {:namespaces {'clojure.core.server clojure-core-server-namespace} + (let [ctx (init {:namespaces main/namespaces :features #{:bb}})] (ctx-store/reset-ctx! ctx) (start-repl! "0.0.0.0:1666" ctx)) @@ -66,6 +67,8 @@ (is (socket-command "1\n*1" "1"))) (testing "*ns*" (is (socket-command "(ns foo.bar) (ns-name *ns*)" "foo.bar"))) + (testing "set dyn vars" + (is (socket-command "[(set! *warn-on-reflection* true) (set! *unchecked-math* true)]" "[true true]"))) (finally (if tu/jvm? (do (stop-repl!)