From e62662ce47c24298ccbcc66c8368741976498085 Mon Sep 17 00:00:00 2001 From: Ganesh Date: Mon, 25 Apr 2022 18:56:59 +0530 Subject: [PATCH 01/16] cli-profile unit test cases added Signed-off-by: Ganesh Change-Id: I6ab4c36b05fce95e0902c8088ae81e8a4504100e Issue-ID: CLI-443 --- .../onap/cli/fw/cmd/error/OnapCommandFailTest.java | 49 ++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 profiles/command/src/test/java/org/onap/cli/fw/cmd/error/OnapCommandFailTest.java diff --git a/profiles/command/src/test/java/org/onap/cli/fw/cmd/error/OnapCommandFailTest.java b/profiles/command/src/test/java/org/onap/cli/fw/cmd/error/OnapCommandFailTest.java new file mode 100644 index 00000000..700e59b2 --- /dev/null +++ b/profiles/command/src/test/java/org/onap/cli/fw/cmd/error/OnapCommandFailTest.java @@ -0,0 +1,49 @@ +/* + * Copyright 2022 Samsung Electronics + * + * Licensed 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.onap.cli.fw.cmd.error; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class OnapCommandFailTest { + + @Test + public void OnapCommandCmdFailureTest() { + OnapCommandCmdFailure onapCommandCmdFailure = new OnapCommandCmdFailure("Argument value missing"); + assertEquals("0x18001::Argument value missing", onapCommandCmdFailure.getMessage()); + } + + @Test + public void OnapCommandCmdFailureWithCodeTest() { + OnapCommandCmdFailure onapCommandCmdFailure = new OnapCommandCmdFailure("Argument value missing",101); + assertEquals("101::0x18001::Argument value missing", onapCommandCmdFailure.getMessage()); + } + + @Test + public void OnapCommandCmdFailureThrowableTest() { + OnapCommandCmdFailure onapCommandCmdFailure = new OnapCommandCmdFailure(new Exception("Argument value missing")); + assertEquals("0x18001::Argument value missing", onapCommandCmdFailure.getMessage()); + } + + @Test + public void OnapCommandCmdFailureWithCodeThrowableTest() { + OnapCommandCmdFailure onapCommandCmdFailure = new OnapCommandCmdFailure(new Exception("Argument value missing"),101); + assertEquals("101::0x18001::Argument value missing", onapCommandCmdFailure.getMessage()); + } + +} -- 2.16.6 From f59c91da2fa13da3a71e6a0f78d15778142658fa Mon Sep 17 00:00:00 2001 From: Ganesh Date: Tue, 26 Apr 2022 09:36:27 +0530 Subject: [PATCH 02/16] cli-const unit test cases added Signed-off-by: Ganesh Change-Id: I7cb4382b310a753b992c9a86dadccffd668c1d38 Issue-ID: CLI-443 --- .../cli/fw/cmd/conf/OnapCommandConstantsTest.java | 37 ++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 profiles/command/src/test/java/org/onap/cli/fw/cmd/conf/OnapCommandConstantsTest.java diff --git a/profiles/command/src/test/java/org/onap/cli/fw/cmd/conf/OnapCommandConstantsTest.java b/profiles/command/src/test/java/org/onap/cli/fw/cmd/conf/OnapCommandConstantsTest.java new file mode 100644 index 00000000..2c05eb81 --- /dev/null +++ b/profiles/command/src/test/java/org/onap/cli/fw/cmd/conf/OnapCommandConstantsTest.java @@ -0,0 +1,37 @@ +/* + * Copyright 2022 Samsung Electronics + * + * Licensed 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.onap.cli.fw.cmd.conf; + +import org.junit.Test; + +import static org.junit.Assert.assertTrue; + +public class OnapCommandConstantsTest { + @Test + public void test() { + assertTrue("cmd" == OnapCommandCmdConstants.CMD && "command" == OnapCommandCmdConstants.COMMAND + && "environment".equals(OnapCommandCmdConstants.ENVIRONMENT) + && "working_directory".equals(OnapCommandCmdConstants.WD) + && "result_map".equals(OnapCommandCmdConstants.RESULT_MAP) + && "output".equals(OnapCommandCmdConstants.OUTPUT) + && "error".equals(OnapCommandCmdConstants.ERROR) + && "success_codes".equals(OnapCommandCmdConstants.SUCCESS_EXIT_CODE) + && "pass_codes".equals(OnapCommandCmdConstants.PASS_CODE) + && "timeout".equals(OnapCommandCmdConstants.TIMEOUT) + ); + } +} -- 2.16.6 From f3bea1cd0fd251b1d8b4bfde0ec8d88a486df9de Mon Sep 17 00:00:00 2001 From: "abhishek.c92" Date: Thu, 28 Apr 2022 17:57:41 +0530 Subject: [PATCH 03/16] Sonar violation fixes for Parameterized tests and Lambda Expressions Violations : Parameterized tests for OnapCommandprintTest Use lambda expression for OnapCommandSchemaCmdLoader Refactor method in OnapCli Signed-off-by: abhishek.c92 Issue-ID: CLI-446 Change-Id: I8e8337d2b5993983d8ea105b2d1882952a3783a3 --- .../cli/fw/output/print/OnapCommandPrintTest.java | 60 ++++++++++--------- main/src/main/java/org/onap/cli/main/OnapCli.java | 68 ++++++++++++---------- .../robot/schema/OnapCommandSchemaRobotLoader.java | 2 +- 3 files changed, 70 insertions(+), 60 deletions(-) diff --git a/framework/src/test/java/org/onap/cli/fw/output/print/OnapCommandPrintTest.java b/framework/src/test/java/org/onap/cli/fw/output/print/OnapCommandPrintTest.java index ff728a33..0dfcdfb1 100644 --- a/framework/src/test/java/org/onap/cli/fw/output/print/OnapCommandPrintTest.java +++ b/framework/src/test/java/org/onap/cli/fw/output/print/OnapCommandPrintTest.java @@ -20,57 +20,63 @@ import static org.junit.Assert.assertEquals; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import org.junit.Ignore; import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; import org.onap.cli.fw.error.OnapCommandOutputPrintingFailed; import org.onap.cli.fw.output.OnapCommandPrintDirection; +@RunWith(Parameterized.class) public class OnapCommandPrintTest { + private String expected; + private String colValue1; + private String colValue2; - @Test - @Ignore - public void printCsvTest() throws OnapCommandOutputPrintingFailed { //NOSONAR - OnapCommandPrint pr = new OnapCommandPrint(); - pr.setDirection(OnapCommandPrintDirection.LANDSCAPE); - pr.setPrintTitle(true); - pr.addColumn("name1", new ArrayList(Arrays.asList(new String[] { "value1" }))); - String exp = "name1\r\n"; - String result = pr.printCsv(); - assertEquals(exp, result); - } - @Test - public void printTableTest() throws OnapCommandOutputPrintingFailed { - OnapCommandPrint pr = new OnapCommandPrint(); + public OnapCommandPrintTest(String expected, String colValue1, String colValue2) { + this.expected = expected; + this.colValue1 = colValue1; + this.colValue2 = colValue2; + } - pr.setDirection(OnapCommandPrintDirection.LANDSCAPE); - pr.setPrintTitle(true); - pr.addColumn("name2", new ArrayList(Arrays.asList(new String[] { "value2" }))); - String exp = "+--------+\n|name2 |\n+--------+\n|value2 |\n+--------+\n"; - String result = pr.printTable(true); - assertEquals(exp, result); + @Parameterized.Parameters + public static Collection testUtilParams() { + return Arrays.asList(new Object[][]{ {"+--------+\n|name2 |\n+--------+\n|value2 |\n+--------+\n", "name2", "value2"}, + {"+--------+\n|name2 |\n+--------+\n|value2 |\n+--------+\n", "name2", "value2"}, + {"+--------+\n|name2 |\n+--------+\n| |\n+--------+\n", "name2", ""} }); } + + /** + * Tests involved: + * 1. printTableTest + * 2. printTableNullColumnHeaderTest + * 3. printTableEmptyColumnValuesTest + * @throws OnapCommandOutputPrintingFailed + */ @Test - public void printTableNullColumnHeaderTest() throws OnapCommandOutputPrintingFailed { + public void printableTests() throws OnapCommandOutputPrintingFailed { OnapCommandPrint pr = new OnapCommandPrint(); pr.setDirection(OnapCommandPrintDirection.LANDSCAPE); pr.setPrintTitle(true); - pr.addColumn("name2", new ArrayList(Arrays.asList(new String[] { "value2" }))); - String exp = "+--------+\n|name2 |\n+--------+\n|value2 |\n+--------+\n"; + pr.addColumn(this.colValue1, new ArrayList(Arrays.asList(new String[] { this.colValue2 }))); + String exp = this.expected; String result = pr.printTable(true); assertEquals(exp, result); } @Test - public void printTableEmptyColumnValuesTest() throws OnapCommandOutputPrintingFailed { + @Ignore + public void printCsvTest() throws OnapCommandOutputPrintingFailed { //NOSONAR OnapCommandPrint pr = new OnapCommandPrint(); pr.setDirection(OnapCommandPrintDirection.LANDSCAPE); pr.setPrintTitle(true); - pr.addColumn("name2", new ArrayList(Arrays.asList(new String[] { "" }))); - String exp = "+--------+\n|name2 |\n+--------+\n| |\n+--------+\n"; - String result = pr.printTable(true); + pr.addColumn("name1", new ArrayList(Arrays.asList(new String[] { "value1" }))); + String exp = "name1\r\n"; + String result = pr.printCsv(); assertEquals(exp, result); } } diff --git a/main/src/main/java/org/onap/cli/main/OnapCli.java b/main/src/main/java/org/onap/cli/main/OnapCli.java index 08ef640f..6d6e4ff3 100644 --- a/main/src/main/java/org/onap/cli/main/OnapCli.java +++ b/main/src/main/java/org/onap/cli/main/OnapCli.java @@ -241,38 +241,7 @@ public class OnapCli { public void handleBatchCommand() { try { //NOSONAR if (this.paramFile != null) { - //Read YAML and loop thru it - // one - // - param-long-option-1: value - // - param-long-option-1: value - // - positional-arg1 - // - positional-arg2 - // two - // - param-long-option-1: value - // - param-long-option-1: value - // - positional-arg1 - // - positional-arg2 - try { - Map values = OnapCommandDiscoveryUtils.loadYaml(this.paramFile); - - for (Entry cmdsParam: values.entrySet()) { - for (Object param: (List)cmdsParam.getValue()) { - if (param instanceof Map) { //optional args - Map paramMap = (Map) param; - String paramName = paramMap.keySet().iterator().next(); - Object paramValue = paramMap.get(paramName); - argsParamFile.add(this.getLongOption(paramName)); - argsParamFile.add(paramValue.toString()); - } else { //positional args - argsParamFile.add(param.toString()); - } - } - } - - } catch (Exception e) { // NOSONAR - this.print("Failed to read param file " + this.paramFile); - this.print(e); - } + handleBatchCommandUtil(); } } catch (Exception e) { this.print(e); @@ -280,6 +249,41 @@ public class OnapCli { } } + private void handleBatchCommandUtil() { + //Read YAML and loop thru it + // one + // - param-long-option-1: value + // - param-long-option-1: value + // - positional-arg1 + // - positional-arg2 + // two + // - param-long-option-1: value + // - param-long-option-1: value + // - positional-arg1 + // - positional-arg2 + try { + Map values = OnapCommandDiscoveryUtils.loadYaml(this.paramFile); + + for (Entry cmdsParam: values.entrySet()) { + for (Object param: (List)cmdsParam.getValue()) { + if (param instanceof Map) { //optional args + Map paramMap = (Map) param; + String paramName = paramMap.keySet().iterator().next(); + Object paramValue = paramMap.get(paramName); + argsParamFile.add(this.getLongOption(paramName)); + argsParamFile.add(paramValue.toString()); + } else { //positional args + argsParamFile.add(param.toString()); + } + } + } + + } catch (Exception e) { // NOSONAR + this.print("Failed to read param file " + this.paramFile); + this.print(e); + } + } + public void verifyCommand(OnapCommand cmd) throws OnapCommandException { OnapCliArgsParser.populateParams(cmd.getParameters(), args); diff --git a/profiles/robot/src/main/java/org/onap/cli/fw/robot/schema/OnapCommandSchemaRobotLoader.java b/profiles/robot/src/main/java/org/onap/cli/fw/robot/schema/OnapCommandSchemaRobotLoader.java index 3b75b504..b8e934cd 100644 --- a/profiles/robot/src/main/java/org/onap/cli/fw/robot/schema/OnapCommandSchemaRobotLoader.java +++ b/profiles/robot/src/main/java/org/onap/cli/fw/robot/schema/OnapCommandSchemaRobotLoader.java @@ -92,7 +92,7 @@ public class OnapCommandSchemaRobotLoader { case OnapCommandCmdConstants.SUCCESS_EXIT_CODE: List list = (ArrayList) valMap.get(key1); - robot.setSuccessStatusCodes(list.stream().map(s -> Integer.parseInt(s)).collect(Collectors.toList())); + robot.setSuccessStatusCodes(list.stream().map(Integer::parseInt).collect(Collectors.toList())); break; case OnapCommandCmdConstants.PASS_CODE: -- 2.16.6 From a29bbb15bfb09341b1929e87c1ac7bce72f01e4c Mon Sep 17 00:00:00 2001 From: Ganesh Date: Tue, 26 Apr 2022 13:07:03 +0530 Subject: [PATCH 04/16] cli-profile code smell removal Signed-off-by: Ganesh Change-Id: I77b42348416ff90fe72ee1f033a9912bd8cbf37d Issue-ID: CLI-444 --- .../org/onap/cli/fw/http/utils/OnapCommandUtilsTest.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/profiles/http/src/test/java/org/onap/cli/fw/http/utils/OnapCommandUtilsTest.java b/profiles/http/src/test/java/org/onap/cli/fw/http/utils/OnapCommandUtilsTest.java index 89504fb7..17df7f6b 100644 --- a/profiles/http/src/test/java/org/onap/cli/fw/http/utils/OnapCommandUtilsTest.java +++ b/profiles/http/src/test/java/org/onap/cli/fw/http/utils/OnapCommandUtilsTest.java @@ -17,7 +17,6 @@ package org.onap.cli.fw.http.utils; - import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -104,7 +103,7 @@ public class OnapCommandUtilsTest { assertEquals(9, map.size()); } - @Test(expected = OnapCommandHttpHeaderNotFound.class) + @Test public void populateOutputsTest() throws OnapCommandException { HttpResult output = new HttpResult(); output.setBody( @@ -135,11 +134,14 @@ public class OnapCommandUtilsTest { + "Missing property in path $['{$']", e.getMessage()); } - output.setBody("{}"); - input1 = OnapCommandHttpUtils.populateOutputs(params, output); - params.put("head", "$h{head2}"); - output.setBody("{\"test\"}"); - input1 = OnapCommandHttpUtils.populateOutputs(params, output); + try { + output.setBody("{}"); + input1 = OnapCommandHttpUtils.populateOutputs(params, output); + params.put("head", "$h{head2}"); + output.setBody("{\"test\"}"); + input1 = OnapCommandHttpUtils.populateOutputs(params, output); + }catch (OnapCommandHttpHeaderNotFound e) {} + } @Test -- 2.16.6 From 56943fcc3c3c22005590756ffb262c8e830e8951 Mon Sep 17 00:00:00 2001 From: Ganesh Date: Thu, 28 Apr 2022 15:42:26 +0530 Subject: [PATCH 05/16] cli-command unit test cases added Signed-off-by: Ganesh Change-Id: I6095b147b1bc44f6c0be07ec5a6b9fb8418f538c Issue-ID: CLI-443 --- .../cli/fw/cmd/cmd/OpenCommandShellCmdTest.java | 51 ++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 profiles/command/src/test/java/org/onap/cli/fw/cmd/cmd/OpenCommandShellCmdTest.java diff --git a/profiles/command/src/test/java/org/onap/cli/fw/cmd/cmd/OpenCommandShellCmdTest.java b/profiles/command/src/test/java/org/onap/cli/fw/cmd/cmd/OpenCommandShellCmdTest.java new file mode 100644 index 00000000..bd7bcdce --- /dev/null +++ b/profiles/command/src/test/java/org/onap/cli/fw/cmd/cmd/OpenCommandShellCmdTest.java @@ -0,0 +1,51 @@ +/* + * Copyright 2022 Samsung Electronics + * + * Licensed 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.onap.cli.fw.cmd.cmd; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.*; + +public class OpenCommandShellCmdTest { + List command = new ArrayList<>(); + Map envVariable = new HashMap(); + Map resultMap = new IdentityHashMap<>(); + + @Test + public void setCmdTest() { + OpenCommandShellCmd cmdShell = new OpenCommandShellCmd(); + command.add("test"); + cmdShell.setCommand(command); + Assert.assertEquals("test", cmdShell.getCommand().get(0)); + } + + @Test + public void setCmdEnvVariable() { + OpenCommandShellCmd cmdShell = new OpenCommandShellCmd(); + envVariable.put("variableOne","test"); + cmdShell.setEnvs(envVariable); + Assert.assertEquals("test", cmdShell.getEnvs().get("variableOne")); + } + + @Test + public void setCmdError() { + OpenCommandShellCmd cmdShell = new OpenCommandShellCmd(); + cmdShell.setError("Timeout"); + Assert.assertEquals("Timeout", cmdShell.getError()); + } +} -- 2.16.6 From e22ad3c1435467e0089f421b915849291f8a3a03 Mon Sep 17 00:00:00 2001 From: Ganesh Date: Tue, 17 May 2022 19:32:22 +0530 Subject: [PATCH 06/16] sonar-smell add logic to this catch clause Signed-off-by: Ganesh Change-Id: I00e014fda8015c9f5d308d3443cd601cf59863f2 Issue-ID: CLI-444 --- .../http/src/main/java/org/onap/cli/fw/http/cmd/OnapHttpCommand.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/profiles/http/src/main/java/org/onap/cli/fw/http/cmd/OnapHttpCommand.java b/profiles/http/src/main/java/org/onap/cli/fw/http/cmd/OnapHttpCommand.java index b4654cc8..d18090b1 100644 --- a/profiles/http/src/main/java/org/onap/cli/fw/http/cmd/OnapHttpCommand.java +++ b/profiles/http/src/main/java/org/onap/cli/fw/http/cmd/OnapHttpCommand.java @@ -218,7 +218,7 @@ public class OnapHttpCommand extends OnapCommand { if (isAuthRequired) { this.authClient.logout(); } - } catch (OnapCommandException e) { + } catch (OnapCommandException e) { //NOSONAR throw e; } finally { this.getResult().setDebugInfo(this.input.toString() + "\n" + this.output.toString()); @@ -262,7 +262,7 @@ public class OnapHttpCommand extends OnapCommand { try{ generateJsonMock(this.getInput(), output, this.getSchemaName()); } catch (OnapCommandFailedMocoGenerate e) { - //NO SONAR ignore it + //NOSONAR ignore it } } -- 2.16.6 From 2c2863863335986fcd9c29d053c4393032a403d9 Mon Sep 17 00:00:00 2001 From: Ganesh Date: Tue, 17 May 2022 20:02:58 +0530 Subject: [PATCH 07/16] CliProfileCmd unit test cases added Signed-off-by: Ganesh Change-Id: I20ff8508e2c70cfaf735b7d120159599295f2698 Issue-ID: CLI-444 --- .../cli/fw/cmd/cmd/OpenCommandShellCmdTest.java | 128 +++++++++++++-------- 1 file changed, 77 insertions(+), 51 deletions(-) diff --git a/profiles/command/src/test/java/org/onap/cli/fw/cmd/cmd/OpenCommandShellCmdTest.java b/profiles/command/src/test/java/org/onap/cli/fw/cmd/cmd/OpenCommandShellCmdTest.java index bd7bcdce..04d24403 100644 --- a/profiles/command/src/test/java/org/onap/cli/fw/cmd/cmd/OpenCommandShellCmdTest.java +++ b/profiles/command/src/test/java/org/onap/cli/fw/cmd/cmd/OpenCommandShellCmdTest.java @@ -1,51 +1,77 @@ -/* - * Copyright 2022 Samsung Electronics - * - * Licensed 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.onap.cli.fw.cmd.cmd; - -import org.junit.Assert; -import org.junit.Test; - -import java.util.*; - -public class OpenCommandShellCmdTest { - List command = new ArrayList<>(); - Map envVariable = new HashMap(); - Map resultMap = new IdentityHashMap<>(); - - @Test - public void setCmdTest() { - OpenCommandShellCmd cmdShell = new OpenCommandShellCmd(); - command.add("test"); - cmdShell.setCommand(command); - Assert.assertEquals("test", cmdShell.getCommand().get(0)); - } - - @Test - public void setCmdEnvVariable() { - OpenCommandShellCmd cmdShell = new OpenCommandShellCmd(); - envVariable.put("variableOne","test"); - cmdShell.setEnvs(envVariable); - Assert.assertEquals("test", cmdShell.getEnvs().get("variableOne")); - } - - @Test - public void setCmdError() { - OpenCommandShellCmd cmdShell = new OpenCommandShellCmd(); - cmdShell.setError("Timeout"); - Assert.assertEquals("Timeout", cmdShell.getError()); - } -} +/* + * Copyright 2022 Samsung Electronics + * + * Licensed 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.onap.cli.fw.cmd.cmd; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.*; + +public class OpenCommandShellCmdTest { + List command = new ArrayList<>(); + Map envVariable = new HashMap(); + Map resultMap = new IdentityHashMap<>(); + + @Test + public void setCmdTest() { + OpenCommandShellCmd cmdShell = new OpenCommandShellCmd(); + command.add("test"); + cmdShell.setCommand(command); + Assert.assertEquals("test", cmdShell.getCommand().get(0)); + } + + @Test + public void setCmdEnvVariableTest() { + OpenCommandShellCmd cmdShell = new OpenCommandShellCmd(); + envVariable.put("variableOne","test"); + cmdShell.setEnvs(envVariable); + Assert.assertEquals("test", cmdShell.getEnvs().get("variableOne")); + } + + @Test + public void setCmdErrorTest() { + OpenCommandShellCmd cmdShell = new OpenCommandShellCmd(); + cmdShell.setError("Timeout"); + Assert.assertEquals("Timeout", cmdShell.getError()); + } + + @Test + public void setResultMapTest() { + OpenCommandShellCmd cmdShell = new OpenCommandShellCmd(); + Map resultMap = new HashMap<>(); + resultMap.put("var1","text1"); + cmdShell.setResultMap(resultMap); + Assert.assertEquals("text1", cmdShell.getResultMap().get("var1")); + } + + @Test + public void setCmdOutputTest() { + OpenCommandShellCmd cmdShell = new OpenCommandShellCmd(); + cmdShell.setOutput("Timeout"); + Assert.assertEquals("Timeout", cmdShell.getOutput()); + } + + @Test + public void setPassCodesTest() { + OpenCommandShellCmd cmdShell = new OpenCommandShellCmd(); + List resultMap = new ArrayList(); + resultMap.add(200); + cmdShell.setPassCodes(resultMap); + Assert.assertEquals(Optional.ofNullable(200), Optional.ofNullable(cmdShell.getPassCodes().get(0))); + } +} + -- 2.16.6 From 014c795415e9d29e9b4790c90fc6f4183c559ed4 Mon Sep 17 00:00:00 2001 From: sharath reddy Date: Tue, 14 Jun 2022 15:39:40 +0530 Subject: [PATCH 08/16] Release notes update Issue-ID: CLI-454 Signed-off-by: sharath reddy Change-Id: Id3896303d52a411668e6f11215fc85278aec9296 --- docs/release-notes.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/release-notes.rst b/docs/release-notes.rst index bb319cff..19c04786 100644 --- a/docs/release-notes.rst +++ b/docs/release-notes.rst @@ -5,6 +5,13 @@ CLI Release Notes ================= +Version: 10.0.0 (Jakarta) +-------------------------- + +:Release Date: 2022-06-09 + +no updates in this release + Version: 6.0.1 -------------- -- 2.16.6 From aaaf2801945c81f8822f748a3bcefc21e24d3aaf Mon Sep 17 00:00:00 2001 From: Ganesh Date: Mon, 27 Jun 2022 08:46:38 +0530 Subject: [PATCH 09/16] sonar issue, Replace these 3 tests with a single Parameterized one Signed-off-by: Ganesh Change-Id: I3868ba6b54e2412de99580d19165cff448937465 Issue-ID: CLI-444 --- .../cli/fw/output/print/TableGeneratorTest.java | 23 +++++----------------- 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/framework/src/test/java/org/onap/cli/fw/output/print/TableGeneratorTest.java b/framework/src/test/java/org/onap/cli/fw/output/print/TableGeneratorTest.java index 58ff4751..7622ff5f 100644 --- a/framework/src/test/java/org/onap/cli/fw/output/print/TableGeneratorTest.java +++ b/framework/src/test/java/org/onap/cli/fw/output/print/TableGeneratorTest.java @@ -54,32 +54,19 @@ public class TableGeneratorTest { System.out.println(result); String expected = "+----------+----------+\n|column1 |column2 |\n+----------+----------+\n"; assertEquals(expected, result); - } - - @Test - public void printTableNullCellTest() { - System.out.println("printTableNullCellTest..."); - List> rows = new ArrayList>(); - rows.add(Arrays.asList(new Object[] { "column1", "column2" })); rows.add(Arrays.asList(new Object[] { "value1", null })); - String result = table.generateTable(rows, true); + result = table.generateTable(rows, true); System.out.println(result); - String expected = "+----------+----------+\n" + "|column1 |column2 |\n" + "+----------+----------+\n" + expected = "+----------+----------+\n" + "|column1 |column2 |\n" + "+----------+----------+\n" + "|value1 | |\n" + "+----------+----------+\n"; assertEquals(expected, result); - } - - @Test - public void printTableEmptyCellTest() { - System.out.println("printTableEmptyCellTest..."); - List> rows = new ArrayList>(); - rows.add(Arrays.asList(new Object[] { "column1", "column2" })); rows.add(Arrays.asList(new Object[] { "value1", "" })); - String result = table.generateTable(rows, true); + result = table.generateTable(rows, true); System.out.println(result); - String expected = "+----------+----------+\n" + "|column1 |column2 |\n" + "+----------+----------+\n" + expected = "+----------+----------+\n" + "|column1 |column2 |\n" + "+----------+----------+\n" + + "|value1 | |\n" + "+----------+----------+\n" + "|value1 | |\n" + "+----------+----------+\n"; assertEquals(expected, result); } -- 2.16.6 From d4482ed550d32c237ba92410d72aa85ad3338b9f Mon Sep 17 00:00:00 2001 From: Ganesh Date: Fri, 1 Jul 2022 18:43:23 +0530 Subject: [PATCH 10/16] ValidateSchemaTest sonar issue, Replace these 3 tests with a single Parameterized one Signed-off-by: Ganesh Change-Id: I7f65fcecea7ac6ba574f2cb9bd128a200fbae4e1 Issue-ID: CLI-444 --- .../org/onap/cli/fw/schema/ValidateSchemaTest.java | 29 ++++++---------------- 1 file changed, 7 insertions(+), 22 deletions(-) diff --git a/framework/src/test/java/org/onap/cli/fw/schema/ValidateSchemaTest.java b/framework/src/test/java/org/onap/cli/fw/schema/ValidateSchemaTest.java index 00c311fc..5c83342a 100644 --- a/framework/src/test/java/org/onap/cli/fw/schema/ValidateSchemaTest.java +++ b/framework/src/test/java/org/onap/cli/fw/schema/ValidateSchemaTest.java @@ -35,15 +35,18 @@ public class ValidateSchemaTest { @Test(expected = OnapCommandInvalidSchema.class) public void invalidateTest1() throws OnapCommandException { - OnapCommand cmd = new OnapCommand() { @Override protected void run() throws OnapCommandException {} }; - OnapCommandSchemaLoader.loadSchema(cmd, "fdsfds.yaml", true, true); + try { + OnapCommandSchemaLoader.loadSchema(cmd, "fdsfds", true, true); + } catch(Exception e) { + assertEquals(e.getClass(), OnapCommandInvalidSchema.class); + } + OnapCommandSchemaLoader.loadSchema(cmd, "schema-invalid-file.yaml", true, true); } - @Test public void validateTestMerge() throws OnapCommandException { @@ -56,15 +59,6 @@ public class ValidateSchemaTest { @Test(expected = OnapCommandInvalidSchema.class) public void invalidateTest2() throws OnapCommandException { - OnapCommand cmd = new OnapCommand() { - @Override - protected void run() throws OnapCommandException {} - }; - OnapCommandSchemaLoader.loadSchema(cmd, "fdsfds", true, true); - } - - @Test(expected = OnapCommandInvalidSchema.class) - public void invalidateTest4() throws OnapCommandException { OnapCommand cmd = new OnapCommand() { @Override protected void run() throws OnapCommandException {} @@ -75,7 +69,7 @@ public class ValidateSchemaTest { } @Test(expected = OnapCommandInvalidSchema.class) - public void invalidateTest5() throws OnapCommandException { + public void invalidateTest3() throws OnapCommandException { OnapCommand cmd = new OnapCommand() { @Override protected void run() throws OnapCommandException {} @@ -95,15 +89,6 @@ public class ValidateSchemaTest { assertTrue(list.isEmpty()); } - @Test(expected = OnapCommandInvalidSchema.class) - public void invalidateTest3() throws OnapCommandException { - OnapCommand cmd = new OnapCommand() { - @Override - protected void run() throws OnapCommandException {} - }; - OnapCommandSchemaLoader.loadSchema(cmd, "schema-invalid-file.yaml", true, true); - } - @Test public void validateTest() throws OnapCommandException { -- 2.16.6 From e6ca493363684bd12a4f8647acb3d0092b465a6c Mon Sep 17 00:00:00 2001 From: =?utf8?q?C=C3=A9dric=20Ollivier?= Date: Wed, 31 Aug 2022 21:15:31 +0200 Subject: [PATCH 11/16] Force py3.8 in tox.ini MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit It allows leveraging on OpenStack Yoga's upper-contraints without any exception. Issue-ID: DOC-782 Signed-off-by: Cédric Ollivier Change-Id: I16b83f41df2fb8f990106820feeb33cc762123b1 --- docs/tox.ini | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/tox.ini b/docs/tox.ini index 42ffa687..49bbe010 100644 --- a/docs/tox.ini +++ b/docs/tox.ini @@ -4,10 +4,10 @@ envlist = docs, skipsdist = true [testenv:docs] -basepython = python3 +basepython = python3.8 deps = -r{toxinidir}/requirements-docs.txt - -chttps://git.onap.org/doc/plain/etc/upper-constraints.os.txt + -chttps://raw.githubusercontent.com/openstack/requirements/stable/yoga/upper-constraints.txt -chttps://git.onap.org/doc/plain/etc/upper-constraints.onap.txt commands = sphinx-build -b html -n -d {envtmpdir}/doctrees ./ {toxinidir}/_build/html @@ -18,7 +18,7 @@ whitelist_externals = sh [testenv:docs-linkcheck] -basepython = python3 +basepython = python3.8 #deps = -r{toxinidir}/requirements-docs.txt commands = echo "Link Checking not enforced" #commands = sphinx-build -b linkcheck -d {envtmpdir}/doctrees ./ {toxinidir}/_build/linkcheck -- 2.16.6 From dfb5fe51322bd0631b2837fc03ccaa62c6ca6322 Mon Sep 17 00:00:00 2001 From: xudan16 Date: Mon, 10 Oct 2022 15:16:49 +0800 Subject: [PATCH 12/16] Change CLI PTL to be Dan Xu Signed-off-by: xudan16 Issue-ID: CLI-474 Change-Id: I3818b179ca9ec9ceff8ca3891452c5e9a6cc4f8a --- INFO.yaml | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/INFO.yaml b/INFO.yaml index 137203dc..16eeb907 100644 --- a/INFO.yaml +++ b/INFO.yaml @@ -3,13 +3,13 @@ project: 'cli' project_creation_date: '2017-06-22' lifecycle_state: 'Incubation' project_category: '' -project_lead: &onap_releng_ptl - name: 'Kanagaraj Manickam' - email: 'kanagaraj.manickam@huawei.com' - id: 'mkr1481' +project_lead: &onap_cli_ptl + name: 'Dan Xu' + email: 'xudan16@huawei.com' + id: 'xudan' company: 'Huawei' - timezone: 'India/Bangalore' -primary_contact: *onap_releng_ptl + timezone: 'Asia/Shanghai' +primary_contact: *onap_cli_ptl issue_tracking: type: 'jira' url: 'https://jira.onap.org/projects/CLI' @@ -30,6 +30,16 @@ meetings: repositories: - 'cli' committers: - - <<: *onap_releng_ptl + - <<: *onap_cli_ptl + - name: 'Kanagaraj Manickam' + email: 'kanagaraj.manickam@huawei.com' + id: 'mkr1481' + company: 'Huawei' + timezone: 'India/Bangalore' tsc: approval: 'https://lists.onap.org/pipermail/onap-tsc' + changes: + - type: 'Addition' + name: 'Dan Xu' + # new PTL + link: 'https://wiki.onap.org/display/Meetings/TSC+2022-09-01' -- 2.16.6 From 2ec53e1cba9c16cf939798d7fa956d2c13fd341f Mon Sep 17 00:00:00 2001 From: marineMD Date: Wed, 16 Nov 2022 11:26:18 +0100 Subject: [PATCH 13/16] Fix DOC config files Issue-ID: DOC-798 Signed-off-by: marineMD Change-Id: I1c7774f7c6a880c0c0291d7266269cf13474d3cf --- .gitreview | 1 + docs/_static/css/ribbon.css | 125 +++++++++++++++++++++++--------------------- docs/conf.py | 51 ++++++++++++++++-- docs/conf.yaml | 7 --- docs/requirements-docs.txt | 6 ++- docs/tox.ini | 9 ++++ 6 files changed, 125 insertions(+), 74 deletions(-) delete mode 100644 docs/conf.yaml diff --git a/.gitreview b/.gitreview index 7033a4aa..2b845481 100644 --- a/.gitreview +++ b/.gitreview @@ -2,3 +2,4 @@ host=gerrit.onap.org port=29418 project=cli.git +defaultbranch=master \ No newline at end of file diff --git a/docs/_static/css/ribbon.css b/docs/_static/css/ribbon.css index 6008cb1a..0e624fc9 100644 --- a/docs/_static/css/ribbon.css +++ b/docs/_static/css/ribbon.css @@ -1,63 +1,66 @@ .ribbon { - z-index: 1000; - background-color: #a00; - overflow: hidden; - white-space: nowrap; - position: fixed; - top: 25px; - right: -50px; - -webkit-transform: rotate(45deg); - -moz-transform: rotate(45deg); - -ms-transform: rotate(45deg); - -o-transform: rotate(45deg); - transform: rotate(45deg); - -webkit-box-shadow: 0 0 10px #888; - -moz-box-shadow: 0 0 10px #888; - box-shadow: 0 0 10px #888; - -} - -.ribbon a { - border: 1px solid #faa; - color: #fff; - display: block; - font: bold 81.25% 'Helvetica Neue', Helvetica, Arial, sans-serif; - margin: 1px 0; - padding: 10px 50px; - text-align: center; - text-decoration: none; - text-shadow: 0 0 5px #444; - transition: 0.5s; -} - -.ribbon a:hover { - background: #c11; - color: #fff; -} - - -/* override table width restrictions */ -@media screen and (min-width: 767px) { - - .wy-table-responsive table td, .wy-table-responsive table th { - /* !important prevents the common CSS stylesheets from overriding - this as on RTD they are loaded after this stylesheet */ - white-space: normal !important; - } - - .wy-table-responsive { - overflow: visible !important; - } -} - -@media screen and (max-width: 767px) { - .wy-table-responsive table td { - white-space: nowrap; + z-index: 1000; + background-color: #a00; + overflow: hidden; + white-space: nowrap; + position: fixed; + top: 25px; + right: -50px; + -webkit-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -ms-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); + -webkit-box-shadow: 0 0 10px #888; + -moz-box-shadow: 0 0 10px #888; + box-shadow: 0 0 10px #888; + + } + + .ribbon a { + border: 1px solid #faa; + color: #fff; + display: block; + font: bold 81.25% 'Helvetica Neue', Helvetica, Arial, sans-serif; + margin: 1px 0; + padding: 10px 50px; + text-align: center; + text-decoration: none; + text-shadow: 0 0 5px #444; + transition: 0.5s; + } + + .ribbon a:hover { + background: #c11; + color: #fff; + } + + + /* override table width restrictions */ + @media screen and (min-width: 767px) { + + .wy-table-responsive table td, .wy-table-responsive table th { + /* !important prevents the common CSS stylesheets from overriding + this as on RTD they are loaded after this stylesheet */ + white-space: normal !important; } -} - -/* fix width of the screen */ - -.wy-nav-content { - max-width: none; -} + + .wy-table-responsive { + overflow: visible !important; + } + } + + @media screen and (max-width: 767px) { + .wy-table-responsive table td { + white-space: nowrap; + } + } + + /* fix width of the screen */ + + .wy-nav-content { + max-width: 800px; + } + + + \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py index d211470a..70937d74 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -1,15 +1,56 @@ -from docs_conf.conf import * +project = "onap" +release = "master" +version = "master" -branch = 'latest' -master_doc = 'index' +author = "Open Network Automation Platform" +# yamllint disable-line rule:line-length +copyright = "ONAP. Licensed under Creative Commons Attribution 4.0 International License" -linkcheck_ignore = [ - 'http://localhost', +pygments_style = "sphinx" +html_theme = "sphinx_rtd_theme" +html_theme_options = { + "style_nav_header_background": "white", + "sticky_navigation": "False" } +html_logo = "_static/logo_onap_2017.png" +html_favicon = "_static/favicon.ico" +html_static_path = ["_static"] +html_show_sphinx = False + +extensions = [ + 'sphinx.ext.intersphinx', + 'sphinx.ext.graphviz', + 'sphinxcontrib.blockdiag', + 'sphinxcontrib.seqdiag', + 'sphinxcontrib.swaggerdoc', + 'sphinxcontrib.plantuml' ] +# +# Map to 'latest' if this file is used in 'latest' (master) 'doc' branch. +# Change to {releasename} after you have created the new 'doc' branch. +# + +branch = 'latest' + intersphinx_mapping = {} +doc_url = 'https://docs.onap.org/projects' +master_doc = 'index' + +exclude_patterns = ['.tox'] + +spelling_word_list_filename='spelling_wordlist.txt' +spelling_lang = "en_GB" + +# +# Example: +# intersphinx_mapping['onap-aai-aai-common'] = ('{}/onap-aai-aai-common/en/%s'.format(doc_url) % branch, None) +# html_last_updated_fmt = '%d-%b-%y %H:%M' def setup(app): app.add_css_file("css/ribbon.css") + +linkcheck_ignore = [ + r'http://localhost:\d+/' +] \ No newline at end of file diff --git a/docs/conf.yaml b/docs/conf.yaml deleted file mode 100644 index ab592813..00000000 --- a/docs/conf.yaml +++ /dev/null @@ -1,7 +0,0 @@ ---- -project_cfg: onap -project: onap - -# Change this to ReleaseBranchName to modify the header -default-version: latest -# diff --git a/docs/requirements-docs.txt b/docs/requirements-docs.txt index 3b3441a8..71df2ab0 100644 --- a/docs/requirements-docs.txt +++ b/docs/requirements-docs.txt @@ -1,3 +1,7 @@ -lfdocs-conf sphinx>=4.2.0 # BSD sphinx-rtd-theme>=1.0.0 # MIT +sphinxcontrib-blockdiag # BSD +sphinxcontrib-seqdiag # BSD +sphinxcontrib-swaggerdoc +sphinxcontrib-spelling +sphinxcontrib-plantuml diff --git a/docs/tox.ini b/docs/tox.ini index 49bbe010..4bbc6403 100644 --- a/docs/tox.ini +++ b/docs/tox.ini @@ -23,3 +23,12 @@ basepython = python3.8 commands = echo "Link Checking not enforced" #commands = sphinx-build -b linkcheck -d {envtmpdir}/doctrees ./ {toxinidir}/_build/linkcheck whitelist_externals = echo + +[testenv:docs-spellcheck] +basepython = python3.8 +deps = + -r{toxinidir}/requirements-docs.txt + -chttps://raw.githubusercontent.com/openstack/requirements/stable/yoga/upper-constraints.txt + -chttps://git.onap.org/doc/plain/etc/upper-constraints.onap.txt?h=master +commands = + sphinx-build -W -q -b spelling -d {envtmpdir}/doctrees {toxinidir} {toxinidir}/_build/spellcheck -- 2.16.6 From 9fae20075b2ad8dceed5995af2e83d8cc78f4666 Mon Sep 17 00:00:00 2001 From: =?utf8?q?C=C3=A9dric=20Ollivier?= Date: Mon, 26 Jun 2023 14:30:04 +0200 Subject: [PATCH 14/16] Set Python and Ubuntu versions in .readthedocs.yaml MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit It now follows the ONAP gate configurations. It also fixes the settings and formats it. Issue-ID: DOC-811 Signed-off-by: Cédric Ollivier Change-Id: I88e43b3defcbb5e35b3911a7a7f7b225a7d66e48 --- .readthedocs.yaml | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 3797dc8b..f56b3b71 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -3,18 +3,16 @@ # Read the Docs configuration file # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details # Required -version: 2 - -formats: - - htmlzip +version: 2 build: - image: latest + os: ubuntu-20.04 + tools: + python: "3.8" python: - version: 3.7 install: - - requirements: docs/requirements-docs.txt + - requirements: docs/requirements-docs.txt sphinx: configuration: docs/conf.py -- 2.16.6 From 09ff8eeb3386061c888cea33a58f52a49ada3fd3 Mon Sep 17 00:00:00 2001 From: thmsdt Date: Tue, 20 Feb 2024 14:01:09 +0100 Subject: [PATCH 15/16] add python compatibility module Issue-ID: DOC-823 Change-Id: I8c4f268de3a84a354a4e75b30e5360c772106346 Signed-off-by: thmsdt --- docs/requirements-docs.txt | 1 + docs/tox.ini | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/requirements-docs.txt b/docs/requirements-docs.txt index 71df2ab0..097282b9 100644 --- a/docs/requirements-docs.txt +++ b/docs/requirements-docs.txt @@ -5,3 +5,4 @@ sphinxcontrib-seqdiag # BSD sphinxcontrib-swaggerdoc sphinxcontrib-spelling sphinxcontrib-plantuml +six diff --git a/docs/tox.ini b/docs/tox.ini index 4bbc6403..343a4d2a 100644 --- a/docs/tox.ini +++ b/docs/tox.ini @@ -12,8 +12,8 @@ deps = commands = sphinx-build -b html -n -d {envtmpdir}/doctrees ./ {toxinidir}/_build/html echo "Generated docs available in {toxinidir}/_build/html" +allowlist_externals = echo whitelist_externals = - echo git sh @@ -22,7 +22,7 @@ basepython = python3.8 #deps = -r{toxinidir}/requirements-docs.txt commands = echo "Link Checking not enforced" #commands = sphinx-build -b linkcheck -d {envtmpdir}/doctrees ./ {toxinidir}/_build/linkcheck -whitelist_externals = echo +allowlist_externals = echo [testenv:docs-spellcheck] basepython = python3.8 -- 2.16.6 From 292fe38f0237a2ebebd46ae4f5b96beda460e346 Mon Sep 17 00:00:00 2001 From: thmsdt Date: Tue, 27 Feb 2024 10:44:30 +0100 Subject: [PATCH 16/16] update link to upper-constraints.txt Issue-ID: DOC-823 Change-Id: I5a583471327aed62c595dacb5ad6c43fe8356a93 Signed-off-by: thmsdt --- docs/tox.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/tox.ini b/docs/tox.ini index 343a4d2a..e3772632 100644 --- a/docs/tox.ini +++ b/docs/tox.ini @@ -7,7 +7,7 @@ skipsdist = true basepython = python3.8 deps = -r{toxinidir}/requirements-docs.txt - -chttps://raw.githubusercontent.com/openstack/requirements/stable/yoga/upper-constraints.txt + -chttps://releases.openstack.org/constraints/upper/yoga -chttps://git.onap.org/doc/plain/etc/upper-constraints.onap.txt commands = sphinx-build -b html -n -d {envtmpdir}/doctrees ./ {toxinidir}/_build/html @@ -28,7 +28,7 @@ allowlist_externals = echo basepython = python3.8 deps = -r{toxinidir}/requirements-docs.txt - -chttps://raw.githubusercontent.com/openstack/requirements/stable/yoga/upper-constraints.txt + -chttps://releases.openstack.org/constraints/upper/yoga -chttps://git.onap.org/doc/plain/etc/upper-constraints.onap.txt?h=master commands = sphinx-build -W -q -b spelling -d {envtmpdir}/doctrees {toxinidir} {toxinidir}/_build/spellcheck -- 2.16.6