From ab08e1a9d551fb1d647f0486cfdbc2427f5244a9 Mon Sep 17 00:00:00 2001 From: Dale Wijnand Date: Thu, 24 Nov 2016 15:48:47 +0000 Subject: [PATCH 1/4] Add back additional formats. At least a subset of these are required for sbt/sbt to migrate away from sbinary. This reverts commit cee43575ce3988b1565489db3166281cd7899cde. --- .../sbt/internal/util/AdditionalFormats.scala | 71 +++++++++++++++++++ .../sbt/internal/util/CacheImplicits.scala | 5 ++ 2 files changed, 76 insertions(+) create mode 100644 internal/util-cache/src/main/scala/sbt/internal/util/AdditionalFormats.scala diff --git a/internal/util-cache/src/main/scala/sbt/internal/util/AdditionalFormats.scala b/internal/util-cache/src/main/scala/sbt/internal/util/AdditionalFormats.scala new file mode 100644 index 000000000..8008cf90a --- /dev/null +++ b/internal/util-cache/src/main/scala/sbt/internal/util/AdditionalFormats.scala @@ -0,0 +1,71 @@ +package sbt.internal.util + +import sbt.internal.util.Types.:+: + +import sjsonnew.{ Builder, deserializationError, JsonFormat, Unbuilder } +import sjsonnew.BasicJsonProtocol, BasicJsonProtocol.asSingleton + +import java.io.{ ByteArrayInputStream, ByteArrayOutputStream, File, InputStream, OutputStream } + +import java.net.{ URI, URL } + +trait URIFormat { self: BasicJsonProtocol => + implicit def URIFormat: JsonFormat[URI] = project(_.toString, new URI(_: String)) +} + +trait URLFormat { self: BasicJsonProtocol => + implicit def URLFormat: JsonFormat[URL] = project(_.toString, new URL(_: String)) +} + +trait FileFormat { self: BasicJsonProtocol => + implicit def FileFormat: JsonFormat[File] = project(_.toString, new File(_: String)) +} + +trait SetFormat { self: BasicJsonProtocol => + implicit def SetFormat[T: JsonFormat]: JsonFormat[Set[T]] = project(_.toSeq, (_: Seq[T]).toSet) +} + +trait HListFormat { + implicit def HConsFormat[H: JsonFormat, T <: HList: JsonFormat]: JsonFormat[H :+: T] = + new JsonFormat[H :+: T] { + override def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): H :+: T = + jsOpt match { + case Some(js) => + unbuilder.beginObject(js) + val h = unbuilder.readField[H]("h") + val t = unbuilder.readField[T]("t") + unbuilder.endObject() + + HCons(h, t) + + case None => + deserializationError("Expect JValue but found None") + } + + override def write[J](obj: H :+: T, builder: Builder[J]): Unit = { + builder.beginObject() + builder.addField("h", obj.head) + builder.addField("t", obj.tail) + builder.endObject() + } + } + + implicit val HNilFormat: JsonFormat[HNil] = asSingleton(HNil) + +} + +trait StreamFormat { self: BasicJsonProtocol => + def streamFormat[T](write: (T, OutputStream) => Unit, read: InputStream => T): JsonFormat[T] = { + lazy val byteArrayFormat = implicitly[JsonFormat[Array[Byte]]] + val toBytes = (t: T) => { val bos = new ByteArrayOutputStream(); write(t, bos); bos.toByteArray } + val fromBytes = (bs: Array[Byte]) => read(new ByteArrayInputStream(bs)) + + new JsonFormat[T] { + override def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): T = + fromBytes(byteArrayFormat.read(jsOpt, unbuilder)) + + override def write[J](obj: T, builder: Builder[J]): Unit = + byteArrayFormat.write(toBytes(obj), builder) + } + } +} diff --git a/internal/util-cache/src/main/scala/sbt/internal/util/CacheImplicits.scala b/internal/util-cache/src/main/scala/sbt/internal/util/CacheImplicits.scala index 78e6e301c..0ebdf134b 100644 --- a/internal/util-cache/src/main/scala/sbt/internal/util/CacheImplicits.scala +++ b/internal/util-cache/src/main/scala/sbt/internal/util/CacheImplicits.scala @@ -4,3 +4,8 @@ import sjsonnew.BasicJsonProtocol object CacheImplicits extends BasicCacheImplicits with BasicJsonProtocol + with FileFormat + with HListFormat + with URIFormat + with URLFormat + with StreamFormat From ab9165ab0425fab4406aabd6133da32bcff63c6f Mon Sep 17 00:00:00 2001 From: Dale Wijnand Date: Fri, 25 Nov 2016 21:24:39 +0000 Subject: [PATCH 2/4] Remove formats already present upstream in sjson-new --- .../sbt/internal/util/AdditionalFormats.scala | 20 +------------------ .../sbt/internal/util/CacheImplicits.scala | 3 --- 2 files changed, 1 insertion(+), 22 deletions(-) diff --git a/internal/util-cache/src/main/scala/sbt/internal/util/AdditionalFormats.scala b/internal/util-cache/src/main/scala/sbt/internal/util/AdditionalFormats.scala index 8008cf90a..7ec9ecf17 100644 --- a/internal/util-cache/src/main/scala/sbt/internal/util/AdditionalFormats.scala +++ b/internal/util-cache/src/main/scala/sbt/internal/util/AdditionalFormats.scala @@ -5,25 +5,7 @@ import sbt.internal.util.Types.:+: import sjsonnew.{ Builder, deserializationError, JsonFormat, Unbuilder } import sjsonnew.BasicJsonProtocol, BasicJsonProtocol.asSingleton -import java.io.{ ByteArrayInputStream, ByteArrayOutputStream, File, InputStream, OutputStream } - -import java.net.{ URI, URL } - -trait URIFormat { self: BasicJsonProtocol => - implicit def URIFormat: JsonFormat[URI] = project(_.toString, new URI(_: String)) -} - -trait URLFormat { self: BasicJsonProtocol => - implicit def URLFormat: JsonFormat[URL] = project(_.toString, new URL(_: String)) -} - -trait FileFormat { self: BasicJsonProtocol => - implicit def FileFormat: JsonFormat[File] = project(_.toString, new File(_: String)) -} - -trait SetFormat { self: BasicJsonProtocol => - implicit def SetFormat[T: JsonFormat]: JsonFormat[Set[T]] = project(_.toSeq, (_: Seq[T]).toSet) -} +import java.io.{ ByteArrayInputStream, ByteArrayOutputStream, InputStream, OutputStream } trait HListFormat { implicit def HConsFormat[H: JsonFormat, T <: HList: JsonFormat]: JsonFormat[H :+: T] = diff --git a/internal/util-cache/src/main/scala/sbt/internal/util/CacheImplicits.scala b/internal/util-cache/src/main/scala/sbt/internal/util/CacheImplicits.scala index 0ebdf134b..b3d660074 100644 --- a/internal/util-cache/src/main/scala/sbt/internal/util/CacheImplicits.scala +++ b/internal/util-cache/src/main/scala/sbt/internal/util/CacheImplicits.scala @@ -4,8 +4,5 @@ import sjsonnew.BasicJsonProtocol object CacheImplicits extends BasicCacheImplicits with BasicJsonProtocol - with FileFormat with HListFormat - with URIFormat - with URLFormat with StreamFormat From bcd5e800c4526e705b659bd743e9601d25c68172 Mon Sep 17 00:00:00 2001 From: Dale Wijnand Date: Mon, 28 Nov 2016 11:11:10 +0000 Subject: [PATCH 3/4] Remove InputStream/OutputStream support --- .../sbt/internal/util/AdditionalFormats.scala | 19 ------------------- .../sbt/internal/util/CacheImplicits.scala | 1 - 2 files changed, 20 deletions(-) diff --git a/internal/util-cache/src/main/scala/sbt/internal/util/AdditionalFormats.scala b/internal/util-cache/src/main/scala/sbt/internal/util/AdditionalFormats.scala index 7ec9ecf17..34fbbcab7 100644 --- a/internal/util-cache/src/main/scala/sbt/internal/util/AdditionalFormats.scala +++ b/internal/util-cache/src/main/scala/sbt/internal/util/AdditionalFormats.scala @@ -5,8 +5,6 @@ import sbt.internal.util.Types.:+: import sjsonnew.{ Builder, deserializationError, JsonFormat, Unbuilder } import sjsonnew.BasicJsonProtocol, BasicJsonProtocol.asSingleton -import java.io.{ ByteArrayInputStream, ByteArrayOutputStream, InputStream, OutputStream } - trait HListFormat { implicit def HConsFormat[H: JsonFormat, T <: HList: JsonFormat]: JsonFormat[H :+: T] = new JsonFormat[H :+: T] { @@ -33,21 +31,4 @@ trait HListFormat { } implicit val HNilFormat: JsonFormat[HNil] = asSingleton(HNil) - -} - -trait StreamFormat { self: BasicJsonProtocol => - def streamFormat[T](write: (T, OutputStream) => Unit, read: InputStream => T): JsonFormat[T] = { - lazy val byteArrayFormat = implicitly[JsonFormat[Array[Byte]]] - val toBytes = (t: T) => { val bos = new ByteArrayOutputStream(); write(t, bos); bos.toByteArray } - val fromBytes = (bs: Array[Byte]) => read(new ByteArrayInputStream(bs)) - - new JsonFormat[T] { - override def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): T = - fromBytes(byteArrayFormat.read(jsOpt, unbuilder)) - - override def write[J](obj: T, builder: Builder[J]): Unit = - byteArrayFormat.write(toBytes(obj), builder) - } - } } diff --git a/internal/util-cache/src/main/scala/sbt/internal/util/CacheImplicits.scala b/internal/util-cache/src/main/scala/sbt/internal/util/CacheImplicits.scala index b3d660074..00bb6beaa 100644 --- a/internal/util-cache/src/main/scala/sbt/internal/util/CacheImplicits.scala +++ b/internal/util-cache/src/main/scala/sbt/internal/util/CacheImplicits.scala @@ -5,4 +5,3 @@ import sjsonnew.BasicJsonProtocol object CacheImplicits extends BasicCacheImplicits with BasicJsonProtocol with HListFormat - with StreamFormat From 998cffd9ab304e6b36e019a861fd31d9ca1a50ed Mon Sep 17 00:00:00 2001 From: Dale Wijnand Date: Mon, 28 Nov 2016 17:16:20 +0000 Subject: [PATCH 4/4] Change hlist format to serialise to flat array --- build.sbt | 2 + .../sbt/internal/util/AdditionalFormats.scala | 34 ----------------- .../scala/sbt/internal/util/HListFormat.scala | 37 +++++++++++++++++++ .../src/test/scala/HListFormatSpec.scala | 26 +++++++++++++ project/Dependencies.scala | 2 +- 5 files changed, 66 insertions(+), 35 deletions(-) delete mode 100644 internal/util-cache/src/main/scala/sbt/internal/util/AdditionalFormats.scala create mode 100644 internal/util-cache/src/main/scala/sbt/internal/util/HListFormat.scala create mode 100644 internal/util-cache/src/test/scala/HListFormatSpec.scala diff --git a/build.sbt b/build.sbt index c08b7a214..5c41d937c 100644 --- a/build.sbt +++ b/build.sbt @@ -17,6 +17,8 @@ def commonSettings: Seq[Setting[_]] = Seq( scalacOptions ++= Seq("-Ywarn-unused", "-Ywarn-unused-import"), scalacOptions --= // scalac 2.10 rejects some HK types under -Xfuture it seems.. (CrossVersion partialVersion scalaVersion.value collect { case (2, 10) => List("-Xfuture", "-Ywarn-unused", "-Ywarn-unused-import") }).toList.flatten, + scalacOptions in console in Compile -= "-Ywarn-unused-import", + scalacOptions in console in Test -= "-Ywarn-unused-import", previousArtifact := None, // Some(organization.value %% moduleName.value % "1.0.0"), publishArtifact in Compile := true, publishArtifact in Test := false diff --git a/internal/util-cache/src/main/scala/sbt/internal/util/AdditionalFormats.scala b/internal/util-cache/src/main/scala/sbt/internal/util/AdditionalFormats.scala deleted file mode 100644 index 34fbbcab7..000000000 --- a/internal/util-cache/src/main/scala/sbt/internal/util/AdditionalFormats.scala +++ /dev/null @@ -1,34 +0,0 @@ -package sbt.internal.util - -import sbt.internal.util.Types.:+: - -import sjsonnew.{ Builder, deserializationError, JsonFormat, Unbuilder } -import sjsonnew.BasicJsonProtocol, BasicJsonProtocol.asSingleton - -trait HListFormat { - implicit def HConsFormat[H: JsonFormat, T <: HList: JsonFormat]: JsonFormat[H :+: T] = - new JsonFormat[H :+: T] { - override def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): H :+: T = - jsOpt match { - case Some(js) => - unbuilder.beginObject(js) - val h = unbuilder.readField[H]("h") - val t = unbuilder.readField[T]("t") - unbuilder.endObject() - - HCons(h, t) - - case None => - deserializationError("Expect JValue but found None") - } - - override def write[J](obj: H :+: T, builder: Builder[J]): Unit = { - builder.beginObject() - builder.addField("h", obj.head) - builder.addField("t", obj.tail) - builder.endObject() - } - } - - implicit val HNilFormat: JsonFormat[HNil] = asSingleton(HNil) -} diff --git a/internal/util-cache/src/main/scala/sbt/internal/util/HListFormat.scala b/internal/util-cache/src/main/scala/sbt/internal/util/HListFormat.scala new file mode 100644 index 000000000..82ecf9ba3 --- /dev/null +++ b/internal/util-cache/src/main/scala/sbt/internal/util/HListFormat.scala @@ -0,0 +1,37 @@ +package sbt.internal.util + +import sjsonnew._ +import Types.:+: + +trait HListFormat { + implicit val lnilFormat1: JsonFormat[HNil] = forHNil(HNil) + implicit val lnilFormat2: JsonFormat[HNil.type] = forHNil(HNil) + + private def forHNil[A <: HNil](hnil: A): JsonFormat[A] = new JsonFormat[A] { + def write[J](x: A, builder: Builder[J]): Unit = { + if (builder.state != BuilderState.InArray) builder.beginArray() + builder.endArray() + } + + def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): A = { + if (unbuilder.state == UnbuilderState.InArray) unbuilder.endArray() + hnil + } + } + + implicit def hconsFormat[H, T <: HList](implicit hf: JsonFormat[H], tf: JsonFormat[T]): JsonFormat[H :+: T] = + new JsonFormat[H :+: T] { + def write[J](hcons: H :+: T, builder: Builder[J]) = { + if (builder.state != BuilderState.InArray) builder.beginArray() + hf.write(hcons.head, builder) + tf.write(hcons.tail, builder) + } + + def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]) = jsOpt match { + case None => HCons(hf.read(None, unbuilder), tf.read(None, unbuilder)) + case Some(js) => + if (unbuilder.state != UnbuilderState.InArray) unbuilder.beginArray(js) + HCons(hf.read(Some(unbuilder.nextElement), unbuilder), tf.read(Some(js), unbuilder)) + } + } +} diff --git a/internal/util-cache/src/test/scala/HListFormatSpec.scala b/internal/util-cache/src/test/scala/HListFormatSpec.scala new file mode 100644 index 000000000..23e4cde0f --- /dev/null +++ b/internal/util-cache/src/test/scala/HListFormatSpec.scala @@ -0,0 +1,26 @@ +package sbt.internal.util + +import scala.json.ast.unsafe._ +import sjsonnew._, support.scalajson.unsafe._ +import CacheImplicits._ + +class HListFormatSpec extends UnitSpec { + val quux = 23 :+: "quux" :+: true :+: HNil + + it should "round trip quux" in assertRoundTrip(quux) + it should "round trip hnil" in assertRoundTrip(HNil) + + it should "have a flat structure for quux" in assertJsonString(quux, """[23,"quux",true]""") + it should "have a flat structure for hnil" in assertJsonString(HNil, "[]") + + def assertRoundTrip[A: JsonWriter: JsonReader](x: A) = { + val jsonString: String = toJsonString(x) + val jValue: JValue = Parser.parseUnsafe(jsonString) + val y: A = Converter.fromJson[A](jValue).get + assert(x === y) + } + + def assertJsonString[A: JsonWriter](x: A, s: String) = assert(toJsonString(x) === s) + + def toJsonString[A: JsonWriter](x: A): String = CompactPrinter(Converter.toJson(x).get) +} diff --git a/project/Dependencies.scala b/project/Dependencies.scala index 8e9f07b08..7ebe4c8ed 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -36,7 +36,7 @@ object Dependencies { lazy val parserCombinator211 = "org.scala-lang.modules" %% "scala-parser-combinators" % "1.0.4" - lazy val sjsonnewVersion = "0.4.2" + lazy val sjsonnewVersion = "0.5.1" lazy val sjsonnew = "com.eed3si9n" %% "sjson-new-core" % sjsonnewVersion lazy val sjsonnewScalaJson = "com.eed3si9n" %% "sjson-new-scalajson" % sjsonnewVersion }