(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"))))) |