Read nREPL handlers and middleware from project. Fixes #716.

This commit is contained in:
Phil Hagelberg 2012-08-08 21:02:36 -07:00
parent 7489266e9f
commit 77c811bbe8
2 changed files with 24 additions and 5 deletions

View file

@ -130,6 +130,14 @@
;; increase this to wait longer before timing out.
;; Defaults to 30000 (30 seconds)
:timeout 40000}
;; Use a different server-side nREPL handler.
:nrepl-handler (clojure.tools.nrepl.server/default-handler)
;; Add server-side middleware to nREPL stack.
:nrepl-middleware [my.nrepl.thing/wrap-amazingness
(fn [handler]
(fn [& args]
(prn :middle args)
(apply handler args)))]
;; Forms to prepend to every form that is evaluated inside your project.
;; Allows working around the Gilardi Scenario: http://technomancy.us/143
:injections [(require 'clojure.pprint)]

View file

@ -24,10 +24,22 @@
(def trampoline-profile {:dependencies '[[reply "0.1.0-beta9"
:exclusions [org.clojure/clojure]]]})
(defn- handler-for [project]
`(-> ~(:nrepl-handler project '(clojure.tools.nrepl.server/default-handler))
~@(map list (:nrepl-middleware project))))
(defn- init-requires [project & nses]
(let [defaults '[clojure.tools.nrepl.server complete.core]
nrepl-syms (filter symbol? (cons (:nrepl-handler project)
(:nrepl-middleware project)))]
(for [n (concat defaults nrepl-syms nses)]
(list 'quote n))))
(defn- start-server [project host port ack-port & [headless?]]
(let [server-starting-form
`(let [server# (clojure.tools.nrepl.server/start-server
:bind ~host :port ~port :ack-port ~ack-port)
:bind ~host :port ~port :ack-port ~ack-port
:handler ~(handler-for project))
port# (-> server# deref :ss .getLocalPort)]
(println "nREPL server started on port" port#)
(spit ~(str (io/file (:target-path project) "repl-port")) port#)
@ -36,9 +48,8 @@
(eval/eval-in-project
(project/merge-profiles project [(:repl (user/profiles) profile)
(if-not headless? reply-profile)])
server-starting-form
'(do (require 'clojure.tools.nrepl.server)
(require 'complete.core)))
server-starting-form
`(require ~@(init-requires project)))
(eval server-starting-form))))
(defn- repl-port [project]
@ -88,7 +99,7 @@
(eval/eval-in-project
(project/merge-profiles project profiles)
`(reply.main/launch-nrepl ~options)
'(require 'reply.main 'clojure.tools.nrepl.server 'complete.core))))
`(require ~@(init-requires project 'reply.main)))))
(defn ^:no-project-needed repl
"Start a repl session either with the current project or standalone.