Skip to content

Commit ce3dfed

Browse files
committed
gradle rule improvements
add rule to ensure task getters are abstract refactor gradle rules so that they are grouped in the same provider update gradle wrapper to newest
1 parent efc2f78 commit ce3dfed

34 files changed

+533
-434
lines changed

README.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,15 @@ This repository contains several libraries of ArchRules which can be used in pro
77
[![Maven Central](https://img.shields.io/maven-central/v/com.netflix.nebula/archrules-deprecation?style=for-the-badge&color=01AF01)](https://repo1.maven.org/maven2/com/netflix/nebula/archrules-deprecation/)
88

99
## Gradle Plugin Development
10-
[![Maven Central](https://img.shields.io/maven-central/v/com.netflix.nebula/archrules-gradle-plugin-development?style=for-the-badge&color=01AF01)](https://repo1.maven.org/maven2/com/netflix/nebula/gradle-plugin-development/)
10+
[![Maven Central](https://img.shields.io/maven-central/v/com.netflix.nebula/archrules-gradle-plugin-development?style=for-the-badge&color=01AF01)](https://repo1.maven.org/maven2/com/netflix/nebula/archrules-gradle-plugin-development/)
1111

1212
These rules enforce best practices when developing Gradle plugins.
1313

14+
## Guava Rules
15+
[![Maven Central](https://img.shields.io/maven-central/v/com.netflix.nebula/archrules-guava?style=for-the-badge&color=01AF01)](https://repo1.maven.org/maven2/com/netflix/nebula/archrules-guava/)
16+
17+
These rules detect the usage of certain APIs from Guava which have standard library replacements.
18+
1419
## Javax Rules
1520
[![Maven Central](https://img.shields.io/maven-central/v/com.netflix.nebula/archrules-joda?style=for-the-badge&color=01AF01)](https://repo1.maven.org/maven2/com/netflix/nebula/archrules-javax/)
1621

archrules-deprecation/gradle.lockfile

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,12 @@
33
# This file is expected to be part of source control.
44
ch.qos.logback:logback-classic:1.5.20=archRulesTestArchRulesRuntime,archRulesTestCompileClasspath,archRulesTestRuntimeClasspath
55
ch.qos.logback:logback-core:1.5.20=archRulesTestArchRulesRuntime,archRulesTestCompileClasspath,archRulesTestRuntimeClasspath
6-
com.netflix.nebula:archrules-joda:0.3.0=archRules
7-
com.netflix.nebula:archrules-joda:0.6.0=archRulesArchRulesRuntime,archRulesTestArchRulesRuntime,mainArchRulesRuntime,testArchRulesRuntime
8-
com.netflix.nebula:archrules-nullability:0.3.0=archRules
9-
com.netflix.nebula:archrules-nullability:0.6.0=archRulesArchRulesRuntime,archRulesTestArchRulesRuntime,mainArchRulesRuntime,testArchRulesRuntime
10-
com.netflix.nebula:archrules-testing-frameworks:0.3.0=archRules
11-
com.netflix.nebula:archrules-testing-frameworks:0.6.0=archRulesArchRulesRuntime,archRulesTestArchRulesRuntime,mainArchRulesRuntime,testArchRulesRuntime
12-
com.netflix.nebula:nebula-archrules-core:0.2.3=archRules
13-
com.netflix.nebula:nebula-archrules-core:0.3.0=archRulesRuntimeClasspath
14-
com.netflix.nebula:nebula-archrules-core:0.4.0=mainArchRulesRuntime,testArchRulesRuntime
15-
com.netflix.nebula:nebula-archrules-core:0.5.3=archRulesArchRulesRuntime,archRulesCompileClasspath,archRulesTestArchRulesRuntime,archRulesTestCompileClasspath,archRulesTestRuntimeClasspath
6+
com.netflix.nebula:archrules-joda:0.6.0=archRules,archRulesArchRulesRuntime,archRulesTestArchRulesRuntime,mainArchRulesRuntime,testArchRulesRuntime
7+
com.netflix.nebula:archrules-nullability:0.6.0=archRules,archRulesArchRulesRuntime,archRulesTestArchRulesRuntime,mainArchRulesRuntime,testArchRulesRuntime
8+
com.netflix.nebula:archrules-security:0.6.0=archRules,archRulesArchRulesRuntime,archRulesTestArchRulesRuntime,mainArchRulesRuntime,testArchRulesRuntime
9+
com.netflix.nebula:archrules-testing-frameworks:0.6.0=archRules,archRulesArchRulesRuntime,archRulesTestArchRulesRuntime,mainArchRulesRuntime,testArchRulesRuntime
10+
com.netflix.nebula:nebula-archrules-core:0.5.2=archRules,mainArchRulesRuntime,testArchRulesRuntime
11+
com.netflix.nebula:nebula-archrules-core:0.5.5=archRulesArchRulesRuntime,archRulesCompileClasspath,archRulesRuntimeClasspath,archRulesTestArchRulesRuntime,archRulesTestCompileClasspath,archRulesTestRuntimeClasspath
1612
com.tngtech.archunit:archunit:1.4.1=archRules,archRulesArchRulesRuntime,archRulesCompileClasspath,archRulesRuntimeClasspath,archRulesTestArchRulesRuntime,archRulesTestCompileClasspath,archRulesTestRuntimeClasspath,mainArchRulesRuntime,testArchRulesRuntime
1713
net.bytebuddy:byte-buddy:1.17.7=archRulesTestArchRulesRuntime,archRulesTestCompileClasspath,archRulesTestRuntimeClasspath
1814
org.apiguardian:apiguardian-api:1.1.2=archRulesTestCompileClasspath

archrules-gradle-plugin-development/gradle.lockfile

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,18 @@
33
# This file is expected to be part of source control.
44
ch.qos.logback:logback-classic:1.5.20=archRulesTestArchRulesRuntime,archRulesTestCompileClasspath,archRulesTestRuntimeClasspath
55
ch.qos.logback:logback-core:1.5.20=archRulesTestArchRulesRuntime,archRulesTestCompileClasspath,archRulesTestRuntimeClasspath
6-
com.netflix.nebula:archrules-deprecation:0.4.0=archRules
76
com.netflix.nebula:archrules-deprecation:0.6.0=archRulesArchRulesRuntime,archRulesTestArchRulesRuntime,mainArchRulesRuntime,testArchRulesRuntime
8-
com.netflix.nebula:archrules-joda:0.4.0=archRules
97
com.netflix.nebula:archrules-joda:0.6.0=archRulesArchRulesRuntime,archRulesTestArchRulesRuntime,mainArchRulesRuntime,testArchRulesRuntime
10-
com.netflix.nebula:archrules-nullability:0.4.0=archRules
118
com.netflix.nebula:archrules-nullability:0.6.0=archRulesArchRulesRuntime,archRulesTestArchRulesRuntime,mainArchRulesRuntime,testArchRulesRuntime
12-
com.netflix.nebula:archrules-testing-frameworks:0.4.0=archRules
9+
com.netflix.nebula:archrules-security:0.6.0=archRulesArchRulesRuntime,archRulesTestArchRulesRuntime,mainArchRulesRuntime,testArchRulesRuntime
1310
com.netflix.nebula:archrules-testing-frameworks:0.6.0=archRulesArchRulesRuntime,archRulesTestArchRulesRuntime,mainArchRulesRuntime,testArchRulesRuntime
14-
com.netflix.nebula:nebula-archrules-core:0.3.0=archRules
15-
com.netflix.nebula:nebula-archrules-core:0.4.0=mainArchRulesRuntime,testArchRulesRuntime
16-
com.netflix.nebula:nebula-archrules-core:0.5.2=archRulesRuntimeClasspath
17-
com.netflix.nebula:nebula-archrules-core:0.5.3=archRulesArchRulesRuntime,archRulesCompileClasspath,archRulesTestArchRulesRuntime,archRulesTestCompileClasspath,archRulesTestRuntimeClasspath
18-
com.tngtech.archunit:archunit:1.4.1=archRules,archRulesArchRulesRuntime,archRulesCompileClasspath,archRulesRuntimeClasspath,archRulesTestArchRulesRuntime,archRulesTestCompileClasspath,archRulesTestRuntimeClasspath,mainArchRulesRuntime,testArchRulesRuntime
11+
com.netflix.nebula:nebula-archrules-core:0.5.2=mainArchRulesRuntime,testArchRulesRuntime
12+
com.netflix.nebula:nebula-archrules-core:0.5.5=archRulesArchRulesRuntime,archRulesCompileClasspath,archRulesTestArchRulesRuntime,archRulesTestCompileClasspath,archRulesTestRuntimeClasspath
13+
com.tngtech.archunit:archunit:1.4.1=archRulesArchRulesRuntime,archRulesCompileClasspath,archRulesTestArchRulesRuntime,archRulesTestCompileClasspath,archRulesTestRuntimeClasspath,mainArchRulesRuntime,testArchRulesRuntime
1914
net.bytebuddy:byte-buddy:1.17.7=archRulesTestArchRulesRuntime,archRulesTestCompileClasspath,archRulesTestRuntimeClasspath
2015
org.apiguardian:apiguardian-api:1.1.2=archRulesTestCompileClasspath
2116
org.assertj:assertj-core:3.27.6=archRulesTestArchRulesRuntime,archRulesTestCompileClasspath,archRulesTestRuntimeClasspath
22-
org.jspecify:jspecify:1.0.0=archRules,archRulesArchRulesRuntime,archRulesCompileClasspath,archRulesRuntimeClasspath,archRulesTestArchRulesRuntime,archRulesTestCompileClasspath,archRulesTestRuntimeClasspath,mainArchRulesRuntime,testArchRulesRuntime
17+
org.jspecify:jspecify:1.0.0=archRulesArchRulesRuntime,archRulesCompileClasspath,archRulesTestArchRulesRuntime,archRulesTestCompileClasspath,archRulesTestRuntimeClasspath,mainArchRulesRuntime,testArchRulesRuntime
2318
org.junit.jupiter:junit-jupiter-api:5.12.2=archRulesTestArchRulesRuntime,archRulesTestCompileClasspath,archRulesTestRuntimeClasspath
2419
org.junit.jupiter:junit-jupiter-engine:5.12.2=archRulesTestArchRulesRuntime,archRulesTestRuntimeClasspath
2520
org.junit.jupiter:junit-jupiter-params:5.12.2=archRulesTestArchRulesRuntime,archRulesTestCompileClasspath,archRulesTestRuntimeClasspath
@@ -29,5 +24,5 @@ org.junit.platform:junit-platform-engine:1.12.2=archRulesTestArchRulesRuntime,ar
2924
org.junit.platform:junit-platform-launcher:1.12.2=archRulesTestArchRulesRuntime,archRulesTestRuntimeClasspath
3025
org.junit:junit-bom:5.12.2=archRulesTestArchRulesRuntime,archRulesTestCompileClasspath,archRulesTestRuntimeClasspath
3126
org.opentest4j:opentest4j:1.3.0=archRulesTestArchRulesRuntime,archRulesTestCompileClasspath,archRulesTestRuntimeClasspath
32-
org.slf4j:slf4j-api:2.0.17=archRules,archRulesArchRulesRuntime,archRulesCompileClasspath,archRulesRuntimeClasspath,archRulesTestArchRulesRuntime,archRulesTestCompileClasspath,archRulesTestRuntimeClasspath,mainArchRulesRuntime,testArchRulesRuntime
33-
empty=annotationProcessor,archRulesAnnotationProcessor,archRulesTestAnnotationProcessor,compileClasspath,runtimeClasspath,testAnnotationProcessor,testCompileClasspath,testRuntimeClasspath
27+
org.slf4j:slf4j-api:2.0.17=archRulesArchRulesRuntime,archRulesCompileClasspath,archRulesTestArchRulesRuntime,archRulesTestCompileClasspath,archRulesTestRuntimeClasspath,mainArchRulesRuntime,testArchRulesRuntime
28+
empty=annotationProcessor,archRulesAnnotationProcessor,archRulesTestAnnotationProcessor,compileClasspath,testAnnotationProcessor,testCompileClasspath,testRuntimeClasspath
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.netflix.nebula.archrules.gradleplugins;
2+
3+
import com.tngtech.archunit.base.DescribedPredicate;
4+
import com.tngtech.archunit.core.domain.JavaClass;
5+
import com.tngtech.archunit.core.domain.JavaMember;
6+
import org.jspecify.annotations.NullMarked;
7+
8+
import java.util.Set;
9+
import java.util.function.Function;
10+
11+
@NullMarked
12+
public class ContainAnyMembersInClassHierarchyThatPredicate <T extends JavaMember> extends DescribedPredicate<JavaClass> {
13+
private final Function<JavaClass, Set<T>> getMembers;
14+
private final DescribedPredicate<? super T> predicate;
15+
16+
ContainAnyMembersInClassHierarchyThatPredicate(String memberDescription, Function<JavaClass, Set<T>> getMembers, DescribedPredicate<? super T> predicate) {
17+
super("contain any " + memberDescription + " that " + predicate.getDescription());
18+
this.getMembers = getMembers;
19+
this.predicate = predicate;
20+
}
21+
22+
@Override
23+
public boolean test(JavaClass input) {
24+
return getMembers.apply(input).stream().anyMatch(predicate);
25+
}
26+
}
Lines changed: 10 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,21 @@
11
package com.netflix.nebula.archrules.gradleplugins;
22

3-
import com.netflix.nebula.archrules.core.ArchRulesService;
4-
import com.tngtech.archunit.core.domain.JavaAccess;
5-
import com.tngtech.archunit.core.domain.JavaClass;
6-
import com.tngtech.archunit.lang.ArchCondition;
73
import com.tngtech.archunit.lang.ArchRule;
8-
import com.tngtech.archunit.lang.ConditionEvents;
94
import com.tngtech.archunit.lang.Priority;
10-
import com.tngtech.archunit.lang.SimpleConditionEvent;
115
import com.tngtech.archunit.lang.syntax.ArchRuleDefinition;
126
import org.jspecify.annotations.NullMarked;
137

14-
import java.util.HashMap;
15-
import java.util.Map;
8+
import static com.netflix.nebula.archrules.gradleplugins.Predicates.accessDeprecatedGradleApi;
9+
import static com.netflix.nebula.archrules.gradleplugins.Predicates.deprecatedGradleClass;
10+
import static com.tngtech.archunit.lang.conditions.ArchConditions.accessTargetWhere;
1611

1712
/**
1813
* Rules to prevent usage of deprecated Gradle APIs.
1914
* <p>
2015
* Using deprecated Gradle APIs will cause build failures in future Gradle versions.
2116
*/
2217
@NullMarked
23-
public class GradleDeprecatedApiRule implements ArchRulesService {
24-
25-
private static final String GRADLE_API_PACKAGE = "org.gradle";
18+
public class GradleDeprecatedApiRule {
2619

2720
/**
2821
* Prevents plugins from using deprecated Gradle APIs.
@@ -32,9 +25,10 @@ public class GradleDeprecatedApiRule implements ArchRulesService {
3225
* upgrade guides.
3326
*/
3427
public static final ArchRule pluginsShouldNotUseDeprecatedGradleApis = ArchRuleDefinition.priority(Priority.MEDIUM)
35-
.classes()
28+
.noClasses()
3629
.that().implement("org.gradle.api.Plugin")
37-
.should(notUseDeprecatedGradleApis())
30+
.should().dependOnClassesThat(deprecatedGradleClass)
31+
.orShould(accessTargetWhere(accessDeprecatedGradleApi))
3832
.allowEmptyShould(true)
3933
.because(
4034
"Plugins should not use deprecated Gradle APIs as they will be removed in future versions. " +
@@ -50,52 +44,15 @@ public class GradleDeprecatedApiRule implements ArchRulesService {
5044
* upgrade guides.
5145
*/
5246
public static final ArchRule tasksShouldNotUseDeprecatedGradleApis = ArchRuleDefinition.priority(Priority.MEDIUM)
53-
.classes()
47+
.noClasses()
5448
.that().areAssignableTo("org.gradle.api.Task")
5549
.and().areNotInterfaces()
56-
.should(notUseDeprecatedGradleApis())
50+
.should().dependOnClassesThat(deprecatedGradleClass)
51+
.orShould(accessTargetWhere(accessDeprecatedGradleApi))
5752
.allowEmptyShould(true)
5853
.because(
5954
"Tasks should not use deprecated Gradle APIs as they will be removed in future versions. " +
6055
"Consult Gradle upgrade guides for modern alternatives. " +
6156
"See https://docs.gradle.org/current/userguide/upgrading_version_8.html"
6257
);
63-
64-
private static ArchCondition<JavaClass> notUseDeprecatedGradleApis() {
65-
return new ArchCondition<JavaClass>("not use deprecated Gradle APIs") {
66-
@Override
67-
public void check(JavaClass javaClass, ConditionEvents events) {
68-
for (JavaAccess<?> access : javaClass.getAccessesFromSelf()) {
69-
if (isDeprecatedGradleApi(access)) {
70-
String message = String.format(
71-
"Class %s uses deprecated Gradle API: %s. " +
72-
"This API will be removed in a future Gradle version. " +
73-
"Consult Gradle upgrade guides for alternatives.",
74-
javaClass.getSimpleName(),
75-
access.getDescription()
76-
);
77-
events.add(SimpleConditionEvent.violated(access, message));
78-
}
79-
}
80-
}
81-
82-
private boolean isDeprecatedGradleApi(JavaAccess<?> access) {
83-
String targetOwnerName = access.getTargetOwner().getName();
84-
85-
if (!targetOwnerName.startsWith(GRADLE_API_PACKAGE)) {
86-
return false;
87-
}
88-
89-
return access.getTarget().isAnnotatedWith(Deprecated.class);
90-
}
91-
};
92-
}
93-
94-
@Override
95-
public Map<String, ArchRule> getRules() {
96-
Map<String, ArchRule> rules = new HashMap<>();
97-
rules.put("gradle-plugin-no-deprecated-apis", pluginsShouldNotUseDeprecatedGradleApis);
98-
rules.put("gradle-task-no-deprecated-apis", tasksShouldNotUseDeprecatedGradleApis);
99-
return rules;
100-
}
10158
}
Lines changed: 11 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,12 @@
11
package com.netflix.nebula.archrules.gradleplugins;
22

3-
import com.netflix.nebula.archrules.core.ArchRulesService;
4-
import com.tngtech.archunit.core.domain.JavaAccess;
5-
import com.tngtech.archunit.core.domain.JavaClass;
6-
import com.tngtech.archunit.lang.ArchCondition;
73
import com.tngtech.archunit.lang.ArchRule;
8-
import com.tngtech.archunit.lang.ConditionEvents;
94
import com.tngtech.archunit.lang.Priority;
10-
import com.tngtech.archunit.lang.SimpleConditionEvent;
115
import com.tngtech.archunit.lang.syntax.ArchRuleDefinition;
126
import org.jspecify.annotations.NullMarked;
137

14-
import java.util.HashMap;
15-
import java.util.Map;
8+
import static com.netflix.nebula.archrules.gradleplugins.Predicates.internalGradleClass;
9+
import static com.tngtech.archunit.core.domain.JavaAccess.Predicates.targetOwner;
1610

1711
/**
1812
* Rules to prevent usage of internal Gradle APIs.
@@ -21,10 +15,7 @@
2115
* or be removed without notice between Gradle versions.
2216
*/
2317
@NullMarked
24-
public class GradleInternalApiRule implements ArchRulesService {
25-
26-
private static final String GRADLE_PACKAGE = "org.gradle";
27-
private static final String INTERNAL_PACKAGE_MARKER = ".internal.";
18+
public class GradleInternalApiRule {
2819

2920
/**
3021
* Prevents plugins from using internal Gradle APIs.
@@ -33,10 +24,11 @@ public class GradleInternalApiRule implements ArchRulesService {
3324
* and may change or be removed between versions without notice. Use only public
3425
* Gradle APIs to ensure compatibility across Gradle versions.
3526
*/
36-
public static final ArchRule pluginsShouldNotUseInternalGradleApis = ArchRuleDefinition.priority(Priority.HIGH)
37-
.classes()
27+
public static final ArchRule PLUGIN_INTERNAL = ArchRuleDefinition.priority(Priority.MEDIUM)
28+
.noClasses()
3829
.that().implement("org.gradle.api.Plugin")
39-
.should(notUseInternalGradleApis())
30+
.should().dependOnClassesThat(internalGradleClass)
31+
.orShould().accessTargetWhere(targetOwner(internalGradleClass))
4032
.allowEmptyShould(true)
4133
.because(
4234
"Plugins should not use internal Gradle APIs (packages containing '.internal.'). " +
@@ -51,49 +43,16 @@ public class GradleInternalApiRule implements ArchRulesService {
5143
* and may change or be removed between versions without notice. Use only public
5244
* Gradle APIs to ensure compatibility across Gradle versions.
5345
*/
54-
public static final ArchRule tasksShouldNotUseInternalGradleApis = ArchRuleDefinition.priority(Priority.HIGH)
55-
.classes()
46+
public static final ArchRule TASK_INTERNAL = ArchRuleDefinition.priority(Priority.MEDIUM)
47+
.noClasses()
5648
.that().areAssignableTo("org.gradle.api.Task")
5749
.and().areNotInterfaces()
58-
.should(notUseInternalGradleApis())
50+
.should().dependOnClassesThat(internalGradleClass)
51+
.orShould().accessTargetWhere(targetOwner(internalGradleClass))
5952
.allowEmptyShould(true)
6053
.because(
6154
"Tasks should not use internal Gradle APIs (packages containing '.internal.'). " +
6255
"Internal APIs are not stable and may change or be removed without notice. " +
6356
"Use only public Gradle APIs documented at https://docs.gradle.org/current/javadoc/"
6457
);
65-
66-
private static ArchCondition<JavaClass> notUseInternalGradleApis() {
67-
return new ArchCondition<JavaClass>("not use internal Gradle APIs") {
68-
@Override
69-
public void check(JavaClass javaClass, ConditionEvents events) {
70-
for (JavaAccess<?> access : javaClass.getAccessesFromSelf()) {
71-
if (isInternalGradleApi(access)) {
72-
String message = String.format(
73-
"Class %s uses internal Gradle API: %s. " +
74-
"Internal APIs (packages containing '.internal.') are not stable and may change without notice. " +
75-
"Use public Gradle APIs instead.",
76-
javaClass.getSimpleName(),
77-
access.getDescription()
78-
);
79-
events.add(SimpleConditionEvent.violated(access, message));
80-
}
81-
}
82-
}
83-
84-
private boolean isInternalGradleApi(JavaAccess<?> access) {
85-
String targetPackage = access.getTargetOwner().getPackageName();
86-
return targetPackage.startsWith(GRADLE_PACKAGE) &&
87-
targetPackage.contains(INTERNAL_PACKAGE_MARKER);
88-
}
89-
};
90-
}
91-
92-
@Override
93-
public Map<String, ArchRule> getRules() {
94-
Map<String, ArchRule> rules = new HashMap<>();
95-
rules.put("gradle-plugin-no-internal-apis", pluginsShouldNotUseInternalGradleApis);
96-
rules.put("gradle-task-no-internal-apis", tasksShouldNotUseInternalGradleApis);
97-
return rules;
98-
}
9958
}

0 commit comments

Comments
 (0)