Skip to content

Commit 773cc97

Browse files
committed
Support injecting dependencies into Gradle
Gradle doesn't have any native support, but as of 0.7.0-alpha.6, Clojurephant supports a Gradle property to list dependencies to be injected into the nREPL server. This property is backwards compatible for users on older Clojurephant versions, since Gradle ignores unknown properties on the command line, falling back to no injection. The middleware arguments have been supported in Clojurephant since 0.4.0-beta.4 in 2018, so I think it should be safe to start passing those in.
1 parent 6f2d3ba commit 773cc97

File tree

3 files changed

+87
-7
lines changed

3 files changed

+87
-7
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
- [#3226](https://github.com/clojure-emacs/cider/pull/3226): Populate completions metadata, making it possible to change the style of completion via `completion-category-override` or `completion-category-defaults`.
88
- [#2946](https://github.com/clojure-emacs/cider/issues/2946): Add custom var `cider-merge-sessions` to allow combining sessions in two different ways: Setting `cider-merge-sessions` to `'host` will merge all sessions associated with the same host within a project. Setting it to `'project` will combine all sessions of a project irrespective of their host.
99
- Support Gradle jack-in via the Gradle wrapper, instead of just a globally installed `gradle` on the `PATH`.
10+
- Gradle projects can now inject dependencies and middleware as with other build tools (dependency injection requires [Clojurephant](https://github.com/clojurephant/clojurephant) 0.7.0-alpha.6 or higher)
1011

1112
## Changes
1213

cider.el

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -577,6 +577,49 @@ and MIDDLEWARES. PARAMS and MIDDLEWARES are passed on to
577577
(cider-boot-dependencies (append (cider--jack-in-required-dependencies) dependencies))
578578
(cider-boot-middleware-task params middlewares)))
579579

580+
(defun cider--gradle-dependency-notation (dependency)
581+
"Returns Gradle's GAV dependency syntax.
582+
For a \"group/artifact\" \"version\") DEPENDENCY list
583+
return as group:artifact:version notation."
584+
(let ((group-artifact (replace-regexp-in-string "/" ":" (car dependency)))
585+
(version (cadr dependency)))
586+
(format "%s:%s" group-artifact version)))
587+
588+
(defun cider--gradle-jack-in-property (dependencies)
589+
"Returns Clojurephant's dependency jack-in property.
590+
For DEPENDENCIES, translates to Gradle's dependency notation
591+
using `cider--gradle-dependency-notation`.''"
592+
(if (seq-empty-p dependencies)
593+
""
594+
(shell-quote-argument
595+
(concat "-Pdev.clojurephant.jack-in.nrepl="
596+
(mapconcat #'cider--gradle-dependency-notation dependencies ",")))))
597+
598+
(defun cider--gradle-middleware-params (middlewares)
599+
"Returns Gradle-formatted middleware params.
600+
Given a list of MIDDLEWARES symbols, this returns
601+
the Gradle parameters expected by Clojurephant's
602+
ClojureNRepl task."
603+
(mapconcat (lambda (middleware)
604+
(shell-quote-argument (concat "--middleware=" middleware)))
605+
middlewares
606+
" "))
607+
608+
(defun cider-gradle-jack-in-dependencies (global-opts params dependencies middlewares)
609+
"Create gradle jack in dependencies.
610+
Does so by concatenating GLOBAL-OPTS, DEPENDENCIES,
611+
and MIDDLEWARES. GLOBAL-OPTS and PARAMS are taken as-is.
612+
DEPENDENCIES are translated into Gradle's typical
613+
group:artifact:version notation and MIDDLEWARES are
614+
prepared as arguments to Clojurephant's ClojureNRepl task."
615+
(concat global-opts
616+
(unless (seq-empty-p global-opts) " ")
617+
(cider--gradle-jack-in-property (append (cider--jack-in-required-dependencies) dependencies))
618+
" "
619+
params
620+
(unless (seq-empty-p params) " ")
621+
(cider--gradle-middleware-params middlewares)))
622+
580623
(defun cider--lein-artifact-exclusions (exclusions)
581624
"Return an exclusions vector described by the elements of EXCLUSIONS."
582625
(if exclusions
@@ -717,10 +760,12 @@ dependencies."
717760
params
718761
(cider-add-clojure-dependencies-maybe
719762
cider-jack-in-dependencies)))
720-
('gradle (concat
763+
('gradle (cider-gradle-jack-in-dependencies
721764
global-opts
722-
(unless (seq-empty-p global-opts) " ")
723-
params))
765+
params
766+
(cider-add-clojure-dependencies-maybe
767+
cider-jack-in-dependencies)
768+
(cider-jack-in-normalized-nrepl-middlewares)))
724769
(_ (error "Unsupported project type `%S'" project-type))))
725770

726771

test/cider-tests.el

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,34 @@
105105
(expect (cider-project-type) :to-equal cider-jack-in-default))))
106106

107107
;;; cider-jack-in tests
108+
(describe "cider--gradle-dependency-notation"
109+
(it "returns a GAV when given a two-element list"
110+
(expect (cider--gradle-dependency-notation '("cider/piggieback" "0.5.3"))
111+
:to-equal "cider:piggieback:0.5.3")))
112+
113+
(describe "cider--gradle-jack-in-property"
114+
(it "returns an empty string if no dependencies passed"
115+
(expect (cider--gradle-jack-in-property nil)
116+
:to-equal ""))
117+
(it "returns a Gradle property if one dependency passed"
118+
(expect (cider--gradle-jack-in-property '(("abc/def" "1.2.3")))
119+
:to-equal (shell-quote-argument "-Pdev.clojurephant.jack-in.nrepl=abc:def:1.2.3")))
120+
(it "returns a comma-separated Gradle property if multiple dependencies passed"
121+
(expect (cider--gradle-jack-in-property '(("abc/def" "1.2.3")
122+
("ghi/jkl" "4.5.6")
123+
("mno/pqr" "7.8.9")))
124+
:to-equal (shell-quote-argument "-Pdev.clojurephant.jack-in.nrepl=abc:def:1.2.3,ghi:jkl:4.5.6,mno:pqr:7.8.9"))))
125+
126+
(describe "cider--gradle-middleware-params"
127+
(it "returns an empty string if no middlewares are passed"
128+
(expect (cider--gradle-middleware-params nil)
129+
:to-equal ""))
130+
(it "returns a single middleware param if one passed"
131+
(expect (cider--gradle-middleware-params '("my-ns/my-middleware"))
132+
:to-equal "--middleware\\=my-ns/my-middleware"))
133+
(it "returrns multiple middleware params, space-separated, if multiple passed"
134+
(expect (cider--gradle-middleware-params '("my-ns/my-middleware" "other-ns/other-middleware"))
135+
:to-equal "--middleware\\=my-ns/my-middleware --middleware\\=other-ns/other-middleware")))
108136

109137
(describe "cider-inject-jack-in-dependencies"
110138
:var (cider-jack-in-dependencies cider-jack-in-nrepl-middlewares cider-jack-in-lein-plugins cider-jack-in-dependencies-exclusions)
@@ -167,8 +195,11 @@
167195
" repl -s wait")))
168196

169197
(it "can inject dependencies in a gradle project"
170-
(expect (cider-inject-jack-in-dependencies "" "--no-daemon clojureRepl" 'gradle)
171-
:to-equal "--no-daemon clojureRepl")))
198+
(expect (cider-inject-jack-in-dependencies "--no-daemon" ":clojureRepl" 'gradle)
199+
:to-equal (concat "--no-daemon "
200+
(shell-quote-argument "-Pdev.clojurephant.jack-in.nrepl=nrepl:nrepl:0.9.0,cider:cider-nrepl:0.28.4")
201+
" :clojureRepl "
202+
(shell-quote-argument "--middleware=cider.nrepl/cider-middleware")))))
172203

173204
(describe "when there are multiple dependencies"
174205
(before-each
@@ -235,8 +266,11 @@
235266
(shell-quote-argument "cider.nrepl/cider-middleware")
236267
" repl -s wait")))
237268
(it "can concat in a gradle project"
238-
(expect (cider-inject-jack-in-dependencies "-m" "--no-daemon clojureRepl" 'gradle)
239-
:to-equal "-m --no-daemon clojureRepl")))
269+
(expect (cider-inject-jack-in-dependencies "--no-daemon" ":clojureRepl" 'gradle)
270+
:to-equal (concat "--no-daemon "
271+
(shell-quote-argument "-Pdev.clojurephant.jack-in.nrepl=nrepl:nrepl:0.9.0,cider:cider-nrepl:0.28.4")
272+
" :clojureRepl "
273+
(shell-quote-argument "--middleware=cider.nrepl/cider-middleware")))))
240274

241275
(describe "when there are predicates"
242276
:var (plugins-predicate middlewares-predicate)

0 commit comments

Comments
 (0)