From 2071b297481bc25e60a624e2532ac7eec2b9283d Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Wed, 28 Aug 2019 18:28:30 -0400 Subject: [PATCH 1/2] Remove unused file --- .../librarymanagement/DisabledFormats.scala | 27 ------------------- 1 file changed, 27 deletions(-) delete mode 100644 core/src/main/contraband-scala/sbt/librarymanagement/DisabledFormats.scala diff --git a/core/src/main/contraband-scala/sbt/librarymanagement/DisabledFormats.scala b/core/src/main/contraband-scala/sbt/librarymanagement/DisabledFormats.scala deleted file mode 100644 index 7c060283..00000000 --- a/core/src/main/contraband-scala/sbt/librarymanagement/DisabledFormats.scala +++ /dev/null @@ -1,27 +0,0 @@ -/** - * This code is generated using [[http://www.scala-sbt.org/contraband/ sbt-contraband]]. - */ - -// DO NOT EDIT MANUALLY -package sbt.librarymanagement -import _root_.sjsonnew.{ Unbuilder, Builder, JsonFormat, deserializationError } -trait DisabledFormats { self: sjsonnew.BasicJsonProtocol => -implicit lazy val DisabledFormat: JsonFormat[sbt.librarymanagement.Disabled] = new JsonFormat[sbt.librarymanagement.Disabled] { - override def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): sbt.librarymanagement.Disabled = { - jsOpt match { - case Some(js) => - unbuilder.beginObject(js) - - unbuilder.endObject() - sbt.librarymanagement.Disabled() - case None => - deserializationError("Expected JsObject but found None") - } - } - override def write[J](obj: sbt.librarymanagement.Disabled, builder: Builder[J]): Unit = { - builder.beginObject() - - builder.endObject() - } -} -} From b01b61384e7e51442089e7bde0b727101fc53de9 Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Wed, 28 Aug 2019 18:33:46 -0400 Subject: [PATCH 2/2] Add custom handling for Disabled companion object https://github.com/sbt/librarymanagement/pull/316 started returning Disabled companion object for `apply()` instead of creating a new instance. This leaked into JSON as it uses runtime types for union. This works around that by providing a hand-crafted format. Ref https://github.com/sbt/sbt/pull/4997 --- .../sbt/librarymanagement/CrossVersion.scala | 34 ++++++++++++++----- .../sbt/librarymanagement/ModuleIdTest.scala | 14 ++++++++ 2 files changed, 39 insertions(+), 9 deletions(-) diff --git a/core/src/main/scala/sbt/librarymanagement/CrossVersion.scala b/core/src/main/scala/sbt/librarymanagement/CrossVersion.scala index 19e71298..4ab1b644 100644 --- a/core/src/main/scala/sbt/librarymanagement/CrossVersion.scala +++ b/core/src/main/scala/sbt/librarymanagement/CrossVersion.scala @@ -331,14 +331,30 @@ trait CrossVersionFormats { with sbt.librarymanagement.ConstantFormats with sbt.librarymanagement.PatchFormats with sbt.librarymanagement.FullFormats => - implicit lazy val CrossVersionFormat: JsonFormat[sbt.librarymanagement.CrossVersion] = - flatUnionFormat6[ - sbt.librarymanagement.CrossVersion, - sbt.librarymanagement.Disabled, - sbt.librarymanagement.Disabled.type, - sbt.librarymanagement.Binary, - sbt.librarymanagement.Constant, - sbt.librarymanagement.Patch, - sbt.librarymanagement.Full + implicit lazy val CrossVersionFormat: JsonFormat[CrossVersion] = { + val format = flatUnionFormat6[ + CrossVersion, + Disabled, + Disabled.type, + Binary, + Constant, + Patch, + Full ]("type") + // This is a hand-crafted formatter to avoid Disabled$ showing up in JSON + new JsonFormat[CrossVersion] { + override def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): CrossVersion = + format.read(jsOpt, unbuilder) + override def write[J](obj: CrossVersion, builder: Builder[J]): Unit = { + if (obj == Disabled) { + builder.beginPreObject() + builder.addFieldName("type") + builder.writeString("Disabled") + builder.endPreObject() + builder.beginObject() + builder.endObject() + } else format.write(obj, builder) + } + } + } } diff --git a/core/src/test/scala/sbt/librarymanagement/ModuleIdTest.scala b/core/src/test/scala/sbt/librarymanagement/ModuleIdTest.scala index a9bab61f..1698f317 100644 --- a/core/src/test/scala/sbt/librarymanagement/ModuleIdTest.scala +++ b/core/src/test/scala/sbt/librarymanagement/ModuleIdTest.scala @@ -1,8 +1,11 @@ package sbt.librarymanagement import sbt.internal.librarymanagement.UnitSpec +import sjsonnew.support.scalajson.unsafe.{ Converter, CompactPrinter, Parser } class ModuleIdTest extends UnitSpec { + val expectedJson = + """{"organization":"com.acme","name":"foo","revision":"1","isChanging":false,"isTransitive":true,"isForce":false,"explicitArtifacts":[],"inclusions":[],"exclusions":[],"extraAttributes":{},"crossVersion":{"type":"Disabled"}}""" "Module Id" should "return cross-disabled module id as equal to a copy" in { ModuleID("com.acme", "foo", "1") shouldBe ModuleID("com.acme", "foo", "1") } @@ -14,4 +17,15 @@ class ModuleIdTest extends UnitSpec { (ModuleID("com.acme", "foo", "1") cross CrossVersion.binary) shouldBe (ModuleID("com.acme", "foo", "1") cross CrossVersion.binary) } + it should "format itself into JSON" in { + import LibraryManagementCodec._ + val json = Converter.toJson(ModuleID("com.acme", "foo", "1")).get + assert(CompactPrinter(json) == expectedJson) + } + it should "thaw back from JSON" in { + import LibraryManagementCodec._ + val json = Parser.parseUnsafe(expectedJson) + val m = Converter.fromJsonUnsafe[ModuleID](json) + assert(m == ModuleID("com.acme", "foo", "1")) + } }