summaryrefslogtreecommitdiff
path: root/scalaplugin
diff options
context:
space:
mode:
authorLi Haoyi <haoyi.sg@gmail.com>2017-11-11 11:36:47 -0800
committerLi Haoyi <haoyi.sg@gmail.com>2017-11-11 11:36:47 -0800
commit0b5de583df91b7f2b33490003a8d35934c7e27f9 (patch)
tree6b938209cf4ea270c059136fa944b7c38831e067 /scalaplugin
parentefbaf34d7d977a13a083638426b86f5a2218eceb (diff)
downloadmill-0b5de583df91b7f2b33490003a8d35934c7e27f9.tar.gz
mill-0b5de583df91b7f2b33490003a8d35934c7e27f9.tar.bz2
mill-0b5de583df91b7f2b33490003a8d35934c7e27f9.zip
Swap over to new `projectDeps` mechanism for defining dependencies between various `scalaplugin.Subproject`s
Diffstat (limited to 'scalaplugin')
-rw-r--r--scalaplugin/src/main/scala/mill/scalaplugin/Subproject.scala41
-rw-r--r--scalaplugin/src/main/scala/mill/scalaplugin/TestRunner.scala84
-rw-r--r--scalaplugin/src/test/scala/mill/scalaplugin/MetacircularTests.scala4
3 files changed, 117 insertions, 12 deletions
diff --git a/scalaplugin/src/main/scala/mill/scalaplugin/Subproject.scala b/scalaplugin/src/main/scala/mill/scalaplugin/Subproject.scala
index f30e74d2..054bc5be 100644
--- a/scalaplugin/src/main/scala/mill/scalaplugin/Subproject.scala
+++ b/scalaplugin/src/main/scala/mill/scalaplugin/Subproject.scala
@@ -110,7 +110,7 @@ object Subproject{
l
}
)
- PathRef(outputPath)
+ outputPath
}
def resolveDependencies(repositories: Seq[Repository],
@@ -171,7 +171,7 @@ object Subproject{
}
import Subproject._
-abstract class Subproject extends Cacher{
+trait Subproject extends Cacher{
def scalaVersion: T[String]
def scalaBinaryVersion = T{ scalaVersion().split('.').dropRight(1).mkString(".") }
@@ -185,9 +185,25 @@ abstract class Subproject extends Cacher{
MavenRepository("https://repo1.maven.org/maven2")
)
+ def projectDeps = Seq.empty[Subproject]
def depClasspath = T{ Seq.empty[PathRef] }
- def compileDepClasspath = T[Seq[PathRef]] {
- depClasspath() ++ resolveDependencies(
+
+
+ def upstreamRunClasspath = T {
+ Task.traverse(
+ for (p <- projectDeps)
+ yield T.task(p.runDepClasspath() ++ Seq(p.compiled()))
+ )
+ }
+ def upstreamCompileClasspath = T {
+ Task.traverse(
+ for (p <- projectDeps)
+ yield T.task(p.compileDepClasspath() ++ Seq(p.compiled()))
+ )
+ }
+
+ def compileDepClasspath: T[Seq[PathRef]] = T{
+ upstreamCompileClasspath().flatten ++ depClasspath() ++ resolveDependencies(
repositories,
scalaVersion(),
scalaBinaryVersion(),
@@ -195,8 +211,10 @@ abstract class Subproject extends Cacher{
)
}
- def runDepClasspath = T[Seq[PathRef]] {
- depClasspath() ++ resolveDependencies(
+ def runDepClasspath: T[Seq[PathRef]] = T{
+ upstreamRunClasspath().flatten ++
+ depClasspath() ++
+ resolveDependencies(
repositories,
scalaVersion(),
scalaBinaryVersion(),
@@ -204,8 +222,8 @@ abstract class Subproject extends Cacher{
)
}
- def sources = T{ PathRef(basePath() / 'src) }
- def resources = T{ PathRef(basePath() / 'resources) }
+ def sources = T[PathRef]{ basePath() / 'src }
+ def resources = T[PathRef]{ basePath() / 'resources }
def compiled = T{
compileScala(scalaVersion(), sources(), compileDepClasspath(), Task.ctx().dest)
}
@@ -215,16 +233,19 @@ abstract class Subproject extends Cacher{
def run(mainClass: String) = T.command{
import ammonite.ops._, ImplicitWd._
- %('java, "-cp", (runDepClasspath().map(_.path) :+ compiled()).mkString(":"), mainClass)
+ %('java, "-cp", (runDepClasspath().map(_.path) :+ compiled().path).mkString(":"), mainClass)
}
def console() = T.command{
import ammonite.ops._, ImplicitWd._
%('java,
"-cp",
- (runDepClasspath().map(_.path) :+ compiled()).mkString(":"),
+ (runDepClasspath().map(_.path) :+ compiled().path).mkString(":"),
"scala.tools.nsc.MainGenericRunner",
"-usejavacp"
)
}
+ def test() = T.command{
+ TestRunner.apply("mill.UTestFramework", Seq(pwd/'core/'target/"scala-2.12"/"test-classes"))
+ }
}
diff --git a/scalaplugin/src/main/scala/mill/scalaplugin/TestRunner.scala b/scalaplugin/src/main/scala/mill/scalaplugin/TestRunner.scala
new file mode 100644
index 00000000..fb6ff772
--- /dev/null
+++ b/scalaplugin/src/main/scala/mill/scalaplugin/TestRunner.scala
@@ -0,0 +1,84 @@
+package mill.scalaplugin
+
+import java.io.FileInputStream
+import java.lang.annotation.Annotation
+import java.util.zip.ZipInputStream
+
+import ammonite.ops.{Path, ls, pwd}
+import sbt.testing._
+
+object TestRunner {
+ def listClassFiles(base: Path): Iterator[String] = {
+ if (base.isDir) ls.rec(base).toIterator.filter(_.ext == "class").map(_.relativeTo(base).toString)
+ else {
+ val zip = new ZipInputStream(new FileInputStream(base.toIO))
+ Iterator.continually(zip.getNextEntry).takeWhile(_ != null).map(_.getName).filter(_.endsWith(".class"))
+ }
+ }
+ def runTests(framework: Framework, classpath: Seq[Path]) = {
+
+
+ val fingerprints = framework.fingerprints()
+ val testClasses = classpath.flatMap { base =>
+ listClassFiles(base).flatMap { path =>
+ val cls = Class.forName(path.stripSuffix(".class").replace('/', '.'))
+ fingerprints.find {
+ case f: SubclassFingerprint =>
+ Class.forName(f.superclassName()).isAssignableFrom(cls)
+ case f: AnnotatedFingerprint =>
+ cls.isAnnotationPresent(
+ Class.forName(f.annotationName()).asInstanceOf[Class[Annotation]]
+ )
+ }.map { f => (cls, f) }
+ }
+ }
+ testClasses
+ }
+ // "mill.UTestFramework"
+ // Seq(pwd/'core/'target/"scala-2.12"/"test-classes")
+ def apply(frameworkName: String, testClassfilePath: Seq[Path]): Unit = {
+
+ val framework = Class.forName(frameworkName)
+ .newInstance()
+ .asInstanceOf[sbt.testing.Framework]
+
+ val testClasses = runTests(framework, testClassfilePath)
+
+ pprint.log(testClasses)
+
+ val runner = framework.runner(Array(), Array(), getClass.getClassLoader)
+ println(runner)
+
+ val tasks = runner.tasks(
+ for((cls, fingerprint) <- testClasses.toArray)
+ yield {
+ new TaskDef(cls.getName.stripSuffix("$"), fingerprint, true, Array())
+ }
+ )
+ for(t <- tasks){
+ t.execute(
+ new EventHandler {
+ def handle(event: Event) = ()
+ },
+ Array(
+ new Logger {
+ def debug(msg: String) = println(msg)
+
+ def error(msg: String) = println(msg)
+
+ def ansiCodesSupported() = true
+
+ def warn(msg: String) = println(msg)
+
+ def trace(t: Throwable) = println(t)
+
+ def info(msg: String) = println(msg)
+ })
+ )
+ }
+ val doneMsg = runner.done()
+ if (doneMsg.trim.nonEmpty){
+ println(doneMsg)
+ }
+ }
+}
diff --git a/scalaplugin/src/test/scala/mill/scalaplugin/MetacircularTests.scala b/scalaplugin/src/test/scala/mill/scalaplugin/MetacircularTests.scala
index 2d6d25e7..21640e6b 100644
--- a/scalaplugin/src/test/scala/mill/scalaplugin/MetacircularTests.scala
+++ b/scalaplugin/src/test/scala/mill/scalaplugin/MetacircularTests.scala
@@ -30,7 +30,7 @@ object MetacircularTests extends TestSuite{
def basePath = T{ pwd / 'core }
- override def sources = T{ PathRef(pwd/'core/'src/'main/'scala) }
+ override def sources = T{ pwd/'core/'src/'main/'scala }
override def resources = T{ sources }
}
object ScalaPlugin extends Subproject {
@@ -39,7 +39,7 @@ object MetacircularTests extends TestSuite{
override def depClasspath = T{ Seq(Core.compiled()) }
override def ivyDeps = T{ Core.ivyDeps }
def basePath = T{ pwd / 'scalaplugin }
- override def sources = T{ PathRef(pwd/'scalaplugin/'src/'main/'scala) }
+ override def sources = T{ pwd/'scalaplugin/'src/'main/'scala }
override def resources = T{ sources }
}