From 33b8f544608a0e83e8f80538d815a7fb6f8bbe32 Mon Sep 17 00:00:00 2001 From: "Michael S. Klishin" Date: Fri, 7 Sep 2012 00:48:18 +0400 Subject: [PATCH] Cheshire support for monger.json and monger.joda-time --- ChangeLog.md | 10 ++++++- project.clj | 4 ++- src/clojure/monger/joda_time.clj | 8 +----- src/clojure/monger/json.clj | 34 ++++++++++++++++++----- test/monger/test/lib_integration_test.clj | 27 ++++++++++++------ 5 files changed, 59 insertions(+), 24 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 9bc18ae..e93bb95 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,6 +1,14 @@ ## Changes between 1.2.0 and 1.3.0 -No changes yet. +### Cheshire Support + +`monger.json` and `monger.joda-time` will now use [Cheshire](https://github.com/dakrone/cheshire) if it is available. [clojure.data.json](https://github.com/clojure/data.json) +is no longer a hard dependency (but still supported if available). + + +### ClojureWerkz Support 0.7.0 + +ClojureWerkz Support dependency has been updated to version `0.7.0`. diff --git a/project.clj b/project.clj index d28753e..92897d7 100644 --- a/project.clj +++ b/project.clj @@ -6,7 +6,7 @@ :dependencies [[org.clojure/clojure "1.4.0"] [org.mongodb/mongo-java-driver "2.9.0"] [com.novemberain/validateur "1.2.0"] - [clojurewerkz/support "0.6.0"] + [clojurewerkz/support "0.7.0"] [ragtime/ragtime.core "0.2.0"]] :test-selectors {:default (fn [m] (and (not (:performance m)) @@ -19,6 +19,7 @@ :cache :cache :gridfs :gridfs :command :command + :integration :integration :performance :performance ;; as in, edge mongodb server :edge-features :edge-features @@ -41,6 +42,7 @@ :dev {:resource-paths ["test/resources"] :dependencies [[clj-time "0.4.2" :exclusions [org.clojure/clojure]] [org.clojure/data.json "0.1.2" :exclusions [org.clojure/clojure]] + [cheshire "4.0.2" :exclusions [org.clojure/clojure]] [org.clojure/tools.cli "0.2.1" :exclusions [org.clojure/clojure]] [org.clojure/core.cache "0.6.0" :exclusions [org.clojure/clojure]] [ring/ring-core "1.1.0"]] diff --git a/src/clojure/monger/joda_time.clj b/src/clojure/monger/joda_time.clj index 2d03a06..b957349 100644 --- a/src/clojure/monger/joda_time.clj +++ b/src/clojure/monger/joda_time.clj @@ -60,10 +60,4 @@ ;; JSON serialization ;; -(try - ;; try to load clojure.data.json. If available, load CLJW Support - ;; extensions. - (require 'clojure.data.json) - (require 'clojurewerkz.support.json) - (catch Throwable _ - false)) \ No newline at end of file +(require 'clojurewerkz.support.json) diff --git a/src/clojure/monger/json.clj b/src/clojure/monger/json.clj index 84cf27d..908347b 100644 --- a/src/clojure/monger/json.clj +++ b/src/clojure/monger/json.clj @@ -10,15 +10,35 @@ (ns ^{:doc "Provides clojure.data.json/Write-JSON protocol extension for MongoDB-specific types, such as org.bson.types.ObjectId"} monger.json - (:import org.bson.types.ObjectId) - (:require [clojure.data.json :as json] - clojurewerkz.support.json)) + (:import org.bson.types.ObjectId)) ;; ;; API ;; -(extend-protocol json/Write-JSON - ObjectId - (write-json [^ObjectId object out escape-unicode?] - (json/write-json (.toString object) out escape-unicode?))) +(require 'clojurewerkz.support.json) + +(try + (require 'clojure.data.json) + (catch Throwable t + false)) + +(try + (extend-protocol clojure.data.json/Write-JSON + ObjectId + (write-json [^ObjectId object out escape-unicode?] + (clojure.data.json/write-json (.toString object) out escape-unicode?))) + (catch Throwable _ + false)) + +(try + (require 'cheshire.custom) + (catch Throwable t + false)) + +(try + (cheshire.custom/add-encoder ObjectId + (fn [^ObjectId oid ^com.fasterxml.jackson.core.json.WriterBasedJsonGenerator generator] + (.writeString generator (.toString oid)))) + (catch Throwable t + false)) diff --git a/test/monger/test/lib_integration_test.clj b/test/monger/test/lib_integration_test.clj index a111991..c2c4013 100644 --- a/test/monger/test/lib_integration_test.clj +++ b/test/monger/test/lib_integration_test.clj @@ -7,36 +7,47 @@ (:require monger.json monger.joda-time [clojure.data.json :as json] - [clj-time.core :as t])) + [clj-time.core :as t] + [cheshire.custom :as json2])) -(deftest serialization-of-joda-datetime-to-json-with-clojure-data-json - (is (= "\"2011-10-13T23:55:00.000Z\"" (json/json-str (t/date-time 2011 10 13 23 55 0))))) +(deftest ^{:integration true} serialization-of-joda-datetime-to-json + (let [dt (t/date-time 2011 10 13 23 55 0)] + (is (= "\"2011-10-13T23:55:00.000Z\"" + (json/json-str dt) + (json2/encode dt))))) -(deftest serialization-of-object-id-to-json-with-clojure-data-json +(deftest ^{:integration true} serialization-of-joda-date-to-json + (let [d (.toDate (t/date-time 2011 10 13 23 55 0))] + (is (= "\"2011-10-13T23:55:00.000Z\"" + (json/json-str d))) + (is (= "\"2011-10-13T23:55:00Z\"" + (json2/encode d))))) + +(deftest ^{:integration true} serialization-of-object-id-to-json-with-clojure-data-json (is (= "\"4ec2d1a6b55634a935ea4ac8\"" (json/json-str (ObjectId. "4ec2d1a6b55634a935ea4ac8"))))) -(deftest conversion-of-joda-datetime-to-db-object +(deftest ^{:integration true} conversion-of-joda-datetime-to-db-object (let [d (to-db-object (t/date-time 2011 10 13 23 55 0))] (is (instance? java.util.Date d)) (is (= 1318550100000 (.getTime ^java.util.Date d))))) -(deftest conversion-of-joda-datemidnight-to-db-object +(deftest ^{:integration true} conversion-of-joda-datemidnight-to-db-object (let [d (to-db-object (DateMidnight. (t/date-time 2011 10 13)))] (is (instance? java.util.Date d)) (is (= 1318464000000 (.getTime ^java.util.Date d))))) -(deftest conversion-of-java-util-date-to-joda-datetime +(deftest ^{:integration true} conversion-of-java-util-date-to-joda-datetime (let [input (.toDate ^DateTime (t/date-time 2011 10 13 23 55 0)) output (from-db-object input false)] (is (instance? org.joda.time.DateTime output)) (is (= input (.toDate ^DateTime output))))) -(deftest test-reader-extensions +(deftest ^{:integration true} test-reader-extensions (let [^DateTime d (t/date-time 2011 10 13 23 55 0)] (binding [*print-dup* true] (pr-str d))))