diff options
author | Li Haoyi <haoyi.sg@gmail.com> | 2017-11-11 11:36:47 -0800 |
---|---|---|
committer | Li Haoyi <haoyi.sg@gmail.com> | 2017-11-11 11:36:47 -0800 |
commit | 0b5de583df91b7f2b33490003a8d35934c7e27f9 (patch) | |
tree | 6b938209cf4ea270c059136fa944b7c38831e067 /scalaplugin/src/main/scala | |
parent | efbaf34d7d977a13a083638426b86f5a2218eceb (diff) | |
download | mill-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/src/main/scala')
-rw-r--r-- | scalaplugin/src/main/scala/mill/scalaplugin/Subproject.scala | 41 | ||||
-rw-r--r-- | scalaplugin/src/main/scala/mill/scalaplugin/TestRunner.scala | 84 |
2 files changed, 115 insertions, 10 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) + } + } +} |