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 0d8ab60..9d15691 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 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..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,9 +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 { @@ -52,12 +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 { } + ) = 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)) } /** @@ -90,6 +110,21 @@ 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: * @@ -117,9 +152,24 @@ 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 { } + ) = restrictDependency(dependencyPath = dependencyDelegation.path, action = action) + /** * Example: * @@ -132,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)) } }