2016-10-11 4 views
7

у меня есть следующие функции:Использование Clojure Spec с 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? 

Приложение имеет функции, которые принимают сущности как аргументы и хотели бы использовать идентификатор, который должен постоянно судить сущности на картах, только чтобы получить специальное оборудование для разработки.

Как следует проверять объекты через спецификацию?

+1

Хороший вопрос. После того, как вы найдете решение этой проблемы, вы также не столкнетесь с проблемой с пространствами имен? Карту сущности будет что-то типа: '{: person/name" Mr. Entity "}', который делает _not_ validate против '(s/keys: req [:: name :: age])', если эти определения не будут в '(ns person)'. Но это заставляет вас определить кучу пространств имен пакетов верхнего уровня, что не кажется разумным. – Marc

+0

Спасибо @Marc, я обновил этот пример. – Odinodin

ответ

3

Хотя верно, что ваши пространства имен немного выключены (вы должны использовать: person/name вместо :: name), существует также ограничение в спецификации, которое можно было бы снять. В настоящее время s/keys требует, чтобы все входные коллекции соответствовали предикату clojure.core/keys. Датомические объекты не являются картами и поэтому не проходят эту проверку (и, следовательно, ошибку в предикате map?).

Я зарегистрировал отчет об ошибке здесь: http://dev.clojure.org/jira/browse/CLJ-2041 Не стесняйтесь, чтобы поклониться/следовать за билетом, если хотите.