2016-10-11 11 views
7

Nói rằng tôi có thông số kỹ thuật sau:Sử dụng Clojure Spec với các đơn vị Datomic

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

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

Sau đó, tôi lấy một thực thể từ Datomic:

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

Nếu tôi cố gắng để kiểm tra sự phù hợp với spec nó không thành công vì thực thể không phải là bản đồ:

(s/explain ::person person-entity) 

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

Ứng dụng của tôi có chức năng lấy thực thể làm đối số và muốn void phải sửa đổi các thực thể để bản đồ ở khắp mọi nơi chỉ để có được thiết bị cụ thể để làm việc trong phát triển.

Tôi nên làm cách nào để xác thực các thực thể thông qua thông số kỹ thuật?

+1

Câu hỏi hay. Sau khi bạn tìm thấy một giải pháp cho vấn đề này, bạn sẽ không gặp phải vấn đề với không gian tên? Bản đồ thực thể sẽ là một cái gì đó như: '{: person/name" Mr. Entity "}', mà _not_ xác nhận đối với '(s/keys: req [:: name :: age])' trừ khi những định nghĩa đó xảy ra trong '(ns person)'. Nhưng điều đó buộc bạn phải xác định một loạt các không gian tên gói cấp cao nhất, điều này dường như không hợp lý. – Marc

+0

Cảm ơn @Marc, tôi đã cập nhật ví dụ. – Odinodin

Trả lời

3

Mặc dù đúng là không gian tên của bạn hơi lệch (bạn nên sử dụng: tên/tên thay vì :: tên), cũng có một hạn chế về thông số có thể được dỡ bỏ. Các khóa/s hiện tại yêu cầu tất cả các bộ sưu tập đầu vào phải phù hợp với vị từ clojure.core/keys. Các thực thể Datomic không phải là bản đồ, và do đó không vượt qua kiểm tra đó (và do đó lỗi về các biến vị ngữ map?).

Tôi đã gửi báo cáo lỗi tại đây: http://dev.clojure.org/jira/browse/CLJ-2041 Vui lòng upvote/theo dõi vé nếu bạn muốn.

Các vấn đề liên quan