Skip to content
Snippets Groups Projects
  • Cam Saul's avatar
    d22a382d
    MLv2: remove the `source-table: card__<id>` hack once and for all (#31749) · d22a382d
    Cam Saul authored
    * Implement `suggested-join-condition`
    
    * Update docstring
    
    * OOOF fix typo in `filter-clause`
    
    * Fix premature i18n lookup
    
    * Address PR feedback
    
    * MLv2 JS join function wrappers
    
    * PR feedback from #31590
    
    * `join-conditions` returns raw MBQL clauses!
    
    * WIP
    
    * Simplify `with-join-alias` and `with-join-fields`
    
    * Simplify join and add with-join-conditions
    
    * Un-revert dev
    
    * Wow! Remove unresolved nonsense.
    
    * Remove dev
    
    * Remove dev
    
    * Test fixes :wrench:
    
    * PR feedback
    
    * WIP
    
    * defop doesn't need query or stage-number anymore
    
    * Fix Cljs tests for base PR
    
    * Test fixes :wrench:
    
    * Test fix :wrench:
    
    * Update JS wrappers
    
    * MLv2: remove the source-table: card__<id> hack once and for all
    MLv2: remove the `source-table: card__<id>` hack once and for all (#31749)
    Cam Saul authored
    * Implement `suggested-join-condition`
    
    * Update docstring
    
    * OOOF fix typo in `filter-clause`
    
    * Fix premature i18n lookup
    
    * Address PR feedback
    
    * MLv2 JS join function wrappers
    
    * PR feedback from #31590
    
    * `join-conditions` returns raw MBQL clauses!
    
    * WIP
    
    * Simplify `with-join-alias` and `with-join-fields`
    
    * Simplify join and add with-join-conditions
    
    * Un-revert dev
    
    * Wow! Remove unresolved nonsense.
    
    * Remove dev
    
    * Remove dev
    
    * Test fixes :wrench:
    
    * PR feedback
    
    * WIP
    
    * defop doesn't need query or stage-number anymore
    
    * Fix Cljs tests for base PR
    
    * Test fixes :wrench:
    
    * Test fix :wrench:
    
    * Update JS wrappers
    
    * MLv2: remove the source-table: card__<id> hack once and for all
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
config.edn 68.23 KiB
{:config-paths ["macros"]
 :linters
 {:unresolved-symbol
  {:exclude
   [instaparse.core/transform
    (cljs.test/is [=?])
    (clojure.core.logic/fresh)
    (clojure.core.logic/matcha)
    (clojure.core.logic/run)
    (clojure.test/is [query= sql= =?])
    (clojure.tools.macro/macrolet)
    (metabase.async.streaming-response/streaming-response)
    (metabase.driver.druid.query-processor-test/druid-query-returning-rows)
    (metabase.mbql.util.match/match)
    (metabase.mbql.util.match/match-one)
    (metabase.mbql.util.match/replace)
    (metabase.mbql.util.match/replace-in)
    (metabase.mbql.util/match)
    (metabase.mbql.util/match-one)
    (metabase.mbql.util/replace)
    (metabase.mbql.util/replace-in)
    (metabase.query-processor.middleware.cache-backend.interface/with-cached-results)
    (metabase.util.regex/rx [opt])
    (metabase.util/prog1 [<>])
    (taoensso.nippy/extend-freeze)
    (taoensso.nippy/extend-thaw)]}

  :refer-all                                {:level   :warning
                                             :exclude [clojure.test]}
  ;; TODO (cam): I think we just need to tell it how to handle MBQL match and we can enable this?
  :unexpected-recur                         {:level :off}
  ;; TODO (cam): can we fix these?
  :unused-referred-var                      {:exclude {compojure.core [GET DELETE POST PUT]}}
  :missing-else-branch                      {:level :warning}
  :misplaced-docstring                      {:level :warning}
  :non-arg-vec-return-type-hint             {:level :warning}
  :missing-body-in-when                     {:level :warning}
  :missing-docstring                        {:level :warning}
  ;; TODO (braden): This is useful, but it doesn't grok eg. enterprise/backend/src
  :namespace-name-mismatch                  {:level :off}
  :use                                      {:level :warning}
  :redundant-fn-wrapper                     {:level :warning}
  :invalid-arity                            {:skip-args [metabase.mbql.util.match/match]}
  :warn-on-reflection                       {:level :warning}
  ;; TODO (cam): here are some more linters we should experiment with enabling -- some might be useful.
  ;; :docstring-no-summary                  {:level :warning}
  ;; :docstring-leading-trailing-whitespace {:level :warning}
  ;; :reduce-without-init                   {:level :warning}
  ;; :used-underscored-binding              {:level :warning}
  ;; :single-key-in                         {:level :warning}
  ;; :keyword-binding                       {:level :warning}
  ;; :main-without-gen-class                {:level :warning}
  ;; :shadowed-var                          {:level :warning}

  :deprecated-var
  {:exclude
   {metabase.cmd/dump                                                            {:namespaces ["metabase\\.cmd-test" "metabase-enterprise\\.serialization\\.cmd-test"]}
    metabase.cmd/load                                                            {:namespaces ["metabase\\.cmd-test" "metabase-enterprise\\.serialization\\.cmd-test"]}
    metabase.db.data-migrations/data-migrations                                  {:namespaces ["metabase\\.db\\.data-migrations"]}
    metabase.db.data-migrations/defmigration                                     {:namespaces ["metabase\\.db\\.data-migrations"]}
    metabase.db.data-migrations/run-migration-if-needed!                         {:namespaces ["metabase\\.db\\.data-migrations"]}
    metabase.driver.common/ThreadSafeSimpleDateFormat                            {:namespaces ["metabase\\.driver.*"]}
    metabase.driver.common/create-db-time-formatters                             {:namespaces ["metabase\\.driver.*"]}
    metabase.driver.common/current-db-time                                       {:namespaces ["metabase.*"]}
    metabase.driver.common/current-db-time-date-formatters                       {:namespaces ["metabase\\.driver.*"]}
    metabase.driver.common/current-db-time-native-query                          {:namespaces ["metabase\\.driver.*"]}
    metabase.driver.common/first-successful-parse                                {:namespaces ["metabase\\.driver.*"]}
    metabase.driver.sql-jdbc.execute.old-impl/set-timezone-sql                   {:namespaces ["metabase\\.driver.*"]}
    metabase.driver.sql-jdbc.execute/set-time-zone-if-supported!                 {:namespaces ["metabase\\.driver.*"]}
    metabase.driver/current-db-time                                              {:namespaces ["metabase.*"]}
    metabase.driver/supports?                                                    {:namespaces ["metabase.*"]}
    metabase.public-settings.premium-features/enable-enhancements?               {:namespaces ["metabase\\.models.*"]}
    metabase.query-processor.middleware.resolve-joins/maybe-resolve-source-table {:namespaces ["metabase.*"]}
    metabase.query-processor.util/normalize-token                                {:namespaces ["metabase.*"]}
    metabase.util.honeysql-extensions/*                                          {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/*honey-sql-version*                        {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/+                                          {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/-                                          {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/->boolean                                  {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/->date                                     {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/->datetime                                 {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/->integer                                  {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/->time                                     {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/->timestamp                                {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/->timestamp-with-time-zone                 {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions//                                          {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/IdentifierType                             {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/abs                                        {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/at-time-zone                               {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/call                                       {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/cast                                       {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/cast-unless-type-in                        {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/ceil                                       {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/concat                                     {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/database-type                              {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/day                                        {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/dec                                        {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/floor                                      {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/format                                     {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/hour                                       {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/identifier                                 {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/identifier?                                {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/inc                                        {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/is-of-type?                                {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/literal                                    {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/maybe-cast                                 {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/minute                                     {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/mod                                        {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/month                                      {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/quarter                                    {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/quoted-cast                                {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/raw                                        {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/round                                      {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/second                                     {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/type-info                                  {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/type-info->db-type                         {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/unwrap-typed-honeysql-form                 {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/week                                       {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/with-database-type-info                    {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/with-type-info                             {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    metabase.util.honeysql-extensions/year                                       {:namespaces ["^metabase\\.driver\\..*$" "^metabase\\.test\\.data\\..*" "^metabase\\.query-processor-test\\..*$"]}
    schema.core/both                                                             {:namespaces ["metabase.*"]}
    schema.core/either                                                           {:namespaces ["metabase.*"]}}}

  :discouraged-var
  {clojure.core/print                   {:message "Use clojure.tools.logging instead of clojure.core/print"}
   clojure.core/println                 {:message "Use clojure.tools.logging instead of clojure.core/println"}
   clojure.core/printf                  {:message "Use clojure.tools.logging instead of clojure.core/printf"}
   clojure.core/prn                     {:message "Use clojure.tools.logging instead of clojure.core/prn"}
   clojure.core/pr                      {:message "Use clojure.tools.logging instead of clojure.core/pr"}
   clojure.java.jdbc/get-connection     {:message "Use sql-jdbc.execute/do-with-connection-with-options (for drivers) or t2/with-connection (for the app DB) instead of jdbc/get-connection"}
   clojure.java.jdbc/with-db-connection {:message "Use sql-jdbc.execute/do-with-connection-with-options (for drivers) or t2/with-connection (for the app DB) instead of jdbc/with-db-connection"}
   clojure.java.jdbc/with-db-metadata   {:message "Use sql-jdbc.execute/do-with-connection-with-options + .getMetaData instead of jdbc/with-db-metadata"}
   clojure.pprint/pprint                {:message "Use clojure.tools.logging instead of clojure.pprint/pprint"}
   clojure.string/lower-case            {:message "Use metabase.util/lower-case-en instead of clojure.string/lower-case"}
   clojure.string/upper-case            {:message "Use metabase.util/upper-case-en instead of clojure.string/upper-case"}
   honeysql.core/call                   {:message "Use hx/call instead because it is Honey SQL 2 friendly"}
   honeysql.core/raw                    {:message "Use hx/raw instead because it is Honey SQL 2 friendly"}
   java-time/with-clock                 {:message "Use mt/with-clock"}
   metabase.test/with-temp              {:message "Use t2.with-temp/with-temp instead of metabase.test/with-temp"}
   ;; metabase.test/with-temp*             {:message "Use t2.with-temp/with-temp instead of metabase.test/with-temp*"}
   toucan.db/select                     {:message "Use t2/select instead of toucan.db/select"}
   toucan.db/select-one                 {:message "Use t2/select-one instead of toucan.db/select-one"}
   toucan.db/select-one-id              {:message "Use t2/select-one-pk instead of toucan.db/select-one-id"}
   toucan.db/select-one-field           {:message "Use t2/select-one-fn instead of toucan.db/select-one-field"}
   toucan.db/select-ids                 {:message "Use t2/select-pks-set instead of toucan.db/select-ids"}
   toucan.db/select-field               {:message "Use t2/select-fn instead of toucan.db/select-field"}
   toucan.db/select-field->field        {:message "Use t2/select-fn->fn instead of toucan.db/select-field->field"}
   toucan.db/select-field->id           {:message "Use t2/select-fn->pk instead of toucan.db/select-field->id"}
   toucan.db/select-id->field           {:message "Use t2/select-pk->field instead of toucan.db/select-id->field"}
   toucan.db/simple-insert!             {:message "Use t2/insert-returning-pks! with table name instead of toucan.db/simple-insert!"}
   toucan.db/simple-insert-many!        {:message "Use t2/insert-returning-pks! with table name instead of toucan.db/simple-insert-many!"}
   toucan.db/simple-delete!             {:message "Use t2/delete! with table name instead of toucan.db/simple-delete!"}
   toucan.db/delete!                    {:message "Use t2/delete! instead of toucan.db/delete!"}
   toucan.db/insert!                    {:message "Use t2/insert-returning-instances! instead of toucan.db/insert!"}
   toucan.db/update!                    {:message "Use t2/update! instead of toucan.db/update!"}
   toucan.db/update-where!              {:message "Use t2/update! instead of toucan.db/update-where!"}
   toucan.db/query                      {:message "Use mdb.query/query instead of toucan.db/query"}
   toucan.db/count                      {:message "Use t2/count instead of toucan.db/count"}
   toucan.db/exists?                    {:message "Use t2/exists? instead of toucan.db/exists?"}
   toucan.db/transaction                {:message "Use t2/with-transaction instead of toucan.db/transaction"}
   toucan.db/with-call-counting         {:message "Use t2/with-call-count instead of toucan.db/with-call-counting"}
   toucan.db/execute!                   {:message "Use t2/query-one instead of toucan.db/execute!"}
   toucan.db/reducible-query            {:message "Use mdb.query/reducible-query instead of toucan.db/reducible-query"}
   toucan.db/resolve-model              {:message "Use metabase.db.util/resolve-model instead of toucan.db/resolve-model"}
   toucan.models/defmodel               {:message "Define a method for t2/table-name instead of toucan.models/defmodel"}
   toucan.models/primary-key            {:message "Use metabase.db.util/primary-key instead of toucan.models/primary-key"}
   toucan.models/model?                 {:message "Use mdb.u/toucan-model? instead of toucan.models/model?"}
   toucan.hydrate/hydrate               {:message "Use t2/hydrate instead of toucan.hydrate/hydrate"}
   toucan.util.test/with-temp-defaults  {:message "Use t2.with-temp/with-temp-defaults instead of toucan.util.test/with-temp-defaults"}
   toucan.util.test/with-temp           {:message "Use t2.with-temp/with-temp instead of toucan.util.test/with-temp"}
   toucan.util.test/with-temp*          {:message "Use t2.with-temp/with-temp instead of toucan.util.test/with-temp*"}}

  :discouraged-namespace
  {camel-snake-kebab.core {:message "CSK is not Turkish-safe, use the versions in metabase.util instead."}
   clojure.tools.logging  {:message "Use metabase.util.log instead of clojure.tools.logging directly"}
   metabase.util.jvm      {:message "All of metabase.util.jvm is re-exported from metabase.util; prefer that"}}

  :unresolved-var
  {:exclude
   [colorize.core]}

  :unsorted-required-namespaces {:level :warning}

  :consistent-alias
  {:aliases
   {buddy.core.hash                                                 buddy-hash
    cheshire.generate                                               json.generate
    clojure.tools.logging                                           log
    clj-http.client                                                 http
    clj-ldap.client                                                 ldap
    clj-time.coerce                                                 time.coerce
    clj-time.format                                                 time.format
    clojure.core.async                                              a
    clojure.core.match                                              clojure.core.match ; Prefer :refer [match]
    clojure.data                                                    data
    clojure.math.combinatorics                                      math.combo
    clojure.pprint                                                  pprint
    clojure.spec.alpha                                              s
    clojure.string                                                  str
    clojure.test                                                    t
    clojure.tools.build.api                                         b
    clojure.tools.namespace.dependency                              ns.deps
    clojure.tools.namespace.find                                    ns.find
    clojure.tools.namespace.parse                                   ns.parse
    colorize.core                                                   colorize
    environ.core                                                    env
    hf.depstar.api                                                  depstar
    hiccup.core                                                     hiccup
    hiccup.util                                                     hiccup.util
    honey.sql                                                       sql
    honey.sql.helpers                                               sql.helpers
    honeysql.core                                                   hsql
    honeysql.format                                                 hformat
    honeysql.helpers                                                hh
    honeysql.types                                                  htypes
    java-time                                                       t
    malli.core                                                      mc
    malli.error                                                     me
    malli.experimental                                              mx
    malli.generator                                                 mg
    malli.provider                                                  mp
    malli.transform                                                 mtx
    malli.util                                                      mut
    medley.core                                                     m
    metabase-enterprise.audit-app.pages.common                      common
    metabase-enterprise.sandbox.api.table                           table
    metabase-enterprise.test                                        met
    metabase.analytics.stats                                        stats
    metabase.api.activity                                           api.activity
    metabase.api.alert                                              api.alert
    metabase.api.automagic-dashboards                               api.magic
    metabase.api.bookmark                                           api.bookmark
    metabase.api.card                                               api.card
    metabase.api.card-test                                          api.card-test
    metabase.api.collection                                         api.collection
    metabase.api.common                                             api
    metabase.api.dashboard                                          api.dashboard
    metabase.api.dashboard-test                                     api.dashboard-test
    metabase.api.database                                           api.database
    metabase.api.dataset                                            api.dataset
    metabase.api.email                                              api.email
    metabase.api.embed                                              api.embed
    metabase.api.field                                              api.field
    metabase.api.geojson                                            api.geojson
    metabase.api.ldap                                               api.ldap
    metabase.api.logic-history                                      api.login-history
    metabase.api.metric                                             api.metric
    metabase.api.native-query-snippet                               api.native-query-snippet
    metabase.api.notify                                             api.notify
    metabase.api.permission-graph                                   api.permission-graph
    metabase.api.permissions                                        api.permissions
    metabase.api.pivots                                             api.pivots
    metabase.api.premium-features                                   api.premium-features
    metabase.api.preview-embed                                      api.preview-embed
    metabase.api.public                                             api.public
    metabase.api.pulse                                              api.pulse
    metabase.api.revision                                           api.revision
    metabase.api.search                                             api.search
    metabase.api.segment                                            api.segment
    metabase.api.session                                            api.session
    metabase.api.setting                                            api.setting
    metabase.api.setup                                              api.setup
    metabase.api.slack                                              api.slack
    metabase.api.table                                              api.table
    metabase.api.task                                               api.task
    metabase.api.tiles                                              api.tiles
    metabase.api.timeline                                           api.timeline
    metabase.api.timeline-event                                     api.timeline-event
    metabase.api.transform                                          api.transform
    metabase.api.user                                               api.user
    metabase.api.util                                               api.util
    metabase.async.streaming-response.thread-pool                   thread-pool
    metabase.automagic-dashboards.core                              magic
    metabase.automagic-dashboards.populate                          populate
    metabase.cmd.copy.h2                                            copy.h2
    metabase.config                                                 config
    metabase.config.file                                            config.file
    metabase.connection-pool                                        connection-pool
    metabase.db.connection                                          mdb.connection
    metabase.db.jdbc-protocols                                      mdb.jdbc-protocols
    metabase.db.metadata-queries                                    metadata-queries
    metabase.db.spec                                                mdb.spec
    metabase.db.query                                               mdb.query
    metabase.domain-entities.specs                                  de.specs
    metabase.driver.common.parameters                               params
    metabase.driver.common.parameters.dates                         params.dates
    metabase.driver.common.parameters.operators                     params.ops
    metabase.driver.common.parameters.parse                         params.parse
    metabase.driver.common.parameters.values                        params.values
    metabase.driver.druid.client                                    druid.client
    metabase.driver.druid.execute                                   druid.execute
    metabase.driver.druid.js                                        druid.js
    metabase.driver.druid.query-processor                           druid.qp
    metabase.driver.druid.sync                                      druid.sync
    metabase.driver.impl                                            driver.impl
    metabase.driver.mongo.execute                                   mongo.execute
    metabase.driver.mongo.parameters                                mongo.params
    metabase.driver.mongo.query-processor                           mongo.qp
    metabase.driver.mongo.util                                      mongo.util
    metabase.driver.sql                                             driver.sql
    metabase.driver.sql-jdbc.common                                 sql-jdbc.common
    metabase.driver.sql-jdbc.connection                             sql-jdbc.conn
    metabase.driver.sql-jdbc.execute                                sql-jdbc.execute
    metabase.driver.sql-jdbc.execute.diagnostic                     sql-jdbc.execute.diagnostic
    metabase.driver.sql-jdbc.execute.legacy-impl                    sql-jdbc.legacy
    metabase.driver.sql-jdbc.execute.old-impl                       sql-jdbc.execute.old
    metabase.driver.sql-jdbc.sync                                   sql-jdbc.sync
    metabase.driver.sql-jdbc.sync.common                            sql-jdbc.sync.common
    metabase.driver.sql-jdbc.sync.describe-database                 sql-jdbc.describe-database
    metabase.driver.sql-jdbc.sync.describe-table                    sql-jdbc.describe-table
    metabase.driver.sql-jdbc.sync.interface                         sql-jdbc.sync.interface
    metabase.driver.sql-jdbc.test-util                              sql-jdbc.tu
    metabase.driver.sql.parameters.substitute                       sql.params.substitute
    metabase.driver.sql.parameters.substitution                     sql.params.substitution
    metabase.email-test                                             et
    metabase.email.messages                                         messages
    metabase.http-client                                            client
    metabase.lib.util                                               lib.util
    metabase.mbql.normalize                                         mbql.normalize
    metabase.mbql.schema                                            mbql.s
    metabase.mbql.util                                              mbql.u
    metabase.models.activity                                        activity
    metabase.models.application-permissions-revision                a-perm-revision
    metabase.models.bookmark                                        bookmark
    metabase.models.collection                                      collection
    metabase.models.collection.graph                                graph
    metabase.models.collection-permission-graph-revision            c-perm-revision
    metabase.models.dashboard-card                                  dashboard-card
    metabase.models.database                                        database
    metabase.models.dependency                                      dependency
    metabase.models.field-values                                    field-values
    metabase.models.interface                                       mi
    metabase.models.moderation-review                               moderation-review
    metabase.models.native-query-snippet                            native-query-snippet
    metabase.models.permissions                                     perms
    metabase.models.permissions-group                               perms-group
    metabase.models.permissions-group-membership                    perms-group-membership
    metabase.models.permissions-revision                            perms-revision
    metabase.models.permissions.parse                               perms-parse
    metabase.models.pulse                                           pulse
    metabase.models.pulse-channel                                   pulse-channel
    metabase.models.pulse-channel-recipient                         pulse-channel-recipient
    metabase.models.query.permissions                               query-perms
    metabase.models.setting.cache                                   setting.cache
    metabase.models.timeline                                        timeline
    metabase.models.timeline-event                                  timeline-event
    metabase.plugins.initialize                                     plugins.init
    metabase.public-settings                                        public-settings
    metabase.public-settings.premium-features                       premium-features
    metabase.pulse                                                  pulse ; NB some conflicts with metabase.models.pulse
    metabase.pulse.markdown                                         markdown
    metabase.pulse.render                                           render
    metabase.pulse.render.body                                      body
    metabase.pulse.render.common                                    common
    metabase.pulse.render.style                                     style
    metabase.query-processor-test                                   qp.test
    metabase.query-processor.context                                qp.context
    metabase.query-processor.error-type                             qp.error-type
    metabase.query-processor.interface                              qp.i
    metabase.query-processor.middleware.add-dimension-projections   qp.add-dimension-projections
    metabase.query-processor.middleware.add-implicit-clauses        qp.add-implicit-clauses
    metabase.query-processor.middleware.add-implicit-joins          qp.add-implicit-joins
    metabase.query-processor.middleware.auto-bucket-datetimes       qp.auto-bucket-datetimes
    metabase.query-processor.middleware.constraints                 qp.constraints
    metabase.query-processor.middleware.cumulative-aggregations     qp.cumulative-aggregations
    metabase.query-processor.middleware.parameters.mbql             qp.mbql
    metabase.query-processor.middleware.parameters.native           qp.native
    metabase.query-processor.middleware.permissions                 qp.perms
    metabase.query-processor.middleware.pre-alias-aggregations      qp.pre-alias-aggregations
    metabase.query-processor.middleware.resolve-database-and-driver qp.resolve-database-and-driver
    metabase.query-processor.middleware.resolve-fields              qp.resolve-fields
    metabase.query-processor.middleware.resolve-referenced          qp.resolve-referenced
    metabase.query-processor.middleware.resolve-source-table        qp.resolve-source-table
    metabase.query-processor.middleware.wrap-value-literals         qp.wrap-value-literals
    metabase.query-processor.pivot                                  qp.pivot
    metabase.query-processor.streaming                              qp.streaming
    metabase.query-processor.streaming.interface                    qp.si
    metabase.query-processor.streaming.xlsx                         qp.xlsx
    metabase.query-processor.timezone                               qp.timezone
    metabase.query-processor.util                                   qp.util
    metabase.related                                                related
    metabase.search.scoring                                         scoring
    metabase.server.middleware.auth                                 mw.auth
    metabase.server.middleware.browser-cookie                       mw.browser-cookie
    metabase.server.middleware.exceptions                           mw.exceptions
    metabase.server.middleware.json                                 mw.json
    metabase.server.middleware.log                                  mw.log
    metabase.server.middleware.misc                                 mw.misc
    metabase.server.middleware.offset-paging                        mw.offset-paging
    metabase.server.middleware.security                             mw.security
    metabase.server.middleware.session                              mw.session
    metabase.server.middleware.ssl                                  mw.ssl
    metabase.server.middleware.util                                 mw.util
    metabase.server.protocols                                       server.protocols
    metabase.shared.util                                            shared.u
    metabase.shared.util.currency                                   currency
    metabase.sync.analyze.classifiers.category                      classifiers.category
    metabase.sync.analyze.classifiers.name                          classifiers.name
    metabase.sync.analyze.classifiers.no-preview-display            classifiers.no-preview-display
    metabase.sync.analyze.classifiers.text-fingerprint              classifiers.text-fingerprint
    metabase.sync.analyze.fingerprint                               fingerprint
    metabase.sync.analyze.fingerprint.fingerprinters                fingerprinters
    metabase.sync.analyze.fingerprint.insights                      insights
    metabase.sync.analyze.query-results                             qr
    metabase.sync.field-values                                      field-values
    metabase.sync.interface                                         i
    metabase.sync.schedules                                         sync.schedules
    metabase.sync.sync-metadata.fields.fetch-metadata               fetch-metadata
    metabase.sync.util                                              sync-util
    metabase.sync.util-test                                         sync.util-test
    metabase.task.sync-databases                                    task.sync-databases
    metabase.test                                                   mt
    metabase.test.data.dataset-definitions                          defs
    metabase.test.data.env.impl                                     tx.env.impl
    metabase.test.data.impl                                         data.impl
    metabase.test.data.users                                        test.users
    metabase.test.domain-entities                                   test.de
    metabase.test.mock.util                                         mock.util
    metabase.test.sync                                              test.sync
    metabase.test.util.js                                           test.js
    metabase.test.util.timezone                                     test.tz
    metabase.timeseries-query-processor-test.util                   tqpt
    metabase.transforms.core                                        tf
    metabase.transforms.materialize                                 tf.materialize
    metabase.transforms.specs                                       tf.specs
    metabase.util.cron                                              u.cron
    metabase.util.date-2                                            u.date
    metabase.util.date-2.common                                     u.date.common
    metabase.util.date-2.parse                                      u.date.parse
    metabase.util.embed                                             embed
    metabase.util.encryption                                        encryption
    metabase.util.encryption-test                                   encryption-test
    metabase.util.files                                             u.files
    metabase.util.honey-sql-1                                       h1x
    metabase.util.honey-sql-2                                       h2x
    metabase.util.honeysql-extensions                               hx
    metabase.util.i18n                                              i18n
    metabase.util.i18n.impl                                         i18n.impl
    metabase.util.jvm                                               u.jvm
    metabase.util.log                                               log
    metabase.util.macros                                            u.macros
    metabase.util.malli                                             mu
    metabase.util.malli.schema                                      ms
    metabase.util.password                                          u.password
    metabase.util.schema                                            su
    metabase.util.ui-logic                                          ui-logic
    metabase.util.urls                                              urls
    metabuild-common.core                                           u
    metabuild-common.output                                         out
    metabuild-common.shell                                          shell
    monger.collection                                               mcoll
    ring.mock.request                                               ring.mock
    ring.util.codec                                                 codec
    ring.util.response                                              response
    ring.adapter.jetty9.servlet                                     servlet
    saml20-clj.core                                                 saml
    toucan.db                                                       db
    toucan.models                                                   models}}}

 :lint-as
 {clojure.core.logic/defne                                                             clj-kondo.lint-as/def-catch-all
  clojure.test.check.clojure-test/defspec                                              clojure.test/deftest
  clojurewerkz.quartzite.jobs/defjob                                                   clojure.core/defn
  honeysql.helpers/defhelper                                                           clj-kondo.lint-as/def-catch-all
  honeysql.util/defalias                                                               clojure.core/def
  metabase-enterprise.serialization.test-util/with-random-dump-dir                     clojure.core/let
  metabase.actions.test-util/with-actions                                              clojure.core/let
  metabase.api.common/let-404                                                          clojure.core/let
  metabase.api.dashboard-test/let-url                                                  clojure.core/let
  metabase.api.search-test/do-test-users                                               clojure.core/let
  metabase.async.api-response-test/with-response                                       clojure.core/let
  metabase.dashboard-subscription-test/with-dashboard-sub-for-card                     clojure.core/let
  metabase.db.custom-migrations/define-migration                                       clj-kondo.lint-as/def-catch-all
  metabase.db.custom-migrations/define-reversible-migration                            clj-kondo.lint-as/def-catch-all
  metabase.db.data-migrations/defmigration                                             clojure.core/def
  metabase.db.liquibase/with-liquibase                                                 clojure.core/let
  metabase.db.schema-migrations-test.impl/with-temp-empty-app-db                       clojure.core/let
  metabase.domain-entities.malli/defn                                                  schema.core/defn
  metabase.driver.mongo.query-processor/mongo-let                                      clojure.core/let
  metabase.driver.mongo.util/with-mongo-connection                                     clojure.core/let
  metabase.driver.sql-jdbc.actions/with-jdbc-transaction                               clojure.core/let
  metabase.driver.sql-jdbc.connection/with-connection-spec-for-testing-connection      clojure.core/let
  metabase.driver.sql-jdbc.execute.diagnostic/capturing-diagnostic-info                clojure.core/fn
  metabase.integrations.ldap/with-ldap-connection                                      clojure.core/fn
  metabase.models.collection-test/with-collection-in-location                          clojure.core/let
  metabase.models.json-migration/def-json-migration                                    clj-kondo.lint-as/def-catch-all
  metabase.models.setting.multi-setting/define-multi-setting                           clojure.core/def
  metabase.models.setting/defsetting                                                   clj-kondo.lint-as/def-catch-all
  metabase.public-settings.premium-features/defenterprise-schema                       clj-kondo.lint-as/def-catch-all
  metabase.public-settings.premium-features/define-premium-feature                     clojure.core/def
  metabase.pulse-test/with-pulse-for-card                                              clojure.core/let
  metabase.query-processor.error-type/deferror                                         clojure.core/def
  metabase.query-processor.middleware.cache.impl/with-reducible-deserialized-results   clojure.core/let
  metabase.query-processor.middleware.process-userland-query-test/with-query-execution clojure.core/let
  metabase.query-processor-test.pipeline-queries-test/pmbql-query                      clojure.core/->
  metabase.query-processor-test.pipeline-queries-test/run-pmbql-query                  clojure.core/->
  metabase.shared.util.namespaces/import-fns                                           potemkin/import-vars
  metabase.sync.util/sum-for                                                           clojure.core/for
  metabase.sync.util/with-emoji-progress-bar                                           clojure.core/let
  metabase.test.data.interface/defdataset                                              clojure.core/def
  metabase.test.data.interface/defdataset-edn                                          clojure.core/def
  metabase.test/defdataset                                                             clojure.core/def
  metabase.test/with-actions                                                           clojure.core/let
  metabase.test/with-open-channels                                                     clojure.core/let
  metabase.test/with-single-admin-user                                                 clojure.core/fn
  metabase.test/with-temp-dir                                                          clojure.core/let
  metabase.test/with-temp-file                                                         clojure.core/let
  metabase.test/with-user-in-groups                                                    clojure.core/let
  metabase.util.files/with-open-path-to-resource                                       clojure.core/let
  metabase.util.malli/defn                                                             schema.core/defn
  metabase.util.ssh/with-ssh-tunnel                                                    clojure.core/let
  monger.operators/defoperator                                                         clojure.core/def
  potemkin.types/defprotocol+                                                          clojure.core/defprotocol
  potemkin.types/defrecord+                                                            clojure.core/defrecord
  potemkin.types/deftype+                                                              clojure.core/deftype
  potemkin/defprotocol+                                                                clojure.core/defprotocol
  potemkin/defrecord+                                                                  clojure.core/defrecord
  potemkin/deftype+                                                                    clojure.core/deftype
  toucan.db/with-call-counting                                                         clojure.core/fn
  toucan2.core/with-call-count                                                         clojure.core/fn}

 :hooks
 {:analyze-call
  {clojure.test/deftest                                                                                                      hooks.clojure.test/deftest
   metabase-enterprise.advanced-permissions.models.permissions.application-permissions-test/with-new-group-and-current-graph hooks.common/with-two-top-level-bindings
   metabase-enterprise.audit-app.pages-test/with-temp-objects                                                                hooks.common/with-one-binding
   metabase-enterprise.serialization.test-util/with-temp-dpc                                                                 hooks.toucan.util.test/with-temp*
   metabase.analytics.prometheus-test/with-prometheus-system                                                                 hooks.common/with-two-bindings
   metabase.api.alert-test/with-alert-in-collection                                                                          hooks.common/with-four-bindings
   metabase.api.card-test/with-persistence-setup                                                                             hooks.common/with-one-top-level-binding
   metabase.api.card-test/with-temp-native-card                                                                              hooks.common/with-two-bindings
   metabase.api.card-test/with-temp-native-card-with-params                                                                  hooks.common/with-two-bindings
   metabase.api.collection-test/with-french-user-and-personal-collection                                                     hooks.common/with-two-top-level-bindings
   metabase.api.common/defendpoint                                                                                           hooks.metabase.api.common/defendpoint
   metabase.api.common/defendpoint-async                                                                                     hooks.metabase.api.common/defendpoint
   metabase.api.common/defendpoint-async-schema                                                                              hooks.metabase.api.common/defendpoint
   metabase.api.common/defendpoint-schema                                                                                    hooks.metabase.api.common/defendpoint
   metabase.api.dashboard-test/with-chain-filter-fixtures                                                                    hooks.common/let-one-with-optional-value
   metabase.api.dashboard-test/with-simple-dashboard-with-tabs                                                               hooks.common/with-one-binding
   metabase.api.card-test/with-card-param-values-fixtures                                                                    hooks.common/let-one-with-optional-value
   metabase.api.embed-test/do-response-formats                                                                               hooks.common/with-two-bindings
   metabase.api.embed-test/with-chain-filter-fixtures                                                                        hooks.common/let-one-with-optional-value
   metabase.api.embed-test/with-temp-card                                                                                    hooks.common/let-one-with-optional-value
   metabase.api.embed-test/with-temp-dashcard                                                                                hooks.common/let-one-with-optional-value
   metabase.api.persist-test/with-setup                                                                                      hooks.common/with-one-top-level-binding
   metabase.api.public-test/with-required-param-card                                                                         hooks.common/with-one-binding
   metabase.api.public-test/with-temp-public-card                                                                            hooks.common/let-one-with-optional-value
   metabase.api.public-test/with-temp-public-dashboard                                                                       hooks.common/let-one-with-optional-value
   metabase.api.public-test/with-temp-public-dashboard-and-card                                                              hooks.common/with-three-bindings
   metabase.api.search-test/with-search-items-in-collection                                                                  hooks.metabase.api.search-test/with-search-items-in-collection
   metabase.api.search-test/with-search-items-in-root-collection                                                             hooks.common/do*
   metabase.api.user-test/with-temp-user-email                                                                               hooks.common/with-one-binding
   metabase.async.streaming-response-test/with-start-execution-chan                                                          hooks.common/with-one-binding
   metabase.db.schema-migrations-test.impl/test-migrations                                                                   hooks.metabase.db.schema-migrations-test.impl/test-migrations
   metabase.dashboard-subscription-test/with-link-card-fixture-for-dashboard                                                 hooks.common/let-second
   metabase.driver.bigquery-cloud-sdk-test/calculate-bird-scarcity                                                           hooks.metabase.query-processor-test.expressions-test/calculate-bird-scarcity
   metabase.mbql.schema.macros/defclause                                                                                     hooks.metabase.mbql.schemas.macros/defclause
   metabase.models.collection-test/with-collection-hierarchy                                                                 hooks.common/let-one-with-optional-value
   metabase.models.collection-test/with-personal-and-impersonal-collections                                                  hooks.common/with-two-bindings
   metabase.models.dashboard-test/with-dash-in-collection                                                                    hooks.common/with-three-bindings
   metabase.models.dashboard-tab-test/with-dashtab-in-personal-collection                                                    hooks.common/with-one-top-level-binding
   metabase.models.interface/define-simple-hydration-method                                                                  hooks.metabase.models.interface/define-hydration-method
   metabase.models.interface/define-batched-hydration-method                                                                 hooks.metabase.models.interface/define-hydration-method
   metabase.models.pulse-test/with-dashboard-subscription-in-collection                                                      hooks.common/with-four-bindings
   metabase.models.pulse-test/with-pulse-in-collection                                                                       hooks.common/with-four-bindings
   metabase.models.setting.multi-setting/define-multi-setting                                                                hooks.metabase.models.setting/defsetting
   metabase.models.setting/defsetting                                                                                        hooks.metabase.models.setting/defsetting
   metabase.public-settings.premium-features/defenterprise                                                                   hooks.metabase.public-settings.premium-features/defenterprise
   metabase.pulse.test-util/checkins-query-card                                                                              hooks.metabase.test.data/$ids
   metabase.query-processor-test.expressions-test/calculate-bird-scarcity                                                    hooks.metabase.query-processor-test.expressions-test/calculate-bird-scarcity
   metabase.query-processor-test.filter-test/count-with-filter-clause                                                        hooks.metabase.test.data/$ids
   metabase.query-processor.middleware.cache-test/with-mock-cache                                                            hooks.common/with-two-bindings
   metabase.sample-data-test/with-temp-sample-database-db                                                                    hooks.common/with-one-binding
   metabase.test.data.users/with-group                                                                                       hooks.common/let-one-with-optional-value
   metabase.test.data/$ids                                                                                                   hooks.metabase.test.data/$ids
   metabase.test.data/dataset                                                                                                hooks.metabase.test.data/dataset
   metabase.test.data/mbql-query                                                                                             hooks.metabase.test.data/mbql-query
   metabase.test.data/run-mbql-query                                                                                         hooks.metabase.test.data/mbql-query
   metabase.test.util.async/with-open-channels                                                                               hooks.common/let-with-optional-value-for-last-binding
   metabase.test.util.log/with-log-level                                                                                     hooks.common/with-ignored-first-arg
   metabase.test.util.log/with-log-messages-for-level                                                                        hooks.common/with-ignored-first-arg
   metabase.test.util/discard-setting-changes                                                                                hooks.common/with-ignored-first-arg
   metabase.test.util/with-column-remappings                                                                                 hooks.common/with-ignored-first-arg
   metabase.test.util/with-non-admin-groups-no-root-collection-perms                                                         hooks.common/do*
   metabase.test.util/with-temp-file                                                                                         hooks.metabase.test.util/with-temp-file
   metabase.test.util/with-temporary-setting-values                                                                          hooks.metabase.test.util/with-temporary-setting-values
   metabase.test/$ids                                                                                                        hooks.metabase.test.data/$ids
   metabase.test/dataset                                                                                                     hooks.metabase.test.data/dataset
   metabase.test/discard-setting-changes                                                                                     hooks.common/with-ignored-first-arg
   metabase.test/mbql-query                                                                                                  hooks.metabase.test.data/mbql-query
   metabase.test/query                                                                                                       hooks.metabase.test.data/mbql-query
   metabase.test/test-drivers                                                                                                hooks.common/do*
   metabase.test/run-mbql-query                                                                                              hooks.metabase.test.data/mbql-query
   metabase.test/with-column-remappings                                                                                      hooks.common/with-ignored-first-arg
   metabase.test/with-group                                                                                                  hooks.common/let-one-with-optional-value
   metabase.test/with-log-level                                                                                              hooks.common/with-ignored-first-arg
   metabase.test/with-log-messages-for-level                                                                                 hooks.common/with-ignored-first-arg
   metabase.test/with-non-admin-groups-no-root-collection-perms                                                              hooks.common/do*
   metabase.test/with-temp*                                                                                                  hooks.toucan.util.test/with-temp*
   metabase.test/with-temp-file                                                                                              hooks.metabase.test.util/with-temp-file
   metabase.test/with-temporary-setting-values                                                                               hooks.metabase.test.util/with-temporary-setting-values
   toucan.util.test/with-temp*                                                                                               hooks.toucan.util.test/with-temp*}

  :macroexpand
  {clojurewerkz.quartzite.jobs/build                                            macros.quartz/build-job
   clojurewerkz.quartzite.schedule.cron/schedule                                macros.quartz/schedule
   clojurewerkz.quartzite.schedule.simple/schedule                              macros.quartz/simple-schedule
   clojurewerkz.quartzite.triggers/build                                        macros.quartz/build-trigger
   metabase-enterprise.sandbox.test-util/with-gtaps                             macros.metabase-enterprise.sandbox.test-util/with-gtaps
   metabase-enterprise.serialization.test-util/with-world                       macros.metabase-enterprise.serialization.test-util/with-world
   metabase-enterprise.test/with-gtaps                                          macros.metabase-enterprise.sandbox.test-util/with-gtaps
   metabase.api.card-test/with-ordered-items                                    macros.metabase.api.card-test/with-ordered-items
   metabase.api.collection-test/with-collection-hierarchy                       macros.metabase.api.collection-test/with-collection-hierarchy
   metabase.api.collection-test/with-some-children-of-collection                macros.metabase.api.collection-test/with-some-children-of-collection
   metabase.api.common/define-routes                                            macros.metabase.api.common/define-routes
   metabase.api.embed-test/with-embedding-enabled-and-temp-card-referencing     macros.metabase.api.embed-test/with-embedding-enabled-and-temp-card-referencing
   metabase.api.embed-test/with-embedding-enabled-and-temp-dashcard-referencing macros.metabase.api.embed-test/with-embedding-enabled-and-temp-dashcard-referencing
   metabase.api.public-test/with-sharing-enabled-and-temp-card-referencing      macros.metabase.api.public-test/with-sharing-enabled-and-temp-card-referencing
   metabase.api.public-test/with-sharing-enabled-and-temp-dashcard-referencing  macros.metabase.api.public-test/with-sharing-enabled-and-temp-dashcard-referencing
   metabase.domain-entities.malli/define-getters-and-setters                    macros.metabase.domain-entities.malli/define-getters-and-setters
   metabase.lib.filter/deffilter                                                macros.metabase.lib.filter/deffilter
   metabase.lib.common/defop                                                    macros.metabase.lib.common/defop
   metabase.models.params.chain-filter-test/chain-filter                        macros.metabase.models.params.chain-filter-test/chain-filter
   metabase.models.params.chain-filter-test/chain-filter-search                 macros.metabase.models.params.chain-filter-test/chain-filter
   metabase.models.user-test/with-groups                                        macros.metabase.models.user-test/with-groups
   metabase.query-processor.streaming/streaming-response                        macros.metabase.query-processor.streaming/streaming-response
   metabase.related-test/with-world                                             macros.metabase.related-test/with-world
   metabase.shared.util.namespaces/import-fn                                    macros.metabase.shared.util.namespaces/import-fn
   metabase.test.data.users/with-group-for-user                                 macros.metabase.test.data.users/with-group-for-user
   metabase.test.util/with-temp-env-var-value                                   macros.metabase.test.util/with-temp-env-var-value
   metabase.test.util/with-temporary-raw-setting-values                         macros.metabase.test.util/with-temporary-raw-setting-values
   metabase.test/with-group-for-user                                            macros.metabase.test.data.users/with-group-for-user
   metabase.test/with-persistence-enabled                                       macros.metabase.test.persistence/with-persistence-enabled
   metabase.test/with-temp-env-var-value                                        macros.metabase.test.util/with-temp-env-var-value
   metabase.test/with-temporary-raw-setting-values                              macros.metabase.test.util/with-temporary-raw-setting-values}}

 :config-in-comment
 {:linters {:unresolved-symbol {:level :off}}}

 ;;
 ;; TEST CONFIG
 ;;
 :ns-groups
 ;; the following patterns are considered to be test namespaces:
 ;;
 ;; - Any namespace ending in `-test` or `-test.whatever`
 ;; - Any namespace ending in `test-util`
 ;; - Any namespace that starts with `metabase.test`
 ;;
 ;; this list isn't exhaustive because it misses some stuff like the test runner and HTTP client but it's easier to go
 ;; fix those namespaces than it is to make this regex super hairy.
 [{:pattern "(?:.*-test(?:\\..*)?$)|(?:.*test-util$)|(?:^metabase\\.test.*)"
   :name    test-namespaces}
  {:pattern "^(?!.*-test(?:\\..*)?$)(?!.*test-util$)(?!^metabase\\.test.*).*$"
   :name    source-namespaces}
  {:pattern "metabase\\.cmd.*"
   :name    printable-namespaces}
  {:pattern "^metabase\\.lib\\.*"
   :name    metabase-lib}
  ;; Basically everything except `metabase.driver.` or `metabase.test-data.` except for the drivers explicitly called
  ;; out below. Remove these drivers from the regex once we switch to Honey SQL 2.
  ;;
  ;; This regex is way too big to easily read or write by hand, so use the [[metabase.util.regex/rx]] macro to
  ;; generate it. It was generated from the following form:
  ;;
  ;; (str
  ;;  (metabase.util.regex/rx
  ;;   #"^metabase\."
  ;;   [:not [:and #"util\." [:or "honeysql-extensions" "honey-sql-1"]]]
  ;;   [:not "query-processor-test"]
  ;;   [:not [:and
  ;;          [:or "driver" #"test\.data"]
  ;;          #"\."
  ;;          [:or
  ;;           [:and "sql" [:? "-jdbc"]]
  ;;           #"(?:sql(?:-jdbc)?)"
  ;;           "bigquery-cloud-sdk"
  ;;           [:and "presto" [:? [:or "-common" "-jdbc"]]]
  ;;           "sqlserver"]
  ;;          [:? "-test"]
  ;;          [:or #"\." #"$"]]]
  ;;   ".*"))
  ;;
  ;; Please keep this form updated when you change the generated regex! <3
  {:pattern "^metabase\\.(?!util\\.(?:(?:honeysql-extensions)|(?:honey-sql-1)))(?!query-processor-test)(?!(?:(?:driver)|(?:test\\.data))\\.(?:(?:sql(?:-jdbc)?)|(?:(?:sql(?:-jdbc)?))|(?:bigquery-cloud-sdk)|(?:presto(?:(?:(?:-common)|(?:-jdbc)))?)|(?:sqlserver))(?:-test)?(?:(?:\\.)|(?:$))).*"
   :name    honey-sql-2-namespaces}]

 :config-in-ns
 {test-namespaces
  {:linters
   {:inline-def                                    {:level :off}
    :missing-docstring                             {:level :off}
    :private-call                                  {:level :off}
    :hooks.metabase.test.data/mbql-query-first-arg {:level :error}}}

  source-namespaces
  {:linters
   {:discouraged-var
    {clojure.core/with-redefs {:message "Don't use with-redefs"}
     clojure.core/eval        {:message "Don't use eval"}}}}

  printable-namespaces
  {:linters
   {:discouraged-var {:level :off}}}

  honey-sql-2-namespaces
  {:linters
   {:discouraged-namespace
    {clj-yaml.core                     {:message "Use metabase.util.yaml"}
     honeysql.core                     {:message "Use Honey SQL 2"}
     honeysql.format                   {:message "Use Honey SQL 2"}
     honeysql.helpers                  {:message "Use Honey SQL 2"}
     honeysql.types                    {:message "Use Honey SQL 2"}
     honeysql.util                     {:message "Use Honey SQL 2"}
     metabase.util.honeysql-extensions {:message "Use h2x"}
     metabase.util.honey-sql-1         {:message "Use h2x"}}}}

  ;; enable all the extra linters we haven't enabled in the core app yet in MLv2. It's all new code so we can adhere
  ;; to the new stricter rules from day 1
  metabase-lib
  {:linters
   {:docstring-leading-trailing-whitespace                {:level :warning}
    :reduce-without-init                                  {:level :warning}
    :used-underscored-binding                             {:level :warning}
    :single-key-in                                        {:level :warning}
    :keyword-binding                                      {:level :warning}
    :shadowed-var                                         {:level :warning}
    :metabase/deftest-not-marked-parallel-or-synchronized {:level :warning}

    ;; eventually we should do this for the whole codebase, but the args are in the opposite order so switching them
    ;; all at once isn't trivial, at least we can stop using it in new code.
    :discouraged-var
    {medley.core/map-keys {:message "Use clojure.core/update-keys"}
     medley.core/map-vals {:message "Use clojure.core/update-vals"}}}}}}