Skip to content

Commit 642fffd

Browse files
authored
Merge pull request #287 from metosin/test-267
267-tests + format + deps
2 parents ea023e5 + 70f69fc commit 642fffd

34 files changed

+1321
-1268
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
(ns clj-kondo.com.gfredericks.test.chuck.checking
2+
(:require
3+
[clj-kondo.hooks-api :as api]))
4+
5+
(defn checking
6+
[{{:keys [children]} :node}]
7+
(let [[_checking desc & opt+bindings+body] children
8+
[opts binding-vec & body] (if (api/vector-node? (first opt+bindings+body))
9+
(into [(api/map-node {})] opt+bindings+body)
10+
opt+bindings+body)]
11+
(when-not (even? (count (:children binding-vec)))
12+
(throw (ex-info "checking requires an even number of bindings" {})))
13+
{:node (api/list-node
14+
(list*
15+
(api/token-node 'let)
16+
(api/vector-node (into [(api/token-node (symbol (gensym "_checking-desc"))) desc]
17+
(:children binding-vec)))
18+
opts
19+
body))}))
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{:hooks
2+
{:analyze-call
3+
{com.gfredericks.test.chuck.clojure-test/checking
4+
clj-kondo.com.gfredericks.test.chuck.checking/checking}}}
+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{:lint-as {schema.test/deftest clojure.test/deftest}}

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,5 @@
1111
/target
1212
pom.xml
1313
pom.xml.asc
14+
.cache
15+
node_modules

CHANGELOG.md

+7-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
# Unreleased
22

3-
* Support transforming schema to JSON Schema. PR [#281](https://github.com/metosin/spec-tools/pull/281)
3+
* Support transforming multi-spec to JSON Schema. PR [#281](https://github.com/metosin/spec-tools/pull/281)
4+
* FIX :reason doesn't compose as expected [#171](https://github.com/metosin/spec-tools/issues/171)
5+
* Update Dependencies
6+
7+
```clojure
8+
[org.clojure/spec.alpha "0.5.238"] is available but we use "0.3.218"
9+
```
410

511
# 0.10.6 (2023-08-28)
612

project.clj

+8-8
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@
1616
:scm {:name "git"
1717
:url "https://github.com/metosin/spec-tools"}
1818

19-
:dependencies [[org.clojure/spec.alpha "0.3.218"]]
19+
:dependencies [[org.clojure/spec.alpha "0.5.238"]]
2020

21-
:profiles {:dev {:plugins [[jonase/eastwood "1.4.0"]
21+
:profiles {:dev {:plugins [[jonase/eastwood "1.4.2"]
2222
[lein-tach "1.1.0"]
2323
[lein-doo "0.1.11"]
2424
[lein-cljsbuild "1.1.8"]
@@ -27,21 +27,21 @@
2727
[lein-pprint "1.3.2"]]
2828
:jvm-opts ^:replace ["-server"]
2929
;:global-vars {*warn-on-reflection* true}
30-
:dependencies [[org.clojure/clojure "1.11.1"]
31-
[org.clojure/clojurescript "1.11.60"]
30+
:dependencies [[org.clojure/clojure "1.11.3"]
31+
[org.clojure/clojurescript "1.11.132"]
3232
[criterium "0.4.6"]
3333
[prismatic/schema "1.4.1"]
3434
[org.clojure/test.check "1.1.1"]
35-
[org.clojure/tools.namespace "1.4.4"]
35+
[org.clojure/tools.namespace "1.5.0"]
3636
[com.gfredericks/test.chuck "0.2.14"]
3737
; com.bhauman/spell-spec library doesn't get any updates, so it has to be copied here
3838
; under spec-tools.spell-spec namespace in order to fix its bugs.
3939
; If the library gets updated with fixes it would be desirable to switch back to it.
4040
;[com.bhauman/spell-spec "0.1.1"]
4141
[expound "0.9.0"]
42-
[metosin/muuntaja "0.6.8"]
43-
[metosin/ring-swagger "0.26.2"]
44-
[metosin/jsonista "0.3.7"]
42+
[metosin/muuntaja "0.6.10"]
43+
[metosin/ring-swagger "1.0.0"]
44+
[metosin/jsonista "0.3.8"]
4545
[metosin/scjsv "0.6.2"]]}
4646
:perf {:jvm-opts ^:replace ["-server"]}}
4747
:aliases {"all" ["with-profile" "dev"]

src/spec_tools/core.cljc

+69-70
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,8 @@
1313
[cljs.reader]
1414
[cljs.spec.gen.alpha :as gen]]))
1515
(:import
16-
#?@(:clj
17-
[(clojure.lang AFn IFn Var)
18-
(java.io Writer)])))
16+
#?@(:clj [(clojure.lang IFn)
17+
(java.io Writer)])))
1918

2019
;;
2120
;; helpers
@@ -47,12 +46,12 @@
4746
if no spec was found."
4847
[name-or-spec]
4948
(or
50-
(and (spec? name-or-spec) name-or-spec)
51-
(get-spec name-or-spec)
52-
(throw
53-
(ex-info
54-
(str "can't coerce to spec: " name-or-spec)
55-
{:name-or-spec name-or-spec}))))
49+
(and (spec? name-or-spec) name-or-spec)
50+
(get-spec name-or-spec)
51+
(throw
52+
(ex-info
53+
(str "can't coerce to spec: " name-or-spec)
54+
{:name-or-spec name-or-spec}))))
5655

5756
(defn ^:skip-wiki serialize
5857
"Writes specs into a string that can be read by the reader.
@@ -144,36 +143,36 @@
144143
(def json-transformer
145144
"Transformer that transforms data between JSON and EDN."
146145
(type-transformer
147-
{:name :json
148-
:decoders stt/json-type-decoders
149-
:encoders stt/json-type-encoders
150-
:default-encoder stt/any->any}))
146+
{:name :json
147+
:decoders stt/json-type-decoders
148+
:encoders stt/json-type-encoders
149+
:default-encoder stt/any->any}))
151150

152151
(def string-transformer
153152
"Transformer that transforms data between Strings and EDN."
154153
(type-transformer
155-
{:name :string
156-
:decoders stt/string-type-decoders
157-
:encoders stt/string-type-encoders
158-
:default-encoder stt/any->any}))
154+
{:name :string
155+
:decoders stt/string-type-decoders
156+
:encoders stt/string-type-encoders
157+
:default-encoder stt/any->any}))
159158

160159
(def strip-extra-keys-transformer
161160
"Transformer that drop extra keys from `s/keys` specs."
162161
(type-transformer
163-
{:name ::strip-extra-keys
164-
:decoders stt/strip-extra-keys-type-decoders}))
162+
{:name ::strip-extra-keys
163+
:decoders stt/strip-extra-keys-type-decoders}))
165164

166165
(def strip-extra-values-transformer
167166
"Transformer that drop extra values from `s/tuple` specs."
168167
(type-transformer
169-
{:name ::strip-extra-values
170-
:decoders stt/strip-extra-values-type-decoders}))
168+
{:name ::strip-extra-values
169+
:decoders stt/strip-extra-values-type-decoders}))
171170

172171
(def fail-on-extra-keys-transformer
173172
"Transformer that fails on extra keys in `s/keys` specs."
174173
(type-transformer
175-
{:name ::fail-on-extra-keys
176-
:decoders stt/fail-on-extra-keys-type-decoders}))
174+
{:name ::fail-on-extra-keys
175+
:decoders stt/fail-on-extra-keys-type-decoders}))
177176

178177
;;
179178
;; Transforming
@@ -291,20 +290,20 @@
291290

292291
(defmethod walk :or [{:keys [::parse/items]} value accept options]
293292
(reduce
294-
(fn [v item]
295-
(let [transformed (accept item v options)
296-
valid? (some-> item :spec (s/valid? transformed))]
297-
(if valid?
298-
(reduced transformed)
299-
transformed)))
300-
value items))
293+
(fn [v item]
294+
(let [transformed (accept item v options)
295+
valid? (some-> item :spec (s/valid? transformed))]
296+
(if valid?
297+
(reduced transformed)
298+
transformed)))
299+
value items))
301300

302301
(defmethod walk :and [{:keys [::parse/items]} value accept options]
303302
(reduce
304-
(fn [v item]
305-
(let [transformed (accept item v options)]
306-
transformed))
307-
value items))
303+
(fn [v item]
304+
(let [transformed (accept item v options)]
305+
transformed))
306+
value items))
308307

309308
(defmethod walk :nilable [{:keys [::parse/item]} value accept options]
310309
(accept item value options))
@@ -334,23 +333,23 @@
334333
(defmethod walk :map [{:keys [::parse/key->spec]} value accept options]
335334
(if (map? value)
336335
(reduce-kv
337-
(fn [acc k v]
338-
(let [spec (if (qualified-keyword? k) (s/get-spec k) (s/get-spec (get key->spec k)))
339-
value (if spec (accept spec v options) v)]
340-
(assoc acc k value)))
341-
value
342-
value)
336+
(fn [acc k v]
337+
(let [spec (if (qualified-keyword? k) (s/get-spec k) (s/get-spec (get key->spec k)))
338+
value (if spec (accept spec v options) v)]
339+
(assoc acc k value)))
340+
value
341+
value)
343342
value))
344343

345344
(defmethod walk :map-of [{:keys [::parse/key ::parse/value]} data accept options]
346345
(if (map? data)
347346
(reduce-kv
348-
(fn [acc k v]
349-
(let [k' (accept key k options)
350-
v' (accept value v options)]
351-
(assoc acc k' v')))
352-
(empty data)
353-
data)
347+
(fn [acc k v]
348+
(let [k' (accept key k options)
349+
v' (accept value v options)]
350+
(assoc acc k' v')))
351+
(empty data)
352+
data)
354353
data))
355354

356355
(defmethod walk :multi-spec [{:keys [::parse/key ::parse/dispatch]} data accept options]
@@ -367,16 +366,16 @@
367366
(defn- extra-spec-map [data]
368367
(->> (dissoc data :form :spec)
369368
(reduce
370-
(fn [acc [k v]]
371-
(if (= "spec-tools.parse" (namespace k)) acc (assoc acc k v)))
372-
{})))
369+
(fn [acc [k v]]
370+
(if (= "spec-tools.parse" (namespace k)) acc (assoc acc k v)))
371+
{})))
373372

374373
(defn- fail-on-invoke [spec]
375374
(throw
376-
(ex-info
377-
(str
378-
"Can't invoke spec with a non-function predicate: " spec)
379-
{:spec spec})))
375+
(ex-info
376+
(str
377+
"Can't invoke spec with a non-function predicate: " spec)
378+
{:spec spec})))
380379

381380
(defn- leaf? [spec]
382381
(:leaf? (into-spec spec)))
@@ -460,17 +459,17 @@
460459
spec-reason (:reason this)
461460
with-reason (fn [problem]
462461
(cond-> problem
463-
(and spec-reason (not (:reason problem)))
464-
(assoc :reason spec-reason)))]
462+
(and spec-reason (not (:reason problem)))
463+
(assoc :reason spec-reason)))]
465464
(if problems
466465
(map with-reason problems))))
467466

468467
(gen* [this overrides path rmap]
469468
(if-let [gen (:gen this)]
470469
(gen)
471470
(or
472-
(gen/gen-for-pred spec)
473-
(s/gen* (or (s/spec? spec) (s/specize* spec)) overrides path rmap))))
471+
(gen/gen-for-pred spec)
472+
(s/gen* (or (s/spec? spec) (s/specize* spec)) overrides path rmap))))
474473

475474
(with-gen* [this gfn]
476475
(assoc this :gen gfn))
@@ -488,9 +487,9 @@
488487
[^Spec t ^Writer w]
489488
(.write w (str "#Spec"
490489
(clojure.core/merge
491-
(select-keys t [:form])
492-
(if (:type t) (select-keys t [:type]))
493-
(extra-spec-map t))))))
490+
(select-keys t [:form])
491+
(if (:type t) (select-keys t [:type]))
492+
(extra-spec-map t))))))
494493

495494
(defn spec? [x]
496495
(if (instance? Spec x) x))
@@ -550,7 +549,7 @@
550549
type (if (contains? m :type) type (:type info))
551550
name (-> spec meta ::s/name)
552551
record (map->Spec
553-
(clojure.core/merge m info {:spec spec :form form :type type :leaf? (parse/leaf-type? type)}))]
552+
(clojure.core/merge m info {:spec spec :form form :type type :leaf? (parse/leaf-type? type)}))]
554553
(cond-> record name (with-meta {::s/name name}))))
555554

556555
#?(:clj
@@ -575,10 +574,10 @@
575574
form# '~(impl/resolve-form &env pred)]
576575
(assert (map? info#) (str "spec info should be a map, was: " info#))
577576
(create-spec
578-
(clojure.core/merge
579-
info#
580-
{:form form#
581-
:spec ~pred}))))))
577+
(clojure.core/merge
578+
info#
579+
{:form form#
580+
:spec ~pred}))))))
582581

583582
(defn- into-spec [x]
584583
(cond
@@ -613,11 +612,11 @@
613612
(gen* [_ overrides path rmap]
614613
(s/gen* merge-spec overrides path rmap)))]
615614
(create-spec
616-
(clojure.core/merge
617-
{:spec spec
618-
:form spec-form
619-
:type :map}
620-
(apply merge-with set/union form-keys)))))
615+
(clojure.core/merge
616+
{:spec spec
617+
:form spec-form
618+
:type :map}
619+
(apply merge-with set/union form-keys)))))
621620

622621
#?(:clj
623622
(defmacro merge [& forms]

0 commit comments

Comments
 (0)