diff --git a/README.md b/README.md index a980e0a..dca5b8f 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ Puget [![Build Status](https://travis-ci.org/greglook/puget.svg?branch=master)](https://travis-ci.org/greglook/puget) [![Coverage Status](https://coveralls.io/repos/greglook/puget/badge.png?branch=master)](https://coveralls.io/r/greglook/puget?branch=master) -[![Dependency Status](https://www.versioneye.com/user/projects/53718bfb14c1589a89000144/badge.png)](https://www.versioneye.com/clojure/mvxcvi:puget/0.6.3) +[![Dependency Status](https://www.versioneye.com/user/projects/53718bfb14c1589a89000144/badge.png)](https://www.versioneye.com/clojure/mvxcvi:puget/0.6.4) Puget is a Clojure library for printing [EDN](https://github.com/edn-format/edn) values. Under the hood, Puget formats data into a _print document_ and uses the diff --git a/project.clj b/project.clj index 9e15b52..7f5c9b8 100644 --- a/project.clj +++ b/project.clj @@ -1,4 +1,4 @@ -(defproject mvxcvi/puget "0.6.3" +(defproject mvxcvi/puget "0.6.4" :description "Colorizing canonical Clojure printer for EDN values." :url "https://github.com/greglook/puget" :license {:name "Public Domain" diff --git a/src/puget/printer.clj b/src/puget/printer.clj index d3439bb..c74a0ec 100644 --- a/src/puget/printer.clj +++ b/src/puget/printer.clj @@ -277,6 +277,18 @@ (color-doc :symbol (subs (str value) 2))]) +(defmethod canonize clojure.lang.IDeref + [value] + (illegal-when-strict value) + [:span + (color-doc :class-delimiter "#<") + (color-doc :class-name (.getName (class value))) + (color-doc :class-delimiter "@") + (system-id value) " " + (canonize @value) + (color-doc :class-delimiter ">")]) + + (defmethod canonize clojure.lang.Atom [value] (illegal-when-strict value) @@ -289,6 +301,20 @@ (color-doc :class-delimiter ">")]) +(defmethod canonize clojure.lang.IPending + [value] + (illegal-when-strict value) + [:span + (color-doc :class-delimiter "#<") + (color-doc :class-name (.getName (class value))) + (color-doc :class-delimiter "@") + (system-id value) " " + (if (realized? value) + (canonize @value) + (color-doc :nil "pending")) + (color-doc :class-delimiter ">")]) + + (defmethod canonize clojure.lang.Delay [value] (illegal-when-strict value) @@ -317,6 +343,12 @@ (color-doc :class-delimiter ">")]) +(prefer-method canonize clojure.lang.ISeq clojure.lang.IPending) +(prefer-method canonize clojure.lang.IPending clojure.lang.IDeref) +(prefer-method canonize java.util.concurrent.Future clojure.lang.IDeref) +(prefer-method canonize java.util.concurrent.Future clojure.lang.IPending) + + ;;;;; OTHER TYPES ;;;;; diff --git a/test/puget/printer_test.clj b/test/puget/printer_test.clj index f82f11c..9352f56 100644 --- a/test/puget/printer_test.clj +++ b/test/puget/printer_test.clj @@ -63,8 +63,17 @@ (is (= "#puget.printer_test.TestRecord{:bar \\y, :foo \\x}\n" (with-out-str (pprint r))))))) +(deftype ADeref [] + clojure.lang.IDeref + (deref [this] 123)) + +(deftype APending [] + clojure.lang.IPending + (isRealized [this] false)) (deftest clojure-types + (testing "seq" + (is (= "()" (pprint-str (lazy-seq))))) (testing "regex" (let [v #"\d+"] (should-fail-when-strict v) @@ -89,7 +98,18 @@ (should-fail-when-strict v) (is (re-seq #"#" (pprint-str v))) (is (= :done @v)) - (is (re-seq #"#" (pprint-str v)))))) + (is (re-seq #"#" (pprint-str v))))) + (testing "custom IDeref" + (let [v (ADeref.)] + (should-fail-when-strict v) + (is (re-seq #"#" + (pprint-str v))))) + (testing "custom IPending" + (let [v (APending.)] + (should-fail-when-strict v) + (is (re-seq #"#