Skip to content

Commit

Permalink
Add Gradle bindings for Gherkin formatter
Browse files Browse the repository at this point in the history
As we've created a Gherkin formatter as part of diffplug#907, we should make it
possible to use it natively in Gradle, which requires we add it as a new
supported type in `SpotlessExtension`.
  • Loading branch information
jamietanna committed Sep 7, 2021
1 parent 2322641 commit 184aa5e
Show file tree
Hide file tree
Showing 4 changed files with 159 additions and 0 deletions.
29 changes: 29 additions & 0 deletions plugin-gradle/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ Spotless supports all of Gradle's built-in performance features (incremental bui
- [SQL](#sql) ([dbeaver](#dbeaver), [prettier](#prettier))
- [Typescript](#typescript) ([tsfmt](#tsfmt), [prettier](#prettier))
- [JSON](#json)
- [Gherkin](#gherkin)
- Multiple languages
- [Prettier](#prettier) ([plugins](#prettier-plugins), [npm detection](#npm-detection), [`.npmrc` detection](#npmrc-detection))
- javascript, jsx, angular, vue, flow, typescript, css, less, scss, html, json, graphql, markdown, ymaml
Expand Down Expand Up @@ -558,6 +559,34 @@ spotless {
}
```
## Gherkin
- `com.diffplug.gradle.spotless.GherkinExtension` [javadoc](https://javadoc.io/doc/com.diffplug.spotless/spotless-plugin-gradle/5.15.0/com/diffplug/gradle/spotless/GherkinExtension.html), [code](https://github.com/diffplug/spotless/blob/main/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/GherkinExtension.java)
```gradle
spotless {
gherkin {
target 'src/**/*.feature' // you have to set the target manually
simple() // has its own section below
}
}
```
### simple
Uses a Gherkin pretty-printer that optionally allows configuring the number of spaces that are used to pretty print objects:
```gradle
spotless {
gherkin {
target 'src/**/*.feature'
simple()
// optional: specify the number of spaces to use
simple().indentWithSpaces(6)
}
}
```
<a name="applying-prettier-to-javascript--flow--typescript--css--scss--less--jsx--graphql--yaml--etc"></a>
## Prettier
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
/*
* Copyright 2016-2021 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 javax.inject.Inject;

import com.diffplug.spotless.FormatterStep;
import com.diffplug.spotless.gherkin.GherkinSimpleStep;

public class GherkinExtension extends FormatExtension {
private static final int DEFAULT_INDENTATION = 4;
static final String NAME = "gherkin";

@Inject
public GherkinExtension(SpotlessExtension spotless) {
super(spotless);
}

@Override
protected void setupTask(SpotlessTask task) {
if (target == null) {
throw noDefaultTargetException();
}
super.setupTask(task);
}

public SimpleConfig simple() {
return new SimpleConfig(DEFAULT_INDENTATION);
}

public class SimpleConfig {
private int indent;

public SimpleConfig(int indent) {
this.indent = indent;
addStep(createStep());
}

public void indentWithSpaces(int indent) {
this.indent = indent;
replaceStep(createStep());
}

private FormatterStep createStep() {
return GherkinSimpleStep.create(indent, provisioner());
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,12 @@ public void json(Action<JsonExtension> closure) {
format(JsonExtension.NAME, JsonExtension.class, closure);
}

/** Configures the special Gherkin-specific extension. */
public void gherkin(Action<GherkinExtension> closure) {
requireNonNull(closure);
format(GherkinExtension.NAME, GherkinExtension.class, closure);
}

/** Configures a custom extension. */
public void format(String name, Action<FormatExtension> closure) {
requireNonNull(name, "name");
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
/*
* Copyright 2021 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.Test;

public class GherkinExtensionTest extends GradleIntegrationHarness {
@Test
public void defaultFormatting() throws IOException {
setFile("build.gradle").toLines(
"buildscript { repositories { mavenCentral() } }",
"plugins {",
" id 'java'",
" id 'com.diffplug.spotless'",
"}",
"spotless {",
" gherkin {",
" target 'examples/**/*.feature'",
" simple()",
"}",
"}");
setFile("src/main/resources/example.feature").toResource("gherkin/minimalBefore.feature");
setFile("examples/main/resources/example.feature").toResource("gherkin/minimalBefore.feature");
gradleRunner().withArguments("spotlessApply").build();
assertFile("src/main/resources/example.feature").sameAsResource("gherkin/minimalBefore.feature");
assertFile("examples/main/resources/example.feature").sameAsResource("gherkin/minimalAfter.feature");
}

@Test
public void formattingWithCustomNumberOfSpaces() throws IOException {
setFile("build.gradle").toLines(
"buildscript { repositories { mavenCentral() } }",
"plugins {",
" id 'java'",
" id 'com.diffplug.spotless'",
"}",
"spotless {",
" gherkin {",
" target 'src/**/*.feature'",
" simple().indentWithSpaces(6)",
"}",
"}");
setFile("src/main/resources/example.feature").toResource("gherkin/minimalBefore.feature");
gradleRunner().withArguments("spotlessApply").build();
assertFile("src/main/resources/example.feature").sameAsResource("gherkin/minimalAfter6Spaces.feature");
}
}

0 comments on commit 184aa5e

Please sign in to comment.