Merge pull request #185 from arichiardi/self-host-w-macrovich
Add ClojureScript self-host support
This commit is contained in:
commit
c839565cfe
3 changed files with 129 additions and 86 deletions
|
|
@ -5,7 +5,8 @@
|
|||
:url "https://github.com/jkk/honeysql"
|
||||
:scm {:name "git"
|
||||
:url "https://github.com/jkk/honeysql"}
|
||||
:dependencies [[org.clojure/clojure "1.8.0"]]
|
||||
:dependencies [[org.clojure/clojure "1.8.0"]
|
||||
[net.cgrand/macrovich "0.2.0"]]
|
||||
:aliases {"test-readme" ["with-profile" "midje" "midje"]}
|
||||
:cljsbuild {:builds {:release {:source-paths ["src"]
|
||||
:compiler {:output-to "dist/honeysql.js"
|
||||
|
|
@ -21,6 +22,8 @@
|
|||
:parallel-build true
|
||||
:target :nodejs}}}}
|
||||
:doo {:build "test"}
|
||||
:tach {:test-runner-ns 'honeysql.self-host-runner
|
||||
:source-paths ["src" "test"]}
|
||||
:profiles {:midje {:dependencies [[midje "1.9.0-alpha5"]]
|
||||
:plugins [[lein-midje "3.2.1"]
|
||||
[midje-readme "1.0.9"]]
|
||||
|
|
@ -33,4 +36,5 @@
|
|||
[cljsbuild "1.1.6"]]
|
||||
:plugins [[lein-cljsbuild "1.1.6"]
|
||||
[jonase/eastwood "0.2.4"]
|
||||
[lein-doo "0.1.6"]]}})
|
||||
[lein-doo "0.1.6"]
|
||||
[lein-tach "0.4.0"]]}})
|
||||
|
|
|
|||
|
|
@ -1,6 +1,8 @@
|
|||
(ns honeysql.helpers
|
||||
(:refer-clojure :exclude [update])
|
||||
#?(:cljs (:require-macros [honeysql.helpers :refer [defhelper]])))
|
||||
#?(:clj (:require [net.cgrand.macrovich :as macros])
|
||||
:cljs (:require-macros [net.cgrand.macrovich :as macros]
|
||||
[honeysql.helpers :refer [defhelper]])))
|
||||
|
||||
(defmulti build-clause (fn [name & args]
|
||||
name))
|
||||
|
|
@ -13,48 +15,56 @@
|
|||
(map? m)
|
||||
(not (record? m))))
|
||||
|
||||
#?(:clj
|
||||
(defmacro defhelper [helper arglist & more]
|
||||
(when-not (vector? arglist)
|
||||
(throw (IllegalArgumentException. "arglist must be a vector")))
|
||||
(when-not (= (count arglist) 2)
|
||||
(throw (IllegalArgumentException. "arglist must have two entries, map and varargs")))
|
||||
(let [kw (keyword (name helper))
|
||||
[m-arg varargs] arglist]
|
||||
`(do
|
||||
(defmethod build-clause ~kw ~['_ m-arg varargs] ~@more)
|
||||
(defn ~helper [& args#]
|
||||
(let [[m# args#] (if (plain-map? (first args#))
|
||||
[(first args#) (rest args#)]
|
||||
[{} args#])]
|
||||
(build-clause ~kw m# args#)))
|
||||
(macros/deftime
|
||||
(defmacro defhelper [helper arglist & more]
|
||||
(when-not (vector? arglist)
|
||||
(throw #?(:clj (IllegalArgumentException. "arglist must be a vector")
|
||||
:cljs (js/Error. "arglist must be a vector"))))
|
||||
(when-not (= (count arglist) 2)
|
||||
(throw #?(:clj (IllegalArgumentException. "arglist must have two entries, map and varargs")
|
||||
:cljs (js/Error. "arglist must have two entries, map and varargs"))))
|
||||
|
||||
;; maintain the original arglist instead of getting
|
||||
;; ([& args__6880__auto__])
|
||||
(alter-meta!
|
||||
(var ~helper)
|
||||
assoc
|
||||
:arglists
|
||||
'(~['& varargs]
|
||||
~[m-arg '& varargs]))))))
|
||||
(let [kw (keyword (name helper))
|
||||
[m-arg varargs] arglist]
|
||||
`(do
|
||||
(defmethod build-clause ~kw ~['_ m-arg varargs] ~@more)
|
||||
(defn ~helper [& args#]
|
||||
(let [[m# args#] (if (plain-map? (first args#))
|
||||
[(first args#) (rest args#)]
|
||||
[{} args#])]
|
||||
(build-clause ~kw m# args#)))
|
||||
|
||||
;; maintain the original arglist instead of getting
|
||||
;; ([& args__6880__auto__])
|
||||
(alter-meta!
|
||||
(var ~helper)
|
||||
assoc
|
||||
:arglists
|
||||
'(~['& varargs]
|
||||
~[m-arg '& varargs]))))))
|
||||
|
||||
(defn collify [x]
|
||||
(if (coll? x) x [x]))
|
||||
|
||||
(defhelper select [m fields]
|
||||
(assoc m :select (collify fields)))
|
||||
(macros/usetime
|
||||
(defhelper select [m fields]
|
||||
(assoc m :select (collify fields))))
|
||||
|
||||
(defhelper merge-select [m fields]
|
||||
(update-in m [:select] concat (collify fields)))
|
||||
(macros/usetime
|
||||
(defhelper merge-select [m fields]
|
||||
(update-in m [:select] concat (collify fields))))
|
||||
|
||||
(defhelper un-select [m fields]
|
||||
(update-in m [:select] #(remove (set (collify fields)) %)))
|
||||
(macros/usetime
|
||||
(defhelper un-select [m fields]
|
||||
(update-in m [:select] #(remove (set (collify fields)) %))))
|
||||
|
||||
(defhelper from [m tables]
|
||||
(assoc m :from (collify tables)))
|
||||
(macros/usetime
|
||||
(defhelper from [m tables]
|
||||
(assoc m :from (collify tables))))
|
||||
|
||||
(defhelper merge-from [m tables]
|
||||
(update-in m [:from] concat (collify tables)))
|
||||
(macros/usetime
|
||||
(defhelper merge-from [m tables]
|
||||
(update-in m [:from] concat (collify tables))))
|
||||
|
||||
(defmethod build-clause :where [_ m pred]
|
||||
(if (nil? pred)
|
||||
|
|
@ -94,29 +104,37 @@
|
|||
[logic-op (:where m) pred]
|
||||
pred)))))
|
||||
|
||||
(defhelper join [m clauses]
|
||||
(assoc m :join clauses))
|
||||
(macros/usetime
|
||||
(defhelper join [m clauses]
|
||||
(assoc m :join clauses)))
|
||||
|
||||
(defhelper merge-join [m clauses]
|
||||
(update-in m [:join] concat clauses))
|
||||
(macros/usetime
|
||||
(defhelper merge-join [m clauses]
|
||||
(update-in m [:join] concat clauses)))
|
||||
|
||||
(defhelper left-join [m clauses]
|
||||
(assoc m :left-join clauses))
|
||||
(macros/usetime
|
||||
(defhelper left-join [m clauses]
|
||||
(assoc m :left-join clauses)))
|
||||
|
||||
(defhelper merge-left-join [m clauses]
|
||||
(update-in m [:left-join] concat clauses))
|
||||
(macros/usetime
|
||||
(defhelper merge-left-join [m clauses]
|
||||
(update-in m [:left-join] concat clauses)))
|
||||
|
||||
(defhelper right-join [m clauses]
|
||||
(assoc m :right-join clauses))
|
||||
(macros/usetime
|
||||
(defhelper right-join [m clauses]
|
||||
(assoc m :right-join clauses)))
|
||||
|
||||
(defhelper merge-right-join [m clauses]
|
||||
(update-in m [:right-join] concat clauses))
|
||||
(macros/usetime
|
||||
(defhelper merge-right-join [m clauses]
|
||||
(update-in m [:right-join] concat clauses)))
|
||||
|
||||
(defhelper full-join [m clauses]
|
||||
(assoc m :full-join clauses))
|
||||
(macros/usetime
|
||||
(defhelper full-join [m clauses]
|
||||
(assoc m :full-join clauses)))
|
||||
|
||||
(defhelper merge-full-join [m clauses]
|
||||
(update-in m [:full-join] concat clauses))
|
||||
(macros/usetime
|
||||
(defhelper merge-full-join [m clauses]
|
||||
(update-in m [:full-join] concat clauses)))
|
||||
|
||||
(defmethod build-clause :group-by [_ m fields]
|
||||
(assoc m :group-by (collify fields)))
|
||||
|
|
@ -127,8 +145,9 @@
|
|||
[{} args])]
|
||||
(build-clause :group-by m fields)))
|
||||
|
||||
(defhelper merge-group-by [m fields]
|
||||
(update-in m [:group-by] concat (collify fields)))
|
||||
(macros/usetime
|
||||
(defhelper merge-group-by [m fields]
|
||||
(update-in m [:group-by] concat (collify fields))))
|
||||
|
||||
(defmethod build-clause :having [_ m pred]
|
||||
(if (nil? pred)
|
||||
|
|
@ -156,36 +175,43 @@
|
|||
[logic-op (:having m) pred]
|
||||
pred)))))
|
||||
|
||||
(defhelper order-by [m fields]
|
||||
(assoc m :order-by (collify fields)))
|
||||
(macros/usetime
|
||||
(defhelper order-by [m fields]
|
||||
(assoc m :order-by (collify fields))))
|
||||
|
||||
(defhelper merge-order-by [m fields]
|
||||
(update-in m [:order-by] concat (collify fields)))
|
||||
(macros/usetime
|
||||
(defhelper merge-order-by [m fields]
|
||||
(update-in m [:order-by] concat (collify fields))))
|
||||
|
||||
(defhelper limit [m l]
|
||||
(if (nil? l)
|
||||
m
|
||||
(assoc m :limit (if (coll? l) (first l) l))))
|
||||
(macros/usetime
|
||||
(defhelper limit [m l]
|
||||
(if (nil? l)
|
||||
m
|
||||
(assoc m :limit (if (coll? l) (first l) l)))))
|
||||
|
||||
(defhelper offset [m o]
|
||||
(if (nil? o)
|
||||
m
|
||||
(assoc m :offset (if (coll? o) (first o) o))))
|
||||
(macros/usetime
|
||||
(defhelper offset [m o]
|
||||
(if (nil? o)
|
||||
m
|
||||
(assoc m :offset (if (coll? o) (first o) o)))))
|
||||
|
||||
(defhelper lock [m lock]
|
||||
(cond-> m
|
||||
lock
|
||||
(assoc :lock lock)))
|
||||
(macros/usetime
|
||||
(defhelper lock [m lock]
|
||||
(cond-> m
|
||||
lock
|
||||
(assoc :lock lock))))
|
||||
|
||||
(defhelper modifiers [m ms]
|
||||
(if (nil? ms)
|
||||
m
|
||||
(assoc m :modifiers (collify ms))))
|
||||
(macros/usetime
|
||||
(defhelper modifiers [m ms]
|
||||
(if (nil? ms)
|
||||
m
|
||||
(assoc m :modifiers (collify ms)))))
|
||||
|
||||
(defhelper merge-modifiers [m ms]
|
||||
(if (nil? ms)
|
||||
m
|
||||
(update-in m [:modifiers] concat (collify ms))))
|
||||
(macros/usetime
|
||||
(defhelper merge-modifiers [m ms]
|
||||
(if (nil? ms)
|
||||
m
|
||||
(update-in m [:modifiers] concat (collify ms)))))
|
||||
|
||||
(defmethod build-clause :insert-into [_ m table]
|
||||
(assoc m :insert-into table))
|
||||
|
|
@ -194,11 +220,13 @@
|
|||
([table] (insert-into nil table))
|
||||
([m table] (build-clause :insert-into m table)))
|
||||
|
||||
(defhelper columns [m fields]
|
||||
(assoc m :columns (collify fields)))
|
||||
(macros/usetime
|
||||
(defhelper columns [m fields]
|
||||
(assoc m :columns (collify fields))))
|
||||
|
||||
(defhelper merge-columns [m fields]
|
||||
(update-in m [:columns] concat (collify fields)))
|
||||
(macros/usetime
|
||||
(defhelper merge-columns [m fields]
|
||||
(update-in m [:columns] concat (collify fields))))
|
||||
|
||||
(defmethod build-clause :values [_ m vs]
|
||||
(assoc m :values vs))
|
||||
|
|
@ -243,11 +271,13 @@
|
|||
([table] (delete-from nil table))
|
||||
([m table] (build-clause :delete-from m table)))
|
||||
|
||||
(defhelper with [m ctes]
|
||||
(assoc m :with ctes))
|
||||
(macros/usetime
|
||||
(defhelper with [m ctes]
|
||||
(assoc m :with ctes)))
|
||||
|
||||
(defhelper with-recursive [m ctes]
|
||||
(assoc m :with-recursive ctes))
|
||||
(macros/usetime
|
||||
(defhelper with-recursive [m ctes]
|
||||
(assoc m :with-recursive ctes)))
|
||||
|
||||
(defmethod build-clause :union [_ m maps]
|
||||
(assoc m :union maps))
|
||||
|
|
|
|||
9
test/honeysql/self_host_runner.cljs
Normal file
9
test/honeysql/self_host_runner.cljs
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
(ns honeysql.self-host-runner
|
||||
(:require [cljs.test :as t :refer-macros [run-tests]]
|
||||
honeysql.core-test
|
||||
honeysql.format-test))
|
||||
|
||||
(enable-console-print!)
|
||||
|
||||
(run-tests 'honeysql.core-test
|
||||
'honeysql.format-test)
|
||||
Loading…
Reference in a new issue