diff options
author | Jakob Odersky <jakob@odersky.com> | 2018-03-08 13:22:07 -0800 |
---|---|---|
committer | Jakob Odersky <jakob@odersky.com> | 2018-03-08 14:31:28 -0800 |
commit | 7cb41b026772855545705a6404c255fdeb8fb64a (patch) | |
tree | bde69016125a53c52881f065ea3840ba93214cd3 | |
parent | 12a761f67da239065a2f305c0e61773eab0f5465 (diff) | |
download | spray-json-7cb41b026772855545705a6404c255fdeb8fb64a.tar.gz spray-json-7cb41b026772855545705a6404c255fdeb8fb64a.tar.bz2 spray-json-7cb41b026772855545705a6404c255fdeb8fb64a.zip |
Cross-compile for Scala- JVM, JS and Native
-rw-r--r-- | build.sbt | 43 | ||||
-rw-r--r-- | js/src/main/boilerplate/spray/json/ProductFormatsInstances.scala.template | 39 | ||||
-rw-r--r-- | js/src/main/scala/spray/json/ProductFormats.scala | 80 | ||||
-rw-r--r-- | jvm/src/test/scala/spray/json/JsonParserSpecJvm.scala | 33 | ||||
l--------- | native/src | 1 | ||||
-rw-r--r-- | shared/src/main/scala/spray/json/AdditionalFormats.scala (renamed from jvm/src/main/scala/spray/json/AdditionalFormats.scala) | 0 | ||||
-rw-r--r-- | shared/src/main/scala/spray/json/BasicFormats.scala (renamed from jvm/src/main/scala/spray/json/BasicFormats.scala) | 0 | ||||
-rw-r--r-- | shared/src/main/scala/spray/json/CollectionFormats.scala (renamed from jvm/src/main/scala/spray/json/CollectionFormats.scala) | 0 | ||||
-rw-r--r-- | shared/src/main/scala/spray/json/CompactPrinter.scala (renamed from jvm/src/main/scala/spray/json/CompactPrinter.scala) | 0 | ||||
-rw-r--r-- | shared/src/main/scala/spray/json/DefaultJsonProtocol.scala (renamed from jvm/src/main/scala/spray/json/DefaultJsonProtocol.scala) | 0 | ||||
-rw-r--r-- | shared/src/main/scala/spray/json/JsValue.scala (renamed from jvm/src/main/scala/spray/json/JsValue.scala) | 0 | ||||
-rw-r--r-- | shared/src/main/scala/spray/json/JsonFormat.scala (renamed from jvm/src/main/scala/spray/json/JsonFormat.scala) | 0 | ||||
-rw-r--r-- | shared/src/main/scala/spray/json/JsonParser.scala (renamed from jvm/src/main/scala/spray/json/JsonParser.scala) | 0 | ||||
-rw-r--r-- | shared/src/main/scala/spray/json/JsonPrinter.scala (renamed from jvm/src/main/scala/spray/json/JsonPrinter.scala) | 0 | ||||
-rw-r--r-- | shared/src/main/scala/spray/json/PrettyPrinter.scala (renamed from jvm/src/main/scala/spray/json/PrettyPrinter.scala) | 0 | ||||
-rw-r--r-- | shared/src/main/scala/spray/json/SortedPrinter.scala (renamed from jvm/src/main/scala/spray/json/SortedPrinter.scala) | 0 | ||||
-rw-r--r-- | shared/src/main/scala/spray/json/StandardFormats.scala (renamed from jvm/src/main/scala/spray/json/StandardFormats.scala) | 0 | ||||
-rw-r--r-- | shared/src/main/scala/spray/json/package.scala (renamed from jvm/src/main/scala/spray/json/package.scala) | 0 | ||||
-rw-r--r-- | shared/src/test/resources/test.json (renamed from jvm/src/test/resources/test.json) | 0 | ||||
-rw-r--r-- | shared/src/test/scala/spray/json/AdditionalFormatsSpec.scala (renamed from jvm/src/test/scala/spray/json/AdditionalFormatsSpec.scala) | 0 | ||||
-rw-r--r-- | shared/src/test/scala/spray/json/BasicFormatsSpec.scala (renamed from jvm/src/test/scala/spray/json/BasicFormatsSpec.scala) | 0 | ||||
-rw-r--r-- | shared/src/test/scala/spray/json/CollectionFormatsSpec.scala (renamed from jvm/src/test/scala/spray/json/CollectionFormatsSpec.scala) | 0 | ||||
-rw-r--r-- | shared/src/test/scala/spray/json/CompactPrinterSpec.scala (renamed from jvm/src/test/scala/spray/json/CompactPrinterSpec.scala) | 3 | ||||
-rw-r--r-- | shared/src/test/scala/spray/json/CustomFormatSpec.scala (renamed from jvm/src/test/scala/spray/json/CustomFormatSpec.scala) | 0 | ||||
-rw-r--r-- | shared/src/test/scala/spray/json/JsonParserSpec.scala (renamed from jvm/src/test/scala/spray/json/JsonParserSpec.scala) | 8 | ||||
-rw-r--r-- | shared/src/test/scala/spray/json/PrettyPrinterSpec.scala (renamed from jvm/src/test/scala/spray/json/PrettyPrinterSpec.scala) | 0 | ||||
-rw-r--r-- | shared/src/test/scala/spray/json/RoundTripSpecs.scala (renamed from jvm/src/test/scala/spray/json/RoundTripSpecs.scala) | 0 | ||||
-rw-r--r-- | shared/src/test/scala/spray/json/SortedPrinterSpec.scala (renamed from jvm/src/test/scala/spray/json/SortedPrinterSpec.scala) | 1 | ||||
-rw-r--r-- | shared/src/test/scala/spray/json/StandardFormatsSpec.scala (renamed from jvm/src/test/scala/spray/json/StandardFormatsSpec.scala) | 0 |
29 files changed, 179 insertions, 29 deletions
@@ -9,8 +9,7 @@ lazy val sprayJson = .settings( name := "spray-json", version := "1.3.4", - crossScalaVersions := Seq("2.10.7", "2.11.12", "2.12.4", "2.13.0-M3"), - scalaVersion := "2.11.12", + scalaVersion := crossScalaVersions.value.head, scalacOptions ++= Seq("-feature", "-language:_", "-unchecked", "-deprecation", "-Xlint", "-encoding", "utf8"), (scalacOptions in doc) ++= Seq("-doc-title", name.value + " " + version.value), libraryDependencies ++= @@ -26,26 +25,30 @@ lazy val sprayJson = CrossVersion.binaryScalaVersion(sV) else sV - } + }, + // Workaround for "Shared resource directory is ignored" + // https://github.com/portable-scala/sbt-crossproject/issues/74 + unmanagedResourceDirectories in Test += (baseDirectory in ThisBuild).value / "shared/src/test/resources" ) - .configurePlatforms(JVMPlatform)( _ - .enablePlugins(spray.boilerplate.BoilerplatePlugin) - .enablePlugins(SbtOsgi) - ) - .jvmSettings( + .enablePlugins(spray.boilerplate.BoilerplatePlugin) + .platformsSettings(JVMPlatform, JSPlatform)( libraryDependencies ++= (CrossVersion.partialVersion(scalaVersion.value) match { case Some((2, 10)) => Seq( - "org.specs2" %% "specs2-core" % "3.8.9" % "test", - "org.specs2" %% "specs2-scalacheck" % "3.8.9" % "test", - "org.scalacheck" %% "scalacheck" % "1.13.4" % "test" + "org.specs2" %%% "specs2-core" % "3.8.9" % "test", + "org.specs2" %%% "specs2-scalacheck" % "3.8.9" % "test", + "org.scalacheck" %%% "scalacheck" % "1.13.4" % "test" ) case Some((2, n)) if n >= 11 => Seq( - "org.specs2" %% "specs2-core" % "4.0.2" % "test", - "org.specs2" %% "specs2-scalacheck" % "4.0.2" % "test", - "org.scalacheck" %% "scalacheck" % "1.13.5" % "test" + "org.specs2" %%% "specs2-core" % "4.0.2" % "test", + "org.specs2" %%% "specs2-scalacheck" % "4.0.2" % "test", + "org.scalacheck" %%% "scalacheck" % "1.13.5" % "test" ) case _ => Nil - }), + }) + ) + .configurePlatforms(JVMPlatform)(_.enablePlugins(SbtOsgi)) + .jvmSettings( + crossScalaVersions := Seq("2.13.0-M3", "2.12.4", "2.11.12", "2.10.7"), OsgiKeys.exportPackage := Seq("""spray.json.*;version="${Bundle-Version}""""), OsgiKeys.importPackage := Seq("""scala.*;version="$<range;[==,=+);%s>"""".format(scalaVersion.value)), OsgiKeys.importPackage ++= Seq("""spray.json;version="${Bundle-Version}"""", "*"), @@ -58,8 +61,14 @@ lazy val sprayJson = ProblemFilters.exclude[ReversedMissingMethodProblem]("spray.json.PrettyPrinter.organiseMembers") ) ) - .jsSettings() - .nativeSettings() // defined in sbt-scala-native + .jsSettings( + crossScalaVersions := Seq("2.12.4", "2.11.12") + ) + .nativeSettings( + crossScalaVersions := Seq("2.11.12"), + // Disable tests in Scala Native until testing frameworks for it become available + unmanagedSourceDirectories in Test := Seq.empty + ) lazy val sprayJsonJVM = sprayJson.jvm lazy val sprayJsonJS = sprayJson.js diff --git a/js/src/main/boilerplate/spray/json/ProductFormatsInstances.scala.template b/js/src/main/boilerplate/spray/json/ProductFormatsInstances.scala.template new file mode 100644 index 0000000..d6f83f7 --- /dev/null +++ b/js/src/main/boilerplate/spray/json/ProductFormatsInstances.scala.template @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2011,2012 Mathias Doenitz, Johannes Rudolph + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package spray.json + +trait ProductFormatsInstances { self: ProductFormats with StandardFormats => +[# // Case classes with 1 parameters + + def jsonFormat[[#P1 :JF#], T <: Product](construct: ([#P1#]) => T, [#fieldName1: String#]): RootJsonFormat[T] = new RootJsonFormat[T]{ + def write(p: T) = { + val fields = new collection.mutable.ListBuffer[(String, JsValue)] + fields.sizeHint(1 * 2) + [#fields ++= productElement##2Field[P1](fieldName1, p, 0)# + ] + JsObject(fields: _*) + } + def read(value: JsValue) = { + [#val p1V = fromField[P1](value, fieldName1)# + ] + construct([#p1V#]) + } + }# + + +] +} diff --git a/js/src/main/scala/spray/json/ProductFormats.scala b/js/src/main/scala/spray/json/ProductFormats.scala new file mode 100644 index 0000000..bc06eac --- /dev/null +++ b/js/src/main/scala/spray/json/ProductFormats.scala @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2011 Mathias Doenitz + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package spray.json + +/** + * Provides the helpers for constructing custom JsonFormat implementations for types implementing the Product trait + * (especially case classes) + */ +trait ProductFormats extends ProductFormatsInstances { + this: StandardFormats => + + def jsonFormat0[T](construct: () => T): RootJsonFormat[T] = + new RootJsonFormat[T] { + def write(p: T) = JsObject() + def read(value: JsValue) = value match { + case JsObject(_) => construct() + case _ => throw new DeserializationException("Object expected") + } + } + + // helpers + + protected def productElement2Field[T](fieldName: String, p: Product, ix: Int, rest: List[JsField] = Nil) + (implicit writer: JsonWriter[T]): List[JsField] = { + val value = p.productElement(ix).asInstanceOf[T] + writer match { + case _: OptionFormat[_] if (value == None) => rest + case _ => (fieldName, writer.write(value)) :: rest + } + } + + protected def fromField[T](value: JsValue, fieldName: String) + (implicit reader: JsonReader[T]) = value match { + case x: JsObject if + (reader.isInstanceOf[OptionFormat[_]] & + !x.fields.contains(fieldName)) => + None.asInstanceOf[T] + case x: JsObject => + try reader.read(x.fields(fieldName)) + catch { + case e: NoSuchElementException => + deserializationError("Object is missing required member '" + fieldName + "'", e, fieldName :: Nil) + case DeserializationException(msg, cause, fieldNames) => + deserializationError(msg, cause, fieldName :: fieldNames) + } + case _ => deserializationError("Object expected in field '" + fieldName + "'", fieldNames = fieldName :: Nil) + } + +} + +/** + * This trait supplies an alternative rendering mode for optional case class members. + * Normally optional members that are undefined (`None`) are not rendered at all. + * By mixing in this trait into your custom JsonProtocol you can enforce the rendering of undefined members as `null`. + * (Note that this only affect JSON writing, spray-json will always read missing optional members as well as `null` + * optional members as `None`.) + */ +trait NullOptions extends ProductFormats { + this: StandardFormats => + + override protected def productElement2Field[T](fieldName: String, p: Product, ix: Int, rest: List[JsField]) + (implicit writer: JsonWriter[T]) = { + val value = p.productElement(ix).asInstanceOf[T] + (fieldName, writer.write(value)) :: rest + } +} diff --git a/jvm/src/test/scala/spray/json/JsonParserSpecJvm.scala b/jvm/src/test/scala/spray/json/JsonParserSpecJvm.scala new file mode 100644 index 0000000..cf163b3 --- /dev/null +++ b/jvm/src/test/scala/spray/json/JsonParserSpecJvm.scala @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2011 Mathias Doenitz + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package spray.json + +import org.specs2.mutable._ + +class JsonParserSpecJvm extends Specification { + + "The JsonParser (on the JVM)" should { + "be reentrant" in { + val largeJsonSource = scala.io.Source.fromInputStream(getClass.getResourceAsStream("/test.json")).mkString + import scala.collection.parallel.immutable.ParSeq + ParSeq.fill(20)(largeJsonSource).map(JsonParser(_)).toList.map { + _.asInstanceOf[JsObject].fields("questions").asInstanceOf[JsArray].elements.size + } === List.fill(20)(100) + } + } + +} diff --git a/native/src b/native/src new file mode 120000 index 0000000..f2bb155 --- /dev/null +++ b/native/src @@ -0,0 +1 @@ +../js/src/
\ No newline at end of file diff --git a/jvm/src/main/scala/spray/json/AdditionalFormats.scala b/shared/src/main/scala/spray/json/AdditionalFormats.scala index fbabb0b..fbabb0b 100644 --- a/jvm/src/main/scala/spray/json/AdditionalFormats.scala +++ b/shared/src/main/scala/spray/json/AdditionalFormats.scala diff --git a/jvm/src/main/scala/spray/json/BasicFormats.scala b/shared/src/main/scala/spray/json/BasicFormats.scala index 65b9ecb..65b9ecb 100644 --- a/jvm/src/main/scala/spray/json/BasicFormats.scala +++ b/shared/src/main/scala/spray/json/BasicFormats.scala diff --git a/jvm/src/main/scala/spray/json/CollectionFormats.scala b/shared/src/main/scala/spray/json/CollectionFormats.scala index 24ab1dd..24ab1dd 100644 --- a/jvm/src/main/scala/spray/json/CollectionFormats.scala +++ b/shared/src/main/scala/spray/json/CollectionFormats.scala diff --git a/jvm/src/main/scala/spray/json/CompactPrinter.scala b/shared/src/main/scala/spray/json/CompactPrinter.scala index a51583d..a51583d 100644 --- a/jvm/src/main/scala/spray/json/CompactPrinter.scala +++ b/shared/src/main/scala/spray/json/CompactPrinter.scala diff --git a/jvm/src/main/scala/spray/json/DefaultJsonProtocol.scala b/shared/src/main/scala/spray/json/DefaultJsonProtocol.scala index 4c93184..4c93184 100644 --- a/jvm/src/main/scala/spray/json/DefaultJsonProtocol.scala +++ b/shared/src/main/scala/spray/json/DefaultJsonProtocol.scala diff --git a/jvm/src/main/scala/spray/json/JsValue.scala b/shared/src/main/scala/spray/json/JsValue.scala index 08a673b..08a673b 100644 --- a/jvm/src/main/scala/spray/json/JsValue.scala +++ b/shared/src/main/scala/spray/json/JsValue.scala diff --git a/jvm/src/main/scala/spray/json/JsonFormat.scala b/shared/src/main/scala/spray/json/JsonFormat.scala index c4915cc..c4915cc 100644 --- a/jvm/src/main/scala/spray/json/JsonFormat.scala +++ b/shared/src/main/scala/spray/json/JsonFormat.scala diff --git a/jvm/src/main/scala/spray/json/JsonParser.scala b/shared/src/main/scala/spray/json/JsonParser.scala index 71c4c11..71c4c11 100644 --- a/jvm/src/main/scala/spray/json/JsonParser.scala +++ b/shared/src/main/scala/spray/json/JsonParser.scala diff --git a/jvm/src/main/scala/spray/json/JsonPrinter.scala b/shared/src/main/scala/spray/json/JsonPrinter.scala index 258fc5a..258fc5a 100644 --- a/jvm/src/main/scala/spray/json/JsonPrinter.scala +++ b/shared/src/main/scala/spray/json/JsonPrinter.scala diff --git a/jvm/src/main/scala/spray/json/PrettyPrinter.scala b/shared/src/main/scala/spray/json/PrettyPrinter.scala index 6af5443..6af5443 100644 --- a/jvm/src/main/scala/spray/json/PrettyPrinter.scala +++ b/shared/src/main/scala/spray/json/PrettyPrinter.scala diff --git a/jvm/src/main/scala/spray/json/SortedPrinter.scala b/shared/src/main/scala/spray/json/SortedPrinter.scala index 28db225..28db225 100644 --- a/jvm/src/main/scala/spray/json/SortedPrinter.scala +++ b/shared/src/main/scala/spray/json/SortedPrinter.scala diff --git a/jvm/src/main/scala/spray/json/StandardFormats.scala b/shared/src/main/scala/spray/json/StandardFormats.scala index e59de64..e59de64 100644 --- a/jvm/src/main/scala/spray/json/StandardFormats.scala +++ b/shared/src/main/scala/spray/json/StandardFormats.scala diff --git a/jvm/src/main/scala/spray/json/package.scala b/shared/src/main/scala/spray/json/package.scala index 37d63c2..37d63c2 100644 --- a/jvm/src/main/scala/spray/json/package.scala +++ b/shared/src/main/scala/spray/json/package.scala diff --git a/jvm/src/test/resources/test.json b/shared/src/test/resources/test.json index 8308d37..8308d37 100644 --- a/jvm/src/test/resources/test.json +++ b/shared/src/test/resources/test.json diff --git a/jvm/src/test/scala/spray/json/AdditionalFormatsSpec.scala b/shared/src/test/scala/spray/json/AdditionalFormatsSpec.scala index eafceb2..eafceb2 100644 --- a/jvm/src/test/scala/spray/json/AdditionalFormatsSpec.scala +++ b/shared/src/test/scala/spray/json/AdditionalFormatsSpec.scala diff --git a/jvm/src/test/scala/spray/json/BasicFormatsSpec.scala b/shared/src/test/scala/spray/json/BasicFormatsSpec.scala index 8417df2..8417df2 100644 --- a/jvm/src/test/scala/spray/json/BasicFormatsSpec.scala +++ b/shared/src/test/scala/spray/json/BasicFormatsSpec.scala diff --git a/jvm/src/test/scala/spray/json/CollectionFormatsSpec.scala b/shared/src/test/scala/spray/json/CollectionFormatsSpec.scala index 3d953bb..3d953bb 100644 --- a/jvm/src/test/scala/spray/json/CollectionFormatsSpec.scala +++ b/shared/src/test/scala/spray/json/CollectionFormatsSpec.scala diff --git a/jvm/src/test/scala/spray/json/CompactPrinterSpec.scala b/shared/src/test/scala/spray/json/CompactPrinterSpec.scala index 6a9560b..691daa9 100644 --- a/jvm/src/test/scala/spray/json/CompactPrinterSpec.scala +++ b/shared/src/test/scala/spray/json/CompactPrinterSpec.scala @@ -39,9 +39,6 @@ class CompactPrinterSpec extends Specification { "print JsNumber(1.23) to '1.23'" in { CompactPrinter(JsNumber(1.23)) mustEqual "1.23" } - "print JsNumber(-1E10) to '-1E10'" in { - CompactPrinter(JsNumber(-1E10)) mustEqual "-1.0E+10" - } "print JsNumber(12.34e-10) to '12.34e-10'" in { CompactPrinter(JsNumber(12.34e-10)) mustEqual "1.234E-9" } diff --git a/jvm/src/test/scala/spray/json/CustomFormatSpec.scala b/shared/src/test/scala/spray/json/CustomFormatSpec.scala index 2397abc..2397abc 100644 --- a/jvm/src/test/scala/spray/json/CustomFormatSpec.scala +++ b/shared/src/test/scala/spray/json/CustomFormatSpec.scala diff --git a/jvm/src/test/scala/spray/json/JsonParserSpec.scala b/shared/src/test/scala/spray/json/JsonParserSpec.scala index a97f021..ddb53d3 100644 --- a/jvm/src/test/scala/spray/json/JsonParserSpec.scala +++ b/shared/src/test/scala/spray/json/JsonParserSpec.scala @@ -72,14 +72,6 @@ class JsonParserSpec extends Specification { val json = JsString("£0.99") JsonParser(json.prettyPrint.getBytes("UTF-8")) === json } - "be reentrant" in { - val largeJsonSource = scala.io.Source.fromInputStream(getClass.getResourceAsStream("/test.json")).mkString - import scala.collection.parallel.immutable.ParSeq - ParSeq.fill(20)(largeJsonSource).map(JsonParser(_)).toList.map { - _.asInstanceOf[JsObject].fields("questions").asInstanceOf[JsArray].elements.size - } === List.fill(20)(100) - } - "produce proper error messages" in { def errorMessage(input: String) = try JsonParser(input) catch { case e: JsonParser.ParsingException => e.getMessage } diff --git a/jvm/src/test/scala/spray/json/PrettyPrinterSpec.scala b/shared/src/test/scala/spray/json/PrettyPrinterSpec.scala index 6354ef0..6354ef0 100644 --- a/jvm/src/test/scala/spray/json/PrettyPrinterSpec.scala +++ b/shared/src/test/scala/spray/json/PrettyPrinterSpec.scala diff --git a/jvm/src/test/scala/spray/json/RoundTripSpecs.scala b/shared/src/test/scala/spray/json/RoundTripSpecs.scala index 6bee7b4..6bee7b4 100644 --- a/jvm/src/test/scala/spray/json/RoundTripSpecs.scala +++ b/shared/src/test/scala/spray/json/RoundTripSpecs.scala diff --git a/jvm/src/test/scala/spray/json/SortedPrinterSpec.scala b/shared/src/test/scala/spray/json/SortedPrinterSpec.scala index 3a5e3ed..f91640e 100644 --- a/jvm/src/test/scala/spray/json/SortedPrinterSpec.scala +++ b/shared/src/test/scala/spray/json/SortedPrinterSpec.scala @@ -16,7 +16,6 @@ package spray.json -import scala.collection.immutable.ListMap import org.specs2.mutable._ class SortedPrinterSpec extends Specification { diff --git a/jvm/src/test/scala/spray/json/StandardFormatsSpec.scala b/shared/src/test/scala/spray/json/StandardFormatsSpec.scala index 833f06a..833f06a 100644 --- a/jvm/src/test/scala/spray/json/StandardFormatsSpec.scala +++ b/shared/src/test/scala/spray/json/StandardFormatsSpec.scala |