From eea840be2c14ac102a3a424d8ea4d7c0728efa33 Mon Sep 17 00:00:00 2001 From: Matthew de Detrich Date: Sun, 4 Jul 2021 15:09:59 +0200 Subject: [PATCH] Replace tuple with proper record type for licenses --- .../LibraryManagementCodec.scala | 1 + .../sbt/librarymanagement/License.scala | 53 +++++++++++++++++++ .../librarymanagement/LicenseFormats.scala | 33 ++++++++++++ ...ModuleDescriptorConfigurationFormats.scala | 2 +- .../sbt/librarymanagement/ModuleInfo.scala | 10 ++-- .../librarymanagement/ModuleInfoFormats.scala | 4 +- .../ModuleSettingsFormats.scala | 2 +- .../main/contraband/librarymanagement.json | 18 ++++++- .../scala/sbt/librarymanagement/License.scala | 25 --------- .../librarymanagement/LicenseFunctions.scala | 24 +++++++++ .../sbt/internal/librarymanagement/Ivy.scala | 2 +- main/src/main/scala/sbt/Keys.scala | 2 +- sbt-app/src/main/scala/sbt/Import.scala | 4 +- .../dependency-management/artifact/build.sbt | 2 +- 14 files changed, 142 insertions(+), 40 deletions(-) create mode 100644 lm-core/src/main/contraband-scala/sbt/librarymanagement/License.scala create mode 100644 lm-core/src/main/contraband-scala/sbt/librarymanagement/LicenseFormats.scala delete mode 100644 lm-core/src/main/scala/sbt/librarymanagement/License.scala create mode 100644 lm-core/src/main/scala/sbt/librarymanagement/LicenseFunctions.scala diff --git a/lm-core/src/main/contraband-scala/sbt/librarymanagement/LibraryManagementCodec.scala b/lm-core/src/main/contraband-scala/sbt/librarymanagement/LibraryManagementCodec.scala index 8ae764426..6e3fc2284 100644 --- a/lm-core/src/main/contraband-scala/sbt/librarymanagement/LibraryManagementCodec.scala +++ b/lm-core/src/main/contraband-scala/sbt/librarymanagement/LibraryManagementCodec.scala @@ -49,6 +49,7 @@ trait LibraryManagementCodec extends sbt.librarymanagement.ConfigRefFormats with sbt.librarymanagement.SftpRepositoryFormats with sbt.librarymanagement.ResolverFormats with sbt.librarymanagement.ModuleConfigurationFormats + with sbt.librarymanagement.LicenseFormats with sbt.librarymanagement.ScmInfoFormats with sbt.librarymanagement.ModuleInfoFormats with sbt.librarymanagement.IvyFileConfigurationFormats diff --git a/lm-core/src/main/contraband-scala/sbt/librarymanagement/License.scala b/lm-core/src/main/contraband-scala/sbt/librarymanagement/License.scala new file mode 100644 index 000000000..36ace0cdc --- /dev/null +++ b/lm-core/src/main/contraband-scala/sbt/librarymanagement/License.scala @@ -0,0 +1,53 @@ +/** + * This code is generated using [[https://www.scala-sbt.org/contraband]]. + */ + +// DO NOT EDIT MANUALLY +package sbt.librarymanagement +/** Basic license information for a project module */ +final class License private ( + val spdxId: String, + val uri: java.net.URI, + val distribution: Option[String], + val comments: Option[String]) extends Serializable { + + private def this(spdxId: String, uri: java.net.URI) = this(spdxId, uri, None, None) + + override def equals(o: Any): Boolean = this.eq(o.asInstanceOf[AnyRef]) || (o match { + case x: License => (this.spdxId == x.spdxId) && (this.uri == x.uri) && (this.distribution == x.distribution) && (this.comments == x.comments) + case _ => false + }) + override def hashCode: Int = { + 37 * (37 * (37 * (37 * (37 * (17 + "sbt.librarymanagement.License".##) + spdxId.##) + uri.##) + distribution.##) + comments.##) + } + override def toString: String = { + "License(" + spdxId + ", " + uri + ", " + distribution + ", " + comments + ")" + } + private def copy(spdxId: String = spdxId, uri: java.net.URI = uri, distribution: Option[String] = distribution, comments: Option[String] = comments): License = { + new License(spdxId, uri, distribution, comments) + } + def withSpdxId(spdxId: String): License = { + copy(spdxId = spdxId) + } + def withUri(uri: java.net.URI): License = { + copy(uri = uri) + } + def withDistribution(distribution: Option[String]): License = { + copy(distribution = distribution) + } + def withDistribution(distribution: String): License = { + copy(distribution = Option(distribution)) + } + def withComments(comments: Option[String]): License = { + copy(comments = comments) + } + def withComments(comments: String): License = { + copy(comments = Option(comments)) + } +} +object License extends sbt.librarymanagement.LicenseFunctions { + + def apply(spdxId: String, uri: java.net.URI): License = new License(spdxId, uri) + def apply(spdxId: String, uri: java.net.URI, distribution: Option[String], comments: Option[String]): License = new License(spdxId, uri, distribution, comments) + def apply(spdxId: String, uri: java.net.URI, distribution: String, comments: String): License = new License(spdxId, uri, Option(distribution), Option(comments)) +} diff --git a/lm-core/src/main/contraband-scala/sbt/librarymanagement/LicenseFormats.scala b/lm-core/src/main/contraband-scala/sbt/librarymanagement/LicenseFormats.scala new file mode 100644 index 000000000..adb368bf6 --- /dev/null +++ b/lm-core/src/main/contraband-scala/sbt/librarymanagement/LicenseFormats.scala @@ -0,0 +1,33 @@ +/** + * This code is generated using [[https://www.scala-sbt.org/contraband]]. + */ + +// DO NOT EDIT MANUALLY +package sbt.librarymanagement +import _root_.sjsonnew.{ Unbuilder, Builder, JsonFormat, deserializationError } +trait LicenseFormats { self: sjsonnew.BasicJsonProtocol => +implicit lazy val LicenseFormat: JsonFormat[sbt.librarymanagement.License] = new JsonFormat[sbt.librarymanagement.License] { + override def read[J](__jsOpt: Option[J], unbuilder: Unbuilder[J]): sbt.librarymanagement.License = { + __jsOpt match { + case Some(__js) => + unbuilder.beginObject(__js) + val spdxId = unbuilder.readField[String]("spdxId") + val uri = unbuilder.readField[java.net.URI]("uri") + val distribution = unbuilder.readField[Option[String]]("distribution") + val comments = unbuilder.readField[Option[String]]("comments") + unbuilder.endObject() + sbt.librarymanagement.License(spdxId, uri, distribution, comments) + case None => + deserializationError("Expected JsObject but found None") + } + } + override def write[J](obj: sbt.librarymanagement.License, builder: Builder[J]): Unit = { + builder.beginObject() + builder.addField("spdxId", obj.spdxId) + builder.addField("uri", obj.uri) + builder.addField("distribution", obj.distribution) + builder.addField("comments", obj.comments) + builder.endObject() + } +} +} diff --git a/lm-core/src/main/contraband-scala/sbt/librarymanagement/ModuleDescriptorConfigurationFormats.scala b/lm-core/src/main/contraband-scala/sbt/librarymanagement/ModuleDescriptorConfigurationFormats.scala index 8ba18ca15..aa9a04d0d 100644 --- a/lm-core/src/main/contraband-scala/sbt/librarymanagement/ModuleDescriptorConfigurationFormats.scala +++ b/lm-core/src/main/contraband-scala/sbt/librarymanagement/ModuleDescriptorConfigurationFormats.scala @@ -5,7 +5,7 @@ // DO NOT EDIT MANUALLY package sbt.librarymanagement import _root_.sjsonnew.{ Unbuilder, Builder, JsonFormat, deserializationError } -trait ModuleDescriptorConfigurationFormats { self: sbt.librarymanagement.ScalaModuleInfoFormats & sbt.librarymanagement.ConfigurationFormats & sjsonnew.BasicJsonProtocol & sbt.librarymanagement.ModuleIDFormats & sbt.librarymanagement.ArtifactFormats & sbt.librarymanagement.ConfigRefFormats & sbt.librarymanagement.ChecksumFormats & sbt.librarymanagement.InclExclRuleFormats & sbt.librarymanagement.CrossVersionFormats & sbt.librarymanagement.DisabledFormats & sbt.librarymanagement.BinaryFormats & sbt.librarymanagement.ConstantFormats & sbt.librarymanagement.PatchFormats & sbt.librarymanagement.FullFormats & sbt.librarymanagement.For3Use2_13Formats & sbt.librarymanagement.For2_13Use3Formats & sbt.librarymanagement.ModuleInfoFormats & sbt.librarymanagement.ScmInfoFormats & sbt.librarymanagement.DeveloperFormats & sbt.internal.librarymanagement.formats.NodeSeqFormat & sbt.librarymanagement.ConflictManagerFormats => +trait ModuleDescriptorConfigurationFormats { self: sbt.librarymanagement.ScalaModuleInfoFormats & sbt.librarymanagement.ConfigurationFormats & sjsonnew.BasicJsonProtocol & sbt.librarymanagement.ModuleIDFormats & sbt.librarymanagement.ArtifactFormats & sbt.librarymanagement.ConfigRefFormats & sbt.librarymanagement.ChecksumFormats & sbt.librarymanagement.InclExclRuleFormats & sbt.librarymanagement.CrossVersionFormats & sbt.librarymanagement.DisabledFormats & sbt.librarymanagement.BinaryFormats & sbt.librarymanagement.ConstantFormats & sbt.librarymanagement.PatchFormats & sbt.librarymanagement.FullFormats & sbt.librarymanagement.For3Use2_13Formats & sbt.librarymanagement.For2_13Use3Formats & sbt.librarymanagement.ModuleInfoFormats & sbt.librarymanagement.LicenseFormats & sbt.librarymanagement.ScmInfoFormats & sbt.librarymanagement.DeveloperFormats & sbt.internal.librarymanagement.formats.NodeSeqFormat & sbt.librarymanagement.ConflictManagerFormats => implicit lazy val ModuleDescriptorConfigurationFormat: JsonFormat[sbt.librarymanagement.ModuleDescriptorConfiguration] = new JsonFormat[sbt.librarymanagement.ModuleDescriptorConfiguration] { override def read[J](__jsOpt: Option[J], unbuilder: Unbuilder[J]): sbt.librarymanagement.ModuleDescriptorConfiguration = { __jsOpt match { diff --git a/lm-core/src/main/contraband-scala/sbt/librarymanagement/ModuleInfo.scala b/lm-core/src/main/contraband-scala/sbt/librarymanagement/ModuleInfo.scala index e445fa46c..05ec33984 100644 --- a/lm-core/src/main/contraband-scala/sbt/librarymanagement/ModuleInfo.scala +++ b/lm-core/src/main/contraband-scala/sbt/librarymanagement/ModuleInfo.scala @@ -10,13 +10,14 @@ final class ModuleInfo private ( val description: String, val homepage: Option[java.net.URI], val startYear: Option[Int], - val licenses: Vector[scala.Tuple2[String, java.net.URI]], + val licenses: Vector[sbt.librarymanagement.License], val organizationName: String, val organizationHomepage: Option[java.net.URI], val scmInfo: Option[sbt.librarymanagement.ScmInfo], val developers: Vector[sbt.librarymanagement.Developer]) extends Serializable { private def this(nameFormal: String) = this(nameFormal, "", None, None, Vector.empty, "", None, None, Vector.empty) + private def this(nameFormal: String, description: String, homepage: Option[java.net.URI], startYear: Option[Int], organizationName: String, organizationHomepage: Option[java.net.URI], scmInfo: Option[sbt.librarymanagement.ScmInfo], developers: Vector[sbt.librarymanagement.Developer]) = this(nameFormal, description, homepage, startYear, Vector.empty, organizationName, organizationHomepage, scmInfo, developers) override def equals(o: Any): Boolean = this.eq(o.asInstanceOf[AnyRef]) || (o match { case x: ModuleInfo => (this.nameFormal == x.nameFormal) && (this.description == x.description) && (this.homepage == x.homepage) && (this.startYear == x.startYear) && (this.licenses == x.licenses) && (this.organizationName == x.organizationName) && (this.organizationHomepage == x.organizationHomepage) && (this.scmInfo == x.scmInfo) && (this.developers == x.developers) @@ -28,7 +29,7 @@ final class ModuleInfo private ( override def toString: String = { "ModuleInfo(" + nameFormal + ", " + description + ", " + homepage + ", " + startYear + ", " + licenses + ", " + organizationName + ", " + organizationHomepage + ", " + scmInfo + ", " + developers + ")" } - private def copy(nameFormal: String = nameFormal, description: String = description, homepage: Option[java.net.URI] = homepage, startYear: Option[Int] = startYear, licenses: Vector[scala.Tuple2[String, java.net.URI]] = licenses, organizationName: String = organizationName, organizationHomepage: Option[java.net.URI] = organizationHomepage, scmInfo: Option[sbt.librarymanagement.ScmInfo] = scmInfo, developers: Vector[sbt.librarymanagement.Developer] = developers): ModuleInfo = { + private def copy(nameFormal: String = nameFormal, description: String = description, homepage: Option[java.net.URI] = homepage, startYear: Option[Int] = startYear, licenses: Vector[sbt.librarymanagement.License] = licenses, organizationName: String = organizationName, organizationHomepage: Option[java.net.URI] = organizationHomepage, scmInfo: Option[sbt.librarymanagement.ScmInfo] = scmInfo, developers: Vector[sbt.librarymanagement.Developer] = developers): ModuleInfo = { new ModuleInfo(nameFormal, description, homepage, startYear, licenses, organizationName, organizationHomepage, scmInfo, developers) } def withNameFormal(nameFormal: String): ModuleInfo = { @@ -43,7 +44,7 @@ final class ModuleInfo private ( def withStartYear(startYear: Option[Int]): ModuleInfo = { copy(startYear = startYear) } - def withLicenses(licenses: Vector[scala.Tuple2[String, java.net.URI]]): ModuleInfo = { + def withLicenses(licenses: Vector[sbt.librarymanagement.License]): ModuleInfo = { copy(licenses = licenses) } def withOrganizationName(organizationName: String): ModuleInfo = { @@ -62,5 +63,6 @@ final class ModuleInfo private ( object ModuleInfo { def apply(nameFormal: String): ModuleInfo = new ModuleInfo(nameFormal) - def apply(nameFormal: String, description: String, homepage: Option[java.net.URI], startYear: Option[Int], licenses: Vector[scala.Tuple2[String, java.net.URI]], organizationName: String, organizationHomepage: Option[java.net.URI], scmInfo: Option[sbt.librarymanagement.ScmInfo], developers: Vector[sbt.librarymanagement.Developer]): ModuleInfo = new ModuleInfo(nameFormal, description, homepage, startYear, licenses, organizationName, organizationHomepage, scmInfo, developers) + def apply(nameFormal: String, description: String, homepage: Option[java.net.URI], startYear: Option[Int], organizationName: String, organizationHomepage: Option[java.net.URI], scmInfo: Option[sbt.librarymanagement.ScmInfo], developers: Vector[sbt.librarymanagement.Developer]): ModuleInfo = new ModuleInfo(nameFormal, description, homepage, startYear, organizationName, organizationHomepage, scmInfo, developers) + def apply(nameFormal: String, description: String, homepage: Option[java.net.URI], startYear: Option[Int], licenses: Vector[sbt.librarymanagement.License], organizationName: String, organizationHomepage: Option[java.net.URI], scmInfo: Option[sbt.librarymanagement.ScmInfo], developers: Vector[sbt.librarymanagement.Developer]): ModuleInfo = new ModuleInfo(nameFormal, description, homepage, startYear, licenses, organizationName, organizationHomepage, scmInfo, developers) } diff --git a/lm-core/src/main/contraband-scala/sbt/librarymanagement/ModuleInfoFormats.scala b/lm-core/src/main/contraband-scala/sbt/librarymanagement/ModuleInfoFormats.scala index b66b28756..d2c1f39c0 100644 --- a/lm-core/src/main/contraband-scala/sbt/librarymanagement/ModuleInfoFormats.scala +++ b/lm-core/src/main/contraband-scala/sbt/librarymanagement/ModuleInfoFormats.scala @@ -5,7 +5,7 @@ // DO NOT EDIT MANUALLY package sbt.librarymanagement import _root_.sjsonnew.{ Unbuilder, Builder, JsonFormat, deserializationError } -trait ModuleInfoFormats { self: sbt.librarymanagement.ScmInfoFormats & sbt.librarymanagement.DeveloperFormats & sjsonnew.BasicJsonProtocol => +trait ModuleInfoFormats { self: sbt.librarymanagement.LicenseFormats & sjsonnew.BasicJsonProtocol & sbt.librarymanagement.ScmInfoFormats & sbt.librarymanagement.DeveloperFormats => implicit lazy val ModuleInfoFormat: JsonFormat[sbt.librarymanagement.ModuleInfo] = new JsonFormat[sbt.librarymanagement.ModuleInfo] { override def read[J](__jsOpt: Option[J], unbuilder: Unbuilder[J]): sbt.librarymanagement.ModuleInfo = { __jsOpt match { @@ -15,7 +15,7 @@ implicit lazy val ModuleInfoFormat: JsonFormat[sbt.librarymanagement.ModuleInfo] val description = unbuilder.readField[String]("description") val homepage = unbuilder.readField[Option[java.net.URI]]("homepage") val startYear = unbuilder.readField[Option[Int]]("startYear") - val licenses = unbuilder.readField[Vector[scala.Tuple2[String, java.net.URI]]]("licenses") + val licenses = unbuilder.readField[Vector[sbt.librarymanagement.License]]("licenses") val organizationName = unbuilder.readField[String]("organizationName") val organizationHomepage = unbuilder.readField[Option[java.net.URI]]("organizationHomepage") val scmInfo = unbuilder.readField[Option[sbt.librarymanagement.ScmInfo]]("scmInfo") diff --git a/lm-core/src/main/contraband-scala/sbt/librarymanagement/ModuleSettingsFormats.scala b/lm-core/src/main/contraband-scala/sbt/librarymanagement/ModuleSettingsFormats.scala index 516a8e998..65024b92a 100644 --- a/lm-core/src/main/contraband-scala/sbt/librarymanagement/ModuleSettingsFormats.scala +++ b/lm-core/src/main/contraband-scala/sbt/librarymanagement/ModuleSettingsFormats.scala @@ -6,6 +6,6 @@ package sbt.librarymanagement import _root_.sjsonnew.JsonFormat -trait ModuleSettingsFormats { self: sbt.librarymanagement.ScalaModuleInfoFormats & sbt.librarymanagement.ConfigurationFormats & sjsonnew.BasicJsonProtocol & sbt.librarymanagement.IvyFileConfigurationFormats & sbt.librarymanagement.PomConfigurationFormats & sbt.librarymanagement.ModuleIDFormats & sbt.librarymanagement.ArtifactFormats & sbt.librarymanagement.ConfigRefFormats & sbt.librarymanagement.ChecksumFormats & sbt.librarymanagement.InclExclRuleFormats & sbt.librarymanagement.CrossVersionFormats & sbt.librarymanagement.DisabledFormats & sbt.librarymanagement.BinaryFormats & sbt.librarymanagement.ConstantFormats & sbt.librarymanagement.PatchFormats & sbt.librarymanagement.FullFormats & sbt.librarymanagement.For3Use2_13Formats & sbt.librarymanagement.For2_13Use3Formats & sbt.librarymanagement.ModuleInfoFormats & sbt.librarymanagement.ScmInfoFormats & sbt.librarymanagement.DeveloperFormats & sbt.internal.librarymanagement.formats.NodeSeqFormat & sbt.librarymanagement.ConflictManagerFormats & sbt.librarymanagement.ModuleDescriptorConfigurationFormats => +trait ModuleSettingsFormats { self: sbt.librarymanagement.ScalaModuleInfoFormats & sbt.librarymanagement.ConfigurationFormats & sjsonnew.BasicJsonProtocol & sbt.librarymanagement.IvyFileConfigurationFormats & sbt.librarymanagement.PomConfigurationFormats & sbt.librarymanagement.ModuleIDFormats & sbt.librarymanagement.ArtifactFormats & sbt.librarymanagement.ConfigRefFormats & sbt.librarymanagement.ChecksumFormats & sbt.librarymanagement.InclExclRuleFormats & sbt.librarymanagement.CrossVersionFormats & sbt.librarymanagement.DisabledFormats & sbt.librarymanagement.BinaryFormats & sbt.librarymanagement.ConstantFormats & sbt.librarymanagement.PatchFormats & sbt.librarymanagement.FullFormats & sbt.librarymanagement.For3Use2_13Formats & sbt.librarymanagement.For2_13Use3Formats & sbt.librarymanagement.ModuleInfoFormats & sbt.librarymanagement.LicenseFormats & sbt.librarymanagement.ScmInfoFormats & sbt.librarymanagement.DeveloperFormats & sbt.internal.librarymanagement.formats.NodeSeqFormat & sbt.librarymanagement.ConflictManagerFormats & sbt.librarymanagement.ModuleDescriptorConfigurationFormats => implicit lazy val ModuleSettingsFormat: JsonFormat[sbt.librarymanagement.ModuleSettings] = flatUnionFormat3[sbt.librarymanagement.ModuleSettings, sbt.librarymanagement.IvyFileConfiguration, sbt.librarymanagement.PomConfiguration, sbt.librarymanagement.ModuleDescriptorConfiguration]("type") } diff --git a/lm-core/src/main/contraband/librarymanagement.json b/lm-core/src/main/contraband/librarymanagement.json index 37ede5b91..3a517b725 100644 --- a/lm-core/src/main/contraband/librarymanagement.json +++ b/lm-core/src/main/contraband/librarymanagement.json @@ -367,11 +367,11 @@ { "name": "description", "type": "String", "default": "\"\"", "since": "0.0.1" }, { "name": "homepage", "type": "Option[java.net.URI]", "default": "None", "since": "0.0.1" }, { "name": "startYear", "type": "Option[Int]", "default": "None", "since": "0.0.1" }, - { "name": "licenses", "type": "scala.Tuple2[String, java.net.URI]*", "default": "Vector.empty", "since": "0.0.1" }, + { "name": "licenses", "type": "sbt.librarymanagement.License*", "default": "Vector.empty", "since": "2.0.0" }, { "name": "organizationName", "type": "String", "default": "\"\"", "since": "0.0.1" }, { "name": "organizationHomepage", "type": "Option[java.net.URI]", "default": "None", "since": "0.0.1" }, { "name": "scmInfo", "type": "Option[sbt.librarymanagement.ScmInfo]", "default": "None", "since": "0.0.1" }, - { "name": "developers", "type": "sbt.librarymanagement.Developer*", "default": "Vector.empty", "since": "0.0.1" } + { "name": "developers", "type": "sbt.librarymanagement.Developer*", "default": "Vector.empty", "since": "0.0.1" } ] }, { @@ -733,6 +733,20 @@ { "name": "devConnection", "type": "String?", "default": "None", "since": "0.0.1" } ] }, + { + "name": "License", + "namespace": "sbt.librarymanagement", + "target": "Scala", + "type": "record", + "doc": "Basic license information for a project module", + "fields": [ + { "name": "spdxId", "type": "String" }, + { "name": "uri", "type": "java.net.URI" }, + { "name": "distribution", "type": "String?", "default": "None", "since": "0.0.1" }, + { "name": "comments", "type": "String?", "default": "None", "since": "0.0.1" } + ], + "parentsCompanion": "sbt.librarymanagement.LicenseFunctions" + }, { "name": "SshAuthentication", "namespace": "sbt.librarymanagement", diff --git a/lm-core/src/main/scala/sbt/librarymanagement/License.scala b/lm-core/src/main/scala/sbt/librarymanagement/License.scala deleted file mode 100644 index a8ac31088..000000000 --- a/lm-core/src/main/scala/sbt/librarymanagement/License.scala +++ /dev/null @@ -1,25 +0,0 @@ -package sbt.librarymanagement - -import java.net.URL -import java.net.URI - -/** - * Commonly used software licenses - * Names are SPDX ids: - * https://raw.githubusercontent.com/spdx/license-list-data/master/json/licenses.json - */ -object License { - lazy val Apache2: (String, URL) = - ("Apache-2.0", new URI("https://www.apache.org/licenses/LICENSE-2.0.txt").toURL) - - lazy val MIT: (String, URL) = - ("MIT", new URI("https://opensource.org/licenses/MIT").toURL) - - lazy val CC0: (String, URL) = - ("CC0-1.0", new URI("https://creativecommons.org/publicdomain/zero/1.0/legalcode").toURL) - - def PublicDomain: (String, URL) = CC0 - - lazy val GPL3_or_later: (String, URL) = - ("GPL-3.0-or-later", new URI("https://spdx.org/licenses/GPL-3.0-or-later.html").toURL) -} diff --git a/lm-core/src/main/scala/sbt/librarymanagement/LicenseFunctions.scala b/lm-core/src/main/scala/sbt/librarymanagement/LicenseFunctions.scala new file mode 100644 index 000000000..62d971d53 --- /dev/null +++ b/lm-core/src/main/scala/sbt/librarymanagement/LicenseFunctions.scala @@ -0,0 +1,24 @@ +package sbt.librarymanagement + +import java.net.URI + +/** + * Commonly used software licenses + * Names are SPDX ids: + * https://raw.githubusercontent.com/spdx/license-list-data/master/json/licenses.json + */ +trait LicenseFunctions: + lazy val Apache2: License = + License("Apache-2.0", URI("https://www.apache.org/licenses/LICENSE-2.0.txt")) + + lazy val MIT: License = + License("MIT", URI("https://opensource.org/licenses/MIT")) + + lazy val CC0: License = + License("CC0-1.0", URI("https://creativecommons.org/publicdomain/zero/1.0/legalcode")) + + def PublicDomain: License = CC0 + + lazy val GPL3_or_later: License = + License("GPL-3.0-or-later", URI("https://spdx.org/licenses/GPL-3.0-or-later.html")) +end LicenseFunctions diff --git a/lm-ivy/src/main/scala/sbt/internal/librarymanagement/Ivy.scala b/lm-ivy/src/main/scala/sbt/internal/librarymanagement/Ivy.scala index a6557e142..7dbc001b3 100644 --- a/lm-ivy/src/main/scala/sbt/internal/librarymanagement/Ivy.scala +++ b/lm-ivy/src/main/scala/sbt/internal/librarymanagement/Ivy.scala @@ -332,7 +332,7 @@ final class IvySbt( mod.setHomePage(h.toString) } moduleInfo.licenses foreach { l => - mod.addLicense(new License(l._1, l._2.toString)) + mod.addLicense(new License(l.spdxId, l.uri.toString)) } IvySbt.addConfigurations(mod, configurations) IvySbt.addArtifacts(mod, module.explicitArtifacts) diff --git a/main/src/main/scala/sbt/Keys.scala b/main/src/main/scala/sbt/Keys.scala index 78421ccf2..5ffe3ac2a 100644 --- a/main/src/main/scala/sbt/Keys.scala +++ b/main/src/main/scala/sbt/Keys.scala @@ -381,7 +381,7 @@ object Keys { val description = settingKey[String]("Project description.").withRank(BSetting) val homepage = settingKey[Option[URI]]("Project homepage.").withRank(BSetting) val startYear = settingKey[Option[Int]]("Year in which the project started.").withRank(BMinusSetting) - val licenses = settingKey[Seq[(String, URI)]]("Project licenses as (name, url) pairs.").withRank(BMinusSetting) + val licenses = settingKey[Seq[License]]("Project licenses as (name, url) pairs.").withRank(BMinusSetting) val organization = settingKey[String]("Organization/group ID.").withRank(APlusSetting) val organizationName = settingKey[String]("Organization full/formal name.").withRank(BMinusSetting) val organizationHomepage = settingKey[Option[URI]]("Organization homepage.").withRank(BMinusSetting) diff --git a/sbt-app/src/main/scala/sbt/Import.scala b/sbt-app/src/main/scala/sbt/Import.scala index 394be5f54..51af25035 100644 --- a/sbt-app/src/main/scala/sbt/Import.scala +++ b/sbt-app/src/main/scala/sbt/Import.scala @@ -309,8 +309,8 @@ trait Import { given Conversion[DependencyBuilders.OrganizationArtifactName, InclExclRule] = InclExclRule.organizationArtifactNameToExclusionRule - // todo: fix - // val License = sbt.librarymanagement.License + type License = sbt.librarymanagement.License + val License = sbt.librarymanagement.License type LogicalClock = sbt.librarymanagement.LogicalClock val LogicalClock = sbt.librarymanagement.LogicalClock diff --git a/sbt-app/src/sbt-test/dependency-management/artifact/build.sbt b/sbt-app/src/sbt-test/dependency-management/artifact/build.sbt index f8fcd2b57..42118a035 100644 --- a/sbt-app/src/sbt-test/dependency-management/artifact/build.sbt +++ b/sbt-app/src/sbt-test/dependency-management/artifact/build.sbt @@ -10,7 +10,7 @@ ThisBuild / version := "0.1.0-SNAPSHOT" ThisBuild / organization := "com.example" ThisBuild / organizationName := "example" ThisBuild / csrCacheDirectory := (ThisBuild / baseDirectory).value / "coursier-cache" -// ThisBuild / licenses := List(License.Apache2) +ThisBuild / licenses += License.Apache2 lazy val Dev = config("dev").extend(Compile) .describedAs("Dependencies required for development environments")