From 1c4ea7f7015c5e1477dd84d7b7f5b0a4c5293245 Mon Sep 17 00:00:00 2001 From: Eyal Roth Date: Sat, 14 Sep 2019 16:15:16 +0300 Subject: [PATCH 1/3] Add detection of scala version via 'implementation' and 'compileOnly' configurations --- .../org.scoverage/DetectScalaLibraryTest.java | 43 +++++++++++++++ .../ScoverageFunctionalTest.java | 22 ++++---- .../detect-scala-library/compile/build.gradle | 9 ++++ .../compile/settings.gradle | 0 .../compileOnly/build.gradle | 9 ++++ .../compileOnly/settings.gradle | 0 .../dependency-management/build.gradle | 16 ++++++ .../dependency-management/settings.gradle | 0 .../implementation/build.gradle | 9 ++++ .../implementation/settings.gradle | 0 .../org/scoverage/ScoveragePlugin.groovy | 54 ++++++++++++------- 11 files changed, 133 insertions(+), 29 deletions(-) create mode 100644 src/functionalTest/java/org.scoverage/DetectScalaLibraryTest.java create mode 100644 src/functionalTest/resources/projects/detect-scala-library/compile/build.gradle create mode 100644 src/functionalTest/resources/projects/detect-scala-library/compile/settings.gradle create mode 100644 src/functionalTest/resources/projects/detect-scala-library/compileOnly/build.gradle create mode 100644 src/functionalTest/resources/projects/detect-scala-library/compileOnly/settings.gradle create mode 100644 src/functionalTest/resources/projects/detect-scala-library/dependency-management/build.gradle create mode 100644 src/functionalTest/resources/projects/detect-scala-library/dependency-management/settings.gradle create mode 100644 src/functionalTest/resources/projects/detect-scala-library/implementation/build.gradle create mode 100644 src/functionalTest/resources/projects/detect-scala-library/implementation/settings.gradle diff --git a/src/functionalTest/java/org.scoverage/DetectScalaLibraryTest.java b/src/functionalTest/java/org.scoverage/DetectScalaLibraryTest.java new file mode 100644 index 0000000..1c60a1c --- /dev/null +++ b/src/functionalTest/java/org.scoverage/DetectScalaLibraryTest.java @@ -0,0 +1,43 @@ +package org.scoverage; + +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +import java.util.Arrays; +import java.util.Collection; + +@RunWith(Parameterized.class) +public class DetectScalaLibraryTest extends ScoverageFunctionalTest { + + private static final String SCALA_VERSION = "0.0"; + private static final String SCALA_LIBRARY_PARAMETER = "-PdetectedScalaLibraryVersion=" + SCALA_VERSION + ".0"; + private static final String EXPECTED_OUTPUT = "Using scoverage scalac plugin version '" + SCALA_VERSION; + + @Parameterized.Parameter(0) + public String projectDir; + + @Parameterized.Parameters(name = "{index}: Project {0} ") + public static Collection data() { + Object[][] data = new Object[][]{{"/compile"}, {"/compileOnly"}, {"/implementation"}, {"/dependency-management"}}; + return Arrays.asList(data); + } + + public DetectScalaLibraryTest() { + super(null); + } + + @Test + public void test() { + setProjectName("detect-scala-library" + projectDir); + + // build supposed to fail since repositories are not configured + AssertableBuildResult result = runAndFail("clean", SCALA_LIBRARY_PARAMETER, "--info"); + + // all we want to know is that the plugin detected our configured library version + String output = result.getResult().getOutput(); + Assert.assertTrue(output.contains(EXPECTED_OUTPUT)); + } + +} \ No newline at end of file diff --git a/src/functionalTest/java/org.scoverage/ScoverageFunctionalTest.java b/src/functionalTest/java/org.scoverage/ScoverageFunctionalTest.java index af14ce5..c60f8d2 100644 --- a/src/functionalTest/java/org.scoverage/ScoverageFunctionalTest.java +++ b/src/functionalTest/java/org.scoverage/ScoverageFunctionalTest.java @@ -23,18 +23,12 @@ public abstract class ScoverageFunctionalTest { - private final String projectName; - private final GradleRunner runner; + private String projectName; + private GradleRunner runner; private final XmlParser parser; protected ScoverageFunctionalTest(String projectName) { - - this.projectName = projectName; - this.runner = GradleRunner.create() - .withProjectDir(projectDir()) - .withPluginClasspath() - .forwardOutput(); - + setProjectName(projectName); try { this.parser = new XmlParser(); parser.setFeature("http://apache.org/xml/features/disallow-doctype-decl", false); @@ -44,6 +38,16 @@ protected ScoverageFunctionalTest(String projectName) { } } + protected void setProjectName(String projectName) { + if (projectName != null) { + this.projectName = projectName; + this.runner = GradleRunner.create() + .withProjectDir(projectDir()) + .withPluginClasspath() + .forwardOutput(); + } + } + protected File projectDir() { return new File("src/functionalTest/resources/projects/" + projectName); diff --git a/src/functionalTest/resources/projects/detect-scala-library/compile/build.gradle b/src/functionalTest/resources/projects/detect-scala-library/compile/build.gradle new file mode 100644 index 0000000..cf21671 --- /dev/null +++ b/src/functionalTest/resources/projects/detect-scala-library/compile/build.gradle @@ -0,0 +1,9 @@ +plugins { + id 'org.scoverage' +} + +description = 'defines scala library using the "compile" configuration' + +dependencies { + compile group: 'org.scala-lang', name: 'scala-library', version: "${detectedScalaLibraryVersion}" +} \ No newline at end of file diff --git a/src/functionalTest/resources/projects/detect-scala-library/compile/settings.gradle b/src/functionalTest/resources/projects/detect-scala-library/compile/settings.gradle new file mode 100644 index 0000000..e69de29 diff --git a/src/functionalTest/resources/projects/detect-scala-library/compileOnly/build.gradle b/src/functionalTest/resources/projects/detect-scala-library/compileOnly/build.gradle new file mode 100644 index 0000000..67ec586 --- /dev/null +++ b/src/functionalTest/resources/projects/detect-scala-library/compileOnly/build.gradle @@ -0,0 +1,9 @@ +plugins { + id 'org.scoverage' +} + +description = 'defines scala library using the "compileOnly" configuration' + +dependencies { + compileOnly group: 'org.scala-lang', name: 'scala-library', version: "${detectedScalaLibraryVersion}" +} \ No newline at end of file diff --git a/src/functionalTest/resources/projects/detect-scala-library/compileOnly/settings.gradle b/src/functionalTest/resources/projects/detect-scala-library/compileOnly/settings.gradle new file mode 100644 index 0000000..e69de29 diff --git a/src/functionalTest/resources/projects/detect-scala-library/dependency-management/build.gradle b/src/functionalTest/resources/projects/detect-scala-library/dependency-management/build.gradle new file mode 100644 index 0000000..6f48d15 --- /dev/null +++ b/src/functionalTest/resources/projects/detect-scala-library/dependency-management/build.gradle @@ -0,0 +1,16 @@ +plugins { + id 'io.spring.dependency-management' version "1.0.4.RELEASE" + id 'org.scoverage' +} + +description = 'defines scala library using the "implementation" configuration and the dependency-management plugin' + +dependencyManagement { + dependencies { + dependency group: 'org.scala-lang', name: 'scala-library', version: "${detectedScalaLibraryVersion}" + } +} + +dependencies { + implementation group: 'org.scala-lang', name: 'scala-library' +} \ No newline at end of file diff --git a/src/functionalTest/resources/projects/detect-scala-library/dependency-management/settings.gradle b/src/functionalTest/resources/projects/detect-scala-library/dependency-management/settings.gradle new file mode 100644 index 0000000..e69de29 diff --git a/src/functionalTest/resources/projects/detect-scala-library/implementation/build.gradle b/src/functionalTest/resources/projects/detect-scala-library/implementation/build.gradle new file mode 100644 index 0000000..67460ad --- /dev/null +++ b/src/functionalTest/resources/projects/detect-scala-library/implementation/build.gradle @@ -0,0 +1,9 @@ +plugins { + id 'org.scoverage' +} + +description = 'defines scala library using the "implementation" configuration' + +dependencies { + implementation group: 'org.scala-lang', name: 'scala-library', version: "${detectedScalaLibraryVersion}" +} \ No newline at end of file diff --git a/src/functionalTest/resources/projects/detect-scala-library/implementation/settings.gradle b/src/functionalTest/resources/projects/detect-scala-library/implementation/settings.gradle new file mode 100644 index 0000000..e69de29 diff --git a/src/main/groovy/org/scoverage/ScoveragePlugin.groovy b/src/main/groovy/org/scoverage/ScoveragePlugin.groovy index af6dc80..4b1db20 100644 --- a/src/main/groovy/org/scoverage/ScoveragePlugin.groovy +++ b/src/main/groovy/org/scoverage/ScoveragePlugin.groovy @@ -63,27 +63,8 @@ class ScoveragePlugin implements Plugin { } project.afterEvaluate { + def scalaVersion = resolveScalaVersion(project) def scoverageVersion = project.extensions.scoverage.scoverageVersion.get() - def scalaVersion = null - - def scalaLibrary = project.configurations.compile.dependencies.find { - it.group == "org.scala-lang" && it.name == "scala-library" - } - - if (scalaLibrary != null) { - scalaVersion = scalaLibrary.version - } - - if (scalaVersion == null && project.pluginManager.hasPlugin("io.spring.dependency-management")) { - scalaVersion = project.dependencyManagement.compile.managedVersions["org.scala-lang:scala-library"] - } - - if (scalaVersion == null) { - scalaVersion = project.extensions.scoverage.scoverageScalaVersion.get() - } else { - scalaVersion = scalaVersion.substring(0, scalaVersion.lastIndexOf(".")) - } - def fullScoverageVersion = "$scalaVersion:$scoverageVersion" project.logger.info("Using scoverage scalac plugin version '$fullScoverageVersion'") @@ -319,6 +300,39 @@ class ScoveragePlugin implements Plugin { } } + private String resolveScalaVersion(Project project) { + def scalaVersion = null + + def configurations = [ + project.configurations.compile, + project.configurations.compileOnly, + project.configurations.implementation + ] + def dependencies = configurations.collectMany { it.dependencies } + + def scalaLibrary = dependencies.find { + it.group == "org.scala-lang" && it.name == "scala-library" + } + + if (scalaLibrary != null) { + scalaVersion = scalaLibrary.version + } + + if (scalaVersion == null && project.pluginManager.hasPlugin("io.spring.dependency-management")) { + scalaVersion = project.dependencyManagement.compile.managedVersions["org.scala-lang:scala-library"] + } + + if (scalaVersion == null) { + project.logger.info("No scala library detected. Using property 'scoverageScalaVersion'") + scalaVersion = project.extensions.scoverage.scoverageScalaVersion.get() + } else { + project.logger.info("Detected scala library in compilation classpath") + scalaVersion = scalaVersion.substring(0, scalaVersion.lastIndexOf(".")) + } + + return scalaVersion + } + private Set recursiveDependenciesOf(Task task) { if (!taskDependencies.containsKey(task)) { def directDependencies = task.getTaskDependencies().getDependencies(task) From b0c01a7b891a2ccac2d48dfbebe81aefafb0e4c2 Mon Sep 17 00:00:00 2001 From: Eyal Roth Date: Tue, 10 Sep 2019 11:10:14 +0300 Subject: [PATCH 2/3] Remove redundant functional test for Scala 2.11 (which is also failing Travis CI build) --- .../java/org.scoverage/ScalaSingleModuleTest.java | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/functionalTest/java/org.scoverage/ScalaSingleModuleTest.java b/src/functionalTest/java/org.scoverage/ScalaSingleModuleTest.java index d53881b..f93e184 100644 --- a/src/functionalTest/java/org.scoverage/ScalaSingleModuleTest.java +++ b/src/functionalTest/java/org.scoverage/ScalaSingleModuleTest.java @@ -133,15 +133,6 @@ public void reportScoverageWithoutNormalCompilationAndWithExcludedClasses() thro Assert.assertFalse(resolve(buildDir(), "classes/scala/scoverage/org/hello/World.class").exists()); } - @Test - public void reportScoverageUnder2_11() throws Exception { - run("clean", ScoveragePlugin.getREPORT_NAME(), - "-PscalaVersionMinor=11", - "-PscalaVersionBuild=8", - "-Pscoverage.scoverageScalaVersion=2_11"); - assertReportFilesExist(); - } - private void assertReportFilesExist() { Assert.assertTrue(resolve(reportDir(), "index.html").exists()); From 0c01830c752bdff87d54c70b25ce37bc405535df Mon Sep 17 00:00:00 2001 From: Eyal Roth Date: Sat, 14 Sep 2019 19:47:19 +0300 Subject: [PATCH 3/3] Resolve scala library version according to the resolved compilation classpath This commit adds support for any plugin which manipulates the configuration via resolution strategy. --- .../org.scoverage/DetectScalaLibraryTest.java | 20 ++++++++----- .../detect-scala-library/compile/build.gradle | 4 +++ .../compileOnly/build.gradle | 4 +++ .../dependency-management/build.gradle | 4 +++ .../implementation/build.gradle | 4 +++ .../org/scoverage/ScoveragePlugin.groovy | 29 +++++-------------- 6 files changed, 35 insertions(+), 30 deletions(-) diff --git a/src/functionalTest/java/org.scoverage/DetectScalaLibraryTest.java b/src/functionalTest/java/org.scoverage/DetectScalaLibraryTest.java index 1c60a1c..9b2d163 100644 --- a/src/functionalTest/java/org.scoverage/DetectScalaLibraryTest.java +++ b/src/functionalTest/java/org.scoverage/DetectScalaLibraryTest.java @@ -11,9 +11,11 @@ @RunWith(Parameterized.class) public class DetectScalaLibraryTest extends ScoverageFunctionalTest { - private static final String SCALA_VERSION = "0.0"; - private static final String SCALA_LIBRARY_PARAMETER = "-PdetectedScalaLibraryVersion=" + SCALA_VERSION + ".0"; - private static final String EXPECTED_OUTPUT = "Using scoverage scalac plugin version '" + SCALA_VERSION; + private static final String SCALA_VERSION = "2.12"; + private static final String SCALA_LIBRARY_PARAMETER = "-PdetectedScalaLibraryVersion="; + + private static final String EXPECTED_OUTPUT_A = "Detected scala library in compilation classpath"; + private static final String EXPECTED_OUTPUT_B = "Using scoverage scalac plugin version '" + SCALA_VERSION; @Parameterized.Parameter(0) public String projectDir; @@ -31,13 +33,15 @@ public DetectScalaLibraryTest() { @Test public void test() { setProjectName("detect-scala-library" + projectDir); + testWithParameter(SCALA_LIBRARY_PARAMETER + SCALA_VERSION + ".0"); + testWithParameter(SCALA_LIBRARY_PARAMETER + SCALA_VERSION + ".+"); + } - // build supposed to fail since repositories are not configured - AssertableBuildResult result = runAndFail("clean", SCALA_LIBRARY_PARAMETER, "--info"); - - // all we want to know is that the plugin detected our configured library version + private void testWithParameter(String parameter) { + AssertableBuildResult result = dryRun("clean", parameter, "--info"); String output = result.getResult().getOutput(); - Assert.assertTrue(output.contains(EXPECTED_OUTPUT)); + Assert.assertTrue(output.contains(EXPECTED_OUTPUT_A)); + Assert.assertTrue(output.contains(EXPECTED_OUTPUT_B)); } } \ No newline at end of file diff --git a/src/functionalTest/resources/projects/detect-scala-library/compile/build.gradle b/src/functionalTest/resources/projects/detect-scala-library/compile/build.gradle index cf21671..8201e48 100644 --- a/src/functionalTest/resources/projects/detect-scala-library/compile/build.gradle +++ b/src/functionalTest/resources/projects/detect-scala-library/compile/build.gradle @@ -2,6 +2,10 @@ plugins { id 'org.scoverage' } +repositories { + jcenter() +} + description = 'defines scala library using the "compile" configuration' dependencies { diff --git a/src/functionalTest/resources/projects/detect-scala-library/compileOnly/build.gradle b/src/functionalTest/resources/projects/detect-scala-library/compileOnly/build.gradle index 67ec586..4dd36e8 100644 --- a/src/functionalTest/resources/projects/detect-scala-library/compileOnly/build.gradle +++ b/src/functionalTest/resources/projects/detect-scala-library/compileOnly/build.gradle @@ -2,6 +2,10 @@ plugins { id 'org.scoverage' } +repositories { + jcenter() +} + description = 'defines scala library using the "compileOnly" configuration' dependencies { diff --git a/src/functionalTest/resources/projects/detect-scala-library/dependency-management/build.gradle b/src/functionalTest/resources/projects/detect-scala-library/dependency-management/build.gradle index 6f48d15..c4de0c2 100644 --- a/src/functionalTest/resources/projects/detect-scala-library/dependency-management/build.gradle +++ b/src/functionalTest/resources/projects/detect-scala-library/dependency-management/build.gradle @@ -3,6 +3,10 @@ plugins { id 'org.scoverage' } +repositories { + jcenter() +} + description = 'defines scala library using the "implementation" configuration and the dependency-management plugin' dependencyManagement { diff --git a/src/functionalTest/resources/projects/detect-scala-library/implementation/build.gradle b/src/functionalTest/resources/projects/detect-scala-library/implementation/build.gradle index 67460ad..be9936b 100644 --- a/src/functionalTest/resources/projects/detect-scala-library/implementation/build.gradle +++ b/src/functionalTest/resources/projects/detect-scala-library/implementation/build.gradle @@ -2,6 +2,10 @@ plugins { id 'org.scoverage' } +repositories { + jcenter() +} + description = 'defines scala library using the "implementation" configuration' dependencies { diff --git a/src/main/groovy/org/scoverage/ScoveragePlugin.groovy b/src/main/groovy/org/scoverage/ScoveragePlugin.groovy index 4b1db20..5c0e20c 100644 --- a/src/main/groovy/org/scoverage/ScoveragePlugin.groovy +++ b/src/main/groovy/org/scoverage/ScoveragePlugin.groovy @@ -301,36 +301,21 @@ class ScoveragePlugin implements Plugin { } private String resolveScalaVersion(Project project) { - def scalaVersion = null - def configurations = [ - project.configurations.compile, - project.configurations.compileOnly, - project.configurations.implementation - ] - def dependencies = configurations.collectMany { it.dependencies } + def resolvedDependencies = project.configurations.compileClasspath.resolvedConfiguration.firstLevelModuleDependencies - def scalaLibrary = dependencies.find { - it.group == "org.scala-lang" && it.name == "scala-library" + def scalaLibrary = resolvedDependencies.find { + it.moduleGroup == "org.scala-lang" && it.moduleName == "scala-library" } - if (scalaLibrary != null) { - scalaVersion = scalaLibrary.version - } - - if (scalaVersion == null && project.pluginManager.hasPlugin("io.spring.dependency-management")) { - scalaVersion = project.dependencyManagement.compile.managedVersions["org.scala-lang:scala-library"] - } - - if (scalaVersion == null) { + if (scalaLibrary == null) { project.logger.info("No scala library detected. Using property 'scoverageScalaVersion'") - scalaVersion = project.extensions.scoverage.scoverageScalaVersion.get() + return project.extensions.scoverage.scoverageScalaVersion.get() } else { project.logger.info("Detected scala library in compilation classpath") - scalaVersion = scalaVersion.substring(0, scalaVersion.lastIndexOf(".")) + def fullScalaVersion = scalaLibrary.moduleVersion + return fullScalaVersion.substring(0, fullScalaVersion.lastIndexOf(".")) } - - return scalaVersion } private Set recursiveDependenciesOf(Task task) {