This is an automated email from the ASF dual-hosted git repository. zjffdu pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/zeppelin.git
The following commit(s) were added to refs/heads/master by this push: new d0404f3 [ZEPPELIN-4590]. Miss line break for IRInterpreter d0404f3 is described below commit d0404f3484662958e22e7c25ba565b64798be214 Author: Jeff Zhang <zjf...@apache.org> AuthorDate: Sun Feb 2 15:34:34 2020 +0800 [ZEPPELIN-4590]. Miss line break for IRInterpreter ### What is this PR for? In ZEPPELIN-4562, I fix the googlevis issue, but cause the line break missing. In this PR, I will only make html output when it contains javascript related code https://github.com/apache/zeppelin/compare/master...zjffdu:ZEPPELIN-4590?expand=1#diff-ab59c27de9983f5da6d2b847d441fff3R173 ### What type of PR is it? [Bug Fix ] ### Todos * [ ] - Task ### What is the Jira issue? * https://issues.apache.org/jira/browse/ZEPPELIN-4590 ### How should this be tested? Unit test is added ### Screenshots (if appropriate) * Before  * After  ### Questions: * Does the licenses files need update? No * Is there breaking changes for older versions? No * Does this needs documentation? No Author: Jeff Zhang <zjf...@apache.org> Closes #3627 from zjffdu/ZEPPELIN-4590 and squashes the following commits: 52c415a72 [Jeff Zhang] [ZEPPELIN-4590]. Miss line break for IRInterpreter --- .../org/apache/zeppelin/r/RInterpreterTest.java | 18 +++++++++++++-- .../zeppelin/spark/SparkInterpreterTest.java | 18 +++++++-------- .../zeppelin/jupyter/JupyterKernelClient.java | 5 +++++ .../zeppelin/jupyter/JupyterKernelInterpreter.java | 5 ----- .../main/resources/grpc/jupyter/kernel_client.py | 13 ++++++----- .../main/resources/grpc/jupyter/kernel_server.py | 2 ++ .../org/apache/zeppelin/jupyter/IRKernelTest.java | 26 +++++++++++++++++----- 7 files changed, 61 insertions(+), 26 deletions(-) diff --git a/rlang/src/test/java/org/apache/zeppelin/r/RInterpreterTest.java b/rlang/src/test/java/org/apache/zeppelin/r/RInterpreterTest.java index 97b9844..1652858 100644 --- a/rlang/src/test/java/org/apache/zeppelin/r/RInterpreterTest.java +++ b/rlang/src/test/java/org/apache/zeppelin/r/RInterpreterTest.java @@ -30,6 +30,7 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; +import java.io.IOException; import java.util.HashMap; import java.util.Properties; @@ -64,13 +65,26 @@ public class RInterpreterTest { } @Test - public void testSparkRInterpreter() throws InterpreterException, InterruptedException { + public void testSparkRInterpreter() throws InterpreterException, InterruptedException, IOException { InterpreterResult result = rInterpreter.interpret("1+1", getInterpreterContext()); assertEquals(InterpreterResult.Code.SUCCESS, result.code()); assertTrue(result.message().get(0).getData().contains("2")); - // plotting InterpreterContext context = getInterpreterContext(); + result = rInterpreter.interpret("foo <- TRUE\n" + + "print(foo)\n" + + "bare <- c(1, 2.5, 4)\n" + + "print(bare)\n" + + "double <- 15.0\n" + + "print(double)", context); + assertEquals(InterpreterResult.Code.SUCCESS, result.code()); + assertTrue(result.toString(), + result.message().get(0).getData().contains("[1] TRUE\n" + + "[1] 1.0 2.5 4.0\n" + + "[1] 15\n")); + + // plotting + context = getInterpreterContext(); context.getLocalProperties().put("imageWidth", "100"); result = rInterpreter.interpret("hist(mtcars$mpg)", context); assertEquals(InterpreterResult.Code.SUCCESS, result.code()); diff --git a/spark/interpreter/src/test/java/org/apache/zeppelin/spark/SparkInterpreterTest.java b/spark/interpreter/src/test/java/org/apache/zeppelin/spark/SparkInterpreterTest.java index 441af36..a15b046 100644 --- a/spark/interpreter/src/test/java/org/apache/zeppelin/spark/SparkInterpreterTest.java +++ b/spark/interpreter/src/test/java/org/apache/zeppelin/spark/SparkInterpreterTest.java @@ -198,15 +198,6 @@ public class SparkInterpreterTest { ").toDF()", getInterpreterContext()); assertEquals(InterpreterResult.Code.SUCCESS, result.code()); - // create dataset from case class - context = getInterpreterContext(); - result = interpreter.interpret("case class Person(id:Int, name:String, age:Int, country:String)\n" + - "val df2 = spark.createDataFrame(Seq(Person(1, \"andy\", 20, \"USA\"), " + - "Person(2, \"jeff\", 23, \"China\"), Person(3, \"james\", 18, \"USA\")))\n" + - "df2.printSchema\n" + - "df2.show() ", context); - assertEquals(InterpreterResult.Code.SUCCESS, result.code()); - // spark version result = interpreter.interpret("sc.version", getInterpreterContext()); assertEquals(InterpreterResult.Code.SUCCESS, result.code()); @@ -229,6 +220,15 @@ public class SparkInterpreterTest { "| 2|null|\n" + "+---+----+")); } else if (version.contains("String = 2.")) { + // create dataset from case class + context = getInterpreterContext(); + result = interpreter.interpret("case class Person(id:Int, name:String, age:Int, country:String)\n" + + "val df2 = spark.createDataFrame(Seq(Person(1, \"andy\", 20, \"USA\"), " + + "Person(2, \"jeff\", 23, \"China\"), Person(3, \"james\", 18, \"USA\")))\n" + + "df2.printSchema\n" + + "df2.show() ", context); + assertEquals(InterpreterResult.Code.SUCCESS, result.code()); + result = interpreter.interpret("spark", getInterpreterContext()); assertEquals(InterpreterResult.Code.SUCCESS, result.code()); diff --git a/zeppelin-jupyter-interpreter/src/main/java/org/apache/zeppelin/jupyter/JupyterKernelClient.java b/zeppelin-jupyter-interpreter/src/main/java/org/apache/zeppelin/jupyter/JupyterKernelClient.java index 0e0902b..a551d85 100644 --- a/zeppelin-jupyter-interpreter/src/main/java/org/apache/zeppelin/jupyter/JupyterKernelClient.java +++ b/zeppelin-jupyter-interpreter/src/main/java/org/apache/zeppelin/jupyter/JupyterKernelClient.java @@ -168,6 +168,11 @@ public class JupyterKernelClient { curOutput.getType() != InterpreterResult.Type.TEXT) { interpreterOutput.write("%text ".getBytes()); } + // explicitly use html output for ir kernel in some cases. otherwise some + // R packages doesn't work. e.g. googlevis + if (executeResponse.getOutput().contains("<script type=\"text/javascript\">")) { + interpreterOutput.write("\n%html ".getBytes()); + } interpreterOutput.write(executeResponse.getOutput().getBytes()); } interpreterOutput.getInterpreterOutput().flush(); diff --git a/zeppelin-jupyter-interpreter/src/main/java/org/apache/zeppelin/jupyter/JupyterKernelInterpreter.java b/zeppelin-jupyter-interpreter/src/main/java/org/apache/zeppelin/jupyter/JupyterKernelInterpreter.java index d0e9348..d1dc351 100644 --- a/zeppelin-jupyter-interpreter/src/main/java/org/apache/zeppelin/jupyter/JupyterKernelInterpreter.java +++ b/zeppelin-jupyter-interpreter/src/main/java/org/apache/zeppelin/jupyter/JupyterKernelInterpreter.java @@ -245,11 +245,6 @@ public class JupyterKernelInterpreter extends AbstractInterpreter { interpreterOutput.setInterpreterOutput(context.out); jupyterKernelClient.setInterpreterContext(context); try { - // always use html output for ir kernel. otherwise some R packages doesn't work. - // e.g. googlevis - if (getKernelName().equals("ir")) { - context.out.write("%html\n"); - } ExecuteResponse response = jupyterKernelClient.stream_execute(ExecuteRequest.newBuilder().setCode(st).build(), interpreterOutput); diff --git a/zeppelin-jupyter-interpreter/src/main/resources/grpc/jupyter/kernel_client.py b/zeppelin-jupyter-interpreter/src/main/resources/grpc/jupyter/kernel_client.py index ac7b1e0..b9684e9 100644 --- a/zeppelin-jupyter-interpreter/src/main/resources/grpc/jupyter/kernel_client.py +++ b/zeppelin-jupyter-interpreter/src/main/resources/grpc/jupyter/kernel_client.py @@ -23,14 +23,17 @@ import kernel_pb2_grpc def run(): channel = grpc.insecure_channel('localhost:50053') stub = kernel_pb2_grpc.JupyterKernelStub(channel) - response = stub.execute(kernel_pb2.ExecuteRequest(code="import time\nfor i in range(1,4):\n\ttime.sleep(1)\n\tprint(i)\n" + - "%matplotlib inline\nimport matplotlib.pyplot as plt\ndata=[1,1,2,3,4]\nplt.figure()\nplt.plot(data)")) + response = stub.execute(kernel_pb2.ExecuteRequest(code=""" +library(googleVis) +df=data.frame(country=c("US", "GB", "BR"), + val1=c(10,13,14), + val2=c(23,12,32)) +Bar <- gvisBarChart(df) +print(Bar, tag = 'chart') + """)) for r in response: print("output:" + r.output) - response = stub.execute(kernel_pb2.ExecuteRequest(code="range?")) - for r in response: - print(r) if __name__ == '__main__': run() diff --git a/zeppelin-jupyter-interpreter/src/main/resources/grpc/jupyter/kernel_server.py b/zeppelin-jupyter-interpreter/src/main/resources/grpc/jupyter/kernel_server.py index ac11ea3..f2e361d 100644 --- a/zeppelin-jupyter-interpreter/src/main/resources/grpc/jupyter/kernel_server.py +++ b/zeppelin-jupyter-interpreter/src/main/resources/grpc/jupyter/kernel_server.py @@ -59,6 +59,8 @@ class KernelServer(kernel_pb2_grpc.JupyterKernelServicer): def _output_hook(msg): msg_type = msg['header']['msg_type'] content = msg['content'] + # print("******************") + # print(msg) outStatus, outType, output = kernel_pb2.SUCCESS, None, None # prepare the reply if msg_type == 'stream': diff --git a/zeppelin-jupyter-interpreter/src/test/java/org/apache/zeppelin/jupyter/IRKernelTest.java b/zeppelin-jupyter-interpreter/src/test/java/org/apache/zeppelin/jupyter/IRKernelTest.java index 08d7c5a..8be3507 100644 --- a/zeppelin-jupyter-interpreter/src/test/java/org/apache/zeppelin/jupyter/IRKernelTest.java +++ b/zeppelin-jupyter-interpreter/src/test/java/org/apache/zeppelin/jupyter/IRKernelTest.java @@ -87,10 +87,26 @@ public class IRKernelTest { assertEquals(InterpreterResult.Code.ERROR, result.code()); resultMessages = context.out.toInterpreterResultMessage(); assertEquals(1, resultMessages.size()); - assertEquals(result.toString(), InterpreterResult.Type.HTML, resultMessages.get(0).getType()); + assertEquals(result.toString(), InterpreterResult.Type.TEXT, resultMessages.get(0).getType()); assertTrue(resultMessages.toString(), resultMessages.get(0).getData().contains("object 'unknown_var' not found")); + context = getInterpreterContext(); + result = interpreter.interpret("foo <- TRUE\n" + + "print(foo)\n" + + "bare <- c(1, 2.5, 4)\n" + + "print(bare)\n" + + "double <- 15.0\n" + + "print(double)", context); + assertEquals(InterpreterResult.Code.SUCCESS, result.code()); + resultMessages = context.out.toInterpreterResultMessage(); + assertEquals(1, resultMessages.size()); + assertEquals(result.toString(), InterpreterResult.Type.TEXT, resultMessages.get(0).getType()); + assertTrue(resultMessages.toString(), + resultMessages.get(0).getData().contains("[1] TRUE\n" + + "[1] 1.0 2.5 4.0\n" + + "[1] 15\n")); + // plotting context = getInterpreterContext(); result = interpreter.interpret("hist(mtcars$mpg)", context); @@ -122,11 +138,11 @@ public class IRKernelTest { "print(Bar, tag = 'chart')", context); assertEquals(InterpreterResult.Code.SUCCESS, result.code()); resultMessages = context.out.toInterpreterResultMessage(); - assertEquals(1, resultMessages.size()); + assertEquals(2, resultMessages.size()); assertEquals(resultMessages.toString(), - InterpreterResult.Type.HTML, resultMessages.get(0).getType()); - assertTrue(resultMessages.get(0).getData(), - resultMessages.get(0).getData().contains("javascript")); + InterpreterResult.Type.HTML, resultMessages.get(1).getType()); + assertTrue(resultMessages.get(1).getData(), + resultMessages.get(1).getData().contains("javascript")); } }