-
Notifications
You must be signed in to change notification settings - Fork 4.9k
/
driver_methods.clj
37 lines (34 loc) · 1.37 KB
/
driver_methods.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
(ns metabase.cmd.driver-methods
(:require [clojure.java.classpath :as classpath]
[clojure.string :as str]
[clojure.tools.namespace.find :as ns-find]
[metabase.util :as u]))
(defn- driver-ns-symbs []
(sort
(for [ns-symb (ns-find/find-namespaces (classpath/system-classpath))
:let [starts-with? (partial str/starts-with? (name ns-symb))]
:when (and (or (starts-with? "metabase.driver")
(starts-with? "metabase.test.data"))
(do
(u/ignore-exceptions (require ns-symb))
(find-ns ns-symb)))]
ns-symb)))
(defn- available-multimethods
([]
(for [ns-symb (driver-ns-symbs)
:let [multimethods (available-multimethods ns-symb)]
:when (seq multimethods)]
[(ns-name ns-symb) multimethods]))
([ns-symb]
(sort
(for [[symb varr] (ns-publics ns-symb)
:when (instance? clojure.lang.MultiFn @varr)]
[symb varr]))))
(defn print-available-multimethods
"Print a list of all multimethods a available for a driver to implement."
[]
(doseq [[namespc multimethods] (available-multimethods)]
(println (u/format-color 'blue namespc))
(doseq [[symb varr] multimethods]
(println (str/join " " (cons (u/format-color 'green symb) (:arglists (meta varr))))))
(print "\n")))