Skip to content

Commit e9b1f19

Browse files
committed
add extension option for skipping running rules in specific source sets
1 parent 5a6c29c commit e9b1f19

File tree

6 files changed

+135
-2
lines changed

6 files changed

+135
-2
lines changed

README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,14 @@ archRules {
154154
}
155155
```
156156

157+
You can skip running rules on a specific source set:
158+
```kotlin
159+
archRules {
160+
skipSourceSet("test")
161+
}
162+
```
163+
The `archRulesTest` source set is skipped by default.
164+
157165
## How it works
158166

159167
The Archrules Library plugin produces a separate Jar for the `archRules` sourceset, which is exposed as an alternate variant of the library. It also will automatically generate a `META-INF/services` file which contains a reference for each implementation of `com.netflix.nebula.archrules.core.ArchRulesService` to declare it as a service provider.

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ abstract public class PrintConsoleReportTask extends DefaultTask {
3737
public void printReport() {
3838
final var consoleOutput = getServices().get(StyledTextOutputFactory.class).create("archrules");
3939
List<RuleResult> list = getDataFiles().get().stream()
40+
.filter(File::exists)
4041
.flatMap(it -> ViolationsUtil.readDetails(it).stream())
4142
.toList();
4243
final var byRule = ViolationsUtil.consolidatedFailures(list);

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ abstract public class PrintJsonReportTask extends DefaultTask {
3737
@TaskAction
3838
public void printReport() {
3939
List<RuleResult> list = getDataFiles().get().stream()
40+
.filter(File::exists)
4041
.flatMap(it -> ViolationsUtil.readDetails(it).stream())
4142
.toList();
4243

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

3+
import org.gradle.api.provider.ListProperty
34
import org.gradle.api.provider.Property
45

56
abstract class ArchrulesExtension {
7+
/**
8+
* set to false to disable the console report
9+
*/
610
abstract val consoleReportEnabled: Property<Boolean>
11+
12+
/**
13+
* Skip printing lines in the console report summary for passing rules
14+
*/
715
abstract val skipPassingSummaries: Property<Boolean>
16+
abstract val sourceSetsToSkip: ListProperty<String>
17+
18+
/**
19+
* Add a source set to the list of sourcesets to skip
20+
*/
21+
fun skipSourceSet(name: String) {
22+
sourceSetsToSkip.add(name)
23+
}
824
}

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,10 @@ class ArchrulesRunnerPlugin : Plugin<Project> {
3131
val archRulesExt = project.extensions.create<ArchrulesExtension>("archRules")
3232
archRulesExt.consoleReportEnabled.convention(true)
3333
archRulesExt.skipPassingSummaries.convention(false)
34+
archRulesExt.sourceSetsToSkip.add("archRulesTest")
3435
project.extensions.getByType<JavaPluginExtension>().sourceSets
3536
.configureEach {
36-
project.configureCheckTaskForSourceSet(this)
37+
project.configureCheckTaskForSourceSet(this, archRulesExt)
3738
}
3839
val checkTasks = project.tasks.withType<CheckRulesTask>()
3940
val jsonReportTask = project.tasks.register<PrintJsonReportTask>("archRulesJsonReport") {
@@ -60,7 +61,7 @@ class ArchrulesRunnerPlugin : Plugin<Project> {
6061
}
6162
}
6263

63-
fun Project.configureCheckTaskForSourceSet(sourceSet: SourceSet) {
64+
fun Project.configureCheckTaskForSourceSet(sourceSet: SourceSet, ext: ArchrulesExtension) {
6465
val archRulesReportDir = project.layout.buildDirectory.dir("reports/archrules")
6566
val sourceSetArchRulesRuntime = configurations.resolvable(sourceSet.name + "ArchRulesRuntime") {
6667
extendsFrom(configurations.getByName(sourceSet.runtimeClasspathConfigurationName))
@@ -79,6 +80,7 @@ class ArchrulesRunnerPlugin : Plugin<Project> {
7980
})
8081
sourcesToCheck.from(sourceSet.output.classesDirs)
8182
dependsOn(project.tasks.named(sourceSet.classesTaskName))
83+
onlyIf { !ext.sourceSetsToSkip.get().contains(sourceSet.name) }
8284
}
8385
}
8486
}

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

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,111 @@ archRules {
380380
.doesNotContain("deprecated LOW")
381381
}
382382

383+
@Test
384+
fun `plugin skips archrules library test sourceset by default`() {
385+
val runner = testProject(projectDir) {
386+
properties {
387+
gradleCache(true)
388+
}
389+
settings {
390+
name("consumer")
391+
}
392+
rootProject {
393+
plugins {
394+
id("java")
395+
id("com.netflix.nebula.archrules.runner")
396+
id("com.netflix.nebula.archrules.library")
397+
}
398+
repositories {
399+
mavenCentral()
400+
}
401+
dependencies(
402+
"""archRules("com.netflix.nebula:archrules-deprecation:0.+")"""
403+
)
404+
src {
405+
main {
406+
exampleLibraryClass()
407+
exampleDeprecatedUsage()
408+
}
409+
test {
410+
exampleDeprecatedUsage("FailingCodeTest")
411+
}
412+
}
413+
}
414+
}
415+
416+
val result = runner.run("check", "--stacktrace", "-x", "test")
417+
418+
assertThat(result.task(":checkArchRulesMain"))
419+
.`as`("archRules run for main source set")
420+
.hasOutcome(TaskOutcome.SUCCESS, TaskOutcome.FROM_CACHE)
421+
422+
assertThat(result.task(":checkArchRulesTest"))
423+
.`as`("archRules run for test source set")
424+
.hasOutcome(TaskOutcome.SUCCESS, TaskOutcome.FROM_CACHE)
425+
426+
assertThat(result.task(":checkArchRulesArchRulesTest"))
427+
.`as`("archRules run for test source set")
428+
.hasOutcome(TaskOutcome.SKIPPED)
429+
430+
assertThat(result)
431+
.hasNoMutableStateWarnings()
432+
.hasNoDeprecationWarnings()
433+
}
434+
435+
@Test
436+
fun `plugin can skip configured source sets`() {
437+
val runner = testProject(projectDir) {
438+
properties {
439+
gradleCache(true)
440+
}
441+
settings {
442+
name("consumer")
443+
}
444+
rootProject {
445+
plugins {
446+
id("java")
447+
id("com.netflix.nebula.archrules.runner")
448+
}
449+
repositories {
450+
mavenCentral()
451+
}
452+
dependencies(
453+
"""archRules("com.netflix.nebula:archrules-deprecation:0.+")"""
454+
)
455+
src {
456+
main {
457+
exampleLibraryClass()
458+
exampleDeprecatedUsage()
459+
}
460+
test {
461+
exampleDeprecatedUsage("FailingCodeTest")
462+
}
463+
}
464+
rawBuildScript("""
465+
archRules {
466+
skipSourceSet("test")
467+
}
468+
"""
469+
)
470+
}
471+
}
472+
473+
val result = runner.run("check", "--stacktrace", "-x", "test")
474+
475+
assertThat(result.task(":checkArchRulesMain"))
476+
.`as`("archRules run for main source set")
477+
.hasOutcome(TaskOutcome.SUCCESS, TaskOutcome.FROM_CACHE)
478+
479+
assertThat(result.task(":checkArchRulesTest"))
480+
.`as`("archRules run for test source set")
481+
.hasOutcome(TaskOutcome.SKIPPED)
482+
483+
assertThat(result)
484+
.hasNoMutableStateWarnings()
485+
.hasNoDeprecationWarnings()
486+
}
487+
383488
fun readDetails(dataFile: File): List<RuleResult> {
384489
val list: MutableList<RuleResult> = mutableListOf()
385490
try {

0 commit comments

Comments
 (0)