Skip to content

Commit

Permalink
TNS-51: Support namespaces as strings in require statements
Browse files Browse the repository at this point in the history
Signed-off-by: Alex Miller <alex.miller@cognitect.com>
  • Loading branch information
borkdude authored and puredanger committed Dec 10, 2021
1 parent a46b2ec commit 180c162
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 5 deletions.
1 change: 1 addition & 0 deletions .gitignore
@@ -1 +1,2 @@
target
.cpcache
9 changes: 9 additions & 0 deletions deps.edn
@@ -0,0 +1,9 @@
{:deps {org.clojure/tools.namespace {:local/root "." :deps/manifest :pom}}
:aliases
{:test
{:extra-paths ["src/test/clojure"]
:extra-deps {io.github.cognitect-labs/test-runner
{:git/tag "v0.5.0" :git/sha "b3fd0d2"}}
;; :main-opts ["-m" "cognitect.test-runner" "-d" "src/test/clojure"]
:exec-fn cognitect.test-runner.api/test
:exec-args {:dirs ["src/test/clojure"]}}}}
7 changes: 5 additions & 2 deletions src/main/clojure/clojure/tools/namespace/parse.cljc
Expand Up @@ -75,7 +75,8 @@
[namespace :refer (x y)] or just [namespace]"
[form]
(and (sequential? form) ; should be a vector, but often is not
(symbol? (first form))
(or (symbol? (first form))
(string? (first form)))
(or (keyword? (second form)) ; vector like [foo :as f]
(= 1 (count form))))) ; bare vector like [foo]

Expand All @@ -92,7 +93,9 @@
(list (symbol (str (when prefix (str prefix ".")) form)))
(keyword? form) ; Some people write (:require ... :reload-all)
nil
:else
(string? form) ; NPM dep, ignore
nil
:else
(throw (ex-info "Unparsable namespace form"
{:reason ::unparsable-ns-form
:form form}))))
Expand Down
20 changes: 17 additions & 3 deletions src/test/clojure/clojure/tools/namespace/parse_test.clj
Expand Up @@ -171,11 +171,25 @@
(:require #?(:clj clojure.string
:cljs goog.string)))")

(defn str->ns-decl [^String s]
(-> s
java.io.StringReader.
java.io.PushbackReader.
read-ns-decl))

(deftest t-reader-conditionals
(when (resolve 'clojure.core/reader-conditional?)
(let [actual (-> reader-conditionals-string
java.io.StringReader.
java.io.PushbackReader.
read-ns-decl
str->ns-decl
deps-from-ns-decl)]
(is (= #{'clojure.string} actual)))))

(def ns-with-npm-dependency
"(ns com.examples.one
(:require [\"foobar\"] [baz]))")

(deftest cljs-string-dependency
(let [actual (-> ns-with-npm-dependency
str->ns-decl
deps-from-ns-decl)]
(is (= #{'baz} actual))))

0 comments on commit 180c162

Please sign in to comment.