Skip to content

Commit 15d8774

Browse files
authored
Add compatibility with nREPL 0.4 (#540)
Support with tools.nrepl is kept for now with the assumption that tools.nrepl namespaces would be loaded automatically by `lein repl` or `boot repl`. Support for tools.nrepl will likely be removed after a couple of releases (once mainstream Lein and Boot switch to nREPL 0.4).
1 parent 270400f commit 15d8774

28 files changed

+219
-95
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ You can easily boot an nREPL server with the CIDER middleware loaded
182182
with the following "magic" incantation:
183183

184184
```
185-
clj -Sdeps '{:deps {cider/cider-nrepl {:mvn/version "0.18.0-SNAPSHOT"} }}' -e '(require (quote cider-nrepl.main)) (cider-nrepl.main/init ["cider.nrepl/cider-middleware"])'
185+
clj -Sdeps '{:deps {cider/cider-nrepl {:mvn/version "0.19.0-SNAPSHOT"} }}' -e '(require (quote cider-nrepl.main)) (cider-nrepl.main/init ["cider.nrepl/cider-middleware"])'
186186
```
187187

188188
Note that `clj` was introduced in Clojure 1.9.
@@ -194,7 +194,7 @@ server with CIDER's own nREPL handler.
194194

195195
```clojure
196196
(ns my-app
197-
(:require [clojure.tools.nrepl.server :as nrepl-server]))
197+
(:require [nrepl.server :as nrepl-server]))
198198

199199
(defn nrepl-handler []
200200
(require 'cider.nrepl)

project.clj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
:license {:name "Eclipse Public License"
77
:url "http://www.eclipse.org/legal/epl-v10.html"}
88

9-
:dependencies [[org.clojure/tools.nrepl "0.2.13"]
9+
:dependencies [[nrepl "0.4.4"]
1010
^:source-dep [cider/orchard "0.3.0"]
1111
^:source-dep [thunknyc/profile "0.5.2"]
1212
^:source-dep [mvxcvi/puget "1.0.2"]

src/cider/nrepl.clj

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,24 @@
11
(ns cider.nrepl
2-
(:require [clojure.tools.nrepl.middleware :refer [set-descriptor!]]
3-
[clojure.tools.nrepl.middleware.session :refer [session]]
4-
[clojure.tools.nrepl.middleware.pr-values :refer [pr-values]]
5-
[clojure.tools.nrepl.server :as nrepl-server]
6-
[cider.nrepl.version :as version]
2+
(:require [cider.nrepl.version :as version]
73
[cider.nrepl.middleware.util.cljs :as cljs]
84
[cider.nrepl.middleware.pprint :as pprint]
95
[cider.nrepl.print-method]))
106

7+
;; Compatibility with the legacy tools.nrepl and the new nREPL 0.4.x.
8+
;; The assumption is that if someone is using old lein repl or boot repl
9+
;; they'll end up using the tools.nrepl, otherwise the modern one.
10+
(if (find-ns 'clojure.tools.nrepl)
11+
(require
12+
'[clojure.tools.nrepl.middleware :refer [set-descriptor!]]
13+
'[clojure.tools.nrepl.middleware.session :refer [session]]
14+
'[clojure.tools.nrepl.middleware.pr-values :refer [pr-values]]
15+
'[clojure.tools.nrepl.server :as nrepl-server])
16+
(require
17+
'[nrepl.middleware :refer [set-descriptor!]]
18+
'[nrepl.middleware.session :refer [session]]
19+
'[nrepl.middleware.pr-values :refer [pr-values]]
20+
'[nrepl.server :as nrepl-server]))
21+
1122
(def delayed-handlers
1223
"Map of `delay`s holding deferred middleware handlers."
1324
(atom {}))

src/cider/nrepl/middleware/content_type.clj

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,19 @@
4343
[4] https://tools.ietf.org/html/rfc2017"
4444
{:authors ["Reid 'arrdem' McKenzie <[email protected]>"]}
4545
(:require [cider.nrepl.middleware.slurp :refer [slurp-reply]])
46-
(:import clojure.tools.nrepl.transport.Transport
47-
java.awt.Image
46+
(:import java.awt.Image
4847
[java.io ByteArrayOutputStream File OutputStream]
4948
[java.net URI URL]
5049
java.nio.file.Path
5150
javax.imageio.ImageIO))
5251

52+
;; Compatibility with the legacy tools.nrepl and the new nREPL 0.4.x.
53+
;; The assumption is that if someone is using old lein repl or boot repl
54+
;; they'll end up using the tools.nrepl, otherwise the modern one.
55+
(if (find-ns 'clojure.tools.nrepl)
56+
(import 'clojure.tools.nrepl.transport.Transport)
57+
(import 'nrepl.transport.Transport))
58+
5359
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5460

5561
(defprotocol URLCoercable
@@ -80,7 +86,7 @@
8086
[{:keys [session value] :as response}]
8187
(cond
8288
;; FIXME (arrdem 2018-04-03):
83-
;;
89+
;;
8490
;; This could be more generic in terms of tolerating more
8591
;; protocols / schemes
8692

@@ -96,7 +102,7 @@
96102
:body "")
97103

98104
;; FIXME (arrdem 2018-04-03):
99-
;;
105+
;;
100106
;; This is super snowflakey in terms of only supporting base64
101107
;; coding this one kind of object. This could definitely be
102108
;; more generic / open to extension but hey at least it's

src/cider/nrepl/middleware/debug.clj

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,24 @@
1010
[cider.nrepl.middleware.util.instrument :as ins]
1111
[orchard.misc :as misc]
1212
[orchard.meta :as m]
13-
[clojure.java.io :as io]
14-
[clojure.tools.nrepl.middleware.interruptible-eval :refer [*msg*]]
15-
[clojure.tools.nrepl.misc :refer [response-for]]
16-
[clojure.tools.nrepl.middleware.session :as session]
17-
[clojure.tools.nrepl.transport :as transport])
13+
[clojure.java.io :as io])
1814
(:import [clojure.lang Compiler$LocalBinding]))
1915

16+
;; Compatibility with the legacy tools.nrepl and the new nREPL 0.4.x.
17+
;; The assumption is that if someone is using old lein repl or boot repl
18+
;; they'll end up using the tools.nrepl, otherwise the modern one.
19+
(if (find-ns 'clojure.tools.nrepl)
20+
(require
21+
'[clojure.tools.nrepl.middleware.interruptible-eval :refer [*msg*]]
22+
'[clojure.tools.nrepl.middleware.session :as session]
23+
'[clojure.tools.nrepl.misc :refer (response-for)]
24+
'[clojure.tools.nrepl.transport :as transport])
25+
(require
26+
'[nrepl.middleware.interruptible-eval :refer [*msg*]]
27+
'[nrepl.middleware.session :as session]
28+
'[nrepl.misc :refer (response-for)]
29+
'[nrepl.transport :as transport]))
30+
2031
;;;; # The Debugger
2132
;;;
2233
;;; The debugger is divided into two parts, instrument.clj and

src/cider/nrepl/middleware/inspect.clj

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,24 @@
33
[cider.nrepl.middleware.util.error-handling :refer [base-error-response]]
44
[orchard.inspect :as inspect]
55
[orchard.misc :as u]
6-
[clojure.tools.nrepl.misc :refer [response-for]]
7-
[clojure.tools.nrepl.transport :as transport])
8-
(:import clojure.tools.nrepl.transport.Transport))
6+
[nrepl.misc :refer [response-for]]
7+
[nrepl.transport :as transport])
8+
(:import nrepl.transport.Transport))
9+
10+
;; Compatibility with the legacy tools.nrepl and the new nREPL 0.4.x.
11+
;; The assumption is that if someone is using old lein repl or boot repl
12+
;; they'll end up using the tools.nrepl, otherwise the modern one.
13+
(if (find-ns 'clojure.tools.nrepl)
14+
(do
15+
(require
16+
'[clojure.tools.nrepl.misc :refer [response-for]]
17+
'[clojure.tools.nrepl.transport :as transport])
18+
(import 'clojure.tools.nrepl.transport.Transport))
19+
(do
20+
(require
21+
'[nrepl.misc :refer [response-for]]
22+
'[nrepl.transport :as transport])
23+
(import 'nrepl.transport.Transport)))
924

1025
(def ^:dynamic *inspector* (inspect/fresh))
1126

src/cider/nrepl/middleware/out.clj

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,15 @@
99
We use an eval message, instead of the clone op, because there's no
1010
guarantee that the channel that sent the clone message will properly
1111
handle output replies."
12-
(:require [cider.nrepl.middleware.util.error-handling :refer [with-safe-transport]]
13-
[clojure.tools.nrepl.middleware.interruptible-eval :as ie])
12+
(:require [cider.nrepl.middleware.util.error-handling :refer [with-safe-transport]])
1413
(:import [java.io PrintWriter Writer PrintStream OutputStream]))
1514

15+
(if (find-ns 'clojure.tools.nrepl)
16+
(require
17+
'[clojure.tools.nrepl.middleware.interruptible-eval :as ieval])
18+
(require
19+
'[nrepl.middleware.interruptible-eval :as ieval]))
20+
1621
(declare unsubscribe-session)
1722

1823
(def original-output
@@ -29,7 +34,7 @@
2934
(case ~type
3035
:out #'*out*
3136
:err #'*err*))]
32-
(try (binding [ie/*msg* ~'msg]
37+
(try (binding [ieval/*msg* ~'msg]
3338
~@body)
3439
;; If a channel is faulty, dissoc it.
3540
(catch Exception ~'e

src/cider/nrepl/middleware/pprint.clj

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,25 @@
11
(ns cider.nrepl.middleware.pprint
22
(:require [cider.nrepl.middleware.util.cljs :as cljs]
33
[orchard.misc :as u]
4-
[clojure.pprint :refer [pprint *print-right-margin*]]
5-
[clojure.tools.nrepl.middleware.interruptible-eval :refer [*msg*]]
6-
[clojure.tools.nrepl.middleware.pr-values :refer [pr-values]]
7-
[clojure.tools.nrepl.middleware.session :as session]
8-
[clojure.tools.nrepl.misc :refer [response-for]]
9-
[clojure.tools.nrepl.transport :as transport])
10-
(:import clojure.tools.nrepl.transport.Transport))
4+
[clojure.pprint :refer [pprint *print-right-margin*]]))
5+
6+
(if (find-ns 'clojure.tools.nrepl)
7+
(do
8+
(require
9+
'[clojure.tools.nrepl.middleware.interruptible-eval :refer [*msg*]]
10+
'[clojure.tools.nrepl.middleware.pr-values :refer [pr-values]]
11+
'[clojure.tools.nrepl.middleware.session :as session]
12+
'[clojure.tools.nrepl.misc :refer [response-for]]
13+
'[clojure.tools.nrepl.transport :as transport])
14+
(import 'clojure.tools.nrepl.transport.Transport))
15+
(do
16+
(require
17+
'[nrepl.middleware.interruptible-eval :refer [*msg*]]
18+
'[nrepl.middleware.pr-values :refer [pr-values]]
19+
'[nrepl.middleware.session :as session]
20+
'[nrepl.misc :refer [response-for]]
21+
'[nrepl.transport :as transport])
22+
(import 'nrepl.transport.Transport)))
1123

1224
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1325

src/cider/nrepl/middleware/profile.clj

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,15 @@
1414
Based on older middleware (nrepl-profile) that's not actively
1515
maintained anymore."
1616
{:author "Edwin Watkeys"}
17-
(:require [clojure.string :as s]
18-
[profile.core :as p]
19-
[clojure.tools.nrepl.transport :as t]
20-
[clojure.tools.nrepl.misc :refer [response-for]]))
17+
(:require [profile.core :as p]))
18+
19+
(if (find-ns 'clojure.tools.nrepl)
20+
(require
21+
'[clojure.tools.nrepl.misc :refer [response-for]]
22+
'[clojure.tools.nrepl.transport :as t])
23+
(require
24+
'[nrepl.misc :refer [response-for]]
25+
'[nrepl.transport :as t]))
2126

2227
(defn send-exception
2328
[e msg transport]

src/cider/nrepl/middleware/refresh.clj

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,17 @@
1111
[clojure.tools.namespace.dir :as dir]
1212
[clojure.tools.namespace.find :as find]
1313
[clojure.tools.namespace.reload :as reload]
14-
[clojure.tools.namespace.track :as track]
15-
[clojure.tools.nrepl.middleware.interruptible-eval :refer [*msg*]]
16-
[clojure.tools.nrepl.misc :refer [response-for]]
17-
[clojure.tools.nrepl.transport :as transport]))
14+
[clojure.tools.namespace.track :as track]))
15+
16+
(if (find-ns 'clojure.tools.nrepl)
17+
(require
18+
'[clojure.tools.nrepl.middleware.interruptible-eval :refer [*msg*]]
19+
'[clojure.tools.nrepl.misc :refer (response-for)]
20+
'[clojure.tools.nrepl.transport :as transport])
21+
(require
22+
'[nrepl.middleware.interruptible-eval :refer [*msg*]]
23+
'[nrepl.misc :refer (response-for)]
24+
'[nrepl.transport :as transport]))
1825

1926
(defonce ^:private refresh-tracker (agent (track/tracker)))
2027

0 commit comments

Comments
 (0)