Compare commits

..

No commits in common. "master" and "0.9.6" have entirely different histories.

31 changed files with 282 additions and 525 deletions

View file

@ -1,16 +1,14 @@
name: bld-ci
on: [ push, pull_request, workflow_dispatch ]
on: [push, pull_request, workflow_dispatch]
jobs:
build-bld-project:
runs-on: ubuntu-latest
strategy:
matrix:
java-version: [ 17, 21, 24 ]
kotlin-version: [ 1.9.25, 2.0.21, 2.1.20 ]
os: [ ubuntu-latest, windows-latest, macos-latest ]
runs-on: ${{ matrix.os }}
java-version: [17, 21, 22]
steps:
- name: Checkout source repository
@ -24,16 +22,11 @@ jobs:
distribution: "zulu"
java-version: ${{ matrix.java-version }}
- name: Download dependencies [examples]
working-directory: examples
- name: Grant execute permission for bld
run: chmod +x bld
- name: Download the dependencies
run: ./bld download
- name: Compile and run [examples]
working-directory: examples
run: ./bld compile run
- name: Download dependencies
run: ./bld download
- name: Run tests
run: ./bld compile test
- name: Run tests with bld
run: ./bld compile test

View file

@ -47,11 +47,11 @@ jobs:
uses: actions/configure-pages@v3
- name: Upload artifact
uses: actions/upload-pages-artifact@v3
uses: actions/upload-pages-artifact@v1
with:
# Upload generated Javadocs repository
path: "build/javadoc/"
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
uses: actions/deploy-pages@v1

6
.idea/bld.xml generated
View file

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="BldConfiguration">
<events />
</component>
</project>

View file

@ -1,6 +1,6 @@
<component name="CopyrightManager">
<copyright>
<option name="notice" value="Copyright 2023-&amp;#36;today.year the original author or authors.&#10; &#10;Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);&#10;you may not use this file except in compliance with the License.&#10;You may obtain a copy of the License at&#10;&#10; https://www.apache.org/licenses/LICENSE-2.0&#10;&#10;Unless required by applicable law or agreed to in writing, software&#10;distributed under the License is distributed on an &quot;AS IS&quot; BASIS,&#10;WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&#10;See the License for the specific language governing permissions and&#10;limitations under the License." />
<option name="notice" value="Copyright 2023-Copyright &amp;#36;today.yearamp;#36;today.year the original author or authors.&#10; &#10;Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);&#10;you may not use this file except in compliance with the License.&#10;You may obtain a copy of the License at&#10;&#10; https://www.apache.org/licenses/LICENSE-2.0&#10;&#10;Unless required by applicable law or agreed to in writing, software&#10;distributed under the License is distributed on an &quot;AS IS&quot; BASIS,&#10;WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&#10;See the License for the specific language governing permissions and&#10;limitations under the License." />
<option name="myName" value="Apache License" />
</copyright>
</component>
</component>

13
.idea/icon.svg generated
View file

@ -1,13 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 179 108" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<g transform="matrix(1,0,0,1,-210.511,-96.3382)">
<g transform="matrix(1,0,0,1,-23.3386,-649.816)">
<g transform="matrix(0.221288,0,0,0.24,73.9536,390.254)">
<path d="M722.568,1482.92L722.568,1921.1L808.968,1921.1L808.968,1888.7C822.168,1907.9 846.168,1930.1 893.568,1930.1C933.168,1930.1 961.968,1917.5 985.368,1893.5C1012.97,1865.9 1027.37,1827.5 1027.37,1786.1C1027.37,1741.7 1011.17,1705.1 985.368,1680.5C961.968,1658.3 928.968,1644.5 892.368,1644.5C862.968,1644.5 830.568,1654.1 808.968,1683.5L808.968,1482.92L722.568,1482.92ZM871.368,1718.9C888.768,1718.9 903.768,1723.7 917.568,1736.9C930.168,1748.9 938.568,1766.3 938.568,1787.9C938.568,1807.7 930.168,1825.1 917.568,1837.1C904.368,1849.7 887.568,1855.7 872.568,1855.7C856.368,1855.7 837.168,1849.1 823.368,1835.9C813.168,1826.3 803.568,1810.1 803.568,1787.9C803.568,1765.1 812.568,1749.5 822.768,1738.7C836.568,1724.3 852.768,1718.9 871.368,1718.9Z" style="fill:rgb(35,146,255);fill-rule:nonzero;"/>
<rect x="1083.77" y="1482.92" width="86.4" height="438.182" style="fill:rgb(250,144,82);fill-rule:nonzero;"/>
<path d="M1531.37,1482.92L1444.97,1482.92L1444.97,1683.5C1423.37,1654.1 1390.97,1644.5 1361.57,1644.5C1324.97,1644.5 1291.97,1658.3 1268.57,1680.5C1242.77,1705.1 1226.57,1741.7 1226.57,1786.1C1226.57,1827.5 1240.97,1865.9 1268.57,1893.5C1291.97,1917.5 1320.77,1930.1 1360.37,1930.1C1407.77,1930.1 1431.77,1907.9 1444.97,1888.7L1444.97,1921.1L1531.37,1921.1L1531.37,1482.92ZM1382.57,1718.9C1401.17,1718.9 1417.37,1724.3 1431.17,1738.7C1441.37,1749.5 1450.37,1765.1 1450.37,1787.9C1450.37,1810.1 1440.77,1826.3 1430.57,1835.9C1416.77,1849.1 1397.57,1855.7 1381.37,1855.7C1366.37,1855.7 1349.57,1849.7 1336.37,1837.1C1323.77,1825.1 1315.37,1807.7 1315.37,1787.9C1315.37,1766.3 1323.77,1748.9 1336.37,1736.9C1350.17,1723.7 1365.17,1718.9 1382.57,1718.9Z" style="fill:rgb(35,146,255);fill-rule:nonzero;"/>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.4 KiB

View file

@ -2,12 +2,12 @@
<library name="bld">
<CLASSES>
<root url="file://$PROJECT_DIR$/lib/bld" />
<root url="jar://$USER_HOME$/.bld/dist/bld-2.2.1.jar!/" />
<root url="jar://$USER_HOME$/.bld/dist/bld-1.9.1.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="file://$PROJECT_DIR$/lib/bld" />
<root url="jar://$USER_HOME$/.bld/dist/bld-2.2.1-sources.jar!/" />
<root url="jar://$USER_HOME$/.bld/dist/bld-1.9.1-sources.jar!/" />
</SOURCES>
<excluded>
<root url="jar://$PROJECT_DIR$/lib/bld/bld-wrapper.jar!/" />

View file

@ -7,7 +7,7 @@
<SOURCES>
<root url="file://$PROJECT_DIR$/lib/compile" />
</SOURCES>
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="true" />
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="true" type="SOURCES" />
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="false" />
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="false" type="SOURCES" />
</library>
</component>

View file

@ -8,7 +8,7 @@
<SOURCES>
<root url="file://$PROJECT_DIR$/lib/runtime" />
</SOURCES>
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="true" />
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="true" type="SOURCES" />
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="false" />
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="false" type="SOURCES" />
</library>
</component>

View file

@ -8,7 +8,7 @@
<SOURCES>
<root url="file://$PROJECT_DIR$/lib/test" />
</SOURCES>
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="true" />
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="true" type="SOURCES" />
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="false" />
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="false" type="SOURCES" />
</library>
</component>

View file

@ -9,7 +9,7 @@
],
"java.configuration.updateBuildConfiguration": "automatic",
"java.project.referencedLibraries": [
"${HOME}/.bld/dist/bld-2.2.1.jar",
"${HOME}/.bld/dist/bld-1.9.1.jar",
"lib/**/*.jar"
]
}

View file

@ -3,20 +3,12 @@
[![License](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
[![Java](https://img.shields.io/badge/java-17%2B-blue)](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html)
[![bld](https://img.shields.io/badge/2.2.1-FA9052?label=bld&labelColor=2392FF)](https://rife2.com/bld)
[![bld](https://img.shields.io/badge/1.9.1-FA9052?label=bld&labelColor=2392FF)](https://rife2.com/bld)
[![Release](https://flat.badgen.net/maven/v/metadata-url/repo.rife2.com/releases/com/uwyn/rife2/bld-generated-version/maven-metadata.xml?color=blue)](https://repo.rife2.com/#/releases/com/uwyn/rife2/bld-generated-version)
[![Snapshot](https://flat.badgen.net/maven/v/metadata-url/repo.rife2.com/snapshots/com/uwyn/rife2/bld-generated-version/maven-metadata.xml?label=snapshot)](https://repo.rife2.com/#/snapshots/com/uwyn/rife2/bld-generated-version)
[![GitHub CI](https://github.com/rife2/bld-generated-version/actions/workflows/bld.yml/badge.svg)](https://github.com/rife2/bld-generated-version/actions/workflows/bld.yml)
To install the latest version, add the following to the `lib/bld/bld-wrapper.properties` file:
```properties
bld.extension-generated-version=com.uwyn.rife2:bld-generated-version
```
For more information, please refer to the [extensions](https://github.com/rife2/bld/wiki/Extensions) documentation.
## Generate Version Data Class
To install, please refer to the [extensions documentation](https://github.com/rife2/bld/wiki/Extensions).
To automatically create a generated version class using the default template in your project on compile, add the following to your build file:
```java
@ -74,12 +66,12 @@ public void genver() throws Exception {
.projectName("My App")
.packageName("com.example.myapp")
.className("MyAppVersion")
.classTemplate("my_app_version.txt")
.classTemplate(new File(workDirectory, "myversion.txt"))
.execute();
}
```
```java
// my_app_version.txt
// myversion.txt
package {{v packageName/}};

View file

@ -7,9 +7,9 @@
<!-- BEST PRACTICES -->
<rule ref="category/java/bestpractices.xml">
<exclude name="AvoidPrintStackTrace"/>
<exclude name="JUnit4TestShouldUseTestAnnotation"/>
<exclude name="JUnitTestContainsTooManyAsserts"/>
<exclude name="GuardLogStatement"/>
<exclude name="UnitTestContainsTooManyAsserts"/>
<exclude name="UnitTestShouldUseTestAnnotation"/>
</rule>
<rule ref="category/java/bestpractices.xml/MissingOverride">

View file

@ -2,12 +2,12 @@
<library name="bld">
<CLASSES>
<root url="file://$PROJECT_DIR$/lib/bld" />
<root url="jar://$USER_HOME$/.bld/dist/bld-2.2.1.jar!/" />
<root url="jar://$USER_HOME$/.bld/dist/bld-1.9.1.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="file://$PROJECT_DIR$/lib/bld" />
<root url="jar://$USER_HOME$/.bld/dist/bld-2.2.1-sources.jar!/" />
<root url="jar://$USER_HOME$/.bld/dist/bld-1.9.1-sources.jar!/" />
</SOURCES>
<excluded>
<root url="jar://$PROJECT_DIR$/lib/bld/bld-wrapper.jar!/" />

View file

@ -7,7 +7,7 @@
<SOURCES>
<root url="file://$PROJECT_DIR$/lib/compile" />
</SOURCES>
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="true" />
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="true" type="SOURCES" />
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="false" />
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="false" type="SOURCES" />
</library>
</component>

View file

@ -8,7 +8,7 @@
<SOURCES>
<root url="file://$PROJECT_DIR$/lib/runtime" />
</SOURCES>
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="true" />
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="true" type="SOURCES" />
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="false" />
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="false" type="SOURCES" />
</library>
</component>

View file

@ -8,7 +8,7 @@
<SOURCES>
<root url="file://$PROJECT_DIR$/lib/test" />
</SOURCES>
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="true" />
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="true" type="SOURCES" />
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="false" />
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="false" type="SOURCES" />
</library>
</component>

View file

@ -9,7 +9,7 @@
],
"java.configuration.updateBuildConfiguration": "automatic",
"java.project.referencedLibraries": [
"${HOME}/.bld/dist/bld-2.2.1.jar",
"${HOME}/.bld/dist/bld-1.9.1.jar",
"lib/**/*.jar"
]
}

Binary file not shown.

View file

@ -1,6 +1,6 @@
bld.downloadExtensionJavadoc=false
bld.downloadExtensionSources=true
bld.downloadLocation=
bld.extension-gv=com.uwyn.rife2:bld-generated-version:1.0.1
bld.extensions=com.uwyn.rife2:bld-generated-version:0.9.6
bld.repositories=MAVEN_LOCAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES
bld.version=2.2.1
bld.downloadLocation=
bld.version=1.9.1

View file

@ -1,30 +0,0 @@
package {{v packageName/}};
import java.util.Date;
public final class {{v className/}} implements Comparable<{{v className/}}> {
public static final String PROJECT = "{{v project/}}";
public static final Date BUILD_DATE = new Date({{v epoch/}}L);
public static final int MAJOR = {{v major/}};
public static final int MINOR = {{v minor/}};
public static final int REVISION = {{v revision/}};
public static final String QUALIFIER = "{{v qualifier/}}";
public static final String VERSION = "{{v version/}}";
private {{v className/}}() {
// no-op
}
@Override
public int compareTo({{v className/}} other) {
if (MAJOR != other.MAJOR) {
return Integer.compare(MAJOR, other.MAJOR);
} else if (MINOR != other.MINOR) {
return Integer.compare(MINOR, other.MINOR);
} else if (REVISION != other.REVISION) {
return Integer.compare(REVISION, other.REVISION);
} else {
return QUALIFIER.compareTo(other.QUALIFIER);
}
}
}

View file

@ -4,6 +4,7 @@ import rife.bld.BuildCommand;
import rife.bld.Project;
import rife.bld.extension.GeneratedVersionOperation;
import java.io.File;
import java.util.List;
import static rife.bld.dependencies.Repository.MAVEN_CENTRAL;
@ -27,8 +28,8 @@ public class SampleBuild extends Project {
repositories = List.of(MAVEN_CENTRAL, RIFE2_RELEASES);
scope(test)
.include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 12, 1)))
.include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 12, 1)));
.include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 10, 2)))
.include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 10, 2)));
}
public static void main(String[] args) {
@ -46,8 +47,7 @@ public class SampleBuild extends Project {
new GeneratedVersionOperation()
.fromProject(this)
// .projectName("My App")
// .classTemplate("my_app_version.txt")
// .classTemplate("version.txt")
// .classTemplate(new File(workDirectory, "myversion.txt"))
.execute();
}
}

View file

@ -1,4 +1,4 @@
/**
/*
* This file is automatically generated.
* Do not modify! -- ALL CHANGES WILL BE ERASED!
*/
@ -12,7 +12,7 @@ import java.util.Date;
*/
public final class GeneratedVersion {
public static final String PROJECT = "Sample";
public static final Date BUILD_DATE = new Date(1736843939053L);
public static final Date BUILD_DATE = new Date(1713398927971L);
public static final int MAJOR = 1;
public static final int MINOR = 0;
public static final int REVISION = 1;

Binary file not shown.

View file

@ -1,6 +1,7 @@
bld.downloadExtensionJavadoc=false
bld.downloadExtensionSources=true
bld.downloadLocation=
bld.extension-pmd=com.uwyn.rife2:bld-pmd:1.2.2
bld.extension-pmd=com.uwyn.rife2:bld-pmd:0.9.9
bld.extension-jacoco=com.uwyn.rife2:bld-jacoco-report:0.9.5
bld.repositories=MAVEN_CENTRAL,MAVEN_LOCAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES
bld.version=2.2.1
bld.downloadLocation=
bld.version=1.9.1

View file

@ -1,5 +1,5 @@
/*
* Copyright 2023-2025 the original author or authors.
* Copyright 2023-2024 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -22,9 +22,11 @@ import rife.bld.publish.PublishDeveloper;
import rife.bld.publish.PublishLicense;
import rife.bld.publish.PublishScm;
import java.io.IOException;
import java.util.List;
import static rife.bld.dependencies.Repository.*;
import static rife.bld.dependencies.Repository.MAVEN_CENTRAL;
import static rife.bld.dependencies.Repository.RIFE2_RELEASES;
import static rife.bld.dependencies.Scope.compile;
import static rife.bld.dependencies.Scope.test;
import static rife.bld.operations.JavadocOptions.DocLinkOption.NO_MISSING;
@ -34,21 +36,19 @@ public class GeneratedVersionOperationBuild extends Project {
public GeneratedVersionOperationBuild() {
pkg = "rife.bld.extension";
name = "GeneratedVersionOperation";
version = version(1, 0, 1);
version = version(0, 9, 6);
javaRelease = 17;
downloadSources = true;
autoDownloadPurge = true;
repositories = List.of(MAVEN_CENTRAL, RIFE2_RELEASES, RIFE2_SNAPSHOTS);
repositories = List.of(MAVEN_CENTRAL, RIFE2_RELEASES);
scope(compile)
.include(dependency("com.uwyn.rife2", "bld", version(2, 2, 1)));
.include(dependency("com.uwyn.rife2", "bld", version(1, 9, 1)));
scope(test)
.include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 12, 1)))
.include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 12, 1)))
.include(dependency("org.assertj", "assertj-core", version(3, 27, 3)));
.include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 10, 2)))
.include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 10, 2)))
.include(dependency("org.assertj", "assertj-core", version(3, 26, 0)));
precompileOperation()
.templateTypes(TXT);
@ -63,26 +63,28 @@ public class GeneratedVersionOperationBuild extends Project {
publishOperation()
.repositories(version.isSnapshot() ? repository("rife2-snapshot") : repository("rife2"))
.repository(repository("github"))
.info()
.groupId("com.uwyn.rife2")
.artifactId("bld-generated-version")
.description("bld Extension to Generate Project Version Data")
.url("https://github.com/rife2/generated-version")
.developer(new PublishDeveloper()
.id("ethauvin")
.name("Erik C. Thauvin")
.email("erik@thauvin.net")
.url("https://erik.thauvin.net/")
.developer(
new PublishDeveloper()
.id("ethauvin")
.name("Erik C. Thauvin")
.email("erik@thauvin.net")
.url("https://erik.thauvin.net/")
)
.license(new PublishLicense()
.name("The Apache License, Version 2.0")
.url("https://www.apache.org/licenses/LICENSE-2.0.txt")
.license(
new PublishLicense()
.name("The Apache License, Version 2.0")
.url("https://www.apache.org/licenses/LICENSE-2.0.txt")
)
.scm(new PublishScm()
.connection("scm:git:https://github.com/rife2/generated-version.git")
.developerConnection("scm:git:git@github.com:rife2/generated-version.git")
.url("https://github.com/rife2/generated-version")
.scm(
new PublishScm()
.connection("scm:git:https://github.com/rife2/generated-version.git")
.developerConnection("scm:git:git@github.com:rife2/generated-version.git")
.url("https://github.com/rife2/generated-version")
)
.signKey(property("sign.key"))
.signPassphrase(property("sign.passphrase"));
@ -92,8 +94,15 @@ public class GeneratedVersionOperationBuild extends Project {
new GeneratedVersionOperationBuild().start(args);
}
@BuildCommand(summary = "Generates JaCoCo Reports")
public void jacoco() throws IOException {
new JacocoReportOperation()
.fromProject(this)
.execute();
}
@BuildCommand(summary = "Runs PMD analysis")
public void pmd() throws Exception {
public void pmd() {
new PmdOperation()
.fromProject(this)
.failOnViolation(true)

View file

@ -1,5 +1,5 @@
/*
* Copyright 2023-2025 the original author or authors.
* Copyright 2023-2024 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -17,16 +17,8 @@
package rife.bld.extension;
import rife.bld.BaseProject;
import rife.resources.ResourceFinderClasspath;
import rife.resources.ResourceFinderDirectories;
import rife.resources.ResourceFinderGroup;
import rife.template.Template;
import rife.template.TemplateFactory;
import rife.tools.FileUtils;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
/**
* GeneratedVersion data class.
@ -34,93 +26,16 @@ import java.nio.file.Path;
* @author <a href="https://erik.thauvin.net/">Erik C. Thauvin</a>
* @since 1.0
*/
@SuppressWarnings("PMD.DataClass")
public class GeneratedVersion {
private static final String CLASSNAME = "className";
private static final String EPOCH = "epoch";
private static final String MAJOR = "major";
private static final String MINOR = "minor";
private static final String PACKAGE_NAME = "packageName";
private static final String PROJECT = "project";
private static final String QUALIFIER = "qualifier";
private static final String REVISION = "revision";
private static final String VERSION = "version";
private File classFile_;
private String className_ = "GeneratedVersion";
private File directory_;
private String extension_ = ".java";
private String packageName_;
private String projectName_;
private BaseProject project_;
private File template_;
/**
* Builds the template based on the {@link GeneratedVersion} data.
*
* @return the template
*/
public Template buildTemplate() {
Template template;
var version = project_.version();
TemplateFactory.TXT.resetClassLoader();
if (template_ == null) {
var group = new ResourceFinderGroup().add(ResourceFinderClasspath.instance());
template = TemplateFactory.TXT.setResourceFinder(group).get("default_generated_version");
} else {
File parent;
if (template_.getParentFile() != null) {
parent = template_.getParentFile();
} else {
parent = new File(template_.getAbsolutePath()).getParentFile();
}
var group = new ResourceFinderGroup().add(new ResourceFinderDirectories(parent));
template = TemplateFactory.TXT.setResourceFinder(group).get(template_.getName());
}
if (packageName_ == null) {
packageName_ = project_.pkg();
}
if (template.hasValueId(PACKAGE_NAME)) {
template.setValue(PACKAGE_NAME, packageName_);
}
if (template.hasValueId(CLASSNAME)) {
template.setValue(CLASSNAME, className_);
}
if (template.hasValueId(PROJECT)) {
if (projectName_ == null) {
projectName_ = project_.name();
}
template.setValue(PROJECT, projectName_);
}
if (template.hasValueId(EPOCH)) {
template.setValue(EPOCH, System.currentTimeMillis());
}
if (template.hasValueId(VERSION)) {
template.setValue(VERSION, version.toString());
}
if (template.hasValueId(MAJOR)) {
template.setValue(MAJOR, version.majorInt());
}
if (template.hasValueId(MINOR)) {
template.setValue(MINOR, version.minorInt());
}
if (template.hasValueId(REVISION)) {
template.setValue(REVISION, version.revisionInt());
}
if (template.hasValueId(QUALIFIER)) {
template.setValue(QUALIFIER, version.qualifier());
}
return template;
}
private File classFile;
private String className;
private File directory;
private String extension = ".java";
private String packageName;
private BaseProject project;
private String projectName;
private File template;
/**
* Returns the class file.
@ -128,7 +43,7 @@ public class GeneratedVersion {
* @return the class file
*/
public File getClassFile() {
return classFile_;
return classFile;
}
/**
@ -137,7 +52,7 @@ public class GeneratedVersion {
* @return the class name
*/
public String getClassName() {
return className_;
return className;
}
/**
@ -146,7 +61,7 @@ public class GeneratedVersion {
* @return the destination directory
*/
public File getDirectory() {
return directory_;
return directory;
}
/**
@ -155,7 +70,7 @@ public class GeneratedVersion {
* @return the file extension
*/
public String getExtension() {
return extension_;
return extension;
}
/**
@ -164,7 +79,7 @@ public class GeneratedVersion {
* @return the package name
*/
public String getPackageName() {
return packageName_;
return packageName;
}
/**
@ -173,7 +88,7 @@ public class GeneratedVersion {
* @return the project
*/
public BaseProject getProject() {
return project_;
return project;
}
/**
@ -182,7 +97,7 @@ public class GeneratedVersion {
* @return the project name
*/
public String getProjectName() {
return projectName_;
return projectName;
}
/**
@ -191,7 +106,16 @@ public class GeneratedVersion {
* @return the template
*/
public File getTemplate() {
return template_;
return template;
}
/**
* Sets the class file.
*
* @param classFile the class file
*/
public void setClassFile(File classFile) {
this.classFile = classFile;
}
/**
@ -200,7 +124,7 @@ public class GeneratedVersion {
* @param className the class name
*/
public void setClassName(String className) {
this.className_ = className;
this.className = className;
}
/**
@ -209,7 +133,7 @@ public class GeneratedVersion {
* @param directory the destination directory
*/
public void setDirectory(File directory) {
this.directory_ = directory;
this.directory = directory;
}
/**
@ -218,7 +142,7 @@ public class GeneratedVersion {
* @param extension the file extension
*/
public void setExtension(String extension) {
this.extension_ = extension;
this.extension = extension;
}
/**
@ -227,7 +151,7 @@ public class GeneratedVersion {
* @param packageName the package name
*/
public void setPackageName(String packageName) {
this.packageName_ = packageName;
this.packageName = packageName;
}
/**
@ -236,7 +160,7 @@ public class GeneratedVersion {
* @param project the project
*/
public void setProject(BaseProject project) {
this.project_ = project;
this.project = project;
}
/**
@ -245,7 +169,7 @@ public class GeneratedVersion {
* @param projectName the project name
*/
public void setProjectName(String projectName) {
this.projectName_ = projectName;
this.projectName = projectName;
}
/**
@ -254,31 +178,6 @@ public class GeneratedVersion {
* @param template the template
*/
public void setTemplate(File template) {
this.template_ = template;
}
/**
* Writes the project version class in the given directory.
*/
public void writeTemplate(Template template) throws IOException {
if (packageName_ != null) {
classFile_ = Path.of(directory_.getAbsolutePath(), packageName_.replace(".", File.separator),
className_ + extension_).toFile();
} else {
classFile_ = new File(directory_, className_ + ".java");
}
if (!classFile_.getParentFile().exists()) {
var dirs = classFile_.getParentFile().mkdirs();
if (!dirs && !classFile_.getParentFile().exists()) {
throw new IOException("Could not create project package directories: " + classFile_.getParent());
}
}
try {
FileUtils.writeString(template.getContent(), classFile_);
} catch (IOException e) {
throw new IOException("Unable to write the version class file: " + e.getMessage(), e);
}
this.template = template;
}
}

View file

@ -1,5 +1,5 @@
/*
* Copyright 2023-2025 the original author or authors.
* Copyright 2023-2024 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -19,10 +19,16 @@ package rife.bld.extension;
import rife.bld.BaseProject;
import rife.bld.operations.AbstractOperation;
import rife.bld.operations.exceptions.ExitStatusException;
import rife.resources.ResourceFinderDirectories;
import rife.template.Template;
import rife.template.TemplateConfig;
import rife.template.TemplateFactory;
import rife.tools.FileUtils;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.util.Objects;
import java.util.logging.Level;
import java.util.logging.Logger;
@ -33,8 +39,119 @@ import java.util.logging.Logger;
* @since 1.0
*/
public class GeneratedVersionOperation extends AbstractOperation<GeneratedVersionOperation> {
private static final String CLASSNAME = "className";
private static final String EPOCH = "epoch";
private static final Logger LOGGER = Logger.getLogger(GeneratedVersionOperation.class.getName());
private final GeneratedVersion generatedVersion_ = new GeneratedVersion();
private static final String MAJOR = "major";
private static final String MINOR = "minor";
private static final String PACKAGE_NAME = "packageName";
private static final String PROJECT = "project";
private static final String QUALIFIER = "qualifier";
private static final String REVISION = "revision";
private static final String VERSION = "version";
private final GeneratedVersion generatedVersion = new GeneratedVersion();
/**
* Builds the template based on the {@link GeneratedVersion} data.
*
* @param gv the generated version
* @return the template
*/
public static Template buildTemplate(GeneratedVersion gv) {
Template template;
var version = gv.getProject().version();
if (gv.getTemplate() == null) {
template = TemplateFactory.TXT.get("version.txt");
} else {
var files = new ResourceFinderDirectories(gv.getTemplate().getParentFile());
template = new TemplateFactory(TemplateConfig.TXT, "txtFiles", TemplateFactory.TXT)
.setResourceFinder(files).get(gv.getTemplate().getName());
}
if (gv.getPackageName() == null) {
gv.setPackageName(gv.getProject().pkg());
}
if (template.hasValueId(PACKAGE_NAME)) {
template.setValue(PACKAGE_NAME, gv.getPackageName());
}
gv.setClassName(Objects.requireNonNullElse(gv.getClassName(), "GeneratedVersion"));
if (template.hasValueId(CLASSNAME)) {
template.setValue(CLASSNAME, gv.getClassName());
}
if (template.hasValueId(PROJECT)) {
if (gv.getProjectName() == null) {
gv.setProjectName(gv.getProject().name());
}
template.setValue(PROJECT, gv.getProjectName());
}
if (template.hasValueId(EPOCH)) {
template.setValue(EPOCH, System.currentTimeMillis());
}
if (template.hasValueId(VERSION)) {
template.setValue(VERSION, version.toString());
}
if (template.hasValueId(MAJOR)) {
template.setValue(MAJOR, version.majorInt());
}
if (template.hasValueId(MINOR)) {
template.setValue(MINOR, version.minorInt());
}
if (template.hasValueId(REVISION)) {
template.setValue(REVISION, version.revisionInt());
}
if (template.hasValueId(QUALIFIER)) {
template.setValue(QUALIFIER, version.qualifier());
}
return template;
}
/**
* Writes the project version class in the given directory.
*
* @param template the template
* @param gv the generated version
*/
public static void writeTemplate(Template template, GeneratedVersion gv) {
if (gv.getPackageName() != null) {
gv.setClassFile(Path.of(gv.getDirectory().getAbsolutePath(),
gv.getPackageName().replace(".", File.separator), gv.getClassName()
+ gv.getExtension()).toFile());
} else {
gv.setClassFile(Path.of(gv.getDirectory().getAbsolutePath(), gv.getClassName() + ".java").toFile());
}
if (!gv.getClassFile().getParentFile().exists()) {
var mkdirs = gv.getClassFile().getParentFile().mkdirs();
if (!mkdirs && !gv.getClassFile().getParentFile().exists() && LOGGER.isLoggable(Level.SEVERE)) {
LOGGER.log(Level.SEVERE, "Could not create project package directories: {0}",
gv.getClassFile().getParent());
}
}
try {
var updated = gv.getClassFile().exists();
FileUtils.writeString(template.getContent(), gv.getClassFile());
if (LOGGER.isLoggable(Level.INFO)) {
LOGGER.log(Level.INFO, "Generated version ({0}) class has been {1}: {2}",
new String[]{gv.getProject().version().toString(), updated ? "updated" : "created",
"file://" + gv.getClassFile().toURI().getPath()});
}
} catch (IOException e) {
if (LOGGER.isLoggable(Level.SEVERE)) {
LOGGER.log(Level.SEVERE, "Unable to write the version class file.", e);
}
}
}
/**
* Sets the class name.
@ -43,7 +160,7 @@ public class GeneratedVersionOperation extends AbstractOperation<GeneratedVersio
* @return this operation instance
*/
public GeneratedVersionOperation className(String className) {
generatedVersion_.setClassName(className);
generatedVersion.setClassName(className);
return this;
}
@ -54,30 +171,10 @@ public class GeneratedVersionOperation extends AbstractOperation<GeneratedVersio
* @return this operation instance
*/
public GeneratedVersionOperation classTemplate(File template) {
generatedVersion_.setTemplate(template);
generatedVersion.setTemplate(template);
return this;
}
/**
* Sets the class template path.
*
* @param template the template path
* @return this operation instance
*/
public GeneratedVersionOperation classTemplate(String template) {
return classTemplate(new File(template));
}
/**
* Sets the class template path.
*
* @param template the template path
* @return this operation instance
*/
public GeneratedVersionOperation classTemplate(Path template) {
return classTemplate(template.toFile());
}
/**
* Sets the destination directory.
*
@ -85,57 +182,21 @@ public class GeneratedVersionOperation extends AbstractOperation<GeneratedVersio
* @return this operation instance
*/
public GeneratedVersionOperation directory(File directory) {
generatedVersion_.setDirectory(directory);
generatedVersion.setDirectory(directory);
return this;
}
/**
* Sets the destination directory.
*
* @param directory the destination directory
* @return this operation instance
*/
public GeneratedVersionOperation directory(String directory) {
return directory(new File(directory));
}
/**
* Sets the destination directory.
*
* @param directory the destination directory
* @return this operation instance
*/
public GeneratedVersionOperation directory(Path directory) {
return directory(directory.toFile());
}
/**
* Generates a version data class for this project.
*/
@Override
@SuppressWarnings("PMD.PreserveStackTrace")
public void execute() throws Exception {
if (generatedVersion_.getProject() == null) {
if (LOGGER.isLoggable(Level.SEVERE) && !silent()) {
LOGGER.severe("A project must be specified.");
}
throw new ExitStatusException(ExitStatusException.EXIT_FAILURE);
} else {
try {
var template = generatedVersion_.buildTemplate();
generatedVersion_.writeTemplate(template);
if (LOGGER.isLoggable(Level.INFO) && !silent()) {
LOGGER.log(Level.INFO, "Generated version ({0}) class saved to: file://{1}",
new String[]{generatedVersion_.getProject().version().toString(),
generatedVersion_.getClassFile().toURI().getPath()});
}
} catch (Exception e) {
if (LOGGER.isLoggable(Level.SEVERE) && !silent()) {
LOGGER.severe(e.getMessage());
}
throw new ExitStatusException(ExitStatusException.EXIT_FAILURE);
}
public void execute() {
if (generatedVersion.getProject() == null && LOGGER.isLoggable(Level.SEVERE)) {
LOGGER.severe("A project must be specified.");
}
var template = buildTemplate(generatedVersion);
writeTemplate(template, generatedVersion);
}
/**
@ -145,7 +206,7 @@ public class GeneratedVersionOperation extends AbstractOperation<GeneratedVersio
* @return this operation instance
*/
public GeneratedVersionOperation extension(String extension) {
generatedVersion_.setExtension(extension);
generatedVersion.setExtension(extension);
return this;
}
@ -156,20 +217,11 @@ public class GeneratedVersionOperation extends AbstractOperation<GeneratedVersio
* @return this operation instance
*/
public GeneratedVersionOperation fromProject(BaseProject project) {
generatedVersion_.setProject(project);
generatedVersion_.setDirectory(project.srcMainJavaDirectory());
generatedVersion.setProject(project);
generatedVersion.setDirectory(project.srcMainJavaDirectory());
return this;
}
/**
* Retrieves the generated version instance.
*
* @return the generated version
*/
public GeneratedVersion generatedVersion() {
return generatedVersion_;
}
/**
* Sets the package name.
*
@ -177,7 +229,7 @@ public class GeneratedVersionOperation extends AbstractOperation<GeneratedVersio
* @return this operation instance
*/
public GeneratedVersionOperation packageName(String packageName) {
generatedVersion_.setPackageName(packageName);
generatedVersion.setPackageName(packageName);
return this;
}
@ -188,7 +240,7 @@ public class GeneratedVersionOperation extends AbstractOperation<GeneratedVersio
* @return this operation instance
*/
public GeneratedVersionOperation projectName(String projectName) {
generatedVersion_.setProjectName(projectName);
generatedVersion.setProjectName(projectName);
return this;
}
}

View file

@ -1,4 +1,4 @@
/**
/*
* This file is automatically generated.
* Do not modify! -- ALL CHANGES WILL BE ERASED!
*/

View file

@ -1,5 +1,5 @@
/*
* Copyright 2023-2025 the original author or authors.
* Copyright 2023-2024 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -16,23 +16,16 @@
package rife.bld.extension;
import org.assertj.core.api.AutoCloseableSoftAssertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import rife.bld.BaseProject;
import rife.bld.Project;
import rife.bld.blueprints.BaseProjectBlueprint;
import rife.bld.dependencies.VersionNumber;
import rife.tools.FileUtils;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Objects;
import java.util.logging.ConsoleHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
import static org.assertj.core.api.Assertions.assertThat;
@ -60,41 +53,6 @@ class GeneratedVersionTest {
}
};
@BeforeAll
static void beforeAll() {
var level = Level.ALL;
var logger = Logger.getLogger("rife.bld.extension");
var consoleHandler = new ConsoleHandler();
consoleHandler.setLevel(level);
logger.addHandler(consoleHandler);
logger.setLevel(level);
logger.setUseParentHandlers(false);
}
/**
* Compares two strings by removing all line separators and whitespace.
*
* @param text1 The first text to compare
* @param text2 The second text to compare
* @return true if the texts are equivalent when line separators are ignored, false otherwise
*/
static boolean compareTextIgnoringLineSeparators(String text1, String text2) {
// Handle null cases
if (text1 == null && text2 == null) {
return true;
}
if (text1 == null || text2 == null) {
return false;
}
// Remove all line separators and whitespace
var cleanedText1 = text1.replaceAll("\\r?\\n|\\r|\\s", "");
var cleanedText2 = text2.replaceAll("\\r?\\n|\\r|\\s", "");
// Compare the cleaned strings
return cleanedText1.equals(cleanedText2);
}
static void deleteOnExit(File folder) {
folder.deleteOnExit();
for (var f : Objects.requireNonNull(folder.listFiles())) {
@ -110,43 +68,41 @@ class GeneratedVersionTest {
void testBuildCustomTemplate() {
var gv = new GeneratedVersion();
gv.setProject(PROJECT);
gv.setTemplate(new File(gv.getProject().srcTestResourcesDirectory().getAbsolutePath(), "version_test.txt"));
gv.setTemplate(new File(gv.getProject().srcTestResourcesDirectory().getAbsolutePath(),
"version_test.txt"));
gv.setPackageName("com.example.my");
gv.setProjectName("My App");
gv.setClassName("MyVersion");
var t = gv.buildTemplate();
var v = gv.getProject().version();
assertThat(v).extracting("majorInt", "minorInt", "revisionInt").as("version")
.containsExactly(2, 1, 3);
assertThat(compareTextIgnoringLineSeparators(t.getContent(),
String.format("package %s;" +
"public final class %s {" +
" public static final int PROJECT = \"%s\";" +
" public static final int MAJOR = %d;" +
" public static final int MINOR = %d;" +
" public static final int REVISION = %d;" +
" public static final String QUALIFIER = \"\";" +
" private MyVersion() {" +
" // no-op" +
" }" +
"}", gv.getPackageName(), gv.getClassName(), gv.getProjectName(), v.majorInt(),
v.minorInt(), v.revisionInt()))).as("template").isTrue();
var t = GeneratedVersionOperation.buildTemplate(gv);
assertThat(t.getContent()).isEqualTo("""
package com.example.my;
public final class MyVersion {
public static final int PROJECT = "My App";
public static final int MAJOR = 2;
public static final int MINOR = 1;
public static final int REVISION = 3;
public static final String QUALIFIER = "";
private MyVersion() {
// no-op
}
}
""");
}
@Test
void testBuildTemplate() {
var gv = new GeneratedVersion();
gv.setProject(PROJECT);
var t = GeneratedVersionOperation.buildTemplate(gv);
var t = gv.buildTemplate();
assertThat(t).isNotNull();
try (var softly = new AutoCloseableSoftAssertions()) {
softly.assertThat(gv.getProject()).isEqualTo(PROJECT);
softly.assertThat(gv.getPackageName()).isEqualTo(PROJECT.pkg());
softly.assertThat(gv.getProjectName()).isEqualTo(PROJECT.name());
}
assertThat(gv.getProject()).isEqualTo(PROJECT);
assertThat(gv.getPackageName()).isEqualTo(PROJECT.pkg());
assertThat(gv.getProjectName()).isEqualTo(PROJECT.name());
assertThat(t.getContent()).contains("package com.example;").contains("class GeneratedVersion")
.contains("PROJECT = \"MyExample\";").contains("MAJOR = 2").contains("MINOR = 1")
@ -154,108 +110,23 @@ class GeneratedVersionTest {
.contains("private GeneratedVersion");
}
@Test
void testDirectories() {
var foo = new File("foo");
var bar = new File("bar");
var op = new GeneratedVersionOperation().directory(foo);
assertThat(op.generatedVersion().getDirectory()).as("as file").isEqualTo(foo);
op = op.directory(bar.toPath());
assertThat(op.generatedVersion().getDirectory()).as("as path").isEqualTo(bar);
op = op.directory("foo");
assertThat(op.generatedVersion().getDirectory()).as("as string").isEqualTo(foo);
}
@Test
void testExample() throws Exception {
var tmpDir = Files.createTempDirectory("bld-generated-version-example-").toFile();
tmpDir.deleteOnExit();
new GeneratedVersionOperation()
.fromProject(new BaseProjectBlueprint(new File("examples"), "com.example", "Example", "Example"))
.directory(tmpDir.getAbsolutePath())
//.classTemplate(new File("examples", "my_app_version.txt"))
.classTemplate(new File("examples", "version.txt"))
.execute();
deleteOnExit(tmpDir);
var template = Path.of(tmpDir.getAbsolutePath(), "com", "example", "GeneratedVersion.java");
assertThat(template).exists();
var content = Files.readString(template);
assertThat(content).contains("class GeneratedVersion").contains("PROJECT = \"Example\";")
.contains("MAJOR = 0").contains("MINOR = 0").contains("REVISION = 1").contains("QUALIFIER = \"\"")
.doesNotContain("ERASED!"); // only in default template
}
@Test
void testExecute() throws Exception {
var tmpDir = Files.createTempDirectory("bld-generated-version-execute-").toFile();
tmpDir.deleteOnExit();
new GeneratedVersionOperation()
.fromProject(PROJECT)
.directory(tmpDir.getAbsolutePath())
.extension(".java")
.classTemplate("src/test/resources/foo/version_test.txt")
.packageName("")
.className("MyVersion")
.execute();
deleteOnExit(tmpDir);
var template = new File(tmpDir, "MyVersion.java");
assertThat(template).exists();
var content = Files.readString(template.toPath());
assertThat(content).contains("class MyVersion")
.contains("PROJECT = \"MyExample\";").contains("MAJOR = 2").contains("MINOR = 1")
.contains("REVISION = 3").contains("QUALIFIER = \"\"").contains("private MyVersion")
.doesNotContain("package");
}
@Test
void testGeneratedVersion() {
var gv = new GeneratedVersion();
gv.setProject(PROJECT);
gv.setTemplate(new File(gv.getProject().srcTestResourcesDirectory().getAbsolutePath(), "version_test.txt"));
gv.setPackageName("com.example.cool");
gv.setProjectName("Cool App");
gv.setClassName("CoolVersion");
gv.setDirectory(new File("build"));
gv.setExtension(".java");
try (var softly = new AutoCloseableSoftAssertions()) {
softly.assertThat(gv.getProject()).as("project").isEqualTo(PROJECT);
softly.assertThat(gv.getTemplate()).as("template").exists();
softly.assertThat(gv.getPackageName()).as("package name").isEqualTo("com.example.cool");
softly.assertThat(gv.getProjectName()).as("project name").isEqualTo("Cool App");
softly.assertThat(gv.getClassName()).as("class name").isEqualTo("CoolVersion");
softly.assertThat(gv.getExtension()).as("extension").isEqualTo(".java");
softly.assertThat(gv.getDirectory()).as("directory").isDirectory();
}
}
@Test
void testWriteTemplate() throws IOException {
var tmpDir = Files.createTempDirectory("bld-generated-version-write-").toFile();
var tmpDir = Files.createTempDirectory("bld-generated-version-").toFile();
tmpDir.deleteOnExit();
var gv = new GeneratedVersion();
gv.setProject(PROJECT);
gv.setDirectory(tmpDir);
var t = gv.buildTemplate();
gv.writeTemplate(t);
var t = GeneratedVersionOperation.buildTemplate(gv);
deleteOnExit(tmpDir);
GeneratedVersionOperation.writeTemplate(t, gv);
assertThat(gv.getClassFile()).exists();
deleteOnExit(tmpDir);
var versionClass = FileUtils.readString(gv.getClassFile());
assertThat(versionClass).contains("package com.example;").contains("class GeneratedVersion")
.contains("MAJOR = 2").contains("MINOR = 1").contains("REVISION = 3")

View file

@ -1,11 +0,0 @@
public final class {{v className/}} {
public static final int PROJECT = "{{v project/}}";
public static final int MAJOR = {{v major/}};
public static final int MINOR = {{v minor/}};
public static final int REVISION = {{v revision/}};
public static final String QUALIFIER = "{{v qualifier/}}";
private {{v className/}}() {
// no-op
}
}