From e5232b13e92943c9684f30c8fb722ec4cae76b69 Mon Sep 17 00:00:00 2001 From: Cam Saul <cam@geotip.com> Date: Fri, 31 Jul 2015 15:18:24 -0700 Subject: [PATCH] Code to load sample dataset on launch --- .gitignore | 2 +- build-uberjar | 17 +++++++++++ circle.yml | 4 +-- docs/DEVELOPERS.md | 2 +- lein_tasks/leiningen/npm.clj | 11 ------- lein_tasks/leiningen/webpack.clj | 12 -------- project.clj | 3 +- .../metabase/sample_dataset/generate.clj | 4 +-- src/metabase/core.clj | 29 +++++++++++++++++++ 9 files changed, 52 insertions(+), 32 deletions(-) create mode 100755 build-uberjar delete mode 100644 lein_tasks/leiningen/npm.clj delete mode 100644 lein_tasks/leiningen/webpack.clj diff --git a/.gitignore b/.gitignore index 21db16fd5ee..c52abc7fd1e 100644 --- a/.gitignore +++ b/.gitignore @@ -22,4 +22,4 @@ profiles.clj /node_modules/ /.babel_cache /coverage -/resources/sample-dataset-* +/resources/sample-dataset* diff --git a/build-uberjar b/build-uberjar new file mode 100755 index 00000000000..9e267e521c7 --- /dev/null +++ b/build-uberjar @@ -0,0 +1,17 @@ +#! /bin/bash + +echo "Running 'npm install' to download javascript dependencies..." && +npm install && + +echo "Running 'webpack -p' to assemble and minify frontend assets..." && +if [ -n "$CI_DISABLE_WEBPACK_MINIFICATION" ]; then + ./node_modules/webpack/bin/webpack.js +else + ./node_modules/webpack/bin/webpack.js -p +fi && + +echo "Running 'lein generate-sample-dataset' to generate the sample dataset..." && +lein generate-sample-dataset && + +echo "Running 'lein uberjar'..." && +lein uberjar diff --git a/circle.yml b/circle.yml index e17af33efb4..c985021f950 100644 --- a/circle.yml +++ b/circle.yml @@ -11,6 +11,6 @@ test: # 2) runs Eastwood linter # 3) Bikeshed linter # 4) runs JS linter + JS test - # 5) runs lein uberjar - - case $CIRCLE_NODE_INDEX in 0) MB_TEST_DATASETS=h2,mongo,postgres lein test ;; 1) MB_DB_TYPE=postgres MB_DB_DBNAME=circle_test MB_DB_PORT=5432 MB_DB_USER=ubuntu MB_DB_HOST=localhost lein test ;; 2) lein eastwood ;; 3) lein bikeshed --max-line-length 240 ;; 4) npm run lint && npm run build && npm run test ;; 5) CI_DISABLE_WEBPACK_MINIFICATION=1 lein uberjar ;; esac: + # 5) runs ./build-uberjar + - case $CIRCLE_NODE_INDEX in 0) MB_TEST_DATASETS=h2,mongo,postgres lein test ;; 1) MB_DB_TYPE=postgres MB_DB_DBNAME=circle_test MB_DB_PORT=5432 MB_DB_USER=ubuntu MB_DB_HOST=localhost lein test ;; 2) lein eastwood ;; 3) lein bikeshed --max-line-length 240 ;; 4) npm run lint && npm run build && npm run test ;; 5) CI_DISABLE_WEBPACK_MINIFICATION=1 ./build-uberjar ;; esac: parallel: true diff --git a/docs/DEVELOPERS.md b/docs/DEVELOPERS.md index 119adc41e95..9a8c039f4e8 100644 --- a/docs/DEVELOPERS.md +++ b/docs/DEVELOPERS.md @@ -36,7 +36,7 @@ Then run the HTTP server with Check that the project can compile successfully with - lein uberjar + ./build-uberjar Run the linters with diff --git a/lein_tasks/leiningen/npm.clj b/lein_tasks/leiningen/npm.clj deleted file mode 100644 index 79f9e4d93bd..00000000000 --- a/lein_tasks/leiningen/npm.clj +++ /dev/null @@ -1,11 +0,0 @@ -(ns leiningen.npm - (:use clojure.java.shell)) - - -(defn npm [projects & args] - ;; TODO - some better validations such as checking if `npm` is available - (println "Running `npm install` to download javascript dependencies") - (let [result (sh "npm" "install")] - (if (= 0 (:exit result)) - (println (:out result)) - (println (:err result))))) \ No newline at end of file diff --git a/lein_tasks/leiningen/webpack.clj b/lein_tasks/leiningen/webpack.clj deleted file mode 100644 index 3bc9aa3314d..00000000000 --- a/lein_tasks/leiningen/webpack.clj +++ /dev/null @@ -1,12 +0,0 @@ -(ns leiningen.webpack - (:require [clojure.java.shell :refer :all])) - -;; Set the CI_DISABLE_WEBPACK_MINIFICATION environment variable to skip minification which takes ~6+ minutes on CircleCI -(defn webpack [projects & args] - ;; TODO - some better validations such as checking that we have webpack available - (println "Running `webpack -p` to assemble and minify frontend assets") - (let [result (sh (str (:root projects) "/node_modules/webpack/bin/webpack.js") (if (System/getenv "CI_DISABLE_WEBPACK_MINIFICATION") "" - "-p"))] - (if (= 0 (:exit result)) - (println (:out result)) - (println (:err result))))) diff --git a/project.clj b/project.clj index 18146339b7b..6670e6f37b2 100644 --- a/project.clj +++ b/project.clj @@ -90,8 +90,7 @@ "-Dmb.jetty.port=3010" "-Dmb.api.key=test-api-key" "-Xverify:none"]} ; disable bytecode verification when running tests so they start slightly faster - :uberjar {:aot :all - :prep-tasks ^:replace ["npm" "webpack" "generate-sample-dataset" "javac" "compile"]} + :uberjar {:aot :all} :generate-sample-dataset {:dependencies [[faker "0.2.2"] ; Fake data generator -- port of Perl/Ruby [incanter/incanter-core "1.5.6"]] ; Satistical functions like normal distibutions}}) :source-paths ["sample_dataset"] diff --git a/sample_dataset/metabase/sample_dataset/generate.clj b/sample_dataset/metabase/sample_dataset/generate.clj index 5c1711e86eb..ca6d777d5ba 100644 --- a/sample_dataset/metabase/sample_dataset/generate.clj +++ b/sample_dataset/metabase/sample_dataset/generate.clj @@ -11,10 +11,8 @@ [db :as kdb])) (:import java.util.Date)) -(def ^:private ^:const sample-dataset-version "1.0.0") - (def ^:private ^:const sample-dataset-filename - (str (System/getProperty "user.dir") (format "/resources/sample-dataset-%s.db" sample-dataset-version))) + (str (System/getProperty "user.dir") "/resources/sample-dataset.db")) (defn- normal-distribution-rand [mean median] (dist/draw (dist/normal-distribution mean median))) diff --git a/src/metabase/core.clj b/src/metabase/core.clj index f62a832ad85..66c4ed1d4d4 100644 --- a/src/metabase/core.clj +++ b/src/metabase/core.clj @@ -16,6 +16,7 @@ [medley.core :as medley] (metabase [config :as config] [db :as db] + [driver :as driver] [routes :as routes] [setup :as setup] [task :as task]) @@ -23,6 +24,7 @@ [log-api-call :refer :all] [format :refer :all]) (metabase.models [setting :refer [defsetting]] + [database :refer [Database]] [user :refer [User]]))) ;; ## CONFIG @@ -134,6 +136,30 @@ (.stop ^org.eclipse.jetty.server.Server @jetty-instance) (reset! jetty-instance nil))) +(def ^:private ^:const sample-dataset-name "Sample Dataset") +(def ^:private ^:const sample-dataset-filename "sample-dataset.db.mv.db") + +(defn- add-sample-dataset! [] + (db/cascade-delete Database :name sample-dataset-name) + (when-not (db/exists? Database :name sample-dataset-name) + (try + (log/info "Loading sample dataset...") + (let [resource (-> (Thread/currentThread) ; hunt down the sample dataset DB file inside the current JAR + .getContextClassLoader + (.getResource sample-dataset-filename))] + (if-not resource + (log/error (format "Can't load sample dataset: the DB file '%s' can't be found by the ClassLoader." sample-dataset-filename)) + (let [h2-file (-> (.getPath resource) + (s/replace #"^file:" "zip:") ; to connect to an H2 DB inside a JAR just replace file: with zip: + (s/replace #"\.mv\.db$" "") ; strip the .mv.db suffix from the path + (str ";USER=GUEST;PASSWORD=guest"))] ; specify the GUEST user account created for the DB + (driver/sync-database! (db/ins Database + :name sample-dataset-name + :details {:db h2-file} + :engine :h2))))) + (catch Throwable e + (log/error (format "Failed to load sample dataset: %s" (.getMessage e))))))) + (defn -main "Launch Metabase in standalone mode." @@ -142,7 +168,10 @@ (try ;; run our initialization process (init) + ;; add the sample dataset DB if applicable + (add-sample-dataset!) ;; launch embedded webserver (start-jetty) (catch Exception e + (.printStackTrace e) (log/error "Metabase Initialization FAILED: " (.getMessage e))))) -- GitLab