diff options
| author | Amaury Levé | 2018-06-27 11:38:45 +0200 | 
|---|---|---|
| committer | Amaury Levé | 2018-06-27 12:48:29 +0200 | 
| commit | 364780c6760b452f19f3a52cd4be3a675abacccf (patch) | |
| tree | 8e8da1b05f6d6c69ca415c7e8bd135402c221d81 | |
| parent | 35c3b4a9e20797067876ce2e8ec1cb7f1b3a0761 (diff) | |
| download | sonar-css-364780c6760b452f19f3a52cd4be3a675abacccf.tar.bz2 | |
Update S4656: Ignore consecutive duplications with different values
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"); | 
