From c2de53d2afa8969bad8149e69e9933db20bbf94a Mon Sep 17 00:00:00 2001 From: Moe Aboulkheir Date: Thu, 2 Jul 2020 11:30:16 +0100 Subject: [PATCH 1/4] Format project --- dev-resources/bad_invariant.edn | 2 +- src/invariant/datahike.clj | 20 ++++++++++---------- src/invariant/datomic.clj | 29 ++++++++++++++++------------- src/invariant/query.clj | 24 +++++++++++++----------- test/invariant/datahike_test.clj | 2 +- 5 files changed, 41 insertions(+), 36 deletions(-) diff --git a/dev-resources/bad_invariant.edn b/dev-resources/bad_invariant.edn index 37ff00f..27968a1 100644 --- a/dev-resources/bad_invariant.edn +++ b/dev-resources/bad_invariant.edn @@ -26,4 +26,4 @@ $before $after $txn $txs) [[?sum-before ?sum-after ?sum-change]]] [(= ?sum-before ?sum-after)] - [(= ?sum-change 0) ?matches]])]]] + [(= ?sum-change 0) ?matches]] diff --git a/src/invariant/datahike.clj b/src/invariant/datahike.clj index e50f553..b2da101 100644 --- a/src/invariant/datahike.clj +++ b/src/invariant/datahike.clj @@ -1,12 +1,12 @@ (ns invariant.datahike (:refer-clojure :exclude [+]) - (:require [datahike.api :as d] + (:require [clojure.edn :as edn] + [datahike.api :as d] [datahike.core :as dc] [datahike.query :as dq] [invariant.core] [invariant.query - :refer [assert-valid-query invariant-query]] - [clojure.edn :as edn])) + :refer [assert-valid-query invariant-query]])) (alter-var-root #'dq/built-ins assoc 'subquery datahike.api/q) @@ -45,19 +45,19 @@ [(get-attribute tx) tx]) attrs (distinct (map first attr-txs))] (doseq [[a tx] attr-txs - :when (= a :invariant/query) - :let [[_ _ _ v] tx]] + :when (= a :invariant/query) + :let [[_ _ _ v] tx]] (assert-valid-query (edn/read-string v))) - (doseq [a attrs + (doseq [a attrs :let [inv-qs (d/q invariant-query @conn a)] :when inv-qs] (when-not (invariant-holds? inv-qs conn tx-data schema) (throw (ex-info "Invariant mismatch." - {:type :invariant/invariant-mismatch - :attribute a - :invariant (edn/read-string inv-qs) - :tx-data tx-data})))) + {:type :invariant/invariant-mismatch + :attribute a + :invariant (edn/read-string inv-qs) + :tx-data tx-data})))) true)) (defmethod invariant.core/invariant :datahike diff --git a/src/invariant/datomic.clj b/src/invariant/datomic.clj index 03c6c3f..5501a14 100644 --- a/src/invariant/datomic.clj +++ b/src/invariant/datomic.clj @@ -1,12 +1,15 @@ (ns invariant.datomic (:refer-clojure :exclude [+]) - (:require [datomic.api :as api] + (:require [clojure.edn :as edn] + [datomic.api :as api] [datalog.parser :as p] - [clojure.edn :as edn] + [datalog.unparser + :refer [unparse]] [invariant.core] [invariant.query - :refer [assert-valid-query invariant-query]] - [datalog.unparser :refer [unparse]])) + :refer [assert-valid-query invariant-query]]) + (:import [datalog.parser.type + Function])) (defn get-attribute-dispatch [v] (first v)) @@ -22,7 +25,7 @@ a) (let [subq-selector (comp #{'subquery} :symbol :fn) - fn-selector (comp #{datalog.parser.type.Function} type)] + fn-selector (comp #{Function} type)] (defn unnest-deep-queries [[_ [_ query] & sources]] (let [res (p/parse query) clean-clauses (remove subq-selector (:qwhere res)) @@ -89,19 +92,19 @@ [(get-attribute tx) tx]) attrs (distinct (map first attr-txs))] (doseq [[a tx] attr-txs - :when (= a :invariant/query) - :let [[_ _ _ v] tx]] + :when (= a :invariant/query) + :let [[_ _ _ v] tx]] (assert-valid-query (edn/read-string v))) - (doseq [a attrs - :let [inv-qs (api/q invariant-query (api/db conn) a)] + (doseq [a attrs + :let [inv-qs (api/q invariant-query (api/db conn) a)] :when inv-qs] (when-not (invariant-holds? inv-qs conn tx-data schema) (throw (ex-info "Invariant mismatch." - {:type :invariant/invariant-mismatch - :attribute a - :invariant (edn/read-string inv-qs) - :tx-data tx-data})))) + {:type :invariant/invariant-mismatch + :attribute a + :invariant (edn/read-string inv-qs) + :tx-data tx-data})))) true)) (defmethod invariant.core/invariant :datomic diff --git a/src/invariant/query.clj b/src/invariant/query.clj index 4660e60..c34af49 100644 --- a/src/invariant/query.clj +++ b/src/invariant/query.clj @@ -1,19 +1,21 @@ (ns invariant.query (:require [datalog.parser :as p] [datalog.parser.type] - [datahike.query])) + [datahike.query]) + (:import [datalog.parser.type + Function + Predicate])) (def invariant-query '[:find ?q . - :in $ ?a + :in $ ?a :where - [?e :invariant/rule ?a] + [?e :invariant/rule ?a] [?e :invariant/query ?q]]) (def ^:dynamic *allowed-fns* (into #{'subquery} (keys datahike.query/built-ins))) -(def ^:private fn-selector (comp #{datalog.parser.type.Function - datalog.parser.type.Predicate} type)) +(def ^:private fn-selector (comp #{Function Predicate} type)) (defn assert-safe-query [query] (doseq [c (filter fn-selector (:qwhere (p/parse query))) @@ -23,16 +25,16 @@ (assert-safe-query q))) (when-not (*allowed-fns* f) (throw (ex-info "Function not allowed." - {:type :invariant/invalid-function-call - :call c}))))) + {:type :invariant/invalid-function-call + :call c}))))) (defn assert-valid-query [query] (let [res (p/parse query) called-fns (filter fn-selector (:qwhere res))] (when-not (= (count (:qin res)) 4) (throw (ex-info "The query operates on exactly 4 sources: $before, $after, $empty-with-txs, $tx-seq" - {:type :invariant/number-of-sources-not-4 - :sources (:qin res)}))) + {:type :invariant/number-of-sources-not-4 + :sources (:qin res)}))) (doseq [c called-fns :let [f (:symbol (:fn c))]] (when (#{'subquery} f) @@ -40,5 +42,5 @@ (assert-valid-query q))) (when-not (*allowed-fns* f) (throw (ex-info "Function not allowed." - {:type :invariant/invalid-function-call - :call c})))))) + {:type :invariant/invalid-function-call + :call c})))))) diff --git a/test/invariant/datahike_test.clj b/test/invariant/datahike_test.clj index 38c9ee5..f8f0847 100644 --- a/test/invariant/datahike_test.clj +++ b/test/invariant/datahike_test.clj @@ -12,7 +12,7 @@ :refer [read-resource]] [datahike.api :as d :refer [q]] - [datahike.core :as dc])) + [datahike.core :as dc])) (deftest attribute-test (testing "Attribute extraction." From d8e4b5dcb59110402a2852d6e176e79c97336d16 Mon Sep 17 00:00:00 2001 From: Moe Aboulkheir Date: Thu, 2 Jul 2020 11:33:46 +0100 Subject: [PATCH 2/4] Loosen assertion in bad-invariant-deployment? --- test/invariant/test/common.clj | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/test/invariant/test/common.clj b/test/invariant/test/common.clj index 595577a..c0df5b8 100644 --- a/test/invariant/test/common.clj +++ b/test/invariant/test/common.clj @@ -58,16 +58,11 @@ (let [tid (backend/tempid backend -1) txn [[:db/add tid :invariant/rule :account/balance] [:db/add tid :invariant/query (pr-str bad-invariant)]]] - (= '{:type :invariant/invalid-function-call, - :call #datalog.parser.type.Predicate - {:fn #datalog.parser.type.PlainSymbol{:symbol evil-haha}, - :args [#datalog.parser.type.Constant{:value 1} - #datalog.parser.type.Constant{:value 2} - #datalog.parser.type.Constant{:value 3}]}} + (= :invariant/invalid-function-call (try (backend/assert-invariants backend txn schema) (catch Exception e - (ex-data e))))))) + (-> e ex-data :type))))))) (defn- adjust-invariant [q {bigdec? :bigdec?}] (prewalk-replace {'sum-change-expected (cond-> 0 bigdec? bigdec)} q)) From a3ad7f6263a198aa52056970ac397950c2bc742e Mon Sep 17 00:00:00 2001 From: Moe Aboulkheir Date: Thu, 2 Jul 2020 11:34:20 +0100 Subject: [PATCH 3/4] Reorder invariant.test.common imports --- test/invariant/test/common.clj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/invariant/test/common.clj b/test/invariant/test/common.clj index c0df5b8..3a54b8b 100644 --- a/test/invariant/test/common.clj +++ b/test/invariant/test/common.clj @@ -1,11 +1,11 @@ (ns invariant.test.common - (:require [datalog.parser] + (:require [clojure.walk + :refer [prewalk-replace]] + [datalog.parser] [datalog.parser.type] [invariant.test.util :refer [read-resource]] - [invariant.backend :as backend] - [clojure.walk - :refer [prewalk-replace]])) + [invariant.backend :as backend])) (def example-txs (read-resource "example_txs.edn")) From 12bd49fec4919dc697d0294a9da1f442381ec208 Mon Sep 17 00:00:00 2001 From: Christian Weilbach Date: Thu, 3 Dec 2020 23:29:13 -0800 Subject: [PATCH 4/4] Cleanup with clj-fmt. Following https://github.com/replikativ/datahike/blob/development/doc/contributing.md --- src/invariant/datahike.clj | 8 ++++---- src/invariant/datomic.clj | 8 ++++---- src/invariant/query.clj | 12 ++++++------ 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/invariant/datahike.clj b/src/invariant/datahike.clj index b2da101..82120fe 100644 --- a/src/invariant/datahike.clj +++ b/src/invariant/datahike.clj @@ -54,10 +54,10 @@ :when inv-qs] (when-not (invariant-holds? inv-qs conn tx-data schema) (throw (ex-info "Invariant mismatch." - {:type :invariant/invariant-mismatch - :attribute a - :invariant (edn/read-string inv-qs) - :tx-data tx-data})))) + {:type :invariant/invariant-mismatch + :attribute a + :invariant (edn/read-string inv-qs) + :tx-data tx-data})))) true)) (defmethod invariant.core/invariant :datahike diff --git a/src/invariant/datomic.clj b/src/invariant/datomic.clj index 5501a14..633ca49 100644 --- a/src/invariant/datomic.clj +++ b/src/invariant/datomic.clj @@ -101,10 +101,10 @@ :when inv-qs] (when-not (invariant-holds? inv-qs conn tx-data schema) (throw (ex-info "Invariant mismatch." - {:type :invariant/invariant-mismatch - :attribute a - :invariant (edn/read-string inv-qs) - :tx-data tx-data})))) + {:type :invariant/invariant-mismatch + :attribute a + :invariant (edn/read-string inv-qs) + :tx-data tx-data})))) true)) (defmethod invariant.core/invariant :datomic diff --git a/src/invariant/query.clj b/src/invariant/query.clj index c34af49..fc9bf7c 100644 --- a/src/invariant/query.clj +++ b/src/invariant/query.clj @@ -25,16 +25,16 @@ (assert-safe-query q))) (when-not (*allowed-fns* f) (throw (ex-info "Function not allowed." - {:type :invariant/invalid-function-call - :call c}))))) + {:type :invariant/invalid-function-call + :call c}))))) (defn assert-valid-query [query] (let [res (p/parse query) called-fns (filter fn-selector (:qwhere res))] (when-not (= (count (:qin res)) 4) (throw (ex-info "The query operates on exactly 4 sources: $before, $after, $empty-with-txs, $tx-seq" - {:type :invariant/number-of-sources-not-4 - :sources (:qin res)}))) + {:type :invariant/number-of-sources-not-4 + :sources (:qin res)}))) (doseq [c called-fns :let [f (:symbol (:fn c))]] (when (#{'subquery} f) @@ -42,5 +42,5 @@ (assert-valid-query q))) (when-not (*allowed-fns* f) (throw (ex-info "Function not allowed." - {:type :invariant/invalid-function-call - :call c})))))) + {:type :invariant/invalid-function-call + :call c}))))))