Skip to content

Commit a0190ec

Browse files
liquidzbbatsov
authored andcommitted
Add a middleware to find docs from ClojureDocs
1 parent 7c4d03e commit a0190ec

File tree

9 files changed

+90
-1
lines changed

9 files changed

+90
-1
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
* [#605](https://github.com/clojure-emacs/cider-nrepl/pull/605): Added a option for filtering vars to the ns-vars middleware.
88
* Added `xref` middleware providing `fn-deps` and `fn-refs` ops.
9+
* [#628](https://github.com/clojure-emacs/cider-nrepl/pull/628): Added `clojuredocs` middleware providing `clojuredocs-lookup` and `clojuredocs-refresh-cache` ops.
910

1011
### Bugs fixed
1112

Makefile

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,16 @@ export CLOVERAGE_VERSION = 1.0.13
66
JAVA_VERSION = $(shell lein with-profile +sysutils \
77
sysutils :java-version-simple | cut -d " " -f 2)
88

9+
test/resources/cider/nrepl/clojuredocs/export.edn:
10+
curl -o $@ https://clojuredocs-edn.netlify.com/export.edn
11+
912
.inline-deps:
1013
lein inline-deps
1114
touch .inline-deps
1215

1316
inline-deps: .inline-deps
1417

15-
test: .inline-deps
18+
test: .inline-deps test/resources/cider/nrepl/clojuredocs/export.edn
1619
lein with-profile +$(CLOJURE_VERSION),+test,+plugin.mranderson/config test
1720

1821
eastwood:

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ under `:repl-options`.
122122
:repl-options {:nrepl-middleware
123123
[cider.nrepl/wrap-apropos
124124
cider.nrepl/wrap-classpath
125+
cider.nrepl/wrap-clojuredocs
125126
cider.nrepl/wrap-complete
126127
cider.nrepl/wrap-debug
127128
cider.nrepl/wrap-format
@@ -261,6 +262,7 @@ Middleware | Op(s) | Description
261262
------------------|------------|---------------------------------------------------------
262263
`wrap-apropos` | `apropos` | Pattern search for symbols and documentation.
263264
`wrap-classpath` | `classpath` | Java classpath.
265+
`wrap-clojuredocs`| `clojuredocs-lookup/clojuredocs-refresh-cache` | Look up ClojureDocs.
264266
`wrap-complete` | `complete` | Simple completion. Supports both Clojure & ClojureScript.
265267
`wrap-debug` | `init-debugger/debug-input` | Establish a channel for `cider-debug` commands, use it to get debug input, and also wrap the eval op.
266268
`wrap-format` | `format-(code/edn)` | Code and data formatting.

src/cider/nrepl.clj

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -478,12 +478,28 @@
478478
:returns {"fn-deps" "A list of function deps."
479479
"status" "done"}}}})
480480

481+
(def-wrapper wrap-clojuredocs cider.nrepl.middleware.clojuredocs/handle-clojuredocs
482+
{:doc "Middleware to find a documents from ClojureDocs."
483+
:handles {"clojuredocs-refresh-cache"
484+
{:doc "Reload exported documents file from ClojureDocs, and store it as a cache."
485+
:requires {}
486+
:optional {"export-edn-url" "EDN file URL exported from ClojureDocs. Defaults to \"https://clojuredocs-edn.netlify.com/export.edn\"."}
487+
:returns {"status" "\"ok\" if reloading was successful"}}
488+
"clojuredocs-lookup"
489+
{:doc "Return a map of information in ClojureDocs."
490+
:requires {"ns" "The namespace where `symbol` is define."
491+
"symbol" "The symbol to lookup."}
492+
:optional {"export-edn-url" "EDN file URL exported from ClojureDocs. Defaults to \"https://clojuredocs-edn.netlify.com/export.edn\"."}
493+
:returns {"clojuredocs" "A map of information in ClojureDocs."
494+
"status" "\"no-document\" if there is no document matching to `ns` and `symbol`."}}}})
495+
481496
;;; Cider's Handler
482497

483498
(def cider-middleware
484499
"A vector of all CIDER middleware."
485500
`[wrap-apropos
486501
wrap-classpath
502+
wrap-clojuredocs
487503
wrap-complete
488504
wrap-debug
489505
wrap-enlighten
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
(ns cider.nrepl.middleware.clojuredocs
2+
(:require
3+
[cider.nrepl.middleware.util.error-handling :refer [with-safe-transport]]
4+
[orchard.clojuredocs :as docs]
5+
[orchard.misc :as misc]))
6+
7+
(defn- clojuredocs-lookup-reply [{:keys [export-edn-url ns symbol]}]
8+
(if-let [doc (if export-edn-url
9+
(docs/find-doc ns symbol export-edn-url)
10+
(docs/find-doc ns symbol))]
11+
{:clojuredocs (misc/transform-value doc)}
12+
{:status :no-document}))
13+
14+
(defn clojuredocs-refresh-cache-reply [{:keys [export-edn-url]}]
15+
(docs/clean-cache!)
16+
(if export-edn-url
17+
(docs/load-cache! export-edn-url)
18+
(docs/load-cache!))
19+
{:status :ok})
20+
21+
(defn handle-clojuredocs [handler msg]
22+
(with-safe-transport handler msg
23+
"clojuredocs-refresh-cache" clojuredocs-refresh-cache-reply
24+
"clojuredocs-lookup" clojuredocs-lookup-reply))

src/cider_nrepl/plugin.clj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
;; requiring `cider.nrepl`).
6868
'[cider.nrepl/wrap-apropos
6969
cider.nrepl/wrap-classpath
70+
cider.nrepl/wrap-clojuredocs
7071
cider.nrepl/wrap-complete
7172
cider.nrepl/wrap-debug
7273
cider.nrepl/wrap-enlighten
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
(ns cider.nrepl.middleware.clojuredocs-test
2+
(:require
3+
[cider.nrepl.test-session :as session]
4+
[clojure.string :as str]
5+
[clojure.test :refer :all]))
6+
7+
(def ^:private test-url "test/resources/cider/nrepl/clojuredocs/export.edn")
8+
9+
(use-fixtures :each session/session-fixture)
10+
11+
(deftest clojuredocs-refresh-cache-integration-test
12+
(testing "Invalid URL"
13+
(let [response (session/message {:op "clojuredocs-refresh-cache"
14+
:export-edn-url "/non-existing.edn"})]
15+
(is (contains? (:status response) "clojuredocs-refresh-cache-error"))
16+
(is (not (str/blank? (:err response))))))
17+
18+
(testing "Valid URL"
19+
(let [response (session/message {:op "clojuredocs-refresh-cache"
20+
:export-edn-url test-url})]
21+
(is (contains? (:status response) "ok")))))
22+
23+
(deftest clojuredocs-lookup-integration-test
24+
(testing "Find not existing document"
25+
(let [response (session/message {:op "clojuredocs-lookup"
26+
:ns "non-existing"
27+
:symbol "non-existing"
28+
:export-edn-url test-url})]
29+
(is (contains? (:status response) "no-document"))))
30+
31+
(testing "Find existing document"
32+
(let [response (session/message {:op "clojuredocs-lookup"
33+
:ns "clojure.core"
34+
:symbol "first"
35+
:export-edn-url test-url})
36+
doc (get response :clojuredocs {})]
37+
(is (contains? (:status response) "done"))
38+
(is (= "clojure.core" (:ns doc)))
39+
(is (= "first" (:name doc)))
40+
(is (every? #(contains? doc %) [:examples :see-alsos])))))

test/clj/cider/nrepl/plugin_test.clj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
{:nrepl-middleware
1212
'[cider.nrepl/wrap-apropos
1313
cider.nrepl/wrap-classpath
14+
cider.nrepl/wrap-clojuredocs
1415
cider.nrepl/wrap-complete
1516
cider.nrepl/wrap-debug
1617
cider.nrepl/wrap-enlighten

test/resources/cider/nrepl/clojuredocs/export.edn

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)