From be839b2a8a995809db5d218186111bba1f7f5a2d Mon Sep 17 00:00:00 2001 From: Jeff Retz Date: Fri, 20 Feb 2026 13:16:34 +0100 Subject: [PATCH 1/2] added support for delegated project restriction --- .../projectguard/plugin/ProjectGuardExtension.kt | 16 ++++++++++++++++ .../projectguard/plugin/ProjectGuardScope.kt | 16 ++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/projectguard/src/main/kotlin/com/rubensousa/projectguard/plugin/ProjectGuardExtension.kt b/projectguard/src/main/kotlin/com/rubensousa/projectguard/plugin/ProjectGuardExtension.kt index 0d8ab60..0d7a06c 100644 --- a/projectguard/src/main/kotlin/com/rubensousa/projectguard/plugin/ProjectGuardExtension.kt +++ b/projectguard/src/main/kotlin/com/rubensousa/projectguard/plugin/ProjectGuardExtension.kt @@ -26,6 +26,7 @@ import com.rubensousa.projectguard.plugin.internal.ProjectGuardSpec import com.rubensousa.projectguard.plugin.internal.getDependencyPath import org.gradle.api.Action import org.gradle.api.artifacts.MinimalExternalModuleDependency +import org.gradle.api.internal.catalog.DelegatingProjectDependency import org.gradle.api.model.ObjectFactory import org.gradle.api.provider.Provider import org.gradle.kotlin.dsl.listProperty @@ -52,6 +53,11 @@ abstract class ProjectGuardExtension @Inject constructor( ) } + override fun restrictModule( + moduleDelegation: DelegatingProjectDependency, + action: Action + ) = restrictModule(modulePath = moduleDelegation.path, action = action) + override fun guard(modulePath: String, action: Action) { val scope = GuardScopeImpl() action.execute(scope) @@ -63,6 +69,11 @@ abstract class ProjectGuardExtension @Inject constructor( ) } + override fun guard( + moduleDelegation: DelegatingProjectDependency, + action: Action + ) = guard(modulePath = moduleDelegation.path, action = action) + override fun restrictDependency( dependencyPath: String, action: Action, @@ -78,6 +89,11 @@ abstract class ProjectGuardExtension @Inject constructor( ) } + override fun restrictDependency( + dependencyDelegation: DelegatingProjectDependency, + action: Action + ) = restrictDependency(dependencyPath = dependencyDelegation.path, action = action) + override fun restrictDependency( provider: Provider, action: Action, diff --git a/projectguard/src/main/kotlin/com/rubensousa/projectguard/plugin/ProjectGuardScope.kt b/projectguard/src/main/kotlin/com/rubensousa/projectguard/plugin/ProjectGuardScope.kt index 358feb6..82ffef1 100644 --- a/projectguard/src/main/kotlin/com/rubensousa/projectguard/plugin/ProjectGuardScope.kt +++ b/projectguard/src/main/kotlin/com/rubensousa/projectguard/plugin/ProjectGuardScope.kt @@ -18,6 +18,7 @@ package com.rubensousa.projectguard.plugin import org.gradle.api.Action import org.gradle.api.artifacts.MinimalExternalModuleDependency +import org.gradle.api.internal.catalog.DelegatingProjectDependency import org.gradle.api.provider.Provider interface ProjectGuardScope { @@ -55,6 +56,11 @@ interface ProjectGuardScope { action: Action, ) + fun restrictModule( + moduleDelegation: DelegatingProjectDependency, + action: Action + ) + // Just here for groovy support fun restrictModule(modulePath: String) { restrictModule(modulePath, defaultModuleRestrictionScope) @@ -90,6 +96,11 @@ interface ProjectGuardScope { action: Action, ) + fun guard( + moduleDelegation: DelegatingProjectDependency, + action: Action + ) + /** * Example: * @@ -120,6 +131,11 @@ interface ProjectGuardScope { action: Action, ) + fun restrictDependency( + dependencyDelegation: DelegatingProjectDependency, + action: Action + ) + /** * Example: * From 203ea08d4ffb02e22ef9a9494567332d3db2be24 Mon Sep 17 00:00:00 2001 From: Jeff Retz Date: Fri, 20 Feb 2026 13:48:53 +0100 Subject: [PATCH 2/2] added proper groovy support --- projectguard/api/projectguard.api | 30 ++++---- .../projectguard/plugin/GuardScope.kt | 22 ++++-- .../plugin/ProjectGuardExtension.kt | 15 ---- .../projectguard/plugin/ProjectGuardScope.kt | 74 ++++++++++++++----- 4 files changed, 85 insertions(+), 56 deletions(-) diff --git a/projectguard/api/projectguard.api b/projectguard/api/projectguard.api index cd0a124..821d258 100644 --- a/projectguard/api/projectguard.api +++ b/projectguard/api/projectguard.api @@ -13,15 +13,15 @@ public final class com/rubensousa/projectguard/plugin/GuardRule { } public abstract interface class com/rubensousa/projectguard/plugin/GuardScope { - public static final field Companion Lcom/rubensousa/projectguard/plugin/GuardScope$Companion; public abstract fun applyRule (Lcom/rubensousa/projectguard/plugin/GuardRule;)V - public fun deny (Ljava/lang/String;)V + public fun deny (Ljava/lang/String;Lgroovy/lang/Closure;)V public abstract fun deny (Ljava/lang/String;Lorg/gradle/api/Action;)V - public fun deny (Lorg/gradle/api/provider/Provider;)V + public fun deny (Lorg/gradle/api/internal/catalog/DelegatingProjectDependency;Lorg/gradle/api/Action;)V + public fun deny (Lorg/gradle/api/provider/Provider;Lgroovy/lang/Closure;)V public abstract fun deny (Lorg/gradle/api/provider/Provider;Lorg/gradle/api/Action;)V -} - -public final class com/rubensousa/projectguard/plugin/GuardScope$Companion { + public static synthetic fun deny$default (Lcom/rubensousa/projectguard/plugin/GuardScope;Ljava/lang/String;Lorg/gradle/api/Action;ILjava/lang/Object;)V + public static synthetic fun deny$default (Lcom/rubensousa/projectguard/plugin/GuardScope;Lorg/gradle/api/internal/catalog/DelegatingProjectDependency;Lorg/gradle/api/Action;ILjava/lang/Object;)V + public static synthetic fun deny$default (Lcom/rubensousa/projectguard/plugin/GuardScope;Lorg/gradle/api/provider/Provider;Lorg/gradle/api/Action;ILjava/lang/Object;)V } public abstract interface class com/rubensousa/projectguard/plugin/ModuleRestrictionScope { @@ -51,22 +51,26 @@ public final class com/rubensousa/projectguard/plugin/ProjectGuardPlugin : org/g } public abstract interface class com/rubensousa/projectguard/plugin/ProjectGuardScope { - public static final field Companion Lcom/rubensousa/projectguard/plugin/ProjectGuardScope$Companion; public abstract fun guard (Ljava/lang/String;Lorg/gradle/api/Action;)V + public fun guard (Lorg/gradle/api/internal/catalog/DelegatingProjectDependency;Lorg/gradle/api/Action;)V public abstract fun guardRule (Lorg/gradle/api/Action;)Lcom/rubensousa/projectguard/plugin/GuardRule; - public fun restrictDependency (Ljava/lang/String;)V + public fun restrictDependency (Ljava/lang/String;Lgroovy/lang/Closure;)V public abstract fun restrictDependency (Ljava/lang/String;Lorg/gradle/api/Action;)V - public fun restrictDependency (Lorg/gradle/api/provider/Provider;)V + public fun restrictDependency (Lorg/gradle/api/internal/catalog/DelegatingProjectDependency;Lorg/gradle/api/Action;)V + public fun restrictDependency (Lorg/gradle/api/provider/Provider;Lgroovy/lang/Closure;)V public abstract fun restrictDependency (Lorg/gradle/api/provider/Provider;Lorg/gradle/api/Action;)V + public static synthetic fun restrictDependency$default (Lcom/rubensousa/projectguard/plugin/ProjectGuardScope;Ljava/lang/String;Lorg/gradle/api/Action;ILjava/lang/Object;)V + public static synthetic fun restrictDependency$default (Lcom/rubensousa/projectguard/plugin/ProjectGuardScope;Lorg/gradle/api/internal/catalog/DelegatingProjectDependency;Lorg/gradle/api/Action;ILjava/lang/Object;)V + public static synthetic fun restrictDependency$default (Lcom/rubensousa/projectguard/plugin/ProjectGuardScope;Lorg/gradle/api/provider/Provider;Lorg/gradle/api/Action;ILjava/lang/Object;)V public abstract fun restrictDependencyRule (Lorg/gradle/api/Action;)Lcom/rubensousa/projectguard/plugin/RestrictDependencyRule; - public fun restrictModule (Ljava/lang/String;)V + public fun restrictModule (Ljava/lang/String;Lgroovy/lang/Closure;)V public abstract fun restrictModule (Ljava/lang/String;Lorg/gradle/api/Action;)V + public fun restrictModule (Lorg/gradle/api/internal/catalog/DelegatingProjectDependency;Lorg/gradle/api/Action;)V + public static synthetic fun restrictModule$default (Lcom/rubensousa/projectguard/plugin/ProjectGuardScope;Ljava/lang/String;Lorg/gradle/api/Action;ILjava/lang/Object;)V + public static synthetic fun restrictModule$default (Lcom/rubensousa/projectguard/plugin/ProjectGuardScope;Lorg/gradle/api/internal/catalog/DelegatingProjectDependency;Lorg/gradle/api/Action;ILjava/lang/Object;)V public abstract fun restrictModuleRule (Lorg/gradle/api/Action;)Lcom/rubensousa/projectguard/plugin/RestrictModuleRule; } -public final class com/rubensousa/projectguard/plugin/ProjectGuardScope$Companion { -} - public final class com/rubensousa/projectguard/plugin/RestrictDependencyRule { } diff --git a/projectguard/src/main/kotlin/com/rubensousa/projectguard/plugin/GuardScope.kt b/projectguard/src/main/kotlin/com/rubensousa/projectguard/plugin/GuardScope.kt index 60e66c0..e0e2bd9 100644 --- a/projectguard/src/main/kotlin/com/rubensousa/projectguard/plugin/GuardScope.kt +++ b/projectguard/src/main/kotlin/com/rubensousa/projectguard/plugin/GuardScope.kt @@ -16,39 +16,45 @@ package com.rubensousa.projectguard.plugin +import groovy.lang.Closure import org.gradle.api.Action import org.gradle.api.artifacts.MinimalExternalModuleDependency +import org.gradle.api.internal.catalog.DelegatingProjectDependency import org.gradle.api.provider.Provider +import org.gradle.util.internal.ConfigureUtil interface GuardScope { fun deny( dependencyPath: String, - action: Action, + action: Action = Action { }, ) + fun deny( + dependencyDelegation: DelegatingProjectDependency, + action: Action = Action { }, + ) = deny(dependencyPath = dependencyDelegation.path, action = action) + fun deny( provider: Provider, - action: Action, + action: Action = Action { }, ) // Required for groovy compatibility fun deny( dependencyPath: String, + closure: Closure ) { - deny(dependencyPath, defaultDenyScope) + deny(dependencyPath, ConfigureUtil.configureUsing(closure)) } // Required for groovy compatibility fun deny( provider: Provider, + closure: Closure ) { - deny(provider, defaultDenyScope) + deny(provider, ConfigureUtil.configureUsing(closure)) } fun applyRule(rule: GuardRule) - - companion object { - internal val defaultDenyScope = Action { } - } } diff --git a/projectguard/src/main/kotlin/com/rubensousa/projectguard/plugin/ProjectGuardExtension.kt b/projectguard/src/main/kotlin/com/rubensousa/projectguard/plugin/ProjectGuardExtension.kt index 0d7a06c..9d15691 100644 --- a/projectguard/src/main/kotlin/com/rubensousa/projectguard/plugin/ProjectGuardExtension.kt +++ b/projectguard/src/main/kotlin/com/rubensousa/projectguard/plugin/ProjectGuardExtension.kt @@ -53,11 +53,6 @@ abstract class ProjectGuardExtension @Inject constructor( ) } - override fun restrictModule( - moduleDelegation: DelegatingProjectDependency, - action: Action - ) = restrictModule(modulePath = moduleDelegation.path, action = action) - override fun guard(modulePath: String, action: Action) { val scope = GuardScopeImpl() action.execute(scope) @@ -69,11 +64,6 @@ abstract class ProjectGuardExtension @Inject constructor( ) } - override fun guard( - moduleDelegation: DelegatingProjectDependency, - action: Action - ) = guard(modulePath = moduleDelegation.path, action = action) - override fun restrictDependency( dependencyPath: String, action: Action, @@ -89,11 +79,6 @@ abstract class ProjectGuardExtension @Inject constructor( ) } - override fun restrictDependency( - dependencyDelegation: DelegatingProjectDependency, - action: Action - ) = restrictDependency(dependencyPath = dependencyDelegation.path, action = action) - override fun restrictDependency( provider: Provider, action: Action, diff --git a/projectguard/src/main/kotlin/com/rubensousa/projectguard/plugin/ProjectGuardScope.kt b/projectguard/src/main/kotlin/com/rubensousa/projectguard/plugin/ProjectGuardScope.kt index 82ffef1..697ebb0 100644 --- a/projectguard/src/main/kotlin/com/rubensousa/projectguard/plugin/ProjectGuardScope.kt +++ b/projectguard/src/main/kotlin/com/rubensousa/projectguard/plugin/ProjectGuardScope.kt @@ -16,10 +16,12 @@ package com.rubensousa.projectguard.plugin +import groovy.lang.Closure import org.gradle.api.Action import org.gradle.api.artifacts.MinimalExternalModuleDependency import org.gradle.api.internal.catalog.DelegatingProjectDependency import org.gradle.api.provider.Provider +import org.gradle.util.internal.ConfigureUtil interface ProjectGuardScope { @@ -53,17 +55,29 @@ interface ProjectGuardScope { */ fun restrictModule( modulePath: String, - action: Action, + action: Action = Action { }, ) + /** + * Example: + * + * Prevent a module from depending on all other dependencies + * + * ``` + * restrictModule(projects.domain) { + * // Domain modules can only depend on another domain modules + * allow(":domain") + * } + * ``` + */ fun restrictModule( moduleDelegation: DelegatingProjectDependency, - action: Action - ) + action: Action = Action { } + ) = restrictModule(modulePath = moduleDelegation.path, action = action) // Just here for groovy support - fun restrictModule(modulePath: String) { - restrictModule(modulePath, defaultModuleRestrictionScope) + fun restrictModule(modulePath: String, closure: Closure) { + restrictModule(modulePath, ConfigureUtil.configureUsing(closure)) } /** @@ -96,10 +110,20 @@ interface ProjectGuardScope { action: Action, ) + /** + * Example: + * + * ``` + * guard(projects.domain) { + * // Domain modules should not depend on UI modules + * deny(":ui") + * } + * ``` + */ fun guard( moduleDelegation: DelegatingProjectDependency, action: Action - ) + ) = guard(modulePath = moduleDelegation.path, action = action) /** * Example: @@ -128,13 +152,23 @@ interface ProjectGuardScope { */ fun restrictDependency( dependencyPath: String, - action: Action, + action: Action = Action { }, ) + /** + * Example: + * + * ``` + * restrictDependency(projects.legacy) { + * // Only legacy modules are allowed to depend on other legacy modules + * allow(":legacy") + * } + * ``` + */ fun restrictDependency( dependencyDelegation: DelegatingProjectDependency, - action: Action - ) + action: Action = Action { } + ) = restrictDependency(dependencyPath = dependencyDelegation.path, action = action) /** * Example: @@ -148,22 +182,22 @@ interface ProjectGuardScope { */ fun restrictDependency( provider: Provider, - action: Action, + action: Action = Action { }, ) // Just here for groovy support - fun restrictDependency(dependencyPath: String) { - restrictDependency(dependencyPath, defaultDependencyRestrictionScope) + fun restrictDependency( + dependencyPath: String, + closure: Closure + ) { + restrictDependency(dependencyPath, ConfigureUtil.configureUsing(closure)) } // Just here for groovy support - fun restrictDependency(provider: Provider) { - restrictDependency(provider, defaultDependencyRestrictionScope) - } - - companion object { - private val defaultDependencyRestrictionScope = Action {} - private val defaultModuleRestrictionScope = Action {} - + fun restrictDependency( + provider: Provider, + closure: Closure + ) { + restrictDependency(provider, ConfigureUtil.configureUsing(closure)) } }