Compare commits

...

198 commits

Author SHA1 Message Date
78a35dea31
Set JVM compatibility to version 17 2025-04-25 11:43:00 -07:00
03c749de68
Set Java language version to 17 2025-04-25 11:33:04 -07:00
5fa475a726
fixup! Bump Gradle to version 8.14 2025-04-25 11:12:51 -07:00
a2f08edcbe
Bump PMD extension to version 1.2.3 2025-04-25 09:30:17 -07:00
7028182522
Bump Gradle to version 8.14 2025-04-25 09:29:45 -07:00
5c2373ff8b
Update extensions
Bump Exec to version 1.0.5
Bump JaCoCo Report to version 0.9.10
Bump PMD to version 1.2.2
2025-04-13 13:41:13 -07:00
2a7cacc945
Bump JUnit to version 5.12.2 2025-04-13 13:40:13 -07:00
2770d4a75e
Fix GitHub CI badge 2025-03-26 15:16:47 -07:00
8ecb70758b
Add method to compare text ignoring line separators and whitespaces 2025-03-26 15:11:27 -07:00
90e584c0f1
Fix run-example commands 2025-03-26 14:40:01 -07:00
c904f4a7a2
Fix snapshot repository 2025-03-26 14:36:24 -07:00
a82c416af5
Fixed repositories import 2025-03-26 13:45:30 -07:00
4596e71a55
Add snapshot repository 2025-03-26 13:42:26 -07:00
ed7a6ff9da
Add OS matrix for Ubuntu, Windows and macOS 2025-03-26 13:37:14 -07:00
fc785581ba
Bump Kotlin to version 2.1.20 2025-03-26 13:36:55 -07:00
8274798be5
Remove unused warnings 2025-03-19 22:16:41 -07:00
3a767ddcb2
Fix templates indentation 2025-03-19 21:54:15 -07:00
4961829fcd
Minor cleanups 2025-03-19 02:19:38 -07:00
da20cf6fa1
Set release to version 17
Update plugins to current versions
2025-03-19 02:13:00 -07:00
14d38fa0da
Fix Maven POM location and URL 2025-03-19 01:45:05 -07:00
0857cb00a6
Update Unit test rules syntax 2025-03-19 01:30:31 -07:00
1694e6f665
Update compile options to new syntax 2025-03-19 01:29:56 -07:00
028e173274
JDK 24 2025-03-19 01:28:03 -07:00
f8d708ffc8
Bump JUnit to version 5.12.1 2025-03-19 01:27:31 -07:00
c9d9e4695c
Bump Kotlin to version 2.1.10 2025-03-19 01:26:45 -07:00
b235ad4240
Updated extensions
Bump Exec to version 1.0.3
Bump Jacoco Report to version 0.9.9
Bump PMD to version 1.1.6
2025-03-19 01:25:59 -07:00
5b5bd56077
Bump Gradle to version 8.13 2025-03-19 01:25:49 -07:00
050fd5d3a6
Bump bld to version 2.2.1 2025-03-19 01:22:40 -07:00
e6316c70a2
Added javac option to explicitly request annotation processing, as required by Java 23 2024-10-01 15:16:16 -07:00
7f2141044f
Updated dependencies
Bumped JUnit to version 5.11.1
Bumped Kapt to version 1.9.24
Bumped PMD extension to version 1.1.6
Bumped Gradle to version 8.10.2
2024-10-01 15:10:51 -07:00
8ee5ac7867
Minor cleanups 2024-09-21 13:22:11 -07:00
9d67f126b0
Fixed CircleCI OpenJDK images aliases 2024-09-09 11:57:38 -07:00
3b18ff1612
Updated dependencies
Bumped Gradle to version 8.10.1
Bumped Kotlin to version 2.0.20
Bumped bld to version 2.1.0
2024-09-09 11:49:35 -07:00
94254cd590
Bumped Kotlin to version 1.9.24 2024-05-09 23:08:06 -07:00
6f738cee9e
Bumped Mustache Compiler to version 0.9.13 2024-05-03 19:18:05 -07:00
bf75fb0faa
Bumped bld to version 1.9.1 2024-05-03 19:17:41 -07:00
c918b9ffa1
Changes CircleCI pipeline to use Java 17 and 21 (LTS) 2024-04-29 19:06:20 -07:00
0c10b9aeba
Updated examples to use SNAPSHOT 2024-04-29 19:06:20 -07:00
47ffb6e12b
Load template resources from JAR manually. Close #8 2024-04-29 19:05:57 -07:00
d11420dae3
Bumped Mustache Compiler to version 0.9.12 2024-04-29 18:26:09 -07:00
6e4307cb61
Updated copyright 2024-04-29 15:09:44 -07:00
02ee7eaf8b
Bumped Gradle to version 8.7 2024-04-29 15:08:49 -07:00
01f543ba8d
Bumped Kotlin to version 1.9.23 2024-04-29 14:32:04 -07:00
1b153851fc
Bumped JaCoCo extension to version 0.9.5 2024-04-29 14:16:26 -07:00
b84ab29602
Bumped Exec extension to version 1.0.0 2024-04-29 14:12:09 -07:00
f71bc5c8ba
Bumped PMD extension version to 0.9.9 2024-04-29 10:43:21 -07:00
81d415fb8a
Bumped worflow actiosn to the latest versions. 2024-04-29 10:41:29 -07:00
d62f8b591c Bumped bld to 1.9.0 2024-02-26 17:48:47 -08:00
86c0dff26e Added contributing section 2024-01-31 17:26:30 -08:00
119818193d Bumped bld to 1.8.0 2024-01-31 15:43:42 -08:00
fd5746f007 Updated dependencies 2023-11-10 23:26:41 -08:00
1f9664cb7f Remove link to java.time example. 2023-11-10 23:24:10 -08:00
4a6fa98d46 Updated dependencies 2023-10-20 16:32:36 -07:00
65d2eb0c7c Added Generated Version bld extension reference 2023-10-02 14:11:42 -07:00
24b047ae1b Version 1.2.1 2023-10-01 20:26:21 -07:00
1f1ece0956 Added bld to examples script 2023-10-01 18:28:20 -07:00
dc27cb86e5 Cleanup before new release 2023-09-29 16:18:50 -07:00
c5a6e2220c Updated all dependencies 2023-09-29 15:31:33 -07:00
84d3f69215 Added pandoc command to build file 2023-08-27 13:11:54 -07:00
8dae1dcbaf Fixed root POM generation 2023-08-20 16:25:31 -07:00
d08cf8d72b Added more tests 2023-08-20 14:13:57 -07:00
9ddf470e40 Removed redundant variable types 2023-08-20 13:43:57 -07:00
65fb61daf4 Added more tests 2023-08-20 13:35:52 -07:00
5cf167e7bf Upgraded to bld 1.7.2 2023-08-20 11:07:22 -07:00
a8d3d7a4ea Added saving source files to build/generated directory 2023-08-20 11:06:51 -07:00
878e1033f1 Cleaned up README 2023-08-20 11:05:54 -07:00
b18a9f641c Cleaned up PMD config 2023-08-19 11:56:23 -07:00
6451d45e7c Cleaned up tests 2023-08-19 11:48:08 -07:00
35eb6d4a77 Added bld installation instructions 2023-08-19 11:31:10 -07:00
4440fe0373 Added test for bld example 2023-08-19 11:04:13 -07:00
d6f25e6b48 Update docs 2023-08-19 01:11:59 -07:00
747010a193 Fix snapshot version number 2023-08-19 01:10:28 -07:00
c8aee7158c Fix snapshots badge 2023-08-19 00:55:47 -07:00
11a47e7e0b Add bld example 2023-08-18 23:52:02 -07:00
0ec7a6ee13 Update appveyor script 2023-08-18 19:57:18 -07:00
19e579d4a5 Merge branch '1.2.1-dev' 2023-08-18 19:28:30 -07:00
d8093f7253 Move tests to JUnit 2023-08-18 18:36:01 -07:00
4858c58978 Move from Gradle to bld. Close #7 2023-08-18 18:12:44 -07:00
4e096b3dad Fixed Jacoco reports generation 2023-07-17 13:13:06 -07:00
ad17e7edef Reverted to JDK >= 17 2023-07-14 20:31:30 -07:00
01b16c211d Updated CI/CD workflows 2023-07-14 20:26:21 -07:00
d7d641f207 Disabled SpotBugs for now.
Updated dependencies and copyright
2023-07-14 19:32:41 -07:00
2ce19a215f Updated dependencies 2022-04-28 21:55:25 -07:00
e01ea7882f Updated dependencies and copyright. 2022-01-03 14:35:44 -08:00
8c5f4a72fa CLeaned up examples. 2021-06-18 19:41:38 -07:00
5a422fe502 Removed checkstyle, using IDEA default code format. 2021-06-18 18:08:32 -07:00
5dce160cf1 Changed dprecated annotationProcessorGeneratedSourcesDirectory to generatedSourceOutputDirectory. 2021-06-18 17:53:31 -07:00
b224e1fc99 Upgraded to Gradle 7.1. 2021-06-18 17:20:30 -07:00
af3de2cc74 Added Github workflow martix for JDK 1.8, 11 & 15. 2021-05-31 11:37:20 -07:00
cae74c95b3 Updated PMD rules. 2021-05-29 21:56:43 -07:00
94e42972e0 Added Visual Studio 2019 image and branch to Appveyor. 2021-05-21 15:01:00 -07:00
06d062ae0c Moved to JDK 11 and 15. 2021-05-21 00:03:55 -07:00
a755e7d11e Removed TravisCI. 2021-05-20 21:50:11 -07:00
ba0b56f9e2 Moved Sonarqube to GitHub action. 2021-05-19 22:56:46 -07:00
79945ad2df Upgraded to Gradle 7.0.1 2021-05-11 20:50:41 -07:00
0809e69dfc Added support for snapshot. 2021-05-02 21:57:42 -07:00
00c699972a Updated dependencies & copyright. 2021-04-29 06:55:49 -07:00
817b2e0eeb Moved from JCenter to Maven Central. 2021-03-22 11:42:05 -07:00
462bfe3cc5 Updated dependencies. 2020-06-30 19:07:55 -07:00
1b706aedc5 Removed Kobalt. 2020-06-30 18:23:10 -07:00
f8101bb2e9 Updated dependencies and copyright. 2020-03-17 22:39:29 -07:00
6d48ec6203 Cleanup. 2019-07-30 21:16:53 -07:00
ee1d28a7b9 Switched to com.mebigfatguy.sb-contrib. 2019-07-29 11:55:40 -07:00
1580bfca98 Removed Java 12 syntax. 2019-07-28 21:37:40 -07:00
14a72542ff Updated compiler option syntax. 2019-07-27 14:11:43 -07:00
ae44b36283 Moved to Kotlin 1.3.41. Fixes #1 2019-07-26 21:17:49 -07:00
961a9535de Changed dist to trusty. 2019-07-26 16:07:03 -07:00
5146d46eab Semver-Gradle 1.0.4 update. 2019-07-26 16:04:19 -07:00
cb07b2e21b Updated Java 12 syntax. 2019-07-26 16:01:13 -07:00
3bd333b603 Kobalt 1.0.125 update. 2019-07-26 15:59:14 -07:00
0e03c6c1c2 Gradle 5.5.1 update. 2019-07-26 15:58:51 -07:00
84054cb398 Cleanup. 2019-05-27 11:26:50 -07:00
fb593a0a1a Added JDK 12 and Gradle 5.4.1 instructions. Closes #6 2019-05-26 23:47:23 -07:00
0ca574695f 1.2.0 release update. 2019-05-25 21:03:15 -07:00
1367ae5ec0 implementation instead of compileOnly in Gradle/Kotlin too. 2019-05-25 15:34:04 -07:00
66a0fec4e3 IDEA misc updates. 2019-05-25 15:19:43 -07:00
63f9ae8a03 Added template location to log. 2019-05-25 14:42:51 -07:00
c920adf2c5 Added test example. 2019-05-25 14:30:33 -07:00
2102691d37 Changed compileOnly to implementation. 2019-05-25 14:30:13 -07:00
90df90e543 Updated examples. 2019-05-25 13:47:21 -07:00
4e029507be Cleanup tests. 2019-05-25 13:46:59 -07:00
8238517b0d Renamed getPropertiesFile() to getLocalFile() and applied to template too. 2019-05-25 13:46:35 -07:00
c2f20f5084 Updated dependencies. 2019-05-25 11:19:15 -07:00
d689ade3a1 Replaced getProjectDir() with getPropertiesFile(). 2019-05-25 10:55:34 -07:00
486ed17317 Fix for Appveyor. 2019-04-27 21:12:06 -07:00
72a955217e Improved if statement logic (PMD). 2019-04-27 20:21:11 -07:00
f801ce03fe Added new example with custom properties and template. 2019-04-27 20:10:50 -07:00
0fb4324d8d Version 1.1.3 2019-04-23 15:47:17 -07:00
cd10d5325a Cleanup. 2019-04-23 15:47:03 -07:00
06263ee003 Changed getEnv() to getProjectDir() 2019-04-19 13:55:21 -07:00
7f838e9863 Cleanup. 2019-04-19 13:01:52 -07:00
b83a17e9c8 Added semver.project.dir processor argument. Closes #2 2019-04-19 12:04:06 -07:00
ed35e70af4 Cleanup. 2019-04-18 23:42:26 -07:00
7f172d0b90 Added semver.properties processor argument. 2019-04-18 23:42:04 -07:00
37d33f1ea3 Cleanup. 2019-04-18 23:39:59 -07:00
c0be96dd24 Tied exec:java to verify phase. 2019-04-17 14:49:36 -07:00
a9bcd354ed Checkstyle fixes. 2019-04-17 00:20:44 -07:00
3c503c7a06 Testing. 2019-04-16 14:27:18 -07:00
3cb4b20a3d Cleanup 2019-04-16 14:26:51 -07:00
bae6497368 Check that int are positive. 2019-04-16 14:26:33 -07:00
4a1f9e45f5 Verson 1.0.1 2019-04-16 11:58:13 -07:00
f29dddf82c Added checkstyle. 2019-04-16 11:55:18 -07:00
919661095c Updated wrappers and dependencies. 2019-04-16 11:55:07 -07:00
38fd8d6bda Added gradle.properties 2019-04-16 11:47:29 -07:00
5f431e0725 Added checkstyle. 2019-04-16 11:20:33 -07:00
eba4b97704 Cleanup. 2019-04-15 23:35:13 -07:00
27c622c7ba Version 1.1.1 2019-04-15 23:34:55 -07:00
73f3455dc6 Version 1.1 2019-04-15 21:28:05 -07:00
927919b18b Added maven project. 2019-04-15 21:27:51 -07:00
b175ad4f4c Added table of contents.
Added Maven example.
Added Kotlin's kapt limitations, etc.
2019-04-15 21:27:18 -07:00
fbdd6661ea Cleanup/ 2019-04-15 21:24:20 -07:00
59c28f1b50 Removed invalid link. 2019-04-15 03:13:34 -07:00
528f9c9a54 Added Kotlin/Gradle install instruction.
Added table of contents.
2019-04-15 03:09:46 -07:00
5f13ef37b2 Added line separator to log(). 2019-04-15 03:08:53 -07:00
feb33d7e2d Added constants tests. 2019-04-15 00:19:14 -07:00
6455662d23 The version is now calculated internally. 2019-04-14 22:25:01 -07:00
909b03e861 Updated scripts. 2019-04-08 09:56:24 -07:00
9cc9c66b29 Re-enabled SpotBugs. 2019-04-08 09:55:34 -07:00
45e99ea6a7 Added project name. 2019-04-05 23:50:31 -07:00
9794fab00f Updated shell scripts. 2019-04-05 23:49:50 -07:00
730deed7c0 Added jacoco reports to sonarqube. 2019-04-03 23:34:48 -07:00
4f66ef8024 Added tests for private methods. 2019-04-03 02:20:41 -07:00
f4169e56ed Trim int properties. 2019-04-03 02:19:20 -07:00
b733cd89e2 Removed kobalt, added jdk version. 2019-04-02 23:22:21 -07:00
9e63b00c71 Removed kobalt. 2019-04-02 23:18:35 -07:00
9f3b488822 Added more coverage tests. 2019-04-02 23:00:36 -07:00
4df1dd3ddd Updated shell scripts. 2019-04-02 23:00:16 -07:00
931d08be63 Added sonarcloud with jacoco. 2019-04-02 22:59:47 -07:00
7c8e348b27 Removed kobalt. 2019-04-02 22:59:09 -07:00
b1602c78a9 Added annotation with template example. 2019-04-01 19:35:18 -07:00
d74d2b5fdf Added sonarcloud badge. 2019-04-01 19:34:35 -07:00
77a1b1cf14 Improved templates. 2019-04-01 19:31:31 -07:00
eb907c33fa Using gradlew to test examples. 2019-04-01 19:30:53 -07:00
5580ea6687 Fixed template name. 2019-04-01 19:29:05 -07:00
f1d712816e Added sonarcloud config. 2019-04-01 19:28:38 -07:00
e51dd093d9 Combined redundant if statements. 2019-04-01 15:22:46 -07:00
e35276ddc8 Removed unnecessary throw in disabled constructor. 2019-04-01 15:22:08 -07:00
1f8388ca4f Fixed javadoc. 2019-04-01 12:15:01 -07:00
55d2e9e0d7 Getting ready for 1.2.0 release. 2019-04-01 01:58:37 -07:00
45a90d1353 Added separator, pre-release and metada prefixes. 2019-04-01 01:51:18 -07:00
e8c00828f3 IDEA 2019.1 update. 2019-03-31 13:38:03 -07:00
effae8dd55 Updated copyright. 2019-03-31 13:37:35 -07:00
45e1282cec Updated pandoc. 2019-03-30 21:59:27 -07:00
5adaec419e Updated README. 2019-03-30 21:58:07 -07:00
3074f1eb67 Generated version. 2019-03-30 21:21:53 -07:00
6621872edc Version 1.1.1 2019-03-30 21:17:25 -07:00
be84f36395 Updated version to 1.1.1 2019-03-30 21:02:11 -07:00
6f2ce396f3 Spotbugs cleanup. 2019-03-30 20:32:42 -07:00
6fcf7daa1c Syntax cleanup. 2019-03-30 20:31:36 -07:00
f8a8e5917b Updated wrappers. 2019-03-30 20:26:30 -07:00
6800d362a7 Gradle syntax update. 2019-03-30 17:33:50 -07:00
421f8deff5 Version file is now written directly into Kotlin's generated source target directory. 2019-03-30 17:33:16 -07:00
42ce43ad46 Copyright update. 2019-03-30 17:30:08 -07:00
6c3afa54e0 Kotlin version update. 2019-03-30 17:28:32 -07:00
d60bf6345e IDEA update. 2019-03-30 17:27:44 -07:00
635351c955 Fixed warning. 2018-11-04 10:41:50 -08:00
077b6073b4 Fixed kotlin example location. 2018-11-04 01:27:50 -08:00
887280a5fc Fixed bintray signing. 2018-11-04 01:27:31 -08:00
197 changed files with 5188 additions and 2666 deletions

View file

@ -1,75 +1,42 @@
defaults: &defaults version: 2.1
working_directory: ~/repo
docker:
- image: circleci/openjdk:8-jdk
environment:
JVM_OPTS: -Xmx3200m
TERM: dumb
version: 2.0 commands:
build_and_test:
parameters:
reports-dir:
type: string
default: "build/reports/test_results"
steps:
- checkout
- run:
name: Download dependencies
command: ./bld download
- run:
name: Compile source
command: ./bld compile
- run:
name: Run tests
command: ./bld jacoco -reports-dir=<< parameters.reports-dir >>
- store_test_results:
path: << parameters.reports-dir >>
- store_artifacts:
path: build/reports/jacoco/test/html
jobs: jobs:
build_gradle: bld_jdk17:
<<: *defaults docker:
- image: cimg/openjdk:17.0
steps: steps:
- checkout - build_and_test
- restore_cache:
keys:
- gradle-dependencies-{{ checksum "build.gradle" }}
# fallback to using the latest cache if no exact match is found
- gradle-dependencies-
- run:
name: Gradle Dependencies
command: ./gradlew dependencies
- save_cache:
paths: ~/.m2
key: gradle-dependencies-{{ checksum "build.gradle" }}
- run:
name: Run All Checks
command: ./gradlew check
- store_artifacts:
path: build/reports/
destination: reports
- store_test_results:
path: build/reports/
build_kobalt:
<<: *defaults
bld_jdk21:
docker:
- image: cimg/openjdk:21.0
steps: steps:
- checkout - build_and_test
- restore_cache:
keys:
- kobalt-dependencies-{{ checksum "kobalt/src/Build.kt" }}
# fallback to using the latest cache if no exact match is found
- kobalt-dependencies-
- run:
name: Check Versions
command: ./kobaltw checkVersions
- save_cache:
paths: ~/.kobalt
key: kobalt-dependencies-{{ checksum "kobalt/src/Build.kt" }}
- run:
name: Assemble & Test
command: ./kobaltw assemble test
- store_artifacts:
path: kobaltBuild/test-output/
destination: test-output
- store_test_results:
path: kobaltBuild/test-output/
workflows: workflows:
version: 2 bld:
build_gradle_and_kobalt:
jobs: jobs:
- build_gradle - bld_jdk17
- build_kobalt - bld_jdk21

View file

@ -1,2 +1,2 @@
[*] [*]
insert_final_newline=true insert_final_newline = true

76
.github/workflows/bld.yml vendored Normal file
View file

@ -0,0 +1,76 @@
name: bld-ci
on: [push, pull_request, workflow_dispatch]
jobs:
build-bld-project:
env:
COVERAGE_JDK: "17"
strategy:
matrix:
java-version: [17, 21, 24]
os: [ ubuntu-latest, windows-latest, macos-latest ]
runs-on: ${{ matrix.os }}
steps:
- name: Checkout source repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up JDK ${{ matrix.java-version }}
uses: actions/setup-java@v4
with:
distribution: "zulu"
java-version: ${{ matrix.java-version }}
- name: Download dependencies [bld example]
working-directory: examples/java/bld
run: ./bld download
- name: Compile and run [bld example]
working-directory: examples/java/bld
run: |
./bld compile
./bld run
./bld run-example
- name: Run example [gradle java examples]
working-directory: examples/java/gradle
run: |
./gradlew run
./gradlew runExample
- name: Run example [gradle kotlin examples]
working-directory: examples/kotlin
run: |
./gradlew run
./gradlew runExample
- name: Download dependencies
run: ./bld download
- name: Compile source
run: ./bld compile
- name: Run tests
run: ./bld jacoco
- name: Remove pom.xml
if: success() && matrix.java-version == env.COVERAGE_JDK && matrix.os == 'ubuntu-latest'
run: rm -rf pom.xml
- name: SonarCloud Scan
uses: sonarsource/sonarcloud-github-action@master
if: success() && matrix.java-version == env.COVERAGE_JDK && matrix.os == 'ubuntu-latest'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
- name: Upload coverage reports to Codecov
uses: codecov/codecov-action@v3
if: success() && matrix.java-version == env.COVERAGE_JDK && matrix.os == 'ubuntu-latest'
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}

View file

@ -0,0 +1 @@
future-release=1.2.1

104
.gitignore vendored
View file

@ -1,48 +1,58 @@
!.vscode/extensions.json
!.vscode/launch.json
!.vscode/settings.json
!.vscode/tasks.json
.classpath
.DS_Store
.gradle .gradle
.kobalt .DS_Store
.nb-gradle build
.project lib/bld/**
.settings !lib/bld/bld-wrapper.properties
.vscode/* !lib/bld/bld-wrapper.jar
*.code-workspace lib/compile/
*.iws lib/runtime/
*.sublime-* lib/standalone/
**/.idea/**/dataSources.ids lib/test/
**/.idea/**/dataSources.local.xml
**/.idea/**/dataSources/ # IDEA ignores
**/.idea/**/dbnavigator.xml
**/.idea/**/dictionaries # User-specific
**/.idea/**/dynamic.xml .idea/**/workspace.xml
**/.idea/**/gradle.xml .idea/**/tasks.xml
**/.idea/**/libraries .idea/**/usage.statistics.xml
**/.idea/**/shelf .idea/**/dictionaries
**/.idea/**/sqlDataSources.xml .idea/**/shelf
**/.idea/**/tasks.xml
**/.idea/**/uiDesigner.xml # AWS User-specific
**/.idea/**/usage.statistics.xml .idea/**/aws.xml
**/.idea/**/workspace.xml
**/*.class # Generated files
/bin .idea/**/contentModel.xml
/build
/deploy # Sensitive or high-churn files
/dist .idea/**/dataSources/
/gen .idea/**/dataSources.ids
/gradle.properties .idea/**/dataSources.local.xml
/lib/kotlin* .idea/**/sqlDataSources.xml
/libs .idea/**/dynamic.xml
/local.properties .idea/**/uiDesigner.xml
/out .idea/**/dbnavigator.xml
/proguard-project.txt
/project.properties # Gradle
/target .idea/**/gradle.xml
/test-output
ehthumbs.db # Mongo Explorer plugin
kobaltBuild .idea/**/mongoSettings.xml
kobaltw*-test
Thumbs.db # mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Cursive Clojure plugin
.idea/replstate.xml
# SonarLint plugin
.idea/sonarlint/
# Editor-based Rest Client
.idea/httpRequests
local.properties
target

28
.idea/app.iml generated Normal file
View file

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager">
<output url="file://$MODULE_DIR$/build/main" />
<output-test url="file://$MODULE_DIR$/build/test" />
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" relativeOutputPath="resources" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module-library" scope="RUNTIME">
<library>
<CLASSES>
<root url="file://$MODULE_DIR$/src/main/resources/templates" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="library" name="compile" level="project" />
<orderEntry type="library" scope="RUNTIME" name="runtime" level="project" />
<orderEntry type="library" scope="TEST" name="test" level="project" />
</component>
</module>

14
.idea/bld.iml generated Normal file
View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager">
<output url="file://$MODULE_DIR$/build/bld" />
<output-test url="file://$MODULE_DIR$/build/bld" />
<exclude-output />
<content url="file://$MODULE_DIR$/src/bld">
<sourceFolder url="file://$MODULE_DIR$/src/bld/java" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="bld" level="project" />
</component>
</module>

View file

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

View file

@ -1,5 +0,0 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="PREFERRED_PROJECT_CODE_STYLE" value="Erik's Code Style" />
</state>
</component>

10
.idea/compiler.xml generated
View file

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel>
<module name="example_annotationProcessor" target="1.8" />
<module name="example_main" target="1.8" />
<module name="example_test" target="1.8" />
</bytecodeTargetLevel>
</component>
</project>

6
.idea/copyright/BSD_3_Clause.xml generated Normal file
View file

@ -0,0 +1,6 @@
<component name="CopyrightManager">
<copyright>
<option name="notice" value="&amp;#36;file.fileName&#10;&#10;Copyright (c) 2016-&amp;#36;today.year, Erik C. Thauvin (erik@thauvin.net)&#10;All rights reserved.&#10;&#10;Redistribution and use in source and binary forms, with or without&#10;modification, are permitted provided that the following conditions are met:&#10;&#10; Redistributions of source code must retain the above copyright notice, this&#10; list of conditions and the following disclaimer.&#10;&#10; Redistributions in binary form must reproduce the above copyright notice,&#10; this list of conditions and the following disclaimer in the documentation&#10; and/or other materials provided with the distribution.&#10;&#10; Neither the name of this project nor the names of its contributors may be&#10; used to endorse or promote products derived from this software without&#10; specific prior written permission.&#10;&#10;THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot;&#10;AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE&#10;IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE&#10;DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE&#10;FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL&#10;DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR&#10;SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER&#10;CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,&#10;OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE&#10;OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." />
<option name="myName" value="BSD-3 Clause" />
</copyright>
</component>

3
.idea/copyright/profiles_settings.xml generated Normal file
View file

@ -0,0 +1,3 @@
<component name="CopyrightManager">
<settings default="BSD-3 Clause" />
</component>

View file

@ -1,53 +1,8 @@
<component name="InspectionProjectProfileManager"> <component name="InspectionProjectProfileManager">
<profile version="1.0"> <profile version="1.0">
<option name="myName" value="Project Default" /> <option name="myName" value="Project Default" />
<option name="myLocal" value="true" /> <inspection_tool class="JavadocDeclaration" enabled="true" level="WARNING" enabled_by_default="true">
<inspection_tool class="FieldMayBeFinal" enabled="true" level="WARNING" enabled_by_default="true" /> <option name="ADDITIONAL_TAGS" value="created" />
<inspection_tool class="JavaDoc" enabled="true" level="WARNING" enabled_by_default="true">
<option name="TOP_LEVEL_CLASS_OPTIONS">
<value>
<option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
<option name="REQUIRED_TAGS" value="" />
</value>
</option>
<option name="INNER_CLASS_OPTIONS">
<value>
<option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
<option name="REQUIRED_TAGS" value="" />
</value>
</option>
<option name="METHOD_OPTIONS">
<value>
<option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
<option name="REQUIRED_TAGS" value="@return@param@throws or @exception" />
</value>
</option>
<option name="FIELD_OPTIONS">
<value>
<option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
<option name="REQUIRED_TAGS" value="" />
</value>
</option>
<option name="IGNORE_DEPRECATED" value="false" />
<option name="IGNORE_JAVADOC_PERIOD" value="true" />
<option name="IGNORE_DUPLICATED_THROWS" value="false" />
<option name="IGNORE_POINT_TO_ITSELF" value="false" />
<option name="myAdditionalJavadocTags" value="created" />
</inspection_tool>
<inspection_tool class="LocalCanBeFinal" enabled="true" level="WARNING" enabled_by_default="true">
<option name="REPORT_VARIABLES" value="true" />
<option name="REPORT_PARAMETERS" value="false" />
<option name="REPORT_CATCH_PARAMETERS" value="false" />
</inspection_tool>
<inspection_tool class="LoggerInitializedWithForeignClass" enabled="false" level="WARNING" enabled_by_default="false">
<option name="loggerClassName" value="org.apache.log4j.Logger,org.slf4j.LoggerFactory,org.apache.commons.logging.LogFactory,java.util.logging.Logger" />
<option name="loggerFactoryMethodName" value="getLogger,getLogger,getLog,getLogger" />
</inspection_tool>
<inspection_tool class="UnnecessarySemicolon" enabled="false" level="WARNING" enabled_by_default="false" />
<inspection_tool class="WeakerAccess" enabled="true" level="WARNING" enabled_by_default="true">
<option name="SUGGEST_PACKAGE_LOCAL_FOR_MEMBERS" value="true" />
<option name="SUGGEST_PACKAGE_LOCAL_FOR_TOP_CLASSES" value="false" />
<option name="SUGGEST_PRIVATE_FOR_INNERS" value="false" />
</inspection_tool> </inspection_tool>
</profile> </profile>
</component> </component>

204
.idea/intellij-javadocs-4.0.1.xml generated Normal file
View file

@ -0,0 +1,204 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JavaDocConfiguration">
<GENERAL>
<MODE>UPDATE</MODE>
<OVERRIDDEN_METHODS>false</OVERRIDDEN_METHODS>
<SPLITTED_CLASS_NAME>true</SPLITTED_CLASS_NAME>
<LEVELS>
<LEVEL>FIELD</LEVEL>
<LEVEL>TYPE</LEVEL>
<LEVEL>METHOD</LEVEL>
</LEVELS>
<VISIBILITIES>
<VISIBILITY>DEFAULT</VISIBILITY>
<VISIBILITY>PUBLIC</VISIBILITY>
<VISIBILITY>PROTECTED</VISIBILITY>
</VISIBILITIES>
</GENERAL>
<TEMPLATES>
<CLASSES>
<CLASS>
<KEY>^.*(public|protected|private)*.+interface\s+\w+.*</KEY>
<VALUE>/**\n
* The interface ${name}.\n
&lt;#if element.typeParameters?has_content&gt; * \n
&lt;/#if&gt;
&lt;#list element.typeParameters as typeParameter&gt;
* @param &lt;${typeParameter.name}&gt; the type parameter\n
&lt;/#list&gt;
*/</VALUE>
</CLASS>
<CLASS>
<KEY>^.*(public|protected|private)*.+enum\s+\w+.*</KEY>
<VALUE>/**\n
* The enum ${name}.\n
*/</VALUE>
</CLASS>
<CLASS>
<KEY>^.*(public|protected|private)*.+class\s+\w+.*</KEY>
<VALUE>/**\n
* The type ${name}.\n
&lt;#if element.typeParameters?has_content&gt; * \n
&lt;/#if&gt;
&lt;#list element.typeParameters as typeParameter&gt;
* @param &lt;${typeParameter.name}&gt; the type parameter\n
&lt;/#list&gt;
*/</VALUE>
</CLASS>
<CLASS>
<KEY>.+</KEY>
<VALUE>/**\n
* The type ${name}.\n
*/</VALUE>
</CLASS>
</CLASSES>
<CONSTRUCTORS>
<CONSTRUCTOR>
<KEY>.+</KEY>
<VALUE>/**\n
* Instantiates a new ${name}.\n
&lt;#if element.parameterList.parameters?has_content&gt;
*\n
&lt;/#if&gt;
&lt;#list element.parameterList.parameters as parameter&gt;
* @param ${parameter.name} the ${paramNames[parameter.name]}\n
&lt;/#list&gt;
&lt;#if element.throwsList.referenceElements?has_content&gt;
*\n
&lt;/#if&gt;
&lt;#list element.throwsList.referenceElements as exception&gt;
* @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n
&lt;/#list&gt;
*/</VALUE>
</CONSTRUCTOR>
</CONSTRUCTORS>
<METHODS>
<METHOD>
<KEY>^.*(public|protected|private)*\s*.*(\w(\s*&lt;.+&gt;)*)+\s+get\w+\s*\(.*\).+</KEY>
<VALUE>/**\n
* Gets ${partName}.\n
&lt;#if element.typeParameters?has_content&gt; * \n
&lt;/#if&gt;
&lt;#list element.typeParameters as typeParameter&gt;
* @param &lt;${typeParameter.name}&gt; the type parameter\n
&lt;/#list&gt;
&lt;#if element.parameterList.parameters?has_content&gt;
*\n
&lt;/#if&gt;
&lt;#list element.parameterList.parameters as parameter&gt;
* @param ${parameter.name} the ${paramNames[parameter.name]}\n
&lt;/#list&gt;
&lt;#if isNotVoid&gt;
*\n
* @return the ${partName}\n
&lt;/#if&gt;
&lt;#if element.throwsList.referenceElements?has_content&gt;
*\n
&lt;/#if&gt;
&lt;#list element.throwsList.referenceElements as exception&gt;
* @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n
&lt;/#list&gt;
*/</VALUE>
</METHOD>
<METHOD>
<KEY>^.*(public|protected|private)*\s*.*(void|\w(\s*&lt;.+&gt;)*)+\s+set\w+\s*\(.*\).+</KEY>
<VALUE>/**\n
* Sets ${partName}.\n
&lt;#if element.typeParameters?has_content&gt; * \n
&lt;/#if&gt;
&lt;#list element.typeParameters as typeParameter&gt;
* @param &lt;${typeParameter.name}&gt; the type parameter\n
&lt;/#list&gt;
&lt;#if element.parameterList.parameters?has_content&gt;
*\n
&lt;/#if&gt;
&lt;#list element.parameterList.parameters as parameter&gt;
* @param ${parameter.name} the ${paramNames[parameter.name]}\n
&lt;/#list&gt;
&lt;#if isNotVoid&gt;
*\n
* @return the ${partName}\n
&lt;/#if&gt;
&lt;#if element.throwsList.referenceElements?has_content&gt;
*\n
&lt;/#if&gt;
&lt;#list element.throwsList.referenceElements as exception&gt;
* @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n
&lt;/#list&gt;
*/</VALUE>
</METHOD>
<METHOD>
<KEY>^.*((public\s+static)|(static\s+public))\s+void\s+main\s*\(\s*String\s*(\[\s*\]|\.\.\.)\s+\w+\s*\).+</KEY>
<VALUE>/**\n
* The entry point of application.\n
&lt;#if element.parameterList.parameters?has_content&gt;
*\n
&lt;/#if&gt;
* @param ${element.parameterList.parameters[0].name} the input arguments\n
&lt;#if element.throwsList.referenceElements?has_content&gt;
*\n
&lt;/#if&gt;
&lt;#list element.throwsList.referenceElements as exception&gt;
* @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n
&lt;/#list&gt;
*/</VALUE>
</METHOD>
<METHOD>
<KEY>.+</KEY>
<VALUE>/**\n
* ${name}&lt;#if isNotVoid&gt; ${return}&lt;/#if&gt;.\n
&lt;#if element.typeParameters?has_content&gt; * \n
&lt;/#if&gt;
&lt;#list element.typeParameters as typeParameter&gt;
* @param &lt;${typeParameter.name}&gt; the type parameter\n
&lt;/#list&gt;
&lt;#if element.parameterList.parameters?has_content&gt;
*\n
&lt;/#if&gt;
&lt;#list element.parameterList.parameters as parameter&gt;
* @param ${parameter.name} the ${paramNames[parameter.name]}\n
&lt;/#list&gt;
&lt;#if isNotVoid&gt;
*\n
* @return the ${return}\n
&lt;/#if&gt;
&lt;#if element.throwsList.referenceElements?has_content&gt;
*\n
&lt;/#if&gt;
&lt;#list element.throwsList.referenceElements as exception&gt;
* @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n
&lt;/#list&gt;
*/</VALUE>
</METHOD>
</METHODS>
<FIELDS>
<FIELD>
<KEY>^.*(public|protected|private)*.+static.*(\w\s\w)+.+</KEY>
<VALUE>/**\n
* The constant ${element.getName()}.\n
*/</VALUE>
</FIELD>
<FIELD>
<KEY>^.*(public|protected|private)*.*(\w\s\w)+.+</KEY>
<VALUE>/**\n
&lt;#if element.parent.isInterface()&gt;
* The constant ${element.getName()}.\n
&lt;#else&gt;
* The ${name}.\n
&lt;/#if&gt; */</VALUE>
</FIELD>
<FIELD>
<KEY>.+</KEY>
<VALUE>/**\n
&lt;#if element.parent.isEnum()&gt;
*${name} ${typeName}.\n
&lt;#else&gt;
* The ${name}.\n
&lt;/#if&gt;*/</VALUE>
</FIELD>
</FIELDS>
</TEMPLATES>
</component>
</project>

7
.idea/kotlinc.xml generated
View file

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Kotlin2JsCompilerArguments">
<option name="sourceMapEmbedSources" />
<option name="sourceMapPrefix" />
</component>
</project>

18
.idea/libraries/bld.xml generated Normal file
View file

@ -0,0 +1,18 @@
<component name="libraryTable">
<library name="bld">
<CLASSES>
<root url="file://$PROJECT_DIR$/lib/bld" />
<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-2.2.1-sources.jar!/" />
</SOURCES>
<excluded>
<root url="jar://$PROJECT_DIR$/lib/bld/bld-wrapper.jar!/" />
</excluded>
<jarDirectory url="file://$PROJECT_DIR$/lib/bld" recursive="false" />
<jarDirectory url="file://$PROJECT_DIR$/lib/bld" recursive="false" type="SOURCES" />
</library>
</component>

17
.idea/libraries/compile.xml generated Normal file
View file

@ -0,0 +1,17 @@
<component name="libraryTable">
<library name="compile">
<CLASSES>
<root url="file://$PROJECT_DIR$/lib/compile" />
<root url="file://$PROJECT_DIR$/lib/provided" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="file://$PROJECT_DIR$/lib/compile" />
<root url="file://$PROJECT_DIR$/lib/provided" />
</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/provided" recursive="true" />
<jarDirectory url="file://$PROJECT_DIR$/lib/provided" recursive="true" type="SOURCES" />
</library>
</component>

14
.idea/libraries/runtime.xml generated Normal file
View file

@ -0,0 +1,14 @@
<component name="libraryTable">
<library name="runtime">
<CLASSES>
<root url="file://$PROJECT_DIR$/lib/runtime" />
<root url="file://$PROJECT_DIR$/src/main/resources" />
</CLASSES>
<JAVADOC />
<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" />
</library>
</component>

18
.idea/libraries/test.xml generated Normal file
View file

@ -0,0 +1,18 @@
<component name="libraryTable">
<library name="test">
<CLASSES>
<root url="file://$PROJECT_DIR$/lib/test" />
<root url="file://$PROJECT_DIR$/lib/provided" />
<root url="file://$PROJECT_DIR$/src/test/resources" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="file://$PROJECT_DIR$/lib/test" />
<root url="file://$PROJECT_DIR$/lib/provided" />
</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/provided" recursive="true" />
<jarDirectory url="file://$PROJECT_DIR$/lib/provided" recursive="true" type="SOURCES" />
</library>
</component>

16
.idea/misc.xml generated
View file

@ -1,10 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" /> <component name="EntryPointsManager">
<component name="JavaScriptSettings"> <pattern value="net.thauvin.erik.semver.SemverBuild" method="jacoco" />
<option name="languageLevel" value="ES6" /> <pattern value="net.thauvin.erik.semver.SemverBuild" method="pandoc" />
<pattern value="net.thauvin.erik.semver.SemverBuild" method="pmd" />
<pattern value="net.thauvin.erik.semver.SemverBuild" method="pmdCli" />
<pattern value="net.thauvin.erik.semver.SemverBuild" />
</component> </component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="false" project-jdk-name="1.8" project-jdk-type="JavaSDK"> <component name="PDMPlugin">
<output url="file://$PROJECT_DIR$/out" /> <option name="skipTestSources" value="false" />
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" project-jdk-name="17" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build" />
</component> </component>
</project> </project>

9
.idea/modules.xml generated Normal file
View file

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/app.iml" filepath="$PROJECT_DIR$/.idea/app.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/bld.iml" filepath="$PROJECT_DIR$/.idea/bld.iml" />
</modules>
</component>
</project>

View file

@ -1,27 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module version="4">
<component name="FacetManager">
<facet type="kotlin-language" name="Kotlin">
<configuration version="3" platform="JVM 1.6" useProjectSettings="false">
<compilerSettings />
<compilerArguments>
<option name="destination" value="$MODULE_DIR$/../../examples/kotlin/build/classes/kotlin/main" />
<option name="classpath" value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.3.0/a134b0cfe9bb44f98b0b3e889cda07923eea9428/kotlin-stdlib-1.3.0.jar;K:/maven/repository/net/thauvin/erik/semver/1.1.0-beta/semver-1.1.0-beta.jar;C:/Users/erik/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-common/1.3.0/84a2e0288dc17cd64d692eb1e5e0de8cd5ff0846/kotlin-stdlib-common-1.3.0.jar;C:/Users/erik/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar;C:/Users/erik/.gradle/caches/modules-2/files-2.1/com.github.spullara.mustache.java/compiler/0.9.5/2d13ba8f4e9e578ef3636c064dae4ed675c8de7d/compiler-0.9.5.jar" />
<option name="noStdlib" value="true" />
<option name="noReflect" value="true" />
<option name="moduleName" value="examples-kotlin" />
<option name="addCompilerBuiltIns" value="true" />
<option name="loadBuiltInsFromDependencies" value="true" />
<option name="languageVersion" value="1.3" />
<option name="apiVersion" value="1.3" />
<option name="pluginOptions">
<array />
</option>
<option name="pluginClasspaths">
<array />
</option>
</compilerArguments>
</configuration>
</facet>
</component>
</module>

View file

@ -1,34 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module version="4">
<component name="FacetManager">
<facet type="kotlin-language" name="Kotlin">
<configuration version="3" platform="JVM 1.6" useProjectSettings="false">
<compilerSettings />
<compilerArguments>
<option name="destination" value="$MODULE_DIR$/../../examples/kotlin/build/classes/kotlin/test" />
<option name="classpath" value="$MODULE_DIR$/../../examples/kotlin/build/classes/java/main;K:/java/semver/examples/kotlin/build/classes/kotlin/main;K:/java/semver/examples/kotlin/build/tmp/kapt3/classes/main;C:/Users/erik/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.3.0/a134b0cfe9bb44f98b0b3e889cda07923eea9428/kotlin-stdlib-1.3.0.jar;C:/Users/erik/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-common/1.3.0/84a2e0288dc17cd64d692eb1e5e0de8cd5ff0846/kotlin-stdlib-common-1.3.0.jar;C:/Users/erik/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar" />
<option name="noStdlib" value="true" />
<option name="noReflect" value="true" />
<option name="moduleName" value="examples-kotlin" />
<option name="addCompilerBuiltIns" value="true" />
<option name="loadBuiltInsFromDependencies" value="true" />
<option name="friendPaths">
<array>
<option value="$MODULE_DIR$/../../examples/kotlin/build/tmp/kapt3/classes/main" />
<option value="$MODULE_DIR$/../../examples/kotlin/build/classes/java/main" />
<option value="$MODULE_DIR$/../../examples/kotlin/build/classes/kotlin/main" />
</array>
</option>
<option name="languageVersion" value="1.3" />
<option name="apiVersion" value="1.3" />
<option name="pluginOptions">
<array />
</option>
<option name="pluginClasspaths">
<array />
</option>
</compilerArguments>
</configuration>
</facet>
</component>
</module>

13
.idea/runConfigurations/Run Tests.xml generated Normal file
View file

@ -0,0 +1,13 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Run Tests" type="JUnit" factoryName="JUnit">
<module name="app" />
<option name="PACKAGE_NAME" value="moog" />
<option name="MAIN_CLASS_NAME" value="net.thauvin.erik" />
<option name="METHOD_NAME" value="" />
<option name="TEST_OBJECT" value="directory" />
<dir value="$PROJECT_DIR$/src/test/java" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>

2
.idea/semver.iml generated
View file

@ -1,2 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4" />

2
.idea/vcs.xml generated
View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="VcsDirectoryMappings"> <component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" /> <mapping directory="" vcs="Git" />
</component> </component>
</project> </project>

View file

@ -1,7 +0,0 @@
language: java
jdk:
- oraclejdk8
before_install:
- chmod +x gradlew

79
CHANGELOG.md Normal file
View file

@ -0,0 +1,79 @@
# Changelog
## [1.2.1](https://github.com/ethauvin/semver/tree/1.2.1) (2023-10-01)
[Full Changelog](https://github.com/ethauvin/semver/compare/1.2.0...1.2.1)
**Implemented enhancements:**
- Move from Gradle to bld [\#7](https://github.com/ethauvin/semver/issues/7)
**Fixed bugs:**
- NPE with Java 12 and Kotlin 1.3.30 [\#1](https://github.com/ethauvin/semver/issues/1)
**Closed issues:**
- Under Java 12 and Gradle 5.4.1 the properties file is not found. [\#6](https://github.com/ethauvin/semver/issues/6)
## [1.2.0](https://github.com/ethauvin/semver/tree/1.2.0) (2019-05-25)
[Full Changelog](https://github.com/ethauvin/semver/compare/1.1.1...1.2.0)
**Implemented enhancements:**
- Calculate the version internally. [\#4](https://github.com/ethauvin/semver/issues/4)
- Attempt to compile non-existent Java source in Gradle project using Kapt [\#3](https://github.com/ethauvin/semver/issues/3)
- kapt and Kotlin 1.3.30 require kapt.use.worker.api=true [\#2](https://github.com/ethauvin/semver/issues/2)
**Fixed bugs:**
- Default template is not found in 1.1.1 [\#5](https://github.com/ethauvin/semver/issues/5)
## [1.1.1](https://github.com/ethauvin/semver/tree/1.1.1) (2019-03-31)
[Full Changelog](https://github.com/ethauvin/semver/compare/1.1.0-beta...1.1.1)
## [1.1.0-beta](https://github.com/ethauvin/semver/tree/1.1.0-beta) (2018-11-04)
[Full Changelog](https://github.com/ethauvin/semver/compare/1.0.1...1.1.0-beta)
## [1.0.1](https://github.com/ethauvin/semver/tree/1.0.1) (2017-05-30)
[Full Changelog](https://github.com/ethauvin/semver/compare/1.0.0...1.0.1)
## [1.0.0](https://github.com/ethauvin/semver/tree/1.0.0) (2017-05-10)
[Full Changelog](https://github.com/ethauvin/semver/compare/0.9.6-beta...1.0.0)
## [0.9.6-beta](https://github.com/ethauvin/semver/tree/0.9.6-beta) (2016-07-15)
[Full Changelog](https://github.com/ethauvin/semver/compare/0.9.5-beta...0.9.6-beta)
## [0.9.5-beta](https://github.com/ethauvin/semver/tree/0.9.5-beta) (2016-02-03)
[Full Changelog](https://github.com/ethauvin/semver/compare/0.9.4-beta...0.9.5-beta)
## [0.9.4-beta](https://github.com/ethauvin/semver/tree/0.9.4-beta) (2016-01-29)
[Full Changelog](https://github.com/ethauvin/semver/compare/0.9.3-beta...0.9.4-beta)
## [0.9.3-beta](https://github.com/ethauvin/semver/tree/0.9.3-beta) (2016-01-28)
[Full Changelog](https://github.com/ethauvin/semver/compare/0.9.2-beta...0.9.3-beta)
## [0.9.2-beta](https://github.com/ethauvin/semver/tree/0.9.2-beta) (2016-01-25)
[Full Changelog](https://github.com/ethauvin/semver/compare/0.9.1-beta...0.9.2-beta)
## [0.9.1-beta](https://github.com/ethauvin/semver/tree/0.9.1-beta) (2016-01-25)
[Full Changelog](https://github.com/ethauvin/semver/compare/0.9.0-beta...0.9.1-beta)
## [0.9.0-beta](https://github.com/ethauvin/semver/tree/0.9.0-beta) (2016-01-24)
[Full Changelog](https://github.com/ethauvin/semver/compare/aeee81544c6d2881ccf02458fcef1f6ba1c9c169...0.9.0-beta)
\* *This Changelog was automatically generated by [github_changelog_generator](https://github.com/github-changelog-generator/github-changelog-generator)*

View file

@ -1,4 +1,4 @@
Copyright (c) 2016-2018, Erik C. Thauvin (erik@thauvin.net) Copyright (c) 2016-2024, Erik C. Thauvin (erik@thauvin.net)
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without

291
README.md
View file

@ -1,32 +1,62 @@
# Semantic Version Annotation Processor # Semantic Version Annotation Processor
[![License (3-Clause BSD)](https://img.shields.io/badge/license-BSD%203--Clause-blue.svg?style=flat-square)](http://opensource.org/licenses/BSD-3-Clause) [![release](https://img.shields.io/github/release/ethauvin/semver.svg)](https://github.com/ethauvin/semver/releases/latest) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/net.thauvin.erik/semver/badge.svg)](https://maven-badges.herokuapp.com/maven-central/net.thauvin.erik/semver) [ ![Download](https://api.bintray.com/packages/ethauvin/maven/SemVer/images/download.svg) ](https://bintray.com/ethauvin/maven/SemVer/_latestVersion) [![License (3-Clause BSD)](https://img.shields.io/badge/license-BSD%203--Clause-blue.svg?style=flat-square)](https://opensource.org/licenses/BSD-3-Clause)
[![Known Vulnerabilities](https://snyk.io/test/github/ethauvin/semver/badge.svg?targetFile=build.gradle)](https://snyk.io/test/github/ethauvin/semver?targetFile=build.gradle) [![Build Status](https://travis-ci.org/ethauvin/semver.svg?branch=master)](https://travis-ci.org/ethauvin/semver) [![Build status](https://ci.appveyor.com/api/projects/status/nbv4mxd1gpxtx69o?svg=true)](https://ci.appveyor.com/project/ethauvin/semver) [![CircleCI](https://circleci.com/gh/ethauvin/semver/tree/master.svg?style=shield)](https://circleci.com/gh/ethauvin/semver/tree/master) [![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)
[![release](https://img.shields.io/github/release/ethauvin/semver.svg)](https://github.com/ethauvin/semver/releases/latest)
[![Nexus Snapshot](https://img.shields.io/nexus/s/net.thauvin.erik/semver?label=snapshot&server=https%3A%2F%2Foss.sonatype.org%2F)](https://oss.sonatype.org/content/repositories/snapshots/net/thauvin/erik/semver/)
[![Maven Central](https://img.shields.io/maven-central/v/net.thauvin.erik/semver.svg)](https://central.sonatype.com/artifact/net.thauvin.erik/semver)
An [annotation processor](https://docs.oracle.com/javase/8/docs/api/javax/annotation/processing/Processor.html) that automatically generates a `GeneratedVersion` class based on a [Mustache](https://mustache.github.io/) template and containing the [semantic version](http://semver.org/) (major, minor, patch, etc.) that is read from a `Properties` file or defined in the [annotation](https://docs.oracle.com/javase/tutorial/java/annotations/basics.html). [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=ethauvin_semver&metric=alert_status)](https://sonarcloud.io/dashboard?id=ethauvin_semver)
[![GitHub CI](https://github.com/ethauvin/semver/actions/workflows/bld.yml/badge.svg)](https://github.com/ethauvin/semver/actions/workflows/bld.yml)
[![Build status](https://ci.appveyor.com/api/projects/status/nbv4mxd1gpxtx69o?svg=true)](https://ci.appveyor.com/project/ethauvin/semver)
[![CircleCI](https://circleci.com/gh/ethauvin/semver/tree/master.svg?style=shield)](https://circleci.com/gh/ethauvin/semver/tree/master)
An [annotation processor](https://docs.oracle.com/javase/8/docs/api/javax/annotation/processing/Processor.html) that automatically generates a `GeneratedVersion` class based on a [Mustache](https://mustache.github.io/) template and containing the [semantic version](https://semver.org/) (major, minor, patch, etc.) that is read from a [Properties](https://docs.oracle.com/javase/tutorial/essential/environment/properties.html) file or defined in the [annotation](https://docs.oracle.com/javase/tutorial/java/annotations/basics.html).
This processor was inspired by Cédric Beust's [version-processor](https://github.com/cbeust/version-processor) and works well in conjunction with the [__Semantic Version Plugin for Gradle__](https://github.com/ethauvin/semver-gradle). This processor was inspired by Cédric Beust's [version-processor](https://github.com/cbeust/version-processor) and works well in conjunction with the [__Semantic Version Plugin for Gradle__](https://github.com/ethauvin/semver-gradle).
## Table of Contents
- [Semantic Version Annotation Processor](#semantic-version-annotation-processor)
- [Table of Contents](#table-of-contents)
- [Examples](#examples)
- [Template](#template)
- [Default Template](#default-template)
- [Custom Template](#custom-template)
- [Elements \& Properties](#elements--properties)
- [Maven](#maven)
- [bld](#bld)
- [Gradle](#gradle)
- [Class Generation](#class-generation)
- [Class \& Source Generation](#class--source-generation)
- [Kotlin](#kotlin)
- [Kotlin \& Gradle](#kotlin--gradle)
- [Auto-Increment](#auto-increment)
- [Contributing](#contributing)
## Examples ## Examples
* Using annotation elements: - Using annotation elements:
```java ```java
import net.thauvin.erik.semver.Version; import net.thauvin.erik.semver.Version;
@Version(major = 1, minor = 0, patch = 0, preRelease = "beta") @Version(major = 2, minor = 1, patch = 1, preRelease = "beta")
public class A { public class A {
// ... // ...
}
``` ```
* Or using a [properties](https://docs.oracle.com/javase/tutorial/essential/environment/properties.html) file: - Or using a [properties](hhttps://github.com/ethauvin/semver/blob/master/examples/java/version.properties) file:
```java ```java
import net.thauvin.erik.semver.Version; import net.thauvin.erik.semver.Version;
@Version(properties = "version.properties") @Version(properties = "version.properties")
public class A { public class A {
// ... // ...
}
``` ```
```ini ```ini
@ -37,11 +67,11 @@ version.patch=0
version.prerelease=beta version.prerelease=beta
``` ```
[View Example](https://github.com/ethauvin/semver/tree/master/examples) [View Examples](https://github.com/ethauvin/semver/tree/master/examples)
## Template ## Template
Upon running the annotation processor, a source file [`GeneratedVersion.java`](https://github.com/ethauvin/semver/blob/master/examples/java/src/generated/java/net/thauvin/erik/semver/examples/java/GeneratedVersion.java) is automatically generated with static methods to access the semantic version data. The source is based on a fully customizable [Mustache](https://mustache.github.io/) template. Upon running the annotation processor, a source file [GeneratedVersion.java](https://github.com/ethauvin/semver/blob/master/examples/java/src/generated/java/com/example/GeneratedVersion.java) is automatically generated with static methods to access the semantic version data. The source is based on a fully customizable Mustache [template](https://github.com/ethauvin/semver/blob/master/src/main/resources/semver.mustache).
To use your own template, simply create a `version.mustache` file in the project's root directory. The processor will automatically look for it. To use your own template, simply create a `version.mustache` file in the project's root directory. The processor will automatically look for it.
@ -50,30 +80,27 @@ To specify your own template name, use:
```java ```java
@Version(template = "version.mustache") @Version(template = "version.mustache")
public class A { public class A {
// ... // ...
}
``` ```
### Default Template ### Default Template
The [default template](https://github.com/ethauvin/semver/blob/master/src/main/resources/semver.mustache) implements the following static fields: The [default template](https://github.com/ethauvin/semver/blob/master/src/main/resources/semver.mustache) implements the following static variables:
Field | Description | Example | Field | Description | Example |
:--------------|:---------------------------------|:----------------- |:-------------------|:---------------------------------|:----------------------------------------------------------------------------------|
`PROJECT` | The project name, if any. | `MyProject` | `PROJECT` | The project name, if any. | `MyProject` |
`BUILDDATE` | The build date. | [`java.util.Date`](https://docs.oracle.com/javase/8/docs/api/java/util/Date.html) | `BUILDDATE` | The build date. | [`java.util.Date`](https://docs.oracle.com/javase/8/docs/api/java/util/Date.html) |
`VERSION` | The full version string. | `1.2.3-alpha+001` | `VERSION` | The full version string. | `1.2.3-alpha+001` |
`MAJOR` | The major version. | `1` | `MAJOR` | The major version. | `1` |
`MINOR` | The minor version. | `2` | `MINOR` | The minor version. | `2` |
`PATCH` | The patch version. | `3` | `PATCH` | The patch version. | `3` |
`PRERELEASE` | The pre-release version, if any. | `alpha` | `PRERELEASE` | The pre-release version, if any. | `alpha` |
`BUILDMETA` | The build metadata, if any. | `001` | `PRERELASE_PREFIX` | The pre-release prefix | `-` |
| `BUILDMETA` | The build metadata, if any. | `001` |
And the following methods/functions: | `BUILDMETA_PREFIX` | The metadata prefix. | `+` |
| `SEPARATOR` | The version separator. | `.` |
Method | Description | Example
:------------------------|:----------------------------------------------------------|:--------
`preReleaseWithPrefix()` | Returns the pre-release with a prefix, `-` by default. | `-alpha`
`buildMetaWithPrefix()` | Returns the build metadata with a prefix, `+` by default. | `+001`
### Custom Template ### Custom Template
@ -81,61 +108,63 @@ A very simple custom template might look something like:
```java ```java
/* version.mustache */ /* version.mustache */
package {{packageName}} package {{packageName}};
import java.util.Date; import java.util.Date;
public final class {{className}} { public final class {{className}} {
public final static String PROJECT = "{{project}}"; public final static String PROJECT = "{{project}}";
public final static Date DATE = new Date({{epoch}}L); public final static Date DATE = new Date({{epoch}}L);
public final static int MAJOR = {{major}}; public final static String VERSION = "{{semver}}";
public final static int MINOR = {{minor}};
public final static int PATCH = {{patch}};
public final static String PRERELEASE = "{{preRelease}}";
public final static String BUILDMETA = "{{buildMeta}}";
} }
``` ```
The mustache variables automatically filled in by the processor are: The mustache variables automatically filled in by the processor are:
Variable | Description | Type | Variable | Description | Type |
:-----------------|:----------------------------|:-------- |:------------------------------|:----------------------------|:---------|
`{{packageName}}` | The package name. | `String` | `{{packageName}}` | The package name. | `String` |
`{{className}}` | The class name. | `String` | `{{className}}` | The class name. | `String` |
`{{project}}` | The project name. | `String` | `{{project}}` | The project name. | `String` |
`{{epoch}}` | The build epoch/unix time. | `long` | `{{epoch}}` | The build epoch/unix time. | `long` |
`{{major}}` | The major version. | `int` | `{{major}}` | The major version. | `int` |
`{{minor}}` | The minor version. | `int` | `{{minor}}` | The minor version. | `int` |
`{{patch}}` | The patch version. | `int` | `{{patch}}` | The patch version. | `int` |
`{{preRelease}}` | The pre/release version. | `String` | `{{preRelease}}` | The pre-release version. | `String` |
`{{buildMeta}}` | The build metadata version. | `String` | `{{preReleasePrefix}}` | The pre-release prefix. | `String` |
| `{{buildMeta}}` | The build metadata version. | `String` |
Please also look at this [example](https://github.com/ethauvin/mobibot/blob/master/version.mustache) using [`java.time`](https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html) | `{{buildMetaPrefix}}` | The metadata prefix. | `String` |
| `{{separator}}` | The version separator. | `String` |
| `{{semver}}` or `{{version}}` | The full semantic version. | `String` |
## Elements & Properties ## Elements & Properties
The following annotation elements and properties are available: The following annotation elements and properties are available:
Element | Property | Description | Default | Element | Property | Description | Default |
:-------------|:---------------------|:----------------------------------|:------------------------- |:-------------------|:----------------------------|:----------------------------------|:--------------------------|
`project` | `version.project` | The project name. | | `project` | `version.project` | The project name. | |
`major` | `version.major` | The major version number. | `1` | `major` | `version.major` | The major version number. | `1` |
`minor` | `version.major` | The minor version number. | `0` | `minor` | `version.major` | The minor version number. | `0` |
`patch` | `version.patch` | The patch version number. | `0` | `patch` | `version.patch` | The patch version number. | `0` |
`preRelease` | `version.prerelease` | The pre-release version. | | `preRelease` | `version.prerelease` | The pre-release version. | |
`buildMeta` | `version.buildmeta` | The build metadata version. | | `preReleasePrefix` | `version.prerelease.prefix` | The pre-release prefix. | `-` |
`packageName` | | The package name. | _Same as annotated class_ | `buildMeta` | `version.buildmeta` | The build metadata version. | |
`className` | | The name of the generated class. | `GeneratedVersion` | `buildMetaPrefix` | `version.buildmeta.prefix` | The metadata prefix. | `+` |
`properties` | | The properties file. | | `separator` | `version.separator` | The version separator. | `.` |
`template` | | The template file. | `version.mustache` | `packageName` | | The package name. | _Same as annotated class_ |
`type` | | Either `java` or `kt` for Kotlin. | `java` | `className` | | The name of the generated class. | `GeneratedVersion` |
`keysPrefix` | | The prefix for all property keys. | `version.` | `properties` | | The properties file. | |
| `template` | | The template file. | `version.mustache` |
| `type` | | Either `java` or `kt` for Kotlin. | `java` |
| `keysPrefix` | | The prefix for all property keys. | `version.` |
In order to easily incorporate with existing projects, the property keys may be assigned custom values: In order to easily incorporate with existing projects, the property keys may be assigned custom values:
```java ```java
@Version( @Version(
properties = "example.properties", properties = "example.properties",
keysPrefix = "example." keysPrefix = "example.",
majorKey = "maj", majorKey = "maj",
minorKey = "min", minorKey = "min",
patchKey = "build", patchKey = "build",
@ -144,7 +173,8 @@ In order to easily incorporate with existing projects, the property keys may be
projectKey = "project" projectKey = "project"
) )
public class Example { public class Example {
// ... // ...
}
``` ```
```ini ```ini
@ -158,64 +188,86 @@ example.meta=
# ... # ...
``` ```
> :warning: `keysPrefix` is a new element in `1.1.0` and may break older versions when using custom property keys. > :warning: `keysPrefix` is a new element staring in `1.1.0` and may break older versions when using custom property keys.\
> :zap: A quick fix is to include `keysPrefix=""` in the annotation to remove the default `version.` prefix. > :zap: A quick fix is to include `keysPrefix=""` in the annotation to remove the default `version.` prefix.
## Usage with Maven, Grail, Kobalt and Kotlin ## Maven
### Maven To install and run from [Maven](https://maven.apache.org/), configure an artifact as follows:
To install and run from [Maven](http://maven.apache.org/), configure an artifact as follows:
```xml ```xml
<dependency> <dependency>
<groupId>net.thauvin.erik</groupId> <groupId>net.thauvin.erik</groupId>
<artifactId>semver</artifactId> <artifactId>semver</artifactId>
<version>1.1.0-beta</version> <version>1.2.1</version>
</dependency> </dependency>
``` ```
### Gradle ```console
mvn verify
```
#### Class Generation Please look at [pom.xml](https://github.com/ethauvin/semver/blob/master/examples/java/gradle/pom.xml) in the [examples/java/gradle](https://github.com/ethauvin/semver/tree/master/examples/java/gradle) directory for a sample:
To install and run from [Gradle](https://gradle.org/), add the following to the `build.gradle` file:
```gradle ## bld
dependencies {
annotationProcessor 'net.thauvin.erik:semver:1.1.0-beta' To install and run from [bld](https://rife2.com/bld), just add the dependency to your build file:
compileOnly 'net.thauvin.erik:semver:1.1.0-beta'
```java
public class ExampleBuild extends Project {
public ExampleBuild() {
// ...
scope(compile)
.include(dependency("net.thauvin.erik", "semver", version(1, 2, 1)));
}
} }
``` ```
The `GeneratedVersion` class will be automatically created in the `build/generated` directory upon compiling. Please look at [ExampleBuild](https://github.com/ethauvin/semver/blob/master/examples/java/bld/src/bld/java/com/example/ExampleBuild.java) in the [examples/java/bld](https://github.com/ethauvin/semver/tree/master/examples/java/bld) directory for a sample. It also shows how to incorporate the generated code into the `source tree`, more information is also available [here](https://forum.uwyn.com/post/36).
#### Class & Source Generation bld also has a [Generated Version](https://github.com/rife2/bld-generated-version) extension which provides similar functionalities.
In order to also incorporate the generated source code into the `source tree`, add the following to the very top of the `build.gradle` file: ## Gradle
### Class Generation
To install and run from [Gradle](https://gradle.org/), add the following to [build.gradle](https://github.com/ethauvin/semver/blob/master/examples/java/gradle/build.gradle):
```gradle ```gradle
compileJava.options.annotationProcessorGeneratedSourcesDirectory = file("${projectDir}/src/generated/java") repositories {
``` mavenCentral()
}
The `GeneratedVersion.java` file will now be located in `src/generated`.
Please look at the [build.gradle](https://github.com/ethauvin/semver/blob/master/examples/java/build.gradle) file in the [Java example](https://github.com/ethauvin/semver/tree/master/example/java) module directory for a sample.
### Kobalt
To install and run from [Kobalt](http://beust.com/kobalt/), add the following to the `Build.kt` file:
```gradle
dependencies { dependencies {
apt("net.thauvin.erik:semver:1.1.0-beta") annotationProcessor 'net.thauvin.erik:semver:1.2.1'
compileOnly("net.thauvin.erik:semver:1.1.0-beta") compileOnly 'net.thauvin.erik:semver:1.2.1'
}
tasks.withType(JavaCompile).configureEach {
options.compilerArgs += [ "-Asemver.project.dir=$projectDir" ]
} }
``` ```
Please look at the [Build.kt](https://github.com/ethauvin/semver/blob/master/examples/kotlin/kobalt/src/Build.kt) file in the [Kotlin example](https://github.com/ethauvin/semver/tree/master/examples/kotlin) module directory for a sample. The directory containing the configuration files (`version.properties`, `version.mustache`) must be specified using the `semver.project.dir` processor argument.
### Kotlin The [`GeneratedVersion.java`](https://github.com/ethauvin/semver/blob/master/examples/java/src/generated/java/com/example/GeneratedVersion.java) class will be automatically created in the `build/generated` directory upon compiling.
Please look at [build.gradle](https://github.com/ethauvin/semver/blob/master/examples/java/gradle/build.gradle) in the [examples/java/gradle](https://github.com/ethauvin/semver/tree/master/examples/java/gradle) directory for a sample.
### Class & Source Generation
In order to also incorporate the generated source code into the `source tree`, add the following to [build.gradle](https://github.com/ethauvin/semver/blob/master/examples/java/build.gradle):
```gradle
tasks.withType(JavaCompile).configureEach {
options.generatedSourceOutputDirectory.set(file("${projectDir}/src/generated/java"))
}
```
The [`GeneratedVersion.java`](https://github.com/ethauvin/semver/blob/master/examples/java/src/generated/java/com/example/GeneratedVersion.java) file will now be located in `src/generated`.
## Kotlin
The annotation processor also supports [Kotlin](https://kotlinlang.org/). The annotation processor also supports [Kotlin](https://kotlinlang.org/).
@ -226,15 +278,56 @@ import net.thauvin.erik.semver.Version
@Version(properties = "version.properties", type="kt") @Version(properties = "version.properties", type="kt")
open class Main { open class Main {
// ... // ...
}
``` ```
The [Kotlin default template](https://github.com/ethauvin/semver/blob/master/src/main/resources/semver-kt.mustache) implements the same static fields and functions as the [Java template](#default-template). The [Kotlin default template](https://github.com/ethauvin/semver/blob/master/src/main/resources/semver-kt.mustache) implements the same static fields and functions as the [Java template](#default-template).
Please look at the [Kotlin example](https://github.com/ethauvin/semver/tree/master/examples/kotlin) project for samples on using Gradle ([build.gradle.kts](https://github.com/ethauvin/semver/blob/master/examples/kotlin/build.gradle.kts)) and Kobalt ([Build.kt](https://github.com/ethauvin/semver/blob/master/examples/kotlin/kobalt/src/Build.kt)). Please look at the [examples/kotlin](https://github.com/ethauvin/semver/tree/master/examples/kotlin) project for a [build.gradle.kts](https://github.com/ethauvin/semver/blob/master/examples/kotlin/build.gradle.kts) sample.
### Kotlin & Gradle
To install and run from [Gradle](https://gradle.org/), add the following to [build.gradle.kts](https://github.com/ethauvin/semver/blob/master/examples/kotlin/build.gradle.kts):
```kotlin
var semverProcessor = "net.thauvin.erik:semver:1.2.1"
dependencies {
kapt(semverProcessor)
compileOnly(semverProcessor)
}
kapt {
arguments {
arg("semver.project.dir", projectDir.absolutePath)
}
}
```
The directory containing the configuration files (`version.properties`, `version.mustache`) must be specified using the `semver.project.dir` processor argument.
## Auto-Increment ## Auto-Increment
Incrementing the version is best left to your favorite build system. For a solution using Gradle, please have a look at the [__Semver Version Plugin for Gradle__](https://github.com/ethauvin/semver-gradle). Incrementing the version is best left to your favorite build system. For a solution using Gradle, please have a look at the [__Semver Version Plugin for Gradle__](https://github.com/ethauvin/semver-gradle).
There are also full [examples](https://github.com/ethauvin/semver-gradle/tree/master/examples/annotation-processor) in both [Java](https://github.com/ethauvin/semver-gradle/tree/master/examples/annotation-processor/java) and [Kotlin](https://github.com/ethauvin/semver-gradle/tree/master/examples/annotation-processor) showing how to use both the plugin and annotation processor concurrently. There are also full [examples](https://github.com/ethauvin/semver-gradle/tree/master/examples/annotation-processor) in both [Java](https://github.com/ethauvin/semver-gradle/tree/master/examples/annotation-processor/java) and [Kotlin](https://github.com/ethauvin/semver-gradle/tree/master/examples/annotation-processor/kotlin) showing how to use both the plugin and annotation processor concurrently.
## Contributing
If you want to contribute to this project, all you have to do is clone the GitHub
repository:
```console
git clone git@github.com:ethauvin/semver.git
```
Then use [bld](https://rife2.com/bld) to build:
```console
cd semver
./bld compile
```
The project has an [IntelliJ IDEA](https://www.jetbrains.com/idea/) project structure. You can just open it after all
the dependencies were downloaded and peruse the code.

View file

@ -1,26 +1,18 @@
version: "{branch} {build}" version: build-{build}.{branch}
skip_tags: true clone_depth: 3
build: platform: x64
verbosity: detailed image: Visual Studio 2019
before_build:
- set "JAVA_HOME=C:\Program Files\Java\jdk17"
- set "PATH=C:\Program Files\Java\jdk17\bin;%PATH%"
build_script: build_script:
- gradlew.bat assemble --info --no-daemon - bld.bat download compile
test_script: test_script:
- gradlew.bat check --info --no-daemon - bld.bat test
branches:
only:
- master
cache: cache:
- C:\Users\appveyor\.gradle - C:\Users\appveyor\.m2
environment:
matrix:
- JAVA_HOME: C:\Program Files\Java\jdk1.8.0
- JAVA_HOME: C:\Program Files (x86)\Java\jdk1.8.0
matrix:
fast_finish: true

View file

@ -0,0 +1,33 @@
#
# javax.annotation.processing.Processor
#
# Copyright (c) 2016-2023, Erik C. Thauvin (erik@thauvin.net)
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# Redistributions of source code must retain the above copyright notice, this
# list of conditions and the following disclaimer.
#
# Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# Neither the name of this project nor the names of its contributors may be
# used to endorse or promote products derived from this software without
# specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
net.thauvin.erik.semver.VersionProcessor

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,12 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html lang="en">
<head>
<title>Semantic Version Annotation Processor</title>
</head>
<body>
An annotation processor that automatically generates a <code>GeneratedVersion</code> class containing the semantic
version (major, minor, patch, etc.) that is read from a Properties file or defined in the annotation.
@since 1.0
</body>
</html>

View file

@ -0,0 +1,38 @@
/*
* This file is automatically generated.
* Do not modify! -- ALL CHANGES WILL BE ERASED!
*/
package {{packageName}}
import java.util.Date
/**
* Provides semantic version information.
*
* @author <a href="https://github.com/ethauvin/semver">Semantic Version Annotation Processor</a>
*/
object {{className}} {
@JvmField
val PROJECT = "{{project}}"
@JvmField
val BUILDDATE = Date({{epoch}}L)
@JvmField
val MAJOR = {{major}}
@JvmField
val MINOR = {{minor}}
@JvmField
val PATCH = {{patch}}
@JvmField
val PRERELEASE = "{{preRelease}}"
@JvmField
val PRERELEASE_PREFIX = "{{preReleasePrefix}}"
@JvmField
val BUILDMETA = "{{buildMeta}}"
@JvmField
val BUILDMEATA_PREFIX = "{{buildMetaPrefix}}"
@JvmField
val SEPARATOR = "{{separator}}"
@JvmField
val VERSION = "{{version}}"
}

34
bin/main/semver.mustache Normal file
View file

@ -0,0 +1,34 @@
/*
* This file is automatically generated.
* Do not modify! -- ALL CHANGES WILL BE ERASED!
*/
package {{packageName}};
import java.util.Date;
/**
* Provides semantic version information.
*
* @author <a href="https://github.com/ethauvin/semver">Semantic Version Annotation Processor</a>
*/
public final class {{className}} {
public static final String PROJECT = "{{project}}";
public static final Date BUILDDATE = new Date({{epoch}}L);
public static final int MAJOR = {{major}};
public static final int MINOR = {{minor}};
public static final int PATCH = {{patch}};
public static final String PRERELEASE = "{{preRelease}}";
public static final String PRERELEASE_PREFIX = "{{preReleasePrefix}}";
public static final String BUILDMETA = "{{buildMeta}}";
public static final String BUILDMETA_PREFIX = "{{buildMetaPrefix}}";
public static final String SEPARATOR = "{{separator}}";
public static final String VERSION = "{{version}}";
/**
* Disables the default constructor.
*/
private {{className}}() {
throw new UnsupportedOperationException("Illegal constructor call.");
}
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

2
bld Executable file
View file

@ -0,0 +1,2 @@
#!/usr/bin/env sh
java -jar "$(dirname "$0")/lib/bld/bld-wrapper.jar" "$0" --build net.thauvin.erik.semver.SemverBuild "$@"

4
bld.bat Normal file
View file

@ -0,0 +1,4 @@
@echo off
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
java -jar "%DIRNAME%/lib/bld/bld-wrapper.jar" "%0" --build net.thauvin.erik.semver.SemverBuild %*

View file

@ -1,184 +0,0 @@
plugins {
id 'java'
id 'maven-publish'
id "com.jfrog.bintray" version "1.8.4"
id "com.github.ben-manes.versions" version "0.20.0"
id "net.thauvin.erik.gradle.semver" version "0.9.8-beta"
id "com.github.spotbugs" version "1.6.5"
}
import com.github.spotbugs.SpotBugsTask
import org.apache.tools.ant.taskdefs.condition.Os
defaultTasks 'check'
group = 'net.thauvin.erik'
def mavenName = 'SemVer'
def mavenDescription = 'Semantic Version Annotation Processor'
def mavenUrl = 'https://github.com/ethauvin/semver'
def mavenLicense = 'The BSD 3-Clause License'
def mavenLicenseUrl = 'http://opensource.org/licenses/BSD-3-Clause'
def mavenScmCon = 'https://github.com/ethauvin/semver.git'
def mavenScmDevCon = 'git@github.com:ethauvin/semver.git'
def pkgLicenses = ['BSD 3-Clause']
def pkgIssueTrackerUrl = mavenUrl + '/issues'
def pkgLabels = ['java', 'annotation', 'processor', 'semantic', 'version']
sourceCompatibility = 1.8
targetCompatibility = 1.8
[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
repositories {
mavenLocal()
jcenter()
}
dependencies {
compile 'com.github.spullara.mustache.java:compiler:0.9.5'
compileOnly 'com.github.spotbugs:spotbugs-annotations:3.1.8'
testCompile 'org.testng:testng:6.14.3'
}
bintray {
user = project.hasProperty('bintrayUser') ? project.property('bintrayUser') : System.getenv('BINTRAY_USER')
key = project.hasProperty('bintrayApiKey') ? project.property('bintrayApiKey') : System.getenv('BINTRAY_API_KEY')
publications = ['MyPublication']
dryRun = false
pkg {
repo = 'maven'
name = mavenName
licenses = pkgLicenses
desc = mavenDescription
websiteUrl = mavenUrl
issueTrackerUrl = pkgIssueTrackerUrl
vcsUrl = mavenScmCon
labels = pkgLabels
publicDownloadNumbers = true
}
}
task javadocJar(type: Jar, dependsOn: javadoc) {
group = 'Build'
description = 'Builds an archive of the javadoc docs.'
classifier = 'javadoc'
from javadoc.destinationDir
}
task sourceJar(type: Jar) {
group = 'Build'
description = 'Builds an archive of the source code.'
classifier = 'sources'
from sourceSets.main.allSource
}
artifacts {
archives javadocJar
archives sourceJar
}
publishing {
publications {
MyPublication(MavenPublication) {
from components.java
artifact sourceJar
artifact javadocJar
groupId project.group
artifactId rootProject.name
pom {
name = mavenName
description = mavenDescription
url = mavenUrl
licenses {
license {
name = mavenLicense
url = mavenLicenseUrl
distribution = 'repo'
}
}
developers {
developer {
id = 'ethauvin'
name = 'Erik C. Thauvin'
email = 'erik@thauvin.net'
}
}
scm {
connection = "scm:git:" + mavenScmCon
developerConnection = "scm:git:" + mavenScmDevCon
url = mavenScmCon
}
}
}
}
}
javadoc {
doFirst {
title = "$mavenDescription $project.version API"
}
options.with {
tags = ['created']
author = true
//addBooleanOption('html4', true)
links('https://docs.oracle.com/javase/8/docs/api/')
addStringOption('Xdoclint:none', '-quiet')
}
}
test {
useTestNG()
}
tasks.withType(SpotBugsTask) {
reports {
xml.enabled = false
html.enabled = true
}
excludeFilter = file("$projectDir/config/spotbugs/excludeFilter.xml")
}
compileJava {
options.compilerArgs.add('-proc:none')
}
compileTestJava {
options.compilerArgs.add('-proc:none')
}
bintrayUpload {
versionName = "$project.version"
versionDesc = "Beta version $project.version"
versionVcsTag = "$project.version"
signVersion = true
}
task release(dependsOn: ['wrapper', 'clean', 'publishToMavenLocal']) {
group = 'Publishing'
description = 'Releases new version to local maven repository.'
doFirst {
println("Version: $version")
}
}
task pandoc(type: Exec) {
group = 'Documentation'
def pandoc_args = ['--from', 'markdown_github',
'--to', 'html5',
'-s',
'-c', 'github-pandoc.css',
'-o', 'docs/README.html',
'README.md']
if (Os.isFamily(Os.FAMILY_WINDOWS)) {
commandLine(['cmd', '/c', 'pandoc'] + pandoc_args)
} else {
executable 'pandoc'
args pandoc_args
}
standardOutput = new ByteArrayOutputStream()
ext.output = {
return standardOutput.toString()
}
}

View file

@ -1,37 +0,0 @@
#!/bin/bash
DEBUG=false
rm="rm -rf"
if [ "$DEBUG" = true ]; then
rm="echo rm -rf"
fi
buildkt="kobalt/src/Build.kt"
name=$(cat $buildkt | grep -m 1 "name = " | cut -d"\"" -f 2)
group=$(cat $buildkt | grep -m 1 "group = " | cut -d"\"" -f 2)
if [ -z "$1" ]; then
version=$(cat $buildkt | grep -m 1 "version = " | cut -d"\"" -f 2)
else
version="$1"
fi
maven="/k/maven/repository/${group//.//}/${name}/${version}"
kobalt="$HOME/.kobalt/cache/${group//.//}/${name}/${version}"
localRepo="$HOME/.kobalt/localMavenRepo/${group//.//}/${name}/${version}"
read -p "Delete version ${version}? " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
for dir in "$kobalt" "$maven" "$localRepo"; do
if [ -d "$dir" ]; then
echo -e "Deleting : \e[32;1m$dir\e[0m"
$rm "$dir"
else
echo -e "Not Found: \e[31;1m$dir\e[0m"
fi
done
fi

109
config/pmd.xml Normal file
View file

@ -0,0 +1,109 @@
<?xml version="1.0"?>
<ruleset name="erik"
xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 https://pmd.sourceforge.io/ruleset_2_0_0.xsd">
<description>Erik's Ruleset</description>
<!-- BEST PRACTICES -->
<rule ref="category/java/bestpractices.xml">
<exclude name="AvoidPrintStackTrace"/>
<exclude name="GuardLogStatement"/>
<exclude name="UnitTestContainsTooManyAsserts"/>
<exclude name="UnitTestShouldUseTestAnnotation"/>
</rule>
<rule ref="category/java/bestpractices.xml/MissingOverride">
<properties>
<property name="violationSuppressXPath"
value="//MethodDeclaration[@Name='hashCode' or @Name='equals' or @Name='toString']"/>
</properties>
</rule>
<!-- CODE STYLE -->
<rule ref="category/java/codestyle.xml">
<exclude name="AtLeastOneConstructor"/>
<exclude name="ClassNamingConventions"/>
<exclude name="CommentDefaultAccessModifier"/>
<exclude name="ConfusingTernary"/>
<exclude name="FieldNamingConventions"/>
<exclude name="LocalVariableCouldBeFinal"/>
<exclude name="LongVariable"/>
<exclude name="MethodArgumentCouldBeFinal"/>
<exclude name="OnlyOneReturn"/>
<exclude name="PackageCase"/>
<exclude name="ShortClassName"/>
<exclude name="ShortMethodName"/>
<exclude name="ShortVariable"/>
<exclude name="UseExplicitTypes"/>
<exclude name="UseUnderscoresInNumericLiterals"/>
<exclude name="UselessParentheses"/>
</rule>
<rule ref="category/java/codestyle.xml/UnnecessaryImport">
<properties>
<property name="violationSuppressRegex" value="Unused (static|.*\.\*).*"/>
</properties>
</rule>
<!-- DESIGN -->
<rule ref="category/java/design.xml">
<exclude name="AvoidCatchingGenericException"/>
<exclude name="AvoidDeeplyNestedIfStmts"/>
<exclude name="AvoidUncheckedExceptionsInSignatures"/>
<exclude name="CognitiveComplexity"/>
<exclude name="CyclomaticComplexity"/>
<exclude name="ExcessiveParameterList"/>
<exclude name="ExcessivePublicCount"/>
<exclude name="GodClass"/>
<exclude name="LawOfDemeter"/>
<exclude name="LoosePackageCoupling"/>
<exclude name="NPathComplexity"/>
<exclude name="NcssCount"/>
<exclude name="TooManyFields"/>
<exclude name="TooManyMethods"/>
<exclude name="UseObjectForClearerAPI"/>
</rule>
<!-- DOCUMENTATION -->
<rule ref="category/java/documentation.xml">
<exclude name="CommentRequired"/>
<exclude name="CommentSize"/>
</rule>
<!-- ERROR PRONE -->
<rule ref="category/java/errorprone.xml">
<exclude name="AssignmentInOperand"/>
<exclude name="AvoidCatchingNPE"/>
<exclude name="AvoidDuplicateLiterals"/>
<exclude name="AvoidFieldNameMatchingMethodName"/>
<exclude name="AvoidFieldNameMatchingTypeName"/>
<exclude name="AvoidLiteralsInIfCondition"/>
<exclude name="NullAssignment"/>
</rule>
<rule ref="category/java/errorprone.xml/AssignmentInOperand">
<properties>
<property name="allowWhile" value="true"/>
<property name="allowFor" value="true"/>
<property name="allowIf" value="true"/>
</properties>
</rule>
<rule ref="category/java/errorprone.xml/AvoidDuplicateLiterals">
<properties>
<property name="skipAnnotations" value="true"/>
</properties>
</rule>
<!-- MULTITHREADING -->
<rule ref="category/java/multithreading.xml">
</rule>
<!-- PERFORMANCE -->
<rule ref="category/java/performance.xml">
</rule>
<!-- SECURITY -->
<rule ref="category/java/security.xml">
</rule>
</ruleset>

View file

@ -1,16 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<FindBugsFilter
xmlns="https://github.com/spotbugs/filter/3.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://github.com/spotbugs/filter/3.0.0 https://raw.githubusercontent.com/spotbugs/spotbugs/3.1.0/spotbugs/etc/findbugsfilter.xsd">
<!-- <Match>
<Package name="com.foobar.*"/>
<Class name="com.foobar.MyClass"/>
<Or>
<Method name="someMethod"/>
<Method name="someOtherMethod"/>
</Or>
<Bug pattern="DLS_DEAD_LOCAL_STORE"/>
<Confidence value="2"/>
</Match>-->
</FindBugsFilter>

View file

@ -1,91 +1,218 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8" />
<meta name="generator" content="pandoc"> <meta name="generator" content="pandoc" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes"> <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
<title></title> <title>Semantic Version Annotation Processor</title>
<style type="text/css">code{white-space: pre;}</style> <style>
<style type="text/css"> code{white-space: pre-wrap;}
div.sourceCode { overflow-x: auto; } span.smallcaps{font-variant: small-caps;}
table.sourceCode, tr.sourceCode, td.lineNumbers, td.sourceCode { div.columns{display: flex; gap: min(4vw, 1.5em);}
margin: 0; padding: 0; vertical-align: baseline; border: none; } div.column{flex: auto; overflow-x: auto;}
table.sourceCode { width: 100%; line-height: 100%; } div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
td.lineNumbers { text-align: right; padding-right: 4px; padding-left: 4px; color: #aaaaaa; border-right: 1px solid #aaaaaa; } /* The extra [class] is a hack that increases specificity enough to
td.sourceCode { padding-left: 5px; } override a similar rule in reveal.js */
code > span.kw { color: #007020; font-weight: bold; } /* Keyword */ ul.task-list[class]{list-style: none;}
code > span.dt { color: #902000; } /* DataType */ ul.task-list li input[type="checkbox"] {
code > span.dv { color: #40a070; } /* DecVal */ font-size: inherit;
code > span.bn { color: #40a070; } /* BaseN */ width: 0.8em;
code > span.fl { color: #40a070; } /* Float */ margin: 0 0.8em 0.2em -1.6em;
code > span.ch { color: #4070a0; } /* Char */ vertical-align: middle;
code > span.st { color: #4070a0; } /* String */ }
code > span.co { color: #60a0b0; font-style: italic; } /* Comment */ .display.math{display: block; text-align: center; margin: 0.5rem auto;}
code > span.ot { color: #007020; } /* Other */ /* CSS for syntax highlighting */
code > span.al { color: #ff0000; font-weight: bold; } /* Alert */ pre > code.sourceCode { white-space: pre; position: relative; }
code > span.fu { color: #06287e; } /* Function */ pre > code.sourceCode > span { line-height: 1.25; }
code > span.er { color: #ff0000; font-weight: bold; } /* Error */ pre > code.sourceCode > span:empty { height: 1.2em; }
code > span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */ .sourceCode { overflow: visible; }
code > span.cn { color: #880000; } /* Constant */ code.sourceCode > span { color: inherit; text-decoration: inherit; }
code > span.sc { color: #4070a0; } /* SpecialChar */ div.sourceCode { margin: 1em 0; }
code > span.vs { color: #4070a0; } /* VerbatimString */ pre.sourceCode { margin: 0; }
code > span.ss { color: #bb6688; } /* SpecialString */ @media screen {
code > span.im { } /* Import */ div.sourceCode { overflow: auto; }
code > span.va { color: #19177c; } /* Variable */ }
code > span.cf { color: #007020; font-weight: bold; } /* ControlFlow */ @media print {
code > span.op { color: #666666; } /* Operator */ pre > code.sourceCode { white-space: pre-wrap; }
code > span.bu { } /* BuiltIn */ pre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }
code > span.ex { } /* Extension */ }
code > span.pp { color: #bc7a00; } /* Preprocessor */ pre.numberSource code
code > span.at { color: #7d9029; } /* Attribute */ { counter-reset: source-line 0; }
code > span.do { color: #ba2121; font-style: italic; } /* Documentation */ pre.numberSource code > span
code > span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */ { position: relative; left: -4em; counter-increment: source-line; }
code > span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */ pre.numberSource code > span > a:first-child::before
code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */ { content: counter(source-line);
position: relative; left: -1em; text-align: right; vertical-align: baseline;
border: none; display: inline-block;
-webkit-touch-callout: none; -webkit-user-select: none;
-khtml-user-select: none; -moz-user-select: none;
-ms-user-select: none; user-select: none;
padding: 0 4px; width: 4em;
color: #aaaaaa;
}
pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }
div.sourceCode
{ }
@media screen {
pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
}
code span.al { color: #ff0000; font-weight: bold; } /* Alert */
code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
code span.at { color: #7d9029; } /* Attribute */
code span.bn { color: #40a070; } /* BaseN */
code span.bu { color: #008000; } /* BuiltIn */
code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
code span.ch { color: #4070a0; } /* Char */
code span.cn { color: #880000; } /* Constant */
code span.co { color: #60a0b0; font-style: italic; } /* Comment */
code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
code span.do { color: #ba2121; font-style: italic; } /* Documentation */
code span.dt { color: #902000; } /* DataType */
code span.dv { color: #40a070; } /* DecVal */
code span.er { color: #ff0000; font-weight: bold; } /* Error */
code span.ex { } /* Extension */
code span.fl { color: #40a070; } /* Float */
code span.fu { color: #06287e; } /* Function */
code span.im { color: #008000; font-weight: bold; } /* Import */
code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
code span.kw { color: #007020; font-weight: bold; } /* Keyword */
code span.op { color: #666666; } /* Operator */
code span.ot { color: #007020; } /* Other */
code span.pp { color: #bc7a00; } /* Preprocessor */
code span.sc { color: #4070a0; } /* SpecialChar */
code span.ss { color: #bb6688; } /* SpecialString */
code span.st { color: #4070a0; } /* String */
code span.va { color: #19177c; } /* Variable */
code span.vs { color: #4070a0; } /* VerbatimString */
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
</style> </style>
<link rel="stylesheet" href="github-pandoc.css"> <link rel="stylesheet" href="docs/github-pandoc.css" />
<!--[if lt IE 9]> <!--[if lt IE 9]>
<script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
<![endif]--> <![endif]-->
</head> </head>
<body> <body>
<h1 id="semantic-version-annotation-processor">Semantic Version Annotation Processor</h1> <h1 id="semantic-version-annotation-processor">Semantic Version
<p><a href="http://opensource.org/licenses/BSD-3-Clause"><img src="https://img.shields.io/badge/license-BSD%203--Clause-blue.svg?style=flat-square" alt="License (3-Clause BSD)" /></a> <a href="https://github.com/ethauvin/semver/releases/latest"><img src="https://img.shields.io/github/release/ethauvin/semver.svg" alt="release" /></a> <a href="https://maven-badges.herokuapp.com/maven-central/net.thauvin.erik/semver"><img src="https://maven-badges.herokuapp.com/maven-central/net.thauvin.erik/semver/badge.svg" alt="Maven Central" /></a> <a href="https://bintray.com/ethauvin/maven/SemVer/_latestVersion"><img src="https://api.bintray.com/packages/ethauvin/maven/SemVer/images/download.svg" alt="Download" /></a><br /> Annotation Processor</h1>
<a href="https://snyk.io/test/github/ethauvin/semver?targetFile=build.gradle"><img src="https://snyk.io/test/github/ethauvin/semver/badge.svg?targetFile=build.gradle" alt="Known Vulnerabilities" /></a> <a href="https://travis-ci.org/ethauvin/semver"><img src="https://travis-ci.org/ethauvin/semver.svg?branch=master" alt="Build Status" /></a> <a href="https://ci.appveyor.com/project/ethauvin/semver"><img src="https://ci.appveyor.com/api/projects/status/nbv4mxd1gpxtx69o?svg=true" alt="Build status" /></a> <a href="https://circleci.com/gh/ethauvin/semver/tree/master"><img src="https://circleci.com/gh/ethauvin/semver/tree/master.svg?style=shield" alt="CircleCI" /></a></p> <p><a href="https://opensource.org/licenses/BSD-3-Clause"><img
<p>An <a href="https://docs.oracle.com/javase/8/docs/api/javax/annotation/processing/Processor.html">annotation processor</a> that automatically generates a <code>GeneratedVersion</code> class based on a <a href="https://mustache.github.io/">Mustache</a> template and containing the <a href="http://semver.org/">semantic version</a> (major, minor, patch, etc.) that is read from a <code>Properties</code> file or defined in the <a href="https://docs.oracle.com/javase/tutorial/java/annotations/basics.html">annotation</a>.</p> src="https://img.shields.io/badge/license-BSD%203--Clause-blue.svg?style=flat-square"
<p>This processor was inspired by Cédric Beust's <a href="https://github.com/cbeust/version-processor">version-processor</a> and works well in conjunction with the <a href="https://github.com/ethauvin/semver-gradle"><strong>Semantic Version Plugin for Gradle</strong></a>.</p> alt="License (3-Clause BSD)" /></a> <a
href="https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html"><img
src="https://img.shields.io/badge/java-17%2B-blue" alt="Java" /></a> <a
href="https://rife2.com/bld"><img
src="https://img.shields.io/badge/1.9.0-FA9052?label=bld&amp;labelColor=2392FF"
alt="bld" /></a> <a
href="https://github.com/ethauvin/semver/releases/latest"><img
src="https://img.shields.io/github/release/ethauvin/semver.svg"
alt="release" /></a> <a
href="https://oss.sonatype.org/content/repositories/snapshots/net/thauvin/erik/semver/"><img
src="https://img.shields.io/nexus/s/net.thauvin.erik/semver?label=snapshot&amp;server=https%3A%2F%2Foss.sonatype.org%2F"
alt="Nexus Snapshot" /></a> <a
href="https://central.sonatype.com/artifact/net.thauvin.erik/semver"><img
src="https://img.shields.io/maven-central/v/net.thauvin.erik/semver.svg"
alt="Maven Central" /></a></p>
<p><a href="https://sonarcloud.io/dashboard?id=ethauvin_semver"><img
src="https://sonarcloud.io/api/project_badges/measure?project=ethauvin_semver&amp;metric=alert_status"
alt="Quality Gate Status" /></a> <a
href="https://github.com/ethauvin/semver/actions/workflows/gradle.yml"><img
src="https://github.com/ethauvin/semver/actions/workflows/gradle.yml/badge.svg"
alt="GitHub CI" /></a> <a
href="https://ci.appveyor.com/project/ethauvin/semver"><img
src="https://ci.appveyor.com/api/projects/status/nbv4mxd1gpxtx69o?svg=true"
alt="Build status" /></a> <a
href="https://circleci.com/gh/ethauvin/semver/tree/master"><img
src="https://circleci.com/gh/ethauvin/semver/tree/master.svg?style=shield"
alt="CircleCI" /></a></p>
<p>An <a
href="https://docs.oracle.com/javase/8/docs/api/javax/annotation/processing/Processor.html">annotation
processor</a> that automatically generates a
<code>GeneratedVersion</code> class based on a <a
href="https://mustache.github.io/">Mustache</a> template and containing
the <a href="https://semver.org/">semantic version</a> (major, minor,
patch, etc.) that is read from a <a
href="https://docs.oracle.com/javase/tutorial/essential/environment/properties.html">Properties</a>
file or defined in the <a
href="https://docs.oracle.com/javase/tutorial/java/annotations/basics.html">annotation</a>.</p>
<p>This processor was inspired by Cédric Beust's <a
href="https://github.com/cbeust/version-processor">version-processor</a>
and works well in conjunction with the <a
href="https://github.com/ethauvin/semver-gradle"><strong>Semantic
Version Plugin for Gradle</strong></a>.</p>
<h2 id="table-of-contents">Table of Contents</h2>
<ul>
<li><a href="#examples">Examples</a></li>
<li><a href="#template">Template</a>
<ul>
<li><a href="#default-template">Default Template</a></li>
<li><a href="#custom-template">Custom Template</a></li>
</ul></li>
<li><a href="#elements--properties">Elements &amp; Properties</a></li>
<li><a href="#maven">Maven</a></li>
<li><a href="#bld">bld</a></li>
<li><a href="#gradle">Gradle</a>
<ul>
<li><a href="#class-generation">Class Generation</a></li>
<li><a href="#class--source-generation">Class &amp; Source
Generation</a></li>
</ul></li>
<li><a href="#kotlin">Kotlin</a>
<ul>
<li><a href="#kotlin--gradle">Kotlin &amp; Gradle</a></li>
</ul></li>
<li><a href="#auto-increment">Auto-Increment</a></li>
<li><a href="#contributing">Contributing</a></li>
</ul>
<h2 id="examples">Examples</h2> <h2 id="examples">Examples</h2>
<ul> <ul>
<li>Using annotation elements:</li> <li>Using annotation elements:</li>
</ul> </ul>
<div class="sourceCode"><pre class="sourceCode java"><code class="sourceCode java"><span class="kw">import net.thauvin.erik.semver.Version;</span> <div class="sourceCode" id="cb1"><pre
class="sourceCode java"><code class="sourceCode java"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="kw">import</span> <span class="im">net</span><span class="op">.</span><span class="im">thauvin</span><span class="op">.</span><span class="im">erik</span><span class="op">.</span><span class="im">semver</span><span class="op">.</span><span class="im">Version</span><span class="op">;</span></span>
<span class="fu">@Version</span>(major = <span class="dv">1</span>, minor = <span class="dv">0</span>, patch = <span class="dv">0</span>, preRelease = <span class="st">&quot;beta&quot;</span>) <span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a></span>
<span class="kw">public</span> <span class="kw">class</span> A { <span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a><span class="at">@Version</span><span class="op">(</span>major <span class="op">=</span> <span class="dv">2</span><span class="op">,</span> minor <span class="op">=</span> <span class="dv">1</span><span class="op">,</span> patch <span class="op">=</span> <span class="dv">1</span><span class="op">,</span> preRelease <span class="op">=</span> <span class="st">&quot;beta&quot;</span><span class="op">)</span></span>
<span class="co">// ...</span></code></pre></div> <span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a><span class="kw">public</span> <span class="kw">class</span> A <span class="op">{</span></span>
<span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a> <span class="co">// ...</span></span>
<span id="cb1-6"><a href="#cb1-6" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<ul> <ul>
<li>Or using a <a href="https://docs.oracle.com/javase/tutorial/essential/environment/properties.html">properties</a> file:</li> <li>Or using a <a
href="hhttps://github.com/ethauvin/semver/blob/master/examples/java/version.properties">properties</a>
file:</li>
</ul> </ul>
<div class="sourceCode"><pre class="sourceCode java"><code class="sourceCode java"><span class="kw">import net.thauvin.erik.semver.Version;</span> <div class="sourceCode" id="cb2"><pre
class="sourceCode java"><code class="sourceCode java"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="kw">import</span> <span class="im">net</span><span class="op">.</span><span class="im">thauvin</span><span class="op">.</span><span class="im">erik</span><span class="op">.</span><span class="im">semver</span><span class="op">.</span><span class="im">Version</span><span class="op">;</span></span>
<span class="fu">@Version</span>(properties = <span class="st">&quot;version.properties&quot;</span>) <span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a></span>
<span class="kw">public</span> <span class="kw">class</span> A { <span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a><span class="at">@Version</span><span class="op">(</span>properties <span class="op">=</span> <span class="st">&quot;version.properties&quot;</span><span class="op">)</span></span>
<span class="co">// ...</span></code></pre></div> <span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a><span class="kw">public</span> <span class="kw">class</span> A <span class="op">{</span></span>
<div class="sourceCode"><pre class="sourceCode ini"><code class="sourceCode ini"><span class="co"># version.properties</span> <span id="cb2-5"><a href="#cb2-5" aria-hidden="true" tabindex="-1"></a> <span class="co">// ...</span></span>
<span class="dt">version.major</span><span class="ot">=</span><span class="dv">1</span> <span id="cb2-6"><a href="#cb2-6" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<span class="dt">version.minor</span><span class="ot">=</span><span class="dv">0</span> <div class="sourceCode" id="cb3"><pre
<span class="dt">version.patch</span><span class="ot">=</span><span class="dv">0</span> class="sourceCode ini"><code class="sourceCode ini"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true" tabindex="-1"></a><span class="co"># version.properties</span></span>
<span class="dt">version.prerelease</span><span class="ot">=</span><span class="st">beta</span></code></pre></div> <span id="cb3-2"><a href="#cb3-2" aria-hidden="true" tabindex="-1"></a><span class="dt">version.major</span><span class="ot">=</span><span class="dv">1</span></span>
<p><a href="https://github.com/ethauvin/semver/tree/master/examples">View Example</a></p> <span id="cb3-3"><a href="#cb3-3" aria-hidden="true" tabindex="-1"></a><span class="dt">version.minor</span><span class="ot">=</span><span class="dv">0</span></span>
<span id="cb3-4"><a href="#cb3-4" aria-hidden="true" tabindex="-1"></a><span class="dt">version.patch</span><span class="ot">=</span><span class="dv">0</span></span>
<span id="cb3-5"><a href="#cb3-5" aria-hidden="true" tabindex="-1"></a><span class="dt">version.prerelease</span><span class="ot">=</span><span class="st">beta</span></span></code></pre></div>
<p><a
href="https://github.com/ethauvin/semver/tree/master/examples">View
Examples</a></p>
<h2 id="template">Template</h2> <h2 id="template">Template</h2>
<p>Upon running the annotation processor, a source file <a href="https://github.com/ethauvin/semver/blob/master/examples/java/src/generated/java/net/thauvin/erik/semver/examples/java/GeneratedVersion.java"><code>GeneratedVersion.java</code></a> is automatically generated with static methods to access the semantic version data. The source is based on a fully customizable <a href="https://mustache.github.io/">Mustache</a> template.</p> <p>Upon running the annotation processor, a source file <a
<p>To use your own template, simply create a <code>version.mustache</code> file in the project's root directory. The processor will automatically look for it.</p> href="https://github.com/ethauvin/semver/blob/master/examples/java/src/generated/java/com/example/GeneratedVersion.java">GeneratedVersion.java</a>
is automatically generated with static methods to access the semantic
version data. The source is based on a fully customizable Mustache <a
href="https://github.com/ethauvin/semver/blob/master/src/main/resources/semver.mustache">template</a>.</p>
<p>To use your own template, simply create a
<code>version.mustache</code> file in the project's root directory. The
processor will automatically look for it.</p>
<p>To specify your own template name, use:</p> <p>To specify your own template name, use:</p>
<div class="sourceCode"><pre class="sourceCode java"><code class="sourceCode java"><span class="fu">@Version</span>(template = <span class="st">&quot;version.mustache&quot;</span>) <div class="sourceCode" id="cb4"><pre
<span class="kw">public</span> <span class="kw">class</span> A { class="sourceCode java"><code class="sourceCode java"><span id="cb4-1"><a href="#cb4-1" aria-hidden="true" tabindex="-1"></a><span class="at">@Version</span><span class="op">(</span>template <span class="op">=</span> <span class="st">&quot;version.mustache&quot;</span><span class="op">)</span></span>
<span class="co">// ...</span></code></pre></div> <span id="cb4-2"><a href="#cb4-2" aria-hidden="true" tabindex="-1"></a><span class="kw">public</span> <span class="kw">class</span> A <span class="op">{</span></span>
<span id="cb4-3"><a href="#cb4-3" aria-hidden="true" tabindex="-1"></a> <span class="co">// ...</span></span>
<span id="cb4-4"><a href="#cb4-4" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<h3 id="default-template">Default Template</h3> <h3 id="default-template">Default Template</h3>
<p>The <a href="https://github.com/ethauvin/semver/blob/master/src/main/resources/semver.mustache">default template</a> implements the following static fields:</p> <p>The <a
href="https://github.com/ethauvin/semver/blob/master/src/main/resources/semver.mustache">default
template</a> implements the following static variables:</p>
<table> <table>
<thead> <thead>
<tr class="header"> <tr class="header">
@ -103,7 +230,8 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf
<tr class="even"> <tr class="even">
<td style="text-align: left;"><code>BUILDDATE</code></td> <td style="text-align: left;"><code>BUILDDATE</code></td>
<td style="text-align: left;">The build date.</td> <td style="text-align: left;">The build date.</td>
<td style="text-align: left;"><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Date.html"><code>java.util.Date</code></a></td> <td style="text-align: left;"><a
href="https://docs.oracle.com/javase/8/docs/api/java/util/Date.html"><code>java.util.Date</code></a></td>
</tr> </tr>
<tr class="odd"> <tr class="odd">
<td style="text-align: left;"><code>VERSION</code></td> <td style="text-align: left;"><code>VERSION</code></td>
@ -131,56 +259,42 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf
<td style="text-align: left;"><code>alpha</code></td> <td style="text-align: left;"><code>alpha</code></td>
</tr> </tr>
<tr class="even"> <tr class="even">
<td style="text-align: left;"><code>PRERELASE_PREFIX</code></td>
<td style="text-align: left;">The pre-release prefix</td>
<td style="text-align: left;"><code>-</code></td>
</tr>
<tr class="odd">
<td style="text-align: left;"><code>BUILDMETA</code></td> <td style="text-align: left;"><code>BUILDMETA</code></td>
<td style="text-align: left;">The build metadata, if any.</td> <td style="text-align: left;">The build metadata, if any.</td>
<td style="text-align: left;"><code>001</code></td> <td style="text-align: left;"><code>001</code></td>
</tr> </tr>
</tbody>
</table>
<p>And the following methods/functions:</p>
<table style="width:100%;">
<colgroup>
<col style="width: 27%" />
<col style="width: 62%" />
<col style="width: 10%" />
</colgroup>
<thead>
<tr class="header">
<th style="text-align: left;">Method</th>
<th style="text-align: left;">Description</th>
<th style="text-align: left;">Example</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="text-align: left;"><code>preReleaseWithPrefix()</code></td>
<td style="text-align: left;">Returns the pre-release with a prefix, <code>-</code> by default.</td>
<td style="text-align: left;"><code>-alpha</code></td>
</tr>
<tr class="even"> <tr class="even">
<td style="text-align: left;"><code>buildMetaWithPrefix()</code></td> <td style="text-align: left;"><code>BUILDMETA_PREFIX</code></td>
<td style="text-align: left;">Returns the build metadata with a prefix, <code>+</code> by default.</td> <td style="text-align: left;">The metadata prefix.</td>
<td style="text-align: left;"><code>+001</code></td> <td style="text-align: left;"><code>+</code></td>
</tr>
<tr class="odd">
<td style="text-align: left;"><code>SEPARATOR</code></td>
<td style="text-align: left;">The version separator.</td>
<td style="text-align: left;"><code>.</code></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<h3 id="custom-template">Custom Template</h3> <h3 id="custom-template">Custom Template</h3>
<p>A very simple custom template might look something like:</p> <p>A very simple custom template might look something like:</p>
<div class="sourceCode"><pre class="sourceCode java"><code class="sourceCode java"><span class="co">/* version.mustache */</span> <div class="sourceCode" id="cb5"><pre
<span class="kw">package</span> {{packageName}} class="sourceCode java"><code class="sourceCode java"><span id="cb5-1"><a href="#cb5-1" aria-hidden="true" tabindex="-1"></a><span class="co">/* version.mustache */</span></span>
<span id="cb5-2"><a href="#cb5-2" aria-hidden="true" tabindex="-1"></a><span class="kw">package</span><span class="im"> {{packageName}}</span><span class="op">;</span></span>
<span class="kw">import java.util.Date;</span> <span id="cb5-3"><a href="#cb5-3" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb5-4"><a href="#cb5-4" aria-hidden="true" tabindex="-1"></a><span class="kw">import</span> <span class="im">java</span><span class="op">.</span><span class="im">util</span><span class="op">.</span><span class="im">Date</span><span class="op">;</span></span>
<span class="kw">public</span> <span class="dt">final</span> <span class="kw">class</span> {{className}} { <span id="cb5-5"><a href="#cb5-5" aria-hidden="true" tabindex="-1"></a></span>
<span class="kw">public</span> <span class="dt">final</span> <span class="dt">static</span> String PROJECT = <span class="st">&quot;{{project}}&quot;</span>; <span id="cb5-6"><a href="#cb5-6" aria-hidden="true" tabindex="-1"></a><span class="kw">public</span> <span class="dt">final</span> <span class="kw">class</span> <span class="op">{{</span>className<span class="op">}}</span> <span class="op">{</span></span>
<span class="kw">public</span> <span class="dt">final</span> <span class="dt">static</span> Date DATE = <span class="kw">new</span> Date({{epoch}}L); <span id="cb5-7"><a href="#cb5-7" aria-hidden="true" tabindex="-1"></a> <span class="kw">public</span> <span class="dt">final</span> <span class="dt">static</span> <span class="bu">String</span> PROJECT <span class="op">=</span> <span class="st">&quot;{{project}}&quot;</span><span class="op">;</span></span>
<span class="kw">public</span> <span class="dt">final</span> <span class="dt">static</span> <span class="dt">int</span> MAJOR = {{major}}; <span id="cb5-8"><a href="#cb5-8" aria-hidden="true" tabindex="-1"></a> <span class="kw">public</span> <span class="dt">final</span> <span class="dt">static</span> <span class="bu">Date</span> DATE <span class="op">=</span> <span class="kw">new</span> <span class="bu">Date</span><span class="op">({{</span>epoch<span class="op">}}</span>L<span class="op">);</span></span>
<span class="kw">public</span> <span class="dt">final</span> <span class="dt">static</span> <span class="dt">int</span> MINOR = {{minor}}; <span id="cb5-9"><a href="#cb5-9" aria-hidden="true" tabindex="-1"></a> <span class="kw">public</span> <span class="dt">final</span> <span class="dt">static</span> <span class="bu">String</span> VERSION <span class="op">=</span> <span class="st">&quot;{{semver}}&quot;</span><span class="op">;</span></span>
<span class="kw">public</span> <span class="dt">final</span> <span class="dt">static</span> <span class="dt">int</span> PATCH = {{patch}}; <span id="cb5-10"><a href="#cb5-10" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<span class="kw">public</span> <span class="dt">final</span> <span class="dt">static</span> String PRERELEASE = <span class="st">&quot;{{preRelease}}&quot;</span>; <p>The mustache variables automatically filled in by the processor
<span class="kw">public</span> <span class="dt">final</span> <span class="dt">static</span> String BUILDMETA = <span class="st">&quot;{{buildMeta}}&quot;</span>; are:</p>
}</code></pre></div>
<p>The mustache variables automatically filled in by the processor are:</p>
<table> <table>
<thead> <thead>
<tr class="header"> <tr class="header">
@ -227,18 +341,38 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf
</tr> </tr>
<tr class="even"> <tr class="even">
<td style="text-align: left;"><code>{{preRelease}}</code></td> <td style="text-align: left;"><code>{{preRelease}}</code></td>
<td style="text-align: left;">The pre/release version.</td> <td style="text-align: left;">The pre-release version.</td>
<td style="text-align: left;"><code>String</code></td> <td style="text-align: left;"><code>String</code></td>
</tr> </tr>
<tr class="odd"> <tr class="odd">
<td style="text-align: left;"><code>{{preReleasePrefix}}</code></td>
<td style="text-align: left;">The pre-release prefix.</td>
<td style="text-align: left;"><code>String</code></td>
</tr>
<tr class="even">
<td style="text-align: left;"><code>{{buildMeta}}</code></td> <td style="text-align: left;"><code>{{buildMeta}}</code></td>
<td style="text-align: left;">The build metadata version.</td> <td style="text-align: left;">The build metadata version.</td>
<td style="text-align: left;"><code>String</code></td> <td style="text-align: left;"><code>String</code></td>
</tr> </tr>
<tr class="odd">
<td style="text-align: left;"><code>{{buildMetaPrefix}}</code></td>
<td style="text-align: left;">The metadata prefix.</td>
<td style="text-align: left;"><code>String</code></td>
</tr>
<tr class="even">
<td style="text-align: left;"><code>{{separator}}</code></td>
<td style="text-align: left;">The version separator.</td>
<td style="text-align: left;"><code>String</code></td>
</tr>
<tr class="odd">
<td style="text-align: left;"><code>{{semver}}</code> or
<code>{{version}}</code></td>
<td style="text-align: left;">The full semantic version.</td>
<td style="text-align: left;"><code>String</code></td>
</tr>
</tbody> </tbody>
</table> </table>
<p>Please also look at this <a href="https://github.com/ethauvin/mobibot/blob/master/version.mustache">example</a> using <a href="https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html"><code>java.time</code></a></p> <h2 id="elements--properties">Elements &amp; Properties</h2>
<h2 id="elements-properties">Elements &amp; Properties</h2>
<p>The following annotation elements and properties are available:</p> <p>The following annotation elements and properties are available:</p>
<table> <table>
<thead> <thead>
@ -281,42 +415,62 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf
<td style="text-align: left;"></td> <td style="text-align: left;"></td>
</tr> </tr>
<tr class="even"> <tr class="even">
<td style="text-align: left;"><code>preReleasePrefix</code></td>
<td
style="text-align: left;"><code>version.prerelease.prefix</code></td>
<td style="text-align: left;">The pre-release prefix.</td>
<td style="text-align: left;"><code>-</code></td>
</tr>
<tr class="odd">
<td style="text-align: left;"><code>buildMeta</code></td> <td style="text-align: left;"><code>buildMeta</code></td>
<td style="text-align: left;"><code>version.buildmeta</code></td> <td style="text-align: left;"><code>version.buildmeta</code></td>
<td style="text-align: left;">The build metadata version.</td> <td style="text-align: left;">The build metadata version.</td>
<td style="text-align: left;"></td> <td style="text-align: left;"></td>
</tr> </tr>
<tr class="even">
<td style="text-align: left;"><code>buildMetaPrefix</code></td>
<td style="text-align: left;"><code>version.buildmeta.prefix</code></td>
<td style="text-align: left;">The metadata prefix.</td>
<td style="text-align: left;"><code>+</code></td>
</tr>
<tr class="odd"> <tr class="odd">
<td style="text-align: left;"><code>separator</code></td>
<td style="text-align: left;"><code>version.separator</code></td>
<td style="text-align: left;">The version separator.</td>
<td style="text-align: left;"><code>.</code></td>
</tr>
<tr class="even">
<td style="text-align: left;"><code>packageName</code></td> <td style="text-align: left;"><code>packageName</code></td>
<td style="text-align: left;"></td> <td style="text-align: left;"></td>
<td style="text-align: left;">The package name.</td> <td style="text-align: left;">The package name.</td>
<td style="text-align: left;"><em>Same as annotated class</em></td> <td style="text-align: left;"><em>Same as annotated class</em></td>
</tr> </tr>
<tr class="even"> <tr class="odd">
<td style="text-align: left;"><code>className</code></td> <td style="text-align: left;"><code>className</code></td>
<td style="text-align: left;"></td> <td style="text-align: left;"></td>
<td style="text-align: left;">The name of the generated class.</td> <td style="text-align: left;">The name of the generated class.</td>
<td style="text-align: left;"><code>GeneratedVersion</code></td> <td style="text-align: left;"><code>GeneratedVersion</code></td>
</tr> </tr>
<tr class="odd"> <tr class="even">
<td style="text-align: left;"><code>properties</code></td> <td style="text-align: left;"><code>properties</code></td>
<td style="text-align: left;"></td> <td style="text-align: left;"></td>
<td style="text-align: left;">The properties file.</td> <td style="text-align: left;">The properties file.</td>
<td style="text-align: left;"></td> <td style="text-align: left;"></td>
</tr> </tr>
<tr class="even"> <tr class="odd">
<td style="text-align: left;"><code>template</code></td> <td style="text-align: left;"><code>template</code></td>
<td style="text-align: left;"></td> <td style="text-align: left;"></td>
<td style="text-align: left;">The template file.</td> <td style="text-align: left;">The template file.</td>
<td style="text-align: left;"><code>version.mustache</code></td> <td style="text-align: left;"><code>version.mustache</code></td>
</tr> </tr>
<tr class="odd"> <tr class="even">
<td style="text-align: left;"><code>type</code></td> <td style="text-align: left;"><code>type</code></td>
<td style="text-align: left;"></td> <td style="text-align: left;"></td>
<td style="text-align: left;">Either <code>java</code> or <code>kt</code> for Kotlin.</td> <td style="text-align: left;">Either <code>java</code> or
<code>kt</code> for Kotlin.</td>
<td style="text-align: left;"><code>java</code></td> <td style="text-align: left;"><code>java</code></td>
</tr> </tr>
<tr class="even"> <tr class="odd">
<td style="text-align: left;"><code>keysPrefix</code></td> <td style="text-align: left;"><code>keysPrefix</code></td>
<td style="text-align: left;"></td> <td style="text-align: left;"></td>
<td style="text-align: left;">The prefix for all property keys.</td> <td style="text-align: left;">The prefix for all property keys.</td>
@ -324,71 +478,183 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf
</tr> </tr>
</tbody> </tbody>
</table> </table>
<p>In order to easily incorporate with existing projects, the property keys may be assigned custom values:</p> <p>In order to easily incorporate with existing projects, the property
<div class="sourceCode"><pre class="sourceCode java"><code class="sourceCode java"><span class="fu">@Version</span>( keys may be assigned custom values:</p>
properties = <span class="st">&quot;example.properties&quot;</span>, <div class="sourceCode" id="cb6"><pre
keysPrefix = <span class="st">&quot;example.&quot;</span> class="sourceCode java"><code class="sourceCode java"><span id="cb6-1"><a href="#cb6-1" aria-hidden="true" tabindex="-1"></a><span class="at">@Version</span><span class="op">(</span></span>
majorKey = <span class="st">&quot;maj&quot;</span>, <span id="cb6-2"><a href="#cb6-2" aria-hidden="true" tabindex="-1"></a> properties <span class="op">=</span> <span class="st">&quot;example.properties&quot;</span><span class="op">,</span></span>
minorKey = <span class="st">&quot;min&quot;</span>, <span id="cb6-3"><a href="#cb6-3" aria-hidden="true" tabindex="-1"></a> keysPrefix <span class="op">=</span> <span class="st">&quot;example.&quot;</span><span class="op">,</span></span>
patchKey = <span class="st">&quot;build&quot;</span>, <span id="cb6-4"><a href="#cb6-4" aria-hidden="true" tabindex="-1"></a> majorKey <span class="op">=</span> <span class="st">&quot;maj&quot;</span><span class="op">,</span></span>
preReleaseKey = <span class="st">&quot;rel&quot;</span>, <span id="cb6-5"><a href="#cb6-5" aria-hidden="true" tabindex="-1"></a> minorKey <span class="op">=</span> <span class="st">&quot;min&quot;</span><span class="op">,</span></span>
buildMetaKey = <span class="st">&quot;meta&quot;</span>, <span id="cb6-6"><a href="#cb6-6" aria-hidden="true" tabindex="-1"></a> patchKey <span class="op">=</span> <span class="st">&quot;build&quot;</span><span class="op">,</span></span>
projectKey = <span class="st">&quot;project&quot;</span> <span id="cb6-7"><a href="#cb6-7" aria-hidden="true" tabindex="-1"></a> preReleaseKey <span class="op">=</span> <span class="st">&quot;rel&quot;</span><span class="op">,</span></span>
) <span id="cb6-8"><a href="#cb6-8" aria-hidden="true" tabindex="-1"></a> buildMetaKey <span class="op">=</span> <span class="st">&quot;meta&quot;</span><span class="op">,</span></span>
<span class="kw">public</span> <span class="kw">class</span> Example { <span id="cb6-9"><a href="#cb6-9" aria-hidden="true" tabindex="-1"></a> projectKey <span class="op">=</span> <span class="st">&quot;project&quot;</span></span>
<span class="co">// ...</span></code></pre></div> <span id="cb6-10"><a href="#cb6-10" aria-hidden="true" tabindex="-1"></a><span class="op">)</span></span>
<div class="sourceCode"><pre class="sourceCode ini"><code class="sourceCode ini"><span class="co"># example.properties</span> <span id="cb6-11"><a href="#cb6-11" aria-hidden="true" tabindex="-1"></a><span class="kw">public</span> <span class="kw">class</span> Example <span class="op">{</span></span>
<span class="dt">example.project</span><span class="ot">=</span><span class="st">Example</span> <span id="cb6-12"><a href="#cb6-12" aria-hidden="true" tabindex="-1"></a> <span class="co">// ...</span></span>
<span class="dt">example.maj</span><span class="ot">=</span><span class="dv">1</span> <span id="cb6-13"><a href="#cb6-13" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<span class="dt">example.min</span><span class="ot">=</span><span class="dv">0</span> <div class="sourceCode" id="cb7"><pre
<span class="dt">example.build</span><span class="ot">=</span><span class="dv">0</span> class="sourceCode ini"><code class="sourceCode ini"><span id="cb7-1"><a href="#cb7-1" aria-hidden="true" tabindex="-1"></a><span class="co"># example.properties</span></span>
<span class="dt">example.rel</span><span class="ot">=</span><span class="st">beta</span> <span id="cb7-2"><a href="#cb7-2" aria-hidden="true" tabindex="-1"></a><span class="dt">example.project</span><span class="ot">=</span><span class="st">Example</span></span>
<span class="dt">example.meta</span><span class="ot">=</span> <span id="cb7-3"><a href="#cb7-3" aria-hidden="true" tabindex="-1"></a><span class="dt">example.maj</span><span class="ot">=</span><span class="dv">1</span></span>
<span class="co"># ...</span></code></pre></div> <span id="cb7-4"><a href="#cb7-4" aria-hidden="true" tabindex="-1"></a><span class="dt">example.min</span><span class="ot">=</span><span class="dv">0</span></span>
<span id="cb7-5"><a href="#cb7-5" aria-hidden="true" tabindex="-1"></a><span class="dt">example.build</span><span class="ot">=</span><span class="dv">0</span></span>
<span id="cb7-6"><a href="#cb7-6" aria-hidden="true" tabindex="-1"></a><span class="dt">example.rel</span><span class="ot">=</span><span class="st">beta</span></span>
<span id="cb7-7"><a href="#cb7-7" aria-hidden="true" tabindex="-1"></a><span class="dt">example.meta</span><span class="ot">=</span></span>
<span id="cb7-8"><a href="#cb7-8" aria-hidden="true" tabindex="-1"></a><span class="co"># ...</span></span></code></pre></div>
<blockquote> <blockquote>
<p>⚠️ <code>keysPrefix</code> is a new element in <code>1.1.0</code> and may break older versions when using custom property keys.<br /> <p><span class="emoji" data-emoji="warning">⚠️</span>
⚡ A quick fix is to include <code>keysPrefix=&quot;&quot;</code> in the annotation to remove the default <code>version.</code> prefix.</p> <code>keysPrefix</code> is a new element staring in <code>1.1.0</code>
and may break older versions when using custom property keys.<br />
<span class="emoji" data-emoji="zap"></span> A quick fix is to include
<code>keysPrefix=""</code> in the annotation to remove the default
<code>version.</code> prefix.</p>
</blockquote> </blockquote>
<h2 id="usage-with-maven-grail-kobalt-and-kotlin">Usage with Maven, Grail, Kobalt and Kotlin</h2> <h2 id="maven">Maven</h2>
<h3 id="maven">Maven</h3> <p>To install and run from <a
<p>To install and run from <a href="http://maven.apache.org/">Maven</a>, configure an artifact as follows:</p> href="https://maven.apache.org/">Maven</a>, configure an artifact as
<div class="sourceCode"><pre class="sourceCode xml"><code class="sourceCode xml"><span class="kw">&lt;dependency&gt;</span> follows:</p>
<span class="kw">&lt;groupId&gt;</span>net.thauvin.erik<span class="kw">&lt;/groupId&gt;</span> <div class="sourceCode" id="cb8"><pre
<span class="kw">&lt;artifactId&gt;</span>semver<span class="kw">&lt;/artifactId&gt;</span> class="sourceCode xml"><code class="sourceCode xml"><span id="cb8-1"><a href="#cb8-1" aria-hidden="true" tabindex="-1"></a>&lt;<span class="kw">dependency</span>&gt;</span>
<span class="kw">&lt;version&gt;</span>1.1.0-beta<span class="kw">&lt;/version&gt;</span> <span id="cb8-2"><a href="#cb8-2" aria-hidden="true" tabindex="-1"></a> &lt;<span class="kw">groupId</span>&gt;net.thauvin.erik&lt;/<span class="kw">groupId</span>&gt;</span>
<span class="kw">&lt;/dependency&gt;</span></code></pre></div> <span id="cb8-3"><a href="#cb8-3" aria-hidden="true" tabindex="-1"></a> &lt;<span class="kw">artifactId</span>&gt;semver&lt;/<span class="kw">artifactId</span>&gt;</span>
<h3 id="gradle">Gradle</h3> <span id="cb8-4"><a href="#cb8-4" aria-hidden="true" tabindex="-1"></a> &lt;<span class="kw">version</span>&gt;1.2.1&lt;/<span class="kw">version</span>&gt;</span>
<h4 id="class-generation">Class Generation</h4> <span id="cb8-5"><a href="#cb8-5" aria-hidden="true" tabindex="-1"></a>&lt;/<span class="kw">dependency</span>&gt;</span></code></pre></div>
<p>To install and run from <a href="https://gradle.org/">Gradle</a>, add the following to the <code>build.gradle</code> file:</p> <p>Please look at <a
<pre class="gradle"><code>dependencies { href="https://github.com/ethauvin/semver/blob/master/examples/java/pom.xml">pom.xml</a>
annotationProcessor &#39;net.thauvin.erik:semver:1.1.0-beta&#39; in the <a
compileOnly &#39;net.thauvin.erik:semver:1.1.0-beta&#39; href="https://github.com/ethauvin/semver/tree/master/examples/java">examples/java</a>
}</code></pre> directory for a sample:</p>
<p>The <code>GeneratedVersion</code> class will be automatically created in the <code>build/generated</code> directory upon compiling.</p> <div class="sourceCode" id="cb9"><pre
<h4 id="class-source-generation">Class &amp; Source Generation</h4> class="sourceCode bash"><code class="sourceCode bash"><span id="cb9-1"><a href="#cb9-1" aria-hidden="true" tabindex="-1"></a><span class="ex">mvn</span> verify</span></code></pre></div>
<p>In order to also incorporate the generated source code into the <code>source tree</code>, add the following to the very top of the <code>build.gradle</code> file:</p> <h2 id="bld">bld</h2>
<pre class="gradle"><code>compileJava.options.annotationProcessorGeneratedSourcesDirectory = file(&quot;${projectDir}/src/generated/java&quot;)</code></pre> <p>To install and run from <a href="https://rife2.com/bld">bld</a>, just
<p>The <code>GeneratedVersion.java</code> file will now be located in <code>src/generated</code>.</p> add the dependency to your build file:</p>
<p>Please look at the <a href="https://github.com/ethauvin/semver/blob/master/examples/java/build.gradle">build.gradle</a> file in the <a href="https://github.com/ethauvin/semver/tree/master/example/java">Java example</a> module directory for a sample.</p> <div class="sourceCode" id="cb10"><pre
<h3 id="kobalt">Kobalt</h3> class="sourceCode java"><code class="sourceCode java"><span id="cb10-1"><a href="#cb10-1" aria-hidden="true" tabindex="-1"></a><span class="kw">public</span> <span class="kw">class</span> ExampleBuild <span class="kw">extends</span> Project <span class="op">{</span></span>
<p>To install and run from <a href="http://beust.com/kobalt/">Kobalt</a>, add the following to the <code>Build.kt</code> file:</p> <span id="cb10-2"><a href="#cb10-2" aria-hidden="true" tabindex="-1"></a> <span class="kw">public</span> <span class="fu">ExampleBuild</span><span class="op">()</span> <span class="op">{</span></span>
<pre class="gradle"><code>dependencies { <span id="cb10-3"><a href="#cb10-3" aria-hidden="true" tabindex="-1"></a> <span class="co">// ...</span></span>
apt(&quot;net.thauvin.erik:semver:1.1.0-beta&quot;) <span id="cb10-4"><a href="#cb10-4" aria-hidden="true" tabindex="-1"></a> <span class="fu">scope</span><span class="op">(</span>compile<span class="op">)</span></span>
compileOnly(&quot;net.thauvin.erik:semver:1.1.0-beta&quot;) <span id="cb10-5"><a href="#cb10-5" aria-hidden="true" tabindex="-1"></a> <span class="op">.</span><span class="fu">include</span><span class="op">(</span><span class="fu">dependency</span><span class="op">(</span><span class="st">&quot;net.thauvin.erik&quot;</span><span class="op">,</span> <span class="st">&quot;semver&quot;</span><span class="op">,</span> <span class="fu">version</span><span class="op">(</span><span class="dv">1</span><span class="op">,</span> <span class="dv">2</span><span class="op">,</span> <span class="dv">1</span><span class="op">)));</span></span>
}</code></pre> <span id="cb10-6"><a href="#cb10-6" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<p>Please look at the <a href="https://github.com/ethauvin/semver/blob/master/examples/kotlin/kobalt/src/Build.kt">Build.kt</a> file in the <a href="https://github.com/ethauvin/semver/tree/master/examples/kotlin">Kotlin example</a> module directory for a sample.</p> <span id="cb10-7"><a href="#cb10-7" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<h3 id="kotlin">Kotlin</h3> <p>Please look at <a
<p>The annotation processor also supports <a href="https://kotlinlang.org/">Kotlin</a>.</p> href="https://github.com/ethauvin/semver/blob/master/examples/java/bld/src/bld/java/com/example/ExampleBuild.java">ExampleBuild</a>
<p>To generate a Kotlin version file, simply specify the <code>type</code> as follows:</p> in the <a
<div class="sourceCode"><pre class="sourceCode kotlin"><code class="sourceCode kotlin"><span class="kw">import</span> net.<span class="fu">thauvin</span>.<span class="fu">erik</span>.<span class="fu">semver</span>.<span class="fu">Version</span> href="https://github.com/ethauvin/semver/tree/master/examples/java/bld">examples/java/bld</a>
directory for a sample. It also shows how to incorporate the generated
@<span class="fu">Version</span>(properties = <span class="st">&quot;version.properties&quot;</span>, type=<span class="st">&quot;kt&quot;</span>) code into the <code>source tree</code>, more information is also
<span class="kw">open</span> <span class="kw">class</span> Main { available <a href="https://forum.uwyn.com/post/36">here</a>.</p>
<span class="co">// ...</span></code></pre></div> <p>bld also has a <a
<p>The <a href="https://github.com/ethauvin/semver/blob/master/src/main/resources/semver-kt.mustache">Kotlin default template</a> implements the same static fields and functions as the <a href="#default-template">Java template</a>.</p> href="https://github.com/rife2/bld-generated-version">Generated
<p>Please look at the <a href="https://github.com/ethauvin/semver/tree/master/examples/kotlin">Kotlin example</a> project for samples on using Gradle (<a href="https://github.com/ethauvin/semver/blob/master/examples/kotlin/build.gradle.kts">build.gradle.kts</a>) and Kobalt (<a href="https://github.com/ethauvin/semver/blob/master/examples/kotlin/kobalt/src/Build.kt">Build.kt</a>).</p> Version</a> extension which provides similar functionalities.</p>
<h2 id="gradle">Gradle</h2>
<h3 id="class-generation">Class Generation</h3>
<p>To install and run from <a href="https://gradle.org/">Gradle</a>, add
the following to <a
href="https://github.com/ethauvin/semver/blob/master/examples/java/gradle/build.gradle">build.gradle</a>:</p>
<div class="sourceCode" id="cb11"><pre
class="sourceCode gradle"><code class="sourceCode groovy"><span id="cb11-1"><a href="#cb11-1" aria-hidden="true" tabindex="-1"></a>repositories <span class="op">{</span></span>
<span id="cb11-2"><a href="#cb11-2" aria-hidden="true" tabindex="-1"></a> <span class="fu">mavenCentral</span><span class="op">()</span></span>
<span id="cb11-3"><a href="#cb11-3" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb11-4"><a href="#cb11-4" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb11-5"><a href="#cb11-5" aria-hidden="true" tabindex="-1"></a>dependencies <span class="op">{</span></span>
<span id="cb11-6"><a href="#cb11-6" aria-hidden="true" tabindex="-1"></a> annotationProcessor <span class="st">&#39;net.thauvin.erik:semver:1.2.1&#39;</span></span>
<span id="cb11-7"><a href="#cb11-7" aria-hidden="true" tabindex="-1"></a> compileOnly <span class="st">&#39;net.thauvin.erik:semver:1.2.1&#39;</span></span>
<span id="cb11-8"><a href="#cb11-8" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb11-9"><a href="#cb11-9" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb11-10"><a href="#cb11-10" aria-hidden="true" tabindex="-1"></a>tasks<span class="op">.</span><span class="fu">withType</span><span class="op">(</span>JavaCompile<span class="op">).</span><span class="fu">configureEach</span> <span class="op">{</span></span>
<span id="cb11-11"><a href="#cb11-11" aria-hidden="true" tabindex="-1"></a> options<span class="op">.</span>compilerArgs <span class="op">+=</span> <span class="op">[</span> <span class="st">&quot;-Asemver.project.dir=</span><span class="ss">$projectDir</span><span class="st">&quot;</span> <span class="op">]</span></span>
<span id="cb11-12"><a href="#cb11-12" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<p>The directory containing the configuration files
(<code>version.properties</code>, <code>version.mustache</code>) must be
specified using the <code>semver.project.dir</code> processor
argument.</p>
<p>The <a
href="https://github.com/ethauvin/semver/blob/master/examples/java/src/generated/java/com/example/GeneratedVersion.java"><code>GeneratedVersion.java</code></a>
class will be automatically created in the <code>build/generated</code>
directory upon compiling.</p>
<p>Please look at <a
href="https://github.com/ethauvin/semver/blob/master/examples/java/gradle/build.gradle">build.gradle</a>
in the <a
href="https://github.com/ethauvin/semver/tree/master/examples/java/gradle">examples/java/gradle</a>
directory for a sample.</p>
<h3 id="class--source-generation">Class &amp; Source Generation</h3>
<p>In order to also incorporate the generated source code into the
<code>source tree</code>, add the following to <a
href="https://github.com/ethauvin/semver/blob/master/examples/java/build.gradle">build.gradle</a>:</p>
<div class="sourceCode" id="cb12"><pre
class="sourceCode gradle"><code class="sourceCode groovy"><span id="cb12-1"><a href="#cb12-1" aria-hidden="true" tabindex="-1"></a>tasks<span class="op">.</span><span class="fu">withType</span><span class="op">(</span>JavaCompile<span class="op">).</span><span class="fu">configureEach</span> <span class="op">{</span></span>
<span id="cb12-2"><a href="#cb12-2" aria-hidden="true" tabindex="-1"></a> options<span class="op">.</span>generatedSourceOutputDirectory<span class="op">.</span><span class="fu">set</span><span class="op">(</span><span class="fu">file</span><span class="op">(</span><span class="st">&quot;</span><span class="ss">${</span>projectDir<span class="ss">}</span><span class="st">/src/generated/java&quot;</span><span class="op">))</span></span>
<span id="cb12-3"><a href="#cb12-3" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<p>The <a
href="https://github.com/ethauvin/semver/blob/master/examples/java/src/generated/java/com/example/GeneratedVersion.java"><code>GeneratedVersion.java</code></a>
file will now be located in <code>src/generated</code>.</p>
<h2 id="kotlin">Kotlin</h2>
<p>The annotation processor also supports <a
href="https://kotlinlang.org/">Kotlin</a>.</p>
<p>To generate a Kotlin version file, simply specify the
<code>type</code> as follows:</p>
<div class="sourceCode" id="cb13"><pre
class="sourceCode kotlin"><code class="sourceCode kotlin"><span id="cb13-1"><a href="#cb13-1" aria-hidden="true" tabindex="-1"></a><span class="kw">import</span> <span class="im">net</span><span class="op">.</span><span class="im">thauvin</span><span class="op">.</span><span class="im">erik</span><span class="op">.</span><span class="im">semver</span><span class="op">.</span><span class="im">Version</span></span>
<span id="cb13-2"><a href="#cb13-2" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb13-3"><a href="#cb13-3" aria-hidden="true" tabindex="-1"></a><span class="at">@Version</span><span class="op">(</span>properties <span class="op">=</span> <span class="st">&quot;version.properties&quot;</span><span class="op">,</span> type<span class="op">=</span><span class="st">&quot;kt&quot;</span><span class="op">)</span></span>
<span id="cb13-4"><a href="#cb13-4" aria-hidden="true" tabindex="-1"></a><span class="kw">open</span> <span class="kw">class</span> Main <span class="op">{</span></span>
<span id="cb13-5"><a href="#cb13-5" aria-hidden="true" tabindex="-1"></a> <span class="co">// ...</span></span>
<span id="cb13-6"><a href="#cb13-6" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<p>The <a
href="https://github.com/ethauvin/semver/blob/master/src/main/resources/semver-kt.mustache">Kotlin
default template</a> implements the same static fields and functions as
the <a href="#default-template">Java template</a>.</p>
<p>Please look at the <a
href="https://github.com/ethauvin/semver/tree/master/examples/kotlin">examples/kotlin</a>
project for a <a
href="https://github.com/ethauvin/semver/blob/master/examples/kotlin/build.gradle.kts">build.gradle.kts</a>
sample.</p>
<h3 id="kotlin--gradle">Kotlin &amp; Gradle</h3>
<p>To install and run from <a href="https://gradle.org/">Gradle</a>, add
the following to <a
href="https://github.com/ethauvin/semver/blob/master/examples/kotlin/build.gradle.kts">build.gradle.kts</a>:</p>
<div class="sourceCode" id="cb14"><pre
class="sourceCode kotlin"><code class="sourceCode kotlin"><span id="cb14-1"><a href="#cb14-1" aria-hidden="true" tabindex="-1"></a><span class="kw">var</span> <span class="va">semverProcessor</span> <span class="op">=</span> <span class="st">&quot;net.thauvin.erik:semver:1.2.1&quot;</span></span>
<span id="cb14-2"><a href="#cb14-2" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb14-3"><a href="#cb14-3" aria-hidden="true" tabindex="-1"></a>dependencies <span class="op">{</span></span>
<span id="cb14-4"><a href="#cb14-4" aria-hidden="true" tabindex="-1"></a> kapt<span class="op">(</span>semverProcessor<span class="op">)</span></span>
<span id="cb14-5"><a href="#cb14-5" aria-hidden="true" tabindex="-1"></a> compileOnly<span class="op">(</span>semverProcessor<span class="op">)</span></span>
<span id="cb14-6"><a href="#cb14-6" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span>
<span id="cb14-7"><a href="#cb14-7" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb14-8"><a href="#cb14-8" aria-hidden="true" tabindex="-1"></a>kapt <span class="op">{</span></span>
<span id="cb14-9"><a href="#cb14-9" aria-hidden="true" tabindex="-1"></a> arguments <span class="op">{</span></span>
<span id="cb14-10"><a href="#cb14-10" aria-hidden="true" tabindex="-1"></a> arg<span class="op">(</span><span class="st">&quot;semver.project.dir&quot;</span><span class="op">,</span> projectDir<span class="op">)</span></span>
<span id="cb14-11"><a href="#cb14-11" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span>
<span id="cb14-12"><a href="#cb14-12" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
<p>The directory containing the configuration files
(<code>version.properties</code>, <code>version.mustache</code>) must be
specified using the <code>semver.project.dir</code> processor
argument.</p>
<h2 id="auto-increment">Auto-Increment</h2> <h2 id="auto-increment">Auto-Increment</h2>
<p>Incrementing the version is best left to your favorite build system. For a solution using Gradle, please have a look at the <a href="https://github.com/ethauvin/semver-gradle"><strong>Semver Version Plugin for Gradle</strong></a>.</p> <p>Incrementing the version is best left to your favorite build system.
<p>There are also full <a href="https://github.com/ethauvin/semver-gradle/tree/master/examples/annotation-processor">examples</a> in both <a href="https://github.com/ethauvin/semver-gradle/tree/master/examples/annotation-processor/java">Java</a> and <a href="https://github.com/ethauvin/semver-gradle/tree/master/examples/annotation-processor">Kotlin</a> showing how to use both the plugin and annotation processor concurrently.</p> For a solution using Gradle, please have a look at the <a
href="https://github.com/ethauvin/semver-gradle"><strong>Semver Version
Plugin for Gradle</strong></a>.</p>
<p>There are also full <a
href="https://github.com/ethauvin/semver-gradle/tree/master/examples/annotation-processor">examples</a>
in both <a
href="https://github.com/ethauvin/semver-gradle/tree/master/examples/annotation-processor/java">Java</a>
and <a
href="https://github.com/ethauvin/semver-gradle/tree/master/examples/annotation-processor/kotlin">Kotlin</a>
showing how to use both the plugin and annotation processor
concurrently.</p>
<h2 id="contributing">Contributing</h2>
<p>If you want to contribute to this project, all you have to do is
clone the GitHub repository:</p>
<pre class="console"><code>git clone git@github.com:ethauvin/semver.git</code></pre>
<p>Then use <a href="https://rife2.com/bld">bld</a> to build:</p>
<pre class="console"><code>cd semver
./bld compile</code></pre>
<p>The project has an <a href="https://www.jetbrains.com/idea/">IntelliJ
IDEA</a> project structure. You can just open it after all the
dependencies were downloaded and peruse the code.</p>
</body> </body>
</html> </html>

32
examples/.gitignore vendored
View file

@ -1,32 +0,0 @@
**/.idea/dictionaries
**/.idea/gradle.xml
**/.idea/libraries
**/.idea/tasks.xml
**/.idea/workspace.xml
**/src/*.class
*.code-workspace
*.iws
*.properties
*.sublime-*
.classpath
.DS_Store
.gradle
.kobalt
.nb-gradle
.project
.settings
/bin
/build
/deploy
/dist
/gen
/gradle.properties
/local.properties
/out
/proguard-project.txt
/project.properties
/target
/test-output
ehthumbs.db
kobaltBuild
Thumbs.db

View file

@ -1,17 +1,34 @@
#!/bin/bash #!/bin/bash
# Version 1.0
if [ $# -eq 0 ]; then if [ $# -eq 0 ]; then
echo "Usage: $0 <arg> [...]" echo "Usage: $0 <arg ...>"
exit 1 exit 1
fi fi
# set the examples directories
declare -a examples=(
"java/bld"
"java/gradle"
"kotlin")
dir=$(dirname "$(readlink -f "$0")") dir=$(dirname "$(readlink -f "$0")")
color=$(tput setaf 6) cyan=$(tput setaf 6)
normal=$(tput sgr0) normal=$(tput sgr0)
for ex in "java" "kotlin"; do i=0
cd "$dir/$ex" || exit 1 for ex in "${examples[@]}"; do
echo "> Project: ${color}${ex}${normal}" if [ $i -ne 0 ]; then
gradle clean "$@" --console=plain --no-build-cache || exit 1 read -p "Press [Enter] key to continue..."
echo clear
fi
cd "$dir/$ex" || exit 1
echo "> Project: ${cyan}${ex}${normal}"
if [ -x "bld" ]; then
./bld compile "$@" || exit 1
else
./gradlew --console=plain --no-build-cache clean "$@" || exit 1
fi
((i++))
done done

View file

@ -1,2 +0,0 @@
[*]
insert_final_newline=true

View file

@ -1,28 +0,0 @@
**/.idea/dictionaries
**/.idea/gradle.xml
**/.idea/libraries
**/.idea/tasks.xml
**/.idea/workspace.xml
*.iws
.DS_Store
.classpath
.gradle
.kobalt
.nb-gradle
.project
.settings
/bin
/build
/deploy
/dist
/gen
/gradle.properties
/libs
/local.properties
/out
/proguard-project.txt
/project.properties
/test-output
Thumbs.db
ehthumbs.db
kobaltBuild

View file

@ -1 +0,0 @@
examples-java

View file

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel>
<module name="examples-java_main" target="1.8" />
<module name="examples-java_test" target="1.8" />
</bytecodeTargetLevel>
</component>
</project>

View file

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_6" default="false" project-jdk-name="10" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/classes" />
</component>
</project>

View file

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/modules/examples-java.iml" filepath="$PROJECT_DIR$/.idea/modules/examples-java.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/examples-java_main.iml" filepath="$PROJECT_DIR$/.idea/modules/examples-java_main.iml" group="examples-java" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/examples-java_test.iml" filepath="$PROJECT_DIR$/.idea/modules/examples-java_test.iml" group="examples-java" />
</modules>
</component>
</project>

View file

@ -1,13 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module external.linked.project.id="examples-java" external.linked.project.path="$MODULE_DIR$/../.." external.root.project.path="$MODULE_DIR$/../.." external.system.id="GRADLE" external.system.module.group="" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$/../..">
<excludeFolder url="file://$MODULE_DIR$/../../.gradle" />
<excludeFolder url="file://$MODULE_DIR$/../../build" />
<excludeFolder url="file://$MODULE_DIR$/../../out" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

View file

@ -1,18 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module external.linked.project.id="examples-java:main" external.linked.project.path="$MODULE_DIR$/../.." external.root.project.path="$MODULE_DIR$/../.." external.system.id="GRADLE" external.system.module.group="" external.system.module.type="sourceSet" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
<output url="file://$MODULE_DIR$/../../out/production/classes" />
<exclude-output />
<content url="file://$MODULE_DIR$/../../src/generated">
<sourceFolder url="file://$MODULE_DIR$/../../src/generated" isTestSource="false" />
</content>
<content url="file://$MODULE_DIR$/../../src/main">
<sourceFolder url="file://$MODULE_DIR$/../../src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/../../src/main/resources" type="java-resource" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" scope="PROVIDED" name="Gradle: net.thauvin.erik:semver:1.0.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Gradle: com.github.spullara.mustache.java:compiler:0.9.4" level="project" />
</component>
</module>

View file

@ -1,15 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module external.linked.project.id="examples-java:test" external.linked.project.path="$MODULE_DIR$/../.." external.root.project.path="$MODULE_DIR$/../.." external.system.id="GRADLE" external.system.module.group="" external.system.module.type="sourceSet" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
<output-test url="file://$MODULE_DIR$/../../out/test/classes" />
<exclude-output />
<content url="file://$MODULE_DIR$/../../src/test">
<sourceFolder url="file://$MODULE_DIR$/../../src/test/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/../../src/test/resources" type="java-test-resource" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module" module-name="examples-java_main" />
</component>
<component name="TestModuleProperties" production-module="examples-java_main" />
</module>

56
examples/java/bld/.gitignore vendored Normal file
View file

@ -0,0 +1,56 @@
.gradle
.DS_Store
build
lib/bld/**
!lib/bld/bld-wrapper.jar
!lib/bld/bld-wrapper.properties
lib/compile/
lib/provided/
lib/runtime/
lib/standalone/
lib/test/
# IDEA ignores
# User-specific
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/**/usage.statistics.xml
.idea/**/dictionaries
.idea/**/shelf
# AWS User-specific
.idea/**/aws.xml
# Generated files
.idea/**/contentModel.xml
# Sensitive or high-churn files
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
.idea/**/dbnavigator.xml
# Gradle
.idea/**/gradle.xml
# Mongo Explorer plugin
.idea/**/mongoSettings.xml
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Cursive Clojure plugin
.idea/replstate.xml
# SonarLint plugin
.idea/sonarlint/
# Editor-based Rest Client
.idea/httpRequests

3
examples/java/bld/.idea/.gitignore generated vendored Normal file
View file

@ -0,0 +1,3 @@
# Default ignored files
/shelf/
/workspace.xml

1
examples/java/bld/.idea/.name generated Normal file
View file

@ -0,0 +1 @@
semver-examples-bld

30
examples/java/bld/.idea/app.iml generated Normal file
View file

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager">
<output url="file://$MODULE_DIR$/build/main" />
<output-test url="file://$MODULE_DIR$/build/test" />
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/build/generated" isTestSource="false" />
<excludeFolder url="file://$MODULE_DIR$/src/main/resources/templates" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module-library" scope="RUNTIME">
<library>
<CLASSES>
<root url="file://$MODULE_DIR$/src/main/resources/templates" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="library" name="compile" level="project" />
<orderEntry type="library" scope="RUNTIME" name="runtime" level="project" />
<orderEntry type="library" scope="TEST" name="test" level="project" />
</component>
</module>

14
examples/java/bld/.idea/bld.iml generated Normal file
View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager">
<output url="file://$MODULE_DIR$/build/bld" />
<output-test url="file://$MODULE_DIR$/build/bld" />
<exclude-output />
<content url="file://$MODULE_DIR$/src/bld">
<sourceFolder url="file://$MODULE_DIR$/src/bld/java" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="bld" level="project" />
</component>
</module>

6
examples/java/bld/.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

@ -0,0 +1,8 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="JavadocDeclaration" enabled="true" level="WARNING" enabled_by_default="true">
<option name="ADDITIONAL_TAGS" value="created" />
</inspection_tool>
</profile>
</component>

View file

@ -0,0 +1,204 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JavaDocConfiguration">
<GENERAL>
<MODE>UPDATE</MODE>
<OVERRIDDEN_METHODS>false</OVERRIDDEN_METHODS>
<SPLITTED_CLASS_NAME>true</SPLITTED_CLASS_NAME>
<LEVELS>
<LEVEL>METHOD</LEVEL>
<LEVEL>TYPE</LEVEL>
<LEVEL>FIELD</LEVEL>
</LEVELS>
<VISIBILITIES>
<VISIBILITY>PUBLIC</VISIBILITY>
<VISIBILITY>DEFAULT</VISIBILITY>
<VISIBILITY>PROTECTED</VISIBILITY>
</VISIBILITIES>
</GENERAL>
<TEMPLATES>
<CLASSES>
<CLASS>
<KEY>^.*(public|protected|private)*.+interface\s+\w+.*</KEY>
<VALUE>/**\n
* The interface ${name}.\n
&lt;#if element.typeParameters?has_content&gt; * \n
&lt;/#if&gt;
&lt;#list element.typeParameters as typeParameter&gt;
* @param &lt;${typeParameter.name}&gt; the type parameter\n
&lt;/#list&gt;
*/</VALUE>
</CLASS>
<CLASS>
<KEY>^.*(public|protected|private)*.+enum\s+\w+.*</KEY>
<VALUE>/**\n
* The enum ${name}.\n
*/</VALUE>
</CLASS>
<CLASS>
<KEY>^.*(public|protected|private)*.+class\s+\w+.*</KEY>
<VALUE>/**\n
* The type ${name}.\n
&lt;#if element.typeParameters?has_content&gt; * \n
&lt;/#if&gt;
&lt;#list element.typeParameters as typeParameter&gt;
* @param &lt;${typeParameter.name}&gt; the type parameter\n
&lt;/#list&gt;
*/</VALUE>
</CLASS>
<CLASS>
<KEY>.+</KEY>
<VALUE>/**\n
* The type ${name}.\n
*/</VALUE>
</CLASS>
</CLASSES>
<CONSTRUCTORS>
<CONSTRUCTOR>
<KEY>.+</KEY>
<VALUE>/**\n
* Instantiates a new ${name}.\n
&lt;#if element.parameterList.parameters?has_content&gt;
*\n
&lt;/#if&gt;
&lt;#list element.parameterList.parameters as parameter&gt;
* @param ${parameter.name} the ${paramNames[parameter.name]}\n
&lt;/#list&gt;
&lt;#if element.throwsList.referenceElements?has_content&gt;
*\n
&lt;/#if&gt;
&lt;#list element.throwsList.referenceElements as exception&gt;
* @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n
&lt;/#list&gt;
*/</VALUE>
</CONSTRUCTOR>
</CONSTRUCTORS>
<METHODS>
<METHOD>
<KEY>^.*(public|protected|private)*\s*.*(\w(\s*&lt;.+&gt;)*)+\s+get\w+\s*\(.*\).+</KEY>
<VALUE>/**\n
* Gets ${partName}.\n
&lt;#if element.typeParameters?has_content&gt; * \n
&lt;/#if&gt;
&lt;#list element.typeParameters as typeParameter&gt;
* @param &lt;${typeParameter.name}&gt; the type parameter\n
&lt;/#list&gt;
&lt;#if element.parameterList.parameters?has_content&gt;
*\n
&lt;/#if&gt;
&lt;#list element.parameterList.parameters as parameter&gt;
* @param ${parameter.name} the ${paramNames[parameter.name]}\n
&lt;/#list&gt;
&lt;#if isNotVoid&gt;
*\n
* @return the ${partName}\n
&lt;/#if&gt;
&lt;#if element.throwsList.referenceElements?has_content&gt;
*\n
&lt;/#if&gt;
&lt;#list element.throwsList.referenceElements as exception&gt;
* @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n
&lt;/#list&gt;
*/</VALUE>
</METHOD>
<METHOD>
<KEY>^.*(public|protected|private)*\s*.*(void|\w(\s*&lt;.+&gt;)*)+\s+set\w+\s*\(.*\).+</KEY>
<VALUE>/**\n
* Sets ${partName}.\n
&lt;#if element.typeParameters?has_content&gt; * \n
&lt;/#if&gt;
&lt;#list element.typeParameters as typeParameter&gt;
* @param &lt;${typeParameter.name}&gt; the type parameter\n
&lt;/#list&gt;
&lt;#if element.parameterList.parameters?has_content&gt;
*\n
&lt;/#if&gt;
&lt;#list element.parameterList.parameters as parameter&gt;
* @param ${parameter.name} the ${paramNames[parameter.name]}\n
&lt;/#list&gt;
&lt;#if isNotVoid&gt;
*\n
* @return the ${partName}\n
&lt;/#if&gt;
&lt;#if element.throwsList.referenceElements?has_content&gt;
*\n
&lt;/#if&gt;
&lt;#list element.throwsList.referenceElements as exception&gt;
* @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n
&lt;/#list&gt;
*/</VALUE>
</METHOD>
<METHOD>
<KEY>^.*((public\s+static)|(static\s+public))\s+void\s+main\s*\(\s*String\s*(\[\s*\]|\.\.\.)\s+\w+\s*\).+</KEY>
<VALUE>/**\n
* The entry point of application.\n
&lt;#if element.parameterList.parameters?has_content&gt;
*\n
&lt;/#if&gt;
* @param ${element.parameterList.parameters[0].name} the input arguments\n
&lt;#if element.throwsList.referenceElements?has_content&gt;
*\n
&lt;/#if&gt;
&lt;#list element.throwsList.referenceElements as exception&gt;
* @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n
&lt;/#list&gt;
*/</VALUE>
</METHOD>
<METHOD>
<KEY>.+</KEY>
<VALUE>/**\n
* ${name}&lt;#if isNotVoid&gt; ${return}&lt;/#if&gt;.\n
&lt;#if element.typeParameters?has_content&gt; * \n
&lt;/#if&gt;
&lt;#list element.typeParameters as typeParameter&gt;
* @param &lt;${typeParameter.name}&gt; the type parameter\n
&lt;/#list&gt;
&lt;#if element.parameterList.parameters?has_content&gt;
*\n
&lt;/#if&gt;
&lt;#list element.parameterList.parameters as parameter&gt;
* @param ${parameter.name} the ${paramNames[parameter.name]}\n
&lt;/#list&gt;
&lt;#if isNotVoid&gt;
*\n
* @return the ${return}\n
&lt;/#if&gt;
&lt;#if element.throwsList.referenceElements?has_content&gt;
*\n
&lt;/#if&gt;
&lt;#list element.throwsList.referenceElements as exception&gt;
* @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n
&lt;/#list&gt;
*/</VALUE>
</METHOD>
</METHODS>
<FIELDS>
<FIELD>
<KEY>^.*(public|protected|private)*.+static.*(\w\s\w)+.+</KEY>
<VALUE>/**\n
* The constant ${element.getName()}.\n
*/</VALUE>
</FIELD>
<FIELD>
<KEY>^.*(public|protected|private)*.*(\w\s\w)+.+</KEY>
<VALUE>/**\n
&lt;#if element.parent.isInterface()&gt;
* The constant ${element.getName()}.\n
&lt;#else&gt;
* The ${name}.\n
&lt;/#if&gt; */</VALUE>
</FIELD>
<FIELD>
<KEY>.+</KEY>
<VALUE>/**\n
&lt;#if element.parent.isEnum()&gt;
*${name} ${typeName}.\n
&lt;#else&gt;
* The ${name}.\n
&lt;/#if&gt;*/</VALUE>
</FIELD>
</FIELDS>
</TEMPLATES>
</component>
</project>

View file

@ -0,0 +1,18 @@
<component name="libraryTable">
<library name="bld">
<CLASSES>
<root url="file://$PROJECT_DIR$/lib/bld" />
<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-2.2.1-sources.jar!/" />
</SOURCES>
<excluded>
<root url="jar://$PROJECT_DIR$/lib/bld/bld-wrapper.jar!/" />
</excluded>
<jarDirectory url="file://$PROJECT_DIR$/lib/bld" recursive="false" />
<jarDirectory url="file://$PROJECT_DIR$/lib/bld" recursive="false" type="SOURCES" />
</library>
</component>

View file

@ -0,0 +1,17 @@
<component name="libraryTable">
<library name="compile">
<CLASSES>
<root url="file://$PROJECT_DIR$/lib/compile" />
<root url="file://$PROJECT_DIR$/lib/provided" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="file://$PROJECT_DIR$/lib/compile" />
<root url="file://$PROJECT_DIR$/lib/provided" />
</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/provided" recursive="true" />
<jarDirectory url="file://$PROJECT_DIR$/lib/provided" recursive="true" type="SOURCES" />
</library>
</component>

View file

@ -0,0 +1,14 @@
<component name="libraryTable">
<library name="runtime">
<CLASSES>
<root url="file://$PROJECT_DIR$/lib/runtime" />
<root url="file://$PROJECT_DIR$/src/main/resources" />
</CLASSES>
<JAVADOC />
<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" />
</library>
</component>

View file

@ -0,0 +1,18 @@
<component name="libraryTable">
<library name="test">
<CLASSES>
<root url="file://$PROJECT_DIR$/lib/test" />
<root url="file://$PROJECT_DIR$/lib/provided" />
<root url="file://$PROJECT_DIR$/src/test/resources" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="file://$PROJECT_DIR$/lib/test" />
<root url="file://$PROJECT_DIR$/lib/provided" />
</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/provided" recursive="true" />
<jarDirectory url="file://$PROJECT_DIR$/lib/provided" recursive="true" type="SOURCES" />
</library>
</component>

11
examples/java/bld/.idea/misc.xml generated Normal file
View file

@ -0,0 +1,11 @@
<project version="4">
<component name="EntryPointsManager">
<pattern value="com.example.ExampleBuild" method="runExample" />
</component>
<component name="PDMPlugin">
<option name="skipTestSources" value="false" />
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" project-jdk-name="17" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build" />
</component>
</project>

9
examples/java/bld/.idea/modules.xml generated Normal file
View file

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/app.iml" filepath="$PROJECT_DIR$/.idea/app.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/bld.iml" filepath="$PROJECT_DIR$/.idea/bld.iml" />
</modules>
</component>
</project>

View file

@ -0,0 +1,9 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Run Tests" type="Application" factoryName="Application" nameIsGenerated="true">
<option name="MAIN_CLASS_NAME" value="com.example.ExampleTest" />
<module name="app" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>

6
examples/java/bld/.idea/vcs.xml generated Normal file
View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/../../.." vcs="Git" />
</component>
</project>

11
examples/java/bld/.vscode/launch.json vendored Normal file
View file

@ -0,0 +1,11 @@
{
"version": "0.2.0",
"configurations": [
{
"type": "java",
"name": "Run Tests",
"request": "launch",
"mainClass": "com.example.ExampleTest"
}
]
}

15
examples/java/bld/.vscode/settings.json vendored Normal file
View file

@ -0,0 +1,15 @@
{
"java.project.sourcePaths": [
"src/main/java",
"src/main/resources",
"src/test/java",
"src/test/resources",
"src/bld/java",
"src/bld/resources"
],
"java.configuration.updateBuildConfiguration": "automatic",
"java.project.referencedLibraries": [
"${HOME}/.bld/dist/bld-2.2.1.jar",
"lib/**/*.jar"
]
}

View file

@ -0,0 +1,10 @@
## Examples
To compile & run the examples:
```console
./bld compile
./bld run
./bld run-example
```

2
examples/java/bld/bld Executable file
View file

@ -0,0 +1,2 @@
#!/usr/bin/env sh
java -jar "$(dirname "$0")/lib/bld/bld-wrapper.jar" "$0" --build com.example.ExampleBuild "$@"

View file

@ -0,0 +1,4 @@
@echo off
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
java -jar "%DIRNAME%/lib/bld/bld-wrapper.jar" "%0" --build com.example.ExampleBuild %*

View file

@ -0,0 +1,21 @@
/*
* This file is automatically generated.
* Do not modify! -- ALL CHANGES WILL BE ERASED!
*/
package {{packageName}};
import java.util.Date;
public final class {{className}} {
public static final String PROJECT = "{{project}}";
public static final Date BUILDDATE = new Date({{epoch}}L);
public static final String VERSION = "{{version}}";
/**
* Disables the default constructor.
*/
private {{className}}() {
throw new UnsupportedOperationException("Illegal constructor call.");
}
}

View file

@ -0,0 +1,9 @@
#Generated by the Semver Plugin for Gradle
#Sat Apr 27 17:04:13 PDT 2019
example.buildmeta=T800
example.major=8
example.minor=4
example.patch=97
example.prerelease=alpha
example.project=Java Example
example.semver=8.4.97-alpha+T800

Binary file not shown.

View file

@ -0,0 +1,7 @@
bld.downloadExtensionJavadoc=false
bld.downloadExtensionSources=true
bld.downloadLocation=
bld.extensions=
bld.repositories=MAVEN_CENTRAL,RIFE2_RELEASES
bld.sourceDirectories=
bld.version=2.2.1

View file

@ -0,0 +1,53 @@
package com.example;
import rife.bld.BuildCommand;
import rife.bld.Project;
import rife.bld.operations.JavacOptions.Processing;
import java.io.File;
import java.util.List;
import static rife.bld.dependencies.Repository.*;
import static rife.bld.dependencies.Scope.provided;
/**
* Example build.
*/
public class ExampleBuild extends Project {
public ExampleBuild() {
pkg = "com.example";
name = "Example";
version = version(0, 1, 0);
mainClass = "com.example.App";
testOperation().mainClass("com.example.ExampleTest");
repositories = List.of(MAVEN_LOCAL, MAVEN_CENTRAL, SONATYPE_SNAPSHOTS_LEGACY);
scope(provided).include(dependency("net.thauvin.erik", "semver", version(1, 2, 2, "SNAPSHOT")));
}
public static void main(String[] args) {
new ExampleBuild().start(args);
}
/**
* Saves generated source files in the {@code build/generated} directory.
* <p>
* To incorporate the generated source code into the source tree, add this directory as an additional source
* location in your IDE.
*/
@Override
public void compile() throws Exception {
var generated = new File(buildDirectory(), "generated");
var ignore = generated.mkdir();
compileOperation().compileOptions().process(Processing.FULL).sourceOutput(generated);
super.compile();
}
@BuildCommand(value = "run-example", summary = "Runs the example")
public void runExample() throws Exception {
runOperation().fromProject(this).mainClass("com.example.Example").execute();
}
}

View file

@ -1,12 +1,19 @@
package com.example; package com.example;
import net.thauvin.erik.semver.Version; import net.thauvin.erik.semver.Version;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Locale;
@Version(properties = "version.properties") @Version(properties = "version.properties")
public class Example { public final class App {
/**
* Command line interface.
*
* @param args The command line parameters.
*/
public static void main(final String... args) { public static void main(final String... args) {
final SimpleDateFormat sdf = new SimpleDateFormat("EEE, d MMM yyyy 'at' HH:mm:ss z"); final var sdf = new SimpleDateFormat("EEE, d MMM yyyy 'at' HH:mm:ss z", Locale.US);
System.out.println("-----------------------------------------------------"); System.out.println("-----------------------------------------------------");

View file

@ -0,0 +1,21 @@
package com.example;
import net.thauvin.erik.semver.Version;
import java.text.SimpleDateFormat;
import java.util.Locale;
@Version(properties = "example.properties", template = "example.mustache", className = "ExampleVersion",
keysPrefix = "example.")
public class Example {
public static void main(final String... args) {
final var sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.US);
System.out.println("-- From Example -------------------------------------");
System.out.println(" " + ExampleVersion.PROJECT + ' ' + ExampleVersion.VERSION
+ " (" + sdf.format(ExampleVersion.BUILDDATE) + ')');
System.out.println("-----------------------------------------------------");
}
}

View file

@ -0,0 +1,18 @@
package com.example;
public class ExampleTest {
private static final String HELLO = "Hello!";
public static void main(String[] args) {
var hello = new ExampleTest().verifyHello();
if (HELLO.equals(hello)) {
System.out.println("Succeeded");
} else {
throw new AssertionError();
}
}
String verifyHello() {
return HELLO;
}
}

View file

@ -0,0 +1,9 @@
#Generated by the Semver Plugin for Gradle
#Sat Apr 27 17:05:34 PDT 2019
version.buildmeta=007
version.major=11
version.minor=11
version.patch=20
version.prerelease=beta
version.project=Java App
version.semver=11.11.20-beta+007

View file

@ -1,25 +0,0 @@
apply plugin: 'java'
apply plugin: 'application'
// ./gradlew
defaultTasks 'run'
def semverProcessor = 'net.thauvin.erik:semver:1.1.0-beta'
sourceCompatibility = 1.8
targetCompatibility = 1.8
compileJava.options.annotationProcessorGeneratedSourcesDirectory = file("${projectDir}/src/generated/java")
mainClassName = 'com.example.Example'
repositories {
mavenLocal()
mavenCentral()
}
dependencies {
annotationProcessor semverProcessor
compileOnly semverProcessor
}

View file

@ -0,0 +1,2 @@
[*]
insert_final_newline = true

82
examples/java/gradle/.gitignore vendored Normal file
View file

@ -0,0 +1,82 @@
!.vscode/extensions.json
!.vscode/launch.json
!.vscode/settings.json
!.vscode/tasks.json
!gradle-wrapper.jar
.classpath
.DS_Store
.gradle
.history
.idea_modules/
.idea/**/contentModel.xml
.idea/**/dataSources.ids
.idea/**/dataSources.local.xml
.idea/**/dataSources/
.idea/**/dbnavigator.xml
.idea/**/dictionaries
.idea/**/dynamic.xml
.idea/**/gradle.xml
.idea/**/libraries
.idea/**/mongoSettings.xml
.idea/**/shelf
.idea/**/sqlDataSources.xml
.idea/**/tasks.xml
.idea/**/uiDesigner.xml
.idea/**/usage.statistics.xml
.idea/**/workspace.xml
.idea/caches/build_file_checksums.ser
.idea/httpRequests
.idea/replstate.xml
.kobalt
.mtj.tmp/
.mvn/timing.properties
.mvn/wrapper/maven-wrapper.jar
.nb-gradle
.project
.scannerwork
.settings
.vscode/*
*.class
*.code-workspace
*.ctxt
*.ear
*.iws
*.jar
*.log
*.nar
*.rar
*.sublime-*
*.tar.gz
*.war
*.zip
atlassian-ide-plugin.xml
bin/
build/
cmake-build-*/
com_crashlytics_export_strings.xml
crashlytics-build.properties
crashlytics.properties
dependency-reduced-pom.xml
deploy/
dist/
ehthumbs.db
fabric.properties
gen/
gradle.properties
hs_err_pid*
kobaltBuild
kobaltw*-test
lib/kotlin*
libs/
local.properties
out/
pom.xml.next
pom.xml.releaseBackup
pom.xml.tag
pom.xml.versionsBackup
proguard-project.txt
project.properties
release.properties
target/
test-output
Thumbs.db

1
examples/java/gradle/.idea/.name generated Normal file
View file

@ -0,0 +1 @@
semver-examples-java-gradle

20
examples/java/gradle/.idea/compiler.xml generated Normal file
View file

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<annotationProcessing>
<profile name="Gradle Imported" enabled="true">
<outputRelativeToContentRoot value="true" />
<option name="semver.project.dir" value="$PROJECT_DIR$" />
<processorPath useClasspath="false">
<entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/net.thauvin.erik/semver/1.2.2-SNAPSHOT/31d53f3e9fdd226343234d13a080d6fd12b58ae6/semver-1.2.2-SNAPSHOT.jar" />
<entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.github.spullara.mustache.java/compiler/0.9.13/60666500a7dce7a5d3e17c09b46ea6f037192bd5/compiler-0.9.13.jar" />
</processorPath>
<module name="examples-java.main" />
</profile>
</annotationProcessing>
<bytecodeTargetLevel target="17">
<module name="examples-java_main" target="1.8" />
<module name="examples-java_test" target="1.8" />
</bytecodeTargetLevel>
</component>
</project>

9
examples/java/gradle/.idea/gradle.iml generated Normal file
View file

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

Some files were not shown because too many files have changed in this diff Show more