From b68f1b46dcaee7b09329ccb52ee10403f00e7845 Mon Sep 17 00:00:00 2001 From: Tom Tresansky Date: Mon, 26 Feb 2024 09:39:11 -0500 Subject: [PATCH 01/17] Setup test for DependencyCollector, add skeleton of new Extractor --- ...eDslProjectBuildFileIntegrationSpec.groovy | 106 ++++++++++++++++-- .../project/dependencyConfigurationSchema.kt | 13 ++- 2 files changed, 109 insertions(+), 10 deletions(-) diff --git a/platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDslProjectBuildFileIntegrationSpec.groovy b/platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDslProjectBuildFileIntegrationSpec.groovy index 238654d882fe..2dcb53ea7277 100644 --- a/platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDslProjectBuildFileIntegrationSpec.groovy +++ b/platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDslProjectBuildFileIntegrationSpec.groovy @@ -105,22 +105,94 @@ class DeclarativeDslProjectBuildFileIntegrationSpec extends AbstractIntegrationS ].every { it.isFile() && it.text != "" } } - def 'can configure a custom plugin extension in declarative DSL'() { + def 'can configure a custom plugin extension using DependencyCollector in declarative DSL'() { given: - file("buildSrc/build.gradle") << """ + file("buildSrc/build.gradle") << defineRestrictedPluginBuild() + + file("buildSrc/src/main/java/com/example/restricted/LibraryDependencies.java") << """ + package com.example.restricted; + + import org.gradle.api.artifacts.dsl.DependencyCollector; + import org.gradle.api.artifacts.dsl.GradleDependencies; + import org.gradle.api.plugins.jvm.PlatformDependencyModifiers; + import org.gradle.api.plugins.jvm.TestFixturesDependencyModifiers; + import org.gradle.declarative.dsl.model.annotations.Adding; + import org.gradle.declarative.dsl.model.annotations.Restricted; + + @Restricted + public interface LibraryDependencies extends PlatformDependencyModifiers, TestFixturesDependencyModifiers, GradleDependencies { + DependencyCollector getApi(); + DependencyCollector getImplementation(); + } + """ + + file("buildSrc/src/main/java/com/example/restricted/LibraryExtension.java") << """ + package com.example.restricted; + + import org.gradle.declarative.dsl.model.annotations.Adding; + import org.gradle.declarative.dsl.model.annotations.Configuring; + import org.gradle.declarative.dsl.model.annotations.Restricted; + import org.gradle.api.Action; + import org.gradle.api.model.ObjectFactory; + import org.gradle.api.provider.ListProperty; + import org.gradle.api.provider.Property; + + import javax.inject.Inject; + + @Restricted + public abstract class LibraryExtension { + private final LibraryDependencies dependencies; + + @Inject + public LibraryExtension(ObjectFactory objectFactory) { + this.dependencies = objectFactory.newInstance(LibraryDependencies.class); + } + + @Restricted + public LibraryDependencies getDependencies() { + return dependencies; + } + } + """ + + file("buildSrc/src/main/java/com/example/restricted/RestrictedPlugin.java") << """ + package com.example.restricted; + + import org.gradle.api.DefaultTask; + import org.gradle.api.Plugin; + import org.gradle.api.Project; + import org.gradle.api.provider.ListProperty; + import org.gradle.api.provider.Property; + + public class RestrictedPlugin implements Plugin { + @Override + public void apply(Project target) { + LibraryExtension restricted = target.getExtensions().create("restricted", LibraryExtension.class); + } + } + """ + + and: + file("build.gradle.something") << """ plugins { - id('java-gradle-plugin') + id("com.example.restricted") } - gradlePlugin { - plugins { - create("restrictedPlugin") { - id = "com.example.restricted" - implementationClass = "com.example.restricted.RestrictedPlugin" - } + + restricted { + dependencies { + } } """ + expect: + succeeds("tasks") + } + + def 'can configure a custom plugin extension in declarative DSL'() { + given: + file("buildSrc/build.gradle") << defineRestrictedPluginBuild() + file("buildSrc/src/main/java/com/example/restricted/Extension.java") << """ package com.example.restricted; @@ -313,4 +385,20 @@ secondaryAccess { three, true, true}""" "language feature" | "body" | "" | "@A dependencies { }" | "4:9: unsupported language feature: AnnotationUsage" "semantic" | "body" | "" | "x = 1" | "4:9: unresolved reference 'x'" } + + private String defineRestrictedPluginBuild() { + return """ + plugins { + id('java-gradle-plugin') + } + gradlePlugin { + plugins { + create("restrictedPlugin") { + id = "com.example.restricted" + implementationClass = "com.example.restricted.RestrictedPlugin" + } + } + } + """ + } } diff --git a/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/dependencyConfigurationSchema.kt b/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/dependencyConfigurationSchema.kt index 2db99f5129f2..cba9f70e3983 100644 --- a/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/dependencyConfigurationSchema.kt +++ b/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/dependencyConfigurationSchema.kt @@ -54,7 +54,8 @@ class DependencyConfigurationsComponent( val configurations = DependencyConfigurations(project.configurations.names.toList()) override fun functionExtractors(): List = listOf( - DependencyFunctionsExtractor(configurations) + DependencyFunctionsExtractor(configurations), + DependencyCollectorFunctionsExtractor(configurations) ) override fun runtimeFunctionResolvers(): List = listOf( @@ -88,6 +89,16 @@ class DependencyFunctionsExtractor(val configurations: DependencyConfigurations) override fun topLevelFunction(function: KFunction<*>, preIndex: DataSchemaBuilder.PreIndex): DataTopLevelFunction? = null } +private +class DependencyCollectorFunctionsExtractor(val configurations: DependencyConfigurations) : FunctionExtractor { + override fun memberFunctions(kClass: KClass<*>, preIndex: DataSchemaBuilder.PreIndex): Iterable = + if (kClass == RestrictedDependenciesHandler::class) { + emptyList() + } else emptyList() + + override fun constructors(kClass: KClass<*>, preIndex: DataSchemaBuilder.PreIndex): Iterable = emptyList() + override fun topLevelFunction(function: KFunction<*>, preIndex: DataSchemaBuilder.PreIndex): DataTopLevelFunction? = null +} private class RuntimeDependencyFunctionResolver(configurations: DependencyConfigurations) : RuntimeFunctionResolver { From e13ff014a81fed2e5eb013e9170abed7d62df8e4 Mon Sep 17 00:00:00 2001 From: Tom Tresansky Date: Mon, 26 Feb 2024 17:13:43 -0500 Subject: [PATCH 02/17] Super hacky and needs lots of attention and trimming, but runs and builds using proper dependencies --- ...eDslProjectBuildFileIntegrationSpec.groovy | 88 +++++++++++++------ .../project/ProjectTopLevelReceiver.kt | 11 +++ .../project/dependencyConfigurationSchema.kt | 57 +++++++++++- 3 files changed, 124 insertions(+), 32 deletions(-) diff --git a/platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDslProjectBuildFileIntegrationSpec.groovy b/platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDslProjectBuildFileIntegrationSpec.groovy index 2dcb53ea7277..ee73e78c0786 100644 --- a/platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDslProjectBuildFileIntegrationSpec.groovy +++ b/platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDslProjectBuildFileIntegrationSpec.groovy @@ -109,48 +109,49 @@ class DeclarativeDslProjectBuildFileIntegrationSpec extends AbstractIntegrationS given: file("buildSrc/build.gradle") << defineRestrictedPluginBuild() - file("buildSrc/src/main/java/com/example/restricted/LibraryDependencies.java") << """ - package com.example.restricted; - - import org.gradle.api.artifacts.dsl.DependencyCollector; - import org.gradle.api.artifacts.dsl.GradleDependencies; - import org.gradle.api.plugins.jvm.PlatformDependencyModifiers; - import org.gradle.api.plugins.jvm.TestFixturesDependencyModifiers; - import org.gradle.declarative.dsl.model.annotations.Adding; - import org.gradle.declarative.dsl.model.annotations.Restricted; - - @Restricted - public interface LibraryDependencies extends PlatformDependencyModifiers, TestFixturesDependencyModifiers, GradleDependencies { - DependencyCollector getApi(); - DependencyCollector getImplementation(); - } - """ +// file("buildSrc/src/main/java/com/example/restricted/LibraryDependencies.java") << """ +// package com.example.restricted; +// +// import org.gradle.api.artifacts.dsl.DependencyCollector; +// import org.gradle.api.artifacts.dsl.GradleDependencies; +// import org.gradle.api.plugins.jvm.PlatformDependencyModifiers; +// import org.gradle.api.plugins.jvm.TestFixturesDependencyModifiers; +// import org.gradle.declarative.dsl.model.annotations.Adding; +// import org.gradle.declarative.dsl.model.annotations.Restricted; +// +// @Restricted +// public interface LibraryDependencies extends PlatformDependencyModifiers, TestFixturesDependencyModifiers, GradleDependencies { +// DependencyCollector getApi(); +// DependencyCollector getImplementation(); +// } +// """ file("buildSrc/src/main/java/com/example/restricted/LibraryExtension.java") << """ package com.example.restricted; - import org.gradle.declarative.dsl.model.annotations.Adding; - import org.gradle.declarative.dsl.model.annotations.Configuring; - import org.gradle.declarative.dsl.model.annotations.Restricted; import org.gradle.api.Action; import org.gradle.api.model.ObjectFactory; import org.gradle.api.provider.ListProperty; import org.gradle.api.provider.Property; + import org.gradle.declarative.dsl.model.annotations.Adding; + import org.gradle.declarative.dsl.model.annotations.Configuring; + import org.gradle.declarative.dsl.model.annotations.Restricted; + import org.gradle.internal.declarativedsl.project.RestrictedLibraryDependencies; import javax.inject.Inject; @Restricted public abstract class LibraryExtension { - private final LibraryDependencies dependencies; + private final RestrictedLibraryDependencies deps; @Inject public LibraryExtension(ObjectFactory objectFactory) { - this.dependencies = objectFactory.newInstance(LibraryDependencies.class); + this.deps = objectFactory.newInstance(RestrictedLibraryDependencies.class); } - @Restricted - public LibraryDependencies getDependencies() { - return dependencies; + @Configuring + public void deps(Action configure) { + configure.execute(deps); } } """ @@ -163,11 +164,17 @@ class DeclarativeDslProjectBuildFileIntegrationSpec extends AbstractIntegrationS import org.gradle.api.Project; import org.gradle.api.provider.ListProperty; import org.gradle.api.provider.Property; + import org.gradle.api.plugins.JavaLibraryPlugin; public class RestrictedPlugin implements Plugin { @Override - public void apply(Project target) { - LibraryExtension restricted = target.getExtensions().create("restricted", LibraryExtension.class); + public void apply(Project project) { + project.getPluginManager().apply(JavaLibraryPlugin.class); + + LibraryExtension restricted = project.getExtensions().create("library", LibraryExtension.class); + +// project.configurations.resolvable("api"); +// project.configurations.resolvable("implementation"); } } """ @@ -178,15 +185,38 @@ class DeclarativeDslProjectBuildFileIntegrationSpec extends AbstractIntegrationS id("com.example.restricted") } - restricted { - dependencies { + library { + deps { // TODO: Don't name this dependencies??? Can this be reset? + api("com.google.guava:guava:30.1.1-jre") + implementation("com.apache.commons:commons-lang3:3.12.0") + } + } + """ + + file("src/main/java/com/example/Lib.java") << """ + package com.example; + import com.google.common.collect.ImmutableSet; + import org.apache.commons.lang3.StringUtils; + + public class Lib { + public static ImmutableSet getPeople() { + return ImmutableSet.of(capitalize("adam johnson"), capitalize("bob smith"), capitalize("carl jones")); + } + + private static String capitalize(String input) { + return StringUtils.capitalize(input); } } """ + when: + expect: - succeeds("tasks") + succeeds("build") + + and: + file("build/libs/something.jar").exists() } def 'can configure a custom plugin extension in declarative DSL'() { diff --git a/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/ProjectTopLevelReceiver.kt b/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/ProjectTopLevelReceiver.kt index a56b5f6f6c41..19d3e95588e4 100644 --- a/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/ProjectTopLevelReceiver.kt +++ b/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/ProjectTopLevelReceiver.kt @@ -17,7 +17,11 @@ package org.gradle.internal.declarativedsl.project import org.gradle.api.Action +import org.gradle.api.artifacts.MinimalExternalModuleDependency import org.gradle.api.artifacts.ProjectDependency +import org.gradle.api.artifacts.dsl.DependencyCollector +import org.gradle.api.artifacts.dsl.GradleDependencies +import org.gradle.api.plugins.jvm.PlatformDependencyModifiers import org.gradle.declarative.dsl.model.annotations.Configuring import org.gradle.declarative.dsl.model.annotations.Restricted @@ -36,3 +40,10 @@ interface ProjectTopLevelReceiver { interface RestrictedDependenciesHandler + +interface RestrictedLibraryDependencies : PlatformDependencyModifiers, GradleDependencies { + @Restricted + fun getApi(): DependencyCollector + @Restricted + fun getImplementation(): DependencyCollector +} diff --git a/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/dependencyConfigurationSchema.kt b/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/dependencyConfigurationSchema.kt index cba9f70e3983..b17acd6ef95e 100644 --- a/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/dependencyConfigurationSchema.kt +++ b/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/dependencyConfigurationSchema.kt @@ -16,6 +16,7 @@ package org.gradle.internal.declarativedsl.project +import org.gradle.api.Action import org.gradle.internal.declarativedsl.analysis.DataConstructor import org.gradle.internal.declarativedsl.analysis.DataMemberFunction import org.gradle.internal.declarativedsl.analysis.DataParameter @@ -30,10 +31,15 @@ import org.gradle.internal.declarativedsl.schemaBuilder.DataSchemaBuilder import org.gradle.internal.declarativedsl.schemaBuilder.FunctionExtractor import org.gradle.internal.declarativedsl.schemaBuilder.toDataTypeRef import org.gradle.api.Project +import org.gradle.api.artifacts.ExternalModuleDependency +import org.gradle.api.artifacts.MinimalExternalModuleDependency import org.gradle.api.artifacts.ProjectDependency +import org.gradle.api.artifacts.dsl.DependencyCollector import org.gradle.api.artifacts.dsl.DependencyHandler import org.gradle.internal.declarativedsl.analysis.FunctionSemantics.ConfigureSemantics.ConfigureBlockRequirement.NOT_ALLOWED +import org.gradle.internal.declarativedsl.analysis.ref import org.gradle.internal.declarativedsl.evaluationSchema.EvaluationSchemaComponent +import org.gradle.internal.declarativedsl.language.DataType import kotlin.reflect.KClass import kotlin.reflect.KFunction import kotlin.reflect.full.isSubclassOf @@ -43,6 +49,7 @@ import kotlin.reflect.full.isSubclassOf * Introduces functions for registering project dependencies, such as `implementation(...)`, as member functions of: * * [RestrictedDependenciesHandler] in the schema, * * [DependencyHandler] when resolved at runtime. + * * [RestrictedLibraryDependencies] in the schema. * * Inspects the configurations available in the given project to build the functions. */ @@ -59,7 +66,8 @@ class DependencyConfigurationsComponent( ) override fun runtimeFunctionResolvers(): List = listOf( - RuntimeDependencyFunctionResolver(configurations) + RuntimeDependencyFunctionResolver(configurations), + RuntimeDependencyCollectorFunctionResolver(configurations) ) } @@ -92,8 +100,23 @@ class DependencyFunctionsExtractor(val configurations: DependencyConfigurations) private class DependencyCollectorFunctionsExtractor(val configurations: DependencyConfigurations) : FunctionExtractor { override fun memberFunctions(kClass: KClass<*>, preIndex: DataSchemaBuilder.PreIndex): Iterable = - if (kClass == RestrictedDependenciesHandler::class) { - emptyList() + if (kClass == RestrictedLibraryDependencies::class) { + listOf( + DataMemberFunction( + kClass.toDataTypeRef(), + "api", + listOf(DataParameter("dependency", String::class.toDataTypeRef(), false, ParameterSemantics.Unknown)), + false, + FunctionSemantics.AddAndConfigure(RestrictedLibraryDependencies::class.toDataTypeRef(), FunctionSemantics.AddAndConfigure.ConfigureBlockRequirement.NOT_ALLOWED) + ), + DataMemberFunction( + kClass.toDataTypeRef(), + "implementation", + listOf(DataParameter("dependency", String::class.toDataTypeRef(), false, ParameterSemantics.Unknown)), + false, + FunctionSemantics.AddAndConfigure(RestrictedLibraryDependencies::class.toDataTypeRef(), FunctionSemantics.AddAndConfigure.ConfigureBlockRequirement.NOT_ALLOWED) + ) + ) } else emptyList() override fun constructors(kClass: KClass<*>, preIndex: DataSchemaBuilder.PreIndex): Iterable = emptyList() @@ -117,3 +140,31 @@ class RuntimeDependencyFunctionResolver(configurations: DependencyConfigurations return RuntimeFunctionResolver.Resolution.Unresolved } } + +private +class RuntimeDependencyCollectorFunctionResolver(configurations: DependencyConfigurations) : RuntimeFunctionResolver { + private + val nameSet = configurations.configurationNames.toSet() + + override fun resolve(receiverClass: KClass<*>, name: String, parameterValueBinding: ParameterValueBinding): RuntimeFunctionResolver.Resolution { + // TODO: The runtime decoration isn't working as expected here + // When receiverClass == class org.gradle.internal.declarativedsl.project.RestrictedLibraryDependencies_Decorated + // Then receiverClass.isSubclassOf(RestrictedLibraryDependencies::class) == false + // So, I'll just test the name + if (receiverClass.simpleName == "RestrictedLibraryDependencies_Decorated" && name in nameSet && parameterValueBinding.bindingMap.size == 1) { + return RuntimeFunctionResolver.Resolution.Resolved(object : RestrictedRuntimeFunction { + override fun callBy(receiver: Any, binding: Map): RestrictedRuntimeFunction.InvocationResult { + val libraryDependencies = (receiver as RestrictedLibraryDependencies) + val dependencyNotation = binding.values.single().toString() + when (name) { + "api" -> libraryDependencies.getApi().add(dependencyNotation) {} + "implementation" -> libraryDependencies.getImplementation().add(dependencyNotation) {} + else -> error("Unknown configuration: $name for dependency: $dependencyNotation") + } + return RestrictedRuntimeFunction.InvocationResult(Unit, null) + } + }) + } + return RuntimeFunctionResolver.Resolution.Unresolved + } +} From 1cd202e7de80a17c8436d3e2672b32f39b1aaa73 Mon Sep 17 00:00:00 2001 From: Tom Tresansky Date: Thu, 29 Feb 2024 07:57:15 -0500 Subject: [PATCH 03/17] Adjust extractor for changed api --- .../declarativedsl/project/dependencyConfigurationSchema.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/dependencyConfigurationSchema.kt b/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/dependencyConfigurationSchema.kt index b17acd6ef95e..e141ec0078f9 100644 --- a/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/dependencyConfigurationSchema.kt +++ b/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/dependencyConfigurationSchema.kt @@ -107,14 +107,14 @@ class DependencyCollectorFunctionsExtractor(val configurations: DependencyConfig "api", listOf(DataParameter("dependency", String::class.toDataTypeRef(), false, ParameterSemantics.Unknown)), false, - FunctionSemantics.AddAndConfigure(RestrictedLibraryDependencies::class.toDataTypeRef(), FunctionSemantics.AddAndConfigure.ConfigureBlockRequirement.NOT_ALLOWED) + FunctionSemantics.AddAndConfigure(RestrictedLibraryDependencies::class.toDataTypeRef(), FunctionSemantics.ConfigureSemantics.ConfigureBlockRequirement.NOT_ALLOWED) ), DataMemberFunction( kClass.toDataTypeRef(), "implementation", listOf(DataParameter("dependency", String::class.toDataTypeRef(), false, ParameterSemantics.Unknown)), false, - FunctionSemantics.AddAndConfigure(RestrictedLibraryDependencies::class.toDataTypeRef(), FunctionSemantics.AddAndConfigure.ConfigureBlockRequirement.NOT_ALLOWED) + FunctionSemantics.AddAndConfigure(RestrictedLibraryDependencies::class.toDataTypeRef(), FunctionSemantics.ConfigureSemantics.ConfigureBlockRequirement.NOT_ALLOWED) ) ) } else emptyList() @@ -153,7 +153,7 @@ class RuntimeDependencyCollectorFunctionResolver(configurations: DependencyConfi // So, I'll just test the name if (receiverClass.simpleName == "RestrictedLibraryDependencies_Decorated" && name in nameSet && parameterValueBinding.bindingMap.size == 1) { return RuntimeFunctionResolver.Resolution.Resolved(object : RestrictedRuntimeFunction { - override fun callBy(receiver: Any, binding: Map): RestrictedRuntimeFunction.InvocationResult { + override fun callBy(receiver: Any, binding: Map, hasLambda: Boolean): RestrictedRuntimeFunction.InvocationResult { val libraryDependencies = (receiver as RestrictedLibraryDependencies) val dependencyNotation = binding.values.single().toString() when (name) { From 1d36fb03ea68c93f59c9d2d3665feda25e9535b4 Mon Sep 17 00:00:00 2001 From: Tom Tresansky Date: Thu, 29 Feb 2024 08:48:41 -0500 Subject: [PATCH 04/17] Split test into applying java-library and not applying tests, extract common blocks --- ...eDslProjectBuildFileIntegrationSpec.groovy | 151 +++++++++++++----- 1 file changed, 108 insertions(+), 43 deletions(-) diff --git a/platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDslProjectBuildFileIntegrationSpec.groovy b/platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDslProjectBuildFileIntegrationSpec.groovy index ee73e78c0786..9ff59e026a67 100644 --- a/platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDslProjectBuildFileIntegrationSpec.groovy +++ b/platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDslProjectBuildFileIntegrationSpec.groovy @@ -126,36 +126,71 @@ class DeclarativeDslProjectBuildFileIntegrationSpec extends AbstractIntegrationS // } // """ - file("buildSrc/src/main/java/com/example/restricted/LibraryExtension.java") << """ + file("buildSrc/src/main/java/com/example/restricted/LibraryExtension.java") << defineLibraryExtension() + + file("buildSrc/src/main/java/com/example/restricted/RestrictedPlugin.java") << """ package com.example.restricted; - import org.gradle.api.Action; - import org.gradle.api.model.ObjectFactory; + import org.gradle.api.DefaultTask; + import org.gradle.api.Plugin; + import org.gradle.api.Project; import org.gradle.api.provider.ListProperty; import org.gradle.api.provider.Property; - import org.gradle.declarative.dsl.model.annotations.Adding; - import org.gradle.declarative.dsl.model.annotations.Configuring; - import org.gradle.declarative.dsl.model.annotations.Restricted; - import org.gradle.internal.declarativedsl.project.RestrictedLibraryDependencies; - - import javax.inject.Inject; - - @Restricted - public abstract class LibraryExtension { - private final RestrictedLibraryDependencies deps; + import org.gradle.api.plugins.JavaLibraryPlugin; - @Inject - public LibraryExtension(ObjectFactory objectFactory) { - this.deps = objectFactory.newInstance(RestrictedLibraryDependencies.class); + public class RestrictedPlugin implements Plugin { + @Override + public void apply(Project project) { + LibraryExtension restricted = project.getExtensions().create("library", LibraryExtension.class); + project.getConfigurations().resolvable("api"); + project.getConfigurations().resolvable("implementation"); } + } + """ - @Configuring - public void deps(Action configure) { - configure.execute(deps); + and: + file("build.gradle.something") << """ + plugins { + id("com.example.restricted") + } + + library { + deps { // TODO: Don't name this dependencies??? Can this be reset? + api("com.google.guava:guava:30.1.1-jre") + implementation("com.apache.commons:commons-lang3:3.12.0") } } """ + file("src/main/java/com/example/Lib.java") << defineExampleJavaLibraryClass() + + expect: + succeeds("tasks") + } + + def 'can configure a custom plugin extension using DependencyCollector in declarative DSL and build a java plugin'() { + given: + file("buildSrc/build.gradle") << defineRestrictedPluginBuild() + +// file("buildSrc/src/main/java/com/example/restricted/LibraryDependencies.java") << """ +// package com.example.restricted; +// +// import org.gradle.api.artifacts.dsl.DependencyCollector; +// import org.gradle.api.artifacts.dsl.GradleDependencies; +// import org.gradle.api.plugins.jvm.PlatformDependencyModifiers; +// import org.gradle.api.plugins.jvm.TestFixturesDependencyModifiers; +// import org.gradle.declarative.dsl.model.annotations.Adding; +// import org.gradle.declarative.dsl.model.annotations.Restricted; +// +// @Restricted +// public interface LibraryDependencies extends PlatformDependencyModifiers, TestFixturesDependencyModifiers, GradleDependencies { +// DependencyCollector getApi(); +// DependencyCollector getImplementation(); +// } +// """ + + file("buildSrc/src/main/java/com/example/restricted/LibraryExtension.java") << defineLibraryExtension() + file("buildSrc/src/main/java/com/example/restricted/RestrictedPlugin.java") << """ package com.example.restricted; @@ -170,11 +205,7 @@ class DeclarativeDslProjectBuildFileIntegrationSpec extends AbstractIntegrationS @Override public void apply(Project project) { project.getPluginManager().apply(JavaLibraryPlugin.class); - - LibraryExtension restricted = project.getExtensions().create("library", LibraryExtension.class); - -// project.configurations.resolvable("api"); -// project.configurations.resolvable("implementation"); + LibraryExtension restricted = project.getExtensions().create("library", LibraryExtension.class);\ } } """ @@ -193,30 +224,13 @@ class DeclarativeDslProjectBuildFileIntegrationSpec extends AbstractIntegrationS } """ - file("src/main/java/com/example/Lib.java") << """ - package com.example; - - import com.google.common.collect.ImmutableSet; - import org.apache.commons.lang3.StringUtils; - - public class Lib { - public static ImmutableSet getPeople() { - return ImmutableSet.of(capitalize("adam johnson"), capitalize("bob smith"), capitalize("carl jones")); - } - - private static String capitalize(String input) { - return StringUtils.capitalize(input); - } - } - """ - - when: + file("src/main/java/com/example/Lib.java") << defineExampleJavaLibraryClass() expect: succeeds("build") and: - file("build/libs/something.jar").exists() + file("build/libs/${testDirectory.name}.jar").exists() } def 'can configure a custom plugin extension in declarative DSL'() { @@ -431,4 +445,55 @@ secondaryAccess { three, true, true}""" } """ } + + private String defineLibraryExtension() { + return """ + package com.example.restricted; + + import org.gradle.api.Action; + import org.gradle.api.model.ObjectFactory; + import org.gradle.api.provider.ListProperty; + import org.gradle.api.provider.Property; + import org.gradle.declarative.dsl.model.annotations.Adding; + import org.gradle.declarative.dsl.model.annotations.Configuring; + import org.gradle.declarative.dsl.model.annotations.Restricted; + import org.gradle.internal.declarativedsl.project.RestrictedLibraryDependencies; + + import javax.inject.Inject; + + @Restricted + public abstract class LibraryExtension { + private final RestrictedLibraryDependencies deps; + + @Inject + public LibraryExtension(ObjectFactory objectFactory) { + this.deps = objectFactory.newInstance(RestrictedLibraryDependencies.class); + } + + @Configuring + public void deps(Action configure) { + configure.execute(deps); + } + } + """ + } + + private String defineExampleJavaLibraryClass() { + return """ + package com.example; + + import com.google.common.collect.ImmutableSet; + import org.apache.commons.lang3.StringUtils; + + public class Lib { + public static ImmutableSet getPeople() { + return ImmutableSet.of(capitalize("adam johnson"), capitalize("bob smith"), capitalize("carl jones")); + } + + private static String capitalize(String input) { + return StringUtils.capitalize(input); + } + } + """ + } } From 63d4b8dd751484d38c7c035559bceebf14419dfc Mon Sep 17 00:00:00 2001 From: Tom Tresansky Date: Thu, 29 Feb 2024 09:40:55 -0500 Subject: [PATCH 05/17] Rename deps to dependencies, this wasn't the cause of issues --- ...larativeDslProjectBuildFileIntegrationSpec.groovy | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDslProjectBuildFileIntegrationSpec.groovy b/platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDslProjectBuildFileIntegrationSpec.groovy index 9ff59e026a67..9e984e7a7165 100644 --- a/platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDslProjectBuildFileIntegrationSpec.groovy +++ b/platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDslProjectBuildFileIntegrationSpec.groovy @@ -155,7 +155,7 @@ class DeclarativeDslProjectBuildFileIntegrationSpec extends AbstractIntegrationS } library { - deps { // TODO: Don't name this dependencies??? Can this be reset? + dependencies { api("com.google.guava:guava:30.1.1-jre") implementation("com.apache.commons:commons-lang3:3.12.0") } @@ -217,7 +217,7 @@ class DeclarativeDslProjectBuildFileIntegrationSpec extends AbstractIntegrationS } library { - deps { // TODO: Don't name this dependencies??? Can this be reset? + dependencies { // TODO: Don't name this dependencies??? Can this be reset? api("com.google.guava:guava:30.1.1-jre") implementation("com.apache.commons:commons-lang3:3.12.0") } @@ -463,16 +463,16 @@ secondaryAccess { three, true, true}""" @Restricted public abstract class LibraryExtension { - private final RestrictedLibraryDependencies deps; + private final RestrictedLibraryDependencies dependencies; @Inject public LibraryExtension(ObjectFactory objectFactory) { - this.deps = objectFactory.newInstance(RestrictedLibraryDependencies.class); + this.dependencies = objectFactory.newInstance(RestrictedLibraryDependencies.class); } @Configuring - public void deps(Action configure) { - configure.execute(deps); + public void dependencies(Action configure) { + configure.execute(dependencies); } } """ From ed3fd062a6147f848d984e716d8faaf27c7ed54e Mon Sep 17 00:00:00 2001 From: Tom Tresansky Date: Thu, 29 Feb 2024 11:11:36 -0500 Subject: [PATCH 06/17] Remove unnecessary annotations on RLD type --- .../internal/declarativedsl/project/ProjectTopLevelReceiver.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/ProjectTopLevelReceiver.kt b/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/ProjectTopLevelReceiver.kt index 19d3e95588e4..738f44a607d7 100644 --- a/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/ProjectTopLevelReceiver.kt +++ b/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/ProjectTopLevelReceiver.kt @@ -42,8 +42,6 @@ interface ProjectTopLevelReceiver { interface RestrictedDependenciesHandler interface RestrictedLibraryDependencies : PlatformDependencyModifiers, GradleDependencies { - @Restricted fun getApi(): DependencyCollector - @Restricted fun getImplementation(): DependencyCollector } From 032758f82aa5498914e5c3a559532795bcbf375a Mon Sep 17 00:00:00 2001 From: Tom Tresansky Date: Thu, 29 Feb 2024 11:22:28 -0500 Subject: [PATCH 07/17] Clean up extractor and tests --- ...eDslProjectBuildFileIntegrationSpec.groovy | 36 +------------------ .../project/dependencyConfigurationSchema.kt | 13 ++----- 2 files changed, 4 insertions(+), 45 deletions(-) diff --git a/platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDslProjectBuildFileIntegrationSpec.groovy b/platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDslProjectBuildFileIntegrationSpec.groovy index 9e984e7a7165..e946816a069d 100644 --- a/platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDslProjectBuildFileIntegrationSpec.groovy +++ b/platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDslProjectBuildFileIntegrationSpec.groovy @@ -109,23 +109,6 @@ class DeclarativeDslProjectBuildFileIntegrationSpec extends AbstractIntegrationS given: file("buildSrc/build.gradle") << defineRestrictedPluginBuild() -// file("buildSrc/src/main/java/com/example/restricted/LibraryDependencies.java") << """ -// package com.example.restricted; -// -// import org.gradle.api.artifacts.dsl.DependencyCollector; -// import org.gradle.api.artifacts.dsl.GradleDependencies; -// import org.gradle.api.plugins.jvm.PlatformDependencyModifiers; -// import org.gradle.api.plugins.jvm.TestFixturesDependencyModifiers; -// import org.gradle.declarative.dsl.model.annotations.Adding; -// import org.gradle.declarative.dsl.model.annotations.Restricted; -// -// @Restricted -// public interface LibraryDependencies extends PlatformDependencyModifiers, TestFixturesDependencyModifiers, GradleDependencies { -// DependencyCollector getApi(); -// DependencyCollector getImplementation(); -// } -// """ - file("buildSrc/src/main/java/com/example/restricted/LibraryExtension.java") << defineLibraryExtension() file("buildSrc/src/main/java/com/example/restricted/RestrictedPlugin.java") << """ @@ -172,23 +155,6 @@ class DeclarativeDslProjectBuildFileIntegrationSpec extends AbstractIntegrationS given: file("buildSrc/build.gradle") << defineRestrictedPluginBuild() -// file("buildSrc/src/main/java/com/example/restricted/LibraryDependencies.java") << """ -// package com.example.restricted; -// -// import org.gradle.api.artifacts.dsl.DependencyCollector; -// import org.gradle.api.artifacts.dsl.GradleDependencies; -// import org.gradle.api.plugins.jvm.PlatformDependencyModifiers; -// import org.gradle.api.plugins.jvm.TestFixturesDependencyModifiers; -// import org.gradle.declarative.dsl.model.annotations.Adding; -// import org.gradle.declarative.dsl.model.annotations.Restricted; -// -// @Restricted -// public interface LibraryDependencies extends PlatformDependencyModifiers, TestFixturesDependencyModifiers, GradleDependencies { -// DependencyCollector getApi(); -// DependencyCollector getImplementation(); -// } -// """ - file("buildSrc/src/main/java/com/example/restricted/LibraryExtension.java") << defineLibraryExtension() file("buildSrc/src/main/java/com/example/restricted/RestrictedPlugin.java") << """ @@ -217,7 +183,7 @@ class DeclarativeDslProjectBuildFileIntegrationSpec extends AbstractIntegrationS } library { - dependencies { // TODO: Don't name this dependencies??? Can this be reset? + dependencies { api("com.google.guava:guava:30.1.1-jre") implementation("com.apache.commons:commons-lang3:3.12.0") } diff --git a/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/dependencyConfigurationSchema.kt b/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/dependencyConfigurationSchema.kt index e141ec0078f9..eea4929ca3fb 100644 --- a/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/dependencyConfigurationSchema.kt +++ b/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/dependencyConfigurationSchema.kt @@ -101,22 +101,15 @@ private class DependencyCollectorFunctionsExtractor(val configurations: DependencyConfigurations) : FunctionExtractor { override fun memberFunctions(kClass: KClass<*>, preIndex: DataSchemaBuilder.PreIndex): Iterable = if (kClass == RestrictedLibraryDependencies::class) { - listOf( - DataMemberFunction( - kClass.toDataTypeRef(), - "api", - listOf(DataParameter("dependency", String::class.toDataTypeRef(), false, ParameterSemantics.Unknown)), - false, - FunctionSemantics.AddAndConfigure(RestrictedLibraryDependencies::class.toDataTypeRef(), FunctionSemantics.ConfigureSemantics.ConfigureBlockRequirement.NOT_ALLOWED) - ), + configurations.configurationNames.map { configurationName -> DataMemberFunction( kClass.toDataTypeRef(), - "implementation", + configurationName, listOf(DataParameter("dependency", String::class.toDataTypeRef(), false, ParameterSemantics.Unknown)), false, FunctionSemantics.AddAndConfigure(RestrictedLibraryDependencies::class.toDataTypeRef(), FunctionSemantics.ConfigureSemantics.ConfigureBlockRequirement.NOT_ALLOWED) ) - ) + } } else emptyList() override fun constructors(kClass: KClass<*>, preIndex: DataSchemaBuilder.PreIndex): Iterable = emptyList() From b92936aec4f909f1dd397a3533b5c4466137de73 Mon Sep 17 00:00:00 2001 From: Tom Tresansky Date: Thu, 29 Feb 2024 11:54:37 -0500 Subject: [PATCH 08/17] Cleanup tests, test custom extension and pre-defined extracted extension --- ...DSLCustomDependenciesExtensionsSpec.groovy | 279 ++++++++++++++++++ ...eDslProjectBuildFileIntegrationSpec.groovy | 167 +---------- 2 files changed, 288 insertions(+), 158 deletions(-) create mode 100644 platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDSLCustomDependenciesExtensionsSpec.groovy diff --git a/platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDSLCustomDependenciesExtensionsSpec.groovy b/platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDSLCustomDependenciesExtensionsSpec.groovy new file mode 100644 index 000000000000..4a2723461787 --- /dev/null +++ b/platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDSLCustomDependenciesExtensionsSpec.groovy @@ -0,0 +1,279 @@ +/* + * Copyright 2024 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.gradle.internal.declarativedsl.project + +import org.gradle.integtests.fixtures.AbstractIntegrationSpec + +class DeclarativeDSLCustomDependenciesExtensionsSpec extends AbstractIntegrationSpec { + def 'can configure a custom plugin extension in declarative DSL with custom dependencies extension'() { + given: + file("buildSrc/build.gradle") << defineRestrictedPluginBuild() + file("buildSrc/src/main/java/com/example/restricted/LibraryExtension.java") << defineLibraryExtension("com.example.restricted.DependenciesExtension") + file("buildSrc/src/main/java/com/example/restricted/DependenciesExtension.java") << defineDependenciesExtension() + file("buildSrc/src/main/java/com/example/restricted/RestrictedPlugin.java") << """ + package com.example.restricted; + + import org.gradle.api.DefaultTask; + import org.gradle.api.Plugin; + import org.gradle.api.Project; + import org.gradle.api.provider.ListProperty; + import org.gradle.api.provider.Property; + import org.gradle.api.plugins.JavaLibraryPlugin; + + public class RestrictedPlugin implements Plugin { + @Override + public void apply(Project project) { + LibraryExtension restricted = project.getExtensions().create("library", LibraryExtension.class); + project.getConfigurations().resolvable("api"); + project.getConfigurations().resolvable("implementation"); + } + } + """ + + and: + file("build.gradle.something") << defineBuildScript() + file("src/main/java/com/example/Lib.java") << defineExampleJavaLibraryClass() + + expect: + succeeds("tasks") + } + + def 'can configure a custom plugin extension in declarative DSL and build a java plugin with custom dependencies extension'() { + given: + file("buildSrc/build.gradle") << defineRestrictedPluginBuild() + file("buildSrc/src/main/java/com/example/restricted/LibraryExtension.java") << defineLibraryExtension("com.example.restricted.DependenciesExtension") + file("buildSrc/src/main/java/com/example/restricted/DependenciesExtension.java") << defineDependenciesExtension() + file("buildSrc/src/main/java/com/example/restricted/RestrictedPlugin.java") << """ + package com.example.restricted; + + import org.gradle.api.DefaultTask; + import org.gradle.api.Plugin; + import org.gradle.api.Project; + import org.gradle.api.provider.ListProperty; + import org.gradle.api.provider.Property; + import org.gradle.api.plugins.JavaLibraryPlugin; + + public class RestrictedPlugin implements Plugin { + @Override + public void apply(Project project) { + project.getPluginManager().apply(JavaLibraryPlugin.class); + LibraryExtension restricted = project.getExtensions().create("library", LibraryExtension.class);\ + } + } + """ + + and: + file("build.gradle.something") << defineBuildScript() + file("src/main/java/com/example/Lib.java") << defineExampleJavaLibraryClass() + + expect: + succeeds("build") + + and: + file("build/libs/${testDirectory.name}.jar").exists() + } + + def 'can configure a custom plugin extension in declarative DSL with pre-defined, extracted dependencies extension'() { + given: + file("buildSrc/build.gradle") << defineRestrictedPluginBuild() + file("buildSrc/src/main/java/com/example/restricted/LibraryExtension.java") << defineLibraryExtension() + file("buildSrc/src/main/java/com/example/restricted/DependenciesExtension.java") << defineDependenciesExtension() + file("buildSrc/src/main/java/com/example/restricted/RestrictedPlugin.java") << """ + package com.example.restricted; + + import org.gradle.api.DefaultTask; + import org.gradle.api.Plugin; + import org.gradle.api.Project; + import org.gradle.api.provider.ListProperty; + import org.gradle.api.provider.Property; + import org.gradle.api.plugins.JavaLibraryPlugin; + + public class RestrictedPlugin implements Plugin { + @Override + public void apply(Project project) { + LibraryExtension restricted = project.getExtensions().create("library", LibraryExtension.class); + project.getConfigurations().resolvable("api"); + project.getConfigurations().resolvable("implementation"); + } + } + """ + + and: + file("src/main/java/com/example/Lib.java") << defineExampleJavaLibraryClass() + file("build.gradle.something") << defineBuildScript() + + expect: + succeeds("tasks") + } + + def 'can configure a custom plugin extension in declarative DSL and build a java plugin with pre-defined, extracted dependencies extension'() { + given: + file("buildSrc/build.gradle") << defineRestrictedPluginBuild() + file("buildSrc/src/main/java/com/example/restricted/LibraryExtension.java") << defineLibraryExtension() + file("buildSrc/src/main/java/com/example/restricted/DependenciesExtension.java") << defineDependenciesExtension() + file("buildSrc/src/main/java/com/example/restricted/RestrictedPlugin.java") << """ + package com.example.restricted; + + import org.gradle.api.DefaultTask; + import org.gradle.api.Plugin; + import org.gradle.api.Project; + import org.gradle.api.provider.ListProperty; + import org.gradle.api.provider.Property; + import org.gradle.api.plugins.JavaLibraryPlugin; + + public class RestrictedPlugin implements Plugin { + @Override + public void apply(Project project) { + project.getPluginManager().apply(JavaLibraryPlugin.class); + LibraryExtension restricted = project.getExtensions().create("library", LibraryExtension.class);\ + } + } + """ + + and: + file("src/main/java/com/example/Lib.java") << defineExampleJavaLibraryClass() + file("build.gradle.something") << defineBuildScript() + + expect: + succeeds("build") + + and: + file("build/libs/${testDirectory.name}.jar").exists() + } + + private String defineLibraryExtension(String dependenciesType = RestrictedLibraryDependencies.name) { + return """ + package com.example.restricted; + + import org.gradle.api.Action; + import org.gradle.api.model.ObjectFactory; + import org.gradle.api.provider.ListProperty; + import org.gradle.api.provider.Property; + import org.gradle.declarative.dsl.model.annotations.Adding; + import org.gradle.declarative.dsl.model.annotations.Configuring; + import org.gradle.declarative.dsl.model.annotations.Restricted; + import ${dependenciesType}; + + import javax.inject.Inject; + + @Restricted + public abstract class LibraryExtension { + private final ${dependenciesType} dependencies; + + @Inject + public LibraryExtension(ObjectFactory objectFactory) { + this.dependencies = objectFactory.newInstance(${dependenciesType}.class); + } + + @Configuring + public void dependencies(Action configure) { + configure.execute(dependencies); + } + } + """ + } + + private String defineExampleJavaLibraryClass() { + return """ + package com.example; + + import com.google.common.collect.ImmutableSet; + import org.apache.commons.lang3.StringUtils; + + public class Lib { + public static ImmutableSet getPeople() { + return ImmutableSet.of(capitalize("adam johnson"), capitalize("bob smith"), capitalize("carl jones")); + } + + private static String capitalize(String input) { + return StringUtils.capitalize(input); + } + } + """ + } + + private String defineDependenciesExtension() { + return """ + package com.example.restricted; + + import org.gradle.api.artifacts.dsl.DependencyCollector; + import org.gradle.api.artifacts.dsl.GradleDependencies; + import org.gradle.api.plugins.jvm.PlatformDependencyModifiers; + import org.gradle.api.plugins.jvm.TestFixturesDependencyModifiers; + import org.gradle.declarative.dsl.model.annotations.Adding; + import org.gradle.declarative.dsl.model.annotations.Restricted; + import org.gradle.declarative.dsl.model.annotations.Configuring; + import org.gradle.api.Action; + import org.gradle.api.artifacts.ExternalModuleDependency; + + @Restricted + public interface DependenciesExtension extends PlatformDependencyModifiers, TestFixturesDependencyModifiers, GradleDependencies { + DependencyCollector getApi(); + DependencyCollector getImplementation(); + + @Adding + default void api(String dependencyNotation) { + api(dependencyNotation, null); + } + + default void api(String dependencyNotation, Action configure) { + getApi().add(dependencyNotation, configure); + } + + @Adding + default void implementation(String dependencyNotation) { + implementation(dependencyNotation, null); + } + + default void implementation(String dependencyNotation, Action configure) { + getImplementation().add(dependencyNotation, configure); + } + } + """ + } + + private String defineBuildScript() { + return """ + plugins { + id("com.example.restricted") + } + + library { + dependencies { + api("com.google.guava:guava:30.1.1-jre") + implementation("com.apache.commons:commons-lang3:3.12.0") + } + } + """ + } + + private String defineRestrictedPluginBuild() { + return """ + plugins { + id('java-gradle-plugin') + } + gradlePlugin { + plugins { + create("restrictedPlugin") { + id = "com.example.restricted" + implementationClass = "com.example.restricted.RestrictedPlugin" + } + } + } + """ + } +} diff --git a/platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDslProjectBuildFileIntegrationSpec.groovy b/platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDslProjectBuildFileIntegrationSpec.groovy index e946816a069d..238654d882fe 100644 --- a/platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDslProjectBuildFileIntegrationSpec.groovy +++ b/platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDslProjectBuildFileIntegrationSpec.groovy @@ -105,104 +105,22 @@ class DeclarativeDslProjectBuildFileIntegrationSpec extends AbstractIntegrationS ].every { it.isFile() && it.text != "" } } - def 'can configure a custom plugin extension using DependencyCollector in declarative DSL'() { - given: - file("buildSrc/build.gradle") << defineRestrictedPluginBuild() - - file("buildSrc/src/main/java/com/example/restricted/LibraryExtension.java") << defineLibraryExtension() - - file("buildSrc/src/main/java/com/example/restricted/RestrictedPlugin.java") << """ - package com.example.restricted; - - import org.gradle.api.DefaultTask; - import org.gradle.api.Plugin; - import org.gradle.api.Project; - import org.gradle.api.provider.ListProperty; - import org.gradle.api.provider.Property; - import org.gradle.api.plugins.JavaLibraryPlugin; - - public class RestrictedPlugin implements Plugin { - @Override - public void apply(Project project) { - LibraryExtension restricted = project.getExtensions().create("library", LibraryExtension.class); - project.getConfigurations().resolvable("api"); - project.getConfigurations().resolvable("implementation"); - } - } - """ - - and: - file("build.gradle.something") << """ - plugins { - id("com.example.restricted") - } - - library { - dependencies { - api("com.google.guava:guava:30.1.1-jre") - implementation("com.apache.commons:commons-lang3:3.12.0") - } - } - """ - - file("src/main/java/com/example/Lib.java") << defineExampleJavaLibraryClass() - - expect: - succeeds("tasks") - } - - def 'can configure a custom plugin extension using DependencyCollector in declarative DSL and build a java plugin'() { + def 'can configure a custom plugin extension in declarative DSL'() { given: - file("buildSrc/build.gradle") << defineRestrictedPluginBuild() - - file("buildSrc/src/main/java/com/example/restricted/LibraryExtension.java") << defineLibraryExtension() - - file("buildSrc/src/main/java/com/example/restricted/RestrictedPlugin.java") << """ - package com.example.restricted; - - import org.gradle.api.DefaultTask; - import org.gradle.api.Plugin; - import org.gradle.api.Project; - import org.gradle.api.provider.ListProperty; - import org.gradle.api.provider.Property; - import org.gradle.api.plugins.JavaLibraryPlugin; - - public class RestrictedPlugin implements Plugin { - @Override - public void apply(Project project) { - project.getPluginManager().apply(JavaLibraryPlugin.class); - LibraryExtension restricted = project.getExtensions().create("library", LibraryExtension.class);\ - } - } - """ - - and: - file("build.gradle.something") << """ + file("buildSrc/build.gradle") << """ plugins { - id("com.example.restricted") + id('java-gradle-plugin') } - - library { - dependencies { - api("com.google.guava:guava:30.1.1-jre") - implementation("com.apache.commons:commons-lang3:3.12.0") + gradlePlugin { + plugins { + create("restrictedPlugin") { + id = "com.example.restricted" + implementationClass = "com.example.restricted.RestrictedPlugin" + } } } """ - file("src/main/java/com/example/Lib.java") << defineExampleJavaLibraryClass() - - expect: - succeeds("build") - - and: - file("build/libs/${testDirectory.name}.jar").exists() - } - - def 'can configure a custom plugin extension in declarative DSL'() { - given: - file("buildSrc/build.gradle") << defineRestrictedPluginBuild() - file("buildSrc/src/main/java/com/example/restricted/Extension.java") << """ package com.example.restricted; @@ -395,71 +313,4 @@ secondaryAccess { three, true, true}""" "language feature" | "body" | "" | "@A dependencies { }" | "4:9: unsupported language feature: AnnotationUsage" "semantic" | "body" | "" | "x = 1" | "4:9: unresolved reference 'x'" } - - private String defineRestrictedPluginBuild() { - return """ - plugins { - id('java-gradle-plugin') - } - gradlePlugin { - plugins { - create("restrictedPlugin") { - id = "com.example.restricted" - implementationClass = "com.example.restricted.RestrictedPlugin" - } - } - } - """ - } - - private String defineLibraryExtension() { - return """ - package com.example.restricted; - - import org.gradle.api.Action; - import org.gradle.api.model.ObjectFactory; - import org.gradle.api.provider.ListProperty; - import org.gradle.api.provider.Property; - import org.gradle.declarative.dsl.model.annotations.Adding; - import org.gradle.declarative.dsl.model.annotations.Configuring; - import org.gradle.declarative.dsl.model.annotations.Restricted; - import org.gradle.internal.declarativedsl.project.RestrictedLibraryDependencies; - - import javax.inject.Inject; - - @Restricted - public abstract class LibraryExtension { - private final RestrictedLibraryDependencies dependencies; - - @Inject - public LibraryExtension(ObjectFactory objectFactory) { - this.dependencies = objectFactory.newInstance(RestrictedLibraryDependencies.class); - } - - @Configuring - public void dependencies(Action configure) { - configure.execute(dependencies); - } - } - """ - } - - private String defineExampleJavaLibraryClass() { - return """ - package com.example; - - import com.google.common.collect.ImmutableSet; - import org.apache.commons.lang3.StringUtils; - - public class Lib { - public static ImmutableSet getPeople() { - return ImmutableSet.of(capitalize("adam johnson"), capitalize("bob smith"), capitalize("carl jones")); - } - - private static String capitalize(String input) { - return StringUtils.capitalize(input); - } - } - """ - } } From 878714b957be048d8b0b9f0dcbe70de521c16815 Mon Sep 17 00:00:00 2001 From: Tom Tresansky Date: Thu, 29 Feb 2024 11:56:59 -0500 Subject: [PATCH 09/17] Rename types for clarity --- .../project/dependencyConfigurationSchema.kt | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/dependencyConfigurationSchema.kt b/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/dependencyConfigurationSchema.kt index eea4929ca3fb..c913a4cadc7a 100644 --- a/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/dependencyConfigurationSchema.kt +++ b/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/dependencyConfigurationSchema.kt @@ -16,7 +16,6 @@ package org.gradle.internal.declarativedsl.project -import org.gradle.api.Action import org.gradle.internal.declarativedsl.analysis.DataConstructor import org.gradle.internal.declarativedsl.analysis.DataMemberFunction import org.gradle.internal.declarativedsl.analysis.DataParameter @@ -31,15 +30,10 @@ import org.gradle.internal.declarativedsl.schemaBuilder.DataSchemaBuilder import org.gradle.internal.declarativedsl.schemaBuilder.FunctionExtractor import org.gradle.internal.declarativedsl.schemaBuilder.toDataTypeRef import org.gradle.api.Project -import org.gradle.api.artifacts.ExternalModuleDependency -import org.gradle.api.artifacts.MinimalExternalModuleDependency import org.gradle.api.artifacts.ProjectDependency -import org.gradle.api.artifacts.dsl.DependencyCollector import org.gradle.api.artifacts.dsl.DependencyHandler import org.gradle.internal.declarativedsl.analysis.FunctionSemantics.ConfigureSemantics.ConfigureBlockRequirement.NOT_ALLOWED -import org.gradle.internal.declarativedsl.analysis.ref import org.gradle.internal.declarativedsl.evaluationSchema.EvaluationSchemaComponent -import org.gradle.internal.declarativedsl.language.DataType import kotlin.reflect.KClass import kotlin.reflect.KFunction import kotlin.reflect.full.isSubclassOf @@ -62,12 +56,12 @@ class DependencyConfigurationsComponent( override fun functionExtractors(): List = listOf( DependencyFunctionsExtractor(configurations), - DependencyCollectorFunctionsExtractor(configurations) + RestrictedLibraryDependenciesFunctionsExtractor(configurations) ) override fun runtimeFunctionResolvers(): List = listOf( RuntimeDependencyFunctionResolver(configurations), - RuntimeDependencyCollectorFunctionResolver(configurations) + RuntimeRestrictedLibraryDependenciesFunctionResolver(configurations) ) } @@ -98,7 +92,7 @@ class DependencyFunctionsExtractor(val configurations: DependencyConfigurations) } private -class DependencyCollectorFunctionsExtractor(val configurations: DependencyConfigurations) : FunctionExtractor { +class RestrictedLibraryDependenciesFunctionsExtractor(val configurations: DependencyConfigurations) : FunctionExtractor { override fun memberFunctions(kClass: KClass<*>, preIndex: DataSchemaBuilder.PreIndex): Iterable = if (kClass == RestrictedLibraryDependencies::class) { configurations.configurationNames.map { configurationName -> @@ -135,7 +129,7 @@ class RuntimeDependencyFunctionResolver(configurations: DependencyConfigurations } private -class RuntimeDependencyCollectorFunctionResolver(configurations: DependencyConfigurations) : RuntimeFunctionResolver { +class RuntimeRestrictedLibraryDependenciesFunctionResolver(configurations: DependencyConfigurations) : RuntimeFunctionResolver { private val nameSet = configurations.configurationNames.toSet() From 5f6db5090bf38c3a8abcc3531fe187d58ef64f67 Mon Sep 17 00:00:00 2001 From: Tom Tresansky Date: Thu, 29 Feb 2024 15:28:59 -0500 Subject: [PATCH 10/17] Detect usage of DependencyCollector automatically in restricted DSL - Prune tests down to essentials, clean and document. --- ...DSLCustomDependenciesExtensionsSpec.groovy | 227 ++++++------------ .../project/ProjectTopLevelReceiver.kt | 5 - .../project/dependencyConfigurationSchema.kt | 78 +++--- 3 files changed, 115 insertions(+), 195 deletions(-) diff --git a/platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDSLCustomDependenciesExtensionsSpec.groovy b/platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDSLCustomDependenciesExtensionsSpec.groovy index 4a2723461787..e5dbfc411cdf 100644 --- a/platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDSLCustomDependenciesExtensionsSpec.groovy +++ b/platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDSLCustomDependenciesExtensionsSpec.groovy @@ -19,175 +19,146 @@ package org.gradle.internal.declarativedsl.project import org.gradle.integtests.fixtures.AbstractIntegrationSpec class DeclarativeDSLCustomDependenciesExtensionsSpec extends AbstractIntegrationSpec { - def 'can configure a custom plugin extension in declarative DSL with custom dependencies extension'() { - given: - file("buildSrc/build.gradle") << defineRestrictedPluginBuild() - file("buildSrc/src/main/java/com/example/restricted/LibraryExtension.java") << defineLibraryExtension("com.example.restricted.DependenciesExtension") + def 'can configure an extension using DependencyCollector in declarative DSL'() { + given: "a plugin that creates a custom extension using a DependencyCollector" file("buildSrc/src/main/java/com/example/restricted/DependenciesExtension.java") << defineDependenciesExtension() + file("buildSrc/src/main/java/com/example/restricted/LibraryExtension.java") << defineLibraryExtension() file("buildSrc/src/main/java/com/example/restricted/RestrictedPlugin.java") << """ package com.example.restricted; - import org.gradle.api.DefaultTask; import org.gradle.api.Plugin; import org.gradle.api.Project; - import org.gradle.api.provider.ListProperty; - import org.gradle.api.provider.Property; - import org.gradle.api.plugins.JavaLibraryPlugin; + import org.gradle.api.artifacts.DependencyScopeConfiguration; public class RestrictedPlugin implements Plugin { @Override public void apply(Project project) { + // no plugin application, must create configurations manually + DependencyScopeConfiguration api = project.getConfigurations().dependencyScope("api").get(); + DependencyScopeConfiguration implementation = project.getConfigurations().dependencyScope("implementation").get(); + + // create and wire the custom dependencies extension's dependencies to these global configurations LibraryExtension restricted = project.getExtensions().create("library", LibraryExtension.class); - project.getConfigurations().resolvable("api"); - project.getConfigurations().resolvable("implementation"); + api.fromDependencyCollector(restricted.getDependencies().getApi()); + implementation.fromDependencyCollector(restricted.getDependencies().getImplementation()); } } """ + file("buildSrc/build.gradle") << defineRestrictedPluginBuild() + + and: "a build script that adds dependencies using the custom extension" + file("build.gradle.something") << defineDeclarativeDSLBuildScript() - and: - file("build.gradle.something") << defineBuildScript() - file("src/main/java/com/example/Lib.java") << defineExampleJavaLibraryClass() + expect: "a dependency has been added to the api configuration" + succeeds("dependencies", "--configuration", "api") + result.assertOutputContains("com.google.guava:guava:30.1.1-jre") - expect: - succeeds("tasks") + and: "a dependency has been added to the implementation configuration" + succeeds("dependencies", "--configuration", "implementation") + result.assertOutputContains("com.apache.commons:commons-lang3:3.12.0") } - def 'can configure a custom plugin extension in declarative DSL and build a java plugin with custom dependencies extension'() { - given: - file("buildSrc/build.gradle") << defineRestrictedPluginBuild() - file("buildSrc/src/main/java/com/example/restricted/LibraryExtension.java") << defineLibraryExtension("com.example.restricted.DependenciesExtension") + def 'can configure an extension using DependencyCollector in declarative DSL and build a java plugin'() { + given: "a plugin that creates a custom extension using a DependencyCollector and applies the java library plugin" file("buildSrc/src/main/java/com/example/restricted/DependenciesExtension.java") << defineDependenciesExtension() + file("buildSrc/src/main/java/com/example/restricted/LibraryExtension.java") << defineLibraryExtension() file("buildSrc/src/main/java/com/example/restricted/RestrictedPlugin.java") << """ package com.example.restricted; - import org.gradle.api.DefaultTask; import org.gradle.api.Plugin; import org.gradle.api.Project; - import org.gradle.api.provider.ListProperty; - import org.gradle.api.provider.Property; import org.gradle.api.plugins.JavaLibraryPlugin; public class RestrictedPlugin implements Plugin { @Override public void apply(Project project) { + // api and implementation configurations created by plugin project.getPluginManager().apply(JavaLibraryPlugin.class); - LibraryExtension restricted = project.getExtensions().create("library", LibraryExtension.class);\ + + // inner dependencies extension automatically wired to configurations created by plugin + project.getExtensions().create("library", LibraryExtension.class); } } """ + file("buildSrc/build.gradle") << defineRestrictedPluginBuild() - and: - file("build.gradle.something") << defineBuildScript() - file("src/main/java/com/example/Lib.java") << defineExampleJavaLibraryClass() + and: "a build script that adds dependencies using the custom extension, and defines a source file requiring the dependencies to compile" + file("src/main/java/com/example/Lib.java") << defineExampleJavaClass() + file("build.gradle.something") << defineDeclarativeDSLBuildScript() - expect: + expect: "the library can be built successfully" succeeds("build") - - and: file("build/libs/${testDirectory.name}.jar").exists() } - def 'can configure a custom plugin extension in declarative DSL with pre-defined, extracted dependencies extension'() { - given: - file("buildSrc/build.gradle") << defineRestrictedPluginBuild() - file("buildSrc/src/main/java/com/example/restricted/LibraryExtension.java") << defineLibraryExtension() - file("buildSrc/src/main/java/com/example/restricted/DependenciesExtension.java") << defineDependenciesExtension() - file("buildSrc/src/main/java/com/example/restricted/RestrictedPlugin.java") << """ - package com.example.restricted; - - import org.gradle.api.DefaultTask; - import org.gradle.api.Plugin; - import org.gradle.api.Project; - import org.gradle.api.provider.ListProperty; - import org.gradle.api.provider.Property; - import org.gradle.api.plugins.JavaLibraryPlugin; - - public class RestrictedPlugin implements Plugin { - @Override - public void apply(Project project) { - LibraryExtension restricted = project.getExtensions().create("library", LibraryExtension.class); - project.getConfigurations().resolvable("api"); - project.getConfigurations().resolvable("implementation"); - } - } - """ - - and: - file("src/main/java/com/example/Lib.java") << defineExampleJavaLibraryClass() - file("build.gradle.something") << defineBuildScript() - - expect: - succeeds("tasks") - } - - def 'can configure a custom plugin extension in declarative DSL and build a java plugin with pre-defined, extracted dependencies extension'() { - given: - file("buildSrc/build.gradle") << defineRestrictedPluginBuild() - file("buildSrc/src/main/java/com/example/restricted/LibraryExtension.java") << defineLibraryExtension() - file("buildSrc/src/main/java/com/example/restricted/DependenciesExtension.java") << defineDependenciesExtension() - file("buildSrc/src/main/java/com/example/restricted/RestrictedPlugin.java") << """ + private String defineDependenciesExtension() { + return """ package com.example.restricted; - import org.gradle.api.DefaultTask; - import org.gradle.api.Plugin; - import org.gradle.api.Project; - import org.gradle.api.provider.ListProperty; - import org.gradle.api.provider.Property; - import org.gradle.api.plugins.JavaLibraryPlugin; + import org.gradle.api.artifacts.dsl.DependencyCollector; + import org.gradle.api.artifacts.dsl.GradleDependencies; + import org.gradle.api.plugins.jvm.PlatformDependencyModifiers; + import org.gradle.api.plugins.jvm.TestFixturesDependencyModifiers; + import org.gradle.declarative.dsl.model.annotations.Restricted; - public class RestrictedPlugin implements Plugin { - @Override - public void apply(Project project) { - project.getPluginManager().apply(JavaLibraryPlugin.class); - LibraryExtension restricted = project.getExtensions().create("library", LibraryExtension.class);\ - } + @Restricted + public interface DependenciesExtension extends PlatformDependencyModifiers, TestFixturesDependencyModifiers, GradleDependencies { + DependencyCollector getApi(); + DependencyCollector getImplementation(); } """ - - and: - file("src/main/java/com/example/Lib.java") << defineExampleJavaLibraryClass() - file("build.gradle.something") << defineBuildScript() - - expect: - succeeds("build") - - and: - file("build/libs/${testDirectory.name}.jar").exists() } - private String defineLibraryExtension(String dependenciesType = RestrictedLibraryDependencies.name) { + private String defineLibraryExtension() { return """ package com.example.restricted; import org.gradle.api.Action; import org.gradle.api.model.ObjectFactory; - import org.gradle.api.provider.ListProperty; - import org.gradle.api.provider.Property; - import org.gradle.declarative.dsl.model.annotations.Adding; import org.gradle.declarative.dsl.model.annotations.Configuring; import org.gradle.declarative.dsl.model.annotations.Restricted; - import ${dependenciesType}; import javax.inject.Inject; @Restricted public abstract class LibraryExtension { - private final ${dependenciesType} dependencies; + private final DependenciesExtension dependencies; @Inject public LibraryExtension(ObjectFactory objectFactory) { - this.dependencies = objectFactory.newInstance(${dependenciesType}.class); + this.dependencies = objectFactory.newInstance(DependenciesExtension.class); + } + + public DependenciesExtension getDependencies() { + return dependencies; } @Configuring - public void dependencies(Action configure) { + public void dependencies(Action configure) { configure.execute(dependencies); } } """ } - private String defineExampleJavaLibraryClass() { + private String defineRestrictedPluginBuild() { + return """ + plugins { + id('java-gradle-plugin') + } + + gradlePlugin { + plugins { + create("restrictedPlugin") { + id = "com.example.restricted" + implementationClass = "com.example.restricted.RestrictedPlugin" + } + } + } + """ + } + + private String defineExampleJavaClass() { return """ package com.example; @@ -206,47 +177,7 @@ class DeclarativeDSLCustomDependenciesExtensionsSpec extends AbstractIntegration """ } - private String defineDependenciesExtension() { - return """ - package com.example.restricted; - - import org.gradle.api.artifacts.dsl.DependencyCollector; - import org.gradle.api.artifacts.dsl.GradleDependencies; - import org.gradle.api.plugins.jvm.PlatformDependencyModifiers; - import org.gradle.api.plugins.jvm.TestFixturesDependencyModifiers; - import org.gradle.declarative.dsl.model.annotations.Adding; - import org.gradle.declarative.dsl.model.annotations.Restricted; - import org.gradle.declarative.dsl.model.annotations.Configuring; - import org.gradle.api.Action; - import org.gradle.api.artifacts.ExternalModuleDependency; - - @Restricted - public interface DependenciesExtension extends PlatformDependencyModifiers, TestFixturesDependencyModifiers, GradleDependencies { - DependencyCollector getApi(); - DependencyCollector getImplementation(); - - @Adding - default void api(String dependencyNotation) { - api(dependencyNotation, null); - } - - default void api(String dependencyNotation, Action configure) { - getApi().add(dependencyNotation, configure); - } - - @Adding - default void implementation(String dependencyNotation) { - implementation(dependencyNotation, null); - } - - default void implementation(String dependencyNotation, Action configure) { - getImplementation().add(dependencyNotation, configure); - } - } - """ - } - - private String defineBuildScript() { + private String defineDeclarativeDSLBuildScript() { return """ plugins { id("com.example.restricted") @@ -260,20 +191,4 @@ class DeclarativeDSLCustomDependenciesExtensionsSpec extends AbstractIntegration } """ } - - private String defineRestrictedPluginBuild() { - return """ - plugins { - id('java-gradle-plugin') - } - gradlePlugin { - plugins { - create("restrictedPlugin") { - id = "com.example.restricted" - implementationClass = "com.example.restricted.RestrictedPlugin" - } - } - } - """ - } } diff --git a/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/ProjectTopLevelReceiver.kt b/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/ProjectTopLevelReceiver.kt index 738f44a607d7..6aefbfed9511 100644 --- a/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/ProjectTopLevelReceiver.kt +++ b/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/ProjectTopLevelReceiver.kt @@ -40,8 +40,3 @@ interface ProjectTopLevelReceiver { interface RestrictedDependenciesHandler - -interface RestrictedLibraryDependencies : PlatformDependencyModifiers, GradleDependencies { - fun getApi(): DependencyCollector - fun getImplementation(): DependencyCollector -} diff --git a/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/dependencyConfigurationSchema.kt b/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/dependencyConfigurationSchema.kt index c913a4cadc7a..2f3852f56332 100644 --- a/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/dependencyConfigurationSchema.kt +++ b/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/dependencyConfigurationSchema.kt @@ -31,19 +31,24 @@ import org.gradle.internal.declarativedsl.schemaBuilder.FunctionExtractor import org.gradle.internal.declarativedsl.schemaBuilder.toDataTypeRef import org.gradle.api.Project import org.gradle.api.artifacts.ProjectDependency +import org.gradle.api.artifacts.dsl.DependencyCollector import org.gradle.api.artifacts.dsl.DependencyHandler import org.gradle.internal.declarativedsl.analysis.FunctionSemantics.ConfigureSemantics.ConfigureBlockRequirement.NOT_ALLOWED import org.gradle.internal.declarativedsl.evaluationSchema.EvaluationSchemaComponent +import java.util.Locale import kotlin.reflect.KClass import kotlin.reflect.KFunction +import kotlin.reflect.full.functions import kotlin.reflect.full.isSubclassOf +import kotlin.reflect.full.memberFunctions +import kotlin.reflect.javaType /** * Introduces functions for registering project dependencies, such as `implementation(...)`, as member functions of: * * [RestrictedDependenciesHandler] in the schema, * * [DependencyHandler] when resolved at runtime. - * * [RestrictedLibraryDependencies] in the schema. + * * Any type with getters returning [DependencyCollector] in the schema. * * Inspects the configurations available in the given project to build the functions. */ @@ -56,12 +61,12 @@ class DependencyConfigurationsComponent( override fun functionExtractors(): List = listOf( DependencyFunctionsExtractor(configurations), - RestrictedLibraryDependenciesFunctionsExtractor(configurations) + ImplicitDependencyCollectorFunctionExtractor(configurations) ) override fun runtimeFunctionResolvers(): List = listOf( RuntimeDependencyFunctionResolver(configurations), - RuntimeRestrictedLibraryDependenciesFunctionResolver(configurations) + ImplicitDependencyCollectorFunctionResolver(configurations) ) } @@ -92,19 +97,20 @@ class DependencyFunctionsExtractor(val configurations: DependencyConfigurations) } private -class RestrictedLibraryDependenciesFunctionsExtractor(val configurations: DependencyConfigurations) : FunctionExtractor { - override fun memberFunctions(kClass: KClass<*>, preIndex: DataSchemaBuilder.PreIndex): Iterable = - if (kClass == RestrictedLibraryDependencies::class) { - configurations.configurationNames.map { configurationName -> - DataMemberFunction( - kClass.toDataTypeRef(), - configurationName, - listOf(DataParameter("dependency", String::class.toDataTypeRef(), false, ParameterSemantics.Unknown)), - false, - FunctionSemantics.AddAndConfigure(RestrictedLibraryDependencies::class.toDataTypeRef(), FunctionSemantics.ConfigureSemantics.ConfigureBlockRequirement.NOT_ALLOWED) - ) - } - } else emptyList() +class ImplicitDependencyCollectorFunctionExtractor(val configurations: DependencyConfigurations) : FunctionExtractor { + override fun memberFunctions(kClass: KClass<*>, preIndex: DataSchemaBuilder.PreIndex): Iterable = kClass.memberFunctions + .filter { function -> hasDependencyCollectorGetterSignature(function) } + .map { function -> function.name.removePrefix("get").replaceFirstChar { it.lowercase(Locale.getDefault()) } } + .filter { confName -> confName in configurations.configurationNames } + .map { confName -> + DataMemberFunction( + kClass.toDataTypeRef(), + confName, + listOf(DataParameter("dependency", String::class.toDataTypeRef(), false, ParameterSemantics.Unknown)), + false, + FunctionSemantics.AddAndConfigure(kClass.toDataTypeRef(), NOT_ALLOWED) + ) + } override fun constructors(kClass: KClass<*>, preIndex: DataSchemaBuilder.PreIndex): Iterable = emptyList() override fun topLevelFunction(function: KFunction<*>, preIndex: DataSchemaBuilder.PreIndex): DataTopLevelFunction? = null @@ -124,34 +130,38 @@ class RuntimeDependencyFunctionResolver(configurations: DependencyConfigurations } }) } + return RuntimeFunctionResolver.Resolution.Unresolved } } private -class RuntimeRestrictedLibraryDependenciesFunctionResolver(configurations: DependencyConfigurations) : RuntimeFunctionResolver { +class ImplicitDependencyCollectorFunctionResolver(configurations: DependencyConfigurations) : RuntimeFunctionResolver { private - val nameSet = configurations.configurationNames.toSet() + val configurationNames = configurations.configurationNames.toSet() override fun resolve(receiverClass: KClass<*>, name: String, parameterValueBinding: ParameterValueBinding): RuntimeFunctionResolver.Resolution { - // TODO: The runtime decoration isn't working as expected here - // When receiverClass == class org.gradle.internal.declarativedsl.project.RestrictedLibraryDependencies_Decorated - // Then receiverClass.isSubclassOf(RestrictedLibraryDependencies::class) == false - // So, I'll just test the name - if (receiverClass.simpleName == "RestrictedLibraryDependencies_Decorated" && name in nameSet && parameterValueBinding.bindingMap.size == 1) { - return RuntimeFunctionResolver.Resolution.Resolved(object : RestrictedRuntimeFunction { - override fun callBy(receiver: Any, binding: Map, hasLambda: Boolean): RestrictedRuntimeFunction.InvocationResult { - val libraryDependencies = (receiver as RestrictedLibraryDependencies) - val dependencyNotation = binding.values.single().toString() - when (name) { - "api" -> libraryDependencies.getApi().add(dependencyNotation) {} - "implementation" -> libraryDependencies.getImplementation().add(dependencyNotation) {} - else -> error("Unknown configuration: $name for dependency: $dependencyNotation") + if (name in configurationNames) { + val getterFunction = getDependencyCollectorGetter(receiverClass, name) + if (getterFunction != null) { + return RuntimeFunctionResolver.Resolution.Resolved(object : RestrictedRuntimeFunction { + override fun callBy(receiver: Any, binding: Map, hasLambda: Boolean): RestrictedRuntimeFunction.InvocationResult { + val dependencyNotation = binding.values.single().toString() + val collector: DependencyCollector = getterFunction.call(receiver) as DependencyCollector + collector.add(dependencyNotation) + return RestrictedRuntimeFunction.InvocationResult(Unit, null) } - return RestrictedRuntimeFunction.InvocationResult(Unit, null) - } - }) + }) + } } return RuntimeFunctionResolver.Resolution.Unresolved } + + private fun getDependencyCollectorGetter(receiverClass: KClass<*>, configurationName: String): KFunction<*>? = receiverClass.functions + .filter { hasDependencyCollectorGetterSignature(it) } + .firstOrNull { function -> function.name == "get${configurationName.replaceFirstChar { it.uppercase(Locale.getDefault()) }}" } } + +@OptIn(ExperimentalStdlibApi::class) // For javaType +private fun hasDependencyCollectorGetterSignature(function: KFunction<*>) = + function.name.startsWith("get") && function.returnType.javaType == DependencyCollector::class.java && function.parameters.size == 1 From 19ea3c6c93a87ecdba6f4d61a0d216067ffedfab Mon Sep 17 00:00:00 2001 From: Tom Tresansky Date: Thu, 29 Feb 2024 15:29:43 -0500 Subject: [PATCH 11/17] Clean imports to preserve file diff --- .../declarativedsl/project/ProjectTopLevelReceiver.kt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/ProjectTopLevelReceiver.kt b/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/ProjectTopLevelReceiver.kt index 6aefbfed9511..a56b5f6f6c41 100644 --- a/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/ProjectTopLevelReceiver.kt +++ b/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/ProjectTopLevelReceiver.kt @@ -17,11 +17,7 @@ package org.gradle.internal.declarativedsl.project import org.gradle.api.Action -import org.gradle.api.artifacts.MinimalExternalModuleDependency import org.gradle.api.artifacts.ProjectDependency -import org.gradle.api.artifacts.dsl.DependencyCollector -import org.gradle.api.artifacts.dsl.GradleDependencies -import org.gradle.api.plugins.jvm.PlatformDependencyModifiers import org.gradle.declarative.dsl.model.annotations.Configuring import org.gradle.declarative.dsl.model.annotations.Restricted From 113400f76b555b492a5ed91a723378a628843212 Mon Sep 17 00:00:00 2001 From: Tom Tresansky Date: Thu, 29 Feb 2024 16:00:42 -0500 Subject: [PATCH 12/17] Formatting for sanityCheck --- ...clarativeDSLCustomDependenciesExtensionsSpec.groovy | 4 ++-- .../project/dependencyConfigurationSchema.kt | 10 ++++++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDSLCustomDependenciesExtensionsSpec.groovy b/platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDSLCustomDependenciesExtensionsSpec.groovy index e5dbfc411cdf..67e1dcd6b09d 100644 --- a/platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDSLCustomDependenciesExtensionsSpec.groovy +++ b/platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDSLCustomDependenciesExtensionsSpec.groovy @@ -51,11 +51,11 @@ class DeclarativeDSLCustomDependenciesExtensionsSpec extends AbstractIntegration expect: "a dependency has been added to the api configuration" succeeds("dependencies", "--configuration", "api") - result.assertOutputContains("com.google.guava:guava:30.1.1-jre") + outputContains("com.google.guava:guava:30.1.1-jre") and: "a dependency has been added to the implementation configuration" succeeds("dependencies", "--configuration", "implementation") - result.assertOutputContains("com.apache.commons:commons-lang3:3.12.0") + outputContains("com.apache.commons:commons-lang3:3.12.0") } def 'can configure an extension using DependencyCollector in declarative DSL and build a java plugin'() { diff --git a/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/dependencyConfigurationSchema.kt b/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/dependencyConfigurationSchema.kt index 2f3852f56332..105de7debf8e 100644 --- a/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/dependencyConfigurationSchema.kt +++ b/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/dependencyConfigurationSchema.kt @@ -96,6 +96,7 @@ class DependencyFunctionsExtractor(val configurations: DependencyConfigurations) override fun topLevelFunction(function: KFunction<*>, preIndex: DataSchemaBuilder.PreIndex): DataTopLevelFunction? = null } + private class ImplicitDependencyCollectorFunctionExtractor(val configurations: DependencyConfigurations) : FunctionExtractor { override fun memberFunctions(kClass: KClass<*>, preIndex: DataSchemaBuilder.PreIndex): Iterable = kClass.memberFunctions @@ -116,6 +117,7 @@ class ImplicitDependencyCollectorFunctionExtractor(val configurations: Dependenc override fun topLevelFunction(function: KFunction<*>, preIndex: DataSchemaBuilder.PreIndex): DataTopLevelFunction? = null } + private class RuntimeDependencyFunctionResolver(configurations: DependencyConfigurations) : RuntimeFunctionResolver { private @@ -135,6 +137,7 @@ class RuntimeDependencyFunctionResolver(configurations: DependencyConfigurations } } + private class ImplicitDependencyCollectorFunctionResolver(configurations: DependencyConfigurations) : RuntimeFunctionResolver { private @@ -157,11 +160,14 @@ class ImplicitDependencyCollectorFunctionResolver(configurations: DependencyConf return RuntimeFunctionResolver.Resolution.Unresolved } - private fun getDependencyCollectorGetter(receiverClass: KClass<*>, configurationName: String): KFunction<*>? = receiverClass.functions + private + fun getDependencyCollectorGetter(receiverClass: KClass<*>, configurationName: String): KFunction<*>? = receiverClass.functions .filter { hasDependencyCollectorGetterSignature(it) } .firstOrNull { function -> function.name == "get${configurationName.replaceFirstChar { it.uppercase(Locale.getDefault()) }}" } } + @OptIn(ExperimentalStdlibApi::class) // For javaType -private fun hasDependencyCollectorGetterSignature(function: KFunction<*>) = +private +fun hasDependencyCollectorGetterSignature(function: KFunction<*>) = function.name.startsWith("get") && function.returnType.javaType == DependencyCollector::class.java && function.parameters.size == 1 From 88875bf6207c64e8541d9c9ec855c7149d108f69 Mon Sep 17 00:00:00 2001 From: Tom Tresansky Date: Thu, 29 Feb 2024 16:27:04 -0500 Subject: [PATCH 13/17] Handle failures when assessing getters --- .../project/dependencyConfigurationSchema.kt | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/dependencyConfigurationSchema.kt b/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/dependencyConfigurationSchema.kt index 105de7debf8e..e0a310370f50 100644 --- a/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/dependencyConfigurationSchema.kt +++ b/platforms/core-configuration/declarative-dsl-provider/src/main/kotlin/org/gradle/internal/declarativedsl/project/dependencyConfigurationSchema.kt @@ -35,6 +35,7 @@ import org.gradle.api.artifacts.dsl.DependencyCollector import org.gradle.api.artifacts.dsl.DependencyHandler import org.gradle.internal.declarativedsl.analysis.FunctionSemantics.ConfigureSemantics.ConfigureBlockRequirement.NOT_ALLOWED import org.gradle.internal.declarativedsl.evaluationSchema.EvaluationSchemaComponent +import java.lang.reflect.Type import java.util.Locale import kotlin.reflect.KClass import kotlin.reflect.KFunction @@ -169,5 +170,11 @@ class ImplicitDependencyCollectorFunctionResolver(configurations: DependencyConf @OptIn(ExperimentalStdlibApi::class) // For javaType private -fun hasDependencyCollectorGetterSignature(function: KFunction<*>) = - function.name.startsWith("get") && function.returnType.javaType == DependencyCollector::class.java && function.parameters.size == 1 +fun hasDependencyCollectorGetterSignature(function: KFunction<*>): Boolean { + val returnType: Type = try { + function.returnType.javaType + } catch (e: Throwable) { // Sometimes reflection fails with an error when the return type is unusual, if it failed then it's not a getter of interest + Void::class.java + } + return function.name.startsWith("get") && returnType == DependencyCollector::class.java && function.parameters.size == 1 +} From c64829252310c0f3c803ad58113742ba63623610 Mon Sep 17 00:00:00 2001 From: Tom Tresansky Date: Fri, 1 Mar 2024 07:48:57 -0500 Subject: [PATCH 14/17] Add explicit repo definition in settings file, fix --- ...DSLCustomDependenciesExtensionsSpec.groovy | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDSLCustomDependenciesExtensionsSpec.groovy b/platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDSLCustomDependenciesExtensionsSpec.groovy index 67e1dcd6b09d..ea2431e288f1 100644 --- a/platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDSLCustomDependenciesExtensionsSpec.groovy +++ b/platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDSLCustomDependenciesExtensionsSpec.groovy @@ -48,6 +48,7 @@ class DeclarativeDSLCustomDependenciesExtensionsSpec extends AbstractIntegration and: "a build script that adds dependencies using the custom extension" file("build.gradle.something") << defineDeclarativeDSLBuildScript() + file("settings.gradle") << defineSettings() expect: "a dependency has been added to the api configuration" succeeds("dependencies", "--configuration", "api") @@ -55,7 +56,7 @@ class DeclarativeDSLCustomDependenciesExtensionsSpec extends AbstractIntegration and: "a dependency has been added to the implementation configuration" succeeds("dependencies", "--configuration", "implementation") - outputContains("com.apache.commons:commons-lang3:3.12.0") + outputContains("org.apache.commons:commons-lang3:3.12.0") } def 'can configure an extension using DependencyCollector in declarative DSL and build a java plugin'() { @@ -85,10 +86,11 @@ class DeclarativeDSLCustomDependenciesExtensionsSpec extends AbstractIntegration and: "a build script that adds dependencies using the custom extension, and defines a source file requiring the dependencies to compile" file("src/main/java/com/example/Lib.java") << defineExampleJavaClass() file("build.gradle.something") << defineDeclarativeDSLBuildScript() + file("settings.gradle") << defineSettings() expect: "the library can be built successfully" succeeds("build") - file("build/libs/${testDirectory.name}.jar").exists() + file("build/libs/example.jar").exists() } private String defineDependenciesExtension() { @@ -186,9 +188,21 @@ class DeclarativeDSLCustomDependenciesExtensionsSpec extends AbstractIntegration library { dependencies { api("com.google.guava:guava:30.1.1-jre") - implementation("com.apache.commons:commons-lang3:3.12.0") + implementation("org.apache.commons:commons-lang3:3.12.0") } } """ } + + private String defineSettings() { + return """ + dependencyResolutionManagement { + repositories { + mavenCentral() + } + } + + rootProject.name = 'example' + """ + } } From 5356cb6dca6d69d66eb919b149e3fb24ad6414c7 Mon Sep 17 00:00:00 2001 From: Tom Tresansky Date: Fri, 1 Mar 2024 08:31:55 -0500 Subject: [PATCH 15/17] Manually wire deps for java-library plugin --- .../DeclarativeDSLCustomDependenciesExtensionsSpec.groovy | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDSLCustomDependenciesExtensionsSpec.groovy b/platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDSLCustomDependenciesExtensionsSpec.groovy index ea2431e288f1..e0d13d387ce8 100644 --- a/platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDSLCustomDependenciesExtensionsSpec.groovy +++ b/platforms/core-configuration/declarative-dsl-provider/src/integTest/groovy/org/gradle/internal/declarativedsl/project/DeclarativeDSLCustomDependenciesExtensionsSpec.groovy @@ -76,8 +76,10 @@ class DeclarativeDSLCustomDependenciesExtensionsSpec extends AbstractIntegration // api and implementation configurations created by plugin project.getPluginManager().apply(JavaLibraryPlugin.class); - // inner dependencies extension automatically wired to configurations created by plugin - project.getExtensions().create("library", LibraryExtension.class); + // create and wire the custom dependencies extension's dependencies to the global configurations created by the plugin + LibraryExtension restricted = project.getExtensions().create("library", LibraryExtension.class); + project.getConfigurations().getByName("api").fromDependencyCollector(restricted.getDependencies().getApi()); + project.getConfigurations().getByName("implementation").fromDependencyCollector(restricted.getDependencies().getImplementation()); } } """ From 003e9962c8a1244020f70f3173fdb831d3586563 Mon Sep 17 00:00:00 2001 From: Tom Tresansky Date: Fri, 1 Mar 2024 10:31:12 -0500 Subject: [PATCH 16/17] Add more distribution size to allow for publishing snapshot --- .../groovy/org/gradle/DistributionIntegritySpec.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/distributions-integ-tests/src/integTest/groovy/org/gradle/DistributionIntegritySpec.groovy b/subprojects/distributions-integ-tests/src/integTest/groovy/org/gradle/DistributionIntegritySpec.groovy index 0742c41226e9..4a8cd30ff94c 100644 --- a/subprojects/distributions-integ-tests/src/integTest/groovy/org/gradle/DistributionIntegritySpec.groovy +++ b/subprojects/distributions-integ-tests/src/integTest/groovy/org/gradle/DistributionIntegritySpec.groovy @@ -35,7 +35,7 @@ class DistributionIntegritySpec extends DistributionIntegrationSpec { @Override int getMaxDistributionSizeBytes() { - return 130 * 1024 * 1024 + return 131 * 1024 * 1024 } /** From cd8d107ab982abc17c313d2a99b6eb5f46ecf5e6 Mon Sep 17 00:00:00 2001 From: Tom Tresansky Date: Fri, 1 Mar 2024 11:53:20 -0500 Subject: [PATCH 17/17] Bump all dist sizes to allow for publishing snapshot --- .../groovy/org/gradle/AllDistributionIntegrationSpec.groovy | 2 +- .../groovy/org/gradle/DocsDistributionIntegrationSpec.groovy | 2 +- .../groovy/org/gradle/SrcDistributionIntegrationSpec.groovy | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/subprojects/distributions-integ-tests/src/integTest/groovy/org/gradle/AllDistributionIntegrationSpec.groovy b/subprojects/distributions-integ-tests/src/integTest/groovy/org/gradle/AllDistributionIntegrationSpec.groovy index 59d7ab9fb583..f5c284ee8c4d 100644 --- a/subprojects/distributions-integ-tests/src/integTest/groovy/org/gradle/AllDistributionIntegrationSpec.groovy +++ b/subprojects/distributions-integ-tests/src/integTest/groovy/org/gradle/AllDistributionIntegrationSpec.groovy @@ -36,7 +36,7 @@ class AllDistributionIntegrationSpec extends DistributionIntegrationSpec { @Override int getMaxDistributionSizeBytes() { - return 218 * 1024 * 1024 + return 220 * 1024 * 1024 } @Requires(UnitTestPreconditions.StableGroovy) // cannot link to public javadocs of Groovy snapshots like https://docs.groovy-lang.org/docs/groovy-4.0.5-SNAPSHOT/html/gapi/ diff --git a/subprojects/distributions-integ-tests/src/integTest/groovy/org/gradle/DocsDistributionIntegrationSpec.groovy b/subprojects/distributions-integ-tests/src/integTest/groovy/org/gradle/DocsDistributionIntegrationSpec.groovy index 7028ee26c9cc..db1f178d45a2 100644 --- a/subprojects/distributions-integ-tests/src/integTest/groovy/org/gradle/DocsDistributionIntegrationSpec.groovy +++ b/subprojects/distributions-integ-tests/src/integTest/groovy/org/gradle/DocsDistributionIntegrationSpec.groovy @@ -32,7 +32,7 @@ class DocsDistributionIntegrationSpec extends DistributionIntegrationSpec { @Override int getMaxDistributionSizeBytes() { - return 82 * 1024 * 1024 + return 84 * 1024 * 1024 } @Override diff --git a/subprojects/distributions-integ-tests/src/integTest/groovy/org/gradle/SrcDistributionIntegrationSpec.groovy b/subprojects/distributions-integ-tests/src/integTest/groovy/org/gradle/SrcDistributionIntegrationSpec.groovy index baf96ee18e93..b3a13301b4fd 100644 --- a/subprojects/distributions-integ-tests/src/integTest/groovy/org/gradle/SrcDistributionIntegrationSpec.groovy +++ b/subprojects/distributions-integ-tests/src/integTest/groovy/org/gradle/SrcDistributionIntegrationSpec.groovy @@ -38,7 +38,7 @@ class SrcDistributionIntegrationSpec extends DistributionIntegrationSpec { @Override int getMaxDistributionSizeBytes() { - return 60 * 1024 * 1024 + return 62 * 1024 * 1024 } @Override