The loader resolved a namespace against one hardcoded root (src/jolt, .clj only). Now it searches an ordered list (ctx env :source-paths, stdlib first) and tries .clj then .cljc. init adds roots from the :paths opt and JOLT_PATH. This is the foundation for loading deps.edn libraries; verified loading medley from an added root. No change to stdlib loading (3913 suite baseline held).
48 lines
2 KiB
Text
48 lines
2 KiB
Text
# The loader resolves namespaces against an ordered list of source roots (the
|
|
# stdlib first, then deps.edn-resolved dirs), trying .clj then .cljc. This is the
|
|
# foundation for loading Clojure libraries via deps.edn — here we point a root at
|
|
# a hand-written "library" and require it.
|
|
|
|
(use ../../src/jolt/api)
|
|
(use ../../src/jolt/types)
|
|
|
|
(def tmp (string (os/getenv "TMPDIR") "jolt-deps-test-" (os/time)))
|
|
(os/mkdir tmp)
|
|
(os/mkdir (string tmp "/mylib"))
|
|
(os/mkdir (string tmp "/other"))
|
|
|
|
# a .cljc library with its own ns form and a require of a sibling ns
|
|
(spit (string tmp "/mylib/core.cljc")
|
|
"(ns mylib.core (:require [other.util :as u]))\n(defn double [x] (* 2 x))\n(defn doubled-inc [x] (u/inc1 (double x)))\n")
|
|
# a .clj sibling, with a dash in the name (-> underscore in the path)
|
|
(os/mkdir (string tmp "/other"))
|
|
(spit (string tmp "/other/util.clj") "(ns other.util)\n(defn inc1 [x] (+ x 1))\n")
|
|
|
|
(def ctx (init {:paths [tmp]}))
|
|
(ctx-set-current-ns ctx "user")
|
|
|
|
(var fails 0)
|
|
(defn check [label expr expected]
|
|
(let [r (protect (eval-string ctx expr))
|
|
got (if (r 0) (normalize-pvecs (r 1)) (string "ERR " (r 1)))]
|
|
(if (= got expected)
|
|
(print " ok " label)
|
|
(do (++ fails) (printf " FAIL %s: want %q, got %q" label expected got)))))
|
|
|
|
# require a .cljc lib from the added root and call it
|
|
(check "require .cljc lib" "(do (require (quote [mylib.core :as m])) (m/double 21))" 42)
|
|
# transitive require (mylib.core requires other.util) resolved from the root too
|
|
(check "transitive .clj require" "(mylib.core/doubled-inc 10)" 21)
|
|
# the stdlib still resolves from its default root
|
|
(check "stdlib still loads" "(do (require (quote [jolt.interop :as j])) (j/janet-type 1))" :number)
|
|
|
|
# clean up
|
|
(defn rmrf [p]
|
|
(if (= :directory (os/stat p :mode))
|
|
(do (each e (os/dir p) (rmrf (string p "/" e))) (os/rmdir p))
|
|
(os/rm p)))
|
|
(rmrf tmp)
|
|
|
|
(if (> fails 0)
|
|
(error (string "deps-loader-test: " fails " failing check(s)"))
|
|
(print "\nAll deps-loader tests passed!"))
|