Skip to content

Commit 499847b

Browse files
authored
Merge pull request #91 from KyoriPowered/fix/86
feat: add option to configure whether newlines are trimmed
2 parents 399a9a2 + 7e88bd0 commit 499847b

File tree

14 files changed

+88
-20
lines changed

14 files changed

+88
-20
lines changed

readme.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,12 @@ sourceSets {
3333
}
3434
```
3535

36+
> [!IMPORTANT]
37+
> When processing templates, Pebble will trim newlines immediately after a template tag.
38+
> This might not be desired when using formats like YAML or Java properties files, so Blossom offers a way to disable this behaviour:
39+
>
40+
> Add a `trimNewlines = false` line to the template set block and stripping will be disabled for any templates in the set.
41+
3642
Then place a file in the `src/main/resource-templates` folder:
3743

3844
`build-vars.properties`:

src/main/java/net/kyori/blossom/GenerateTemplates.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ void generate() throws IOException {
142142

143143
// general properties
144144
spec.getHeader().set(this.getBaseSet().flatMap(TemplateSet::getHeader));
145+
spec.getTrimNewlines().set(this.getBaseSet().flatMap(TemplateSet::getTrimNewlines));
145146
spec.getSourceDirectories().from(this.getSourceDirectories());
146147
spec.getIncludesDirectories().from(this.getIncludesDirectories());
147148
spec.getDestinationDirectory().set(this.getOutputDir());

src/main/java/net/kyori/blossom/TemplateSet.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,18 @@ public interface TemplateSet extends Named {
5151
@Override
5252
@NotNull String getName();
5353

54+
/**
55+
* Whether to strip trailing newlines from Pebble tokens that occur at the end of a line.
56+
*
57+
* <p>The default is {@code true}, which can cause strange behaviour in some file formats
58+
* that are whitespace-sensitive.</p>
59+
*
60+
* @return whether to trim newlines
61+
* @since 2.2.0
62+
*/
63+
@Input
64+
@NotNull Property<Boolean> getTrimNewlines();
65+
5466
/**
5567
* A collection of data files in YAML format.
5668
*

src/main/java/net/kyori/blossom/internal/ResourceTemplateSetImpl.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import net.kyori.blossom.GenerateTemplates;
2525
import net.kyori.blossom.ResourceTemplateSet;
2626
import org.gradle.api.file.Directory;
27+
import org.gradle.api.model.ObjectFactory;
2728
import org.gradle.api.tasks.SourceSet;
2829
import org.gradle.api.tasks.TaskProvider;
2930

@@ -32,8 +33,8 @@
3233
*/
3334
public abstract class ResourceTemplateSetImpl extends TemplateSetImpl implements ResourceTemplateSet {
3435
@Inject
35-
public ResourceTemplateSetImpl(final String name) {
36-
super(name);
36+
public ResourceTemplateSetImpl(final ObjectFactory objects, final String name) {
37+
super(objects, name);
3738
}
3839

3940
@Override

src/main/java/net/kyori/blossom/internal/SourceTemplateSetImpl.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.gradle.api.GradleException;
2828
import org.gradle.api.file.Directory;
2929
import org.gradle.api.file.SourceDirectorySet;
30+
import org.gradle.api.model.ObjectFactory;
3031
import org.gradle.api.tasks.SourceSet;
3132
import org.gradle.api.tasks.TaskProvider;
3233
import org.jetbrains.annotations.NotNull;
@@ -36,8 +37,8 @@ public abstract class SourceTemplateSetImpl extends TemplateSetImpl implements S
3637
private transient TaskProvider<GenerateTemplates> pendingGenerateTask;
3738

3839
@Inject
39-
public SourceTemplateSetImpl(final String name) {
40-
super(name);
40+
public SourceTemplateSetImpl(final ObjectFactory objects, final String name) {
41+
super(objects, name);
4142
}
4243

4344
@Override

src/main/java/net/kyori/blossom/internal/TemplateSetImpl.java

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -32,33 +32,30 @@
3232

3333
/**
3434
* A directory of templates.
35-
*
36-
* <p>While it's perfectly possible to </p>
3735
*/
3836
public abstract class TemplateSetImpl implements TemplateSetInternal {
3937
// shared
4038
private final ConfigurableFileCollection dataFiles;
4139
private final MapProperty<String, Object> properties;
4240
private final NamedDomainObjectContainer<Variant> variants;
4341
private final Property<String> header;
42+
private final Property<Boolean> trimNewlines;
4443
private transient final SourceDirectorySet includes;
4544
private transient final SourceDirectorySet templates;
4645
private final String name;
4746

4847
@Inject
49-
public TemplateSetImpl(final String name) {
48+
public TemplateSetImpl(final ObjectFactory objects, final String name) {
5049
this.name = name;
51-
this.dataFiles = this.getObjects().fileCollection();
52-
this.properties = this.getObjects().mapProperty(String.class, Object.class);
53-
this.variants = this.getObjects().domainObjectContainer(Variant.class, n -> this.getObjects().newInstance(VariantImpl.class, n));
54-
this.header = this.getObjects().property(String.class);
55-
this.includes = this.getObjects().sourceDirectorySet(name + "-template-includes", name + " template includes");
56-
this.templates = this.getObjects().sourceDirectorySet(name + "-templates", name + " templates");
50+
this.dataFiles = objects.fileCollection();
51+
this.properties = objects.mapProperty(String.class, Object.class);
52+
this.variants = objects.domainObjectContainer(Variant.class, n -> objects.newInstance(VariantImpl.class, n));
53+
this.header = objects.property(String.class);
54+
this.trimNewlines = objects.property(Boolean.class).convention(true);
55+
this.includes = objects.sourceDirectorySet(name + "-template-includes", name + " template includes");
56+
this.templates = objects.sourceDirectorySet(name + "-templates", name + " templates");
5757
}
5858

59-
@Inject
60-
protected abstract ObjectFactory getObjects();
61-
6259
@Override
6360
public @NotNull String getName() {
6461
return this.name;
@@ -81,6 +78,11 @@ public TemplateSetImpl(final String name) {
8178
return this.header;
8279
}
8380

81+
@Override
82+
public @NotNull Property<Boolean> getTrimNewlines() {
83+
return this.trimNewlines;
84+
}
85+
8486
@Override
8587
public @NotNull SourceDirectorySet getIncludes() {
8688
return this.includes;

src/main/java/net/kyori/blossom/internal/worker/GenerateWorker.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ public interface Params extends WorkParameters {
5353

5454
Property<String> getHeader();
5555

56+
Property<Boolean> getTrimNewlines();
57+
5658
ConfigurableFileCollection getSourceDirectories();
5759

5860
ConfigurableFileCollection getIncludesDirectories();
@@ -92,7 +94,8 @@ public void execute() {
9294
toPaths(params.getIncludesDirectories()),
9395
toPaths(params.getSourceDirectories()),
9496
params.getDestinationDirectory().get().getAsFile().toPath(),
95-
params.getHeader().getOrNull()
97+
params.getHeader().getOrNull(),
98+
params.getTrimNewlines().getOrElse(false)
9699
);
97100
} catch (final IOException ex) {
98101
throw new GradleException("Failed to process templates:" + ex.getMessage(), ex);

src/test/java/net/kyori/blossom/ResourceTemplateSetTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,4 +65,19 @@ void testResourceSingleSet(final TestContext ctx) throws IOException {
6565
}
6666
}
6767

68+
@BlossomFunctionalTest
69+
void testTrimTrailing(final TestContext ctx) throws IOException {
70+
SettingsFactory.writeSettings(ctx, "trimTrailing");
71+
ctx.copyInput("build.gradle");
72+
ctx.copyInput("meta.yaml.peb", "src/main/resource-templates/meta.yaml.peb");
73+
74+
final BuildResult result = ctx.build("generateTemplates"); // build templates
75+
assertEquals(TaskOutcome.SUCCESS, result.task(":generateResourceTemplates").getOutcome());
76+
77+
ctx.assertOutputEquals(
78+
"meta.yaml",
79+
"build/generated/resources/blossom/main/resource/meta.yaml"
80+
);
81+
}
82+
6883
}

src/test/java/net/kyori/blossom/test/BlossomFunctionalTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
@GradleParameters({"--warning-mode", "fail", "--stacktrace"}) // parameters for all variants
3535
@TestVariant(gradleVersion = "7.6.4", maximumRuntimeVersion = 20)
3636
@TestVariant(gradleVersion = "8.9", extraArguments = {"--configuration-cache"}) // last version with non-deprecated support for runtimes <17
37-
@TestVariant(gradleVersion = "8.10", extraArguments = {"--configuration-cache"}, minimumRuntimeVersion = 17)
37+
@TestVariant(gradleVersion = "8.14.2", extraArguments = {"--configuration-cache"}, minimumRuntimeVersion = 17)
3838
@TestVariantResource(value = "/injected-gradle-versions", optional = true, minimumRuntimeVersion = 17) // newer Gradle versions deprecate running on JDK <17, and this is only for RC's
3939
@Documented
4040
@Retention(RetentionPolicy.RUNTIME)
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
plugins {
2+
id 'java'
3+
id 'net.kyori.blossom'
4+
}
5+
6+
version = "1.0.3"
7+
8+
sourceSets {
9+
main {
10+
blossom {
11+
resources {
12+
trimNewlines = false
13+
property('name', project.name)
14+
property('version', project.version.toString())
15+
}
16+
}
17+
}
18+
}

0 commit comments

Comments
 (0)