(ns metabase.cmd.driver-methods (:require [clojure.java.classpath :as classpath] [clojure.string :as str] [clojure.tools.namespace.find :as ns.find] [metabase.plugins.classloader :as classloader] [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 (classloader/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])))) | |
Print a list of all multimethods available for a driver to implement, and maybe their docstrings. | (defn print-available-multimethods
[docstring]
(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)))))
(when docstring (println (:doc (meta varr)) "\n"))))) |