Skip to content

Commit 7c1349c

Browse files
committed
add ArchRule attribute value for "not arch rules"
add workaround for interop with the proto plugin
1 parent 801aa7e commit 7c1349c

File tree

9 files changed

+170
-83
lines changed

9 files changed

+170
-83
lines changed

nebula-archrules-gradle-plugin/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ description = "Plugins for authoring and running Nebula ArchRules"
66
dependencies {
77
implementation(project(":nebula-archrules-core"))
88
implementation("tools.jackson.core:jackson-databind:3.0.2")
9+
910
testImplementation("net.javacrumbs.json-unit:json-unit-assertj:5.0.0")
1011
testImplementation("org.json:json:20250517")
1112
}

nebula-archrules-gradle-plugin/gradle.lockfile

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,13 @@
44
cglib:cglib-nodep:3.2.2=testRuntimeClasspath
55
com.fasterxml.jackson.core:jackson-annotations:2.20=compileClasspath,implementationDependenciesMetadata,mainArchRulesRuntime,runtimeClasspath,testArchRulesRuntime,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
66
com.jayway.jsonpath:json-path:2.9.0=testArchRulesRuntime,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
7-
com.netflix.nebula:archrules-deprecation:0.7.1=archRules,mainArchRulesRuntime,testArchRulesRuntime
8-
com.netflix.nebula:archrules-joda:0.7.1=archRules,mainArchRulesRuntime,testArchRulesRuntime
9-
com.netflix.nebula:archrules-nullability:0.7.1=archRules,mainArchRulesRuntime,testArchRulesRuntime
10-
com.netflix.nebula:archrules-security:0.7.1=archRules,mainArchRulesRuntime,testArchRulesRuntime
11-
com.netflix.nebula:archrules-testing-frameworks:0.7.1=archRules,mainArchRulesRuntime,testArchRulesRuntime
12-
com.netflix.nebula:nebula-archrules-core:0.5.5=archRules,mainArchRulesRuntime,testArchRulesRuntime
7+
com.netflix.nebula:archrules-common:0.8.0=archRules,mainArchRulesRuntime,testArchRulesRuntime
8+
com.netflix.nebula:archrules-deprecation:0.8.0=archRules,mainArchRulesRuntime,testArchRulesRuntime
9+
com.netflix.nebula:archrules-joda:0.8.0=archRules,mainArchRulesRuntime,testArchRulesRuntime
10+
com.netflix.nebula:archrules-nullability:0.8.0=archRules,mainArchRulesRuntime,testArchRulesRuntime
11+
com.netflix.nebula:archrules-security:0.8.0=archRules,mainArchRulesRuntime,testArchRulesRuntime
12+
com.netflix.nebula:archrules-testing-frameworks:0.8.0=archRules,mainArchRulesRuntime,testArchRulesRuntime
13+
com.netflix.nebula:nebula-archrules-core:0.7.0=archRules,mainArchRulesRuntime,testArchRulesRuntime
1314
com.netflix.nebula:nebula-test:11.11.3=testArchRulesRuntime,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
1415
com.tngtech.archunit:archunit:1.4.1=archRules,compileClasspath,implementationDependenciesMetadata,mainArchRulesRuntime,runtimeClasspath,testArchRulesRuntime,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath
1516
io.github.java-diff-utils:java-diff-utils:4.12=kotlinInternalAbiValidation

nebula-archrules-gradle-plugin/src/main/java/com/netflix/nebula/archrules/gradle/ArchRuleAttribute.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,12 @@ public interface ArchRuleAttribute extends Named {
1717
Attribute.of("com.netflix.nebula.archrules", ArchRuleAttribute.class);
1818

1919
/**
20-
* The only recognized value of this attribute
20+
* Used in archrules artifacts to allow them to be selected via the variant selection algorithm
2121
*/
2222
String ARCH_RULES = "arch-rules";
23+
24+
/**
25+
* Used in non-archrules artifacts to avoid confusing the variant selection algorithm
26+
*/
27+
String NOT_ARCH_RULES = "not-arch-rules";
2328
}

nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesLibraryPlugin.kt

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.netflix.nebula.archrules.gradle
22

33
import com.netflix.nebula.archrules.gradle.ArchRuleAttribute.ARCH_RULES
4+
import com.netflix.nebula.archrules.gradle.ArchRuleAttribute.NOT_ARCH_RULES
5+
import org.gradle.api.Action
46
import org.gradle.api.Plugin
57
import org.gradle.api.Project
68
import org.gradle.api.artifacts.type.ArtifactTypeDefinition
@@ -17,23 +19,33 @@ import org.gradle.api.tasks.TaskProvider
1719
import org.gradle.api.tasks.bundling.Jar
1820
import org.gradle.api.tasks.compile.JavaCompile
1921
import org.gradle.jvm.component.internal.JvmSoftwareComponentInternal
20-
import org.gradle.kotlin.dsl.add
21-
import org.gradle.kotlin.dsl.dependencies
22+
import org.gradle.kotlin.dsl.apply
2223
import org.gradle.kotlin.dsl.getByType
2324
import org.gradle.kotlin.dsl.invoke
2425
import org.gradle.kotlin.dsl.named
2526
import org.gradle.kotlin.dsl.register
2627
import org.gradle.kotlin.dsl.support.serviceOf
2728
import org.gradle.kotlin.dsl.withType
2829
import org.gradle.testing.base.TestingExtension
29-
import kotlin.collections.mapOf
3030

3131
class ArchrulesLibraryPlugin : Plugin<Project> {
3232

3333
override fun apply(project: Project) {
3434
val version = determineVersion()
3535
project.pluginManager.withPlugin("java") {
3636
val javaExt = project.extensions.getByType<JavaPluginExtension>()
37+
javaExt.sourceSets.configureEach(Action {
38+
if(!setOf("archRules", "archRulesTest").contains(this.name)) {
39+
project.configurations.named(compileClasspathConfigurationName).configure {
40+
attributes {
41+
attribute(ArchRuleAttribute.ARCH_RULES_ATTRIBUTE, project.objects.named(NOT_ARCH_RULES))
42+
}
43+
}
44+
}
45+
})
46+
project.plugins.withId("com.google.protobuf"){
47+
project.pluginManager.apply(ProtoSupportPlugin::class)
48+
}
3749
val archRulesSourceSet = javaExt.sourceSets.create("archRules")
3850
project.configurations.named(archRulesSourceSet.implementationConfigurationName).configure {
3951
extendsFrom(project.configurations.getByName(javaExt.sourceSets.getByName("main").implementationConfigurationName))

nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesRunnerPlugin.kt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package com.netflix.nebula.archrules.gradle
22

33
import com.netflix.nebula.archrules.gradle.ArchRuleAttribute.ARCH_RULES
4+
import com.netflix.nebula.archrules.gradle.ArchRuleAttribute.NOT_ARCH_RULES
45
import com.tngtech.archunit.lang.Priority
6+
import org.gradle.api.Action
57
import org.gradle.api.Plugin
68
import org.gradle.api.Project
79
import org.gradle.api.attributes.Bundling
@@ -29,6 +31,19 @@ class ArchrulesRunnerPlugin : Plugin<Project> {
2931
}
3032
}
3133
project.plugins.withId("java") {
34+
val javaExt = project.extensions.getByType<JavaPluginExtension>()
35+
javaExt.sourceSets.configureEach(Action {
36+
if(!setOf("archRules", "archRulesTest").contains(this.name)) {
37+
project.configurations.named(compileClasspathConfigurationName).configure {
38+
attributes {
39+
attribute(ArchRuleAttribute.ARCH_RULES_ATTRIBUTE, project.objects.named(NOT_ARCH_RULES))
40+
}
41+
}
42+
}
43+
})
44+
project.plugins.withId("com.google.protobuf"){
45+
project.pluginManager.apply(ProtoSupportPlugin::class)
46+
}
3247
val archRulesExt = project.extensions.create<ArchrulesExtension>("archRules")
3348
archRulesExt.consoleReportEnabled.convention(true)
3449
archRulesExt.skipPassingSummaries.convention(false)
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.netflix.nebula.archrules.gradle
2+
3+
import com.netflix.nebula.archrules.gradle.ArchRuleAttribute.NOT_ARCH_RULES
4+
import org.gradle.api.Action
5+
import org.gradle.api.Plugin
6+
import org.gradle.api.Project
7+
import org.gradle.api.plugins.JavaPluginExtension
8+
import org.gradle.api.tasks.SourceSet
9+
import org.gradle.kotlin.dsl.getByType
10+
import org.gradle.kotlin.dsl.named
11+
12+
/**
13+
* This is an internal plugin which provides interop with the protobuf plugin.
14+
* It should be only applied in response to the proto plugin
15+
*/
16+
class ProtoSupportPlugin : Plugin<Project> {
17+
override fun apply(project: Project) {
18+
project.pluginManager.withPlugin("java") {
19+
val javaExt = project.extensions.getByType<JavaPluginExtension>()
20+
/**
21+
* Ideally we would get the source sets from ProtobufExtension, but it is not exposed
22+
*/
23+
javaExt.sourceSets.configureEach(Action<SourceSet> {
24+
val configurationName = if (this.name == "main") "compileProtoPath" else name + "CompileProtoPath"
25+
project.configurations.named(configurationName).configure {
26+
attributes {
27+
attribute(ArchRuleAttribute.ARCH_RULES_ATTRIBUTE, project.objects.named(NOT_ARCH_RULES))
28+
}
29+
}
30+
})
31+
}
32+
}
33+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
package com.netflix.nebula.archrules.gradle
2+

nebula-archrules-gradle-plugin/src/test/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesLibraryPluginTest.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class ArchrulesLibraryPluginTest {
3131
fun `plugin produces maven publication`() {
3232
val runner = testProject(projectDir) {
3333
properties {
34-
gradleCache(true)
34+
buildCache(true)
3535
}
3636
settings {
3737
name("library-with-rules")
@@ -123,7 +123,7 @@ class ArchrulesLibraryPluginTest {
123123
fun `main dependencies are included in archRules`() {
124124
val runner = testProject(projectDir) {
125125
properties {
126-
gradleCache(true)
126+
buildCache(true)
127127
}
128128
settings {
129129
name("library-with-rules")
@@ -194,7 +194,7 @@ class ArchrulesLibraryPluginTest {
194194
fun `plugin produces proper outgoingVariants`() {
195195
val runner = testProject(projectDir) {
196196
properties {
197-
gradleCache(true)
197+
buildCache(true)
198198
}
199199
settings {
200200
name("library-with-rules")

0 commit comments

Comments
 (0)