From bde3e646ffe1b1ba1b513cac042f5c1e379da4ff Mon Sep 17 00:00:00 2001 From: Elena Vilchik Date: Wed, 27 Jun 2018 13:45:28 +0200 Subject: Make Node configurable (#89) --- .../main/java/org/sonar/css/plugin/CssPlugin.java | 12 +++++++++ .../sonar/css/plugin/StylelintCommandProvider.java | 17 +++++++++++-- .../java/org/sonar/css/plugin/CssPluginTest.java | 11 +++++++- .../css/plugin/StylelintCommandProviderTest.java | 29 ++++++++++++++++++++++ 4 files changed, 66 insertions(+), 3 deletions(-) (limited to 'sonar-css-plugin') diff --git a/sonar-css-plugin/src/main/java/org/sonar/css/plugin/CssPlugin.java b/sonar-css-plugin/src/main/java/org/sonar/css/plugin/CssPlugin.java index c35836f..cd98f25 100644 --- a/sonar-css-plugin/src/main/java/org/sonar/css/plugin/CssPlugin.java +++ b/sonar-css-plugin/src/main/java/org/sonar/css/plugin/CssPlugin.java @@ -33,6 +33,9 @@ public class CssPlugin implements Plugin { public static final String STYLELINT_REPORT_PATHS = "sonar.css.stylelint.reportPaths"; public static final String STYLELINT_REPORT_PATHS_DEFAULT_VALUE = ""; + public static final String NODE_EXECUTABLE = "sonar.css.node"; + public static final String NODE_EXECUTABLE_DEFAULT = "node"; + private static final String CSS_CATEGORY = "CSS"; private static final String LINTER_SUBCATEGORY = "Popular Rule Engines"; private static final String GENERAL_SUBCATEGORY = "General"; @@ -59,6 +62,15 @@ public class CssPlugin implements Plugin { .category(CSS_CATEGORY) .onQualifiers(Qualifiers.PROJECT) .multiValues(true) + .build(), + + PropertyDefinition.builder(NODE_EXECUTABLE) + .defaultValue(NODE_EXECUTABLE_DEFAULT) + .name("Node.js executable") + .description("Node.js executable used to run the analysis of CSS files.") + .subCategory(GENERAL_SUBCATEGORY) + .category(CSS_CATEGORY) + .hidden() .build() ); diff --git a/sonar-css-plugin/src/main/java/org/sonar/css/plugin/StylelintCommandProvider.java b/sonar-css-plugin/src/main/java/org/sonar/css/plugin/StylelintCommandProvider.java index b2f50b5..52fa93f 100644 --- a/sonar-css-plugin/src/main/java/org/sonar/css/plugin/StylelintCommandProvider.java +++ b/sonar-css-plugin/src/main/java/org/sonar/css/plugin/StylelintCommandProvider.java @@ -21,15 +21,19 @@ package org.sonar.css.plugin; import java.io.File; import java.nio.file.Paths; +import java.util.Optional; import org.sonar.api.batch.ScannerSide; import org.sonar.api.batch.sensor.SensorContext; import org.sonar.api.config.Configuration; +import org.sonar.api.utils.log.Logger; +import org.sonar.api.utils.log.Loggers; @ScannerSide public class StylelintCommandProvider implements LinterCommandProvider { + private static final Logger LOG = Loggers.get(StylelintCommandProvider.class); + private static final String CONFIG_PATH = "css-bundle/stylelintconfig.json"; - private static final String NODE_EXECUTABLE = "node"; @Override public String[] commandParts(File deployDestination, SensorContext context) { @@ -55,6 +59,15 @@ public class StylelintCommandProvider implements LinterCommandProvider { @Override public String nodeExecutable(Configuration configuration) { - return NODE_EXECUTABLE; + Optional nodeExecutableOptional = configuration.get(CssPlugin.NODE_EXECUTABLE); + if (nodeExecutableOptional.isPresent()) { + String nodeExecutable = nodeExecutableOptional.get(); + File file = new File(nodeExecutable); + if (file.exists()) { + return nodeExecutable; + } + LOG.warn("Provided node executable file does not exist: " + file); + } + return CssPlugin.NODE_EXECUTABLE_DEFAULT; } } diff --git a/sonar-css-plugin/src/test/java/org/sonar/css/plugin/CssPluginTest.java b/sonar-css-plugin/src/test/java/org/sonar/css/plugin/CssPluginTest.java index c5d9bbd..7dfe16b 100644 --- a/sonar-css-plugin/src/test/java/org/sonar/css/plugin/CssPluginTest.java +++ b/sonar-css-plugin/src/test/java/org/sonar/css/plugin/CssPluginTest.java @@ -36,6 +36,15 @@ public class CssPluginTest { Plugin.Context context = new Plugin.Context(runtime); Plugin underTest = new CssPlugin(); underTest.define(context); - assertThat(context.getExtensions()).hasSize(9); + assertThat(context.getExtensions()).hasSize(10); + } + + @Test + public void count_extensions_7_2() { + SonarRuntime runtime = SonarRuntimeImpl.forSonarQube(Version.create(7, 2), SonarQubeSide.SCANNER); + Plugin.Context context = new Plugin.Context(runtime); + Plugin underTest = new CssPlugin(); + underTest.define(context); + assertThat(context.getExtensions()).hasSize(11); } } diff --git a/sonar-css-plugin/src/test/java/org/sonar/css/plugin/StylelintCommandProviderTest.java b/sonar-css-plugin/src/test/java/org/sonar/css/plugin/StylelintCommandProviderTest.java index 7244cce..3ae3250 100644 --- a/sonar-css-plugin/src/test/java/org/sonar/css/plugin/StylelintCommandProviderTest.java +++ b/sonar-css-plugin/src/test/java/org/sonar/css/plugin/StylelintCommandProviderTest.java @@ -20,13 +20,24 @@ package org.sonar.css.plugin; import java.io.File; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TemporaryFolder; import org.sonar.api.batch.sensor.internal.SensorContextTester; +import org.sonar.api.config.internal.MapSettings; +import org.sonar.api.utils.log.LogTester; +import org.sonar.api.utils.log.LoggerLevel; import static org.assertj.core.api.Assertions.assertThat; public class StylelintCommandProviderTest { + @Rule + public TemporaryFolder temporaryFolder = new TemporaryFolder(); + + @Rule + public final LogTester logTester = new LogTester(); + @Test public void test() throws Exception { StylelintCommandProvider stylelintCommandProvider = new StylelintCommandProvider(); @@ -44,4 +55,22 @@ public class StylelintCommandProviderTest { "json" ); } + + @Test + public void test_node_executable() throws Exception { + StylelintCommandProvider stylelintCommandProvider = new StylelintCommandProvider(); + + MapSettings settings = new MapSettings(); + assertThat(stylelintCommandProvider.nodeExecutable(settings.asConfig())).isEqualTo("node"); + assertThat(logTester.logs(LoggerLevel.WARN)).isEmpty(); + + File customNode = temporaryFolder.newFile("custom-node.exe"); + settings.setProperty(CssPlugin.NODE_EXECUTABLE, customNode.getAbsolutePath()); + assertThat(stylelintCommandProvider.nodeExecutable(settings.asConfig())).isEqualTo(customNode.getAbsolutePath()); + assertThat(logTester.logs(LoggerLevel.WARN)).isEmpty(); + + settings.setProperty(CssPlugin.NODE_EXECUTABLE, "mynode"); + assertThat(stylelintCommandProvider.nodeExecutable(settings.asConfig())).isEqualTo("node"); + assertThat(logTester.logs(LoggerLevel.WARN)).contains("Provided node executable file does not exist: mynode"); + } } -- cgit v1.2.3