From c406a16fbe48636daf4cf3214afe35a7dbd56f9e Mon Sep 17 00:00:00 2001 From: Emily Yuan Date: Wed, 1 Apr 2026 16:51:39 -0700 Subject: [PATCH 1/5] add option to run single rule or ruleClass from CLI --- .../archrules/gradle/RunRulesParams.java | 4 ++ .../archrules/gradle/RunRulesWorkAction.java | 6 ++- .../archrules/gradle/ArchrulesRunnerPlugin.kt | 10 +++++ .../nebula/archrules/gradle/CheckRulesTask.kt | 8 ++++ .../gradle/ArchrulesRunnerPluginTest.kt | 44 +++++++++++++++++++ 5 files changed, 70 insertions(+), 2 deletions(-) diff --git a/nebula-archrules-gradle-plugin/src/main/java/com/netflix/nebula/archrules/gradle/RunRulesParams.java b/nebula-archrules-gradle-plugin/src/main/java/com/netflix/nebula/archrules/gradle/RunRulesParams.java index 48e6fa0..655f0ec 100644 --- a/nebula-archrules-gradle-plugin/src/main/java/com/netflix/nebula/archrules/gradle/RunRulesParams.java +++ b/nebula-archrules-gradle-plugin/src/main/java/com/netflix/nebula/archrules/gradle/RunRulesParams.java @@ -20,6 +20,10 @@ public interface RunRulesParams extends WorkParameters { MapProperty getPriorityOverridesByClass(); + ListProperty getIncludedRules(); + + ListProperty getIncludedRuleClasses(); + ListProperty getExcludedRules(); ListProperty getExcludedRuleClasses(); diff --git a/nebula-archrules-gradle-plugin/src/main/java/com/netflix/nebula/archrules/gradle/RunRulesWorkAction.java b/nebula-archrules-gradle-plugin/src/main/java/com/netflix/nebula/archrules/gradle/RunRulesWorkAction.java index 13f269b..5cee346 100644 --- a/nebula-archrules-gradle-plugin/src/main/java/com/netflix/nebula/archrules/gradle/RunRulesWorkAction.java +++ b/nebula-archrules-gradle-plugin/src/main/java/com/netflix/nebula/archrules/gradle/RunRulesWorkAction.java @@ -69,16 +69,18 @@ public void execute() { final var classesToCheck = new ClassFileImporterWithPackage() .importPaths(getParameters().getClassesToCheck().getFiles().stream().map(File::toPath).toList()); final List violationList = new ArrayList<>(); + List includedRules = getParameters().getIncludedRules().get(); + List includedRuleClasses = getParameters().getIncludedRuleClasses().get(); ruleClasses.forEach(ruleClass -> { String ruleClassName = ruleClass.getClass().getCanonicalName(); if (isRuleClassExcluded(ruleClassName)) { LOGGER.info("Rule class {} has been excluded for this source set", ruleClass.getClass().getName()); - } else { + } else if(includedRuleClasses.isEmpty() || includedRuleClasses.stream().anyMatch(ruleClassName::startsWith)) { ruleClass.getRules().forEach((id, archRule) -> { if (getParameters().getExcludedRules().get().contains(id)) { LOGGER.info("Rule {} has been excluded for this source set", id); - } else { + } else if (includedRules.isEmpty() || includedRules.contains(id)){ final var result = Runner.check(archRule, classesToCheck); // check if there is priority override by class first diff --git a/nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesRunnerPlugin.kt b/nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesRunnerPlugin.kt index 1f7b083..a0d3f38 100644 --- a/nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesRunnerPlugin.kt +++ b/nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesRunnerPlugin.kt @@ -141,6 +141,16 @@ class ArchrulesRunnerPlugin : Plugin { it.filter { it.value.sourceSetsToSkip.contains(sourceSet.name) }.map { it.key } } ) + includedRules.set( + project.providers.gradleProperty("ruleName") + .map { it.split(",") } + .orElse(emptyList()) + ) + includedRuleClasses.set( + project.providers.gradleProperty("ruleClass") + .map { it.split(",") } + .orElse(emptyList()) + ) dataFile.set(archRulesReportDir.map { it.file(sourceSet.name + ".data").asFile }) diff --git a/nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/CheckRulesTask.kt b/nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/CheckRulesTask.kt index 90f5822..8242d8e 100644 --- a/nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/CheckRulesTask.kt +++ b/nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/CheckRulesTask.kt @@ -33,6 +33,12 @@ abstract class CheckRulesTask @Inject constructor(private val workerExecutor: Wo @get:Input abstract val priorityOverridesByClass: MapProperty + @get:Input + abstract val includedRules: ListProperty + + @get:Input + abstract val includedRuleClasses: ListProperty + @get:Input abstract val excludedRules: ListProperty @@ -51,6 +57,8 @@ abstract class CheckRulesTask @Inject constructor(private val workerExecutor: Wo getPriorityOverridesByClass().set(this@CheckRulesTask.priorityOverridesByClass) getExcludedRules().set(this@CheckRulesTask.excludedRules) getExcludedRuleClasses().set(this@CheckRulesTask.excludedRuleClasses) + getIncludedRules().set(this@CheckRulesTask.includedRules) + getIncludedRuleClasses().set(this@CheckRulesTask.includedRuleClasses) } } } diff --git a/nebula-archrules-gradle-plugin/src/test/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesRunnerPluginTest.kt b/nebula-archrules-gradle-plugin/src/test/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesRunnerPluginTest.kt index 0864365..5e3bbb3 100644 --- a/nebula-archrules-gradle-plugin/src/test/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesRunnerPluginTest.kt +++ b/nebula-archrules-gradle-plugin/src/test/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesRunnerPluginTest.kt @@ -630,6 +630,50 @@ archRules { assertThat(results).isEmpty() } + @Test + fun `ruleName level source set includes`() { + val runner = testProject(projectDir) { + setupConsumerProject { + dependencies("""archRules("com.netflix.nebula:archrules-nullability:0.+")""") + } + } + + val result = runner.run("archRulesConsoleReport", "-PruleName=no Optional class fields,deprecated", "--stacktrace") + assertThat(result.task(":checkArchRulesMain")).hasOutcome(TaskOutcome.SUCCESS, TaskOutcome.FROM_CACHE) + + val mainReport = projectDir.resolve("build/reports/archrules/main.data") + val results = readDetails(mainReport) + + val deprecatedResults = results.filter { it.rule.ruleName.equals("deprecated") } + assertThat(deprecatedResults).hasSize(2) + + val deprecatedForRemovalResults = results.filter { it.rule.ruleName.equals("deprecatedForRemoval") } + assertThat(deprecatedForRemovalResults).isEmpty() + + val optionalResults = results.filter { it.rule.ruleName.equals("no Optional class fields") } + assertThat(optionalResults).hasSize(1) + } + + @Test + fun `ruleClass level source set includes`() { + val runner = testProject(projectDir) { + setupConsumerProject { + dependencies("""archRules("com.netflix.nebula:archrules-nullability:0.+")""") + } + } + + val result = runner.run("archRulesConsoleReport", "-PruleClass=com.netflix.nebula.archrules.nullability", "--stacktrace") + assertThat(result.task(":checkArchRulesMain")).hasOutcome(TaskOutcome.SUCCESS, TaskOutcome.FROM_CACHE) + + val mainReport = projectDir.resolve("build/reports/archrules/main.data") + val results = readDetails(mainReport) + + assertThat(results).isNotEmpty() + results.forEach { result -> + assertThat(result.rule.ruleClass()).startsWith("com.netflix.nebula.archrules.nullability") + } + } + @Test fun `invalid priority string logs warning and does not override`() { val runner = testProject(projectDir) { From e2471c41523c18aaa46abac82cdeed1fe47c3fe0 Mon Sep 17 00:00:00 2001 From: Emily Yuan Date: Thu, 2 Apr 2026 17:47:29 -0700 Subject: [PATCH 2/5] update readme --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 077a8a9..5d5f652 100644 --- a/README.md +++ b/README.md @@ -148,6 +148,17 @@ dependencies { } ``` +#### Running specific rules +If you would like to only run certain rules or rule classes on the CLI, you can add the following flag. +(Note: these rules still must be on the classpath and not excluded.) +```commandline +./gradlew archRulesConsoleReport -PruleName="no Optional class fields,deprecated" +``` +or +```commandline +./gradlew archRulesConsoleReport -PruleClass="com.netflix.nebula.archrules.nullability" +``` + #### Overriding rule priority You can override the default priority of a rule using the `ruleClass` or `ruleName` and `priority` as `LOW`, `MEDIUM`, or `HIGH`: From b22cb8e02086152bba3ab36b19eeb52b45fbfc90 Mon Sep 17 00:00:00 2001 From: Emily Yuan Date: Thu, 9 Apr 2026 15:42:54 -0700 Subject: [PATCH 3/5] filter out rules in print task --- .../archrules/gradle/RunRulesParams.java | 4 --- .../archrules/gradle/RunRulesWorkAction.java | 6 ++-- .../archrules/gradle/ArchrulesRunnerPlugin.kt | 10 ------ .../nebula/archrules/gradle/CheckRulesTask.kt | 8 ----- .../gradle/PrintConsoleReportTask.kt | 17 +++++++++- .../gradle/ArchrulesRunnerPluginTest.kt | 33 +++++++++---------- 6 files changed, 33 insertions(+), 45 deletions(-) diff --git a/nebula-archrules-gradle-plugin/src/main/java/com/netflix/nebula/archrules/gradle/RunRulesParams.java b/nebula-archrules-gradle-plugin/src/main/java/com/netflix/nebula/archrules/gradle/RunRulesParams.java index 655f0ec..48e6fa0 100644 --- a/nebula-archrules-gradle-plugin/src/main/java/com/netflix/nebula/archrules/gradle/RunRulesParams.java +++ b/nebula-archrules-gradle-plugin/src/main/java/com/netflix/nebula/archrules/gradle/RunRulesParams.java @@ -20,10 +20,6 @@ public interface RunRulesParams extends WorkParameters { MapProperty getPriorityOverridesByClass(); - ListProperty getIncludedRules(); - - ListProperty getIncludedRuleClasses(); - ListProperty getExcludedRules(); ListProperty getExcludedRuleClasses(); diff --git a/nebula-archrules-gradle-plugin/src/main/java/com/netflix/nebula/archrules/gradle/RunRulesWorkAction.java b/nebula-archrules-gradle-plugin/src/main/java/com/netflix/nebula/archrules/gradle/RunRulesWorkAction.java index 5cee346..13f269b 100644 --- a/nebula-archrules-gradle-plugin/src/main/java/com/netflix/nebula/archrules/gradle/RunRulesWorkAction.java +++ b/nebula-archrules-gradle-plugin/src/main/java/com/netflix/nebula/archrules/gradle/RunRulesWorkAction.java @@ -69,18 +69,16 @@ public void execute() { final var classesToCheck = new ClassFileImporterWithPackage() .importPaths(getParameters().getClassesToCheck().getFiles().stream().map(File::toPath).toList()); final List violationList = new ArrayList<>(); - List includedRules = getParameters().getIncludedRules().get(); - List includedRuleClasses = getParameters().getIncludedRuleClasses().get(); ruleClasses.forEach(ruleClass -> { String ruleClassName = ruleClass.getClass().getCanonicalName(); if (isRuleClassExcluded(ruleClassName)) { LOGGER.info("Rule class {} has been excluded for this source set", ruleClass.getClass().getName()); - } else if(includedRuleClasses.isEmpty() || includedRuleClasses.stream().anyMatch(ruleClassName::startsWith)) { + } else { ruleClass.getRules().forEach((id, archRule) -> { if (getParameters().getExcludedRules().get().contains(id)) { LOGGER.info("Rule {} has been excluded for this source set", id); - } else if (includedRules.isEmpty() || includedRules.contains(id)){ + } else { final var result = Runner.check(archRule, classesToCheck); // check if there is priority override by class first diff --git a/nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesRunnerPlugin.kt b/nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesRunnerPlugin.kt index a0d3f38..1f7b083 100644 --- a/nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesRunnerPlugin.kt +++ b/nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesRunnerPlugin.kt @@ -141,16 +141,6 @@ class ArchrulesRunnerPlugin : Plugin { it.filter { it.value.sourceSetsToSkip.contains(sourceSet.name) }.map { it.key } } ) - includedRules.set( - project.providers.gradleProperty("ruleName") - .map { it.split(",") } - .orElse(emptyList()) - ) - includedRuleClasses.set( - project.providers.gradleProperty("ruleClass") - .map { it.split(",") } - .orElse(emptyList()) - ) dataFile.set(archRulesReportDir.map { it.file(sourceSet.name + ".data").asFile }) diff --git a/nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/CheckRulesTask.kt b/nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/CheckRulesTask.kt index 8242d8e..90f5822 100644 --- a/nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/CheckRulesTask.kt +++ b/nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/CheckRulesTask.kt @@ -33,12 +33,6 @@ abstract class CheckRulesTask @Inject constructor(private val workerExecutor: Wo @get:Input abstract val priorityOverridesByClass: MapProperty - @get:Input - abstract val includedRules: ListProperty - - @get:Input - abstract val includedRuleClasses: ListProperty - @get:Input abstract val excludedRules: ListProperty @@ -57,8 +51,6 @@ abstract class CheckRulesTask @Inject constructor(private val workerExecutor: Wo getPriorityOverridesByClass().set(this@CheckRulesTask.priorityOverridesByClass) getExcludedRules().set(this@CheckRulesTask.excludedRules) getExcludedRuleClasses().set(this@CheckRulesTask.excludedRuleClasses) - getIncludedRules().set(this@CheckRulesTask.includedRules) - getIncludedRuleClasses().set(this@CheckRulesTask.includedRuleClasses) } } } diff --git a/nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/PrintConsoleReportTask.kt b/nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/PrintConsoleReportTask.kt index b96b012..67f5df3 100644 --- a/nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/PrintConsoleReportTask.kt +++ b/nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/PrintConsoleReportTask.kt @@ -3,9 +3,9 @@ package com.netflix.nebula.archrules.gradle import com.tngtech.archunit.lang.Priority import org.gradle.api.DefaultTask import org.gradle.api.file.ConfigurableFileCollection -import org.gradle.api.provider.ListProperty import org.gradle.api.provider.Property import org.gradle.api.tasks.* +import org.gradle.api.tasks.options.Option import org.gradle.internal.logging.text.StyledTextOutput import org.gradle.internal.logging.text.StyledTextOutputFactory import org.gradle.kotlin.dsl.support.get @@ -38,12 +38,27 @@ abstract class PrintConsoleReportTask : DefaultTask() { @get:Optional abstract val detailsThreshold: Property + private var filteredRules: List = emptyList() + private var filteredRuleClasses: List = emptyList() + + @Option(option = "rule-name", description = "Print only results for the specified rule name(s). Can be specified multiple times.") + fun filterByRuleName(rules: List) { + filteredRules = rules + } + + @Option(option = "rule-class", description = "Print only results for rule classes matching the specified prefix(es). Can be specified multiple times.") + fun filterByRuleClass(ruleClasses: List) { + filteredRuleClasses = ruleClasses + } + @TaskAction fun printReport() { val consoleOutput = services.get().create("archrules") val list = dataFiles.files .filter(File::exists) .flatMap { ViolationsUtil.readDetails(it) } + .filter { filteredRules.isEmpty() || filteredRules.contains(it.rule().ruleName()) } + .filter { filteredRuleClasses.isEmpty() || filteredRuleClasses.any { prefix -> it.rule().ruleClass().startsWith(prefix) } } .toList() val byRule = ViolationsUtil.consolidatedFailures(list) ViolationsUtil.printSummary(byRule, consoleOutput, summaryForPassingDisabled.get(), logger.isInfoEnabled) diff --git a/nebula-archrules-gradle-plugin/src/test/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesRunnerPluginTest.kt b/nebula-archrules-gradle-plugin/src/test/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesRunnerPluginTest.kt index 5e3bbb3..8c33414 100644 --- a/nebula-archrules-gradle-plugin/src/test/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesRunnerPluginTest.kt +++ b/nebula-archrules-gradle-plugin/src/test/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesRunnerPluginTest.kt @@ -638,20 +638,13 @@ archRules { } } - val result = runner.run("archRulesConsoleReport", "-PruleName=no Optional class fields,deprecated", "--stacktrace") + val result = runner.run("archRulesConsoleReport", "--rule-name=no Optional class fields", "--rule-name=deprecated", "--stacktrace") assertThat(result.task(":checkArchRulesMain")).hasOutcome(TaskOutcome.SUCCESS, TaskOutcome.FROM_CACHE) - val mainReport = projectDir.resolve("build/reports/archrules/main.data") - val results = readDetails(mainReport) - - val deprecatedResults = results.filter { it.rule.ruleName.equals("deprecated") } - assertThat(deprecatedResults).hasSize(2) - - val deprecatedForRemovalResults = results.filter { it.rule.ruleName.equals("deprecatedForRemoval") } - assertThat(deprecatedForRemovalResults).isEmpty() - - val optionalResults = results.filter { it.rule.ruleName.equals("no Optional class fields") } - assertThat(optionalResults).hasSize(1) + assertThat(result.output) + .contains("deprecated") + .contains("no Optional class fields") + .doesNotContain("deprecatedForRemoval") } @Test @@ -662,16 +655,20 @@ archRules { } } - val result = runner.run("archRulesConsoleReport", "-PruleClass=com.netflix.nebula.archrules.nullability", "--stacktrace") + val result = runner.run("archRulesConsoleReport", "--rule-class=com.netflix.nebula.archrules.nullability", "--stacktrace") assertThat(result.task(":checkArchRulesMain")).hasOutcome(TaskOutcome.SUCCESS, TaskOutcome.FROM_CACHE) val mainReport = projectDir.resolve("build/reports/archrules/main.data") - val results = readDetails(mainReport) - - assertThat(results).isNotEmpty() - results.forEach { result -> - assertThat(result.rule.ruleClass()).startsWith("com.netflix.nebula.archrules.nullability") + val nullabilityRuleNames = readDetails(mainReport) + .filter { it.rule.ruleClass().startsWith("com.netflix.nebula.archrules.nullability") } + .map { it.rule.ruleName() } + .distinct() + + assertThat(nullabilityRuleNames).isNotEmpty() + nullabilityRuleNames.forEach { ruleName -> + assertThat(result.output).contains(ruleName) } + assertThat(result.output).doesNotContain("com.netflix.nebula.archrules.deprecation") } @Test From d49d42283947e10564f0f274a1a4ad9e37884139 Mon Sep 17 00:00:00 2001 From: Emily Yuan Date: Thu, 9 Apr 2026 16:57:53 -0700 Subject: [PATCH 4/5] allow use of multiple cli filtering flags --- .../nebula/archrules/gradle/PrintConsoleReportTask.kt | 8 ++++++-- .../nebula/archrules/gradle/ArchrulesRunnerPluginTest.kt | 8 ++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/PrintConsoleReportTask.kt b/nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/PrintConsoleReportTask.kt index 67f5df3..bf121a3 100644 --- a/nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/PrintConsoleReportTask.kt +++ b/nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/PrintConsoleReportTask.kt @@ -57,8 +57,12 @@ abstract class PrintConsoleReportTask : DefaultTask() { val list = dataFiles.files .filter(File::exists) .flatMap { ViolationsUtil.readDetails(it) } - .filter { filteredRules.isEmpty() || filteredRules.contains(it.rule().ruleName()) } - .filter { filteredRuleClasses.isEmpty() || filteredRuleClasses.any { prefix -> it.rule().ruleClass().startsWith(prefix) } } + .filter { + val noFilters = filteredRules.isEmpty() && filteredRuleClasses.isEmpty() + val matchesRule = filteredRules.contains(it.rule().ruleName()) + val matchesClass = filteredRuleClasses.any { prefix -> it.rule().ruleClass().startsWith(prefix) } + noFilters || matchesRule || matchesClass + } .toList() val byRule = ViolationsUtil.consolidatedFailures(list) ViolationsUtil.printSummary(byRule, consoleOutput, summaryForPassingDisabled.get(), logger.isInfoEnabled) diff --git a/nebula-archrules-gradle-plugin/src/test/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesRunnerPluginTest.kt b/nebula-archrules-gradle-plugin/src/test/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesRunnerPluginTest.kt index 8c33414..5325a42 100644 --- a/nebula-archrules-gradle-plugin/src/test/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesRunnerPluginTest.kt +++ b/nebula-archrules-gradle-plugin/src/test/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesRunnerPluginTest.kt @@ -651,11 +651,14 @@ archRules { fun `ruleClass level source set includes`() { val runner = testProject(projectDir) { setupConsumerProject { - dependencies("""archRules("com.netflix.nebula:archrules-nullability:0.+")""") + dependencies(""" + archRules("com.netflix.nebula:archrules-nullability:0.+") + archRules("com.netflix.nebula:archrules-joda:0.+") + """) } } - val result = runner.run("archRulesConsoleReport", "--rule-class=com.netflix.nebula.archrules.nullability", "--stacktrace") + val result = runner.run("archRulesConsoleReport", "--rule-class=com.netflix.nebula.archrules.nullability", "--rule-name=jodaRule", "--stacktrace") assertThat(result.task(":checkArchRulesMain")).hasOutcome(TaskOutcome.SUCCESS, TaskOutcome.FROM_CACHE) val mainReport = projectDir.resolve("build/reports/archrules/main.data") @@ -668,6 +671,7 @@ archRules { nullabilityRuleNames.forEach { ruleName -> assertThat(result.output).contains(ruleName) } + assertThat(result.output).contains("jodaRule") assertThat(result.output).doesNotContain("com.netflix.nebula.archrules.deprecation") } From e0fc8d17f83deac75934a8b03d3a81969ee1bbf3 Mon Sep 17 00:00:00 2001 From: Emily Yuan Date: Thu, 9 Apr 2026 17:02:11 -0700 Subject: [PATCH 5/5] update readme --- README.md | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 5d5f652..4052ba4 100644 --- a/README.md +++ b/README.md @@ -148,17 +148,6 @@ dependencies { } ``` -#### Running specific rules -If you would like to only run certain rules or rule classes on the CLI, you can add the following flag. -(Note: these rules still must be on the classpath and not excluded.) -```commandline -./gradlew archRulesConsoleReport -PruleName="no Optional class fields,deprecated" -``` -or -```commandline -./gradlew archRulesConsoleReport -PruleClass="com.netflix.nebula.archrules.nullability" -``` - #### Overriding rule priority You can override the default priority of a rule using the `ruleClass` or `ruleName` and `priority` as `LOW`, `MEDIUM`, or `HIGH`: @@ -248,6 +237,13 @@ archRulesAggregate { } ``` +#### Filtering specific rules +If you would like to only display certain rules or rule classes on the CLI, you can use the following flags. +(Note: these rules must still be on the classpath and not excluded.) +```commandline +./gradlew archRulesConsoleReport --rule-name=deprecated --rule-class=com.netflix.nebula.archrules.nullability +``` + ## How it works 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.