Skip to content

Instantly share code, notes, and snippets.

@ryantm
Created December 20, 2013 16:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ryantm/8057775 to your computer and use it in GitHub Desktop.
Save ryantm/8057775 to your computer and use it in GitHub Desktop.
(defn doc-from-ns-form
"Extract the docstring from a given ns form without evaluating the form. The docstring returned should be the return value of (:doc (meta namespace-symbol)) if the ns-form were to be evaluated."
[ns-form]
(let [meta-docstring (:doc (meta (second ns-form)))
references (next (next ns-form))
docstring (when (string? (first references)) (first references))
references (if docstring (next references) references)
attribute-docstring (:doc (when (map? (first references)) (first references)))]
(or attribute-docstring docstring meta-docstring)))
(defn test-doc-from-ns-form-helper
[docstring ns-form]
(eval ns-form)
(is (= docstring
(:doc (meta *ns*))
(doc-from-ns-form ns-form))))
(deftest doc-from-ns-form-test
(testing "doc-from-ns-form"
(test-doc-from-ns-form-helper
nil
'(ns no-doc-namespace-name))
(test-doc-from-ns-form-helper
"Docstring"
'(ns regular-doc-namespace-name "Docstring"))
(test-doc-from-ns-form-helper
"Attribute-Docstring"
'(ns attribute-doc-namepsace-name {:doc "Attribute-Docstring"}))
(test-doc-from-ns-form-helper
"Meta-Docstring"
'(ns ^{:doc "Meta-Docstring"} meta-doc-namespace-name))
(test-doc-from-ns-form-helper
"Docstring"
'(ns ^{:doc "Meta-Docstring"} meta-and-reg-doc-namespace-name "Docstring"))
(test-doc-from-ns-form-helper
"Attribute-Docstring"
'(ns reg-and-attribute-doc-namespace-name "Docstring" {:doc "Attribute-Docstring"}))
(test-doc-from-ns-form-helper
"Attribute-Docstring"
'(ns ^{:doc "Meta-Docstring"} all-doc-namespace-name "Docstring" {:doc "Attribute-Docstring"}))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment