diff options
author | Li Haoyi <haoyi.sg@gmail.com> | 2017-12-30 18:00:18 -0800 |
---|---|---|
committer | Li Haoyi <haoyi.sg@gmail.com> | 2017-12-30 18:14:18 -0800 |
commit | 282d9a667b69863fefbddb83ade4b9efbc98b994 (patch) | |
tree | 06ef80cf9cfd11b80bde22e1c6cffa61905e139b /core/src | |
parent | 476640d8b78a2d1bc902fcdd15fcef996b73ca2c (diff) | |
download | mill-282d9a667b69863fefbddb83ade4b9efbc98b994.tar.gz mill-282d9a667b69863fefbddb83ade4b9efbc98b994.tar.bz2 mill-282d9a667b69863fefbddb83ade4b9efbc98b994.zip |
Make use of `T.command`s `T.ctx().dest` in `ScalaPlugin#test.test` and `forkTest`, and allow users to dump the structured JSON test results via `--show`
Diffstat (limited to 'core/src')
-rw-r--r-- | core/src/main/scala/mill/eval/Evaluator.scala | 19 | ||||
-rw-r--r-- | core/src/main/scala/mill/main/RunScript.scala | 2 | ||||
-rw-r--r-- | core/src/main/scala/mill/modules/Jvm.scala | 7 | ||||
-rw-r--r-- | core/src/main/scala/mill/util/JsonFormatters.scala | 27 | ||||
-rw-r--r-- | core/src/test/scala/mill/eval/JavaCompileJarTests.scala | 2 |
5 files changed, 43 insertions, 14 deletions
diff --git a/core/src/main/scala/mill/eval/Evaluator.scala b/core/src/main/scala/mill/eval/Evaluator.scala index 0a295ee1..ebb21a94 100644 --- a/core/src/main/scala/mill/eval/Evaluator.scala +++ b/core/src/main/scala/mill/eval/Evaluator.scala @@ -14,7 +14,12 @@ import scala.collection.mutable case class Labelled[T](target: NamedTask[T], segments: Seq[Segment]){ def format = target match{ - case t: Target[Any] => Some(t.readWrite.asInstanceOf[upickle.default.ReadWriter[Any]]) + case t: Target[T] => Some(t.readWrite.asInstanceOf[upickle.default.ReadWriter[T]]) + case _ => None + } + def writer = target match{ + case t: mill.define.Command[T] => Some(t.writer.asInstanceOf[upickle.default.Writer[T]]) + case t: Target[T] => Some(t.readWrite.asInstanceOf[upickle.default.ReadWriter[T]]) case _ => None } } @@ -90,12 +95,14 @@ class Evaluator[T](val workspacePath: Path, json <- scala.util.Try(upickle.json.read(read(paths.meta))).toOption (cachedHash, terminalResult) <- scala.util.Try(upickle.default.readJs[(Int, upickle.Js.Value)](json)).toOption if cachedHash == inputsHash - } yield terminalResult + reader <- labelledTarget.format + parsed <- reader.read.lift(terminalResult) + } yield parsed cached match{ - case Some(terminalResult) => + case Some(parsed) => val newResults = mutable.LinkedHashMap.empty[Task[_], Result[Any]] - newResults(labelledTarget.target) = labelledTarget.format.get.read(terminalResult) + newResults(labelledTarget.target) = parsed (newResults, Nil) case _ => @@ -116,8 +123,8 @@ class Evaluator[T](val workspacePath: Path, newResults(labelledTarget.target) match{ case Result.Success(v) => val terminalResult = labelledTarget - .format - .asInstanceOf[Option[upickle.default.ReadWriter[Any]]] + .writer + .asInstanceOf[Option[upickle.default.Writer[Any]]] .map(_.write(v)) for(t <- terminalResult){ diff --git a/core/src/main/scala/mill/main/RunScript.scala b/core/src/main/scala/mill/main/RunScript.scala index 22d6fc95..ad813026 100644 --- a/core/src/main/scala/mill/main/RunScript.scala +++ b/core/src/main/scala/mill/main/RunScript.scala @@ -141,7 +141,7 @@ object RunScript{ case 0 => val json = for(t <- Seq(target)) yield { t match { - case t: mill.define.Target[_] => + case t: mill.define.NamedTask[_] => for (segments <- evaluator.mapping.modules.get(t.owner)) yield { val jsonFile = Evaluator.resolveDestPaths(evaluator.workspacePath, segments :+ Segment.Label(t.name)).meta val metadata = upickle.json.read(jsonFile.toIO) diff --git a/core/src/main/scala/mill/modules/Jvm.scala b/core/src/main/scala/mill/modules/Jvm.scala index f366a0e0..3bed0917 100644 --- a/core/src/main/scala/mill/modules/Jvm.scala +++ b/core/src/main/scala/mill/modules/Jvm.scala @@ -58,7 +58,8 @@ object Jvm { val stdout = proc.getInputStream val stderr = proc.getErrorStream - val sources = Seq(stdout , stderr) + val sources = Seq(stdout -> (Left(_: Bytes)), stderr -> (Right(_: Bytes))) + val chunks = mutable.Buffer.empty[Either[Bytes, Bytes]] while( // Process.isAlive doesn't exist on JDK 7 =/ util.Try(proc.exitValue).isFailure || @@ -66,11 +67,12 @@ object Jvm { stderr.available() > 0 ){ var readSomething = false - for (std <- sources){ + for ((std, wrapper) <- sources){ while (std.available() > 0){ readSomething = true val array = new Array[Byte](std.available()) val actuallyRead = std.read(array) + chunks.append(wrapper(new ammonite.ops.Bytes(array))) ctx.log.outputStream.write(array, 0, actuallyRead) } } @@ -80,6 +82,7 @@ object Jvm { } if (proc.exitValue() != 0) throw new InteractiveShelloutException() + else ammonite.ops.CommandResult(proc.exitValue(), chunks) } private def createManifest(mainClass: Option[String]) = { diff --git a/core/src/main/scala/mill/util/JsonFormatters.scala b/core/src/main/scala/mill/util/JsonFormatters.scala index d8125ff2..00a40e7d 100644 --- a/core/src/main/scala/mill/util/JsonFormatters.scala +++ b/core/src/main/scala/mill/util/JsonFormatters.scala @@ -1,17 +1,18 @@ package mill.util import ammonite.ops.{Bytes, Path} +import upickle.Js import upickle.default.{ReadWriter => RW} object JsonFormatters extends JsonFormatters trait JsonFormatters { implicit val pathReadWrite: RW[ammonite.ops.Path] = RW[ammonite.ops.Path]( - o => upickle.Js.Str(o.toString()), - {case upickle.Js.Str(json) => Path(json.toString)}, + o => Js.Str(o.toString()), + {case Js.Str(json) => Path(json.toString)}, ) implicit val bytesReadWrite: RW[Bytes] = RW[Bytes]( - o => upickle.Js.Str(javax.xml.bind.DatatypeConverter.printBase64Binary(o.array)), - {case upickle.Js.Str(json) => new Bytes(javax.xml.bind.DatatypeConverter.parseBase64Binary(json.toString))} + o => Js.Str(javax.xml.bind.DatatypeConverter.printBase64Binary(o.array)), + {case Js.Str(json) => new Bytes(javax.xml.bind.DatatypeConverter.parseBase64Binary(json.toString))} ) @@ -20,4 +21,22 @@ trait JsonFormatters { implicit lazy val modFormat: RW[coursier.Module] = upickle.default.macroRW implicit lazy val depFormat: RW[coursier.Dependency]= upickle.default.macroRW implicit lazy val attrFormat: RW[coursier.Attributes] = upickle.default.macroRW + implicit val stackTraceRW = upickle.default.ReadWriter[StackTraceElement]( + ste => Js.Obj( + "declaringClass" -> Js.Str(ste.getClassName), + "methodName" -> Js.Str(ste.getMethodName), + "fileName" -> Js.Str(ste.getFileName), + "lineNumber" -> Js.Num(ste.getLineNumber) + ), + {case json: Js.Obj => + new StackTraceElement( + json("declaringClass").str.toString, + json("methodName").str.toString, + json("fileName").str.toString, + json("lineNumber").num.toInt + ) + } + ) + + } diff --git a/core/src/test/scala/mill/eval/JavaCompileJarTests.scala b/core/src/test/scala/mill/eval/JavaCompileJarTests.scala index ba74dea3..0efd0bf1 100644 --- a/core/src/test/scala/mill/eval/JavaCompileJarTests.scala +++ b/core/src/test/scala/mill/eval/JavaCompileJarTests.scala @@ -50,7 +50,7 @@ object JavaCompileJarTests extends TestSuite{ import Build._ val mapping = Discovered.mapping(Build) - def eval[T](t: Task[T]): Either[Result.Failing, (T, Int)] = { + def eval[T](t: Task[T]) = { val evaluator = new Evaluator(workspacePath, mapping, DummyLogger) val evaluated = evaluator.evaluate(OSet(t)) |