Skip to content

Commit

Permalink
Add targetExcludeIfContentContains API to the Gradle plugin
Browse files Browse the repository at this point in the history
  • Loading branch information
oldergod committed Jul 12, 2023
1 parent d245b60 commit 55c2a6b
Show file tree
Hide file tree
Showing 3 changed files with 123 additions and 0 deletions.
2 changes: 2 additions & 0 deletions plugin-gradle/CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ We adhere to the [keepachangelog](https://keepachangelog.com/en/1.0.0/) format (

## [Unreleased]

### Added
* Add target option `targetExcludeIfContentContains` to exclude files by text they contain.
### Fixed
* Correctly support the syntax
```
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,12 @@ public void encoding(String charset) {
/** The files to be formatted = (target - targetExclude). */
protected FileCollection target, targetExclude;

/**
* The values from which files will be excluded if their content contain at least one of the
* `targetExcludeIfContentContains`.
*/
protected List<String> targetExcludeIfContentContains = new ArrayList<>();

protected boolean isLicenseHeaderStep(FormatterStep formatterStep) {
String formatterStepName = formatterStep.getName();

Expand Down Expand Up @@ -202,6 +208,11 @@ public void targetExclude(Object... targets) {
this.targetExclude = parseTargetsIsExclude(targets, true);
}

/** Excludes all files whose content contains at least one of the `values`. */
public void targetExcludeIfContentContains(String... values) {
this.targetExcludeIfContentContains.addAll(List.of(values));
}

private FileCollection parseTargetsIsExclude(Object[] targets, boolean isExclude) {
requireElementsNonNull(targets);
if (targets.length == 0) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
/*
* Copyright 2020-2023 DiffPlug
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.diffplug.gradle.spotless;

import java.io.IOException;

import org.junit.jupiter.api.Test;

class TargetExcludeIfContentContainsTest extends GradleIntegrationHarness {
@Test
void targetExcludeIfContentContainsWithOneValue() throws IOException {
setFile("build.gradle").toLines(
"plugins { id 'com.diffplug.spotless' }",
"spotless {",
" format 'toLower', {",
" target '**/*.md'",
" targetExcludeIfContentContains '// Generated by Mr. Roboto'",
" custom 'lowercase', { str -> str.toLowerCase() }",
" toggleOffOn()",
" }",
"}");
String content = "// Generated by Mr. Roboto, do not edit.\n" +
"A B C\n" +
"D E F\n" +
"G H I";
setFile("test_generated.md").toContent(content);
setFile("test_manual.md").toLines(
"A B C",
"D E F",
"G H I");
gradleRunner().withArguments("spotlessApply").build();
// `test_generated` contains the excluding text so didn't change.
assertFile("test_generated.md").hasContent(content);
// `test_manual` does not so it changed.
assertFile("test_manual.md").hasLines(
"a b c",
"d e f",
"g h i");
}

@Test
void targetExcludeIfContentContainsWithMultipleValues() throws IOException {
setFile("build.gradle").toLines(
"plugins { id 'com.diffplug.spotless' }",
"spotless {",
" format 'toLower', {",
" target '**/*.md'",
" targetExcludeIfContentContains '// Generated by Mr. Roboto', '// Generated by Mrs. Call'",
" custom 'lowercase', { str -> str.toLowerCase() }",
" toggleOffOn()",
" }",
"}");
String robotoContent = "A B C\n" +
"// Generated by Mr. Roboto, do not edit.\n" +
"D E F\n" +
"G H I";
setFile("test_generated_roboto.md").toContent(robotoContent);
String callContent = "A B C\n" +
"D E F\n" +
"// Generated by Mrs. Call, do not edit.\n" +
"G H I";
setFile("test_generated_call.md").toContent(callContent);
String collaborationContent = "A B C\n" +
"// Generated by Mr. Roboto, do not edit.\n" +
"D E F\n" +
"// Generated by Mrs. Call, do not edit.\n" +
"G H I";
setFile("test_generated_collaboration.md").toContent(collaborationContent);
String intruderContent = "A B C\n" +
"// Generated by K2000, do not edit.\n" +
"D E F\n" +
"G H I";
setFile("test_generated_intruder.md").toContent(intruderContent);
setFile("test_manual.md").toLines(
"A B C",
"D E F",
"G H I");
gradleRunner().withArguments("spotlessApply").build();
// Part of the excluding values so has not changed.
assertFile("test_generated_roboto.md").hasContent(robotoContent);
// Part of the excluding values so has not changed.
assertFile("test_generated_call.md").hasContent(callContent);
// Part of the excluding values so has not changed.
assertFile("test_generated_collaboration.md").hasContent(collaborationContent);
// Not part of the excluding values so has changed.
assertFile("test_generated_intruder.md").hasContent(
"a b c\n" +
"// generated by k2000, do not edit.\n" +
"d e f\n" +
"g h i");
// `test_manual` does not so it changed.
assertFile("test_manual.md").hasLines(
"a b c",
"d e f",
"g h i");
}
}

0 comments on commit 55c2a6b

Please sign in to comment.