2024 年 Clojure 状态调查! 中分享你的想法。

欢迎!请查看 关于 页面以了解更多此网站的工作方式信息。

0
Spec

当使用 spec-tools (metosin/spec-tools {:mvn/version "0.10.5"}) 进行值列表的规范时,在 s/valid? 和 s/explain 中产生了不一致的结果。

最小示例:

(ns case
  (:require [spec-tools.data-spec :as ds]
            [clojure.spec.alpha :as s]))

(def invalid-data {:cards (list 66)})

(def valid-data {:cards [66]})

(def cards
  {:cards [int?]})

(defn do-stuff [data]
  (if (s/valid? (ds/spec ::sp cards) data)
    (println "Conforms to spec according to 'valid?'")
    (println "Does not conform to spec according to 'valid?'"))
  (if (s/explain-data (ds/spec ::sp cards) data)
    (println "Does not conform to spec according to 'explain-data'")
    (println "Conforms to spec according to 'explain-data'")))

(comment
  (do-stuff invalid-data)
  (do-stuff valid-data))

由于某种原因,当使用列表时,s/valid? 和 s/explain 产生了不同的结果,但当使用向量时结果相同。当我直接使用 clojure.spec.alpha 创建规范来重现这个问题时,一切正常,因此似乎问题出在 spec-tools 上。无论如何,我认为它应该在所有验证函数中产生相同的结果。

1 答案

+1

选中
 
最佳答案

似乎你已经确定了问题是出在 spec-tools 上,而 clojure.spec.alpha 并不是问题所在。因此,我会向 spec-tools 的 GitHub 提交一个问题。

是的,但我想,即使spec-tools生成无效的spec,在进行验证时 `valid?` 和 `explain` 不应该仍然一致吗?
`spec-tools` 使用了 `spec.alpha` 的私有API,因此有可能创建出看起来像spec但行为不稳定的东西。
我不知道这个。我会在那里报告
...