Skip to content

Commit

Permalink
Parse Gradle public API
Browse files Browse the repository at this point in the history
  • Loading branch information
wolfs committed Oct 2, 2018
1 parent 65ca1aa commit bd16e96
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 1 deletion.
6 changes: 6 additions & 0 deletions subprojects/architecture-test/architecture-test.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import org.gradle.gradlebuild.ProjectGroups.publicProjects
import org.gradle.gradlebuild.unittestandcompile.ModuleType
import org.gradle.gradlebuild.PublicApi

plugins {
`java-library`
Expand All @@ -18,3 +19,8 @@ dependencies {
testRuntime(it)
}
}

tasks.withType<Test> {
systemProperty("org.gradle.public.api.includes", PublicApi.includes.joinToString(":"))
systemProperty("org.gradle.public.api.excludes", PublicApi.excludes.joinToString(":"))
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@

package org.gradle.architecture.test;

import com.tngtech.archunit.base.DescribedPredicate;
import com.tngtech.archunit.base.PackageMatchers;
import com.tngtech.archunit.core.domain.JavaClass;
import com.tngtech.archunit.core.domain.JavaMethod;
import com.tngtech.archunit.core.domain.JavaModifier;
Expand All @@ -33,16 +35,25 @@
import java.util.stream.Stream;
import javax.annotation.Nullable;

import static com.tngtech.archunit.base.DescribedPredicate.not;
import static com.tngtech.archunit.lang.SimpleConditionEvent.violated;
import static com.tngtech.archunit.lang.conditions.ArchPredicates.are;
import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.classes;
import static java.util.stream.Collectors.toSet;

@RunWith(ArchUnitRunner.class)
@AnalyzeClasses(packages = "org.gradle")
public class KotlinCompatibilityTest {

public static DescribedPredicate<JavaClass> gradlePublicApi() {
return new GradlePublicApi();
}

@ArchTest
public static final ArchRule consistent_nullable_annotations_on_public_api = classes().that(are(gradlePublicApi())).should(haveAccessorsWithSymmetricalNullableAnnotations());

@ArchTest
public static final ArchRule consistent_nullable_annotations = classes().should(haveAccessorsWithSymmetricalNullableAnnotations());
public static final ArchRule consistent_nullable_annotations_on_internal_api = classes().that(are(not(gradlePublicApi()))).should(haveAccessorsWithSymmetricalNullableAnnotations());

private static ArchCondition<JavaClass> haveAccessorsWithSymmetricalNullableAnnotations() {
return new ArchCondition<JavaClass>("have accessors with symmetrical @Nullable annotations") {
Expand Down Expand Up @@ -117,4 +128,24 @@ private String propertyNameOf(JavaMethod getter) {
return PropertyAccessorType.fromName(getter.getName()).propertyNameFor(getter.getName());
}
}

private static class GradlePublicApi extends DescribedPredicate<JavaClass> {
private static final PackageMatchers INCLUDES = PackageMatchers.of(parsePackageMatcher(System.getProperty("org.gradle.public.api.includes")));
private static final PackageMatchers EXCLUDES = PackageMatchers.of(parsePackageMatcher(System.getProperty("org.gradle.public.api.excludes")));

public GradlePublicApi() {
super("Gradle public API");
}

@Override
public boolean apply(JavaClass input) {
return INCLUDES.apply(input.getPackageName()) && !EXCLUDES.apply(input.getPackageName());
}

private static Set<String> parsePackageMatcher(String packageList) {
return Arrays.stream(packageList.split(":"))
.map(include -> include.replace("**/", "..").replace("/**", "..").replace("/*", "").replace("/", "."))
.collect(toSet());
}
}
}

0 comments on commit bd16e96

Please sign in to comment.