tools.namespace

c.t.n.p/deps-from-ns-decl does not like (:use [some-root-ns module1 module2])

Details

  • Type: Defect Defect
  • Status: Closed Closed
  • Priority: Minor Minor
  • Resolution: Duplicate
  • Affects Version/s: None
  • Fix Version/s: None
  • Component/s: None
  • Labels:
    None
  • Environment:
    Clojure 1.5.1 ; Clojure.tools.namespace 0.2.3

Description

I am experiencing issues using the c.t.n.r/refresh on my project.

I believe that I have tracked down the issue to the way deps-from-ns-decl parses :use; that is: it is different from Clojure's.

I have several places used ns-forms of the shape:

(ns some-root-ns.module1
       (:use [some-root-ns module2 module3])

Where Clojure would load some-root-ns.module2 and some-root-ns.module3.

However, this is what deps-from-ms-decl gets:

(clojure.tools.namespace.parse/deps-from-ns-decl '(ns some-root-ns.module1
       (:use [some-root-ns module2 module3])))
;; => #{some-root-ns}

Note that while it is of course easily fixed by using this ns-form:

(clojure.tools.namespace.parse/deps-from-ns-decl '(ns some-root-ns.module1
       (:use [some-root-ns.module2])
       (:use [some-root-ns.module3])))
;; => #{some-root-ns.module3 some-root-ns.module2}

It would probably be desirable to be equivalent with Clojure's behavior.

Activity

Hide
Stuart Sierra added a comment -

c.t.namespace.parse does not currently support all the varied argument forms that Clojure's use and require will accept.

In general, c.t.namespace.parse adheres to the docstrings of the use and require functions, which state that prefixed namespaces are written as a list, not a vector. The use and require functions do not enforce this, leading to widespread variation in usage.

This is a duplicate of TNS-9.

Until it is resolved, you can write your prefixed namespaces as a list, like:

(ns some-root-ns.module1
  (:use (some-root-ns module2 module3)))

In general, I recommend against using prefix lists in ns declarations because they are harder to identify using text-based search tools.

Show
Stuart Sierra added a comment - c.t.namespace.parse does not currently support all the varied argument forms that Clojure's use and require will accept. In general, c.t.namespace.parse adheres to the docstrings of the use and require functions, which state that prefixed namespaces are written as a list, not a vector. The use and require functions do not enforce this, leading to widespread variation in usage. This is a duplicate of TNS-9. Until it is resolved, you can write your prefixed namespaces as a list, like:
(ns some-root-ns.module1
  (:use (some-root-ns module2 module3)))
In general, I recommend against using prefix lists in ns declarations because they are harder to identify using text-based search tools.
Hide
Stuart Sierra added a comment -

Mark old resolved issues as 'closed'

Show
Stuart Sierra added a comment - Mark old resolved issues as 'closed'

People

Vote (0)
Watch (1)

Dates

  • Created:
    Updated:
    Resolved: