Odi*_*din 9 clojure datomic clojure.spec
说我有以下规格:
(s/def :person/age number?)
(s/def :person/name string?)
(s/def ::person (s/keys :req [:person/name :person/age]))
Run Code Online (Sandbox Code Playgroud)
然后我从Datomic中获取一个实体:
(def person-entity (d/entity (d/db conn) [:person/name "Mr entity"]))
Run Code Online (Sandbox Code Playgroud)
如果我尝试检查与规范的一致性,它会失败,因为实体不是地图:
(s/explain ::person person-entity)
val: #:db{:id 17592186069950} fails spec: :some-ns/person predicate: map?
Run Code Online (Sandbox Code Playgroud)
我的应用程序具有将实体作为参数的功能,并且希望避免为了使规范工具在开发中工作而必须将实体统一到各地的映射.
我应该如何通过规范验证实体?
尽管您的命名空间确实有点偏离(您应该使用 :person/name 而不是 ::name),但规范中也存在可以解除的限制。目前 s/keys 要求所有输入集合都符合谓词clojure.core/keys。原子实体不是映射,因此不会通过该检查(因此会出现有关谓词的错误map?)。
我在这里提交了一份错误报告:http://dev.clojure.org/jira/browse/CLJ-2041如果您愿意,请随意投票/关注票证。