Merge pull request #113 from eed3si9n/wip/config

define def config(...) as a macro to capture the Scala identifier
This commit is contained in:
Dale Wijnand 2017-07-10 10:02:19 +01:00 committed by GitHub
commit f8d3718d28
34 changed files with 469 additions and 157 deletions

View File

@ -64,11 +64,16 @@ lazy val lm = (project in file("librarymanagement"))
.settings(
commonSettings,
name := "librarymanagement",
libraryDependencies ++= Seq(
ivy, jsch, scalaReflect.value, launcherInterface, gigahorseOkhttp, okhttpUrlconnection,
sjsonnewScalaJson.value % Optional,
scalaTest
),
libraryDependencies ++= Seq(ivy,
jsch,
scalaReflect.value,
scalaCompiler.value,
launcherInterface,
gigahorseOkhttp,
okhttpUrlconnection,
sjsonnewScalaJson.value % Optional,
scalaTest,
scalaCheck),
libraryDependencies ++= scalaXml.value,
resourceGenerators in Compile += Def.task(
Util.generateVersionFile(

View File

@ -8,7 +8,7 @@ final class RetrieveConfiguration private (
val retrieveDirectory: java.io.File,
val outputPattern: String,
val sync: Boolean,
val configurationsToRetrieve: Option[Set[sbt.librarymanagement.Configuration]]) extends Serializable {
val configurationsToRetrieve: Option[Set[sbt.librarymanagement.ConfigRef]]) extends Serializable {
private def this(retrieveDirectory: java.io.File, outputPattern: String) = this(retrieveDirectory, outputPattern, false, None)
@ -22,7 +22,7 @@ final class RetrieveConfiguration private (
override def toString: String = {
"RetrieveConfiguration(" + retrieveDirectory + ", " + outputPattern + ", " + sync + ", " + configurationsToRetrieve + ")"
}
protected[this] def copy(retrieveDirectory: java.io.File = retrieveDirectory, outputPattern: String = outputPattern, sync: Boolean = sync, configurationsToRetrieve: Option[Set[sbt.librarymanagement.Configuration]] = configurationsToRetrieve): RetrieveConfiguration = {
protected[this] def copy(retrieveDirectory: java.io.File = retrieveDirectory, outputPattern: String = outputPattern, sync: Boolean = sync, configurationsToRetrieve: Option[Set[sbt.librarymanagement.ConfigRef]] = configurationsToRetrieve): RetrieveConfiguration = {
new RetrieveConfiguration(retrieveDirectory, outputPattern, sync, configurationsToRetrieve)
}
def withRetrieveDirectory(retrieveDirectory: java.io.File): RetrieveConfiguration = {
@ -34,12 +34,12 @@ final class RetrieveConfiguration private (
def withSync(sync: Boolean): RetrieveConfiguration = {
copy(sync = sync)
}
def withConfigurationsToRetrieve(configurationsToRetrieve: Option[Set[sbt.librarymanagement.Configuration]]): RetrieveConfiguration = {
def withConfigurationsToRetrieve(configurationsToRetrieve: Option[Set[sbt.librarymanagement.ConfigRef]]): RetrieveConfiguration = {
copy(configurationsToRetrieve = configurationsToRetrieve)
}
}
object RetrieveConfiguration {
def apply(retrieveDirectory: java.io.File, outputPattern: String): RetrieveConfiguration = new RetrieveConfiguration(retrieveDirectory, outputPattern, false, None)
def apply(retrieveDirectory: java.io.File, outputPattern: String, sync: Boolean, configurationsToRetrieve: Option[Set[sbt.librarymanagement.Configuration]]): RetrieveConfiguration = new RetrieveConfiguration(retrieveDirectory, outputPattern, sync, configurationsToRetrieve)
def apply(retrieveDirectory: java.io.File, outputPattern: String, sync: Boolean, configurationsToRetrieve: Option[Set[sbt.librarymanagement.ConfigRef]]): RetrieveConfiguration = new RetrieveConfiguration(retrieveDirectory, outputPattern, sync, configurationsToRetrieve)
}

View File

@ -9,7 +9,7 @@ final class Artifact private (
val `type`: String,
val extension: String,
val classifier: Option[String],
val configurations: Vector[sbt.librarymanagement.Configuration],
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[sbt.librarymanagement.Configuration] = 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[sbt.librarymanagement.Configuration]): 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[sbt.librarymanagement.Configuration], 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.ConfigurationFormats with 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[sbt.librarymanagement.Configuration]]("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

@ -6,7 +6,7 @@
package sbt.librarymanagement
final class Caller private (
val caller: sbt.librarymanagement.ModuleID,
val callerConfigurations: Vector[String],
val callerConfigurations: Vector[sbt.librarymanagement.ConfigRef],
val callerExtraAttributes: Map[String, String],
val isForceDependency: Boolean,
val isChangingDependency: Boolean,
@ -25,13 +25,13 @@ final class Caller private (
override def toString: String = {
s"$caller"
}
protected[this] def copy(caller: sbt.librarymanagement.ModuleID = caller, callerConfigurations: Vector[String] = callerConfigurations, callerExtraAttributes: Map[String, String] = callerExtraAttributes, isForceDependency: Boolean = isForceDependency, isChangingDependency: Boolean = isChangingDependency, isTransitiveDependency: Boolean = isTransitiveDependency, isDirectlyForceDependency: Boolean = isDirectlyForceDependency): Caller = {
protected[this] def copy(caller: sbt.librarymanagement.ModuleID = caller, callerConfigurations: Vector[sbt.librarymanagement.ConfigRef] = callerConfigurations, callerExtraAttributes: Map[String, String] = callerExtraAttributes, isForceDependency: Boolean = isForceDependency, isChangingDependency: Boolean = isChangingDependency, isTransitiveDependency: Boolean = isTransitiveDependency, isDirectlyForceDependency: Boolean = isDirectlyForceDependency): Caller = {
new Caller(caller, callerConfigurations, callerExtraAttributes, isForceDependency, isChangingDependency, isTransitiveDependency, isDirectlyForceDependency)
}
def withCaller(caller: sbt.librarymanagement.ModuleID): Caller = {
copy(caller = caller)
}
def withCallerConfigurations(callerConfigurations: Vector[String]): Caller = {
def withCallerConfigurations(callerConfigurations: Vector[sbt.librarymanagement.ConfigRef]): Caller = {
copy(callerConfigurations = callerConfigurations)
}
def withCallerExtraAttributes(callerExtraAttributes: Map[String, String]): Caller = {
@ -52,5 +52,5 @@ final class Caller private (
}
object Caller {
def apply(caller: sbt.librarymanagement.ModuleID, callerConfigurations: Vector[String], callerExtraAttributes: Map[String, String], isForceDependency: Boolean, isChangingDependency: Boolean, isTransitiveDependency: Boolean, isDirectlyForceDependency: Boolean): Caller = new Caller(caller, callerConfigurations, callerExtraAttributes, isForceDependency, isChangingDependency, isTransitiveDependency, isDirectlyForceDependency)
def apply(caller: sbt.librarymanagement.ModuleID, callerConfigurations: Vector[sbt.librarymanagement.ConfigRef], callerExtraAttributes: Map[String, String], isForceDependency: Boolean, isChangingDependency: Boolean, isTransitiveDependency: Boolean, isDirectlyForceDependency: Boolean): Caller = new Caller(caller, callerConfigurations, callerExtraAttributes, isForceDependency, isChangingDependency, isTransitiveDependency, isDirectlyForceDependency)
}

View File

@ -5,14 +5,14 @@
// DO NOT EDIT MANUALLY
package sbt.librarymanagement
import _root_.sjsonnew.{ Unbuilder, Builder, JsonFormat, deserializationError }
trait CallerFormats { self: sbt.librarymanagement.ModuleIDFormats with sjsonnew.BasicJsonProtocol =>
trait CallerFormats { self: sbt.librarymanagement.ModuleIDFormats with sbt.librarymanagement.ConfigRefFormats with sjsonnew.BasicJsonProtocol =>
implicit lazy val CallerFormat: JsonFormat[sbt.librarymanagement.Caller] = new JsonFormat[sbt.librarymanagement.Caller] {
override def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): sbt.librarymanagement.Caller = {
jsOpt match {
case Some(js) =>
unbuilder.beginObject(js)
val caller = unbuilder.readField[sbt.librarymanagement.ModuleID]("caller")
val callerConfigurations = unbuilder.readField[Vector[String]]("callerConfigurations")
val callerConfigurations = unbuilder.readField[Vector[sbt.librarymanagement.ConfigRef]]("callerConfigurations")
val callerExtraAttributes = unbuilder.readField[Map[String, String]]("callerExtraAttributes")
val isForceDependency = unbuilder.readField[Boolean]("isForceDependency")
val isChangingDependency = unbuilder.readField[Boolean]("isChangingDependency")

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 = {
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

@ -7,7 +7,7 @@ package sbt.librarymanagement
/** Provides information about resolution of a single configuration. */
final class ConfigurationReport private (
/** the configuration this report is for. */
val configuration: String,
val configuration: sbt.librarymanagement.ConfigRef,
/** a sequence containing one report for each module resolved for this configuration. */
val modules: Vector[sbt.librarymanagement.ModuleReport],
/** a sequence containing one report for each org/name, which may or may not be part of the final resolution. */
@ -27,10 +27,10 @@ final class ConfigurationReport private (
(if (details.isEmpty) modules.mkString + details.flatMap(_.modules).filter(_.evicted).map("\t\t(EVICTED) " + _ + "\n").mkString
else details.mkString)
}
protected[this] def copy(configuration: String = configuration, modules: Vector[sbt.librarymanagement.ModuleReport] = modules, details: Vector[sbt.librarymanagement.OrganizationArtifactReport] = details): ConfigurationReport = {
protected[this] def copy(configuration: sbt.librarymanagement.ConfigRef = configuration, modules: Vector[sbt.librarymanagement.ModuleReport] = modules, details: Vector[sbt.librarymanagement.OrganizationArtifactReport] = details): ConfigurationReport = {
new ConfigurationReport(configuration, modules, details)
}
def withConfiguration(configuration: String): ConfigurationReport = {
def withConfiguration(configuration: sbt.librarymanagement.ConfigRef): ConfigurationReport = {
copy(configuration = configuration)
}
def withModules(modules: Vector[sbt.librarymanagement.ModuleReport]): ConfigurationReport = {
@ -42,5 +42,5 @@ final class ConfigurationReport private (
}
object ConfigurationReport {
def apply(configuration: String, modules: Vector[sbt.librarymanagement.ModuleReport], details: Vector[sbt.librarymanagement.OrganizationArtifactReport]): ConfigurationReport = new ConfigurationReport(configuration, modules, details)
def apply(configuration: sbt.librarymanagement.ConfigRef, modules: Vector[sbt.librarymanagement.ModuleReport], details: Vector[sbt.librarymanagement.OrganizationArtifactReport]): ConfigurationReport = new ConfigurationReport(configuration, modules, details)
}

View File

@ -5,13 +5,13 @@
// DO NOT EDIT MANUALLY
package sbt.librarymanagement
import _root_.sjsonnew.{ Unbuilder, Builder, JsonFormat, deserializationError }
trait ConfigurationReportFormats { self: sbt.librarymanagement.ModuleReportFormats with sbt.librarymanagement.OrganizationArtifactReportFormats with sjsonnew.BasicJsonProtocol =>
trait ConfigurationReportFormats { self: sbt.librarymanagement.ConfigRefFormats with sbt.librarymanagement.ModuleReportFormats with sbt.librarymanagement.OrganizationArtifactReportFormats with sjsonnew.BasicJsonProtocol =>
implicit lazy val ConfigurationReportFormat: JsonFormat[sbt.librarymanagement.ConfigurationReport] = new JsonFormat[sbt.librarymanagement.ConfigurationReport] {
override def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): sbt.librarymanagement.ConfigurationReport = {
jsOpt match {
case Some(js) =>
unbuilder.beginObject(js)
val configuration = unbuilder.readField[String]("configuration")
val configuration = unbuilder.readField[sbt.librarymanagement.ConfigRef]("configuration")
val modules = unbuilder.readField[Vector[sbt.librarymanagement.ModuleReport]]("modules")
val details = unbuilder.readField[Vector[sbt.librarymanagement.OrganizationArtifactReport]]("details")
unbuilder.endObject()

View File

@ -17,7 +17,7 @@ final class InclExclRule private (
val organization: String,
val name: String,
val artifact: String,
val configurations: Vector[String],
val configurations: Vector[sbt.librarymanagement.ConfigRef],
val crossVersion: sbt.librarymanagement.CrossVersion) extends Serializable {
private def this() = this("*", "*", "*", Vector.empty, sbt.librarymanagement.Disabled())
@ -32,7 +32,7 @@ final class InclExclRule private (
override def toString: String = {
"InclExclRule(" + organization + ", " + name + ", " + artifact + ", " + configurations + ", " + crossVersion + ")"
}
protected[this] def copy(organization: String = organization, name: String = name, artifact: String = artifact, configurations: Vector[String] = configurations, crossVersion: sbt.librarymanagement.CrossVersion = crossVersion): InclExclRule = {
protected[this] def copy(organization: String = organization, name: String = name, artifact: String = artifact, configurations: Vector[sbt.librarymanagement.ConfigRef] = configurations, crossVersion: sbt.librarymanagement.CrossVersion = crossVersion): InclExclRule = {
new InclExclRule(organization, name, artifact, configurations, crossVersion)
}
def withOrganization(organization: String): InclExclRule = {
@ -44,7 +44,7 @@ final class InclExclRule private (
def withArtifact(artifact: String): InclExclRule = {
copy(artifact = artifact)
}
def withConfigurations(configurations: Vector[String]): InclExclRule = {
def withConfigurations(configurations: Vector[sbt.librarymanagement.ConfigRef]): InclExclRule = {
copy(configurations = configurations)
}
def withCrossVersion(crossVersion: sbt.librarymanagement.CrossVersion): InclExclRule = {
@ -54,5 +54,5 @@ final class InclExclRule private (
object InclExclRule extends sbt.librarymanagement.InclExclRuleFunctions {
def apply(): InclExclRule = new InclExclRule("*", "*", "*", Vector.empty, sbt.librarymanagement.Disabled())
def apply(organization: String, name: String, artifact: String, configurations: Vector[String], crossVersion: sbt.librarymanagement.CrossVersion): InclExclRule = new InclExclRule(organization, name, artifact, configurations, crossVersion)
def apply(organization: String, name: String, artifact: String, configurations: Vector[sbt.librarymanagement.ConfigRef], crossVersion: sbt.librarymanagement.CrossVersion): InclExclRule = new InclExclRule(organization, name, artifact, configurations, crossVersion)
}

View File

@ -5,7 +5,7 @@
// DO NOT EDIT MANUALLY
package sbt.librarymanagement
import _root_.sjsonnew.{ Unbuilder, Builder, JsonFormat, deserializationError }
trait InclExclRuleFormats { self: sbt.librarymanagement.CrossVersionFormats with sjsonnew.BasicJsonProtocol =>
trait InclExclRuleFormats { self: sbt.librarymanagement.ConfigRefFormats with sbt.librarymanagement.CrossVersionFormats with sjsonnew.BasicJsonProtocol =>
implicit lazy val InclExclRuleFormat: JsonFormat[sbt.librarymanagement.InclExclRule] = new JsonFormat[sbt.librarymanagement.InclExclRule] {
override def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): sbt.librarymanagement.InclExclRule = {
jsOpt match {
@ -14,7 +14,7 @@ implicit lazy val InclExclRuleFormat: JsonFormat[sbt.librarymanagement.InclExclR
val organization = unbuilder.readField[String]("organization")
val name = unbuilder.readField[String]("name")
val artifact = unbuilder.readField[String]("artifact")
val configurations = unbuilder.readField[Vector[String]]("configurations")
val configurations = unbuilder.readField[Vector[sbt.librarymanagement.ConfigRef]]("configurations")
val crossVersion = unbuilder.readField[sbt.librarymanagement.CrossVersion]("crossVersion")
unbuilder.endObject()
sbt.librarymanagement.InclExclRule(organization, name, artifact, configurations, crossVersion)

View File

@ -5,7 +5,7 @@
// DO NOT EDIT MANUALLY
package sbt.librarymanagement
trait LibraryManagementCodec extends sjsonnew.BasicJsonProtocol
with sbt.librarymanagement.ConfigurationFormats
with sbt.librarymanagement.ConfigRefFormats
with sbt.librarymanagement.ChecksumFormats
with sbt.librarymanagement.ArtifactFormats
with sbt.librarymanagement.ArtifactTypeFilterFormats
@ -24,6 +24,7 @@ trait LibraryManagementCodec extends sjsonnew.BasicJsonProtocol
with sbt.librarymanagement.ConflictManagerFormats
with sbt.librarymanagement.DeveloperFormats
with sbt.librarymanagement.FileConfigurationFormats
with sbt.librarymanagement.ConfigurationFormats
with sbt.librarymanagement.IvyScalaFormats
with sbt.librarymanagement.ChainedResolverFormats
with sbt.librarymanagement.MavenRepoFormats

View File

@ -24,7 +24,7 @@ final class ModuleReport private (
val extraAttributes: Map[String, String],
val isDefault: Option[Boolean],
val branch: Option[String],
val configurations: Vector[String],
val configurations: Vector[sbt.librarymanagement.ConfigRef],
val licenses: Vector[scala.Tuple2[String, Option[String]]],
val callers: Vector[sbt.librarymanagement.Caller]) extends sbt.librarymanagement.ModuleReportExtra with Serializable {
@ -41,7 +41,7 @@ final class ModuleReport private (
s"\t\t$module: " +
(if (arts.size <= 1) "" else "\n\t\t\t") + arts.mkString("\n\t\t\t") + "\n"
}
protected[this] def copy(module: sbt.librarymanagement.ModuleID = module, artifacts: Vector[scala.Tuple2[sbt.librarymanagement.Artifact, java.io.File]] = artifacts, missingArtifacts: Vector[sbt.librarymanagement.Artifact] = missingArtifacts, status: Option[String] = status, publicationDate: Option[java.util.Calendar] = publicationDate, resolver: Option[String] = resolver, artifactResolver: Option[String] = artifactResolver, evicted: Boolean = evicted, evictedData: Option[String] = evictedData, evictedReason: Option[String] = evictedReason, problem: Option[String] = problem, homepage: Option[String] = homepage, extraAttributes: Map[String, String] = extraAttributes, isDefault: Option[Boolean] = isDefault, branch: Option[String] = branch, configurations: Vector[String] = configurations, licenses: Vector[scala.Tuple2[String, Option[String]]] = licenses, callers: Vector[sbt.librarymanagement.Caller] = callers): ModuleReport = {
protected[this] def copy(module: sbt.librarymanagement.ModuleID = module, artifacts: Vector[scala.Tuple2[sbt.librarymanagement.Artifact, java.io.File]] = artifacts, missingArtifacts: Vector[sbt.librarymanagement.Artifact] = missingArtifacts, status: Option[String] = status, publicationDate: Option[java.util.Calendar] = publicationDate, resolver: Option[String] = resolver, artifactResolver: Option[String] = artifactResolver, evicted: Boolean = evicted, evictedData: Option[String] = evictedData, evictedReason: Option[String] = evictedReason, problem: Option[String] = problem, homepage: Option[String] = homepage, extraAttributes: Map[String, String] = extraAttributes, isDefault: Option[Boolean] = isDefault, branch: Option[String] = branch, configurations: Vector[sbt.librarymanagement.ConfigRef] = configurations, licenses: Vector[scala.Tuple2[String, Option[String]]] = licenses, callers: Vector[sbt.librarymanagement.Caller] = callers): ModuleReport = {
new ModuleReport(module, artifacts, missingArtifacts, status, publicationDate, resolver, artifactResolver, evicted, evictedData, evictedReason, problem, homepage, extraAttributes, isDefault, branch, configurations, licenses, callers)
}
def withModule(module: sbt.librarymanagement.ModuleID): ModuleReport = {
@ -89,7 +89,7 @@ final class ModuleReport private (
def withBranch(branch: Option[String]): ModuleReport = {
copy(branch = branch)
}
def withConfigurations(configurations: Vector[String]): ModuleReport = {
def withConfigurations(configurations: Vector[sbt.librarymanagement.ConfigRef]): ModuleReport = {
copy(configurations = configurations)
}
def withLicenses(licenses: Vector[scala.Tuple2[String, Option[String]]]): ModuleReport = {
@ -102,5 +102,5 @@ final class ModuleReport private (
object ModuleReport {
def apply(module: sbt.librarymanagement.ModuleID, artifacts: Vector[scala.Tuple2[sbt.librarymanagement.Artifact, java.io.File]], missingArtifacts: Vector[sbt.librarymanagement.Artifact]): ModuleReport = new ModuleReport(module, artifacts, missingArtifacts, None, None, None, None, false, None, None, None, None, Map.empty, None, None, Vector.empty, Vector.empty, Vector.empty)
def apply(module: sbt.librarymanagement.ModuleID, artifacts: Vector[scala.Tuple2[sbt.librarymanagement.Artifact, java.io.File]], missingArtifacts: Vector[sbt.librarymanagement.Artifact], status: Option[String], publicationDate: Option[java.util.Calendar], resolver: Option[String], artifactResolver: Option[String], evicted: Boolean, evictedData: Option[String], evictedReason: Option[String], problem: Option[String], homepage: Option[String], extraAttributes: Map[String, String], isDefault: Option[Boolean], branch: Option[String], configurations: Vector[String], licenses: Vector[scala.Tuple2[String, Option[String]]], callers: Vector[sbt.librarymanagement.Caller]): ModuleReport = new ModuleReport(module, artifacts, missingArtifacts, status, publicationDate, resolver, artifactResolver, evicted, evictedData, evictedReason, problem, homepage, extraAttributes, isDefault, branch, configurations, licenses, callers)
def apply(module: sbt.librarymanagement.ModuleID, artifacts: Vector[scala.Tuple2[sbt.librarymanagement.Artifact, java.io.File]], missingArtifacts: Vector[sbt.librarymanagement.Artifact], status: Option[String], publicationDate: Option[java.util.Calendar], resolver: Option[String], artifactResolver: Option[String], evicted: Boolean, evictedData: Option[String], evictedReason: Option[String], problem: Option[String], homepage: Option[String], extraAttributes: Map[String, String], isDefault: Option[Boolean], branch: Option[String], configurations: Vector[sbt.librarymanagement.ConfigRef], licenses: Vector[scala.Tuple2[String, Option[String]]], callers: Vector[sbt.librarymanagement.Caller]): ModuleReport = new ModuleReport(module, artifacts, missingArtifacts, status, publicationDate, resolver, artifactResolver, evicted, evictedData, evictedReason, problem, homepage, extraAttributes, isDefault, branch, configurations, licenses, callers)
}

View File

@ -5,7 +5,7 @@
// DO NOT EDIT MANUALLY
package sbt.librarymanagement
import _root_.sjsonnew.{ Unbuilder, Builder, JsonFormat, deserializationError }
trait ModuleReportFormats { self: sbt.librarymanagement.ModuleIDFormats with sbt.librarymanagement.ArtifactFormats with sbt.librarymanagement.CallerFormats with sjsonnew.BasicJsonProtocol =>
trait ModuleReportFormats { self: sbt.librarymanagement.ModuleIDFormats with sbt.librarymanagement.ArtifactFormats with sbt.librarymanagement.ConfigRefFormats with sbt.librarymanagement.CallerFormats with sjsonnew.BasicJsonProtocol =>
implicit lazy val ModuleReportFormat: JsonFormat[sbt.librarymanagement.ModuleReport] = new JsonFormat[sbt.librarymanagement.ModuleReport] {
override def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): sbt.librarymanagement.ModuleReport = {
jsOpt match {
@ -26,7 +26,7 @@ implicit lazy val ModuleReportFormat: JsonFormat[sbt.librarymanagement.ModuleRep
val extraAttributes = unbuilder.readField[Map[String, String]]("extraAttributes")
val isDefault = unbuilder.readField[Option[Boolean]]("isDefault")
val branch = unbuilder.readField[Option[String]]("branch")
val configurations = unbuilder.readField[Vector[String]]("configurations")
val configurations = unbuilder.readField[Vector[sbt.librarymanagement.ConfigRef]]("configurations")
val licenses = unbuilder.readField[Vector[scala.Tuple2[String, Option[String]]]]("licenses")
val callers = unbuilder.readField[Vector[sbt.librarymanagement.Caller]]("callers")
unbuilder.endObject()

View File

@ -5,7 +5,7 @@
// DO NOT EDIT MANUALLY
package sbt.librarymanagement
import _root_.sjsonnew.{ Unbuilder, Builder, JsonFormat, deserializationError }
trait RetrieveConfigurationFormats { self: sbt.librarymanagement.ConfigurationFormats with sjsonnew.BasicJsonProtocol =>
trait RetrieveConfigurationFormats { self: sbt.librarymanagement.ConfigRefFormats with sjsonnew.BasicJsonProtocol =>
implicit lazy val RetrieveConfigurationFormat: JsonFormat[sbt.internal.librarymanagement.RetrieveConfiguration] = new JsonFormat[sbt.internal.librarymanagement.RetrieveConfiguration] {
override def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): sbt.internal.librarymanagement.RetrieveConfiguration = {
jsOpt match {
@ -14,7 +14,7 @@ implicit lazy val RetrieveConfigurationFormat: JsonFormat[sbt.internal.libraryma
val retrieveDirectory = unbuilder.readField[java.io.File]("retrieveDirectory")
val outputPattern = unbuilder.readField[String]("outputPattern")
val sync = unbuilder.readField[Boolean]("sync")
val configurationsToRetrieve = unbuilder.readField[Option[Set[sbt.librarymanagement.Configuration]]]("configurationsToRetrieve")
val configurationsToRetrieve = unbuilder.readField[Option[Set[sbt.librarymanagement.ConfigRef]]]("configurationsToRetrieve")
unbuilder.endObject()
sbt.internal.librarymanagement.RetrieveConfiguration(retrieveDirectory, outputPattern, sync, configurationsToRetrieve)
case None =>

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": "sbt.librarymanagement.Configuration*", "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" }
@ -52,7 +52,7 @@
"type": "record",
"fields": [
{ "name": "caller", "type": "sbt.librarymanagement.ModuleID" },
{ "name": "callerConfigurations", "type": "String*" },
{ "name": "callerConfigurations", "type": "sbt.librarymanagement.ConfigRef*" },
{ "name": "callerExtraAttributes", "type": "Map[String, String]" },
{ "name": "isForceDependency", "type": "boolean" },
{ "name": "isChangingDependency", "type": "boolean" },
@ -62,19 +62,21 @@
"toString": "s\"$caller\""
},
{
"name": "Configuration",
"name": "ConfigRef",
"namespace": "sbt.librarymanagement",
"target": "Scala",
"type": "record",
"doc": "Represents an Ivy configuration.",
"parents": "sbt.librarymanagement.ConfigurationExtra",
"fields": [
{ "name": "name", "type": "String" },
{ "name": "description", "type": "String", "default": "\"\"", "since": "0.0.1" },
{ "name": "isPublic", "type": "boolean", "default": "true", "since": "0.0.1" },
{ "name": "extendsConfigs", "type": "sbt.librarymanagement.Configuration*", "default": "Vector.empty", "since": "0.0.1" },
{ "name": "transitive", "type": "boolean", "default": "true", "since": "0.0.1" }
"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",
"toString": "name"
},
{
@ -87,7 +89,7 @@
],
"parents": "sbt.librarymanagement.ConfigurationReportExtra",
"fields": [
{ "name": "configuration", "type": "String", "doc": [ "the configuration this report is for." ] },
{ "name": "configuration", "type": "sbt.librarymanagement.ConfigRef", "doc": [ "the configuration this report is for." ] },
{
"name": "modules",
"type": "sbt.librarymanagement.ModuleReport*",
@ -232,7 +234,7 @@
{ "name": "organization", "type": "String", "default": "\"*\"", "since": "0.0.1" },
{ "name": "name", "type": "String", "default": "\"*\"", "since": "0.0.1" },
{ "name": "artifact", "type": "String", "default": "\"*\"", "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": "crossVersion", "type": "sbt.librarymanagement.CrossVersion", "default": "sbt.librarymanagement.Disabled()", "since": "0.0.1"}
],
"parentsCompanion": "sbt.librarymanagement.InclExclRuleFunctions"
@ -350,7 +352,7 @@
{ "name": "extraAttributes", "type": "Map[String, String]", "default": "Map.empty", "since": "0.0.1" },
{ "name": "isDefault", "type": "Option[Boolean]", "default": "None", "since": "0.0.1" },
{ "name": "branch", "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": "licenses", "type": "scala.Tuple2[String, Option[String]]*", "default": "Vector.empty", "since": "0.0.1" },
{ "name": "callers", "type": "sbt.librarymanagement.Caller*", "default": "Vector.empty", "since": "0.0.1" }
],
@ -804,8 +806,8 @@
"fields": [
{ "name": "retrieveDirectory", "type": "java.io.File" },
{ "name": "outputPattern", "type": "String" },
{ "name": "sync", "type": "boolean", "default": "false", "since": "0.0.1" },
{ "name": "configurationsToRetrieve", "type": "Option[Set[sbt.librarymanagement.Configuration]]", "default": "None", "since": "0.0.1" }
{ "name": "sync", "type": "boolean", "default": "false", "since": "0.0.1" },
{ "name": "configurationsToRetrieve", "type": "Option[Set[sbt.librarymanagement.ConfigRef]]", "default": "None", "since": "0.0.1" }
]
},
{

View File

@ -238,9 +238,9 @@ final class IvySbt(val configuration: IvyConfiguration) { self =>
import ic._
val moduleID = newConfiguredModuleID(module, moduleInfo, configurations)
IvySbt.setConflictManager(moduleID, conflictManager, ivy.getSettings)
val defaultConf = defaultConfiguration getOrElse Configurations.config(
ModuleDescriptor.DEFAULT_CONFIGURATION
)
val defaultConf = defaultConfiguration getOrElse Configuration(
"Default",
ModuleDescriptor.DEFAULT_CONFIGURATION)
log.debug(
"Using inline dependencies specified in Scala" + (if (ivyXML.isEmpty) "."
else " and XML.")
@ -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)
}
@ -827,7 +829,7 @@ private[sbt] object IvySbt {
IvyScala.excludeRule(
excls.organization,
excls.name,
excls.configurations,
excls.configurations map { _.name },
excls.artifact
)
)
@ -840,7 +842,7 @@ private[sbt] object IvySbt {
IvyScala.includeRule(
incls.organization,
incls.name,
incls.configurations,
incls.configurations map { _.name },
incls.artifact
)
)
@ -849,17 +851,17 @@ 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
else artifact.configurations.map(_.name)
else artifact.configurations
confs foreach addConfiguration
}
@ -875,7 +877,7 @@ private[sbt] object IvySbt {
val exclude = CrossVersion.substituteCross(exclude0, ivyScala)
val confs =
if (exclude.configurations.isEmpty) moduleID.getConfigurationsNames.toList
else exclude.configurations
else exclude.configurations map { _.name }
val excludeRule =
IvyScala.excludeRule(exclude.organization, exclude.name, confs, exclude.artifact)
moduleID.addExcludeRule(excludeRule)
@ -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

@ -541,19 +541,15 @@ object IvyActions {
config: RetrieveConfiguration
): UpdateReport = {
val copyChecksums = ivy.getVariable(ConvertResolver.ManagedChecksums).toBoolean
val toRetrieve = config.configurationsToRetrieve
val toRetrieve: Option[Set[ConfigRef]] = config.configurationsToRetrieve
val base = config.retrieveDirectory
val pattern = config.outputPattern
val configurationNames = toRetrieve match {
case None => None
case Some(configs) => Some(configs.map(_.name))
}
val existingFiles = PathFinder(base).allPaths.get filterNot { _.isDirectory }
val toCopy = new collection.mutable.HashSet[(File, File)]
val retReport = report retrieve { (conf, mid, art, cached) =>
configurationNames match {
val retReport = report retrieve { (conf: ConfigRef, mid, art, cached) =>
toRetrieve match {
case None => performRetrieve(conf, mid, art, base, pattern, cached, copyChecksums, toCopy)
case Some(names) if names(conf) =>
case Some(refs) if refs(conf) =>
performRetrieve(conf, mid, art, base, pattern, cached, copyChecksums, toCopy)
case _ => cached
}
@ -572,7 +568,7 @@ object IvyActions {
}
private def performRetrieve(
conf: String,
conf: ConfigRef,
mid: ModuleID,
art: Artifact,
base: File,
@ -603,7 +599,7 @@ object IvyActions {
}
private def retrieveTarget(
conf: String,
conf: ConfigRef,
mid: ModuleID,
art: Artifact,
base: File,
@ -611,7 +607,7 @@ object IvyActions {
): File =
new File(base, substitute(conf, mid, art, pattern))
private def substitute(conf: String, mid: ModuleID, art: Artifact, pattern: String): String = {
private def substitute(conf: ConfigRef, mid: ModuleID, art: Artifact, pattern: String): String = {
val mextra = IvySbt.javaMap(mid.extraAttributes, true)
val aextra = IvySbt.extra(art, true)
IvyPatternHelper.substitute(
@ -623,7 +619,7 @@ object IvyActions {
art.name,
art.`type`,
art.extension,
conf,
conf.name,
null,
mextra,
aextra

View File

@ -89,7 +89,7 @@ object IvyRetrieve {
def toCaller(caller: IvyCaller): Caller = {
val m = toModuleID(caller.getModuleRevisionId)
val callerConfigurations = caller.getCallerConfigurations.toVector collect {
case x if nonEmptyString(x).isDefined => x
case x if nonEmptyString(x).isDefined => ConfigRef(x)
}
val ddOpt = Option(caller.getDependencyDescriptor)
val (extraAttributes, isForce, isChanging, isTransitive, isDirectlyForce) = ddOpt match {
@ -167,7 +167,9 @@ object IvyRetrieve {
case _ => dep.getResolvedId.getExtraAttributes
})
val isDefault = Option(dep.getDescriptor) map { _.isDefault }
val configurations = dep.getConfigurations(confReport.getConfiguration).toVector
val configurations = dep.getConfigurations(confReport.getConfiguration).toVector map {
ConfigRef(_)
}
val licenses: Vector[(String, Option[String])] = mdOpt match {
case Some(md) =>
md.getLicenses.toVector collect {
@ -217,7 +219,9 @@ object IvyRetrieve {
getType,
getExt,
Option(getExtraAttribute("classifier")),
getConfigurations.toVector map Configurations.config,
getConfigurations.toVector map { c: String =>
ConfigRef(c)
},
Option(getUrl)
)
}
@ -233,7 +237,7 @@ object IvyRetrieve {
UpdateStats(report.getResolveTime, report.getDownloadTime, report.getDownloadSize, false)
def configurationReport(confReport: ConfigurationResolveReport): ConfigurationReport =
ConfigurationReport(
confReport.getConfiguration,
ConfigRef(confReport.getConfiguration),
moduleReports(confReport),
organizationArtifactReports(confReport)
)

View File

@ -35,7 +35,7 @@ private[sbt] object JsonUtil {
def toLite(ur: UpdateReport): UpdateReportLite =
UpdateReportLite(ur.configurations map { cr =>
ConfigurationReportLite(
cr.configuration,
cr.configuration.name,
cr.details map {
oar =>
OrganizationArtifactReport(
@ -92,7 +92,7 @@ private[sbt] object JsonUtil {
!mr.evicted && mr.problem.isEmpty
}
}
ConfigurationReport(cr.configuration, modules, details)
ConfigurationReport(ConfigRef(cr.configuration), modules, details)
}
UpdateReport(cachedDescriptor, configReports, stats, Map.empty)
}

View File

@ -512,14 +512,16 @@ private[sbt] trait CachedResolutionResolveEngine extends ResolveEngine {
)
val configReports = rootModuleConfigs map { conf =>
log.debug("::: -----------")
val crs = reports flatMap { _.configurations filter { _.configuration == conf.getName } }
mergeConfigurationReports(conf.getName, crs, os, log)
val crs = reports flatMap {
_.configurations filter { _.configuration.name == conf.getName }
}
mergeConfigurationReports(ConfigRef(conf.getName), crs, os, log)
}
UpdateReport(cachedDescriptor, configReports, stats, Map.empty)
}
// memory usage 62%, of which 58% is in mergeOrganizationArtifactReports
def mergeConfigurationReports(
rootModuleConf: String,
rootModuleConf: ConfigRef,
reports: Vector[ConfigurationReport],
os: Vector[IvyOverride],
log: Logger
@ -539,7 +541,7 @@ private[sbt] trait CachedResolutionResolveEngine extends ResolveEngine {
* Returns a tuple of (merged org + name combo, newly evicted modules)
*/
def mergeOrganizationArtifactReports(
rootModuleConf: String,
rootModuleConf: ConfigRef,
reports0: Vector[OrganizationArtifactReport],
os: Vector[IvyOverride],
log: Logger
@ -735,7 +737,7 @@ private[sbt] trait CachedResolutionResolveEngine extends ResolveEngine {
* Returns a touple of (surviving modules ++ non-conflicting modules, newly evicted modules).
*/
def mergeModuleReports(
rootModuleConf: String,
rootModuleConf: ConfigRef,
modules: Vector[ModuleReport],
os: Vector[IvyOverride],
log: Logger
@ -787,7 +789,7 @@ private[sbt] trait CachedResolutionResolveEngine extends ResolveEngine {
* This transitively evicts any non-evicted modules whose only callers are newly evicted.
*/
def transitivelyEvict(
rootModuleConf: String,
rootModuleConf: ConfigRef,
pairs: List[(String, String)],
reports0: Map[(String, String), Vector[OrganizationArtifactReport]],
evicted0: Vector[ModuleReport],
@ -833,7 +835,7 @@ private[sbt] trait CachedResolutionResolveEngine extends ResolveEngine {
* which may be because Ivy makes all Maven dependencies as forced="true".
*/
def resolveConflict(
rootModuleConf: String,
rootModuleConf: ConfigRef,
conflicts: Vector[ModuleReport],
os: Vector[IvyOverride],
log: Logger
@ -945,7 +947,7 @@ private[sbt] trait CachedResolutionResolveEngine extends ResolveEngine {
}
// These are the configurations from the original project we want to resolve.
val rootModuleConfs = md0.getConfigurations.toVector
val configurations0 = ur.configurations.toVector
val configurations0: Vector[ConfigurationReport] = ur.configurations.toVector
// This is how md looks from md0 via dd's mapping.
val remappedConfigs0: Map[String, Vector[String]] = Map(rootModuleConfs map { conf0 =>
val remapped
@ -969,7 +971,7 @@ private[sbt] trait CachedResolutionResolveEngine extends ResolveEngine {
val remappedCRs = configurations0 filter { cr =>
remappedConfigs(conf0.getName) contains cr.configuration
}
mergeConfigurationReports(conf0.getName, remappedCRs, os, log)
mergeConfigurationReports(ConfigRef(conf0.getName), remappedCRs, os, log)
}
UpdateReport(ur.cachedDescriptor, configurations, ur.stats, ur.stamps)
}

View File

@ -11,7 +11,7 @@ abstract class ArtifactExtra {
def `type`: String
def extension: String
def classifier: Option[String]
def configurations: Vector[Configuration]
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[Configuration] = 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[Configuration],
configurations: Vector[ConfigRef],
url: Option[URL]
): Artifact = Artifact(name, `type`, extension, classifier, configurations, url, empty, None)

View File

@ -0,0 +1,79 @@
package sbt
package librarymanagement
/** Represents an Ivy configuration. */
final class Configuration private[sbt] (
val id: String,
val name: String,
val description: String,
val isPublic: Boolean,
val extendsConfigs: Vector[sbt.librarymanagement.Configuration],
val transitive: Boolean)
extends sbt.librarymanagement.ConfigurationExtra
with Serializable {
require(name != null, "name cannot be null")
require(name.size > 0, "name cannot be empty")
require(id != null, "id cannot be null")
require(id.size > 0, "id cannot be empty")
require(id.head.isUpper, s"id must be capitalized: $id")
private def this(id: String, name: String) =
this(id, name, "", true, Vector.empty, true)
override def equals(o: Any): Boolean = o match {
case x: Configuration =>
(this.id == x.id) &&
(this.name == x.name) &&
(this.description == x.description) &&
(this.isPublic == x.isPublic) &&
(this.extendsConfigs == x.extendsConfigs) &&
(this.transitive == x.transitive)
case _ => false
}
override def hashCode: Int = {
37 * (37 * (37 * (37 * (37 * (37 * (17 + id.##) + name.##) + description.##) + isPublic.##) + extendsConfigs.##) + transitive.##)
}
override def toString: String = {
name
}
protected[this] def copy(id: String = id,
name: String = name,
description: String = description,
isPublic: Boolean = isPublic,
extendsConfigs: Vector[sbt.librarymanagement.Configuration] =
extendsConfigs,
transitive: Boolean = transitive): Configuration = {
new Configuration(id, name, description, isPublic, extendsConfigs, transitive)
}
def withDescription(description: String): Configuration = {
copy(description = description)
}
def withIsPublic(isPublic: Boolean): Configuration = {
copy(isPublic = isPublic)
}
def withExtendsConfigs(
extendsConfigs: Vector[sbt.librarymanagement.Configuration]): Configuration = {
copy(extendsConfigs = extendsConfigs)
}
def withTransitive(transitive: Boolean): Configuration = {
copy(transitive = transitive)
}
def toConfigRef: ConfigRef = ConfigRef(name)
}
object Configuration {
private[sbt] def apply(id: String, name: String): Configuration =
new Configuration(id, name, "", true, Vector.empty, true)
private[sbt] def apply(id: String,
name: String,
description: String,
isPublic: Boolean,
extendsConfigs: Vector[sbt.librarymanagement.Configuration],
transitive: Boolean): Configuration =
new Configuration(id, name, description, isPublic, extendsConfigs, transitive)
}

View File

@ -3,14 +3,18 @@
*/
package sbt.librarymanagement
import scala.annotation.tailrec
import scala.language.experimental.macros
object Configurations {
def config(name: String) = Configuration(name)
def config(name: String) = macro ConfigurationMacro.configMacroImpl
def default: Seq[Configuration] = defaultMavenConfigurations
def defaultMavenConfigurations: Seq[Configuration] =
Seq(Compile, Runtime, Test, Provided, Optional)
def defaultInternal: Seq[Configuration] = Seq(CompileInternal, RuntimeInternal, TestInternal)
def auxiliary: Seq[Configuration] = Seq(Pom)
def names(cs: Seq[Configuration]) = cs.map(_.name)
def refs(cs: Seq[Configuration]) = cs.map(_.toConfigRef)
lazy val RuntimeInternal = optionalInternal(Runtime)
lazy val TestInternal = fullInternal(Test)
@ -25,24 +29,26 @@ object Configurations {
case _ => c
}
def internal(base: Configuration, ext: Configuration*) =
config(base.name + "-internal").extend(ext: _*).hide
def fullInternal(base: Configuration): Configuration = internal(base, base, Optional, Provided)
def optionalInternal(base: Configuration): Configuration = internal(base, base, Optional)
private[sbt] def internal(base: Configuration, ext: Configuration*) =
Configuration(base.id + "Internal", base.name + "-internal").extend(ext: _*).hide
private[sbt] def fullInternal(base: Configuration): Configuration =
internal(base, base, Optional, Provided)
private[sbt] def optionalInternal(base: Configuration): Configuration =
internal(base, base, Optional)
lazy val Default = config("default")
lazy val Compile = config("compile")
lazy val IntegrationTest = config("it") extend (Runtime)
lazy val Provided = config("provided")
lazy val Runtime = config("runtime") extend (Compile)
lazy val Test = config("test") extend (Runtime)
lazy val System = config("system")
lazy val Optional = config("optional")
lazy val Pom = config("pom")
lazy val Default = Configuration("Default", "default")
lazy val Compile = Configuration("Compile", "compile")
lazy val IntegrationTest = Configuration("IntegrationTest", "it") extend (Runtime)
lazy val Provided = Configuration("Provided", "provided")
lazy val Runtime = Configuration("Runtime", "runtime") extend (Compile)
lazy val Test = Configuration("Test", "test") extend (Runtime)
lazy val System = Configuration("System", "system")
lazy val Optional = Configuration("Optional", "optional")
lazy val Pom = Configuration("Pom", "pom")
lazy val ScalaTool = config("scala-tool").hide
lazy val CompilerPlugin = config("plugin").hide
lazy val Component = config("component").hide
lazy val ScalaTool = Configuration("ScalaTool", "scala-tool").hide
lazy val CompilerPlugin = Configuration("CompilerPlugin", "plugin").hide
lazy val Component = Configuration("Component", "component").hide
private[sbt] val DefaultMavenConfiguration = defaultConfiguration(true)
private[sbt] val DefaultIvyConfiguration = defaultConfiguration(false)
@ -70,6 +76,7 @@ object Configurations {
}
abstract class ConfigurationExtra {
def id: String
def name: String
def description: String
def isPublic: Boolean
@ -80,10 +87,56 @@ abstract class ConfigurationExtra {
require(description != null)
def describedAs(newDescription: String) =
Configuration(name, newDescription, isPublic, extendsConfigs, transitive)
Configuration(id, name, newDescription, isPublic, extendsConfigs, transitive)
def extend(configs: Configuration*) =
Configuration(name, description, isPublic, configs.toVector ++ extendsConfigs, transitive)
Configuration(id, name, description, isPublic, configs.toVector ++ extendsConfigs, transitive)
def notTransitive = intransitive
def intransitive = Configuration(name, description, isPublic, extendsConfigs, false)
def hide = Configuration(name, description, false, extendsConfigs, transitive)
def intransitive = Configuration(id, name, description, isPublic, extendsConfigs, false)
def hide = Configuration(id, name, description, false, extendsConfigs, transitive)
}
private[sbt] object ConfigurationMacro {
import scala.reflect.macros._
def configMacroImpl(c: Context)(name: c.Expr[String]): c.Expr[Configuration] = {
import c.universe._
val enclosingValName = definingValName(
c,
methodName =>
s"""$methodName must be directly assigned to a val, such as `val x = $methodName`.""")
val id = c.Expr[String](Literal(Constant(enclosingValName)))
reify { Configuration(id.splice, name.splice) }
}
def definingValName(c: blackbox.Context, invalidEnclosingTree: String => String): String = {
import c.universe.{ Apply => ApplyTree, _ }
val methodName = c.macroApplication.symbol.name
def processName(n: Name): String =
n.decodedName.toString.trim // trim is not strictly correct, but macros don't expose the API necessary
@tailrec def enclosingVal(trees: List[c.Tree]): String = {
trees match {
case vd @ ValDef(_, name, _, _) :: ts => processName(name)
case (_: ApplyTree | _: Select | _: TypeApply) :: xs => enclosingVal(xs)
// lazy val x: X = <methodName> has this form for some reason (only when the explicit type is present, though)
case Block(_, _) :: DefDef(mods, name, _, _, _, _) :: xs if mods.hasFlag(Flag.LAZY) =>
processName(name)
case _ =>
c.error(c.enclosingPosition, invalidEnclosingTree(methodName.decodedName.toString))
"<error>"
}
}
enclosingVal(enclosingTrees(c).toList)
}
def enclosingTrees(c: blackbox.Context): Seq[c.Tree] =
c.asInstanceOf[reflect.macros.runtime.Context]
.callsiteTyper
.context
.enclosingContextChain
.map(_.tree.asInstanceOf[c.Tree])
}
abstract class ConfigRefFunctions {
implicit def configToConfigRef(c: Configuration): ConfigRef =
c.toConfigRef
}

View File

@ -0,0 +1,46 @@
/**
* This code is generated using [[http://www.scala-sbt.org/contraband/ sbt-contraband]].
*/
package sbt
package librarymanagement
import _root_.sjsonnew.{ deserializationError, serializationError, Builder, JsonFormat, Unbuilder }
trait ConfigurationFormats {
self: sbt.librarymanagement.ConfigurationFormats with sjsonnew.BasicJsonProtocol =>
implicit lazy val ConfigurationFormat: JsonFormat[sbt.librarymanagement.Configuration] =
new JsonFormat[sbt.librarymanagement.Configuration] {
override def read[J](jsOpt: Option[J],
unbuilder: Unbuilder[J]): sbt.librarymanagement.Configuration = {
jsOpt match {
case Some(js) =>
unbuilder.beginObject(js)
val id = unbuilder.readField[String]("id")
val name = unbuilder.readField[String]("name")
val description = unbuilder.readField[String]("description")
val isPublic = unbuilder.readField[Boolean]("isPublic")
val extendsConfigs =
unbuilder.readField[Vector[sbt.librarymanagement.Configuration]]("extendsConfigs")
val transitive = unbuilder.readField[Boolean]("transitive")
unbuilder.endObject()
new sbt.librarymanagement.Configuration(id,
name,
description,
isPublic,
extendsConfigs,
transitive)
case None =>
deserializationError("Expected JsObject but found None")
}
}
override def write[J](obj: sbt.librarymanagement.Configuration, builder: Builder[J]): Unit = {
builder.beginObject()
builder.addField("id", obj.id)
builder.addField("name", obj.name)
builder.addField("description", obj.description)
builder.addField("isPublic", obj.isPublic)
builder.addField("extendsConfigs", obj.extendsConfigs)
builder.addField("transitive", obj.transitive)
builder.endObject()
}
}
}

View File

@ -28,7 +28,7 @@ trait DependencyFilterExtra {
}
def configurationFilter(name: NameFilter = AllPassFilter): ConfigurationFilter =
new ConfigurationFilter {
def apply(c: String): Boolean = name.accept(c)
def apply(c: ConfigRef): Boolean = name.accept(c.name)
}
}
object DependencyFilter extends DependencyFilterExtra {
@ -38,7 +38,7 @@ object DependencyFilter extends DependencyFilterExtra {
artifact: ArtifactFilter = artifactFilter()
): DependencyFilter =
new DependencyFilter {
def apply(c: String, m: ModuleID, a: Artifact): Boolean =
def apply(c: ConfigRef, m: ModuleID, a: Artifact): Boolean =
configuration(c) && module(m) && artifact(a)
}
def apply(
@ -47,7 +47,7 @@ object DependencyFilter extends DependencyFilterExtra {
combine: (Boolean, Boolean) => Boolean
): DependencyFilter =
new DependencyFilter {
def apply(c: String, m: ModuleID, a: Artifact): Boolean = combine(x(c, m, a), y(c, m, a))
def apply(c: ConfigRef, m: ModuleID, a: Artifact): Boolean = combine(x(c, m, a), y(c, m, a))
}
def allPass: DependencyFilter = configurationFilter()
implicit def fnToModuleFilter(f: ModuleID => Boolean): ModuleFilter = new ModuleFilter {
@ -56,12 +56,12 @@ object DependencyFilter extends DependencyFilterExtra {
implicit def fnToArtifactFilter(f: Artifact => Boolean): ArtifactFilter = new ArtifactFilter {
def apply(m: Artifact) = f(m)
}
implicit def fnToConfigurationFilter(f: String => Boolean): ConfigurationFilter =
new ConfigurationFilter { def apply(c: String) = f(c) }
implicit def fnToConfigurationFilter(f: ConfigRef => Boolean): ConfigurationFilter =
new ConfigurationFilter { def apply(c: ConfigRef) = f(c) }
implicit def subDepFilterToFn[Arg](f: SubDepFilter[Arg, _]): Arg => Boolean = f apply _
}
trait DependencyFilter {
def apply(configuration: String, module: ModuleID, artifact: Artifact): Boolean
def apply(configuration: ConfigRef, module: ModuleID, artifact: Artifact): Boolean
final def &&(o: DependencyFilter) = DependencyFilter(this, o, _ && _)
final def ||(o: DependencyFilter) = DependencyFilter(this, o, _ || _)
final def --(o: DependencyFilter) = DependencyFilter(this, o, _ && !_)
@ -80,20 +80,20 @@ trait ModuleFilter extends SubDepFilter[ModuleID, ModuleFilter] {
protected final def make(f: ModuleID => Boolean) = new ModuleFilter {
def apply(m: ModuleID) = f(m)
}
final def apply(configuration: String, module: ModuleID, artifact: Artifact): Boolean =
final def apply(configuration: ConfigRef, module: ModuleID, artifact: Artifact): Boolean =
apply(module)
}
trait ArtifactFilter extends SubDepFilter[Artifact, ArtifactFilter] {
protected final def make(f: Artifact => Boolean) = new ArtifactFilter {
def apply(m: Artifact) = f(m)
}
final def apply(configuration: String, module: ModuleID, artifact: Artifact): Boolean =
final def apply(configuration: ConfigRef, module: ModuleID, artifact: Artifact): Boolean =
apply(artifact)
}
trait ConfigurationFilter extends SubDepFilter[String, ConfigurationFilter] {
protected final def make(f: String => Boolean) = new ConfigurationFilter {
def apply(m: String) = f(m)
trait ConfigurationFilter extends SubDepFilter[ConfigRef, ConfigurationFilter] {
protected final def make(f: ConfigRef => Boolean) = new ConfigurationFilter {
def apply(m: ConfigRef) = f(m)
}
final def apply(configuration: String, module: ModuleID, artifact: Artifact): Boolean =
final def apply(configuration: ConfigRef, module: ModuleID, artifact: Artifact): Boolean =
apply(configuration)
}

View File

@ -8,7 +8,7 @@ import sbt.util.ShowLines
import sbt.internal.librarymanagement.{ InlineConfiguration, IvySbt }
final class EvictionWarningOptions private[sbt] (
val configurations: Seq[Configuration],
val configurations: Seq[ConfigRef],
val warnScalaVersionEviction: Boolean,
val warnDirectEvictions: Boolean,
val warnTransitiveEvictions: Boolean,
@ -16,9 +16,7 @@ final class EvictionWarningOptions private[sbt] (
val showCallers: Boolean,
val guessCompatible: Function1[(ModuleID, Option[ModuleID], Option[IvyScala]), Boolean]
) {
private[sbt] def configStrings = configurations map { _.name }
def withConfigurations(configurations: Seq[Configuration]): EvictionWarningOptions =
def withConfigurations(configurations: Seq[ConfigRef]): EvictionWarningOptions =
copy(configurations = configurations)
def withWarnScalaVersionEviction(warnScalaVersionEviction: Boolean): EvictionWarningOptions =
copy(warnScalaVersionEviction = warnScalaVersionEviction)
@ -36,7 +34,7 @@ final class EvictionWarningOptions private[sbt] (
copy(guessCompatible = guessCompatible)
private[sbt] def copy(
configurations: Seq[Configuration] = configurations,
configurations: Seq[ConfigRef] = configurations,
warnScalaVersionEviction: Boolean = warnScalaVersionEviction,
warnDirectEvictions: Boolean = warnDirectEvictions,
warnTransitiveEvictions: Boolean = warnTransitiveEvictions,
@ -193,7 +191,7 @@ object EvictionWarning {
): Seq[OrganizationArtifactReport] = {
val buffer: mutable.ListBuffer[OrganizationArtifactReport] = mutable.ListBuffer()
val confs = report.configurations filter { x =>
options.configStrings contains x.configuration
options.configurations contains x.configuration
}
confs flatMap { confReport =>
confReport.details map { detail =>

View File

@ -69,7 +69,7 @@ final class RichUpdateReport(report: UpdateReport) {
}
private[sbt] def substitute(
f: (String, ModuleID, Vector[(Artifact, File)]) => Vector[(Artifact, File)]
f: (ConfigRef, ModuleID, Vector[(Artifact, File)]) => Vector[(Artifact, File)]
): UpdateReport =
moduleReportMap { (configuration, modReport) =>
val newArtifacts = f(configuration, modReport.module, modReport.artifacts)
@ -78,15 +78,15 @@ final class RichUpdateReport(report: UpdateReport) {
.withMissingArtifacts(modReport.missingArtifacts)
}
def toSeq: Seq[(String, ModuleID, Artifact, File)] = toVector
def toVector: Vector[(String, ModuleID, Artifact, File)] =
def toSeq: Seq[(ConfigRef, ModuleID, Artifact, File)] = toVector
def toVector: Vector[(ConfigRef, ModuleID, Artifact, File)] =
for {
confReport <- report.configurations
modReport <- confReport.modules
(artifact, file) <- modReport.artifacts
} yield (confReport.configuration, modReport.module, artifact, file)
def allMissing: Vector[(String, ModuleID, Artifact)] =
def allMissing: Vector[(ConfigRef, ModuleID, Artifact)] =
for {
confReport <- report.configurations
modReport <- confReport.modules
@ -99,7 +99,7 @@ final class RichUpdateReport(report: UpdateReport) {
.withMissingArtifacts((modReport.missingArtifacts ++ f(modReport.module)).distinct)
}
private[sbt] def moduleReportMap(f: (String, ModuleReport) => ModuleReport): UpdateReport = {
private[sbt] def moduleReportMap(f: (ConfigRef, ModuleReport) => ModuleReport): UpdateReport = {
val newConfigurations = report.configurations.map { confReport =>
import confReport._
val newModules = modules map { modReport =>

View File

@ -7,7 +7,7 @@ import java.io.File
import java.{ util => ju }
abstract class ConfigurationReportExtra {
def configuration: String
def configuration: ConfigRef
def modules: Vector[ModuleReport]
def details: Vector[OrganizationArtifactReport]
@ -28,7 +28,7 @@ abstract class ConfigurationReportExtra {
} else module
}
def retrieve(f: (String, ModuleID, Artifact, File) => File): ConfigurationReport =
def retrieve(f: (ConfigRef, ModuleID, Artifact, File) => File): ConfigurationReport =
ConfigurationReport(configuration, modules map {
_.retrieve((mid, art, file) => f(configuration, mid, art, file))
}, details)
@ -50,7 +50,7 @@ abstract class ModuleReportExtra {
def extraAttributes: Map[String, String]
def isDefault: Option[Boolean]
def branch: Option[String]
def configurations: Vector[String]
def configurations: Vector[ConfigRef]
def licenses: Vector[(String, Option[String])]
def callers: Vector[Caller]
@ -115,7 +115,7 @@ abstract class ModuleReportExtra {
extraAttributes: Map[String, String] = extraAttributes,
isDefault: Option[Boolean] = isDefault,
branch: Option[String] = branch,
configurations: Vector[String] = configurations,
configurations: Vector[ConfigRef] = configurations,
licenses: Vector[(String, Option[String])] = licenses,
callers: Vector[Caller] = callers
): ModuleReport
@ -144,12 +144,12 @@ abstract class UpdateReportExtra {
}
}
def retrieve(f: (String, ModuleID, Artifact, File) => File): UpdateReport =
def retrieve(f: (ConfigRef, ModuleID, Artifact, File) => File): UpdateReport =
UpdateReport(cachedDescriptor, configurations map { _ retrieve f }, stats, stamps)
/** Gets the report for the given configuration, or `None` if the configuration was not resolved.*/
def configuration(s: String) = configurations.find(_.configuration == s)
def configuration(s: ConfigRef) = configurations.find(_.configuration == s)
/** Gets the names of all resolved configurations. This `UpdateReport` contains one `ConfigurationReport` for each configuration in this list. */
def allConfigurations: Seq[String] = configurations.map(_.configuration)
def allConfigurations: Vector[ConfigRef] = configurations.map(_.configuration)
}

View File

@ -0,0 +1,61 @@
package sbt.internal.librarymanagement
import sbt.librarymanagement.Configuration
import sbt.librarymanagement.Configurations.config
import scala.util.control.NonFatal
import org.scalacheck._
import Prop._
class ConfigDefs {
lazy val Kompile = config("kompile")
val X = config("x")
val Z = config("z").hide
val A: Configuration = config("a")
lazy val Aa: Configuration = config("aa")
}
object ConfigMacroSpec extends Properties("ConfigMacroSpec") {
lazy val cd = new ConfigDefs
import cd._
def secure(f: => Prop): Prop =
try {
Prop.secure(f)
} catch {
case NonFatal(e) =>
e.printStackTrace
throw e
}
property("Explicit type on lazy val supported") = secure {
check(Aa, "Aa", "aa", true)
}
property("Explicit type on val supported") = secure {
check(A, "A", "a", true)
}
property("lazy vals supported") = secure {
check(Kompile, "Kompile", "kompile", true)
}
property("plain vals supported") = secure {
check(X, "X", "x", true)
}
property("Directory overridable") = secure {
check(Z, "Z", "z", false)
}
def check(c: Configuration, id: String, name: String, isPublic: Boolean): Prop = {
s"Expected id: $id" |:
s"Expected name: $name" |:
s"Expected isPublic: $isPublic" |:
s"Actual id: ${c.id}" |:
s"Actual name: ${c.name}" |:
s"Actual isPublic: ${c.isPublic}" |:
(c.id == id) &&
(c.name == name) &&
(c.isPublic == isPublic)
}
}

View File

@ -57,7 +57,7 @@ class DMSerializationSpec extends UnitSpec {
UpdateStats(0, 0, 0, false),
Map(new File("./foo") -> 0))
lazy val configurationReportExample =
ConfigurationReport("compile",
ConfigurationReport(ConfigRef("compile"),
Vector(moduleReportExample),
Vector(organizationArtifactReportExample))
lazy val organizationArtifactReportExample =

View File

@ -28,7 +28,7 @@ class IvyRepoSpec extends BaseIvySpecification with DependencyBuilders {
val report = ivyUpdate(m)
import Inside._
inside(report.configuration("compile").map(_.modules)) {
inside(report.configuration(ConfigRef("compile")).map(_.modules)) {
case Some(Seq(mr)) =>
inside(mr.artifacts) {
case Seq((ar, _)) =>
@ -82,7 +82,7 @@ class IvyRepoSpec extends BaseIvySpecification with DependencyBuilders {
log)
import Inside._
inside(report2.configuration("compile").map(_.modules)) {
inside(report2.configuration(ConfigRef("compile")).map(_.modules)) {
case Some(Seq(mr)) =>
inside(mr.artifacts) {
case Seq((ar, _)) =>

View File

@ -43,8 +43,10 @@ object Dependencies {
val ivy = "org.scala-sbt.ivy" % "ivy" % "2.3.0-sbt-a3314352b638afbf0dca19f127e8263ed6f898bd"
val jsch = "com.jcraft" % "jsch" % "0.1.46" intransitive ()
val scalaReflect = Def.setting { "org.scala-lang" % "scala-reflect" % scalaVersion.value }
val scalaCompiler = Def.setting { "org.scala-lang" % "scala-compiler" % scalaVersion.value }
val scalaXml = scala211Module("scala-xml", "1.0.5")
val scalaTest = "org.scalatest" %% "scalatest" % "3.0.1" % Test
val scalaCheck = "org.scalacheck" %% "scalacheck" % "1.13.4" % Test
val sjsonnew = Def.setting { "com.eed3si9n" %% "sjson-new-core" % contrabandSjsonNewVersion.value }
val sjsonnewScalaJson = Def.setting { "com.eed3si9n" %% "sjson-new-scalajson" % contrabandSjsonNewVersion.value }
val gigahorseOkhttp = "com.eed3si9n" %% "gigahorse-okhttp" % "0.3.0"