From 2c077888d7b6b91d695decc1bb583a0c9511c43c Mon Sep 17 00:00:00 2001
From: Daniel Higginbotham <daniel@flyingmachinestudios.com>
Date: Wed, 28 Aug 2019 15:56:40 -0400
Subject: [PATCH] more REPL ergonomics (#10702) (#10744)

---
 .gitignore       |  1 +
 dev/src/dev.clj  | 49 ++++++++++++++++++++++++++++++++++++++++++++++++
 dev/src/user.clj |  8 ++++++++
 dev/user.clj     |  1 -
 project.clj      |  8 +++++---
 5 files changed, 63 insertions(+), 4 deletions(-)
 create mode 100644 dev/src/dev.clj
 create mode 100644 dev/src/user.clj
 delete mode 100644 dev/user.clj

diff --git a/.gitignore b/.gitignore
index d8f95d5dc88..5dd7294d0db 100644
--- a/.gitignore
+++ b/.gitignore
@@ -62,3 +62,4 @@ target/checksum.txt
 /resources/frontend_client/app/locales
 *.iml
 .idea/
+/local/src
diff --git a/dev/src/dev.clj b/dev/src/dev.clj
new file mode 100644
index 00000000000..646b379f7ef
--- /dev/null
+++ b/dev/src/dev.clj
@@ -0,0 +1,49 @@
+(ns dev
+  "Put everything needed for REPL development within easy reach"
+  (:require [metabase
+             [core :as mbc]
+             [db :as mdb]
+             [handler :as handler]
+             [plugins :as pluguns]
+             [server :as server]
+             [util :as u]]
+            [metabase.api.common :as api-common]
+            [metabase.models.interface :as mi]
+            [toucan.db :as tdb]))
+
+
+(defn init!
+  []
+  (mbc/init!))
+
+(defn start!
+  []
+  (metabase.server/start-web-server! #'metabase.handler/app)
+  (metabase.db/setup-db!)
+  (metabase.plugins/load-plugins!)
+  (metabase.core.initialization-status/set-complete!))
+
+(defn stop!
+  []
+  (metabase.server/stop-web-server!))
+
+(defn restart!
+  []
+  (stop!)
+  (start!))
+
+(defn run-tests
+  [& ns-names]
+  (doseq [ns-name ns-names]
+    (require ns-name :reload))
+  (expectations/run-tests ns-names))
+
+(defmacro require-model
+  "Rather than requiring all models inn the ns declaration, make it easy to require the ones you need for your current session"
+  [model-sym]
+  `(require [(symbol (str "metabase.models." (quote ~model-sym))) :as (quote ~model-sym)]))
+
+(defmacro with-permissions
+  [permissions & body]
+  `(binding [api-common/*current-user-permissions-set* (delay ~permissions)]
+     ~@body))
diff --git a/dev/src/user.clj b/dev/src/user.clj
new file mode 100644
index 00000000000..9cf3c0c4e9e
--- /dev/null
+++ b/dev/src/user.clj
@@ -0,0 +1,8 @@
+(ns user)
+
+(defn dev
+  "Load and switch to the 'dev' namespace."
+  []
+  (require 'dev)
+  (in-ns 'dev)
+  :loaded)
diff --git a/dev/user.clj b/dev/user.clj
deleted file mode 100644
index 7a96237a767..00000000000
--- a/dev/user.clj
+++ /dev/null
@@ -1 +0,0 @@
-(ns user)
diff --git a/project.clj b/project.clj
index 12a32eaf775..9d96179368e 100644
--- a/project.clj
+++ b/project.clj
@@ -151,7 +151,9 @@
 
   :profiles
   {:dev
-   {:dependencies
+   {:source-paths ["dev/src" "local/src"]
+    
+    :dependencies
     [[clj-http-fake "1.0.3" :exclusions [slingshot]]                  ; Library to mock clj-http responses
      [expectations "2.1.10"]                                          ; unit tests
      [ring/ring-mock "0.3.2"]]
@@ -247,7 +249,7 @@
      [[jonase/eastwood "0.3.1" :exclusions [org.clojure/clojure]]]
 
      :eastwood
-     {:exclude-namespaces [:test-paths]
+     {:exclude-namespaces [:test-paths dev]
       :config-files       ["./test_resources/eastwood-config.clj"]
       :add-linters        [:unused-private-vars
                            :unused-namespaces
@@ -283,7 +285,7 @@
    :check-namespace-decls
    [:include-all-drivers
     {:plugins               [[lein-check-namespace-decls "1.0.2"]]
-     :source-paths          ["test"]
+     :source-paths          ^:replace ["src" "test"]
      :check-namespace-decls {:prefix-rewriting true}}]
 
    ;; build the uberjar with `lein uberjar`
-- 
GitLab