diff --git a/.github/workflows/core.yml b/.github/workflows/core.yml index 8d4ae1e3cb6..4b5e9b6f78a 100644 --- a/.github/workflows/core.yml +++ b/.github/workflows/core.yml @@ -138,6 +138,7 @@ jobs: matrix: python: [ 3.9 ] java: [ 11 ] + r: [ 3.6, 4.0 ] steps: - name: Checkout uses: actions/checkout@v4 @@ -159,11 +160,11 @@ jobs: key: ${{ runner.os }}-zeppelin-${{ hashFiles('**/pom.xml') }} restore-keys: | ${{ runner.os }}-zeppelin- - - name: Setup conda environment with python ${{ matrix.python }} and R + - name: Setup conda environment with python ${{ matrix.python }} and R ${{ matrix.r }} uses: conda-incubator/setup-miniconda@v3 with: activate-environment: python_3_with_R - environment-file: testing/env_python_${{ matrix.python }}_with_R.yml + environment-file: testing/env_python_${{ matrix.python }}_with_R_${{ matrix.r }}.yml python-version: ${{ matrix.python }} channels: conda-forge,defaults channel-priority: strict @@ -175,9 +176,13 @@ jobs: - name: install environment run: | ./mvnw install -DskipTests -pl python,rlang,zeppelin-jupyter-interpreter -am ${MAVEN_ARGS} - - name: run tests with ${{ matrix.python }} + - name: run tests with Python ${{ matrix.python }} and R ${{ matrix.r }} run: | - ./mvnw test -pl python,rlang,zeppelin-jupyter-interpreter -DfailIfNoTests=false ${MAVEN_ARGS} + if [ "${{ matrix.r }}" = "3.6" ]; then + ./mvnw test -pl python,rlang,zeppelin-jupyter-interpreter -Dtest=IRInterpreterTest36,RInterpreterTest,ShinyInterpreterTest -DfailIfNoTests=false ${MAVEN_ARGS} + else + ./mvnw test -pl python,rlang,zeppelin-jupyter-interpreter -Dtest=IRInterpreterTest,RInterpreterTest,ShinyInterpreterTest -DfailIfNoTests=false ${MAVEN_ARGS} + fi # zeppelin integration test except Spark & Flink zeppelin-integration-test: diff --git a/rlang/src/test/java/org/apache/zeppelin/r/IRInterpreterTest.java b/rlang/src/test/java/org/apache/zeppelin/r/IRInterpreterTest.java index 76cf96d0e32..2fd7221299a 100644 --- a/rlang/src/test/java/org/apache/zeppelin/r/IRInterpreterTest.java +++ b/rlang/src/test/java/org/apache/zeppelin/r/IRInterpreterTest.java @@ -58,7 +58,8 @@ public void testZShow() throws InterpreterException, IOException { InterpreterResult result = interpreter.interpret( "df=data.frame(country=c(\"US\", \"GB\", \"BR\"),\n" + "val1=c(10,13,14),\n" + - "val2=c(23,12,32))", context); + "val2=c(23,12,32),\n" + + "stringsAsFactors = FALSE)", context); assertEquals(InterpreterResult.Code.SUCCESS, result.code()); context = getInterpreterContext(); @@ -69,9 +70,9 @@ public void testZShow() throws InterpreterException, IOException { assertEquals(InterpreterResult.Type.TABLE, resultMessages.get(0).getType(), resultMessages.toString()); assertEquals("country\tval1\tval2\n" + - "3\t10\t23\n" + - "2\t13\t12\n" + - "1\t14\t32\n", + "US\t10\t23\n" + + "GB\t13\t12\n" + + "BR\t14\t32\n", resultMessages.get(0).getData()); context = getInterpreterContext(); @@ -81,7 +82,7 @@ public void testZShow() throws InterpreterException, IOException { assertEquals(2, resultMessages.size()); assertEquals(InterpreterResult.Type.TABLE, resultMessages.get(0).getType(), resultMessages.toString()); assertEquals("country\tval1\tval2\n" + - "3\t10\t23\n", + "US\t10\t23\n", resultMessages.get(0).getData()); assertEquals(InterpreterResult.Type.HTML, resultMessages.get(1).getType(), resultMessages.toString()); diff --git a/rlang/src/test/java/org/apache/zeppelin/r/IRInterpreterTest36.java b/rlang/src/test/java/org/apache/zeppelin/r/IRInterpreterTest36.java new file mode 100644 index 00000000000..0fbb9b0adc1 --- /dev/null +++ b/rlang/src/test/java/org/apache/zeppelin/r/IRInterpreterTest36.java @@ -0,0 +1,90 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.zeppelin.r; + +import org.apache.zeppelin.interpreter.Interpreter; +import org.apache.zeppelin.interpreter.InterpreterContext; +import org.apache.zeppelin.interpreter.InterpreterException; +import org.apache.zeppelin.interpreter.InterpreterOutput; +import org.apache.zeppelin.interpreter.InterpreterResult; +import org.apache.zeppelin.interpreter.InterpreterResultMessage; +import org.apache.zeppelin.jupyter.IRKernelTest; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Properties; + +public class IRInterpreterTest36 extends IRKernelTest { + + @Override + protected Interpreter createInterpreter(Properties properties) { + return new IRInterpreter(properties); + } + + @Override + protected InterpreterContext getInterpreterContext() { + InterpreterContext context = InterpreterContext.builder() + .setNoteId("note_1") + .setParagraphId("paragraph_1") + .setInterpreterOut(new InterpreterOutput()) + .setLocalProperties(new HashMap<>()) + .build(); + return context; + } + + @Test + public void testZShow() throws InterpreterException, IOException { + InterpreterContext context = getInterpreterContext(); + InterpreterResult result = interpreter.interpret( + "df=data.frame(country=c(\"US\", \"GB\", \"BR\"),\n" + + "val1=c(10,13,14),\n" + + "val2=c(23,12,32))", context); + assertEquals(InterpreterResult.Code.SUCCESS, result.code()); + + context = getInterpreterContext(); + result = interpreter.interpret("z.show(df)", context); + assertEquals(InterpreterResult.Code.SUCCESS, result.code()); + List resultMessages = context.out.toInterpreterResultMessage(); + assertEquals(1, resultMessages.size()); + assertEquals(InterpreterResult.Type.TABLE, resultMessages.get(0).getType(), + resultMessages.toString()); + assertEquals("country\tval1\tval2\n" + + "3\t10\t23\n" + + "2\t13\t12\n" + + "1\t14\t32\n", + resultMessages.get(0).getData()); + + context = getInterpreterContext(); + result = interpreter.interpret("z.show(df, maxRows=1)", context); + assertEquals(InterpreterResult.Code.SUCCESS, result.code()); + resultMessages = context.out.toInterpreterResultMessage(); + assertEquals(2, resultMessages.size()); + assertEquals(InterpreterResult.Type.TABLE, resultMessages.get(0).getType(), resultMessages.toString()); + assertEquals("country\tval1\tval2\n" + + "3\t10\t23\n", + resultMessages.get(0).getData()); + assertEquals(InterpreterResult.Type.HTML, resultMessages.get(1).getType(), + resultMessages.toString()); + assertEquals("Results are limited by 1 rows.\n", + resultMessages.get(1).getData()); + } +} \ No newline at end of file diff --git a/testing/env_python_3.9_with_R_3.6.yml b/testing/env_python_3.9_with_R_3.6.yml new file mode 100644 index 00000000000..67a61373da2 --- /dev/null +++ b/testing/env_python_3.9_with_R_3.6.yml @@ -0,0 +1,37 @@ +name: python_3_with_R +channels: + - conda-forge + - defaults +dependencies: + - pycodestyle + - scipy + - numpy=1.19.5 + - grpcio + - protobuf + - pandasql + - sqlalchemy=1.4.46 + - ipython + - ipython_genutils + - ipykernel + - jupyter_client=5 + - hvplot + - holoviews=1.16 + - plotnine + - seaborn + - intake + - intake-parquet + - intake-xarray + - altair + - vega_datasets + - plotly + - jinja2=3.0.3 + - pip + - r-base=3.6 + - r-data.table + - r-evaluate + - r-base64enc + - r-knitr + - r-ggplot2 + - r-irkernel + - r-shiny + - r-googlevis diff --git a/testing/env_python_3.9_with_R_4.yml b/testing/env_python_3.9_with_R_4.yml new file mode 100644 index 00000000000..15dffc6b39d --- /dev/null +++ b/testing/env_python_3.9_with_R_4.yml @@ -0,0 +1,37 @@ +name: python_3_with_R +channels: + - conda-forge + - defaults +dependencies: + - pycodestyle + - scipy + - numpy=1.19.5 + - grpcio + - protobuf + - pandasql + - sqlalchemy=1.4.46 + - ipython + - ipython_genutils + - ipykernel + - jupyter_client=5 + - hvplot + - holoviews=1.16 + - plotnine + - seaborn + - intake + - intake-parquet + - intake-xarray + - altair + - vega_datasets + - plotly + - jinja2=3.0.3 + - pip + - r-base=4.0 + - r-data.table + - r-evaluate + - r-base64enc + - r-knitr + - r-ggplot2 + - r-irkernel + - r-shiny + - r-googlevis