Skip to content

Instantly share code, notes, and snippets.

View camsaul's full-sized avatar
💭
I am Cam

Cam Saul camsaul

💭
I am Cam
View GitHub Profile
@camsaul
camsaul / dox.md
Created February 8, 2023 18:43
Hydrate dox example

toucan2.tools.hydrate/simple-hydrate [model₁ k₂ instance] Implementations should return a version of map instance with the key k added.

simple-hydrate is defined in toucan2.tools.hydrate (toucan2/tools/hydrate.clj:483).

It caches methods using a methodical.impl.cache.watching.WatchingCache.

It uses the method combination methodical.impl.combo.threaded.ThreadingMethodCombination with the threading strategy :thread-last.

@camsaul
camsaul / gist:14b50563027c377c4aa510c3442845da
Created February 10, 2023 00:09
Clojure action .github/actions/clojure/action.yml
name: Set up Java & Clojure
inputs:
cache-key:
required: true
runs:
using: composite
steps:
- uses: actions/setup-java@v3
@camsaul
camsaul / capture.clj
Last active March 2, 2023 01:58
Amazing Clj/Cljs thread-safe log message capturing
(ns metabase.util.log.capture
(:require [clojure.string :as str]))
(def ^:dynamic *capture-logs-fn*
(constantly nil))
(defn level->int [level]
(case level
:explode 0
:fatal 1
@camsaul
camsaul / mbql_clause.cljc
Last active March 8, 2023 20:51
Malli MBQL Clause Schemas improvements PoC
(ns metabase.lib.schema.mbql-clause
(:require
[metabase.lib.schema.common :as common]
[metabase.util.malli.registry :as mr]))
(defonce ^:private ^{:doc "map of clause keyword -> schema"} clause-schema-registry
(atom {}))
(defn- keyword-schema
"Build the schema for `::keyword`, for a valid MBQL clause type keyword."
@camsaul
camsaul / decode_mbql.cljc
Created March 11, 2023 04:53
MBQL clause decoding with Malli
(mbql-clause/define-tuple-mbql-clause :foo :- :type/Boolean
#_number int?)
(malli.core/validate
:mbql.clause/foo
[:foo {:lib/uuid (str (random-uuid))} 1])
;; => true
(malli.core/validate :mbql.clause/foo [:foo 1])
;; => false
@camsaul
camsaul / stack_trace.txt
Created July 13, 2023 21:04
Stack Trace
java.lang.StackOverflowError:
...
clojure.core/partial/fn core.clj: 2641
...
clojure.core/comp/fn core.clj: 2586
@camsaul
camsaul / jvm.clj
Created August 31, 2023 23:24
JVM Metadata Provider using Toucan 2
(ns metabase.lib.metadata.jvm
"Implementation(s) of [[metabase.lib.metadata.protocols/MetadataProvider]] only for the JVM."
(:require
[clojure.set :as set]
[metabase.lib.dispatch :as lib.dispatch]
[metabase.lib.metadata :as lib.metadata]
[metabase.lib.metadata.cached-provider :as lib.metadata.cached-provider]
[metabase.lib.metadata.jvm.magic-map :as lib.metadata.jvm.magic-map]
[metabase.lib.metadata.protocols :as lib.metadata.protocols]
[metabase.lib.schema.id :as lib.schema.id]
@camsaul
camsaul / snake_hating_map.clj
Created September 1, 2023 01:28
Snake Key Hating Map
(ns metabase.util.snake-hating-map
"This is a map type that catches attempts to get `:snake_case` values from it. In prod, it logs a warning and gets the
value for the equivalent `kebab-case` key; in tests and dev it throws an Exception.
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."
(:require
[clojure.string :as str]
[metabase.config :as config]
[metabase.driver :as driver]
@camsaul
camsaul / kebab_hating_map.clj
Created September 1, 2023 01:29
Kebab Case Key Hating Map
(ns metabase.util.kebab-hating-map
"This is a map type that catches attempts to get `:kebab-case` values from it. In prod, it logs a warning and gets the
value for the equivalent `snake_case` key; in tests and dev it throws an Exception.
This is here so we can catch driver code is still supposed to be using Toucan instances rather than MLv2 Metadata.
This is intended to be only temporary; after everything in the QP is converted to MLv2 we can remove this."
(:require
[clojure.string :as str]
[metabase.config :as config]
[metabase.driver :as driver]
@camsaul
camsaul / dataset_hating_map.clj
Created February 21, 2024 18:08
Dataset Hating Map
;;; it's a map that hates if you try to get the key `:dataset` from it. NOCOMMIT
(declare ->DatasetHatingMap)
(defn- check-for-dataset-key [k]
(when (= k :dataset)
(throw (ex-info ":dataset is deprecated, use :type instead!" {}))))
(p/def-map-type DatasetHatingMap [m]
(get [_this k default-value]
(check-for-dataset-key k)