[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[nongnu] elpa/cider 773cc972c7 1/4: Support injecting dependencies into
From: |
ELPA Syncer |
Subject: |
[nongnu] elpa/cider 773cc972c7 1/4: Support injecting dependencies into Gradle |
Date: |
Sat, 30 Jul 2022 23:58:07 -0400 (EDT) |
branch: elpa/cider
commit 773cc972c7c302caa0fbeeb605e88c1b0ef92bfd
Author: Andrew Oberstar <andrew.oberstar@outlook.com>
Commit: Andrew Oberstar <andrew.oberstar@outlook.com>
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.
---
CHANGELOG.md | 1 +
cider.el | 51 ++++++++++++++++++++++++++++++++++++++++++++++++---
test/cider-tests.el | 42 ++++++++++++++++++++++++++++++++++++++----
3 files changed, 87 insertions(+), 7 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 88d73f8c6d..3855285918 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,7 @@
- [#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`.
- [#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.
- Support Gradle jack-in via the Gradle wrapper, instead of just a globally
installed `gradle` on the `PATH`.
+- 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)
## Changes
diff --git a/cider.el b/cider.el
index 2f65c98d10..0c64251b7a 100644
--- a/cider.el
+++ b/cider.el
@@ -577,6 +577,49 @@ and MIDDLEWARES. PARAMS and MIDDLEWARES are passed on to
(cider-boot-dependencies (append
(cider--jack-in-required-dependencies) dependencies))
(cider-boot-middleware-task params middlewares)))
+(defun cider--gradle-dependency-notation (dependency)
+ "Returns Gradle's GAV dependency syntax.
+For a \"group/artifact\" \"version\") DEPENDENCY list
+return as group:artifact:version notation."
+ (let ((group-artifact (replace-regexp-in-string "/" ":" (car dependency)))
+ (version (cadr dependency)))
+ (format "%s:%s" group-artifact version)))
+
+(defun cider--gradle-jack-in-property (dependencies)
+ "Returns Clojurephant's dependency jack-in property.
+For DEPENDENCIES, translates to Gradle's dependency notation
+using `cider--gradle-dependency-notation`.''"
+ (if (seq-empty-p dependencies)
+ ""
+ (shell-quote-argument
+ (concat "-Pdev.clojurephant.jack-in.nrepl="
+ (mapconcat #'cider--gradle-dependency-notation dependencies
",")))))
+
+(defun cider--gradle-middleware-params (middlewares)
+ "Returns Gradle-formatted middleware params.
+Given a list of MIDDLEWARES symbols, this returns
+the Gradle parameters expected by Clojurephant's
+ClojureNRepl task."
+ (mapconcat (lambda (middleware)
+ (shell-quote-argument (concat "--middleware=" middleware)))
+ middlewares
+ " "))
+
+(defun cider-gradle-jack-in-dependencies (global-opts params dependencies
middlewares)
+ "Create gradle jack in dependencies.
+Does so by concatenating GLOBAL-OPTS, DEPENDENCIES,
+and MIDDLEWARES. GLOBAL-OPTS and PARAMS are taken as-is.
+DEPENDENCIES are translated into Gradle's typical
+group:artifact:version notation and MIDDLEWARES are
+prepared as arguments to Clojurephant's ClojureNRepl task."
+ (concat global-opts
+ (unless (seq-empty-p global-opts) " ")
+ (cider--gradle-jack-in-property (append
(cider--jack-in-required-dependencies) dependencies))
+ " "
+ params
+ (unless (seq-empty-p params) " ")
+ (cider--gradle-middleware-params middlewares)))
+
(defun cider--lein-artifact-exclusions (exclusions)
"Return an exclusions vector described by the elements of EXCLUSIONS."
(if exclusions
@@ -717,10 +760,12 @@ dependencies."
params
(cider-add-clojure-dependencies-maybe
cider-jack-in-dependencies)))
- ('gradle (concat
+ ('gradle (cider-gradle-jack-in-dependencies
global-opts
- (unless (seq-empty-p global-opts) " ")
- params))
+ params
+ (cider-add-clojure-dependencies-maybe
+ cider-jack-in-dependencies)
+ (cider-jack-in-normalized-nrepl-middlewares)))
(_ (error "Unsupported project type `%S'" project-type))))
diff --git a/test/cider-tests.el b/test/cider-tests.el
index f661741897..7886dae606 100644
--- a/test/cider-tests.el
+++ b/test/cider-tests.el
@@ -105,6 +105,34 @@
(expect (cider-project-type) :to-equal cider-jack-in-default))))
;;; cider-jack-in tests
+(describe "cider--gradle-dependency-notation"
+ (it "returns a GAV when given a two-element list"
+ (expect (cider--gradle-dependency-notation '("cider/piggieback" "0.5.3"))
+ :to-equal "cider:piggieback:0.5.3")))
+
+(describe "cider--gradle-jack-in-property"
+ (it "returns an empty string if no dependencies passed"
+ (expect (cider--gradle-jack-in-property nil)
+ :to-equal ""))
+ (it "returns a Gradle property if one dependency passed"
+ (expect (cider--gradle-jack-in-property '(("abc/def" "1.2.3")))
+ :to-equal (shell-quote-argument
"-Pdev.clojurephant.jack-in.nrepl=abc:def:1.2.3")))
+ (it "returns a comma-separated Gradle property if multiple dependencies
passed"
+ (expect (cider--gradle-jack-in-property '(("abc/def" "1.2.3")
+ ("ghi/jkl" "4.5.6")
+ ("mno/pqr" "7.8.9")))
+ :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"))))
+
+(describe "cider--gradle-middleware-params"
+ (it "returns an empty string if no middlewares are passed"
+ (expect (cider--gradle-middleware-params nil)
+ :to-equal ""))
+ (it "returns a single middleware param if one passed"
+ (expect (cider--gradle-middleware-params '("my-ns/my-middleware"))
+ :to-equal "--middleware\\=my-ns/my-middleware"))
+ (it "returrns multiple middleware params, space-separated, if multiple
passed"
+ (expect (cider--gradle-middleware-params '("my-ns/my-middleware"
"other-ns/other-middleware"))
+ :to-equal "--middleware\\=my-ns/my-middleware
--middleware\\=other-ns/other-middleware")))
(describe "cider-inject-jack-in-dependencies"
:var (cider-jack-in-dependencies cider-jack-in-nrepl-middlewares
cider-jack-in-lein-plugins cider-jack-in-dependencies-exclusions)
@@ -167,8 +195,11 @@
" repl -s wait")))
(it "can inject dependencies in a gradle project"
- (expect (cider-inject-jack-in-dependencies "" "--no-daemon clojureRepl"
'gradle)
- :to-equal "--no-daemon clojureRepl")))
+ (expect (cider-inject-jack-in-dependencies "--no-daemon" ":clojureRepl"
'gradle)
+ :to-equal (concat "--no-daemon "
+ (shell-quote-argument
"-Pdev.clojurephant.jack-in.nrepl=nrepl:nrepl:0.9.0,cider:cider-nrepl:0.28.4")
+ " :clojureRepl "
+ (shell-quote-argument
"--middleware=cider.nrepl/cider-middleware")))))
(describe "when there are multiple dependencies"
(before-each
@@ -235,8 +266,11 @@
(shell-quote-argument
"cider.nrepl/cider-middleware")
" repl -s wait")))
(it "can concat in a gradle project"
- (expect (cider-inject-jack-in-dependencies "-m" "--no-daemon
clojureRepl" 'gradle)
- :to-equal "-m --no-daemon clojureRepl")))
+ (expect (cider-inject-jack-in-dependencies "--no-daemon" ":clojureRepl"
'gradle)
+ :to-equal (concat "--no-daemon "
+ (shell-quote-argument
"-Pdev.clojurephant.jack-in.nrepl=nrepl:nrepl:0.9.0,cider:cider-nrepl:0.28.4")
+ " :clojureRepl "
+ (shell-quote-argument
"--middleware=cider.nrepl/cider-middleware")))))
(describe "when there are predicates"
:var (plugins-predicate middlewares-predicate)