Skip to content

Commit

Permalink
avoid java.net.URL in ScmInfo
Browse files Browse the repository at this point in the history
  • Loading branch information
jtjeferreira committed May 22, 2024
1 parent e219c2c commit a07d336
Show file tree
Hide file tree
Showing 4 changed files with 89 additions and 16 deletions.
33 changes: 19 additions & 14 deletions core/src/main/contraband-scala/sbt/librarymanagement/ScmInfo.scala
Original file line number Diff line number Diff line change
Expand Up @@ -6,27 +6,30 @@
package sbt.librarymanagement
/** Basic SCM information for a project module */
final class ScmInfo private (
val browseUrl: java.net.URL,
val browseUri: java.net.URI,
val connection: String,
val devConnection: Option[String]) extends Serializable {

private def this(browseUrl: java.net.URL, connection: String) = this(browseUrl, connection, None)
def this(browseUrl: java.net.URL, connection: String) = this(browseUrl.toURI, connection, None)
def this(browseUrl: java.net.URL, connection: String, devConnection: Option[String]) = this(browseUrl.toURI, connection, devConnection)
def browseUrl: java.net.URL = browseUri.toURL
def withBrowseUrl(browseUrl: java.net.URL): ScmInfo = copy(browseUri = browseUrl.toURI)
private def this(browseUri: java.net.URI, connection: String) = this(browseUri, connection, None)

override def equals(o: Any): Boolean = this.eq(o.asInstanceOf[AnyRef]) || (o match {
case x: ScmInfo => (this.browseUrl == x.browseUrl) && (this.connection == x.connection) && (this.devConnection == x.devConnection)
case x: ScmInfo => (this.browseUri == x.browseUri) && (this.connection == x.connection) && (this.devConnection == x.devConnection)
case _ => false
})
override def hashCode: Int = {
37 * (37 * (37 * (37 * (17 + "sbt.librarymanagement.ScmInfo".##) + browseUrl.##) + connection.##) + devConnection.##)
37 * (37 * (37 * (37 * (17 + "sbt.librarymanagement.ScmInfo".##) + browseUri.##) + connection.##) + devConnection.##)
}
override def toString: String = {
"ScmInfo(" + browseUrl + ", " + connection + ", " + devConnection + ")"
"ScmInfo(" + browseUri + ", " + connection + ", " + devConnection + ")"
}
private[this] def copy(browseUrl: java.net.URL = browseUrl, connection: String = connection, devConnection: Option[String] = devConnection): ScmInfo = {
new ScmInfo(browseUrl, connection, devConnection)
private[this] def copy(browseUri: java.net.URI = browseUri, connection: String = connection, devConnection: Option[String] = devConnection): ScmInfo = {
new ScmInfo(browseUri, connection, devConnection)
}
def withBrowseUrl(browseUrl: java.net.URL): ScmInfo = {
copy(browseUrl = browseUrl)
def withBrowseUri(browseUri: java.net.URI): ScmInfo = {
copy(browseUri = browseUri)
}
def withConnection(connection: String): ScmInfo = {
copy(connection = connection)
Expand All @@ -39,8 +42,10 @@ final class ScmInfo private (
}
}
object ScmInfo {

def apply(browseUrl: java.net.URL, connection: String): ScmInfo = new ScmInfo(browseUrl, connection)
def apply(browseUrl: java.net.URL, connection: String, devConnection: Option[String]): ScmInfo = new ScmInfo(browseUrl, connection, devConnection)
def apply(browseUrl: java.net.URL, connection: String, devConnection: String): ScmInfo = new ScmInfo(browseUrl, connection, Option(devConnection))
def apply(browseUrl: java.net.URL, connection: String): ScmInfo = ScmInfo(browseUrl.toURI, connection)
def apply(browseUrl: java.net.URL, connection: String, devConnection: String): ScmInfo = ScmInfo(browseUrl.toURI, connection, devConnection)
def apply(browseUrl: java.net.URL, connection: String, devConnection: Option[String]): ScmInfo = ScmInfo(browseUrl.toURI, connection, devConnection)
def apply(browseUri: java.net.URI, connection: String): ScmInfo = new ScmInfo(browseUri, connection)
def apply(browseUri: java.net.URI, connection: String, devConnection: Option[String]): ScmInfo = new ScmInfo(browseUri, connection, devConnection)
def apply(browseUri: java.net.URI, connection: String, devConnection: String): ScmInfo = new ScmInfo(browseUri, connection, Option(devConnection))
}
16 changes: 14 additions & 2 deletions core/src/main/contraband/librarymanagement.json
Original file line number Diff line number Diff line change
Expand Up @@ -733,10 +733,22 @@
"type": "record",
"doc": "Basic SCM information for a project module",
"fields": [
{ "name": "browseUrl", "type": "java.net.URL" },
{ "name": "browseUri", "type": "java.net.URI" },
{ "name": "connection", "type": "String" },
{ "name": "devConnection", "type": "String?", "default": "None", "since": "0.0.1" }
]
],
"extra": [
"def this(browseUrl: java.net.URL, connection: String) = this(browseUrl.toURI, connection, None)",
"def this(browseUrl: java.net.URL, connection: String, devConnection: Option[String]) = this(browseUrl.toURI, connection, devConnection)",
"def browseUrl: java.net.URL = browseUri.toURL",
"def withBrowseUrl(browseUrl: java.net.URL): ScmInfo = copy(browseUri = browseUrl.toURI)"
],
"extraCompanion": [
"def apply(browseUrl: java.net.URL, connection: String): ScmInfo = ScmInfo(browseUrl.toURI, connection)",
"def apply(browseUrl: java.net.URL, connection: String, devConnection: String): ScmInfo = ScmInfo(browseUrl.toURI, connection, devConnection)",
"def apply(browseUrl: java.net.URL, connection: String, devConnection: Option[String]): ScmInfo = ScmInfo(browseUrl.toURI, connection, devConnection)"
],
"generateCodec": false
},
{
"name": "SshAuthentication",
Expand Down
32 changes: 32 additions & 0 deletions core/src/main/scala/sbt/librarymanagement/ScmInfoFormats.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// format: off
package sbt.librarymanagement

import _root_.sjsonnew.{Builder, JsonFormat, Unbuilder, deserializationError}

trait ScmInfoFormats { self: sjsonnew.BasicJsonProtocol =>
implicit lazy val ScmInfoFormat: JsonFormat[sbt.librarymanagement.ScmInfo] = new JsonFormat[sbt.librarymanagement.ScmInfo] {
override def read[J](__jsOpt: Option[J], unbuilder: Unbuilder[J]): sbt.librarymanagement.ScmInfo = {
__jsOpt match {
case Some(__js) =>
unbuilder.beginObject(__js)
// for backwards compatibility, we need to read the browseUrl field instead of browseUri
val browseUrl = unbuilder.readField[java.net.URI]("browseUrl")
val connection = unbuilder.readField[String]("connection")
val devConnection = unbuilder.readField[Option[String]]("devConnection")
unbuilder.endObject()
sbt.librarymanagement.ScmInfo(browseUrl, connection, devConnection)
case None =>
deserializationError("Expected JsObject but found None")
}
}
override def write[J](obj: sbt.librarymanagement.ScmInfo, builder: Builder[J]): Unit = {
builder.beginObject()
// for backwards compatibility, we need to write the browseUrl field instead of browseUri
builder.addField("browseUrl", obj.browseUri)
builder.addField("connection", obj.connection)
builder.addField("devConnection", obj.devConnection)
builder.endObject()
}
}
}
// format: on
24 changes: 24 additions & 0 deletions core/src/test/scala/sbt/librarymanagement/ScmInfoTest.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package sbt.librarymanagement

import sjsonnew.support.scalajson.unsafe.{ CompactPrinter, Converter, Parser }

import java.net.URI

object ScmInfoTest extends verify.BasicTestSuite {

test("it should format itself into JSON") {
import LibraryManagementCodec._
val json = Converter.toJson(ScmInfo(new URI("/"), "connection", "devconnection")).get
assert(CompactPrinter(json) == expectedJson)
}

test("it should thaw back from JSON") {
import LibraryManagementCodec._
val json = Parser.parseUnsafe(expectedJson)
val m = Converter.fromJsonUnsafe[ScmInfo](json)
assert(m == ScmInfo(new URI("/"), "connection", "devconnection"))
}

def expectedJson =
"""{"browseUrl":"/","connection":"connection","devConnection":"devconnection"}"""
}

0 comments on commit a07d336

Please sign in to comment.