From 084abd39c94872cf64ee3143229b9a70f2d35311 Mon Sep 17 00:00:00 2001 From: Jeff Zhang Date: Fri, 22 Jun 2018 14:37:17 +0800 Subject: [PATCH] ZEPPELIN-2528. Add a password text input to the ZeppelinContext --- .travis.yml | 2 +- .../img/screenshots/form_password.png | Bin 0 -> 29067 bytes .../img/screenshots/form_password_prog.png | Bin 0 -> 34717 bytes docs/usage/dynamic_form/intro.md | 30 +++++++++++++++ .../main/resources/python/zeppelin_context.py | 3 ++ .../python/BasePythonInterpreterTest.java | 11 ++++++ .../spark/NewSparkInterpreterTest.java | 9 +++++ .../java/org/apache/zeppelin/display/GUI.java | 6 +++ .../org/apache/zeppelin/display/Input.java | 4 ++ .../apache/zeppelin/display/ui/Password.java | 36 ++++++++++++++++++ .../interpreter/BaseZeppelinContext.java | 14 +++++++ .../apache/zeppelin/display/InputTest.java | 20 +++++----- .../rest/ZeppelinSparkClusterTest.java | 32 +++++++++------- .../dynamic-forms.directive.html | 19 +++++++++ 14 files changed, 162 insertions(+), 24 deletions(-) create mode 100644 docs/assets/themes/zeppelin/img/screenshots/form_password.png create mode 100644 docs/assets/themes/zeppelin/img/screenshots/form_password_prog.png create mode 100644 zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/ui/Password.java diff --git a/.travis.yml b/.travis.yml index 1227876e155..7c1098705fb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -73,7 +73,7 @@ matrix: dist: trusty addons: firefox: "31.0" - env: BUILD_PLUGINS="true" CI="true" PYTHON="2" SCALA_VER="2.10" SPARK_VER="1.6.3" HADOOP_VER="2.6" PROFILE="-Pspark-1.6 -Phadoop2 -Phelium-dev -Pexamples -Pintegration -Pscala-2.10" BUILD_FLAG="install -DskipTests -DskipRat" TEST_FLAG="verify -DskipRat" TEST_PROJECTS="-pl .,zeppelin-integration -DfailIfNoTests=false" + env: BUILD_PLUGINS="true" CI="true" PYTHON="2" SCALA_VER="2.10" SPARK_VER="1.6.3" HADOOP_VER="2.6" PROFILE="-Pspark-1.6 -Phadoop2 -Phelium-dev -Pexamples -Pintegration -Pscala-2.10" BUILD_FLAG="install -DskipTests -DskipRat -pl ${INTERPRETERS}" TEST_FLAG="verify -DskipRat" TEST_PROJECTS="-pl zeppelin-integration -DfailIfNoTests=false" # Test interpreter modules - jdk: "oraclejdk8" diff --git a/docs/assets/themes/zeppelin/img/screenshots/form_password.png b/docs/assets/themes/zeppelin/img/screenshots/form_password.png new file mode 100644 index 0000000000000000000000000000000000000000..5b4eb723303268a454083e963da6779af70c35d9 GIT binary patch literal 29067 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 z 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 +### Password form + +To create password form, use `${password:formName}` templates. + +for example + + + + ### Select form To create select form, use `${formName=defaultValue,option1|option2...}` @@ -134,6 +143,27 @@ print("Hello "+z.textbox("name", "sun")) +### Password form +
+
+ +{% highlight scala %} +%spark +print("Password is "+ z.password("my_password")) +{% endhighlight %} + +
+
+ +{% highlight python %} +%pyspark +print("Password is "+ z.password("my_password")) +{% endhighlight %} + +
+
+ + ### Select form
diff --git a/python/src/main/resources/python/zeppelin_context.py b/python/src/main/resources/python/zeppelin_context.py index d29a16f43ac..dc97c141c15 100644 --- a/python/src/main/resources/python/zeppelin_context.py +++ b/python/src/main/resources/python/zeppelin_context.py @@ -70,6 +70,9 @@ def input(self, name, defaultValue=""): def textbox(self, name, defaultValue=""): return self.z.textbox(name, defaultValue) + def password(self, name): + return self.z.password(name) + def noteTextbox(self, name, defaultValue=""): return self.z.noteTextbox(name, defaultValue) diff --git a/python/src/test/java/org/apache/zeppelin/python/BasePythonInterpreterTest.java b/python/src/test/java/org/apache/zeppelin/python/BasePythonInterpreterTest.java index 9697fbf0d55..25cb25330a1 100644 --- a/python/src/test/java/org/apache/zeppelin/python/BasePythonInterpreterTest.java +++ b/python/src/test/java/org/apache/zeppelin/python/BasePythonInterpreterTest.java @@ -18,6 +18,7 @@ package org.apache.zeppelin.python; import org.apache.zeppelin.display.ui.CheckBox; +import org.apache.zeppelin.display.ui.Password; import org.apache.zeppelin.display.ui.Select; import org.apache.zeppelin.display.ui.TextBox; import org.apache.zeppelin.interpreter.Interpreter; @@ -240,6 +241,16 @@ public void testZeppelinContext() throws InterpreterException, InterruptedExcept assertEquals("text_1", textbox.getName()); assertEquals("value_1", textbox.getDefaultValue()); + // Password + context = getInterpreterContext(); + result = + interpreter.interpret("z.password(name='pwd_1')", context); + Thread.sleep(100); + assertEquals(InterpreterResult.Code.SUCCESS, result.code()); + assertTrue(context.getGui().getForms().get("pwd_1") instanceof Password); + Password password = (Password) context.getGui().getForms().get("pwd_1"); + assertEquals("pwd_1", password.getName()); + // Select context = getInterpreterContext(); result = interpreter.interpret("z.select(name='select_1'," + diff --git a/spark/interpreter/src/test/java/org/apache/zeppelin/spark/NewSparkInterpreterTest.java b/spark/interpreter/src/test/java/org/apache/zeppelin/spark/NewSparkInterpreterTest.java index 65b739d477f..73bd52c6133 100644 --- a/spark/interpreter/src/test/java/org/apache/zeppelin/spark/NewSparkInterpreterTest.java +++ b/spark/interpreter/src/test/java/org/apache/zeppelin/spark/NewSparkInterpreterTest.java @@ -20,6 +20,7 @@ import com.google.common.io.Files; import org.apache.zeppelin.display.AngularObjectRegistry; import org.apache.zeppelin.display.ui.CheckBox; +import org.apache.zeppelin.display.ui.Password; import org.apache.zeppelin.display.ui.Select; import org.apache.zeppelin.display.ui.TextBox; import org.apache.zeppelin.interpreter.Interpreter; @@ -215,6 +216,14 @@ public void testSparkInterpreter() throws IOException, InterruptedException, Int assertEquals("name", textBox.getName()); assertEquals("default_name", textBox.getDefaultValue()); + context = getInterpreterContext(); + result = interpreter.interpret("z.password(\"pwd\")", context); + assertEquals(InterpreterResult.Code.SUCCESS, result.code()); + assertEquals(1, context.getGui().getForms().size()); + assertTrue(context.getGui().getForms().get("pwd") instanceof Password); + Password pwd = (Password) context.getGui().getForms().get("pwd"); + assertEquals("pwd", pwd.getName()); + context = getInterpreterContext(); result = interpreter.interpret("z.checkbox(\"checkbox_1\", Seq(\"value_2\"), Seq((\"value_1\", \"name_1\"), (\"value_2\", \"name_2\")))", context); assertEquals(InterpreterResult.Code.SUCCESS, result.code()); diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/GUI.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/GUI.java index 5657c58ba34..048ee813217 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/GUI.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/GUI.java @@ -21,6 +21,7 @@ import com.google.gson.GsonBuilder; import org.apache.zeppelin.display.ui.CheckBox; import org.apache.zeppelin.display.ui.OptionInput.ParamOption; +import org.apache.zeppelin.display.ui.Password; import org.apache.zeppelin.display.ui.Select; import org.apache.zeppelin.display.ui.TextBox; @@ -90,6 +91,11 @@ public Object textbox(String id) { return textbox(id, ""); } + public Object password(String id) { + forms.put(id, new Password(id)); + return params.get(id); + } + public Object select(String id, Object defaultValue, ParamOption[] options) { if (defaultValue == null && options != null && options.length > 0) { defaultValue = options[0].getValue(); diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/Input.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/Input.java index 51e27d29151..40878a8a8e9 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/Input.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/Input.java @@ -21,6 +21,7 @@ import org.apache.zeppelin.display.ui.CheckBox; import org.apache.zeppelin.display.ui.OptionInput; import org.apache.zeppelin.display.ui.OptionInput.ParamOption; +import org.apache.zeppelin.display.ui.Password; import org.apache.zeppelin.display.ui.Select; import org.apache.zeppelin.display.ui.TextBox; @@ -49,6 +50,7 @@ public class Input implements Serializable { .registerSubtype(TextBox.class, "TextBox") .registerSubtype(Select.class, "Select") .registerSubtype(CheckBox.class, "CheckBox") + .registerSubtype(Password.class, "Password") .registerSubtype(OldInput.OldTextBox.class, "input") .registerSubtype(OldInput.OldSelect.class, "select") .registerSubtype(OldInput.OldCheckBox.class, "checkbox") @@ -282,6 +284,8 @@ private static Input getInputForm(Matcher match) { } } else if (type.equals("checkbox")) { input = new CheckBox(varName, (Object[]) defaultValue, paramOptions); + } else if (type.equals("password")) { + input = new Password(varName); } else { throw new RuntimeException("Could not recognize dynamic form with type: " + type); } diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/ui/Password.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/ui/Password.java new file mode 100644 index 00000000000..e3fd62417bd --- /dev/null +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/ui/Password.java @@ -0,0 +1,36 @@ +/* + * 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.display.ui; + +import org.apache.zeppelin.display.Input; + +public class Password extends Input { + + public Password() { + + } + + public Password(String name) { + this.name = name; + this.displayName = name; + this.defaultValue = ""; + } + +} + diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/BaseZeppelinContext.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/BaseZeppelinContext.java index dba9471774e..04f6c70414a 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/BaseZeppelinContext.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/BaseZeppelinContext.java @@ -102,6 +102,20 @@ public Object textbox(String name, String defaultValue) { return textbox(name, defaultValue, false); } + @ZeppelinApi + public Object password(String name) { + return password(name, false); + } + + @ZeppelinApi + public Object password(String name, boolean noteForm) { + if (noteForm) { + return noteGui.password(name); + } else { + return gui.password(name); + } + } + @ZeppelinApi public Collection checkbox(String name, ParamOption[] options) { return checkbox(name, options, false); diff --git a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/display/InputTest.java b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/display/InputTest.java index a9252b96443..abe2ac3b038 100644 --- a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/display/InputTest.java +++ b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/display/InputTest.java @@ -19,10 +19,9 @@ import org.apache.zeppelin.display.ui.CheckBox; import org.apache.zeppelin.display.ui.OptionInput.ParamOption; +import org.apache.zeppelin.display.ui.Password; import org.apache.zeppelin.display.ui.Select; import org.apache.zeppelin.display.ui.TextBox; -import org.junit.After; -import org.junit.Before; import org.junit.Test; import java.util.HashMap; @@ -35,14 +34,6 @@ public class InputTest { - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - @Test public void testFormExtraction() { // textbox form @@ -61,12 +52,21 @@ public void testFormExtraction() { form = forms.get("input_form"); assertEquals("xxx", form.defaultValue); assertTrue(form instanceof TextBox); + assertEquals("Input Form", form.getDisplayName()); + + // password form with display name + script = "${password:my_pwd(My Password)}"; + forms = Input.extractSimpleQueryForm(script, false); + form = forms.get("my_pwd"); + assertTrue(form instanceof Password); + assertEquals("My Password", form.getDisplayName()); // selection form script = "${select_form(Selection Form)=op1,op1|op2(Option 2)|op3}"; form = Input.extractSimpleQueryForm(script, false).get("select_form"); assertEquals("select_form", form.name); assertEquals("op1", form.defaultValue); + assertEquals("Selection Form", form.getDisplayName()); assertTrue(form instanceof Select); assertArrayEquals(new ParamOption[]{ new ParamOption("op1", null), diff --git a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinSparkClusterTest.java b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinSparkClusterTest.java index edfbc650f0c..fdb41a48b84 100644 --- a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinSparkClusterTest.java +++ b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinSparkClusterTest.java @@ -499,6 +499,7 @@ public void testSparkZeppelinContextDynamicForms() throws IOException { Note note = ZeppelinServer.notebook.createNote(anonymous); Paragraph p = note.addNewParagraph(anonymous); String code = "%spark.spark println(z.textbox(\"my_input\", \"default_name\"))\n" + + "println(z.password(\"my_pwd\"))\n" + "println(z.select(\"my_select\", \"1\"," + "Seq((\"1\", \"select_1\"), (\"2\", \"select_2\"))))\n" + "val items=z.checkbox(\"my_checkbox\", Seq(\"2\"), " + @@ -510,17 +511,19 @@ public void testSparkZeppelinContextDynamicForms() throws IOException { assertEquals(Status.FINISHED, p.getStatus()); Iterator formIter = p.settings.getForms().keySet().iterator(); - assert (formIter.next().equals("my_input")); - assert (formIter.next().equals("my_select")); - assert (formIter.next().equals("my_checkbox")); + assertEquals("my_input", formIter.next()); + assertEquals("my_pwd", formIter.next()); + assertEquals("my_select", formIter.next()); + assertEquals("my_checkbox", formIter.next()); // check dynamic forms values String[] result = p.getResult().message().get(0).getData().split("\n"); - assertEquals(4, result.length); + assertEquals(5, result.length); assertEquals("default_name", result[0]); - assertEquals("1", result[1]); - assertEquals("items: Seq[Object] = Buffer(2)", result[2]); - assertEquals("2", result[3]); + assertEquals("null", result[1]); + assertEquals("1", result[2]); + assertEquals("items: Seq[Object] = Buffer(2)", result[3]); + assertEquals("2", result[4]); } @Test @@ -528,6 +531,7 @@ public void testPySparkZeppelinContextDynamicForms() throws IOException { Note note = ZeppelinServer.notebook.createNote(anonymous); Paragraph p = note.addNewParagraph(anonymous); String code = "%spark.pyspark print(z.input('my_input', 'default_name'))\n" + + "print(z.password('my_pwd'))\n" + "print(z.select('my_select', " + "[('1', 'select_1'), ('2', 'select_2')], defaultValue='1'))\n" + "items=z.checkbox('my_checkbox', " + @@ -538,16 +542,18 @@ public void testPySparkZeppelinContextDynamicForms() throws IOException { assertEquals(Status.FINISHED, p.getStatus()); Iterator formIter = p.settings.getForms().keySet().iterator(); - assert (formIter.next().equals("my_input")); - assert (formIter.next().equals("my_select")); - assert (formIter.next().equals("my_checkbox")); + assertEquals("my_input", formIter.next()); + assertEquals("my_pwd", formIter.next()); + assertEquals("my_select", formIter.next()); + assertEquals("my_checkbox", formIter.next()); // check dynamic forms values String[] result = p.getResult().message().get(0).getData().split("\n"); - assertEquals(3, result.length); + assertEquals(4, result.length); assertEquals("default_name", result[0]); - assertEquals("1", result[1]); - assertEquals("2", result[2]); + assertEquals("None", result[1]); + assertEquals("1", result[2]); + assertEquals("2", result[3]); } @Test diff --git a/zeppelin-web/src/app/notebook/dynamic-forms/dynamic-forms.directive.html b/zeppelin-web/src/app/notebook/dynamic-forms/dynamic-forms.directive.html index f9f602834a2..e73f9f89a3a 100644 --- a/zeppelin-web/src/app/notebook/dynamic-forms/dynamic-forms.directive.html +++ b/zeppelin-web/src/app/notebook/dynamic-forms/dynamic-forms.directive.html @@ -41,6 +41,25 @@ ng-class="{'disable': disable}" name="{{formulaire.name}}" /> +
+ +
+
+ +