Compare commits

..

65 commits

Author SHA1 Message Date
9ea433edce
Version 1.2.3 2025-04-25 08:06:30 -07:00
86ea747ba2
Bump PMD to version 7.13.0 2025-04-25 08:02:04 -07:00
9e8f6c0497
Bump JUnit to version 5.12.2 2025-04-12 20:58:01 -07:00
a15218eb1d
Version 1.2.2 2025-03-28 05:14:21 -07:00
7ae1650677
Bump PMD from 7.11.0 to 7.12.0 2025-03-28 05:05:57 -07:00
d304b931f9
Add OS matrix for Ubuntu, Windows and macOS 2025-03-25 12:28:54 -07:00
355cdf770a
JDK 24 2025-03-18 23:39:56 -07:00
4feba23b90
Bump JUnit to version 5.12.1 2025-03-18 23:39:47 -07:00
91c9556bd9
Add generic installation instruction 2025-03-18 12:29:21 -07:00
67ce6546fe
Version 1.2.1 2025-02-28 11:08:20 -08:00
cfbeeeb5c7
Bump PMD to version 7.11.0 2025-02-28 11:04:50 -08:00
fb0acda205
Bump SLF4J to version 2.0.17 2025-02-25 11:26:15 -08:00
e28496ca16
Bump bld to version 2.2.1 2025-02-24 23:24:45 -08:00
a2d37055c6
Bump JUnit to version 5.12.0 2025-02-24 23:24:32 -08:00
dca8baf3ad
Version 1.2.0 2025-02-01 12:56:22 -08:00
af25b2f507
BREAKING: reworked excludes methods and added addExcludes methods 2025-02-01 12:50:02 -08:00
25bce33323
Version 1.1.11 2025-01-31 14:07:34 -08:00
e7fac3130b
Bumped PMD to version 7.10.0 2025-01-31 14:04:08 -08:00
a1d0b30968
Added missing prepend classpath and excludes options 2025-01-31 14:03:39 -08:00
bc60dcbcf8
Bumped AssertJ to version 3.27.3 2025-01-31 14:00:57 -08:00
71253717bf
Bumped artifact and pages actions to the latest versions 2025-01-31 14:00:22 -08:00
28f9d29d9a
Version 1.1.10 2025-01-14 10:11:41 -08:00
682c50e949
Version 1.1.10-SNAPSHOT 2025-01-13 07:59:28 -08:00
6882490430
Updated copyright for 2025 2025-01-13 07:57:34 -08:00
9184979e2f
Bumped bld to version 2.2.0 2025-01-13 07:55:21 -08:00
e7b366eaf0
Version 1.1.9 2024-12-27 07:29:57 -08:00
dfdc311607
Updated dependencies
Bumped PMD to version 7.9.0
Bumped JUnit to version 5.11.4
2024-12-27 07:29:33 -08:00
586e4a0e19
Version 1.1.8 2024-11-29 07:37:53 -08:00
21edab586b
Bumped PMD to version 7.8.0 2024-11-29 07:33:22 -08:00
f58d4ac052
Version 1.1.7 2024-10-25 12:11:31 -07:00
c7e5731d9e
Bumped PMD to version 7.7.0 2024-10-25 12:09:44 -07:00
4af11d862b
Bumped JUnit to version 5.11.3 2024-10-25 11:54:20 -07:00
5c33fd2a15
Bumped JDK to version 23 (GitHub CI testing) 2024-10-25 11:53:21 -07:00
f46d75c2fe
Version 1.1.6 2024-09-29 04:34:30 -07:00
592c0c514d
Cleaned up tests 2024-09-29 04:31:57 -07:00
3b0550add2
Added GitHub repository 2024-09-29 04:31:20 -07:00
22b7ab9220
Bumped PMD to version 7.6.0 2024-09-29 04:29:43 -07:00
a986add8ee
Bumped JUnit to version 5.11.1 2024-09-29 04:26:17 -07:00
d20f3e41b8
Version 1.1.5 2024-08-30 11:43:07 -07:00
47c0b14ce9
Minor cleanups 2024-08-30 11:38:44 -07:00
176929cd29
Bumped PMD to version 7.5.0 2024-08-30 11:00:20 -07:00
3e18345efe
Bumped bld to version 2.1.0 2024-08-29 21:58:24 -07:00
2b6b4a5e82
Cleaned up API to match bld operations and options APIs 2024-08-27 12:55:48 -07:00
e63c1a636e
Version 1.1.4 2024-07-28 20:55:17 -07:00
fec530d26e
Bumped bld to version 2.0.1 2024-07-28 20:25:25 -07:00
9cb3191dd4
Bumped PMD to version 7.4.0 2024-07-26 20:14:34 -07:00
a253342bd6
Bumped to bld version 2.0.0-SNAPSHOT 2024-07-26 20:14:23 -07:00
efce6b9729
Added failOnError (PMD 7.3.0) support 2024-06-28 17:47:54 -07:00
03fd552702
Version 1.1.1 2024-06-27 21:26:03 -07:00
f7216e6d11
Bumped JUnit to version 5.10.3 2024-06-27 21:21:45 -07:00
12552137ee
Set exit status on failure 2024-06-27 21:00:45 -07:00
af395dd69b
Minor documentation cleanups 2024-06-22 15:14:49 -07:00
6b7a2b68cb
Version 1.1.0 2024-06-22 15:01:44 -07:00
709943e23b
Replaced List with Collection whenever applicable.
Added rule priority configuration.

Cleaned up tests
2024-06-22 14:50:37 -07:00
0e55b2774a
Removed JaCoCo extension 2024-06-22 11:07:02 -07:00
9f64b6d7d8
Version 1.0.1 2024-06-07 15:59:16 -07:00
884fe381dd
Fixed output message format when includelineNumber is false 2024-06-07 15:57:10 -07:00
b6df5df894
Bumped PMD to version 7.2.0 2024-05-31 12:16:01 -07:00
bcaab9bf9d
Bumped bld to version 1.9.1 2024-05-09 21:21:40 -07:00
f7901987b3
Cleaned up the PMD documenaation URLs 2024-04-26 02:03:12 -07:00
9954e9405f
Bumped PMD to version 7.1.0 2024-04-26 01:46:05 -07:00
242ae4348c
Bumped JaCoCo Extension to version 0.9.5 2024-04-26 01:35:52 -07:00
f044678e6b
Bumped workflows actions to the latest versions 2024-04-26 01:34:57 -07:00
3f33710dba
Added support for PMD 7.0.0 2024-03-22 03:34:30 -07:00
9bc04a4cbb
Added JDK 22 to CI 2024-03-21 13:46:44 -07:00
22 changed files with 1361 additions and 312 deletions

View file

@ -4,29 +4,28 @@ on: [ push, pull_request, workflow_dispatch ]
jobs:
build-bld-project:
runs-on: ubuntu-latest
strategy:
matrix:
java-version: [ 17, 20 ]
java-version: [ 17, 21, 24 ]
kotlin-version: [ 1.9.25, 2.0.21, 2.1.20 ]
os: [ ubuntu-latest, windows-latest, macos-latest ]
runs-on: ${{ matrix.os }}
steps:
- name: Checkout source repository
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up JDK ${{ matrix.java-version }}
uses: actions/setup-java@v3
uses: actions/setup-java@v4
with:
distribution: 'zulu'
distribution: "zulu"
java-version: ${{ matrix.java-version }}
- name: Grant execute permission for bld
run: chmod +x bld
- name: Download the dependencies
- name: Download dependencies
run: ./bld download
- name: Run tests with bld
- name: Run tests
run: ./bld compile test

View file

@ -30,14 +30,14 @@ jobs:
steps:
- name: Checkout source repository
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up JDK 17
uses: actions/setup-java@v3
uses: actions/setup-java@v4
with:
distribution: 'zulu'
distribution: "zulu"
java-version: 17
- name: Build Javadocs
@ -47,11 +47,11 @@ jobs:
uses: actions/configure-pages@v3
- name: Upload artifact
uses: actions/upload-pages-artifact@v1
uses: actions/upload-pages-artifact@v3
with:
# Upload generated Javadocs repository
path: 'build/javadoc/'
path: "build/javadoc/"
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v1
uses: actions/deploy-pages@v4

6
.idea/bld.xml generated Normal file
View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="BldConfiguration">
<events />
</component>
</project>

13
.idea/icon.svg generated Normal file
View file

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 179 108" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<g transform="matrix(1,0,0,1,-210.511,-96.3382)">
<g transform="matrix(1,0,0,1,-23.3386,-649.816)">
<g transform="matrix(0.221288,0,0,0.24,73.9536,390.254)">
<path d="M722.568,1482.92L722.568,1921.1L808.968,1921.1L808.968,1888.7C822.168,1907.9 846.168,1930.1 893.568,1930.1C933.168,1930.1 961.968,1917.5 985.368,1893.5C1012.97,1865.9 1027.37,1827.5 1027.37,1786.1C1027.37,1741.7 1011.17,1705.1 985.368,1680.5C961.968,1658.3 928.968,1644.5 892.368,1644.5C862.968,1644.5 830.568,1654.1 808.968,1683.5L808.968,1482.92L722.568,1482.92ZM871.368,1718.9C888.768,1718.9 903.768,1723.7 917.568,1736.9C930.168,1748.9 938.568,1766.3 938.568,1787.9C938.568,1807.7 930.168,1825.1 917.568,1837.1C904.368,1849.7 887.568,1855.7 872.568,1855.7C856.368,1855.7 837.168,1849.1 823.368,1835.9C813.168,1826.3 803.568,1810.1 803.568,1787.9C803.568,1765.1 812.568,1749.5 822.768,1738.7C836.568,1724.3 852.768,1718.9 871.368,1718.9Z" style="fill:rgb(35,146,255);fill-rule:nonzero;"/>
<rect x="1083.77" y="1482.92" width="86.4" height="438.182" style="fill:rgb(250,144,82);fill-rule:nonzero;"/>
<path d="M1531.37,1482.92L1444.97,1482.92L1444.97,1683.5C1423.37,1654.1 1390.97,1644.5 1361.57,1644.5C1324.97,1644.5 1291.97,1658.3 1268.57,1680.5C1242.77,1705.1 1226.57,1741.7 1226.57,1786.1C1226.57,1827.5 1240.97,1865.9 1268.57,1893.5C1291.97,1917.5 1320.77,1930.1 1360.37,1930.1C1407.77,1930.1 1431.77,1907.9 1444.97,1888.7L1444.97,1921.1L1531.37,1921.1L1531.37,1482.92ZM1382.57,1718.9C1401.17,1718.9 1417.37,1724.3 1431.17,1738.7C1441.37,1749.5 1450.37,1765.1 1450.37,1787.9C1450.37,1810.1 1440.77,1826.3 1430.57,1835.9C1416.77,1849.1 1397.57,1855.7 1381.37,1855.7C1366.37,1855.7 1349.57,1849.7 1336.37,1837.1C1323.77,1825.1 1315.37,1807.7 1315.37,1787.9C1315.37,1766.3 1323.77,1748.9 1336.37,1736.9C1350.17,1723.7 1365.17,1718.9 1382.57,1718.9Z" style="fill:rgb(35,146,255);fill-rule:nonzero;"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

View file

@ -2,12 +2,12 @@
<library name="bld">
<CLASSES>
<root url="file://$PROJECT_DIR$/lib/bld" />
<root url="jar://$USER_HOME$/.bld/dist/bld-1.9.0.jar!/" />
<root url="jar://$USER_HOME$/.bld/dist/bld-2.2.1.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="file://$PROJECT_DIR$/lib/bld" />
<root url="jar://$USER_HOME$/.bld/dist/bld-1.9.0-sources.jar!/" />
<root url="jar://$USER_HOME$/.bld/dist/bld-2.2.1-sources.jar!/" />
</SOURCES>
<excluded>
<root url="jar://$PROJECT_DIR$/lib/bld/bld-wrapper.jar!/" />

View file

@ -7,7 +7,7 @@
<SOURCES>
<root url="file://$PROJECT_DIR$/lib/compile" />
</SOURCES>
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="false" />
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="false" type="SOURCES" />
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="true" />
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="true" type="SOURCES" />
</library>
</component>

View file

@ -7,7 +7,7 @@
<SOURCES>
<root url="file://$PROJECT_DIR$/lib/runtime" />
</SOURCES>
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="false" />
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="false" type="SOURCES" />
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="true" />
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="true" type="SOURCES" />
</library>
</component>

View file

@ -7,7 +7,7 @@
<SOURCES>
<root url="file://$PROJECT_DIR$/lib/test" />
</SOURCES>
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="false" />
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="false" type="SOURCES" />
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="true" />
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="true" type="SOURCES" />
</library>
</component>

View file

@ -1,9 +0,0 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="PmdOperation" type="Application" factoryName="Application" nameIsGenerated="true">
<option name="MAIN_CLASS_NAME" value="rife.bld.extension.PmdOperation" />
<module name="app" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>

View file

@ -1,13 +0,0 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Run Tests" type="JUnit" factoryName="JUnit">
<module name="app" />
<option name="PACKAGE_NAME" value="moog" />
<option name="MAIN_CLASS_NAME" value="rife.bld.extension" />
<option name="METHOD_NAME" value="" />
<option name="TEST_OBJECT" value="directory" />
<dir value="$PROJECT_DIR$/src/test/java" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>

View file

@ -9,7 +9,7 @@
],
"java.configuration.updateBuildConfiguration": "automatic",
"java.project.referencedLibraries": [
"${HOME}/.bld/dist/bld-1.9.0.jar",
"${HOME}/.bld/dist/bld-2.2.1.jar",
"lib/**/*.jar"
]
}

View file

@ -1,16 +1,23 @@
# [bld](https://rife2.com/bld) Extension to Perform Static Code Analysis with [PMD](https://pmd.github.io/)
[![License](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
[![Java](https://img.shields.io/badge/java-17%2B-blue)](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html)
[![bld](https://img.shields.io/badge/1.9.0-FA9052?label=bld&labelColor=2392FF)](https://rife2.com/bld)
[![bld](https://img.shields.io/badge/2.2.1-FA9052?label=bld&labelColor=2392FF)](https://rife2.com/bld)
[![Release](https://flat.badgen.net/maven/v/metadata-url/repo.rife2.com/releases/com/uwyn/rife2/bld-pmd/maven-metadata.xml?color=blue)](https://repo.rife2.com/#/releases/com/uwyn/rife2/bld-pmd)
[![Snapshot](https://flat.badgen.net/maven/v/metadata-url/repo.rife2.com/snapshots/com/uwyn/rife2/bld-pmd/maven-metadata.xml?label=snapshot)](https://repo.rife2.com/#/snapshots/com/uwyn/rife2/bld-pmd)
[![GitHub CI](https://github.com/rife2/bld-pmd/actions/workflows/bld.yml/badge.svg)](https://github.com/rife2/bld-pmd/actions/workflows/bld.yml)
To install, please refer to the [extensions documentation](https://github.com/rife2/bld/wiki/Extensions).
To install the latest version, add the following to the `lib/bld/bld-wrapper.properties` file:
To check all source code using the [Java Quickstart](https://pmd.github.io/pmd/pmd_rules_java.html) configuration, add the following to your build file:
```properties
bld.extension-pmd=com.uwyn.rife2:bld-pmd
```
For more information, please refer to the [extensions](https://github.com/rife2/bld/wiki/Extensions) documentation.
## Check Source with PMD
To check all source Codecode using the [Java Quickstart](https://docs.pmd-code.org/latest/pmd_rules_java.html) configuration, add the following to your build file:
```java
@BuildCommand(summary = "Checks source code with PMD")
@ -25,7 +32,7 @@ public void pmd() throws Exception {
./bld pmd test
```
To check the main source directory using a custom ruleset, [Java Error Prone](https://pmd.github.io/pmd/pmd_rules_java.html#error-prone) configuration, and failing on any violation.
To check the main source directory using a custom ruleset, [Java Error Prone](https://docs.pmd-code.org/latest/pmd_rules_java.html#error-prone) configuration, and failing on any violation.
```java
@BuildCommand(value = "pmd-main", summary = "Checks main source code with PMD")
@ -33,7 +40,7 @@ public void pmdMain() throws Exception {
new PmdOperation()
.fromProject(this)
.failOnViolation(true)
.inputPaths(this.srcMainDirectory().toPath())
.inputPaths(srcMainDirectory())
.ruleSets("config/pmd.xml", "category/java/errorprone.xml")
.execute();
}

109
config/pmd.xml Normal file
View file

@ -0,0 +1,109 @@
<?xml version="1.0"?>
<ruleset name="erik"
xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 https://pmd.sourceforge.io/ruleset_2_0_0.xsd">
<description>Erik's Ruleset</description>
<!-- BEST PRACTICES -->
<rule ref="category/java/bestpractices.xml">
<exclude name="AvoidPrintStackTrace"/>
<exclude name="GuardLogStatement"/>
<exclude name="UnitTestContainsTooManyAsserts"/>
<exclude name="UnitTestShouldUseTestAnnotation"/>
</rule>
<rule ref="category/java/bestpractices.xml/MissingOverride">
<properties>
<property name="violationSuppressXPath"
value="//MethodDeclaration[@Name='hashCode' or @Name='equals' or @Name='toString']"/>
</properties>
</rule>
<!-- CODE STYLE -->
<rule ref="category/java/codestyle.xml">
<exclude name="AtLeastOneConstructor"/>
<exclude name="ClassNamingConventions"/>
<exclude name="CommentDefaultAccessModifier"/>
<exclude name="ConfusingTernary"/>
<exclude name="FieldNamingConventions"/>
<exclude name="LocalVariableCouldBeFinal"/>
<exclude name="LongVariable"/>
<exclude name="MethodArgumentCouldBeFinal"/>
<exclude name="OnlyOneReturn"/>
<exclude name="PackageCase"/>
<exclude name="ShortClassName"/>
<exclude name="ShortMethodName"/>
<exclude name="ShortVariable"/>
<exclude name="UseExplicitTypes"/>
<exclude name="UseUnderscoresInNumericLiterals"/>
<exclude name="UselessParentheses"/>
</rule>
<rule ref="category/java/codestyle.xml/UnnecessaryImport">
<properties>
<property name="violationSuppressRegex" value="Unused (static|.*\.\*).*"/>
</properties>
</rule>
<!-- DESIGN -->
<rule ref="category/java/design.xml">
<exclude name="AvoidCatchingGenericException"/>
<exclude name="AvoidDeeplyNestedIfStmts"/>
<exclude name="AvoidUncheckedExceptionsInSignatures"/>
<exclude name="CognitiveComplexity"/>
<exclude name="CyclomaticComplexity"/>
<exclude name="ExcessiveParameterList"/>
<exclude name="ExcessivePublicCount"/>
<exclude name="GodClass"/>
<exclude name="LawOfDemeter"/>
<exclude name="LoosePackageCoupling"/>
<exclude name="NPathComplexity"/>
<exclude name="NcssCount"/>
<exclude name="TooManyFields"/>
<exclude name="TooManyMethods"/>
<exclude name="UseObjectForClearerAPI"/>
</rule>
<!-- DOCUMENTATION -->
<rule ref="category/java/documentation.xml">
<exclude name="CommentRequired"/>
<exclude name="CommentSize"/>
</rule>
<!-- ERROR PRONE -->
<rule ref="category/java/errorprone.xml">
<exclude name="AssignmentInOperand"/>
<exclude name="AvoidCatchingNPE"/>
<exclude name="AvoidDuplicateLiterals"/>
<exclude name="AvoidFieldNameMatchingMethodName"/>
<exclude name="AvoidFieldNameMatchingTypeName"/>
<exclude name="AvoidLiteralsInIfCondition"/>
<exclude name="NullAssignment"/>
</rule>
<rule ref="category/java/errorprone.xml/AssignmentInOperand">
<properties>
<property name="allowWhile" value="true"/>
<property name="allowFor" value="true"/>
<property name="allowIf" value="true"/>
</properties>
</rule>
<rule ref="category/java/errorprone.xml/AvoidDuplicateLiterals">
<properties>
<property name="skipAnnotations" value="true"/>
</properties>
</rule>
<!-- MULTITHREADING -->
<rule ref="category/java/multithreading.xml">
</rule>
<!-- PERFORMANCE -->
<rule ref="category/java/performance.xml">
</rule>
<!-- SECURITY -->
<rule ref="category/java/security.xml">
</rule>
</ruleset>

Binary file not shown.

View file

@ -1,6 +1,5 @@
bld.downloadExtensionJavadoc=false
bld.downloadExtensionSources=true
bld.extensions=com.uwyn.rife2:bld-jacoco-report:0.9.3
bld.repositories=MAVEN_LOCAL,MAVEN_CENTRAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES
bld.downloadLocation=
bld.version=1.9.0
bld.repositories=MAVEN_LOCAL,MAVEN_CENTRAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES
bld.version=2.2.1

View file

@ -1,5 +1,5 @@
/*
* Copyright 2023-2024 the original author or authors.
* Copyright 2023-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -16,17 +16,14 @@
package rife.bld.extension;
import rife.bld.BuildCommand;
import rife.bld.Project;
import rife.bld.publish.PublishDeveloper;
import rife.bld.publish.PublishLicense;
import rife.bld.publish.PublishScm;
import java.io.IOException;
import java.util.List;
import static rife.bld.dependencies.Repository.MAVEN_CENTRAL;
import static rife.bld.dependencies.Repository.RIFE2_RELEASES;
import static rife.bld.dependencies.Repository.*;
import static rife.bld.dependencies.Scope.*;
import static rife.bld.operations.JavadocOptions.DocLinkOption.NO_MISSING;
@ -34,24 +31,25 @@ public class PmdOperationBuild extends Project {
public PmdOperationBuild() {
pkg = "rife.bld.extension";
name = "bld-pmd";
version = version(0, 9, 7);
version = version(1, 2, 3);
javaRelease = 17;
downloadSources = true;
autoDownloadPurge = true;
repositories = List.of(MAVEN_CENTRAL, RIFE2_RELEASES);
var pmd = version(7, 0, 0, "rc4");
repositories = List.of(MAVEN_LOCAL, MAVEN_CENTRAL, RIFE2_RELEASES, RIFE2_SNAPSHOTS);
var pmd = version(7, 13, 0);
scope(compile)
.include(dependency("com.uwyn.rife2", "bld", version(1, 9, 0)))
.include(dependency("com.uwyn.rife2", "bld", version(2, 2, 1)))
.include(dependency("net.sourceforge.pmd", "pmd-java", pmd));
scope(runtime)
.include(dependency("net.sourceforge.pmd", "pmd-java", pmd))
.include(dependency("org.slf4j", "slf4j-simple", version(2, 0, 12)));
.include(dependency("org.slf4j", "slf4j-simple", version(2, 0, 17)));
scope(test)
.include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 10, 2)))
.include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 10, 2)))
.include(dependency("org.assertj", "assertj-core", version(3, 25, 3)));
.include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 12, 2)))
.include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 12, 2)))
.include(dependency("org.assertj", "assertj-core", version(3, 27, 3)));
javadocOperation()
.javadocOptions()
@ -62,26 +60,23 @@ public class PmdOperationBuild extends Project {
.link("https://javadoc.io/doc/net.sourceforge.pmd/pmd-core/latest/");
publishOperation()
// .repository(MAVEN_LOCAL)
.repository(version.isSnapshot() ? repository("rife2-snapshot") : repository("rife2"))
.repository(repository("github"))
.info()
.groupId("com.uwyn.rife2")
.artifactId("bld-pmd")
.description("bld Extension to Perform Static Code Analysis with PMD")
.url("https://github.com/rife2/bld-pmd")
.developer(
new PublishDeveloper()
.developer(new PublishDeveloper()
.id("ethauvin").name("Erik C. Thauvin")
.email("erik@thauvin.net")
.url("https://erik.thauvin.net/")
)
.license(
new PublishLicense()
.license(new PublishLicense()
.name("The Apache License, Version 2.0")
.url("http://www.apache.org/licenses/LICENSE-2.0.txt")
.url("https://www.apache.org/licenses/LICENSE-2.0.txt")
)
.scm(
new PublishScm()
.scm(new PublishScm()
.connection("scm:git:https://github.com/rife2/bld-pmd.git")
.developerConnection("scm:git:git@github.com:rife2/bld-pmd.git")
.url("https://github.com/rife2/bld-pmd")
@ -93,11 +88,4 @@ public class PmdOperationBuild extends Project {
public static void main(String[] args) {
new PmdOperationBuild().start(args);
}
@BuildCommand(summary = "Generates JaCoCo Reports")
public void jacoco() throws IOException {
new JacocoReportOperation()
.fromProject(this)
.execute();
}
}

File diff suppressed because it is too large Load diff

View file

@ -1,5 +1,5 @@
/*
* Copyright 2023-2024 the original author or authors.
* Copyright 2023-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -17,15 +17,25 @@
package rife.bld.extension;
import net.sourceforge.pmd.PMDConfiguration;
import net.sourceforge.pmd.lang.LanguageRegistry;
import net.sourceforge.pmd.lang.rule.RulePriority;
import org.assertj.core.api.AutoCloseableSoftAssertions;
import org.junit.jupiter.api.Test;
import rife.bld.BaseProject;
import rife.bld.operations.exceptions.ExitStatusException;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Properties;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatCode;
@ -37,37 +47,148 @@ import static org.assertj.core.api.Assertions.assertThatCode;
* @since 1.0
*/
class PmdOperationTest {
static final String BAR = "bar";
static final String CATEGORY_FOO = "category/foo.xml";
static final String CODE_STYLE = "category/java/codestyle.xml";
static final Path CODE_STYLE_SAMPLE = Path.of("src/test/resources/java/CodeStyle.java");
static final int CODING_STYLE_ERRORS = 13;
static final String CODE_STYLE_XML = "category/java/codestyle.xml";
static final String COMMAND_NAME = "pmd";
static final String ERROR_PRONE = "category/java/errorprone.xml";
static final int ERROR_PRONE_ERRORS = 8;
static final String DESIGN_XML = "category/java/design.xml";
static final String DOCUMENTATION_XML = "category/java/documentation.xml";
static final Path ERROR_PRONE_SAMPLE = Path.of("src/test/resources/java/ErrorProne.java");
static final String ERROR_PRONE_XML = "category/java/errorprone.xml";
static final File FILE_BAR = new File(BAR);
static final String FOO = "foo";
static final File FILE_FOO = new File(FOO);
static final Path PATH_BAR = Path.of(BAR);
static final Path PATH_FOO = Path.of(FOO);
static final String PERFORMANCE_XML = "category/java/performance.xml";
static final String SECURITY_XML = "category/java/security.xml";
static final String TEST = "test";
PmdOperation newPmdOperation() {
final PmdOperation pmdOperation = new PmdOperation();
pmdOperation.inputPaths(Path.of("src/main"), Path.of("src/test"));
pmdOperation.reportFile_ = Paths.get("build", COMMAND_NAME, "pmd-test-report.txt");
pmdOperation.cache_ = Paths.get("build", COMMAND_NAME, "pmd-cache");
pmdOperation.failOnViolation_ = false;
return pmdOperation;
return new PmdOperation()
.inputPaths(Path.of("src/main"), Path.of("src/test"))
.cache("build/" + COMMAND_NAME + "/pmd-cache")
.failOnViolation(false)
.reportFile(Paths.get("build", COMMAND_NAME, "pmd-test-report.txt"));
}
@Test
void testAddInputPaths() {
var pmd = newPmdOperation().ruleSets(PmdOperation.RULE_SET_DEFAULT, CODE_STYLE).inputPaths(ERROR_PRONE_SAMPLE)
.addInputPath(CODE_STYLE_SAMPLE);
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isEqualTo(36);
void testAddExcludes() {
var pmd = newPmdOperation().ruleSets(CATEGORY_FOO).addExcludes(PATH_FOO);
var config = pmd.initConfiguration(COMMAND_NAME);
assertThat(config.getExcludes()).containsExactly(PATH_FOO);
pmd = pmd.addExcludes(PATH_BAR);
config = pmd.initConfiguration(COMMAND_NAME);
assertThat(config.getExcludes()).containsExactly(PATH_FOO, PATH_BAR);
}
@Test
void testCache() {
void testAddExcludesFiles() {
var pmd = newPmdOperation().ruleSets(CATEGORY_FOO).addExcludesFiles(FILE_FOO);
var config = pmd.initConfiguration(COMMAND_NAME);
assertThat(config.getExcludes()).containsExactly(FILE_FOO.toPath());
pmd = pmd.addExcludesFiles(FILE_BAR);
config = pmd.initConfiguration(COMMAND_NAME);
assertThat(config.getExcludes()).containsExactly(FILE_FOO.toPath(), FILE_BAR.toPath());
}
@Test
void testAddExcludesStrings() {
var pmd = newPmdOperation().ruleSets(CATEGORY_FOO).addExcludesStrings(FOO);
var config = pmd.initConfiguration(COMMAND_NAME);
assertThat(config.getExcludes()).containsExactly(PATH_FOO);
pmd = pmd.addExcludesStrings(BAR);
config = pmd.initConfiguration(COMMAND_NAME);
assertThat(config.getExcludes()).containsExactly(PATH_FOO, PATH_BAR);
}
@Test
void testAddInputPaths() throws ExitStatusException {
var project = new BaseProject();
var pmd = new PmdOperation().fromProject(project);
assertThat(pmd.inputPaths()).as("default").containsExactly(project.srcMainDirectory().toPath(),
project.srcTestDirectory().toPath());
var err = pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME));
pmd.inputPaths().clear();
pmd = pmd.addInputPaths(project.srcMainDirectory(), project.srcTestDirectory());
assertThat(pmd.inputPaths()).as("File...").containsExactly(project.srcMainDirectory().toPath(),
project.srcTestDirectory().toPath());
pmd.inputPaths().clear();
pmd = pmd.addInputPathsFiles(List.of(project.srcMainDirectory(), project.srcTestDirectory()));
assertThat(pmd.inputPaths()).as("List(File...)")
.containsExactly(project.srcMainDirectory().toPath(), project.srcTestDirectory().toPath());
pmd.inputPaths().clear();
pmd = pmd.addInputPaths(project.srcMainDirectory().getAbsolutePath(),
project.srcTestDirectory().getAbsolutePath());
assertThat(pmd.inputPaths()).as("String...")
.containsExactly(project.srcMainDirectory().toPath(), project.srcTestDirectory().toPath());
pmd.inputPaths().clear();
pmd = pmd.addInputPathsStrings(
List.of(project.srcMainDirectory().getAbsolutePath(), project.srcTestDirectory().getAbsolutePath()));
assertThat(pmd.inputPaths()).as("List(String...)")
.containsExactly(project.srcMainDirectory().toPath(), project.srcTestDirectory().toPath());
pmd.inputPaths().clear();
pmd = pmd.addInputPaths(project.srcMainDirectory().toPath(), project.srcTestDirectory().toPath());
assertThat(pmd.inputPaths()).as("Path...")
.containsExactly(project.srcMainDirectory().toPath(), project.srcTestDirectory().toPath());
pmd.inputPaths().clear();
pmd = pmd.addInputPaths(List.of(project.srcMainDirectory().toPath(), project.srcTestDirectory().toPath()));
assertThat(pmd.inputPaths()).as("List(Path)")
.containsExactly(project.srcMainDirectory().toPath(), project.srcTestDirectory().toPath());
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME)))
.isGreaterThan(0).isEqualTo(err);
}
@Test
void testAddRuleSets() throws ExitStatusException {
var pmd = new PmdOperation().fromProject(new BaseProject());
assertThat(pmd.ruleSets()).containsExactly(PmdOperation.RULE_SET_DEFAULT);
pmd.addRuleSet(ERROR_PRONE_XML);
assertThat(pmd.ruleSets()).containsExactly(PmdOperation.RULE_SET_DEFAULT, ERROR_PRONE_XML);
var err = pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME));
pmd.ruleSets().clear();
pmd.addRuleSet(List.of(PmdOperation.RULE_SET_DEFAULT, ERROR_PRONE_XML));
assertThat(pmd.ruleSets()).as("collection")
.containsExactly(PmdOperation.RULE_SET_DEFAULT, ERROR_PRONE_XML);
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME)))
.isGreaterThan(0).isEqualTo(err);
}
@Test
void testCache() throws ExitStatusException {
var cache = Path.of("build/pmd/temp-cache");
var pmd = newPmdOperation().ruleSets(CODE_STYLE).inputPaths(CODE_STYLE_SAMPLE).cache(cache);
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isEqualTo(CODING_STYLE_ERRORS);
var pmd = newPmdOperation()
.ruleSets(CODE_STYLE_XML)
.inputPaths(List.of(CODE_STYLE_SAMPLE))
.cache(cache);
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isGreaterThan(0);
var f = cache.toFile();
assertThat(f.exists()).as("file exits").isTrue();
assertThat(f.delete()).as("delete file").isTrue();
@ -75,7 +196,7 @@ class PmdOperationTest {
@Test
void testEncoding() {
PmdOperation pmd = newPmdOperation().ruleSets(CATEGORY_FOO).encoding("UTF-16");
var pmd = newPmdOperation().ruleSets(CATEGORY_FOO).encoding("UTF-16");
PMDConfiguration config = pmd.initConfiguration(COMMAND_NAME);
assertThat(config.getSourceEncoding()).as("UTF-16").isEqualTo(StandardCharsets.UTF_16);
@ -85,20 +206,117 @@ class PmdOperationTest {
}
@Test
void testFailOnValidation() {
var pmd = newPmdOperation().ruleSets("category/java/documentation.xml")
.inputPaths(Path.of("src/test/resources/java/Documentation.java"));
assertThatCode(() -> pmd.failOnViolation(true).performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))
).isInstanceOf(RuntimeException.class).hasMessageContaining('[' + TEST + ']');
void testExcludes() {
var foz = Path.of("foz/baz");
var baz = Path.of("baz/foz");
var pmd = newPmdOperation().ruleSets(CATEGORY_FOO).excludes(PATH_FOO, PATH_BAR);
var config = pmd.initConfiguration(COMMAND_NAME);
assertThat(pmd.excludes()).containsExactly(List.of(PATH_FOO, PATH_BAR).toArray(new Path[0]));
assertThat(config.getExcludes()).containsExactly(List.of(PATH_FOO, PATH_BAR).toArray(new Path[0]));
var excludes = List.of(List.of(PATH_FOO, PATH_BAR), List.of(foz, baz));
for (var exclude : excludes) {
pmd = newPmdOperation().ruleSets(CATEGORY_FOO).excludes(exclude);
config = pmd.initConfiguration(COMMAND_NAME);
assertThat(config.getExcludes()).containsExactly(exclude.toArray(new Path[0]));
}
}
@Test
void testIgnoreFile() {
var pmd = newPmdOperation().ruleSets(ERROR_PRONE, CODE_STYLE).inputPaths(ERROR_PRONE_SAMPLE, CODE_STYLE_SAMPLE)
.ignoreFile(Path.of("src/test/resources/ignore.txt"));
void testExcludesFiles() {
var foz = new File("foz");
var baz = new File("baz");
var pmd = newPmdOperation().ruleSets(CATEGORY_FOO).excludesFiles(FILE_FOO, FILE_BAR);
var config = pmd.initConfiguration(COMMAND_NAME);
assertThat(config.getExcludes()).containsExactly(FILE_FOO.toPath(), FILE_BAR.toPath());
var excludes = List.of(List.of(FILE_FOO, FILE_BAR), List.of(foz, baz));
for (var exclude : excludes) {
pmd = newPmdOperation().ruleSets(CATEGORY_FOO).excludesFiles(exclude);
config = pmd.initConfiguration(COMMAND_NAME);
assertThat(config.getExcludes()).containsExactly(exclude.stream().map(File::toPath).toArray(Path[]::new));
}
}
@Test
void testExcludesStrings() {
var foz = "foz";
var baz = "baz";
var pmd = newPmdOperation().ruleSets(CATEGORY_FOO).excludesStrings(FOO, BAR);
var config = pmd.initConfiguration(COMMAND_NAME);
assertThat(pmd.excludes()).containsExactly(PATH_FOO, PATH_BAR);
assertThat(config.getExcludes()).containsExactly(PATH_FOO, PATH_BAR);
var excludes = List.of(List.of(FOO, BAR), List.of(foz, baz));
for (var exclude : excludes) {
pmd = newPmdOperation().ruleSets(CATEGORY_FOO).excludesStrings(exclude);
config = pmd.initConfiguration(COMMAND_NAME);
assertThat(config.getExcludes()).containsExactly(exclude.stream().map(Paths::get).toArray(Path[]::new));
}
}
@Test
void testExecute() throws ExitStatusException {
var pmd = new PmdOperation().fromProject(new BaseProject());
assertThat(pmd.inputPaths()).containsExactly(Paths.get("src/main").toAbsolutePath(),
Paths.get("src/test").toAbsolutePath());
pmd.inputPaths().clear();
pmd.inputPaths("src/main/java", "src/test/java")
.ruleSets("config/pmd.xml");
assertThat(pmd.ruleSets()).containsExactly("config/pmd.xml");
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isEqualTo(0);
}
@Test
void testExecuteNoProject() {
var pmd = new PmdOperation();
assertThatCode(pmd::execute).isInstanceOf(ExitStatusException.class);
}
@Test
void testFailOnError() {
var pmd = newPmdOperation().ruleSets("src/test/resources/xml/old.xml")
.inputPaths(Path.of("src/test/resources/java/Documentation.java"));
assertThatCode(() -> pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME)))
.isInstanceOf(ExitStatusException.class);
assertThatCode(() -> pmd.failOnError(false).performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME)))
.doesNotThrowAnyException();
}
@Test
void testFailOnValidation() {
var pmd = newPmdOperation().ruleSets(DOCUMENTATION_XML)
.inputPaths(Path.of("src/test/resources/java/Documentation.java"));
assertThatCode(() -> pmd.failOnViolation(true).performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME)))
.isInstanceOf(ExitStatusException.class);
assertThatCode(() -> pmd.failOnViolation(false).performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME)))
.doesNotThrowAnyException();
}
@Test
void testIgnoreFile() throws ExitStatusException {
var pmd = newPmdOperation()
.ruleSets(ERROR_PRONE_XML, CODE_STYLE_XML)
.ignoreFile(Path.of("src/test/resources/ignore.txt"));
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isGreaterThan(0);
pmd.inputPaths().clear();
pmd.inputPaths(ERROR_PRONE_SAMPLE, CODE_STYLE_SAMPLE);
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isEqualTo(0);
pmd.ruleSets().clear();
pmd.inputPaths().clear();
assertThat(pmd.inputPaths(ERROR_PRONE_SAMPLE)
.ignoreFile(new File("src/test/resources/ignore-single.txt"))
.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isEqualTo(0);
}
@Test
void testIncrementalAnalysis() {
var pmd = newPmdOperation().ruleSets(CATEGORY_FOO).incrementalAnalysis(true);
@ -107,133 +325,244 @@ class PmdOperationTest {
}
@Test
void testJavaBestPractices() {
void testInputPaths() throws ExitStatusException {
var pmd = newPmdOperation()
.ruleSets(PmdOperation.RULE_SET_DEFAULT, CODE_STYLE_XML)
.inputPaths(ERROR_PRONE_SAMPLE, CODE_STYLE_SAMPLE);
assertThat(pmd.inputPaths()).as("Path....").containsExactly(ERROR_PRONE_SAMPLE, CODE_STYLE_SAMPLE);
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isGreaterThan(0);
pmd = newPmdOperation()
.ruleSets(PmdOperation.RULE_SET_DEFAULT, CODE_STYLE_XML)
.inputPaths(ERROR_PRONE_SAMPLE.toFile(), CODE_STYLE_SAMPLE.toFile());
assertThat(pmd.inputPaths()).as("File...").containsExactly(ERROR_PRONE_SAMPLE, CODE_STYLE_SAMPLE);
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isGreaterThan(0);
pmd = newPmdOperation()
.ruleSets(PmdOperation.RULE_SET_DEFAULT, CODE_STYLE_XML)
.inputPaths(ERROR_PRONE_SAMPLE.toString(), CODE_STYLE_SAMPLE.toString());
assertThat(pmd.inputPaths()).as("String...").containsExactly(ERROR_PRONE_SAMPLE, CODE_STYLE_SAMPLE);
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isGreaterThan(0);
pmd = newPmdOperation()
.ruleSets(PmdOperation.RULE_SET_DEFAULT, CODE_STYLE_XML)
.inputPathsFiles(List.of(ERROR_PRONE_SAMPLE.toFile(), CODE_STYLE_SAMPLE.toFile()));
assertThat(pmd.inputPaths()).as("List(Path...)").containsExactly(ERROR_PRONE_SAMPLE, CODE_STYLE_SAMPLE);
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isGreaterThan(0);
pmd = newPmdOperation()
.ruleSets(PmdOperation.RULE_SET_DEFAULT, CODE_STYLE_XML)
.inputPathsStrings(List.of(ERROR_PRONE_SAMPLE.toString(), CODE_STYLE_SAMPLE.toString()));
assertThat(pmd.inputPaths()).as("List(String...)").containsExactly(ERROR_PRONE_SAMPLE, CODE_STYLE_SAMPLE);
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isGreaterThan(0);
}
@Test
void testJavaBestPractices() throws ExitStatusException {
var pmd = newPmdOperation().ruleSets("category/java/bestpractices.xml")
.inputPaths(Path.of("src/test/resources/java/BestPractices.java"));
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isEqualTo(11);
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isGreaterThan(0);
}
@Test
void testJavaCodeStyle() {
var pmd = newPmdOperation().ruleSets(CODE_STYLE).inputPaths(CODE_STYLE_SAMPLE);
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isEqualTo(CODING_STYLE_ERRORS);
void testJavaCodeStyle() throws ExitStatusException {
var pmd = newPmdOperation().ruleSets(CODE_STYLE_XML).inputPaths(CODE_STYLE_SAMPLE);
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isGreaterThan(0);
}
@Test
void testJavaCodeStyleAndErrorProne() {
var pmd = newPmdOperation().ruleSets(CODE_STYLE).inputPaths(CODE_STYLE_SAMPLE);
void testJavaCodeStyleAndErrorProne() throws ExitStatusException {
var pmd = newPmdOperation().ruleSets(CODE_STYLE_XML).inputPaths(CODE_STYLE_SAMPLE);
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME)))
.as("code style").isEqualTo(CODING_STYLE_ERRORS);
pmd = pmd.addRuleSet(ERROR_PRONE).addInputPath(ERROR_PRONE_SAMPLE);
.as("code style").isGreaterThan(0);
pmd = pmd.ruleSets(ERROR_PRONE_XML).inputPaths(ERROR_PRONE_SAMPLE);
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME)))
.as("code style + error prone").isEqualTo(34);
.as("code style + error prone").isGreaterThan(0);
}
@Test
void testJavaDesign() {
var pmd = newPmdOperation().ruleSets("category/java/design.xml")
.inputPaths(Path.of("src/test/resources/java/Design.java"))
.cache(Path.of("build/pmd/design-cache"));
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isEqualTo(4);
void testJavaDesign() throws ExitStatusException {
var pmd = newPmdOperation()
.ruleSets(DESIGN_XML)
.inputPaths("src/test/resources/java/Design.java")
.cache(new File("build/pmd/design-cache"));
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isGreaterThan(0);
}
@Test
void testJavaDocumentation() {
var pmd = newPmdOperation().ruleSets("category/java/documentation.xml")
void testJavaDocumentation() throws ExitStatusException {
var pmd = newPmdOperation()
.ruleSets(DOCUMENTATION_XML)
.inputPaths(Path.of("src/test/resources/java/Documentation.java"));
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isEqualTo(4);
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isGreaterThan(0);
}
@Test
void testJavaErrorProne() {
var pmd = newPmdOperation().ruleSets(ERROR_PRONE).inputPaths(ERROR_PRONE_SAMPLE);
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isEqualTo(ERROR_PRONE_ERRORS);
void testJavaErrorProne() throws ExitStatusException {
var pmd = newPmdOperation().ruleSets(ERROR_PRONE_XML).inputPaths(ERROR_PRONE_SAMPLE);
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isGreaterThan(0);
}
@Test
void testJavaMultiThreading() {
void testJavaMultiThreading() throws ExitStatusException {
var pmd = newPmdOperation().ruleSets("category/java/multithreading.xml")
.inputPaths(Path.of("src/test/resources/java/MultiThreading.java"));
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isEqualTo(3);
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isGreaterThan(0);
}
@Test
void testJavaPerformance() {
var pmd = newPmdOperation().ruleSets("category/java/performance.xml")
void testJavaPerformance() throws ExitStatusException {
var pmd = newPmdOperation()
.ruleSets(PERFORMANCE_XML)
.inputPaths(Path.of("src/test/resources/java/Performance.java"));
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isEqualTo(9);
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isGreaterThan(0);
}
@Test
void testJavaQuickStart() {
var pmd = newPmdOperation().ruleSets("rulesets/java/quickstart.xml")
.inputPaths(Path.of("src/test/resources/java"));
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isEqualTo(34);
void testJavaQuickStart() throws ExitStatusException {
var pmd = newPmdOperation().ruleSets(PmdOperation.RULE_SET_DEFAULT)
.inputPaths(new File("src/test/resources/java/"));
assertThat(pmd.ruleSets()).containsExactly(PmdOperation.RULE_SET_DEFAULT);
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isGreaterThan(0);
}
@Test
void testJavaSecurity() {
var pmd = newPmdOperation().ruleSets("category/java/security.xml")
void testJavaSecurity() throws ExitStatusException {
var pmd = newPmdOperation().ruleSets(SECURITY_XML)
.inputPaths(Path.of("src/test/resources/java/Security.java"));
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isEqualTo(1);
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isGreaterThan(0);
}
@Test
void testMainOperation() {
var pmd = newPmdOperation().inputPaths(Path.of("src/main"))
void testLanguageVersions() throws ExitStatusException {
var language = LanguageRegistry.PMD.getLanguageById("java");
assertThat(language).isNotNull();
var pmd = newPmdOperation()
.forceLanguageVersion(language.getLatestVersion())
.defaultLanguageVersions(language.getVersions())
.languageVersions(language.getDefaultVersion())
.ruleSets(PmdOperation.RULE_SET_DEFAULT);
assertThat(pmd.languageVersions()).contains(language.getDefaultVersion());
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isGreaterThan(0);
assertThat(pmd.defaultLanguageVersions(language.getVersion("17"), language.getVersion("21"))
.languageVersions(language.getVersions()).performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME)))
.as("17 & 21").isGreaterThan(0);
}
@Test
void testMainOperation() throws ExitStatusException {
var pmd = newPmdOperation().inputPaths(new File("src/main"))
.performPmdAnalysis(TEST, newPmdOperation().initConfiguration(COMMAND_NAME));
assertThat(pmd).isEqualTo(0);
}
@Test
void testRelativizeRoots() {
var foo = Path.of("foo/bar");
var bar = Path.of("bar/foo");
var pmd = newPmdOperation().ruleSets(CATEGORY_FOO).relativizeRoots(foo).addRelativizeRoot(bar);
var config = pmd.initConfiguration(COMMAND_NAME);
assertThat(config.getRelativizeRoots()).contains(foo).contains(bar);
void testPrependAuxClasspath() {
var pmd = newPmdOperation().ruleSets(CATEGORY_FOO).prependAuxClasspath(FOO, BAR);
assertThat(pmd.prependAuxClasspath()).isEqualTo(FOO + File.pathSeparator + BAR);
}
@Test
void testReportFormat() throws IOException {
var pmd = newPmdOperation().ruleSets(ERROR_PRONE).reportFormat("xml").inputPaths(ERROR_PRONE_SAMPLE);
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isEqualTo(ERROR_PRONE_ERRORS);
try (var br = Files.newBufferedReader(pmd.reportFile_)) {
assertThat(br.readLine()).as("xml report").startsWith("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
}
}
@Test
void testRuleSetsConfigFile() {
var pmd = newPmdOperation().ruleSets("src/test/resources/pmd.xml")
.ignoreFile(Path.of("src/test/resources/ignore-all.txt"));
void testPriority() throws ExitStatusException {
var pmd = newPmdOperation().inputPaths(CODE_STYLE_SAMPLE).minimumPriority(RulePriority.HIGH);
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isEqualTo(0);
}
@Test
void testRuleSetsEmpty() {
var pmd = newPmdOperation().ruleSets("");
void testRelativizeRoots() {
var baz = Path.of("baz/foz");
var pmd = newPmdOperation().ruleSets(List.of(CATEGORY_FOO)).relativizeRoots(PATH_FOO).
relativizeRoots(PATH_BAR.toFile()).relativizeRoots(baz.toString())
.relativizeRoots(List.of(PATH_FOO, PATH_BAR, baz));
var config = pmd.initConfiguration(COMMAND_NAME);
assertThat(config.getRelativizeRoots()).isEqualTo(pmd.relativizeRoots())
.containsExactly(PATH_FOO, PATH_BAR, baz, PATH_FOO, PATH_BAR, baz);
pmd = newPmdOperation().ruleSets(List.of(CATEGORY_FOO))
.relativizeRootsFiles(List.of(PATH_FOO.toFile(), PATH_BAR.toFile(), baz.toFile()));
config = pmd.initConfiguration(COMMAND_NAME);
assertThat(config.getRelativizeRoots()).as("List(File...)").isEqualTo(pmd.relativizeRoots())
.containsExactly(PATH_FOO, PATH_BAR, baz);
pmd = newPmdOperation().ruleSets(List.of(CATEGORY_FOO))
.relativizeRootsStrings(List.of(PATH_FOO.toString(), PATH_BAR.toString(), baz.toString()));
config = pmd.initConfiguration(COMMAND_NAME);
assertThat(config.getRelativizeRoots()).as("List(String....)").isEqualTo(pmd.relativizeRoots())
.containsExactly(PATH_FOO, PATH_BAR, baz);
}
@Test
void testReportFile() throws FileNotFoundException, ExitStatusException {
var report = new File("build", "pmd-report-file");
report.deleteOnExit();
var pmd = newPmdOperation().ruleSets(List.of(ERROR_PRONE_XML, DESIGN_XML)).reportFile(report);
pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME));
assertThat(report).exists();
try (var writer = new PrintWriter(report)) {
writer.write("");
}
assertThat(report).isEmpty();
pmd.reportFile(report.getAbsolutePath()).performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME));
assertThat(report).isNotEmpty();
}
@Test
void testReportFormat() throws IOException, ExitStatusException {
var pmd = newPmdOperation().ruleSets(ERROR_PRONE_XML).reportFormat("xml").inputPaths(ERROR_PRONE_SAMPLE);
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isGreaterThan(0);
try (var softly = new AutoCloseableSoftAssertions()) {
try (var br = Files.newBufferedReader(pmd.reportFile())) {
softly.assertThat(br.readLine()).as("xml report")
.startsWith("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
}
}
}
@Test
void testReportProperties() throws ExitStatusException {
var pmd = newPmdOperation().ruleSets(CODE_STYLE_XML, ERROR_PRONE_XML)
.includeLineNumber(true)
.reportProperties(new Properties());
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isGreaterThan(0);
}
@Test
void testRuleSetsConfigFile() throws ExitStatusException {
var pmd = newPmdOperation().ruleSets("src/test/resources/pmd.xml")
.ignoreFile("src/test/resources/ignore-all.txt");
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isEqualTo(0);
}
@Test
void testRuleSetsEmpty() throws ExitStatusException {
var pmd = newPmdOperation().ruleSets("").failOnError(false);
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isEqualTo(0);
}
@Test
void testShowSuppressed() {
var pmd = newPmdOperation().ruleSets(ERROR_PRONE).showSuppressed(true);
var pmd = newPmdOperation().ruleSets(ERROR_PRONE_XML).showSuppressed(true);
var config = pmd.initConfiguration(COMMAND_NAME);
assertThat(config.isShowSuppressedViolations()).isTrue();
}
@Test
void testSuppressedMarker() {
var pmd = newPmdOperation().ruleSets(ERROR_PRONE).suppressedMarker(TEST);
var pmd = newPmdOperation().ruleSets(ERROR_PRONE_XML).suppressedMarker(TEST);
var config = pmd.initConfiguration(COMMAND_NAME);
assertThat(config.getSuppressMarker()).isEqualTo(TEST);
}
@Test
void testThreads() {
var pmd = newPmdOperation().ruleSets(ERROR_PRONE).threads(5);
var pmd = newPmdOperation().ruleSets(ERROR_PRONE_XML).threads(5);
var config = pmd.initConfiguration(COMMAND_NAME);
assertThat(config.getThreads()).isEqualTo(5);
}
@ -241,15 +570,15 @@ class PmdOperationTest {
@Test
void testUri() throws URISyntaxException {
var uri = new URI("https://example.com");
var pmd = newPmdOperation().ruleSets(ERROR_PRONE).uri(uri);
var pmd = newPmdOperation().ruleSets(ERROR_PRONE_XML).uri(uri);
var config = pmd.initConfiguration(COMMAND_NAME);
assertThat(config.getUri()).isEqualTo(uri);
}
@Test
void testXml() {
var pmd = newPmdOperation().inputPaths(Path.of("src/test/resources/pmd.xml"))
void testXml() throws ExitStatusException {
var pmd = newPmdOperation().addInputPaths("src/test/resources/pmd.xml")
.ruleSets("src/test/resources/xml/basic.xml");
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isEqualTo(0);
assertThat(pmd.performPmdAnalysis(TEST, pmd.initConfiguration(COMMAND_NAME))).isGreaterThan(0);
}
}

View file

@ -0,0 +1 @@
src/test/resources/java/ErrorProne.java

View file

@ -1,7 +1,7 @@
<?xml version="1.0"?>
<ruleset name="test"
<ruleset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
name="test"
xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 https://pmd.sourceforge.io/ruleset_2_0_0.xsd">
<description>Erik's Ruleset</description>
<!-- BEST PRACTICES -->

View file

@ -1,8 +1,8 @@
<?xml version="1.0"?>
<ruleset name="Basic"
<ruleset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
name="Basic"
xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 https://pmd.sourceforge.io/ruleset_2_0_0.xsd">
<description>
The Basic ruleset contains a collection of good practices which should be followed.

View file

@ -0,0 +1,8 @@
<?xml version="1.0"?>
<ruleset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
name="old"
xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 https://pmd.sourceforge.io/ruleset_2_0_0.xsd">
<description>Deprecated (old) rule</description>
<rule ref="category/java/performance.xml/UnnecessaryWrapperObjectCreation"/>
</ruleset>