From 65e2c8474e83046021494da449df4c40361c6647 Mon Sep 17 00:00:00 2001 From: dondonz <13839920+dondonz@users.noreply.github.com> Date: Fri, 23 May 2025 17:41:51 +1000 Subject: [PATCH 1/2] Add ArchUnit rule to ban javax nullability annotations --- build.gradle | 2 +- .../groovy/graphql/AnnotationUsageTest.groovy | 40 +++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 src/test/groovy/graphql/AnnotationUsageTest.groovy diff --git a/build.gradle b/build.gradle index 1eb3c86852..44d069b11f 100644 --- a/build.gradle +++ b/build.gradle @@ -176,7 +176,7 @@ shadowJar { bnd(''' -exportcontents: graphql.* -removeheaders: Private-Package -Import-Package: !android.os.*,!com.google.*,!org.checkerframework.*,!javax.annotation.*,!graphql.com.google.*,!org.antlr.*,!graphql.org.antlr.*,!sun.misc.*,org.jspecify.annotations;resolution:=optional,* +Import-Package: !android.os.*,!com.google.*,!org.checkerframework.*,!graphql.com.google.*,!org.antlr.*,!graphql.org.antlr.*,!sun.misc.*,org.jspecify.annotations;resolution:=optional,* ''') } diff --git a/src/test/groovy/graphql/AnnotationUsageTest.groovy b/src/test/groovy/graphql/AnnotationUsageTest.groovy new file mode 100644 index 0000000000..9f953a671a --- /dev/null +++ b/src/test/groovy/graphql/AnnotationUsageTest.groovy @@ -0,0 +1,40 @@ +package graphql + +import com.tngtech.archunit.core.domain.JavaClasses +import com.tngtech.archunit.core.importer.ClassFileImporter +import com.tngtech.archunit.core.importer.ImportOption +import com.tngtech.archunit.lang.ArchRule +import com.tngtech.archunit.lang.EvaluationResult +import com.tngtech.archunit.lang.syntax.ArchRuleDefinition +import spock.lang.Specification + +class AnnotationUsageTest extends Specification { + + private static final JavaClasses importedClasses = new ClassFileImporter() + .withImportOption(ImportOption.Predefined.DO_NOT_INCLUDE_TESTS) + .importPackages("graphql") + + def "should only use JSpecify nullability annotations"() { + given: + ArchRule dependencyRule = ArchRuleDefinition.noClasses() + .should() + .dependOnClassesThat() + .resideInAnyPackage( + "javax.annotation", + "org.jetbrains.annotations" + ) + .because("We are using JSpecify nullability annotations only. Please change to use JSpecify.") + + when: + EvaluationResult result = dependencyRule.evaluate(importedClasses) + + then: + if (result.hasViolation()) { + println "We are using JSpecify nullability annotations only. Please change the following to use JSpecify instead:" + result.getFailureReport().getDetails().each { violation -> + println "- ${violation}" + } + } + !result.hasViolation() + } +} \ No newline at end of file From 08c8bd382d2173944b853664ee33a233e01f46aa Mon Sep 17 00:00:00 2001 From: dondonz <13839920+dondonz@users.noreply.github.com> Date: Fri, 23 May 2025 17:45:15 +1000 Subject: [PATCH 2/2] Rename to nullability annotation --- ...onUsageTest.groovy => NullabilityAnnotationUsageTest.groovy} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/test/groovy/graphql/{AnnotationUsageTest.groovy => NullabilityAnnotationUsageTest.groovy} (96%) diff --git a/src/test/groovy/graphql/AnnotationUsageTest.groovy b/src/test/groovy/graphql/NullabilityAnnotationUsageTest.groovy similarity index 96% rename from src/test/groovy/graphql/AnnotationUsageTest.groovy rename to src/test/groovy/graphql/NullabilityAnnotationUsageTest.groovy index 9f953a671a..10b6b5458f 100644 --- a/src/test/groovy/graphql/AnnotationUsageTest.groovy +++ b/src/test/groovy/graphql/NullabilityAnnotationUsageTest.groovy @@ -8,7 +8,7 @@ import com.tngtech.archunit.lang.EvaluationResult import com.tngtech.archunit.lang.syntax.ArchRuleDefinition import spock.lang.Specification -class AnnotationUsageTest extends Specification { +class NullabilityAnnotationUsageTest extends Specification { private static final JavaClasses importedClasses = new ClassFileImporter() .withImportOption(ImportOption.Predefined.DO_NOT_INCLUDE_TESTS)