mirror of
https://github.com/apache/zeppelin
synced 2026-05-24 09:38:26 +00:00
Python: add ERROR paragraph status on Error and Exception in output
This commit is contained in:
parent
4c1107b761
commit
e7d5371748
4 changed files with 99 additions and 15 deletions
|
|
@ -35,6 +35,7 @@
|
|||
|
||||
<properties>
|
||||
<py4j.version>0.9.2</py4j.version>
|
||||
<python.test.exclude>**/PythonInterpreterWithPythonInstalledTest.java</python.test.exclude>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
|
|
@ -67,7 +68,7 @@
|
|||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-log4j12</artifactId>
|
||||
</dependency>
|
||||
|
||||
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
|
|
@ -89,15 +90,25 @@
|
|||
<plugins>
|
||||
<plugin>
|
||||
<artifactId>maven-enforcer-plugin</artifactId>
|
||||
<version>1.3.1</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>enforce</id>
|
||||
<phase>none</phase>
|
||||
<version>1.3.1</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>enforce</id>
|
||||
<phase>none</phase>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<configuration>
|
||||
<excludes>
|
||||
<exclude>${python.test.exclude}</exclude>
|
||||
</excludes>
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
||||
<plugin>
|
||||
<artifactId>maven-dependency-plugin</artifactId>
|
||||
<version>2.8</version>
|
||||
|
|
@ -135,11 +146,12 @@
|
|||
<version>${project.version}</version>
|
||||
<type>${project.packaging}</type>
|
||||
</artifactItem>
|
||||
</artifactItems>
|
||||
</artifactItems>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
|
|
|
|||
|
|
@ -24,6 +24,8 @@ import java.net.ServerSocket;
|
|||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Properties;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import org.apache.zeppelin.display.GUI;
|
||||
import org.apache.zeppelin.interpreter.Interpreter;
|
||||
|
|
@ -34,7 +36,6 @@ import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion;
|
|||
import org.apache.zeppelin.scheduler.Job;
|
||||
import org.apache.zeppelin.scheduler.Scheduler;
|
||||
import org.apache.zeppelin.scheduler.SchedulerFactory;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
|
|
@ -56,6 +57,7 @@ public class PythonInterpreter extends Interpreter {
|
|||
private GatewayServer gatewayServer;
|
||||
private Boolean py4JisInstalled = false;
|
||||
private InterpreterContext context;
|
||||
private Pattern errorInLastLine = Pattern.compile(".*(Error|Exception): .*$");
|
||||
private int maxResult;
|
||||
|
||||
PythonProcess process = null;
|
||||
|
|
@ -124,13 +126,31 @@ public class PythonInterpreter extends Interpreter {
|
|||
|
||||
@Override
|
||||
public InterpreterResult interpret(String cmd, InterpreterContext contextInterpreter) {
|
||||
this.context = contextInterpreter;
|
||||
if (cmd == null || cmd.isEmpty()) {
|
||||
return new InterpreterResult(Code.SUCCESS, "");
|
||||
}
|
||||
this.context = contextInterpreter;
|
||||
String output = sendCommandToPython(cmd);
|
||||
return new InterpreterResult(Code.SUCCESS, output.replaceAll(">>>", "")
|
||||
.replaceAll("\\.\\.\\.", "").trim());
|
||||
|
||||
InterpreterResult result;
|
||||
if (pythonErrorIn(output)) {
|
||||
result = new InterpreterResult(Code.ERROR, output.replaceAll(">>>", "").trim());
|
||||
} else {
|
||||
result = new InterpreterResult(Code.SUCCESS, output.replaceAll(">>>", "")
|
||||
.replaceAll("\\.\\.\\.", "").trim());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if there is a syntax error or an exception
|
||||
*
|
||||
* @param output Python interpreter output
|
||||
* @return true if syntax error or exception has happened
|
||||
*/
|
||||
private boolean pythonErrorIn(String output) {
|
||||
Matcher errorMatcher = errorInLastLine.matcher(output);
|
||||
return errorMatcher.find();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -196,7 +216,7 @@ public class PythonInterpreter extends Interpreter {
|
|||
return output;
|
||||
}
|
||||
|
||||
private void bootStrapInterpreter(String file) throws IOException {
|
||||
void bootStrapInterpreter(String file) throws IOException {
|
||||
BufferedReader bootstrapReader = new BufferedReader(
|
||||
new InputStreamReader(
|
||||
PythonInterpreter.class.getResourceAsStream(file)));
|
||||
|
|
|
|||
|
|
@ -17,7 +17,9 @@
|
|||
|
||||
package org.apache.zeppelin.python;
|
||||
|
||||
import static org.apache.zeppelin.python.PythonInterpreter.*;
|
||||
import static org.apache.zeppelin.python.PythonInterpreter.DEFAULT_ZEPPELIN_PYTHON;
|
||||
import static org.apache.zeppelin.python.PythonInterpreter.MAX_RESULT;
|
||||
import static org.apache.zeppelin.python.PythonInterpreter.ZEPPELIN_PYTHON;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
|
|
@ -45,8 +47,12 @@ import org.mockito.stubbing.Answer;
|
|||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
|
||||
/**
|
||||
* Python interpreter unit test
|
||||
*
|
||||
* Important: ALL tests here DO NOT REQUIRE Python to be installed
|
||||
* If Python dependency is required, please look at PythonInterpreterWithPythonInstalledTest
|
||||
*/
|
||||
public class PythonInterpreterTest {
|
||||
private static final Logger LOG = LoggerFactory.getLogger(PythonProcess.class);
|
||||
|
|
@ -91,7 +97,8 @@ public class PythonInterpreterTest {
|
|||
* If Py4J is not installed, bootstrap_input.py
|
||||
* is not sent to Python process and py4j JavaGateway is not running
|
||||
*/
|
||||
@Test public void testPy4jIsNotInstalled() {
|
||||
@Test
|
||||
public void testPy4jIsNotInstalled() {
|
||||
pythonInterpreter.open();
|
||||
assertNull(pythonInterpreter.getPy4jPort());
|
||||
assertTrue(cmdHistory.contains("def help()"));
|
||||
|
|
@ -108,7 +115,8 @@ public class PythonInterpreterTest {
|
|||
*
|
||||
* @throws IOException
|
||||
*/
|
||||
@Test public void testPy4jInstalled() throws IOException {
|
||||
@Test
|
||||
public void testPy4jInstalled() throws IOException {
|
||||
when(mockPythonProcess.sendAndGetResult(eq("\n\nimport py4j\n"))).thenReturn(">>>");
|
||||
|
||||
pythonInterpreter.open();
|
||||
|
|
|
|||
|
|
@ -0,0 +1,44 @@
|
|||
package org.apache.zeppelin.python;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import org.apache.zeppelin.interpreter.InterpreterResult;
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* Python interpreter unit test that user real Python
|
||||
*
|
||||
* Important: ALL tests here REQUIRE Python to be installed
|
||||
* They are excluded from default build, to run them manually do:
|
||||
*
|
||||
* <code>
|
||||
* mvn "-Dtest=org.apache.zeppelin.python.PythonInterpreterWithPythonInstalledTest" test -pl python
|
||||
* </code>
|
||||
*
|
||||
* or
|
||||
* <code>
|
||||
* mvn -Dpython.test.exclude='' test -pl python
|
||||
* </code>
|
||||
*/
|
||||
public class PythonInterpreterWithPythonInstalledTest {
|
||||
|
||||
@Test
|
||||
public void badSqlSyntaxFails() {
|
||||
//given
|
||||
PythonInterpreter realPython = new PythonInterpreter(
|
||||
PythonInterpreterTest.getPythonTestProperties());
|
||||
realPython.open();
|
||||
|
||||
//when
|
||||
InterpreterResult ret = realPython.interpret("select wrong syntax", null);
|
||||
|
||||
//then
|
||||
assertNotNull("Interpreter returned 'null'", ret);
|
||||
//System.out.println("\nInterpreter response: \n" + ret.message());
|
||||
assertEquals(InterpreterResult.Code.ERROR, ret.code());
|
||||
assertTrue(ret.message().length() > 0);
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Reference in a new issue