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 | |
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
-rw-r--r-- | build.sc | 27 | ||||
-rw-r--r-- | core/src/main/scala/mill/discover/Discovered.scala | 2 | ||||
-rw-r--r-- | core/src/main/scala/mill/eval/PathRef.scala | 1 | ||||
-rw-r--r-- | core/src/main/scala/mill/modules/Jvm.scala | 2 | ||||
-rw-r--r-- | core/src/test/examples/javac/build.sc | 2 | ||||
-rw-r--r-- | core/src/test/scala/mill/CacherTests.scala | 2 | ||||
-rw-r--r-- | scalaplugin/src/main/scala/mill/scalaplugin/Subproject.scala | 41 | ||||
-rw-r--r-- | scalaplugin/src/main/scala/mill/scalaplugin/TestRunner.scala | 84 | ||||
-rw-r--r-- | scalaplugin/src/test/scala/mill/scalaplugin/MetacircularTests.scala | 4 |
9 files changed, 137 insertions, 28 deletions
@@ -9,10 +9,12 @@ import mill._ import mill.scalaplugin._ object Build{ + trait MillSubproject extends Subproject{ + def scalaVersion = T{ "2.12.4" } + } + object Core extends MillSubproject { - object Core extends Subproject { - def scalaVersion = T{ "2.12.4" } override def compileIvyDeps = T{ super.compileIvyDeps() ++ Seq[ScalaDep]( Dep(Mod("org.scala-lang", "scala-reflect"), scalaVersion(), configuration = "provided") @@ -25,23 +27,24 @@ object Build{ ScalaDep(Dep(Mod("com.lihaoyi", "pprint"), "0.5.3")), ScalaDep.Point(Dep(Mod("com.lihaoyi", "ammonite"), "1.0.3")), ScalaDep(Dep(Mod("com.typesafe.play", "play-json"), "2.6.6")), - ScalaDep(Dep(Mod("org.scala-sbt", "zinc"), "1.0.3")) + ScalaDep(Dep(Mod("org.scala-sbt", "zinc"), "1.0.3")), + Dep(Mod("org.scala-sbt", "test-interface"), "1.0") ) } - def basePath = T{ pwd / 'core } - override def sources = T{ PathRef(pwd/'core/'src/'main/'scala) } - override def resources = T{ sources } + override def sources = T{ pwd/'core/'src/'main/'scala } + } + object CoreTests extends MillSubproject { + override def projectDeps = Seq(Core) + def basePath = T{ pwd / 'scalaplugin } + override def sources = T{ pwd/'core/'src/'test/'scala } } - object ScalaPlugin extends Subproject { - def scalaVersion = T{ "2.12.4" } - override def depClasspath = T{ Seq(Core.compiled()) } - override def ivyDeps = T{ Core.ivyDeps } + object ScalaPlugin extends MillSubproject { + override def projectDeps = Seq(Core) def basePath = T{ pwd / 'scalaplugin } - override def sources = T{ PathRef(pwd/'scalaplugin/'src/'main/'scala) } - override def resources = T{ sources } + override def sources = T{ pwd/'scalaplugin/'src/'main/'scala } } } @main def main(): Any = Build -> mill.discover.Discovered[Build.type] diff --git a/core/src/main/scala/mill/discover/Discovered.scala b/core/src/main/scala/mill/discover/Discovered.scala index c8edf26a..3fca9a9f 100644 --- a/core/src/main/scala/mill/discover/Discovered.scala +++ b/core/src/main/scala/mill/discover/Discovered.scala @@ -1,6 +1,6 @@ package mill.discover -import mill.define.Task +import mill.define.{Target, Task} import mill.discover.Router.{EntryPoint, Result} import play.api.libs.json.Format diff --git a/core/src/main/scala/mill/eval/PathRef.scala b/core/src/main/scala/mill/eval/PathRef.scala index 5f7efe89..6d99ad91 100644 --- a/core/src/main/scala/mill/eval/PathRef.scala +++ b/core/src/main/scala/mill/eval/PathRef.scala @@ -55,6 +55,7 @@ case class PathRef(path: ammonite.ops.Path){ } object PathRef{ + implicit def make(p: ammonite.ops.Path): PathRef = PathRef(p) private implicit val pathFormat: Format[Path] = JsonFormatters.pathFormat implicit def jsonFormatter: Format[PathRef] = Json.format } diff --git a/core/src/main/scala/mill/modules/Jvm.scala b/core/src/main/scala/mill/modules/Jvm.scala index bfb7defe..bbaf1474 100644 --- a/core/src/main/scala/mill/modules/Jvm.scala +++ b/core/src/main/scala/mill/modules/Jvm.scala @@ -64,7 +64,7 @@ object Jvm { val inputs = roots def evaluate(args: Args): PathRef = { createJar(args.dest, args.args.map(_.asInstanceOf[PathRef].path)) - PathRef(args.dest) + args.dest } } } diff --git a/core/src/test/examples/javac/build.sc b/core/src/test/examples/javac/build.sc index f8789eb7..a54e2110 100644 --- a/core/src/test/examples/javac/build.sc +++ b/core/src/test/examples/javac/build.sc @@ -60,7 +60,7 @@ object Foo { output.write(read.bytes(path)) } output.close() - PathRef(args.dest) + args.dest } } diff --git a/core/src/test/scala/mill/CacherTests.scala b/core/src/test/scala/mill/CacherTests.scala index 1a510e4c..b6aebb0c 100644 --- a/core/src/test/scala/mill/CacherTests.scala +++ b/core/src/test/scala/mill/CacherTests.scala @@ -33,7 +33,7 @@ object CacherTests extends TestSuite{ 'simpleDefIsCached - assert( Base.value eq Base.value, - eval(Base, Base.value) == 1 + eval(Base, Base.value) == 11 ) 'overridingDefIsAlsoCached - assert( 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 } } |