Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Introduce versioned source set and optional API source set #88

Open
wants to merge 19 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
e28c828
Add Mockito extension for JUnit 5
lacasseio Sep 19, 2022
0b2a58d
Convert GradlePluginDevelopmentUtils#sourceSets
lacasseio Sep 19, 2022
a279b79
Introduce SourceSetUtils#isMain() helper method
lacasseio Sep 19, 2022
f962800
Introduce helper method for compileOnlyApi configuration
lacasseio Sep 19, 2022
8286697
Introduce Provider utilities
lacasseio Sep 19, 2022
b892f50
Introduce lazy matching equivalent for domain object collection
lacasseio Sep 19, 2022
86cd683
Introduce utility method to ignore action parameter
lacasseio Sep 19, 2022
7d21e3a
Remove Provider-specific in coordinate matcher
lacasseio Sep 19, 2022
2a31f0d
Defer testing strategy version resolution
lacasseio Sep 19, 2022
12b380e
Avoid resolving Gradle version during equals/hashCode
lacasseio Sep 19, 2022
750f75a
Introduce more matchers for dependencies
lacasseio Sep 19, 2022
03a99f8
Remove JVM compability properties
lacasseio Sep 19, 2022
74badb6
Convert base logic into individual rules
lacasseio Sep 19, 2022
db6f383
Prepare version 1.6.9
lacasseio Sep 19, 2022
a272984
Add helper method to work with `addAllLater` collection method
lacasseio Sep 20, 2022
85230dd
Add helper method for transforming each element of an iterable provider
lacasseio Sep 20, 2022
ba8bff0
Add support for versioned source set (per Gradle version)
lacasseio Sep 20, 2022
c068804
Introduce API source set for Gradle plugins
lacasseio Sep 20, 2022
889e825
Include dependency between versioned source set and API source set
lacasseio Sep 20, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.adoc
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
:jbake-version: 1.6.8
:jbake-version: 1.6.9
// TODO: Add test for the version above
= Gradle Plugin Development Toolbox

Expand Down
4 changes: 2 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ plugins {
allprojects {
group = 'dev.gradleplugins'
}
version = '1.6.8'
version = '1.6.9'

// Configure javadoc
allprojects {
Expand All @@ -19,7 +19,7 @@ allprojects {
// Configure gradle-fixtures-* versions
subprojects {
if (project.name.startsWith('gradle-fixtures') || project.name.startsWith('gradle-runner-kit')) {
version = '0.0.138'
version = '0.0.139'
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ plugins {
}

description = 'Gradle plugin development plugins test fixtures.'
version = '1.6.8'
version = '1.6.9'

dependencies {
compileOnly gradleApi(minimumGradleVersion)
Expand Down
2 changes: 1 addition & 1 deletion subprojects/gradle-plugin-development/README.adoc
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
:jbake-version: 1.6.8
:jbake-version: 1.6.9
= Gradle Plugin Development Plugins

The Gradle plugin development plugins are a set of plugins accelerating Gradle plugin development.
Expand Down
3 changes: 2 additions & 1 deletion subprojects/gradle-plugin-development/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ apply plugin: 'dev.gradleplugins.gradle-plugin-unit-test'
apply plugin: 'dev.gradleplugins.gradle-plugin-functional-test'

description = 'Gradle plugin development plugins.'
version = '1.6.8'
version = '1.6.9'

gradlePlugin {
plugins {
Expand Down Expand Up @@ -102,6 +102,7 @@ test {
runtimeOnly "org.junit.vintage:junit-vintage-engine:5.8.2"
implementation "org.hamcrest:hamcrest:2.2"
implementation "org.mockito:mockito-core:4.2.0"
implementation "org.mockito:mockito-junit-jupiter:4.2.0"
}
testTasks.configureEach { useJUnitPlatform() }
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ abstract class AbstractGradlePluginDevelopmentExtensionFunctionalTest extends Ab
expect:
fails('help')
failure.assertHasDescription("A problem occurred configuring root project 'gradle-plugin'.")
failure.assertHasCause("The value for property 'minimumGradleVersion' cannot be changed any further.")
failure.assertHasCause("The value for extension 'compatibility' property 'minimumGradleVersion' cannot be changed any further.")
}

def "can generate Javadoc Jar"() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package dev.gradleplugins;

import dev.gradleplugins.internal.ConfigurePluginUnderTestMetadataTask;
import dev.gradleplugins.internal.FinalizableComponent;
import dev.gradleplugins.internal.GradlePluginDevelopmentTestSuiteInternal;
import dev.gradleplugins.internal.ReleasedVersionDistributions;
import lombok.val;
Expand All @@ -19,7 +18,8 @@

import static dev.gradleplugins.GradlePluginDevelopmentCompatibilityExtension.compatibility;
import static dev.gradleplugins.internal.util.GradlePluginDevelopmentUtils.gradlePlugin;
import static dev.gradleplugins.internal.util.GradlePluginDevelopmentUtils.sourceSets;
import static dev.gradleplugins.internal.util.ProviderUtils.finalizeValueOnRead;
import static dev.gradleplugins.internal.util.SourceSetUtils.sourceSets;

final class DefaultGradlePluginDevelopmentTestSuiteFactory implements GradlePluginDevelopmentTestSuiteFactory {
private final Project project;
Expand All @@ -33,13 +33,9 @@ public GradlePluginDevelopmentTestSuite create(String name) {
val result = project.getObjects().newInstance(GradlePluginDevelopmentTestSuiteInternal.class, name, project, minimumGradleVersion(project), gradleDistributions());
// Register as finalized action because it adds configuration which early finalize source set property
result.whenFinalized(new ConfigurePluginUnderTestMetadataTask(project));
result.getSourceSet().convention(project.provider(() -> {
if (project.getPluginManager().hasPlugin("java-base")) {
return sourceSets(project).maybeCreate(name);
} else {
throw new RuntimeException("Please apply 'java-base' plugin.");
}
}));
result.getSourceSet().convention(sourceSets(project).map(it -> it.maybeCreate(name)).orElse(project.provider(() -> {
throw new RuntimeException("Please apply 'java-base' plugin.");
})));
result.getTestedSourceSet().convention(project.provider(() -> {
if (project.getPluginManager().hasPlugin("java-gradle-plugin")) {
return gradlePlugin(project).getPluginSourceSet();
Expand Down Expand Up @@ -90,8 +86,7 @@ private static Provider<String> minimumGradleVersion(Project project) {
private static Provider<String> ofDevelMinimumGradleVersionIfAvailable(Project project) {
return project.provider(() -> {
if (project.getPluginManager().hasPlugin("java-gradle-plugin") && project.getPluginManager().hasPlugin("dev.gradleplugins.gradle-plugin-base")) {
((FinalizableComponent) compatibility(gradlePlugin(project))).finalizeComponent();
return compatibility(gradlePlugin(project)).getMinimumGradleVersion();
return finalizeValueOnRead(compatibility(gradlePlugin(project)).getMinimumGradleVersion());
} else {
return Providers.<String>notDefined(); // no minimum Gradle version...
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import org.gradle.api.NamedDomainObjectProvider;
import org.gradle.api.artifacts.Configuration;
import org.gradle.api.artifacts.ModuleDependency;
import org.gradle.api.provider.Provider;

public interface GradlePluginDevelopmentTestSuiteDependencies {
void implementation(Object notation);
Expand Down Expand Up @@ -38,7 +39,7 @@ public interface GradlePluginDevelopmentTestSuiteDependencies {
Object gradleTestKit(String version);

@Deprecated
Object groovy();
Provider<Object> groovy();

@Deprecated
Object groovy(String version);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
import org.gradle.language.base.plugins.LifecycleBasePlugin;
import org.gradle.util.GUtil;

import java.io.IOException;
import java.io.Serializable;
import java.util.Set;
import java.util.function.Consumer;
import java.util.stream.Stream;
Expand Down Expand Up @@ -69,15 +71,41 @@ private Action<Test> configureTestingStrategy(GradlePluginDevelopmentTestSuite t
Stream.of(strategy)
.flatMap(this::unpackCompositeTestingStrategy)
.flatMap(this::onlyCoverageTestingStrategy)
.map(GradleVersionCoverageTestingStrategy::getVersion)
.findFirst()
.ifPresent(setDefaultGradleVersionSystemProperty(task));
testingStrategyProperty(task).set(strategy);
};
}

private static Consumer<String> setDefaultGradleVersionSystemProperty(Test task) {
return version -> task.systemProperty("dev.gradleplugins.defaultGradleVersion", version);
private static Consumer<GradleVersionCoverageTestingStrategy> setDefaultGradleVersionSystemProperty(Test task) {
return version -> task.systemProperty("dev.gradleplugins.defaultGradleVersion", new DefaultGradleVersionUnderTest(version));
}

private static class DefaultGradleVersionUnderTest implements Serializable {
private final GradleVersionCoverageTestingStrategy strategy;
private String value;

private DefaultGradleVersionUnderTest(GradleVersionCoverageTestingStrategy strategy) {
this.strategy = strategy;
}

private void writeObject(java.io.ObjectOutputStream out) throws IOException {
if (value == null) {
value = strategy.getVersion();
}
out.writeUTF(value);
}
private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException {
value = in.readUTF();
}

@Override
public String toString() {
if (value == null) {
value = strategy.getVersion();
}
return value;
}
}

private Stream<GradleVersionCoverageTestingStrategy> onlyCoverageTestingStrategy(GradlePluginTestingStrategy strategy) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@ public interface DefaultDependencyVersions {
String SPOCK_FRAMEWORK_VERSION = "1.2-groovy-2.5";
@Deprecated
String GROOVY_ALL_VERSION = "2.5.2"; // Align with Spock
String GRADLE_FIXTURES_VERSION = "0.0.138";
String GRADLE_FIXTURES_VERSION = "0.0.139";
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package dev.gradleplugins.internal;

import dev.gradleplugins.GradlePluginDevelopmentDependencyExtension;
import org.gradle.api.Project;
import org.gradle.api.artifacts.ConfigurationContainer;
import org.gradle.api.artifacts.Dependency;
import org.gradle.api.artifacts.dsl.DependencyHandler;
Expand Down Expand Up @@ -76,6 +77,10 @@ public static GradlePluginDevelopmentDependencyExtensionInternal of(DependencyHa
return (GradlePluginDevelopmentDependencyExtensionInternal) ExtensionAware.class.cast(dependencies).getExtensions().getByType(GradlePluginDevelopmentDependencyExtension.class);
}

public static GradlePluginDevelopmentDependencyExtensionInternal forProject(Project project) {
return new GradlePluginDevelopmentDependencyExtensionInternal(project.getDependencies(), GradlePluginDevelopmentDependencyExtension.from(project.getDependencies()), project.getConfigurations(), DependencyFactory.forProject(project));
}

@Override
public TypeOf<?> getPublicType() {
return TypeOf.typeOf(GradlePluginDevelopmentDependencyExtension.class);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package dev.gradleplugins.internal;

import dev.gradleplugins.GroovyGradlePluginDevelopmentExtension;
import dev.gradleplugins.JavaGradlePluginDevelopmentExtension;
import dev.gradleplugins.internal.plugins.GroovyGradlePluginDevelopmentPlugin;
import dev.gradleplugins.internal.plugins.JavaGradlePluginDevelopmentPlugin;
import org.gradle.api.Task;
import org.gradle.api.artifacts.Configuration;
import org.gradle.api.artifacts.ConfigurationContainer;
Expand All @@ -17,8 +17,6 @@
import org.gradle.api.plugins.BasePlugin;
import org.gradle.api.plugins.JavaPluginExtension;
import org.gradle.api.plugins.internal.JavaConfigurationVariantMapping;
import org.gradle.api.provider.Property;
import org.gradle.api.provider.ProviderFactory;
import org.gradle.api.tasks.TaskContainer;
import org.gradle.api.tasks.TaskProvider;
import org.gradle.api.tasks.javadoc.Groovydoc;
Expand All @@ -28,7 +26,7 @@
import javax.annotation.Nullable;
import javax.inject.Inject;

public abstract class GradlePluginDevelopmentExtensionInternal implements GroovyGradlePluginDevelopmentExtension, JavaGradlePluginDevelopmentExtension {
public abstract class GradlePluginDevelopmentExtensionInternal implements GroovyGradlePluginDevelopmentPlugin.LanguageExtensionInternal, JavaGradlePluginDevelopmentPlugin.LanguageExtensionInternal {
private final JavaPluginExtension java;
private boolean defaultRepositoriesDisabled = System.getProperty("dev.gradleplugins.default-repositories", "enabled").equals("disabled");

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -271,8 +271,8 @@ public Object gradleTestKit(String version) {
}

@Override
public Object groovy() {
return defaultGroovyVersion.map(GradlePluginDevelopmentDependencyExtensionInternal.of(getDependencies())::groovy);
public Provider<Object> groovy() {
return defaultGroovyVersion.map(this::groovy);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public GradlePluginTestingStrategyFactoryInternal(Provider<String> minimumVersio

@Override
public GradleVersionCoverageTestingStrategy getCoverageForMinimumVersion() {
return new DefaultGradleVersionCoverageTestingStrategy(MINIMUM_GRADLE, () -> minimumVersion.get(), () -> {
return new DefaultGradleVersionCoverageTestingStrategy(MINIMUM_GRADLE, new MinimumVersionSupplier(minimumVersion), () -> {
val result = minimumVersion.get();
assertKnownMinimumVersion(result);
return result;
Expand All @@ -44,7 +44,7 @@ public GradleVersionCoverageTestingStrategy getCoverageForMinimumVersion() {

@Override
public GradleVersionCoverageTestingStrategy getCoverageForLatestNightlyVersion() {
return new DefaultGradleVersionCoverageTestingStrategy(LATEST_NIGHTLY, () -> "latest-nightly", () -> releasedVersions.getMostRecentSnapshot().getVersion());
return new DefaultGradleVersionCoverageTestingStrategy(LATEST_NIGHTLY, new FixedVersionSupplier("latest-nightly"), () -> releasedVersions.getMostRecentSnapshot().getVersion());
}

@Override
Expand Down Expand Up @@ -72,12 +72,12 @@ private static String format(VersionNumber version) {

@Override
public GradleVersionCoverageTestingStrategy getCoverageForLatestGlobalAvailableVersion() {
return new DefaultGradleVersionCoverageTestingStrategy(LATEST_GLOBAL_AVAILABLE, () -> "latest-released", () -> releasedVersions.getMostRecentRelease().getVersion());
return new DefaultGradleVersionCoverageTestingStrategy(LATEST_GLOBAL_AVAILABLE, new FixedVersionSupplier("latest-released"), () -> releasedVersions.getMostRecentRelease().getVersion());
}

@Override
public GradleVersionCoverageTestingStrategy coverageForGradleVersion(String version) {
return new DefaultGradleVersionCoverageTestingStrategy(version, () -> version, () -> {
return new DefaultGradleVersionCoverageTestingStrategy(version, new FixedVersionSupplier(version), () -> {
if (!isKnownVersion(version)) {
throw new IllegalArgumentException(String.format("Unknown Gradle version '%s' for adhoc testing strategy.", version));
}
Expand Down Expand Up @@ -132,6 +132,34 @@ private void assertKnownMinimumVersion(String version) {
}
}

@EqualsAndHashCode
private static final class MinimumVersionSupplier implements Supplier<String> {
@EqualsAndHashCode.Exclude private final Provider<String> value;

private MinimumVersionSupplier(Provider<String> value) {
this.value = value;
}

@Override
public String get() {
return value.get();
}
}

@EqualsAndHashCode
private static final class FixedVersionSupplier implements Supplier<String> {
private final String value;

private FixedVersionSupplier(String value) {
this.value = value;
}

@Override
public String get() {
return value;
}
}

private final class DefaultGradleVersionCoverageTestingStrategy implements GradlePluginTestingStrategyInternal, GradleVersionCoverageTestingStrategy {
private final String name;
private final Supplier<String> rawVersionSupplier;
Expand Down Expand Up @@ -171,12 +199,12 @@ public boolean equals(Object o) {
return false;
}
DefaultGradleVersionCoverageTestingStrategy that = (DefaultGradleVersionCoverageTestingStrategy) o;
return Objects.equals(rawVersionSupplier.get(), that.rawVersionSupplier.get());
return Objects.equals(rawVersionSupplier, that.rawVersionSupplier);
}

@Override
public int hashCode() {
return Objects.hash(rawVersionSupplier.get(), getName());
return Objects.hash(rawVersionSupplier, getName());
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package dev.gradleplugins.internal;

public @interface RuleGroup {
Class<?> value();
}

This file was deleted.

This file was deleted.

Loading