Skip to content

Commit c54b019

Browse files
committed
Add metabase-api-compare.sh script to compare API differences between Metabase versions
1 parent 6606fcc commit c54b019

File tree

1 file changed

+93
-0
lines changed

1 file changed

+93
-0
lines changed

metabase-api-compare.sh

+93
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
#!/usr/bin/env bash
2+
#_" -*- mode: clojure; -*-"
3+
#_(
4+
"exec" "clojure" "-Sdeps" "{:deps {clj-kondo/clj-kondo {:mvn/version \"2020.12.12\"} org.clojure/tools.deps.alpha {:mvn/version \"0.9.857\"} org.slf4j/slf4j-nop {:mvn/version \"1.7.30\"} lambdaisland/deep-diff2 {:mvn/version \"2.0.108\"} juji/editscript {:mvn/version \"0.5.4\"}}}" "-M" "$0" "$@"
5+
)
6+
7+
;; Adapted from borkdude's api_diff.clj script: https://gist.github.com/borkdude/2b963db1582654ec28bfd40b4dc35748
8+
;; Example usage:
9+
;; download jars to temp files (from https://downloads.metabase.com), then compare
10+
;; metabase-api-compare.sh "v0.40.5" "v0.41.0-RC1" > /tmp/diff.txt
11+
;;
12+
;; directly reference uberjars already on local disk
13+
;; metabase-api-compare.sh file:/Users/jeff/dev/metabase/uberjar-testing/0.40.5/metabase.jar file:/tmp/metabase-release/metabase/target/uberjar/metabase.jar >/tmp/diff.txt
14+
15+
(require '[clj-kondo.core :as clj-kondo])
16+
(require '[clojure.edn :as edn])
17+
18+
(def v1 (first *command-line-args*))
19+
(def v2 (second *command-line-args*))
20+
21+
(require '[clojure.java.io :as io])
22+
(require '[clojure.tools.deps.alpha :as tda])
23+
24+
(import java.io.File)
25+
26+
(defn download! [uri file]
27+
(with-open [in (io/input-stream uri)
28+
out (io/output-stream file)]
29+
(io/copy in out)))
30+
31+
(defn metabase-version->download-url [v]
32+
(format "https://downloads.metabase.com/%s/metabase.jar" v))
33+
34+
(defn path [v]
35+
(if (re-matches #"file:/.*" v)
36+
v
37+
(let [temp-file (File/createTempFile (str "metabase-" v) ".jar")]
38+
(.deleteOnExit temp-file)
39+
(-> (metabase-version->download-url v)
40+
(download! temp-file))
41+
(.getAbsolutePath temp-file))))
42+
43+
(def path1 (path v1))
44+
(def path2 (path v2))
45+
46+
(defn index-by
47+
[f coll]
48+
(persistent! (reduce #(assoc! %1 (f %2) %2) (transient {}) coll)))
49+
50+
(defn group [vars]
51+
(->> vars
52+
(map #(select-keys % [:ns :name :fixed-arities :varargs-min-arity]))
53+
(index-by (juxt :ns :name))))
54+
55+
(defn vars [lib]
56+
(-> (clj-kondo/run! {:lint [lib] :config {:output {:analysis true :format :edn}}})
57+
:analysis :var-definitions #_ clean))
58+
59+
(def vars-1 (vars path1))
60+
(def vars-2 (vars path2))
61+
62+
#_(require '[lambdaisland.deep-diff2 :as ddiff])
63+
#_(ddiff/pretty-print (ddiff/diff vars-1 vars-2))
64+
65+
;; (require '[editscript.core :as c])
66+
;; (require '[editscript.edit :as e])
67+
;; (def d (c/diff vars-1 vars-2))
68+
69+
;; (require '[clojure.pprint :refer [pprint]])
70+
;; (pprint (e/get-edits d))
71+
72+
(defn var-symbol [[k v]]
73+
(str k "/" v))
74+
75+
(def compare-group-1 (group vars-1))
76+
(def compare-group-2 (group vars-2))
77+
78+
(def lookup-1 (index-by (juxt :ns :name) vars-1))
79+
80+
(doseq [[k var-1] compare-group-1]
81+
(if-let [var-2 (get compare-group-2 k)]
82+
(let [fixed-arities-v1 (:fixed-arities var-1)
83+
fixed-arities-v2 (:fixed-arities var-2)
84+
varargs-min-arity (:varargs-min-arity var-2)]
85+
(doseq [arity fixed-arities-v1]
86+
(when-not (or (contains? fixed-arities-v2 arity)
87+
(and varargs-min-arity (>= arity varargs-min-arity)))
88+
(let [{:keys [:filename :row :col :private]} (get lookup-1 k)]
89+
(println (str filename ":" row ":" col ":") (str (if private "warning" "error") ":")
90+
"Arity" arity "of" (var-symbol k) "was removed.")))))
91+
(let [{:keys [:filename :row :col :private]} (get lookup-1 k)]
92+
(println (str filename ":" row ":" col ":") (str (if private "warning" "error") ":")
93+
(var-symbol k) "was removed."))))

0 commit comments

Comments
 (0)