Compare commits

...

63 commits

Author SHA1 Message Date
aa5fad1989
Version 1.0.1 2025-03-28 12:07:07 -07:00
559332a2b4
Bump PMD extension from 1.2.1 to 1.2.2 2025-03-28 12:04:22 -07:00
fc0963ad40
Improve template testing 2025-03-26 22:30:10 -07:00
cfb8839359
Add a method to compare text ignoring line separators and whitespaces 2025-03-26 21:59:57 -07:00
a109d2ad93
Use the system's line separator 2025-03-25 00:31:19 -07:00
dff81ff97a
Add OS matrix with Ubuntu, Windows and macOS 2025-03-25 00:19:50 -07:00
5926878f7a
JDK 24 2025-03-18 23:36:13 -07:00
b4a63c6e31
Add generic installation instructions 2025-03-18 12:40:49 -07:00
5910bc2ae9
Cleanup copyright template 2025-03-18 12:39:20 -07:00
16620be21e
Bump PMD extension to version 1.2.1 2025-03-18 12:39:04 -07:00
a703238ea9
Bump Junit to version 5.13.1 2025-03-18 12:38:43 -07:00
ee552bad83
Update copyright 2025-02-25 10:29:26 -08:00
6d8c740006
1.0.1-SNAPSHOT 2025-02-25 10:28:27 -08:00
adbca3f40d
Bump bld to version 2.2.1 2025-02-25 10:28:08 -08:00
d39c0183e6
Bump AssertJ to version 3.27.3 2025-02-25 10:27:30 -08:00
27b7f1f2d1
Bump JUnit to version 5.12.0 2025-02-25 10:26:59 -08:00
c34ffb7f3d
Remove un-necessary kotlin-version 2025-02-25 10:25:49 -08:00
cc800e9aa8
Update pages actions to latest versions 2025-02-25 10:24:57 -08:00
58cd098d6c
Version 1.0.0 2025-01-14 11:07:20 -08:00
e39a67b6e4
Updated copyright for 2025 2025-01-14 00:40:31 -08:00
0e988d62eb
Bumped bld to version 2.2.0 2025-01-14 00:39:45 -08:00
2a2de429b5
Bumped AssertJ to version 3.27.2 2025-01-14 00:31:30 -08:00
b76ffd1e14
Bumped PMD extension to version 1.1.10 2025-01-14 00:30:55 -08:00
b7cd90e67c
Bumped Kotlin to version 2.1.0 2024-12-28 17:57:18 -08:00
b4a4b898e2
Bumped PMD extension to version 1.1.9 2024-12-28 17:56:18 -08:00
127c6e573c
Bumped AssertJ to version 3.27.0 2024-12-28 17:55:34 -08:00
715cc9d1d8
Bumped JUnit to version 5.11.4 2024-12-28 17:54:59 -08:00
6cb78a9e91
Added soft assertions 2024-10-27 16:10:11 -07:00
41e5467196
Updated dependencies
Bumped JUnit version to 5.11.3
Bumped PMD extension version to 1.1.7
Bumped JDK to version 23 (GitHub CI Workflow)
2024-10-27 16:09:33 -07:00
248d2c3362
Added GitHub repository 2024-10-27 16:05:54 -07:00
7df5b39c6a
Version 0.9.9 2024-08-30 13:50:33 -07:00
fc11d3c749
Bumped bld to version 2.1.0 2024-08-30 13:45:04 -07:00
eabca28d38
Cleaned up API to match bld operations aand options APIs 2024-08-28 00:56:00 -07:00
46b9a52215
Bumped JUnit to version 5.11.0 2024-08-28 00:55:11 -07:00
8b9b40a419
Version 0.9.8 2024-07-28 23:47:52 -07:00
bd5b55f1b7
Bumped bld to version 2.0.1 2024-07-28 23:41:36 -07:00
e1b526a723
Bumped bld to version 2.0.0-SNAPSHOT 2024-07-22 09:26:42 -07:00
06c0a73924
Added Kotlin matrix to GitHub workflow 2024-07-22 09:20:56 -07:00
07c23883c1
Improved template search path, again 2024-07-11 17:09:40 -07:00
61d723b589
Version 0.9.8-SNAPSHOT 2024-07-11 17:08:53 -07:00
4ee818deab
Bumped bld to version 2.0.0-SNAPSHOT 2024-07-11 09:33:35 -07:00
6b80d9a104
Bumped JaCoCo extension to version 0.9.6 2024-07-11 09:32:41 -07:00
e8a12857b8
Cleaned up alternate example class template 2024-07-11 09:28:09 -07:00
c4f143ae02
Cleaned up template builder and related tests 2024-07-04 20:37:48 -07:00
81212468fd
Version 0.9.7 2024-07-03 18:22:06 -07:00
7c07ad464b
Improved version template search path 2024-07-03 18:09:29 -07:00
c1c5433472
Ensure execution stops on failure 2024-07-03 17:55:32 -07:00
3e564915ea
Moved template generation methods to GeneratedVersion class 2024-07-03 16:23:08 -07:00
4b00dd801a
Bumped dependencies
PMD extension to version 1.1.2
JUnit to versin 5.10.3
2024-07-03 16:16:52 -07:00
1cfa3a712f
Added ability to the directory and script template using a String 2024-06-22 20:15:40 -07:00
1e90d059cf
Version 0.9.6 2024-05-26 23:10:01 -07:00
b27e6e743c
Bumped assertj-core to version 3.26.0 2024-05-26 23:09:05 -07:00
b725eb7b2f
Fixed class location URL 2024-05-11 15:35:45 -07:00
8fe93a3e9b
Bumped PMD extension to version 0.9.9 2024-05-09 20:55:18 -07:00
d6a1919b5e
Bumped bld to version 1.9.1 2024-05-09 20:54:52 -07:00
0ee3b482c0
Bumped to version 0.9.6-SNAPSHOT 2024-04-17 17:11:43 -07:00
599190aae1
Output generated class location as a file URL. 2024-04-17 17:06:22 -07:00
5beca281e6
Bumped PMD extension to version 0.9.8
Bumped JaCoCo extension to version 0.9.5
2024-04-17 17:04:56 -07:00
9625c876bd
Bumped worflows actions to the latest versions 2024-04-17 17:03:00 -07:00
3777e7b993
Added JDK 22 to CI 2024-03-21 13:59:17 -07:00
26fbb9e02d Bumped to bld 1.9.0 2024-02-26 13:15:53 -08:00
888b9c80d8 Bumped JUnit versions 2024-02-25 18:50:53 -08:00
3186adb264 Improved Visual Studio Code support 2024-02-25 18:50:32 -08:00
33 changed files with 558 additions and 322 deletions

View file

@ -4,29 +4,36 @@ on: [ push, pull_request, workflow_dispatch ]
jobs:
build-bld-project:
runs-on: ubuntu-latest
strategy:
matrix:
java-version: [ 17, 20 ]
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 }}
steps:
- name: Checkout source repository
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up JDK ${{ matrix.java-version }}
uses: actions/setup-java@v3
uses: actions/setup-java@v4
with:
distribution: 'zulu'
distribution: "zulu"
java-version: ${{ matrix.java-version }}
- name: Grant execute permission for bld
run: chmod +x bld
- name: Download the dependencies
- name: Download dependencies [examples]
working-directory: examples
run: ./bld download
- name: Run tests with bld
- 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

View file

@ -30,14 +30,14 @@ jobs:
steps:
- name: Checkout source repository
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up JDK 17
uses: actions/setup-java@v3
uses: actions/setup-java@v4
with:
distribution: 'zulu'
distribution: "zulu"
java-version: 17
- name: Build Javadocs
@ -47,11 +47,11 @@ jobs:
uses: actions/configure-pages@v3
- name: Upload artifact
uses: actions/upload-pages-artifact@v1
uses: actions/upload-pages-artifact@v3
with:
# Upload generated Javadocs repository
path: 'build/javadoc/'
path: "build/javadoc/"
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v1
uses: actions/deploy-pages@v4

6
.idea/bld.xml generated Normal file
View file

@ -0,0 +1,6 @@
<?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-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="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="myName" value="Apache License" />
</copyright>
</component>

13
.idea/icon.svg generated Normal file
View file

@ -0,0 +1,13 @@
<?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>

After

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-1.8.0.jar!/" />
<root url="jar://$USER_HOME$/.bld/dist/bld-2.2.1.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="file://$PROJECT_DIR$/lib/bld" />
<root url="jar://$USER_HOME$/.bld/dist/bld-1.8.0-sources.jar!/" />
<root url="jar://$USER_HOME$/.bld/dist/bld-2.2.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="false" />
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="false" type="SOURCES" />
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="true" />
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="true" 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="false" />
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="false" type="SOURCES" />
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="true" />
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="true" 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="false" />
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="false" type="SOURCES" />
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="true" />
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="true" type="SOURCES" />
</library>
</component>

9
.vscode/launch.json vendored
View file

@ -5,7 +5,14 @@
"type": "java",
"name": "Run Tests",
"request": "launch",
"mainClass": "rife.bld.extension.GeneratedVersionOperationTest"
"mainClass": "org.junit.platform.console.ConsoleLauncher",
"args": [
"--details=verbose",
"--scan-classpath",
"--disable-banner",
"--disable-ansi-colors",
"--exclude-engine=junit-platform-suite",
"--exclude-engine=junit-vintage"]
}
]
}

10
.vscode/settings.json vendored
View file

@ -3,13 +3,13 @@
"src/main/java",
"src/main/resources",
"src/test/java",
"src/bld/java"
"src/test/resources",
"src/bld/java",
"src/bld/resources"
],
"java.configuration.updateBuildConfiguration": "automatic",
"java.project.referencedLibraries": [
"${HOME}bld-1.7.0-SNAPSHOT.jar",
"lib/compile/*.jar",
"lib/runtime/*.jar",
"lib/test/*.jar"
"${HOME}/.bld/dist/bld-2.2.1.jar",
"lib/**/*.jar"
]
}

View file

@ -3,12 +3,20 @@
[![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/1.8.0-FA9052?label=bld&labelColor=2392FF)](https://rife2.com/bld)
[![bld](https://img.shields.io/badge/2.2.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, please refer to the [extensions documentation](https://github.com/rife2/bld/wiki/Extensions).
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 automatically create a generated version class using the default template in your project on compile, add the following to your build file:
```java
@ -66,12 +74,12 @@ public void genver() throws Exception {
.projectName("My App")
.packageName("com.example.myapp")
.className("MyAppVersion")
.classTemplate(new File(workDirectory, "myversion.txt"))
.classTemplate("my_app_version.txt")
.execute();
}
```
```java
// myversion.txt
// my_app_version.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">
@ -24,8 +24,8 @@
<rule ref="category/java/codestyle.xml">
<exclude name="AtLeastOneConstructor"/>
<exclude name="ClassNamingConventions"/>
<exclude name="ConfusingTernary"/>
<exclude name="CommentDefaultAccessModifier"/>
<exclude name="ConfusingTernary"/>
<exclude name="FieldNamingConventions"/>
<exclude name="LocalVariableCouldBeFinal"/>
<exclude name="LongVariable"/>
@ -35,8 +35,9 @@
<exclude name="ShortClassName"/>
<exclude name="ShortMethodName"/>
<exclude name="ShortVariable"/>
<exclude name="UselessParentheses"/>
<exclude name="UseExplicitTypes"/>
<exclude name="UseUnderscoresInNumericLiterals"/>
<exclude name="UselessParentheses"/>
</rule>
<rule ref="category/java/codestyle.xml/UnnecessaryImport">
@ -52,8 +53,6 @@
<exclude name="AvoidUncheckedExceptionsInSignatures"/>
<exclude name="CognitiveComplexity"/>
<exclude name="CyclomaticComplexity"/>
<exclude name="ExcessiveClassLength"/>
<exclude name="ExcessiveMethodLength"/>
<exclude name="ExcessiveParameterList"/>
<exclude name="ExcessivePublicCount"/>
<exclude name="GodClass"/>

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-1.8.0.jar!/" />
<root url="jar://$USER_HOME$/.bld/dist/bld-2.2.1.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="file://$PROJECT_DIR$/lib/bld" />
<root url="jar://$USER_HOME$/.bld/dist/bld-1.8.0-sources.jar!/" />
<root url="jar://$USER_HOME$/.bld/dist/bld-2.2.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="false" />
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="false" type="SOURCES" />
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="true" />
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="true" 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="false" />
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="false" type="SOURCES" />
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="true" />
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="true" 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="false" />
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="false" type="SOURCES" />
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="true" />
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="true" type="SOURCES" />
</library>
</component>

View file

@ -6,19 +6,6 @@
"name": "Run Main",
"request": "launch",
"mainClass": "com.example.SampleMain"
},
{
"type": "java",
"name": "Run Tests",
"request": "launch",
"mainClass": "org.junit.platform.console.ConsoleLauncher",
"args": [
"--details=verbose",
"--scan-classpath",
"--disable-banner",
"--disable-ansi-colors",
"--exclude-engine=junit-platform-suite",
"--exclude-engine=junit-vintage"]
}
]
}

View file

@ -3,13 +3,13 @@
"src/main/java",
"src/main/resources",
"src/test/java",
"src/bld/java"
"src/test/resources",
"src/bld/java",
"src/bld/resources"
],
"java.configuration.updateBuildConfiguration": "automatic",
"java.project.referencedLibraries": [
"${HOME}bld-1.7.0.jar",
"lib/compile/*.jar",
"lib/runtime/*.jar",
"lib/test/*.jar"
"${HOME}/.bld/dist/bld-2.2.1.jar",
"lib/**/*.jar"
]
}

Binary file not shown.

View file

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

View file

@ -0,0 +1,30 @@
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,7 +4,6 @@ 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;
@ -13,10 +12,6 @@ import static rife.bld.dependencies.Scope.test;
/**
* Example build.
*
* <ul style="list-style-type:none">
* <li>./bld compile run</li>
* </ul>
*/
public class SampleBuild extends Project {
public SampleBuild() {
@ -25,11 +20,15 @@ public class SampleBuild extends Project {
mainClass = "com.example.SampleMain";
version = version(1, 0, 1, "rc1");
javaRelease = 17;
autoDownloadPurge = true;
downloadSources = true;
repositories = List.of(MAVEN_CENTRAL, RIFE2_RELEASES);
scope(test)
.include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 10, 1)))
.include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 10, 1)));
.include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 12, 1)))
.include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 12, 1)));
}
public static void main(String[] args) {
@ -47,7 +46,8 @@ public class SampleBuild extends Project {
new GeneratedVersionOperation()
.fromProject(this)
// .projectName("My App")
// .classTemplate(new File(workDirectory, "myversion.txt"))
// .classTemplate("my_app_version.txt")
// .classTemplate("version.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(1706686412610L);
public static final Date BUILD_DATE = new Date(1736843939053L);
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,7 +1,6 @@
bld.downloadExtensionJavadoc=false
bld.downloadExtensionSources=true
bld.extension-pmd=com.uwyn.rife2:bld-pmd:0.9.5
bld.extension-jacoco=com.uwyn.rife2:bld-jacoco-report:0.9.2
bld.repositories=MAVEN_LOCAL,MAVEN_CENTRAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES
bld.downloadLocation=
bld.version=1.8.0
bld.extension-pmd=com.uwyn.rife2:bld-pmd:1.2.2
bld.repositories=MAVEN_CENTRAL,MAVEN_LOCAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES
bld.version=2.2.1

View file

@ -1,5 +1,5 @@
/*
* Copyright 2023-2024 the original author or authors.
* Copyright 2023-2025 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,11 +22,9 @@ 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.MAVEN_CENTRAL;
import static rife.bld.dependencies.Repository.RIFE2_RELEASES;
import static rife.bld.dependencies.Repository.*;
import static rife.bld.dependencies.Scope.compile;
import static rife.bld.dependencies.Scope.test;
import static rife.bld.operations.JavadocOptions.DocLinkOption.NO_MISSING;
@ -36,19 +34,21 @@ public class GeneratedVersionOperationBuild extends Project {
public GeneratedVersionOperationBuild() {
pkg = "rife.bld.extension";
name = "GeneratedVersionOperation";
version = version(0, 9, 4);
version = version(1, 0, 1);
javaRelease = 17;
downloadSources = true;
autoDownloadPurge = true;
repositories = List.of(MAVEN_CENTRAL, RIFE2_RELEASES);
repositories = List.of(MAVEN_CENTRAL, RIFE2_RELEASES, RIFE2_SNAPSHOTS);
scope(compile)
.include(dependency("com.uwyn.rife2", "bld", version(1, 8, 0)));
.include(dependency("com.uwyn.rife2", "bld", version(2, 2, 1)));
scope(test)
.include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 10, 1)))
.include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 10, 1)))
.include(dependency("org.assertj", "assertj-core", version(3, 25, 2)));
.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)));
precompileOperation()
.templateTypes(TXT);
@ -63,25 +63,23 @@ 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()
.developer(new PublishDeveloper()
.id("ethauvin")
.name("Erik C. Thauvin")
.email("erik@thauvin.net")
.url("https://erik.thauvin.net/")
)
.license(
new PublishLicense()
.license(new PublishLicense()
.name("The Apache License, Version 2.0")
.url("http://www.apache.org/licenses/LICENSE-2.0.txt")
.url("https://www.apache.org/licenses/LICENSE-2.0.txt")
)
.scm(
new PublishScm()
.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")
@ -94,15 +92,8 @@ 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() {
public void pmd() throws Exception {
new PmdOperation()
.fromProject(this)
.failOnViolation(true)

View file

@ -1,5 +1,5 @@
/*
* Copyright 2023-2024 the original author or authors.
* Copyright 2023-2025 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,8 +17,16 @@
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.
@ -26,16 +34,93 @@ import java.io.File;
* @author <a href="https://erik.thauvin.net/">Erik C. Thauvin</a>
* @since 1.0
*/
@SuppressWarnings("PMD.DataClass")
public class GeneratedVersion {
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;
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;
}
/**
* Returns the class file.
@ -43,7 +128,7 @@ public class GeneratedVersion {
* @return the class file
*/
public File getClassFile() {
return classFile;
return classFile_;
}
/**
@ -52,7 +137,7 @@ public class GeneratedVersion {
* @return the class name
*/
public String getClassName() {
return className;
return className_;
}
/**
@ -61,7 +146,7 @@ public class GeneratedVersion {
* @return the destination directory
*/
public File getDirectory() {
return directory;
return directory_;
}
/**
@ -70,7 +155,7 @@ public class GeneratedVersion {
* @return the file extension
*/
public String getExtension() {
return extension;
return extension_;
}
/**
@ -79,7 +164,7 @@ public class GeneratedVersion {
* @return the package name
*/
public String getPackageName() {
return packageName;
return packageName_;
}
/**
@ -88,7 +173,7 @@ public class GeneratedVersion {
* @return the project
*/
public BaseProject getProject() {
return project;
return project_;
}
/**
@ -97,7 +182,7 @@ public class GeneratedVersion {
* @return the project name
*/
public String getProjectName() {
return projectName;
return projectName_;
}
/**
@ -106,16 +191,7 @@ public class GeneratedVersion {
* @return the template
*/
public File getTemplate() {
return template;
}
/**
* Sets the class file.
*
* @param classFile the class file
*/
public void setClassFile(File classFile) {
this.classFile = classFile;
return template_;
}
/**
@ -124,7 +200,7 @@ public class GeneratedVersion {
* @param className the class name
*/
public void setClassName(String className) {
this.className = className;
this.className_ = className;
}
/**
@ -133,7 +209,7 @@ public class GeneratedVersion {
* @param directory the destination directory
*/
public void setDirectory(File directory) {
this.directory = directory;
this.directory_ = directory;
}
/**
@ -142,7 +218,7 @@ public class GeneratedVersion {
* @param extension the file extension
*/
public void setExtension(String extension) {
this.extension = extension;
this.extension_ = extension;
}
/**
@ -151,7 +227,7 @@ public class GeneratedVersion {
* @param packageName the package name
*/
public void setPackageName(String packageName) {
this.packageName = packageName;
this.packageName_ = packageName;
}
/**
@ -160,7 +236,7 @@ public class GeneratedVersion {
* @param project the project
*/
public void setProject(BaseProject project) {
this.project = project;
this.project_ = project;
}
/**
@ -169,7 +245,7 @@ public class GeneratedVersion {
* @param projectName the project name
*/
public void setProjectName(String projectName) {
this.projectName = projectName;
this.projectName_ = projectName;
}
/**
@ -178,6 +254,31 @@ public class GeneratedVersion {
* @param template the template
*/
public void setTemplate(File template) {
this.template = 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);
}
}
}

View file

@ -1,5 +1,5 @@
/*
* Copyright 2023-2024 the original author or authors.
* Copyright 2023-2025 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,16 +19,10 @@ package rife.bld.extension;
import rife.bld.BaseProject;
import rife.bld.operations.AbstractOperation;
import rife.resources.ResourceFinderDirectories;
import rife.template.Template;
import rife.template.TemplateConfig;
import rife.template.TemplateFactory;
import rife.tools.FileUtils;
import rife.bld.operations.exceptions.ExitStatusException;
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;
@ -39,119 +33,8 @@ 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 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",
gv.getClassFile().toString()});
}
} catch (IOException e) {
if (LOGGER.isLoggable(Level.SEVERE)) {
LOGGER.log(Level.SEVERE, "Unable to write the version class file.", e);
}
}
}
private final GeneratedVersion generatedVersion_ = new GeneratedVersion();
/**
* Sets the class name.
@ -160,7 +43,7 @@ public class GeneratedVersionOperation extends AbstractOperation<GeneratedVersio
* @return this operation instance
*/
public GeneratedVersionOperation className(String className) {
generatedVersion.setClassName(className);
generatedVersion_.setClassName(className);
return this;
}
@ -171,10 +54,30 @@ 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.
*
@ -182,21 +85,57 @@ 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
public void execute() {
if (generatedVersion.getProject() == null && LOGGER.isLoggable(Level.SEVERE)) {
@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.");
}
var template = buildTemplate(generatedVersion);
writeTemplate(template, generatedVersion);
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);
}
}
}
/**
@ -206,7 +145,7 @@ public class GeneratedVersionOperation extends AbstractOperation<GeneratedVersio
* @return this operation instance
*/
public GeneratedVersionOperation extension(String extension) {
generatedVersion.setExtension(extension);
generatedVersion_.setExtension(extension);
return this;
}
@ -217,11 +156,20 @@ 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.
*
@ -229,7 +177,7 @@ public class GeneratedVersionOperation extends AbstractOperation<GeneratedVersio
* @return this operation instance
*/
public GeneratedVersionOperation packageName(String packageName) {
generatedVersion.setPackageName(packageName);
generatedVersion_.setPackageName(packageName);
return this;
}
@ -240,7 +188,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-2024 the original author or authors.
* Copyright 2023-2025 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,16 +16,23 @@
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;
@ -53,6 +60,41 @@ 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())) {
@ -68,41 +110,43 @@ 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 = 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
}
}
""");
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();
}
@Test
void testBuildTemplate() {
var gv = new GeneratedVersion();
gv.setProject(PROJECT);
var t = GeneratedVersionOperation.buildTemplate(gv);
var t = gv.buildTemplate();
assertThat(t).isNotNull();
assertThat(gv.getProject()).isEqualTo(PROJECT);
assertThat(gv.getPackageName()).isEqualTo(PROJECT.pkg());
assertThat(gv.getProjectName()).isEqualTo(PROJECT.name());
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(t.getContent()).contains("package com.example;").contains("class GeneratedVersion")
.contains("PROJECT = \"MyExample\";").contains("MAJOR = 2").contains("MINOR = 1")
@ -111,22 +155,107 @@ class GeneratedVersionTest {
}
@Test
void testWriteTemplate() throws IOException {
var tmpDir = Files.createTempDirectory("bld-generated-version-").toFile();
tmpDir.deleteOnExit();
var gv = new GeneratedVersion();
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();
tmpDir.deleteOnExit();
var gv = new GeneratedVersion();
gv.setProject(PROJECT);
gv.setDirectory(tmpDir);
var t = GeneratedVersionOperation.buildTemplate(gv);
GeneratedVersionOperation.writeTemplate(t, gv);
assertThat(gv.getClassFile()).exists();
var t = gv.buildTemplate();
gv.writeTemplate(t);
deleteOnExit(tmpDir);
assertThat(gv.getClassFile()).exists();
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

@ -0,0 +1,11 @@
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
}
}