JAL-4159 fix up test for applicable filters for pasimap
[jalview.git] / build.gradle
index a917a0d..6df3ec9 100644 (file)
@@ -51,9 +51,8 @@ plugins {
   id 'java'
   id 'application'
   id 'eclipse'
-  id "com.diffplug.spotless" version "6.18.0" //.gradle.spotless" "3.28.0"
-  id 'com.github.johnrengelman.shadow' version '8.1.1' // was 4.0.3
   id "com.diffplug.gradle.spotless" version "3.28.0"
+  id 'com.github.johnrengelman.shadow' version '6.0.0'
   id 'com.install4j.gradle' version '10.0.3'
   id 'com.dorongold.task-tree' version '2.1.1' // only needed to display task dependency tree with  gradle task1 [task2 ...] taskTree
   id 'com.palantir.git-version' version '0.13.0' apply false
@@ -194,7 +193,6 @@ ext {
   testDir = string("${jalviewDir}/${bareTestSourceDir}")
 
   classesDir = string("${jalviewDir}/${classes_dir}")
-  outputDir = file(classesDir)
 
   // clover
   useClover = clover.equals("true")
@@ -1285,15 +1283,15 @@ def mdFileComponents(File mdFile, def dateOnly=false) {
       }
       if (inFrontMatter) {
         def m = null
-        if (m == line =~ /^date:\s*(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})/) {
+        if (m = line =~ /^date:\s*(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})/) {
           map["date"] = new Date().parse("yyyy-MM-dd HH:mm:ss", m[0][1])
-        } else if (m == line =~ /^date:\s*(\d{4}-\d{2}-\d{2})/) {
+        } else if (m = line =~ /^date:\s*(\d{4}-\d{2}-\d{2})/) {
           map["date"] = new Date().parse("yyyy-MM-dd", m[0][1])
-        } else if (m == line =~ /^channel:\s*(\S+)/) {
+        } else if (m = line =~ /^channel:\s*(\S+)/) {
           map["channel"] = m[0][1]
-        } else if (m == line =~ /^version:\s*(\S+)/) {
+        } else if (m = line =~ /^version:\s*(\S+)/) {
           map["version"] = m[0][1]
-        } else if (m == line =~ /^\s*([^:]+)\s*:\s*(\S.*)/) {
+        } else if (m = line =~ /^\s*([^:]+)\s*:\s*(\S.*)/) {
           map[ m[0][1] ] = m[0][2]
         }
         if (dateOnly && map["date"] != null) {
@@ -1352,7 +1350,7 @@ task hugoTemplates {
       def inSection = false
       changes.eachLine { line ->
         def m = null
-        if (m == line =~ /^##([^#].*)$/) {
+        if (m = line =~ /^##([^#].*)$/) {
           if (inSection) {
             changesHugo += "</div>\n\n"
           }
@@ -1362,7 +1360,7 @@ task hugoTemplates {
           section = section.replaceAll(/[^a-z0-9_\-]/, "")
           changesHugo += "<div class=\"${section}\">\n\n"
           inSection = true
-        } else if (m == line =~ /^(\s*-\s*)<!--([^>]+)-->(.*?)(<br\/?>)?\s*$/) {
+        } else if (m = line =~ /^(\s*-\s*)<!--([^>]+)-->(.*?)(<br\/?>)?\s*$/) {
           def comment = m[0][2].trim()
           if (comment != "") {
             comment = comment.replaceAll('"', "&quot;")
@@ -1432,7 +1430,7 @@ def getMdSections(String content) {
   def sectionName = null
   content.eachLine { line ->
     def m = null
-    if (m == line =~ /^##([^#].*)$/) {
+    if (m = line =~ /^##([^#].*)$/) {
       if (sectionName != null) {
         sections[sectionName] = sectionContent
         sectionName = null
@@ -1488,7 +1486,6 @@ task copyHelp(type: Copy) {
 }
 
 
-/*
 task releasesTemplates {
   group "help"
   description "Recreate whatsNew.html and releases.html from markdown files and templates in help"
@@ -1565,9 +1562,9 @@ task releasesTemplates {
       def lm = null
       def rContentProcessed = ""
       rContent.eachLine { line ->
-        if (lm == line =~ /^(\s*-)(\s*<!--[^>]*?-->)(.*)$/) {
+        if (lm = line =~ /^(\s*-)(\s*<!--[^>]*?-->)(.*)$/) {
           line = "${lm[0][1]}${lm[0][3]}${lm[0][2]}"
-      } else if (lm == line =~ /^###([^#]+.*)$/) {
+      } else if (lm = line =~ /^###([^#]+.*)$/) {
           line = "_${lm[0][1].trim()}_"
         }
         rContentProcessed += line + "\n"
@@ -1625,7 +1622,6 @@ task releasesTemplates {
   outputs.file(whatsnewHtmlFile)
 }
 
-*/
 
 task copyResources(type: Copy) {
   group = "build"
@@ -1687,7 +1683,6 @@ task copyChannelResources(type: Copy) {
 
 task createBuildProperties(type: WriteProperties) {
   dependsOn copyResources
-  dependsOn copyChannelResources
   group = "build"
   description = "Create the ${buildProperties} file"
   
@@ -1711,7 +1706,6 @@ task createBuildProperties(type: WriteProperties) {
 
 task buildIndices(type: JavaExec) {
   dependsOn copyHelp
-  //dependsOn releasesTemplates
   classpath = sourceSets.main.compileClasspath
   main = "com.sun.java.help.search.Indexer"
   workingDir = "${helpBuildDir}/${help_dir}"
@@ -1739,25 +1733,18 @@ task prepare {
   dependsOn buildResources
   dependsOn copyDocs
   dependsOn copyHelp
-  //dependsOn releasesTemplates
+  dependsOn releasesTemplates
   dependsOn convertMdFiles
   dependsOn buildIndices
 }
 
 
-// random block of dependencies
 compileJava.dependsOn prepare
 run.dependsOn compileJava
-//run.dependsOn prepare
-compileTestJava.dependsOn compileJava //
-compileTestJava.dependsOn buildIndices //
-processResources.dependsOn copyChannelResources //
-processResources.dependsOn copyResources //
-processResources.dependsOn createBuildProperties //
-processResources.dependsOn copyDocs //
-processResources.dependsOn convertMdFiles //
-processResources.dependsOn copyHelp //
-processResources.dependsOn buildIndices //
+compileTestJava.dependsOn compileJava
+
+
+
 test {
   group = "Verification"
   description = "Runs all testTaskN tasks)"
@@ -1782,6 +1769,7 @@ task testTask0(type: Test) {
     preserveOrder true
     useDefaultListeners=true
   }
+  timeout = Duration.ofMinutes(15)
 }
 
 /* separated tests */
@@ -1794,6 +1782,30 @@ task testTask1(type: Test) {
     preserveOrder true
     useDefaultListeners=true
   }
+  timeout = Duration.ofMinutes(5)
+}
+
+task testTask2(type: Test) {
+  group = "Verification"
+  description = "Tests that need to be isolated from the main test run"
+  useTestNG() {
+    includeGroups name
+    excludeGroups testng_excluded_groups.split(",")
+    preserveOrder true
+    useDefaultListeners=true
+  }
+  timeout = Duration.ofMinutes(5)
+}
+task testTask3(type: Test) {
+  group = "Verification"
+  description = "Tests that need to be isolated from the main test run"
+  useTestNG() {
+    includeGroups name
+    excludeGroups testng_excluded_groups.split(",")
+    preserveOrder true
+    useDefaultListeners=true
+  }
+  timeout = Duration.ofMinutes(5)
 }
 
 /* insert more testTaskNs here -- change N to next digit or other string */
@@ -1810,6 +1822,7 @@ task testTaskN(type: Test) {
 }
 */
 
+
 /*
  * adapted from https://medium.com/@wasyl/pretty-tests-summary-in-gradle-744804dd676c
  * to summarise test results from all Test tasks
@@ -1843,10 +1856,16 @@ tasks.withType(Test).matching {t -> t.getName().startsWith("testTask")}.all { te
     showExceptions true
     showCauses true
     showStackTraces true
-
+    if (test_output) {
+      showStandardStreams true
+    }
     info.events = [ TestLogEvent.FAILED ]
   }
 
+  if (OperatingSystem.current().isMacOsX()) {
+    testTask.systemProperty "apple.awt.UIElement", "true"
+    testTask.environment "JAVA_TOOL_OPTIONS", "-Dapple.awt.UIElement=true"
+  }
 
 
   ignoreFailures = true // Always try to run all tests for all modules
@@ -2018,7 +2037,6 @@ private static void printResults(allResults) {
 /* END of test tasks results summary */
 
 
-/*
 task compileLinkCheck(type: JavaCompile) {
   options.fork = true
   classpath = files("${jalviewDir}/${utils_dir}")
@@ -2053,7 +2071,6 @@ task linkCheck(type: JavaExec) {
   inputs.dir(helpBuildDir)
   outputs.file(helpLinksCheckerOutFile)
 }
-*/
 
 
 // import the pubhtmlhelp target
@@ -2068,14 +2085,10 @@ task cleanPackageDir(type: Delete) {
   }
 }
 
-// block of dependencies
-//compileTestJava.dependsOn compileLinkCheck //
-//copyChannelResources.dependsOn compileLinkCheck //
-//convertMdFiles.dependsOn compileLinkCheck //
 
 jar {
   dependsOn prepare
-  dependsOn //linkCheck
+  dependsOn linkCheck
 
   manifest {
     attributes "Main-Class": main_class,
@@ -2086,7 +2099,7 @@ jar {
   }
 
   def outputDir = "${jalviewDir}/${package_dir}"
-  outputDir = file(outputDir)
+  destinationDirectory = file(outputDir)
   archiveFileName = rootProject.name+".jar"
   duplicatesStrategy "EXCLUDE"
 
@@ -2142,25 +2155,59 @@ task cleanDist {
 }
 
 
+task launcherJar(type: Jar) {
+  manifest {
+      attributes (
+        "Main-Class": shadow_jar_main_class,
+        "Implementation-Version": JALVIEW_VERSION,
+        "Application-Name": applicationName
+      )
+  }
+}
+
 shadowJar {
   group = "distribution"
   description = "Create a single jar file with all dependency libraries merged. Can be run with java -jar"
   if (buildDist) {
     dependsOn makeDist
   }
-  from ("${jalviewDir}/${libDistDir}") {
-    include("*.jar")
-  }
+
+  def jarFiles = fileTree(dir: "${jalviewDir}/${libDistDir}", include: "*.jar", exclude: "regex.jar").getFiles()
+  def groovyJars = jarFiles.findAll {it1 -> file(it1).getName().startsWith("groovy-swing")}
+  def otherJars = jarFiles.findAll {it2 -> !file(it2).getName().startsWith("groovy-swing")}
+  from groovyJars
+  from otherJars
+
   manifest {
-    attributes "Implementation-Version": JALVIEW_VERSION,
-    "Application-Name": applicationName
+    // shadowJar manifest must inheritFrom another Jar task.  Can't set attributes here.
+    inheritFrom(project.tasks.launcherJar.manifest)
+  }
+  // we need to include the groovy-swing Include-Package for it to run in the shadowJar
+  doFirst {
+    def jarFileManifests = []
+    groovyJars.each { jarFile ->
+      def mf = zipTree(jarFile).getFiles().find { it.getName().equals("MANIFEST.MF") }
+      if (mf != null) {
+        jarFileManifests += mf
+      }
+    }
+    manifest {
+      from (jarFileManifests) {
+        eachEntry { details ->
+          if (!details.key.equals("Import-Package")) {
+            details.exclude()
+          }
+        }
+      }
+    }
   }
 
   duplicatesStrategy "INCLUDE"
 
+  // this mainClassName is mandatory but gets ignored due to manifest created in doFirst{}. Set the Main-Class as an attribute in launcherJar instead
   mainClassName = shadow_jar_main_class
   mergeServiceFiles()
-  archiveClassifier = "all-"+JALVIEW_VERSION+"-j"+JAVA_VERSION
+  classifier = "all-"+JALVIEW_VERSION+"-j"+JAVA_VERSION
   minimize()
 }
 
@@ -2211,9 +2258,9 @@ task getdownImages() {
   dependsOn getdownImagesProcess
 }
 
-task getdownWebsite() {
+task getdownWebsiteBuild() {
   group = "distribution"
-  description = "Create the getdown minimal app folder, and website folder for this version of jalview. Website folder also used for offline app installer"
+  description = "Create the getdown minimal app folder, and website folder for this version of jalview. Website folder also used for offline app installer. No digest is created."
 
   dependsOn getdownImages
   if (buildDist) {
@@ -2325,7 +2372,7 @@ task getdownWebsite() {
           from s
           into "${getdownAppBaseDir}/${getdown_wrapper_script_dir}"
         }
-        getdownTextLines += "resource = ${getdown_wrapper_script_dir}/${script}"
+        getdownTextLines += "xresource = ${getdown_wrapper_script_dir}/${script}"
       }
     }
 
@@ -2467,7 +2514,9 @@ task getdownDigestDir(type: JavaExec) {
 task getdownDigest(type: JavaExec) {
   group = "distribution"
   description = "Digest the getdown website folder"
-  dependsOn getdownWebsite
+
+  dependsOn getdownWebsiteBuild
+
   doFirst {
     classpath = files(getdownLauncher)
   }
@@ -2500,12 +2549,19 @@ task getdown() {
   }
 }
 
+task getdownWebsite {
+  group = "distribution"
+  description = "A task to create the whole getdown channel website dir including digest file"
+
+  dependsOn getdownWebsiteBuild
+  dependsOn getdownDigest
+}
 
 task getdownArchiveBuild() {
   group = "distribution"
   description = "Put files in the archive dir to go on the website"
 
-  dependsOn getdownWebsite
+  dependsOn getdownWebsiteBuild
 
   def v = "v${JALVIEW_VERSION_UNDERSCORES}"
   def vDir = "${getdownArchiveDir}/${v}"
@@ -3015,6 +3071,7 @@ task sourceDist(type: Tar) {
   into project.name
 
   def EXCLUDE_FILES=[
+    "dist/*",
     "build/*",
     "bin/*",
     "test-output/",