Skip to content

Commit 15510e9

Browse files
authored
Merge pull request #167 from bilus/bilus/more-tests
feature: options for dependencies
2 parents 9aeafed + cd16b84 commit 15510e9

File tree

20 files changed

+432
-170
lines changed

20 files changed

+432
-170
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,6 @@ pom.xml.asc
1919
.lsp
2020
.clj-kondo/.cache/
2121
.aider*
22+
/libs/kit-generator/test/resources/generated/
23+
/libs/kit-generator/test/resources/modules/install-log.edn
24+
/.clj-kondo/

libs/kit-generator/deps.edn

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,26 @@
1-
{:paths ["src"]
2-
:deps {org.clojure/clojure {:mvn/version "1.11.1"}
3-
hato/hato {:mvn/version "1.0.0"}
4-
selmer/selmer {:mvn/version "1.12.59"}
5-
clj-jgit/clj-jgit {:mvn/version "1.0.2"}
6-
org.clojure/tools.logging {:mvn/version "1.2.4"}
7-
borkdude/rewrite-edn {:mvn/version "0.4.6"}
8-
enlive/enlive {:mvn/version "1.1.6"}
9-
rewrite-clj/rewrite-clj {:mvn/version "1.1.46"}
10-
mvxcvi/cljstyle {:mvn/version "0.15.0"}
11-
cljfmt/cljfmt {:mvn/version "0.9.2"}
12-
clj-fuzzy/clj-fuzzy {:mvn/version "0.4.1"}
13-
clojure-deep-merge/clojure-deep-merge {:mvn/version "0.1.2"}}}
1+
{:paths ["src"]
2+
:deps {org.clojure/clojure {:mvn/version "1.11.1"}
3+
hato/hato {:mvn/version "1.0.0"}
4+
selmer/selmer {:mvn/version "1.12.59"}
5+
clj-jgit/clj-jgit {:mvn/version "1.0.2"}
6+
org.clojure/tools.logging {:mvn/version "1.2.4"}
7+
borkdude/rewrite-edn {:mvn/version "0.4.6"}
8+
enlive/enlive {:mvn/version "1.1.6"}
9+
rewrite-clj/rewrite-clj {:mvn/version "1.1.46"}
10+
mvxcvi/cljstyle {:mvn/version "0.15.0"}
11+
cljfmt/cljfmt {:mvn/version "0.9.2"}
12+
clj-fuzzy/clj-fuzzy {:mvn/version "0.4.1"}
13+
clojure-deep-merge/clojure-deep-merge {:mvn/version "0.1.2"}}
14+
:aliases {:cider
15+
{:extra-deps {nrepl/nrepl {:mvn/version "1.5.1"}
16+
cider/cider-nrepl {:mvn/version "0.58.0"}}
17+
:main-opts ["-m" "nrepl.cmdline" "--middleware" "[cider.nrepl/cider-middleware]" "-i"]}
18+
19+
:test
20+
{:extra-paths ["test"]
21+
:extra-deps {io.github.cognitect-labs/test-runner
22+
{:git/tag "v0.5.1" :git/sha "dfb30dd"}
23+
babashka/fs {:mvn/version "0.5.27"}
24+
babashka/process {:mvn/version "0.6.23"}}
25+
:main-opts ["-m" "cognitect.test-runner"]
26+
:exec-fn cognitect.test-runner.api/test}}}

libs/kit-generator/src/kit/api.clj

Lines changed: 96 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,108 @@
11
(ns kit.api
22
(:require
3-
[clojure.string :as string]
4-
[kit.generator.modules.generator :as generator]
5-
[kit.generator.modules.dependencies :as deps]
3+
[clojure.string :as str]
4+
[kit.generator.io :as io]
65
[kit.generator.modules :as modules]
6+
[kit.generator.modules.dependencies :as deps]
7+
[kit.generator.modules.generator :as generator]
78
[kit.generator.snippets :as snippets]
8-
[kit.generator.io :as io]))
9+
[clojure.test :as t]))
910

1011
;; TODO: Add docstrings
1112

12-
(defn read-ctx
13-
([] (read-ctx nil))
14-
([path]
15-
(-> (or path "kit.edn")
16-
(slurp)
17-
(io/str->edn))))
13+
(defn- read-ctx
14+
[path]
15+
(assert (not (str/blank? path)))
16+
(-> path
17+
(slurp)
18+
(io/str->edn)))
19+
20+
(defn- log-install-dependency [module-key feature-flag deps]
21+
(print "Installing module" module-key)
22+
23+
(when-let [extras (not-empty (cond-> []
24+
(not= :default feature-flag) (conj (str " - feature flag:" feature-flag))
25+
(seq deps) (conj (str " - requires:" (str/join ",")))))]
26+
(print (str "(" (str/join "; " extras) ")"))))
27+
28+
(defn- log-missing-module [module-key]
29+
(println "ERROR: no module found with name:" module-key))
30+
31+
(defn- install-dependency
32+
"Installs a module and its dependencies recursively. Asumes ctx has loaded :modules.
33+
Note that `opts` have a different schema than the one passed to `install-module`,
34+
the latter being preserved for backwards compatibility. Here `opts` is a map of
35+
module-key to module-specific options.
1836
19-
(defn sync-modules []
20-
(modules/sync-modules! (read-ctx))
37+
For example, let's say `:html` is the main module. It would still be on the same level
38+
as `:auth`, its dependency:
39+
40+
```clojure
41+
{:html {:feature-flag :default}
42+
:auth {:feature-flag :oauth}}
43+
```
44+
45+
See flat-module-options for more details."
46+
[{:keys [modules] :as ctx} module-key opts]
47+
(if (modules/module-exists? ctx module-key)
48+
(let [{:keys [module-config]} (generator/read-module-config ctx modules module-key)
49+
{:keys [feature-flag] :or {feature-flag :default} :as module-opts} (get opts module-key {})
50+
deps (deps/resolve-dependencies module-config feature-flag)]
51+
(log-install-dependency module-key feature-flag deps)
52+
(doseq [module-key deps]
53+
(install-dependency ctx module-key opts))
54+
(generator/generate ctx module-key module-opts))
55+
(log-missing-module module-key))
2156
:done)
2257

23-
(defn list-modules []
24-
(let [ctx (modules/load-modules (read-ctx))]
25-
(modules/list-modules ctx))
58+
(defn- flat-module-options
59+
"Converts options map passed to install-module into a flat map
60+
of module-key to module-specific options."
61+
{:test (fn []
62+
(t/are [opts module-key output] (flat-module-options opts module-key)
63+
{} :meta {}
64+
{:feature-flag :extras} :meta {:meta {:feature-flag :extras}}
65+
{:feature-flag :extras
66+
:kit/cljs {:feature-flag :advanced}} :meta {:meta {:feature-flag :extras}
67+
:kit/cljs {:feature-flag :advanced}}))}
68+
[opts module-key]
69+
(let [supported-module-options [:feature-flag]]
70+
(as-> opts $
71+
{module-key (select-keys $ supported-module-options)}
72+
(merge opts $)
73+
(apply dissoc $ supported-module-options))))
74+
75+
(defn sync-modules
76+
"Downloads modules for the current project."
77+
[]
78+
(modules/sync-modules! (read-ctx "kit-edn"))
2679
:done)
2780

28-
(declare install-module)
29-
(defn install-dependency [module-key]
30-
(if (vector? module-key)
31-
(apply install-module module-key)
32-
(install-module module-key)))
81+
(defn list-modules
82+
"List modules available for the current project."
83+
[]
84+
(let [ctx (modules/load-modules (read-ctx "kit.edn"))]
85+
(modules/list-modules ctx))
86+
:done)
3387

3488
(defn install-module
89+
"Installs a kit module into the current project or the project specified by a
90+
path to kit.edn file.
91+
92+
> NOTE: When adding new options, update flat-module-options."
3593
([module-key]
3694
(install-module module-key {:feature-flag :default}))
37-
([module-key {:keys [feature-flag] :as opts}]
38-
(let [{:keys [modules] :as ctx} (modules/load-modules (read-ctx))]
39-
(if (modules/module-exists? ctx module-key)
40-
(let [module-config (generator/read-module-config ctx modules module-key)
41-
deps (deps/resolve-dependencies module-config feature-flag)]
42-
(println module-key "requires following modules:" deps)
43-
(doseq [module-key deps]
44-
(install-dependency module-key))
45-
(generator/generate ctx module-key opts))
46-
(println "no module found with name:" module-key))
47-
:done)))
48-
49-
(defn list-installed-modules []
50-
(doseq [[id status] (-> (read-ctx)
95+
([module-key opts]
96+
(install-module module-key "kit.edn" opts))
97+
([module-key kit-edn-path opts]
98+
(let [ctx (modules/load-modules (read-ctx kit-edn-path))]
99+
(install-dependency ctx module-key (flat-module-options opts module-key)))))
100+
101+
(defn list-installed-modules
102+
"Lists installed modules and modules that failed to install, for the current
103+
project."
104+
[]
105+
(doseq [[id status] (-> (read-ctx "kit.edn")
51106
:modules
52107
:root
53108
(generator/read-modules-log))]
@@ -64,23 +119,25 @@
64119
@db))))
65120

66121
(defn sync-snippets []
67-
(let [ctx (read-ctx)]
122+
(let [ctx (read-ctx "kit.edn")]
68123
(snippets/sync-snippets! ctx)
69124
(snippets-db ctx true)
70125
:done))
71126

72127
(defn find-snippets [query]
73-
(snippets/print-snippets (snippets-db (read-ctx)) query)
128+
(snippets/print-snippets (snippets-db (read-ctx "kit.edn")) query)
74129
:done)
75130

76131
(defn find-snippet-ids [query]
77-
(println (string/join ", " (map :id (snippets/match-snippets (snippets-db (read-ctx)) query))))
132+
(println (str/join ", " (map :id (snippets/match-snippets (snippets-db (read-ctx "kit.edn")) query))))
78133
:done)
79134

80135
(defn list-snippets []
81-
(println (string/join "\n" (keys (snippets-db (read-ctx)))))
136+
(println (str/join "\n" (keys (snippets-db (read-ctx "kit.edn")))))
82137
:done)
83138

84139
(defn snippet [id & args]
85-
(snippets/gen-snippet (snippets-db (read-ctx)) id args))
140+
(snippets/gen-snippet (snippets-db (read-ctx "kit.edn")) id args))
86141

142+
(comment
143+
(t/run-tests 'kit.api))

libs/kit-generator/src/kit/generator/modules.clj

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
(ns kit.generator.modules
22
(:require
3-
[clojure.java.io :as jio]
4-
[kit.generator.git :as git]
5-
[kit.generator.io :as io])
6-
(:import java.io.File))
3+
[clojure.java.io :as jio]
4+
[deep.merge :as deep-merge]
5+
[kit.generator.git :as git])
6+
(:import
7+
java.io.File))
78

89
(defn sync-modules!
910
"Clones or pulls modules from git repositories.
@@ -18,18 +19,18 @@
1819
[{:keys [modules]}]
1920
(doseq [{:keys [name url] :as repository} (-> modules :repositories)]
2021
(git/sync-repository!
21-
(:root modules)
22-
repository)))
22+
(:root modules)
23+
repository)))
2324

2425
(defn set-module-path [module-config base-path]
2526
(update module-config :path #(str base-path File/separator %)))
2627

2728
(defn set-module-paths [root {:keys [module-root modules]}]
2829
(reduce
29-
(fn [modules [id config]]
30-
(assoc modules id (set-module-path config (str root File/separator module-root))))
31-
{}
32-
modules))
30+
(fn [modules [id config]]
31+
(assoc modules id (set-module-path config (str root File/separator module-root))))
32+
{}
33+
modules))
3334

3435
(defn load-modules [{:keys [modules] :as ctx}]
3536
(let [root (:root modules)]

0 commit comments

Comments
 (0)