This is a map type that catches attempts to get This is here so we can catch driver code that needs to be updated in 48+ to use MLv2 metadata rather than Toucan instances. After 51 we can remove this, everything should be updated by then. | (ns metabase.util.snake-hating-map (:require [clojure.string :as str] [metabase.config :as config] [metabase.util :as u] [metabase.util.log :as log] [potemkin :as p] [pretty.core :as pretty])) |
(set! *warn-on-reflection* true) | |
(defn- snake-cased-key? [k] (some-> k (str/includes? "_"))) | |
(defn- warn-about-using-snake-case [k] (let [e (ex-info (format "Accessing metadata using :snake_case key %s. This is deprecated in 0.48.0. Use %s instead." (pr-str k) (pr-str (u/->kebab-case-en k))) {:k k})] (if config/is-prod? (log/warn e) (throw e)))) | |
(defn- normalize-key [k] (if (snake-cased-key? k) (do (warn-about-using-snake-case k) (u/->kebab-case-en k)) k)) | |
(declare ->SnakeHatingMap) | |
(p/def-map-type SnakeHatingMap [m] (get [_this k default-value] (get m (normalize-key k) default-value)) (assoc [this k v] (let [m' (assoc m (normalize-key k) v)] (if (identical? m m') this (->SnakeHatingMap m')))) (dissoc [this k] (let [m' (dissoc m k)] (if (identical? m m') this (->SnakeHatingMap m')))) (keys [_this] (keys m)) (meta [_this] (meta m)) (entryAt [this k] (when (contains? m k) (potemkin.PersistentMapProxy$MapEntry. this k))) (with-meta [this metta] (let [m' (with-meta m metta)] (if (identical? m m') this (->SnakeHatingMap m')))) pretty/PrettyPrintable (pretty [_this] (list `snake-hating-map m))) | |
Create a new map that handles either | (defn snake-hating-map ([] (snake-hating-map {})) ([m] (-> (or m {}) (vary-meta assoc :metabase.driver/metadata-type :metabase.driver/metadata-type.mlv2) ->SnakeHatingMap)) ([k v & more] (snake-hating-map (into {k v} (partition-all 2) more)))) |
Return true if | (defn snake-hating-map? [m] (instance? SnakeHatingMap m)) |