Projects using Clojure spec - next-jdbc
The next-jdbc project is a modern low-level Clojure wrapper for JDBC-based access to databases.
The project defines data specifications using predicates and
Specifications are defined within a single file
Specifications start with
clojure.spec.alpha/def expressions, using predicate functions as specifications. There is also a custom predicate function called
Function definition specifications follow, using the
clojure.spec.alpha/fdef function. The
fdef functions define the specification for the arguments of each function. The
fdef function name is the same as the function definition it is defining a specification for.
Instrumenting functions provides automatic checking that argument in a function call conforms to the specification.
Rather than write individual expressions to instrument each function, a var called
fns-with-specs contains a collection of names for all the
fdef function definition specifications.
(def ^:private fns-with-specs [`jdbc/get-datasource `jdbc/get-connection `jdbc/prepare `jdbc/plan `jdbc/execute! `jdbc/execute-one! `jdbc/transact `jdbc/with-transaction `connection/->pool `prepare/execute-batch! `prepare/set-parameters `prepare/statement `sql/insert! `sql/insert-multi! `sql/query `sql/find-by-keys `sql/get-by-id `sql/update! `sql/delete!])
Instrument all the functions by passing
fns-with-specs as an argument to the
This call is wrapped in a simple handler function for convenience.
(defn instrument  (clojure.spec.test.alpha/instrument fns-with-specs))
To remove the checking of argument specifications,
clojure.spec.test.alpha/unstrument is passed
fns-with-specs, again wrapped in a convinced function.
(defn unstrument  (clojure.spec.test.alpha/unstrument fns-with-specs))