From a0012677b6f2d33b8b8123ef3761225de572f770 Mon Sep 17 00:00:00 2001 From: yuhan0 <qythium@gmail.com> Date: Wed, 4 Mar 2020 16:21:23 +0800 Subject: [PATCH 1/4] Add undef-all op --- src/cider/nrepl.clj | 7 +++++-- src/cider/nrepl/middleware/undef.clj | 17 ++++++++++++++++- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/cider/nrepl.clj b/src/cider/nrepl.clj index b266ee9bb..c982bb99d 100644 --- a/src/cider/nrepl.clj +++ b/src/cider/nrepl.clj @@ -473,7 +473,7 @@ (def ops-that-can-eval "Set of nREPL ops that can lead to code being evaluated." #{"eval" "load-file" "refresh" "refresh-all" "refresh-clear" - "toggle-trace-var" "toggle-trace-ns" "undef"}) + "toggle-trace-var" "toggle-trace-ns" "undef" "undef-all"}) (def-wrapper wrap-tracker cider.nrepl.middleware.track-state/handle-tracker ops-that-can-eval @@ -492,7 +492,10 @@ {"undef" {:doc "Undefine a symbol" :requires {"sym" "The symbol to undefine" "ns" "The namespace is which to resolve sym (falls back to *ns* if not specified)"} - :returns {"status" "done"}}}}) + :returns {"status" "done"}} + "undef-all" {:doc "Undefine all aliases and symbols in a namespace" + :requires {"ns" "The namespace to operate on"} + :returns {"status" "done"}}}}) (def-wrapper wrap-version cider.nrepl.middleware.version/handle-version {:doc "Provides CIDER-nREPL version information." diff --git a/src/cider/nrepl/middleware/undef.clj b/src/cider/nrepl/middleware/undef.clj index 03747861d..c6232fb77 100644 --- a/src/cider/nrepl/middleware/undef.clj +++ b/src/cider/nrepl/middleware/undef.clj @@ -27,10 +27,25 @@ (ns-unmap ns sym-name))) sym)) +(defn undef-all + "Undefines all symbol mappings and aliases in the namespace." + [{:keys [ns]}] + (let [ns (misc/as-sym ns)] + (doseq [[sym _] (ns-map ns)] + (ns-unmap ns sym)) + (doseq [[sym _] (ns-aliases ns)] + (ns-unalias ns sym)) + ns)) + (defn undef-reply [msg] {:undef (undef msg)}) +(defn undef-all-reply + [msg] + {:undef-all (undef-all msg)}) + (defn handle-undef [handler msg] (with-safe-transport handler msg - "undef" undef-reply)) + "undef" undef-reply + "undef-all" undef-all-reply)) From 1a70aaa55362e3640b969b1cc348f0c5c8f780fd Mon Sep 17 00:00:00 2001 From: yuhan0 <qythium@gmail.com> Date: Thu, 22 Apr 2021 03:22:25 +0800 Subject: [PATCH 2/4] Add tests for undef-all --- .../clj/cider/nrepl/middleware/undef_test.clj | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/test/clj/cider/nrepl/middleware/undef_test.clj b/test/clj/cider/nrepl/middleware/undef_test.clj index 0b942affc..a879c5d9f 100644 --- a/test/clj/cider/nrepl/middleware/undef_test.clj +++ b/test/clj/cider/nrepl/middleware/undef_test.clj @@ -101,3 +101,27 @@ (is (:pp-stacktrace response)) (is (:err response)) (is (:ex response))))) + +(deftest undef-all-test + (testing "undef-all undefines all vars in namespace" + (is (= #{"done"} + (:status (session/message {:op "eval" + :code "(do (ns other.ns (:require [clojure.walk :as walk :refer [postwalk]])))"})))) + (is (= ["#'clojure.core/assoc"] + (:value (session/message {:op "eval" + :code "(do (in-ns 'user) (ns-resolve 'other.ns 'assoc))"})))) + (is (= ["#'clojure.walk/postwalk"] + (:value (session/message {:op "eval" + :code "(ns-resolve 'other.ns 'postwalk)"})))) + (is (= #{"done"} + (:status (session/message {:op "undef-all" + :ns "other.ns"})))) + (is (= ["nil"] + (:value (session/message {:op "eval" + :code "(ns-resolve 'other.ns 'assoc)"})))) + (is (= ["nil"] + (:value (session/message {:op "eval" + :code "(ns-resolve 'other.ns 'postwalk)"})))) + (is (= ["{}"] + (:value (session/message {:op "eval" + :code "(ns-aliases 'other.ns)"})))))) From 6af746dbf04120b295cd84314105bc44f52787c2 Mon Sep 17 00:00:00 2001 From: yuhan0 <qythium@gmail.com> Date: Fri, 23 Apr 2021 20:44:03 +0800 Subject: [PATCH 3/4] Update changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 083381ba3..6d29efd89 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## master (unreleased) +### New features + +* [#698](https://github.com/clojure-emacs/cider-nrepl/pull/698): Add `undef-all` op to undefine all symbols and aliases in namespace + ## 0.26.0 (2021-04-22) ### New features From cb2c4303a5886eab2b6fdfd11eaadc923afda542 Mon Sep 17 00:00:00 2001 From: yuhan0 <qythium@gmail.com> Date: Fri, 23 Apr 2021 20:57:59 +0800 Subject: [PATCH 4/4] Regenerate docs --- doc/modules/ROOT/pages/nrepl-api/ops.adoc | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/doc/modules/ROOT/pages/nrepl-api/ops.adoc b/doc/modules/ROOT/pages/nrepl-api/ops.adoc index c815cb065..8a8f38e7f 100644 --- a/doc/modules/ROOT/pages/nrepl-api/ops.adoc +++ b/doc/modules/ROOT/pages/nrepl-api/ops.adoc @@ -969,7 +969,7 @@ Required parameters:: {blank} Optional parameters:: -* `:filter-regex` Only the specs that matches filter prefix regex will be returned +* `:filter-regex` Only the specs that matches filter prefix regex will be returned Returns:: @@ -1179,3 +1179,20 @@ Optional parameters:: Returns:: * `:status` done + + + +=== `undef-all` + +Undefine all aliases and symbols in a namespace + +Required parameters:: +* `:ns` The namespace to operate on + + +Optional parameters:: +{blank} + +Returns:: +* `:status` done +