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 / defendpoint_2.clj
Created January 9, 2025 19:22
Metabase Defendpoint 1 -> Defendpoint 2
(ns metabase.api.defendpoint-2
(:require
[metabase.util :as u]))
(defn- parse-defendpoint-1-args
[form]
(let [[_defendpoint method route & args] form
[docstring & args] (if (string? (first args))
args
(cons nil args))
@camsaul
camsaul / algorithm.clj
Created December 4, 2024 00:13
Thermometers Solver [WIP]
(ns thermometers.algorithm
(:require
[clojure.string :as str]))
(def tags
'{○ #{:start :empty}
● #{:start :full}
⇑ #{:up :empty}
⬆ #{:up :full}
⇓ #{:down :empty}
@camsaul
camsaul / java-jar.txt
Last active October 17, 2024 18:36
ack java -jar in Metabase
$ ack 'java -jar'
src/metabase/db/setup.clj
137: (trs "You must run `java -jar metabase.jar migrate down` from version {0}." latest-applied)
src/metabase/db/liquibase.clj
236: (trs "You can force-release these locks by running `java -jar metabase.jar migrate release-locks`."))))))
src/metabase/core.clj
222: (run-cmd cmd init! args) ; run a command like `java -jar metabase.jar migrate release-locks` or `clojure -M:run migrate release-locks`
@camsaul
camsaul / dox.md
Created May 10, 2024 17:02
Metabase modules dox

metabase.logger

configuration

(configuration)
@camsaul
camsaul / deps_graph.clj
Last active May 8, 2024 02:35
Load Clojure namespace dependency graph into a Postgres database
(ns metabase.deps-graph
(:require
[clojure.tools.namespace.dependency :as ns.deps]
[clojure.tools.namespace.find :as ns.find]
[clojure.tools.namespace.parse :as ns.parse]
[clojure.java.io :as io]))
(set! *warn-on-reflection* true)
(defn- find-ns-decls []
@camsaul
camsaul / avg.cljc
Last active April 12, 2024 19:41
One namespace with everything related to a clause??
(ns metabase.lib.clause.avg
(:require
;; I think we should probably actually introduce some sort of interface namespace with all the relevant `defmulti`
;; methods a clause would need to implement so we don't need to `:require` so many different namespaces. Then it's
;; also clear at a glance what sorts of things you can/need to implement for a clause.
[metabase.legacy-mbql.normalize :as mbql.normalize]
[metabase.lib.common :as lib.common]
[metabase.lib.convert :as lib.convert]
[metabase.lib.hierarchy :as lib.hierarchy]
[metabase.lib.metadata.calculation :as lib.metadata.calculation]
@camsaul
camsaul / stack_trace.txt
Created April 9, 2024 18:22
Redshift flaky test stacktrace 2
[pool-2-thread-6] ERROR metabase.test.data.impl.get-or-create - Failed to sync test database "airports": Error executing query: ERROR: schema "2024_04_08_2dc86260_fec9_4d76_a0e6_3a3ca771b924_schema" does not exist
clojure.lang.ExceptionInfo: Failed to sync test database "airports": Error executing query: ERROR: schema "2024_04_08_2dc86260_fec9_4d76_a0e6_3a3ca771b924_schema" does not exist
at metabase.test.data.impl.get_or_create$sync_newly_created_database_BANG_.invokeStatic(get_or_create.clj:130) [?:?]
at metabase.test.data.impl.get_or_create$sync_newly_created_database_BANG_.invoke(get_or_create.clj:110) [?:?]
at metabase.test.data.impl.get_or_create$create_database_BANG_.invokeStatic(get_or_create.clj:153) [?:?]
at metabase.test.data.impl.get_or_create$create_database_BANG_.invoke(get_or_create.clj:139) [?:?]
at metabase.test.data.impl.get_or_create$create_database_with_bound_settings_BANG_$thunk__142153.invoke(get_or_create.clj:165) [?:?]
at metabase.test.data.impl.get_or_create$create_database_with
@camsaul
camsaul / stack_trace.txt
Created April 9, 2024 18:15
Flaky Redshift tests stacktrace
[main] ERROR metabase.test.data.impl.get-or-create - Failed to sync test database "test-data": ERROR: relation "odygyrpmbchatyymvtwv.table_with_access" does not exist
clojure.lang.ExceptionInfo: Failed to sync test database "test-data": ERROR: relation "odygyrpmbchatyymvtwv.table_with_access" does not exist
at metabase.test.data.impl.get_or_create$sync_newly_created_database_BANG_.invokeStatic(get_or_create.clj:130) [?:?]
at metabase.test.data.impl.get_or_create$sync_newly_created_database_BANG_.invoke(get_or_create.clj:110) [?:?]
at metabase.test.data.impl.get_or_create$create_database_BANG_.invokeStatic(get_or_create.clj:153) [?:?]
at metabase.test.data.impl.get_or_create$create_database_BANG_.invoke(get_or_create.clj:139) [?:?]
at metabase.test.data.impl.get_or_create$create_database_with_bound_settings_BANG_$thunk__142153.invoke(get_or_create.clj:165) [?:?]
at metabase.test.data.impl.get_or_create$create_database_with_bound_settings_BANG_.invokeStatic(get_or_create.clj:174) [?:?]
at metabase.test.d
@camsaul
camsaul / demo.clj
Created April 4, 2024 16:59
Metadata providers demo
(ns demo
(:require
[metabase.driver :as driver]
[metabase.driver.sql.query-processor :as sql.qp]
[metabase.lib.core :as lib]
[metabase.lib.metadata :as lib.metadata]
[metabase.lib.metadata.jvm :as lib.metadata.jvm]
[metabase.lib.test-metadata :as meta]
[metabase.lib.test-util :as lib.tu]
[metabase.query-processor.compile :as qp.compile]
@camsaul
camsaul / biggest-files.sh
Created March 15, 2024 18:19
Biggest files
#! /usr/bin/env bash
set -euo pipefail
for file in `find . -type f -name '*.clj' -or -name '*.cljc' -or -name '*.cljs'`; do \
wc -l "$file" |
perl -ne 'my @parts = /(^\d+)\s(.*$)/; printf("%05d %s\n", $parts[0], $parts[1]);'
done |
sort -r |
head -n 20