diff --git a/docs/pages/pmd/userdocs/pmd_report_formats.md b/docs/pages/pmd/userdocs/pmd_report_formats.md index 05dafb2253..33961afabc 100644 --- a/docs/pages/pmd/userdocs/pmd_report_formats.md +++ b/docs/pages/pmd/userdocs/pmd_report_formats.md @@ -254,10 +254,6 @@ Was expecting one of: * warnings: 2 -**Properties:** - -* color: Enables colors with anything other than `false` or `0`. Default: yes. - ## textpad TextPad integration. diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md index 9082e46f31..c2cc288dfd 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -105,6 +105,7 @@ in the Migration Guide. * [#4723](https://github.com/pmd/pmd/issues/4723): \[cli] Launch fails for "bash pmd" * core * [#1027](https://github.com/pmd/pmd/issues/1027): \[core] Apply the new PropertyDescriptor<Pattern> type where applicable + * [#4312](https://github.com/pmd/pmd/issues/4312): \[core] Remove unnecessary property `color` and system property `pmd.color` in `TextColorRenderer` * [#4674](https://github.com/pmd/pmd/issues/4674): \[core] WARNING: Illegal reflective access by org.codehaus.groovy.reflection.CachedClass * [#4694](https://github.com/pmd/pmd/pull/4694): \[core] Fix line/col numbers in TokenMgrError * [#4717](https://github.com/pmd/pmd/issues/4717): \[core] XSLTRenderer doesn't close report file @@ -159,6 +160,12 @@ The following previously deprecated classes have been removed: If the current version is needed, then `Node.getTextDocument().getLanguageVersion()` can be used. This is the version that has been selected via CLI `--use-version` parameter. +**Renderers** + +* `textcolor` renderer ({%jdoc core::renderers.TextColorRenderer %}) now renders always in color. + The property `color` has been removed. The possibility to override this with the system property `pmd.color` + has been removed as well. If you don't want colors, use `text` renderer ({%jdoc core::renderers.TextRenderer %}). + #### External Contributions * [#4640](https://github.com/pmd/pmd/pull/4640): \[cli] Launch script fails if run via "bash pmd" - [Shai Bennathan](https://github.com/shai-bennathan) (@shai-bennathan) * [#4673](https://github.com/pmd/pmd/pull/4673): \[javascript] CPD: Added support for decorator notation - [Wener](https://github.com/wener-tiobe) (@wener-tiobe) @@ -566,6 +573,7 @@ See also [Detailed Release Notes for PMD 7]({{ baseurl }}pmd_release_notes_pmd7. * [#4204](https://github.com/pmd/pmd/issues/4204): \[core] Provide a CpdAnalysis class as a programmatic entry point into CPD * [#4301](https://github.com/pmd/pmd/issues/4301): \[core] Remove deprecated property concrete classes * [#4302](https://github.com/pmd/pmd/issues/4302): \[core] Migrate Property Framework API to Java 8 + * [#4312](https://github.com/pmd/pmd/issues/4312): \[core] Remove unnecessary property `color` and system property `pmd.color` in `TextColorRenderer` * [#4323](https://github.com/pmd/pmd/issues/4323): \[core] Refactor CPD integration * [#4353](https://github.com/pmd/pmd/pull/4353): \[core] Micro optimizations for Node API * [#4365](https://github.com/pmd/pmd/pull/4365): \[core] Improve benchmarking diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/renderers/TextColorRenderer.java b/pmd-core/src/main/java/net/sourceforge/pmd/renderers/TextColorRenderer.java index cb78a79871..4fb751df11 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/renderers/TextColorRenderer.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/renderers/TextColorRenderer.java @@ -20,12 +20,10 @@ import net.sourceforge.pmd.Report; import net.sourceforge.pmd.Report.ConfigurationError; import net.sourceforge.pmd.Report.ProcessingError; import net.sourceforge.pmd.RuleViolation; -import net.sourceforge.pmd.properties.PropertyDescriptor; -import net.sourceforge.pmd.properties.PropertyFactory; /** *

- * A console renderer with optional color support under *nix systems. + * A console renderer with color support for terminal supporting ansi color codes. *

* *
@@ -47,45 +45,29 @@ import net.sourceforge.pmd.properties.PropertyFactory;
  *     code: logger.error( "missing attribute 'app_arg' in rule '" + ((Element)element.getParent()).getAttributeValue( "name" ) + "'" );
  * * warnings: 3
  * 
- *

- * Colorization is turned on by supplying -Dpmd.color - any value other - * than '0' or 'false', enables color - including an empty value (''). Nota - * Bene: colorization is atm only supported under *nix terminals accepting - * ansi escape sequences, such as xterm, rxvt et cetera. - *

*/ public class TextColorRenderer extends AbstractAccumulatingRenderer { public static final String NAME = "textcolor"; - // What? TODO 7.0.0 Use a boolean property - // TODO should the "textcolor" renderer really support "optional" colors? - // either use text or textcolor... - // This property is really weird, the standard boolean properties - // are false unless value is exactly "true", this one is true unless - // "false" or "0"... - public static final PropertyDescriptor COLOR = PropertyFactory.stringProperty("color").desc("Enables colors with anything other than 'false' or '0'.").defaultValue("yes").build(); - private static final String SYSTEM_PROPERTY_PMD_COLOR = "pmd.color"; - /** * Directory from where java was invoked. */ private String pwd; - private String yellowBold = ""; - private String whiteBold = ""; - private String redBold = ""; - private String red = ""; - private String cyan = ""; - private String green = ""; + private String yellowBold = "\u001B[1;33m"; + private String whiteBold = "\u001B[1;37m"; + private String redBold = "\u001B[1;31m"; + private String red = "\u001B[0;31m"; + private String green = "\u001B[0;32m"; + private String cyan = "\u001B[0;36m"; - private String colorReset = ""; + private String colorReset = "\u001B[0m"; public TextColorRenderer() { // This Renderer was originally submitted by Adrian Papari and was // called the "PapariTextRenderer" pre-PMD 5.0. super(NAME, "Text format, with color support (requires ANSI console support, e.g. xterm, rxvt, etc.)."); - definePropertyDescriptor(COLOR); } @Override @@ -93,36 +75,10 @@ public class TextColorRenderer extends AbstractAccumulatingRenderer { return "txt"; } - /** - * Enables colors on *nix systems - not windows. Color support depends on - * the pmd.color property, which should be set with the -D option during - * execution - a set value other than 'false' or '0' enables color. - *

- * btw, is it possible to do this on windows (ie; console colors)? - */ - private void initializeColorsIfSupported() { - if (isPropertyEnabled(getProperty(COLOR)) || isPropertyEnabled(System.getProperty(SYSTEM_PROPERTY_PMD_COLOR))) { - this.yellowBold = "\u001B[1;33m"; - this.whiteBold = "\u001B[1;37m"; - this.redBold = "\u001B[1;31m"; - this.red = "\u001B[0;31m"; - this.green = "\u001B[0;32m"; - this.cyan = "\u001B[0;36m"; - - this.colorReset = "\u001B[0m"; - } - } - - private boolean isPropertyEnabled(String property) { - return property != null && !("0".equals(property) || "false".equalsIgnoreCase(property)); - } - - @Override public void outputReport(Report report) throws IOException { StringBuilder buf = new StringBuilder(500); buf.append(System.lineSeparator()); - initializeColorsIfSupported(); String lastFile = null; int numberOfErrors = 0; int numberOfWarnings = 0; diff --git a/pmd-core/src/test/java/net/sourceforge/pmd/renderers/PapariTextRendererTest.java b/pmd-core/src/test/java/net/sourceforge/pmd/renderers/PapariTextRendererTest.java deleted file mode 100644 index 626e01427c..0000000000 --- a/pmd-core/src/test/java/net/sourceforge/pmd/renderers/PapariTextRendererTest.java +++ /dev/null @@ -1,69 +0,0 @@ -/** - * BSD-style license; for more info see http://pmd.sourceforge.net/license.html - */ - -package net.sourceforge.pmd.renderers; - -import java.io.FileNotFoundException; -import java.io.Reader; -import java.io.StringReader; - -import net.sourceforge.pmd.Report.ConfigurationError; -import net.sourceforge.pmd.Report.ProcessingError; - -class PapariTextRendererTest extends AbstractRendererTest { - - @Override - Renderer getRenderer() { - TextColorRenderer result = new TextColorRenderer() { - @Override - protected Reader getReader(String sourceFile) throws FileNotFoundException { - return new StringReader("public class Foo {}"); - } - }; - result.setProperty(TextColorRenderer.COLOR, "false"); - return result; - } - - @Override - String getExpected() { - return "* file: " + getSourceCodeFilename() + EOL + " src: " + getSourceCodeFilename() + ":1:1" + EOL + " rule: Foo" + EOL - + " msg: blah" + EOL + " code: public class Foo {}" + EOL + EOL + EOL + EOL - + "Summary:" + EOL + EOL + "* warnings: 1" + EOL; - } - - @Override - String getExpectedEmpty() { - return EOL + EOL + "Summary:" + EOL + EOL + "* warnings: 0" + EOL; - } - - @Override - String getExpectedMultiple() { - return "* file: " + getSourceCodeFilename() + EOL + " src: " + getSourceCodeFilename() + ":1:1" + EOL + " rule: Foo" + EOL - + " msg: blah" + EOL + " code: public class Foo {}" + EOL + EOL + " src: " - + getSourceCodeFilename() + ":1:1" + EOL + " rule: Boo" + EOL + " msg: blah" + EOL - + " code: public class Foo {}" + EOL + EOL + EOL + EOL + "Summary:" + EOL - + EOL + "* warnings: 2" + EOL; - } - - @Override - String getExpectedError(ProcessingError error) { - return EOL + EOL + "Summary:" + EOL + EOL + "* file: file" + EOL + " err: RuntimeException: Error" + EOL - + error.getDetail() + EOL + EOL - + "* errors: 1" + EOL + "* warnings: 0" + EOL; - } - - @Override - String getExpectedErrorWithoutMessage(ProcessingError error) { - return EOL + EOL + "Summary:" + EOL + EOL + "* file: file" + EOL + " err: NullPointerException: null" + EOL - + error.getDetail() + EOL + EOL - + "* errors: 1" + EOL + "* warnings: 0" + EOL; - } - - @Override - String getExpectedError(ConfigurationError error) { - return EOL + EOL + "Summary:" + EOL + EOL + "* rule: Foo" + EOL - + " err: a configuration error" + EOL + EOL - + "* errors: 1" + EOL + "* warnings: 0" + EOL; - } -} diff --git a/pmd-core/src/test/java/net/sourceforge/pmd/renderers/RenderersTests.java b/pmd-core/src/test/java/net/sourceforge/pmd/renderers/RenderersTests.java index 071dcef8ee..46443e82eb 100644 --- a/pmd-core/src/test/java/net/sourceforge/pmd/renderers/RenderersTests.java +++ b/pmd-core/src/test/java/net/sourceforge/pmd/renderers/RenderersTests.java @@ -20,7 +20,7 @@ import org.junit.platform.suite.api.Suite; HTMLRendererTest.class, IDEAJRendererTest.class, JsonRendererTest.class, - PapariTextRendererTest.class, + TextColorRendererTest.class, SarifRendererTest.class, SummaryHTMLRendererTest.class, TextPadRendererTest.class, diff --git a/pmd-core/src/test/java/net/sourceforge/pmd/renderers/TextColorRendererTest.java b/pmd-core/src/test/java/net/sourceforge/pmd/renderers/TextColorRendererTest.java new file mode 100644 index 0000000000..362bf196ce --- /dev/null +++ b/pmd-core/src/test/java/net/sourceforge/pmd/renderers/TextColorRendererTest.java @@ -0,0 +1,96 @@ +/** + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ + +package net.sourceforge.pmd.renderers; + +import java.io.FileNotFoundException; +import java.io.Reader; +import java.io.StringReader; + +import net.sourceforge.pmd.Report.ConfigurationError; +import net.sourceforge.pmd.Report.ProcessingError; + +class TextColorRendererTest extends AbstractRendererTest { + + @Override + Renderer getRenderer() { + TextColorRenderer result = new TextColorRenderer() { + @Override + protected Reader getReader(String sourceFile) throws FileNotFoundException { + return new StringReader("public class Foo {}"); + } + }; + return result; + } + + @Override + String getExpected() { + return "\u001B[1;33m*\u001B[0m file: \u001B[1;37m" + getSourceCodeFilename() + "\u001B[0m" + EOL + + "\u001B[0;32m src: \u001B[0;36m" + getSourceCodeFilename() + "\u001B[0m:\u001B[0;36m1:1\u001B[0m" + EOL + + "\u001B[0;32m rule: \u001B[0mFoo" + EOL + + "\u001B[0;32m msg: \u001B[0mblah" + EOL + + "\u001B[0;32m code: \u001B[0mpublic class Foo {}" + EOL + + EOL + + EOL + + EOL + + "Summary:" + EOL + + EOL + + "\u001B[1;33m*\u001B[0m warnings: \u001B[1;37m1\u001B[0m" + EOL; + } + + @Override + String getExpectedEmpty() { + return EOL + EOL + "Summary:" + EOL + EOL + "\u001B[1;33m*\u001B[0m warnings: \u001B[1;37m0\u001B[0m" + EOL; + } + + @Override + String getExpectedMultiple() { + return "\u001B[1;33m*\u001B[0m file: \u001B[1;37m" + getSourceCodeFilename() + "\u001B[0m" + EOL + + "\u001B[0;32m src: \u001B[0;36m" + getSourceCodeFilename() + "\u001B[0m:\u001B[0;36m1:1\u001B[0m" + EOL + + "\u001B[0;32m rule: \u001B[0mFoo" + EOL + + "\u001B[0;32m msg: \u001B[0mblah" + EOL + + "\u001B[0;32m code: \u001B[0mpublic class Foo {}" + EOL + + "" + EOL + + "\u001B[0;32m src: \u001B[0;36m" + getSourceCodeFilename() + "\u001B[0m:\u001B[0;36m1:1\u001B[0m" + EOL + + "\u001B[0;32m rule: \u001B[0mBoo" + EOL + + "\u001B[0;32m msg: \u001B[0mblah" + EOL + + "\u001B[0;32m code: \u001B[0mpublic class Foo {}" + EOL + + EOL + + EOL + + EOL + + "Summary:" + EOL + + EOL + + "\u001B[1;33m*\u001B[0m warnings: \u001B[1;37m2\u001B[0m" + EOL; + } + + @Override + String getExpectedError(ProcessingError error) { + return EOL + EOL + "Summary:" + EOL + EOL + "\u001B[1;31m*\u001B[0m file: \u001B[1;37mfile\u001B[0m" + EOL + + "\u001B[0;32m err: \u001B[0;36mRuntimeException: Error\u001B[0m" + EOL + + "\u001B[0;31m" + error.getDetail() + "\u001B[0m" + EOL + EOL + + "\u001B[1;31m*\u001B[0m errors: \u001B[1;37m1\u001B[0m" + EOL + + "\u001B[1;33m*\u001B[0m warnings: \u001B[1;37m0\u001B[0m" + EOL; + } + + @Override + String getExpectedErrorWithoutMessage(ProcessingError error) { + return EOL + EOL + "Summary:" + EOL + EOL + "\u001B[1;31m*\u001B[0m file: \u001B[1;37mfile\u001B[0m" + EOL + + "\u001B[0;32m err: \u001B[0;36mNullPointerException: null\u001B[0m" + EOL + + "\u001B[0;31m" + error.getDetail() + "\u001B[0m" + EOL + EOL + + "\u001B[1;31m*\u001B[0m errors: \u001B[1;37m1\u001B[0m" + EOL + + "\u001B[1;33m*\u001B[0m warnings: \u001B[1;37m0\u001B[0m" + EOL; + } + + @Override + String getExpectedError(ConfigurationError error) { + return EOL + EOL + + "Summary:" + EOL + + EOL + + "\u001B[1;31m*\u001B[0m rule: \u001B[1;37mFoo\u001B[0m" + EOL + + "\u001B[0;32m err: \u001B[0;36ma configuration error\u001B[0m" + EOL + + EOL + + "\u001B[1;31m*\u001B[0m errors: \u001B[1;37m1\u001B[0m" + EOL + + "\u001B[1;33m*\u001B[0m warnings: \u001B[1;37m0\u001B[0m" + EOL; + } +}