Skip to content

Commit 731e9c6

Browse files
committed
Fix create-basis package resolution to use resolved basis libs
Rewrites `create-basis` to replace `:local/root` workspace dependencies by iterating over the resolved basis `:libs` map instead of the package's `:depends-on` set. This ensures correct resolution even after `filter-by` clears `:depends-on`, and preserves non-workspace libs unchanged. Adds tests covering local dep replacement, filtered packages, non-workspace libs, and libs with no version.
1 parent 5adc17f commit 731e9c6

File tree

3 files changed

+85
-19
lines changed

3 files changed

+85
-19
lines changed

packages/kmono-build/deps.edn

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,10 @@
99
babashka/fs {:mvn/version "0.5.30"}
1010

1111
com.kepler16/kmono-core {:local/root "../kmono-core"}
12-
com.kepler16/kmono-log {:local/root "../kmono-log"}}}
12+
com.kepler16/kmono-log {:local/root "../kmono-log"}}
13+
14+
:aliases {:test {:extra-paths ["test"]
15+
:extra-deps {lambdaisland/kaocha {:mvn/version "1.91.1392"}
16+
nubank/matcher-combinators {:mvn/version "3.9.2"}
17+
local/kmono-test {:local/root "../kmono-test"}}
18+
:main-opts ["-m" "kaocha.runner" "-c" "../../tests.edn"]}}}

packages/kmono-build/src/k16/kmono/build.clj

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -59,33 +59,36 @@
5959
"Constructs a basis using [[clojure.tools.build.api/create-basis]] with a
6060
modified set of `:libs`.
6161
62-
Any `:local/root` kmono dependencies within the basis are replaced with their
63-
respective `:mvn/version` coordinate derived from the given `packages` map.
62+
Any `:local/root` kmono dependencies within the resolved basis `:libs` are
63+
replaced with their respective `:mvn/version` coordinate by looking up the
64+
lib's symbol in the given `packages` map.
6465
6566
These `:libs` are then used to generate a correctly referenced `pom.xml` when
6667
using [[clojure.tools.build.api/write-pom]].
6768
69+
The `packages` map should contain all workspace packages required for version
70+
lookup (typically the full unfiltered package map).
71+
6872
Additional `opts` can be optionally provided and these will be given directly
6973
to `create-basis`."
7074
([packages package] (create-basis packages package {}))
7175
([packages package opts]
72-
(let [dependencies
76+
(let [basis (b/create-basis opts)
77+
78+
libs
7379
(into {}
74-
(comp
75-
(map (fn [pkg-name]
76-
(let [version (get-in packages [pkg-name :version])
77-
dep {:deps/manifest :mvn
78-
:mvn/version version
79-
:parents #{[]}
80-
:paths []}]
81-
(when version
82-
[pkg-name dep]))))
83-
(remove nil?))
84-
(:depends-on package))
85-
86-
basis (b/create-basis opts)]
87-
88-
(update basis :libs merge dependencies))))
80+
(map (fn [[lib-name coord]]
81+
(let [version (get-in packages [lib-name :version])
82+
local-dep? (some? (get-in packages [(:fqn package) :deps-edn :deps lib-name :local/root]))]
83+
(if (and version local-dep?)
84+
[lib-name {:deps/manifest :mvn
85+
:mvn/version version
86+
:parents #{[]}
87+
:paths []}]
88+
[lib-name coord]))))
89+
(:libs basis))]
90+
91+
(assoc basis :libs libs))))
8992

9093
(def ^:no-doc ?BuildOpts
9194
[:map
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
(ns k16.kmono.build-test
2+
(:require
3+
[clojure.test :refer [deftest is testing use-fixtures]]
4+
[clojure.tools.build.api :as b]
5+
[k16.kmono.build :as kmono.build]
6+
[k16.kmono.core.config :as core.config]
7+
[k16.kmono.core.packages :as core.packages]
8+
[k16.kmono.test.helpers.repo :refer [*repo* with-test-repo]]
9+
[matcher-combinators.test]))
10+
11+
(use-fixtures :once with-test-repo)
12+
13+
(defn- load-packages []
14+
(let [config (core.config/resolve-workspace-config *repo*)
15+
packages (core.packages/resolve-packages *repo* config)]
16+
packages))
17+
18+
(deftest create-basis-replaces-local-deps-with-mvn-version-test
19+
(testing "replaces :local/root workspace libs with :mvn/version"
20+
(let [packages (load-packages)
21+
packages (assoc-in packages ['com.kepler16/a :version] "1.2.3")
22+
pkg-b (get packages 'com.kepler16/b)]
23+
(b/with-project-root (:absolute-path pkg-b)
24+
(let [basis (kmono.build/create-basis packages pkg-b)]
25+
(is (match? {'com.kepler16/a {:deps/manifest :mvn
26+
:mvn/version "1.2.3"}}
27+
(:libs basis))))))))
28+
29+
(deftest create-basis-after-filter-by-test
30+
(testing "works when :depends-on has been cleared by filter-by"
31+
(let [packages (load-packages)
32+
packages (assoc-in packages ['com.kepler16/a :version] "1.2.3")
33+
pkg-b (assoc (get packages 'com.kepler16/b) :depends-on #{})]
34+
(b/with-project-root (:absolute-path pkg-b)
35+
(let [basis (kmono.build/create-basis packages pkg-b)]
36+
(is (match? {'com.kepler16/a {:deps/manifest :mvn
37+
:mvn/version "1.2.3"}}
38+
(:libs basis)))))))
39+
40+
(testing "leaves non-workspace libs unchanged"
41+
(let [packages (load-packages)
42+
packages (assoc-in packages ['com.kepler16/a :version] "1.2.3")
43+
pkg-b (get packages 'com.kepler16/b)]
44+
(b/with-project-root (:absolute-path pkg-b)
45+
(let [basis (kmono.build/create-basis packages pkg-b)]
46+
(is (match? {'org.clojure/clojure {:deps/manifest :mvn
47+
:mvn/version "1.12.0"}}
48+
(:libs basis)))))))
49+
50+
(testing "leaves workspace libs with no version unchanged"
51+
(let [packages (load-packages)
52+
pkg-b (get packages 'com.kepler16/b)]
53+
(b/with-project-root (:absolute-path pkg-b)
54+
(let [basis (kmono.build/create-basis packages pkg-b)]
55+
(is (match? {'com.kepler16/a {:deps/manifest :deps}}
56+
(:libs basis)))
57+
(is (nil? (get-in basis [:libs 'com.kepler16/a :mvn/version]))))))))

0 commit comments

Comments
 (0)