2016-10-11 43 views
7

說我有以下規格:使用Clojure的規格與Datomic實體

(s/def :person/age number?) 
(s/def :person/name string?) 

(s/def ::person (s/keys :req [:person/name :person/age])) 

然後我從Datomic提取實體:

(def person-entity (d/entity (d/db conn) [:person/name "Mr entity"])) 

如果我嘗試用它失敗,因爲該規範檢查一致性實體不是地圖:

(s/explain ::person person-entity) 

val: #:db{:id 17592186069950} fails spec: :some-ns/person predicate: map? 

我的應用程序具有以實體作爲參數並希望void必須將實體化爲映射到各處才能讓spec規範工具在開發中工作。

我應該如何通過規範驗證實體?

+1

好問題。找到這個問題的解決方案之後,難道你不會遇到命名空間的問題嗎?實體映射將如下所示:'{:person/name「Mr. Entity」}',除非這些定義碰巧是''(s/keys:req [:: name :: age]),在'(ns person)'中。但是這迫使你定義一堆頂級包名稱空間,這看起來不合理。 – Marc

+0

Thanks @Marc,我已經更新了這個例子。 – Odinodin

回答

3

雖然確實您的名字空間有點偏離(您應該使用:person/name而不是:: name),但規範中也有一個限制可以解除。目前s/keys要求所有輸入集合符合clojure.core/keys謂詞。 Datomic實體不是地圖,因此不通過該檢查(因此也就是關於謂詞的錯誤)。

我已經在這裏提交了一個錯誤報告:http://dev.clojure.org/jira/browse/CLJ-2041如果您願意,可以隨時upvote/follow the ticket。