mirror of https://github.com/sbt/sbt.git
bump to util 0.1.0-M2 and migrated to scalatest
This commit is contained in:
parent
734923fbae
commit
dbf9dc7450
|
|
@ -40,7 +40,7 @@ lazy val root = (project in file(".")).
|
|||
bintrayPackage := "librarymanagement"
|
||||
)),
|
||||
commonSettings,
|
||||
// rootSettings,
|
||||
name := "LM Root",
|
||||
publish := {},
|
||||
publishLocal := {},
|
||||
publishArtifact := false
|
||||
|
|
@ -49,8 +49,11 @@ lazy val root = (project in file(".")).
|
|||
lazy val lm = (project in file("librarymanagement")).
|
||||
settings(
|
||||
commonSettings,
|
||||
libraryDependencies ++= Seq(utilLogging, utilLogging),
|
||||
libraryDependencies ++= Seq(sbtIO, utilCollection, ivy, jsch, sbtSerialization, scalaReflect.value, launcherInterface),
|
||||
libraryDependencies ++= Seq(
|
||||
utilLogging, (utilLogging % Test).classifier("tests"),
|
||||
sbtIO, (sbtIO % Test).classifier("tests"),
|
||||
utilTesting % Test,
|
||||
utilCollection, ivy, jsch, sbtSerialization, scalaReflect.value, launcherInterface),
|
||||
resourceGenerators in Compile <+= (version, resourceManaged, streams, compile in Compile) map Util.generateVersionFile,
|
||||
name := "librarymanagement"
|
||||
)
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ package sbt
|
|||
|
||||
import java.io.{ File, FileOutputStream }
|
||||
import java.util.concurrent.Callable
|
||||
import sbt.internal.util.Logger
|
||||
|
||||
/**
|
||||
* A component manager provides access to the pieces of xsbt that are distributed as components.
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
package sbt
|
||||
|
||||
import DependencyFilter._
|
||||
import sbt.internal.util.{ Logger, Level }
|
||||
|
||||
/**
|
||||
* Provide warnings for cross version conflicts.
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ import java.io.{ IOException, File }
|
|||
import org.apache.ivy.util.{ FileUtil, ChecksumHelper }
|
||||
import org.apache.ivy.core.module.descriptor.{ Artifact => IArtifact }
|
||||
import sbt.io.IO
|
||||
import sbt.internal.util.Logger
|
||||
|
||||
private[sbt] object ConvertResolver {
|
||||
import UpdateOptions.ResolverConverter
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ package sbt
|
|||
import java.io.File
|
||||
import org.apache.ivy.util.url.CredentialsStore
|
||||
import sbt.io.IO
|
||||
import sbt.internal.util.Logger
|
||||
|
||||
object Credentials {
|
||||
def apply(realm: String, host: String, userName: String, passwd: String): Credentials =
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ package sbt
|
|||
import collection.mutable
|
||||
import Configurations.Compile
|
||||
import ScalaArtifacts.{ LibraryID, CompilerID }
|
||||
import sbt.internal.util.{ Logger, ShowLines }
|
||||
|
||||
final class EvictionWarningOptions private[sbt] (
|
||||
val configurations: Seq[Configuration],
|
||||
|
|
|
|||
|
|
@ -39,6 +39,8 @@ import org.apache.ivy.util.extendable.ExtendableItem
|
|||
import scala.xml.{ NodeSeq, Text }
|
||||
import scala.collection.mutable
|
||||
|
||||
import sbt.internal.util.Logger
|
||||
|
||||
final class IvySbt(val configuration: IvyConfiguration) {
|
||||
import configuration.baseDirectory
|
||||
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@ import org.apache.ivy.core.report.ResolveReport
|
|||
import org.apache.ivy.core.resolve.ResolveOptions
|
||||
import org.apache.ivy.plugins.resolver.{ BasicResolver, DependencyResolver }
|
||||
import sbt.io.{ IO, PathFinder }
|
||||
import sbt.internal.util.{ Logger, ShowLines, SourcePosition, LinePosition, RangePosition, LineRange }
|
||||
|
||||
final class DeliverConfiguration(val deliverIvyPattern: String, val status: String, val configurations: Option[Seq[Configuration]], val logging: UpdateLogging.Value)
|
||||
final class PublishConfiguration(val ivyFile: Option[File], val resolverName: String, val artifacts: Map[Artifact, File], val checksums: Seq[String], val logging: UpdateLogging.Value,
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ import org.apache.ivy.plugins.repository.{ ArtifactResourceResolver, Resource, R
|
|||
import org.apache.ivy.plugins.resolver.util.ResolvedResource
|
||||
import org.apache.ivy.util.FileUtil
|
||||
import sbt.io.Path
|
||||
import sbt.internal.util.Logger
|
||||
|
||||
class NotInCache(val id: ModuleID, cause: Throwable)
|
||||
extends RuntimeException(NotInCache(id, cause), cause) {
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ package sbt
|
|||
import java.io.File
|
||||
import java.net.{ URI, URL }
|
||||
import scala.xml.NodeSeq
|
||||
import sbt.internal.util.Logger
|
||||
|
||||
final class IvyPaths(val baseDirectory: File, val ivyHome: Option[File]) {
|
||||
def withBase(newBaseDirectory: File) = new IvyPaths(newBaseDirectory, ivyHome)
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
package sbt
|
||||
|
||||
import org.apache.ivy.util.{ Message, MessageLogger, MessageLoggerEngine }
|
||||
import sbt.internal.util.Logger
|
||||
|
||||
/** Interface to Ivy logging. */
|
||||
private final class IvyLoggerInterface(logger: Logger) extends MessageLogger {
|
||||
|
|
|
|||
|
|
@ -11,6 +11,8 @@ import org.apache.ivy.core.module.descriptor.{ DependencyDescriptor, DefaultModu
|
|||
import org.apache.ivy.core.module.id.{ ArtifactId, ModuleId, ModuleRevisionId }
|
||||
import org.apache.ivy.plugins.matcher.ExactPatternMatcher
|
||||
|
||||
import sbt.internal.util.Logger
|
||||
|
||||
object ScalaArtifacts {
|
||||
val Organization = "org.scala-lang"
|
||||
val LibraryID = "scala-library"
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ import org.apache.ivy.core
|
|||
import core.module.descriptor.ModuleDescriptor
|
||||
import sbt.serialization._
|
||||
import java.net.{ URLEncoder, URLDecoder }
|
||||
import sbt.internal.util.Logger
|
||||
|
||||
private[sbt] object JsonUtil {
|
||||
def sbtOrgTemp = "org.scala-sbt.temp"
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@
|
|||
package sbt
|
||||
|
||||
import java.io.File
|
||||
import sbt.internal.util.Logger
|
||||
|
||||
import sbt.mavenint.PomExtraDependencyAttributes
|
||||
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ package sbt
|
|||
import java.io.File
|
||||
import org.apache.ivy.plugins.resolver.DependencyResolver
|
||||
import org.apache.ivy.core.settings.IvySettings
|
||||
import sbt.internal.util.Logger
|
||||
|
||||
/**
|
||||
* Represents configurable options for update task.
|
||||
|
|
|
|||
|
|
@ -23,6 +23,7 @@ import Configurations.{ System => _, _ }
|
|||
import annotation.tailrec
|
||||
import scala.concurrent.duration._
|
||||
import sbt.io.{ DirectoryFilter, Hash, IO, Path }
|
||||
import sbt.internal.util.Logger
|
||||
|
||||
private[sbt] object CachedResolutionResolveCache {
|
||||
def createID(organization: String, name: String, revision: String) =
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@ import org.apache.ivy.plugins.repository.url.URLResource
|
|||
import org.apache.ivy.plugins.resolver._
|
||||
import org.apache.ivy.plugins.resolver.util.{ HasLatestStrategy, ResolvedResource }
|
||||
import org.apache.ivy.util.{ Message, StringUtils => IvyStringUtils }
|
||||
import sbt.internal.util.Logger
|
||||
|
||||
private[sbt] case class SbtChainResolver(
|
||||
name: String,
|
||||
|
|
|
|||
|
|
@ -3,11 +3,12 @@ package sbt
|
|||
import sbt.io.Path._, Configurations._
|
||||
import sbt.io.IO
|
||||
import java.io.File
|
||||
import org.specs2._
|
||||
import cross.CrossVersionUtil
|
||||
import sbt.ivyint.SbtChainResolver
|
||||
import sbt.internal.util.{ Logger, ConsoleLogger }
|
||||
import sbt.internal.util.UnitSpec
|
||||
|
||||
trait BaseIvySpecification extends Specification {
|
||||
trait BaseIvySpecification extends UnitSpec {
|
||||
def currentBase: File = new File(".")
|
||||
def currentTarget: File = currentBase / "target" / "ivyhome"
|
||||
def currentManaged: File = currentBase / "target" / "lib_managed"
|
||||
|
|
|
|||
|
|
@ -1,33 +1,11 @@
|
|||
package sbt
|
||||
|
||||
import org.specs2._
|
||||
import sbt.internal.util.ShowLines
|
||||
|
||||
class CachedResolutionSpec extends BaseIvySpecification {
|
||||
def is = args(sequential = true) ^ s2"""
|
||||
|
||||
This is a specification to check the cached resolution
|
||||
|
||||
Resolving the same module twice should
|
||||
work $e1
|
||||
|
||||
Resolving the unsolvable module should
|
||||
not work $e2
|
||||
|
||||
Resolving a module with a pseudo-conflict should
|
||||
work $e3
|
||||
"""
|
||||
|
||||
def commonsIo13 = ModuleID("commons-io", "commons-io", "1.3", Some("compile"))
|
||||
def mavenCayennePlugin302 = ModuleID("org.apache.cayenne.plugins", "maven-cayenne-plugin", "3.0.2", Some("compile"))
|
||||
def avro177 = ModuleID("org.apache.avro", "avro", "1.7.7", Some("compile"))
|
||||
def dataAvro1940 = ModuleID("com.linkedin.pegasus", "data-avro", "1.9.40", Some("compile"))
|
||||
def netty320 = ModuleID("org.jboss.netty", "netty", "3.2.0.Final", Some("compile"))
|
||||
|
||||
def defaultOptions = EvictionWarningOptions.default
|
||||
|
||||
import ShowLines._
|
||||
|
||||
def e1 = {
|
||||
"Resolving the same module twice" should "work" in {
|
||||
cleanIvyCache()
|
||||
val m = module(ModuleID("com.example", "foo", "0.1.0", Some("compile")),
|
||||
Seq(commonsIo13), Some("2.10.2"), UpdateOptions().withCachedResolution(true))
|
||||
|
|
@ -38,10 +16,10 @@ class CachedResolutionSpec extends BaseIvySpecification {
|
|||
println(report)
|
||||
// second resolution reads from the minigraph
|
||||
println(report.configurations.head.modules.head.artifacts)
|
||||
report.configurations.size must_== 3
|
||||
report.configurations.size shouldBe 3
|
||||
}
|
||||
|
||||
def e2 = {
|
||||
"Resolving the unsolvable module should" should "not work" in {
|
||||
// log.setLevel(Level.Debug)
|
||||
val m = module(ModuleID("com.example", "foo", "0.2.0", Some("compile")),
|
||||
Seq(mavenCayennePlugin302), Some("2.10.2"), UpdateOptions().withCachedResolution(true))
|
||||
|
|
@ -53,11 +31,11 @@ class CachedResolutionSpec extends BaseIvySpecification {
|
|||
ivyUpdateEither(m) match {
|
||||
case Right(_) => sys.error("this should've failed 2")
|
||||
case Left(uw) =>
|
||||
uw.lines must contain(allOf("\n\tNote: Unresolved dependencies path:",
|
||||
uw.lines should contain allOf("\n\tNote: Unresolved dependencies path:",
|
||||
"\t\tfoundrylogic.vpp:vpp:2.2.1",
|
||||
"\t\t +- org.apache.cayenne:cayenne-tools:3.0.2",
|
||||
"\t\t +- org.apache.cayenne.plugins:maven-cayenne-plugin:3.0.2",
|
||||
"\t\t +- com.example:foo:0.2.0"))
|
||||
"\t\t +- com.example:foo:0.2.0")
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -65,7 +43,7 @@ class CachedResolutionSpec extends BaseIvySpecification {
|
|||
// data-avro:1.9.40 depends on avro:1.4.0, which depends on netty:3.2.1.Final.
|
||||
// avro:1.4.0 will be evicted by avro:1.7.7.
|
||||
// #2046 says that netty:3.2.0.Final is incorrectly evicted by netty:3.2.1.Final
|
||||
def e3 = {
|
||||
"Resolving a module with a pseudo-conflict" should "work" in {
|
||||
// log.setLevel(Level.Debug)
|
||||
cleanIvyCache()
|
||||
val m = module(ModuleID("com.example", "foo", "0.3.0", Some("compile")),
|
||||
|
|
@ -76,8 +54,16 @@ class CachedResolutionSpec extends BaseIvySpecification {
|
|||
cleanCachedResolutionCache(m)
|
||||
// second resolution reads from the minigraph
|
||||
val report = ivyUpdate(m)
|
||||
val modules = report.configurations.head.modules
|
||||
(modules must containMatch("""org\.jboss\.netty:netty:3\.2\.0.Final""")) and
|
||||
(modules must not containMatch ("""org\.jboss\.netty:netty:3\.2\.1.Final"""))
|
||||
val modules: Seq[String] = report.configurations.head.modules map {_.toString}
|
||||
modules should contain("""org.jboss.netty:netty:3.2.0.Final""")
|
||||
modules should not contain("""org.jboss.netty:netty:3.2.1.Final""")
|
||||
}
|
||||
|
||||
def commonsIo13 = ModuleID("commons-io", "commons-io", "1.3", Some("compile"))
|
||||
def mavenCayennePlugin302 = ModuleID("org.apache.cayenne.plugins", "maven-cayenne-plugin", "3.0.2", Some("compile"))
|
||||
def avro177 = ModuleID("org.apache.avro", "avro", "1.7.7", Some("compile"))
|
||||
def dataAvro1940 = ModuleID("com.linkedin.pegasus", "data-avro", "1.9.40", Some("compile"))
|
||||
def netty320 = ModuleID("org.jboss.netty", "netty", "3.2.0.Final", Some("compile"))
|
||||
|
||||
def defaultOptions = EvictionWarningOptions.default
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,73 +2,74 @@ package sbt
|
|||
|
||||
import java.io.File
|
||||
import java.util.concurrent.Callable
|
||||
import org.specs2._
|
||||
import mutable.Specification
|
||||
import sbt.io.IO.{ createDirectory, delete, touch, withTemporaryDirectory }
|
||||
import sbt.io.IO
|
||||
import org.apache.ivy.util.ChecksumHelper
|
||||
import IfMissing.Fail
|
||||
import xsbti.ComponentProvider
|
||||
import sbt.internal.util.Logger
|
||||
import sbt.internal.util.{ UnitSpec, TestLogger }
|
||||
|
||||
// TODO - We need to re-enable this test. Right now, we dont' have a "stub" launcher for this.
|
||||
// This is testing something which uses a launcher interface, but was grabbing the underlying class directly
|
||||
// when it really should, instead, be stubbing out the underyling class.
|
||||
|
||||
object ComponentManagerTest extends Specification {
|
||||
class ComponentManagerTest extends UnitSpec {
|
||||
val TestID = "manager-test"
|
||||
"Component manager" should {
|
||||
"throw an exception if 'file' is called for a non-existing component" in {
|
||||
withManager { _.file(TestID)(Fail) must throwA[InvalidComponent] }
|
||||
"Component manager" should "throw an exception if 'file' is called for a non-existing component" in {
|
||||
withManager { manager =>
|
||||
intercept[InvalidComponent] { manager.file(TestID)(Fail) }
|
||||
}
|
||||
"throw an exception if 'file' is called for an empty component" in {
|
||||
withManager { manager =>
|
||||
manager.define(TestID, Nil)
|
||||
(manager.file(TestID)(Fail)) must throwA[InvalidComponent]
|
||||
}
|
||||
}
|
||||
it should "throw an exception if 'file' is called for an empty component" in {
|
||||
withManager { manager =>
|
||||
manager.define(TestID, Nil)
|
||||
intercept[InvalidComponent] { manager.file(TestID)(Fail) }
|
||||
}
|
||||
"return the file for a single-file component" in {
|
||||
withManager { manager =>
|
||||
val hash = defineFile(manager, TestID, "a")
|
||||
checksum(manager.file(TestID)(Fail)) must beEqualTo(hash)
|
||||
}
|
||||
}
|
||||
it should "return the file for a single-file component" in {
|
||||
withManager { manager =>
|
||||
val hash = defineFile(manager, TestID, "a")
|
||||
checksum(manager.file(TestID)(Fail)) shouldBe hash
|
||||
}
|
||||
|
||||
"throw an exception if 'file' is called for multi-file component" in {
|
||||
withManager { manager =>
|
||||
defineFiles(manager, TestID, "a", "b")
|
||||
(manager.file(TestID)(Fail)) must throwA[InvalidComponent]
|
||||
}
|
||||
}
|
||||
it should "throw an exception if 'file' is called for multi-file component" in {
|
||||
withManager { manager =>
|
||||
defineFiles(manager, TestID, "a", "b")
|
||||
intercept[InvalidComponent] { manager.file(TestID)(Fail) }
|
||||
}
|
||||
"return the files for a multi-file component" in {
|
||||
withManager { manager =>
|
||||
val hashes = defineFiles(manager, TestID, "a", "b")
|
||||
checksum(manager.files(TestID)(Fail)) must containTheSameElementsAs(hashes)
|
||||
}
|
||||
}
|
||||
it should "return the files for a multi-file component" in {
|
||||
withManager { manager =>
|
||||
val hashes = defineFiles(manager, TestID, "a", "b")
|
||||
checksum(manager.files(TestID)(Fail)) should contain theSameElementsAs (hashes)
|
||||
}
|
||||
"return the files for a single-file component" in {
|
||||
withManager { manager =>
|
||||
val hashes = defineFiles(manager, TestID, "a")
|
||||
checksum(manager.files(TestID)(Fail)) must containTheSameElementsAs(hashes)
|
||||
}
|
||||
}
|
||||
it should "return the files for a single-file component" in {
|
||||
withManager { manager =>
|
||||
val hashes = defineFiles(manager, TestID, "a")
|
||||
checksum(manager.files(TestID)(Fail)) should contain theSameElementsAs (hashes)
|
||||
}
|
||||
"throw an exception if 'files' is called for a non-existing component" in {
|
||||
withManager { _.files(TestID)(Fail) must throwA[InvalidComponent] }
|
||||
}
|
||||
it should "throw an exception if 'files' is called for a non-existing component" in {
|
||||
withManager { manager =>
|
||||
intercept[InvalidComponent] { manager.files(TestID)(Fail) }
|
||||
}
|
||||
|
||||
"properly cache a file and then retrieve it to an unresolved component" in {
|
||||
withTemporaryDirectory { ivyHome =>
|
||||
withManagerHome(ivyHome) { definingManager =>
|
||||
val hash = defineFile(definingManager, TestID, "a")
|
||||
try {
|
||||
definingManager.cache(TestID)
|
||||
withManagerHome(ivyHome) { usingManager =>
|
||||
checksum(usingManager.file(TestID)(Fail)) must beEqualTo(hash)
|
||||
}
|
||||
} finally { definingManager.clearCache(TestID) }
|
||||
}
|
||||
}
|
||||
it should "properly cache a file and then retrieve it to an unresolved component" in {
|
||||
withTemporaryDirectory { ivyHome =>
|
||||
withManagerHome(ivyHome) { definingManager =>
|
||||
val hash = defineFile(definingManager, TestID, "a")
|
||||
try {
|
||||
definingManager.cache(TestID)
|
||||
withManagerHome(ivyHome) { usingManager =>
|
||||
checksum(usingManager.file(TestID)(Fail)) shouldBe hash
|
||||
}
|
||||
} finally { definingManager.clearCache(TestID) }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private def checksum(files: Iterable[File]): Seq[String] = files.map(checksum).toSeq
|
||||
private def checksum(file: File): String = if (file.exists) ChecksumHelper.computeAsString(file, "sha1") else ""
|
||||
private def defineFile(manager: ComponentManager, id: String, name: String): String = createFile(manager, id, name)(checksum)
|
||||
|
|
|
|||
|
|
@ -1,122 +1,118 @@
|
|||
package sbt
|
||||
|
||||
import java.io.File
|
||||
import org.specs2._
|
||||
import mutable.Specification
|
||||
import sbt.internal.util.UnitSpec
|
||||
|
||||
object CrossVersionTest extends Specification {
|
||||
"Cross version" should {
|
||||
"return sbt API for xyz as None" in {
|
||||
CrossVersion.sbtApiVersion("xyz") must_== None
|
||||
}
|
||||
"return sbt API for 0.12 as None" in {
|
||||
CrossVersion.sbtApiVersion("0.12") must_== None
|
||||
}
|
||||
"return sbt API for 0.12.0-SNAPSHOT as None" in {
|
||||
CrossVersion.sbtApiVersion("0.12.0-SNAPSHOT") must_== None
|
||||
}
|
||||
"return sbt API for 0.12.0-RC1 as Some((0, 12))" in {
|
||||
CrossVersion.sbtApiVersion("0.12.0-RC1") must_== Some((0, 12))
|
||||
}
|
||||
"return sbt API for 0.12.0 as Some((0, 12))" in {
|
||||
CrossVersion.sbtApiVersion("0.12.0") must_== Some((0, 12))
|
||||
}
|
||||
"return sbt API for 0.12.1-SNAPSHOT as Some((0, 12))" in {
|
||||
CrossVersion.sbtApiVersion("0.12.1-SNAPSHOT") must_== Some((0, 12))
|
||||
}
|
||||
"return sbt API for 0.12.1-RC1 as Some((0, 12))" in {
|
||||
CrossVersion.sbtApiVersion("0.12.1-RC1") must_== Some((0, 12))
|
||||
}
|
||||
"return sbt API for 0.12.1 as Some((0, 12))" in {
|
||||
CrossVersion.sbtApiVersion("0.12.1") must_== Some((0, 12))
|
||||
}
|
||||
"return sbt API compatibility for 0.12.0-M1 as false" in {
|
||||
CrossVersion.isSbtApiCompatible("0.12.0-M1") must_== false
|
||||
}
|
||||
"return sbt API compatibility for 0.12.0-RC1 as true" in {
|
||||
CrossVersion.isSbtApiCompatible("0.12.0-RC1") must_== true
|
||||
}
|
||||
"return sbt API compatibility for 0.12.1-RC1 as true" in {
|
||||
CrossVersion.isSbtApiCompatible("0.12.1-RC1") must_== true
|
||||
}
|
||||
"return binary sbt version for 0.11.3 as 0.11.3" in {
|
||||
CrossVersion.binarySbtVersion("0.11.3") must_== "0.11.3"
|
||||
}
|
||||
"return binary sbt version for 0.12.0-M1 as 0.12.0-M1" in {
|
||||
CrossVersion.binarySbtVersion("0.12.0-M1") must_== "0.12.0-M1"
|
||||
}
|
||||
"return binary sbt version for 0.12.0-RC1 as 0.12" in {
|
||||
CrossVersion.binarySbtVersion("0.12.0-RC1") must_== "0.12"
|
||||
}
|
||||
"return binary sbt version for 0.12.0 as 0.12" in {
|
||||
CrossVersion.binarySbtVersion("0.12.0") must_== "0.12"
|
||||
}
|
||||
"return binary sbt version for 0.12.1-SNAPSHOT as 0.12" in {
|
||||
CrossVersion.binarySbtVersion("0.12.1-SNAPSHOT") must_== "0.12"
|
||||
}
|
||||
"return binary sbt version for 0.12.1-RC1 as 0.12" in {
|
||||
CrossVersion.binarySbtVersion("0.12.1-RC1") must_== "0.12"
|
||||
}
|
||||
"return binary sbt version for 0.12.1 as 0.12" in {
|
||||
CrossVersion.binarySbtVersion("0.12.1") must_== "0.12"
|
||||
}
|
||||
|
||||
"return Scala API for xyz as None" in {
|
||||
CrossVersion.scalaApiVersion("xyz") must_== None
|
||||
}
|
||||
"return Scala API for 2.10 as None" in {
|
||||
CrossVersion.scalaApiVersion("2.10") must_== None
|
||||
}
|
||||
"return Scala API for 2.10.0-SNAPSHOT as None" in {
|
||||
CrossVersion.scalaApiVersion("2.10.0-SNAPSHOT") must_== None
|
||||
}
|
||||
"return Scala API for 2.10.0-RC1 as None" in {
|
||||
CrossVersion.scalaApiVersion("2.10.0-RC1") must_== None
|
||||
}
|
||||
"return Scala API for 2.10.0 as Some((2, 10))" in {
|
||||
CrossVersion.scalaApiVersion("2.10.0") must_== Some((2, 10))
|
||||
}
|
||||
"return Scala API for 2.10.0-1 as Some((2, 10))" in {
|
||||
CrossVersion.scalaApiVersion("2.10.0-1") must_== Some((2, 10))
|
||||
}
|
||||
"return Scala API for 2.10.1-SNAPSHOT as Some((2, 10))" in {
|
||||
CrossVersion.scalaApiVersion("2.10.1-SNAPSHOT") must_== Some((2, 10))
|
||||
}
|
||||
"return Scala API for 2.10.1-RC1 as Some((2, 10))" in {
|
||||
CrossVersion.scalaApiVersion("2.10.1-RC1") must_== Some((2, 10))
|
||||
}
|
||||
"return Scala API for 2.10.1 as Some((2, 10))" in {
|
||||
CrossVersion.scalaApiVersion("2.10.1") must_== Some((2, 10))
|
||||
}
|
||||
"return Scala API compatibility for 2.10.0-M1 as false" in {
|
||||
CrossVersion.isScalaApiCompatible("2.10.0-M1") must_== false
|
||||
}
|
||||
"return Scala API compatibility for 2.10.0-RC1 as false" in {
|
||||
CrossVersion.isScalaApiCompatible("2.10.0-RC1") must_== false
|
||||
}
|
||||
"return Scala API compatibility for 2.10.1-RC1 as false" in {
|
||||
CrossVersion.isScalaApiCompatible("2.10.1-RC1") must_== true
|
||||
}
|
||||
"return binary Scala version for 2.9.2 as 2.9.2" in {
|
||||
CrossVersion.binaryScalaVersion("2.9.2") must_== "2.9.2"
|
||||
}
|
||||
"return binary Scala version for 2.10.0-M1 as 2.10.0-M1" in {
|
||||
CrossVersion.binaryScalaVersion("2.10.0-M1") must_== "2.10.0-M1"
|
||||
}
|
||||
"return binary Scala version for 2.10.0-RC1 as 2.10.0-RC1" in {
|
||||
CrossVersion.binaryScalaVersion("2.10.0-RC1") must_== "2.10.0-RC1"
|
||||
}
|
||||
"return binary Scala version for 2.10.0 as 2.10" in {
|
||||
CrossVersion.binaryScalaVersion("2.10.0") must_== "2.10"
|
||||
}
|
||||
"return binary Scala version for 2.10.1-M1 as 2.10" in {
|
||||
CrossVersion.binaryScalaVersion("2.10.1-M1") must_== "2.10"
|
||||
}
|
||||
"return binary Scala version for 2.10.1-RC1 as 2.10" in {
|
||||
CrossVersion.binaryScalaVersion("2.10.1-RC1") must_== "2.10"
|
||||
}
|
||||
"return binary Scala version for 2.10.1 as 2.10" in {
|
||||
CrossVersion.binaryScalaVersion("2.10.1") must_== "2.10"
|
||||
}
|
||||
class CrossVersionTest extends UnitSpec {
|
||||
"Cross version" should "return sbt API for xyz as None" in {
|
||||
CrossVersion.sbtApiVersion("xyz") shouldBe None
|
||||
}
|
||||
it should "return sbt API for 0.12 as None" in {
|
||||
CrossVersion.sbtApiVersion("0.12") shouldBe None
|
||||
}
|
||||
it should "return sbt API for 0.12.0-SNAPSHOT as None" in {
|
||||
CrossVersion.sbtApiVersion("0.12.0-SNAPSHOT") shouldBe None
|
||||
}
|
||||
it should "return sbt API for 0.12.0-RC1 as Some((0, 12))" in {
|
||||
CrossVersion.sbtApiVersion("0.12.0-RC1") shouldBe Some((0, 12))
|
||||
}
|
||||
it should "return sbt API for 0.12.0 as Some((0, 12))" in {
|
||||
CrossVersion.sbtApiVersion("0.12.0") shouldBe Some((0, 12))
|
||||
}
|
||||
it should "return sbt API for 0.12.1-SNAPSHOT as Some((0, 12))" in {
|
||||
CrossVersion.sbtApiVersion("0.12.1-SNAPSHOT") shouldBe Some((0, 12))
|
||||
}
|
||||
it should "return sbt API for 0.12.1-RC1 as Some((0, 12))" in {
|
||||
CrossVersion.sbtApiVersion("0.12.1-RC1") shouldBe Some((0, 12))
|
||||
}
|
||||
it should "return sbt API for 0.12.1 as Some((0, 12))" in {
|
||||
CrossVersion.sbtApiVersion("0.12.1") shouldBe Some((0, 12))
|
||||
}
|
||||
it should "return sbt API compatibility for 0.12.0-M1 as false" in {
|
||||
CrossVersion.isSbtApiCompatible("0.12.0-M1") shouldBe false
|
||||
}
|
||||
it should "return sbt API compatibility for 0.12.0-RC1 as true" in {
|
||||
CrossVersion.isSbtApiCompatible("0.12.0-RC1") shouldBe true
|
||||
}
|
||||
it should "return sbt API compatibility for 0.12.1-RC1 as true" in {
|
||||
CrossVersion.isSbtApiCompatible("0.12.1-RC1") shouldBe true
|
||||
}
|
||||
it should "return binary sbt version for 0.11.3 as 0.11.3" in {
|
||||
CrossVersion.binarySbtVersion("0.11.3") shouldBe "0.11.3"
|
||||
}
|
||||
it should "return binary sbt version for 0.12.0-M1 as 0.12.0-M1" in {
|
||||
CrossVersion.binarySbtVersion("0.12.0-M1") shouldBe "0.12.0-M1"
|
||||
}
|
||||
it should "return binary sbt version for 0.12.0-RC1 as 0.12" in {
|
||||
CrossVersion.binarySbtVersion("0.12.0-RC1") shouldBe "0.12"
|
||||
}
|
||||
it should "return binary sbt version for 0.12.0 as 0.12" in {
|
||||
CrossVersion.binarySbtVersion("0.12.0") shouldBe "0.12"
|
||||
}
|
||||
it should "return binary sbt version for 0.12.1-SNAPSHOT as 0.12" in {
|
||||
CrossVersion.binarySbtVersion("0.12.1-SNAPSHOT") shouldBe "0.12"
|
||||
}
|
||||
it should "return binary sbt version for 0.12.1-RC1 as 0.12" in {
|
||||
CrossVersion.binarySbtVersion("0.12.1-RC1") shouldBe "0.12"
|
||||
}
|
||||
it should "return binary sbt version for 0.12.1 as 0.12" in {
|
||||
CrossVersion.binarySbtVersion("0.12.1") shouldBe "0.12"
|
||||
}
|
||||
it should "return Scala API for xyz as None" in {
|
||||
CrossVersion.scalaApiVersion("xyz") shouldBe None
|
||||
}
|
||||
it should "return Scala API for 2.10 as None" in {
|
||||
CrossVersion.scalaApiVersion("2.10") shouldBe None
|
||||
}
|
||||
it should "return Scala API for 2.10.0-SNAPSHOT as None" in {
|
||||
CrossVersion.scalaApiVersion("2.10.0-SNAPSHOT") shouldBe None
|
||||
}
|
||||
it should "return Scala API for 2.10.0-RC1 as None" in {
|
||||
CrossVersion.scalaApiVersion("2.10.0-RC1") shouldBe None
|
||||
}
|
||||
it should "return Scala API for 2.10.0 as Some((2, 10))" in {
|
||||
CrossVersion.scalaApiVersion("2.10.0") shouldBe Some((2, 10))
|
||||
}
|
||||
it should "return Scala API for 2.10.0-1 as Some((2, 10))" in {
|
||||
CrossVersion.scalaApiVersion("2.10.0-1") shouldBe Some((2, 10))
|
||||
}
|
||||
it should "return Scala API for 2.10.1-SNAPSHOT as Some((2, 10))" in {
|
||||
CrossVersion.scalaApiVersion("2.10.1-SNAPSHOT") shouldBe Some((2, 10))
|
||||
}
|
||||
it should "return Scala API for 2.10.1-RC1 as Some((2, 10))" in {
|
||||
CrossVersion.scalaApiVersion("2.10.1-RC1") shouldBe Some((2, 10))
|
||||
}
|
||||
it should "return Scala API for 2.10.1 as Some((2, 10))" in {
|
||||
CrossVersion.scalaApiVersion("2.10.1") shouldBe Some((2, 10))
|
||||
}
|
||||
it should "return Scala API compatibility for 2.10.0-M1 as false" in {
|
||||
CrossVersion.isScalaApiCompatible("2.10.0-M1") shouldBe false
|
||||
}
|
||||
it should "return Scala API compatibility for 2.10.0-RC1 as false" in {
|
||||
CrossVersion.isScalaApiCompatible("2.10.0-RC1") shouldBe false
|
||||
}
|
||||
it should "return Scala API compatibility for 2.10.1-RC1 as false" in {
|
||||
CrossVersion.isScalaApiCompatible("2.10.1-RC1") shouldBe true
|
||||
}
|
||||
it should "return binary Scala version for 2.9.2 as 2.9.2" in {
|
||||
CrossVersion.binaryScalaVersion("2.9.2") shouldBe "2.9.2"
|
||||
}
|
||||
it should "return binary Scala version for 2.10.0-M1 as 2.10.0-M1" in {
|
||||
CrossVersion.binaryScalaVersion("2.10.0-M1") shouldBe "2.10.0-M1"
|
||||
}
|
||||
it should "return binary Scala version for 2.10.0-RC1 as 2.10.0-RC1" in {
|
||||
CrossVersion.binaryScalaVersion("2.10.0-RC1") shouldBe "2.10.0-RC1"
|
||||
}
|
||||
it should "return binary Scala version for 2.10.0 as 2.10" in {
|
||||
CrossVersion.binaryScalaVersion("2.10.0") shouldBe "2.10"
|
||||
}
|
||||
it should "return binary Scala version for 2.10.1-M1 as 2.10" in {
|
||||
CrossVersion.binaryScalaVersion("2.10.1-M1") shouldBe "2.10"
|
||||
}
|
||||
it should "return binary Scala version for 2.10.1-RC1 as 2.10" in {
|
||||
CrossVersion.binaryScalaVersion("2.10.1-RC1") shouldBe "2.10"
|
||||
}
|
||||
it should "return binary Scala version for 2.10.1 as 2.10" in {
|
||||
CrossVersion.binaryScalaVersion("2.10.1") shouldBe "2.10"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,36 +2,32 @@ import java.io.File
|
|||
import org.apache.ivy.core.module.descriptor.{ Artifact => IvyArtifact }
|
||||
import org.apache.ivy.core.module.id.ModuleRevisionId
|
||||
import org.apache.ivy.core.resolve.ResolveOptions
|
||||
import org.specs2.mutable.Specification
|
||||
import sbt._
|
||||
import sbt.io.IO.withTemporaryDirectory
|
||||
import sbt.internal.util.{ Logger, ConsoleLogger }
|
||||
import sbt.internal.util.UnitSpec
|
||||
|
||||
object CustomPomParserTest extends Specification {
|
||||
class CustomPomParserTest extends UnitSpec {
|
||||
"CustomPomParser" should "resolve an artifact with packaging 'scala-jar' as a regular jar file." in {
|
||||
val log = ConsoleLogger()
|
||||
withTemporaryDirectory { cacheDir =>
|
||||
val repoUrl = getClass.getResource("/test-maven-repo")
|
||||
val local = MavenRepository("Test Repo", repoUrl.toExternalForm)
|
||||
val paths = new IvyPaths(new File("."), Some(cacheDir))
|
||||
val conf = new InlineIvyConfiguration(paths, Seq(local), Nil, Nil, false, None, Seq("sha1", "md5"), None, log)
|
||||
val ivySbt = new IvySbt(conf)
|
||||
val resolveOpts = new ResolveOptions().setConfs(Array("default"))
|
||||
val mrid = ModuleRevisionId.newInstance("com.test", "test-artifact", "1.0.0-SNAPSHOT")
|
||||
|
||||
"CustomPomParser" should {
|
||||
"resolve an artifact with packaging 'scala-jar' as a regular jar file." in {
|
||||
val log = ConsoleLogger()
|
||||
withTemporaryDirectory { cacheDir =>
|
||||
val repoUrl = getClass.getResource("/test-maven-repo")
|
||||
val local = MavenRepository("Test Repo", repoUrl.toExternalForm)
|
||||
val paths = new IvyPaths(new File("."), Some(cacheDir))
|
||||
val conf = new InlineIvyConfiguration(paths, Seq(local), Nil, Nil, false, None, Seq("sha1", "md5"), None, log)
|
||||
val ivySbt = new IvySbt(conf)
|
||||
val resolveOpts = new ResolveOptions().setConfs(Array("default"))
|
||||
val mrid = ModuleRevisionId.newInstance("com.test", "test-artifact", "1.0.0-SNAPSHOT")
|
||||
|
||||
val resolveReport = ivySbt.withIvy(log) { ivy =>
|
||||
ivy.resolve(mrid, resolveOpts, true)
|
||||
}
|
||||
|
||||
resolveReport.hasError must beFalse
|
||||
resolveReport.getArtifacts.size() must beEqualTo(1)
|
||||
val artifact: IvyArtifact = resolveReport.getArtifacts.asInstanceOf[java.util.List[IvyArtifact]].get(0)
|
||||
artifact.getModuleRevisionId must beEqualTo(mrid)
|
||||
artifact.getExt must beEqualTo("jar")
|
||||
val resolveReport = ivySbt.withIvy(log) { ivy =>
|
||||
ivy.resolve(mrid, resolveOpts, true)
|
||||
}
|
||||
|
||||
resolveReport.hasError shouldBe false
|
||||
resolveReport.getArtifacts.size() shouldBe 1
|
||||
val artifact: IvyArtifact = resolveReport.getArtifacts.asInstanceOf[java.util.List[IvyArtifact]].get(0)
|
||||
artifact.getModuleRevisionId shouldBe mrid
|
||||
artifact.getExt shouldBe "jar"
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,46 +1,50 @@
|
|||
package sbt
|
||||
|
||||
import org.specs2._
|
||||
import matcher.MatchResult
|
||||
import java.net.URL
|
||||
import java.io.File
|
||||
import sbt.serialization._
|
||||
import sbt.internal.util.UnitSpec
|
||||
|
||||
class DMSerializationSpec extends Specification {
|
||||
def is = sequential ^ s2"""
|
||||
|
||||
This is a specification to check the serialization of dependency graph.
|
||||
|
||||
CrossVersion.full should
|
||||
${roundtripStr(CrossVersion.full: sbt.CrossVersion)}
|
||||
CrossVersion.binary should
|
||||
${roundtripStr(CrossVersion.binary: sbt.CrossVersion)}
|
||||
CrossVersion.Disabled should
|
||||
${roundtrip(CrossVersion.Disabled: sbt.CrossVersion)}
|
||||
|
||||
Artifact("foo") should
|
||||
${roundtrip(Artifact("foo"))}
|
||||
Artifact("foo", "sources") should
|
||||
${roundtrip(Artifact("foo", "sources"))}
|
||||
Artifact.pom("foo") should
|
||||
${roundtrip(Artifact.pom("foo"))}
|
||||
Artifact("foo", url("http://example.com/")) should
|
||||
${roundtrip(Artifact("foo", new URL("http://example.com/")))}
|
||||
Artifact("foo").extra(("key", "value")) should
|
||||
${roundtrip(Artifact("foo").extra(("key", "value")))}
|
||||
|
||||
ModuleID("org", "name", "1.0") should
|
||||
${roundtrip(ModuleID("org", "name", "1.0"))}
|
||||
|
||||
ModuleReport(ModuleID("org", "name", "1.0"), Nil, Nil) should
|
||||
${roundtripStr(ModuleReport(ModuleID("org", "name", "1.0"), Nil, Nil))}
|
||||
Organization artifact report should
|
||||
${roundtripStr(organizationArtifactReportExample)}
|
||||
Configuration report should
|
||||
${roundtripStr(configurationReportExample)}
|
||||
Update report should
|
||||
${roundtripStr(updateReportExample)}
|
||||
"""
|
||||
class DMSerializationSpec extends UnitSpec {
|
||||
"CrossVersion.full" should "roundtrip" in {
|
||||
roundtripStr(CrossVersion.full: sbt.CrossVersion)
|
||||
}
|
||||
"CrossVersion.binary" should "roundtrip" in {
|
||||
roundtripStr(CrossVersion.binary: sbt.CrossVersion)
|
||||
}
|
||||
"CrossVersion.Disabled" should "roundtrip" in {
|
||||
roundtrip(CrossVersion.Disabled: sbt.CrossVersion)
|
||||
}
|
||||
"""Artifact("foo")""" should "roundtrip" in {
|
||||
roundtrip(Artifact("foo"))
|
||||
}
|
||||
"""Artifact("foo", "sources")""" should "roundtrip" in {
|
||||
roundtrip(Artifact("foo", "sources"))
|
||||
}
|
||||
"""Artifact.pom("foo")""" should "roundtrip" in {
|
||||
roundtrip(Artifact.pom("foo"))
|
||||
}
|
||||
"""Artifact("foo", url("http://example.com/"))""" should "roundtrip" in {
|
||||
roundtrip(Artifact("foo", new URL("http://example.com/")))
|
||||
}
|
||||
"""Artifact("foo").extra(("key", "value"))""" should "roundtrip" in {
|
||||
roundtrip(Artifact("foo").extra(("key", "value")))
|
||||
}
|
||||
"""ModuleID("org", "name", "1.0")""" should "roundtrip" in {
|
||||
roundtrip(ModuleID("org", "name", "1.0"))
|
||||
}
|
||||
"""ModuleReport(ModuleID("org", "name", "1.0"), Nil, Nil)""" should "roundtrip" in {
|
||||
roundtripStr(ModuleReport(ModuleID("org", "name", "1.0"), Nil, Nil))
|
||||
}
|
||||
"Organization artifact report" should "roundtrip" in {
|
||||
roundtripStr(organizationArtifactReportExample)
|
||||
}
|
||||
"Configuration report" should "roundtrip" in {
|
||||
roundtripStr(configurationReportExample)
|
||||
}
|
||||
"Update report" should "roundtrip" in {
|
||||
roundtripStr(updateReportExample)
|
||||
}
|
||||
|
||||
lazy val updateReportExample =
|
||||
new UpdateReport(new File("./foo"), Vector(configurationReportExample),
|
||||
|
|
@ -53,11 +57,11 @@ class DMSerializationSpec extends Specification {
|
|||
lazy val moduleReportExample =
|
||||
ModuleReport(ModuleID("org", "name", "1.0"), Nil, Nil)
|
||||
|
||||
def roundtrip[A: Pickler: Unpickler](a: A) =
|
||||
roundtripBuilder(a) { _ must_== _ }
|
||||
def roundtripStr[A: Pickler: Unpickler](a: A) =
|
||||
roundtripBuilder(a) { _.toString must_== _.toString }
|
||||
def roundtripBuilder[A: Pickler: Unpickler](a: A)(f: (A, A) => MatchResult[Any]): MatchResult[Any] =
|
||||
def roundtrip[A: Pickler: Unpickler](a: A): Unit =
|
||||
roundtripBuilder(a) { _ shouldBe _ }
|
||||
def roundtripStr[A: Pickler: Unpickler](a: A): Unit =
|
||||
roundtripBuilder(a) { _.toString shouldBe _.toString }
|
||||
def roundtripBuilder[A: Pickler: Unpickler](a: A)(f: (A, A) => Unit): Unit =
|
||||
{
|
||||
val json = toJsonString(a)
|
||||
println(json)
|
||||
|
|
|
|||
|
|
@ -1,52 +1,40 @@
|
|||
package sbt
|
||||
|
||||
import org.specs2._
|
||||
|
||||
class EvictionWarningSpec extends BaseIvySpecification {
|
||||
def is = s2"""
|
||||
// This is a specification to check the eviction warnings
|
||||
|
||||
This is a specification to check the eviction warnings
|
||||
"Eviction of scala-library whose scalaVersion" should "be detected" in scalaVersionWarn1
|
||||
it should "not be detected if it's diabled" in scalaVersionWarn2
|
||||
it should "print out message about the eviction" in scalaVersionWarn3
|
||||
it should "print out message about the eviction with callers" in scalaVersionWarn4
|
||||
|
||||
Eviction of scala-library whose scalaVersion should
|
||||
be detected $scalaVersionWarn1
|
||||
not be detected if it's diabled $scalaVersionWarn2
|
||||
print out message about the eviction $scalaVersionWarn3
|
||||
print out message about the eviction with callers $scalaVersionWarn4
|
||||
"""Including two (suspect) binary incompatible Java libraries to
|
||||
direct dependencies""" should "be detected as eviction" in javaLibWarn1
|
||||
it should "not be detected if it's disabled" in javaLibWarn2
|
||||
it should "print out message about the eviction" in javaLibWarn3
|
||||
it should "print out message about the eviction with callers" in javaLibWarn4
|
||||
|
||||
Including two (suspect) binary incompatible Java libraries to
|
||||
direct dependencies should
|
||||
be detected as eviction $javaLibWarn1
|
||||
not be detected if it's disabled $javaLibWarn2
|
||||
print out message about the eviction $javaLibWarn3
|
||||
print out message about the eviction with callers $javaLibWarn4
|
||||
"""Including two (suspect) binary compatible Java libraries to
|
||||
direct dependencies""" should "not be detected as eviction" in javaLibNoWarn1
|
||||
it should "print out message about the eviction" in javaLibNoWarn2
|
||||
|
||||
Including two (suspect) binary compatible Java libraries to
|
||||
direct dependencies should
|
||||
not be detected as eviction $javaLibNoWarn1
|
||||
print out message about the eviction $javaLibNoWarn2
|
||||
"""Including two (suspect) transitively binary incompatible Java libraries to
|
||||
direct dependencies""" should "be not detected as eviction" in javaLibTransitiveWarn1
|
||||
it should "be detected if it's enabled" in javaLibTransitiveWarn2
|
||||
it should "print out message about the eviction if it's enabled" in javaLibTransitiveWarn3
|
||||
|
||||
Including two (suspect) transitively binary incompatible Java libraries to
|
||||
direct dependencies should
|
||||
be not detected as eviction $javaLibTransitiveWarn1
|
||||
be detected if it's enabled $javaLibTransitiveWarn2
|
||||
print out message about the eviction if it's enabled $javaLibTransitiveWarn3
|
||||
"""Including two (suspect) binary incompatible Scala libraries to
|
||||
direct dependencies""" should "be detected as eviction" in scalaLibWarn1
|
||||
it should "print out message about the eviction" in scalaLibWarn2
|
||||
|
||||
Including two (suspect) binary incompatible Scala libraries to
|
||||
direct dependencies should
|
||||
be detected as eviction $scalaLibWarn1
|
||||
print out message about the eviction $scalaLibWarn2
|
||||
"""Including two (suspect) binary compatible Scala libraries to
|
||||
direct dependencies""" should "not be detected as eviction" in scalaLibNoWarn1
|
||||
it should "print out message about the eviction" in scalaLibNoWarn2
|
||||
|
||||
Including two (suspect) binary compatible Scala libraries to
|
||||
direct dependencies should
|
||||
not be detected as eviction $scalaLibNoWarn1
|
||||
print out message about the eviction $scalaLibNoWarn2
|
||||
|
||||
Including two (suspect) transitively binary incompatible Scala libraries to
|
||||
direct dependencies should
|
||||
be not detected as eviction $scalaLibTransitiveWarn1
|
||||
be detected if it's enabled $scalaLibTransitiveWarn2
|
||||
print out message about the eviction if it's enabled $scalaLibTransitiveWarn3
|
||||
"""
|
||||
"""Including two (suspect) transitively binary incompatible Scala libraries to
|
||||
direct dependencies""" should "be not detected as eviction" in scalaLibTransitiveWarn1
|
||||
it should "be detected if it's enabled" in scalaLibTransitiveWarn2
|
||||
it should "print out message about the eviction if it's enabled" in scalaLibTransitiveWarn3
|
||||
|
||||
def akkaActor214 = ModuleID("com.typesafe.akka", "akka-actor", "2.1.4", Some("compile")) cross CrossVersion.binary
|
||||
def akkaActor230 = ModuleID("com.typesafe.akka", "akka-actor", "2.3.0", Some("compile")) cross CrossVersion.binary
|
||||
|
|
@ -64,26 +52,26 @@ class EvictionWarningSpec extends BaseIvySpecification {
|
|||
|
||||
def defaultOptions = EvictionWarningOptions.default
|
||||
|
||||
import ShowLines._
|
||||
import sbt.internal.util.ShowLines._
|
||||
|
||||
def scalaVersionDeps = Seq(scala2102, akkaActor230)
|
||||
|
||||
def scalaVersionWarn1 = {
|
||||
val m = module(defaultModuleId, scalaVersionDeps, Some("2.10.2"))
|
||||
val report = ivyUpdate(m)
|
||||
EvictionWarning(m, defaultOptions, report, log).scalaEvictions must have size (1)
|
||||
EvictionWarning(m, defaultOptions, report, log).scalaEvictions should have size(1)
|
||||
}
|
||||
|
||||
def scalaVersionWarn2 = {
|
||||
val m = module(defaultModuleId, scalaVersionDeps, Some("2.10.2"))
|
||||
val report = ivyUpdate(m)
|
||||
EvictionWarning(m, defaultOptions.withWarnScalaVersionEviction(false), report, log).scalaEvictions must have size (0)
|
||||
EvictionWarning(m, defaultOptions.withWarnScalaVersionEviction(false), report, log).scalaEvictions should have size(0)
|
||||
}
|
||||
|
||||
def scalaVersionWarn3 = {
|
||||
val m = module(defaultModuleId, scalaVersionDeps, Some("2.10.2"))
|
||||
val report = ivyUpdate(m)
|
||||
EvictionWarning(m, defaultOptions, report, log).lines must_==
|
||||
EvictionWarning(m, defaultOptions, report, log).lines shouldBe
|
||||
List("Scala version was updated by one of library dependencies:",
|
||||
"\t* org.scala-lang:scala-library:2.10.2 -> 2.10.3",
|
||||
"To force scalaVersion, add the following:",
|
||||
|
|
@ -94,7 +82,7 @@ class EvictionWarningSpec extends BaseIvySpecification {
|
|||
def scalaVersionWarn4 = {
|
||||
val m = module(defaultModuleId, scalaVersionDeps, Some("2.10.2"))
|
||||
val report = ivyUpdate(m)
|
||||
EvictionWarning(m, defaultOptions.withShowCallers(true), report, log).lines must_==
|
||||
EvictionWarning(m, defaultOptions.withShowCallers(true), report, log).lines shouldBe
|
||||
List("Scala version was updated by one of library dependencies:",
|
||||
"\t* org.scala-lang:scala-library:2.10.2 -> 2.10.3 (caller: com.typesafe.akka:akka-actor_2.10:2.3.0, com.example:foo:0.1.0)",
|
||||
"To force scalaVersion, add the following:",
|
||||
|
|
@ -106,19 +94,19 @@ class EvictionWarningSpec extends BaseIvySpecification {
|
|||
def javaLibWarn1 = {
|
||||
val m = module(defaultModuleId, javaLibDirectDeps, Some("2.10.3"))
|
||||
val report = ivyUpdate(m)
|
||||
EvictionWarning(m, defaultOptions, report, log).reportedEvictions must have size (1)
|
||||
EvictionWarning(m, defaultOptions, report, log).reportedEvictions should have size(1)
|
||||
}
|
||||
|
||||
def javaLibWarn2 = {
|
||||
val m = module(defaultModuleId, javaLibDirectDeps, Some("2.10.3"))
|
||||
val report = ivyUpdate(m)
|
||||
EvictionWarning(m, defaultOptions.withWarnDirectEvictions(false), report, log).reportedEvictions must have size (0)
|
||||
EvictionWarning(m, defaultOptions.withWarnDirectEvictions(false), report, log).reportedEvictions should have size(0)
|
||||
}
|
||||
|
||||
def javaLibWarn3 = {
|
||||
val m = module(defaultModuleId, javaLibDirectDeps, Some("2.10.3"))
|
||||
val report = ivyUpdate(m)
|
||||
EvictionWarning(m, defaultOptions, report, log).lines must_==
|
||||
EvictionWarning(m, defaultOptions, report, log).lines shouldBe
|
||||
List("There may be incompatibilities among your library dependencies.",
|
||||
"Here are some of the libraries that were evicted:",
|
||||
"\t* commons-io:commons-io:1.4 -> 2.4",
|
||||
|
|
@ -128,7 +116,7 @@ class EvictionWarningSpec extends BaseIvySpecification {
|
|||
def javaLibWarn4 = {
|
||||
val m = module(defaultModuleId, javaLibDirectDeps, Some("2.10.3"))
|
||||
val report = ivyUpdate(m)
|
||||
EvictionWarning(m, defaultOptions.withShowCallers(true), report, log).lines must_==
|
||||
EvictionWarning(m, defaultOptions.withShowCallers(true), report, log).lines shouldBe
|
||||
List("There may be incompatibilities among your library dependencies.",
|
||||
"Here are some of the libraries that were evicted:",
|
||||
"\t* commons-io:commons-io:1.4 -> 2.4 (caller: com.example:foo:0.1.0)")
|
||||
|
|
@ -138,14 +126,14 @@ class EvictionWarningSpec extends BaseIvySpecification {
|
|||
val deps = Seq(commonsIo14, commonsIo13)
|
||||
val m = module(defaultModuleId, deps, Some("2.10.3"))
|
||||
val report = ivyUpdate(m)
|
||||
EvictionWarning(m, defaultOptions, report, log).reportedEvictions must have size (0)
|
||||
EvictionWarning(m, defaultOptions, report, log).reportedEvictions should have size(0)
|
||||
}
|
||||
|
||||
def javaLibNoWarn2 = {
|
||||
val deps = Seq(commonsIo14, commonsIo13)
|
||||
val m = module(defaultModuleId, deps, Some("2.10.3"))
|
||||
val report = ivyUpdate(m)
|
||||
EvictionWarning(m, defaultOptions, report, log).lines must_== Nil
|
||||
EvictionWarning(m, defaultOptions, report, log).lines shouldBe Nil
|
||||
}
|
||||
|
||||
def javaLibTransitiveDeps = Seq(unfilteredUploads080, bnfparser10)
|
||||
|
|
@ -153,19 +141,19 @@ class EvictionWarningSpec extends BaseIvySpecification {
|
|||
def javaLibTransitiveWarn1 = {
|
||||
val m = module(defaultModuleId, javaLibTransitiveDeps, Some("2.10.3"))
|
||||
val report = ivyUpdate(m)
|
||||
EvictionWarning(m, defaultOptions, report, log).reportedEvictions must have size (0)
|
||||
EvictionWarning(m, defaultOptions, report, log).reportedEvictions should have size(0)
|
||||
}
|
||||
|
||||
def javaLibTransitiveWarn2 = {
|
||||
val m = module(defaultModuleId, javaLibTransitiveDeps, Some("2.10.3"))
|
||||
val report = ivyUpdate(m)
|
||||
EvictionWarning(m, defaultOptions.withWarnTransitiveEvictions(true), report, log).reportedEvictions must have size (1)
|
||||
EvictionWarning(m, defaultOptions.withWarnTransitiveEvictions(true), report, log).reportedEvictions should have size(1)
|
||||
}
|
||||
|
||||
def javaLibTransitiveWarn3 = {
|
||||
val m = module(defaultModuleId, javaLibTransitiveDeps, Some("2.10.3"))
|
||||
val report = ivyUpdate(m)
|
||||
EvictionWarning(m, defaultOptions.withWarnTransitiveEvictions(true).withShowCallers(true), report, log).lines must_==
|
||||
EvictionWarning(m, defaultOptions.withWarnTransitiveEvictions(true).withShowCallers(true), report, log).lines shouldBe
|
||||
List("There may be incompatibilities among your library dependencies.",
|
||||
"Here are some of the libraries that were evicted:",
|
||||
"\t* commons-io:commons-io:1.4 -> 2.4 (caller: ca.gobits.bnf:bnfparser:1.0, net.databinder:unfiltered-uploads_2.10:0.8.0)")
|
||||
|
|
@ -175,14 +163,14 @@ class EvictionWarningSpec extends BaseIvySpecification {
|
|||
val deps = Seq(scala2104, akkaActor214, akkaActor234)
|
||||
val m = module(defaultModuleId, deps, Some("2.10.4"))
|
||||
val report = ivyUpdate(m)
|
||||
EvictionWarning(m, defaultOptions, report, log).reportedEvictions must have size (1)
|
||||
EvictionWarning(m, defaultOptions, report, log).reportedEvictions should have size(1)
|
||||
}
|
||||
|
||||
def scalaLibWarn2 = {
|
||||
val deps = Seq(scala2104, akkaActor214, akkaActor234)
|
||||
val m = module(defaultModuleId, deps, Some("2.10.4"))
|
||||
val report = ivyUpdate(m)
|
||||
EvictionWarning(m, defaultOptions, report, log).lines must_==
|
||||
EvictionWarning(m, defaultOptions, report, log).lines shouldBe
|
||||
List("There may be incompatibilities among your library dependencies.",
|
||||
"Here are some of the libraries that were evicted:",
|
||||
"\t* com.typesafe.akka:akka-actor_2.10:2.1.4 -> 2.3.4",
|
||||
|
|
@ -193,14 +181,14 @@ class EvictionWarningSpec extends BaseIvySpecification {
|
|||
val deps = Seq(scala2104, akkaActor230, akkaActor234)
|
||||
val m = module(defaultModuleId, deps, Some("2.10.4"))
|
||||
val report = ivyUpdate(m)
|
||||
EvictionWarning(m, defaultOptions, report, log).reportedEvictions must have size (0)
|
||||
EvictionWarning(m, defaultOptions, report, log).reportedEvictions should have size(0)
|
||||
}
|
||||
|
||||
def scalaLibNoWarn2 = {
|
||||
val deps = Seq(scala2104, akkaActor230, akkaActor234)
|
||||
val m = module(defaultModuleId, deps, Some("2.10.4"))
|
||||
val report = ivyUpdate(m)
|
||||
EvictionWarning(m, defaultOptions, report, log).lines must_== Nil
|
||||
EvictionWarning(m, defaultOptions, report, log).lines shouldBe Nil
|
||||
}
|
||||
|
||||
def scalaLibTransitiveDeps = Seq(scala2104, bananaSesame04, akkaRemote234)
|
||||
|
|
@ -208,19 +196,19 @@ class EvictionWarningSpec extends BaseIvySpecification {
|
|||
def scalaLibTransitiveWarn1 = {
|
||||
val m = module(defaultModuleId, scalaLibTransitiveDeps, Some("2.10.4"))
|
||||
val report = ivyUpdate(m)
|
||||
EvictionWarning(m, defaultOptions, report, log).reportedEvictions must have size (0)
|
||||
EvictionWarning(m, defaultOptions, report, log).reportedEvictions should have size(0)
|
||||
}
|
||||
|
||||
def scalaLibTransitiveWarn2 = {
|
||||
val m = module(defaultModuleId, scalaLibTransitiveDeps, Some("2.10.4"))
|
||||
val report = ivyUpdate(m)
|
||||
EvictionWarning(m, defaultOptions.withWarnTransitiveEvictions(true), report, log).reportedEvictions must have size (1)
|
||||
EvictionWarning(m, defaultOptions.withWarnTransitiveEvictions(true), report, log).reportedEvictions should have size(1)
|
||||
}
|
||||
|
||||
def scalaLibTransitiveWarn3 = {
|
||||
val m = module(defaultModuleId, scalaLibTransitiveDeps, Some("2.10.4"))
|
||||
val report = ivyUpdate(m)
|
||||
EvictionWarning(m, defaultOptions.withWarnTransitiveEvictions(true).withShowCallers(true), report, log).lines must_==
|
||||
EvictionWarning(m, defaultOptions.withWarnTransitiveEvictions(true).withShowCallers(true), report, log).lines shouldBe
|
||||
List("There may be incompatibilities among your library dependencies.",
|
||||
"Here are some of the libraries that were evicted:",
|
||||
"\t* com.typesafe.akka:akka-actor_2.10:2.1.4 -> 2.3.4 (caller: com.typesafe.akka:akka-remote_2.10:2.3.4, org.w3:banana-sesame_2.10:0.4, org.w3:banana-rdf_2.10:0.4)")
|
||||
|
|
|
|||
|
|
@ -1,28 +1,20 @@
|
|||
package sbt
|
||||
|
||||
import org.specs2._
|
||||
import sbt.internal.util.UnitSpec
|
||||
|
||||
class InconsistentDuplicateSpec extends Specification {
|
||||
def is = s2"""
|
||||
// This is a specification to check the inconsistent duplicate warnings
|
||||
class InconsistentDuplicateSpec extends UnitSpec {
|
||||
"Duplicate with different version" should "be warned" in {
|
||||
IvySbt.inconsistentDuplicateWarning(Seq(akkaActor214, akkaActor230)) shouldBe
|
||||
List("Multiple dependencies with the same organization/name but different versions. To avoid conflict, pick one version:",
|
||||
" * com.typesafe.akka:akka-actor:(2.1.4, 2.3.0)")
|
||||
}
|
||||
|
||||
This is a specification to check the inconsistent duplicate warnings
|
||||
|
||||
Duplicate with different version should
|
||||
be warned $warn1
|
||||
|
||||
Duplicate with same version should
|
||||
not be warned $nodupe1
|
||||
"""
|
||||
"Duplicate with same version" should "not be warned" in {
|
||||
IvySbt.inconsistentDuplicateWarning(Seq(akkaActor230Test, akkaActor230)) shouldBe Nil
|
||||
}
|
||||
|
||||
def akkaActor214 = ModuleID("com.typesafe.akka", "akka-actor", "2.1.4", Some("compile")) cross CrossVersion.binary
|
||||
def akkaActor230 = ModuleID("com.typesafe.akka", "akka-actor", "2.3.0", Some("compile")) cross CrossVersion.binary
|
||||
def akkaActor230Test = ModuleID("com.typesafe.akka", "akka-actor", "2.3.0", Some("test")) cross CrossVersion.binary
|
||||
|
||||
def warn1 =
|
||||
IvySbt.inconsistentDuplicateWarning(Seq(akkaActor214, akkaActor230)) must_==
|
||||
List("Multiple dependencies with the same organization/name but different versions. To avoid conflict, pick one version:",
|
||||
" * com.typesafe.akka:akka-actor:(2.1.4, 2.3.0)")
|
||||
|
||||
def nodupe1 =
|
||||
IvySbt.inconsistentDuplicateWarning(Seq(akkaActor230Test, akkaActor230)) must_== Nil
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,73 +1,78 @@
|
|||
package sbt
|
||||
|
||||
import java.io.File
|
||||
import org.specs2._
|
||||
import sbt.internal.util.{ Logger, ConsoleLogger }
|
||||
import sbt.internal.util.UnitSpec
|
||||
|
||||
// http://ant.apache.org/ivy/history/2.3.0/ivyfile/dependency.html
|
||||
// http://maven.apache.org/enforcer/enforcer-rules/versionRanges.html
|
||||
class MakePomSpec extends Specification {
|
||||
def is = s2"""
|
||||
class MakePomSpec extends UnitSpec {
|
||||
// This is a specification to check the Ivy revision number conversion to pom.
|
||||
|
||||
This is a specification to check the Ivy revision number conversion to pom.
|
||||
"1.0" should "convert to 1.0" in convertTo("1.0", "1.0")
|
||||
|
||||
1.0 should
|
||||
${convertTo("1.0", "1.0")}
|
||||
"[1.0,2.0]" should "convert to [1.0,2.0]" in {
|
||||
convertTo("[1.0,2.0]", "[1.0,2.0]")
|
||||
}
|
||||
|
||||
[1.0,2.0] should
|
||||
${convertTo("[1.0,2.0]", "[1.0,2.0]")}
|
||||
"[1.0,2.0[" should "convert to [1.0,2.0)" in {
|
||||
convertTo("[1.0,2.0[", "[1.0,2.0)")
|
||||
}
|
||||
|
||||
[1.0,2.0[ should
|
||||
${convertTo("[1.0,2.0[", "[1.0,2.0)")}
|
||||
"]1.0,2.0]" should "convert to (1.0,2.0]" in {
|
||||
convertTo("]1.0,2.0]", "(1.0,2.0]")
|
||||
}
|
||||
|
||||
]1.0,2.0] should
|
||||
${convertTo("]1.0,2.0]", "(1.0,2.0]")}
|
||||
"]1.0,2.0[" should "convert to (1.0,2.0)" in {
|
||||
convertTo("]1.0,2.0[", "(1.0,2.0)")
|
||||
}
|
||||
|
||||
]1.0,2.0[ should
|
||||
${convertTo("]1.0,2.0[", "(1.0,2.0)")}
|
||||
"[1.0,)" should "convert to [1.0,)" in {
|
||||
convertTo("[1.0,)", "[1.0,)")
|
||||
}
|
||||
|
||||
[1.0,) should
|
||||
${convertTo("[1.0,)", "[1.0,)")}
|
||||
"]1.0,)" should "convert to (1.0,)" in {
|
||||
convertTo("]1.0,)", "(1.0,)")
|
||||
}
|
||||
|
||||
]1.0,) should
|
||||
${convertTo("]1.0,)", "(1.0,)")}
|
||||
"(,2.0]" should "convert to (,2.0]" in {
|
||||
convertTo("(,2.0]", "(,2.0]")
|
||||
}
|
||||
|
||||
(,2.0] should
|
||||
${convertTo("(,2.0]", "(,2.0]")}
|
||||
"(,2.0[" should "convert to (,2.0)" in {
|
||||
convertTo("(,2.0[", "(,2.0)")
|
||||
}
|
||||
|
||||
(,2.0[ should
|
||||
${convertTo("(,2.0[", "(,2.0)")}
|
||||
"1.+" should "convert to [1,2)" in {
|
||||
convertTo("1.+", "[1,2)")
|
||||
}
|
||||
|
||||
1.+ should
|
||||
${convertTo("1.+", "[1,2)")}
|
||||
"1.2.3.4.+" should "convert to [1.2.3.4,1.2.3.5)" in {
|
||||
convertTo("1.2.3.4.+", "[1.2.3.4,1.2.3.5)")
|
||||
}
|
||||
|
||||
1.2.3.4.+ should
|
||||
${convertTo("1.2.3.4.+", "[1.2.3.4,1.2.3.5)")}
|
||||
"12.31.42.+" should "convert to [12.31.42,12.31.43)" in {
|
||||
convertTo("12.31.42.+", "[12.31.42,12.31.43)")
|
||||
}
|
||||
|
||||
12.31.42.+ should
|
||||
${convertTo("12.31.42.+", "[12.31.42,12.31.43)")}
|
||||
"1.1+" should "convert to [1.1,1.2),[1.10,1.20),[1.100,1.200),[1.1000,1.2000),[1.10000,1.20000)" in {
|
||||
convertTo("1.1+", "[1.1,1.2),[1.10,1.20),[1.100,1.200),[1.1000,1.2000),[1.10000,1.20000)")
|
||||
}
|
||||
|
||||
1.1+ should
|
||||
${convertTo("1.1+", "[1.1,1.2),[1.10,1.20),[1.100,1.200),[1.1000,1.2000),[1.10000,1.20000)")}
|
||||
"1+" should "convert to [1,2),[10,20),[100,200),[1000,2000),[10000,20000)" in {
|
||||
convertTo("1+", "[1,2),[10,20),[100,200),[1000,2000),[10000,20000)")
|
||||
}
|
||||
|
||||
1+ should
|
||||
${convertTo("1+", "[1,2),[10,20),[100,200),[1000,2000),[10000,20000)")}
|
||||
"+" should "convert to [0,)" in convertTo("+", "[0,)")
|
||||
|
||||
+ should
|
||||
${convertTo("+", "[0,)")}
|
||||
|
||||
foo+ should
|
||||
${beParsedAsError("foo+")}
|
||||
"""
|
||||
"foo+" should "convert to foo+" in beParsedAsError("foo+")
|
||||
|
||||
val mp = new MakePom(ConsoleLogger())
|
||||
def convertTo(s: String, expected: String) =
|
||||
MakePom.makeDependencyVersion(s) must_== expected
|
||||
def beParsedAsError(s: String) =
|
||||
try {
|
||||
def convertTo(s: String, expected: String): Unit =
|
||||
MakePom.makeDependencyVersion(s) shouldBe expected
|
||||
def beParsedAsError(s: String): Unit =
|
||||
intercept[Throwable] {
|
||||
MakePom.makeDependencyVersion(s)
|
||||
failure
|
||||
} catch {
|
||||
case e: Throwable => success
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,24 +1,19 @@
|
|||
import java.net.URL
|
||||
|
||||
import org.specs2.mutable.Specification
|
||||
import sbt._
|
||||
import sbt.internal.util.UnitSpec
|
||||
|
||||
object ResolverTest extends Specification {
|
||||
object ResolverTest extends UnitSpec {
|
||||
|
||||
"Resolver" should {
|
||||
"url" should {
|
||||
"propagate pattern descriptorOptional and skipConsistencyCheck." in {
|
||||
val pats = Seq("[orgPath]")
|
||||
val patsExpected = Seq("http://foo.com/test/[orgPath]")
|
||||
val patterns = Resolver.url("test", new URL("http://foo.com/test"))(Patterns(pats, pats, isMavenCompatible = false, descriptorOptional = true, skipConsistencyCheck = true)).patterns
|
||||
"Resolver url" should "propagate pattern descriptorOptional and skipConsistencyCheck." in {
|
||||
val pats = Seq("[orgPath]")
|
||||
val patsExpected = Seq("http://foo.com/test/[orgPath]")
|
||||
val patterns = Resolver.url("test", new URL("http://foo.com/test"))(Patterns(pats, pats, isMavenCompatible = false, descriptorOptional = true, skipConsistencyCheck = true)).patterns
|
||||
|
||||
patterns.ivyPatterns must equalTo(patsExpected)
|
||||
patterns.artifactPatterns must equalTo(patsExpected)
|
||||
patterns.isMavenCompatible must beFalse
|
||||
patterns.skipConsistencyCheck must beTrue
|
||||
patterns.descriptorOptional must beTrue
|
||||
}
|
||||
}
|
||||
patterns.ivyPatterns shouldBe patsExpected
|
||||
patterns.artifactPatterns shouldBe patsExpected
|
||||
patterns.isMavenCompatible shouldBe false
|
||||
assert(patterns.skipConsistencyCheck)
|
||||
assert(patterns.descriptorOptional)
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,112 +1,93 @@
|
|||
package sbt
|
||||
|
||||
import org.specs2._
|
||||
import sbt.internal.util.UnitSpec
|
||||
|
||||
class VersionNumberSpec extends Specification {
|
||||
def is = s2"""
|
||||
// This is a specification to check the version number parsing.
|
||||
class VersionNumberSpec extends UnitSpec {
|
||||
"1" should "be parsed" in beParsedAs("1", Seq(1), Seq(), Seq())
|
||||
it should "breakdown" in breakDownTo("1", Some(1))
|
||||
it should "cascade" in generateCorrectCascadingNumbers("1", Seq("1"))
|
||||
|
||||
This is a specification to check the version number parsing.
|
||||
"1.0" should "be parsed" in beParsedAs("1.0", Seq(1, 0), Seq(), Seq())
|
||||
it should "breakdown" in breakDownTo("1.0", Some(1), Some(0))
|
||||
it should "cascade" in generateCorrectCascadingNumbers("1.0", Seq("1.0"))
|
||||
|
||||
1 should
|
||||
${beParsedAs("1", Seq(1), Seq(), Seq())}
|
||||
${breakDownTo("1", Some(1))}
|
||||
${generateCorrectCascadingNumbers("1", Seq("1"))}
|
||||
"1.0.0" should "be parsed" in beParsedAs("1.0.0", Seq(1, 0, 0), Seq(), Seq())
|
||||
it should "breakdown" in breakDownTo("1.0.0", Some(1), Some(0), Some(0))
|
||||
it should "cascade" in generateCorrectCascadingNumbers("1.0.0", Seq("1.0.0", "1.0"))
|
||||
it should "be SemVer compat with 1.0.1" in beSemVerCompatWith("1.0.0", "1.0.1")
|
||||
it should "be SemVer compat with 1.1.1" in beSemVerCompatWith("1.0.0", "1.1.1")
|
||||
it should "not be SemVer compat with 2.0.0" in notBeSemVerCompatWith("1.0.0", "2.0.0")
|
||||
it should "not be SemVer compat with 1.0.0-M1" in notBeSemVerCompatWith("1.0.0", "1.0.0-M1")
|
||||
it should "be SecSeg compat with 1.0.1" in beSecSegCompatWith("1.0.0", "1.0.1")
|
||||
it should "not be SecSeg compat with 1.1.1" in notBeSecSegCompatWith("1.0.0", "1.1.1")
|
||||
it should "not be SecSeg compat with 2.0.0" in notBeSecSegCompatWith("1.0.0", "2.0.0")
|
||||
it should "not be SecSeg compat with 1.0.0-M1" in notBeSecSegCompatWith("1.0.0", "1.0.0-M1")
|
||||
|
||||
1.0 should
|
||||
${beParsedAs("1.0", Seq(1, 0), Seq(), Seq())}
|
||||
${breakDownTo("1.0", Some(1), Some(0))}
|
||||
${generateCorrectCascadingNumbers("1.0", Seq("1.0"))}
|
||||
"1.0.0.0" should "be parsed" in beParsedAs("1.0.0.0", Seq(1, 0, 0, 0), Seq(), Seq())
|
||||
it should "breakdown" in breakDownTo("1.0.0.0", Some(1), Some(0), Some(0), Some(0))
|
||||
it should "cascade" in generateCorrectCascadingNumbers("1.0.0.0", Seq("1.0.0.0", "1.0.0", "1.0"))
|
||||
|
||||
1.0.0 should
|
||||
${beParsedAs("1.0.0", Seq(1, 0, 0), Seq(), Seq())}
|
||||
${breakDownTo("1.0.0", Some(1), Some(0), Some(0))}
|
||||
${generateCorrectCascadingNumbers("1.0.0", Seq("1.0.0", "1.0"))}
|
||||
"0.12.0" should "be parsed" in beParsedAs("0.12.0", Seq(0, 12, 0), Seq(), Seq())
|
||||
it should "breakdown" in breakDownTo("0.12.0", Some(0), Some(12), Some(0))
|
||||
it should "cascade" in generateCorrectCascadingNumbers("0.12.0", Seq("0.12.0", "0.12"))
|
||||
it should "not be SemVer compat with 0.12.0-RC1" in notBeSemVerCompatWith("0.12.0", "0.12.0-RC1")
|
||||
it should "not be SemVer compat with 0.12.1" in notBeSemVerCompatWith("0.12.0", "0.12.1")
|
||||
it should "not be SemVer compat with 0.12.1-M1" in notBeSemVerCompatWith("0.12.0", "0.12.1-M1")
|
||||
it should "not be SecSeg compat with 0.12.0-RC1" in notBeSecSegCompatWith("0.12.0", "0.12.0-RC1")
|
||||
it should "be SecSeg compat with 0.12.1" in beSecSegCompatWith("0.12.0", "0.12.1")
|
||||
it should "be SecSeg compat with 0.12.1-M1" in beSecSegCompatWith("0.12.0", "0.12.1-M1")
|
||||
|
||||
${beSemVerCompatWith("1.0.0", "1.0.1")}
|
||||
${beSemVerCompatWith("1.0.0", "1.1.1")}
|
||||
${notBeSemVerCompatWith("1.0.0", "2.0.0")}
|
||||
${notBeSemVerCompatWith("1.0.0", "1.0.0-M1")}
|
||||
"0.1.0-SNAPSHOT" should "be parsed" in beParsedAs("0.1.0-SNAPSHOT", Seq(0, 1, 0), Seq("SNAPSHOT"), Seq())
|
||||
it should "cascade" in generateCorrectCascadingNumbers("0.1.0-SNAPSHOT", Seq("0.1.0-SNAPSHOT", "0.1.0", "0.1"))
|
||||
it should "be SemVer compat with 0.1.0-SNAPSHOT" in beSemVerCompatWith("0.1.0-SNAPSHOT", "0.1.0-SNAPSHOT")
|
||||
it should "not be SemVer compat with 0.1.0" in notBeSemVerCompatWith("0.1.0-SNAPSHOT", "0.1.0")
|
||||
it should "be SemVer compat with 0.1.0-SNAPSHOT+001" in beSemVerCompatWith("0.1.0-SNAPSHOT", "0.1.0-SNAPSHOT+001")
|
||||
it should "be SecSeg compat with 0.1.0-SNAPSHOT" in beSecSegCompatWith("0.1.0-SNAPSHOT", "0.1.0-SNAPSHOT")
|
||||
it should "be not SecSeg compat with 0.1.0" in notBeSecSegCompatWith("0.1.0-SNAPSHOT", "0.1.0")
|
||||
it should "be SecSeg compat with 0.1.0-SNAPSHOT+001" in beSecSegCompatWith("0.1.0-SNAPSHOT", "0.1.0-SNAPSHOT+001")
|
||||
|
||||
${beSecSegCompatWith("1.0.0", "1.0.1")}
|
||||
${notBeSecSegCompatWith("1.0.0", "1.1.1")}
|
||||
${notBeSecSegCompatWith("1.0.0", "2.0.0")}
|
||||
${notBeSecSegCompatWith("1.0.0", "1.0.0-M1")}
|
||||
"0.1.0-M1" should "be parsed" in beParsedAs("0.1.0-M1", Seq(0, 1, 0), Seq("M1"), Seq())
|
||||
it should "cascade" in generateCorrectCascadingNumbers("0.1.0-M1", Seq("0.1.0-M1", "0.1.0", "0.1"))
|
||||
|
||||
1.0.0.0 should
|
||||
${beParsedAs("1.0.0.0", Seq(1, 0, 0, 0), Seq(), Seq())}
|
||||
${breakDownTo("1.0.0.0", Some(1), Some(0), Some(0), Some(0))}
|
||||
${generateCorrectCascadingNumbers("1.0.0.0", Seq("1.0.0.0", "1.0.0", "1.0"))}
|
||||
"0.1.0-RC1" should "be parsed" in beParsedAs("0.1.0-RC1", Seq(0, 1, 0), Seq("RC1"), Seq())
|
||||
it should "cascade" in generateCorrectCascadingNumbers("0.1.0-RC1", Seq("0.1.0-RC1", "0.1.0", "0.1"))
|
||||
|
||||
0.12.0 should
|
||||
${beParsedAs("0.12.0", Seq(0, 12, 0), Seq(), Seq())}
|
||||
${breakDownTo("0.12.0", Some(0), Some(12), Some(0))}
|
||||
${generateCorrectCascadingNumbers("0.12.0", Seq("0.12.0", "0.12"))}
|
||||
|
||||
${notBeSemVerCompatWith("0.12.0", "0.12.0-RC1")}
|
||||
${notBeSemVerCompatWith("0.12.0", "0.12.1")}
|
||||
${notBeSemVerCompatWith("0.12.0", "0.12.1-M1")}
|
||||
|
||||
${notBeSecSegCompatWith("0.12.0", "0.12.0-RC1")}
|
||||
${beSecSegCompatWith("0.12.0", "0.12.1")}
|
||||
${beSecSegCompatWith("0.12.0", "0.12.1-M1")}
|
||||
|
||||
0.1.0-SNAPSHOT should
|
||||
${beParsedAs("0.1.0-SNAPSHOT", Seq(0, 1, 0), Seq("SNAPSHOT"), Seq())}
|
||||
${generateCorrectCascadingNumbers("0.1.0-SNAPSHOT", Seq("0.1.0-SNAPSHOT", "0.1.0", "0.1"))}
|
||||
|
||||
${beSemVerCompatWith("0.1.0-SNAPSHOT", "0.1.0-SNAPSHOT")}
|
||||
${notBeSemVerCompatWith("0.1.0-SNAPSHOT", "0.1.0")}
|
||||
${beSemVerCompatWith("0.1.0-SNAPSHOT", "0.1.0-SNAPSHOT+001")}
|
||||
|
||||
${beSecSegCompatWith("0.1.0-SNAPSHOT", "0.1.0-SNAPSHOT")}
|
||||
${notBeSecSegCompatWith("0.1.0-SNAPSHOT", "0.1.0")}
|
||||
${beSecSegCompatWith("0.1.0-SNAPSHOT", "0.1.0-SNAPSHOT+001")}
|
||||
|
||||
0.1.0-M1 should
|
||||
${beParsedAs("0.1.0-M1", Seq(0, 1, 0), Seq("M1"), Seq())}
|
||||
${generateCorrectCascadingNumbers("0.1.0-M1", Seq("0.1.0-M1", "0.1.0", "0.1"))}
|
||||
|
||||
0.1.0-RC1 should
|
||||
${beParsedAs("0.1.0-RC1", Seq(0, 1, 0), Seq("RC1"), Seq())}
|
||||
${generateCorrectCascadingNumbers("0.1.0-RC1", Seq("0.1.0-RC1", "0.1.0", "0.1"))}
|
||||
|
||||
0.1.0-MSERVER-1 should
|
||||
${beParsedAs("0.1.0-MSERVER-1", Seq(0, 1, 0), Seq("MSERVER", "1"), Seq())}
|
||||
${generateCorrectCascadingNumbers("0.1.0-MSERVER-1", Seq("0.1.0-MSERVER-1", "0.1.0", "0.1"))}
|
||||
"0.1.0-MSERVER-1" should "be parsed" in beParsedAs("0.1.0-MSERVER-1", Seq(0, 1, 0), Seq("MSERVER", "1"), Seq())
|
||||
it should "cascade" in generateCorrectCascadingNumbers("0.1.0-MSERVER-1", Seq("0.1.0-MSERVER-1", "0.1.0", "0.1"))
|
||||
|
||||
|
||||
2.10.4-20140115-000117-b3a-sources should
|
||||
${beParsedAs("2.10.4-20140115-000117-b3a-sources", Seq(2, 10, 4), Seq("20140115", "000117", "b3a", "sources"), Seq())}
|
||||
${generateCorrectCascadingNumbers("2.10.4-20140115-000117-b3a-sources", Seq("2.10.4-20140115-000117-b3a-sources", "2.10.4", "2.10"))}
|
||||
"2.10.4-20140115-000117-b3a-sources" should "be parsed" in {
|
||||
beParsedAs("2.10.4-20140115-000117-b3a-sources", Seq(2, 10, 4), Seq("20140115", "000117", "b3a", "sources"), Seq())
|
||||
}
|
||||
it should "cascade" in generateCorrectCascadingNumbers("2.10.4-20140115-000117-b3a-sources", Seq("2.10.4-20140115-000117-b3a-sources", "2.10.4", "2.10"))
|
||||
it should "be SemVer compat with 2.0.0" in beSemVerCompatWith("2.10.4-20140115-000117-b3a-sources", "2.0.0")
|
||||
it should "be not SecSeg compat with 2.0.0" in notBeSecSegCompatWith("2.10.4-20140115-000117-b3a-sources", "2.0.0")
|
||||
|
||||
${beSemVerCompatWith("2.10.4-20140115-000117-b3a-sources", "2.0.0")}
|
||||
"20140115000117-b3a-sources" should "be parsed" in {
|
||||
beParsedAs("20140115000117-b3a-sources", Seq(20140115000117L), Seq("b3a", "sources"), Seq())
|
||||
}
|
||||
it should "cascade" in generateCorrectCascadingNumbers("20140115000117-b3a-sources", Seq("20140115000117-b3a-sources"))
|
||||
|
||||
${notBeSecSegCompatWith("2.10.4-20140115-000117-b3a-sources", "2.0.0")}
|
||||
"1.0.0-alpha+001+002" should "be parsed" in {
|
||||
beParsedAs("1.0.0-alpha+001+002", Seq(1, 0, 0), Seq("alpha"), Seq("+001", "+002"))
|
||||
}
|
||||
it should "cascade" in generateCorrectCascadingNumbers("1.0.0-alpha+001+002", Seq("1.0.0-alpha+001+002", "1.0.0", "1.0"))
|
||||
|
||||
20140115000117-b3a-sources should
|
||||
${beParsedAs("20140115000117-b3a-sources", Seq(20140115000117L), Seq("b3a", "sources"), Seq())}
|
||||
${generateCorrectCascadingNumbers("20140115000117-b3a-sources", Seq("20140115000117-b3a-sources"))}
|
||||
"non.space.!?string" should "be parsed" in {
|
||||
beParsedAs("non.space.!?string", Seq(), Seq(), Seq("non.space.!?string"))
|
||||
}
|
||||
it should "cascade" in generateCorrectCascadingNumbers("non.space.!?string", Seq("non.space.!?string"))
|
||||
|
||||
1.0.0-alpha+001+002 should
|
||||
${beParsedAs("1.0.0-alpha+001+002", Seq(1, 0, 0), Seq("alpha"), Seq("+001", "+002"))}
|
||||
${generateCorrectCascadingNumbers("1.0.0-alpha+001+002", Seq("1.0.0-alpha+001+002", "1.0.0", "1.0"))}
|
||||
"space !?string" should "be parsed as an error" in beParsedAsError("space !?string")
|
||||
"blank string" should "be parsed as an error" in beParsedAsError("")
|
||||
|
||||
non.space.!?string should
|
||||
${beParsedAs("non.space.!?string", Seq(), Seq(), Seq("non.space.!?string"))}
|
||||
${generateCorrectCascadingNumbers("non.space.!?string", Seq("non.space.!?string"))}
|
||||
|
||||
space !?string should
|
||||
${beParsedAsError("space !?string")}
|
||||
|
||||
blank string should
|
||||
${beParsedAsError("")}
|
||||
"""
|
||||
|
||||
def beParsedAs(s: String, ns: Seq[Long], ts: Seq[String], es: Seq[String]) =
|
||||
s match {
|
||||
case VersionNumber(ns1, ts1, es1) if (ns1 == ns && ts1 == ts && es1 == es) =>
|
||||
(VersionNumber(ns, ts, es).toString must_== s) and
|
||||
(VersionNumber(ns, ts, es) == VersionNumber(ns, ts, es))
|
||||
(VersionNumber(ns, ts, es).toString shouldBe s)
|
||||
(VersionNumber(ns, ts, es) shouldBe VersionNumber(ns, ts, es))
|
||||
case VersionNumber(ns1, ts1, es1) =>
|
||||
sys.error(s"$ns1, $ts1, $es1")
|
||||
}
|
||||
|
|
@ -115,26 +96,26 @@ class VersionNumberSpec extends Specification {
|
|||
s match {
|
||||
case VersionNumber(ns, ts, es) =>
|
||||
val v = VersionNumber(ns, ts, es)
|
||||
(v._1 must_== major) and
|
||||
(v._2 must_== minor) and
|
||||
(v._3 must_== patch) and
|
||||
(v._4 must_== buildNumber)
|
||||
(v._1 shouldBe major)
|
||||
(v._2 shouldBe minor)
|
||||
(v._3 shouldBe patch)
|
||||
(v._4 shouldBe buildNumber)
|
||||
}
|
||||
def beParsedAsError(s: String) =
|
||||
def beParsedAsError(s: String): Unit =
|
||||
s match {
|
||||
case VersionNumber(ns1, ts1, es1) => failure
|
||||
case _ => success
|
||||
case VersionNumber(ns1, ts1, es1) => sys.error(s)
|
||||
case _ => ()
|
||||
}
|
||||
def beSemVerCompatWith(v1: String, v2: String) =
|
||||
VersionNumber.SemVer.isCompatible(VersionNumber(v1), VersionNumber(v2)) must_== true
|
||||
VersionNumber.SemVer.isCompatible(VersionNumber(v1), VersionNumber(v2)) shouldBe true
|
||||
def notBeSemVerCompatWith(v1: String, v2: String) =
|
||||
VersionNumber.SemVer.isCompatible(VersionNumber(v1), VersionNumber(v2)) must_== false
|
||||
VersionNumber.SemVer.isCompatible(VersionNumber(v1), VersionNumber(v2)) shouldBe false
|
||||
def beSecSegCompatWith(v1: String, v2: String) =
|
||||
VersionNumber.SecondSegment.isCompatible(VersionNumber(v1), VersionNumber(v2)) must_== true
|
||||
VersionNumber.SecondSegment.isCompatible(VersionNumber(v1), VersionNumber(v2)) shouldBe true
|
||||
def notBeSecSegCompatWith(v1: String, v2: String) =
|
||||
VersionNumber.SecondSegment.isCompatible(VersionNumber(v1), VersionNumber(v2)) must_== false
|
||||
VersionNumber.SecondSegment.isCompatible(VersionNumber(v1), VersionNumber(v2)) shouldBe false
|
||||
def generateCorrectCascadingNumbers(s: String, ns: Seq[String]) = {
|
||||
val versionNumbers = ns.toVector map VersionNumber.apply
|
||||
VersionNumber(s).cascadingVersions must_== versionNumbers
|
||||
VersionNumber(s).cascadingVersions shouldBe versionNumbers
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,11 +5,12 @@ object Dependencies {
|
|||
lazy val scala210 = "2.10.5"
|
||||
lazy val scala211 = "2.11.7"
|
||||
|
||||
val utilVersion = "0.1.0-M1"
|
||||
val ioVersion = "1.0.0-M1"
|
||||
val utilVersion = "0.1.0-M2"
|
||||
val ioVersion = "1.0.0-M3"
|
||||
lazy val sbtIO = "org.scala-sbt" %% "io" % ioVersion
|
||||
lazy val utilCollection = "org.scala-sbt" %% "util-collection" % utilVersion
|
||||
lazy val utilLogging = "org.scala-sbt" %% "util-logging" % utilVersion
|
||||
lazy val utilTesting = "org.scala-sbt" %% "util-testing" % utilVersion
|
||||
|
||||
lazy val launcherInterface = "org.scala-sbt" % "launcher-interface" % "1.0.0-M1"
|
||||
lazy val ivy = "org.scala-sbt.ivy" % "ivy" % "2.3.0-sbt-927bc9ded7f8fba63297cddd0d5a3d01d6ad5d8d"
|
||||
|
|
|
|||
Loading…
Reference in New Issue