Skip to content

Commit 84914ab

Browse files
authored
feat: add CI reflection warning check
Add automated reflection warning detection to GitHub Actions CI pipeline that fails builds early when reflection warnings are detected. Implementation: - Create check-reflection.clj script that systematically loads all component namespaces - Integrate check into CI workflow positioned after style check but before tests - Add reflection-warnings.log to .gitignore Benefits: - Prevents performance-impacting reflection from being merged - Fast feedback loop with comprehensive coverage across polylith architecture - Zero reflection warnings currently in codebase
1 parent c60d2a1 commit 84914ab

File tree

3 files changed

+46
-0
lines changed

3 files changed

+46
-0
lines changed

.github/workflows/test.yml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,18 @@ jobs:
4444
- name: Check code style
4545
run: cljstyle check
4646

47+
- name: Check for reflection warnings
48+
run: |
49+
clojure -M:dev scripts/check-reflection.clj 2>&1 | tee reflection-warnings.log
50+
51+
if grep -q "Reflection warning" reflection-warnings.log; then
52+
echo "❌ Reflection warnings found!"
53+
grep "Reflection warning" reflection-warnings.log
54+
exit 1
55+
else
56+
echo "✅ No reflection warnings found"
57+
fi
58+
4759
- name: Run unit tests
4860
run: clojure -M:kaocha:dev:test
4961

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/reflection-warnings.log

scripts/check-reflection.clj

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
(set! *warn-on-reflection* true)
2+
(require 'clojure.java.io)
3+
(require 'clojure.string)
4+
5+
(defn file->namespace
6+
[^java.io.File file]
7+
(-> (.getPath file)
8+
(clojure.string/replace #"^(components|bases)/[^/]+/src/" "")
9+
(clojure.string/replace #"\.clj[cs]?$" "")
10+
(clojure.string/replace #"/" ".")
11+
(clojure.string/replace #"_" "-")
12+
symbol))
13+
14+
(defn find-source-files
15+
[]
16+
(->> [(clojure.java.io/file "components")
17+
(clojure.java.io/file "bases")]
18+
(filter (fn [^java.io.File f] (.exists f)))
19+
(mapcat file-seq)
20+
(filter (fn [^java.io.File f]
21+
(and (.isFile f)
22+
(re-find #"\.clj[cs]?$" (.getName f))
23+
(re-find #"/src/" (.getPath f)))))
24+
(map file->namespace)
25+
distinct))
26+
27+
(let [namespaces (find-source-files)]
28+
(println "Loading" (count namespaces) "namespaces...")
29+
(doseq [ns-sym namespaces]
30+
(try
31+
(require ns-sym)
32+
(catch Exception e
33+
(println "Warning: Could not load" ns-sym ":" (.getMessage e))))))

0 commit comments

Comments
 (0)