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 / 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 / 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 / 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 / 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 / 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 / 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 / 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 / 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 / test-data.sql
Last active January 20, 2023 21:52
Postgres test data (SQL
DROP TABLE IF EXISTS checkins;
DROP TABLE IF EXISTS venues;
DROP TABLE IF EXISTS categories;
DROP TABLE IF EXISTS users;
CREATE TABLE users (
id serial PRIMARY KEY NOT NULL,
@camsaul
camsaul / db.clj
Created December 7, 2022 17:40
Dynamic app DB
(ns waterfront.db
(:require
[waterfront.config :as config]
[waterfront.db.migrations :as db.migrations]
[toucan.db :as t.db])
(:import
(com.mchange.v2.c3p0 DataSources)))
(set! *warn-on-reflection* true)