diff --git a/.gitignore b/.gitignore index 21db16fd5eeb30cef1541527c9e29107172c3227..c52abc7fd1e95a4776f836b9081e3d5c0fc984ce 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 0000000000000000000000000000000000000000..9e267e521c74835e4c7bb6bb56a1dcc2883f3a45 --- /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 e17af33efb46cc0e85583b2c12d58477198c32dc..c985021f950dcc6681417de5a09fd7d644474434 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 119adc41e959ad4196aa6774230376a895654c51..9a8c039f4e8f77db6fbc4381a7ba23b5d9bf8869 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 79f9e4d93bda5b699dc5ec61c851010292c2835e..0000000000000000000000000000000000000000 --- 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 3bc9aa3314de60dd2cdd5542ac402d34b4591cb2..0000000000000000000000000000000000000000 --- 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 18146339b7b635d321ea7f2c915f9882e24a99b2..6670e6f37b2c477fb1ad35eea300a4065688d4bd 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 5c1711e86eb352d169d9ecaeeb162d5dec581c10..ca6d777d5ba9815b112ff8856ac69175ea4f3abe 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 f62a832ad85da1f2b265b5eb985c9edf33fab063..66c4ed1d4d4a650c9a78804b7bd1a5258b364497 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)))))