From 09c324c8de785dc326f72ca6d7edf0269274f178 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 9 Sep 2024 20:56:16 -0700 Subject: [PATCH 01/65] Added soft assertions --- .../extension/CompileKotlinOperationTest.java | 87 ++++++------ .../extension/kotlin/CompileOptionsTest.java | 129 ++++++++++-------- 2 files changed, 119 insertions(+), 97 deletions(-) diff --git a/src/test/java/rife/bld/extension/CompileKotlinOperationTest.java b/src/test/java/rife/bld/extension/CompileKotlinOperationTest.java index 85c8cff..fd51656 100644 --- a/src/test/java/rife/bld/extension/CompileKotlinOperationTest.java +++ b/src/test/java/rife/bld/extension/CompileKotlinOperationTest.java @@ -16,6 +16,7 @@ package rife.bld.extension; +import org.assertj.core.api.AutoCloseableSoftAssertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import rife.bld.BaseProject; @@ -110,35 +111,36 @@ class CompileKotlinOperationTest { .plugins(List.of("plugin3", "plugin4")); - assertThat(op.kotlinHome().getName()).as("kotlin_home").isEqualTo("kotlin_home"); - assertThat(op.kotlinc().getName()).as("kotlinc").isEqualTo("kotlinc"); - assertThat(op.workDir().getName()).as("work_dir").isEqualTo("work_dir"); - - assertThat(op.compileMainClasspath()).as("compileMainClassPath") - .containsAll(List.of("path1", "path2")); - assertThat(op.compileOptions().hasRelease()).as("hasRelease").isTrue(); - assertThat(op.compileOptions().isVerbose()).as("isVerbose").isTrue(); - assertThat(op.mainSourceDirectories()).as("mainSourceDirectories").containsExactly( - Path.of("src", "main", "kotlin").toFile().getAbsoluteFile(), new File("dir1"), - new File("dir2"), new File("dir3"), new File("dir4")); - assertThat(op.testSourceDirectories()).as("testSourceDirectories").containsOnly( - Path.of("src", "test", "kotlin").toFile().getAbsoluteFile(), new File("tdir1"), - new File("tdir2"), new File("tdir3"), new File("tdir4")); - assertThat(op.mainSourceFiles()).as("mainSourceFiles").containsOnly( - new File("file1"), new File("file2"), new File("file3"), - new File("file4"), new File("file5"), new File("file6")); - assertThat(op.testSourceFiles()).as("testSourceFiles").containsOnly( - new File("tfile1"), new File("tfile2"), new File("tfile3"), - new File("tfile4"), new File("tfile5"), new File("tfile6")); - assertThat(op.plugins()).as("plugins").contains("plugin1", "plugin2", "plugin3", "plugin4", - "/kotlin_home/lib/kotlin-serialization-compiler-plugin.jar", - "/kotlin_home/lib/assignment-compiler-plugin.jar", - new File("lib/compile", "lombok-compiler-plugin.jar").getAbsolutePath(), - new File("lib/compile", "power-assert-compiler-plugin.jar").getAbsolutePath(), - new File("lib/compile", "noarg-compiler-plugin.jar").getAbsolutePath(), - new File("lib/compile", "allopen-compiler-plugin.jar").getAbsolutePath(), - new File("lib/compile", "kotlinx-serialization-compiler-plugin.jar").getAbsolutePath(), - new File("lib/compile", "sam-with-receiver-compiler-plugin.jar").getAbsolutePath()); + try (var softly = new AutoCloseableSoftAssertions()) { + softly.assertThat(op.kotlinHome().getName()).as("kotlin_home").isEqualTo("kotlin_home"); + softly.assertThat(op.kotlinc().getName()).as("kotlinc").isEqualTo("kotlinc"); + softly.assertThat(op.workDir().getName()).as("work_dir").isEqualTo("work_dir"); + softly.assertThat(op.compileMainClasspath()).as("compileMainClassPath") + .containsAll(List.of("path1", "path2")); + softly.assertThat(op.compileOptions().hasRelease()).as("hasRelease").isTrue(); + softly.assertThat(op.compileOptions().isVerbose()).as("isVerbose").isTrue(); + softly.assertThat(op.mainSourceDirectories()).as("mainSourceDirectories").containsExactly( + Path.of("examples", "src", "main", "kotlin").toFile(), new File("dir1"), + new File("dir2"), new File("dir3"), new File("dir4")); + softly.assertThat(op.testSourceDirectories()).as("testSourceDirectories").containsOnly( + Path.of("examples", "src", "test", "kotlin").toFile(), new File("tdir1"), + new File("tdir2"), new File("tdir3"), new File("tdir4")); + softly.assertThat(op.mainSourceFiles()).as("mainSourceFiles").containsOnly( + new File("file1"), new File("file2"), new File("file3"), + new File("file4"), new File("file5"), new File("file6")); + softly.assertThat(op.testSourceFiles()).as("testSourceFiles").containsOnly( + new File("tfile1"), new File("tfile2"), new File("tfile3"), + new File("tfile4"), new File("tfile5"), new File("tfile6")); + softly.assertThat(op.plugins()).as("plugins").contains("plugin1", "plugin2", "plugin3", "plugin4", + "/kotlin_home/lib/kotlin-serialization-compiler-plugin.jar", + "/kotlin_home/lib/assignment-compiler-plugin.jar", + new File("lib/compile", "lombok-compiler-plugin.jar").getAbsolutePath(), + new File("lib/compile", "power-assert-compiler-plugin.jar").getAbsolutePath(), + new File("lib/compile", "noarg-compiler-plugin.jar").getAbsolutePath(), + new File("lib/compile", "allopen-compiler-plugin.jar").getAbsolutePath(), + new File("lib/compile", "kotlinx-serialization-compiler-plugin.jar").getAbsolutePath(), + new File("lib/compile", "sam-with-receiver-compiler-plugin.jar").getAbsolutePath()); + } } @Test @@ -150,8 +152,10 @@ class CompileKotlinOperationTest { var mainDir = new File(buildDir, "main"); var testDir = new File(buildDir, "test"); - assertThat(mainDir.mkdirs()).as("make mainDir").isTrue(); - assertThat(testDir.mkdirs()).as("make testDir").isTrue(); + try (var softly = new AutoCloseableSoftAssertions()) { + softly.assertThat(mainDir.mkdirs()).as("make mainDir").isTrue(); + softly.assertThat(testDir.mkdirs()).as("make testDir").isTrue(); + } var compileJars = new ArrayList(); for (var f : Objects.requireNonNull(new File("examples/lib/compile").listFiles())) { @@ -182,13 +186,18 @@ class CompileKotlinOperationTest { op.execute(); - assertThat(tmpDir).as("tmpDir").isNotEmptyDirectory(); - assertThat(mainDir).as("mainDir").isNotEmptyDirectory(); - assertThat(testDir).as("testDir").isNotEmptyDirectory(); + try (var softly = new AutoCloseableSoftAssertions()) { + softly.assertThat(tmpDir).as("tmpDir").isNotEmptyDirectory(); + softly.assertThat(mainDir).as("mainDir").isNotEmptyDirectory(); + softly.assertThat(testDir).as("testDir").isNotEmptyDirectory(); + } var mainOut = Path.of(mainDir.getAbsolutePath(), "com", "example").toFile(); - assertThat(new File(mainOut, "Example.class")).as("Example.class").exists(); - assertThat(new File(mainOut, "Example$Companion.class")).as("ExampleCompanion.class").exists(); + try (var softly = new AutoCloseableSoftAssertions()) { + softly.assertThat(new File(mainOut, "Example.class")).as("Example.class").exists(); + softly.assertThat(new File(mainOut, "Example$Companion.class")) + .as("ExampleCompanion.class").exists(); + } var testOut = Path.of(testDir.getAbsolutePath(), "com", "example").toFile(); assertThat(new File(testOut, "ExampleTest.class")).as("ExampleTest.class").exists(); @@ -303,8 +312,10 @@ class CompileKotlinOperationTest { CompilerPlugin.POWER_ASSERT, CompilerPlugin.SAM_WITH_RECEIVER); - for (var p : op.plugins()) { - assertThat(new File(p)).as(p).exists(); + try (var softly = new AutoCloseableSoftAssertions()) { + for (var p : op.plugins()) { + softly.assertThat(new File(p)).as(p).exists(); + } } } diff --git a/src/test/java/rife/bld/extension/kotlin/CompileOptionsTest.java b/src/test/java/rife/bld/extension/kotlin/CompileOptionsTest.java index 91ad563..5417115 100644 --- a/src/test/java/rife/bld/extension/kotlin/CompileOptionsTest.java +++ b/src/test/java/rife/bld/extension/kotlin/CompileOptionsTest.java @@ -16,6 +16,7 @@ package rife.bld.extension.kotlin; +import org.assertj.core.api.AutoCloseableSoftAssertions; import org.junit.jupiter.api.Test; import java.io.File; @@ -102,9 +103,11 @@ class CompileOptionsTest { args.add(options.args()); args.add(options.apiVersion(11).jvmTarget(11).args()); - for (var a : args) { - IntStream.range(0, a.size()).forEach(i -> assertThat(a.get(i)) - .as(a.get(i) + " == " + matches.get(i)).isEqualTo(matches.get(i))); + try (var softly = new AutoCloseableSoftAssertions()) { + for (var a : args) { + IntStream.range(0, a.size()).forEach(i -> softly.assertThat(a.get(i)) + .as(a.get(i) + " == " + matches.get(i)).isEqualTo(matches.get(i))); + } } } @@ -134,22 +137,24 @@ class CompileOptionsTest { op.plugin(p[0], p[1], p[2]); }); - assertThat(op.advancedOptions()).as("advancedOptions") - .hasSize(advanceOptions.size()).containsAll(advanceOptions); - assertThat(op.argFile()).as("argFile") - .hasSize(argFile.size()).containsAll(argFile); - assertThat(op.classpath()).as("classpath") - .hasSize(classpath.size()).containsAll(classpath); - assertThat(op.jvmOptions()).as("jvmOptions") - .hasSize(jvmOptions.size()).containsAll(jvmOptions); - assertThat(op.optIn()).as("optIn") - .hasSize(optIn.size()).containsAll(optIn); - assertThat(op.options()).as("options") - .hasSize(options.size()).containsAll(options); - assertThat(op.plugin()).as("plugin") - .hasSize(plugin.size()).containsAll(plugin); - assertThat(op.scriptTemplates()).as("scriptTemplates") - .hasSize(scriptTemplates.size()).containsAll(scriptTemplates); + try (var softly = new AutoCloseableSoftAssertions()) { + softly.assertThat(op.advancedOptions()).as("advancedOptions") + .hasSize(advanceOptions.size()).containsAll(advanceOptions); + softly.assertThat(op.argFile()).as("argFile") + .hasSize(argFile.size()).containsAll(argFile); + softly.assertThat(op.classpath()).as("classpath") + .hasSize(classpath.size()).containsAll(classpath); + softly.assertThat(op.jvmOptions()).as("jvmOptions") + .hasSize(jvmOptions.size()).containsAll(jvmOptions); + softly.assertThat(op.optIn()).as("optIn") + .hasSize(optIn.size()).containsAll(optIn); + softly.assertThat(op.options()).as("options") + .hasSize(options.size()).containsAll(options); + softly.assertThat(op.plugin()).as("plugin") + .hasSize(plugin.size()).containsAll(plugin); + softly.assertThat(op.scriptTemplates()).as("scriptTemplates") + .hasSize(scriptTemplates.size()).containsAll(scriptTemplates); + } var matches = List.of( '@' + localPath("arg1.txt"), '@' + localPath("arg2.txt"), @@ -164,16 +169,18 @@ class CompileOptionsTest { "-P", "plugin:id:name:value", "-P", "plugin:id2:name2:value2"); - var args = op.args(); - for (var arg : args) { - var found = false; - for (var match : matches) { - if (match.equals(arg)) { - found = true; - break; + try (var softly = new AutoCloseableSoftAssertions()) { + var args = op.args(); + for (var arg : args) { + var found = false; + for (var match : matches) { + if (match.equals(arg)) { + found = true; + break; + } } + softly.assertThat(found).as(arg + " not found.").isTrue(); } - assertThat(found).as(arg + " not found.").isTrue(); } } @@ -229,15 +236,17 @@ class CompileOptionsTest { .verbose(true) .wError(true); - for (var p : args) { - var found = false; - for (var a : params.args()) { - if (a.startsWith(p)) { - found = true; - break; + try (var softly = new AutoCloseableSoftAssertions()) { + for (var p : args) { + var found = false; + for (var a : params.args()) { + if (a.startsWith(p)) { + found = true; + break; + } } + softly.assertThat(found).as(p + " not found.").isTrue(); } - assertThat(found).as(p + " not found.").isTrue(); } } @@ -333,30 +342,32 @@ class CompileOptionsTest { .verbose(true) .wError(true); - assertThat(options.advancedOptions()).containsExactly("xopt1", "xopt2"); - assertThat(options.apiVersion()).isEqualTo("11"); - assertThat(options.argFile()).containsExactly(new File("args.txt")); - assertThat(options.classpath()).containsExactly(new File("classpath")); - assertThat(options.expression()).isEqualTo("expression"); - assertThat(options.isIncludeRuntime()).isTrue(); - assertThat(options.isJavaParameters()).isTrue(); - assertThat(options.isNoJdk()).isTrue(); - assertThat(options.isNoReflect()).isTrue(); - assertThat(options.isNoStdLib()).isTrue(); - assertThat(options.isNoWarn()).isTrue(); - assertThat(options.isProgressive()).isTrue(); - assertThat(options.isVerbose()).isTrue(); - assertThat(options.jdkHome()).isEqualTo(new File("jdk-home")); - assertThat(options.jdkRelease()).isEqualTo("22"); - assertThat(options.jvmTarget()).isEqualTo("9"); - assertThat(options.kotlinHome()).isEqualTo(new File("kotlin-home")); - assertThat(options.languageVersion()).isEqualTo("1.0"); - assertThat(options.moduleName()).isEqualTo("module"); - assertThat(options.optIn()).containsExactly("opt1", "opt2"); - assertThat(options.options()).containsExactly("-foo", "-bar"); - assertThat(options.path()).isEqualTo(new File("path")); - assertThat(options.plugin()).containsExactly("id:name:value"); - assertThat(options.scriptTemplates()).containsExactly("name", "name2"); - assertThat(options.isWError()).isTrue(); + try (var softly = new AutoCloseableSoftAssertions()) { + softly.assertThat(options.advancedOptions()).containsExactly("xopt1", "xopt2"); + softly.assertThat(options.apiVersion()).isEqualTo("11"); + softly.assertThat(options.argFile()).containsExactly(new File("args.txt")); + softly.assertThat(options.classpath()).containsExactly(new File("classpath")); + softly.assertThat(options.expression()).isEqualTo("expression"); + softly.assertThat(options.isIncludeRuntime()).isTrue(); + softly.assertThat(options.isJavaParameters()).isTrue(); + softly.assertThat(options.isNoJdk()).isTrue(); + softly.assertThat(options.isNoReflect()).isTrue(); + softly.assertThat(options.isNoStdLib()).isTrue(); + softly.assertThat(options.isNoWarn()).isTrue(); + softly.assertThat(options.isProgressive()).isTrue(); + softly.assertThat(options.isVerbose()).isTrue(); + softly.assertThat(options.jdkHome()).isEqualTo(new File("jdk-home")); + softly.assertThat(options.jdkRelease()).isEqualTo("22"); + softly.assertThat(options.jvmTarget()).isEqualTo("9"); + softly.assertThat(options.kotlinHome()).isEqualTo(new File("kotlin-home")); + softly.assertThat(options.languageVersion()).isEqualTo("1.0"); + softly.assertThat(options.moduleName()).isEqualTo("module"); + softly.assertThat(options.optIn()).containsExactly("opt1", "opt2"); + softly.assertThat(options.options()).containsExactly("-foo", "-bar"); + softly.assertThat(options.path()).isEqualTo(new File("path")); + softly.assertThat(options.plugin()).containsExactly("id:name:value"); + softly.assertThat(options.scriptTemplates()).containsExactly("name", "name2"); + softly.assertThat(options.isWError()).isTrue(); + } } } From 6a508f1f681654ccb36b65083a735644aa2d5cc6 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 9 Sep 2024 20:57:39 -0700 Subject: [PATCH 02/65] Don't compile when source or test directories are empty. --- examples/lib/bld/bld-wrapper.properties | 2 +- .../CompileKotlinOperationBuild.java | 30 +++++++------- .../bld/extension/CompileKotlinOperation.java | 40 ++++++++++++++----- .../extension/CompileKotlinOperationTest.java | 17 ++++++-- 4 files changed, 57 insertions(+), 32 deletions(-) diff --git a/examples/lib/bld/bld-wrapper.properties b/examples/lib/bld/bld-wrapper.properties index 949f84f..28c5833 100644 --- a/examples/lib/bld/bld-wrapper.properties +++ b/examples/lib/bld/bld-wrapper.properties @@ -1,7 +1,7 @@ bld.downloadExtensionJavadoc=false bld.downloadExtensionSources=true bld.downloadLocation= -bld.extension-kotlin=com.uwyn.rife2:bld-kotlin:1.0.1 +bld.extension-kotlin=com.uwyn.rife2:bld-kotlin:1.0.2 bld.repositories=MAVEN_LOCAL,MAVEN_CENTRAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES bld.sourceDirectories= bld.version=2.1.0 diff --git a/src/bld/java/rife/bld/extension/CompileKotlinOperationBuild.java b/src/bld/java/rife/bld/extension/CompileKotlinOperationBuild.java index 885e968..d8b4782 100644 --- a/src/bld/java/rife/bld/extension/CompileKotlinOperationBuild.java +++ b/src/bld/java/rife/bld/extension/CompileKotlinOperationBuild.java @@ -33,7 +33,7 @@ public class CompileKotlinOperationBuild extends Project { public CompileKotlinOperationBuild() { pkg = "rife.bld.extension"; name = "bld-kotlin"; - version = version(1, 0, 1); + version = version(1, 0, 2); javaRelease = 17; @@ -57,28 +57,26 @@ public class CompileKotlinOperationBuild extends Project { publishOperation() .repository(version.isSnapshot() ? repository("rife2-snapshot") : repository("rife2")) + .repository(repository("github")) .info() .groupId("com.uwyn.rife2") .artifactId("bld-kotlin") .description("bld Kotlin Extension") .url("https://github.com/rife2/bld-kotlin") - .developer( - new PublishDeveloper() - .id("ethauvin") - .name("Erik C. Thauvin") - .email("erik@thauvin.net") - .url("https://erik.thauvin.net/") + .developer(new PublishDeveloper() + .id("ethauvin") + .name("Erik C. Thauvin") + .email("erik@thauvin.net") + .url("https://erik.thauvin.net/") ) - .license( - new PublishLicense() - .name("The Apache License, Version 2.0") - .url("https://www.apache.org/licenses/LICENSE-2.0.txt") + .license(new PublishLicense() + .name("The Apache License, Version 2.0") + .url("https://www.apache.org/licenses/LICENSE-2.0.txt") ) - .scm( - new PublishScm() - .connection("scm:git:https://github.com/rife2/bld-kotlin.git") - .developerConnection("scm:git:git@github.com:rife2/bld-kotlin.git") - .url("https://github.com/rife2/bld-kotlin") + .scm(new PublishScm() + .connection("scm:git:https://github.com/rife2/bld-kotlin.git") + .developerConnection("scm:git:git@github.com:rife2/bld-kotlin.git") + .url("https://github.com/rife2/bld-kotlin") ) .signKey(property("sign.key")) .signPassphrase(property("sign.passphrase")); diff --git a/src/main/java/rife/bld/extension/CompileKotlinOperation.java b/src/main/java/rife/bld/extension/CompileKotlinOperation.java index af0bc45..8143f5d 100644 --- a/src/main/java/rife/bld/extension/CompileKotlinOperation.java +++ b/src/main/java/rife/bld/extension/CompileKotlinOperation.java @@ -284,8 +284,16 @@ public class CompileKotlinOperation extends AbstractOperation classpath, Collection sources, File destination, File friendPaths) throws ExitStatusException { - if (sources.isEmpty() || destination == null) { + if (sources.isEmpty()) { + if (!silent() && LOGGER.isLoggable(Level.WARNING)) { + LOGGER.warning("Nothing to compile."); + } return; + } else if (destination == null) { + if (!silent() && LOGGER.isLoggable(Level.SEVERE)) { + LOGGER.severe("No destination specified."); + } + throw new ExitStatusException(ExitStatusException.EXIT_FAILURE); } var args = new ArrayList(); @@ -294,8 +302,10 @@ public class CompileKotlinOperation extends AbstractOperation * Sets the following from the project: *
    - *
  • {@link #kotlinHome()} to the {@code KOTLIN_HOME} environment variable, if set.
  • - *
  • {@link #workDir()} to the project's directory.
  • + *
  • {@link #kotlinHome() kotlinHome} to the {@code KOTLIN_HOME} environment variable, if set.
  • + *
  • {@link #workDir() workDir} to the project's directory.
  • *
  • {@link #buildMainDirectory() buildMainDirectory}
  • *
  • {@link #buildTestDirectory() buildTestDirectory}
  • *
  • {@link #compileMainClasspath() compileMainClassPath}
  • *
  • {@link #compileTestClasspath() compilesTestClassPath}
  • - *
  • {@link #mainSourceDirectories()} () mainSourceDirectories} to the {@code kotlin} directory in - * {@link BaseProject#srcMainDirectory() srcMainDirectory}
  • + *
  • {@link #mainSourceDirectories() mainSourceDirectories} to the {@code kotlin} directory in + * {@link BaseProject#srcMainDirectory() srcMainDirectory}, if present.
  • *
  • {@link #testSourceDirectories() testSourceDirectories} to the {@code kotlin} directory in - * {@link BaseProject#srcTestDirectory() srcTestDirectory}
  • + * {@link BaseProject#srcTestDirectory() srcTestDirectory}, if present. *
  • {@link CompileOptions#jdkRelease jdkRelease} to {@link BaseProject#javaRelease() javaRelease}
  • *
  • {@link CompileOptions#noStdLib(boolean) noStdLib} to {@code true}
  • *
@@ -406,9 +416,17 @@ public class CompileKotlinOperation extends AbstractOperation Date: Thu, 10 Oct 2024 13:15:11 -0700 Subject: [PATCH 03/65] Updated dependencies Bumped Kotlin to version 2.0.21 Bumped JUnit to version 5.11.2 Bumped PMD extension to version 1.1.6 --- .github/workflows/bld.yml | 6 +++--- .idea/misc.xml | 1 + examples/src/bld/java/com/example/ExampleBuild.java | 6 +++--- lib/bld/bld-wrapper.properties | 2 +- .../rife/bld/extension/CompileKotlinOperationBuild.java | 6 +++--- 5 files changed, 11 insertions(+), 10 deletions(-) diff --git a/.github/workflows/bld.yml b/.github/workflows/bld.yml index 308fe5a..35cec17 100644 --- a/.github/workflows/bld.yml +++ b/.github/workflows/bld.yml @@ -1,6 +1,6 @@ name: bld-ci -on: [ push, pull_request, workflow_dispatch ] +on: [push, pull_request, workflow_dispatch] env: KOTLIN_HOME: /usr/share/kotlinc @@ -11,8 +11,8 @@ jobs: strategy: matrix: - java-version: [ 17, 21, 22 ] - kotlin-version: [ 1.9.24, 2.0.0 ] + java-version: [17, 21, 22] + kotlin-version: [1.9.24, 2.0.21] steps: - name: Checkout source repository diff --git a/.idea/misc.xml b/.idea/misc.xml index 4e456d4..ea8d1e3 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -13,6 +13,7 @@ +