Compare commits

...

38 commits
0.9.5 ... main

Author SHA1 Message Date
ea10fd012f
Disable cleanPath() for testing 2025-03-24 19:01:12 -07:00
69a9eac414
Add baseline file for testing 2025-03-24 17:36:30 -07:00
5a2824507f
Removed paths quoting 2025-03-24 16:12:15 -07:00
3e350e617a
Bump detekt extension to version 0.9.10-SNAPSHOT 2025-03-24 16:11:11 -07:00
432e5ffed1
Enable extension logging in examples 2025-03-24 16:09:45 -07:00
e6d5c6c38f
Quote and clean path in the process command list 2025-03-24 10:06:41 -07:00
7d5b50641c
Add OS matrix to test the project and examples on Ubuntu, Windows and macOS 2025-03-24 01:44:39 -07:00
30f92d1262
Bump Kotlin extension to version 1.1.0-SNAPSHOT 2025-03-24 01:39:53 -07:00
8d4643d99a
Bump Kotlin to version 2.1.20 2025-03-24 01:38:50 -07:00
0efd5ab2fe
JDK 24 2025-03-18 23:34:19 -07:00
3df50c2e79
Add generic installation instructions 2025-03-18 13:07:29 -07:00
012cd14067
Bump PMD extension to version 1.2.1 2025-03-18 13:06:22 -07:00
e39302bf8b
Bump JUnit to version 5.12.1 2025-03-18 13:06:07 -07:00
41d6667dca
Bump bld to version 2.2.1 2025-02-24 22:48:05 -08:00
7386332361
Version 0.9.9 2025-02-23 16:32:20 -08:00
95971222f9
Bump Detekt to version 1.23.8 2025-02-23 16:29:33 -08:00
ae53af2ba6
Bump PMD extension to version 1.2.0 2025-02-23 15:44:28 -08:00
7ad511a40c
Bump JUnit to version 5.12.0 2025-02-23 15:44:28 -08:00
1115acaad4
Update pages actions to the latest versions 2025-02-23 15:44:27 -08:00
d6f424972a
Version 0.9.8 2025-01-14 12:09:51 -08:00
99691fb2e9
Fixed BaseProjectBlueprint init in tests 2025-01-14 00:08:10 -08:00
48952f505f
Updated copyright for 2025 2025-01-14 00:05:55 -08:00
93d963398b
Bumped bld to version 2.2.0 2025-01-14 00:04:44 -08:00
1bef03ec79
Bumped AssertJ to version 3.27.2 2025-01-14 00:04:14 -08:00
d1f4a614fe
Bumped Kotlin extension to version 1.0.4 2025-01-14 00:03:46 -08:00
33774b8a93
Updated extensions
Bumped Kotlin extension to version 1.0.3
Bumped PMD extension to version 1.1.9
2024-12-28 17:46:39 -08:00
cbe95f7cc2
Bumped Kotlin to version 2.1.0 2024-12-28 17:45:36 -08:00
c993a3ab14
Bumped AssertJ to version 3.27.0 2024-12-28 17:44:36 -08:00
5b6181825d
Bumped JUnit to version 5.11.4 2024-12-28 17:43:40 -08:00
e04f46287b
Updated dependencies
Bumped JUnit version to 5.11.3
Bumped PMD extension version to 1.1.7
Bumped JDK to version 23 (GitHub CI Workflow)
Bumped Kotlin to version 2.0.21
Bumped Kotlin extension to version 1.0.2
2024-10-27 17:03:26 -07:00
a1eb4cea1d
Bumped bld to version 1.23.7 2024-09-08 18:35:57 -07:00
21bd30166d
Version 0.9.6 2024-08-30 16:59:15 -07:00
e9f3079911
More API cleanups 2024-08-30 16:59:02 -07:00
158167bebd
Bumped bld to version 2.1.0 2024-08-30 16:55:52 -07:00
324fc48c40
Cleaned up API to match bld operations and options APIs 2024-08-28 00:12:55 -07:00
c6307577aa
Bumped Kotlin to version 2.0.20 2024-08-28 00:12:35 -07:00
0a989544ae
Bumped JUnit to version 5.11.0 2024-08-28 00:12:18 -07:00
cf385a58cb
Bumped Kotlin to version 2.0.10 2024-08-09 17:59:02 -07:00
27 changed files with 549 additions and 125 deletions

View file

@ -4,11 +4,13 @@ on: [push, pull_request, workflow_dispatch]
jobs:
build-bld-project:
runs-on: ubuntu-latest
strategy:
matrix:
java-version: [17, 21, 22]
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
@ -22,12 +24,16 @@ jobs:
distribution: "zulu"
java-version: ${{ matrix.java-version }}
- name: Download dependencies
run: ./bld download
- name: Download dependencies [examples]
working-directory: examples
run: ./bld download
- name: Run Detekt [examples]
working-directory: examples
run: ./bld compile test-ci
- name: Download dependencies
run: ./bld download
- name: Run tests
run: ./bld compile test

View file

@ -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/"
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v1
uses: actions/deploy-pages@v4

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-2.0.1.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-2.0.1-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

@ -8,7 +8,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

@ -8,7 +8,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

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

View file

@ -3,12 +3,20 @@
[![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/2.0.1-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-detekt/maven-metadata.xml?color=blue)](https://repo.rife2.com/#/releases/com/uwyn/rife2/bld-detekt)
[![Snapshot](https://flat.badgen.net/maven/v/metadata-url/repo.rife2.com/snapshots/com/uwyn/rife2/bld-detekt/maven-metadata.xml?label=snapshot)](https://repo.rife2.com/#/snapshots/com/uwyn/rife2/bld-detekt)
[![GitHub CI](https://github.com/rife2/bld-detekt/actions/workflows/bld.yml/badge.svg)](https://github.com/rife2/bld-detekt/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:
```properties
bld.extension-detekt=com.uwyn.rife2:bld-detekt
```
For more information, please refer to the [extensions](https://github.com/rife2/bld/wiki/Extensions) documentation.
## Check Source Code with Detekt
To check all Kotlin source code located in the project, add the following to your build file:
```java

View file

@ -7,9 +7,9 @@
<!-- BEST PRACTICES -->
<rule ref="category/java/bestpractices.xml">
<exclude name="AvoidPrintStackTrace"/>
<exclude name="JUnit4TestShouldUseTestAnnotation"/>
<exclude name="JUnitTestContainsTooManyAsserts"/>
<exclude name="GuardLogStatement"/>
<exclude name="UnitTestContainsTooManyAsserts"/>
<exclude name="UnitTestShouldUseTestAnnotation"/>
</rule>
<rule ref="category/java/bestpractices.xml/MissingOverride">

6
examples/.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>

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-2.0.1.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-2.0.1-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

@ -8,7 +8,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

@ -8,7 +8,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

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

Binary file not shown.

View file

@ -1,8 +1,8 @@
bld.downloadExtensionJavadoc=false
bld.downloadExtensionSources=true
bld.downloadLocation=
bld.extension-detekt=com.uwyn.rife2:bld-detekt:0.9.5
bld.extension-kotlin=com.uwyn.rife2:bld-kotlin:1.0.0
bld.extension-detekt=com.uwyn.rife2:bld-detekt:0.9.10-SNAPSHOT
bld.extension-kotlin=com.uwyn.rife2:bld-kotlin:1.1.0-SNAPSHOT
bld.repositories=MAVEN_LOCAL,MAVEN_CENTRAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES
bld.sourceDirectories=
bld.version=2.0.1
bld.version=2.2.1

View file

@ -31,13 +31,14 @@ public class ExampleBuild extends Project {
repositories = List.of(MAVEN_LOCAL, MAVEN_CENTRAL, RIFE2_RELEASES);
final var kotlin = version(2, 0, 0);
final var kotlin = version(2, 1, 20);
scope(compile)
.include(dependency("org.jetbrains.kotlin", "kotlin-stdlib", kotlin));
scope(test)
.include(dependency("org.jetbrains.kotlin", "kotlin-test-junit5", kotlin))
.include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 10, 3)))
.include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 10, 3)));
.include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 12, 1)))
.include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 12, 1)))
.include(dependency("org.junit.platform", "junit-platform-launcher", version(1, 12, 1)));
// Include the Kotlin source directory when creating or publishing sources Java Archives
jarSourcesOperation().sourceDirectories(new File(srcMainDirectory(), "kotlin"));
@ -45,14 +46,14 @@ public class ExampleBuild extends Project {
public static void main(String[] args) {
// Enable detailed logging
// var level = Level.ALL;
// var logger = Logger.getLogger("rife.bld.extension");
// var consoleHandler = new ConsoleHandler();
//
// consoleHandler.setLevel(level);
// logger.addHandler(consoleHandler);
// logger.setLevel(level);
// logger.setUseParentHandlers(false);
var level = Level.ALL;
var logger = Logger.getLogger("rife.bld.extension");
var consoleHandler = new ConsoleHandler();
consoleHandler.setLevel(level);
logger.addHandler(consoleHandler);
logger.setLevel(level);
logger.setUseParentHandlers(false);
new ExampleBuild().start(args);
}
@ -100,4 +101,13 @@ public class ExampleBuild extends Project {
.input("src/test/kotlin")
.execute();
}
@BuildCommand(value = "test-ci", summary = "Run detek with a test baseline")
public void testCi() throws ExitStatusException, IOException, InterruptedException {
// Run detek with the test basline (for CI testing)
new DetektOperation()
.fromProject(this)
.baseline("src/test/resources/detekt-baseline.xml")
.execute();
}
}

View file

@ -0,0 +1,12 @@
<?xml version="1.0" ?>
<SmellBaseline>
<ManuallySuppressedIssues/>
<CurrentIssues>
<ID>EmptyIfBlock:Example.kt$Example.Companion${ }</ID>
<ID>MagicNumber:Example.kt$Example$5</ID>
<ID>NewLineAtEndOfFile:ExampleTest.kt$com.example.ExampleTest.kt</ID>
<ID>ThrowingExceptionsWithoutMessageOrCause:Example.kt$Example.Companion$IllegalStateException()</ID>
<ID>UseCheckOrError:Example.kt$Example.Companion$throw IllegalStateException()</ID>
<ID>VariableNaming:Example.kt$Example$// https://detekt.dev/docs/rules/naming#variablenaming val Message: String get() = "Hello World!"</ID>
</CurrentIssues>
</SmellBaseline>

Binary file not shown.

View file

@ -1,8 +1,8 @@
bld.downloadExtensionJavadoc=false
bld.downloadExtensionSources=true
bld.downloadLocation=
bld.extension-exec=com.uwyn.rife2:bld-exec:1.0.2
bld.extension-pmd=com.uwyn.rife2:bld-pmd:1.1.4
bld.extension-exec=com.uwyn.rife2:bld-exec:1.0.4
bld.extension-pmd=com.uwyn.rife2:bld-pmd:1.2.1
bld.repositories=MAVEN_CENTRAL,MAVEN_LOCAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES
bld.sourceDirectories=
bld.version=2.0.1
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.
@ -23,6 +23,7 @@ import rife.bld.publish.PublishLicense;
import rife.bld.publish.PublishScm;
import java.util.List;
import java.util.Locale;
import static rife.bld.dependencies.Repository.*;
import static rife.bld.dependencies.Scope.compile;
@ -33,20 +34,22 @@ public class DetektOperationBuild extends Project {
public DetektOperationBuild() {
pkg = "rife.bld.extension";
name = "DetektOperation";
version = version(0, 9, 5);
version = version(0, 9, 10, "SNAPSHOT");
javaRelease = 17;
downloadSources = true;
autoDownloadPurge = true;
repositories = List.of(MAVEN_LOCAL, MAVEN_CENTRAL, RIFE2_RELEASES, RIFE2_SNAPSHOTS);
scope(compile)
.include(dependency("com.uwyn.rife2", "bld", version(2, 0, 1)))
.include(dependency("io.gitlab.arturbosch.detekt", "detekt-cli", version(1, 23, 6)));
.include(dependency("com.uwyn.rife2", "bld", version(2, 2, 1)))
.include(dependency("io.gitlab.arturbosch.detekt", "detekt-cli", version(1, 23, 8)));
scope(test)
.include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 10, 3)))
.include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 10, 3)))
.include(dependency("org.assertj", "assertj-core", version(3, 26, 3)));
.include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 12, 1)))
.include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 12, 1)))
.include(dependency("org.assertj", "assertj-core", version(3, 27, 3)));
javadocOperation()
.javadocOptions()
.author()
@ -56,25 +59,23 @@ public class DetektOperationBuild extends Project {
publishOperation()
.repository(version.isSnapshot() ? repository("rife2-snapshot") : repository("rife2"))
.repository(repository("github"))
.info()
.groupId("com.uwyn.rife2")
.artifactId("bld-detekt")
.description("bld Detekt Extension")
.url("https://github.com/rife2/bld-detekt")
.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("https://www.apache.org/licenses/LICENSE-2.0.txt")
)
.scm(
new PublishScm()
.scm(new PublishScm()
.connection("scm:git:https://github.com/rife2/bld-detekt.git")
.developerConnection("scm:git:git@github.com:rife2/bld-detekt.git")
.url("https://github.com/rife2/bld-detekt")
@ -97,10 +98,13 @@ public class DetektOperationBuild extends Project {
@Override
public void test() throws Exception {
var os = System.getProperty("os.name");
if (os != null && os.toLowerCase(Locale.US).contains("linux")) {
new ExecOperation()
.fromProject(this)
.command("scripts/cliargs.sh")
.execute();
}
super.test();
}

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.
@ -24,8 +24,8 @@ import rife.bld.operations.exceptions.ExitStatusException;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.logging.Level;
@ -48,14 +48,14 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
"kotlin-reflect-",
"kotlin-script-runtime-",
"kotlin-stdlib-",
"kotlin-stdlib-jdk7-",
"kotlin-stdlib-jdk8-",
"kotlinx-coroutines-",
"kotlinx-html-jvm-",
"kotlinx-serialization-",
"poko-annotations-jvm-",
"sarif4k-jvm-",
"snakeyaml-engine-",
"trove4j-");
private static final Logger LOGGER = Logger.getLogger(Report.class.getName());
private static final Logger LOGGER = Logger.getLogger(DetektOperation.class.getName());
private final Collection<File> classpath_ = new ArrayList<>();
private final Collection<File> config_ = new ArrayList<>();
private final Collection<String> excludes_ = new ArrayList<>();
@ -128,8 +128,28 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
* @return this operation instance
*/
public DetektOperation basePath(File path) {
basePath_ = path.getAbsolutePath();
return this;
return basePath(path.getAbsolutePath());
}
/**
* Retrieves the base path.
*
* @return the directory path
*/
public String basePath() {
return basePath_;
}
/**
* Specifies a directory as the base path. Currently, it impacts all file
* paths in the formatted reports. File paths in console output and txt
* report are not affected and remain as absolute paths.
*
* @param path the directory path
* @return this operation instance
*/
public DetektOperation basePath(Path path) {
return basePath(path.toFile().getAbsolutePath());
}
/**
@ -152,8 +172,27 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
* @return this operation instance
*/
public DetektOperation baseline(File baseline) {
baseline_ = baseline.getAbsolutePath();
return this;
return baseline(baseline.getAbsolutePath());
}
/**
* If a baseline xml file is passed in, only new code smells not in the
* baseline are printed in the console.
*
* @param baseline the baseline xml file
* @return this operation instance
*/
public DetektOperation baseline(Path baseline) {
return baseline(baseline.toFile().getAbsolutePath());
}
/**
* Retrieves the baseline xml file.
*
* @return the baseline xml file
*/
public String baseline() {
return baseline_;
}
/**
@ -175,10 +214,10 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
*
* @param paths one or more files
* @return this operation instance
* @see #classPath(Collection)
*/
public DetektOperation classPath(File... paths) {
classpath_.addAll(List.of(paths));
return this;
return classPath(List.of(paths));
}
/**
@ -187,10 +226,22 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
*
* @param paths one or more files
* @return this operation instance
* @see #classPathPaths(Collection)
*/
public DetektOperation classPath(Path... paths) {
return classPathPaths(List.of(paths));
}
/**
* EXPERIMENTAL: Paths where to find user class files and jar dependencies.
* Used for type resolution.
*
* @param paths one or more files
* @return this operation instance
* @see #classPathStrings(Collection)
*/
public DetektOperation classPath(String... paths) {
classpath_.addAll(Arrays.stream(paths).map(File::new).toList());
return this;
return classPathStrings(List.of(paths));
}
@ -200,6 +251,7 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
*
* @param paths the paths
* @return this operation instance
* @see #classPath(File...)
*/
public DetektOperation classPath(Collection<File> paths) {
classpath_.addAll(paths);
@ -216,14 +268,27 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
}
/**
* Paths to the config files ({@code path/to/config.yml}).
* EXPERIMENTAL: Paths where to find user class files and jar dependencies.
* Used for type resolution.
*
* @param configs one or more config files
* @param paths the paths
* @return this operation instance
* @see #classPath(Path...)
*/
public DetektOperation config(File... configs) {
config_.addAll(List.of(configs));
return this;
public DetektOperation classPathPaths(Collection<Path> paths) {
return classPath(paths.stream().map(Path::toFile).toList());
}
/**
* EXPERIMENTAL: Paths where to find user class files and jar dependencies.
* Used for type resolution.
*
* @param paths the paths
* @return this operation instance
* @see #classPath(String...)
*/
public DetektOperation classPathStrings(Collection<String> paths) {
return classPath(paths.stream().map(File::new).toList());
}
/**
@ -231,10 +296,32 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
*
* @param configs one or more config files
* @return this operation instance
* @see #config(Collection)
*/
public DetektOperation config(File... configs) {
return config(List.of(configs));
}
/**
* Paths to the config files ({@code path/to/config.yml}).
*
* @param configs one or more config files
* @return this operation instance
* @see #configPaths(Collection)
*/
public DetektOperation config(Path... configs) {
return configPaths(List.of(configs));
}
/**
* Paths to the config files ({@code path/to/config.yml}).
*
* @param configs one or more config files
* @return this operation instance
* @see #configStrings(Collection)
*/
public DetektOperation config(String... configs) {
config_.addAll(Arrays.stream(configs).map(File::new).toList());
return this;
return configStrings(List.of(configs));
}
/**
@ -242,6 +329,7 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
*
* @param configs the config files
* @return this operation instance
* @see #config(File...)
*/
public DetektOperation config(Collection<File> configs) {
config_.addAll(configs);
@ -257,6 +345,17 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
return config_;
}
/**
* Paths to the config files ({@code path/to/config.yml}).
*
* @param configs the config files
* @return this operation instance
* @see #config(Path...)
*/
public DetektOperation configPaths(Collection<Path> configs) {
return config(configs.stream().map(Path::toFile).toList());
}
/**
* Path to the config resource on detekt's classpath ({@code path/to/config.yml}).
*
@ -275,7 +374,37 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
* @return this operation instance
*/
public DetektOperation configResource(File resource) {
configResource_ = resource.getAbsolutePath();
return configResource(resource.getAbsolutePath());
}
/**
* Path to the config resource on detekt's classpath ({@code path/to/config.yml}).
*
* @param resource the config resource path
* @return this operation instance
*/
public DetektOperation configResource(Path resource) {
return configResource(resource.toFile().getAbsolutePath());
}
/**
* Retrieves the path of the config resource.
*
* @return the config resource path
*/
public String configResource() {
return configResource_;
}
/**
* Paths to the config files ({@code path/to/config.yml}).
*
* @param configs the config files
* @return this operation instance
* @see #config(String...)
*/
public DetektOperation configStrings(Collection<String> configs) {
config_.addAll(configs.stream().map(File::new).toList());
return this;
}
@ -320,8 +449,7 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
* @return this operation instance
*/
public DetektOperation excludes(String... patterns) {
excludes_.addAll(List.of(patterns));
return this;
return excludes(List.of(patterns));
}
/**
@ -573,7 +701,7 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
}
}
}
return String.join(":", jars);
return String.join(File.pathSeparator, jars);
}
/**
@ -584,8 +712,7 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
* @return this operation instance
*/
public DetektOperation includes(String... patterns) {
includes_.addAll(List.of(patterns));
return this;
return includes(List.of(patterns));
}
/**
@ -614,6 +741,7 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
*
* @param paths the paths
* @return this operation instance
* @see #input(Collection)
*/
public DetektOperation input(Collection<File> paths) {
input_.addAll(paths);
@ -625,10 +753,10 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
*
* @param paths one or more paths
* @return this operation instance
* @see #inputStrings(Collection)
*/
public DetektOperation input(String... paths) {
input_.addAll(Arrays.stream(paths).map(File::new).toList());
return this;
return inputStrings(List.of(paths));
}
/**
@ -636,12 +764,22 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
*
* @param paths one or more paths
* @return this operation instance
* @see #input(Collection)
*/
public DetektOperation input(File... paths) {
input_.addAll(List.of(paths));
return this;
return input(List.of(paths));
}
/**
* Input paths to analyze. If not specified the current working directory is used.
*
* @param paths one or more paths
* @return this operation instance
* @see #inputPaths(Collection)
*/
public DetektOperation input(Path... paths) {
return inputPaths(List.of(paths));
}
/**
* Returns the input paths to analyze.
@ -652,6 +790,28 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
return input_;
}
/**
* Input paths to analyze. If not specified the current working directory is used.
*
* @param paths the paths
* @return this operation instance
* @see #input(Path...)
*/
public DetektOperation inputPaths(Collection<Path> paths) {
return input(paths.stream().map(Path::toFile).toList());
}
/**
* Input paths to analyze. If not specified the current working directory is used.
*
* @param paths the paths
* @return this operation instance
* @see #input(String...)
*/
public DetektOperation inputStrings(Collection<String> paths) {
return input(paths.stream().map(File::new).toList());
}
/*
* Determines if a string is not blank.
*/
@ -729,10 +889,10 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
*
* @param jars one or more jars
* @return this operation instance
* @see #pluginsStrings(Collection)
*/
public DetektOperation plugins(String... jars) {
plugins_.addAll(Arrays.stream(jars).map(File::new).toList());
return this;
return pluginsStrings(List.of(jars));
}
/**
@ -740,10 +900,21 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
*
* @param jars one or more jars
* @return this operation instance
* @see #plugins(Collection)
*/
public DetektOperation plugins(File... jars) {
plugins_.addAll(List.of(jars));
return this;
return plugins(List.of(jars));
}
/**
* Extra paths to plugin jars.
*
* @param jars one or more jars
* @return this operation instance
* @see #pluginsPaths(Collection)
*/
public DetektOperation plugins(Path... jars) {
return pluginsPaths(List.of(jars));
}
/**
@ -751,6 +922,7 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
*
* @param jars the jars paths
* @return this operation instance
* @see #input(File...)
*/
public DetektOperation plugins(Collection<File> jars) {
plugins_.addAll(jars);
@ -766,6 +938,28 @@ public class DetektOperation extends AbstractProcessOperation<DetektOperation> {
return plugins_;
}
/**
* Extra paths to plugin jars.
*
* @param jars the jars paths
* @return this operation instance
* @see #plugins(Path...)
*/
public DetektOperation pluginsPaths(Collection<Path> jars) {
return plugins(jars.stream().map(Path::toFile).toList());
}
/**
* Extra paths to plugin jars.
*
* @param jars the jars paths
* @return this operation instance
* @see #plugins(String...)
*/
public DetektOperation pluginsStrings(Collection<String> jars) {
return plugins(jars.stream().map(File::new).toList());
}
/**
* Generates a report for given {@link ReportId report-id} and stores it on given 'path'.
*

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.

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.

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,8 +16,11 @@
package rife.bld.extension;
import org.assertj.core.api.AutoCloseableSoftAssertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledOnOs;
import org.junit.jupiter.api.condition.OS;
import rife.bld.BaseProject;
import rife.bld.blueprints.BaseProjectBlueprint;
import rife.bld.extension.detekt.Report;
@ -61,6 +64,37 @@ class DetektOperationTest {
}
@Test
void testBasePath() {
var foo = new File("foo");
var bar = new File("bar");
var op = new DetektOperation().basePath(foo);
assertThat(op.basePath()).as("as file").isEqualTo(foo.getAbsolutePath());
op = op.basePath(bar.toPath());
assertThat(op.basePath()).as("as path").isEqualTo(bar.getAbsolutePath());
op = op.basePath("foo");
assertThat(op.basePath()).as("as string").isEqualTo("foo");
}
@Test
void testBaseline() {
var foo = new File("foo");
var bar = new File("bar");
var op = new DetektOperation().baseline(foo);
assertThat(op.baseline()).as("as file").isEqualTo(foo.getAbsolutePath());
op = op.baseline(bar.toPath());
assertThat(op.baseline()).as("as path").isEqualTo(bar.getAbsolutePath());
op = op.baseline("foo");
assertThat(op.baseline()).as("as string").isEqualTo("foo");
}
@Test
@EnabledOnOs(OS.LINUX)
@SuppressWarnings("PMD.AvoidInstantiatingObjectsInLoops")
void testCheckAllParameters() throws IOException {
var args = Files.readAllLines(Paths.get("src", "test", "resources", "detekt-args.txt"));
@ -117,6 +151,7 @@ class DetektOperationTest {
var params = op.executeConstructProcessCommandList();
try (var softly = new AutoCloseableSoftAssertions()) {
for (var p : args) {
var found = false;
for (var a : params) {
@ -125,19 +160,95 @@ class DetektOperationTest {
break;
}
}
assertThat(found).as(p + " not found.").isTrue();
softly.assertThat(found).as(p + " not found.").isTrue();
}
}
}
@Test
void testClassPath() {
var foo = new File("foo");
var bar = new File("bar");
var op = new DetektOperation().classPath("foo", "bar");
assertThat(op.classPath()).as("String...").contains(foo, bar);
op.classPath().clear();
op = op.classPath(foo, bar);
assertThat(op.classPath()).as("File...").contains(foo, bar);
op.classPath().clear();
op = op.classPath(foo.toPath(), bar.toPath());
assertThat(op.classPath()).as("Path...").contains(foo, bar);
op.classPath().clear();
op = op.classPathStrings(List.of("foo", "bar"));
assertThat(op.classPath()).as("List(String...)").contains(foo, bar);
op.classPath().clear();
op = op.classPath(List.of(foo, bar));
assertThat(op.classPath()).as("File...").contains(foo, bar);
op.classPath().clear();
op = op.classPathPaths(List.of(foo.toPath(), bar.toPath()));
assertThat(op.classPath()).as("Path...").contains(foo, bar);
op.classPath().clear();
}
@Test
void testConfig() {
var foo = new File("foo");
var bar = new File("bar");
var op = new DetektOperation().config("foo", "bar");
assertThat(op.config()).as("String...").contains(foo, bar);
op.config().clear();
op = op.config(foo, bar);
assertThat(op.config()).as("File...").contains(foo, bar);
op.config().clear();
op = op.config(foo.toPath(), bar.toPath());
assertThat(op.config()).as("Path...").contains(foo, bar);
op.config().clear();
op = op.configStrings(List.of("foo", "bar"));
assertThat(op.config()).as("List(String...)").contains(foo, bar);
op.config().clear();
op = op.config(List.of(foo, bar));
assertThat(op.config()).as("File...").contains(foo, bar);
op.config().clear();
op = op.configPaths(List.of(foo.toPath(), bar.toPath()));
assertThat(op.config()).as("Path...").contains(foo, bar);
op.config().clear();
}
@Test
void testConfigResource() {
var foo = new File("foo");
var bar = new File("bar");
var op = new DetektOperation().configResource(foo);
assertThat(op.configResource()).as("as file").isEqualTo(foo.getAbsolutePath());
op = op.configResource(bar.toPath());
assertThat(op.configResource()).as("as path").isEqualTo(bar.getAbsolutePath());
op = new DetektOperation().configResource("foo");
assertThat(op.configResource()).as("as string").isEqualTo("foo");
}
@Test
void testExampleBaseline() throws IOException, ExitStatusException, InterruptedException {
var tmpDir = Files.createTempDirectory("bld-detekt-").toFile();
var baseline = new File(tmpDir, "detekt-baseline.xml");
var baseline = new File(tmpDir, "examples/src/test/resources/detekt-baseline.xml");
var op = new DetektOperation()
.fromProject(new BaseProjectBlueprint(new File("examples"), "com.example",
"Example"))
"example", "Example"))
.baseline(baseline)
.createBaseline(true);
op.execute();
@ -152,7 +263,7 @@ class DetektOperationTest {
void testExampleMaxIssues() {
var op = new DetektOperation()
.fromProject(new BaseProjectBlueprint(new File("examples"), "com.example",
"Example"))
"example", "Example"))
.maxIssues(8);
assertThatNoException().isThrownBy(op::execute);
}
@ -169,7 +280,7 @@ class DetektOperationTest {
var op = new DetektOperation()
.fromProject(new BaseProjectBlueprint(new File("examples"), "com.example",
"Example"))
"example", "Example"))
.report(new Report(ReportId.HTML, html.getAbsolutePath()))
.report(new Report(ReportId.XML, xml.getAbsolutePath()))
.report(new Report(ReportId.TXT, txt.getAbsolutePath()))
@ -187,7 +298,7 @@ class DetektOperationTest {
void testExamplesExecute() {
var op = new DetektOperation()
.fromProject(new BaseProjectBlueprint(new File("examples"), "com.example",
"Example"))
"example", "Example"))
.debug(true);
assertThatThrownBy(op::execute).isInstanceOf(ExitStatusException.class);
}
@ -197,4 +308,64 @@ class DetektOperationTest {
var op = new DetektOperation();
assertThatCode(op::execute).isInstanceOf(ExitStatusException.class);
}
@Test
void testInput() {
var foo = new File("foo");
var bar = new File("bar");
var op = new DetektOperation().input("foo", "bar");
assertThat(op.input()).as("String...").contains(foo, bar);
op.input().clear();
op = op.input(foo, bar);
assertThat(op.input()).as("File...").contains(foo, bar);
op.input().clear();
op = op.input(foo.toPath(), bar.toPath());
assertThat(op.input()).as("Path...").contains(foo, bar);
op.input().clear();
op = op.inputStrings(List.of("foo", "bar"));
assertThat(op.input()).as("List(String...)").contains(foo, bar);
op.input().clear();
op = op.input(List.of(foo, bar));
assertThat(op.input()).as("File...").contains(foo, bar);
op.input().clear();
op = op.inputPaths(List.of(foo.toPath(), bar.toPath()));
assertThat(op.input()).as("Path...").contains(foo, bar);
op.input().clear();
}
@Test
void testPlugins() {
var foo = new File("foo");
var bar = new File("bar");
var op = new DetektOperation().plugins("foo", "bar");
assertThat(op.plugins()).as("String...").contains(foo, bar);
op.plugins().clear();
op = op.plugins(foo, bar);
assertThat(op.plugins()).as("File...").contains(foo, bar);
op.plugins().clear();
op = op.plugins(foo.toPath(), bar.toPath());
assertThat(op.plugins()).as("Path...").contains(foo, bar);
op.plugins().clear();
op = op.pluginsStrings(List.of("foo", "bar"));
assertThat(op.plugins()).as("List(String...)").contains(foo, bar);
op.plugins().clear();
op = op.plugins(List.of(foo, bar));
assertThat(op.plugins()).as("File...").contains(foo, bar);
op.plugins().clear();
op = op.pluginsPaths(List.of(foo.toPath(), bar.toPath()));
assertThat(op.plugins()).as("Path...").contains(foo, bar);
op.plugins().clear();
}
}