aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--its/plugin/projects/issues-project/src/file1.css3
-rw-r--r--its/plugin/projects/issues-project/src/file2.less3
-rw-r--r--its/plugin/projects/issues-project/src/file3.scss3
-rw-r--r--sonar-css-plugin/src/main/java/org/sonar/css/plugin/CssRules.java4
-rw-r--r--sonar-css-plugin/src/main/java/org/sonar/css/plugin/rules/CssRule.java3
-rw-r--r--sonar-css-plugin/src/main/java/org/sonar/css/plugin/rules/DeclarationBlockNoDuplicateProperties.java12
-rw-r--r--sonar-css-plugin/src/test/java/org/sonar/css/plugin/CssRuleSensorTest.java20
7 files changed, 33 insertions, 15 deletions
diff --git a/its/plugin/projects/issues-project/src/file1.css b/its/plugin/projects/issues-project/src/file1.css
index cac30a7..f98d608 100644
--- a/its/plugin/projects/issues-project/src/file1.css
+++ b/its/plugin/projects/issues-project/src/file1.css
@@ -19,7 +19,8 @@ a:unknown { /* S4659 | selecto
content: "first
second"; /* S4652 | string-no-newline */
color: pink;
- color: orange; /* S4656 | declaration-block-no-duplicate-properties */
+ color: pink; /* S4656 | declaration-block-no-duplicate-properties */
+ color: orange; /* S4656 | declaration-block-no-duplicate-properties | Not raised because property has a different value */
font: 1em/1.3 Times; /* S4649 | font-family-no-missing-generic-family-keyword */
font-family: serif, serif; /* S4648 | font-family-no-duplicate-names */
heigth: 100%; /* S4654 | property-no-unknown */
diff --git a/its/plugin/projects/issues-project/src/file2.less b/its/plugin/projects/issues-project/src/file2.less
index f1214ba..3501772 100644
--- a/its/plugin/projects/issues-project/src/file2.less
+++ b/its/plugin/projects/issues-project/src/file2.less
@@ -19,7 +19,8 @@ a:unknown { /* S4659 | selecto
content: "first
second"; /* S4652 | string-no-newline */
color: pink;
- color: orange; /* S4656 | declaration-block-no-duplicate-properties */
+ color: pink; /* S4656 | declaration-block-no-duplicate-properties */
+ color: orange; /* S4656 | declaration-block-no-duplicate-properties | Not raised because property has a different value */
font: 1em/1.3 Times; /* S4649 | font-family-no-missing-generic-family-keyword */
font-family: serif, serif; /* S4648 | font-family-no-duplicate-names */
heigth: 100%; /* S4654 | property-no-unknown */
diff --git a/its/plugin/projects/issues-project/src/file3.scss b/its/plugin/projects/issues-project/src/file3.scss
index de42fb3..20c7823 100644
--- a/its/plugin/projects/issues-project/src/file3.scss
+++ b/its/plugin/projects/issues-project/src/file3.scss
@@ -19,7 +19,8 @@ a:unknown { /* S4659 | selecto
content: "first
second"; /* S4652 | string-no-newline */
color: pink;
- color: orange; /* S4656 | declaration-block-no-duplicate-properties */
+ color: pink; /* S4656 | declaration-block-no-duplicate-properties */
+ color: orange; /* S4656 | declaration-block-no-duplicate-properties | Not raised because property has a different value */
font: 1em/1.3 Times; /* S4649 | font-family-no-missing-generic-family-keyword */
font-family: serif, serif; /* S4648 | font-family-no-duplicate-names */
heigth: 100%; /* S4654 | property-no-unknown */
diff --git a/sonar-css-plugin/src/main/java/org/sonar/css/plugin/CssRules.java b/sonar-css-plugin/src/main/java/org/sonar/css/plugin/CssRules.java
index b2f8121..926fff0 100644
--- a/sonar-css-plugin/src/main/java/org/sonar/css/plugin/CssRules.java
+++ b/sonar-css-plugin/src/main/java/org/sonar/css/plugin/CssRules.java
@@ -67,7 +67,7 @@ public class CssRules {
stylelintKeyToRuleKey = new HashMap<>();
for (CssRule rule : enabledRules) {
stylelintKeyToRuleKey.put(rule.stylelintKey(), checks.ruleKey(rule));
- config.rules.put(rule.stylelintKey(), true);
+ config.rules.put(rule.stylelintKey(), rule.stylelintOptions());
}
}
@@ -114,6 +114,6 @@ public class CssRules {
}
public static class StylelintConfig {
- Map<String, Boolean> rules = new HashMap<>();
+ Map<String, Object> rules = new HashMap<>();
}
}
diff --git a/sonar-css-plugin/src/main/java/org/sonar/css/plugin/rules/CssRule.java b/sonar-css-plugin/src/main/java/org/sonar/css/plugin/rules/CssRule.java
index 237228b..fdc577b 100644
--- a/sonar-css-plugin/src/main/java/org/sonar/css/plugin/rules/CssRule.java
+++ b/sonar-css-plugin/src/main/java/org/sonar/css/plugin/rules/CssRule.java
@@ -23,4 +23,7 @@ public interface CssRule {
String stylelintKey();
+ default Object stylelintOptions() {
+ return true;
+ }
}
diff --git a/sonar-css-plugin/src/main/java/org/sonar/css/plugin/rules/DeclarationBlockNoDuplicateProperties.java b/sonar-css-plugin/src/main/java/org/sonar/css/plugin/rules/DeclarationBlockNoDuplicateProperties.java
index 75382de..5c4b00a 100644
--- a/sonar-css-plugin/src/main/java/org/sonar/css/plugin/rules/DeclarationBlockNoDuplicateProperties.java
+++ b/sonar-css-plugin/src/main/java/org/sonar/css/plugin/rules/DeclarationBlockNoDuplicateProperties.java
@@ -19,6 +19,9 @@
*/
package org.sonar.css.plugin.rules;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
import org.sonar.check.Rule;
@Rule(key = "S4656")
@@ -28,4 +31,13 @@ public class DeclarationBlockNoDuplicateProperties implements CssRule {
public String stylelintKey() {
return "declaration-block-no-duplicate-properties";
}
+
+ @Override
+ public Object stylelintOptions() {
+ return Arrays.asList(true, new StylelintIgnoreOption());
+ }
+
+ private static class StylelintIgnoreOption {
+ private final List<String> ignore = Collections.singletonList("consecutive-duplicates-with-different-values");
+ }
}
diff --git a/sonar-css-plugin/src/test/java/org/sonar/css/plugin/CssRuleSensorTest.java b/sonar-css-plugin/src/test/java/org/sonar/css/plugin/CssRuleSensorTest.java
index dfe7ff2..f44781b 100644
--- a/sonar-css-plugin/src/test/java/org/sonar/css/plugin/CssRuleSensorTest.java
+++ b/sonar-css-plugin/src/test/java/org/sonar/css/plugin/CssRuleSensorTest.java
@@ -58,7 +58,7 @@ public class CssRuleSensorTest {
@Rule
public ExpectedException thrown= ExpectedException.none();
- private static CheckFactory checkFactory = new CheckFactory(new TestActiveRules("S4647"));
+ private static CheckFactory checkFactory = new CheckFactory(new TestActiveRules("S4647", "S4656"));
private static final File BASE_DIR = new File("src/test/resources").getAbsoluteFile();
@@ -66,7 +66,7 @@ public class CssRuleSensorTest {
private DefaultInputFile inputFile = createInputFile(context, "some css content\n on 2 lines", "dir/file.css");
@Before
- public void setUp() throws Exception {
+ public void setUp() {
context.fileSystem().setWorkDir(tmpDir.getRoot().toPath());
}
@@ -90,11 +90,11 @@ public class CssRuleSensorTest {
assertThat(issue.primaryLocation().message()).isEqualTo("some message");
Path configPath = Paths.get(context.fileSystem().workDir().getAbsolutePath(), "testconfig.json");
- assertThat(Files.readAllLines(configPath)).containsOnly("{\"rules\":{\"color-no-invalid-hex\":true}}");
+ assertThat(Files.readAllLines(configPath)).containsOnly("{\"rules\":{\"color-no-invalid-hex\":true,\"declaration-block-no-duplicate-properties\":[true,{\"ignore\":[\"consecutive-duplicates-with-different-values\"]}]}}");
}
@Test
- public void test_invalid_node() throws IOException {
+ public void test_invalid_node() {
TestLinterCommandProvider commandProvider = getCommandProvider();
commandProvider.nodeExecutable += " " + TestLinterCommandProvider.resourceScript("/executables/invalidNodeVersion.js");
CssRuleSensor sensor = new CssRuleSensor(new TestBundleHandler(), checkFactory, commandProvider);
@@ -105,7 +105,7 @@ public class CssRuleSensorTest {
}
@Test
- public void test_no_node() throws IOException {
+ public void test_no_node() {
TestLinterCommandProvider commandProvider = getCommandProvider();
commandProvider.nodeExecutable = TestLinterCommandProvider.resourceScript("/executables/invalidNodeVersion.js");
CssRuleSensor sensor = new CssRuleSensor(new TestBundleHandler(), checkFactory, commandProvider);
@@ -116,7 +116,7 @@ public class CssRuleSensorTest {
}
@Test
- public void test_old_node() throws IOException {
+ public void test_old_node() {
TestLinterCommandProvider commandProvider = getCommandProvider();
commandProvider.nodeExecutable += " " + TestLinterCommandProvider.resourceScript("/executables/oldNodeVersion.js");
CssRuleSensor sensor = new CssRuleSensor(new TestBundleHandler(), checkFactory, commandProvider);
@@ -127,7 +127,7 @@ public class CssRuleSensorTest {
}
@Test
- public void test_error() throws IOException {
+ public void test_error() {
thrown.expect(IllegalStateException.class);
thrown.expectMessage("Failed to parse json result of external process execution");
@@ -137,7 +137,7 @@ public class CssRuleSensorTest {
}
@Test
- public void test_not_execute_rules_if_nothing_enabled() throws IOException {
+ public void test_not_execute_rules_if_nothing_enabled() {
TestLinterCommandProvider commandProvider = new TestLinterCommandProvider().nodeScript("/executables/mockError.js", inputFile.absolutePath());
CssRuleSensor sensor = new CssRuleSensor(new TestBundleHandler(), new CheckFactory(new TestActiveRules()), commandProvider);
sensor.execute(context);
@@ -146,7 +146,7 @@ public class CssRuleSensorTest {
}
@Test
- public void test_syntax_error() throws IOException {
+ public void test_syntax_error() {
SensorContextTester context = SensorContextTester.create(BASE_DIR);
context.fileSystem().setWorkDir(tmpDir.getRoot().toPath());
DefaultInputFile inputFile = createInputFile(context, "some css content\n on 2 lines", "dir/file.css");
@@ -158,7 +158,7 @@ public class CssRuleSensorTest {
}
@Test
- public void test_unknown_rule() throws IOException {
+ public void test_unknown_rule() {
SensorContextTester context = SensorContextTester.create(BASE_DIR);
context.fileSystem().setWorkDir(tmpDir.getRoot().toPath());
DefaultInputFile inputFile = createInputFile(context, "some css content\n on 2 lines", "dir/file.css");