Define ConfigRef and use it in Artifact

This commit is contained in:
Eugene Yokota 2017-07-08 13:01:59 +02:00
parent bc0ed18308
commit 9f2f700762
11 changed files with 110 additions and 20 deletions

View File

@ -9,7 +9,7 @@ final class Artifact private (
val `type`: String,
val extension: String,
val classifier: Option[String],
val configurations: Vector[String],
val configurations: Vector[sbt.librarymanagement.ConfigRef],
val url: Option[java.net.URL],
val extraAttributes: Map[String, String],
val checksum: Option[sbt.librarymanagement.Checksum]) extends sbt.librarymanagement.ArtifactExtra with Serializable {
@ -26,7 +26,7 @@ final class Artifact private (
override def toString: String = {
"Artifact(" + name + ", " + `type` + ", " + extension + ", " + classifier + ", " + configurations + ", " + url + ", " + extraAttributes + ", " + checksum + ")"
}
protected[this] def copy(name: String = name, `type`: String = `type`, extension: String = extension, classifier: Option[String] = classifier, configurations: Vector[String] = configurations, url: Option[java.net.URL] = url, extraAttributes: Map[String, String] = extraAttributes, checksum: Option[sbt.librarymanagement.Checksum] = checksum): Artifact = {
protected[this] def copy(name: String = name, `type`: String = `type`, extension: String = extension, classifier: Option[String] = classifier, configurations: Vector[sbt.librarymanagement.ConfigRef] = configurations, url: Option[java.net.URL] = url, extraAttributes: Map[String, String] = extraAttributes, checksum: Option[sbt.librarymanagement.Checksum] = checksum): Artifact = {
new Artifact(name, `type`, extension, classifier, configurations, url, extraAttributes, checksum)
}
def withName(name: String): Artifact = {
@ -41,7 +41,7 @@ final class Artifact private (
def withClassifier(classifier: Option[String]): Artifact = {
copy(classifier = classifier)
}
def withConfigurations(configurations: Vector[String]): Artifact = {
def withConfigurations(configurations: Vector[sbt.librarymanagement.ConfigRef]): Artifact = {
copy(configurations = configurations)
}
def withUrl(url: Option[java.net.URL]): Artifact = {
@ -57,5 +57,5 @@ final class Artifact private (
object Artifact extends sbt.librarymanagement.ArtifactFunctions {
def apply(name: String): Artifact = new Artifact(name, Artifact.DefaultType, Artifact.DefaultExtension, None, Vector.empty, None, Map.empty, None)
def apply(name: String, `type`: String, extension: String, classifier: Option[String], configurations: Vector[String], url: Option[java.net.URL], extraAttributes: Map[String, String], checksum: Option[sbt.librarymanagement.Checksum]): Artifact = new Artifact(name, `type`, extension, classifier, configurations, url, extraAttributes, checksum)
def apply(name: String, `type`: String, extension: String, classifier: Option[String], configurations: Vector[sbt.librarymanagement.ConfigRef], url: Option[java.net.URL], extraAttributes: Map[String, String], checksum: Option[sbt.librarymanagement.Checksum]): Artifact = new Artifact(name, `type`, extension, classifier, configurations, url, extraAttributes, checksum)
}

View File

@ -5,7 +5,7 @@
// DO NOT EDIT MANUALLY
package sbt.librarymanagement
import _root_.sjsonnew.{ Unbuilder, Builder, JsonFormat, deserializationError }
trait ArtifactFormats { self: sbt.librarymanagement.ChecksumFormats with sjsonnew.BasicJsonProtocol =>
trait ArtifactFormats { self: sbt.librarymanagement.ConfigRefFormats with sbt.librarymanagement.ChecksumFormats with sjsonnew.BasicJsonProtocol =>
implicit lazy val ArtifactFormat: JsonFormat[sbt.librarymanagement.Artifact] = new JsonFormat[sbt.librarymanagement.Artifact] {
override def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): sbt.librarymanagement.Artifact = {
jsOpt match {
@ -15,7 +15,7 @@ implicit lazy val ArtifactFormat: JsonFormat[sbt.librarymanagement.Artifact] = n
val `type` = unbuilder.readField[String]("type")
val extension = unbuilder.readField[String]("extension")
val classifier = unbuilder.readField[Option[String]]("classifier")
val configurations = unbuilder.readField[Vector[String]]("configurations")
val configurations = unbuilder.readField[Vector[sbt.librarymanagement.ConfigRef]]("configurations")
val url = unbuilder.readField[Option[java.net.URL]]("url")
val extraAttributes = unbuilder.readField[Map[String, String]]("extraAttributes")
val checksum = unbuilder.readField[Option[sbt.librarymanagement.Checksum]]("checksum")

View File

@ -0,0 +1,34 @@
/**
* This code is generated using [[http://www.scala-sbt.org/contraband/ sbt-contraband]].
*/
// DO NOT EDIT MANUALLY
package sbt.librarymanagement
/** A reference to Configuration. */
final class ConfigRef private (
/** The name of the configuration that eventually get used by Maven. */
val name: String) extends Serializable {
override def equals(o: Any): Boolean = o match {
case x: ConfigRef => (this.name == x.name)
case _ => false
}
override def hashCode: Int = {
37 * (37 * (17 + "ConfigRef".##) + name.##)
}
override def toString: String = {
"ConfigRef(" + name + ")"
}
protected[this] def copy(name: String = name): ConfigRef = {
new ConfigRef(name)
}
def withName(name: String): ConfigRef = {
copy(name = name)
}
}
object ConfigRef extends sbt.librarymanagement.ConfigRefFunctions {
def apply(name: String): ConfigRef = new ConfigRef(name)
}

View File

@ -0,0 +1,27 @@
/**
* 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 ConfigRefFormats { self: sjsonnew.BasicJsonProtocol =>
implicit lazy val ConfigRefFormat: JsonFormat[sbt.librarymanagement.ConfigRef] = new JsonFormat[sbt.librarymanagement.ConfigRef] {
override def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): sbt.librarymanagement.ConfigRef = {
jsOpt match {
case Some(js) =>
unbuilder.beginObject(js)
val name = unbuilder.readField[String]("name")
unbuilder.endObject()
sbt.librarymanagement.ConfigRef(name)
case None =>
deserializationError("Expected JsObject but found None")
}
}
override def write[J](obj: sbt.librarymanagement.ConfigRef, builder: Builder[J]): Unit = {
builder.beginObject()
builder.addField("name", obj.name)
builder.endObject()
}
}
}

View File

@ -5,6 +5,7 @@
// DO NOT EDIT MANUALLY
package sbt.librarymanagement
trait LibraryManagementCodec extends sjsonnew.BasicJsonProtocol
with sbt.librarymanagement.ConfigRefFormats
with sbt.librarymanagement.ChecksumFormats
with sbt.librarymanagement.ArtifactFormats
with sbt.librarymanagement.ArtifactTypeFilterFormats

View File

@ -13,7 +13,7 @@
{ "name": "type", "type": "String", "default": "Artifact.DefaultType", "since": "0.0.1" },
{ "name": "extension", "type": "String", "default": "Artifact.DefaultExtension", "since": "0.0.1" },
{ "name": "classifier", "type": "Option[String]", "default": "None", "since": "0.0.1" },
{ "name": "configurations", "type": "String*", "default": "Vector.empty", "since": "0.0.1" },
{ "name": "configurations", "type": "sbt.librarymanagement.ConfigRef*", "default": "Vector.empty", "since": "0.0.1" },
{ "name": "url", "type": "Option[java.net.URL]", "default": "None", "since": "0.0.1" },
{ "name": "extraAttributes", "type": "Map[String, String]", "default": "Map.empty", "since": "0.0.1" },
{ "name": "checksum", "type": "Option[sbt.librarymanagement.Checksum]", "default": "None", "since": "0.0.1" }
@ -61,6 +61,23 @@
],
"toString": "s\"$caller\""
},
{
"name": "ConfigRef",
"namespace": "sbt.librarymanagement",
"target": "Scala",
"type": "record",
"doc": [
"A reference to Configuration."
],
"fields": [
{
"name": "name",
"type": "String",
"doc": [ "The name of the configuration that eventually get used by Maven." ]
}
],
"parentsCompanion": "sbt.librarymanagement.ConfigRefFunctions"
},
{
"name": "ConfigurationReport",
"namespace": "sbt.librarymanagement",

View File

@ -603,10 +603,12 @@ private[sbt] object IvySbt {
private def toIvyArtifact(
moduleID: ModuleDescriptor,
a: Artifact,
allConfigurations: Iterable[String]
allConfigurations: Vector[ConfigRef]
): MDArtifact = {
val artifact = new MDArtifact(moduleID, a.name, a.`type`, a.extension, null, extra(a, false))
copyConfigurations(a, artifact.addConfiguration, allConfigurations)
copyConfigurations(a,
(ref: ConfigRef) => { artifact.addConfiguration(ref.name) },
allConfigurations)
artifact
}
def getExtraAttributes(revID: ExtendableItem): Map[String, String] = {
@ -816,7 +818,7 @@ private[sbt] object IvySbt {
url.orNull,
extraMap
)
copyConfigurations(artifact, ivyArtifact.addConfiguration)
copyConfigurations(artifact, (ref: ConfigRef) => { ivyArtifact.addConfiguration(ref.name) })
for (conf <- dependencyDescriptor.getModuleConfigurations)
dependencyDescriptor.addDependencyArtifact(conf, ivyArtifact)
}
@ -849,13 +851,13 @@ private[sbt] object IvySbt {
dependencyDescriptor
}
def copyConfigurations(artifact: Artifact, addConfiguration: String => Unit): Unit =
copyConfigurations(artifact, addConfiguration, "*" :: Nil)
def copyConfigurations(artifact: Artifact, addConfiguration: ConfigRef => Unit): Unit =
copyConfigurations(artifact, addConfiguration, Vector(ConfigRef("*")))
private[this] def copyConfigurations(
artifact: Artifact,
addConfiguration: String => Unit,
allConfigurations: Iterable[String]
addConfiguration: ConfigRef => Unit,
allConfigurations: Vector[ConfigRef]
): Unit = {
val confs =
if (artifact.configurations.isEmpty) allConfigurations
@ -923,7 +925,7 @@ private[sbt] object IvySbt {
configurations.foreach(config => mod.addConfiguration(toIvyConfiguration(config)))
def mapArtifacts(moduleID: ModuleDescriptor, artifacts: Seq[Artifact]): Seq[IArtifact] = {
lazy val allConfigurations = moduleID.getPublicConfigurationsNames
lazy val allConfigurations = moduleID.getPublicConfigurationsNames.toVector map ConfigRef.apply
for (artifact <- artifacts) yield toIvyArtifact(moduleID, artifact, allConfigurations)
}

View File

@ -217,7 +217,9 @@ object IvyRetrieve {
getType,
getExt,
Option(getExtraAttribute("classifier")),
getConfigurations.toVector,
getConfigurations.toVector map { c: String =>
ConfigRef(c)
},
Option(getUrl)
)
}

View File

@ -11,7 +11,7 @@ abstract class ArtifactExtra {
def `type`: String
def extension: String
def classifier: Option[String]
def configurations: Vector[String]
def configurations: Vector[ConfigRef]
def url: Option[URL]
def extraAttributes: Map[String, String]
def checksum: Option[Checksum]
@ -21,7 +21,7 @@ abstract class ArtifactExtra {
`type`: String = `type`,
extension: String = extension,
classifier: Option[String] = classifier,
configurations: Vector[String] = configurations,
configurations: Vector[ConfigRef] = configurations,
url: Option[URL] = url,
extraAttributes: Map[String, String] = extraAttributes,
checksum: Option[Checksum] = checksum
@ -58,7 +58,7 @@ abstract class ArtifactFunctions {
`type`: String,
extension: String,
classifier: Option[String],
configurations: Vector[String],
configurations: Vector[ConfigRef],
url: Option[URL]
): Artifact = Artifact(name, `type`, extension, classifier, configurations, url, empty, None)
@ -67,7 +67,7 @@ abstract class ArtifactFunctions {
def sources(name: String) = classified(name, SourceClassifier)
def javadoc(name: String) = classified(name, DocClassifier)
def pom(name: String) = Artifact(name, PomType, PomType, None, Vector(Pom.name), None)
def pom(name: String) = Artifact(name, PomType, PomType, None, Vector(Pom), None)
// Possible ivy artifact types such that sbt will treat those artifacts at sources / docs
val DefaultSourceTypes = Set("src", "source", "sources")

View File

@ -63,6 +63,8 @@ final class Configuration private[sbt] (
def withTransitive(transitive: Boolean): Configuration = {
copy(transitive = transitive)
}
def toConfigRef: ConfigRef = ConfigRef(name)
}
object Configuration {
private[sbt] def apply(id: String, name: String): Configuration =

View File

@ -134,3 +134,8 @@ private[sbt] object ConfigurationMacro {
.enclosingContextChain
.map(_.tree.asInstanceOf[c.Tree])
}
abstract class ConfigRefFunctions {
implicit def configToConfigRef(c: Configuration): ConfigRef =
c.toConfigRef
}