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
Defining specifications
Specifications are defined within a single file src/next/jdbc/specs.clj
.
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 specifications
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 clojure.spec.test.alpha/instrument
function.
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))